mirror of
https://bitbucket.org/Ioncannon/project-meteor-server.git
synced 2025-04-20 11:47:48 +00:00
Initial commit of the FFXIV 1.0 lobby server.
This commit is contained in:
commit
c1e214175f
48 changed files with 55780 additions and 0 deletions
7
.gitignore
vendored
Normal file
7
.gitignore
vendored
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
FFXIVClassic_Lobby_Server/bin/
|
||||||
|
FFXIVClassic_Lobby_Server/obj/
|
||||||
|
ipch/
|
||||||
|
Blowfish/Debug/
|
||||||
|
Debug/
|
||||||
|
FFXIVClassic_Lobby_Server.opensdf
|
||||||
|
FFXIVClassic_Lobby_Server.sdf
|
95
Blowfish/Blowfish.vcxproj
Normal file
95
Blowfish/Blowfish.vcxproj
Normal file
|
@ -0,0 +1,95 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<ItemGroup Label="ProjectConfigurations">
|
||||||
|
<ProjectConfiguration Include="Debug|Win32">
|
||||||
|
<Configuration>Debug</Configuration>
|
||||||
|
<Platform>Win32</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Release|Win32">
|
||||||
|
<Configuration>Release</Configuration>
|
||||||
|
<Platform>Win32</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
</ItemGroup>
|
||||||
|
<PropertyGroup Label="Globals">
|
||||||
|
<ProjectGuid>{2F4DF1AE-B33D-4058-A0FE-639DE9EA323A}</ProjectGuid>
|
||||||
|
<Keyword>Win32Proj</Keyword>
|
||||||
|
<RootNamespace>Blowfish</RootNamespace>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||||
|
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||||
|
<UseDebugLibraries>true</UseDebugLibraries>
|
||||||
|
<PlatformToolset>v120</PlatformToolset>
|
||||||
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||||
|
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||||
|
<UseDebugLibraries>false</UseDebugLibraries>
|
||||||
|
<PlatformToolset>v120</PlatformToolset>
|
||||||
|
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||||
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||||
|
<ImportGroup Label="ExtensionSettings">
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<PropertyGroup Label="UserMacros" />
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
|
<LinkIncremental>true</LinkIncremental>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
|
<LinkIncremental>false</LinkIncremental>
|
||||||
|
</PropertyGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
|
<ClCompile>
|
||||||
|
<PrecompiledHeader>NotUsing</PrecompiledHeader>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<Optimization>Disabled</Optimization>
|
||||||
|
<PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;BLOWFISH_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<PrecompiledHeaderFile />
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<SubSystem>Windows</SubSystem>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
</Link>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
|
<ClCompile>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<PrecompiledHeader>Use</PrecompiledHeader>
|
||||||
|
<Optimization>MaxSpeed</Optimization>
|
||||||
|
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||||
|
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||||
|
<PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;BLOWFISH_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<SubSystem>Windows</SubSystem>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
|
</Link>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClInclude Include="blowfish.h" />
|
||||||
|
<ClInclude Include="cbasetypes.h" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClCompile Include="blowfish.cpp" />
|
||||||
|
<ClCompile Include="dllmain.cpp">
|
||||||
|
<CompileAsManaged Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</CompileAsManaged>
|
||||||
|
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
|
</PrecompiledHeader>
|
||||||
|
<CompileAsManaged Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</CompileAsManaged>
|
||||||
|
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
|
</PrecompiledHeader>
|
||||||
|
</ClCompile>
|
||||||
|
</ItemGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||||
|
<ImportGroup Label="ExtensionTargets">
|
||||||
|
</ImportGroup>
|
||||||
|
</Project>
|
33
Blowfish/Blowfish.vcxproj.filters
Normal file
33
Blowfish/Blowfish.vcxproj.filters
Normal file
|
@ -0,0 +1,33 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<ItemGroup>
|
||||||
|
<Filter Include="Source Files">
|
||||||
|
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
|
||||||
|
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
|
||||||
|
</Filter>
|
||||||
|
<Filter Include="Header Files">
|
||||||
|
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
|
||||||
|
<Extensions>h;hh;hpp;hxx;hm;inl;inc;xsd</Extensions>
|
||||||
|
</Filter>
|
||||||
|
<Filter Include="Resource Files">
|
||||||
|
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
|
||||||
|
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
|
||||||
|
</Filter>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClInclude Include="blowfish.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="cbasetypes.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClCompile Include="dllmain.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="blowfish.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
</ItemGroup>
|
||||||
|
</Project>
|
48
Blowfish/ReadMe.txt
Normal file
48
Blowfish/ReadMe.txt
Normal file
|
@ -0,0 +1,48 @@
|
||||||
|
========================================================================
|
||||||
|
DYNAMIC LINK LIBRARY : Blowfish Project Overview
|
||||||
|
========================================================================
|
||||||
|
|
||||||
|
AppWizard has created this Blowfish DLL for you.
|
||||||
|
|
||||||
|
This file contains a summary of what you will find in each of the files that
|
||||||
|
make up your Blowfish application.
|
||||||
|
|
||||||
|
|
||||||
|
Blowfish.vcxproj
|
||||||
|
This is the main project file for VC++ projects generated using an Application Wizard.
|
||||||
|
It contains information about the version of Visual C++ that generated the file, and
|
||||||
|
information about the platforms, configurations, and project features selected with the
|
||||||
|
Application Wizard.
|
||||||
|
|
||||||
|
Blowfish.vcxproj.filters
|
||||||
|
This is the filters file for VC++ projects generated using an Application Wizard.
|
||||||
|
It contains information about the association between the files in your project
|
||||||
|
and the filters. This association is used in the IDE to show grouping of files with
|
||||||
|
similar extensions under a specific node (for e.g. ".cpp" files are associated with the
|
||||||
|
"Source Files" filter).
|
||||||
|
|
||||||
|
Blowfish.cpp
|
||||||
|
This is the main DLL source file.
|
||||||
|
|
||||||
|
When created, this DLL does not export any symbols. As a result, it
|
||||||
|
will not produce a .lib file when it is built. If you wish this project
|
||||||
|
to be a project dependency of some other project, you will either need to
|
||||||
|
add code to export some symbols from the DLL so that an export library
|
||||||
|
will be produced, or you can set the Ignore Input Library property to Yes
|
||||||
|
on the General propert page of the Linker folder in the project's Property
|
||||||
|
Pages dialog box.
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
Other standard files:
|
||||||
|
|
||||||
|
StdAfx.h, StdAfx.cpp
|
||||||
|
These files are used to build a precompiled header (PCH) file
|
||||||
|
named Blowfish.pch and a precompiled types file named StdAfx.obj.
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
Other notes:
|
||||||
|
|
||||||
|
AppWizard uses "TODO:" comments to indicate parts of the source code you
|
||||||
|
should add to or customize.
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
443
Blowfish/blowfish.cpp
Normal file
443
Blowfish/blowfish.cpp
Normal file
|
@ -0,0 +1,443 @@
|
||||||
|
#ifdef little_endian /* Eg: Intel */
|
||||||
|
#include <dos.h>
|
||||||
|
#include <graphics.h>
|
||||||
|
#include <io.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <math.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <time.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#ifdef little_endian /* Eg: Intel */
|
||||||
|
#include <alloc.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <ctype.h>
|
||||||
|
|
||||||
|
#ifdef little_endian /* Eg: Intel */
|
||||||
|
#include <dir.h>
|
||||||
|
#include <bios.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef big_endian
|
||||||
|
#include <Types.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "BLOWFISH.H"
|
||||||
|
|
||||||
|
#define N 16
|
||||||
|
#define noErr 0
|
||||||
|
#define DATAERROR -1
|
||||||
|
#define KEYBYTES 8
|
||||||
|
|
||||||
|
//uint32 P[N + 2];
|
||||||
|
uint32 S[4][256];
|
||||||
|
|
||||||
|
uint8 P_values[(N + 2) * 4] =
|
||||||
|
{
|
||||||
|
0x88, 0x6A, 0x3F, 0x24, 0xD3, 0x08, 0xA3, 0x85, 0x2E, 0x8A, 0x19, 0x13, 0x44, 0x73, 0x70, 0x03,
|
||||||
|
0x22, 0x38, 0x09, 0xA4, 0xD0, 0x31, 0x9F, 0x29, 0x98, 0xFA, 0x2E, 0x08, 0x89, 0x6C, 0x4E, 0xEC,
|
||||||
|
0xE6, 0x21, 0x28, 0x45, 0x77, 0x13, 0xD0, 0x38, 0xCF, 0x66, 0x54, 0xBE, 0x6C, 0x0C, 0xE9, 0x34,
|
||||||
|
0xB7, 0x29, 0xAC, 0xC0, 0xDD, 0x50, 0x7C, 0xC9, 0xB5, 0xD5, 0x84, 0x3F, 0x17, 0x09, 0x47, 0xB5,
|
||||||
|
0xD9, 0xD5, 0x16, 0x92, 0x1B, 0xFB, 0x79, 0x89
|
||||||
|
};
|
||||||
|
|
||||||
|
uint8 S_values[4 * 4 * 256] =
|
||||||
|
{
|
||||||
|
0xA6, 0x0B, 0x31, 0xD1, 0xAC, 0xB5, 0xDF, 0x98, 0xDB, 0x72, 0xFD, 0x2F, 0xB7, 0xDF, 0x1A, 0xD0,
|
||||||
|
0xED, 0xAF, 0xE1, 0xB8, 0x96, 0x7E, 0x26, 0x6A, 0x45, 0x90, 0x7C, 0xBA, 0x99, 0x7F, 0x2C, 0xF1,
|
||||||
|
0x47, 0x99, 0xA1, 0x24, 0xF7, 0x6C, 0x91, 0xB3, 0xE2, 0xF2, 0x01, 0x08, 0x16, 0xFC, 0x8E, 0x85,
|
||||||
|
0xD8, 0x20, 0x69, 0x63, 0x69, 0x4E, 0x57, 0x71, 0xA3, 0xFE, 0x58, 0xA4, 0x7E, 0x3D, 0x93, 0xF4,
|
||||||
|
0x8F, 0x74, 0x95, 0x0D, 0x58, 0xB6, 0x8E, 0x72, 0x58, 0xCD, 0x8B, 0x71, 0xEE, 0x4A, 0x15, 0x82,
|
||||||
|
0x1D, 0xA4, 0x54, 0x7B, 0xB5, 0x59, 0x5A, 0xC2, 0x39, 0xD5, 0x30, 0x9C, 0x13, 0x60, 0xF2, 0x2A,
|
||||||
|
0x23, 0xB0, 0xD1, 0xC5, 0xF0, 0x85, 0x60, 0x28, 0x18, 0x79, 0x41, 0xCA, 0xEF, 0x38, 0xDB, 0xB8,
|
||||||
|
0xB0, 0xDC, 0x79, 0x8E, 0x0E, 0x18, 0x3A, 0x60, 0x8B, 0x0E, 0x9E, 0x6C, 0x3E, 0x8A, 0x1E, 0xB0,
|
||||||
|
0xC1, 0x77, 0x15, 0xD7, 0x27, 0x4B, 0x31, 0xBD, 0xDA, 0x2F, 0xAF, 0x78, 0x60, 0x5C, 0x60, 0x55,
|
||||||
|
0xF3, 0x25, 0x55, 0xE6, 0x94, 0xAB, 0x55, 0xAA, 0x62, 0x98, 0x48, 0x57, 0x40, 0x14, 0xE8, 0x63,
|
||||||
|
0x6A, 0x39, 0xCA, 0x55, 0xB6, 0x10, 0xAB, 0x2A, 0x34, 0x5C, 0xCC, 0xB4, 0xCE, 0xE8, 0x41, 0x11,
|
||||||
|
0xAF, 0x86, 0x54, 0xA1, 0x93, 0xE9, 0x72, 0x7C, 0x11, 0x14, 0xEE, 0xB3, 0x2A, 0xBC, 0x6F, 0x63,
|
||||||
|
0x5D, 0xC5, 0xA9, 0x2B, 0xF6, 0x31, 0x18, 0x74, 0x16, 0x3E, 0x5C, 0xCE, 0x1E, 0x93, 0x87, 0x9B,
|
||||||
|
0x33, 0xBA, 0xD6, 0xAF, 0x5C, 0xCF, 0x24, 0x6C, 0x81, 0x53, 0x32, 0x7A, 0x77, 0x86, 0x95, 0x28,
|
||||||
|
0x98, 0x48, 0x8F, 0x3B, 0xAF, 0xB9, 0x4B, 0x6B, 0x1B, 0xE8, 0xBF, 0xC4, 0x93, 0x21, 0x28, 0x66,
|
||||||
|
0xCC, 0x09, 0xD8, 0x61, 0x91, 0xA9, 0x21, 0xFB, 0x60, 0xAC, 0x7C, 0x48, 0x32, 0x80, 0xEC, 0x5D,
|
||||||
|
0x5D, 0x5D, 0x84, 0xEF, 0xB1, 0x75, 0x85, 0xE9, 0x02, 0x23, 0x26, 0xDC, 0x88, 0x1B, 0x65, 0xEB,
|
||||||
|
0x81, 0x3E, 0x89, 0x23, 0xC5, 0xAC, 0x96, 0xD3, 0xF3, 0x6F, 0x6D, 0x0F, 0x39, 0x42, 0xF4, 0x83,
|
||||||
|
0x82, 0x44, 0x0B, 0x2E, 0x04, 0x20, 0x84, 0xA4, 0x4A, 0xF0, 0xC8, 0x69, 0x5E, 0x9B, 0x1F, 0x9E,
|
||||||
|
0x42, 0x68, 0xC6, 0x21, 0x9A, 0x6C, 0xE9, 0xF6, 0x61, 0x9C, 0x0C, 0x67, 0xF0, 0x88, 0xD3, 0xAB,
|
||||||
|
0xD2, 0xA0, 0x51, 0x6A, 0x68, 0x2F, 0x54, 0xD8, 0x28, 0xA7, 0x0F, 0x96, 0xA3, 0x33, 0x51, 0xAB,
|
||||||
|
0x6C, 0x0B, 0xEF, 0x6E, 0xE4, 0x3B, 0x7A, 0x13, 0x50, 0xF0, 0x3B, 0xBA, 0x98, 0x2A, 0xFB, 0x7E,
|
||||||
|
0x1D, 0x65, 0xF1, 0xA1, 0x76, 0x01, 0xAF, 0x39, 0x3E, 0x59, 0xCA, 0x66, 0x88, 0x0E, 0x43, 0x82,
|
||||||
|
0x19, 0x86, 0xEE, 0x8C, 0xB4, 0x9F, 0x6F, 0x45, 0xC3, 0xA5, 0x84, 0x7D, 0xBE, 0x5E, 0x8B, 0x3B,
|
||||||
|
0xD8, 0x75, 0x6F, 0xE0, 0x73, 0x20, 0xC1, 0x85, 0x9F, 0x44, 0x1A, 0x40, 0xA6, 0x6A, 0xC1, 0x56,
|
||||||
|
0x62, 0xAA, 0xD3, 0x4E, 0x06, 0x77, 0x3F, 0x36, 0x72, 0xDF, 0xFE, 0x1B, 0x3D, 0x02, 0x9B, 0x42,
|
||||||
|
0x24, 0xD7, 0xD0, 0x37, 0x48, 0x12, 0x0A, 0xD0, 0xD3, 0xEA, 0x0F, 0xDB, 0x9B, 0xC0, 0xF1, 0x49,
|
||||||
|
0xC9, 0x72, 0x53, 0x07, 0x7B, 0x1B, 0x99, 0x80, 0xD8, 0x79, 0xD4, 0x25, 0xF7, 0xDE, 0xE8, 0xF6,
|
||||||
|
0x1A, 0x50, 0xFE, 0xE3, 0x3B, 0x4C, 0x79, 0xB6, 0xBD, 0xE0, 0x6C, 0x97, 0xBA, 0x06, 0xC0, 0x04,
|
||||||
|
0xB6, 0x4F, 0xA9, 0xC1, 0xC4, 0x60, 0x9F, 0x40, 0xC2, 0x9E, 0x5C, 0x5E, 0x63, 0x24, 0x6A, 0x19,
|
||||||
|
0xAF, 0x6F, 0xFB, 0x68, 0xB5, 0x53, 0x6C, 0x3E, 0xEB, 0xB2, 0x39, 0x13, 0x6F, 0xEC, 0x52, 0x3B,
|
||||||
|
0x1F, 0x51, 0xFC, 0x6D, 0x2C, 0x95, 0x30, 0x9B, 0x44, 0x45, 0x81, 0xCC, 0x09, 0xBD, 0x5E, 0xAF,
|
||||||
|
0x04, 0xD0, 0xE3, 0xBE, 0xFD, 0x4A, 0x33, 0xDE, 0x07, 0x28, 0x0F, 0x66, 0xB3, 0x4B, 0x2E, 0x19,
|
||||||
|
0x57, 0xA8, 0xCB, 0xC0, 0x0F, 0x74, 0xC8, 0x45, 0x39, 0x5F, 0x0B, 0xD2, 0xDB, 0xFB, 0xD3, 0xB9,
|
||||||
|
0xBD, 0xC0, 0x79, 0x55, 0x0A, 0x32, 0x60, 0x1A, 0xC6, 0x00, 0xA1, 0xD6, 0x79, 0x72, 0x2C, 0x40,
|
||||||
|
0xFE, 0x25, 0x9F, 0x67, 0xCC, 0xA3, 0x1F, 0xFB, 0xF8, 0xE9, 0xA5, 0x8E, 0xF8, 0x22, 0x32, 0xDB,
|
||||||
|
0xDF, 0x16, 0x75, 0x3C, 0x15, 0x6B, 0x61, 0xFD, 0xC8, 0x1E, 0x50, 0x2F, 0xAB, 0x52, 0x05, 0xAD,
|
||||||
|
0xFA, 0xB5, 0x3D, 0x32, 0x60, 0x87, 0x23, 0xFD, 0x48, 0x7B, 0x31, 0x53, 0x82, 0xDF, 0x00, 0x3E,
|
||||||
|
0xBB, 0x57, 0x5C, 0x9E, 0xA0, 0x8C, 0x6F, 0xCA, 0x2E, 0x56, 0x87, 0x1A, 0xDB, 0x69, 0x17, 0xDF,
|
||||||
|
0xF6, 0xA8, 0x42, 0xD5, 0xC3, 0xFF, 0x7E, 0x28, 0xC6, 0x32, 0x67, 0xAC, 0x73, 0x55, 0x4F, 0x8C,
|
||||||
|
0xB0, 0x27, 0x5B, 0x69, 0xC8, 0x58, 0xCA, 0xBB, 0x5D, 0xA3, 0xFF, 0xE1, 0xA0, 0x11, 0xF0, 0xB8,
|
||||||
|
0x98, 0x3D, 0xFA, 0x10, 0xB8, 0x83, 0x21, 0xFD, 0x6C, 0xB5, 0xFC, 0x4A, 0x5B, 0xD3, 0xD1, 0x2D,
|
||||||
|
0x79, 0xE4, 0x53, 0x9A, 0x65, 0x45, 0xF8, 0xB6, 0xBC, 0x49, 0x8E, 0xD2, 0x90, 0x97, 0xFB, 0x4B,
|
||||||
|
0xDA, 0xF2, 0xDD, 0xE1, 0x33, 0x7E, 0xCB, 0xA4, 0x41, 0x13, 0xFB, 0x62, 0xE8, 0xC6, 0xE4, 0xCE,
|
||||||
|
0xDA, 0xCA, 0x20, 0xEF, 0x01, 0x4C, 0x77, 0x36, 0xFE, 0x9E, 0x7E, 0xD0, 0xB4, 0x1F, 0xF1, 0x2B,
|
||||||
|
0x4D, 0xDA, 0xDB, 0x95, 0x98, 0x91, 0x90, 0xAE, 0x71, 0x8E, 0xAD, 0xEA, 0xA0, 0xD5, 0x93, 0x6B,
|
||||||
|
0xD0, 0xD1, 0x8E, 0xD0, 0xE0, 0x25, 0xC7, 0xAF, 0x2F, 0x5B, 0x3C, 0x8E, 0xB7, 0x94, 0x75, 0x8E,
|
||||||
|
0xFB, 0xE2, 0xF6, 0x8F, 0x64, 0x2B, 0x12, 0xF2, 0x12, 0xB8, 0x88, 0x88, 0x1C, 0xF0, 0x0D, 0x90,
|
||||||
|
0xA0, 0x5E, 0xAD, 0x4F, 0x1C, 0xC3, 0x8F, 0x68, 0x91, 0xF1, 0xCF, 0xD1, 0xAD, 0xC1, 0xA8, 0xB3,
|
||||||
|
0x18, 0x22, 0x2F, 0x2F, 0x77, 0x17, 0x0E, 0xBE, 0xFE, 0x2D, 0x75, 0xEA, 0xA1, 0x1F, 0x02, 0x8B,
|
||||||
|
0x0F, 0xCC, 0xA0, 0xE5, 0xE8, 0x74, 0x6F, 0xB5, 0xD6, 0xF3, 0xAC, 0x18, 0x99, 0xE2, 0x89, 0xCE,
|
||||||
|
0xE0, 0x4F, 0xA8, 0xB4, 0xB7, 0xE0, 0x13, 0xFD, 0x81, 0x3B, 0xC4, 0x7C, 0xD9, 0xA8, 0xAD, 0xD2,
|
||||||
|
0x66, 0xA2, 0x5F, 0x16, 0x05, 0x77, 0x95, 0x80, 0x14, 0x73, 0xCC, 0x93, 0x77, 0x14, 0x1A, 0x21,
|
||||||
|
0x65, 0x20, 0xAD, 0xE6, 0x86, 0xFA, 0xB5, 0x77, 0xF5, 0x42, 0x54, 0xC7, 0xCF, 0x35, 0x9D, 0xFB,
|
||||||
|
0x0C, 0xAF, 0xCD, 0xEB, 0xA0, 0x89, 0x3E, 0x7B, 0xD3, 0x1B, 0x41, 0xD6, 0x49, 0x7E, 0x1E, 0xAE,
|
||||||
|
0x2D, 0x0E, 0x25, 0x00, 0x5E, 0xB3, 0x71, 0x20, 0xBB, 0x00, 0x68, 0x22, 0xAF, 0xE0, 0xB8, 0x57,
|
||||||
|
0x9B, 0x36, 0x64, 0x24, 0x1E, 0xB9, 0x09, 0xF0, 0x1D, 0x91, 0x63, 0x55, 0xAA, 0xA6, 0xDF, 0x59,
|
||||||
|
0x89, 0x43, 0xC1, 0x78, 0x7F, 0x53, 0x5A, 0xD9, 0xA2, 0x5B, 0x7D, 0x20, 0xC5, 0xB9, 0xE5, 0x02,
|
||||||
|
0x76, 0x03, 0x26, 0x83, 0xA9, 0xCF, 0x95, 0x62, 0x68, 0x19, 0xC8, 0x11, 0x41, 0x4A, 0x73, 0x4E,
|
||||||
|
0xCA, 0x2D, 0x47, 0xB3, 0x4A, 0xA9, 0x14, 0x7B, 0x52, 0x00, 0x51, 0x1B, 0x15, 0x29, 0x53, 0x9A,
|
||||||
|
0x3F, 0x57, 0x0F, 0xD6, 0xE4, 0xC6, 0x9B, 0xBC, 0x76, 0xA4, 0x60, 0x2B, 0x00, 0x74, 0xE6, 0x81,
|
||||||
|
0xB5, 0x6F, 0xBA, 0x08, 0x1F, 0xE9, 0x1B, 0x57, 0x6B, 0xEC, 0x96, 0xF2, 0x15, 0xD9, 0x0D, 0x2A,
|
||||||
|
0x21, 0x65, 0x63, 0xB6, 0xB6, 0xF9, 0xB9, 0xE7, 0x2E, 0x05, 0x34, 0xFF, 0x64, 0x56, 0x85, 0xC5,
|
||||||
|
0x5D, 0x2D, 0xB0, 0x53, 0xA1, 0x8F, 0x9F, 0xA9, 0x99, 0x47, 0xBA, 0x08, 0x6A, 0x07, 0x85, 0x6E,
|
||||||
|
0xE9, 0x70, 0x7A, 0x4B, 0x44, 0x29, 0xB3, 0xB5, 0x2E, 0x09, 0x75, 0xDB, 0x23, 0x26, 0x19, 0xC4,
|
||||||
|
0xB0, 0xA6, 0x6E, 0xAD, 0x7D, 0xDF, 0xA7, 0x49, 0xB8, 0x60, 0xEE, 0x9C, 0x66, 0xB2, 0xED, 0x8F,
|
||||||
|
0x71, 0x8C, 0xAA, 0xEC, 0xFF, 0x17, 0x9A, 0x69, 0x6C, 0x52, 0x64, 0x56, 0xE1, 0x9E, 0xB1, 0xC2,
|
||||||
|
0xA5, 0x02, 0x36, 0x19, 0x29, 0x4C, 0x09, 0x75, 0x40, 0x13, 0x59, 0xA0, 0x3E, 0x3A, 0x18, 0xE4,
|
||||||
|
0x9A, 0x98, 0x54, 0x3F, 0x65, 0x9D, 0x42, 0x5B, 0xD6, 0xE4, 0x8F, 0x6B, 0xD6, 0x3F, 0xF7, 0x99,
|
||||||
|
0x07, 0x9C, 0xD2, 0xA1, 0xF5, 0x30, 0xE8, 0xEF, 0xE6, 0x38, 0x2D, 0x4D, 0xC1, 0x5D, 0x25, 0xF0,
|
||||||
|
0x86, 0x20, 0xDD, 0x4C, 0x26, 0xEB, 0x70, 0x84, 0xC6, 0xE9, 0x82, 0x63, 0x5E, 0xCC, 0x1E, 0x02,
|
||||||
|
0x3F, 0x6B, 0x68, 0x09, 0xC9, 0xEF, 0xBA, 0x3E, 0x14, 0x18, 0x97, 0x3C, 0xA1, 0x70, 0x6A, 0x6B,
|
||||||
|
0x84, 0x35, 0x7F, 0x68, 0x86, 0xE2, 0xA0, 0x52, 0x05, 0x53, 0x9C, 0xB7, 0x37, 0x07, 0x50, 0xAA,
|
||||||
|
0x1C, 0x84, 0x07, 0x3E, 0x5C, 0xAE, 0xDE, 0x7F, 0xEC, 0x44, 0x7D, 0x8E, 0xB8, 0xF2, 0x16, 0x57,
|
||||||
|
0x37, 0xDA, 0x3A, 0xB0, 0x0D, 0x0C, 0x50, 0xF0, 0x04, 0x1F, 0x1C, 0xF0, 0xFF, 0xB3, 0x00, 0x02,
|
||||||
|
0x1A, 0xF5, 0x0C, 0xAE, 0xB2, 0x74, 0xB5, 0x3C, 0x58, 0x7A, 0x83, 0x25, 0xBD, 0x21, 0x09, 0xDC,
|
||||||
|
0xF9, 0x13, 0x91, 0xD1, 0xF6, 0x2F, 0xA9, 0x7C, 0x73, 0x47, 0x32, 0x94, 0x01, 0x47, 0xF5, 0x22,
|
||||||
|
0x81, 0xE5, 0xE5, 0x3A, 0xDC, 0xDA, 0xC2, 0x37, 0x34, 0x76, 0xB5, 0xC8, 0xA7, 0xDD, 0xF3, 0x9A,
|
||||||
|
0x46, 0x61, 0x44, 0xA9, 0x0E, 0x03, 0xD0, 0x0F, 0x3E, 0xC7, 0xC8, 0xEC, 0x41, 0x1E, 0x75, 0xA4,
|
||||||
|
0x99, 0xCD, 0x38, 0xE2, 0x2F, 0x0E, 0xEA, 0x3B, 0xA1, 0xBB, 0x80, 0x32, 0x31, 0xB3, 0x3E, 0x18,
|
||||||
|
0x38, 0x8B, 0x54, 0x4E, 0x08, 0xB9, 0x6D, 0x4F, 0x03, 0x0D, 0x42, 0x6F, 0xBF, 0x04, 0x0A, 0xF6,
|
||||||
|
0x90, 0x12, 0xB8, 0x2C, 0x79, 0x7C, 0x97, 0x24, 0x72, 0xB0, 0x79, 0x56, 0xAF, 0x89, 0xAF, 0xBC,
|
||||||
|
0x1F, 0x77, 0x9A, 0xDE, 0x10, 0x08, 0x93, 0xD9, 0x12, 0xAE, 0x8B, 0xB3, 0x2E, 0x3F, 0xCF, 0xDC,
|
||||||
|
0x1F, 0x72, 0x12, 0x55, 0x24, 0x71, 0x6B, 0x2E, 0xE6, 0xDD, 0x1A, 0x50, 0x87, 0xCD, 0x84, 0x9F,
|
||||||
|
0x18, 0x47, 0x58, 0x7A, 0x17, 0xDA, 0x08, 0x74, 0xBC, 0x9A, 0x9F, 0xBC, 0x8C, 0x7D, 0x4B, 0xE9,
|
||||||
|
0x3A, 0xEC, 0x7A, 0xEC, 0xFA, 0x1D, 0x85, 0xDB, 0x66, 0x43, 0x09, 0x63, 0xD2, 0xC3, 0x64, 0xC4,
|
||||||
|
0x47, 0x18, 0x1C, 0xEF, 0x08, 0xD9, 0x15, 0x32, 0x37, 0x3B, 0x43, 0xDD, 0x16, 0xBA, 0xC2, 0x24,
|
||||||
|
0x43, 0x4D, 0xA1, 0x12, 0x51, 0xC4, 0x65, 0x2A, 0x02, 0x00, 0x94, 0x50, 0xDD, 0xE4, 0x3A, 0x13,
|
||||||
|
0x9E, 0xF8, 0xDF, 0x71, 0x55, 0x4E, 0x31, 0x10, 0xD6, 0x77, 0xAC, 0x81, 0x9B, 0x19, 0x11, 0x5F,
|
||||||
|
0xF1, 0x56, 0x35, 0x04, 0x6B, 0xC7, 0xA3, 0xD7, 0x3B, 0x18, 0x11, 0x3C, 0x09, 0xA5, 0x24, 0x59,
|
||||||
|
0xED, 0xE6, 0x8F, 0xF2, 0xFA, 0xFB, 0xF1, 0x97, 0x2C, 0xBF, 0xBA, 0x9E, 0x6E, 0x3C, 0x15, 0x1E,
|
||||||
|
0x70, 0x45, 0xE3, 0x86, 0xB1, 0x6F, 0xE9, 0xEA, 0x0A, 0x5E, 0x0E, 0x86, 0xB3, 0x2A, 0x3E, 0x5A,
|
||||||
|
0x1C, 0xE7, 0x1F, 0x77, 0xFA, 0x06, 0x3D, 0x4E, 0xB9, 0xDC, 0x65, 0x29, 0x0F, 0x1D, 0xE7, 0x99,
|
||||||
|
0xD6, 0x89, 0x3E, 0x80, 0x25, 0xC8, 0x66, 0x52, 0x78, 0xC9, 0x4C, 0x2E, 0x6A, 0xB3, 0x10, 0x9C,
|
||||||
|
0xBA, 0x0E, 0x15, 0xC6, 0x78, 0xEA, 0xE2, 0x94, 0x53, 0x3C, 0xFC, 0xA5, 0xF4, 0x2D, 0x0A, 0x1E,
|
||||||
|
0xA7, 0x4E, 0xF7, 0xF2, 0x3D, 0x2B, 0x1D, 0x36, 0x0F, 0x26, 0x39, 0x19, 0x60, 0x79, 0xC2, 0x19,
|
||||||
|
0x08, 0xA7, 0x23, 0x52, 0xB6, 0x12, 0x13, 0xF7, 0x6E, 0xFE, 0xAD, 0xEB, 0x66, 0x1F, 0xC3, 0xEA,
|
||||||
|
0x95, 0x45, 0xBC, 0xE3, 0x83, 0xC8, 0x7B, 0xA6, 0xD1, 0x37, 0x7F, 0xB1, 0x28, 0xFF, 0x8C, 0x01,
|
||||||
|
0xEF, 0xDD, 0x32, 0xC3, 0xA5, 0x5A, 0x6C, 0xBE, 0x85, 0x21, 0x58, 0x65, 0x02, 0x98, 0xAB, 0x68,
|
||||||
|
0x0F, 0xA5, 0xCE, 0xEE, 0x3B, 0x95, 0x2F, 0xDB, 0xAD, 0x7D, 0xEF, 0x2A, 0x84, 0x2F, 0x6E, 0x5B,
|
||||||
|
0x28, 0xB6, 0x21, 0x15, 0x70, 0x61, 0x07, 0x29, 0x75, 0x47, 0xDD, 0xEC, 0x10, 0x15, 0x9F, 0x61,
|
||||||
|
0x30, 0xA8, 0xCC, 0x13, 0x96, 0xBD, 0x61, 0xEB, 0x1E, 0xFE, 0x34, 0x03, 0xCF, 0x63, 0x03, 0xAA,
|
||||||
|
0x90, 0x5C, 0x73, 0xB5, 0x39, 0xA2, 0x70, 0x4C, 0x0B, 0x9E, 0x9E, 0xD5, 0x14, 0xDE, 0xAA, 0xCB,
|
||||||
|
0xBC, 0x86, 0xCC, 0xEE, 0xA7, 0x2C, 0x62, 0x60, 0xAB, 0x5C, 0xAB, 0x9C, 0x6E, 0x84, 0xF3, 0xB2,
|
||||||
|
0xAF, 0x1E, 0x8B, 0x64, 0xCA, 0xF0, 0xBD, 0x19, 0xB9, 0x69, 0x23, 0xA0, 0x50, 0xBB, 0x5A, 0x65,
|
||||||
|
0x32, 0x5A, 0x68, 0x40, 0xB3, 0xB4, 0x2A, 0x3C, 0xD5, 0xE9, 0x9E, 0x31, 0xF7, 0xB8, 0x21, 0xC0,
|
||||||
|
0x19, 0x0B, 0x54, 0x9B, 0x99, 0xA0, 0x5F, 0x87, 0x7E, 0x99, 0xF7, 0x95, 0xA8, 0x7D, 0x3D, 0x62,
|
||||||
|
0x9A, 0x88, 0x37, 0xF8, 0x77, 0x2D, 0xE3, 0x97, 0x5F, 0x93, 0xED, 0x11, 0x81, 0x12, 0x68, 0x16,
|
||||||
|
0x29, 0x88, 0x35, 0x0E, 0xD6, 0x1F, 0xE6, 0xC7, 0xA1, 0xDF, 0xDE, 0x96, 0x99, 0xBA, 0x58, 0x78,
|
||||||
|
0xA5, 0x84, 0xF5, 0x57, 0x63, 0x72, 0x22, 0x1B, 0xFF, 0xC3, 0x83, 0x9B, 0x96, 0x46, 0xC2, 0x1A,
|
||||||
|
0xEB, 0x0A, 0xB3, 0xCD, 0x54, 0x30, 0x2E, 0x53, 0xE4, 0x48, 0xD9, 0x8F, 0x28, 0x31, 0xBC, 0x6D,
|
||||||
|
0xEF, 0xF2, 0xEB, 0x58, 0xEA, 0xFF, 0xC6, 0x34, 0x61, 0xED, 0x28, 0xFE, 0x73, 0x3C, 0x7C, 0xEE,
|
||||||
|
0xD9, 0x14, 0x4A, 0x5D, 0xE3, 0xB7, 0x64, 0xE8, 0x14, 0x5D, 0x10, 0x42, 0xE0, 0x13, 0x3E, 0x20,
|
||||||
|
0xB6, 0xE2, 0xEE, 0x45, 0xEA, 0xAB, 0xAA, 0xA3, 0x15, 0x4F, 0x6C, 0xDB, 0xD0, 0x4F, 0xCB, 0xFA,
|
||||||
|
0x42, 0xF4, 0x42, 0xC7, 0xB5, 0xBB, 0x6A, 0xEF, 0x1D, 0x3B, 0x4F, 0x65, 0x05, 0x21, 0xCD, 0x41,
|
||||||
|
0x9E, 0x79, 0x1E, 0xD8, 0xC7, 0x4D, 0x85, 0x86, 0x6A, 0x47, 0x4B, 0xE4, 0x50, 0x62, 0x81, 0x3D,
|
||||||
|
0xF2, 0xA1, 0x62, 0xCF, 0x46, 0x26, 0x8D, 0x5B, 0xA0, 0x83, 0x88, 0xFC, 0xA3, 0xB6, 0xC7, 0xC1,
|
||||||
|
0xC3, 0x24, 0x15, 0x7F, 0x92, 0x74, 0xCB, 0x69, 0x0B, 0x8A, 0x84, 0x47, 0x85, 0xB2, 0x92, 0x56,
|
||||||
|
0x00, 0xBF, 0x5B, 0x09, 0x9D, 0x48, 0x19, 0xAD, 0x74, 0xB1, 0x62, 0x14, 0x00, 0x0E, 0x82, 0x23,
|
||||||
|
0x2A, 0x8D, 0x42, 0x58, 0xEA, 0xF5, 0x55, 0x0C, 0x3E, 0xF4, 0xAD, 0x1D, 0x61, 0x70, 0x3F, 0x23,
|
||||||
|
0x92, 0xF0, 0x72, 0x33, 0x41, 0x7E, 0x93, 0x8D, 0xF1, 0xEC, 0x5F, 0xD6, 0xDB, 0x3B, 0x22, 0x6C,
|
||||||
|
0x59, 0x37, 0xDE, 0x7C, 0x60, 0x74, 0xEE, 0xCB, 0xA7, 0xF2, 0x85, 0x40, 0x6E, 0x32, 0x77, 0xCE,
|
||||||
|
0x84, 0x80, 0x07, 0xA6, 0x9E, 0x50, 0xF8, 0x19, 0x55, 0xD8, 0xEF, 0xE8, 0x35, 0x97, 0xD9, 0x61,
|
||||||
|
0xAA, 0xA7, 0x69, 0xA9, 0xC2, 0x06, 0x0C, 0xC5, 0xFC, 0xAB, 0x04, 0x5A, 0xDC, 0xCA, 0x0B, 0x80,
|
||||||
|
0x2E, 0x7A, 0x44, 0x9E, 0x84, 0x34, 0x45, 0xC3, 0x05, 0x67, 0xD5, 0xFD, 0xC9, 0x9E, 0x1E, 0x0E,
|
||||||
|
0xD3, 0xDB, 0x73, 0xDB, 0xCD, 0x88, 0x55, 0x10, 0x79, 0xDA, 0x5F, 0x67, 0x40, 0x43, 0x67, 0xE3,
|
||||||
|
0x65, 0x34, 0xC4, 0xC5, 0xD8, 0x38, 0x3E, 0x71, 0x9E, 0xF8, 0x28, 0x3D, 0x20, 0xFF, 0x6D, 0xF1,
|
||||||
|
0xE7, 0x21, 0x3E, 0x15, 0x4A, 0x3D, 0xB0, 0x8F, 0x2B, 0x9F, 0xE3, 0xE6, 0xF7, 0xAD, 0x83, 0xDB,
|
||||||
|
0x68, 0x5A, 0x3D, 0xE9, 0xF7, 0x40, 0x81, 0x94, 0x1C, 0x26, 0x4C, 0xF6, 0x34, 0x29, 0x69, 0x94,
|
||||||
|
0xF7, 0x20, 0x15, 0x41, 0xF7, 0xD4, 0x02, 0x76, 0x2E, 0x6B, 0xF4, 0xBC, 0x68, 0x00, 0xA2, 0xD4,
|
||||||
|
0x71, 0x24, 0x08, 0xD4, 0x6A, 0xF4, 0x20, 0x33, 0xB7, 0xD4, 0xB7, 0x43, 0xAF, 0x61, 0x00, 0x50,
|
||||||
|
0x2E, 0xF6, 0x39, 0x1E, 0x46, 0x45, 0x24, 0x97, 0x74, 0x4F, 0x21, 0x14, 0x40, 0x88, 0x8B, 0xBF,
|
||||||
|
0x1D, 0xFC, 0x95, 0x4D, 0xAF, 0x91, 0xB5, 0x96, 0xD3, 0xDD, 0xF4, 0x70, 0x45, 0x2F, 0xA0, 0x66,
|
||||||
|
0xEC, 0x09, 0xBC, 0xBF, 0x85, 0x97, 0xBD, 0x03, 0xD0, 0x6D, 0xAC, 0x7F, 0x04, 0x85, 0xCB, 0x31,
|
||||||
|
0xB3, 0x27, 0xEB, 0x96, 0x41, 0x39, 0xFD, 0x55, 0xE6, 0x47, 0x25, 0xDA, 0x9A, 0x0A, 0xCA, 0xAB,
|
||||||
|
0x25, 0x78, 0x50, 0x28, 0xF4, 0x29, 0x04, 0x53, 0xDA, 0x86, 0x2C, 0x0A, 0xFB, 0x6D, 0xB6, 0xE9,
|
||||||
|
0x62, 0x14, 0xDC, 0x68, 0x00, 0x69, 0x48, 0xD7, 0xA4, 0xC0, 0x0E, 0x68, 0xEE, 0x8D, 0xA1, 0x27,
|
||||||
|
0xA2, 0xFE, 0x3F, 0x4F, 0x8C, 0xAD, 0x87, 0xE8, 0x06, 0xE0, 0x8C, 0xB5, 0xB6, 0xD6, 0xF4, 0x7A,
|
||||||
|
0x7C, 0x1E, 0xCE, 0xAA, 0xEC, 0x5F, 0x37, 0xD3, 0x99, 0xA3, 0x78, 0xCE, 0x42, 0x2A, 0x6B, 0x40,
|
||||||
|
0x35, 0x9E, 0xFE, 0x20, 0xB9, 0x85, 0xF3, 0xD9, 0xAB, 0xD7, 0x39, 0xEE, 0x8B, 0x4E, 0x12, 0x3B,
|
||||||
|
0xF7, 0xFA, 0xC9, 0x1D, 0x56, 0x18, 0x6D, 0x4B, 0x31, 0x66, 0xA3, 0x26, 0xB2, 0x97, 0xE3, 0xEA,
|
||||||
|
0x74, 0xFA, 0x6E, 0x3A, 0x32, 0x43, 0x5B, 0xDD, 0xF7, 0xE7, 0x41, 0x68, 0xFB, 0x20, 0x78, 0xCA,
|
||||||
|
0x4E, 0xF5, 0x0A, 0xFB, 0x97, 0xB3, 0xFE, 0xD8, 0xAC, 0x56, 0x40, 0x45, 0x27, 0x95, 0x48, 0xBA,
|
||||||
|
0x3A, 0x3A, 0x53, 0x55, 0x87, 0x8D, 0x83, 0x20, 0xB7, 0xA9, 0x6B, 0xFE, 0x4B, 0x95, 0x96, 0xD0,
|
||||||
|
0xBC, 0x67, 0xA8, 0x55, 0x58, 0x9A, 0x15, 0xA1, 0x63, 0x29, 0xA9, 0xCC, 0x33, 0xDB, 0xE1, 0x99,
|
||||||
|
0x56, 0x4A, 0x2A, 0xA6, 0xF9, 0x25, 0x31, 0x3F, 0x1C, 0x7E, 0xF4, 0x5E, 0x7C, 0x31, 0x29, 0x90,
|
||||||
|
0x02, 0xE8, 0xF8, 0xFD, 0x70, 0x2F, 0x27, 0x04, 0x5C, 0x15, 0xBB, 0x80, 0xE3, 0x2C, 0x28, 0x05,
|
||||||
|
0x48, 0x15, 0xC1, 0x95, 0x22, 0x6D, 0xC6, 0xE4, 0x3F, 0x13, 0xC1, 0x48, 0xDC, 0x86, 0x0F, 0xC7,
|
||||||
|
0xEE, 0xC9, 0xF9, 0x07, 0x0F, 0x1F, 0x04, 0x41, 0xA4, 0x79, 0x47, 0x40, 0x17, 0x6E, 0x88, 0x5D,
|
||||||
|
0xEB, 0x51, 0x5F, 0x32, 0xD1, 0xC0, 0x9B, 0xD5, 0x8F, 0xC1, 0xBC, 0xF2, 0x64, 0x35, 0x11, 0x41,
|
||||||
|
0x34, 0x78, 0x7B, 0x25, 0x60, 0x9C, 0x2A, 0x60, 0xA3, 0xE8, 0xF8, 0xDF, 0x1B, 0x6C, 0x63, 0x1F,
|
||||||
|
0xC2, 0xB4, 0x12, 0x0E, 0x9E, 0x32, 0xE1, 0x02, 0xD1, 0x4F, 0x66, 0xAF, 0x15, 0x81, 0xD1, 0xCA,
|
||||||
|
0xE0, 0x95, 0x23, 0x6B, 0xE1, 0x92, 0x3E, 0x33, 0x62, 0x0B, 0x24, 0x3B, 0x22, 0xB9, 0xBE, 0xEE,
|
||||||
|
0x0E, 0xA2, 0xB2, 0x85, 0x99, 0x0D, 0xBA, 0xE6, 0x8C, 0x0C, 0x72, 0xDE, 0x28, 0xF7, 0xA2, 0x2D,
|
||||||
|
0x45, 0x78, 0x12, 0xD0, 0xFD, 0x94, 0xB7, 0x95, 0x62, 0x08, 0x7D, 0x64, 0xF0, 0xF5, 0xCC, 0xE7,
|
||||||
|
0x6F, 0xA3, 0x49, 0x54, 0xFA, 0x48, 0x7D, 0x87, 0x27, 0xFD, 0x9D, 0xC3, 0x1E, 0x8D, 0x3E, 0xF3,
|
||||||
|
0x41, 0x63, 0x47, 0x0A, 0x74, 0xFF, 0x2E, 0x99, 0xAB, 0x6E, 0x6F, 0x3A, 0x37, 0xFD, 0xF8, 0xF4,
|
||||||
|
0x60, 0xDC, 0x12, 0xA8, 0xF8, 0xDD, 0xEB, 0xA1, 0x4C, 0xE1, 0x1B, 0x99, 0x0D, 0x6B, 0x6E, 0xDB,
|
||||||
|
0x10, 0x55, 0x7B, 0xC6, 0x37, 0x2C, 0x67, 0x6D, 0x3B, 0xD4, 0x65, 0x27, 0x04, 0xE8, 0xD0, 0xDC,
|
||||||
|
0xC7, 0x0D, 0x29, 0xF1, 0xA3, 0xFF, 0x00, 0xCC, 0x92, 0x0F, 0x39, 0xB5, 0x0B, 0xED, 0x0F, 0x69,
|
||||||
|
0xFB, 0x9F, 0x7B, 0x66, 0x9C, 0x7D, 0xDB, 0xCE, 0x0B, 0xCF, 0x91, 0xA0, 0xA3, 0x5E, 0x15, 0xD9,
|
||||||
|
0x88, 0x2F, 0x13, 0xBB, 0x24, 0xAD, 0x5B, 0x51, 0xBF, 0x79, 0x94, 0x7B, 0xEB, 0xD6, 0x3B, 0x76,
|
||||||
|
0xB3, 0x2E, 0x39, 0x37, 0x79, 0x59, 0x11, 0xCC, 0x97, 0xE2, 0x26, 0x80, 0x2D, 0x31, 0x2E, 0xF4,
|
||||||
|
0xA7, 0xAD, 0x42, 0x68, 0x3B, 0x2B, 0x6A, 0xC6, 0xCC, 0x4C, 0x75, 0x12, 0x1C, 0xF1, 0x2E, 0x78,
|
||||||
|
0x37, 0x42, 0x12, 0x6A, 0xE7, 0x51, 0x92, 0xB7, 0xE6, 0xBB, 0xA1, 0x06, 0x50, 0x63, 0xFB, 0x4B,
|
||||||
|
0x18, 0x10, 0x6B, 0x1A, 0xFA, 0xED, 0xCA, 0x11, 0xD8, 0xBD, 0x25, 0x3D, 0xC9, 0xC3, 0xE1, 0xE2,
|
||||||
|
0x59, 0x16, 0x42, 0x44, 0x86, 0x13, 0x12, 0x0A, 0x6E, 0xEC, 0x0C, 0xD9, 0x2A, 0xEA, 0xAB, 0xD5,
|
||||||
|
0x4E, 0x67, 0xAF, 0x64, 0x5F, 0xA8, 0x86, 0xDA, 0x88, 0xE9, 0xBF, 0xBE, 0xFE, 0xC3, 0xE4, 0x64,
|
||||||
|
0x57, 0x80, 0xBC, 0x9D, 0x86, 0xC0, 0xF7, 0xF0, 0xF8, 0x7B, 0x78, 0x60, 0x4D, 0x60, 0x03, 0x60,
|
||||||
|
0x46, 0x83, 0xFD, 0xD1, 0xB0, 0x1F, 0x38, 0xF6, 0x04, 0xAE, 0x45, 0x77, 0xCC, 0xFC, 0x36, 0xD7,
|
||||||
|
0x33, 0x6B, 0x42, 0x83, 0x71, 0xAB, 0x1E, 0xF0, 0x87, 0x41, 0x80, 0xB0, 0x5F, 0x5E, 0x00, 0x3C,
|
||||||
|
0xBE, 0x57, 0xA0, 0x77, 0x24, 0xAE, 0xE8, 0xBD, 0x99, 0x42, 0x46, 0x55, 0x61, 0x2E, 0x58, 0xBF,
|
||||||
|
0x8F, 0xF4, 0x58, 0x4E, 0xA2, 0xFD, 0xDD, 0xF2, 0x38, 0xEF, 0x74, 0xF4, 0xC2, 0xBD, 0x89, 0x87,
|
||||||
|
0xC3, 0xF9, 0x66, 0x53, 0x74, 0x8E, 0xB3, 0xC8, 0x55, 0xF2, 0x75, 0xB4, 0xB9, 0xD9, 0xFC, 0x46,
|
||||||
|
0x61, 0x26, 0xEB, 0x7A, 0x84, 0xDF, 0x1D, 0x8B, 0x79, 0x0E, 0x6A, 0x84, 0xE2, 0x95, 0x5F, 0x91,
|
||||||
|
0x8E, 0x59, 0x6E, 0x46, 0x70, 0x57, 0xB4, 0x20, 0x91, 0x55, 0xD5, 0x8C, 0x4C, 0xDE, 0x02, 0xC9,
|
||||||
|
0xE1, 0xAC, 0x0B, 0xB9, 0xD0, 0x05, 0x82, 0xBB, 0x48, 0x62, 0xA8, 0x11, 0x9E, 0xA9, 0x74, 0x75,
|
||||||
|
0xB6, 0x19, 0x7F, 0xB7, 0x09, 0xDC, 0xA9, 0xE0, 0xA1, 0x09, 0x2D, 0x66, 0x33, 0x46, 0x32, 0xC4,
|
||||||
|
0x02, 0x1F, 0x5A, 0xE8, 0x8C, 0xBE, 0xF0, 0x09, 0x25, 0xA0, 0x99, 0x4A, 0x10, 0xFE, 0x6E, 0x1D,
|
||||||
|
0x1D, 0x3D, 0xB9, 0x1A, 0xDF, 0xA4, 0xA5, 0x0B, 0x0F, 0xF2, 0x86, 0xA1, 0x69, 0xF1, 0x68, 0x28,
|
||||||
|
0x83, 0xDA, 0xB7, 0xDC, 0xFE, 0x06, 0x39, 0x57, 0x9B, 0xCE, 0xE2, 0xA1, 0x52, 0x7F, 0xCD, 0x4F,
|
||||||
|
0x01, 0x5E, 0x11, 0x50, 0xFA, 0x83, 0x06, 0xA7, 0xC4, 0xB5, 0x02, 0xA0, 0x27, 0xD0, 0xE6, 0x0D,
|
||||||
|
0x27, 0x8C, 0xF8, 0x9A, 0x41, 0x86, 0x3F, 0x77, 0x06, 0x4C, 0x60, 0xC3, 0xB5, 0x06, 0xA8, 0x61,
|
||||||
|
0x28, 0x7A, 0x17, 0xF0, 0xE0, 0x86, 0xF5, 0xC0, 0xAA, 0x58, 0x60, 0x00, 0x62, 0x7D, 0xDC, 0x30,
|
||||||
|
0xD7, 0x9E, 0xE6, 0x11, 0x63, 0xEA, 0x38, 0x23, 0x94, 0xDD, 0xC2, 0x53, 0x34, 0x16, 0xC2, 0xC2,
|
||||||
|
0x56, 0xEE, 0xCB, 0xBB, 0xDE, 0xB6, 0xBC, 0x90, 0xA1, 0x7D, 0xFC, 0xEB, 0x76, 0x1D, 0x59, 0xCE,
|
||||||
|
0x09, 0xE4, 0x05, 0x6F, 0x88, 0x01, 0x7C, 0x4B, 0x3D, 0x0A, 0x72, 0x39, 0x24, 0x7C, 0x92, 0x7C,
|
||||||
|
0x5F, 0x72, 0xE3, 0x86, 0xB9, 0x9D, 0x4D, 0x72, 0xB4, 0x5B, 0xC1, 0x1A, 0xFC, 0xB8, 0x9E, 0xD3,
|
||||||
|
0x78, 0x55, 0x54, 0xED, 0xB5, 0xA5, 0xFC, 0x08, 0xD3, 0x7C, 0x3D, 0xD8, 0xC4, 0x0F, 0xAD, 0x4D,
|
||||||
|
0x5E, 0xEF, 0x50, 0x1E, 0xF8, 0xE6, 0x61, 0xB1, 0xD9, 0x14, 0x85, 0xA2, 0x3C, 0x13, 0x51, 0x6C,
|
||||||
|
0xE7, 0xC7, 0xD5, 0x6F, 0xC4, 0x4E, 0xE1, 0x56, 0xCE, 0xBF, 0x2A, 0x36, 0x37, 0xC8, 0xC6, 0xDD,
|
||||||
|
0x34, 0x32, 0x9A, 0xD7, 0x12, 0x82, 0x63, 0x92, 0x8E, 0xFA, 0x0E, 0x67, 0xE0, 0x00, 0x60, 0x40,
|
||||||
|
0x37, 0xCE, 0x39, 0x3A, 0xCF, 0xF5, 0xFA, 0xD3, 0x37, 0x77, 0xC2, 0xAB, 0x1B, 0x2D, 0xC5, 0x5A,
|
||||||
|
0x9E, 0x67, 0xB0, 0x5C, 0x42, 0x37, 0xA3, 0x4F, 0x40, 0x27, 0x82, 0xD3, 0xBE, 0x9B, 0xBC, 0x99,
|
||||||
|
0x9D, 0x8E, 0x11, 0xD5, 0x15, 0x73, 0x0F, 0xBF, 0x7E, 0x1C, 0x2D, 0xD6, 0x7B, 0xC4, 0x00, 0xC7,
|
||||||
|
0x6B, 0x1B, 0x8C, 0xB7, 0x45, 0x90, 0xA1, 0x21, 0xBE, 0xB1, 0x6E, 0xB2, 0xB4, 0x6E, 0x36, 0x6A,
|
||||||
|
0x2F, 0xAB, 0x48, 0x57, 0x79, 0x6E, 0x94, 0xBC, 0xD2, 0x76, 0xA3, 0xC6, 0xC8, 0xC2, 0x49, 0x65,
|
||||||
|
0xEE, 0xF8, 0x0F, 0x53, 0x7D, 0xDE, 0x8D, 0x46, 0x1D, 0x0A, 0x73, 0xD5, 0xC6, 0x4D, 0xD0, 0x4C,
|
||||||
|
0xDB, 0xBB, 0x39, 0x29, 0x50, 0x46, 0xBA, 0xA9, 0xE8, 0x26, 0x95, 0xAC, 0x04, 0xE3, 0x5E, 0xBE,
|
||||||
|
0xF0, 0xD5, 0xFA, 0xA1, 0x9A, 0x51, 0x2D, 0x6A, 0xE2, 0x8C, 0xEF, 0x63, 0x22, 0xEE, 0x86, 0x9A,
|
||||||
|
0xB8, 0xC2, 0x89, 0xC0, 0xF6, 0x2E, 0x24, 0x43, 0xAA, 0x03, 0x1E, 0xA5, 0xA4, 0xD0, 0xF2, 0x9C,
|
||||||
|
0xBA, 0x61, 0xC0, 0x83, 0x4D, 0x6A, 0xE9, 0x9B, 0x50, 0x15, 0xE5, 0x8F, 0xD6, 0x5B, 0x64, 0xBA,
|
||||||
|
0xF9, 0xA2, 0x26, 0x28, 0xE1, 0x3A, 0x3A, 0xA7, 0x86, 0x95, 0xA9, 0x4B, 0xE9, 0x62, 0x55, 0xEF,
|
||||||
|
0xD3, 0xEF, 0x2F, 0xC7, 0xDA, 0xF7, 0x52, 0xF7, 0x69, 0x6F, 0x04, 0x3F, 0x59, 0x0A, 0xFA, 0x77,
|
||||||
|
0x15, 0xA9, 0xE4, 0x80, 0x01, 0x86, 0xB0, 0x87, 0xAD, 0xE6, 0x09, 0x9B, 0x93, 0xE5, 0x3E, 0x3B,
|
||||||
|
0x5A, 0xFD, 0x90, 0xE9, 0x97, 0xD7, 0x34, 0x9E, 0xD9, 0xB7, 0xF0, 0x2C, 0x51, 0x8B, 0x2B, 0x02,
|
||||||
|
0x3A, 0xAC, 0xD5, 0x96, 0x7D, 0xA6, 0x7D, 0x01, 0xD6, 0x3E, 0xCF, 0xD1, 0x28, 0x2D, 0x7D, 0x7C,
|
||||||
|
0xCF, 0x25, 0x9F, 0x1F, 0x9B, 0xB8, 0xF2, 0xAD, 0x72, 0xB4, 0xD6, 0x5A, 0x4C, 0xF5, 0x88, 0x5A,
|
||||||
|
0x71, 0xAC, 0x29, 0xE0, 0xE6, 0xA5, 0x19, 0xE0, 0xFD, 0xAC, 0xB0, 0x47, 0x9B, 0xFA, 0x93, 0xED,
|
||||||
|
0x8D, 0xC4, 0xD3, 0xE8, 0xCC, 0x57, 0x3B, 0x28, 0x29, 0x66, 0xD5, 0xF8, 0x28, 0x2E, 0x13, 0x79,
|
||||||
|
0x91, 0x01, 0x5F, 0x78, 0x55, 0x60, 0x75, 0xED, 0x44, 0x0E, 0x96, 0xF7, 0x8C, 0x5E, 0xD3, 0xE3,
|
||||||
|
0xD4, 0x6D, 0x05, 0x15, 0xBA, 0x6D, 0xF4, 0x88, 0x25, 0x61, 0xA1, 0x03, 0xBD, 0xF0, 0x64, 0x05,
|
||||||
|
0x15, 0x9E, 0xEB, 0xC3, 0xA2, 0x57, 0x90, 0x3C, 0xEC, 0x1A, 0x27, 0x97, 0x2A, 0x07, 0x3A, 0xA9,
|
||||||
|
0x9B, 0x6D, 0x3F, 0x1B, 0xF5, 0x21, 0x63, 0x1E, 0xFB, 0x66, 0x9C, 0xF5, 0x19, 0xF3, 0xDC, 0x26,
|
||||||
|
0x28, 0xD9, 0x33, 0x75, 0xF5, 0xFD, 0x55, 0xB1, 0x82, 0x34, 0x56, 0x03, 0xBB, 0x3C, 0xBA, 0x8A,
|
||||||
|
0x11, 0x77, 0x51, 0x28, 0xF8, 0xD9, 0x0A, 0xC2, 0x67, 0x51, 0xCC, 0xAB, 0x5F, 0x92, 0xAD, 0xCC,
|
||||||
|
0x51, 0x17, 0xE8, 0x4D, 0x8E, 0xDC, 0x30, 0x38, 0x62, 0x58, 0x9D, 0x37, 0x91, 0xF9, 0x20, 0x93,
|
||||||
|
0xC2, 0x90, 0x7A, 0xEA, 0xCE, 0x7B, 0x3E, 0xFB, 0x64, 0xCE, 0x21, 0x51, 0x32, 0xBE, 0x4F, 0x77,
|
||||||
|
0x7E, 0xE3, 0xB6, 0xA8, 0x46, 0x3D, 0x29, 0xC3, 0x69, 0x53, 0xDE, 0x48, 0x80, 0xE6, 0x13, 0x64,
|
||||||
|
0x10, 0x08, 0xAE, 0xA2, 0x24, 0xB2, 0x6D, 0xDD, 0xFD, 0x2D, 0x85, 0x69, 0x66, 0x21, 0x07, 0x09,
|
||||||
|
0x0A, 0x46, 0x9A, 0xB3, 0xDD, 0xC0, 0x45, 0x64, 0xCF, 0xDE, 0x6C, 0x58, 0xAE, 0xC8, 0x20, 0x1C,
|
||||||
|
0xDD, 0xF7, 0xBE, 0x5B, 0x40, 0x8D, 0x58, 0x1B, 0x7F, 0x01, 0xD2, 0xCC, 0xBB, 0xE3, 0xB4, 0x6B,
|
||||||
|
0x7E, 0x6A, 0xA2, 0xDD, 0x45, 0xFF, 0x59, 0x3A, 0x44, 0x0A, 0x35, 0x3E, 0xD5, 0xCD, 0xB4, 0xBC,
|
||||||
|
0xA8, 0xCE, 0xEA, 0x72, 0xBB, 0x84, 0x64, 0xFA, 0xAE, 0x12, 0x66, 0x8D, 0x47, 0x6F, 0x3C, 0xBF,
|
||||||
|
0x63, 0xE4, 0x9B, 0xD2, 0x9E, 0x5D, 0x2F, 0x54, 0x1B, 0x77, 0xC2, 0xAE, 0x70, 0x63, 0x4E, 0xF6,
|
||||||
|
0x8D, 0x0D, 0x0E, 0x74, 0x57, 0x13, 0x5B, 0xE7, 0x71, 0x16, 0x72, 0xF8, 0x5D, 0x7D, 0x53, 0xAF,
|
||||||
|
0x08, 0xCB, 0x40, 0x40, 0xCC, 0xE2, 0xB4, 0x4E, 0x6A, 0x46, 0xD2, 0x34, 0x84, 0xAF, 0x15, 0x01,
|
||||||
|
0x28, 0x04, 0xB0, 0xE1, 0x1D, 0x3A, 0x98, 0x95, 0xB4, 0x9F, 0xB8, 0x06, 0x48, 0xA0, 0x6E, 0xCE,
|
||||||
|
0x82, 0x3B, 0x3F, 0x6F, 0x82, 0xAB, 0x20, 0x35, 0x4B, 0x1D, 0x1A, 0x01, 0xF8, 0x27, 0x72, 0x27,
|
||||||
|
0xB1, 0x60, 0x15, 0x61, 0xDC, 0x3F, 0x93, 0xE7, 0x2B, 0x79, 0x3A, 0xBB, 0xBD, 0x25, 0x45, 0x34,
|
||||||
|
0xE1, 0x39, 0x88, 0xA0, 0x4B, 0x79, 0xCE, 0x51, 0xB7, 0xC9, 0x32, 0x2F, 0xC9, 0xBA, 0x1F, 0xA0,
|
||||||
|
0x7E, 0xC8, 0x1C, 0xE0, 0xF6, 0xD1, 0xC7, 0xBC, 0xC3, 0x11, 0x01, 0xCF, 0xC7, 0xAA, 0xE8, 0xA1,
|
||||||
|
0x49, 0x87, 0x90, 0x1A, 0x9A, 0xBD, 0x4F, 0xD4, 0xCB, 0xDE, 0xDA, 0xD0, 0x38, 0xDA, 0x0A, 0xD5,
|
||||||
|
0x2A, 0xC3, 0x39, 0x03, 0x67, 0x36, 0x91, 0xC6, 0x7C, 0x31, 0xF9, 0x8D, 0x4F, 0x2B, 0xB1, 0xE0,
|
||||||
|
0xB7, 0x59, 0x9E, 0xF7, 0x3A, 0xBB, 0xF5, 0x43, 0xFF, 0x19, 0xD5, 0xF2, 0x9C, 0x45, 0xD9, 0x27,
|
||||||
|
0x2C, 0x22, 0x97, 0xBF, 0x2A, 0xFC, 0xE6, 0x15, 0x71, 0xFC, 0x91, 0x0F, 0x25, 0x15, 0x94, 0x9B,
|
||||||
|
0x61, 0x93, 0xE5, 0xFA, 0xEB, 0x9C, 0xB6, 0xCE, 0x59, 0x64, 0xA8, 0xC2, 0xD1, 0xA8, 0xBA, 0x12,
|
||||||
|
0x5E, 0x07, 0xC1, 0xB6, 0x0C, 0x6A, 0x05, 0xE3, 0x65, 0x50, 0xD2, 0x10, 0x42, 0xA4, 0x03, 0xCB,
|
||||||
|
0x0E, 0x6E, 0xEC, 0xE0, 0x3B, 0xDB, 0x98, 0x16, 0xBE, 0xA0, 0x98, 0x4C, 0x64, 0xE9, 0x78, 0x32,
|
||||||
|
0x32, 0x95, 0x1F, 0x9F, 0xDF, 0x92, 0xD3, 0xE0, 0x2B, 0x34, 0xA0, 0xD3, 0x1E, 0xF2, 0x71, 0x89,
|
||||||
|
0x41, 0x74, 0x0A, 0x1B, 0x8C, 0x34, 0xA3, 0x4B, 0x20, 0x71, 0xBE, 0xC5, 0xD8, 0x32, 0x76, 0xC3,
|
||||||
|
0x8D, 0x9F, 0x35, 0xDF, 0x2E, 0x2F, 0x99, 0x9B, 0x47, 0x6F, 0x0B, 0xE6, 0x1D, 0xF1, 0xE3, 0x0F,
|
||||||
|
0x54, 0xDA, 0x4C, 0xE5, 0x91, 0xD8, 0xDA, 0x1E, 0xCF, 0x79, 0x62, 0xCE, 0x6F, 0x7E, 0x3E, 0xCD,
|
||||||
|
0x66, 0xB1, 0x18, 0x16, 0x05, 0x1D, 0x2C, 0xFD, 0xC5, 0xD2, 0x8F, 0x84, 0x99, 0x22, 0xFB, 0xF6,
|
||||||
|
0x57, 0xF3, 0x23, 0xF5, 0x23, 0x76, 0x32, 0xA6, 0x31, 0x35, 0xA8, 0x93, 0x02, 0xCD, 0xCC, 0x56,
|
||||||
|
0x62, 0x81, 0xF0, 0xAC, 0xB5, 0xEB, 0x75, 0x5A, 0x97, 0x36, 0x16, 0x6E, 0xCC, 0x73, 0xD2, 0x88,
|
||||||
|
0x92, 0x62, 0x96, 0xDE, 0xD0, 0x49, 0xB9, 0x81, 0x1B, 0x90, 0x50, 0x4C, 0x14, 0x56, 0xC6, 0x71,
|
||||||
|
0xBD, 0xC7, 0xC6, 0xE6, 0x0A, 0x14, 0x7A, 0x32, 0x06, 0xD0, 0xE1, 0x45, 0x9A, 0x7B, 0xF2, 0xC3,
|
||||||
|
0xFD, 0x53, 0xAA, 0xC9, 0x00, 0x0F, 0xA8, 0x62, 0xE2, 0xBF, 0x25, 0xBB, 0xF6, 0xD2, 0xBD, 0x35,
|
||||||
|
0x05, 0x69, 0x12, 0x71, 0x22, 0x02, 0x04, 0xB2, 0x7C, 0xCF, 0xCB, 0xB6, 0x2B, 0x9C, 0x76, 0xCD,
|
||||||
|
0xC0, 0x3E, 0x11, 0x53, 0xD3, 0xE3, 0x40, 0x16, 0x60, 0xBD, 0xAB, 0x38, 0xF0, 0xAD, 0x47, 0x25,
|
||||||
|
0x9C, 0x20, 0x38, 0xBA, 0x76, 0xCE, 0x46, 0xF7, 0xC5, 0xA1, 0xAF, 0x77, 0x60, 0x60, 0x75, 0x20,
|
||||||
|
0x4E, 0xFE, 0xCB, 0x85, 0xD8, 0x8D, 0xE8, 0x8A, 0xB0, 0xF9, 0xAA, 0x7A, 0x7E, 0xAA, 0xF9, 0x4C,
|
||||||
|
0x5C, 0xC2, 0x48, 0x19, 0x8C, 0x8A, 0xFB, 0x02, 0xE4, 0x6A, 0xC3, 0x01, 0xF9, 0xE1, 0xEB, 0xD6,
|
||||||
|
0x69, 0xF8, 0xD4, 0x90, 0xA0, 0xDE, 0x5C, 0xA6, 0x2D, 0x25, 0x09, 0x3F, 0x9F, 0xE6, 0x08, 0xC2,
|
||||||
|
0x32, 0x61, 0x4E, 0xB7, 0x5B, 0xE2, 0x77, 0xCE, 0xE3, 0xDF, 0x8F, 0x57, 0xE6, 0x72, 0xC3, 0x3A
|
||||||
|
};
|
||||||
|
|
||||||
|
uint32 F(uint32 x)
|
||||||
|
{
|
||||||
|
uint16 a;
|
||||||
|
uint16 b;
|
||||||
|
uint16 c;
|
||||||
|
uint16 d;
|
||||||
|
uint32 y;
|
||||||
|
|
||||||
|
d = x & 0x00FF;
|
||||||
|
x >>= 8;
|
||||||
|
c = x & 0x00FF;
|
||||||
|
x >>= 8;
|
||||||
|
b = x & 0x00FF;
|
||||||
|
x >>= 8;
|
||||||
|
a = x & 0x00FF;
|
||||||
|
//y = ((S[0][a] + S[1][b]) ^ S[2][c]) + S[3][d];
|
||||||
|
y = S[0][a] + S[1][b];
|
||||||
|
y = y ^ S[2][c];
|
||||||
|
y = y + S[3][d];
|
||||||
|
|
||||||
|
return y;
|
||||||
|
}
|
||||||
|
|
||||||
|
__declspec(dllexport) void blowfish_encipher(uint32 *xl, uint32 *xr, uint32 * P)
|
||||||
|
{
|
||||||
|
uint32 Xl;
|
||||||
|
uint32 Xr;
|
||||||
|
uint32 temp;
|
||||||
|
int16 i;
|
||||||
|
|
||||||
|
Xl = *xl;
|
||||||
|
Xr = *xr;
|
||||||
|
|
||||||
|
for (i = 0; i < N; ++i) {
|
||||||
|
Xl = Xl ^ P[i];
|
||||||
|
Xr = F(Xl) ^ Xr;
|
||||||
|
|
||||||
|
temp = Xl;
|
||||||
|
Xl = Xr;
|
||||||
|
Xr = temp;
|
||||||
|
}
|
||||||
|
|
||||||
|
temp = Xl;
|
||||||
|
Xl = Xr;
|
||||||
|
Xr = temp;
|
||||||
|
|
||||||
|
Xr = Xr ^ P[N];
|
||||||
|
Xl = Xl ^ P[N + 1];
|
||||||
|
|
||||||
|
*xl = Xl;
|
||||||
|
*xr = Xr;
|
||||||
|
}
|
||||||
|
|
||||||
|
__declspec(dllexport) void blowfish_decipher(uint32 *xl, uint32 *xr, uint32 * P)
|
||||||
|
{
|
||||||
|
uint32 Xl;
|
||||||
|
uint32 Xr;
|
||||||
|
uint32 temp;
|
||||||
|
int16 i;
|
||||||
|
|
||||||
|
Xl = *xl;
|
||||||
|
Xr = *xr;
|
||||||
|
|
||||||
|
for (i = N + 1; i > 1; --i) {
|
||||||
|
Xl = Xl ^ P[i];
|
||||||
|
Xr = F(Xl) ^ Xr;
|
||||||
|
|
||||||
|
/* Exchange Xl and Xr */
|
||||||
|
temp = Xl;
|
||||||
|
Xl = Xr;
|
||||||
|
Xr = temp;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Exchange Xl and Xr */
|
||||||
|
temp = Xl;
|
||||||
|
Xl = Xr;
|
||||||
|
Xr = temp;
|
||||||
|
|
||||||
|
Xr = Xr ^ P[1];
|
||||||
|
Xl = Xl ^ P[0];
|
||||||
|
|
||||||
|
*xl = Xl;
|
||||||
|
*xr = Xr;
|
||||||
|
}
|
||||||
|
|
||||||
|
__declspec(dllexport) int16 initializeBlowfish(char key[], int16 keybytes, uint32 * P)
|
||||||
|
{
|
||||||
|
int16 i;
|
||||||
|
int16 j;
|
||||||
|
int16 k;
|
||||||
|
uint32 data;
|
||||||
|
uint32 datal;
|
||||||
|
uint32 datar;
|
||||||
|
|
||||||
|
memcpy(P, &P_values, sizeof(P_values));
|
||||||
|
memcpy(&S, &S_values, sizeof(S_values));
|
||||||
|
|
||||||
|
j = 0;
|
||||||
|
for (i = 0; i < N + 2; ++i)
|
||||||
|
{
|
||||||
|
data = 0x00000000;
|
||||||
|
for (k = 0; k < 4; ++k)
|
||||||
|
{
|
||||||
|
data = (data << 8) | key[j];
|
||||||
|
j = j + 1;
|
||||||
|
if (j >= keybytes)
|
||||||
|
{
|
||||||
|
j = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
P[i] = P[i] ^ data;
|
||||||
|
}
|
||||||
|
|
||||||
|
datal = 0x00000000;
|
||||||
|
datar = 0x00000000;
|
||||||
|
|
||||||
|
for (i = 0; i < N + 2; i += 2)
|
||||||
|
{
|
||||||
|
blowfish_encipher(&datal, &datar, P);
|
||||||
|
|
||||||
|
P[i] = datal;
|
||||||
|
P[i + 1] = datar;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < 4; ++i)
|
||||||
|
{
|
||||||
|
for (j = 0; j < 256; j += 2)
|
||||||
|
{
|
||||||
|
blowfish_encipher(&datal, &datar, P);
|
||||||
|
S[i][j] = datal;
|
||||||
|
S[i][j + 1] = datar;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
18
Blowfish/blowfish.h
Normal file
18
Blowfish/blowfish.h
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
#include "cbasetypes.h"
|
||||||
|
|
||||||
|
#define MAXKEYBYTES 56 /* 448 bits */
|
||||||
|
#define little_endian 1 /* Eg: Intel */
|
||||||
|
//#define big_endian 1 /* Eg: Motorola */
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C"
|
||||||
|
{
|
||||||
|
#endif
|
||||||
|
int16 opensubkeyfile(void);
|
||||||
|
uint32 F(uint32 x);
|
||||||
|
__declspec(dllexport) void blowfish_encipher(uint32 *xl, uint32 *xr, uint32 * P);
|
||||||
|
__declspec(dllexport) void blowfish_decipher(uint32 *xl, uint32 *xr, uint32 * P);
|
||||||
|
__declspec(dllexport) short initializeBlowfish(char key[], int16 keybytes, uint32 * P);
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
333
Blowfish/cbasetypes.h
Normal file
333
Blowfish/cbasetypes.h
Normal file
|
@ -0,0 +1,333 @@
|
||||||
|
#ifndef _CBASETYPES_H_
|
||||||
|
#define _CBASETYPES_H_
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
/* +--------+-----------+--------+---------+
|
||||||
|
* | ILP32 | LP64 | ILP64 | (LL)P64 |
|
||||||
|
* +------------+--------+-----------+--------+---------+
|
||||||
|
* | ints | 32-bit | 32-bit | 64-bit | 32-bit |
|
||||||
|
* | longs | 32-bit | 64-bit | 64-bit | 32-bit |
|
||||||
|
* | long-longs | 64-bit | 64-bit | 64-bit | 64-bit |
|
||||||
|
* | pointers | 32-bit | 64-bit | 64-bit | 64-bit |
|
||||||
|
* +------------+--------+-----------+--------+---------+
|
||||||
|
* | where | -- | Tiger | Alpha | Windows |
|
||||||
|
* | used | | Unix | Cray | |
|
||||||
|
* | | | Sun & SGI | | |
|
||||||
|
* +------------+--------+-----------+--------+---------+
|
||||||
|
* Taken from http://developer.apple.com/macosx/64bit.html
|
||||||
|
*/
|
||||||
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
// basic include for all basics
|
||||||
|
// introduces types and global functions
|
||||||
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
// setting some defines on platforms
|
||||||
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
|
||||||
|
#if (defined(__WIN32__) || defined(__WIN32) || defined(_WIN32) || defined(_WIN64) || defined(_MSC_VER) || defined(__BORLANDC__)) && !defined(WIN32)
|
||||||
|
#define WIN32
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(__MINGW32__) && !defined(MINGW)
|
||||||
|
#define MINGW
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (defined(__CYGWIN__) || defined(__CYGWIN32__)) && !defined(CYGWIN)
|
||||||
|
#define CYGWIN
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(__64BIT__) && (defined(__x86_64__) || defined(_WIN64))
|
||||||
|
#define __64BIT__
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// debug mode
|
||||||
|
#if defined(_DEBUG) && !defined(DEBUG)
|
||||||
|
#define DEBUG
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// debug function name
|
||||||
|
#ifndef __NETBSD__
|
||||||
|
#if __STDC_VERSION__ < 199901L
|
||||||
|
# if __GNUC__ >= 2
|
||||||
|
# define __func__ __FUNCTION__
|
||||||
|
# else
|
||||||
|
# define __func__ ""
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// disable attributed stuff on non-GNU
|
||||||
|
#if !defined(__GNUC__) && !defined(MINGW)
|
||||||
|
# define __attribute__(x)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// define a break macro for debugging.
|
||||||
|
#if defined(DEBUG)
|
||||||
|
#if defined(_MSC_VER)
|
||||||
|
#define DSP_DEBUG_BREAK_IF(_CONDITION_) if (_CONDITION_) {__debugbreak();}
|
||||||
|
#else
|
||||||
|
#include "assert.h"
|
||||||
|
#define DSP_DEBUG_BREAK_IF(_CONDITION_) assert(!(_CONDITION_));
|
||||||
|
#endif
|
||||||
|
#else
|
||||||
|
#define DSP_DEBUG_BREAK_IF(_CONDITION_)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
// typedefs to compensate type size change from 32bit to 64bit
|
||||||
|
// MS implements LLP64 model, normal unix does LP64,
|
||||||
|
// only Silicon Graphics/Cray goes ILP64 so don't care (and don't support)
|
||||||
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#include <limits.h>
|
||||||
|
// ILP64 isn't supported, so always 32 bits?
|
||||||
|
#ifndef UINT_MAX
|
||||||
|
#define UINT_MAX 0xffffffff
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
// Integers with guaranteed _exact_ size.
|
||||||
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#define SIZEOF_LONG 4
|
||||||
|
#define SIZEOF_INT 4
|
||||||
|
#define HAVE_INT_8_16_32
|
||||||
|
|
||||||
|
typedef char int8;
|
||||||
|
typedef short int16;
|
||||||
|
typedef int int32;
|
||||||
|
|
||||||
|
typedef signed char sint8;
|
||||||
|
typedef signed short sint16;
|
||||||
|
typedef signed int sint32;
|
||||||
|
|
||||||
|
typedef unsigned char uint8;
|
||||||
|
typedef unsigned short uint16;
|
||||||
|
typedef unsigned int uint32;
|
||||||
|
|
||||||
|
#undef UINT8_MIN
|
||||||
|
#undef UINT16_MIN
|
||||||
|
#undef UINT32_MIN
|
||||||
|
//--
|
||||||
|
#define UINT8_MIN ((uint8) 0)
|
||||||
|
#define UINT16_MIN ((uint16)0)
|
||||||
|
#define UINT32_MIN ((uint32)0)
|
||||||
|
//***************
|
||||||
|
|
||||||
|
#undef SINT8_MIN
|
||||||
|
#undef SINT16_MIN
|
||||||
|
#undef SINT32_MIN
|
||||||
|
//---
|
||||||
|
#define SINT8_MIN ((sint8) 0x80)
|
||||||
|
#define SINT16_MIN ((sint16)0x8000)
|
||||||
|
#define SINT32_MIN ((sint32)0x80000000)
|
||||||
|
//****************
|
||||||
|
|
||||||
|
|
||||||
|
#undef SINT8_MAX
|
||||||
|
#undef SINT16_MAX
|
||||||
|
#undef SINT32_MAX
|
||||||
|
//--
|
||||||
|
#define SINT8_MAX ((sint8) 0x7F)
|
||||||
|
#define SINT16_MAX ((sint16)0x7FFF)
|
||||||
|
#define SINT32_MAX ((sint32)0x7FFFFFFF)
|
||||||
|
//****************
|
||||||
|
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
// Integers with guaranteed _minimum_ size.
|
||||||
|
// These could be larger than you expect,
|
||||||
|
// they are designed for speed.
|
||||||
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
typedef long int ppint;
|
||||||
|
typedef long int ppint8;
|
||||||
|
typedef long int ppint16;
|
||||||
|
typedef long int ppint32;
|
||||||
|
|
||||||
|
typedef unsigned long int ppuint;
|
||||||
|
typedef unsigned long int ppuint8;
|
||||||
|
typedef unsigned long int ppuint16;
|
||||||
|
typedef unsigned long int ppuint32;
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
// integer with exact processor width (and best speed)
|
||||||
|
//////////////////////////////
|
||||||
|
#include <stddef.h> // size_t
|
||||||
|
|
||||||
|
#if defined(WIN32) && !defined(MINGW) // does not have a signed size_t
|
||||||
|
//////////////////////////////
|
||||||
|
#if defined(_WIN64) // naive 64bit windows platform
|
||||||
|
typedef __int64 ssize_t;
|
||||||
|
#else
|
||||||
|
typedef int ssize_t;
|
||||||
|
#endif
|
||||||
|
//////////////////////////////
|
||||||
|
#endif
|
||||||
|
//////////////////////////////
|
||||||
|
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
// portable 64-bit integers
|
||||||
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
#if defined(_MSC_VER) || defined(__BORLANDC__)
|
||||||
|
typedef __int64 int64;
|
||||||
|
typedef signed __int64 sint64;
|
||||||
|
typedef unsigned __int64 uint64;
|
||||||
|
#define LLCONST(a) (a##i64)
|
||||||
|
#else
|
||||||
|
typedef long long int64;
|
||||||
|
typedef signed long long sint64;
|
||||||
|
typedef unsigned long long uint64;
|
||||||
|
#define LLCONST(a) (a##ll)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
// pointer sized integers
|
||||||
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
#undef UINTPTR_MIN
|
||||||
|
#undef UINTPTR_MAX
|
||||||
|
#undef INTPTR_MIN
|
||||||
|
#undef INTPTR_MAX
|
||||||
|
#ifdef __64BIT__
|
||||||
|
typedef uint64 uintptr;
|
||||||
|
typedef int64 intptr;
|
||||||
|
#define UINTPTR_MIN UINT64_MIN
|
||||||
|
#define UINTPTR_MAX UINT64_MAX
|
||||||
|
#define INTPTR_MIN INT64_MIN;
|
||||||
|
#define INTPTR_MAX INT64_MAX;
|
||||||
|
#else
|
||||||
|
typedef uint32 uintptr;
|
||||||
|
typedef int32 intptr;
|
||||||
|
#define UINTPTR_MIN UINT32_MIN
|
||||||
|
#define UINTPTR_MAX UINT32_MAX
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
// some redefine of function redefines for some Compilers
|
||||||
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
#if (defined(_MSC_VER) && _MSC_VER < 1900) || defined(__BORLANDC__)
|
||||||
|
#define strcasecmp stricmp
|
||||||
|
#define strncasecmp strnicmp
|
||||||
|
#define strncmpi strnicmp
|
||||||
|
#define snprintf _snprintf
|
||||||
|
#if defined(_MSC_VER) && _MSC_VER < 1400
|
||||||
|
#define vsnprintf _vsnprintf
|
||||||
|
#endif
|
||||||
|
#elif !defined(_MSC_VER)
|
||||||
|
#define strcmpi strcasecmp
|
||||||
|
#define stricmp strcasecmp
|
||||||
|
#define strncmpi strncasecmp
|
||||||
|
#define strnicmp strncasecmp
|
||||||
|
#endif
|
||||||
|
#if defined(_MSC_VER) && _MSC_VER > 1200
|
||||||
|
#define strtoull _strtoui64
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
// keyword replacement in windows for MSVC versions lower than 11 (2012)
|
||||||
|
#ifdef _WIN32
|
||||||
|
#if defined(_MSC_VER) && _MSC_VER < 1700
|
||||||
|
#define inline __inline
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
///////////////////////////////
|
||||||
|
// for those still not building c++
|
||||||
|
#ifndef __cplusplus
|
||||||
|
//////////////////////////////
|
||||||
|
|
||||||
|
// boolean types for C
|
||||||
|
typedef char bool;
|
||||||
|
#define false (1==0)
|
||||||
|
#define true (1==1)
|
||||||
|
|
||||||
|
//////////////////////////////
|
||||||
|
#endif // not cplusplus
|
||||||
|
//////////////////////////////
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
#include <algorithm>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define dsp_max(a,b) (((a) > (b)) ? (a) : (b))
|
||||||
|
#define dsp_min(a,b) (((a) < (b)) ? (a) : (b))
|
||||||
|
#define dsp_cap(a, min, max) ((a >= max) ? max : (a <= min) ? min : a) // caps values to min/max
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
// should not happen
|
||||||
|
#ifndef NULL
|
||||||
|
#define NULL (void *)0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
// number of bits in a byte
|
||||||
|
#ifndef NBBY
|
||||||
|
#define NBBY 8
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
// path separator
|
||||||
|
|
||||||
|
#if defined(WIN32)
|
||||||
|
#define PATHSEP '\\'
|
||||||
|
#elif defined(__APPLE__)
|
||||||
|
#define PATHSEP ':'
|
||||||
|
#else
|
||||||
|
#define PATHSEP '/'
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
// Assert
|
||||||
|
|
||||||
|
#if ! defined(Assert)
|
||||||
|
#if defined(RELEASE)
|
||||||
|
#define Assert(EX)
|
||||||
|
#else
|
||||||
|
#include <assert.h>
|
||||||
|
#if !defined(DEFCPP) && defined(WIN32) && !defined(MINGW)
|
||||||
|
#include <crtdbg.h>
|
||||||
|
#endif
|
||||||
|
#define Assert(EX) assert(EX)
|
||||||
|
#endif
|
||||||
|
#endif /* ! defined(Assert) */
|
||||||
|
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
// Has to be unsigned to avoid problems in some systems
|
||||||
|
// Problems arise when these functions expect an argument in the range [0,256[ and are fed a signed char.
|
||||||
|
#include <ctype.h>
|
||||||
|
#define ISALNUM(c) (isalnum((unsigned char)(c)))
|
||||||
|
#define ISALPHA(c) (isalpha((unsigned char)(c)))
|
||||||
|
#define ISCNTRL(c) (iscntrl((unsigned char)(c)))
|
||||||
|
#define ISDIGIT(c) (isdigit((unsigned char)(c)))
|
||||||
|
#define ISGRAPH(c) (isgraph((unsigned char)(c)))
|
||||||
|
#define ISLOWER(c) (islower((unsigned char)(c)))
|
||||||
|
#define ISPRINT(c) (isprint((unsigned char)(c)))
|
||||||
|
#define ISPUNCT(c) (ispunct((unsigned char)(c)))
|
||||||
|
#define ISSPACE(c) (isspace((unsigned char)(c)))
|
||||||
|
#define ISUPPER(c) (isupper((unsigned char)(c)))
|
||||||
|
#define ISXDIGIT(c) (isxdigit((unsigned char)(c)))
|
||||||
|
#define TOASCII(c) (toascii((unsigned char)(c)))
|
||||||
|
#define TOLOWER(c) (tolower((unsigned char)(c)))
|
||||||
|
#define TOUPPER(c) (toupper((unsigned char)(c)))
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
// length of a static array
|
||||||
|
#define ARRAYLENGTH(A) ( sizeof(A)/sizeof((A)[0]) )
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
// Make sure va_copy exists
|
||||||
|
#include <stdarg.h> // va_list, va_copy(?)
|
||||||
|
#if !defined(va_copy)
|
||||||
|
#if defined(__va_copy)
|
||||||
|
#define va_copy __va_copy
|
||||||
|
#else
|
||||||
|
#define va_copy(dst, src) ((void) memcpy(&(dst), &(src), sizeof(va_list)))
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* _CBASETYPES_H_ */
|
19
Blowfish/dllmain.cpp
Normal file
19
Blowfish/dllmain.cpp
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
// dllmain.cpp : Defines the entry point for the DLL application.
|
||||||
|
#include "stdafx.h"
|
||||||
|
|
||||||
|
BOOL APIENTRY DllMain( HMODULE hModule,
|
||||||
|
DWORD ul_reason_for_call,
|
||||||
|
LPVOID lpReserved
|
||||||
|
)
|
||||||
|
{
|
||||||
|
switch (ul_reason_for_call)
|
||||||
|
{
|
||||||
|
case DLL_PROCESS_ATTACH:
|
||||||
|
case DLL_THREAD_ATTACH:
|
||||||
|
case DLL_THREAD_DETACH:
|
||||||
|
case DLL_PROCESS_DETACH:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
8
Blowfish/stdafx.cpp
Normal file
8
Blowfish/stdafx.cpp
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
// stdafx.cpp : source file that includes just the standard includes
|
||||||
|
// Blowfish.pch will be the pre-compiled header
|
||||||
|
// stdafx.obj will contain the pre-compiled type information
|
||||||
|
|
||||||
|
#include "stdafx.h"
|
||||||
|
|
||||||
|
// TODO: reference any additional headers you need in STDAFX.H
|
||||||
|
// and not in this file
|
16
Blowfish/stdafx.h
Normal file
16
Blowfish/stdafx.h
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
// stdafx.h : include file for standard system include files,
|
||||||
|
// or project specific include files that are used frequently, but
|
||||||
|
// are changed infrequently
|
||||||
|
//
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "targetver.h"
|
||||||
|
|
||||||
|
#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
|
||||||
|
// Windows Header Files:
|
||||||
|
#include <windows.h>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// TODO: reference additional headers your program requires here
|
8
Blowfish/targetver.h
Normal file
8
Blowfish/targetver.h
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
// Including SDKDDKVer.h defines the highest available Windows platform.
|
||||||
|
|
||||||
|
// If you wish to build your application for a previous Windows platform, include WinSDKVer.h and
|
||||||
|
// set the _WIN32_WINNT macro to the platform you wish to support before including SDKDDKVer.h.
|
||||||
|
|
||||||
|
#include <SDKDDKVer.h>
|
44
FFXIVClassic_Lobby_Server.sln
Normal file
44
FFXIVClassic_Lobby_Server.sln
Normal file
|
@ -0,0 +1,44 @@
|
||||||
|
|
||||||
|
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||||
|
# Visual Studio Express 2013 for Windows Desktop
|
||||||
|
VisualStudioVersion = 12.0.31101.0
|
||||||
|
MinimumVisualStudioVersion = 10.0.40219.1
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FFXIVClassic_Lobby_Server", "FFXIVClassic_Lobby_Server\FFXIVClassic_Lobby_Server.csproj", "{703091E0-F69C-4177-8FAE-C258AC6A65AA}"
|
||||||
|
EndProject
|
||||||
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Blowfish", "Blowfish\Blowfish.vcxproj", "{2F4DF1AE-B33D-4058-A0FE-639DE9EA323A}"
|
||||||
|
EndProject
|
||||||
|
Global
|
||||||
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
|
Debug|Any CPU = Debug|Any CPU
|
||||||
|
Debug|Mixed Platforms = Debug|Mixed Platforms
|
||||||
|
Debug|Win32 = Debug|Win32
|
||||||
|
Release|Any CPU = Release|Any CPU
|
||||||
|
Release|Mixed Platforms = Release|Mixed Platforms
|
||||||
|
Release|Win32 = Release|Win32
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||||
|
{703091E0-F69C-4177-8FAE-C258AC6A65AA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{703091E0-F69C-4177-8FAE-C258AC6A65AA}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{703091E0-F69C-4177-8FAE-C258AC6A65AA}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
|
||||||
|
{703091E0-F69C-4177-8FAE-C258AC6A65AA}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
|
||||||
|
{703091E0-F69C-4177-8FAE-C258AC6A65AA}.Debug|Win32.ActiveCfg = Debug|Any CPU
|
||||||
|
{703091E0-F69C-4177-8FAE-C258AC6A65AA}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{703091E0-F69C-4177-8FAE-C258AC6A65AA}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{703091E0-F69C-4177-8FAE-C258AC6A65AA}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
|
||||||
|
{703091E0-F69C-4177-8FAE-C258AC6A65AA}.Release|Mixed Platforms.Build.0 = Release|Any CPU
|
||||||
|
{703091E0-F69C-4177-8FAE-C258AC6A65AA}.Release|Win32.ActiveCfg = Release|Any CPU
|
||||||
|
{2F4DF1AE-B33D-4058-A0FE-639DE9EA323A}.Debug|Any CPU.ActiveCfg = Debug|Win32
|
||||||
|
{2F4DF1AE-B33D-4058-A0FE-639DE9EA323A}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
|
||||||
|
{2F4DF1AE-B33D-4058-A0FE-639DE9EA323A}.Debug|Mixed Platforms.Build.0 = Debug|Win32
|
||||||
|
{2F4DF1AE-B33D-4058-A0FE-639DE9EA323A}.Debug|Win32.ActiveCfg = Debug|Win32
|
||||||
|
{2F4DF1AE-B33D-4058-A0FE-639DE9EA323A}.Debug|Win32.Build.0 = Debug|Win32
|
||||||
|
{2F4DF1AE-B33D-4058-A0FE-639DE9EA323A}.Release|Any CPU.ActiveCfg = Release|Win32
|
||||||
|
{2F4DF1AE-B33D-4058-A0FE-639DE9EA323A}.Release|Mixed Platforms.ActiveCfg = Release|Win32
|
||||||
|
{2F4DF1AE-B33D-4058-A0FE-639DE9EA323A}.Release|Mixed Platforms.Build.0 = Release|Win32
|
||||||
|
{2F4DF1AE-B33D-4058-A0FE-639DE9EA323A}.Release|Win32.ActiveCfg = Release|Win32
|
||||||
|
{2F4DF1AE-B33D-4058-A0FE-639DE9EA323A}.Release|Win32.Build.0 = Release|Win32
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
|
HideSolutionNode = FALSE
|
||||||
|
EndGlobalSection
|
||||||
|
EndGlobal
|
72
FFXIVClassic_Lobby_Server/ClientConnection.cs
Normal file
72
FFXIVClassic_Lobby_Server/ClientConnection.cs
Normal file
|
@ -0,0 +1,72 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using System.Net.Sockets;
|
||||||
|
using FFXIVClassic_Lobby_Server.packets;
|
||||||
|
using System.Diagnostics;
|
||||||
|
using FFXIVClassic_Lobby_Server.common;
|
||||||
|
using System.Collections.Concurrent;
|
||||||
|
using System.IO;
|
||||||
|
using Cyotek.Collections.Generic;
|
||||||
|
using System.Net;
|
||||||
|
|
||||||
|
namespace FFXIVClassic_Lobby_Server
|
||||||
|
{
|
||||||
|
class ClientConnection
|
||||||
|
{
|
||||||
|
//Connection stuff
|
||||||
|
public Blowfish blowfish;
|
||||||
|
public Socket socket;
|
||||||
|
public byte[] buffer = new byte[0xffff];
|
||||||
|
public CircularBuffer<byte> incomingStream = new CircularBuffer<byte>(1024);
|
||||||
|
public BlockingCollection<BasePacket> sendPacketQueue = new BlockingCollection<BasePacket>(100);
|
||||||
|
|
||||||
|
//Instance Stuff
|
||||||
|
public uint currentSession;
|
||||||
|
public uint currentAccount;
|
||||||
|
|
||||||
|
|
||||||
|
public void processIncoming(int bytesIn)
|
||||||
|
{
|
||||||
|
if (bytesIn == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
incomingStream.Put(buffer, 0, bytesIn);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void queuePacket(BasePacket packet)
|
||||||
|
{
|
||||||
|
sendPacketQueue.Add(packet);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void flushQueuedSendPackets()
|
||||||
|
{
|
||||||
|
while (sendPacketQueue.Count > 0)
|
||||||
|
{
|
||||||
|
BasePacket packet = sendPacketQueue.Take();
|
||||||
|
byte[] packetBytes = packet.getPacketBytes();
|
||||||
|
byte[] buffer = new byte[0xffff];
|
||||||
|
Array.Copy(packetBytes, buffer, packetBytes.Length);
|
||||||
|
try {
|
||||||
|
socket.Send(packetBytes);
|
||||||
|
}
|
||||||
|
catch(Exception e)
|
||||||
|
{ Debug.WriteLine("Weird case, socket was d/ced: {0}", e); }
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getAddress()
|
||||||
|
{
|
||||||
|
return String.Format("{0}:{1}", (socket.RemoteEndPoint as IPEndPoint).Address, (socket.RemoteEndPoint as IPEndPoint).Port);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void disconnect()
|
||||||
|
{
|
||||||
|
socket.Disconnect(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
50
FFXIVClassic_Lobby_Server/ConfigConstants.cs
Normal file
50
FFXIVClassic_Lobby_Server/ConfigConstants.cs
Normal file
|
@ -0,0 +1,50 @@
|
||||||
|
using FFXIVClassic_Lobby_Server.common;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.IO;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace FFXIVClassic_Lobby_Server
|
||||||
|
{
|
||||||
|
class ConfigConstants
|
||||||
|
{
|
||||||
|
public static bool OPTIONS_TIMESTAMP = false;
|
||||||
|
|
||||||
|
public static String DATABASE_HOST;
|
||||||
|
public static String DATABASE_PORT;
|
||||||
|
public static String DATABASE_NAME;
|
||||||
|
public static String DATABASE_USERNAME;
|
||||||
|
public static String DATABASE_PASSWORD;
|
||||||
|
|
||||||
|
public static bool load()
|
||||||
|
{
|
||||||
|
Console.Write("Loading config.ini file... ");
|
||||||
|
|
||||||
|
if (!File.Exists("./config.ini"))
|
||||||
|
{
|
||||||
|
Console.ForegroundColor = ConsoleColor.Red;
|
||||||
|
Console.WriteLine("[FILE NOT FOUND]");
|
||||||
|
Console.ForegroundColor = ConsoleColor.Gray;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
IniFile ini = new IniFile("./config.ini");
|
||||||
|
|
||||||
|
ConfigConstants.OPTIONS_TIMESTAMP = ini.IniReadValue("General", "showtimestamp").ToLower().Equals("true");
|
||||||
|
|
||||||
|
ConfigConstants.DATABASE_HOST = ini.IniReadValue("Database", "host");
|
||||||
|
ConfigConstants.DATABASE_PORT = ini.IniReadValue("Database", "port");
|
||||||
|
ConfigConstants.DATABASE_NAME = ini.IniReadValue("Database", "database");
|
||||||
|
ConfigConstants.DATABASE_USERNAME = ini.IniReadValue("Database", "username");
|
||||||
|
ConfigConstants.DATABASE_PASSWORD = ini.IniReadValue("Database", "password");
|
||||||
|
|
||||||
|
Console.ForegroundColor = ConsoleColor.Green;
|
||||||
|
Console.WriteLine("[OK]");
|
||||||
|
Console.ForegroundColor = ConsoleColor.Gray;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
238
FFXIVClassic_Lobby_Server/Database.cs
Normal file
238
FFXIVClassic_Lobby_Server/Database.cs
Normal file
|
@ -0,0 +1,238 @@
|
||||||
|
using FFXIVClassic_Lobby_Server.dataobjects;
|
||||||
|
using MySql.Data.MySqlClient;
|
||||||
|
using Newtonsoft.Json;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace FFXIVClassic_Lobby_Server
|
||||||
|
{
|
||||||
|
//charState: 0 - Reserved, 1 - Deleted, 2 - Inactive, 3 - Active
|
||||||
|
|
||||||
|
class Database
|
||||||
|
{
|
||||||
|
public static void reserveCharacter(int accountId, int slot, int serverId, String name)
|
||||||
|
{
|
||||||
|
using (MySqlConnection conn = new MySqlConnection(String.Format("Server={0}; Port={1}; Database={2}; UID={3}; Password={4}", ConfigConstants.DATABASE_HOST, ConfigConstants.DATABASE_PORT, ConfigConstants.DATABASE_NAME, ConfigConstants.DATABASE_USERNAME, ConfigConstants.DATABASE_PASSWORD)))
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
conn.Open();
|
||||||
|
MySqlCommand cmd = new MySqlCommand();
|
||||||
|
cmd.Connection = conn;
|
||||||
|
cmd.CommandText = "INSERT INTO ffxiv_characters2(accountId, slot, serverId, name, charState) VALUES(@accountId, @slot, @serverId, @name, 0)";
|
||||||
|
cmd.Prepare();
|
||||||
|
cmd.Parameters.AddWithValue("@accountId", accountId);
|
||||||
|
cmd.Parameters.AddWithValue("@slot", slot);
|
||||||
|
cmd.Parameters.AddWithValue("@serverId", serverId);
|
||||||
|
cmd.Parameters.AddWithValue("@name", name);
|
||||||
|
cmd.ExecuteNonQuery();
|
||||||
|
|
||||||
|
}
|
||||||
|
catch (MySqlException e)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
conn.Close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void makeCharacter(int accountId, String name, Character charaInfo)
|
||||||
|
{
|
||||||
|
using (MySqlConnection conn = new MySqlConnection(String.Format("Server={0}; Port={1}; Database={2}; UID={3}; Password={4}", ConfigConstants.DATABASE_HOST, ConfigConstants.DATABASE_PORT, ConfigConstants.DATABASE_NAME, ConfigConstants.DATABASE_USERNAME, ConfigConstants.DATABASE_PASSWORD)))
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
conn.Open();
|
||||||
|
MySqlCommand cmd = new MySqlCommand();
|
||||||
|
cmd.Connection = conn;
|
||||||
|
cmd.CommandText = "UPDATE ffxiv_characters2 SET data=@encodedInfo WHERE accountId=@accountId AND name=@name";
|
||||||
|
cmd.Prepare();
|
||||||
|
|
||||||
|
cmd.Parameters.AddWithValue("@accountId", accountId);
|
||||||
|
cmd.Parameters.AddWithValue("@name", name);
|
||||||
|
cmd.Parameters.AddWithValue("@encodedInfo", JsonConvert.SerializeObject(charaInfo));
|
||||||
|
cmd.ExecuteNonQuery();
|
||||||
|
|
||||||
|
}
|
||||||
|
catch (MySqlException e)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
conn.Close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void renameCharacter(uint characterId, String newName)
|
||||||
|
{
|
||||||
|
using (MySqlConnection conn = new MySqlConnection(String.Format("Server={0}; Port={1}; Database={2}; UID={3}; Password={4}", ConfigConstants.DATABASE_HOST, ConfigConstants.DATABASE_PORT, ConfigConstants.DATABASE_NAME, ConfigConstants.DATABASE_USERNAME, ConfigConstants.DATABASE_PASSWORD)))
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
conn.Open();
|
||||||
|
MySqlCommand cmd = new MySqlCommand();
|
||||||
|
cmd.Connection = conn;
|
||||||
|
cmd.CommandText = "UPDATE ffxiv_characters2 SET name=@name WHERE id=@cid";
|
||||||
|
cmd.Prepare();
|
||||||
|
cmd.Parameters.AddWithValue("@cid", characterId);
|
||||||
|
cmd.Parameters.AddWithValue("@name", newName);
|
||||||
|
cmd.ExecuteNonQuery();
|
||||||
|
|
||||||
|
}
|
||||||
|
catch (MySqlException e)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
conn.Close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void deleteCharacter(uint characterId, String name)
|
||||||
|
{
|
||||||
|
using (MySqlConnection conn = new MySqlConnection(String.Format("Server={0}; Port={1}; Database={2}; UID={3}; Password={4}", ConfigConstants.DATABASE_HOST, ConfigConstants.DATABASE_PORT, ConfigConstants.DATABASE_NAME, ConfigConstants.DATABASE_USERNAME, ConfigConstants.DATABASE_PASSWORD)))
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
conn.Open();
|
||||||
|
MySqlCommand cmd = new MySqlCommand();
|
||||||
|
cmd.Connection = conn;
|
||||||
|
cmd.CommandText = "UPDATE ffxiv_characters2 SET state=1 WHERE id=@cid AND name=@name";
|
||||||
|
cmd.Prepare();
|
||||||
|
cmd.Parameters.AddWithValue("@cid", characterId);
|
||||||
|
cmd.Parameters.AddWithValue("@name", name);
|
||||||
|
cmd.ExecuteNonQuery();
|
||||||
|
|
||||||
|
}
|
||||||
|
catch (MySqlException e)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
conn.Close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static List<World> getServers()
|
||||||
|
{
|
||||||
|
using (MySqlConnection conn = new MySqlConnection(String.Format("Server={0}; Port={1}; Database={2}; UID={3}; Password={4}", ConfigConstants.DATABASE_HOST, ConfigConstants.DATABASE_PORT, ConfigConstants.DATABASE_NAME, ConfigConstants.DATABASE_USERNAME, ConfigConstants.DATABASE_PASSWORD)))
|
||||||
|
{
|
||||||
|
List<World> worldList = new List<World>();
|
||||||
|
try
|
||||||
|
{
|
||||||
|
conn.Open();
|
||||||
|
MySqlCommand cmd = new MySqlCommand();
|
||||||
|
cmd.Connection = conn;
|
||||||
|
cmd.CommandText = "SELECT * FROM ffxiv_servers WHERE isActive=true";
|
||||||
|
cmd.Prepare();
|
||||||
|
MySqlDataReader Reader = cmd.ExecuteReader();
|
||||||
|
|
||||||
|
|
||||||
|
if (!Reader.HasRows) return worldList;
|
||||||
|
while (Reader.Read())
|
||||||
|
{
|
||||||
|
var id = Reader.GetUInt16("id");
|
||||||
|
var name = Reader.GetString("name");
|
||||||
|
var address = Reader.GetString("address");
|
||||||
|
var port = Reader.GetUInt16("port");
|
||||||
|
var unknown = Reader.GetUInt16("unknown");
|
||||||
|
var numChars = Reader.GetUInt32("numChars");
|
||||||
|
var maxChars = Reader.GetUInt32("maxChars");
|
||||||
|
var isActive = Reader.GetBoolean("isActive");
|
||||||
|
|
||||||
|
if (isActive)
|
||||||
|
{
|
||||||
|
World world = new World();
|
||||||
|
world.id = id;
|
||||||
|
world.name = name;
|
||||||
|
world.address = address;
|
||||||
|
world.port = port;
|
||||||
|
world.unknown = unknown;
|
||||||
|
uint result = ((numChars / maxChars) *0xFF) & 0xFF;
|
||||||
|
world.population = (ushort)result;
|
||||||
|
world.isActive = isActive;
|
||||||
|
worldList.Add(world);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
catch (MySqlException e)
|
||||||
|
{ }
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
conn.Close();
|
||||||
|
}
|
||||||
|
return worldList;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static World getServer(uint serverId)
|
||||||
|
{
|
||||||
|
using (MySqlConnection conn = new MySqlConnection(String.Format("Server={0}; Port={1}; Database={2}; UID={3}; Password={4}", ConfigConstants.DATABASE_HOST, ConfigConstants.DATABASE_PORT, ConfigConstants.DATABASE_NAME, ConfigConstants.DATABASE_USERNAME, ConfigConstants.DATABASE_PASSWORD)))
|
||||||
|
{
|
||||||
|
World world = null;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
conn.Open();
|
||||||
|
MySqlCommand cmd = new MySqlCommand();
|
||||||
|
cmd.Connection = conn;
|
||||||
|
cmd.CommandText = "SELECT * FROM ffxiv_servers WHERE id=%serverId";
|
||||||
|
cmd.Prepare();
|
||||||
|
cmd.Parameters.AddWithValue("@serverId", serverId);
|
||||||
|
|
||||||
|
MySqlDataReader Reader = cmd.ExecuteReader();
|
||||||
|
|
||||||
|
if (!Reader.HasRows) return world;
|
||||||
|
while (Reader.Read())
|
||||||
|
{
|
||||||
|
var id = Reader.GetUInt16("id");
|
||||||
|
var name = Reader.GetString("name");
|
||||||
|
var address = Reader.GetString("address");
|
||||||
|
var port = Reader.GetUInt16("port");
|
||||||
|
var unknown = Reader.GetUInt16("unknown");
|
||||||
|
var numChars = Reader.GetUInt32("numChars");
|
||||||
|
var maxChars = Reader.GetUInt32("maxChars");
|
||||||
|
var isActive = Reader.GetBoolean("isActive");
|
||||||
|
|
||||||
|
if (isActive)
|
||||||
|
{
|
||||||
|
world = new World();
|
||||||
|
world.id = id;
|
||||||
|
world.name = name;
|
||||||
|
world.address = address;
|
||||||
|
world.port = port;
|
||||||
|
world.unknown = unknown;
|
||||||
|
uint result = ((numChars / maxChars) * 0xFF) & 0xFF;
|
||||||
|
world.population = (ushort)result;
|
||||||
|
world.isActive = isActive;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
catch (MySqlException e)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
conn.Close();
|
||||||
|
}
|
||||||
|
|
||||||
|
return world;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
79
FFXIVClassic_Lobby_Server/FFXIVClassic_Lobby_Server.csproj
Normal file
79
FFXIVClassic_Lobby_Server/FFXIVClassic_Lobby_Server.csproj
Normal file
|
@ -0,0 +1,79 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
|
||||||
|
<PropertyGroup>
|
||||||
|
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||||
|
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||||
|
<ProjectGuid>{703091E0-F69C-4177-8FAE-C258AC6A65AA}</ProjectGuid>
|
||||||
|
<OutputType>Exe</OutputType>
|
||||||
|
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||||
|
<RootNamespace>FFXIVClassic_Lobby_Server</RootNamespace>
|
||||||
|
<AssemblyName>FFXIVClassic_Lobby_Server</AssemblyName>
|
||||||
|
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
|
||||||
|
<FileAlignment>512</FileAlignment>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||||
|
<PlatformTarget>AnyCPU</PlatformTarget>
|
||||||
|
<DebugSymbols>true</DebugSymbols>
|
||||||
|
<DebugType>full</DebugType>
|
||||||
|
<Optimize>false</Optimize>
|
||||||
|
<OutputPath>bin\Debug\</OutputPath>
|
||||||
|
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||||
|
<ErrorReport>prompt</ErrorReport>
|
||||||
|
<WarningLevel>4</WarningLevel>
|
||||||
|
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||||
|
<PlatformTarget>AnyCPU</PlatformTarget>
|
||||||
|
<DebugType>pdbonly</DebugType>
|
||||||
|
<Optimize>true</Optimize>
|
||||||
|
<OutputPath>bin\Release\</OutputPath>
|
||||||
|
<DefineConstants>TRACE</DefineConstants>
|
||||||
|
<ErrorReport>prompt</ErrorReport>
|
||||||
|
<WarningLevel>4</WarningLevel>
|
||||||
|
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
||||||
|
</PropertyGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Reference Include="Cyotek.Collections.Generic.CircularBuffer">
|
||||||
|
<HintPath>..\packages\Cyotek.CircularBuffer.1.0.0.0\lib\net20\Cyotek.Collections.Generic.CircularBuffer.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="MySql.Data">
|
||||||
|
<HintPath>..\packages\MySql.Data.6.9.7\lib\net45\MySql.Data.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System" />
|
||||||
|
<Reference Include="System.Core" />
|
||||||
|
<Reference Include="System.Xml.Linq" />
|
||||||
|
<Reference Include="System.Data.DataSetExtensions" />
|
||||||
|
<Reference Include="Microsoft.CSharp" />
|
||||||
|
<Reference Include="System.Data" />
|
||||||
|
<Reference Include="System.Xml" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Compile Include="Character.cs" />
|
||||||
|
<Compile Include="ClientConnection.cs" />
|
||||||
|
<Compile Include="common\Blowfish.cs" />
|
||||||
|
<Compile Include="common\IniFile.cs" />
|
||||||
|
<Compile Include="common\Utils.cs" />
|
||||||
|
<Compile Include="ConfigConstants.cs" />
|
||||||
|
<Compile Include="Database.cs" />
|
||||||
|
<Compile Include="PacketProcessor.cs" />
|
||||||
|
<Compile Include="packets\BasePacket.cs" />
|
||||||
|
<Compile Include="packets\CharacterRequestPacket.cs" />
|
||||||
|
<Compile Include="packets\HardCoded_Packets.cs" />
|
||||||
|
<Compile Include="packets\SubPacket.cs" />
|
||||||
|
<Compile Include="Program.cs" />
|
||||||
|
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||||
|
<Compile Include="Server.cs" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<None Include="packages.config" />
|
||||||
|
</ItemGroup>
|
||||||
|
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||||
|
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||||
|
Other similar extension points exist, see Microsoft.Common.targets.
|
||||||
|
<Target Name="BeforeBuild">
|
||||||
|
</Target>
|
||||||
|
<Target Name="AfterBuild">
|
||||||
|
</Target>
|
||||||
|
-->
|
||||||
|
</Project>
|
227
FFXIVClassic_Lobby_Server/PacketProcessor.cs
Normal file
227
FFXIVClassic_Lobby_Server/PacketProcessor.cs
Normal file
|
@ -0,0 +1,227 @@
|
||||||
|
using FFXIVClassic_Lobby_Server.common;
|
||||||
|
using FFXIVClassic_Lobby_Server.packets;
|
||||||
|
using MySql.Data.MySqlClient;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Diagnostics;
|
||||||
|
using System.IO;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace FFXIVClassic_Lobby_Server
|
||||||
|
{
|
||||||
|
class PacketProcessor
|
||||||
|
{
|
||||||
|
List<ClientConnection> mConnections;
|
||||||
|
Boolean isAlive = true;
|
||||||
|
|
||||||
|
public PacketProcessor(List<ClientConnection> connectionList)
|
||||||
|
{
|
||||||
|
mConnections = connectionList;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void update()
|
||||||
|
{
|
||||||
|
Console.WriteLine("Packet processing thread has started");
|
||||||
|
while (isAlive)
|
||||||
|
{
|
||||||
|
lock (mConnections)
|
||||||
|
{
|
||||||
|
foreach (ClientConnection client in mConnections)
|
||||||
|
{
|
||||||
|
//Receive packets
|
||||||
|
while (true)
|
||||||
|
{
|
||||||
|
if (client.incomingStream.Size < BasePacket.BASEPACKET_SIZE)
|
||||||
|
break;
|
||||||
|
|
||||||
|
try {
|
||||||
|
if (client.incomingStream.Size < BasePacket.BASEPACKET_SIZE)
|
||||||
|
break;
|
||||||
|
BasePacketHeader header = BasePacket.getHeader(client.incomingStream.Peek(BasePacket.BASEPACKET_SIZE));
|
||||||
|
|
||||||
|
if (client.incomingStream.Size < header.packetSize)
|
||||||
|
break;
|
||||||
|
|
||||||
|
BasePacket packet = new BasePacket(client.incomingStream.Get(header.packetSize));
|
||||||
|
processPacket(client, packet);
|
||||||
|
|
||||||
|
}
|
||||||
|
catch(OverflowException)
|
||||||
|
{ break; }
|
||||||
|
}
|
||||||
|
|
||||||
|
//Send packets
|
||||||
|
while (client.sendPacketQueue.Count != 0)
|
||||||
|
client.flushQueuedSendPackets();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void processPacket(ClientConnection client, BasePacket packet)
|
||||||
|
{
|
||||||
|
|
||||||
|
if ((packet.header.packetSize == 0x288) && (packet.data[0x34] == 'T')) //Test Ticket Data
|
||||||
|
{
|
||||||
|
//Crypto handshake
|
||||||
|
ProcessStartSession(client, packet);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
BasePacket.decryptPacket(client.blowfish, ref packet);
|
||||||
|
|
||||||
|
packet.debugPrintPacket();
|
||||||
|
|
||||||
|
List<SubPacket> subPackets = packet.getSubpackets();
|
||||||
|
foreach (SubPacket subpacket in subPackets)
|
||||||
|
{
|
||||||
|
|
||||||
|
switch (subpacket.header.opcode)
|
||||||
|
{
|
||||||
|
case 0x03:
|
||||||
|
ProcessGetCharacters(client, subpacket);
|
||||||
|
break;
|
||||||
|
case 0x04:
|
||||||
|
ProcessSelectCharacter(client, subpacket);
|
||||||
|
break;
|
||||||
|
case 0x05:
|
||||||
|
ProcessSessionAcknowledgement(client, subpacket);
|
||||||
|
break;
|
||||||
|
case 0x0B:
|
||||||
|
ProcessModifyCharacter(client, subpacket);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
Debug.WriteLine("Unknown command 0x{0:X} received.", subpacket.header.opcode);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ProcessStartSession(ClientConnection client, BasePacket packet)
|
||||||
|
{
|
||||||
|
UInt32 clientTime = BitConverter.ToUInt32(packet.data, 0x74);
|
||||||
|
|
||||||
|
//We assume clientTime is 0x50E0E812, but we need to generate a proper key later
|
||||||
|
byte[] blowfishKey = { 0xB4, 0xEE, 0x3F, 0x6C, 0x01, 0x6F, 0x5B, 0xD9, 0x71, 0x50, 0x0D, 0xB1, 0x85, 0xA2, 0xAB, 0x43};
|
||||||
|
client.blowfish = new Blowfish(blowfishKey);
|
||||||
|
|
||||||
|
Console.WriteLine("Received encryption key: 0x{0:X}", clientTime);
|
||||||
|
|
||||||
|
//Respond with acknowledgment
|
||||||
|
BasePacket outgoingPacket = new BasePacket(HardCoded_Packets.g_secureConnectionAcknowledgment);
|
||||||
|
BasePacket.encryptPacket(client.blowfish, outgoingPacket);
|
||||||
|
client.queuePacket(outgoingPacket);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ProcessSessionAcknowledgement(ClientConnection client, SubPacket packet)
|
||||||
|
{
|
||||||
|
//String sessionId = Utils.unsafeAsciiBytesToString(packet.data, 0x30);
|
||||||
|
//String clientVersion = Utils.unsafeAsciiBytesToString(packet.data, 0x70);
|
||||||
|
|
||||||
|
Debug.WriteLine("Got acknowledgment for secure session.");
|
||||||
|
// Debug.WriteLine("SESSION_ID: {0}", sessionId);
|
||||||
|
// Debug.WriteLine("CLIENT_VERSION: {0}", clientVersion);
|
||||||
|
|
||||||
|
//Check if got MYSQL Conn
|
||||||
|
|
||||||
|
|
||||||
|
//auto query = string_format("SELECT userId FROM ffxiv_sessions WHERE id = '%s' AND expiration > NOW()", sessionId.c_str());
|
||||||
|
|
||||||
|
//Console.WriteLine("UserId {0} logged in.", id);
|
||||||
|
BasePacket outgoingPacket = new BasePacket("./packets/loginAck.bin");
|
||||||
|
BasePacket.encryptPacket(client.blowfish, outgoingPacket);
|
||||||
|
client.queuePacket(outgoingPacket);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ProcessGetCharacters(ClientConnection client, SubPacket packet)
|
||||||
|
{
|
||||||
|
Console.WriteLine("{0} => Get characters", client.getAddress());
|
||||||
|
BasePacket outgoingPacket = new BasePacket("./packets/getCharsPacket.bin");
|
||||||
|
BasePacket.encryptPacket(client.blowfish, outgoingPacket);
|
||||||
|
client.queuePacket(outgoingPacket);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ProcessSelectCharacter(ClientConnection client, SubPacket packet)
|
||||||
|
{
|
||||||
|
uint characterId = 0;
|
||||||
|
using (BinaryReader binReader = new BinaryReader(new MemoryStream(packet.data)))
|
||||||
|
{
|
||||||
|
binReader.BaseStream.Seek(0x8, SeekOrigin.Begin);
|
||||||
|
characterId = binReader.ReadUInt32();
|
||||||
|
binReader.Close();
|
||||||
|
}
|
||||||
|
|
||||||
|
Console.WriteLine("{0} => Select character id {1}", client.getAddress(), characterId);
|
||||||
|
|
||||||
|
String serverIp = "141.117.162.99";
|
||||||
|
ushort port = 54992;
|
||||||
|
BitConverter.GetBytes(port);
|
||||||
|
BasePacket outgoingPacket = new BasePacket("./packets/selectChar.bin");
|
||||||
|
|
||||||
|
//Write Character ID and Server info
|
||||||
|
using (BinaryWriter binWriter = new BinaryWriter(new MemoryStream(outgoingPacket.data)))
|
||||||
|
{
|
||||||
|
binWriter.Seek(0x28, SeekOrigin.Begin);
|
||||||
|
binWriter.Write(characterId);
|
||||||
|
binWriter.Seek(0x78, SeekOrigin.Begin);
|
||||||
|
binWriter.Write(System.Text.Encoding.ASCII.GetBytes(serverIp));
|
||||||
|
binWriter.Seek(0x76, SeekOrigin.Begin);
|
||||||
|
binWriter.Write(port);
|
||||||
|
binWriter.Close();
|
||||||
|
}
|
||||||
|
|
||||||
|
BasePacket.encryptPacket(client.blowfish, outgoingPacket);
|
||||||
|
client.queuePacket(outgoingPacket);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ProcessModifyCharacter(ClientConnection client, SubPacket packet)
|
||||||
|
{
|
||||||
|
packet.debugPrintSubPacket();
|
||||||
|
|
||||||
|
CharacterRequestPacket.CharacterRequest charaReq = CharacterRequestPacket.toStruct(packet.data);
|
||||||
|
var slot = charaReq.slot;
|
||||||
|
var code = charaReq.command;
|
||||||
|
var name = charaReq.characterName;
|
||||||
|
var worldId = charaReq.worldId;
|
||||||
|
|
||||||
|
switch (code)
|
||||||
|
{
|
||||||
|
case 0x01://Reserve
|
||||||
|
//Database.reserveCharacter(0, slot, worldId, name);
|
||||||
|
|
||||||
|
//Confirm Reserve
|
||||||
|
BasePacket confirmReservePacket = new BasePacket("./packets/chara/confirmReserve.bin");
|
||||||
|
BasePacket.encryptPacket(client.blowfish, confirmReservePacket);
|
||||||
|
client.queuePacket(confirmReservePacket);
|
||||||
|
Console.WriteLine("Reserving character \"{0}\"", charaReq.characterName);
|
||||||
|
break;
|
||||||
|
case 0x02://Make
|
||||||
|
Character character = Character.EncodedToCharacter(charaReq.characterInfoEncoded);
|
||||||
|
Database.makeCharacter(0, name, character);
|
||||||
|
|
||||||
|
//Confirm
|
||||||
|
BasePacket confirmMakePacket = new BasePacket("./packets/chara/confirmMake.bin");
|
||||||
|
BasePacket.encryptPacket(client.blowfish, confirmMakePacket);
|
||||||
|
client.queuePacket(confirmMakePacket);
|
||||||
|
Console.WriteLine("Character created!");
|
||||||
|
break;
|
||||||
|
case 0x03://Rename
|
||||||
|
break;
|
||||||
|
case 0x04://Delete
|
||||||
|
Database.deleteCharacter(charaReq.characterId, charaReq.characterName);
|
||||||
|
|
||||||
|
//Confirm
|
||||||
|
BasePacket deleteConfirmPacket = new BasePacket("./packets/chara/confirmDelete.bin");
|
||||||
|
BasePacket.encryptPacket(client.blowfish, deleteConfirmPacket);
|
||||||
|
client.queuePacket(deleteConfirmPacket);
|
||||||
|
Console.WriteLine("Character deleted \"{0}\"", charaReq.characterName);
|
||||||
|
break;
|
||||||
|
case 0x06://Rename Retainer
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
73
FFXIVClassic_Lobby_Server/Program.cs
Normal file
73
FFXIVClassic_Lobby_Server/Program.cs
Normal file
|
@ -0,0 +1,73 @@
|
||||||
|
using FFXIVClassic_Lobby_Server.packets;
|
||||||
|
using System;
|
||||||
|
using System.Diagnostics;
|
||||||
|
using System.Threading;
|
||||||
|
using FFXIVClassic_Lobby_Server.common;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
using MySql.Data.MySqlClient;
|
||||||
|
using System.Reflection;
|
||||||
|
|
||||||
|
namespace FFXIVClassic_Lobby_Server
|
||||||
|
{
|
||||||
|
class Program
|
||||||
|
{
|
||||||
|
|
||||||
|
static void Main(string[] args)
|
||||||
|
{
|
||||||
|
#if DEBUG
|
||||||
|
TextWriterTraceListener myWriter = new TextWriterTraceListener(System.Console.Out);
|
||||||
|
Debug.Listeners.Add(myWriter);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
bool startServer = true;
|
||||||
|
|
||||||
|
Console.ForegroundColor = ConsoleColor.Yellow;
|
||||||
|
Console.WriteLine("--------FFXIV 1.0 Lobby Server--------");
|
||||||
|
Console.ForegroundColor = ConsoleColor.Gray;
|
||||||
|
|
||||||
|
|
||||||
|
Assembly assem = Assembly.GetExecutingAssembly();
|
||||||
|
Version vers = assem.GetName().Version;
|
||||||
|
Console.WriteLine("Version: " + vers.ToString());
|
||||||
|
|
||||||
|
//Load Config
|
||||||
|
if (!ConfigConstants.load())
|
||||||
|
startServer = false;
|
||||||
|
|
||||||
|
//Test DB Connection
|
||||||
|
Console.Write("Testing DB connection... ");
|
||||||
|
using (MySqlConnection conn = new MySqlConnection(String.Format("Server={0}; Port={1}; Database={2}; UID={3}; Password={4}", ConfigConstants.DATABASE_HOST, ConfigConstants.DATABASE_PORT, ConfigConstants.DATABASE_NAME, ConfigConstants.DATABASE_USERNAME, ConfigConstants.DATABASE_PASSWORD)))
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
conn.Open();
|
||||||
|
conn.Close();
|
||||||
|
Console.ForegroundColor = ConsoleColor.Green;
|
||||||
|
Console.WriteLine("[OK]");
|
||||||
|
Console.ForegroundColor = ConsoleColor.Gray;
|
||||||
|
}
|
||||||
|
catch (MySqlException e)
|
||||||
|
{
|
||||||
|
Console.ForegroundColor = ConsoleColor.Red;
|
||||||
|
Console.WriteLine("[FAILED]");
|
||||||
|
Console.ForegroundColor = ConsoleColor.Gray;
|
||||||
|
startServer = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//Start Server if A-OK
|
||||||
|
if (startServer)
|
||||||
|
{
|
||||||
|
Server server = new Server();
|
||||||
|
server.startServer();
|
||||||
|
|
||||||
|
while (true) Thread.Sleep(10000);
|
||||||
|
}
|
||||||
|
|
||||||
|
Console.WriteLine("Press any key to continue...");
|
||||||
|
Console.ReadKey();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
36
FFXIVClassic_Lobby_Server/Properties/AssemblyInfo.cs
Normal file
36
FFXIVClassic_Lobby_Server/Properties/AssemblyInfo.cs
Normal file
|
@ -0,0 +1,36 @@
|
||||||
|
using System.Reflection;
|
||||||
|
using System.Runtime.CompilerServices;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
|
// General Information about an assembly is controlled through the following
|
||||||
|
// set of attributes. Change these attribute values to modify the information
|
||||||
|
// associated with an assembly.
|
||||||
|
[assembly: AssemblyTitle("FFXIVClassic_Lobby_Server")]
|
||||||
|
[assembly: AssemblyDescription("")]
|
||||||
|
[assembly: AssemblyConfiguration("")]
|
||||||
|
[assembly: AssemblyCompany("")]
|
||||||
|
[assembly: AssemblyProduct("FFXIVClassic_Lobby_Server")]
|
||||||
|
[assembly: AssemblyCopyright("Copyright © 2015")]
|
||||||
|
[assembly: AssemblyTrademark("")]
|
||||||
|
[assembly: AssemblyCulture("")]
|
||||||
|
|
||||||
|
// Setting ComVisible to false makes the types in this assembly not visible
|
||||||
|
// to COM components. If you need to access a type in this assembly from
|
||||||
|
// COM, set the ComVisible attribute to true on that type.
|
||||||
|
[assembly: ComVisible(false)]
|
||||||
|
|
||||||
|
// The following GUID is for the ID of the typelib if this project is exposed to COM
|
||||||
|
[assembly: Guid("9b87f719-1e4d-4781-89c9-28d99f579253")]
|
||||||
|
|
||||||
|
// Version information for an assembly consists of the following four values:
|
||||||
|
//
|
||||||
|
// Major Version
|
||||||
|
// Minor Version
|
||||||
|
// Build Number
|
||||||
|
// Revision
|
||||||
|
//
|
||||||
|
// You can specify all the values or you can default the Build and Revision Numbers
|
||||||
|
// by using the '*' as shown below:
|
||||||
|
// [assembly: AssemblyVersion("1.0.*")]
|
||||||
|
[assembly: AssemblyVersion("1.0.*")]
|
||||||
|
[assembly: AssemblyFileVersion("1.0.0.0")]
|
152
FFXIVClassic_Lobby_Server/Server.cs
Normal file
152
FFXIVClassic_Lobby_Server/Server.cs
Normal file
|
@ -0,0 +1,152 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Net;
|
||||||
|
using System.Net.Sockets;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using System.Threading;
|
||||||
|
|
||||||
|
namespace FFXIVClassic_Lobby_Server
|
||||||
|
{
|
||||||
|
class Server
|
||||||
|
{
|
||||||
|
public const int FFXIV_LOBBY_PORT = 54994;
|
||||||
|
public const int BUFFER_SIZE = 0x400;
|
||||||
|
public const int BACKLOG = 100;
|
||||||
|
|
||||||
|
private Socket mServerSocket;
|
||||||
|
private List<ClientConnection> mConnectionList = new List<ClientConnection>();
|
||||||
|
private PacketProcessor mProcessor;
|
||||||
|
private Thread mProcessorThread;
|
||||||
|
|
||||||
|
#region Socket Handling
|
||||||
|
public bool startServer()
|
||||||
|
{
|
||||||
|
IPEndPoint serverEndPoint = new System.Net.IPEndPoint(IPAddress.Parse("141.117.161.40"), FFXIV_LOBBY_PORT);
|
||||||
|
|
||||||
|
try{
|
||||||
|
mServerSocket = new System.Net.Sockets.Socket(serverEndPoint.Address.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
throw new ApplicationException("Could not create socket, check to make sure not duplicating port", e);
|
||||||
|
}
|
||||||
|
try
|
||||||
|
{
|
||||||
|
mServerSocket.Bind(serverEndPoint);
|
||||||
|
mServerSocket.Listen(BACKLOG);
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
throw new ApplicationException("Error occured while binding socket, check inner exception", e);
|
||||||
|
}
|
||||||
|
try
|
||||||
|
{
|
||||||
|
mServerSocket.BeginAccept(new AsyncCallback(acceptCallback), mServerSocket);
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
throw new ApplicationException("Error occured starting listeners, check inner exception", e);
|
||||||
|
}
|
||||||
|
|
||||||
|
Console.Write("Server has started @ ");
|
||||||
|
Console.ForegroundColor = ConsoleColor.White;
|
||||||
|
Console.WriteLine("{0}:{1}", (mServerSocket.LocalEndPoint as IPEndPoint).Address, (mServerSocket.LocalEndPoint as IPEndPoint).Port);
|
||||||
|
Console.ForegroundColor = ConsoleColor.Gray;
|
||||||
|
|
||||||
|
mProcessor = new PacketProcessor(mConnectionList);
|
||||||
|
mProcessorThread = new Thread(new ThreadStart(mProcessor.update));
|
||||||
|
mProcessorThread.Start();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void acceptCallback(IAsyncResult result)
|
||||||
|
{
|
||||||
|
ClientConnection conn = null;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
System.Net.Sockets.Socket s = (System.Net.Sockets.Socket)result.AsyncState;
|
||||||
|
conn = new ClientConnection();
|
||||||
|
conn.socket = s.EndAccept(result);
|
||||||
|
conn.buffer = new byte[BUFFER_SIZE];
|
||||||
|
lock (mConnectionList)
|
||||||
|
{
|
||||||
|
mConnectionList.Add(conn);
|
||||||
|
}
|
||||||
|
//Queue recieving of data from the connection
|
||||||
|
conn.socket.BeginReceive(conn.buffer, 0, conn.buffer.Length, SocketFlags.None, new AsyncCallback(receiveCallback), conn);
|
||||||
|
//Queue the accept of the next incomming connection
|
||||||
|
mServerSocket.BeginAccept(new AsyncCallback(acceptCallback), mServerSocket);
|
||||||
|
Console.WriteLine("Connection {0}:{1} has connected.", (conn.socket.RemoteEndPoint as IPEndPoint).Address, (conn.socket.RemoteEndPoint as IPEndPoint).Port);
|
||||||
|
}
|
||||||
|
catch (SocketException)
|
||||||
|
{
|
||||||
|
if (conn.socket != null)
|
||||||
|
{
|
||||||
|
conn.socket.Close();
|
||||||
|
lock (mConnectionList)
|
||||||
|
{
|
||||||
|
mConnectionList.Remove(conn);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
mServerSocket.BeginAccept(new AsyncCallback(acceptCallback), mServerSocket);
|
||||||
|
}
|
||||||
|
catch (Exception)
|
||||||
|
{
|
||||||
|
if (conn.socket != null)
|
||||||
|
{
|
||||||
|
conn.socket.Close();
|
||||||
|
lock (mConnectionList)
|
||||||
|
{
|
||||||
|
mConnectionList.Remove(conn);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
mServerSocket.BeginAccept(new AsyncCallback(acceptCallback), mServerSocket);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void receiveCallback(IAsyncResult result)
|
||||||
|
{
|
||||||
|
ClientConnection conn = (ClientConnection)result.AsyncState;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
int bytesRead = conn.socket.EndReceive(result);
|
||||||
|
if (bytesRead > 0)
|
||||||
|
{
|
||||||
|
conn.processIncoming(bytesRead);
|
||||||
|
|
||||||
|
//Queue the next receive
|
||||||
|
conn.socket.BeginReceive(conn.buffer, 0, conn.buffer.Length, SocketFlags.None, new AsyncCallback(receiveCallback), conn);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Console.WriteLine("Connection {0}:{1} has disconnected.", (conn.socket.RemoteEndPoint as IPEndPoint).Address, (conn.socket.RemoteEndPoint as IPEndPoint).Port);
|
||||||
|
conn.socket.Close();
|
||||||
|
lock (mConnectionList)
|
||||||
|
{
|
||||||
|
mConnectionList.Remove(conn);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (SocketException)
|
||||||
|
{
|
||||||
|
if (conn.socket != null)
|
||||||
|
{
|
||||||
|
Console.WriteLine("Connection @ {0}:{1} has disconnected.", (conn.socket.RemoteEndPoint as IPEndPoint).Address, (conn.socket.RemoteEndPoint as IPEndPoint).Port);
|
||||||
|
conn.socket.Close();
|
||||||
|
lock (mConnectionList)
|
||||||
|
{
|
||||||
|
mConnectionList.Remove(conn);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Packet Handling
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
74
FFXIVClassic_Lobby_Server/common/Blowfish.cs
Normal file
74
FFXIVClassic_Lobby_Server/common/Blowfish.cs
Normal file
|
@ -0,0 +1,74 @@
|
||||||
|
using System;
|
||||||
|
using System.Text;
|
||||||
|
using System.IO;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
|
namespace FFXIVClassic_Lobby_Server.common
|
||||||
|
{
|
||||||
|
|
||||||
|
public class Blowfish
|
||||||
|
{
|
||||||
|
[DllImport("../../../Debug/Blowfish.dll", CallingConvention = CallingConvention.Cdecl)]
|
||||||
|
private static extern short initializeBlowfish(byte[] key, short keySize, uint[] P, uint[,] S);
|
||||||
|
[DllImport("../../../Debug/Blowfish.dll", CallingConvention = CallingConvention.Cdecl)]
|
||||||
|
private static extern void blowfish_encipher(ref int xl, ref int xr, uint[] P);
|
||||||
|
[DllImport("../../../Debug/Blowfish.dll", CallingConvention = CallingConvention.Cdecl)]
|
||||||
|
private static extern void blowfish_decipher(ref int xl, ref int xr, uint[] P);
|
||||||
|
|
||||||
|
private uint[] P = new uint[16+2];
|
||||||
|
private uint[,] S = new uint[4,256];
|
||||||
|
|
||||||
|
public Blowfish(byte[] key)
|
||||||
|
{
|
||||||
|
InitBlowfish(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
private int InitBlowfish(byte[] key)
|
||||||
|
{
|
||||||
|
return initializeBlowfish(key, (short)key.Length, P, S);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Encipher(byte[] data, int offset, int length)
|
||||||
|
{
|
||||||
|
if ((length - offset) % 8 != 0)
|
||||||
|
throw new ArgumentException("Needs to be a multiple of 8");
|
||||||
|
|
||||||
|
for (int i = offset; i < offset+length; i+=8)
|
||||||
|
{
|
||||||
|
int xl = (data[i + 0]) | (data[i + 1] << 8) | (data[i + 2] << 16) | (data[i + 3] << 24);
|
||||||
|
int xr = (data[i + 4]) | (data[i + 5] << 8) | (data[i + 6] << 16) | (data[i + 7] << 24);
|
||||||
|
blowfish_encipher(ref xl, ref xr, P);
|
||||||
|
data[i + 0] = (byte)(xl >> 0);
|
||||||
|
data[i + 1] = (byte)(xl >> 8);
|
||||||
|
data[i + 2] = (byte)(xl >> 16);
|
||||||
|
data[i + 3] = (byte)(xl >> 24);
|
||||||
|
data[i + 4] = (byte)(xr >> 0);
|
||||||
|
data[i + 5] = (byte)(xr >> 8);
|
||||||
|
data[i + 6] = (byte)(xr >> 16);
|
||||||
|
data[i + 7] = (byte)(xr >> 24);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Decipher(byte[] data, int offset, int length)
|
||||||
|
{
|
||||||
|
if ((length - offset) % 8 != 0)
|
||||||
|
throw new ArgumentException("Needs to be a multiple of 8");
|
||||||
|
|
||||||
|
for (int i = offset; i < offset + length; i += 8)
|
||||||
|
{
|
||||||
|
int xl = (data[i + 0]) | (data[i + 1] << 8) | (data[i + 2] << 16) | (data[i + 3] << 24);
|
||||||
|
int xr = (data[i + 4]) | (data[i + 5] << 8) | (data[i + 6] << 16) | (data[i + 7] << 24);
|
||||||
|
blowfish_decipher(ref xl, ref xr, P);
|
||||||
|
data[i + 0] = (byte)(xl >> 0);
|
||||||
|
data[i + 1] = (byte)(xl >> 8);
|
||||||
|
data[i + 2] = (byte)(xl >> 16);
|
||||||
|
data[i + 3] = (byte)(xl >> 24);
|
||||||
|
data[i + 4] = (byte)(xr >> 0);
|
||||||
|
data[i + 5] = (byte)(xr >> 8);
|
||||||
|
data[i + 6] = (byte)(xr >> 16);
|
||||||
|
data[i + 7] = (byte)(xr >> 24);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
63
FFXIVClassic_Lobby_Server/common/IniFile.cs
Normal file
63
FFXIVClassic_Lobby_Server/common/IniFile.cs
Normal file
|
@ -0,0 +1,63 @@
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
using System.Text;
|
||||||
|
|
||||||
|
namespace FFXIVClassic_Lobby_Server.common
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Create a New INI file to store or load data
|
||||||
|
/// </summary>
|
||||||
|
public class IniFile
|
||||||
|
{
|
||||||
|
public string path;
|
||||||
|
|
||||||
|
[DllImport("kernel32")]
|
||||||
|
private static extern long WritePrivateProfileString(string section,
|
||||||
|
string key, string val, string filePath);
|
||||||
|
[DllImport("kernel32")]
|
||||||
|
private static extern int GetPrivateProfileString(string section,
|
||||||
|
string key, string def, StringBuilder retVal,
|
||||||
|
int size, string filePath);
|
||||||
|
[DllImport("kernel32")]
|
||||||
|
private static extern int GetPrivateProfileSectionNames(StringBuilder retVal,
|
||||||
|
int size, string filePath);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// INIFile Constructor.
|
||||||
|
/// </summary>
|
||||||
|
/// <PARAM name="INIPath"></PARAM>
|
||||||
|
public IniFile(string INIPath)
|
||||||
|
{
|
||||||
|
path = INIPath;
|
||||||
|
}
|
||||||
|
/// <summary>
|
||||||
|
/// Write Data to the INI File
|
||||||
|
/// </summary>
|
||||||
|
/// <PARAM name="Section"></PARAM>
|
||||||
|
/// Section name
|
||||||
|
/// <PARAM name="Key"></PARAM>
|
||||||
|
/// Key Name
|
||||||
|
/// <PARAM name="Value"></PARAM>
|
||||||
|
/// Value Name
|
||||||
|
public void IniWriteValue(string Section, string Key, string Value)
|
||||||
|
{
|
||||||
|
WritePrivateProfileString(Section, Key, Value, this.path);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Read Data Value From the Ini File
|
||||||
|
/// </summary>
|
||||||
|
/// <PARAM name="Section"></PARAM>
|
||||||
|
/// <PARAM name="Key"></PARAM>
|
||||||
|
/// <PARAM name="Path"></PARAM>
|
||||||
|
/// <returns></returns>
|
||||||
|
public string IniReadValue(string Section, string Key)
|
||||||
|
{
|
||||||
|
StringBuilder temp = new StringBuilder(255);
|
||||||
|
int i = GetPrivateProfileString(Section, Key, "", temp,
|
||||||
|
255, this.path);
|
||||||
|
return temp.ToString();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
77
FFXIVClassic_Lobby_Server/common/Utils.cs
Normal file
77
FFXIVClassic_Lobby_Server/common/Utils.cs
Normal file
|
@ -0,0 +1,77 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace FFXIVClassic_Lobby_Server.common
|
||||||
|
{
|
||||||
|
static class Utils
|
||||||
|
{
|
||||||
|
private static readonly uint[] _lookup32 = CreateLookup32();
|
||||||
|
|
||||||
|
private static uint[] CreateLookup32()
|
||||||
|
{
|
||||||
|
var result = new uint[256];
|
||||||
|
for (int i = 0; i < 256; i++)
|
||||||
|
{
|
||||||
|
string s = i.ToString("X2");
|
||||||
|
result[i] = ((uint)s[0]) + ((uint)s[1] << 16);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static string ByteArrayToHex(byte[] bytes)
|
||||||
|
{
|
||||||
|
var lookup32 = _lookup32;
|
||||||
|
var result = new char[(bytes.Length * 3) + ((bytes.Length/16) < 1 ? 1 : (bytes.Length/16)*3) + bytes.Length+60];
|
||||||
|
int numNewLines = 0;
|
||||||
|
for (int i = 0; i < bytes.Length; i++)
|
||||||
|
{
|
||||||
|
var val = lookup32[bytes[i]];
|
||||||
|
result[(3 * i) + (17 * numNewLines) + 0] = (char)val;
|
||||||
|
result[(3 * i) + (17 * numNewLines) + 1] = (char)(val >> 16);
|
||||||
|
result[(3 * i) + (17 * numNewLines) + 2] = ' ';
|
||||||
|
|
||||||
|
result[(numNewLines * (3*16+17)) + (3 * 16) + (i % 16)] = (char)bytes[i] >= 32 && (char)bytes[i] <= 126 ? (char)bytes[i] : '.';
|
||||||
|
|
||||||
|
if (i != bytes.Length - 1 && bytes.Length > 16 && i != 0 && (i+1) % 16 == 0)
|
||||||
|
{
|
||||||
|
result[(numNewLines * (3*16+17)) + (3 * 16) + (16)] = '\n';
|
||||||
|
numNewLines++;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
return new string(result);
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
/// <summary>
|
||||||
|
/// Grabs an instance of a class directly from the MySqlDataReader instead of manually building from GetString() etc.
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="T">Type of object to return</typeparam>
|
||||||
|
/// <param name="reader">Reader instance</param>
|
||||||
|
/// <returns>new T</returns>
|
||||||
|
public static T GetSQLObject<T>(this MySql.Data.MySqlClient.MySqlDataReader reader)
|
||||||
|
{
|
||||||
|
var obj = Activator.CreateInstance(typeof(T));
|
||||||
|
var fields = obj.GetType().GetFields();
|
||||||
|
|
||||||
|
foreach (var field in obj.GetType().GetFields())
|
||||||
|
{
|
||||||
|
var attrs = field.GetCustomAttributes(typeof(System.Runtime.Serialization.DataMemberAttribute), true) as System.Runtime.Serialization.DataMemberAttribute[];
|
||||||
|
|
||||||
|
if (attrs.Length == 0)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
var fieldID = attrs[0].Name;
|
||||||
|
var fieldType = field.FieldType;
|
||||||
|
|
||||||
|
field.SetValue(obj, reader.GetValue(reader.GetOrdinal(fieldID)));
|
||||||
|
}
|
||||||
|
|
||||||
|
return (T)obj;
|
||||||
|
}*/
|
||||||
|
}
|
||||||
|
}
|
83
FFXIVClassic_Lobby_Server/dataobjects/Character.cs
Normal file
83
FFXIVClassic_Lobby_Server/dataobjects/Character.cs
Normal file
|
@ -0,0 +1,83 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using FFXIVClassic_Lobby_Server.common;
|
||||||
|
|
||||||
|
namespace FFXIVClassic_Lobby_Server
|
||||||
|
{
|
||||||
|
class Character
|
||||||
|
{
|
||||||
|
public string name = "";
|
||||||
|
|
||||||
|
public uint id = 0;
|
||||||
|
|
||||||
|
public uint tribe = 0;
|
||||||
|
public uint size = 0;
|
||||||
|
public uint voice = 0;
|
||||||
|
public uint skinColor = 0;
|
||||||
|
|
||||||
|
public uint hairStyle = 0;
|
||||||
|
public uint hairColor = 0;
|
||||||
|
public uint eyeColor = 0;
|
||||||
|
|
||||||
|
public uint faceType = 0;
|
||||||
|
public uint faceBrow = 0;
|
||||||
|
public uint faceEye = 0;
|
||||||
|
public uint faceIris = 0;
|
||||||
|
public uint faceNose = 0;
|
||||||
|
public uint faceMouth = 0;
|
||||||
|
public uint faceJaw = 0;
|
||||||
|
public uint faceCheek = 0;
|
||||||
|
public uint faceOption1 = 0;
|
||||||
|
public uint faceOption2 = 0;
|
||||||
|
|
||||||
|
public uint guardian = 0;
|
||||||
|
public uint birthMonth = 0;
|
||||||
|
public uint birthDay = 0;
|
||||||
|
public uint allegiance = 0;
|
||||||
|
|
||||||
|
public uint weapon1 = 0;
|
||||||
|
public uint weapon2 = 0;
|
||||||
|
|
||||||
|
public uint headGear = 0;
|
||||||
|
public uint bodyGear = 0;
|
||||||
|
public uint legsGear = 0;
|
||||||
|
public uint handsGear = 0;
|
||||||
|
public uint feetGear = 0;
|
||||||
|
public uint waistGear = 0;
|
||||||
|
public uint rightEarGear = 0;
|
||||||
|
public uint leftEarGear = 0;
|
||||||
|
public uint rightFingerGear = 0;
|
||||||
|
public uint leftFingerGear = 0;
|
||||||
|
|
||||||
|
public byte[] toBytes()
|
||||||
|
{
|
||||||
|
byte[] bytes = new byte[0x120];
|
||||||
|
return bytes;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String characterToEncoded(Character chara)
|
||||||
|
{
|
||||||
|
String charaInfo = System.Convert.ToBase64String(chara.toBytes());
|
||||||
|
charaInfo.Replace("+", "-");
|
||||||
|
charaInfo.Replace("/", "_");
|
||||||
|
return charaInfo;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Character EncodedToCharacter(String charaInfo)
|
||||||
|
{
|
||||||
|
charaInfo.Replace("+", "-");
|
||||||
|
charaInfo.Replace("/", "_");
|
||||||
|
byte[] data = System.Convert.FromBase64String(charaInfo);
|
||||||
|
|
||||||
|
Console.WriteLine("------------Base64 printout------------------");
|
||||||
|
Console.WriteLine(Utils.ByteArrayToHex(data));
|
||||||
|
Console.WriteLine("------------Base64 printout------------------");
|
||||||
|
|
||||||
|
Character chara = new Character();
|
||||||
|
return chara;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
19
FFXIVClassic_Lobby_Server/dataobjects/World.cs
Normal file
19
FFXIVClassic_Lobby_Server/dataobjects/World.cs
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace FFXIVClassic_Lobby_Server.dataobjects
|
||||||
|
{
|
||||||
|
class World
|
||||||
|
{
|
||||||
|
public ushort id;
|
||||||
|
public string address;
|
||||||
|
public ushort port;
|
||||||
|
public ushort unknown;
|
||||||
|
public ushort population;
|
||||||
|
public string name;
|
||||||
|
public bool isActive;
|
||||||
|
}
|
||||||
|
}
|
6
FFXIVClassic_Lobby_Server/packages.config
Normal file
6
FFXIVClassic_Lobby_Server/packages.config
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<packages>
|
||||||
|
<package id="Cyotek.CircularBuffer" version="1.0.0.0" targetFramework="net45" />
|
||||||
|
<package id="MySql.Data" version="6.9.7" targetFramework="net45" />
|
||||||
|
<package id="Newtonsoft.Json" version="7.0.1" targetFramework="net45" />
|
||||||
|
</packages>
|
243
FFXIVClassic_Lobby_Server/packets/BasePacket.cs
Normal file
243
FFXIVClassic_Lobby_Server/packets/BasePacket.cs
Normal file
|
@ -0,0 +1,243 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
using System.Diagnostics;
|
||||||
|
using FFXIVClassic_Lobby_Server.common;
|
||||||
|
using System.IO;
|
||||||
|
|
||||||
|
namespace FFXIVClassic_Lobby_Server.packets
|
||||||
|
{
|
||||||
|
[StructLayout(LayoutKind.Sequential)]
|
||||||
|
public struct BasePacketHeader
|
||||||
|
{
|
||||||
|
public byte isAuthenticated;
|
||||||
|
public byte isEncrypted;
|
||||||
|
public ushort reserved;
|
||||||
|
public ushort packetSize;
|
||||||
|
public ushort numSubpackets;
|
||||||
|
public uint unknown1; //Id?
|
||||||
|
public uint unknown2; //Usually 0x13B
|
||||||
|
}
|
||||||
|
|
||||||
|
public class BasePacket{
|
||||||
|
public const int BASEPACKET_SIZE = 0x10;
|
||||||
|
|
||||||
|
public BasePacketHeader header;
|
||||||
|
public byte[] data;
|
||||||
|
|
||||||
|
public unsafe BasePacket(String path)
|
||||||
|
{
|
||||||
|
byte[] bytes = File.ReadAllBytes(path);
|
||||||
|
|
||||||
|
if (bytes.Length < BASEPACKET_SIZE)
|
||||||
|
throw new OverflowException("Packet Error: Packet was too small");
|
||||||
|
|
||||||
|
fixed (byte* pdata = &bytes[0])
|
||||||
|
{
|
||||||
|
header = (BasePacketHeader)Marshal.PtrToStructure(new IntPtr(pdata), typeof(BasePacketHeader));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (bytes.Length < header.packetSize)
|
||||||
|
throw new OverflowException("Packet Error: Packet size didn't equal given size");
|
||||||
|
|
||||||
|
int packetSize = header.packetSize;
|
||||||
|
|
||||||
|
data = new byte[packetSize - BASEPACKET_SIZE];
|
||||||
|
Array.Copy(bytes, BASEPACKET_SIZE, data, 0, packetSize - BASEPACKET_SIZE);
|
||||||
|
}
|
||||||
|
|
||||||
|
public unsafe BasePacket(byte[] bytes)
|
||||||
|
{
|
||||||
|
if (bytes.Length < BASEPACKET_SIZE)
|
||||||
|
throw new OverflowException("Packet Error: Packet was too small");
|
||||||
|
|
||||||
|
fixed (byte* pdata = &bytes[0])
|
||||||
|
{
|
||||||
|
header = (BasePacketHeader)Marshal.PtrToStructure(new IntPtr(pdata), typeof(BasePacketHeader));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (bytes.Length < header.packetSize)
|
||||||
|
throw new OverflowException("Packet Error: Packet size didn't equal given size");
|
||||||
|
|
||||||
|
int packetSize = header.packetSize;
|
||||||
|
|
||||||
|
data = new byte[packetSize - BASEPACKET_SIZE];
|
||||||
|
Array.Copy(bytes, BASEPACKET_SIZE, data, 0, packetSize - BASEPACKET_SIZE);
|
||||||
|
}
|
||||||
|
|
||||||
|
public unsafe BasePacket(byte[] bytes, ref int offset)
|
||||||
|
{
|
||||||
|
if (bytes.Length < offset + BASEPACKET_SIZE)
|
||||||
|
throw new OverflowException("Packet Error: Packet was too small");
|
||||||
|
|
||||||
|
fixed (byte* pdata = &bytes[offset])
|
||||||
|
{
|
||||||
|
header = (BasePacketHeader)Marshal.PtrToStructure(new IntPtr(pdata), typeof(BasePacketHeader));
|
||||||
|
}
|
||||||
|
|
||||||
|
int packetSize = header.packetSize;
|
||||||
|
|
||||||
|
if (bytes.Length < offset + header.packetSize)
|
||||||
|
throw new OverflowException("Packet Error: Packet size didn't equal given size");
|
||||||
|
|
||||||
|
data = new byte[packetSize - BASEPACKET_SIZE];
|
||||||
|
Array.Copy(bytes, offset + BASEPACKET_SIZE, data, 0, packetSize - BASEPACKET_SIZE);
|
||||||
|
|
||||||
|
offset += packetSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
public BasePacket(BasePacketHeader header, byte[] data)
|
||||||
|
{
|
||||||
|
this.header = header;
|
||||||
|
this.data = data;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<SubPacket> getSubpackets()
|
||||||
|
{
|
||||||
|
List<SubPacket> subpackets = new List<SubPacket>(header.numSubpackets);
|
||||||
|
|
||||||
|
int offset = 0;
|
||||||
|
|
||||||
|
while (offset < data.Length)
|
||||||
|
subpackets.Add(new SubPacket(data, ref offset));
|
||||||
|
|
||||||
|
return subpackets;
|
||||||
|
}
|
||||||
|
|
||||||
|
public unsafe static BasePacketHeader getHeader(byte[] bytes)
|
||||||
|
{
|
||||||
|
BasePacketHeader header;
|
||||||
|
if (bytes.Length < BASEPACKET_SIZE)
|
||||||
|
throw new OverflowException("Packet Error: Packet was too small");
|
||||||
|
|
||||||
|
fixed (byte* pdata = &bytes[0])
|
||||||
|
{
|
||||||
|
header = (BasePacketHeader)Marshal.PtrToStructure(new IntPtr(pdata), typeof(BasePacketHeader));
|
||||||
|
}
|
||||||
|
|
||||||
|
return header;
|
||||||
|
}
|
||||||
|
|
||||||
|
public byte[] getHeaderBytes()
|
||||||
|
{
|
||||||
|
int size = Marshal.SizeOf(header);
|
||||||
|
byte[] arr = new byte[size];
|
||||||
|
|
||||||
|
IntPtr ptr = Marshal.AllocHGlobal(size);
|
||||||
|
Marshal.StructureToPtr(header, ptr, true);
|
||||||
|
Marshal.Copy(ptr, arr, 0, size);
|
||||||
|
Marshal.FreeHGlobal(ptr);
|
||||||
|
return arr;
|
||||||
|
}
|
||||||
|
|
||||||
|
public byte[] getPacketBytes()
|
||||||
|
{
|
||||||
|
byte[] outBytes = new byte[header.packetSize];
|
||||||
|
Array.Copy(getHeaderBytes(), 0, outBytes, 0, BASEPACKET_SIZE);
|
||||||
|
Array.Copy(data, 0, outBytes, BASEPACKET_SIZE, data.Length);
|
||||||
|
return outBytes;
|
||||||
|
}
|
||||||
|
|
||||||
|
#region Utility Functions
|
||||||
|
public BasePacket createPacket(List<SubPacket> subpackets, bool isAuthed, bool isEncrypted)
|
||||||
|
{
|
||||||
|
//Create Header
|
||||||
|
BasePacketHeader header = new BasePacketHeader();
|
||||||
|
byte[] data = null;
|
||||||
|
|
||||||
|
header.isAuthenticated = isAuthed?(byte)1:(byte)0;
|
||||||
|
header.isEncrypted = isEncrypted?(byte)1:(byte)0;
|
||||||
|
header.numSubpackets = (ushort)subpackets.Count;
|
||||||
|
header.packetSize = BASEPACKET_SIZE;
|
||||||
|
|
||||||
|
//Get packet size
|
||||||
|
foreach (SubPacket subpacket in subpackets)
|
||||||
|
header.packetSize += subpacket.header.subpacketSize;
|
||||||
|
|
||||||
|
data = new byte[header.packetSize-0x10];
|
||||||
|
|
||||||
|
//Add Subpackets
|
||||||
|
int offset = 0;
|
||||||
|
foreach (SubPacket subpacket in subpackets)
|
||||||
|
{
|
||||||
|
byte[] subpacketData = subpacket.getBytes();
|
||||||
|
Array.Copy(subpacketData, 0, data, offset, subpacketData.Length);
|
||||||
|
header.packetSize += (ushort)subpacketData.Length;
|
||||||
|
}
|
||||||
|
|
||||||
|
Debug.Assert(data != null && offset == data.Length && header.packetSize == 0x10 + offset);
|
||||||
|
|
||||||
|
BasePacket packet = new BasePacket(header, data);
|
||||||
|
return packet;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static unsafe void encryptPacket(Blowfish blowfish, BasePacket packet)
|
||||||
|
{
|
||||||
|
byte[] data = packet.data;
|
||||||
|
int size = packet.header.packetSize;
|
||||||
|
|
||||||
|
int offset = 0;
|
||||||
|
while (offset < data.Length) {
|
||||||
|
if (data.Length < offset + SubPacket.SUBPACKET_SIZE)
|
||||||
|
throw new OverflowException("Packet Error: Subpacket was too small");
|
||||||
|
|
||||||
|
SubPacketHeader header;
|
||||||
|
fixed (byte* pdata = &data[offset])
|
||||||
|
{
|
||||||
|
header = (SubPacketHeader)Marshal.PtrToStructure(new IntPtr(pdata), typeof(SubPacketHeader));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (data.Length < offset + header.subpacketSize)
|
||||||
|
throw new OverflowException("Packet Error: Subpacket size didn't equal subpacket data");
|
||||||
|
|
||||||
|
blowfish.Encipher(data, offset + 0x10, header.subpacketSize-0x10);
|
||||||
|
|
||||||
|
offset += header.subpacketSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public static unsafe void decryptPacket(Blowfish blowfish, ref BasePacket packet)
|
||||||
|
{
|
||||||
|
byte[] data = packet.data;
|
||||||
|
int size = packet.header.packetSize;
|
||||||
|
|
||||||
|
int offset = 0;
|
||||||
|
while (offset < data.Length)
|
||||||
|
{
|
||||||
|
if (data.Length < offset + SubPacket.SUBPACKET_SIZE)
|
||||||
|
throw new OverflowException("Packet Error: Subpacket was too small");
|
||||||
|
|
||||||
|
SubPacketHeader header;
|
||||||
|
fixed (byte* pdata = &data[offset])
|
||||||
|
{
|
||||||
|
header = (SubPacketHeader)Marshal.PtrToStructure(new IntPtr(pdata), typeof(SubPacketHeader));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (data.Length < offset + header.subpacketSize)
|
||||||
|
throw new OverflowException("Packet Error: Subpacket size didn't equal subpacket data");
|
||||||
|
|
||||||
|
blowfish.Decipher(data, offset + 0x10, header.subpacketSize-0x10);
|
||||||
|
|
||||||
|
offset += header.subpacketSize;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
public void debugPrintPacket()
|
||||||
|
{
|
||||||
|
#if DEBUG
|
||||||
|
Console.BackgroundColor = ConsoleColor.DarkYellow;
|
||||||
|
Console.WriteLine("IsAuthed: {0}, IsEncrypted: {1}, Size: 0x{2:X}, Num Subpackets: {3}", header.isAuthenticated, header.isEncrypted, header.packetSize, header.numSubpackets);
|
||||||
|
Console.WriteLine("{0}", Utils.ByteArrayToHex(getHeaderBytes()));
|
||||||
|
foreach (SubPacket sub in getSubpackets())
|
||||||
|
sub.debugPrintSubPacket();
|
||||||
|
Console.BackgroundColor = ConsoleColor.Black;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
36
FFXIVClassic_Lobby_Server/packets/CharacterRequestPacket.cs
Normal file
36
FFXIVClassic_Lobby_Server/packets/CharacterRequestPacket.cs
Normal file
|
@ -0,0 +1,36 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace FFXIVClassic_Lobby_Server.packets
|
||||||
|
{
|
||||||
|
class CharacterRequestPacket
|
||||||
|
{
|
||||||
|
[StructLayout(LayoutKind.Sequential)]
|
||||||
|
public unsafe struct CharacterRequest
|
||||||
|
{
|
||||||
|
public uint sequence;
|
||||||
|
public uint unknown;
|
||||||
|
public uint characterId;
|
||||||
|
public uint unknown2;
|
||||||
|
public byte slot;
|
||||||
|
public byte command;
|
||||||
|
public ushort worldId;
|
||||||
|
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 0x20)]
|
||||||
|
public String characterName;
|
||||||
|
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 0x190)]
|
||||||
|
public String characterInfoEncoded;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static unsafe CharacterRequest toStruct(byte[] bytes)
|
||||||
|
{
|
||||||
|
fixed (byte* pdata = &bytes[0])
|
||||||
|
{
|
||||||
|
return (CharacterRequest)Marshal.PtrToStructure(new IntPtr(pdata), typeof(CharacterRequest));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
266
FFXIVClassic_Lobby_Server/packets/HardCoded_Packets.cs
Normal file
266
FFXIVClassic_Lobby_Server/packets/HardCoded_Packets.cs
Normal file
|
@ -0,0 +1,266 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace FFXIVClassic_Lobby_Server.packets
|
||||||
|
{
|
||||||
|
class HardCoded_Packets
|
||||||
|
{
|
||||||
|
public static byte[] g_secureConnectionAcknowledgment =
|
||||||
|
{
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0xA0, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x90, 0x02, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x0C, 0x69, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, 0xD0, 0xED, 0x45, 0x02, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0xC0, 0xED, 0xDF, 0xFF, 0xAF, 0xF7, 0xF7, 0xAF, 0x10, 0xEF, 0xDF, 0xFF, 0x7F, 0xFD, 0xFF, 0xFF,
|
||||||
|
0x42, 0x82, 0x63, 0x52, 0x01, 0x00, 0x00, 0x00, 0x10, 0xEF, 0xDF, 0xFF, 0x53, 0x61, 0x6D, 0x70,
|
||||||
|
0x6C, 0x65, 0x20, 0x53, 0x61, 0x6D, 0x70, 0x6C, 0x65, 0x20, 0x52, 0x75, 0x6E, 0x52, 0x75, 0x6E,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x02, 0x00, 0xF7, 0xAF, 0xAF, 0xF7, 0x00, 0x00, 0xB8, 0x6C, 0x4D, 0x02, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x10, 0x6C, 0x4D, 0x02, 0x00, 0x00, 0x00, 0x00, 0x40, 0x2C, 0xAC, 0x01, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x61, 0x6C, 0x6C, 0x62, 0x61, 0x63, 0x6B, 0x4F, 0x62,
|
||||||
|
0x6A, 0x65, 0x63, 0x74, 0x2E, 0x2E, 0x2E, 0x5B, 0x36, 0x36, 0x2E, 0x31, 0x33, 0x30, 0x2E, 0x39,
|
||||||
|
0x39, 0x2E, 0x38, 0x32, 0x3A, 0x36, 0x33, 0x34, 0x30, 0x37, 0x5D, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x70, 0xEE, 0xDF, 0xFF, 0x7F, 0xFD, 0xFF, 0xFF, 0x6C, 0x4E, 0x38, 0x01, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x32, 0xEF, 0xDF, 0xFF, 0x7F, 0xFD, 0xFF, 0xFF, 0xAF, 0xF7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0xC0, 0xEE, 0xDF, 0xFF, 0x7F, 0xFD, 0xFF, 0xFF, 0xFE, 0x4E, 0x38, 0x01, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x0B, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x20, 0xEF, 0xDF, 0xFF, 0x7F, 0xFD, 0xFF, 0xFF,
|
||||||
|
0x00, 0x01, 0xCC, 0xCC, 0x0C, 0x69, 0x00, 0xE0, 0xD0, 0x58, 0x33, 0x02, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x10, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x80, 0xEF, 0xDF, 0xFF, 0x7F, 0xFD, 0xFF, 0xFF,
|
||||||
|
0xC0, 0xEE, 0xDF, 0xFF, 0x7F, 0xFD, 0xFF, 0xFF, 0xD0, 0xED, 0x45, 0x02, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0xF0, 0xEE, 0xDF, 0xFF, 0xAF, 0xF7, 0xF7, 0xAF, 0x20, 0xEF, 0xDF, 0xFF, 0x7F, 0xFD, 0xFF, 0xFF,
|
||||||
|
0x0C, 0x69, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x10, 0x6C, 0x4D, 0x02, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x45, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0x34, 0x30, 0x37, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x90, 0xEF, 0xDF, 0xFF, 0x7F, 0xFD, 0xFF, 0xFF, 0x18, 0xBE, 0x34, 0x01, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0xD8, 0x32, 0xAC, 0x01, 0x00, 0x00, 0x00, 0x00, 0xD0, 0x32, 0xAC, 0x01, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x02, 0x00, 0xF7, 0xAF, 0x42, 0x82, 0x63, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x36, 0x36, 0x2E, 0x31, 0x33, 0x30, 0x2E, 0x39, 0x39, 0x2E, 0x38, 0x32, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x36, 0x36, 0x2E, 0x31, 0x33, 0x30, 0x2E, 0x39, 0x39, 0x2E, 0x38, 0x32, 0x00, 0xFF,
|
||||||
|
0x90, 0xEF, 0xDF, 0xFF, 0x7F, 0xFD, 0xFF, 0xFF, 0x24, 0xCF, 0x76, 0x01, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x10, 0x6C, 0x4D, 0x02, 0x00, 0x00, 0x00, 0x00, 0x70, 0x7A, 0xB7, 0x01, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x6C, 0x4D, 0x02, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x90, 0xEF, 0xDF, 0xFF, 0x7F, 0xFD, 0xFF, 0xFF, 0xD1, 0xF3, 0x37, 0x01, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x10, 0x6C, 0x4D, 0x02, 0x00, 0x00, 0x00, 0x00, 0xA0, 0x32, 0xAC, 0x01, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0xC0, 0xEF, 0xDF, 0xFF, 0x7F, 0xFD, 0xFF, 0xFF, 0xE8, 0x3E, 0x77, 0x01, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x70, 0x99, 0xAA, 0x01, 0x0C, 0x69, 0x00, 0xE0, 0xA0, 0x32, 0xAC, 0x01, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x58, 0x59, 0x33, 0x02, 0x00, 0x00, 0x00, 0x00, 0x10, 0x6C, 0x4D, 0x02, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0xE0, 0xEF, 0xDF, 0xFF, 0x7F, 0xFD, 0xFF, 0xFF, 0x05, 0x3F, 0x77, 0x01, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x0C, 0x69, 0x00, 0xE0, 0x0C, 0x69, 0x00, 0xE0, 0xA0, 0x32, 0xAC, 0x01, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0xF0, 0xDF, 0xFF, 0x7F, 0xFD, 0xFF, 0xFF, 0x23, 0x3F, 0x77, 0x01, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0xC0, 0x5A, 0x33, 0x02, 0x0C, 0x69, 0x00, 0xE0, 0xA0, 0x32, 0xAC, 0x01, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
};
|
||||||
|
|
||||||
|
public static byte[] g_characterListPacket =
|
||||||
|
{
|
||||||
|
0x01, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x05, 0x00, 0xEA, 0xCE, 0x8A, 0xEE, 0x3B, 0x01, 0x00, 0x00,
|
||||||
|
|
||||||
|
0x10, 0x02, 0x03, 0x00, 0x68, 0x68, 0x00, 0xE0, 0x68, 0x68, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x14, 0x00, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0xE8, 0xE0, 0x50, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //(9) 0x06 -> Item Count
|
||||||
|
0x02, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x44, 0x75, 0x72, 0x61, 0x6E, 0x64, 0x61, 0x6C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x03, 0x00, 0x01, 0x00, 0x61, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x48, 0x79, 0x70, 0x65, 0x72, 0x69, 0x6F, 0x6E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x04, 0x00, 0x02, 0x00, 0x5E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x4D, 0x61, 0x73, 0x61, 0x6D, 0x75, 0x6E, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x05, 0x00, 0x03, 0x00, 0x5D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x47, 0x75, 0x6E, 0x67, 0x6E, 0x69, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x07, 0x00, 0x04, 0x00, 0x5C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x41, 0x65, 0x67, 0x69, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x0A, 0x00, 0x05, 0x00, 0x5E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x53, 0x61, 0x72, 0x67, 0x61, 0x74, 0x61, 0x6E, 0x61, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
|
||||||
|
0x10, 0x02, 0x03, 0x00, 0x68, 0x68, 0x00, 0xE0, 0x68, 0x68, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x14, 0x00, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0xE8, 0xE0, 0x50, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x0B, 0x00, 0x06, 0x00, 0x61, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x42, 0x61, 0x6C, 0x6D, 0x75, 0x6E, 0x67, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x0C, 0x00, 0x07, 0x00, 0x63, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x52, 0x69, 0x64, 0x69, 0x6C, 0x6C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x10, 0x00, 0x08, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x45, 0x78, 0x63, 0x61, 0x6C, 0x69, 0x62, 0x75, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x14, 0x00, 0x09, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x52, 0x61, 0x67, 0x6E, 0x61, 0x72, 0x6F, 0x6B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
|
||||||
|
0x10, 0x02, 0x03, 0x00, 0x68, 0x68, 0x00, 0xE0, 0x68, 0x68, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x14, 0x00, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0xE8, 0xE0, 0x50, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
|
||||||
|
0xF0, 0x01, 0x03, 0x00, 0x68, 0x68, 0x00, 0xE0, 0x68, 0x68, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x14, 0x00, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0xE8, 0xE0, 0x50, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xF5, 0xA5, 0xE0,
|
||||||
|
0x09, 0x79, 0xC1, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x43, 0x6F, 0x72, 0x6E, //(C) "Cornelius" Retainer Name
|
||||||
|
0x65, 0x6C, 0x69, 0x75, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x09, 0x79, 0xC1, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
|
||||||
|
0xD0, 0x03, 0x03, 0x00, 0x68, 0x68, 0x00, 0xE0, 0x68, 0x68, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x14, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0xE8, 0xE0, 0x50, 0x00, 0x00, 0x00, 0x00, //(8) 0x50E0E824 -> Timestamp
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
|
||||||
|
// 0xFC, 0xE7, 0x58, 0x01, 0x09, 0x79, 0xC1, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF4, 0x00, 0x00, 0x00, //(4) 0x00C17909 -> Character Id
|
||||||
|
// 0x57, 0x72, 0x65, 0x6E, 0x69, 0x78, 0x20, 0x57, 0x72, 0x6F, 0x6E, 0x67, 0x00, 0x00, 0x00, 0x00, //(0) "Wrenix Wrong" -> Character Name
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x52, 0x61, 0x67, 0x6E, 0x61, 0x72, 0x6F, 0x6B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //(0) "Ragnarok" -> Server Name
|
||||||
|
0x77, 0x41, 0x51, 0x41, 0x41, 0x4F, 0x6F, 0x6E, 0x49, 0x79, 0x4D, 0x4E, 0x41, 0x41, 0x41, 0x41, //(0) base64 stuff -> Character Data
|
||||||
|
0x56, 0x33, 0x4A, 0x6C, 0x62, 0x6D, 0x6C, 0x34, 0x49, 0x46, 0x64, 0x79, 0x62, 0x32, 0x35, 0x6E,
|
||||||
|
0x41, 0x42, 0x77, 0x41, 0x41, 0x41, 0x41, 0x45, 0x41, 0x41, 0x41, 0x41, 0x41, 0x77, 0x41, 0x41,
|
||||||
|
0x41, 0x41, 0x4D, 0x41, 0x41, 0x41, 0x41, 0x5F, 0x38, 0x4F, 0x41, 0x44, 0x41, 0x41, 0x48, 0x51,
|
||||||
|
0x46, 0x41, 0x41, 0x45, 0x41, 0x41, 0x41, 0x42, 0x41, 0x41, 0x41, 0x41, 0x41, 0x42, 0x54, 0x51,
|
||||||
|
0x43, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
|
||||||
|
0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
|
||||||
|
0x41, 0x47, 0x45, 0x67, 0x41, 0x41, 0x41, 0x41, 0x4D, 0x51, 0x41, 0x41, 0x51, 0x43, 0x51, 0x41,
|
||||||
|
0x41, 0x4D, 0x41, 0x73, 0x41, 0x41, 0x43, 0x4B, 0x56, 0x41, 0x41, 0x41, 0x41, 0x50, 0x67, 0x43,
|
||||||
|
0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
|
||||||
|
0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x43, 0x51, 0x41,
|
||||||
|
0x41, 0x41, 0x41, 0x6B, 0x41, 0x77, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
|
||||||
|
0x41, 0x4E, 0x76, 0x62, 0x31, 0x4D, 0x30, 0x35, 0x41, 0x51, 0x41, 0x41, 0x42, 0x42, 0x6F, 0x41,
|
||||||
|
0x41, 0x41, 0x45, 0x41, 0x42, 0x71, 0x6F, 0x69, 0x49, 0x75, 0x49, 0x4B, 0x41, 0x41, 0x41, 0x41,
|
||||||
|
0x63, 0x48, 0x4A, 0x32, 0x4D, 0x45, 0x6C, 0x75, 0x62, 0x6A, 0x41, 0x78, 0x41, 0x42, 0x45, 0x41,
|
||||||
|
0x41, 0x41, 0x42, 0x6B, 0x5A, 0x57, 0x5A, 0x68, 0x64, 0x57, 0x78, 0x30, 0x56, 0x47, 0x56, 0x79,
|
||||||
|
0x63, 0x6D, 0x6C, 0x30, 0x62, 0x33, 0x4A, 0x35, 0x41, 0x41, 0x77, 0x4A, 0x41, 0x68, 0x63, 0x41,
|
||||||
|
0x42, 0x41, 0x41, 0x41, 0x41, 0x41, 0x51, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
|
||||||
|
0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
|
||||||
|
0x41, 0x67, 0x41, 0x41, 0x41, 0x41, 0x49, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
|
||||||
|
0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x3D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
|
||||||
|
// 0xFD, 0xE7, 0x58, 0x01, 0x0B, 0x79, 0xC1, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //(4) 0x00C17909 -> Character Id (8) -> 0x72 = Legacy account?
|
||||||
|
// 0x59, 0x72, 0x65, 0x6E, 0x69, 0x78, 0x20, 0x57, 0x72, 0x6F, 0x6E, 0x67, 0x00, 0x00, 0x00, 0x00, //(0) "Wrenix Wrong" -> Character Name
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //(4) 0x00C17909 -> Character Id (8) -> 0x72 = Legacy account?
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //(0) "Wrenix Wrong" -> Character Name
|
||||||
|
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x52, 0x61, 0x67, 0x6E, 0x61, 0x72, 0x6F, 0x6B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //(0) "Ragnarok" -> Server Name
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
86
FFXIVClassic_Lobby_Server/packets/SubPacket.cs
Normal file
86
FFXIVClassic_Lobby_Server/packets/SubPacket.cs
Normal file
|
@ -0,0 +1,86 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
using FFXIVClassic_Lobby_Server;
|
||||||
|
using FFXIVClassic_Lobby_Server.common;
|
||||||
|
|
||||||
|
namespace FFXIVClassic_Lobby_Server.packets
|
||||||
|
{
|
||||||
|
[StructLayout(LayoutKind.Sequential)]
|
||||||
|
public struct SubPacketHeader
|
||||||
|
{
|
||||||
|
public ushort subpacketSize;
|
||||||
|
public ushort unknown0; //Always 0x03
|
||||||
|
public uint sourceId;
|
||||||
|
public uint targetId;
|
||||||
|
public uint unknown1;
|
||||||
|
public ushort unknown4; //Always 0x13
|
||||||
|
public ushort opcode;
|
||||||
|
public uint unknown5;
|
||||||
|
public uint timestamp;
|
||||||
|
public uint unknown6;
|
||||||
|
}
|
||||||
|
|
||||||
|
public class SubPacket
|
||||||
|
{
|
||||||
|
public const int SUBPACKET_SIZE = 0x20;
|
||||||
|
|
||||||
|
public SubPacketHeader header;
|
||||||
|
public byte[] data;
|
||||||
|
|
||||||
|
public unsafe SubPacket(byte[] bytes, ref int offset)
|
||||||
|
{
|
||||||
|
if (bytes.Length < offset + SUBPACKET_SIZE)
|
||||||
|
throw new OverflowException("Packet Error: Subpacket was too small");
|
||||||
|
|
||||||
|
fixed (byte* pdata = &bytes[offset])
|
||||||
|
{
|
||||||
|
header = (SubPacketHeader)Marshal.PtrToStructure(new IntPtr(pdata), typeof(SubPacketHeader));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (bytes.Length < offset + header.subpacketSize)
|
||||||
|
throw new OverflowException("Packet Error: Subpacket size didn't equal subpacket data");
|
||||||
|
|
||||||
|
data = new byte[header.subpacketSize - SUBPACKET_SIZE];
|
||||||
|
Array.Copy(bytes, offset + SUBPACKET_SIZE, data, 0, data.Length);
|
||||||
|
|
||||||
|
offset += header.subpacketSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
public byte[] getHeaderBytes()
|
||||||
|
{
|
||||||
|
int size = Marshal.SizeOf(header);
|
||||||
|
byte[] arr = new byte[size];
|
||||||
|
|
||||||
|
IntPtr ptr = Marshal.AllocHGlobal(size);
|
||||||
|
Marshal.StructureToPtr(header, ptr, true);
|
||||||
|
Marshal.Copy(ptr, arr, 0, size);
|
||||||
|
Marshal.FreeHGlobal(ptr);
|
||||||
|
return arr;
|
||||||
|
}
|
||||||
|
|
||||||
|
public byte[] getBytes()
|
||||||
|
{
|
||||||
|
byte[] outBytes = new byte[header.subpacketSize];
|
||||||
|
Array.Copy(getHeaderBytes(), 0, outBytes, 0, SUBPACKET_SIZE);
|
||||||
|
Array.Copy(data, 0, outBytes, SUBPACKET_SIZE, data.Length);
|
||||||
|
return outBytes;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void debugPrintSubPacket()
|
||||||
|
{
|
||||||
|
#if DEBUG
|
||||||
|
Console.BackgroundColor = ConsoleColor.DarkRed;
|
||||||
|
Console.WriteLine("Size: 0x{0:X}, Opcode: 0x{1:X}", header.subpacketSize, header.opcode);
|
||||||
|
Console.WriteLine("{0}", Utils.ByteArrayToHex(getHeaderBytes()));
|
||||||
|
Console.BackgroundColor = ConsoleColor.DarkMagenta;
|
||||||
|
Console.WriteLine("{0}", Utils.ByteArrayToHex(data));
|
||||||
|
Console.BackgroundColor = ConsoleColor.Black;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
BIN
packages/Cyotek.CircularBuffer.1.0.0.0/Cyotek.CircularBuffer.1.0.0.0.nupkg
vendored
Normal file
BIN
packages/Cyotek.CircularBuffer.1.0.0.0/Cyotek.CircularBuffer.1.0.0.0.nupkg
vendored
Normal file
Binary file not shown.
274
packages/Cyotek.CircularBuffer.1.0.0.0/lib/net20/Cyotek.Collections.Generic.CircularBuffer.XML
vendored
Normal file
274
packages/Cyotek.CircularBuffer.1.0.0.0/lib/net20/Cyotek.Collections.Generic.CircularBuffer.XML
vendored
Normal file
|
@ -0,0 +1,274 @@
|
||||||
|
<?xml version="1.0"?>
|
||||||
|
<doc>
|
||||||
|
<assembly>
|
||||||
|
<name>Cyotek.Collections.Generic.CircularBuffer</name>
|
||||||
|
</assembly>
|
||||||
|
<members>
|
||||||
|
<member name="T:Cyotek.Collections.Generic.CircularBuffer`1">
|
||||||
|
<summary>
|
||||||
|
Represents a first-in, first-out collection of objects using a fixed buffer and automatic overwrite support.
|
||||||
|
</summary>
|
||||||
|
<typeparam name="T">Specifies the type of elements in the buffer.</typeparam>
|
||||||
|
<remarks>
|
||||||
|
<para>The capacity of a <see cref="T:Cyotek.Collections.Generic.CircularBuffer`1"/> is the number of elements the <see cref="T:Cyotek.Collections.Generic.CircularBuffer`1"/> can
|
||||||
|
hold. If an attempt is made to put more items in the buffer than available capacity, items at the start of the buffer are
|
||||||
|
automatically overwritten. This behavior can be modified via the <see cref="P:Cyotek.Collections.Generic.CircularBuffer`1.AllowOverwrite"/> property.</para>
|
||||||
|
<para>CircularBuffer{T} accepts <c>null</c> as a valid value for reference types and allows duplicate elements.</para>
|
||||||
|
<para>The <see cref="M:Cyotek.Collections.Generic.CircularBuffer`1.Get"/> methods will remove the items that are returned from the CircularBuffer{T}. To view the contents of the CircularBuffer{T} without removing items, use the <see cref="M:Cyotek.Collections.Generic.CircularBuffer`1.Peek"/> or <see cref="M:Cyotek.Collections.Generic.CircularBuffer`1.PeekLast"/> methods.</para>
|
||||||
|
</remarks>
|
||||||
|
</member>
|
||||||
|
<member name="M:Cyotek.Collections.Generic.CircularBuffer`1.#ctor(System.Int32)">
|
||||||
|
<summary>
|
||||||
|
Initializes a new instance of the <see cref="T:Cyotek.Collections.Generic.CircularBuffer`1"/> class that is empty and has the specified initial capacity and default overwrite behavior.
|
||||||
|
</summary>
|
||||||
|
<param name="capacity">The maximum capcity of the buffer.</param>
|
||||||
|
</member>
|
||||||
|
<member name="M:Cyotek.Collections.Generic.CircularBuffer`1.#ctor(System.Int32,System.Boolean)">
|
||||||
|
<summary>
|
||||||
|
Initializes a new instance of the <see cref="T:Cyotek.Collections.Generic.CircularBuffer`1"/> class that is empty and has the specified initial capacity and overwrite behavior.
|
||||||
|
</summary>
|
||||||
|
<param name="capacity">The maximum capcity of the buffer.</param>
|
||||||
|
<param name="allowOverwrite">If set to <c>true</c> the buffer will automatically overwrite the oldest items when full.</param>
|
||||||
|
<exception cref="T:System.ArgumentException">Thown if the <paramref name="capacity"/> is less than zero.</exception>
|
||||||
|
</member>
|
||||||
|
<member name="M:Cyotek.Collections.Generic.CircularBuffer`1.Clear">
|
||||||
|
<summary>
|
||||||
|
Removes all items from the <see cref="T:Cyotek.Collections.Generic.CircularBuffer`1"/>.
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="M:Cyotek.Collections.Generic.CircularBuffer`1.Contains(`0)">
|
||||||
|
<summary>
|
||||||
|
Determines whether the <see cref="T:Cyotek.Collections.Generic.CircularBuffer`1"/> contains a specific value.
|
||||||
|
</summary>
|
||||||
|
<param name="item">The object to locate in the <see cref="T:Cyotek.Collections.Generic.CircularBuffer`1"/>.</param>
|
||||||
|
<returns><c>true</c> if <paramref name="item"/> is found in the <see cref="T:Cyotek.Collections.Generic.CircularBuffer`1"/>; otherwise, <c>false</c>.</returns>
|
||||||
|
</member>
|
||||||
|
<member name="M:Cyotek.Collections.Generic.CircularBuffer`1.CopyTo(`0[])">
|
||||||
|
<summary>
|
||||||
|
Copies the entire <see cref="T:Cyotek.Collections.Generic.CircularBuffer`1"/> to a compatible one-dimensional array, starting at the beginning of the target array.
|
||||||
|
</summary>
|
||||||
|
<param name="array">The one-dimensional <see cref="T:System.Array"/> that is the destination of the elements copied from <see cref="T:Cyotek.Collections.Generic.CircularBuffer`1"/>. The <see cref="T:System.Array"/> must have zero-based indexing.</param>
|
||||||
|
</member>
|
||||||
|
<member name="M:Cyotek.Collections.Generic.CircularBuffer`1.CopyTo(`0[],System.Int32)">
|
||||||
|
<summary>
|
||||||
|
Copies the entire <see cref="T:Cyotek.Collections.Generic.CircularBuffer`1"/> to a compatible one-dimensional array, starting at the specified index of the target array.
|
||||||
|
</summary>
|
||||||
|
<param name="array">The one-dimensional <see cref="T:System.Array"/> that is the destination of the elements copied from <see cref="T:Cyotek.Collections.Generic.CircularBuffer`1"/>. The <see cref="T:System.Array"/> must have zero-based indexing.</param>
|
||||||
|
<param name="arrayIndex">The zero-based index in <paramref name="array"/> at which copying begins.</param>
|
||||||
|
</member>
|
||||||
|
<member name="M:Cyotek.Collections.Generic.CircularBuffer`1.CopyTo(System.Int32,`0[],System.Int32,System.Int32)">
|
||||||
|
<summary>
|
||||||
|
Copies a range of elements from the <see cref="T:Cyotek.Collections.Generic.CircularBuffer`1"/> to a compatible one-dimensional array, starting at the specified index of the target array.
|
||||||
|
</summary>
|
||||||
|
<param name="index">The zero-based index in the source <see cref="T:Cyotek.Collections.Generic.CircularBuffer`1"/> at which copying begins.</param>
|
||||||
|
<param name="array">The one-dimensional <see cref="T:System.Array"/> that is the destination of the elements copied from <see cref="T:Cyotek.Collections.Generic.CircularBuffer`1"/>. The <see cref="T:System.Array"/> must have zero-based indexing.</param>
|
||||||
|
<param name="arrayIndex">The zero-based index in <paramref name="array"/> at which copying begins.</param>
|
||||||
|
<param name="count">The number of elements to copy.</param>
|
||||||
|
</member>
|
||||||
|
<member name="M:Cyotek.Collections.Generic.CircularBuffer`1.Get(System.Int32)">
|
||||||
|
<summary>
|
||||||
|
Removes and returns the specified number of objects from the beginning of the <see cref="T:Cyotek.Collections.Generic.CircularBuffer`1"/>.
|
||||||
|
</summary>
|
||||||
|
<param name="count">The number of elements to remove and return from the <see cref="T:Cyotek.Collections.Generic.CircularBuffer`1"/>.</param>
|
||||||
|
<returns>The objects that are removed from the beginning of the <see cref="T:Cyotek.Collections.Generic.CircularBuffer`1"/>.</returns>
|
||||||
|
</member>
|
||||||
|
<member name="M:Cyotek.Collections.Generic.CircularBuffer`1.Get(`0[])">
|
||||||
|
<summary>
|
||||||
|
Copies and removes the specified number elements from the <see cref="T:Cyotek.Collections.Generic.CircularBuffer`1"/> to a compatible one-dimensional array, starting at the beginning of the target array.
|
||||||
|
</summary>
|
||||||
|
<param name="array">The one-dimensional <see cref="T:System.Array"/> that is the destination of the elements copied from <see cref="T:Cyotek.Collections.Generic.CircularBuffer`1"/>. The <see cref="T:System.Array"/> must have zero-based indexing.</param>
|
||||||
|
<returns>The actual number of elements copied into <paramref name="array"/>.</returns>
|
||||||
|
</member>
|
||||||
|
<member name="M:Cyotek.Collections.Generic.CircularBuffer`1.Get(`0[],System.Int32,System.Int32)">
|
||||||
|
<summary>
|
||||||
|
Copies and removes the specified number elements from the <see cref="T:Cyotek.Collections.Generic.CircularBuffer`1"/> to a compatible one-dimensional array, starting at the specified index of the target array.
|
||||||
|
</summary>
|
||||||
|
<param name="array">The one-dimensional <see cref="T:System.Array"/> that is the destination of the elements copied from <see cref="T:Cyotek.Collections.Generic.CircularBuffer`1"/>. The <see cref="T:System.Array"/> must have zero-based indexing.</param>
|
||||||
|
<param name="arrayIndex">The zero-based index in <paramref name="array"/> at which copying begins.</param>
|
||||||
|
<param name="count">The number of elements to copy.</param>
|
||||||
|
<returns>The actual number of elements copied into <paramref name="array"/>.</returns>
|
||||||
|
</member>
|
||||||
|
<member name="M:Cyotek.Collections.Generic.CircularBuffer`1.Get">
|
||||||
|
<summary>
|
||||||
|
Removes and returns the object at the beginning of the <see cref="T:Cyotek.Collections.Generic.CircularBuffer`1"/>.
|
||||||
|
</summary>
|
||||||
|
<returns>The object that is removed from the beginning of the <see cref="T:Cyotek.Collections.Generic.CircularBuffer`1"/>.</returns>
|
||||||
|
<exception cref="T:System.InvalidOperationException">Thrown if the buffer is empty.</exception>
|
||||||
|
<remarks>This method is similar to the <see cref="M:Cyotek.Collections.Generic.CircularBuffer`1.Peek"/> method, but <c>Peek</c> does not modify the <see cref="T:Cyotek.Collections.Generic.CircularBuffer`1"/>.</remarks>
|
||||||
|
</member>
|
||||||
|
<member name="M:Cyotek.Collections.Generic.CircularBuffer`1.GetEnumerator">
|
||||||
|
<summary>
|
||||||
|
Returns an enumerator that iterates through the <see cref="T:Cyotek.Collections.Generic.CircularBuffer`1"/>.
|
||||||
|
</summary>
|
||||||
|
<returns>A <see cref="T:System.Collections.Generic.IEnumerator`1"/> for the <see cref="T:Cyotek.Collections.Generic.CircularBuffer`1"/>.</returns>
|
||||||
|
</member>
|
||||||
|
<member name="M:Cyotek.Collections.Generic.CircularBuffer`1.Peek">
|
||||||
|
<summary>
|
||||||
|
Returns the object at the beginning of the <see cref="T:Cyotek.Collections.Generic.CircularBuffer`1"/> without removing it.
|
||||||
|
</summary>
|
||||||
|
<returns>The object at the beginning of the <see cref="T:Cyotek.Collections.Generic.CircularBuffer`1"/>.</returns>
|
||||||
|
<exception cref="T:System.InvalidOperationException">Thrown if the buffer is empty.</exception>
|
||||||
|
</member>
|
||||||
|
<member name="M:Cyotek.Collections.Generic.CircularBuffer`1.Peek(System.Int32)">
|
||||||
|
<summary>
|
||||||
|
Returns the specified number of objects from the beginning of the <see cref="T:Cyotek.Collections.Generic.CircularBuffer`1"/>.
|
||||||
|
</summary>
|
||||||
|
<param name="count">The number of elements to return from the <see cref="T:Cyotek.Collections.Generic.CircularBuffer`1"/>.</param>
|
||||||
|
<returns>The objects that from the beginning of the <see cref="T:Cyotek.Collections.Generic.CircularBuffer`1"/>.</returns>
|
||||||
|
<exception cref="T:System.InvalidOperationException">Thrown if the buffer is empty.</exception>
|
||||||
|
</member>
|
||||||
|
<member name="M:Cyotek.Collections.Generic.CircularBuffer`1.PeekLast">
|
||||||
|
<summary>
|
||||||
|
Returns the object at the end of the <see cref="T:Cyotek.Collections.Generic.CircularBuffer`1"/> without removing it.
|
||||||
|
</summary>
|
||||||
|
<returns>The object at the end of the <see cref="T:Cyotek.Collections.Generic.CircularBuffer`1"/>.</returns>
|
||||||
|
<exception cref="T:System.InvalidOperationException">Thrown if the buffer is empty.</exception>
|
||||||
|
</member>
|
||||||
|
<member name="M:Cyotek.Collections.Generic.CircularBuffer`1.Put(`0[])">
|
||||||
|
<summary>
|
||||||
|
Copies an entire compatible one-dimensional array to the <see cref="T:Cyotek.Collections.Generic.CircularBuffer`1"/>.
|
||||||
|
</summary>
|
||||||
|
<param name="array">The one-dimensional <see cref="T:System.Array"/> that is the source of the elements copied to <see cref="T:Cyotek.Collections.Generic.CircularBuffer`1"/>. The <see cref="T:System.Array"/> must have zero-based indexing.</param>
|
||||||
|
<exception cref="T:System.InvalidOperationException">Thrown if buffer does not have sufficient capacity to put in new items.</exception>
|
||||||
|
<remarks>If <see cref="P:Cyotek.Collections.Generic.CircularBuffer`1.Size"/> plus the size of <paramref name="array"/> exceeds the capacity of the <see cref="T:Cyotek.Collections.Generic.CircularBuffer`1"/> and the <see cref="P:Cyotek.Collections.Generic.CircularBuffer`1.AllowOverwrite"/> property is <c>true</c>, the oldest items in the <see cref="T:Cyotek.Collections.Generic.CircularBuffer`1"/> are overwritten with <paramref name="array"/>.</remarks>
|
||||||
|
</member>
|
||||||
|
<member name="M:Cyotek.Collections.Generic.CircularBuffer`1.Put(`0[],System.Int32,System.Int32)">
|
||||||
|
<summary>
|
||||||
|
Copies a range of elements from a compatible one-dimensional array to the <see cref="T:Cyotek.Collections.Generic.CircularBuffer`1"/>.
|
||||||
|
</summary>
|
||||||
|
<param name="array">The one-dimensional <see cref="T:System.Array"/> that is the source of the elements copied to <see cref="T:Cyotek.Collections.Generic.CircularBuffer`1"/>. The <see cref="T:System.Array"/> must have zero-based indexing.</param>
|
||||||
|
<param name="arrayIndex">The zero-based index in <paramref name="array"/> at which copying begins.</param>
|
||||||
|
<param name="count">The number of elements to copy.</param>
|
||||||
|
<exception cref="T:System.InvalidOperationException">Thrown if buffer does not have sufficient capacity to put in new items.</exception>
|
||||||
|
<remarks>If <see cref="P:Cyotek.Collections.Generic.CircularBuffer`1.Size"/> plus <paramref name="count"/> exceeds the capacity of the <see cref="T:Cyotek.Collections.Generic.CircularBuffer`1"/> and the <see cref="P:Cyotek.Collections.Generic.CircularBuffer`1.AllowOverwrite"/> property is <c>true</c>, the oldest items in the <see cref="T:Cyotek.Collections.Generic.CircularBuffer`1"/> are overwritten with <paramref name="array"/>.</remarks>
|
||||||
|
</member>
|
||||||
|
<member name="M:Cyotek.Collections.Generic.CircularBuffer`1.Put(`0)">
|
||||||
|
<summary>
|
||||||
|
Adds an object to the end of the <see cref="T:Cyotek.Collections.Generic.CircularBuffer`1"/>.
|
||||||
|
</summary>
|
||||||
|
<param name="item">The object to add to the <see cref="T:Cyotek.Collections.Generic.CircularBuffer`1"/>. The value can be <c>null</c> for reference types.</param>
|
||||||
|
<exception cref="T:System.InvalidOperationException">Thrown if buffer does not have sufficient capacity to put in new items.</exception>
|
||||||
|
<remarks>If <see cref="P:Cyotek.Collections.Generic.CircularBuffer`1.Size"/> already equals the capacity and the <see cref="P:Cyotek.Collections.Generic.CircularBuffer`1.AllowOverwrite"/> property is <c>true</c>, the oldest item in the <see cref="T:Cyotek.Collections.Generic.CircularBuffer`1"/> is overwritten with <paramref name="item"/>.</remarks>
|
||||||
|
</member>
|
||||||
|
<member name="M:Cyotek.Collections.Generic.CircularBuffer`1.Skip(System.Int32)">
|
||||||
|
<summary>
|
||||||
|
Increments the starting index of the data buffer in the <see cref="T:Cyotek.Collections.Generic.CircularBuffer`1"/>.
|
||||||
|
</summary>
|
||||||
|
<param name="count">The number of elements to increment the data buffer start index by.</param>
|
||||||
|
</member>
|
||||||
|
<member name="M:Cyotek.Collections.Generic.CircularBuffer`1.ToArray">
|
||||||
|
<summary>
|
||||||
|
Copies the <see cref="T:Cyotek.Collections.Generic.CircularBuffer`1"/> elements to a new array.
|
||||||
|
</summary>
|
||||||
|
<returns>A new array containing elements copied from the <see cref="T:Cyotek.Collections.Generic.CircularBuffer`1"/>.</returns>
|
||||||
|
<remarks>The <see cref="T:Cyotek.Collections.Generic.CircularBuffer`1"/> is not modified. The order of the elements in the new array is the same as the order of the elements from the beginning of the <see cref="T:Cyotek.Collections.Generic.CircularBuffer`1"/> to its end.</remarks>
|
||||||
|
</member>
|
||||||
|
<member name="M:Cyotek.Collections.Generic.CircularBuffer`1.System#Collections#ICollection#CopyTo(System.Array,System.Int32)">
|
||||||
|
<summary>
|
||||||
|
Copies the elements of the <see cref="T:System.Collections.ICollection"/> to an <see cref="T:System.Array"/>, starting at a particular <see cref="T:System.Array"/> index.
|
||||||
|
</summary>
|
||||||
|
<param name="array">The one-dimensional <see cref="T:System.Array"/> that is the destination of the elements copied from <see cref="T:System.Collections.ICollection"/>. The <see cref="T:System.Array"/> must have zero-based indexing.</param>
|
||||||
|
<param name="arrayIndex">The zero-based index in <paramref name="array"/> at which copying begins.</param>
|
||||||
|
</member>
|
||||||
|
<member name="M:Cyotek.Collections.Generic.CircularBuffer`1.System#Collections#Generic#ICollection{T}#Add(`0)">
|
||||||
|
<summary>
|
||||||
|
Adds an item to the <see cref="T:System.Collections.Generic.ICollection`1" />.
|
||||||
|
</summary>
|
||||||
|
<param name="item">The object to add to the <see cref="T:System.Collections.Generic.ICollection`1" />.</param>
|
||||||
|
</member>
|
||||||
|
<member name="M:Cyotek.Collections.Generic.CircularBuffer`1.System#Collections#Generic#ICollection{T}#Remove(`0)">
|
||||||
|
<summary>
|
||||||
|
Removes the first occurrence of a specific object from the <see cref="T:System.Collections.Generic.ICollection`1"/>.
|
||||||
|
</summary>
|
||||||
|
<param name="item">The object to remove from the <see cref="T:System.Collections.Generic.ICollection`1"/>.</param>
|
||||||
|
<returns><c>true</c> if <paramref name="item"/> was successfully removed from the <see cref="T:System.Collections.Generic.ICollection`1"/>; otherwise, <c>false</c>. This method also returns <c>false</c> if <paramref name="item"/> is not found in the original <see cref="T:System.Collections.Generic.ICollection`1"/>.</returns>
|
||||||
|
<exception cref="T:System.NotSupportedException">Cannot remove items from collection.</exception>
|
||||||
|
</member>
|
||||||
|
<member name="M:Cyotek.Collections.Generic.CircularBuffer`1.System#Collections#Generic#IEnumerable{T}#GetEnumerator">
|
||||||
|
<summary>
|
||||||
|
Returns an enumerator that iterates through the collection.
|
||||||
|
</summary>
|
||||||
|
<returns>A <see cref="T:System.Collections.Generic.IEnumerator`1" /> that can be used to iterate through the collection.</returns>
|
||||||
|
</member>
|
||||||
|
<member name="M:Cyotek.Collections.Generic.CircularBuffer`1.System#Collections#IEnumerable#GetEnumerator">
|
||||||
|
<summary>
|
||||||
|
Returns an enumerator that iterates through a collection.
|
||||||
|
</summary>
|
||||||
|
<returns>An <see cref="T:System.Collections.IEnumerator" /> object that can be used to iterate through the collection.</returns>
|
||||||
|
</member>
|
||||||
|
<member name="P:Cyotek.Collections.Generic.CircularBuffer`1.AllowOverwrite">
|
||||||
|
<summary>
|
||||||
|
Gets or sets a value indicating whether the buffer will automatically overwrite the oldest items in the buffer when the maximum capacity is reached.
|
||||||
|
</summary>
|
||||||
|
<value><c>true</c> if the oldest items in the buffer are automatically overwritten when the buffer is full; otherwise, <c>false</c>.</value>
|
||||||
|
</member>
|
||||||
|
<member name="P:Cyotek.Collections.Generic.CircularBuffer`1.Capacity">
|
||||||
|
<summary>
|
||||||
|
Gets or sets the total number of elements the internal data structure can hold.
|
||||||
|
</summary>
|
||||||
|
<value>The total number of elements that the <see cref="T:Cyotek.Collections.Generic.CircularBuffer`1"/> can contain.</value>
|
||||||
|
<exception cref="T:System.ArgumentOutOfRangeException">Thrown if the specified new capacity is smaller than the current contents of the buffer.</exception>
|
||||||
|
</member>
|
||||||
|
<member name="P:Cyotek.Collections.Generic.CircularBuffer`1.Head">
|
||||||
|
<summary>
|
||||||
|
Gets the index of the beginning of the buffer data.
|
||||||
|
</summary>
|
||||||
|
<value>The index of the first element in the buffer.</value>
|
||||||
|
</member>
|
||||||
|
<member name="P:Cyotek.Collections.Generic.CircularBuffer`1.IsEmpty">
|
||||||
|
<summary>
|
||||||
|
Gets a value indicating whether the buffer is empty.
|
||||||
|
</summary>
|
||||||
|
<value><c>true</c> if buffer is empty; otherwise, <c>false</c>.</value>
|
||||||
|
</member>
|
||||||
|
<member name="P:Cyotek.Collections.Generic.CircularBuffer`1.IsFull">
|
||||||
|
<summary>
|
||||||
|
Gets a value indicating whether the buffer is full.
|
||||||
|
</summary>
|
||||||
|
<value><c>true</c> if the buffer is full; otherwise, <c>false</c>.</value>
|
||||||
|
<remarks>The <see cref="P:Cyotek.Collections.Generic.CircularBuffer`1.IsFull"/> property always returns <c>false</c> if the <see cref="P:Cyotek.Collections.Generic.CircularBuffer`1.AllowOverwrite"/> property is set to <c>true</c>.</remarks>
|
||||||
|
</member>
|
||||||
|
<member name="P:Cyotek.Collections.Generic.CircularBuffer`1.Size">
|
||||||
|
<summary>
|
||||||
|
Gets the number of elements contained in the <see cref="T:Cyotek.Collections.Generic.CircularBuffer`1"/>.
|
||||||
|
</summary>
|
||||||
|
<value>The number of elements contained in the <see cref="T:Cyotek.Collections.Generic.CircularBuffer`1"/>.</value>
|
||||||
|
</member>
|
||||||
|
<member name="P:Cyotek.Collections.Generic.CircularBuffer`1.Tail">
|
||||||
|
<summary>
|
||||||
|
Gets the index of the end of the buffer data.
|
||||||
|
</summary>
|
||||||
|
<value>The index of the last element in the buffer.</value>
|
||||||
|
</member>
|
||||||
|
<member name="P:Cyotek.Collections.Generic.CircularBuffer`1.System#Collections#ICollection#Count">
|
||||||
|
<summary>
|
||||||
|
Gets the number of elements contained in the <see cref="T:System.Collections.ICollection"/>.
|
||||||
|
</summary>
|
||||||
|
<value>The number of elements actually contained in the <see cref="T:System.Collections.ICollection"/>.</value>
|
||||||
|
</member>
|
||||||
|
<member name="P:Cyotek.Collections.Generic.CircularBuffer`1.System#Collections#ICollection#IsSynchronized">
|
||||||
|
<summary>
|
||||||
|
Gets a value indicating whether access to the <see cref="T:System.Collections.ICollection"/> is synchronized (thread safe).
|
||||||
|
</summary>
|
||||||
|
<value><c>true</c> if access to the <see cref="T:System.Collections.ICollection"/> is synchronized (thread safe); otherwise, <c>false</c>. In the default implementation of <see cref="T:Cyotek.Collections.Generic.CircularBuffer`1"/>, this property always returns <c>false</c>.</value>
|
||||||
|
</member>
|
||||||
|
<member name="P:Cyotek.Collections.Generic.CircularBuffer`1.System#Collections#ICollection#SyncRoot">
|
||||||
|
<summary>
|
||||||
|
Gets an object that can be used to synchronize access to the <see cref="T:System.Collections.ICollection"/>.
|
||||||
|
</summary>
|
||||||
|
<value>An object that can be used to synchronize access to the <see cref="T:System.Collections.ICollection"/></value>
|
||||||
|
</member>
|
||||||
|
<member name="P:Cyotek.Collections.Generic.CircularBuffer`1.System#Collections#Generic#ICollection{T}#Count">
|
||||||
|
<summary>
|
||||||
|
Gets the number of elements contained in the <see cref="T:System.Collections.Generic.ICollection`1"/>.
|
||||||
|
</summary>
|
||||||
|
<value>The number of elements actually contained in the <see cref="T:System.Collections.Generic.ICollection`1"/>.</value>
|
||||||
|
</member>
|
||||||
|
<member name="P:Cyotek.Collections.Generic.CircularBuffer`1.System#Collections#Generic#ICollection{T}#IsReadOnly">
|
||||||
|
<summary>
|
||||||
|
Gets a value indicating whether the <see cref="T:System.Collections.Generic.ICollection`1"/> is read-only.
|
||||||
|
</summary>
|
||||||
|
<value><c>true</c> if the <see cref="T:System.Collections.Generic.ICollection`1"/> is read-only; otherwise, <c>false</c>. In the default implementation of <see cref="T:Cyotek.Collections.Generic.CircularBuffer`1"/>, this property always returns <c>false</c>.</value>
|
||||||
|
</member>
|
||||||
|
</members>
|
||||||
|
</doc>
|
64
packages/MySql.Data.6.9.7/CHANGES
vendored
Normal file
64
packages/MySql.Data.6.9.7/CHANGES
vendored
Normal file
|
@ -0,0 +1,64 @@
|
||||||
|
6.9.7
|
||||||
|
- Changed default SSL mode to Preferred in connection string. Now the server connections will be using SSL if server allows it by default but it's possible to override this configuration.
|
||||||
|
- Changed handshake process to use bytes instead of encoded strings.
|
||||||
|
- Fix for Fabric connections (Oracle Bug #20983968).
|
||||||
|
- Fix for Fabric plugin: fabric server selection is broken when master is faulty (Oracle Bug #21203824).
|
||||||
|
|
||||||
|
|
||||||
|
6.9.6
|
||||||
|
- Fix for Incorrect query result with Entity Framework 6 (MySql bug #74918, Oracle bug #20129927).
|
||||||
|
- Fix for GetTimeZoneOffset to use date and time to calculate timediff (MySQL Bug #74905, Oracle Bug #20065691).
|
||||||
|
- Fix for MySqlSimpleMembershipProvider keeps database connections open on some operations (MySQL Bug #74662, Oracle Bug #20109419)
|
||||||
|
- Fix for Any Call to RoleExists() returns true whether or not the role exists (MySql bug #75397, Oracle bug #20325391).
|
||||||
|
- Fix for all dateTimes set as UTC Kind (MySQL Bug #74134, Oracle Bug #20200662).
|
||||||
|
- Fix for Invalid SQL query when eager loading two nested collections (MySQL Bug #70941, Oracle bug #18049862).
|
||||||
|
- Fix for chinese characters used in the connection string when connecting to MySql Server (MySQL Bug #70041, Oracle Bug #18141356).
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
6.9.5
|
||||||
|
- Disabled installation on-demand in Installer (Oracle Bug #19670596).
|
||||||
|
- Fix for Generated SQL requests column that doesn't exist in LINQ to Entities (MySql bug #72004, Oracle bug #19681348).
|
||||||
|
- Fix for MySQL Connector/NET generates incorrect SQL for LINQ 'StartsWith' queries (MySql bug #72058, Oracle bug #19680236).
|
||||||
|
- Fix for Exception when using IEnumerable.Contains(model.property) in Where predicate (MySql bug #73643, Oracle bug #19690370).
|
||||||
|
- Fix for Generated Sql does not contain ORDER BY statement whose is requested by LINQ (MySql bug #73549, Oracle bug #19698010).
|
||||||
|
- Fix for Web providers registration in machine.config (removed v20 suffix) (MySQL Bug #74080, Oracle Bug #19715398)
|
||||||
|
- Fix for Error of "Every derived table must have an alias" in LINQ to Entities when using EF6 + DbFirst + View + Take
|
||||||
|
(MySql Bug #72148, Oracle bug #19356006).
|
||||||
|
- Fix for 'the method or operation is not implemented' when using linq with orderby (MySQL Bug #70722, Oracle Bug #19681723).
|
||||||
|
- Fix for Exception "The given key was not present in the dictionary" when using utf16le charset in a query. (MySql #72737, Oracle Bug #19355906)
|
||||||
|
- Fix for Memory leak in a loop opening a connection to the database and executing a command (MySql Bug #73122, Oracle Bug #19467233).
|
||||||
|
- Fix for Multiple issues caused by trailing and leading white space character in params using MySql Membership Provider (MySql Bug #73411, Oracle Bug #19453313)
|
||||||
|
- Fix for bad assumption leads to modify query adding CALL statement to the beginning of the sql query even when CommandType.Text is specified (MySql Bug #72736, Oracle Bug #19325120).
|
||||||
|
|
||||||
|
|
||||||
|
6.9.4
|
||||||
|
- Added a new plugin for MySql Fabric 1.5 support
|
||||||
|
|
||||||
|
|
||||||
|
6.9.3
|
||||||
|
- Fix for Web Parts Personalization provider
|
||||||
|
- Fix for changing the PK between two int columns (MySql Bug #71418, Oracle bug #18923294).
|
||||||
|
- Fix for Error when Calling MySqlConnection.GetSchema("PROCEDURES WITH PARAMETERS", ...) (Oracle bug #19285959).
|
||||||
|
- Fix for EF provider reports ManifestProviderToken = 5.6 for server 5.7 (Oracle bug #19453814).
|
||||||
|
- Fix for Fluent API DbModelBuilder.HasColumnType is ignored in EF6 (Oracle bug #19456229).
|
||||||
|
- Fix for Setting a PK GUID identity in Code First in EF6 no longer works in Server 5.7 (Oracle bug #19456452).
|
||||||
|
- Non PKs declared as Identity GUID have no GUID autogenerated (Oracle bug #19456415).
|
||||||
|
|
||||||
|
|
||||||
|
6.9.2
|
||||||
|
- Add async/await compatible methods
|
||||||
|
- Fix for Unable to read geometry column when it has been set with a SRID value. (MySql Bug #71869, Oracle Bug #19137999)
|
||||||
|
- Fix for Exception adding a new column to an existing model as identity and PK fails when applying the migration (MySql Bug #71418, Oracle bug #18923294).
|
||||||
|
- Added SiteMap and Personalization configuration web providers to MySql.Web Nuget Package.
|
||||||
|
|
||||||
|
|
||||||
|
6.9.1
|
||||||
|
- Fix for Exception of "duplicate entry" in MySqlSessionProvider (MySql Bug #70409, Oracle bug #18657550).
|
||||||
|
|
||||||
|
|
||||||
|
6.9.0
|
||||||
|
- Added implementation of MySQLPersonalizationProvider.
|
||||||
|
- Added SiteMap Web provider.
|
||||||
|
- Added Simple Membership Web Provider.
|
||||||
|
- Fix for open sockets connections left when connection open fails, the error happens when the client try to get a connection when the max number of connections is reached in the server. (MySql #72025, Oracle Bug #18665388).
|
BIN
packages/MySql.Data.6.9.7/MySql.Data.6.9.7.nupkg
vendored
Normal file
BIN
packages/MySql.Data.6.9.7/MySql.Data.6.9.7.nupkg
vendored
Normal file
Binary file not shown.
15
packages/MySql.Data.6.9.7/Readme.txt
vendored
Normal file
15
packages/MySql.Data.6.9.7/Readme.txt
vendored
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
Connector/Net 6.9 Release Notes
|
||||||
|
------------------------------------
|
||||||
|
|
||||||
|
Welcome to the release notes for Connector/Net 6.9
|
||||||
|
|
||||||
|
What's new in 6.9
|
||||||
|
--------------------
|
||||||
|
|
||||||
|
- Simple Membership Web Provider
|
||||||
|
- Site Map Web Provider
|
||||||
|
- Personalization Web Provider
|
||||||
|
- MySql Fabric support
|
||||||
|
|
||||||
|
|
||||||
|
Be sure and check the documentation for more information on these new features.
|
9
packages/MySql.Data.6.9.7/content/app.config.transform
vendored
Normal file
9
packages/MySql.Data.6.9.7/content/app.config.transform
vendored
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<configuration>
|
||||||
|
<system.data>
|
||||||
|
<DbProviderFactories>
|
||||||
|
<remove invariant="MySql.Data.MySqlClient" />
|
||||||
|
<add name="MySQL Data Provider" invariant="MySql.Data.MySqlClient" description=".Net Framework Data Provider for MySQL" type="MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data, Version=6.9.7.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" />
|
||||||
|
</DbProviderFactories>
|
||||||
|
</system.data>
|
||||||
|
</configuration>
|
9
packages/MySql.Data.6.9.7/content/web.config.transform
vendored
Normal file
9
packages/MySql.Data.6.9.7/content/web.config.transform
vendored
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<configuration>
|
||||||
|
<system.data>
|
||||||
|
<DbProviderFactories>
|
||||||
|
<remove invariant="MySql.Data.MySqlClient" />
|
||||||
|
<add name="MySQL Data Provider" invariant="MySql.Data.MySqlClient" description=".Net Framework Data Provider for MySQL" type="MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data, Version=6.9.7.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" />
|
||||||
|
</DbProviderFactories>
|
||||||
|
</system.data>
|
||||||
|
</configuration>
|
BIN
packages/Newtonsoft.Json.7.0.1/Newtonsoft.Json.7.0.1.nupkg
vendored
Normal file
BIN
packages/Newtonsoft.Json.7.0.1/Newtonsoft.Json.7.0.1.nupkg
vendored
Normal file
Binary file not shown.
9439
packages/Newtonsoft.Json.7.0.1/lib/net20/Newtonsoft.Json.xml
vendored
Normal file
9439
packages/Newtonsoft.Json.7.0.1/lib/net20/Newtonsoft.Json.xml
vendored
Normal file
File diff suppressed because it is too large
Load diff
8582
packages/Newtonsoft.Json.7.0.1/lib/net35/Newtonsoft.Json.xml
vendored
Normal file
8582
packages/Newtonsoft.Json.7.0.1/lib/net35/Newtonsoft.Json.xml
vendored
Normal file
File diff suppressed because it is too large
Load diff
8889
packages/Newtonsoft.Json.7.0.1/lib/net40/Newtonsoft.Json.xml
vendored
Normal file
8889
packages/Newtonsoft.Json.7.0.1/lib/net40/Newtonsoft.Json.xml
vendored
Normal file
File diff suppressed because it is too large
Load diff
8889
packages/Newtonsoft.Json.7.0.1/lib/net45/Newtonsoft.Json.xml
vendored
Normal file
8889
packages/Newtonsoft.Json.7.0.1/lib/net45/Newtonsoft.Json.xml
vendored
Normal file
File diff suppressed because it is too large
Load diff
8067
packages/Newtonsoft.Json.7.0.1/lib/portable-net40+sl5+wp80+win8+wpa81/Newtonsoft.Json.xml
vendored
Normal file
8067
packages/Newtonsoft.Json.7.0.1/lib/portable-net40+sl5+wp80+win8+wpa81/Newtonsoft.Json.xml
vendored
Normal file
File diff suppressed because it is too large
Load diff
8414
packages/Newtonsoft.Json.7.0.1/lib/portable-net45+wp80+win8+wpa81+dnxcore50/Newtonsoft.Json.xml
vendored
Normal file
8414
packages/Newtonsoft.Json.7.0.1/lib/portable-net45+wp80+win8+wpa81+dnxcore50/Newtonsoft.Json.xml
vendored
Normal file
File diff suppressed because it is too large
Load diff
112
packages/Newtonsoft.Json.7.0.1/tools/install.ps1
vendored
Normal file
112
packages/Newtonsoft.Json.7.0.1/tools/install.ps1
vendored
Normal file
|
@ -0,0 +1,112 @@
|
||||||
|
param($installPath, $toolsPath, $package, $project)
|
||||||
|
|
||||||
|
# open json.net splash page on package install
|
||||||
|
# don't open if json.net is installed as a dependency
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
$url = "http://www.newtonsoft.com/json/install?version=" + $package.Version
|
||||||
|
$dte2 = Get-Interface $dte ([EnvDTE80.DTE2])
|
||||||
|
|
||||||
|
if ($dte2.ActiveWindow.Caption -eq "Package Manager Console")
|
||||||
|
{
|
||||||
|
# user is installing from VS NuGet console
|
||||||
|
# get reference to the window, the console host and the input history
|
||||||
|
# show webpage if "install-package newtonsoft.json" was last input
|
||||||
|
|
||||||
|
$consoleWindow = $(Get-VSComponentModel).GetService([NuGetConsole.IPowerConsoleWindow])
|
||||||
|
|
||||||
|
$props = $consoleWindow.GetType().GetProperties([System.Reflection.BindingFlags]::Instance -bor `
|
||||||
|
[System.Reflection.BindingFlags]::NonPublic)
|
||||||
|
|
||||||
|
$prop = $props | ? { $_.Name -eq "ActiveHostInfo" } | select -first 1
|
||||||
|
if ($prop -eq $null) { return }
|
||||||
|
|
||||||
|
$hostInfo = $prop.GetValue($consoleWindow)
|
||||||
|
if ($hostInfo -eq $null) { return }
|
||||||
|
|
||||||
|
$history = $hostInfo.WpfConsole.InputHistory.History
|
||||||
|
|
||||||
|
$lastCommand = $history | select -last 1
|
||||||
|
|
||||||
|
if ($lastCommand)
|
||||||
|
{
|
||||||
|
$lastCommand = $lastCommand.Trim().ToLower()
|
||||||
|
if ($lastCommand.StartsWith("install-package") -and $lastCommand.Contains("newtonsoft.json"))
|
||||||
|
{
|
||||||
|
$dte2.ItemOperations.Navigate($url) | Out-Null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
# user is installing from VS NuGet dialog
|
||||||
|
# get reference to the window, then smart output console provider
|
||||||
|
# show webpage if messages in buffered console contains "installing...newtonsoft.json" in last operation
|
||||||
|
|
||||||
|
$instanceField = [NuGet.Dialog.PackageManagerWindow].GetField("CurrentInstance", [System.Reflection.BindingFlags]::Static -bor `
|
||||||
|
[System.Reflection.BindingFlags]::NonPublic)
|
||||||
|
|
||||||
|
$consoleField = [NuGet.Dialog.PackageManagerWindow].GetField("_smartOutputConsoleProvider", [System.Reflection.BindingFlags]::Instance -bor `
|
||||||
|
[System.Reflection.BindingFlags]::NonPublic)
|
||||||
|
|
||||||
|
if ($instanceField -eq $null -or $consoleField -eq $null) { return }
|
||||||
|
|
||||||
|
$instance = $instanceField.GetValue($null)
|
||||||
|
|
||||||
|
if ($instance -eq $null) { return }
|
||||||
|
|
||||||
|
$consoleProvider = $consoleField.GetValue($instance)
|
||||||
|
if ($consoleProvider -eq $null) { return }
|
||||||
|
|
||||||
|
$console = $consoleProvider.CreateOutputConsole($false)
|
||||||
|
|
||||||
|
$messagesField = $console.GetType().GetField("_messages", [System.Reflection.BindingFlags]::Instance -bor `
|
||||||
|
[System.Reflection.BindingFlags]::NonPublic)
|
||||||
|
if ($messagesField -eq $null) { return }
|
||||||
|
|
||||||
|
$messages = $messagesField.GetValue($console)
|
||||||
|
if ($messages -eq $null) { return }
|
||||||
|
|
||||||
|
$operations = $messages -split "=============================="
|
||||||
|
|
||||||
|
$lastOperation = $operations | select -last 1
|
||||||
|
|
||||||
|
if ($lastOperation)
|
||||||
|
{
|
||||||
|
$lastOperation = $lastOperation.ToLower()
|
||||||
|
|
||||||
|
$lines = $lastOperation -split "`r`n"
|
||||||
|
|
||||||
|
$installMatch = $lines | ? { $_.StartsWith("------- installing...newtonsoft.json ") } | select -first 1
|
||||||
|
|
||||||
|
if ($installMatch)
|
||||||
|
{
|
||||||
|
$dte2.ItemOperations.Navigate($url) | Out-Null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
$pmPane = $dte2.ToolWindows.OutputWindow.OutputWindowPanes.Item("Package Manager")
|
||||||
|
|
||||||
|
$selection = $pmPane.TextDocument.Selection
|
||||||
|
$selection.StartOfDocument($false)
|
||||||
|
$selection.EndOfDocument($true)
|
||||||
|
|
||||||
|
if ($selection.Text.StartsWith("Attempting to gather dependencies information for package 'Newtonsoft.Json." + $package.Version + "'"))
|
||||||
|
{
|
||||||
|
$dte2.ItemOperations.Navigate($url) | Out-Null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
# stop potential errors from bubbling up
|
||||||
|
# worst case the splash page won't open
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# still yolo
|
4
packages/repositories.config
Normal file
4
packages/repositories.config
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<repositories>
|
||||||
|
<repository path="..\FFXIVClassic_Lobby_Server\packages.config" />
|
||||||
|
</repositories>
|
55
research/encodedCharaInfo.txt
Normal file
55
research/encodedCharaInfo.txt
Normal file
|
@ -0,0 +1,55 @@
|
||||||
|
===Encoded Chara Info=== By Ioncannon
|
||||||
|
-Based on chara info array in Seventh Umbral
|
||||||
|
|
||||||
|
0x000: Int32;
|
||||||
|
0x004: Int32;
|
||||||
|
0x008:Name Size Int32;
|
||||||
|
0x00C:Name String; Variable size, but in file the name "Wrenix Wrong" is 0xD in size
|
||||||
|
0x019: Int32;
|
||||||
|
0x01D: Int32;
|
||||||
|
0x021:Tribe Model Int32;
|
||||||
|
0x025:Size Int32;
|
||||||
|
0x029:Colors Info Int32;
|
||||||
|
0x02D:Face Info Int32;
|
||||||
|
0x031:Hair Model Int32;
|
||||||
|
0x035:Voice Int32;
|
||||||
|
0x039:MainHand Int32;
|
||||||
|
0x03D:OffHand Int32;
|
||||||
|
0x041: Int32;
|
||||||
|
0x045: Int32;
|
||||||
|
0x049: Int32;
|
||||||
|
0x04D: Int32;
|
||||||
|
0x051: Int32;
|
||||||
|
0x055:Head Int32;
|
||||||
|
0x059:Body Int32;
|
||||||
|
0x06D:Legs Int32;
|
||||||
|
0x061:Hands Int32;
|
||||||
|
0x065:Feet Int32;
|
||||||
|
0x069:Waist Int32;
|
||||||
|
0x06D: Int32;
|
||||||
|
0x071:Right Ear Int32;
|
||||||
|
0x075:Left Ear Int32;
|
||||||
|
0x079: Int32;
|
||||||
|
0x07D: Int32;
|
||||||
|
0x081:Right Ring Int32;
|
||||||
|
0x085:Left Ring Int32;
|
||||||
|
|
||||||
|
0x09F:Tribe Byte;
|
||||||
|
|
||||||
|
0x0A0: Int32;
|
||||||
|
0x0A4:Location Str Size Int32;
|
||||||
|
0x0A8:Location String String; Variable size, but in file it is prv0Inn01\0, 0x0A in size.
|
||||||
|
|
||||||
|
0x0B2:Territory Str Size Int32;
|
||||||
|
0x0B6:Territory Str? String; Variable size, but in file it is defaultTerritory\0, 0x11 in size.
|
||||||
|
|
||||||
|
0x0C7:Guardian Byte;
|
||||||
|
0x0C8:Birth Month Byte;
|
||||||
|
0x0C9:Birth Day Byte;
|
||||||
|
|
||||||
|
0x0CA: Short;
|
||||||
|
0x0CC: Int32;
|
||||||
|
0x0D0: Int32;
|
||||||
|
|
||||||
|
0x0E4: Byte;
|
||||||
|
0x0E8:Allegiance Byte;
|
6
research/serverInfo.txt
Normal file
6
research/serverInfo.txt
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
Server Sheet
|
||||||
|
|
||||||
|
0x00:Server ID Short;
|
||||||
|
0x02: Short;
|
||||||
|
0x04:Server Pop Short;
|
||||||
|
0x10:Server Name
|
Loading…
Add table
Reference in a new issue