Compare commits

...

5 Commits

36 changed files with 3550 additions and 26 deletions

16
.gitignore vendored
View File

@ -1,6 +1,16 @@
/_release
*.lock
*.o *.o
*.pyd
*.user *.user
/**/.settings
/**/.vs
/**/TestResults
/**/__pycache__
/**/bin
/**/build
/**/node_modules
/**/obj /**/obj
/.vs /**/out
/bin /**/package-lock.*
/out /**/target

View File

@ -21,7 +21,7 @@ ifneq ($(CPU),)
CFLAGS += -m$(CPU) CFLAGS += -m$(CPU)
endif endif
CFLAGS += -std=gnu99 -Wall -pedantic -Wno-deprecated-declarations -Ilibnuhash/include -D_FILE_OFFSET_BITS=64 CFLAGS += -std=gnu99 -Wall -pedantic -Wno-deprecated-declarations -Ilibnuhash/c99/include -D_FILE_OFFSET_BITS=64
ifneq ($(DEBUG),1) ifneq ($(DEBUG),1)
CFLAGS += -Ofast -DNDEBUG CFLAGS += -Ofast -DNDEBUG
@ -53,11 +53,13 @@ ifneq ($(filter %w64-mingw32 %w64-windows-gnu,$(OS_TYPE)),)
LDFLAGS += -municode LDFLAGS += -municode
endif endif
RCFLAGS += -Ilibnuhash/c99/src
# ---------------------------------------------------------------------------- # ----------------------------------------------------------------------------
# Files # Files
# ---------------------------------------------------------------------------- # ----------------------------------------------------------------------------
INFILES = $(patsubst %.c,%.o,$(wildcard libnuhash/src/*.c)) $(patsubst %.c,%.o,$(wildcard tool/src/*.c)) INFILES = $(patsubst %.c,%.o,$(wildcard libnuhash/c99/src/*.c)) $(patsubst %.c,%.o,$(wildcard tool/src/*.c))
OUTFILE = bin/nuhash OUTFILE = bin/nuhash
OUTPATH = $(patsubst %/,%,$(dir $(OUTFILE))) OUTPATH = $(patsubst %/,%,$(dir $(OUTFILE)))
@ -87,7 +89,7 @@ $(OUTPATH):
$(CC) $(CFLAGS) -c -o $@ $< $(CC) $(CFLAGS) -c -o $@ $<
%.o: %.rc %.o: %.rc
windres -o $@ $< windres $(RCFLAGS) -o $@ $<
clean: clean:
rm -vrf $(OUTPATH) rm -vrf $(OUTPATH)

View File

@ -43,7 +43,7 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClInclude Include="include\nuhash.h" /> <ClInclude Include="include\nuhash.h" />
<ClInclude Include="src\version.h" /> <ClInclude Include="src\nuhash_version.h" />
</ItemGroup> </ItemGroup>
<PropertyGroup Label="Globals"> <PropertyGroup Label="Globals">
<VCProjectVersion>16.0</VCProjectVersion> <VCProjectVersion>16.0</VCProjectVersion>

View File

@ -23,7 +23,7 @@
<ClInclude Include="include\nuhash.h"> <ClInclude Include="include\nuhash.h">
<Filter>Headerdateien</Filter> <Filter>Headerdateien</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="src\version.h"> <ClInclude Include="src\nuhash_version.h">
<Filter>Headerdateien</Filter> <Filter>Headerdateien</Filter>
</ClInclude> </ClInclude>
</ItemGroup> </ItemGroup>

View File

@ -4,7 +4,7 @@
/******************************************************************************/ /******************************************************************************/
#include "nuhash.h" #include "nuhash.h"
#include "version.h" #include "nuhash_version.h"
#include <string.h> #include <string.h>
#define COUNT_OF(ARRAY) (sizeof(ARRAY) / sizeof(ARRAY[0])) #define COUNT_OF(ARRAY) (sizeof(ARRAY) / sizeof(ARRAY[0]))

View File

@ -0,0 +1,31 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16
VisualStudioVersion = 16.0.33801.447
MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NuHash", "NuHash\NuHash.csproj", "{0C96887C-85B6-43F2-A6B5-02850D5C3609}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NuHashTest", "NuHashTest\NuHashTest.csproj", "{FC474407-57AA-43A5-8963-4DA4EDD8BED6}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{0C96887C-85B6-43F2-A6B5-02850D5C3609}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{0C96887C-85B6-43F2-A6B5-02850D5C3609}.Debug|Any CPU.Build.0 = Debug|Any CPU
{0C96887C-85B6-43F2-A6B5-02850D5C3609}.Release|Any CPU.ActiveCfg = Release|Any CPU
{0C96887C-85B6-43F2-A6B5-02850D5C3609}.Release|Any CPU.Build.0 = Release|Any CPU
{FC474407-57AA-43A5-8963-4DA4EDD8BED6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{FC474407-57AA-43A5-8963-4DA4EDD8BED6}.Debug|Any CPU.Build.0 = Debug|Any CPU
{FC474407-57AA-43A5-8963-4DA4EDD8BED6}.Release|Any CPU.ActiveCfg = Release|Any CPU
{FC474407-57AA-43A5-8963-4DA4EDD8BED6}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {31837A4E-8923-447E-B05C-C1F7C0420AAB}
EndGlobalSection
EndGlobal

View File

@ -0,0 +1,639 @@
/******************************************************************************/
/* NuHash, by LoRd_MuldeR <MuldeR2@GMX.de> */
/* This work has been released under the CC0 1.0 Universal license! */
/******************************************************************************/
using System;
using System.IO;
using System.Reflection;
using System.Runtime.CompilerServices;
namespace LibNuHash
{
public class NuHash : IDisposable
{
public const int NUHASH_WORDS = 6;
public const int NUHASH_BYTES = NUHASH_WORDS * sizeof(ulong);
private const int ROUNDS = 5;
private readonly ulong[] m_hash = new ulong[NUHASH_WORDS];
private bool m_finished = false;
/* ------------------------------------------------------------------------ */
/* Constructor */
/* ------------------------------------------------------------------------ */
public NuHash()
{
Array.Copy(NUHASH_INI, m_hash, NUHASH_INI.Length);
}
public void Dispose()
{
Array.Clear(m_hash, 0, m_hash.Length);
}
/* ------------------------------------------------------------------------ */
/* Const tables */
/* ------------------------------------------------------------------------ */
private static readonly ulong[] NUHASH_INI = new ulong[]
{
0x243F6A8885A308D3UL, 0x13198A2E03707344UL, 0xA4093822299F31D0UL,
0x082EFA98EC4E6C89UL, 0x452821E638D01377UL, 0xBE5466CF34E90C6CUL
};
private static readonly ulong[][] NUHASH_XOR = new ulong[][]
{
new ulong[] { 0x01DCDF00414B3037UL, 0xB1B3AF661B8E96F8UL, 0x944D2873DB393121UL, 0x73DA9A36662AE755UL, 0x1F4F318C4ECB56B1UL, 0xF09743D99C2AA5BCUL }, /*00*/
new ulong[] { 0xA81FBBC6CBBFC954UL, 0x39DE43648959EDDBUL, 0x1A641A0BDA01822FUL, 0xB52E607266932658UL, 0x2C5B1731AC802084UL, 0xC2EF10671FC79DD4UL }, /*01*/
new ulong[] { 0xCF2A8D8E08810046UL, 0x8B7E9B2089E268F6UL, 0x930461652C5D2DECUL, 0xF096E42223BFC8B9UL, 0x8DD338964CFE0970UL, 0x269C342F7CEC60BDUL }, /*02*/
new ulong[] { 0xB970A920D2ED0552UL, 0x010F894A254DA7E1UL, 0x8D5F205F9D1A40D8UL, 0x50C33DCCC3FD5F58UL, 0xB49F31BDE7D82C57UL, 0x7CDE04F62A959033UL }, /*03*/
new ulong[] { 0x49FAB2822B9C84ACUL, 0x34B8648CD68CBEF1UL, 0xE5121147BB4126DEUL, 0xC0B31F54B2FFE00FUL, 0x2F193DA38E8CC632UL, 0x058C984B429B8AFCUL }, /*04*/
new ulong[] { 0xE07F9DA44D8C9942UL, 0xBE2AF9B39ACA65F2UL, 0x5D3D8FB1466DC295UL, 0xC0051E3EC3F962C7UL, 0xF8FDC3CCD4CE2BB6UL, 0x9024C0EFC6199937UL }, /*05*/
new ulong[] { 0xA3111377EF01F5EFUL, 0x31F59B366C02A3FFUL, 0x61B82949760D16DCUL, 0xF6B958AF92BD3BDFUL, 0x7297AAEFEC69C0B2UL, 0xFE8A50AD9E8684CDUL }, /*06*/
new ulong[] { 0x3D3DD0C829EA9AA0UL, 0x3E77597EEC96C7A3UL, 0x8FD038231E7F1684UL, 0x64617B131FB7EDE0UL, 0x85C99CE4C5405874UL, 0xA58735D41F19C5E3UL }, /*07*/
new ulong[] { 0x8028628ACAF91B9AUL, 0x194A640538C97064UL, 0x04A15E018A4F1680UL, 0xF4BE1B04C2360955UL, 0xDFB24D4CEF581A20UL, 0x3C59D0A0FD15879DUL }, /*08*/
new ulong[] { 0x88F8E2ECE78AF1BCUL, 0xB46B6E22297364C2UL, 0x9339F17F926B99F3UL, 0x31293489B3B8F07CUL, 0x3909CE1649C9BCF1UL, 0x0C46103BFA31BCE9UL }, /*09*/
new ulong[] { 0x4D1A0B8CC7EFE2A9UL, 0xAFD7878CAD55E871UL, 0xC89CFBC858CF4153UL, 0xC4739486C74F75D6UL, 0x0BF7192C130AC9F2UL, 0x0084F2BC5E81BD9AUL }, /*0A*/
new ulong[] { 0x4AFBE975014FCACFUL, 0x41DEAF8CFACC41E4UL, 0x3C1EC23B53ED16E9UL, 0x78B06EB30F1C3248UL, 0xDD11165D04285C72UL, 0x6546D9B5609491E4UL }, /*0B*/
new ulong[] { 0xFFD1E2E04DC8D260UL, 0x07B186948A74ECCEUL, 0xB5120E45121AC531UL, 0xBD0BC86330810C85UL, 0xDE93AFDDDB487730UL, 0x78DEB0DE6EB99196UL }, /*0C*/
new ulong[] { 0x79BAA2AC3FDEBA55UL, 0xB1B7E3E1C92A567EUL, 0xA53F69AB4A5B0794UL, 0xF0DA7499954F6DDDUL, 0x58117C89E1132248UL, 0xD95DF5F794C51A6EUL }, /*0D*/
new ulong[] { 0x89BC8A0C65091C33UL, 0xB04EEAEE063135C2UL, 0xF53267E04AB6E689UL, 0xB4C579B7207E8BF2UL, 0x3FD31E51343CD2DFUL, 0x119E523E2F8197FEUL }, /*0E*/
new ulong[] { 0x2E10CB1C6060F32DUL, 0xBC92E732A94E6B63UL, 0xF3220D831FD04267UL, 0x502C5F7414BCE87FUL, 0x89E0651DE91D2457UL, 0x759E56B04482D915UL }, /*0F*/
new ulong[] { 0x43AEE32C6A84E803UL, 0x0C5007202C0BD7E3UL, 0xB4F464474205D32AUL, 0x7D17FC95DE386C06UL, 0xE8DFBF64567AA545UL, 0x55BD889D5853046FUL }, /*10*/
new ulong[] { 0x687ABE14EAB8DA27UL, 0x397B3AB50D72C344UL, 0x505EAA6D1FDE618DUL, 0x61BE79865DA13F69UL, 0x17BBAB29B5E90E2DUL, 0x010C921972FA8B2FUL }, /*11*/
new ulong[] { 0x8B7223A4F56FF453UL, 0x291B7B5CB98B6FE1UL, 0xFD421625786FBF7DUL, 0xE33D1020D0E8CDC8UL, 0xCA530C708B739E87UL, 0x878AF1F304B8A12FUL }, /*12*/
new ulong[] { 0x7ECE1F24E56DD711UL, 0x2E0869241B2FA6DFUL, 0x84B834DCC459B2FDUL, 0xE022EDA6319E7D3BUL, 0x59839D8CA03C9928UL, 0x644790F491BBC774UL }, /*13*/
new ulong[] { 0xCBDC6F49E6B0DD0DUL, 0x44BA2F8D00346732UL, 0x86BCC821586AE61CUL, 0xC7B7491285CEE55BUL, 0xED3912FFD97F3851UL, 0xF4AF0186BEBEBCBFUL }, /*14*/
new ulong[] { 0xCA8A48E54ECCE516UL, 0xBEDF1864B7F8F506UL, 0xD56A1F60A4B36AA4UL, 0x49B25AB5FE0DD9D9UL, 0x21377DBB5E49FCE1UL, 0x708F64F5D59D99E7UL }, /*15*/
new ulong[] { 0xE9F873A569AFE02CUL, 0xDA66BC05CA997390UL, 0x8C88174756D35385UL, 0xEAAAF16CF4FDA730UL, 0xB39F7A55653A3512UL, 0xF10AB727BC23E852UL }, /*16*/
new ulong[] { 0x93E96FF8C5BBE2AFUL, 0xA47785420253E97CUL, 0x704B25D1F77D074CUL, 0xC0B2093F1470559CUL, 0x8D5BFDD4E364AACFUL, 0x550518673F5B1BF7UL }, /*17*/
new ulong[] { 0x8DAC832E5BE81ACBUL, 0x588BFB202B7583D8UL, 0xA34D8A70DFD1D7E4UL, 0xD03B0627B687033EUL, 0xE3D0BE7EDBDC75CFUL, 0x818EE8C5B09F8BEAUL }, /*18*/
new ulong[] { 0x8E3B02E1489D7D31UL, 0x5336752B64E3B532UL, 0xE4D4CC795C580A65UL, 0x6DAB08F313ED767EUL, 0x8E567E88FDBA36BFUL, 0x259490F1D8E933D0UL }, /*19*/
new ulong[] { 0xEAB437D0D62CAA62UL, 0xC090AD28B982B003UL, 0xE255D768D25704ECUL, 0xA048511AF6256A43UL, 0xE79F078F4D498B5FUL, 0xC41735FB75B357FEUL }, /*1A*/
new ulong[] { 0x70DA9FC3504FF29DUL, 0xB9AB1F388673FF25UL, 0x36922F4CD17357BAUL, 0xF09C3AB292E7E04AUL, 0x90CE0BC3D9BA13ECUL, 0x647C4CA63C918DE3UL }, /*1B*/
new ulong[] { 0xD834A38DD1ECD688UL, 0xA97A0020DE46AB6AUL, 0x9CDEC7F6E62EA71FUL, 0x288A5A6FD74DC47EUL, 0xD44A2E2765CE50F1UL, 0xBB9B50B5DB9E4F3CUL }, /*1C*/
new ulong[] { 0xC66DA90E41DDF2E6UL, 0x5A3FE86F160C5C09UL, 0x6F6AF0405108CCBEUL, 0xF938382EB627FC7FUL, 0x163DD634617F006CUL, 0x5184B1FEDC908497UL }, /*1D*/
new ulong[] { 0xC95719ED07FCB21CUL, 0x5112DF043F6EE7EBUL, 0x50F9FD60012334CEUL, 0x589FA85104D96579UL, 0xB7129E44D71905A7UL, 0x3314766E0733528DUL }, /*1E*/
new ulong[] { 0xDC6C8014C5457CB8UL, 0xD635FDCD286A69B6UL, 0xD66F232CE27D01BFUL, 0x56AF4AC0F682EC0FUL, 0x57DF1D55B64328F5UL, 0x651ED4C52A87CACAUL }, /*1F*/
new ulong[] { 0x26D9D1CC79EEC502UL, 0x69BF340A34B1EBFEUL, 0xFAA5AAAC8E397174UL, 0xD0A8F9BD426BCF6FUL, 0x5B131F464D6D2452UL, 0x122DD15660D0D6DAUL }, /*20*/
new ulong[] { 0x6E389AEC5F51A22FUL, 0x7EF68F1C54C127FBUL, 0x986D4D46E0485C30UL, 0xF0A47B39E7CF8A31UL, 0x1D398DFDB7F2A78FUL, 0x2FC651D1FBB10D2EUL }, /*21*/
new ulong[] { 0xA44E4E8D1B49DCB0UL, 0x07A4822049C2F343UL, 0xC40AC04A8D6505BAUL, 0xD9B91D3F0729B16CUL, 0xAAF39951B50F9015UL, 0x966EF5D3AD3F9076UL }, /*22*/
new ulong[] { 0xEA78CBAC0EB6D009UL, 0xA0FEA6725A23DEABUL, 0xCE729C7444CB94D9UL, 0x40A994626627AA0DUL, 0x37F738CDE3D018D5UL, 0x4C29491C01CDB3C5UL }, /*23*/
new ulong[] { 0x7C9792AEA745C87AUL, 0xD1FF5620C5BD8FD4UL, 0x9ECA84E3004B56B9UL, 0x5AFD3923C228B1D6UL, 0xE5DBF79EB3FD283BUL, 0x441712E354084B9FUL }, /*24*/
new ulong[] { 0xE35D288BD8E249BCUL, 0x91776C1453A366E5UL, 0xF5D1E1684E95EFECUL, 0x9108E117D7DDF606UL, 0x81B30F9DA2CE7C8CUL, 0x6497DBD786818C0DUL }, /*25*/
new ulong[] { 0xC2F891FF45044BE0UL, 0x75A1A76D2B87E2EBUL, 0x85CE65798AF3C2BFUL, 0x213F532B4EFD09DCUL, 0x0DAA1DF5A53A6C88UL, 0x3028606A50D826B2UL }, /*26*/
new ulong[] { 0x609A62616379F33AUL, 0xA339A3BC53E4516DUL, 0xD7AD92616A5ADBECUL, 0xD043726D86E924AAUL, 0x8555B564F4C29865UL, 0x56AA12AB31C1D6B0UL }, /*27*/
new ulong[] { 0xCED9ED85C1C17BFFUL, 0xEB522325ACBAFFC2UL, 0x04D3D8F4B2D15394UL, 0xD271504C04756EEAUL, 0x2DDBA4A91AF827F1UL, 0x1F67D5C28F8002E4UL }, /*28*/
new ulong[] { 0x8B9C08AD432DC08FUL, 0x5A7543E29796BBC7UL, 0x34A6DB5B3C1967DEUL, 0x016E3BC2A2804EE4UL, 0x5B9BCACCE5172F75UL, 0x7549598B80ADBDBAUL }, /*29*/
new ulong[] { 0x6F3FB117C5CDD155UL, 0x16C3B0A59CD6EEC5UL, 0xD9A1A411DE538769UL, 0x938C54979F4AC37CUL, 0x3737BCC1D55284DBUL, 0x6CAD9F8AF9156BB7UL }, /*2A*/
new ulong[] { 0xEBBF284F9C75EBDFUL, 0xB383EBB406753DE8UL, 0xAA86127AEE7C403CUL, 0x10BFDD10523DE027UL, 0x138BF6C4EB4A8A13UL, 0xB1EFF67DDB78B067UL }, /*2B*/
new ulong[] { 0xF6D1138D7AA3DA5EUL, 0xBAA8098D8FB66371UL, 0xDAE76D1B8B6CAAF2UL, 0x400F1034368D1EDCUL, 0x7C937F5172E8D277UL, 0x7D05BBF83CADE6EFUL }, /*2C*/
new ulong[] { 0x0E9C2EA6CF34B081UL, 0x9036B30D58F60BA0UL, 0xDB3A2C5848F08BCAUL, 0xC87AD1B94250D564UL, 0x7C892E09EEF96166UL, 0x26DB85CF571085F3UL }, /*2D*/
new ulong[] { 0x251EE3F58718C12AUL, 0xF9438D81178A2AE4UL, 0xF0929A889039A8A8UL, 0xF06B65225EBDCCFDUL, 0x2E4D14EDF7BF73C6UL, 0xA9369895BC1DFACFUL }, /*2E*/
new ulong[] { 0xCAE302B41D6979CBUL, 0xBBFA5A58B51EE623UL, 0x5113B99DC81AB52FUL, 0x6093795BEC17A056UL, 0x8F71FB4D2E5E355EUL, 0x762F92EDBA34A2F2UL }, /*2F*/
new ulong[] { 0xD130015265A4D9FFUL, 0x09BEA253D71F26C8UL, 0x81B6EAEDC46521E6UL, 0xFAE268165682B8A9UL, 0xA89C3EC4774AB623UL, 0x0D2E45E055219DB2UL }, /*30*/
new ulong[] { 0x2B560284C3A692ABUL, 0x37008AD0B379A7B8UL, 0xAF11CD2C30F90BFCUL, 0x7FE87A250F2762EDUL, 0xC3FBD711647242C3UL, 0x74ED8264F6B322BDUL }, /*31*/
new ulong[] { 0x28195CC8A7AD3943UL, 0x53CBE808464C4FC4UL, 0xD58E3D7A765F8726UL, 0xD83052F60185AA4FUL, 0xEFCB0D85223BB4E7UL, 0x5A31305E787FAC28UL }, /*32*/
new ulong[] { 0x725D0EE230F19543UL, 0x9091D2C6BDDF34E0UL, 0xE3BE49C6C2754601UL, 0x61BE300BA4AD566BUL, 0x02D79D7551FA7CC1UL, 0x6543910F5F1CDA58UL }, /*33*/
new ulong[] { 0x4099ADC44481B43FUL, 0xFE1361922FD9EB81UL, 0xA989C09E441FCEACUL, 0x449B3A13D3CB9019UL, 0x45A9BE396F201134UL, 0xDC1AD05A046633FEUL }, /*34*/
new ulong[] { 0x1A563A6D522F3E69UL, 0xBE589E079F475A9EUL, 0x75A2A9638E4C0038UL, 0xDA3B6202577A0362UL, 0x211D3F1E0D727AF6UL, 0x5E1FFC529AD99233UL }, /*35*/
new ulong[] { 0x47B61E86C6D6D01BUL, 0x437D6F83ADADC318UL, 0xD5A361028DED738CUL, 0xA00D4C630425164BUL, 0x1A69AFA5AF4C9DD2UL, 0xF99E1C67F951B582UL }, /*36*/
new ulong[] { 0xA66A7740B6BDEA79UL, 0xFEF7FF1496AF80A3UL, 0x05AFD43EEACD898CUL, 0xB00C78ED31AD7134UL, 0x0ED31A1AD7846673UL, 0x74B96844161499BEUL }, /*37*/
new ulong[] { 0x46FA8D6CCBF6D12EUL, 0x31C2FC147F303956UL, 0x707F4401DE5F067FUL, 0x3AE5FEC7E33594E9UL, 0x28E39F8A63531714UL, 0xB7B329EA1E9FCAB2UL }, /*38*/
new ulong[] { 0xEFD8F755825C7804UL, 0x1F5A93870BD30CD1UL, 0xEFBF894671FF8716UL, 0x28ED617FF22BDA58UL, 0x411289CCAE5CB62EUL, 0x95DD42F41801F2F9UL }, /*39*/
new ulong[] { 0xA8525B8645FC59E1UL, 0x75E62DC00A5F7F0CUL, 0x09C56785210416ACUL, 0x50EF76E9B30D7626UL, 0x2B3B2CDC19F5D665UL, 0xA41297CD11D8F4FFUL }, /*3A*/
new ulong[] { 0xEAC99A649EEE5039UL, 0xA593C92F143C0065UL, 0xB314735203071206UL, 0xEA2761A0C764A4ECUL, 0x02AA7FD46CAC25B3UL, 0xC68CC182A96D03BFUL }, /*3B*/
new ulong[] { 0xB2873F024EC83CA8UL, 0x97470AB8FD8853EBUL, 0x18FE15C159B305BDUL, 0xB0AB08F687EAEAFDUL, 0x510A3FDE73602E43UL, 0x03E1B84DCCF0FCF0UL }, /*3C*/
new ulong[] { 0xD85BBBDC8033C0D8UL, 0x9223D9C39CA9F34FUL, 0x7D3BCB6D5B63C3FDUL, 0x1C30F974DA0C0FB5UL, 0x8B24BC9EBEFB5143UL, 0xC58954925B7B84FCUL }, /*3D*/
new ulong[] { 0x6ABD7C2E0844D7A7UL, 0xCCF2EA456CDF530DUL, 0xE8938CF52B3921B8UL, 0xBA023CA2F281657CUL, 0xEC635DA675D1EDAEUL, 0xB4AA52F22EE1BE6CUL }, /*3E*/
new ulong[] { 0x981C3AC677CB5904UL, 0x6A92B54C84877B49UL, 0x745BA6BB40C55815UL, 0xB7AF550D22A371EDUL, 0xD5E8BD87C65F5374UL, 0x67874A37F0F538F5UL }, /*3F*/
new ulong[] { 0xC23BBA2A9DECC021UL, 0x4E610E930B0E3450UL, 0x1A681AA91477577EUL, 0x38A3209714EDC376UL, 0x0FD15563EEEB4AB6UL, 0x7D57668A01D42178UL }, /*40*/
new ulong[] { 0x6AF88CE145A098B5UL, 0x1AEB858CD88B8B46UL, 0xE8B733AFB8E2D6E8UL, 0x313FAA8C10A7EBFAUL, 0x127D375E77557CEAUL, 0x96BDA2F70B2F2155UL }, /*41*/
new ulong[] { 0xEC8903978FAFB636UL, 0xC7213C425C079763UL, 0x760384036AB6D17CUL, 0xE0C63A26385F1F49UL, 0x299877D6811A6DF5UL, 0x876F90FC5304B88DUL }, /*42*/
new ulong[] { 0xA6FABBC2D6E0BA16UL, 0x9B70C9640080E6BCUL, 0x29B2D5265598B27BUL, 0x4A9657C726E4397EUL, 0xA801CCC6766678D5UL, 0x800EF7CC72619998UL }, /*43*/
new ulong[] { 0x235931A8CF5490BFUL, 0xE798F98E0E8F879FUL, 0xC6EEE29C38F30CA7UL, 0x929A79F2D53E0024UL, 0x88F2E12749587A45UL, 0x0B85B28F38891965UL }, /*44*/
new ulong[] { 0x165E0303E4A4D827UL, 0x67994F42D1E8436AUL, 0xE6CC8BCF6E130D1BUL, 0x50101711709DDEFCUL, 0x373BDEC40CD05328UL, 0x40B274A4AA5109F6UL }, /*45*/
new ulong[] { 0xA9F88BA008FDF8C8UL, 0xECC897E3476EE05AUL, 0xBCE290AB69D57A74UL, 0xFA44DB1811E3115DUL, 0x6267AEFD64480C88UL, 0x2697D04A2D3AECEBUL }, /*46*/
new ulong[] { 0xC0782AF2ABCD3313UL, 0x02BA1290F2F96273UL, 0x63C82F1A56ADC2B9UL, 0x10F8E8C03EFE51C4UL, 0xE3EB348625CCAFFDUL, 0x93D607969CB8E7AEUL }, /*47*/
new ulong[] { 0xCC6E179443E58FBCUL, 0xD21C93C655A7B8EEUL, 0x2B9834A31F2B8BA4UL, 0xC83B69516025ECEEUL, 0x9176EB7B427AAE94UL, 0x8CB65B9E30B7A76EUL }, /*48*/
new ulong[] { 0xC1A33A0AD6EDD989UL, 0x18B3C5D95813B5F7UL, 0xB024BD263B359A8BUL, 0xC8C17C2216A99B50UL, 0x71F9A11D58237729UL, 0x3AA67C7618284290UL }, /*49*/
new ulong[] { 0x99B7465E09201C7BUL, 0x9AF89FA01CA4FA81UL, 0xFC2EC63E761AD123UL, 0xE2A9A39585B17D14UL, 0x08394DE529F94E81UL, 0x479448E69794FAA4UL }, /*4A*/
new ulong[] { 0x23CA3D1C4CBDCABBUL, 0xE3265436CE1A37E4UL, 0x1BBF10F69E8A4CC9UL, 0x05A66708048F5C4DUL, 0xE259DCDD9C5BFEFEUL, 0x439E65FAFD936EFDUL }, /*4B*/
new ulong[] { 0xA24D73B6978F719CUL, 0x3F53F343CCB0BB8EUL, 0xBE3C72769EE07C6AUL, 0xFACB9E539CF558DDUL, 0x67B91D4E30DE986AUL, 0x1DB913D11698913AUL }, /*4C*/
new ulong[] { 0x98BD4E140DC3C3C6UL, 0x142B1592BF3263E8UL, 0xCDBEAC59ED095B0EUL, 0x900763F0F625896AUL, 0xE213550F30324E39UL, 0x8A13A4417A803195UL }, /*4D*/
new ulong[] { 0x2ACD98ED8C626073UL, 0x1CAAA6B4C4CF3238UL, 0x04DCB41EB677EB5DUL, 0xF88B5844A8105B68UL, 0x981D9E951A061A4DUL, 0xBC9471894C878EDBUL }, /*4E*/
new ulong[] { 0x4959FEAD5D6C2DBDUL, 0x6ABD59E28C503049UL, 0x06D2C5494CAF8B34UL, 0x70E4541304A4293CUL, 0x520F3416CAF2F503UL, 0xB23D09D92613DB85UL }, /*4F*/
new ulong[] { 0x26B5A815C32D1791UL, 0x2C99E7555BB033C6UL, 0x09CE9D6A0002514FUL, 0xD485282B2B8D7997UL, 0x9C5B792F4A4A14C6UL, 0x851D9D02DC0BB4E7UL }, /*50*/
new ulong[] { 0x62FEB6CACFB060ECUL, 0x9D977D69D5C661EAUL, 0xBF08EFD806D81556UL, 0x25F1EEA460EA5718UL, 0xA25346B51F5A9665UL, 0xD92F9ADC358CA274UL }, /*51*/
new ulong[] { 0x27E63DFC63E8FFA6UL, 0xCDB9CCE2CE99FDA3UL, 0x979D5B754974830DUL, 0x3298C8407D6693BEUL, 0x629D5FADA39B42B7UL, 0x2654D31271CD84E1UL }, /*52*/
new ulong[] { 0xAB1FA4DAF66E583CUL, 0xEEB6B7A236D24766UL, 0xA90738CDFDF5C6B3UL, 0x28CBA9E5648E2D4CUL, 0xFDE5BF6C0CFE0DA3UL, 0x9D00B863D7D78485UL }, /*53*/
new ulong[] { 0x75FBBF094EEA16AAUL, 0x48931F027CD729F2UL, 0x5D360679009B2E7FUL, 0xDDFCD148BD3DE21AUL, 0x4DBFF544B094D0E1UL, 0x9C0E5C6294352C22UL }, /*54*/
new ulong[] { 0x283A27FF968853D2UL, 0xB0960C6CEA0D03F2UL, 0x172BBA07A473DB38UL, 0x688C87D296E6F4BBUL, 0x5CB7E9BC5D68CF0FUL, 0x57A5D71B0E47BFB4UL }, /*55*/
new ulong[] { 0xDE0108AAC1E4FF2FUL, 0xD346CFABEAC62B99UL, 0xB72E203F98B5F608UL, 0x81853D8CA54B29BEUL, 0xA6AED7C89FAA1680UL, 0xD2093B155C39D7EDUL }, /*56*/
new ulong[] { 0x0BAEAC99D4974B84UL, 0xC7F258A699C9B4DAUL, 0x6F622C5E4ACCF5C1UL, 0x58AB397D9781BEAAUL, 0xBF811F67E101FFE3UL, 0xAFBCC2881C3C0EF3UL }, /*57*/
new ulong[] { 0x26B211FB518D6C3EUL, 0x64BADAD51A10784AUL, 0xE6BE4E06A587186CUL, 0xD471F5C61343CD5CUL, 0x8389BB0DD6AAED5DUL, 0xC88112678914A17DUL }, /*58*/
new ulong[] { 0x2B2D0BC3BB88D27DUL, 0xC5A7D1FAFF517AD2UL, 0x96F39056A09F82ADUL, 0xFB38A61A6CED4D4EUL, 0x9D308E4EA6F9B264UL, 0x9097CE294AECC6B3UL }, /*59*/
new ulong[] { 0x8FCA2B950690B1A2UL, 0x293EFCBF03D422DFUL, 0x8C9125B3E76353ABUL, 0x3D402092A1A70173UL, 0x9BAB974CAB9BF676UL, 0x5EA8FCC55D8C586EUL }, /*5A*/
new ulong[] { 0x408C92E8C2E1EC8CUL, 0x4AF4C914B71B4350UL, 0x5186AEE0CDFB1069UL, 0x2385EAFAB9657C67UL, 0xF708E4D3C898CA80UL, 0x1EC8B9F89884907EUL }, /*5B*/
new ulong[] { 0x46E8958B6A2C1878UL, 0x2172FD410F78A647UL, 0x9D8E9DD83A299004UL, 0x390913C3265AD025UL, 0xD231F1E23077CBF1UL, 0xE7EE3E574E80D7F3UL }, /*5C*/
new ulong[] { 0x5A8567A3D85E40B2UL, 0x16ECF161133FCF73UL, 0x52DA5C6FBA3C0DD7UL, 0x56E57983DEB34BFBUL, 0x83254FDCB768D153UL, 0x9A14F95F35C6B82DUL }, /*5D*/
new ulong[] { 0x498A29C6E19D4AE6UL, 0x2EF4AAF46027BA11UL, 0xBDBA7DAA84F39505UL, 0x940B2A04F6DC944DUL, 0x4E7ED35610FC0D53UL, 0xBADD94C2907E59E1UL }, /*5E*/
new ulong[] { 0x14DF0FC43F475F80UL, 0x17E2AA8D264BF82FUL, 0x92625BDFE58B934DUL, 0x8384F415A4ACEA81UL, 0x8E9C5EAEC5D8642BUL, 0x4D8EF55F1C826687UL }, /*5F*/
new ulong[] { 0x4A2335C4F77128D9UL, 0x544E1476D29ABA94UL, 0x654EC86321785044UL, 0xB04AD9B02F80445AUL, 0xB0E01B6480C8D020UL, 0x596E325E88A3CBBFUL }, /*60*/
new ulong[] { 0x896955157448D062UL, 0x0DB08C4C0F236D68UL, 0x3BA8FC5B3CD1C4A2UL, 0x04F57C53E144535BUL, 0xB7D04DCC7BE46840UL, 0x4BBE993192334646UL }, /*61*/
new ulong[] { 0x1D7837E6AB02CE27UL, 0x3EA35BAED4493EA4UL, 0xD1CAFDB5DF94FABEUL, 0x98B580BB62170C4FUL, 0xC3C57A6CA9421C43UL, 0x68D65FC2C1201634UL }, /*62*/
new ulong[] { 0xFAEABABC48717536UL, 0x454251E8F62F7315UL, 0xB318E8A7FDCDC523UL, 0x7C2E832013C91344UL, 0x4D9E5DAFD1699052UL, 0x12262E8C870537A7UL }, /*63*/
new ulong[] { 0x8A3E5D0BEF8402A2UL, 0xA33BC5FAFA019909UL, 0x63CBE8ACD00762F5UL, 0xEA26A3F181984178UL, 0x6EEB78D1BB4AF6BBUL, 0x7ECF9671300E845FUL }, /*64*/
new ulong[] { 0x0811B67CCCF5D0FCUL, 0x9F8CAB3F3496BD6BUL, 0x57CB7D24F1355C2DUL, 0x58218594165BDE80UL, 0xFAF3368A653A78F8UL, 0xC04CD80176267762UL }, /*65*/
new ulong[] { 0xE6417CE75AAA23B0UL, 0x34A7BFE3CBA61761UL, 0x8C13E396F8C9B6EDUL, 0x5C9066464B09ED63UL, 0x76CB6A642C5CE283UL, 0x498E082A3EB449C6UL }, /*66*/
new ulong[] { 0x6F2ADEA6357B5AA0UL, 0x54DA382B15557B69UL, 0x302BD81946237AAEUL, 0x8F0CBB82111EFEDCUL, 0x45DD2DADCE20F2D3UL, 0x8A77A5E9E8A2D1D8UL }, /*67*/
new ulong[] { 0xE1EC332735862A28UL, 0x92B68B1A7E9C7C44UL, 0xF45618DC99E963E3UL, 0x7CAC984502DD1A73UL, 0xC8650598CD70840DUL, 0x9A5DA584A26D4EFDUL }, /*68*/
new ulong[] { 0x16B19B010740C15CUL, 0xB4544AC01016439AUL, 0x221F749C9E2F99A5UL, 0xA63E8A279A65570FUL, 0xC7231669ADD072ADUL, 0xC5BC35BA740BC801UL }, /*69*/
new ulong[] { 0x6C44E75A4F378694UL, 0xD27ACE108A577647UL, 0x17C487FAFA7E15D6UL, 0x6A3654D5C8E29EDFUL, 0x0CE35EEDCC611FFAUL, 0xD88A8C03C0095093UL }, /*6A*/
new ulong[] { 0xCF106948BC4B1F2CUL, 0x91C0DC9990B99712UL, 0x193B21E3E109AB32UL, 0x3340DE0608DD1666UL, 0x8A5BB677BF602828UL, 0x402C410B1197B771UL }, /*6B*/
new ulong[] { 0xEB080FF49CA5543EUL, 0xB4B9429542D6CA27UL, 0x5999D45DC1533205UL, 0xF7EA9E398A1BEF3EUL, 0xBE8817775476DEC6UL, 0x17064D7790C84100UL }, /*6C*/
new ulong[] { 0xF3328E9150A7F8D6UL, 0x52E3E61B04ACFDF8UL, 0x51D82010F3CEB015UL, 0x59D673336676D5D8UL, 0x4CB3BCEF1D91C342UL, 0x0C589AB58033BE49UL }, /*6D*/
new ulong[] { 0x54B8E70EDCE03855UL, 0x7BB590E99687FD57UL, 0x6CFF08688D2B1FDDUL, 0xFD0F6D068BFE994FUL, 0xEB9BCE302489AE44UL, 0x66B21F200661E3E4UL }, /*6E*/
new ulong[] { 0x2F5E0060189669ADUL, 0x473AF1D03C00CAE4UL, 0x0278299268D1F3B4UL, 0x888714BC3A7EC9D2UL, 0x9FF9C7F071EBD2D9UL, 0x875A5DC25DFFDB10UL }, /*6F*/
new ulong[] { 0xE2A97A3E468399D8UL, 0x3BF7EACA32C80DA1UL, 0x13DCAC8EB6C2231DUL, 0x227EC90E1102EE97UL, 0xB2344832F0381434UL, 0x8613888303B190EBUL }, /*70*/
new ulong[] { 0x3A3D3B6CE026BFFEUL, 0x18D4953B9A68ED59UL, 0x24BB7B574AB777A0UL, 0xE0CB7DD64983DCB1UL, 0xCF768C439869AC97UL, 0x8062BC7A900E6033UL }, /*71*/
new ulong[] { 0x39D4C3B78A7A33C7UL, 0x43D72EF22AB0B4EBUL, 0x54AE8184DDA50394UL, 0x0C2A7DA083C38536UL, 0x9DBC6F921D4AD822UL, 0x2CBB61FE182EAA42UL }, /*72*/
new ulong[] { 0xD8CE9A806C0BD24DUL, 0xF69D65A65845727CUL, 0xC3FF81CC76F2B048UL, 0x76B1FDC3CA67CE58UL, 0xCED0970AFBCBE78AUL, 0x57502941B726F5F3UL }, /*73*/
new ulong[] { 0xE006AEC17FCEFCF9UL, 0x05CAA1629E003591UL, 0xB7050CC99F585312UL, 0x669260401E159490UL, 0x8442D25AA757CC5AUL, 0x228655CD4038770CUL }, /*74*/
new ulong[] { 0x93EE8D67D3F1F3A1UL, 0xBEA46D48DBF8D7F4UL, 0x3C91F02B8646453CUL, 0x6C3D7C1F04188A58UL, 0xEFA97287F89CEF84UL, 0xCB40364E108BFF4BUL }, /*75*/
new ulong[] { 0xC6DCE3730D4FF825UL, 0x02AF54F87D972790UL, 0x7D69D20F6F4F788FUL, 0x90C255C64C166E8FUL, 0xA3529FBF4BF9C9A2UL, 0x3ECEC41136694F6BUL }, /*76*/
new ulong[] { 0x3DE10A5EC6CA7B3FUL, 0x7E196081D085ACAAUL, 0xDF5F0DE3705D60F7UL, 0x393E7C83DCC57075UL, 0xA5F33BC2DCB98F97UL, 0x0AEB7F050D1204C0UL }, /*77*/
new ulong[] { 0x6F3B3B3D11A8BC05UL, 0xB52269AB2B95B8DCUL, 0x12EDE24EB1385F13UL, 0x202BBA6B5836B5E1UL, 0xEE3636C5925ACC49UL, 0x42224CF6EEB509BFUL }, /*78*/
new ulong[] { 0x5F0CC3BBC4BE9A92UL, 0x584313FCCC54DD2EUL, 0xC11FE90F00394036UL, 0x3371667C72FC9723UL, 0x9611990B62AC8D9FUL, 0x4CFCB9EB3C317FADUL }, /*79*/
new ulong[] { 0xCA8E520A894A3FBAUL, 0xBD9ED1B80098CC40UL, 0xBDF24507DFF3757CUL, 0x47AEC572E68D35ECUL, 0xF3D4523D27B373E4UL, 0x1AB11E16973A05ABUL }, /*7A*/
new ulong[] { 0xFFC293A6C26B817DUL, 0x2C9E9D134959D828UL, 0x7FA5216408199BBFUL, 0xA6F002DE0DCCD861UL, 0xBE8F9DC57F2CF35DUL, 0x1352E2DF86A47647UL }, /*7B*/
new ulong[] { 0x84B55BE101708E74UL, 0x3ADEC53721209F3EUL, 0xB18F9A1E68DFADBDUL, 0x09A050819774CF2DUL, 0xE4AB295D380A8762UL, 0xA3605B0C689C239FUL }, /*7C*/
new ulong[] { 0xDDC7031FBFDFFE8FUL, 0x0B175DE65B832F0AUL, 0x31162ABC65719685UL, 0x51215E534BBC36B1UL, 0x9F2F7D3B5D01AE44UL, 0xCF43A2426E83B61BUL }, /*7D*/
new ulong[] { 0x7E32DB672B16F04AUL, 0xCE6F45DE0E6AB788UL, 0x25718548B8E70B41UL, 0xD7368BCF39A0FAC4UL, 0x956863EC49880C47UL, 0x720E335796341674UL }, /*7E*/
new ulong[] { 0x06707A8E33D9D6C6UL, 0xB684BFE26CD576C6UL, 0x44F47E5ECD5FC46CUL, 0xAF1B23A856D844B7UL, 0x98A627916AC5657EUL, 0x040C3964A1127E19UL }, /*7F*/
new ulong[] { 0xA5DAEC3134C0A39BUL, 0x0CA04160BD5ADB1FUL, 0xB50EC5A9F29E1ACBUL, 0xBE2FA1126AF7BFAFUL, 0xBEFC0AC4C9C5A4B3UL, 0x994739C71FB1EB29UL }, /*80*/
new ulong[] { 0x6FEC2D343E83A763UL, 0x5BDBA5715757F50CUL, 0xD6F6282EE46A11B3UL, 0xA8B501F5922A5524UL, 0xA782A21006B605CAUL, 0xA10BD2E896975C81UL }, /*81*/
new ulong[] { 0xB8AAE0532226D0EDUL, 0x891831C0470E84B7UL, 0x74C824D648E8FF28UL, 0xB5E4E02EAD3906EBUL, 0x5ABB086ADA60A713UL, 0xA80C57666A9E29F1UL }, /*82*/
new ulong[] { 0x529E3E52B1E7230AUL, 0x0C148861C9F08E26UL, 0x0CFC8A131BAD803DUL, 0x8C09F324902FAA9FUL, 0x0231EE4987999848UL, 0x3B0688492E2B5457UL }, /*83*/
new ulong[] { 0xEFA6EAC5036814CDUL, 0x02773C1F8DAA5DF5UL, 0x0E4EEDBD0702DE31UL, 0xBA7FD757D0D740EFUL, 0xA8805F0C74005F8BUL, 0x1448467BFF3E1EF8UL }, /*84*/
new ulong[] { 0x2A07B766016AC70DUL, 0x64215C35364219E9UL, 0xCD6F7EFE35FCF6F1UL, 0xF05CC06084C29267UL, 0xAB3BF2F32579A444UL, 0xAC75F42D9A25B9C9UL }, /*85*/
new ulong[] { 0xEF3A14B5EDDB8464UL, 0x2314E0802D2DD0E9UL, 0x14DEAEA9F928762AUL, 0x5763EBB480E15A02UL, 0x25F7CA14E8CDF5E6UL, 0x8E594510DC61E6BCUL }, /*86*/
new ulong[] { 0xE62C38DCFD21000BUL, 0x7BB32AE917EE3DA7UL, 0xE49F15E24CC9B656UL, 0x56E28259DCA361D8UL, 0xB43B8008A9285F48UL, 0x0DC6B4AF7E4AE61BUL }, /*87*/
new ulong[] { 0x703C64241142DCAEUL, 0x732D33342C45063AUL, 0x37877EA1624567CBUL, 0x2871D534614DD114UL, 0xE748092A1D94F5D1UL, 0x4524056F0C6D1CB7UL }, /*88*/
new ulong[] { 0xE325B1823A595DF9UL, 0x742D0DD5C96F397CUL, 0x44361C9540A9F451UL, 0x02382F9BF6331FB9UL, 0x8ECBAFBBE91A0467UL, 0x528EBF3811F904A8UL }, /*89*/
new ulong[] { 0xFD2BC6534631FB0DUL, 0x27A5F036FEEB9A6CUL, 0xD0F876D7911D0775UL, 0x12EFB3A29C6E0B72UL, 0xDC4BCA3D5E871DA1UL, 0x028FB6E6E608F46FUL }, /*8A*/
new ulong[] { 0xEF17ECC8930A7B4AUL, 0x9D97B34672FB273DUL, 0xC6AE835F35A25D8FUL, 0x6C27469530C21F5BUL, 0x2FBC16A26150E795UL, 0x02AD93AAE0B5C71AUL }, /*8B*/
new ulong[] { 0x6D24BE43CF07DD56UL, 0x63681D62A38D2A2FUL, 0x9872C9B411724AA0UL, 0xB882B4857C19690AUL, 0x87B1BA8D2804C6F4UL, 0xD7B199CC36F40B49UL }, /*8C*/
new ulong[] { 0xEEFB8D8573FD9E0FUL, 0x933403199B91560AUL, 0xFF0DB41665D5248CUL, 0x322EE105EA984196UL, 0xDB8CE0F83890D89BUL, 0x3A32F8983C901F80UL }, /*8D*/
new ulong[] { 0x082CDAF93F215BACUL, 0x67C118A1B9274FACUL, 0xAF74501CFB93198AUL, 0x53525CABA0E812D3UL, 0xC9AF3A005EFE8A6EUL, 0xF242DCB60DA7B2FEUL }, /*8E*/
new ulong[] { 0xD3887FBFBB7314DFUL, 0xDDDCCCF0F720C342UL, 0xB2C4331C33C8C415UL, 0x1666010767F4785BUL, 0x8455B7C1FD5DE487UL, 0xA821C5EA181875F2UL }, /*8F*/
new ulong[] { 0x7E289831418562F0UL, 0x2AD12E3042B185C3UL, 0x7C20D0D735A6AE96UL, 0xA68BEF98E22CBD41UL, 0xA1411D22F8D93243UL, 0xD813FB404F3D2F38UL }, /*90*/
new ulong[] { 0xE13FC0A76F664294UL, 0x7E21C9D9F7FDDDCBUL, 0x161E68B366D6B1F8UL, 0x55BF957EB5743874UL, 0xB23213EF8364D766UL, 0x529BB98AF96643D4UL }, /*91*/
new ulong[] { 0x036D7ADDAADB5C33UL, 0x0525835F802D032EUL, 0x7DF7D0D8D7A2BEF2UL, 0x84927644B27696B7UL, 0x215E21E4D1F9B5B9UL, 0x77743669C40EB7FDUL }, /*92*/
new ulong[] { 0xA9B3534BE8897784UL, 0x5BFD4283541A5090UL, 0x97AFFCCD121C9778UL, 0xC146C4C9637989C7UL, 0x0820E72FCBDA59C7UL, 0x5526E2F4A0AE4F4FUL }, /*93*/
new ulong[] { 0xA4739E20FD72BDC2UL, 0x6D6EE5A5C1A54CA6UL, 0x70A97A6FCB884E5CUL, 0x2B6108339E979C48UL, 0x93A63730D6BB23A7UL, 0x5B1DCEAB00045EE5UL }, /*94*/
new ulong[] { 0x427C14E4F88C8BDBUL, 0x1D8630868E039BC2UL, 0x33DB40A251502D1BUL, 0xE043C9CCB45D2B3DUL, 0x292B67B6EE077B2DUL, 0x1C3A2FBDE24C742AUL }, /*95*/
new ulong[] { 0x3DED69F37016D86AUL, 0x9A947B13AC66D7C3UL, 0x822D8645DF4CB39CUL, 0x2BA20F98F19E10DAUL, 0x6703138D422AC4C4UL, 0x8D34D6138FA04A1DUL }, /*96*/
new ulong[] { 0x28E59C8B257D112CUL, 0x8747068CC5499FCFUL, 0xD6C16EB780F9191AUL, 0xB416151633F7AF08UL, 0xA230E00D6BA1A1C3UL, 0xFD066FB9965B83D2UL }, /*97*/
new ulong[] { 0x70F4BC1B7F8FFC37UL, 0x38DC0331E56B0FDCUL, 0xA9AB7290AD2B0BBDUL, 0xB307973C3D0783C6UL, 0xBDC455F6CDCA111FUL, 0x23F0E08317B8F0DCUL }, /*98*/
new ulong[] { 0x0AEEC24E9285C50FUL, 0x3BCDA47833B61ACEUL, 0x839986F959EE0723UL, 0xC959034A8D7F5EB9UL, 0xD4AD7E05B05C4FB5UL, 0x6C37A3D39F7A0EC4UL }, /*99*/
new ulong[] { 0x0227B7230FBF2D07UL, 0x28D7D2AD632BED47UL, 0x07BD8F8B5012EFD0UL, 0x48A0D43AE0403442UL, 0x9B8939207F1449A1UL, 0x351EAD01B9FDF219UL }, /*9A*/
new ulong[] { 0xA7119D2E311CEF25UL, 0x1E532CD0C4ED0479UL, 0x2272F878D8D30A0BUL, 0x769C412CED9C4C42UL, 0x262FFBFA65CBDDF5UL, 0xDB73D86721EA368EUL }, /*9B*/
new ulong[] { 0x4BDBE90B3FBADCB2UL, 0x1324EC3A8D6FEA57UL, 0x6D9EFBE530850D00UL, 0x401A88AFF8A4C8F4UL, 0x655CB76B8A2E271CUL, 0x35505B6DBDE16F43UL }, /*9C*/
new ulong[] { 0x6E15E57E23F57037UL, 0x4962737362C1FA26UL, 0xC962372D1829B80BUL, 0xA1FE6832EA4D6211UL, 0x6726E307F96E7763UL, 0x04C761081677505BUL }, /*9D*/
new ulong[] { 0x42E2FF3A8A6FC164UL, 0xFB85B2BC9D28B268UL, 0xC559CFF024533A28UL, 0x2EC83F3911DAB3CEUL, 0xAE0FC74A9D736A27UL, 0xDB9CDD048BAB4CCFUL }, /*9E*/
new ulong[] { 0xD79C52221D20E765UL, 0x499EDD73903CE704UL, 0x9B016D987DF48349UL, 0xFCFAB44AD12FC5C1UL, 0x811293F3B800FDF9UL, 0x511DC619CA53CEBEUL }, /*9F*/
new ulong[] { 0xA059EE78B826EDDFUL, 0x4673AF294D17C85AUL, 0x5E527D4E4DF282B5UL, 0xDB5B9A2693F95CE3UL, 0x6551D304FB54F296UL, 0xAB3EB70D65912FCCUL }, /*A0*/
new ulong[] { 0x7D0C4F67B6C78135UL, 0x390CAEA7DE304D37UL, 0x49E19FABC8D494FEUL, 0x1A9E1B6437A04516UL, 0x886CC4BDAB6AF35AUL, 0x0529217344F502FEUL }, /*A1*/
new ulong[] { 0x3CEDF34141B52CEEUL, 0x8133BA924753573FUL, 0xCB32BE22BC66025AUL, 0x0C480183DE403CB3UL, 0xBF5B84B427DFCF31UL, 0x7251428DB0232156UL }, /*A2*/
new ulong[] { 0x86FCE831C58E25CBUL, 0x5CC43FFE45CBFC75UL, 0x33877CC042F199BEUL, 0x1212FA7F0CC22E1CUL, 0x448EAB4B7D1F9823UL, 0xA7B1363A9FA7599EUL }, /*A3*/
new ulong[] { 0x2D8C2FEDA0E5106DUL, 0x192E366838BBEB3FUL, 0x36226AA60ACEA0AFUL, 0xE7E1285DC1F3926AUL, 0x900371FA1883D9ECUL, 0xBAC33B1AF360EB66UL }, /*A4*/
new ulong[] { 0xD4A2A11612BDE0E3UL, 0x82AB0DA614CB4CB8UL, 0x189A4D50AC01F4C6UL, 0xE36A5DA1D9F6A647UL, 0xE43120D6B16B11B6UL, 0x7D395F4236E75378UL }, /*A5*/
new ulong[] { 0xC0C155CD47F3877FUL, 0x4B03BFE5C334CA71UL, 0x77710F1F4B844FF7UL, 0x3443BBAB720E8DC5UL, 0xF03F8868C5863406UL, 0x0FD60511C872EB50UL }, /*A6*/
new ulong[] { 0x8C253DAAB5286306UL, 0x9AA438F54A6196ACUL, 0x181D08C723A22C5EUL, 0x633C49C88E3910A1UL, 0xC9F54A67992675B0UL, 0x1FDD98ACBD38D976UL }, /*A7*/
new ulong[] { 0xA10893DA7575A9F7UL, 0x8F5F4A025AB2A018UL, 0xD80538F0336BFFC0UL, 0x0F9751D33889626FUL, 0x30383EB925BF911AUL, 0xE6149F68CE19CC60UL }, /*A8*/
new ulong[] { 0xB9081DBAC6BE0598UL, 0x785DD9BC69C71492UL, 0x8B035A0CA56E172BUL, 0x8946783500724888UL, 0xAF1E57C958650569UL, 0xE1DE4E944FF22261UL }, /*A9*/
new ulong[] { 0xEA5EDC4D2718C0D2UL, 0xCB1C5D4DA15A8AE4UL, 0xC6272382F8163015UL, 0x94A934E5057B54CEUL, 0x658E481A3D68D10DUL, 0xE8F24929E50A46A0UL }, /*AA*/
new ulong[] { 0x7DF146281AF482CDUL, 0x014B68E726407B06UL, 0x6CE564938C70DDBCUL, 0x36DAD2DE72A5DAA2UL, 0x6D573BF69C0B2980UL, 0x684DAB14B4AA0329UL }, /*AB*/
new ulong[] { 0x9C69DC064E738B5FUL, 0x83CC16BD5A1C36F5UL, 0xA99B365E6E141B12UL, 0x2748FA5AD0FACCE8UL, 0x26D073A047D99C49UL, 0xB005B182505B0C0CUL }, /*AC*/
new ulong[] { 0x15B6A2A20ED0FD1CUL, 0x9333AF729BD65A25UL, 0x22CC333293BD2C1BUL, 0xD724D949B15E8BE1UL, 0x69D0DB0512B97117UL, 0x85ACA8980DD7653CUL }, /*AD*/
new ulong[] { 0x230EC629D77BB3F2UL, 0x43115B991D297CB2UL, 0xA2F955792C53C76FUL, 0x48A76728EBE25BA7UL, 0x7CE662A405384400UL, 0xDDC06B7E6BF49D66UL }, /*AE*/
new ulong[] { 0x20DDB9BD7644410BUL, 0x056391B1FA2E8C06UL, 0xCA4EDE51CF167C00UL, 0x46602B550536F870UL, 0x5040672597C21FF4UL, 0x0AF8EC6E8AFB844BUL }, /*AF*/
new ulong[] { 0x0023C5749251B883UL, 0x335A4F86D66B7E00UL, 0xAE353DED3EFACE8FUL, 0x3FC80526D67B35DEUL, 0x0D9078FBDA80BC53UL, 0x467900DFF3FE4C14UL }, /*B0*/
new ulong[] { 0x0F9CB2BE6A448113UL, 0xE38D541B6A9A5829UL, 0x673953DAF354FC0EUL, 0x3C818A277F8569E9UL, 0x8D16EA77DB122A3BUL, 0xE40A860318B6EA84UL }, /*B1*/
new ulong[] { 0x78CE11F42D7D5E50UL, 0x84F76DFF199C998DUL, 0x999B578E3AE935CBUL, 0xD9FD092C1BE63212UL, 0x31F33C63ACD316D8UL, 0x5AA08030B8D65C0CUL }, /*B2*/
new ulong[] { 0x0098DBE19CA84FE9UL, 0xE2426617D1142137UL, 0x63C3C4166A78E21BUL, 0x74B145353E03B0E4UL, 0xF43C0824EAE508C4UL, 0x58C1E6622528602AUL }, /*B3*/
new ulong[] { 0x9E27EBE6D1426A6FUL, 0x2A6A600A6B5FA342UL, 0x8FF7E2306BA90370UL, 0xDF83D91A683EDDDDUL, 0x29572442F0225388UL, 0xE9CC0F1B6437320AUL }, /*B4*/
new ulong[] { 0x054DF380E896064EUL, 0xFAB81A4AA3AD88A4UL, 0xF87426486CCA156FUL, 0xBB1B3C8237472960UL, 0x7EC0B87CF73F960AUL, 0x5C57D7E6470F7808UL }, /*B5*/
new ulong[] { 0x5758E103AC614A1AUL, 0x766AEE86F81358DFUL, 0x203FBA51DC74396AUL, 0x78C93DF969C5721FUL, 0xE69E32E230196597UL, 0xE287C6CECD8AB95BUL }, /*B6*/
new ulong[] { 0x2A06A7C10C0DCC97UL, 0x99D5298268A6745FUL, 0xF2D818BB774858B3UL, 0xD52A820D4F64D886UL, 0x2F808EF87A263981UL, 0xBB91206E6347C676UL }, /*B7*/
new ulong[] { 0x0847C6D71CE0C746UL, 0x86FD451B447C1E11UL, 0xC20623B0E2856FCCUL, 0x3ADDFA2D0398181EUL, 0x6736A0A06B336B46UL, 0xD1C70AEEB2B1257DUL }, /*B8*/
new ulong[] { 0x5633260D141A9776UL, 0xD530805F596CA3DBUL, 0x8CE33EF69437CE46UL, 0xF62D54E97E747088UL, 0xDF5C9318489B45EAUL, 0xA4AAD29F0BA850CAUL }, /*B9*/
new ulong[] { 0xBDBD7B16767F6D9FUL, 0xF7968427F1B7B6DDUL, 0x58C76599B35276EEUL, 0x286F4C7F6CADD791UL, 0x8188C0401742117BUL, 0xCEC4F1964266D163UL }, /*BA*/
new ulong[] { 0x97E4E8A6B5135B24UL, 0x8A8BD785E5297977UL, 0x4545C1A0975BC5BBUL, 0x13FAE3BD9F59E37DUL, 0xAFD5627C0E91DE2BUL, 0xA223AC778474E1A9UL }, /*BB*/
new ulong[] { 0xDE1BF1EAF86C6B3BUL, 0xA246A3ACD50035FEUL, 0x6F80179DD96A21CDUL, 0x3F8DB7CB17300D03UL, 0x497A798B5D94506CUL, 0xAD52DCC6F61AE841UL }, /*BC*/
new ulong[] { 0xF4A4E1D08E1F440BUL, 0x5E27633CD56422E0UL, 0x1465C14F1DB41420UL, 0x9A939043988D37C2UL, 0xCBE65CFA245DB368UL, 0x6340AEDE28DDA855UL }, /*BD*/
new ulong[] { 0x1F7AB65A3F892454UL, 0xD70AB4167EBEB5A1UL, 0x9B2631E824C2028DUL, 0xD5D97BDEE31519BCUL, 0xEA2DC77449E4058CUL, 0xEB204F2D6D2FBAFFUL }, /*BE*/
new ulong[] { 0x6537E69171A2665DUL, 0x3FD2F835435A3F23UL, 0xADD5DD3E622D6C8AUL, 0xC522CDD5E5E243F8UL, 0x5AEC27F3DBFDA8A2UL, 0x477A65ED570E1445UL }, /*BF*/
new ulong[] { 0x3BA7CB01D32E9D63UL, 0x9E335734E7B5416BUL, 0x0ED96A84F94539F6UL, 0x45CEE2E46DF5A70DUL, 0xDE142EE1E9AFEC1CUL, 0x78D6121C4FDC72DDUL }, /*C0*/
new ulong[] { 0x7BB30AF653390B77UL, 0x2D394F2B7F8F7BB6UL, 0x0277A3C213AF3489UL, 0x7DF6E674DD56D084UL, 0x5643CD3073C42451UL, 0xFAB15F8BD1A1DC18UL }, /*C1*/
new ulong[] { 0x42B453ABF5150D8BUL, 0x913F109C1188E18CUL, 0xC27BB7631FB43BF9UL, 0xEBDDE685EF108419UL, 0x76D67C87C56D33EAUL, 0x95EC73C0AF40F084UL }, /*C2*/
new ulong[] { 0xBCE43D59A1F50BFBUL, 0xBA7027CA04D84600UL, 0xFB6FDB98A2BE644BUL, 0xD5DE777E993DED4AUL, 0xFCA39F1EDF710F3AUL, 0xA5E5893C858D8841UL }, /*C3*/
new ulong[] { 0xC68AC776E6AEACFCUL, 0x538067C7866106EBUL, 0xD27B4A352F4EFDE3UL, 0x847DA2B3BF01E378UL, 0x3C79E3C136926D58UL, 0xF957BC8726AA1610UL }, /*C4*/
new ulong[] { 0x95492C4203C7C612UL, 0x0DD60DB1EE8321FCUL, 0xE1D9EBA902F62B42UL, 0xEA2DBF7D0E37A4F2UL, 0xE11FB9098BF5DA48UL, 0xDBFE213F818EA338UL }, /*C5*/
new ulong[] { 0x17CB21316D4756DDUL, 0xB88952498140146AUL, 0x648112F580844288UL, 0x4947ADC3F7D58F35UL, 0x651CCE28E26A5377UL, 0x0B3803DAF337F89BUL }, /*C6*/
new ulong[] { 0xBEAB16E2DCE6B6E3UL, 0x8F39ECC8E39172DFUL, 0x607CC9553FF29C0EUL, 0x4BFD15154F4F0BA7UL, 0xEE6230B6BD408CE4UL, 0x35B654110D164E99UL }, /*C7*/
new ulong[] { 0xADDDFF1BD2C11CD4UL, 0x2A1A262CBA6E1AA0UL, 0x0BF2291D09475A46UL, 0x4C93A0ABADF4DE32UL, 0x73EE8E1327333E63UL, 0xF3AE2031F5D13B28UL }, /*C8*/
new ulong[] { 0x246C7CABB2D9A55CUL, 0x50E9C7282C1EE0F6UL, 0x2FBDA09565A0D3D7UL, 0x196552679C04A4EBUL, 0x137C66DA29A6DD82UL, 0x08A76B6B4BDA56BFUL }, /*C9*/
new ulong[] { 0x7CA3C59BE3E28610UL, 0x6ADD75CF1F7AE248UL, 0x01747450737A6435UL, 0xA1F2259CB2B4923BUL, 0xE0C8F55E8ECE7210UL, 0xD7964398F350B69BUL }, /*CA*/
new ulong[] { 0xE045864ED1825101UL, 0xAC54969193E1A1C5UL, 0x23D85A934D0794C7UL, 0xB4FA88CB734A4213UL, 0x7C5CBFD6BDA3D5F9UL, 0x66607FE938748825UL }, /*CB*/
new ulong[] { 0xBAF36FD2A180D481UL, 0xEAC440AC1B9598F7UL, 0x9AA24D80FFB7B06CUL, 0x79601F517358F163UL, 0xD1071831418BB63BUL, 0x819609A6AE7D3A03UL }, /*CC*/
new ulong[] { 0x3E9152D8CDBAE551UL, 0x86AD793F203DD016UL, 0xBE3AEB778AD4A891UL, 0x2810254DD76B6618UL, 0x9B5DCDE36636C327UL, 0x0A8AAD65868BC58CUL }, /*CD*/
new ulong[] { 0x6D0672780D93152AUL, 0xEEE705247B828091UL, 0x9EBDB976F137463FUL, 0xA7DE3E73A2D0C1BFUL, 0xF871A00BA0046AC7UL, 0x484C96A803F23486UL }, /*CE*/
new ulong[] { 0x0FC7BCDABB06BFFBUL, 0xF75C3FFB3D6309B3UL, 0xECA305D103109162UL, 0x373F503B204FFF61UL, 0xCE332C9F54963FA2UL, 0x9A4420A52242CDB4UL }, /*CF*/
new ulong[] { 0xC71D481179D198C1UL, 0x505A2845CEE92569UL, 0xF339BFF6DD6755B5UL, 0x8BEAD52B8DE89245UL, 0x4B686E65920DCA2BUL, 0x99593FA43EE68A37UL }, /*D0*/
new ulong[] { 0xD90A68D717E61501UL, 0x9BB920AEA19161A6UL, 0x2F3D6F96D90EB1E4UL, 0xDF15ECBA10513D7DUL, 0xE6E5D539B4F01831UL, 0xC7D17A7528FECE36UL }, /*D1*/
new ulong[] { 0xA04FF0BEB4EBFBAFUL, 0xE5E90A5B3DDAA3CAUL, 0x8453542209F4A145UL, 0x80A6FFD72BB5A707UL, 0x14E0C4705A1ABF6AUL, 0xD699EC1FC18A677DUL }, /*D2*/
new ulong[] { 0x7021A124E3181575UL, 0xDC7AAE2817AD945FUL, 0x8BB5521E7F0D565AUL, 0x6671D3792F0805EEUL, 0xD3888EA394413A1AUL, 0xCE4D7E47B55BF9CCUL }, /*D3*/
new ulong[] { 0x22F440263CAADE68UL, 0xE77BB287772EAC7BUL, 0x29493775962A40E9UL, 0x1E06A27FA68CB91BUL, 0xDDEF02932ABDB9C7UL, 0x79F03B88DC175233UL }, /*D4*/
new ulong[] { 0x65F6D517B53E2391UL, 0x97DB65A2F00B1C39UL, 0x1D77AE9B85AA4855UL, 0x19133B9B3E9B0771UL, 0x6376D9F11A7DB3D4UL, 0x949AD02F5AE16184UL }, /*D5*/
new ulong[] { 0xFE4434CDE09D923BUL, 0x03B0FCFD713B7052UL, 0x2D713290D4A67238UL, 0x2B56946FF629EE96UL, 0x60A15D01B2B3C428UL, 0x0B1D5EAF793933A0UL }, /*D6*/
new ulong[] { 0xBC40FCFB0E0D494BUL, 0xA31C4648C7B3D1DEUL, 0xF1113C219A07EC8DUL, 0x2378BEB1A5C2BD1CUL, 0x190CC3478070A194UL, 0x63DAB6E1CCF56329UL }, /*D7*/
new ulong[] { 0x901B6B9E82BABF91UL, 0x872A234C45D61001UL, 0x6CA46A95C1CC6D6CUL, 0x22779315E0F02295UL, 0x60A59396346BE6ACUL, 0xFB67A503CB488846UL }, /*D8*/
new ulong[] { 0x50D440F74C97660BUL, 0xE71ECABF64EDFE0CUL, 0x80201B895718CE22UL, 0xA05D89804D35D306UL, 0x8F700402A2B0D086UL, 0x326FCB334CA4DFC0UL }, /*D9*/
new ulong[] { 0xBCFBD02EA005CDD5UL, 0xF0225A4675553115UL, 0x08E18B3692A7AF62UL, 0x05D34A820C8CED0AUL, 0x51A8D7CEC33E80EAUL, 0x0AC007503FAE879CUL }, /*DA*/
new ulong[] { 0xF43EEFB5C83C521AUL, 0xE5E9B05FC48841ACUL, 0x79C52C38BF85B5F9UL, 0x26CD0818AE3BF7A9UL, 0x4F385C32CA8F5F74UL, 0xF17B22107B954752UL }, /*DB*/
new ulong[] { 0x1A48FC969198A4B0UL, 0xD9A78940BB0C4E1CUL, 0x42781D9BE60E7691UL, 0x87D1CAF3680F8A30UL, 0xD09FF193606AAF29UL, 0x4518DABC60048793UL }, /*DC*/
new ulong[] { 0xF05D48134A56A034UL, 0x89A65EEB91DC69B9UL, 0x8FC7F43960E63C62UL, 0xFA1C6B9FF9415E92UL, 0x7E219D4E56347935UL, 0x2B6A48D6DE0AEF85UL }, /*DD*/
new ulong[] { 0x1A7FF9C54B045FFDUL, 0x44A0A9562E9468B2UL, 0xF11425A22D1EBF92UL, 0x208D33120BD28E0EUL, 0xF2D74197AF80E162UL, 0xCEEDCA73DFE66C93UL }, /*DE*/
new ulong[] { 0xD57190439D29C9A4UL, 0x44C007DC2B5EAF9DUL, 0xEF6DDF48A780CEDCUL, 0x61B205E4A96024B1UL, 0x1885B6CE84C3FE5DUL, 0xB8B56986B6E2CE21UL }, /*DF*/
new ulong[] { 0xF36DACFA34237E99UL, 0xBE45EB5253BCFED0UL, 0x402C6946B8B21AC0UL, 0x2460A6FCE7E9CD67UL, 0xF89A6D5B162629FCUL, 0xF66CCEA374DB821EUL }, /*E0*/
new ulong[] { 0x16E06074DCC31A1DUL, 0xF172017AC3FA38C3UL, 0xBBC1CE4BB784ED60UL, 0xDA89A8BCE82AE671UL, 0xA6DACFFB8D26C0BBUL, 0x185181AE9609F6D6UL }, /*E1*/
new ulong[] { 0xF110DBDD94D17661UL, 0xF59FBB4CBA69F393UL, 0x463B60FB3F3C5E00UL, 0x1C60B896FE8E78ACUL, 0x5EB3E26795DE5AB6UL, 0x997328D4654D6219UL }, /*E2*/
new ulong[] { 0x21069118ABE24B61UL, 0x811CB8C48FCEFC6AUL, 0x483B032CFB56F902UL, 0xFB32E848198CC057UL, 0xA620815462A04F70UL, 0x900038D1894959E2UL }, /*E3*/
new ulong[] { 0x5AD509789BFFECD0UL, 0xDDCD5E8325F69CA0UL, 0x154D8F1ACD9B8C82UL, 0xAC7DF75E94CE3CAFUL, 0x6D6554D1B38754BEUL, 0xB5DB64AF738486E7UL }, /*E4*/
new ulong[] { 0x35A308A1AC9A43BFUL, 0x2647805AB3E6E492UL, 0x4BB74A616F61588FUL, 0xFA4602EE5BDBF54EUL, 0x3FDD62470A7174DBUL, 0x5795433CA808FAACUL }, /*E5*/
new ulong[] { 0x51A094B8774CA605UL, 0x5F07974C74EEF225UL, 0x022AFEF7AD81A953UL, 0x0967C44BBA336FD6UL, 0x8AA327918AECBA3DUL, 0xF70B8436573C3F0AUL }, /*E6*/
new ulong[] { 0xCF374F83420766C3UL, 0x71F31901A13EF07CUL, 0x63AD56C7DEF9DC0FUL, 0x9E5BB5E859F5A231UL, 0xD0BF453BB9893E4CUL, 0xA1E14B66C2719760UL }, /*E7*/
new ulong[] { 0xB41861CC73FD3E48UL, 0x461D79A138B04BE1UL, 0x4010D37D37FBA817UL, 0x7D9622AA693225A4UL, 0x2204454B8126799AUL, 0x33A5D487DCCD6EB6UL }, /*E8*/
new ulong[] { 0xD291D0317A053320UL, 0xE27678F1E50D1F76UL, 0x9A3D663A63159FC7UL, 0xAD7B4D3F67BAB452UL, 0x269CC05E2B33CE1CUL, 0x0FB8261CD734BCC3UL }, /*E9*/
new ulong[] { 0xF3D0546D3D4A25EEUL, 0xB42874AD28C9B7F2UL, 0x73EC788B29962D28UL, 0x4AE73A48132B8553UL, 0x756C99D7A0910B66UL, 0xECA7E2C2712D555CUL }, /*EA*/
new ulong[] { 0x559FA5BF24911FDDUL, 0xA1DDF5DE3770554BUL, 0xC7C3FD139366B946UL, 0x6E7ECC0C881D2BA4UL, 0x14E76D6A27E54B87UL, 0x7352D5FBC4FAB878UL }, /*EB*/
new ulong[] { 0xF19A622BED8DAC0AUL, 0x35548E5D7EFC5A2EUL, 0xCAC84974B4F057B2UL, 0xAB317ED03D0335AEUL, 0x710FC138F2C51738UL, 0x9C90CC495A403416UL }, /*EC*/
new ulong[] { 0x9FA7DEB936F10461UL, 0xA1529B0B58462F9DUL, 0x9F109111C8B9EC65UL, 0x23A3EB28444E33EAUL, 0x554084CA75118937UL, 0x599D58A7C946EAC2UL }, /*ED*/
new ulong[] { 0x6EC3AABB7856AC4EUL, 0x980E6907C1CBCCAFUL, 0x1F8557ADC700CBF5UL, 0x7DCB1CE0AF48D9F4UL, 0x7FB3DADF8199AB8AUL, 0xE6B36DB8FADBF312UL }, /*EE*/
new ulong[] { 0xC00F0D3F7A101660UL, 0x605B94B12DB6C697UL, 0x79944F7BA2B65F38UL, 0x40858ADEDD47E2BCUL, 0x1E044BDB0E9FB02BUL, 0x86C79D01A3109539UL }, /*EF*/
new ulong[] { 0x9731893D5B98482AUL, 0xFB8DE267F9790326UL, 0x8780F407143A505DUL, 0xA41CAEFCCCD3A8E3UL, 0xA042F0B3D7B7A7FEUL, 0x3E3151FEBB19A1ACUL }, /*F0*/
new ulong[] { 0xE7EDF679003A6950UL, 0xBAFC97D4A8C6AB12UL, 0x13C096B49C79559AUL, 0xC3052501434B5019UL, 0x1280FB23E7ADFB09UL, 0x1959905D31BD2FC0UL }, /*F1*/
new ulong[] { 0x575C0C46FCFCC65BUL, 0xFE625E873F34B419UL, 0x1696FDCC7F51B8A3UL, 0xC79C56F30E5AE7C0UL, 0x14E3461CD27FAD15UL, 0x1B7BCCB9CB472859UL }, /*F2*/
new ulong[] { 0x3806FE58E5CC8F16UL, 0xF8244ED76734C1BFUL, 0x4E04940E0F5DDB56UL, 0x5BD0AFDDC4158B7BUL, 0xA4C6BA949911C5C9UL, 0xFF6E2AC155AE9726UL }, /*F3*/
new ulong[] { 0x49C7C844B8114144UL, 0xB450E41BCA35CB00UL, 0x302450EC67BEF97CUL, 0xA8662049DB1E0D8BUL, 0xDA69C022528EB8FAUL, 0x6ABBF16585C1A2F7UL }, /*F4*/
new ulong[] { 0x37BB420DF67F044EUL, 0xDCC0E9F3E2EF07B3UL, 0x4D10088618777841UL, 0x0492E5379305DAAEUL, 0x3DA4791C37E4128FUL, 0x80688445CBA4EA17UL }, /*F5*/
new ulong[] { 0x51398A7CE4CF8D9DUL, 0x49A5FCD891A69CA5UL, 0x3D72A60EC2392DA5UL, 0x0E8296B879AB5539UL, 0x6BCB00AF2EDC0BDEUL, 0xBEB93848E54B3E90UL }, /*F6*/
new ulong[] { 0x7AD7C52A18922E19UL, 0x29292C57C4F5B8F5UL, 0xF0CF1F98A577C10BUL, 0x072B9F293BB660CDUL, 0x09B8604F5575B6FBUL, 0xDECB396A81B9FCDBUL }, /*F7*/
new ulong[] { 0x254AD7ADB4C220DEUL, 0x6C62E20F95A0070DUL, 0xADEB89F339309BD8UL, 0xA2F685CC178B289FUL, 0x9343905B5DEE95A5UL, 0xE0C30F34A2977C86UL }, /*F8*/
new ulong[] { 0x669CD51AF7CFBFAAUL, 0xE3E0806F6880271DUL, 0x6934C259E098BF90UL, 0x5DFEEAF0FBCA7249UL, 0x89F74B948B4118B6UL, 0x53640AEAFB6807C3UL }, /*F9*/
new ulong[] { 0xDD3BACDCC04BE120UL, 0x6D4949BD64198E51UL, 0x31FDB39666598A74UL, 0xBBBC6DE9C0C15A81UL, 0xF27F201C61C06279UL, 0x2738AFE3E84E5CDDUL }, /*FA*/
new ulong[] { 0xCDD71FD35A6411DEUL, 0x3CC012793E87523FUL, 0xB0CFF8720FCA36F3UL, 0x93E85FE07300F012UL, 0xE894A085263F090BUL, 0x2DF60A01DAFA90ECUL }, /*FB*/
new ulong[] { 0x9DA50DB1EEB4FADDUL, 0xE524E49C9974799AUL, 0xDE09FFF26A24CBB9UL, 0xAF9D71E9F3ACE7CDUL, 0xEB62B1A62566EC9DUL, 0x06D02AB1217D3553UL }, /*FC*/
new ulong[] { 0xDD31E6391AE03522UL, 0x93ACD1065B35E915UL, 0xF4EB56CC03E79218UL, 0x0717815C850C97F1UL, 0xBF4F6A8AC0540A6FUL, 0xFCF8AE5DE9507FF0UL }, /*FD*/
new ulong[] { 0xAB45B413DC50B207UL, 0x40B417369551D8D5UL, 0xCA32286A108E7210UL, 0x03225E54D8D093AFUL, 0x4B6CA5591EA576E9UL, 0x4E12AB774DC4E062UL }, /*FE*/
new ulong[] { 0xD9F4F850DF6CB96CUL, 0x8ABAD81B1667335DUL, 0xCB4079CFE79C72E5UL, 0xE5542F763E316996UL, 0x303E4B79B9D397C4UL, 0xE46933038B945111UL }, /*FF*/
new ulong[] { 0x75B15CC53B0D2502UL, 0xDA1BCA6BA0524358UL, 0x9EDA977556C06B7EUL, 0x6C57727ECF0A1325UL, 0xDC613D5A78E5C3F8UL, 0xCE062D94A3B4945AUL } /*ZZ*/
};
private static readonly ulong[][] NUHASH_RND = new ulong[][]
{
new ulong[] { 0x6A09E667F3BCC908UL, 0xB2FB1366EA957D3EUL, 0x3ADEC17512775099UL, 0xDA2F590B0667322AUL, 0x95F9060875714587UL, 0x5163FCDFB907B672UL }, /*R1*/
new ulong[] { 0x1EE950BC8738F694UL, 0xF0090E6C7BF44ED1UL, 0xA4405D0E855E3E9CUL, 0xA60B38C0237866F7UL, 0x956379222D108B14UL, 0x8C1578E45EF89C67UL }, /*R2*/
new ulong[] { 0x8DAB5147176FD3B9UL, 0x9654C68663E7909BUL, 0xEA5E241F06DCB05DUL, 0xD549411320819495UL, 0x0272956DB1FA1DFBUL, 0xE9A74059D7927C18UL }, /*R3*/
new ulong[] { 0x84C9B579AA516CA3UL, 0x719E6836DF046D8EUL, 0x0209B803FC646A5EUL, 0x6654BD3EF7B43D7FUL, 0xED437C7F9444260FUL, 0xBD40C483EF550385UL }, /*R4*/
new ulong[] { 0x83F97BBD45EFB866UL, 0x3107145D5FEBE765UL, 0xA49E94EC7F597105UL, 0xFBFC2E1FA763EF01UL, 0xF3599C82F2FE500BUL, 0x848CF0BD252AE046UL } /*R5*/
};
private static readonly byte[] NUHASH_SBX =
{
0x63, 0x7C, 0x77, 0x7B, 0xF2, 0x6B, 0x6F, 0xC5, 0x30, 0x01, 0x67, 0x2B, 0xFE, 0xD7, 0xAB, 0x76,
0xCA, 0x82, 0xC9, 0x7D, 0xFA, 0x59, 0x47, 0xF0, 0xAD, 0xD4, 0xA2, 0xAF, 0x9C, 0xA4, 0x72, 0xC0,
0xB7, 0xFD, 0x93, 0x26, 0x36, 0x3F, 0xF7, 0xCC, 0x34, 0xA5, 0xE5, 0xF1, 0x71, 0xD8, 0x31, 0x15,
0x04, 0xC7, 0x23, 0xC3, 0x18, 0x96, 0x05, 0x9A, 0x07, 0x12, 0x80, 0xE2, 0xEB, 0x27, 0xB2, 0x75,
0x09, 0x83, 0x2C, 0x1A, 0x1B, 0x6E, 0x5A, 0xA0, 0x52, 0x3B, 0xD6, 0xB3, 0x29, 0xE3, 0x2F, 0x84,
0x53, 0xD1, 0x00, 0xED, 0x20, 0xFC, 0xB1, 0x5B, 0x6A, 0xCB, 0xBE, 0x39, 0x4A, 0x4C, 0x58, 0xCF,
0xD0, 0xEF, 0xAA, 0xFB, 0x43, 0x4D, 0x33, 0x85, 0x45, 0xF9, 0x02, 0x7F, 0x50, 0x3C, 0x9F, 0xA8,
0x51, 0xA3, 0x40, 0x8F, 0x92, 0x9D, 0x38, 0xF5, 0xBC, 0xB6, 0xDA, 0x21, 0x10, 0xFF, 0xF3, 0xD2,
0xCD, 0x0C, 0x13, 0xEC, 0x5F, 0x97, 0x44, 0x17, 0xC4, 0xA7, 0x7E, 0x3D, 0x64, 0x5D, 0x19, 0x73,
0x60, 0x81, 0x4F, 0xDC, 0x22, 0x2A, 0x90, 0x88, 0x46, 0xEE, 0xB8, 0x14, 0xDE, 0x5E, 0x0B, 0xDB,
0xE0, 0x32, 0x3A, 0x0A, 0x49, 0x06, 0x24, 0x5C, 0xC2, 0xD3, 0xAC, 0x62, 0x91, 0x95, 0xE4, 0x79,
0xE7, 0xC8, 0x37, 0x6D, 0x8D, 0xD5, 0x4E, 0xA9, 0x6C, 0x56, 0xF4, 0xEA, 0x65, 0x7A, 0xAE, 0x08,
0xBA, 0x78, 0x25, 0x2E, 0x1C, 0xA6, 0xB4, 0xC6, 0xE8, 0xDD, 0x74, 0x1F, 0x4B, 0xBD, 0x8B, 0x8A,
0x70, 0x3E, 0xB5, 0x66, 0x48, 0x03, 0xF6, 0x0E, 0x61, 0x35, 0x57, 0xB9, 0x86, 0xC1, 0x1D, 0x9E,
0xE1, 0xF8, 0x98, 0x11, 0x69, 0xD9, 0x8E, 0x94, 0x9B, 0x1E, 0x87, 0xE9, 0xCE, 0x55, 0x28, 0xDF,
0x8C, 0xA1, 0x89, 0x0D, 0xBF, 0xE6, 0x42, 0x68, 0x41, 0x99, 0x2D, 0x0F, 0xB0, 0x54, 0xBB, 0x16
};
private static readonly byte[] NUHASH_FIN =
{
0xB4, 0x98, 0x0C, 0x84, 0x24, 0xF3, 0x27, 0x8F, 0xA6, 0x5E, 0xF0, 0x65, 0x86, 0xBC, 0x09, 0x92,
0x75, 0x21, 0xB9, 0x95, 0x66, 0x8A, 0x2F, 0x13, 0xB5, 0xB7, 0x6B, 0x33, 0x2A, 0xBF, 0xF7, 0x0F,
0x0A, 0xE7, 0x16, 0x30, 0x77, 0x61, 0x48, 0x90, 0xDF, 0xAF, 0x72, 0x79, 0xF6, 0xA5, 0x58, 0xD1,
0xF2, 0x40, 0x9F, 0x41, 0xE8, 0x03, 0xA1, 0x05, 0xC5, 0x35, 0xC7, 0x97, 0x54, 0x7B, 0xB3, 0xF5,
0xB8, 0xA8, 0xD8, 0x68, 0x51, 0xAD, 0xE3, 0xC2, 0x5D, 0xCF, 0xEA, 0x89, 0x37, 0xF1, 0x55, 0x60,
0xA4, 0x26, 0xAC, 0x32, 0x0E, 0xD2, 0x85, 0x6F, 0xC8, 0xDC, 0x36, 0x6D, 0xA3, 0x22, 0x5A, 0xC9,
0x5C, 0x91, 0x1B, 0x5B, 0xE9, 0x78, 0xD7, 0x44, 0xEB, 0x1A, 0xC0, 0xCA, 0x94, 0x53, 0xC4, 0x11,
0x12, 0xCC, 0xFF, 0x88, 0x0D, 0x4E, 0xB2, 0xB1, 0x4A, 0x3A, 0xE1, 0x2E, 0x0B, 0x4C, 0x5F, 0x06,
0x81, 0x31, 0xD9, 0x3D, 0xFD, 0x43, 0x67, 0x62, 0x00, 0x9C, 0x50, 0xCE, 0x6E, 0x15, 0x82, 0x29,
0x96, 0xDA, 0x87, 0xEF, 0x6C, 0xC1, 0x8B, 0x07, 0x8E, 0x17, 0xEC, 0x9A, 0xBA, 0x46, 0x04, 0x73,
0x39, 0xE4, 0x63, 0xBE, 0x64, 0x47, 0xE6, 0x3F, 0x25, 0x52, 0x59, 0xA7, 0x42, 0x38, 0x99, 0x01,
0xE5, 0x1D, 0x28, 0x7A, 0xB0, 0x7C, 0x9D, 0x56, 0xE2, 0xD6, 0xA0, 0xF4, 0x1E, 0xE0, 0xD3, 0x83,
0x6A, 0xBB, 0x18, 0x20, 0xAE, 0x57, 0xAA, 0x8D, 0x71, 0x1F, 0x34, 0x4D, 0x2D, 0x3C, 0x2B, 0xF8,
0x10, 0x7E, 0xCB, 0xFB, 0x49, 0xA2, 0x45, 0x7F, 0x3E, 0xBD, 0xC3, 0xFC, 0x14, 0x74, 0x23, 0x4F,
0x7D, 0x69, 0x93, 0x19, 0xD0, 0x1C, 0x08, 0xF9, 0xDD, 0xC6, 0x2C, 0x9E, 0xA9, 0x4B, 0xFE, 0xED,
0x76, 0xDB, 0xAB, 0xD4, 0x80, 0xCD, 0xB6, 0x8C, 0xDE, 0x70, 0x9B, 0xD5, 0xFA, 0xEE, 0x02, 0x3B
};
/* ------------------------------------------------------------------------ */
/* Mix functions */
/* ------------------------------------------------------------------------ */
[MethodImpl(MethodImplOptions.AggressiveInlining)]
private static ulong MixFunction1(ulong key)
{
key = (key ^ (key >> 31)) * 0x7FB5D329728EA185UL;
key = (key ^ (key >> 27)) * 0x81DADEF4BC2DD44DUL;
return key ^ (key >> 33);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
private static ulong MixFunction2(ulong key)
{
key = (key ^ (key >> 31)) * 0x99BCF6822B23CA35UL;
key = (key ^ (key >> 30)) * 0x14020A57ACCED8B7UL;
return key ^ (key >> 33);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
private static ulong MixFunction3(ulong key)
{
key = (key ^ (key >> 31)) * 0x69B0BC90BD9A8C49UL;
key = (key ^ (key >> 27)) * 0x3D5E661A2A77868DUL;
return key ^ (key >> 30);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
private static ulong MixFunction4(ulong key)
{
key = (key ^ (key >> 30)) * 0x16A6AC37883AF045UL;
key = (key ^ (key >> 26)) * 0xCC9C31A4274686A5UL;
return key ^ (key >> 32);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
private static ulong MixFunction5(ulong key)
{
key = (key ^ (key >> 30)) * 0xBF58476D1CE4E5B9UL;
key = (key ^ (key >> 27)) * 0x94D049BB133111EBUL;
return key ^ (key >> 31);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
private static ulong MixFunction6(ulong key)
{
key = (key ^ (key >> 30)) * 0x4BE98134A5976FD3UL;
key = (key ^ (key >> 29)) * 0x3BC0993A5AD19A13UL;
return key ^ (key >> 31);
}
/* ------------------------------------------------------------------------ */
/* Substitution function */
/* ------------------------------------------------------------------------ */
[MethodImpl(MethodImplOptions.AggressiveInlining)]
private static unsafe void SubstituteBytes(ulong* buffer)
{
fixed (byte* substPtr = NUHASH_SBX)
{
byte* bytes = (byte*)buffer;
for (int pos = 0; pos < NUHASH_BYTES; ++pos)
{
bytes[pos] = substPtr[bytes[pos]];
}
}
}
/* ------------------------------------------------------------------------ */
/* Update function */
/* ------------------------------------------------------------------------ */
[MethodImpl(MethodImplOptions.AggressiveInlining)]
private unsafe void Update(uint index)
{
fixed (ulong* buffer = m_hash)
{
fixed (ulong* rowAddr = NUHASH_XOR[index])
{
for (int round = 0; round < ROUNDS; ++round)
{
fixed (ulong* key = NUHASH_RND[round])
{
ulong initValue = buffer[0];
buffer[0] = MixFunction1(((buffer[0] << 32) | (buffer[1] >> 32)) ^ rowAddr[0] ^ key[0]);
buffer[1] = MixFunction2(((buffer[1] << 32) | (buffer[2] >> 32)) ^ rowAddr[1] ^ key[1]);
buffer[2] = MixFunction3(((buffer[2] << 32) | (buffer[3] >> 32)) ^ rowAddr[2] ^ key[2]);
buffer[3] = MixFunction4(((buffer[3] << 32) | (buffer[4] >> 32)) ^ rowAddr[3] ^ key[3]);
buffer[4] = MixFunction5(((buffer[4] << 32) | (buffer[5] >> 32)) ^ rowAddr[4] ^ key[4]);
buffer[5] = MixFunction6(((buffer[5] << 32) | (initValue >> 32)) ^ rowAddr[5] ^ key[5]);
}
SubstituteBytes(buffer);
}
}
}
}
/* ------------------------------------------------------------------------ */
/* Stream API */
/* ------------------------------------------------------------------------ */
public NuHash Reset()
{
Array.Copy(NUHASH_INI, m_hash, NUHASH_INI.Length);
m_finished = false;
return this;
}
public unsafe NuHash Update(byte* input, int length)
{
if (length < 0)
{
throw new ArgumentOutOfRangeException("Length must not be negative!");
}
CheckState();
for (int i = 0; i < length; ++i)
{
Update(input[i]);
}
return this;
}
public NuHash Update(ReadOnlySpan<byte> input)
{
if (input == null)
{
throw new ArgumentNullException("Input must not be null!");
}
unsafe
{
fixed (byte* src = input)
{
return Update(src, input.Length);
}
}
}
public NuHash Update(string input)
{
if (input == null)
{
throw new ArgumentNullException("Input must not be null!");
}
unsafe
{
fixed (char* src = input)
{
return Update((byte*)src, input.Length * sizeof(char));
}
}
}
public NuHash DoFinal(Span<byte> digestOut)
{
if (digestOut == null)
{
throw new ArgumentNullException("Output must not be null!");
}
if (digestOut.Length < NUHASH_BYTES)
{
throw new ArgumentOutOfRangeException("Output is too small to store the digest!");
}
CheckState(true);
Update(256U);
foreach (byte val in NUHASH_FIN)
{
Update(val);
}
ToByteArray(m_hash, digestOut);
return this;
}
public byte[] DoFinal()
{
byte[] result;
DoFinal(result = new byte[NUHASH_BYTES]);
return result;
}
/* ------------------------------------------------------------------------ */
/* Simple API */
/* ------------------------------------------------------------------------ */
public static unsafe byte[] Compute(byte* input, int length)
{
using (NuHash nuhash = new NuHash())
{
return nuhash.Update(input, length).DoFinal();
}
}
public static unsafe void Compute(byte* input, int length, Span<byte> digestOut)
{
using (NuHash nuhash = new NuHash())
{
nuhash.Update(input, length).DoFinal(digestOut);
}
}
public byte[] Compute(ReadOnlySpan<byte> input)
{
using (NuHash nuhash = new NuHash())
{
return nuhash.Update(input).DoFinal();
}
}
public void Compute(ReadOnlySpan<byte> input, Span<byte> digestOut)
{
using (NuHash nuhash = new NuHash())
{
nuhash.Update(input).DoFinal(digestOut);
}
}
public static byte[] Compute(string input)
{
using (NuHash nuhash = new NuHash())
{
return nuhash.Update(input).DoFinal();
}
}
public static void Compute(string input, Span<byte> digestOut)
{
using (NuHash nuhash = new NuHash())
{
nuhash.Update(input).DoFinal(digestOut);
}
}
/* ------------------------------------------------------------------------ */
/* Utilities */
/* ------------------------------------------------------------------------ */
private static readonly Lazy<Version> version = new Lazy<Version>(GetVersion);
public static Version Version
{
get
{
return version.Value;
}
}
private static Version GetVersion()
{
try
{
Version vers = Assembly.GetExecutingAssembly().GetName().Version;
if (!ReferenceEquals(vers, null))
{
return new Version(vers.Major, vers.Minor, vers.Build);
}
}
catch { }
return new Version(0, 0, 0);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
private void CheckState(bool setFlag = false)
{
if (m_finished)
{
throw new InvalidOperationException("Computation is already finished!");
}
if (setFlag)
{
m_finished = true;
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
private static void ToByteArray(ulong[] hash, Span<byte> output)
{
for (int i = 0; i < NUHASH_BYTES; ++i)
{
output[i] = (byte)(hash[i >> 3] >> (56 - ((i & 0x7) << 3)));
}
}
}
}

View File

@ -0,0 +1,21 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<Nullable>warnings</Nullable>
<PackageId>LibNuHash</PackageId>
<Description>NuHash Core Library</Description>
<Copyright>Copyright © LoRd_MuldeR &lt;MuldeR2@GMX.de&gt; 2023</Copyright>
<Company>Muldersoft.com</Company>
<Authors>LoRd_MuldeR</Authors>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
</PropertyGroup>
</Project>

View File

@ -0,0 +1,156 @@
/******************************************************************************/
/* NuHash, by LoRd_MuldeR <MuldeR2@GMX.de> */
/* This work has been released under the CC0 1.0 Universal license! */
/******************************************************************************/
using LibNuHash;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System;
using System.Numerics;
using System.Reflection;
using System.Text;
namespace LibNuHashTest
{
[TestClass]
public class NuHashTest
{
/* ------------------------------------------------------------------------ */
/* Test functions */
/* ------------------------------------------------------------------------ */
private static void RunTest(uint iterations, string expected, byte[] input)
{
using (NuHash nuhash = new NuHash())
{
for (uint iter = 0; iter < iterations; ++iter)
{
nuhash.Update(input);
}
string digest = BitConverter.ToString(nuhash.DoFinal());
Console.Out.WriteLine(string.Format("{0} - {1}", digest, expected.Equals(digest, StringComparison.OrdinalIgnoreCase) ? "OK" : "Failed!"));
Assert.AreEqual(expected, digest, true);
}
}
private static void RunTest(uint iterations, string expected, string input)
{
RunTest(iterations, expected, Encoding.UTF8.GetBytes(input));
}
/* ------------------------------------------------------------------------ */
/* Test cases */
/* ------------------------------------------------------------------------ */
[TestMethod]
public void TestMethod0()
{
ulong[][] xorTable = (ulong[][]) typeof(NuHash).GetField("NUHASH_XOR", BindingFlags.NonPublic | BindingFlags.Static).GetValue(null);
for (int i = 0; i < 257; ++i)
{
for (int j = 0; j < 257; ++j)
{
int distance = ComputeDistance(xorTable[i], xorTable[j]);
Assert.IsTrue((i == j) || (distance >= 182));
}
}
}
[TestMethod]
public void TestMethod1()
{
RunTest(
0x0000001,
"D7-96-4F-E1-BE-C2-B5-EC-F2-1E-CC-88-C8-6C-E4-F1-E8-9F-B1-EF-36-69-D5-2E-34-EB-04-9D-7F-D6-C4-2D-4B-2B-BE-EE-B7-0D-12-C3-FC-AF-43-DD-22-29-AB-C9",
""
);
}
[TestMethod]
public void TestMethod2()
{
RunTest(
0x0000001,
"B3-F1-3F-53-40-34-AE-8D-64-5D-41-0E-88-28-67-37-61-FE-2D-69-72-18-87-9F-9E-A5-28-D9-76-BA-2E-15-A3-F7-48-51-05-E6-12-B9-A4-6C-B3-98-86-35-A7-0F",
"abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"
);
}
[TestMethod]
public void TestMethod3()
{
RunTest(
0x0000001,
"63-70-34-76-F4-FF-CE-4A-8C-75-8D-0D-3B-91-A8-57-B9-A2-E3-43-3E-E8-64-F9-31-BA-32-8F-A7-24-7B-1B-0A-C9-C2-E0-27-92-43-B8-30-51-AA-FA-C6-A7-E7-10",
"abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu"
);
}
[TestMethod]
public void TestMethod4()
{
RunTest(
0x00F4240,
"C6-80-8A-EB-91-1C-88-37-CE-E2-E6-86-7E-58-9A-B2-85-26-A8-15-34-94-CF-35-A4-0C-4B-D6-E2-03-12-DA-33-CA-C4-A3-90-CD-3B-51-A2-EB-42-26-E6-0B-53-E1",
"a"
);
}
[TestMethod]
public void TestMethod5()
{
RunTest(
0x1000000,
"BC-CA-6B-C8-D1-13-DD-3F-C1-71-D7-43-AC-7A-D2-D3-E6-31-63-EA-71-07-D3-C7-85-17-CF-5B-53-EE-0B-2F-4A-0F-E0-79-E6-A7-4D-F3-50-C6-67-B7-CF-E3-CF-09",
"abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmno"
);
}
[TestMethod]
public void TestMethod6()
{
RunTest(
0x1000000,
"56-77-0E-13-3B-9E-B4-20-5F-11-82-4A-D7-28-0F-5C-31-BC-04-DD-33-3D-18-44-B3-58-9A-B8-B9-4A-B9-5D-C0-9B-77-BE-9A-81-28-D7-F1-55-FA-73-DE-61-75-97",
"g4tB,=[TU%/|8lv_c5Y?F9Sqs1PnV#bNO6DW\\0em~p<ifJhM(2&Qo}`!-*:jrZ{KGX]$zkuLd+)xwC^.\"@AIHR;y'a>3E7"
);
}
[TestMethod]
public void TestMethod7()
{
RunTest(
0x1000000,
"9A-85-79-BB-88-11-2B-2F-32-85-78-1A-61-34-8D-7B-04-A5-63-2F-EC-12-A7-3A-7E-0E-36-7A-55-67-94-A2-4A-32-CA-7B-B1-4D-A6-8E-AE-D8-3E-99-C2-F8-F4-C0",
Decode("pCxVpbBe2DPzGPunIMc01x0tRo3Kiuf8aFtU2vnDdmKpPTm/F7eyjBCiH+N0akpsepLRUuqIumvWZJae5kxHQsVR8lD0e0/ph22USyPwRRqa5JEPO7RxgpnJSeW+KJOYKtlzZVjAg0iPAxRAGyQepj/3Z6s3Bqz2ZrbdHAo1n1YV7PErfFddAu2oYxZ13JtcfQ1f/QWgbpCVhdITYQijAcjThKoJ9XBv3rkEtdswvAeO/olgJk5ZyzaGEXLixq86i3/6QTjf7i8yoSdpMSlDxJx3IUS4edCtl+DhDhkuIr2A6LH4TT7CfgyzgRLMwVPPeM481Vq7nevvzf8LJa7U")
);
}
[TestMethod]
public void TestMethod8()
{
RunTest(
0x1000000,
"FB-F4-44-4B-03-29-F5-08-BF-C6-CF-44-92-0B-31-1A-71-8E-5F-4C-4C-1A-F9-78-E7-82-23-EC-35-79-36-5F-F5-D1-5C-16-BB-5A-33-D6-9C-B3-6F-3D-40-56-47-57",
Decode("tcib0bpmKRnSMO0mW8SRTRT3FjVaaf6ZpUnxlCu83EzdT8obiJyp9nMv/T9AORPas3H03n8CPWR4ehcKk9/rnwcEeYyYuCiArR/ylmu9Rdn6LFbO8IcjIurFJ9NjryTHtwbkdYN7vy6k7/USXWCVp1MRdLSgnuOuu1VyWaad1Yltj0oMHc0q++7Xw/MlYo6wssI4PGpvTjsI1IY2GFzgHoF3+GjbWFT/l35hwFHJbOWCvs8yQwE6XlBHoTTMDXCsxkSaPhAO7APibqr8fTcxS+a2wRWLBYWKZ/mrjeGiSBzLUmV2DxohqKNCQZCS0IQJLTNf2HyxuVfo1gsg50bp")
);
}
/* ------------------------------------------------------------------------ */
/* Utilities */
/* ------------------------------------------------------------------------ */
private static int ComputeDistance(ulong[] array1, ulong[] array2)
{
Assert.AreEqual(array1.Length, array2.Length);
int distance = 0;
for (int i = 0; i < array1.Length; ++i)
{
distance += BitOperations.PopCount(array1[i] ^ array2[i]);
}
return distance;
}
private static byte[] Decode(string base64string) => Convert.FromBase64String(base64string);
}
}

View File

@ -0,0 +1,24 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<IsPackable>false</IsPackable>
<PackageId>LibNuHashTest</PackageId>
<Description>NuHash Unit Tests</Description>
<Copyright>Copyright © LoRd_MuldeR &lt;MuldeR2@GMX.de&gt; 2023</Copyright>
<Company>Muldersoft.com</Company>
<Authors>LoRd_MuldeR</Authors>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.9.4" />
<PackageReference Include="MSTest.TestAdapter" Version="2.2.3" />
<PackageReference Include="MSTest.TestFramework" Version="2.2.3" />
<PackageReference Include="coverlet.collector" Version="3.0.2" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\NuHash\NuHash.csproj" />
</ItemGroup>
</Project>

View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
<classpathentry kind="src" path="src"/>
<classpathentry kind="src" path="test"/>
<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/5"/>
<classpathentry kind="output" path="bin"/>
</classpath>

17
libnuhash/java/.project Normal file
View File

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>NuHash</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.jdt.core.javanature</nature>
</natures>
</projectDescription>

36
libnuhash/java/build.xml Normal file
View File

@ -0,0 +1,36 @@
<project default="all">
<property name="outname" value="nuhash-1.jar"/>
<property name="dir.bin" location="bin"/>
<property name="dir.out" location="out"/>
<property name="dir.src" location="src"/>
<property name="file.license" location="../../LICENSE.txt"/>
<tstamp>
<format property="today" pattern="yyyy-MM-dd HH:mm:ss"/>
</tstamp>
<target name="all" depends="clean,jar"/>
<target name="mkdir">
<mkdir dir="${dir.bin}"/>
<mkdir dir="${dir.out}"/>
</target>
<target name="clean" depends="mkdir">
<delete verbose="true" includeEmptyDirs="true"><fileset dir="${dir.bin}" includes="**/*"/></delete>
<delete verbose="true" includeEmptyDirs="true"><fileset dir="${dir.out}" includes="**/*"/></delete>
</target>
<target name="compile" depends="mkdir">
<javac srcdir="${dir.src}" destdir="${dir.bin}" target="1.8" source="1.8" includeantruntime="false"/>
</target>
<target name="jar" depends="compile">
<jar destfile="${dir.out}/${outname}" basedir="${dir.bin}">
<fileset file="${file.license}"/>
<manifest>
<attribute name="Build-Date" value="${today}"/>
</manifest>
</jar>
</target>
</project>

View File

@ -0,0 +1,504 @@
/******************************************************************************/
/* NuHash, by LoRd_MuldeR <MuldeR2@GMX.de> */
/* This work has been released under the CC0 1.0 Universal license! */
/******************************************************************************/
package com.muldersoft.nuhash;
import java.nio.ByteBuffer;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import javax.security.auth.Destroyable;
public final class NuHash implements Destroyable {
public static final int NUHASH_WORDS = 6;
public static final int NUHASH_BYTES = NUHASH_WORDS * Long.BYTES;
public static final List<Integer> VERSION = Collections.unmodifiableList(Arrays.asList(1, 0, 0));
private static final int ROUNDS = 5;
private final long[] m_hash = new long[NUHASH_WORDS];
private boolean m_finished = false;
/* ------------------------------------------------------------------------ */
/* CONSTRUCTOR */
/* ------------------------------------------------------------------------ */
public NuHash() {
reset();
}
@Override
public void destroy() {
Arrays.fill(m_hash, 0L);
}
/* ------------------------------------------------------------------------ */
/* CONST TABLES */
/* ------------------------------------------------------------------------ */
private static final long[] NUHASH_INI = new long[] {
0x243F6A8885A308D3L, 0x13198A2E03707344L, 0xA4093822299F31D0L,
0x082EFA98EC4E6C89L, 0x452821E638D01377L, 0xBE5466CF34E90C6CL
};
private static final long[][] NUHASH_XOR = new long[][] {
new long[] { 0x01DCDF00414B3037L, 0xB1B3AF661B8E96F8L, 0x944D2873DB393121L, 0x73DA9A36662AE755L, 0x1F4F318C4ECB56B1L, 0xF09743D99C2AA5BCL }, /*00*/
new long[] { 0xA81FBBC6CBBFC954L, 0x39DE43648959EDDBL, 0x1A641A0BDA01822FL, 0xB52E607266932658L, 0x2C5B1731AC802084L, 0xC2EF10671FC79DD4L }, /*01*/
new long[] { 0xCF2A8D8E08810046L, 0x8B7E9B2089E268F6L, 0x930461652C5D2DECL, 0xF096E42223BFC8B9L, 0x8DD338964CFE0970L, 0x269C342F7CEC60BDL }, /*02*/
new long[] { 0xB970A920D2ED0552L, 0x010F894A254DA7E1L, 0x8D5F205F9D1A40D8L, 0x50C33DCCC3FD5F58L, 0xB49F31BDE7D82C57L, 0x7CDE04F62A959033L }, /*03*/
new long[] { 0x49FAB2822B9C84ACL, 0x34B8648CD68CBEF1L, 0xE5121147BB4126DEL, 0xC0B31F54B2FFE00FL, 0x2F193DA38E8CC632L, 0x058C984B429B8AFCL }, /*04*/
new long[] { 0xE07F9DA44D8C9942L, 0xBE2AF9B39ACA65F2L, 0x5D3D8FB1466DC295L, 0xC0051E3EC3F962C7L, 0xF8FDC3CCD4CE2BB6L, 0x9024C0EFC6199937L }, /*05*/
new long[] { 0xA3111377EF01F5EFL, 0x31F59B366C02A3FFL, 0x61B82949760D16DCL, 0xF6B958AF92BD3BDFL, 0x7297AAEFEC69C0B2L, 0xFE8A50AD9E8684CDL }, /*06*/
new long[] { 0x3D3DD0C829EA9AA0L, 0x3E77597EEC96C7A3L, 0x8FD038231E7F1684L, 0x64617B131FB7EDE0L, 0x85C99CE4C5405874L, 0xA58735D41F19C5E3L }, /*07*/
new long[] { 0x8028628ACAF91B9AL, 0x194A640538C97064L, 0x04A15E018A4F1680L, 0xF4BE1B04C2360955L, 0xDFB24D4CEF581A20L, 0x3C59D0A0FD15879DL }, /*08*/
new long[] { 0x88F8E2ECE78AF1BCL, 0xB46B6E22297364C2L, 0x9339F17F926B99F3L, 0x31293489B3B8F07CL, 0x3909CE1649C9BCF1L, 0x0C46103BFA31BCE9L }, /*09*/
new long[] { 0x4D1A0B8CC7EFE2A9L, 0xAFD7878CAD55E871L, 0xC89CFBC858CF4153L, 0xC4739486C74F75D6L, 0x0BF7192C130AC9F2L, 0x0084F2BC5E81BD9AL }, /*0A*/
new long[] { 0x4AFBE975014FCACFL, 0x41DEAF8CFACC41E4L, 0x3C1EC23B53ED16E9L, 0x78B06EB30F1C3248L, 0xDD11165D04285C72L, 0x6546D9B5609491E4L }, /*0B*/
new long[] { 0xFFD1E2E04DC8D260L, 0x07B186948A74ECCEL, 0xB5120E45121AC531L, 0xBD0BC86330810C85L, 0xDE93AFDDDB487730L, 0x78DEB0DE6EB99196L }, /*0C*/
new long[] { 0x79BAA2AC3FDEBA55L, 0xB1B7E3E1C92A567EL, 0xA53F69AB4A5B0794L, 0xF0DA7499954F6DDDL, 0x58117C89E1132248L, 0xD95DF5F794C51A6EL }, /*0D*/
new long[] { 0x89BC8A0C65091C33L, 0xB04EEAEE063135C2L, 0xF53267E04AB6E689L, 0xB4C579B7207E8BF2L, 0x3FD31E51343CD2DFL, 0x119E523E2F8197FEL }, /*0E*/
new long[] { 0x2E10CB1C6060F32DL, 0xBC92E732A94E6B63L, 0xF3220D831FD04267L, 0x502C5F7414BCE87FL, 0x89E0651DE91D2457L, 0x759E56B04482D915L }, /*0F*/
new long[] { 0x43AEE32C6A84E803L, 0x0C5007202C0BD7E3L, 0xB4F464474205D32AL, 0x7D17FC95DE386C06L, 0xE8DFBF64567AA545L, 0x55BD889D5853046FL }, /*10*/
new long[] { 0x687ABE14EAB8DA27L, 0x397B3AB50D72C344L, 0x505EAA6D1FDE618DL, 0x61BE79865DA13F69L, 0x17BBAB29B5E90E2DL, 0x010C921972FA8B2FL }, /*11*/
new long[] { 0x8B7223A4F56FF453L, 0x291B7B5CB98B6FE1L, 0xFD421625786FBF7DL, 0xE33D1020D0E8CDC8L, 0xCA530C708B739E87L, 0x878AF1F304B8A12FL }, /*12*/
new long[] { 0x7ECE1F24E56DD711L, 0x2E0869241B2FA6DFL, 0x84B834DCC459B2FDL, 0xE022EDA6319E7D3BL, 0x59839D8CA03C9928L, 0x644790F491BBC774L }, /*13*/
new long[] { 0xCBDC6F49E6B0DD0DL, 0x44BA2F8D00346732L, 0x86BCC821586AE61CL, 0xC7B7491285CEE55BL, 0xED3912FFD97F3851L, 0xF4AF0186BEBEBCBFL }, /*14*/
new long[] { 0xCA8A48E54ECCE516L, 0xBEDF1864B7F8F506L, 0xD56A1F60A4B36AA4L, 0x49B25AB5FE0DD9D9L, 0x21377DBB5E49FCE1L, 0x708F64F5D59D99E7L }, /*15*/
new long[] { 0xE9F873A569AFE02CL, 0xDA66BC05CA997390L, 0x8C88174756D35385L, 0xEAAAF16CF4FDA730L, 0xB39F7A55653A3512L, 0xF10AB727BC23E852L }, /*16*/
new long[] { 0x93E96FF8C5BBE2AFL, 0xA47785420253E97CL, 0x704B25D1F77D074CL, 0xC0B2093F1470559CL, 0x8D5BFDD4E364AACFL, 0x550518673F5B1BF7L }, /*17*/
new long[] { 0x8DAC832E5BE81ACBL, 0x588BFB202B7583D8L, 0xA34D8A70DFD1D7E4L, 0xD03B0627B687033EL, 0xE3D0BE7EDBDC75CFL, 0x818EE8C5B09F8BEAL }, /*18*/
new long[] { 0x8E3B02E1489D7D31L, 0x5336752B64E3B532L, 0xE4D4CC795C580A65L, 0x6DAB08F313ED767EL, 0x8E567E88FDBA36BFL, 0x259490F1D8E933D0L }, /*19*/
new long[] { 0xEAB437D0D62CAA62L, 0xC090AD28B982B003L, 0xE255D768D25704ECL, 0xA048511AF6256A43L, 0xE79F078F4D498B5FL, 0xC41735FB75B357FEL }, /*1A*/
new long[] { 0x70DA9FC3504FF29DL, 0xB9AB1F388673FF25L, 0x36922F4CD17357BAL, 0xF09C3AB292E7E04AL, 0x90CE0BC3D9BA13ECL, 0x647C4CA63C918DE3L }, /*1B*/
new long[] { 0xD834A38DD1ECD688L, 0xA97A0020DE46AB6AL, 0x9CDEC7F6E62EA71FL, 0x288A5A6FD74DC47EL, 0xD44A2E2765CE50F1L, 0xBB9B50B5DB9E4F3CL }, /*1C*/
new long[] { 0xC66DA90E41DDF2E6L, 0x5A3FE86F160C5C09L, 0x6F6AF0405108CCBEL, 0xF938382EB627FC7FL, 0x163DD634617F006CL, 0x5184B1FEDC908497L }, /*1D*/
new long[] { 0xC95719ED07FCB21CL, 0x5112DF043F6EE7EBL, 0x50F9FD60012334CEL, 0x589FA85104D96579L, 0xB7129E44D71905A7L, 0x3314766E0733528DL }, /*1E*/
new long[] { 0xDC6C8014C5457CB8L, 0xD635FDCD286A69B6L, 0xD66F232CE27D01BFL, 0x56AF4AC0F682EC0FL, 0x57DF1D55B64328F5L, 0x651ED4C52A87CACAL }, /*1F*/
new long[] { 0x26D9D1CC79EEC502L, 0x69BF340A34B1EBFEL, 0xFAA5AAAC8E397174L, 0xD0A8F9BD426BCF6FL, 0x5B131F464D6D2452L, 0x122DD15660D0D6DAL }, /*20*/
new long[] { 0x6E389AEC5F51A22FL, 0x7EF68F1C54C127FBL, 0x986D4D46E0485C30L, 0xF0A47B39E7CF8A31L, 0x1D398DFDB7F2A78FL, 0x2FC651D1FBB10D2EL }, /*21*/
new long[] { 0xA44E4E8D1B49DCB0L, 0x07A4822049C2F343L, 0xC40AC04A8D6505BAL, 0xD9B91D3F0729B16CL, 0xAAF39951B50F9015L, 0x966EF5D3AD3F9076L }, /*22*/
new long[] { 0xEA78CBAC0EB6D009L, 0xA0FEA6725A23DEABL, 0xCE729C7444CB94D9L, 0x40A994626627AA0DL, 0x37F738CDE3D018D5L, 0x4C29491C01CDB3C5L }, /*23*/
new long[] { 0x7C9792AEA745C87AL, 0xD1FF5620C5BD8FD4L, 0x9ECA84E3004B56B9L, 0x5AFD3923C228B1D6L, 0xE5DBF79EB3FD283BL, 0x441712E354084B9FL }, /*24*/
new long[] { 0xE35D288BD8E249BCL, 0x91776C1453A366E5L, 0xF5D1E1684E95EFECL, 0x9108E117D7DDF606L, 0x81B30F9DA2CE7C8CL, 0x6497DBD786818C0DL }, /*25*/
new long[] { 0xC2F891FF45044BE0L, 0x75A1A76D2B87E2EBL, 0x85CE65798AF3C2BFL, 0x213F532B4EFD09DCL, 0x0DAA1DF5A53A6C88L, 0x3028606A50D826B2L }, /*26*/
new long[] { 0x609A62616379F33AL, 0xA339A3BC53E4516DL, 0xD7AD92616A5ADBECL, 0xD043726D86E924AAL, 0x8555B564F4C29865L, 0x56AA12AB31C1D6B0L }, /*27*/
new long[] { 0xCED9ED85C1C17BFFL, 0xEB522325ACBAFFC2L, 0x04D3D8F4B2D15394L, 0xD271504C04756EEAL, 0x2DDBA4A91AF827F1L, 0x1F67D5C28F8002E4L }, /*28*/
new long[] { 0x8B9C08AD432DC08FL, 0x5A7543E29796BBC7L, 0x34A6DB5B3C1967DEL, 0x016E3BC2A2804EE4L, 0x5B9BCACCE5172F75L, 0x7549598B80ADBDBAL }, /*29*/
new long[] { 0x6F3FB117C5CDD155L, 0x16C3B0A59CD6EEC5L, 0xD9A1A411DE538769L, 0x938C54979F4AC37CL, 0x3737BCC1D55284DBL, 0x6CAD9F8AF9156BB7L }, /*2A*/
new long[] { 0xEBBF284F9C75EBDFL, 0xB383EBB406753DE8L, 0xAA86127AEE7C403CL, 0x10BFDD10523DE027L, 0x138BF6C4EB4A8A13L, 0xB1EFF67DDB78B067L }, /*2B*/
new long[] { 0xF6D1138D7AA3DA5EL, 0xBAA8098D8FB66371L, 0xDAE76D1B8B6CAAF2L, 0x400F1034368D1EDCL, 0x7C937F5172E8D277L, 0x7D05BBF83CADE6EFL }, /*2C*/
new long[] { 0x0E9C2EA6CF34B081L, 0x9036B30D58F60BA0L, 0xDB3A2C5848F08BCAL, 0xC87AD1B94250D564L, 0x7C892E09EEF96166L, 0x26DB85CF571085F3L }, /*2D*/
new long[] { 0x251EE3F58718C12AL, 0xF9438D81178A2AE4L, 0xF0929A889039A8A8L, 0xF06B65225EBDCCFDL, 0x2E4D14EDF7BF73C6L, 0xA9369895BC1DFACFL }, /*2E*/
new long[] { 0xCAE302B41D6979CBL, 0xBBFA5A58B51EE623L, 0x5113B99DC81AB52FL, 0x6093795BEC17A056L, 0x8F71FB4D2E5E355EL, 0x762F92EDBA34A2F2L }, /*2F*/
new long[] { 0xD130015265A4D9FFL, 0x09BEA253D71F26C8L, 0x81B6EAEDC46521E6L, 0xFAE268165682B8A9L, 0xA89C3EC4774AB623L, 0x0D2E45E055219DB2L }, /*30*/
new long[] { 0x2B560284C3A692ABL, 0x37008AD0B379A7B8L, 0xAF11CD2C30F90BFCL, 0x7FE87A250F2762EDL, 0xC3FBD711647242C3L, 0x74ED8264F6B322BDL }, /*31*/
new long[] { 0x28195CC8A7AD3943L, 0x53CBE808464C4FC4L, 0xD58E3D7A765F8726L, 0xD83052F60185AA4FL, 0xEFCB0D85223BB4E7L, 0x5A31305E787FAC28L }, /*32*/
new long[] { 0x725D0EE230F19543L, 0x9091D2C6BDDF34E0L, 0xE3BE49C6C2754601L, 0x61BE300BA4AD566BL, 0x02D79D7551FA7CC1L, 0x6543910F5F1CDA58L }, /*33*/
new long[] { 0x4099ADC44481B43FL, 0xFE1361922FD9EB81L, 0xA989C09E441FCEACL, 0x449B3A13D3CB9019L, 0x45A9BE396F201134L, 0xDC1AD05A046633FEL }, /*34*/
new long[] { 0x1A563A6D522F3E69L, 0xBE589E079F475A9EL, 0x75A2A9638E4C0038L, 0xDA3B6202577A0362L, 0x211D3F1E0D727AF6L, 0x5E1FFC529AD99233L }, /*35*/
new long[] { 0x47B61E86C6D6D01BL, 0x437D6F83ADADC318L, 0xD5A361028DED738CL, 0xA00D4C630425164BL, 0x1A69AFA5AF4C9DD2L, 0xF99E1C67F951B582L }, /*36*/
new long[] { 0xA66A7740B6BDEA79L, 0xFEF7FF1496AF80A3L, 0x05AFD43EEACD898CL, 0xB00C78ED31AD7134L, 0x0ED31A1AD7846673L, 0x74B96844161499BEL }, /*37*/
new long[] { 0x46FA8D6CCBF6D12EL, 0x31C2FC147F303956L, 0x707F4401DE5F067FL, 0x3AE5FEC7E33594E9L, 0x28E39F8A63531714L, 0xB7B329EA1E9FCAB2L }, /*38*/
new long[] { 0xEFD8F755825C7804L, 0x1F5A93870BD30CD1L, 0xEFBF894671FF8716L, 0x28ED617FF22BDA58L, 0x411289CCAE5CB62EL, 0x95DD42F41801F2F9L }, /*39*/
new long[] { 0xA8525B8645FC59E1L, 0x75E62DC00A5F7F0CL, 0x09C56785210416ACL, 0x50EF76E9B30D7626L, 0x2B3B2CDC19F5D665L, 0xA41297CD11D8F4FFL }, /*3A*/
new long[] { 0xEAC99A649EEE5039L, 0xA593C92F143C0065L, 0xB314735203071206L, 0xEA2761A0C764A4ECL, 0x02AA7FD46CAC25B3L, 0xC68CC182A96D03BFL }, /*3B*/
new long[] { 0xB2873F024EC83CA8L, 0x97470AB8FD8853EBL, 0x18FE15C159B305BDL, 0xB0AB08F687EAEAFDL, 0x510A3FDE73602E43L, 0x03E1B84DCCF0FCF0L }, /*3C*/
new long[] { 0xD85BBBDC8033C0D8L, 0x9223D9C39CA9F34FL, 0x7D3BCB6D5B63C3FDL, 0x1C30F974DA0C0FB5L, 0x8B24BC9EBEFB5143L, 0xC58954925B7B84FCL }, /*3D*/
new long[] { 0x6ABD7C2E0844D7A7L, 0xCCF2EA456CDF530DL, 0xE8938CF52B3921B8L, 0xBA023CA2F281657CL, 0xEC635DA675D1EDAEL, 0xB4AA52F22EE1BE6CL }, /*3E*/
new long[] { 0x981C3AC677CB5904L, 0x6A92B54C84877B49L, 0x745BA6BB40C55815L, 0xB7AF550D22A371EDL, 0xD5E8BD87C65F5374L, 0x67874A37F0F538F5L }, /*3F*/
new long[] { 0xC23BBA2A9DECC021L, 0x4E610E930B0E3450L, 0x1A681AA91477577EL, 0x38A3209714EDC376L, 0x0FD15563EEEB4AB6L, 0x7D57668A01D42178L }, /*40*/
new long[] { 0x6AF88CE145A098B5L, 0x1AEB858CD88B8B46L, 0xE8B733AFB8E2D6E8L, 0x313FAA8C10A7EBFAL, 0x127D375E77557CEAL, 0x96BDA2F70B2F2155L }, /*41*/
new long[] { 0xEC8903978FAFB636L, 0xC7213C425C079763L, 0x760384036AB6D17CL, 0xE0C63A26385F1F49L, 0x299877D6811A6DF5L, 0x876F90FC5304B88DL }, /*42*/
new long[] { 0xA6FABBC2D6E0BA16L, 0x9B70C9640080E6BCL, 0x29B2D5265598B27BL, 0x4A9657C726E4397EL, 0xA801CCC6766678D5L, 0x800EF7CC72619998L }, /*43*/
new long[] { 0x235931A8CF5490BFL, 0xE798F98E0E8F879FL, 0xC6EEE29C38F30CA7L, 0x929A79F2D53E0024L, 0x88F2E12749587A45L, 0x0B85B28F38891965L }, /*44*/
new long[] { 0x165E0303E4A4D827L, 0x67994F42D1E8436AL, 0xE6CC8BCF6E130D1BL, 0x50101711709DDEFCL, 0x373BDEC40CD05328L, 0x40B274A4AA5109F6L }, /*45*/
new long[] { 0xA9F88BA008FDF8C8L, 0xECC897E3476EE05AL, 0xBCE290AB69D57A74L, 0xFA44DB1811E3115DL, 0x6267AEFD64480C88L, 0x2697D04A2D3AECEBL }, /*46*/
new long[] { 0xC0782AF2ABCD3313L, 0x02BA1290F2F96273L, 0x63C82F1A56ADC2B9L, 0x10F8E8C03EFE51C4L, 0xE3EB348625CCAFFDL, 0x93D607969CB8E7AEL }, /*47*/
new long[] { 0xCC6E179443E58FBCL, 0xD21C93C655A7B8EEL, 0x2B9834A31F2B8BA4L, 0xC83B69516025ECEEL, 0x9176EB7B427AAE94L, 0x8CB65B9E30B7A76EL }, /*48*/
new long[] { 0xC1A33A0AD6EDD989L, 0x18B3C5D95813B5F7L, 0xB024BD263B359A8BL, 0xC8C17C2216A99B50L, 0x71F9A11D58237729L, 0x3AA67C7618284290L }, /*49*/
new long[] { 0x99B7465E09201C7BL, 0x9AF89FA01CA4FA81L, 0xFC2EC63E761AD123L, 0xE2A9A39585B17D14L, 0x08394DE529F94E81L, 0x479448E69794FAA4L }, /*4A*/
new long[] { 0x23CA3D1C4CBDCABBL, 0xE3265436CE1A37E4L, 0x1BBF10F69E8A4CC9L, 0x05A66708048F5C4DL, 0xE259DCDD9C5BFEFEL, 0x439E65FAFD936EFDL }, /*4B*/
new long[] { 0xA24D73B6978F719CL, 0x3F53F343CCB0BB8EL, 0xBE3C72769EE07C6AL, 0xFACB9E539CF558DDL, 0x67B91D4E30DE986AL, 0x1DB913D11698913AL }, /*4C*/
new long[] { 0x98BD4E140DC3C3C6L, 0x142B1592BF3263E8L, 0xCDBEAC59ED095B0EL, 0x900763F0F625896AL, 0xE213550F30324E39L, 0x8A13A4417A803195L }, /*4D*/
new long[] { 0x2ACD98ED8C626073L, 0x1CAAA6B4C4CF3238L, 0x04DCB41EB677EB5DL, 0xF88B5844A8105B68L, 0x981D9E951A061A4DL, 0xBC9471894C878EDBL }, /*4E*/
new long[] { 0x4959FEAD5D6C2DBDL, 0x6ABD59E28C503049L, 0x06D2C5494CAF8B34L, 0x70E4541304A4293CL, 0x520F3416CAF2F503L, 0xB23D09D92613DB85L }, /*4F*/
new long[] { 0x26B5A815C32D1791L, 0x2C99E7555BB033C6L, 0x09CE9D6A0002514FL, 0xD485282B2B8D7997L, 0x9C5B792F4A4A14C6L, 0x851D9D02DC0BB4E7L }, /*50*/
new long[] { 0x62FEB6CACFB060ECL, 0x9D977D69D5C661EAL, 0xBF08EFD806D81556L, 0x25F1EEA460EA5718L, 0xA25346B51F5A9665L, 0xD92F9ADC358CA274L }, /*51*/
new long[] { 0x27E63DFC63E8FFA6L, 0xCDB9CCE2CE99FDA3L, 0x979D5B754974830DL, 0x3298C8407D6693BEL, 0x629D5FADA39B42B7L, 0x2654D31271CD84E1L }, /*52*/
new long[] { 0xAB1FA4DAF66E583CL, 0xEEB6B7A236D24766L, 0xA90738CDFDF5C6B3L, 0x28CBA9E5648E2D4CL, 0xFDE5BF6C0CFE0DA3L, 0x9D00B863D7D78485L }, /*53*/
new long[] { 0x75FBBF094EEA16AAL, 0x48931F027CD729F2L, 0x5D360679009B2E7FL, 0xDDFCD148BD3DE21AL, 0x4DBFF544B094D0E1L, 0x9C0E5C6294352C22L }, /*54*/
new long[] { 0x283A27FF968853D2L, 0xB0960C6CEA0D03F2L, 0x172BBA07A473DB38L, 0x688C87D296E6F4BBL, 0x5CB7E9BC5D68CF0FL, 0x57A5D71B0E47BFB4L }, /*55*/
new long[] { 0xDE0108AAC1E4FF2FL, 0xD346CFABEAC62B99L, 0xB72E203F98B5F608L, 0x81853D8CA54B29BEL, 0xA6AED7C89FAA1680L, 0xD2093B155C39D7EDL }, /*56*/
new long[] { 0x0BAEAC99D4974B84L, 0xC7F258A699C9B4DAL, 0x6F622C5E4ACCF5C1L, 0x58AB397D9781BEAAL, 0xBF811F67E101FFE3L, 0xAFBCC2881C3C0EF3L }, /*57*/
new long[] { 0x26B211FB518D6C3EL, 0x64BADAD51A10784AL, 0xE6BE4E06A587186CL, 0xD471F5C61343CD5CL, 0x8389BB0DD6AAED5DL, 0xC88112678914A17DL }, /*58*/
new long[] { 0x2B2D0BC3BB88D27DL, 0xC5A7D1FAFF517AD2L, 0x96F39056A09F82ADL, 0xFB38A61A6CED4D4EL, 0x9D308E4EA6F9B264L, 0x9097CE294AECC6B3L }, /*59*/
new long[] { 0x8FCA2B950690B1A2L, 0x293EFCBF03D422DFL, 0x8C9125B3E76353ABL, 0x3D402092A1A70173L, 0x9BAB974CAB9BF676L, 0x5EA8FCC55D8C586EL }, /*5A*/
new long[] { 0x408C92E8C2E1EC8CL, 0x4AF4C914B71B4350L, 0x5186AEE0CDFB1069L, 0x2385EAFAB9657C67L, 0xF708E4D3C898CA80L, 0x1EC8B9F89884907EL }, /*5B*/
new long[] { 0x46E8958B6A2C1878L, 0x2172FD410F78A647L, 0x9D8E9DD83A299004L, 0x390913C3265AD025L, 0xD231F1E23077CBF1L, 0xE7EE3E574E80D7F3L }, /*5C*/
new long[] { 0x5A8567A3D85E40B2L, 0x16ECF161133FCF73L, 0x52DA5C6FBA3C0DD7L, 0x56E57983DEB34BFBL, 0x83254FDCB768D153L, 0x9A14F95F35C6B82DL }, /*5D*/
new long[] { 0x498A29C6E19D4AE6L, 0x2EF4AAF46027BA11L, 0xBDBA7DAA84F39505L, 0x940B2A04F6DC944DL, 0x4E7ED35610FC0D53L, 0xBADD94C2907E59E1L }, /*5E*/
new long[] { 0x14DF0FC43F475F80L, 0x17E2AA8D264BF82FL, 0x92625BDFE58B934DL, 0x8384F415A4ACEA81L, 0x8E9C5EAEC5D8642BL, 0x4D8EF55F1C826687L }, /*5F*/
new long[] { 0x4A2335C4F77128D9L, 0x544E1476D29ABA94L, 0x654EC86321785044L, 0xB04AD9B02F80445AL, 0xB0E01B6480C8D020L, 0x596E325E88A3CBBFL }, /*60*/
new long[] { 0x896955157448D062L, 0x0DB08C4C0F236D68L, 0x3BA8FC5B3CD1C4A2L, 0x04F57C53E144535BL, 0xB7D04DCC7BE46840L, 0x4BBE993192334646L }, /*61*/
new long[] { 0x1D7837E6AB02CE27L, 0x3EA35BAED4493EA4L, 0xD1CAFDB5DF94FABEL, 0x98B580BB62170C4FL, 0xC3C57A6CA9421C43L, 0x68D65FC2C1201634L }, /*62*/
new long[] { 0xFAEABABC48717536L, 0x454251E8F62F7315L, 0xB318E8A7FDCDC523L, 0x7C2E832013C91344L, 0x4D9E5DAFD1699052L, 0x12262E8C870537A7L }, /*63*/
new long[] { 0x8A3E5D0BEF8402A2L, 0xA33BC5FAFA019909L, 0x63CBE8ACD00762F5L, 0xEA26A3F181984178L, 0x6EEB78D1BB4AF6BBL, 0x7ECF9671300E845FL }, /*64*/
new long[] { 0x0811B67CCCF5D0FCL, 0x9F8CAB3F3496BD6BL, 0x57CB7D24F1355C2DL, 0x58218594165BDE80L, 0xFAF3368A653A78F8L, 0xC04CD80176267762L }, /*65*/
new long[] { 0xE6417CE75AAA23B0L, 0x34A7BFE3CBA61761L, 0x8C13E396F8C9B6EDL, 0x5C9066464B09ED63L, 0x76CB6A642C5CE283L, 0x498E082A3EB449C6L }, /*66*/
new long[] { 0x6F2ADEA6357B5AA0L, 0x54DA382B15557B69L, 0x302BD81946237AAEL, 0x8F0CBB82111EFEDCL, 0x45DD2DADCE20F2D3L, 0x8A77A5E9E8A2D1D8L }, /*67*/
new long[] { 0xE1EC332735862A28L, 0x92B68B1A7E9C7C44L, 0xF45618DC99E963E3L, 0x7CAC984502DD1A73L, 0xC8650598CD70840DL, 0x9A5DA584A26D4EFDL }, /*68*/
new long[] { 0x16B19B010740C15CL, 0xB4544AC01016439AL, 0x221F749C9E2F99A5L, 0xA63E8A279A65570FL, 0xC7231669ADD072ADL, 0xC5BC35BA740BC801L }, /*69*/
new long[] { 0x6C44E75A4F378694L, 0xD27ACE108A577647L, 0x17C487FAFA7E15D6L, 0x6A3654D5C8E29EDFL, 0x0CE35EEDCC611FFAL, 0xD88A8C03C0095093L }, /*6A*/
new long[] { 0xCF106948BC4B1F2CL, 0x91C0DC9990B99712L, 0x193B21E3E109AB32L, 0x3340DE0608DD1666L, 0x8A5BB677BF602828L, 0x402C410B1197B771L }, /*6B*/
new long[] { 0xEB080FF49CA5543EL, 0xB4B9429542D6CA27L, 0x5999D45DC1533205L, 0xF7EA9E398A1BEF3EL, 0xBE8817775476DEC6L, 0x17064D7790C84100L }, /*6C*/
new long[] { 0xF3328E9150A7F8D6L, 0x52E3E61B04ACFDF8L, 0x51D82010F3CEB015L, 0x59D673336676D5D8L, 0x4CB3BCEF1D91C342L, 0x0C589AB58033BE49L }, /*6D*/
new long[] { 0x54B8E70EDCE03855L, 0x7BB590E99687FD57L, 0x6CFF08688D2B1FDDL, 0xFD0F6D068BFE994FL, 0xEB9BCE302489AE44L, 0x66B21F200661E3E4L }, /*6E*/
new long[] { 0x2F5E0060189669ADL, 0x473AF1D03C00CAE4L, 0x0278299268D1F3B4L, 0x888714BC3A7EC9D2L, 0x9FF9C7F071EBD2D9L, 0x875A5DC25DFFDB10L }, /*6F*/
new long[] { 0xE2A97A3E468399D8L, 0x3BF7EACA32C80DA1L, 0x13DCAC8EB6C2231DL, 0x227EC90E1102EE97L, 0xB2344832F0381434L, 0x8613888303B190EBL }, /*70*/
new long[] { 0x3A3D3B6CE026BFFEL, 0x18D4953B9A68ED59L, 0x24BB7B574AB777A0L, 0xE0CB7DD64983DCB1L, 0xCF768C439869AC97L, 0x8062BC7A900E6033L }, /*71*/
new long[] { 0x39D4C3B78A7A33C7L, 0x43D72EF22AB0B4EBL, 0x54AE8184DDA50394L, 0x0C2A7DA083C38536L, 0x9DBC6F921D4AD822L, 0x2CBB61FE182EAA42L }, /*72*/
new long[] { 0xD8CE9A806C0BD24DL, 0xF69D65A65845727CL, 0xC3FF81CC76F2B048L, 0x76B1FDC3CA67CE58L, 0xCED0970AFBCBE78AL, 0x57502941B726F5F3L }, /*73*/
new long[] { 0xE006AEC17FCEFCF9L, 0x05CAA1629E003591L, 0xB7050CC99F585312L, 0x669260401E159490L, 0x8442D25AA757CC5AL, 0x228655CD4038770CL }, /*74*/
new long[] { 0x93EE8D67D3F1F3A1L, 0xBEA46D48DBF8D7F4L, 0x3C91F02B8646453CL, 0x6C3D7C1F04188A58L, 0xEFA97287F89CEF84L, 0xCB40364E108BFF4BL }, /*75*/
new long[] { 0xC6DCE3730D4FF825L, 0x02AF54F87D972790L, 0x7D69D20F6F4F788FL, 0x90C255C64C166E8FL, 0xA3529FBF4BF9C9A2L, 0x3ECEC41136694F6BL }, /*76*/
new long[] { 0x3DE10A5EC6CA7B3FL, 0x7E196081D085ACAAL, 0xDF5F0DE3705D60F7L, 0x393E7C83DCC57075L, 0xA5F33BC2DCB98F97L, 0x0AEB7F050D1204C0L }, /*77*/
new long[] { 0x6F3B3B3D11A8BC05L, 0xB52269AB2B95B8DCL, 0x12EDE24EB1385F13L, 0x202BBA6B5836B5E1L, 0xEE3636C5925ACC49L, 0x42224CF6EEB509BFL }, /*78*/
new long[] { 0x5F0CC3BBC4BE9A92L, 0x584313FCCC54DD2EL, 0xC11FE90F00394036L, 0x3371667C72FC9723L, 0x9611990B62AC8D9FL, 0x4CFCB9EB3C317FADL }, /*79*/
new long[] { 0xCA8E520A894A3FBAL, 0xBD9ED1B80098CC40L, 0xBDF24507DFF3757CL, 0x47AEC572E68D35ECL, 0xF3D4523D27B373E4L, 0x1AB11E16973A05ABL }, /*7A*/
new long[] { 0xFFC293A6C26B817DL, 0x2C9E9D134959D828L, 0x7FA5216408199BBFL, 0xA6F002DE0DCCD861L, 0xBE8F9DC57F2CF35DL, 0x1352E2DF86A47647L }, /*7B*/
new long[] { 0x84B55BE101708E74L, 0x3ADEC53721209F3EL, 0xB18F9A1E68DFADBDL, 0x09A050819774CF2DL, 0xE4AB295D380A8762L, 0xA3605B0C689C239FL }, /*7C*/
new long[] { 0xDDC7031FBFDFFE8FL, 0x0B175DE65B832F0AL, 0x31162ABC65719685L, 0x51215E534BBC36B1L, 0x9F2F7D3B5D01AE44L, 0xCF43A2426E83B61BL }, /*7D*/
new long[] { 0x7E32DB672B16F04AL, 0xCE6F45DE0E6AB788L, 0x25718548B8E70B41L, 0xD7368BCF39A0FAC4L, 0x956863EC49880C47L, 0x720E335796341674L }, /*7E*/
new long[] { 0x06707A8E33D9D6C6L, 0xB684BFE26CD576C6L, 0x44F47E5ECD5FC46CL, 0xAF1B23A856D844B7L, 0x98A627916AC5657EL, 0x040C3964A1127E19L }, /*7F*/
new long[] { 0xA5DAEC3134C0A39BL, 0x0CA04160BD5ADB1FL, 0xB50EC5A9F29E1ACBL, 0xBE2FA1126AF7BFAFL, 0xBEFC0AC4C9C5A4B3L, 0x994739C71FB1EB29L }, /*80*/
new long[] { 0x6FEC2D343E83A763L, 0x5BDBA5715757F50CL, 0xD6F6282EE46A11B3L, 0xA8B501F5922A5524L, 0xA782A21006B605CAL, 0xA10BD2E896975C81L }, /*81*/
new long[] { 0xB8AAE0532226D0EDL, 0x891831C0470E84B7L, 0x74C824D648E8FF28L, 0xB5E4E02EAD3906EBL, 0x5ABB086ADA60A713L, 0xA80C57666A9E29F1L }, /*82*/
new long[] { 0x529E3E52B1E7230AL, 0x0C148861C9F08E26L, 0x0CFC8A131BAD803DL, 0x8C09F324902FAA9FL, 0x0231EE4987999848L, 0x3B0688492E2B5457L }, /*83*/
new long[] { 0xEFA6EAC5036814CDL, 0x02773C1F8DAA5DF5L, 0x0E4EEDBD0702DE31L, 0xBA7FD757D0D740EFL, 0xA8805F0C74005F8BL, 0x1448467BFF3E1EF8L }, /*84*/
new long[] { 0x2A07B766016AC70DL, 0x64215C35364219E9L, 0xCD6F7EFE35FCF6F1L, 0xF05CC06084C29267L, 0xAB3BF2F32579A444L, 0xAC75F42D9A25B9C9L }, /*85*/
new long[] { 0xEF3A14B5EDDB8464L, 0x2314E0802D2DD0E9L, 0x14DEAEA9F928762AL, 0x5763EBB480E15A02L, 0x25F7CA14E8CDF5E6L, 0x8E594510DC61E6BCL }, /*86*/
new long[] { 0xE62C38DCFD21000BL, 0x7BB32AE917EE3DA7L, 0xE49F15E24CC9B656L, 0x56E28259DCA361D8L, 0xB43B8008A9285F48L, 0x0DC6B4AF7E4AE61BL }, /*87*/
new long[] { 0x703C64241142DCAEL, 0x732D33342C45063AL, 0x37877EA1624567CBL, 0x2871D534614DD114L, 0xE748092A1D94F5D1L, 0x4524056F0C6D1CB7L }, /*88*/
new long[] { 0xE325B1823A595DF9L, 0x742D0DD5C96F397CL, 0x44361C9540A9F451L, 0x02382F9BF6331FB9L, 0x8ECBAFBBE91A0467L, 0x528EBF3811F904A8L }, /*89*/
new long[] { 0xFD2BC6534631FB0DL, 0x27A5F036FEEB9A6CL, 0xD0F876D7911D0775L, 0x12EFB3A29C6E0B72L, 0xDC4BCA3D5E871DA1L, 0x028FB6E6E608F46FL }, /*8A*/
new long[] { 0xEF17ECC8930A7B4AL, 0x9D97B34672FB273DL, 0xC6AE835F35A25D8FL, 0x6C27469530C21F5BL, 0x2FBC16A26150E795L, 0x02AD93AAE0B5C71AL }, /*8B*/
new long[] { 0x6D24BE43CF07DD56L, 0x63681D62A38D2A2FL, 0x9872C9B411724AA0L, 0xB882B4857C19690AL, 0x87B1BA8D2804C6F4L, 0xD7B199CC36F40B49L }, /*8C*/
new long[] { 0xEEFB8D8573FD9E0FL, 0x933403199B91560AL, 0xFF0DB41665D5248CL, 0x322EE105EA984196L, 0xDB8CE0F83890D89BL, 0x3A32F8983C901F80L }, /*8D*/
new long[] { 0x082CDAF93F215BACL, 0x67C118A1B9274FACL, 0xAF74501CFB93198AL, 0x53525CABA0E812D3L, 0xC9AF3A005EFE8A6EL, 0xF242DCB60DA7B2FEL }, /*8E*/
new long[] { 0xD3887FBFBB7314DFL, 0xDDDCCCF0F720C342L, 0xB2C4331C33C8C415L, 0x1666010767F4785BL, 0x8455B7C1FD5DE487L, 0xA821C5EA181875F2L }, /*8F*/
new long[] { 0x7E289831418562F0L, 0x2AD12E3042B185C3L, 0x7C20D0D735A6AE96L, 0xA68BEF98E22CBD41L, 0xA1411D22F8D93243L, 0xD813FB404F3D2F38L }, /*90*/
new long[] { 0xE13FC0A76F664294L, 0x7E21C9D9F7FDDDCBL, 0x161E68B366D6B1F8L, 0x55BF957EB5743874L, 0xB23213EF8364D766L, 0x529BB98AF96643D4L }, /*91*/
new long[] { 0x036D7ADDAADB5C33L, 0x0525835F802D032EL, 0x7DF7D0D8D7A2BEF2L, 0x84927644B27696B7L, 0x215E21E4D1F9B5B9L, 0x77743669C40EB7FDL }, /*92*/
new long[] { 0xA9B3534BE8897784L, 0x5BFD4283541A5090L, 0x97AFFCCD121C9778L, 0xC146C4C9637989C7L, 0x0820E72FCBDA59C7L, 0x5526E2F4A0AE4F4FL }, /*93*/
new long[] { 0xA4739E20FD72BDC2L, 0x6D6EE5A5C1A54CA6L, 0x70A97A6FCB884E5CL, 0x2B6108339E979C48L, 0x93A63730D6BB23A7L, 0x5B1DCEAB00045EE5L }, /*94*/
new long[] { 0x427C14E4F88C8BDBL, 0x1D8630868E039BC2L, 0x33DB40A251502D1BL, 0xE043C9CCB45D2B3DL, 0x292B67B6EE077B2DL, 0x1C3A2FBDE24C742AL }, /*95*/
new long[] { 0x3DED69F37016D86AL, 0x9A947B13AC66D7C3L, 0x822D8645DF4CB39CL, 0x2BA20F98F19E10DAL, 0x6703138D422AC4C4L, 0x8D34D6138FA04A1DL }, /*96*/
new long[] { 0x28E59C8B257D112CL, 0x8747068CC5499FCFL, 0xD6C16EB780F9191AL, 0xB416151633F7AF08L, 0xA230E00D6BA1A1C3L, 0xFD066FB9965B83D2L }, /*97*/
new long[] { 0x70F4BC1B7F8FFC37L, 0x38DC0331E56B0FDCL, 0xA9AB7290AD2B0BBDL, 0xB307973C3D0783C6L, 0xBDC455F6CDCA111FL, 0x23F0E08317B8F0DCL }, /*98*/
new long[] { 0x0AEEC24E9285C50FL, 0x3BCDA47833B61ACEL, 0x839986F959EE0723L, 0xC959034A8D7F5EB9L, 0xD4AD7E05B05C4FB5L, 0x6C37A3D39F7A0EC4L }, /*99*/
new long[] { 0x0227B7230FBF2D07L, 0x28D7D2AD632BED47L, 0x07BD8F8B5012EFD0L, 0x48A0D43AE0403442L, 0x9B8939207F1449A1L, 0x351EAD01B9FDF219L }, /*9A*/
new long[] { 0xA7119D2E311CEF25L, 0x1E532CD0C4ED0479L, 0x2272F878D8D30A0BL, 0x769C412CED9C4C42L, 0x262FFBFA65CBDDF5L, 0xDB73D86721EA368EL }, /*9B*/
new long[] { 0x4BDBE90B3FBADCB2L, 0x1324EC3A8D6FEA57L, 0x6D9EFBE530850D00L, 0x401A88AFF8A4C8F4L, 0x655CB76B8A2E271CL, 0x35505B6DBDE16F43L }, /*9C*/
new long[] { 0x6E15E57E23F57037L, 0x4962737362C1FA26L, 0xC962372D1829B80BL, 0xA1FE6832EA4D6211L, 0x6726E307F96E7763L, 0x04C761081677505BL }, /*9D*/
new long[] { 0x42E2FF3A8A6FC164L, 0xFB85B2BC9D28B268L, 0xC559CFF024533A28L, 0x2EC83F3911DAB3CEL, 0xAE0FC74A9D736A27L, 0xDB9CDD048BAB4CCFL }, /*9E*/
new long[] { 0xD79C52221D20E765L, 0x499EDD73903CE704L, 0x9B016D987DF48349L, 0xFCFAB44AD12FC5C1L, 0x811293F3B800FDF9L, 0x511DC619CA53CEBEL }, /*9F*/
new long[] { 0xA059EE78B826EDDFL, 0x4673AF294D17C85AL, 0x5E527D4E4DF282B5L, 0xDB5B9A2693F95CE3L, 0x6551D304FB54F296L, 0xAB3EB70D65912FCCL }, /*A0*/
new long[] { 0x7D0C4F67B6C78135L, 0x390CAEA7DE304D37L, 0x49E19FABC8D494FEL, 0x1A9E1B6437A04516L, 0x886CC4BDAB6AF35AL, 0x0529217344F502FEL }, /*A1*/
new long[] { 0x3CEDF34141B52CEEL, 0x8133BA924753573FL, 0xCB32BE22BC66025AL, 0x0C480183DE403CB3L, 0xBF5B84B427DFCF31L, 0x7251428DB0232156L }, /*A2*/
new long[] { 0x86FCE831C58E25CBL, 0x5CC43FFE45CBFC75L, 0x33877CC042F199BEL, 0x1212FA7F0CC22E1CL, 0x448EAB4B7D1F9823L, 0xA7B1363A9FA7599EL }, /*A3*/
new long[] { 0x2D8C2FEDA0E5106DL, 0x192E366838BBEB3FL, 0x36226AA60ACEA0AFL, 0xE7E1285DC1F3926AL, 0x900371FA1883D9ECL, 0xBAC33B1AF360EB66L }, /*A4*/
new long[] { 0xD4A2A11612BDE0E3L, 0x82AB0DA614CB4CB8L, 0x189A4D50AC01F4C6L, 0xE36A5DA1D9F6A647L, 0xE43120D6B16B11B6L, 0x7D395F4236E75378L }, /*A5*/
new long[] { 0xC0C155CD47F3877FL, 0x4B03BFE5C334CA71L, 0x77710F1F4B844FF7L, 0x3443BBAB720E8DC5L, 0xF03F8868C5863406L, 0x0FD60511C872EB50L }, /*A6*/
new long[] { 0x8C253DAAB5286306L, 0x9AA438F54A6196ACL, 0x181D08C723A22C5EL, 0x633C49C88E3910A1L, 0xC9F54A67992675B0L, 0x1FDD98ACBD38D976L }, /*A7*/
new long[] { 0xA10893DA7575A9F7L, 0x8F5F4A025AB2A018L, 0xD80538F0336BFFC0L, 0x0F9751D33889626FL, 0x30383EB925BF911AL, 0xE6149F68CE19CC60L }, /*A8*/
new long[] { 0xB9081DBAC6BE0598L, 0x785DD9BC69C71492L, 0x8B035A0CA56E172BL, 0x8946783500724888L, 0xAF1E57C958650569L, 0xE1DE4E944FF22261L }, /*A9*/
new long[] { 0xEA5EDC4D2718C0D2L, 0xCB1C5D4DA15A8AE4L, 0xC6272382F8163015L, 0x94A934E5057B54CEL, 0x658E481A3D68D10DL, 0xE8F24929E50A46A0L }, /*AA*/
new long[] { 0x7DF146281AF482CDL, 0x014B68E726407B06L, 0x6CE564938C70DDBCL, 0x36DAD2DE72A5DAA2L, 0x6D573BF69C0B2980L, 0x684DAB14B4AA0329L }, /*AB*/
new long[] { 0x9C69DC064E738B5FL, 0x83CC16BD5A1C36F5L, 0xA99B365E6E141B12L, 0x2748FA5AD0FACCE8L, 0x26D073A047D99C49L, 0xB005B182505B0C0CL }, /*AC*/
new long[] { 0x15B6A2A20ED0FD1CL, 0x9333AF729BD65A25L, 0x22CC333293BD2C1BL, 0xD724D949B15E8BE1L, 0x69D0DB0512B97117L, 0x85ACA8980DD7653CL }, /*AD*/
new long[] { 0x230EC629D77BB3F2L, 0x43115B991D297CB2L, 0xA2F955792C53C76FL, 0x48A76728EBE25BA7L, 0x7CE662A405384400L, 0xDDC06B7E6BF49D66L }, /*AE*/
new long[] { 0x20DDB9BD7644410BL, 0x056391B1FA2E8C06L, 0xCA4EDE51CF167C00L, 0x46602B550536F870L, 0x5040672597C21FF4L, 0x0AF8EC6E8AFB844BL }, /*AF*/
new long[] { 0x0023C5749251B883L, 0x335A4F86D66B7E00L, 0xAE353DED3EFACE8FL, 0x3FC80526D67B35DEL, 0x0D9078FBDA80BC53L, 0x467900DFF3FE4C14L }, /*B0*/
new long[] { 0x0F9CB2BE6A448113L, 0xE38D541B6A9A5829L, 0x673953DAF354FC0EL, 0x3C818A277F8569E9L, 0x8D16EA77DB122A3BL, 0xE40A860318B6EA84L }, /*B1*/
new long[] { 0x78CE11F42D7D5E50L, 0x84F76DFF199C998DL, 0x999B578E3AE935CBL, 0xD9FD092C1BE63212L, 0x31F33C63ACD316D8L, 0x5AA08030B8D65C0CL }, /*B2*/
new long[] { 0x0098DBE19CA84FE9L, 0xE2426617D1142137L, 0x63C3C4166A78E21BL, 0x74B145353E03B0E4L, 0xF43C0824EAE508C4L, 0x58C1E6622528602AL }, /*B3*/
new long[] { 0x9E27EBE6D1426A6FL, 0x2A6A600A6B5FA342L, 0x8FF7E2306BA90370L, 0xDF83D91A683EDDDDL, 0x29572442F0225388L, 0xE9CC0F1B6437320AL }, /*B4*/
new long[] { 0x054DF380E896064EL, 0xFAB81A4AA3AD88A4L, 0xF87426486CCA156FL, 0xBB1B3C8237472960L, 0x7EC0B87CF73F960AL, 0x5C57D7E6470F7808L }, /*B5*/
new long[] { 0x5758E103AC614A1AL, 0x766AEE86F81358DFL, 0x203FBA51DC74396AL, 0x78C93DF969C5721FL, 0xE69E32E230196597L, 0xE287C6CECD8AB95BL }, /*B6*/
new long[] { 0x2A06A7C10C0DCC97L, 0x99D5298268A6745FL, 0xF2D818BB774858B3L, 0xD52A820D4F64D886L, 0x2F808EF87A263981L, 0xBB91206E6347C676L }, /*B7*/
new long[] { 0x0847C6D71CE0C746L, 0x86FD451B447C1E11L, 0xC20623B0E2856FCCL, 0x3ADDFA2D0398181EL, 0x6736A0A06B336B46L, 0xD1C70AEEB2B1257DL }, /*B8*/
new long[] { 0x5633260D141A9776L, 0xD530805F596CA3DBL, 0x8CE33EF69437CE46L, 0xF62D54E97E747088L, 0xDF5C9318489B45EAL, 0xA4AAD29F0BA850CAL }, /*B9*/
new long[] { 0xBDBD7B16767F6D9FL, 0xF7968427F1B7B6DDL, 0x58C76599B35276EEL, 0x286F4C7F6CADD791L, 0x8188C0401742117BL, 0xCEC4F1964266D163L }, /*BA*/
new long[] { 0x97E4E8A6B5135B24L, 0x8A8BD785E5297977L, 0x4545C1A0975BC5BBL, 0x13FAE3BD9F59E37DL, 0xAFD5627C0E91DE2BL, 0xA223AC778474E1A9L }, /*BB*/
new long[] { 0xDE1BF1EAF86C6B3BL, 0xA246A3ACD50035FEL, 0x6F80179DD96A21CDL, 0x3F8DB7CB17300D03L, 0x497A798B5D94506CL, 0xAD52DCC6F61AE841L }, /*BC*/
new long[] { 0xF4A4E1D08E1F440BL, 0x5E27633CD56422E0L, 0x1465C14F1DB41420L, 0x9A939043988D37C2L, 0xCBE65CFA245DB368L, 0x6340AEDE28DDA855L }, /*BD*/
new long[] { 0x1F7AB65A3F892454L, 0xD70AB4167EBEB5A1L, 0x9B2631E824C2028DL, 0xD5D97BDEE31519BCL, 0xEA2DC77449E4058CL, 0xEB204F2D6D2FBAFFL }, /*BE*/
new long[] { 0x6537E69171A2665DL, 0x3FD2F835435A3F23L, 0xADD5DD3E622D6C8AL, 0xC522CDD5E5E243F8L, 0x5AEC27F3DBFDA8A2L, 0x477A65ED570E1445L }, /*BF*/
new long[] { 0x3BA7CB01D32E9D63L, 0x9E335734E7B5416BL, 0x0ED96A84F94539F6L, 0x45CEE2E46DF5A70DL, 0xDE142EE1E9AFEC1CL, 0x78D6121C4FDC72DDL }, /*C0*/
new long[] { 0x7BB30AF653390B77L, 0x2D394F2B7F8F7BB6L, 0x0277A3C213AF3489L, 0x7DF6E674DD56D084L, 0x5643CD3073C42451L, 0xFAB15F8BD1A1DC18L }, /*C1*/
new long[] { 0x42B453ABF5150D8BL, 0x913F109C1188E18CL, 0xC27BB7631FB43BF9L, 0xEBDDE685EF108419L, 0x76D67C87C56D33EAL, 0x95EC73C0AF40F084L }, /*C2*/
new long[] { 0xBCE43D59A1F50BFBL, 0xBA7027CA04D84600L, 0xFB6FDB98A2BE644BL, 0xD5DE777E993DED4AL, 0xFCA39F1EDF710F3AL, 0xA5E5893C858D8841L }, /*C3*/
new long[] { 0xC68AC776E6AEACFCL, 0x538067C7866106EBL, 0xD27B4A352F4EFDE3L, 0x847DA2B3BF01E378L, 0x3C79E3C136926D58L, 0xF957BC8726AA1610L }, /*C4*/
new long[] { 0x95492C4203C7C612L, 0x0DD60DB1EE8321FCL, 0xE1D9EBA902F62B42L, 0xEA2DBF7D0E37A4F2L, 0xE11FB9098BF5DA48L, 0xDBFE213F818EA338L }, /*C5*/
new long[] { 0x17CB21316D4756DDL, 0xB88952498140146AL, 0x648112F580844288L, 0x4947ADC3F7D58F35L, 0x651CCE28E26A5377L, 0x0B3803DAF337F89BL }, /*C6*/
new long[] { 0xBEAB16E2DCE6B6E3L, 0x8F39ECC8E39172DFL, 0x607CC9553FF29C0EL, 0x4BFD15154F4F0BA7L, 0xEE6230B6BD408CE4L, 0x35B654110D164E99L }, /*C7*/
new long[] { 0xADDDFF1BD2C11CD4L, 0x2A1A262CBA6E1AA0L, 0x0BF2291D09475A46L, 0x4C93A0ABADF4DE32L, 0x73EE8E1327333E63L, 0xF3AE2031F5D13B28L }, /*C8*/
new long[] { 0x246C7CABB2D9A55CL, 0x50E9C7282C1EE0F6L, 0x2FBDA09565A0D3D7L, 0x196552679C04A4EBL, 0x137C66DA29A6DD82L, 0x08A76B6B4BDA56BFL }, /*C9*/
new long[] { 0x7CA3C59BE3E28610L, 0x6ADD75CF1F7AE248L, 0x01747450737A6435L, 0xA1F2259CB2B4923BL, 0xE0C8F55E8ECE7210L, 0xD7964398F350B69BL }, /*CA*/
new long[] { 0xE045864ED1825101L, 0xAC54969193E1A1C5L, 0x23D85A934D0794C7L, 0xB4FA88CB734A4213L, 0x7C5CBFD6BDA3D5F9L, 0x66607FE938748825L }, /*CB*/
new long[] { 0xBAF36FD2A180D481L, 0xEAC440AC1B9598F7L, 0x9AA24D80FFB7B06CL, 0x79601F517358F163L, 0xD1071831418BB63BL, 0x819609A6AE7D3A03L }, /*CC*/
new long[] { 0x3E9152D8CDBAE551L, 0x86AD793F203DD016L, 0xBE3AEB778AD4A891L, 0x2810254DD76B6618L, 0x9B5DCDE36636C327L, 0x0A8AAD65868BC58CL }, /*CD*/
new long[] { 0x6D0672780D93152AL, 0xEEE705247B828091L, 0x9EBDB976F137463FL, 0xA7DE3E73A2D0C1BFL, 0xF871A00BA0046AC7L, 0x484C96A803F23486L }, /*CE*/
new long[] { 0x0FC7BCDABB06BFFBL, 0xF75C3FFB3D6309B3L, 0xECA305D103109162L, 0x373F503B204FFF61L, 0xCE332C9F54963FA2L, 0x9A4420A52242CDB4L }, /*CF*/
new long[] { 0xC71D481179D198C1L, 0x505A2845CEE92569L, 0xF339BFF6DD6755B5L, 0x8BEAD52B8DE89245L, 0x4B686E65920DCA2BL, 0x99593FA43EE68A37L }, /*D0*/
new long[] { 0xD90A68D717E61501L, 0x9BB920AEA19161A6L, 0x2F3D6F96D90EB1E4L, 0xDF15ECBA10513D7DL, 0xE6E5D539B4F01831L, 0xC7D17A7528FECE36L }, /*D1*/
new long[] { 0xA04FF0BEB4EBFBAFL, 0xE5E90A5B3DDAA3CAL, 0x8453542209F4A145L, 0x80A6FFD72BB5A707L, 0x14E0C4705A1ABF6AL, 0xD699EC1FC18A677DL }, /*D2*/
new long[] { 0x7021A124E3181575L, 0xDC7AAE2817AD945FL, 0x8BB5521E7F0D565AL, 0x6671D3792F0805EEL, 0xD3888EA394413A1AL, 0xCE4D7E47B55BF9CCL }, /*D3*/
new long[] { 0x22F440263CAADE68L, 0xE77BB287772EAC7BL, 0x29493775962A40E9L, 0x1E06A27FA68CB91BL, 0xDDEF02932ABDB9C7L, 0x79F03B88DC175233L }, /*D4*/
new long[] { 0x65F6D517B53E2391L, 0x97DB65A2F00B1C39L, 0x1D77AE9B85AA4855L, 0x19133B9B3E9B0771L, 0x6376D9F11A7DB3D4L, 0x949AD02F5AE16184L }, /*D5*/
new long[] { 0xFE4434CDE09D923BL, 0x03B0FCFD713B7052L, 0x2D713290D4A67238L, 0x2B56946FF629EE96L, 0x60A15D01B2B3C428L, 0x0B1D5EAF793933A0L }, /*D6*/
new long[] { 0xBC40FCFB0E0D494BL, 0xA31C4648C7B3D1DEL, 0xF1113C219A07EC8DL, 0x2378BEB1A5C2BD1CL, 0x190CC3478070A194L, 0x63DAB6E1CCF56329L }, /*D7*/
new long[] { 0x901B6B9E82BABF91L, 0x872A234C45D61001L, 0x6CA46A95C1CC6D6CL, 0x22779315E0F02295L, 0x60A59396346BE6ACL, 0xFB67A503CB488846L }, /*D8*/
new long[] { 0x50D440F74C97660BL, 0xE71ECABF64EDFE0CL, 0x80201B895718CE22L, 0xA05D89804D35D306L, 0x8F700402A2B0D086L, 0x326FCB334CA4DFC0L }, /*D9*/
new long[] { 0xBCFBD02EA005CDD5L, 0xF0225A4675553115L, 0x08E18B3692A7AF62L, 0x05D34A820C8CED0AL, 0x51A8D7CEC33E80EAL, 0x0AC007503FAE879CL }, /*DA*/
new long[] { 0xF43EEFB5C83C521AL, 0xE5E9B05FC48841ACL, 0x79C52C38BF85B5F9L, 0x26CD0818AE3BF7A9L, 0x4F385C32CA8F5F74L, 0xF17B22107B954752L }, /*DB*/
new long[] { 0x1A48FC969198A4B0L, 0xD9A78940BB0C4E1CL, 0x42781D9BE60E7691L, 0x87D1CAF3680F8A30L, 0xD09FF193606AAF29L, 0x4518DABC60048793L }, /*DC*/
new long[] { 0xF05D48134A56A034L, 0x89A65EEB91DC69B9L, 0x8FC7F43960E63C62L, 0xFA1C6B9FF9415E92L, 0x7E219D4E56347935L, 0x2B6A48D6DE0AEF85L }, /*DD*/
new long[] { 0x1A7FF9C54B045FFDL, 0x44A0A9562E9468B2L, 0xF11425A22D1EBF92L, 0x208D33120BD28E0EL, 0xF2D74197AF80E162L, 0xCEEDCA73DFE66C93L }, /*DE*/
new long[] { 0xD57190439D29C9A4L, 0x44C007DC2B5EAF9DL, 0xEF6DDF48A780CEDCL, 0x61B205E4A96024B1L, 0x1885B6CE84C3FE5DL, 0xB8B56986B6E2CE21L }, /*DF*/
new long[] { 0xF36DACFA34237E99L, 0xBE45EB5253BCFED0L, 0x402C6946B8B21AC0L, 0x2460A6FCE7E9CD67L, 0xF89A6D5B162629FCL, 0xF66CCEA374DB821EL }, /*E0*/
new long[] { 0x16E06074DCC31A1DL, 0xF172017AC3FA38C3L, 0xBBC1CE4BB784ED60L, 0xDA89A8BCE82AE671L, 0xA6DACFFB8D26C0BBL, 0x185181AE9609F6D6L }, /*E1*/
new long[] { 0xF110DBDD94D17661L, 0xF59FBB4CBA69F393L, 0x463B60FB3F3C5E00L, 0x1C60B896FE8E78ACL, 0x5EB3E26795DE5AB6L, 0x997328D4654D6219L }, /*E2*/
new long[] { 0x21069118ABE24B61L, 0x811CB8C48FCEFC6AL, 0x483B032CFB56F902L, 0xFB32E848198CC057L, 0xA620815462A04F70L, 0x900038D1894959E2L }, /*E3*/
new long[] { 0x5AD509789BFFECD0L, 0xDDCD5E8325F69CA0L, 0x154D8F1ACD9B8C82L, 0xAC7DF75E94CE3CAFL, 0x6D6554D1B38754BEL, 0xB5DB64AF738486E7L }, /*E4*/
new long[] { 0x35A308A1AC9A43BFL, 0x2647805AB3E6E492L, 0x4BB74A616F61588FL, 0xFA4602EE5BDBF54EL, 0x3FDD62470A7174DBL, 0x5795433CA808FAACL }, /*E5*/
new long[] { 0x51A094B8774CA605L, 0x5F07974C74EEF225L, 0x022AFEF7AD81A953L, 0x0967C44BBA336FD6L, 0x8AA327918AECBA3DL, 0xF70B8436573C3F0AL }, /*E6*/
new long[] { 0xCF374F83420766C3L, 0x71F31901A13EF07CL, 0x63AD56C7DEF9DC0FL, 0x9E5BB5E859F5A231L, 0xD0BF453BB9893E4CL, 0xA1E14B66C2719760L }, /*E7*/
new long[] { 0xB41861CC73FD3E48L, 0x461D79A138B04BE1L, 0x4010D37D37FBA817L, 0x7D9622AA693225A4L, 0x2204454B8126799AL, 0x33A5D487DCCD6EB6L }, /*E8*/
new long[] { 0xD291D0317A053320L, 0xE27678F1E50D1F76L, 0x9A3D663A63159FC7L, 0xAD7B4D3F67BAB452L, 0x269CC05E2B33CE1CL, 0x0FB8261CD734BCC3L }, /*E9*/
new long[] { 0xF3D0546D3D4A25EEL, 0xB42874AD28C9B7F2L, 0x73EC788B29962D28L, 0x4AE73A48132B8553L, 0x756C99D7A0910B66L, 0xECA7E2C2712D555CL }, /*EA*/
new long[] { 0x559FA5BF24911FDDL, 0xA1DDF5DE3770554BL, 0xC7C3FD139366B946L, 0x6E7ECC0C881D2BA4L, 0x14E76D6A27E54B87L, 0x7352D5FBC4FAB878L }, /*EB*/
new long[] { 0xF19A622BED8DAC0AL, 0x35548E5D7EFC5A2EL, 0xCAC84974B4F057B2L, 0xAB317ED03D0335AEL, 0x710FC138F2C51738L, 0x9C90CC495A403416L }, /*EC*/
new long[] { 0x9FA7DEB936F10461L, 0xA1529B0B58462F9DL, 0x9F109111C8B9EC65L, 0x23A3EB28444E33EAL, 0x554084CA75118937L, 0x599D58A7C946EAC2L }, /*ED*/
new long[] { 0x6EC3AABB7856AC4EL, 0x980E6907C1CBCCAFL, 0x1F8557ADC700CBF5L, 0x7DCB1CE0AF48D9F4L, 0x7FB3DADF8199AB8AL, 0xE6B36DB8FADBF312L }, /*EE*/
new long[] { 0xC00F0D3F7A101660L, 0x605B94B12DB6C697L, 0x79944F7BA2B65F38L, 0x40858ADEDD47E2BCL, 0x1E044BDB0E9FB02BL, 0x86C79D01A3109539L }, /*EF*/
new long[] { 0x9731893D5B98482AL, 0xFB8DE267F9790326L, 0x8780F407143A505DL, 0xA41CAEFCCCD3A8E3L, 0xA042F0B3D7B7A7FEL, 0x3E3151FEBB19A1ACL }, /*F0*/
new long[] { 0xE7EDF679003A6950L, 0xBAFC97D4A8C6AB12L, 0x13C096B49C79559AL, 0xC3052501434B5019L, 0x1280FB23E7ADFB09L, 0x1959905D31BD2FC0L }, /*F1*/
new long[] { 0x575C0C46FCFCC65BL, 0xFE625E873F34B419L, 0x1696FDCC7F51B8A3L, 0xC79C56F30E5AE7C0L, 0x14E3461CD27FAD15L, 0x1B7BCCB9CB472859L }, /*F2*/
new long[] { 0x3806FE58E5CC8F16L, 0xF8244ED76734C1BFL, 0x4E04940E0F5DDB56L, 0x5BD0AFDDC4158B7BL, 0xA4C6BA949911C5C9L, 0xFF6E2AC155AE9726L }, /*F3*/
new long[] { 0x49C7C844B8114144L, 0xB450E41BCA35CB00L, 0x302450EC67BEF97CL, 0xA8662049DB1E0D8BL, 0xDA69C022528EB8FAL, 0x6ABBF16585C1A2F7L }, /*F4*/
new long[] { 0x37BB420DF67F044EL, 0xDCC0E9F3E2EF07B3L, 0x4D10088618777841L, 0x0492E5379305DAAEL, 0x3DA4791C37E4128FL, 0x80688445CBA4EA17L }, /*F5*/
new long[] { 0x51398A7CE4CF8D9DL, 0x49A5FCD891A69CA5L, 0x3D72A60EC2392DA5L, 0x0E8296B879AB5539L, 0x6BCB00AF2EDC0BDEL, 0xBEB93848E54B3E90L }, /*F6*/
new long[] { 0x7AD7C52A18922E19L, 0x29292C57C4F5B8F5L, 0xF0CF1F98A577C10BL, 0x072B9F293BB660CDL, 0x09B8604F5575B6FBL, 0xDECB396A81B9FCDBL }, /*F7*/
new long[] { 0x254AD7ADB4C220DEL, 0x6C62E20F95A0070DL, 0xADEB89F339309BD8L, 0xA2F685CC178B289FL, 0x9343905B5DEE95A5L, 0xE0C30F34A2977C86L }, /*F8*/
new long[] { 0x669CD51AF7CFBFAAL, 0xE3E0806F6880271DL, 0x6934C259E098BF90L, 0x5DFEEAF0FBCA7249L, 0x89F74B948B4118B6L, 0x53640AEAFB6807C3L }, /*F9*/
new long[] { 0xDD3BACDCC04BE120L, 0x6D4949BD64198E51L, 0x31FDB39666598A74L, 0xBBBC6DE9C0C15A81L, 0xF27F201C61C06279L, 0x2738AFE3E84E5CDDL }, /*FA*/
new long[] { 0xCDD71FD35A6411DEL, 0x3CC012793E87523FL, 0xB0CFF8720FCA36F3L, 0x93E85FE07300F012L, 0xE894A085263F090BL, 0x2DF60A01DAFA90ECL }, /*FB*/
new long[] { 0x9DA50DB1EEB4FADDL, 0xE524E49C9974799AL, 0xDE09FFF26A24CBB9L, 0xAF9D71E9F3ACE7CDL, 0xEB62B1A62566EC9DL, 0x06D02AB1217D3553L }, /*FC*/
new long[] { 0xDD31E6391AE03522L, 0x93ACD1065B35E915L, 0xF4EB56CC03E79218L, 0x0717815C850C97F1L, 0xBF4F6A8AC0540A6FL, 0xFCF8AE5DE9507FF0L }, /*FD*/
new long[] { 0xAB45B413DC50B207L, 0x40B417369551D8D5L, 0xCA32286A108E7210L, 0x03225E54D8D093AFL, 0x4B6CA5591EA576E9L, 0x4E12AB774DC4E062L }, /*FE*/
new long[] { 0xD9F4F850DF6CB96CL, 0x8ABAD81B1667335DL, 0xCB4079CFE79C72E5L, 0xE5542F763E316996L, 0x303E4B79B9D397C4L, 0xE46933038B945111L }, /*FF*/
new long[] { 0x75B15CC53B0D2502L, 0xDA1BCA6BA0524358L, 0x9EDA977556C06B7EL, 0x6C57727ECF0A1325L, 0xDC613D5A78E5C3F8L, 0xCE062D94A3B4945AL } /*ZZ*/
};
private static final long[][] NUHASH_RND = new long[][] {
new long[] { 0x6A09E667F3BCC908L, 0xB2FB1366EA957D3EL, 0x3ADEC17512775099L, 0xDA2F590B0667322AL, 0x95F9060875714587L, 0x5163FCDFB907B672L }, /*R1*/
new long[] { 0x1EE950BC8738F694L, 0xF0090E6C7BF44ED1L, 0xA4405D0E855E3E9CL, 0xA60B38C0237866F7L, 0x956379222D108B14L, 0x8C1578E45EF89C67L }, /*R2*/
new long[] { 0x8DAB5147176FD3B9L, 0x9654C68663E7909BL, 0xEA5E241F06DCB05DL, 0xD549411320819495L, 0x0272956DB1FA1DFBL, 0xE9A74059D7927C18L }, /*R3*/
new long[] { 0x84C9B579AA516CA3L, 0x719E6836DF046D8EL, 0x0209B803FC646A5EL, 0x6654BD3EF7B43D7FL, 0xED437C7F9444260FL, 0xBD40C483EF550385L }, /*R4*/
new long[] { 0x83F97BBD45EFB866L, 0x3107145D5FEBE765L, 0xA49E94EC7F597105L, 0xFBFC2E1FA763EF01L, 0xF3599C82F2FE500BL, 0x848CF0BD252AE046L } /*R5*/
};
private static final byte[] NUHASH_SBX = {
(byte)0x63, (byte)0x7C, (byte)0x77, (byte)0x7B, (byte)0xF2, (byte)0x6B, (byte)0x6F, (byte)0xC5, (byte)0x30, (byte)0x01, (byte)0x67, (byte)0x2B, (byte)0xFE, (byte)0xD7, (byte)0xAB, (byte)0x76,
(byte)0xCA, (byte)0x82, (byte)0xC9, (byte)0x7D, (byte)0xFA, (byte)0x59, (byte)0x47, (byte)0xF0, (byte)0xAD, (byte)0xD4, (byte)0xA2, (byte)0xAF, (byte)0x9C, (byte)0xA4, (byte)0x72, (byte)0xC0,
(byte)0xB7, (byte)0xFD, (byte)0x93, (byte)0x26, (byte)0x36, (byte)0x3F, (byte)0xF7, (byte)0xCC, (byte)0x34, (byte)0xA5, (byte)0xE5, (byte)0xF1, (byte)0x71, (byte)0xD8, (byte)0x31, (byte)0x15,
(byte)0x04, (byte)0xC7, (byte)0x23, (byte)0xC3, (byte)0x18, (byte)0x96, (byte)0x05, (byte)0x9A, (byte)0x07, (byte)0x12, (byte)0x80, (byte)0xE2, (byte)0xEB, (byte)0x27, (byte)0xB2, (byte)0x75,
(byte)0x09, (byte)0x83, (byte)0x2C, (byte)0x1A, (byte)0x1B, (byte)0x6E, (byte)0x5A, (byte)0xA0, (byte)0x52, (byte)0x3B, (byte)0xD6, (byte)0xB3, (byte)0x29, (byte)0xE3, (byte)0x2F, (byte)0x84,
(byte)0x53, (byte)0xD1, (byte)0x00, (byte)0xED, (byte)0x20, (byte)0xFC, (byte)0xB1, (byte)0x5B, (byte)0x6A, (byte)0xCB, (byte)0xBE, (byte)0x39, (byte)0x4A, (byte)0x4C, (byte)0x58, (byte)0xCF,
(byte)0xD0, (byte)0xEF, (byte)0xAA, (byte)0xFB, (byte)0x43, (byte)0x4D, (byte)0x33, (byte)0x85, (byte)0x45, (byte)0xF9, (byte)0x02, (byte)0x7F, (byte)0x50, (byte)0x3C, (byte)0x9F, (byte)0xA8,
(byte)0x51, (byte)0xA3, (byte)0x40, (byte)0x8F, (byte)0x92, (byte)0x9D, (byte)0x38, (byte)0xF5, (byte)0xBC, (byte)0xB6, (byte)0xDA, (byte)0x21, (byte)0x10, (byte)0xFF, (byte)0xF3, (byte)0xD2,
(byte)0xCD, (byte)0x0C, (byte)0x13, (byte)0xEC, (byte)0x5F, (byte)0x97, (byte)0x44, (byte)0x17, (byte)0xC4, (byte)0xA7, (byte)0x7E, (byte)0x3D, (byte)0x64, (byte)0x5D, (byte)0x19, (byte)0x73,
(byte)0x60, (byte)0x81, (byte)0x4F, (byte)0xDC, (byte)0x22, (byte)0x2A, (byte)0x90, (byte)0x88, (byte)0x46, (byte)0xEE, (byte)0xB8, (byte)0x14, (byte)0xDE, (byte)0x5E, (byte)0x0B, (byte)0xDB,
(byte)0xE0, (byte)0x32, (byte)0x3A, (byte)0x0A, (byte)0x49, (byte)0x06, (byte)0x24, (byte)0x5C, (byte)0xC2, (byte)0xD3, (byte)0xAC, (byte)0x62, (byte)0x91, (byte)0x95, (byte)0xE4, (byte)0x79,
(byte)0xE7, (byte)0xC8, (byte)0x37, (byte)0x6D, (byte)0x8D, (byte)0xD5, (byte)0x4E, (byte)0xA9, (byte)0x6C, (byte)0x56, (byte)0xF4, (byte)0xEA, (byte)0x65, (byte)0x7A, (byte)0xAE, (byte)0x08,
(byte)0xBA, (byte)0x78, (byte)0x25, (byte)0x2E, (byte)0x1C, (byte)0xA6, (byte)0xB4, (byte)0xC6, (byte)0xE8, (byte)0xDD, (byte)0x74, (byte)0x1F, (byte)0x4B, (byte)0xBD, (byte)0x8B, (byte)0x8A,
(byte)0x70, (byte)0x3E, (byte)0xB5, (byte)0x66, (byte)0x48, (byte)0x03, (byte)0xF6, (byte)0x0E, (byte)0x61, (byte)0x35, (byte)0x57, (byte)0xB9, (byte)0x86, (byte)0xC1, (byte)0x1D, (byte)0x9E,
(byte)0xE1, (byte)0xF8, (byte)0x98, (byte)0x11, (byte)0x69, (byte)0xD9, (byte)0x8E, (byte)0x94, (byte)0x9B, (byte)0x1E, (byte)0x87, (byte)0xE9, (byte)0xCE, (byte)0x55, (byte)0x28, (byte)0xDF,
(byte)0x8C, (byte)0xA1, (byte)0x89, (byte)0x0D, (byte)0xBF, (byte)0xE6, (byte)0x42, (byte)0x68, (byte)0x41, (byte)0x99, (byte)0x2D, (byte)0x0F, (byte)0xB0, (byte)0x54, (byte)0xBB, (byte)0x16
};
private static final byte[] NUHASH_FIN = {
(byte)0xB4, (byte)0x98, (byte)0x0C, (byte)0x84, (byte)0x24, (byte)0xF3, (byte)0x27, (byte)0x8F, (byte)0xA6, (byte)0x5E, (byte)0xF0, (byte)0x65, (byte)0x86, (byte)0xBC, (byte)0x09, (byte)0x92,
(byte)0x75, (byte)0x21, (byte)0xB9, (byte)0x95, (byte)0x66, (byte)0x8A, (byte)0x2F, (byte)0x13, (byte)0xB5, (byte)0xB7, (byte)0x6B, (byte)0x33, (byte)0x2A, (byte)0xBF, (byte)0xF7, (byte)0x0F,
(byte)0x0A, (byte)0xE7, (byte)0x16, (byte)0x30, (byte)0x77, (byte)0x61, (byte)0x48, (byte)0x90, (byte)0xDF, (byte)0xAF, (byte)0x72, (byte)0x79, (byte)0xF6, (byte)0xA5, (byte)0x58, (byte)0xD1,
(byte)0xF2, (byte)0x40, (byte)0x9F, (byte)0x41, (byte)0xE8, (byte)0x03, (byte)0xA1, (byte)0x05, (byte)0xC5, (byte)0x35, (byte)0xC7, (byte)0x97, (byte)0x54, (byte)0x7B, (byte)0xB3, (byte)0xF5,
(byte)0xB8, (byte)0xA8, (byte)0xD8, (byte)0x68, (byte)0x51, (byte)0xAD, (byte)0xE3, (byte)0xC2, (byte)0x5D, (byte)0xCF, (byte)0xEA, (byte)0x89, (byte)0x37, (byte)0xF1, (byte)0x55, (byte)0x60,
(byte)0xA4, (byte)0x26, (byte)0xAC, (byte)0x32, (byte)0x0E, (byte)0xD2, (byte)0x85, (byte)0x6F, (byte)0xC8, (byte)0xDC, (byte)0x36, (byte)0x6D, (byte)0xA3, (byte)0x22, (byte)0x5A, (byte)0xC9,
(byte)0x5C, (byte)0x91, (byte)0x1B, (byte)0x5B, (byte)0xE9, (byte)0x78, (byte)0xD7, (byte)0x44, (byte)0xEB, (byte)0x1A, (byte)0xC0, (byte)0xCA, (byte)0x94, (byte)0x53, (byte)0xC4, (byte)0x11,
(byte)0x12, (byte)0xCC, (byte)0xFF, (byte)0x88, (byte)0x0D, (byte)0x4E, (byte)0xB2, (byte)0xB1, (byte)0x4A, (byte)0x3A, (byte)0xE1, (byte)0x2E, (byte)0x0B, (byte)0x4C, (byte)0x5F, (byte)0x06,
(byte)0x81, (byte)0x31, (byte)0xD9, (byte)0x3D, (byte)0xFD, (byte)0x43, (byte)0x67, (byte)0x62, (byte)0x00, (byte)0x9C, (byte)0x50, (byte)0xCE, (byte)0x6E, (byte)0x15, (byte)0x82, (byte)0x29,
(byte)0x96, (byte)0xDA, (byte)0x87, (byte)0xEF, (byte)0x6C, (byte)0xC1, (byte)0x8B, (byte)0x07, (byte)0x8E, (byte)0x17, (byte)0xEC, (byte)0x9A, (byte)0xBA, (byte)0x46, (byte)0x04, (byte)0x73,
(byte)0x39, (byte)0xE4, (byte)0x63, (byte)0xBE, (byte)0x64, (byte)0x47, (byte)0xE6, (byte)0x3F, (byte)0x25, (byte)0x52, (byte)0x59, (byte)0xA7, (byte)0x42, (byte)0x38, (byte)0x99, (byte)0x01,
(byte)0xE5, (byte)0x1D, (byte)0x28, (byte)0x7A, (byte)0xB0, (byte)0x7C, (byte)0x9D, (byte)0x56, (byte)0xE2, (byte)0xD6, (byte)0xA0, (byte)0xF4, (byte)0x1E, (byte)0xE0, (byte)0xD3, (byte)0x83,
(byte)0x6A, (byte)0xBB, (byte)0x18, (byte)0x20, (byte)0xAE, (byte)0x57, (byte)0xAA, (byte)0x8D, (byte)0x71, (byte)0x1F, (byte)0x34, (byte)0x4D, (byte)0x2D, (byte)0x3C, (byte)0x2B, (byte)0xF8,
(byte)0x10, (byte)0x7E, (byte)0xCB, (byte)0xFB, (byte)0x49, (byte)0xA2, (byte)0x45, (byte)0x7F, (byte)0x3E, (byte)0xBD, (byte)0xC3, (byte)0xFC, (byte)0x14, (byte)0x74, (byte)0x23, (byte)0x4F,
(byte)0x7D, (byte)0x69, (byte)0x93, (byte)0x19, (byte)0xD0, (byte)0x1C, (byte)0x08, (byte)0xF9, (byte)0xDD, (byte)0xC6, (byte)0x2C, (byte)0x9E, (byte)0xA9, (byte)0x4B, (byte)0xFE, (byte)0xED,
(byte)0x76, (byte)0xDB, (byte)0xAB, (byte)0xD4, (byte)0x80, (byte)0xCD, (byte)0xB6, (byte)0x8C, (byte)0xDE, (byte)0x70, (byte)0x9B, (byte)0xD5, (byte)0xFA, (byte)0xEE, (byte)0x02, (byte)0x3B
};
/* ------------------------------------------------------------------------ */
/* MIX FUNCTIONS */
/* ------------------------------------------------------------------------ */
private static long mixFunction1(long key) {
key = (key ^ (key >>> 31)) * 0x7FB5D329728EA185L;
key = (key ^ (key >>> 27)) * 0x81DADEF4BC2DD44DL;
return key ^ (key >>> 33);
}
private static long mixFunction2(long key) {
key = (key ^ (key >>> 31)) * 0x99BCF6822B23CA35L;
key = (key ^ (key >>> 30)) * 0x14020A57ACCED8B7L;
return key ^ (key >>> 33);
}
private static long mixFunction3(long key) {
key = (key ^ (key >>> 31)) * 0x69B0BC90BD9A8C49L;
key = (key ^ (key >>> 27)) * 0x3D5E661A2A77868DL;
return key ^ (key >>> 30);
}
private static long mixFunction4(long key) {
key = (key ^ (key >>> 30)) * 0x16A6AC37883AF045L;
key = (key ^ (key >>> 26)) * 0xCC9C31A4274686A5L;
return key ^ (key >>> 32);
}
private static long mixFunction5(long key) {
key = (key ^ (key >>> 30)) * 0xBF58476D1CE4E5B9L;
key = (key ^ (key >>> 27)) * 0x94D049BB133111EBL;
return key ^ (key >>> 31);
}
private static long mixFunction6(long key) {
key = (key ^ (key >>> 30)) * 0x4BE98134A5976FD3L;
key = (key ^ (key >>> 29)) * 0x3BC0993A5AD19A13L;
return key ^ (key >>> 31);
}
/* ------------------------------------------------------------------------ */
/* SUBSTITUTION FUNCTION */
/* ------------------------------------------------------------------------ */
private static void substituteBytes(final long[] buffer) {
for (int pos = 0; pos < buffer.length; ++pos) {
final long value = buffer[pos];
buffer[pos] =
((NUHASH_SBX[(int)(value >>> 0x00) & 0xFF] & 0xFFL) << 0x00) |
((NUHASH_SBX[(int)(value >>> 0x08) & 0xFF] & 0xFFL) << 0x08) |
((NUHASH_SBX[(int)(value >>> 0x10) & 0xFF] & 0xFFL) << 0x10) |
((NUHASH_SBX[(int)(value >>> 0x18) & 0xFF] & 0xFFL) << 0x18) |
((NUHASH_SBX[(int)(value >>> 0x20) & 0xFF] & 0xFFL) << 0x20) |
((NUHASH_SBX[(int)(value >>> 0x28) & 0xFF] & 0xFFL) << 0x28) |
((NUHASH_SBX[(int)(value >>> 0x30) & 0xFF] & 0xFFL) << 0x30) |
((NUHASH_SBX[(int)(value >>> 0x38) & 0xFF] & 0xFFL) << 0x38);
}
}
/* ------------------------------------------------------------------------ */
/* UPDATE FUNCTION */
/* ------------------------------------------------------------------------ */
private void update(final int index) {
final long[] rowAddr = NUHASH_XOR[index];
for (int round = 0; round < ROUNDS; ++round) {
final long key[] = NUHASH_RND[round], initValue = m_hash[0];
m_hash[0] = mixFunction1(((m_hash[0] << 32) | (m_hash[1] >>> 32)) ^ rowAddr[0] ^ key[0]);
m_hash[1] = mixFunction2(((m_hash[1] << 32) | (m_hash[2] >>> 32)) ^ rowAddr[1] ^ key[1]);
m_hash[2] = mixFunction3(((m_hash[2] << 32) | (m_hash[3] >>> 32)) ^ rowAddr[2] ^ key[2]);
m_hash[3] = mixFunction4(((m_hash[3] << 32) | (m_hash[4] >>> 32)) ^ rowAddr[3] ^ key[3]);
m_hash[4] = mixFunction5(((m_hash[4] << 32) | (m_hash[5] >>> 32)) ^ rowAddr[4] ^ key[4]);
m_hash[5] = mixFunction6(((m_hash[5] << 32) | (initValue >>> 32)) ^ rowAddr[5] ^ key[5]);
substituteBytes(m_hash);
}
}
/* ------------------------------------------------------------------------ */
/* STREAM API */
/* ------------------------------------------------------------------------ */
public NuHash reset() {
System.arraycopy(NUHASH_INI, 0, m_hash, 0, NUHASH_WORDS);
m_finished = false;
return this;
}
public NuHash update(final byte[] input) {
if (input == null) {
throw new IllegalArgumentException("Input must not be null!");
}
checkState();
for (final byte b : input) {
update(b & 0xFF);
}
return this;
}
public byte[] doFinal() {
checkState(true);
update(256);
for (final byte b : NUHASH_FIN) {
update(b & 0xFF);
}
return toByteArray(m_hash);
}
/* ------------------------------------------------------------------------ */
/* SIMPLE API */
/* ------------------------------------------------------------------------ */
public static byte[] compute(final byte[] input) {
if (input == null) {
throw new IllegalArgumentException("Input must not be null!");
}
final NuHash nuhash = new NuHash();
try {
return nuhash.update(input).doFinal();
} finally {
nuhash.destroy();
}
}
/* ------------------------------------------------------------------------ */
/* UTILITIES */
/* ------------------------------------------------------------------------ */
private void checkState() {
checkState(false);
}
private void checkState(final boolean isFinished) {
if (m_finished) {
throw new IllegalStateException("Computation is already finished!");
}
if (isFinished) {
m_finished = true;
}
}
private static byte[] toByteArray(final long[] hash) {
final ByteBuffer digest = ByteBuffer.allocate(hash.length * Long.BYTES);
for (final long current : hash) {
digest.putLong(current);
}
return digest.array();
}
}

View File

@ -0,0 +1,173 @@
/******************************************************************************/
/* NuHash, by LoRd_MuldeR <MuldeR2@GMX.de> */
/* This work has been released under the CC0 1.0 Universal license! */
/******************************************************************************/
package com.muldersoft.nuhash.test;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertTrue;
import java.lang.reflect.Field;
import java.nio.charset.StandardCharsets;
import java.util.Base64;
import java.util.List;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import com.muldersoft.nuhash.NuHash;
class NuHashTest {
@BeforeAll
static void init() {
final List<Integer> version = NuHash.VERSION;
System.out.printf("NuHash v%d.%d.%d\n", version.get(0), version.get(1), version.get(2));
}
/* ------------------------------------------------------------------------ */
/* TEST VECTORS */
/* ------------------------------------------------------------------------ */
@Test
void testCase0() throws Exception {
final Field field = NuHash.class.getDeclaredField("NUHASH_XOR");
field.setAccessible(true);
final long[][] xorTable = (long[][]) field.get(null);
for (int i = 0; i < xorTable.length; ++i) {
for (int j = 0; j < xorTable.length; ++j) {
if (i != j) {
assertTrue(computeDistance(xorTable[i], xorTable[j]) >= 182L, "Distance too small !!!");
}
}
}
}
@Test
void testCase1() {
runTest(
"d7964fe1bec2b5ecf21ecc88c86ce4f1e89fb1ef3669d52e34eb049d7fd6c42d4b2bbeeeb70d12c3fcaf43dd2229abc9");
}
@Test
void testCase2() {
runTest(
"abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
"b3f13f534034ae8d645d410e8828673761fe2d697218879f9ea528d976ba2e15a3f7485105e612b9a46cb3988635a70f");
}
@Test
void testCase3() {
runTest(
"abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu",
"63703476f4ffce4a8c758d0d3b91a857b9a2e3433ee864f931ba328fa7247b1b0ac9c2e0279243b83051aafac6a7e710");
}
@Test
void testCase4() {
runTest(
String.valueOf('a'),
1000000,
"c6808aeb911c8837cee2e6867e589ab28526a8153494cf35a40c4bd6e20312da33cac4a390cd3b51a2eb4226e60b53e1");
}
@Test
void testCase5() {
runTest(
"abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmno",
16777216,
"bcca6bc8d113dd3fc171d743ac7ad2d3e63163ea7107d3c78517cf5b53ee0b2f4a0fe079e6a74df350c667b7cfe3cf09");
}
@Test
void testCase6() {
runTest(
"g4tB,=[TU%/|8lv_c5Y?F9Sqs1PnV#bNO6DW\\0em~p<ifJhM(2&Qo}`!-*:jrZ{KGX]$zkuLd+)xwC^.\"@AIHR;y'a>3E7",
16777216,
"56770e133b9eb4205f11824ad7280f5c31bc04dd333d1844b3589ab8b94ab95dc09b77be9a8128d7f155fa73de617597"
);
}
@Test
void testCase7() {
runTest(
decode("pCxVpbBe2DPzGPunIMc01x0tRo3Kiuf8aFtU2vnDdmKpPTm/F7eyjBCiH+N0akpsepLRUuqIumvWZJae5kxHQsVR8lD0e0/ph22USyPwRRqa5JEPO7RxgpnJSeW+KJOYKtlzZVjAg0iPAxRAGyQepj/3Z6s3Bqz2ZrbdHAo1n1YV7PErfFddAu2oYxZ13JtcfQ1f/QWgbpCVhdITYQijAcjThKoJ9XBv3rkEtdswvAeO/olgJk5ZyzaGEXLixq86i3/6QTjf7i8yoSdpMSlDxJx3IUS4edCtl+DhDhkuIr2A6LH4TT7CfgyzgRLMwVPPeM481Vq7nevvzf8LJa7U"),
16777216,
"9a8579bb88112b2f3285781a61348d7b04a5632fec12a73a7e0e367a556794a24a32ca7bb14da68eaed83e99c2f8f4c0");
}
@Test
void testCase8() {
runTest(
decode("tcib0bpmKRnSMO0mW8SRTRT3FjVaaf6ZpUnxlCu83EzdT8obiJyp9nMv/T9AORPas3H03n8CPWR4ehcKk9/rnwcEeYyYuCiArR/ylmu9Rdn6LFbO8IcjIurFJ9NjryTHtwbkdYN7vy6k7/USXWCVp1MRdLSgnuOuu1VyWaad1Yltj0oMHc0q++7Xw/MlYo6wssI4PGpvTjsI1IY2GFzgHoF3+GjbWFT/l35hwFHJbOWCvs8yQwE6XlBHoTTMDXCsxkSaPhAO7APibqr8fTcxS+a2wRWLBYWKZ/mrjeGiSBzLUmV2DxohqKNCQZCS0IQJLTNf2HyxuVfo1gsg50bp"),
16777216,
"fbf4444b0329f508bfc6cf44920b311a718e5f4c4c1af978e78223ec3579365ff5d15c16bb5a33d69cb36f3d40564757");
}
/* ------------------------------------------------------------------------ */
/* TEST RUNNER */
/* ------------------------------------------------------------------------ */
private static void runTest(final String expected) {
runTest("", 0, expected);
}
private static void runTest(final String input, final String expected) {
runTest(input, 1, expected);
}
private static void runTest(final String input, final int iterations, final String expected) {
assertNotNull(input);
runTest(input.getBytes(StandardCharsets.UTF_8), iterations, expected);
}
private static void runTest(final byte[] input, final int iterations, final String expected) {
assertNotNull(input);
assertTrue((iterations > 0) || (input.length == 0));
assertFalse(expected.isEmpty());
final NuHash instance = new NuHash();
try {
for (int i = 0; i < iterations; ++i) {
instance.update(input);
}
assertDigest(expected, instance.doFinal());
} finally {
instance.destroy();
}
}
/* ------------------------------------------------------------------------ */
/* UTILITIES */
/* ------------------------------------------------------------------------ */
private static byte[] decode(final String base64data) {
return Base64.getDecoder().decode(base64data);
}
private static long computeDistance(final long[] row1, final long[] row2) {
assertEquals(row1.length, row2.length, "Length mismatch!");
long distance = 0;
for (int i = 0; i < row1.length; ++i) {
distance += Long.bitCount(row1[i] ^ row2[i]);
}
return distance;
}
private static String printHexString(final byte[] digest) {
final StringBuilder sb = new StringBuilder(2 * digest.length);
for(final byte b : digest) {
sb.append(String.format("%02x", b));
}
return sb.toString();
}
private static void assertDigest(final String expected, final byte[] actual) {
final String hexString = printHexString(actual);
final boolean success = expected.equalsIgnoreCase(hexString);
System.out.println(hexString + " - " + (success ? "OK" : "Failed!"));
assertTrue(success, "Hash mismatch detected !!!");
}
}

41
libnuhash/js/index.html Normal file
View File

@ -0,0 +1,41 @@
<!DOCTYPE html>
<!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
<!-- NuHash, by LoRd_MuldeR <MuldeR2@GMX.de> -->
<!-- This work has been released under the CC0 1.0 Universal license! -->
<!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
<html>
<head>
<meta charset="UTF-8">
</head>
<body style="font-family: Hack, Monospace;">
<h1>NuHash Example</h1>
<h3 id="statusIndicator">&#8987;</h3>
<script type="module">
import { NuHash, toHexStr } from "./lib/nuhash.mjs";
let statusIndicator = document.getElementById("statusIndicator");
async function setResult(resultText) {
statusIndicator.innerHTML = resultText;
statusIndicator = document.createElement("h3");
statusIndicator.innerHTML = "&#8987;";
document.body.appendChild(statusIndicator);
await new Promise(resolve => setTimeout(resolve, 25));
}
async function runTest(iterations, input) {
const nuhash = new NuHash();
const source = new TextEncoder().encode(input);
for (let i = 0; i < iterations; ++i) {
nuhash.update(source);
}
await setResult(toHexStr(nuhash.doFinal()));
}
async function allTests() {
await runTest(0x00000, "");
await runTest(0x00001, "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq");
await runTest(0x00001, "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu");
await runTest(0xF4240, "a");
}
await allTests();
statusIndicator.innerHTML = "&#x1F3C1;";
</script>
</body>
</html>

454
libnuhash/js/lib/nuhash.mjs Normal file
View File

@ -0,0 +1,454 @@
/******************************************************************************/
/* NuHash, by LoRd_MuldeR <MuldeR2@GMX.de> */
/* This work has been released under the CC0 1.0 Universal license! */
/******************************************************************************/
export const NUHASH_WORDS = 6;
export const NUHASH_BYTES = NUHASH_WORDS * BigUint64Array.BYTES_PER_ELEMENT;
/* ------------------------------------------------------------------------ */
/* Const tables */
/* ------------------------------------------------------------------------ */
const NUHASH_INI = new BigUint64Array([
0x243F6A8885A308D3n, 0x13198A2E03707344n, 0xA4093822299F31D0n,
0x082EFA98EC4E6C89n, 0x452821E638D01377n, 0xBE5466CF34E90C6Cn
]);
const NUHASH_XOR = [
new BigUint64Array([ 0x01DCDF00414B3037n, 0xB1B3AF661B8E96F8n, 0x944D2873DB393121n, 0x73DA9A36662AE755n, 0x1F4F318C4ECB56B1n, 0xF09743D99C2AA5BCn ]), /*00*/
new BigUint64Array([ 0xA81FBBC6CBBFC954n, 0x39DE43648959EDDBn, 0x1A641A0BDA01822Fn, 0xB52E607266932658n, 0x2C5B1731AC802084n, 0xC2EF10671FC79DD4n ]), /*01*/
new BigUint64Array([ 0xCF2A8D8E08810046n, 0x8B7E9B2089E268F6n, 0x930461652C5D2DECn, 0xF096E42223BFC8B9n, 0x8DD338964CFE0970n, 0x269C342F7CEC60BDn ]), /*02*/
new BigUint64Array([ 0xB970A920D2ED0552n, 0x010F894A254DA7E1n, 0x8D5F205F9D1A40D8n, 0x50C33DCCC3FD5F58n, 0xB49F31BDE7D82C57n, 0x7CDE04F62A959033n ]), /*03*/
new BigUint64Array([ 0x49FAB2822B9C84ACn, 0x34B8648CD68CBEF1n, 0xE5121147BB4126DEn, 0xC0B31F54B2FFE00Fn, 0x2F193DA38E8CC632n, 0x058C984B429B8AFCn ]), /*04*/
new BigUint64Array([ 0xE07F9DA44D8C9942n, 0xBE2AF9B39ACA65F2n, 0x5D3D8FB1466DC295n, 0xC0051E3EC3F962C7n, 0xF8FDC3CCD4CE2BB6n, 0x9024C0EFC6199937n ]), /*05*/
new BigUint64Array([ 0xA3111377EF01F5EFn, 0x31F59B366C02A3FFn, 0x61B82949760D16DCn, 0xF6B958AF92BD3BDFn, 0x7297AAEFEC69C0B2n, 0xFE8A50AD9E8684CDn ]), /*06*/
new BigUint64Array([ 0x3D3DD0C829EA9AA0n, 0x3E77597EEC96C7A3n, 0x8FD038231E7F1684n, 0x64617B131FB7EDE0n, 0x85C99CE4C5405874n, 0xA58735D41F19C5E3n ]), /*07*/
new BigUint64Array([ 0x8028628ACAF91B9An, 0x194A640538C97064n, 0x04A15E018A4F1680n, 0xF4BE1B04C2360955n, 0xDFB24D4CEF581A20n, 0x3C59D0A0FD15879Dn ]), /*08*/
new BigUint64Array([ 0x88F8E2ECE78AF1BCn, 0xB46B6E22297364C2n, 0x9339F17F926B99F3n, 0x31293489B3B8F07Cn, 0x3909CE1649C9BCF1n, 0x0C46103BFA31BCE9n ]), /*09*/
new BigUint64Array([ 0x4D1A0B8CC7EFE2A9n, 0xAFD7878CAD55E871n, 0xC89CFBC858CF4153n, 0xC4739486C74F75D6n, 0x0BF7192C130AC9F2n, 0x0084F2BC5E81BD9An ]), /*0A*/
new BigUint64Array([ 0x4AFBE975014FCACFn, 0x41DEAF8CFACC41E4n, 0x3C1EC23B53ED16E9n, 0x78B06EB30F1C3248n, 0xDD11165D04285C72n, 0x6546D9B5609491E4n ]), /*0B*/
new BigUint64Array([ 0xFFD1E2E04DC8D260n, 0x07B186948A74ECCEn, 0xB5120E45121AC531n, 0xBD0BC86330810C85n, 0xDE93AFDDDB487730n, 0x78DEB0DE6EB99196n ]), /*0C*/
new BigUint64Array([ 0x79BAA2AC3FDEBA55n, 0xB1B7E3E1C92A567En, 0xA53F69AB4A5B0794n, 0xF0DA7499954F6DDDn, 0x58117C89E1132248n, 0xD95DF5F794C51A6En ]), /*0D*/
new BigUint64Array([ 0x89BC8A0C65091C33n, 0xB04EEAEE063135C2n, 0xF53267E04AB6E689n, 0xB4C579B7207E8BF2n, 0x3FD31E51343CD2DFn, 0x119E523E2F8197FEn ]), /*0E*/
new BigUint64Array([ 0x2E10CB1C6060F32Dn, 0xBC92E732A94E6B63n, 0xF3220D831FD04267n, 0x502C5F7414BCE87Fn, 0x89E0651DE91D2457n, 0x759E56B04482D915n ]), /*0F*/
new BigUint64Array([ 0x43AEE32C6A84E803n, 0x0C5007202C0BD7E3n, 0xB4F464474205D32An, 0x7D17FC95DE386C06n, 0xE8DFBF64567AA545n, 0x55BD889D5853046Fn ]), /*10*/
new BigUint64Array([ 0x687ABE14EAB8DA27n, 0x397B3AB50D72C344n, 0x505EAA6D1FDE618Dn, 0x61BE79865DA13F69n, 0x17BBAB29B5E90E2Dn, 0x010C921972FA8B2Fn ]), /*11*/
new BigUint64Array([ 0x8B7223A4F56FF453n, 0x291B7B5CB98B6FE1n, 0xFD421625786FBF7Dn, 0xE33D1020D0E8CDC8n, 0xCA530C708B739E87n, 0x878AF1F304B8A12Fn ]), /*12*/
new BigUint64Array([ 0x7ECE1F24E56DD711n, 0x2E0869241B2FA6DFn, 0x84B834DCC459B2FDn, 0xE022EDA6319E7D3Bn, 0x59839D8CA03C9928n, 0x644790F491BBC774n ]), /*13*/
new BigUint64Array([ 0xCBDC6F49E6B0DD0Dn, 0x44BA2F8D00346732n, 0x86BCC821586AE61Cn, 0xC7B7491285CEE55Bn, 0xED3912FFD97F3851n, 0xF4AF0186BEBEBCBFn ]), /*14*/
new BigUint64Array([ 0xCA8A48E54ECCE516n, 0xBEDF1864B7F8F506n, 0xD56A1F60A4B36AA4n, 0x49B25AB5FE0DD9D9n, 0x21377DBB5E49FCE1n, 0x708F64F5D59D99E7n ]), /*15*/
new BigUint64Array([ 0xE9F873A569AFE02Cn, 0xDA66BC05CA997390n, 0x8C88174756D35385n, 0xEAAAF16CF4FDA730n, 0xB39F7A55653A3512n, 0xF10AB727BC23E852n ]), /*16*/
new BigUint64Array([ 0x93E96FF8C5BBE2AFn, 0xA47785420253E97Cn, 0x704B25D1F77D074Cn, 0xC0B2093F1470559Cn, 0x8D5BFDD4E364AACFn, 0x550518673F5B1BF7n ]), /*17*/
new BigUint64Array([ 0x8DAC832E5BE81ACBn, 0x588BFB202B7583D8n, 0xA34D8A70DFD1D7E4n, 0xD03B0627B687033En, 0xE3D0BE7EDBDC75CFn, 0x818EE8C5B09F8BEAn ]), /*18*/
new BigUint64Array([ 0x8E3B02E1489D7D31n, 0x5336752B64E3B532n, 0xE4D4CC795C580A65n, 0x6DAB08F313ED767En, 0x8E567E88FDBA36BFn, 0x259490F1D8E933D0n ]), /*19*/
new BigUint64Array([ 0xEAB437D0D62CAA62n, 0xC090AD28B982B003n, 0xE255D768D25704ECn, 0xA048511AF6256A43n, 0xE79F078F4D498B5Fn, 0xC41735FB75B357FEn ]), /*1A*/
new BigUint64Array([ 0x70DA9FC3504FF29Dn, 0xB9AB1F388673FF25n, 0x36922F4CD17357BAn, 0xF09C3AB292E7E04An, 0x90CE0BC3D9BA13ECn, 0x647C4CA63C918DE3n ]), /*1B*/
new BigUint64Array([ 0xD834A38DD1ECD688n, 0xA97A0020DE46AB6An, 0x9CDEC7F6E62EA71Fn, 0x288A5A6FD74DC47En, 0xD44A2E2765CE50F1n, 0xBB9B50B5DB9E4F3Cn ]), /*1C*/
new BigUint64Array([ 0xC66DA90E41DDF2E6n, 0x5A3FE86F160C5C09n, 0x6F6AF0405108CCBEn, 0xF938382EB627FC7Fn, 0x163DD634617F006Cn, 0x5184B1FEDC908497n ]), /*1D*/
new BigUint64Array([ 0xC95719ED07FCB21Cn, 0x5112DF043F6EE7EBn, 0x50F9FD60012334CEn, 0x589FA85104D96579n, 0xB7129E44D71905A7n, 0x3314766E0733528Dn ]), /*1E*/
new BigUint64Array([ 0xDC6C8014C5457CB8n, 0xD635FDCD286A69B6n, 0xD66F232CE27D01BFn, 0x56AF4AC0F682EC0Fn, 0x57DF1D55B64328F5n, 0x651ED4C52A87CACAn ]), /*1F*/
new BigUint64Array([ 0x26D9D1CC79EEC502n, 0x69BF340A34B1EBFEn, 0xFAA5AAAC8E397174n, 0xD0A8F9BD426BCF6Fn, 0x5B131F464D6D2452n, 0x122DD15660D0D6DAn ]), /*20*/
new BigUint64Array([ 0x6E389AEC5F51A22Fn, 0x7EF68F1C54C127FBn, 0x986D4D46E0485C30n, 0xF0A47B39E7CF8A31n, 0x1D398DFDB7F2A78Fn, 0x2FC651D1FBB10D2En ]), /*21*/
new BigUint64Array([ 0xA44E4E8D1B49DCB0n, 0x07A4822049C2F343n, 0xC40AC04A8D6505BAn, 0xD9B91D3F0729B16Cn, 0xAAF39951B50F9015n, 0x966EF5D3AD3F9076n ]), /*22*/
new BigUint64Array([ 0xEA78CBAC0EB6D009n, 0xA0FEA6725A23DEABn, 0xCE729C7444CB94D9n, 0x40A994626627AA0Dn, 0x37F738CDE3D018D5n, 0x4C29491C01CDB3C5n ]), /*23*/
new BigUint64Array([ 0x7C9792AEA745C87An, 0xD1FF5620C5BD8FD4n, 0x9ECA84E3004B56B9n, 0x5AFD3923C228B1D6n, 0xE5DBF79EB3FD283Bn, 0x441712E354084B9Fn ]), /*24*/
new BigUint64Array([ 0xE35D288BD8E249BCn, 0x91776C1453A366E5n, 0xF5D1E1684E95EFECn, 0x9108E117D7DDF606n, 0x81B30F9DA2CE7C8Cn, 0x6497DBD786818C0Dn ]), /*25*/
new BigUint64Array([ 0xC2F891FF45044BE0n, 0x75A1A76D2B87E2EBn, 0x85CE65798AF3C2BFn, 0x213F532B4EFD09DCn, 0x0DAA1DF5A53A6C88n, 0x3028606A50D826B2n ]), /*26*/
new BigUint64Array([ 0x609A62616379F33An, 0xA339A3BC53E4516Dn, 0xD7AD92616A5ADBECn, 0xD043726D86E924AAn, 0x8555B564F4C29865n, 0x56AA12AB31C1D6B0n ]), /*27*/
new BigUint64Array([ 0xCED9ED85C1C17BFFn, 0xEB522325ACBAFFC2n, 0x04D3D8F4B2D15394n, 0xD271504C04756EEAn, 0x2DDBA4A91AF827F1n, 0x1F67D5C28F8002E4n ]), /*28*/
new BigUint64Array([ 0x8B9C08AD432DC08Fn, 0x5A7543E29796BBC7n, 0x34A6DB5B3C1967DEn, 0x016E3BC2A2804EE4n, 0x5B9BCACCE5172F75n, 0x7549598B80ADBDBAn ]), /*29*/
new BigUint64Array([ 0x6F3FB117C5CDD155n, 0x16C3B0A59CD6EEC5n, 0xD9A1A411DE538769n, 0x938C54979F4AC37Cn, 0x3737BCC1D55284DBn, 0x6CAD9F8AF9156BB7n ]), /*2A*/
new BigUint64Array([ 0xEBBF284F9C75EBDFn, 0xB383EBB406753DE8n, 0xAA86127AEE7C403Cn, 0x10BFDD10523DE027n, 0x138BF6C4EB4A8A13n, 0xB1EFF67DDB78B067n ]), /*2B*/
new BigUint64Array([ 0xF6D1138D7AA3DA5En, 0xBAA8098D8FB66371n, 0xDAE76D1B8B6CAAF2n, 0x400F1034368D1EDCn, 0x7C937F5172E8D277n, 0x7D05BBF83CADE6EFn ]), /*2C*/
new BigUint64Array([ 0x0E9C2EA6CF34B081n, 0x9036B30D58F60BA0n, 0xDB3A2C5848F08BCAn, 0xC87AD1B94250D564n, 0x7C892E09EEF96166n, 0x26DB85CF571085F3n ]), /*2D*/
new BigUint64Array([ 0x251EE3F58718C12An, 0xF9438D81178A2AE4n, 0xF0929A889039A8A8n, 0xF06B65225EBDCCFDn, 0x2E4D14EDF7BF73C6n, 0xA9369895BC1DFACFn ]), /*2E*/
new BigUint64Array([ 0xCAE302B41D6979CBn, 0xBBFA5A58B51EE623n, 0x5113B99DC81AB52Fn, 0x6093795BEC17A056n, 0x8F71FB4D2E5E355En, 0x762F92EDBA34A2F2n ]), /*2F*/
new BigUint64Array([ 0xD130015265A4D9FFn, 0x09BEA253D71F26C8n, 0x81B6EAEDC46521E6n, 0xFAE268165682B8A9n, 0xA89C3EC4774AB623n, 0x0D2E45E055219DB2n ]), /*30*/
new BigUint64Array([ 0x2B560284C3A692ABn, 0x37008AD0B379A7B8n, 0xAF11CD2C30F90BFCn, 0x7FE87A250F2762EDn, 0xC3FBD711647242C3n, 0x74ED8264F6B322BDn ]), /*31*/
new BigUint64Array([ 0x28195CC8A7AD3943n, 0x53CBE808464C4FC4n, 0xD58E3D7A765F8726n, 0xD83052F60185AA4Fn, 0xEFCB0D85223BB4E7n, 0x5A31305E787FAC28n ]), /*32*/
new BigUint64Array([ 0x725D0EE230F19543n, 0x9091D2C6BDDF34E0n, 0xE3BE49C6C2754601n, 0x61BE300BA4AD566Bn, 0x02D79D7551FA7CC1n, 0x6543910F5F1CDA58n ]), /*33*/
new BigUint64Array([ 0x4099ADC44481B43Fn, 0xFE1361922FD9EB81n, 0xA989C09E441FCEACn, 0x449B3A13D3CB9019n, 0x45A9BE396F201134n, 0xDC1AD05A046633FEn ]), /*34*/
new BigUint64Array([ 0x1A563A6D522F3E69n, 0xBE589E079F475A9En, 0x75A2A9638E4C0038n, 0xDA3B6202577A0362n, 0x211D3F1E0D727AF6n, 0x5E1FFC529AD99233n ]), /*35*/
new BigUint64Array([ 0x47B61E86C6D6D01Bn, 0x437D6F83ADADC318n, 0xD5A361028DED738Cn, 0xA00D4C630425164Bn, 0x1A69AFA5AF4C9DD2n, 0xF99E1C67F951B582n ]), /*36*/
new BigUint64Array([ 0xA66A7740B6BDEA79n, 0xFEF7FF1496AF80A3n, 0x05AFD43EEACD898Cn, 0xB00C78ED31AD7134n, 0x0ED31A1AD7846673n, 0x74B96844161499BEn ]), /*37*/
new BigUint64Array([ 0x46FA8D6CCBF6D12En, 0x31C2FC147F303956n, 0x707F4401DE5F067Fn, 0x3AE5FEC7E33594E9n, 0x28E39F8A63531714n, 0xB7B329EA1E9FCAB2n ]), /*38*/
new BigUint64Array([ 0xEFD8F755825C7804n, 0x1F5A93870BD30CD1n, 0xEFBF894671FF8716n, 0x28ED617FF22BDA58n, 0x411289CCAE5CB62En, 0x95DD42F41801F2F9n ]), /*39*/
new BigUint64Array([ 0xA8525B8645FC59E1n, 0x75E62DC00A5F7F0Cn, 0x09C56785210416ACn, 0x50EF76E9B30D7626n, 0x2B3B2CDC19F5D665n, 0xA41297CD11D8F4FFn ]), /*3A*/
new BigUint64Array([ 0xEAC99A649EEE5039n, 0xA593C92F143C0065n, 0xB314735203071206n, 0xEA2761A0C764A4ECn, 0x02AA7FD46CAC25B3n, 0xC68CC182A96D03BFn ]), /*3B*/
new BigUint64Array([ 0xB2873F024EC83CA8n, 0x97470AB8FD8853EBn, 0x18FE15C159B305BDn, 0xB0AB08F687EAEAFDn, 0x510A3FDE73602E43n, 0x03E1B84DCCF0FCF0n ]), /*3C*/
new BigUint64Array([ 0xD85BBBDC8033C0D8n, 0x9223D9C39CA9F34Fn, 0x7D3BCB6D5B63C3FDn, 0x1C30F974DA0C0FB5n, 0x8B24BC9EBEFB5143n, 0xC58954925B7B84FCn ]), /*3D*/
new BigUint64Array([ 0x6ABD7C2E0844D7A7n, 0xCCF2EA456CDF530Dn, 0xE8938CF52B3921B8n, 0xBA023CA2F281657Cn, 0xEC635DA675D1EDAEn, 0xB4AA52F22EE1BE6Cn ]), /*3E*/
new BigUint64Array([ 0x981C3AC677CB5904n, 0x6A92B54C84877B49n, 0x745BA6BB40C55815n, 0xB7AF550D22A371EDn, 0xD5E8BD87C65F5374n, 0x67874A37F0F538F5n ]), /*3F*/
new BigUint64Array([ 0xC23BBA2A9DECC021n, 0x4E610E930B0E3450n, 0x1A681AA91477577En, 0x38A3209714EDC376n, 0x0FD15563EEEB4AB6n, 0x7D57668A01D42178n ]), /*40*/
new BigUint64Array([ 0x6AF88CE145A098B5n, 0x1AEB858CD88B8B46n, 0xE8B733AFB8E2D6E8n, 0x313FAA8C10A7EBFAn, 0x127D375E77557CEAn, 0x96BDA2F70B2F2155n ]), /*41*/
new BigUint64Array([ 0xEC8903978FAFB636n, 0xC7213C425C079763n, 0x760384036AB6D17Cn, 0xE0C63A26385F1F49n, 0x299877D6811A6DF5n, 0x876F90FC5304B88Dn ]), /*42*/
new BigUint64Array([ 0xA6FABBC2D6E0BA16n, 0x9B70C9640080E6BCn, 0x29B2D5265598B27Bn, 0x4A9657C726E4397En, 0xA801CCC6766678D5n, 0x800EF7CC72619998n ]), /*43*/
new BigUint64Array([ 0x235931A8CF5490BFn, 0xE798F98E0E8F879Fn, 0xC6EEE29C38F30CA7n, 0x929A79F2D53E0024n, 0x88F2E12749587A45n, 0x0B85B28F38891965n ]), /*44*/
new BigUint64Array([ 0x165E0303E4A4D827n, 0x67994F42D1E8436An, 0xE6CC8BCF6E130D1Bn, 0x50101711709DDEFCn, 0x373BDEC40CD05328n, 0x40B274A4AA5109F6n ]), /*45*/
new BigUint64Array([ 0xA9F88BA008FDF8C8n, 0xECC897E3476EE05An, 0xBCE290AB69D57A74n, 0xFA44DB1811E3115Dn, 0x6267AEFD64480C88n, 0x2697D04A2D3AECEBn ]), /*46*/
new BigUint64Array([ 0xC0782AF2ABCD3313n, 0x02BA1290F2F96273n, 0x63C82F1A56ADC2B9n, 0x10F8E8C03EFE51C4n, 0xE3EB348625CCAFFDn, 0x93D607969CB8E7AEn ]), /*47*/
new BigUint64Array([ 0xCC6E179443E58FBCn, 0xD21C93C655A7B8EEn, 0x2B9834A31F2B8BA4n, 0xC83B69516025ECEEn, 0x9176EB7B427AAE94n, 0x8CB65B9E30B7A76En ]), /*48*/
new BigUint64Array([ 0xC1A33A0AD6EDD989n, 0x18B3C5D95813B5F7n, 0xB024BD263B359A8Bn, 0xC8C17C2216A99B50n, 0x71F9A11D58237729n, 0x3AA67C7618284290n ]), /*49*/
new BigUint64Array([ 0x99B7465E09201C7Bn, 0x9AF89FA01CA4FA81n, 0xFC2EC63E761AD123n, 0xE2A9A39585B17D14n, 0x08394DE529F94E81n, 0x479448E69794FAA4n ]), /*4A*/
new BigUint64Array([ 0x23CA3D1C4CBDCABBn, 0xE3265436CE1A37E4n, 0x1BBF10F69E8A4CC9n, 0x05A66708048F5C4Dn, 0xE259DCDD9C5BFEFEn, 0x439E65FAFD936EFDn ]), /*4B*/
new BigUint64Array([ 0xA24D73B6978F719Cn, 0x3F53F343CCB0BB8En, 0xBE3C72769EE07C6An, 0xFACB9E539CF558DDn, 0x67B91D4E30DE986An, 0x1DB913D11698913An ]), /*4C*/
new BigUint64Array([ 0x98BD4E140DC3C3C6n, 0x142B1592BF3263E8n, 0xCDBEAC59ED095B0En, 0x900763F0F625896An, 0xE213550F30324E39n, 0x8A13A4417A803195n ]), /*4D*/
new BigUint64Array([ 0x2ACD98ED8C626073n, 0x1CAAA6B4C4CF3238n, 0x04DCB41EB677EB5Dn, 0xF88B5844A8105B68n, 0x981D9E951A061A4Dn, 0xBC9471894C878EDBn ]), /*4E*/
new BigUint64Array([ 0x4959FEAD5D6C2DBDn, 0x6ABD59E28C503049n, 0x06D2C5494CAF8B34n, 0x70E4541304A4293Cn, 0x520F3416CAF2F503n, 0xB23D09D92613DB85n ]), /*4F*/
new BigUint64Array([ 0x26B5A815C32D1791n, 0x2C99E7555BB033C6n, 0x09CE9D6A0002514Fn, 0xD485282B2B8D7997n, 0x9C5B792F4A4A14C6n, 0x851D9D02DC0BB4E7n ]), /*50*/
new BigUint64Array([ 0x62FEB6CACFB060ECn, 0x9D977D69D5C661EAn, 0xBF08EFD806D81556n, 0x25F1EEA460EA5718n, 0xA25346B51F5A9665n, 0xD92F9ADC358CA274n ]), /*51*/
new BigUint64Array([ 0x27E63DFC63E8FFA6n, 0xCDB9CCE2CE99FDA3n, 0x979D5B754974830Dn, 0x3298C8407D6693BEn, 0x629D5FADA39B42B7n, 0x2654D31271CD84E1n ]), /*52*/
new BigUint64Array([ 0xAB1FA4DAF66E583Cn, 0xEEB6B7A236D24766n, 0xA90738CDFDF5C6B3n, 0x28CBA9E5648E2D4Cn, 0xFDE5BF6C0CFE0DA3n, 0x9D00B863D7D78485n ]), /*53*/
new BigUint64Array([ 0x75FBBF094EEA16AAn, 0x48931F027CD729F2n, 0x5D360679009B2E7Fn, 0xDDFCD148BD3DE21An, 0x4DBFF544B094D0E1n, 0x9C0E5C6294352C22n ]), /*54*/
new BigUint64Array([ 0x283A27FF968853D2n, 0xB0960C6CEA0D03F2n, 0x172BBA07A473DB38n, 0x688C87D296E6F4BBn, 0x5CB7E9BC5D68CF0Fn, 0x57A5D71B0E47BFB4n ]), /*55*/
new BigUint64Array([ 0xDE0108AAC1E4FF2Fn, 0xD346CFABEAC62B99n, 0xB72E203F98B5F608n, 0x81853D8CA54B29BEn, 0xA6AED7C89FAA1680n, 0xD2093B155C39D7EDn ]), /*56*/
new BigUint64Array([ 0x0BAEAC99D4974B84n, 0xC7F258A699C9B4DAn, 0x6F622C5E4ACCF5C1n, 0x58AB397D9781BEAAn, 0xBF811F67E101FFE3n, 0xAFBCC2881C3C0EF3n ]), /*57*/
new BigUint64Array([ 0x26B211FB518D6C3En, 0x64BADAD51A10784An, 0xE6BE4E06A587186Cn, 0xD471F5C61343CD5Cn, 0x8389BB0DD6AAED5Dn, 0xC88112678914A17Dn ]), /*58*/
new BigUint64Array([ 0x2B2D0BC3BB88D27Dn, 0xC5A7D1FAFF517AD2n, 0x96F39056A09F82ADn, 0xFB38A61A6CED4D4En, 0x9D308E4EA6F9B264n, 0x9097CE294AECC6B3n ]), /*59*/
new BigUint64Array([ 0x8FCA2B950690B1A2n, 0x293EFCBF03D422DFn, 0x8C9125B3E76353ABn, 0x3D402092A1A70173n, 0x9BAB974CAB9BF676n, 0x5EA8FCC55D8C586En ]), /*5A*/
new BigUint64Array([ 0x408C92E8C2E1EC8Cn, 0x4AF4C914B71B4350n, 0x5186AEE0CDFB1069n, 0x2385EAFAB9657C67n, 0xF708E4D3C898CA80n, 0x1EC8B9F89884907En ]), /*5B*/
new BigUint64Array([ 0x46E8958B6A2C1878n, 0x2172FD410F78A647n, 0x9D8E9DD83A299004n, 0x390913C3265AD025n, 0xD231F1E23077CBF1n, 0xE7EE3E574E80D7F3n ]), /*5C*/
new BigUint64Array([ 0x5A8567A3D85E40B2n, 0x16ECF161133FCF73n, 0x52DA5C6FBA3C0DD7n, 0x56E57983DEB34BFBn, 0x83254FDCB768D153n, 0x9A14F95F35C6B82Dn ]), /*5D*/
new BigUint64Array([ 0x498A29C6E19D4AE6n, 0x2EF4AAF46027BA11n, 0xBDBA7DAA84F39505n, 0x940B2A04F6DC944Dn, 0x4E7ED35610FC0D53n, 0xBADD94C2907E59E1n ]), /*5E*/
new BigUint64Array([ 0x14DF0FC43F475F80n, 0x17E2AA8D264BF82Fn, 0x92625BDFE58B934Dn, 0x8384F415A4ACEA81n, 0x8E9C5EAEC5D8642Bn, 0x4D8EF55F1C826687n ]), /*5F*/
new BigUint64Array([ 0x4A2335C4F77128D9n, 0x544E1476D29ABA94n, 0x654EC86321785044n, 0xB04AD9B02F80445An, 0xB0E01B6480C8D020n, 0x596E325E88A3CBBFn ]), /*60*/
new BigUint64Array([ 0x896955157448D062n, 0x0DB08C4C0F236D68n, 0x3BA8FC5B3CD1C4A2n, 0x04F57C53E144535Bn, 0xB7D04DCC7BE46840n, 0x4BBE993192334646n ]), /*61*/
new BigUint64Array([ 0x1D7837E6AB02CE27n, 0x3EA35BAED4493EA4n, 0xD1CAFDB5DF94FABEn, 0x98B580BB62170C4Fn, 0xC3C57A6CA9421C43n, 0x68D65FC2C1201634n ]), /*62*/
new BigUint64Array([ 0xFAEABABC48717536n, 0x454251E8F62F7315n, 0xB318E8A7FDCDC523n, 0x7C2E832013C91344n, 0x4D9E5DAFD1699052n, 0x12262E8C870537A7n ]), /*63*/
new BigUint64Array([ 0x8A3E5D0BEF8402A2n, 0xA33BC5FAFA019909n, 0x63CBE8ACD00762F5n, 0xEA26A3F181984178n, 0x6EEB78D1BB4AF6BBn, 0x7ECF9671300E845Fn ]), /*64*/
new BigUint64Array([ 0x0811B67CCCF5D0FCn, 0x9F8CAB3F3496BD6Bn, 0x57CB7D24F1355C2Dn, 0x58218594165BDE80n, 0xFAF3368A653A78F8n, 0xC04CD80176267762n ]), /*65*/
new BigUint64Array([ 0xE6417CE75AAA23B0n, 0x34A7BFE3CBA61761n, 0x8C13E396F8C9B6EDn, 0x5C9066464B09ED63n, 0x76CB6A642C5CE283n, 0x498E082A3EB449C6n ]), /*66*/
new BigUint64Array([ 0x6F2ADEA6357B5AA0n, 0x54DA382B15557B69n, 0x302BD81946237AAEn, 0x8F0CBB82111EFEDCn, 0x45DD2DADCE20F2D3n, 0x8A77A5E9E8A2D1D8n ]), /*67*/
new BigUint64Array([ 0xE1EC332735862A28n, 0x92B68B1A7E9C7C44n, 0xF45618DC99E963E3n, 0x7CAC984502DD1A73n, 0xC8650598CD70840Dn, 0x9A5DA584A26D4EFDn ]), /*68*/
new BigUint64Array([ 0x16B19B010740C15Cn, 0xB4544AC01016439An, 0x221F749C9E2F99A5n, 0xA63E8A279A65570Fn, 0xC7231669ADD072ADn, 0xC5BC35BA740BC801n ]), /*69*/
new BigUint64Array([ 0x6C44E75A4F378694n, 0xD27ACE108A577647n, 0x17C487FAFA7E15D6n, 0x6A3654D5C8E29EDFn, 0x0CE35EEDCC611FFAn, 0xD88A8C03C0095093n ]), /*6A*/
new BigUint64Array([ 0xCF106948BC4B1F2Cn, 0x91C0DC9990B99712n, 0x193B21E3E109AB32n, 0x3340DE0608DD1666n, 0x8A5BB677BF602828n, 0x402C410B1197B771n ]), /*6B*/
new BigUint64Array([ 0xEB080FF49CA5543En, 0xB4B9429542D6CA27n, 0x5999D45DC1533205n, 0xF7EA9E398A1BEF3En, 0xBE8817775476DEC6n, 0x17064D7790C84100n ]), /*6C*/
new BigUint64Array([ 0xF3328E9150A7F8D6n, 0x52E3E61B04ACFDF8n, 0x51D82010F3CEB015n, 0x59D673336676D5D8n, 0x4CB3BCEF1D91C342n, 0x0C589AB58033BE49n ]), /*6D*/
new BigUint64Array([ 0x54B8E70EDCE03855n, 0x7BB590E99687FD57n, 0x6CFF08688D2B1FDDn, 0xFD0F6D068BFE994Fn, 0xEB9BCE302489AE44n, 0x66B21F200661E3E4n ]), /*6E*/
new BigUint64Array([ 0x2F5E0060189669ADn, 0x473AF1D03C00CAE4n, 0x0278299268D1F3B4n, 0x888714BC3A7EC9D2n, 0x9FF9C7F071EBD2D9n, 0x875A5DC25DFFDB10n ]), /*6F*/
new BigUint64Array([ 0xE2A97A3E468399D8n, 0x3BF7EACA32C80DA1n, 0x13DCAC8EB6C2231Dn, 0x227EC90E1102EE97n, 0xB2344832F0381434n, 0x8613888303B190EBn ]), /*70*/
new BigUint64Array([ 0x3A3D3B6CE026BFFEn, 0x18D4953B9A68ED59n, 0x24BB7B574AB777A0n, 0xE0CB7DD64983DCB1n, 0xCF768C439869AC97n, 0x8062BC7A900E6033n ]), /*71*/
new BigUint64Array([ 0x39D4C3B78A7A33C7n, 0x43D72EF22AB0B4EBn, 0x54AE8184DDA50394n, 0x0C2A7DA083C38536n, 0x9DBC6F921D4AD822n, 0x2CBB61FE182EAA42n ]), /*72*/
new BigUint64Array([ 0xD8CE9A806C0BD24Dn, 0xF69D65A65845727Cn, 0xC3FF81CC76F2B048n, 0x76B1FDC3CA67CE58n, 0xCED0970AFBCBE78An, 0x57502941B726F5F3n ]), /*73*/
new BigUint64Array([ 0xE006AEC17FCEFCF9n, 0x05CAA1629E003591n, 0xB7050CC99F585312n, 0x669260401E159490n, 0x8442D25AA757CC5An, 0x228655CD4038770Cn ]), /*74*/
new BigUint64Array([ 0x93EE8D67D3F1F3A1n, 0xBEA46D48DBF8D7F4n, 0x3C91F02B8646453Cn, 0x6C3D7C1F04188A58n, 0xEFA97287F89CEF84n, 0xCB40364E108BFF4Bn ]), /*75*/
new BigUint64Array([ 0xC6DCE3730D4FF825n, 0x02AF54F87D972790n, 0x7D69D20F6F4F788Fn, 0x90C255C64C166E8Fn, 0xA3529FBF4BF9C9A2n, 0x3ECEC41136694F6Bn ]), /*76*/
new BigUint64Array([ 0x3DE10A5EC6CA7B3Fn, 0x7E196081D085ACAAn, 0xDF5F0DE3705D60F7n, 0x393E7C83DCC57075n, 0xA5F33BC2DCB98F97n, 0x0AEB7F050D1204C0n ]), /*77*/
new BigUint64Array([ 0x6F3B3B3D11A8BC05n, 0xB52269AB2B95B8DCn, 0x12EDE24EB1385F13n, 0x202BBA6B5836B5E1n, 0xEE3636C5925ACC49n, 0x42224CF6EEB509BFn ]), /*78*/
new BigUint64Array([ 0x5F0CC3BBC4BE9A92n, 0x584313FCCC54DD2En, 0xC11FE90F00394036n, 0x3371667C72FC9723n, 0x9611990B62AC8D9Fn, 0x4CFCB9EB3C317FADn ]), /*79*/
new BigUint64Array([ 0xCA8E520A894A3FBAn, 0xBD9ED1B80098CC40n, 0xBDF24507DFF3757Cn, 0x47AEC572E68D35ECn, 0xF3D4523D27B373E4n, 0x1AB11E16973A05ABn ]), /*7A*/
new BigUint64Array([ 0xFFC293A6C26B817Dn, 0x2C9E9D134959D828n, 0x7FA5216408199BBFn, 0xA6F002DE0DCCD861n, 0xBE8F9DC57F2CF35Dn, 0x1352E2DF86A47647n ]), /*7B*/
new BigUint64Array([ 0x84B55BE101708E74n, 0x3ADEC53721209F3En, 0xB18F9A1E68DFADBDn, 0x09A050819774CF2Dn, 0xE4AB295D380A8762n, 0xA3605B0C689C239Fn ]), /*7C*/
new BigUint64Array([ 0xDDC7031FBFDFFE8Fn, 0x0B175DE65B832F0An, 0x31162ABC65719685n, 0x51215E534BBC36B1n, 0x9F2F7D3B5D01AE44n, 0xCF43A2426E83B61Bn ]), /*7D*/
new BigUint64Array([ 0x7E32DB672B16F04An, 0xCE6F45DE0E6AB788n, 0x25718548B8E70B41n, 0xD7368BCF39A0FAC4n, 0x956863EC49880C47n, 0x720E335796341674n ]), /*7E*/
new BigUint64Array([ 0x06707A8E33D9D6C6n, 0xB684BFE26CD576C6n, 0x44F47E5ECD5FC46Cn, 0xAF1B23A856D844B7n, 0x98A627916AC5657En, 0x040C3964A1127E19n ]), /*7F*/
new BigUint64Array([ 0xA5DAEC3134C0A39Bn, 0x0CA04160BD5ADB1Fn, 0xB50EC5A9F29E1ACBn, 0xBE2FA1126AF7BFAFn, 0xBEFC0AC4C9C5A4B3n, 0x994739C71FB1EB29n ]), /*80*/
new BigUint64Array([ 0x6FEC2D343E83A763n, 0x5BDBA5715757F50Cn, 0xD6F6282EE46A11B3n, 0xA8B501F5922A5524n, 0xA782A21006B605CAn, 0xA10BD2E896975C81n ]), /*81*/
new BigUint64Array([ 0xB8AAE0532226D0EDn, 0x891831C0470E84B7n, 0x74C824D648E8FF28n, 0xB5E4E02EAD3906EBn, 0x5ABB086ADA60A713n, 0xA80C57666A9E29F1n ]), /*82*/
new BigUint64Array([ 0x529E3E52B1E7230An, 0x0C148861C9F08E26n, 0x0CFC8A131BAD803Dn, 0x8C09F324902FAA9Fn, 0x0231EE4987999848n, 0x3B0688492E2B5457n ]), /*83*/
new BigUint64Array([ 0xEFA6EAC5036814CDn, 0x02773C1F8DAA5DF5n, 0x0E4EEDBD0702DE31n, 0xBA7FD757D0D740EFn, 0xA8805F0C74005F8Bn, 0x1448467BFF3E1EF8n ]), /*84*/
new BigUint64Array([ 0x2A07B766016AC70Dn, 0x64215C35364219E9n, 0xCD6F7EFE35FCF6F1n, 0xF05CC06084C29267n, 0xAB3BF2F32579A444n, 0xAC75F42D9A25B9C9n ]), /*85*/
new BigUint64Array([ 0xEF3A14B5EDDB8464n, 0x2314E0802D2DD0E9n, 0x14DEAEA9F928762An, 0x5763EBB480E15A02n, 0x25F7CA14E8CDF5E6n, 0x8E594510DC61E6BCn ]), /*86*/
new BigUint64Array([ 0xE62C38DCFD21000Bn, 0x7BB32AE917EE3DA7n, 0xE49F15E24CC9B656n, 0x56E28259DCA361D8n, 0xB43B8008A9285F48n, 0x0DC6B4AF7E4AE61Bn ]), /*87*/
new BigUint64Array([ 0x703C64241142DCAEn, 0x732D33342C45063An, 0x37877EA1624567CBn, 0x2871D534614DD114n, 0xE748092A1D94F5D1n, 0x4524056F0C6D1CB7n ]), /*88*/
new BigUint64Array([ 0xE325B1823A595DF9n, 0x742D0DD5C96F397Cn, 0x44361C9540A9F451n, 0x02382F9BF6331FB9n, 0x8ECBAFBBE91A0467n, 0x528EBF3811F904A8n ]), /*89*/
new BigUint64Array([ 0xFD2BC6534631FB0Dn, 0x27A5F036FEEB9A6Cn, 0xD0F876D7911D0775n, 0x12EFB3A29C6E0B72n, 0xDC4BCA3D5E871DA1n, 0x028FB6E6E608F46Fn ]), /*8A*/
new BigUint64Array([ 0xEF17ECC8930A7B4An, 0x9D97B34672FB273Dn, 0xC6AE835F35A25D8Fn, 0x6C27469530C21F5Bn, 0x2FBC16A26150E795n, 0x02AD93AAE0B5C71An ]), /*8B*/
new BigUint64Array([ 0x6D24BE43CF07DD56n, 0x63681D62A38D2A2Fn, 0x9872C9B411724AA0n, 0xB882B4857C19690An, 0x87B1BA8D2804C6F4n, 0xD7B199CC36F40B49n ]), /*8C*/
new BigUint64Array([ 0xEEFB8D8573FD9E0Fn, 0x933403199B91560An, 0xFF0DB41665D5248Cn, 0x322EE105EA984196n, 0xDB8CE0F83890D89Bn, 0x3A32F8983C901F80n ]), /*8D*/
new BigUint64Array([ 0x082CDAF93F215BACn, 0x67C118A1B9274FACn, 0xAF74501CFB93198An, 0x53525CABA0E812D3n, 0xC9AF3A005EFE8A6En, 0xF242DCB60DA7B2FEn ]), /*8E*/
new BigUint64Array([ 0xD3887FBFBB7314DFn, 0xDDDCCCF0F720C342n, 0xB2C4331C33C8C415n, 0x1666010767F4785Bn, 0x8455B7C1FD5DE487n, 0xA821C5EA181875F2n ]), /*8F*/
new BigUint64Array([ 0x7E289831418562F0n, 0x2AD12E3042B185C3n, 0x7C20D0D735A6AE96n, 0xA68BEF98E22CBD41n, 0xA1411D22F8D93243n, 0xD813FB404F3D2F38n ]), /*90*/
new BigUint64Array([ 0xE13FC0A76F664294n, 0x7E21C9D9F7FDDDCBn, 0x161E68B366D6B1F8n, 0x55BF957EB5743874n, 0xB23213EF8364D766n, 0x529BB98AF96643D4n ]), /*91*/
new BigUint64Array([ 0x036D7ADDAADB5C33n, 0x0525835F802D032En, 0x7DF7D0D8D7A2BEF2n, 0x84927644B27696B7n, 0x215E21E4D1F9B5B9n, 0x77743669C40EB7FDn ]), /*92*/
new BigUint64Array([ 0xA9B3534BE8897784n, 0x5BFD4283541A5090n, 0x97AFFCCD121C9778n, 0xC146C4C9637989C7n, 0x0820E72FCBDA59C7n, 0x5526E2F4A0AE4F4Fn ]), /*93*/
new BigUint64Array([ 0xA4739E20FD72BDC2n, 0x6D6EE5A5C1A54CA6n, 0x70A97A6FCB884E5Cn, 0x2B6108339E979C48n, 0x93A63730D6BB23A7n, 0x5B1DCEAB00045EE5n ]), /*94*/
new BigUint64Array([ 0x427C14E4F88C8BDBn, 0x1D8630868E039BC2n, 0x33DB40A251502D1Bn, 0xE043C9CCB45D2B3Dn, 0x292B67B6EE077B2Dn, 0x1C3A2FBDE24C742An ]), /*95*/
new BigUint64Array([ 0x3DED69F37016D86An, 0x9A947B13AC66D7C3n, 0x822D8645DF4CB39Cn, 0x2BA20F98F19E10DAn, 0x6703138D422AC4C4n, 0x8D34D6138FA04A1Dn ]), /*96*/
new BigUint64Array([ 0x28E59C8B257D112Cn, 0x8747068CC5499FCFn, 0xD6C16EB780F9191An, 0xB416151633F7AF08n, 0xA230E00D6BA1A1C3n, 0xFD066FB9965B83D2n ]), /*97*/
new BigUint64Array([ 0x70F4BC1B7F8FFC37n, 0x38DC0331E56B0FDCn, 0xA9AB7290AD2B0BBDn, 0xB307973C3D0783C6n, 0xBDC455F6CDCA111Fn, 0x23F0E08317B8F0DCn ]), /*98*/
new BigUint64Array([ 0x0AEEC24E9285C50Fn, 0x3BCDA47833B61ACEn, 0x839986F959EE0723n, 0xC959034A8D7F5EB9n, 0xD4AD7E05B05C4FB5n, 0x6C37A3D39F7A0EC4n ]), /*99*/
new BigUint64Array([ 0x0227B7230FBF2D07n, 0x28D7D2AD632BED47n, 0x07BD8F8B5012EFD0n, 0x48A0D43AE0403442n, 0x9B8939207F1449A1n, 0x351EAD01B9FDF219n ]), /*9A*/
new BigUint64Array([ 0xA7119D2E311CEF25n, 0x1E532CD0C4ED0479n, 0x2272F878D8D30A0Bn, 0x769C412CED9C4C42n, 0x262FFBFA65CBDDF5n, 0xDB73D86721EA368En ]), /*9B*/
new BigUint64Array([ 0x4BDBE90B3FBADCB2n, 0x1324EC3A8D6FEA57n, 0x6D9EFBE530850D00n, 0x401A88AFF8A4C8F4n, 0x655CB76B8A2E271Cn, 0x35505B6DBDE16F43n ]), /*9C*/
new BigUint64Array([ 0x6E15E57E23F57037n, 0x4962737362C1FA26n, 0xC962372D1829B80Bn, 0xA1FE6832EA4D6211n, 0x6726E307F96E7763n, 0x04C761081677505Bn ]), /*9D*/
new BigUint64Array([ 0x42E2FF3A8A6FC164n, 0xFB85B2BC9D28B268n, 0xC559CFF024533A28n, 0x2EC83F3911DAB3CEn, 0xAE0FC74A9D736A27n, 0xDB9CDD048BAB4CCFn ]), /*9E*/
new BigUint64Array([ 0xD79C52221D20E765n, 0x499EDD73903CE704n, 0x9B016D987DF48349n, 0xFCFAB44AD12FC5C1n, 0x811293F3B800FDF9n, 0x511DC619CA53CEBEn ]), /*9F*/
new BigUint64Array([ 0xA059EE78B826EDDFn, 0x4673AF294D17C85An, 0x5E527D4E4DF282B5n, 0xDB5B9A2693F95CE3n, 0x6551D304FB54F296n, 0xAB3EB70D65912FCCn ]), /*A0*/
new BigUint64Array([ 0x7D0C4F67B6C78135n, 0x390CAEA7DE304D37n, 0x49E19FABC8D494FEn, 0x1A9E1B6437A04516n, 0x886CC4BDAB6AF35An, 0x0529217344F502FEn ]), /*A1*/
new BigUint64Array([ 0x3CEDF34141B52CEEn, 0x8133BA924753573Fn, 0xCB32BE22BC66025An, 0x0C480183DE403CB3n, 0xBF5B84B427DFCF31n, 0x7251428DB0232156n ]), /*A2*/
new BigUint64Array([ 0x86FCE831C58E25CBn, 0x5CC43FFE45CBFC75n, 0x33877CC042F199BEn, 0x1212FA7F0CC22E1Cn, 0x448EAB4B7D1F9823n, 0xA7B1363A9FA7599En ]), /*A3*/
new BigUint64Array([ 0x2D8C2FEDA0E5106Dn, 0x192E366838BBEB3Fn, 0x36226AA60ACEA0AFn, 0xE7E1285DC1F3926An, 0x900371FA1883D9ECn, 0xBAC33B1AF360EB66n ]), /*A4*/
new BigUint64Array([ 0xD4A2A11612BDE0E3n, 0x82AB0DA614CB4CB8n, 0x189A4D50AC01F4C6n, 0xE36A5DA1D9F6A647n, 0xE43120D6B16B11B6n, 0x7D395F4236E75378n ]), /*A5*/
new BigUint64Array([ 0xC0C155CD47F3877Fn, 0x4B03BFE5C334CA71n, 0x77710F1F4B844FF7n, 0x3443BBAB720E8DC5n, 0xF03F8868C5863406n, 0x0FD60511C872EB50n ]), /*A6*/
new BigUint64Array([ 0x8C253DAAB5286306n, 0x9AA438F54A6196ACn, 0x181D08C723A22C5En, 0x633C49C88E3910A1n, 0xC9F54A67992675B0n, 0x1FDD98ACBD38D976n ]), /*A7*/
new BigUint64Array([ 0xA10893DA7575A9F7n, 0x8F5F4A025AB2A018n, 0xD80538F0336BFFC0n, 0x0F9751D33889626Fn, 0x30383EB925BF911An, 0xE6149F68CE19CC60n ]), /*A8*/
new BigUint64Array([ 0xB9081DBAC6BE0598n, 0x785DD9BC69C71492n, 0x8B035A0CA56E172Bn, 0x8946783500724888n, 0xAF1E57C958650569n, 0xE1DE4E944FF22261n ]), /*A9*/
new BigUint64Array([ 0xEA5EDC4D2718C0D2n, 0xCB1C5D4DA15A8AE4n, 0xC6272382F8163015n, 0x94A934E5057B54CEn, 0x658E481A3D68D10Dn, 0xE8F24929E50A46A0n ]), /*AA*/
new BigUint64Array([ 0x7DF146281AF482CDn, 0x014B68E726407B06n, 0x6CE564938C70DDBCn, 0x36DAD2DE72A5DAA2n, 0x6D573BF69C0B2980n, 0x684DAB14B4AA0329n ]), /*AB*/
new BigUint64Array([ 0x9C69DC064E738B5Fn, 0x83CC16BD5A1C36F5n, 0xA99B365E6E141B12n, 0x2748FA5AD0FACCE8n, 0x26D073A047D99C49n, 0xB005B182505B0C0Cn ]), /*AC*/
new BigUint64Array([ 0x15B6A2A20ED0FD1Cn, 0x9333AF729BD65A25n, 0x22CC333293BD2C1Bn, 0xD724D949B15E8BE1n, 0x69D0DB0512B97117n, 0x85ACA8980DD7653Cn ]), /*AD*/
new BigUint64Array([ 0x230EC629D77BB3F2n, 0x43115B991D297CB2n, 0xA2F955792C53C76Fn, 0x48A76728EBE25BA7n, 0x7CE662A405384400n, 0xDDC06B7E6BF49D66n ]), /*AE*/
new BigUint64Array([ 0x20DDB9BD7644410Bn, 0x056391B1FA2E8C06n, 0xCA4EDE51CF167C00n, 0x46602B550536F870n, 0x5040672597C21FF4n, 0x0AF8EC6E8AFB844Bn ]), /*AF*/
new BigUint64Array([ 0x0023C5749251B883n, 0x335A4F86D66B7E00n, 0xAE353DED3EFACE8Fn, 0x3FC80526D67B35DEn, 0x0D9078FBDA80BC53n, 0x467900DFF3FE4C14n ]), /*B0*/
new BigUint64Array([ 0x0F9CB2BE6A448113n, 0xE38D541B6A9A5829n, 0x673953DAF354FC0En, 0x3C818A277F8569E9n, 0x8D16EA77DB122A3Bn, 0xE40A860318B6EA84n ]), /*B1*/
new BigUint64Array([ 0x78CE11F42D7D5E50n, 0x84F76DFF199C998Dn, 0x999B578E3AE935CBn, 0xD9FD092C1BE63212n, 0x31F33C63ACD316D8n, 0x5AA08030B8D65C0Cn ]), /*B2*/
new BigUint64Array([ 0x0098DBE19CA84FE9n, 0xE2426617D1142137n, 0x63C3C4166A78E21Bn, 0x74B145353E03B0E4n, 0xF43C0824EAE508C4n, 0x58C1E6622528602An ]), /*B3*/
new BigUint64Array([ 0x9E27EBE6D1426A6Fn, 0x2A6A600A6B5FA342n, 0x8FF7E2306BA90370n, 0xDF83D91A683EDDDDn, 0x29572442F0225388n, 0xE9CC0F1B6437320An ]), /*B4*/
new BigUint64Array([ 0x054DF380E896064En, 0xFAB81A4AA3AD88A4n, 0xF87426486CCA156Fn, 0xBB1B3C8237472960n, 0x7EC0B87CF73F960An, 0x5C57D7E6470F7808n ]), /*B5*/
new BigUint64Array([ 0x5758E103AC614A1An, 0x766AEE86F81358DFn, 0x203FBA51DC74396An, 0x78C93DF969C5721Fn, 0xE69E32E230196597n, 0xE287C6CECD8AB95Bn ]), /*B6*/
new BigUint64Array([ 0x2A06A7C10C0DCC97n, 0x99D5298268A6745Fn, 0xF2D818BB774858B3n, 0xD52A820D4F64D886n, 0x2F808EF87A263981n, 0xBB91206E6347C676n ]), /*B7*/
new BigUint64Array([ 0x0847C6D71CE0C746n, 0x86FD451B447C1E11n, 0xC20623B0E2856FCCn, 0x3ADDFA2D0398181En, 0x6736A0A06B336B46n, 0xD1C70AEEB2B1257Dn ]), /*B8*/
new BigUint64Array([ 0x5633260D141A9776n, 0xD530805F596CA3DBn, 0x8CE33EF69437CE46n, 0xF62D54E97E747088n, 0xDF5C9318489B45EAn, 0xA4AAD29F0BA850CAn ]), /*B9*/
new BigUint64Array([ 0xBDBD7B16767F6D9Fn, 0xF7968427F1B7B6DDn, 0x58C76599B35276EEn, 0x286F4C7F6CADD791n, 0x8188C0401742117Bn, 0xCEC4F1964266D163n ]), /*BA*/
new BigUint64Array([ 0x97E4E8A6B5135B24n, 0x8A8BD785E5297977n, 0x4545C1A0975BC5BBn, 0x13FAE3BD9F59E37Dn, 0xAFD5627C0E91DE2Bn, 0xA223AC778474E1A9n ]), /*BB*/
new BigUint64Array([ 0xDE1BF1EAF86C6B3Bn, 0xA246A3ACD50035FEn, 0x6F80179DD96A21CDn, 0x3F8DB7CB17300D03n, 0x497A798B5D94506Cn, 0xAD52DCC6F61AE841n ]), /*BC*/
new BigUint64Array([ 0xF4A4E1D08E1F440Bn, 0x5E27633CD56422E0n, 0x1465C14F1DB41420n, 0x9A939043988D37C2n, 0xCBE65CFA245DB368n, 0x6340AEDE28DDA855n ]), /*BD*/
new BigUint64Array([ 0x1F7AB65A3F892454n, 0xD70AB4167EBEB5A1n, 0x9B2631E824C2028Dn, 0xD5D97BDEE31519BCn, 0xEA2DC77449E4058Cn, 0xEB204F2D6D2FBAFFn ]), /*BE*/
new BigUint64Array([ 0x6537E69171A2665Dn, 0x3FD2F835435A3F23n, 0xADD5DD3E622D6C8An, 0xC522CDD5E5E243F8n, 0x5AEC27F3DBFDA8A2n, 0x477A65ED570E1445n ]), /*BF*/
new BigUint64Array([ 0x3BA7CB01D32E9D63n, 0x9E335734E7B5416Bn, 0x0ED96A84F94539F6n, 0x45CEE2E46DF5A70Dn, 0xDE142EE1E9AFEC1Cn, 0x78D6121C4FDC72DDn ]), /*C0*/
new BigUint64Array([ 0x7BB30AF653390B77n, 0x2D394F2B7F8F7BB6n, 0x0277A3C213AF3489n, 0x7DF6E674DD56D084n, 0x5643CD3073C42451n, 0xFAB15F8BD1A1DC18n ]), /*C1*/
new BigUint64Array([ 0x42B453ABF5150D8Bn, 0x913F109C1188E18Cn, 0xC27BB7631FB43BF9n, 0xEBDDE685EF108419n, 0x76D67C87C56D33EAn, 0x95EC73C0AF40F084n ]), /*C2*/
new BigUint64Array([ 0xBCE43D59A1F50BFBn, 0xBA7027CA04D84600n, 0xFB6FDB98A2BE644Bn, 0xD5DE777E993DED4An, 0xFCA39F1EDF710F3An, 0xA5E5893C858D8841n ]), /*C3*/
new BigUint64Array([ 0xC68AC776E6AEACFCn, 0x538067C7866106EBn, 0xD27B4A352F4EFDE3n, 0x847DA2B3BF01E378n, 0x3C79E3C136926D58n, 0xF957BC8726AA1610n ]), /*C4*/
new BigUint64Array([ 0x95492C4203C7C612n, 0x0DD60DB1EE8321FCn, 0xE1D9EBA902F62B42n, 0xEA2DBF7D0E37A4F2n, 0xE11FB9098BF5DA48n, 0xDBFE213F818EA338n ]), /*C5*/
new BigUint64Array([ 0x17CB21316D4756DDn, 0xB88952498140146An, 0x648112F580844288n, 0x4947ADC3F7D58F35n, 0x651CCE28E26A5377n, 0x0B3803DAF337F89Bn ]), /*C6*/
new BigUint64Array([ 0xBEAB16E2DCE6B6E3n, 0x8F39ECC8E39172DFn, 0x607CC9553FF29C0En, 0x4BFD15154F4F0BA7n, 0xEE6230B6BD408CE4n, 0x35B654110D164E99n ]), /*C7*/
new BigUint64Array([ 0xADDDFF1BD2C11CD4n, 0x2A1A262CBA6E1AA0n, 0x0BF2291D09475A46n, 0x4C93A0ABADF4DE32n, 0x73EE8E1327333E63n, 0xF3AE2031F5D13B28n ]), /*C8*/
new BigUint64Array([ 0x246C7CABB2D9A55Cn, 0x50E9C7282C1EE0F6n, 0x2FBDA09565A0D3D7n, 0x196552679C04A4EBn, 0x137C66DA29A6DD82n, 0x08A76B6B4BDA56BFn ]), /*C9*/
new BigUint64Array([ 0x7CA3C59BE3E28610n, 0x6ADD75CF1F7AE248n, 0x01747450737A6435n, 0xA1F2259CB2B4923Bn, 0xE0C8F55E8ECE7210n, 0xD7964398F350B69Bn ]), /*CA*/
new BigUint64Array([ 0xE045864ED1825101n, 0xAC54969193E1A1C5n, 0x23D85A934D0794C7n, 0xB4FA88CB734A4213n, 0x7C5CBFD6BDA3D5F9n, 0x66607FE938748825n ]), /*CB*/
new BigUint64Array([ 0xBAF36FD2A180D481n, 0xEAC440AC1B9598F7n, 0x9AA24D80FFB7B06Cn, 0x79601F517358F163n, 0xD1071831418BB63Bn, 0x819609A6AE7D3A03n ]), /*CC*/
new BigUint64Array([ 0x3E9152D8CDBAE551n, 0x86AD793F203DD016n, 0xBE3AEB778AD4A891n, 0x2810254DD76B6618n, 0x9B5DCDE36636C327n, 0x0A8AAD65868BC58Cn ]), /*CD*/
new BigUint64Array([ 0x6D0672780D93152An, 0xEEE705247B828091n, 0x9EBDB976F137463Fn, 0xA7DE3E73A2D0C1BFn, 0xF871A00BA0046AC7n, 0x484C96A803F23486n ]), /*CE*/
new BigUint64Array([ 0x0FC7BCDABB06BFFBn, 0xF75C3FFB3D6309B3n, 0xECA305D103109162n, 0x373F503B204FFF61n, 0xCE332C9F54963FA2n, 0x9A4420A52242CDB4n ]), /*CF*/
new BigUint64Array([ 0xC71D481179D198C1n, 0x505A2845CEE92569n, 0xF339BFF6DD6755B5n, 0x8BEAD52B8DE89245n, 0x4B686E65920DCA2Bn, 0x99593FA43EE68A37n ]), /*D0*/
new BigUint64Array([ 0xD90A68D717E61501n, 0x9BB920AEA19161A6n, 0x2F3D6F96D90EB1E4n, 0xDF15ECBA10513D7Dn, 0xE6E5D539B4F01831n, 0xC7D17A7528FECE36n ]), /*D1*/
new BigUint64Array([ 0xA04FF0BEB4EBFBAFn, 0xE5E90A5B3DDAA3CAn, 0x8453542209F4A145n, 0x80A6FFD72BB5A707n, 0x14E0C4705A1ABF6An, 0xD699EC1FC18A677Dn ]), /*D2*/
new BigUint64Array([ 0x7021A124E3181575n, 0xDC7AAE2817AD945Fn, 0x8BB5521E7F0D565An, 0x6671D3792F0805EEn, 0xD3888EA394413A1An, 0xCE4D7E47B55BF9CCn ]), /*D3*/
new BigUint64Array([ 0x22F440263CAADE68n, 0xE77BB287772EAC7Bn, 0x29493775962A40E9n, 0x1E06A27FA68CB91Bn, 0xDDEF02932ABDB9C7n, 0x79F03B88DC175233n ]), /*D4*/
new BigUint64Array([ 0x65F6D517B53E2391n, 0x97DB65A2F00B1C39n, 0x1D77AE9B85AA4855n, 0x19133B9B3E9B0771n, 0x6376D9F11A7DB3D4n, 0x949AD02F5AE16184n ]), /*D5*/
new BigUint64Array([ 0xFE4434CDE09D923Bn, 0x03B0FCFD713B7052n, 0x2D713290D4A67238n, 0x2B56946FF629EE96n, 0x60A15D01B2B3C428n, 0x0B1D5EAF793933A0n ]), /*D6*/
new BigUint64Array([ 0xBC40FCFB0E0D494Bn, 0xA31C4648C7B3D1DEn, 0xF1113C219A07EC8Dn, 0x2378BEB1A5C2BD1Cn, 0x190CC3478070A194n, 0x63DAB6E1CCF56329n ]), /*D7*/
new BigUint64Array([ 0x901B6B9E82BABF91n, 0x872A234C45D61001n, 0x6CA46A95C1CC6D6Cn, 0x22779315E0F02295n, 0x60A59396346BE6ACn, 0xFB67A503CB488846n ]), /*D8*/
new BigUint64Array([ 0x50D440F74C97660Bn, 0xE71ECABF64EDFE0Cn, 0x80201B895718CE22n, 0xA05D89804D35D306n, 0x8F700402A2B0D086n, 0x326FCB334CA4DFC0n ]), /*D9*/
new BigUint64Array([ 0xBCFBD02EA005CDD5n, 0xF0225A4675553115n, 0x08E18B3692A7AF62n, 0x05D34A820C8CED0An, 0x51A8D7CEC33E80EAn, 0x0AC007503FAE879Cn ]), /*DA*/
new BigUint64Array([ 0xF43EEFB5C83C521An, 0xE5E9B05FC48841ACn, 0x79C52C38BF85B5F9n, 0x26CD0818AE3BF7A9n, 0x4F385C32CA8F5F74n, 0xF17B22107B954752n ]), /*DB*/
new BigUint64Array([ 0x1A48FC969198A4B0n, 0xD9A78940BB0C4E1Cn, 0x42781D9BE60E7691n, 0x87D1CAF3680F8A30n, 0xD09FF193606AAF29n, 0x4518DABC60048793n ]), /*DC*/
new BigUint64Array([ 0xF05D48134A56A034n, 0x89A65EEB91DC69B9n, 0x8FC7F43960E63C62n, 0xFA1C6B9FF9415E92n, 0x7E219D4E56347935n, 0x2B6A48D6DE0AEF85n ]), /*DD*/
new BigUint64Array([ 0x1A7FF9C54B045FFDn, 0x44A0A9562E9468B2n, 0xF11425A22D1EBF92n, 0x208D33120BD28E0En, 0xF2D74197AF80E162n, 0xCEEDCA73DFE66C93n ]), /*DE*/
new BigUint64Array([ 0xD57190439D29C9A4n, 0x44C007DC2B5EAF9Dn, 0xEF6DDF48A780CEDCn, 0x61B205E4A96024B1n, 0x1885B6CE84C3FE5Dn, 0xB8B56986B6E2CE21n ]), /*DF*/
new BigUint64Array([ 0xF36DACFA34237E99n, 0xBE45EB5253BCFED0n, 0x402C6946B8B21AC0n, 0x2460A6FCE7E9CD67n, 0xF89A6D5B162629FCn, 0xF66CCEA374DB821En ]), /*E0*/
new BigUint64Array([ 0x16E06074DCC31A1Dn, 0xF172017AC3FA38C3n, 0xBBC1CE4BB784ED60n, 0xDA89A8BCE82AE671n, 0xA6DACFFB8D26C0BBn, 0x185181AE9609F6D6n ]), /*E1*/
new BigUint64Array([ 0xF110DBDD94D17661n, 0xF59FBB4CBA69F393n, 0x463B60FB3F3C5E00n, 0x1C60B896FE8E78ACn, 0x5EB3E26795DE5AB6n, 0x997328D4654D6219n ]), /*E2*/
new BigUint64Array([ 0x21069118ABE24B61n, 0x811CB8C48FCEFC6An, 0x483B032CFB56F902n, 0xFB32E848198CC057n, 0xA620815462A04F70n, 0x900038D1894959E2n ]), /*E3*/
new BigUint64Array([ 0x5AD509789BFFECD0n, 0xDDCD5E8325F69CA0n, 0x154D8F1ACD9B8C82n, 0xAC7DF75E94CE3CAFn, 0x6D6554D1B38754BEn, 0xB5DB64AF738486E7n ]), /*E4*/
new BigUint64Array([ 0x35A308A1AC9A43BFn, 0x2647805AB3E6E492n, 0x4BB74A616F61588Fn, 0xFA4602EE5BDBF54En, 0x3FDD62470A7174DBn, 0x5795433CA808FAACn ]), /*E5*/
new BigUint64Array([ 0x51A094B8774CA605n, 0x5F07974C74EEF225n, 0x022AFEF7AD81A953n, 0x0967C44BBA336FD6n, 0x8AA327918AECBA3Dn, 0xF70B8436573C3F0An ]), /*E6*/
new BigUint64Array([ 0xCF374F83420766C3n, 0x71F31901A13EF07Cn, 0x63AD56C7DEF9DC0Fn, 0x9E5BB5E859F5A231n, 0xD0BF453BB9893E4Cn, 0xA1E14B66C2719760n ]), /*E7*/
new BigUint64Array([ 0xB41861CC73FD3E48n, 0x461D79A138B04BE1n, 0x4010D37D37FBA817n, 0x7D9622AA693225A4n, 0x2204454B8126799An, 0x33A5D487DCCD6EB6n ]), /*E8*/
new BigUint64Array([ 0xD291D0317A053320n, 0xE27678F1E50D1F76n, 0x9A3D663A63159FC7n, 0xAD7B4D3F67BAB452n, 0x269CC05E2B33CE1Cn, 0x0FB8261CD734BCC3n ]), /*E9*/
new BigUint64Array([ 0xF3D0546D3D4A25EEn, 0xB42874AD28C9B7F2n, 0x73EC788B29962D28n, 0x4AE73A48132B8553n, 0x756C99D7A0910B66n, 0xECA7E2C2712D555Cn ]), /*EA*/
new BigUint64Array([ 0x559FA5BF24911FDDn, 0xA1DDF5DE3770554Bn, 0xC7C3FD139366B946n, 0x6E7ECC0C881D2BA4n, 0x14E76D6A27E54B87n, 0x7352D5FBC4FAB878n ]), /*EB*/
new BigUint64Array([ 0xF19A622BED8DAC0An, 0x35548E5D7EFC5A2En, 0xCAC84974B4F057B2n, 0xAB317ED03D0335AEn, 0x710FC138F2C51738n, 0x9C90CC495A403416n ]), /*EC*/
new BigUint64Array([ 0x9FA7DEB936F10461n, 0xA1529B0B58462F9Dn, 0x9F109111C8B9EC65n, 0x23A3EB28444E33EAn, 0x554084CA75118937n, 0x599D58A7C946EAC2n ]), /*ED*/
new BigUint64Array([ 0x6EC3AABB7856AC4En, 0x980E6907C1CBCCAFn, 0x1F8557ADC700CBF5n, 0x7DCB1CE0AF48D9F4n, 0x7FB3DADF8199AB8An, 0xE6B36DB8FADBF312n ]), /*EE*/
new BigUint64Array([ 0xC00F0D3F7A101660n, 0x605B94B12DB6C697n, 0x79944F7BA2B65F38n, 0x40858ADEDD47E2BCn, 0x1E044BDB0E9FB02Bn, 0x86C79D01A3109539n ]), /*EF*/
new BigUint64Array([ 0x9731893D5B98482An, 0xFB8DE267F9790326n, 0x8780F407143A505Dn, 0xA41CAEFCCCD3A8E3n, 0xA042F0B3D7B7A7FEn, 0x3E3151FEBB19A1ACn ]), /*F0*/
new BigUint64Array([ 0xE7EDF679003A6950n, 0xBAFC97D4A8C6AB12n, 0x13C096B49C79559An, 0xC3052501434B5019n, 0x1280FB23E7ADFB09n, 0x1959905D31BD2FC0n ]), /*F1*/
new BigUint64Array([ 0x575C0C46FCFCC65Bn, 0xFE625E873F34B419n, 0x1696FDCC7F51B8A3n, 0xC79C56F30E5AE7C0n, 0x14E3461CD27FAD15n, 0x1B7BCCB9CB472859n ]), /*F2*/
new BigUint64Array([ 0x3806FE58E5CC8F16n, 0xF8244ED76734C1BFn, 0x4E04940E0F5DDB56n, 0x5BD0AFDDC4158B7Bn, 0xA4C6BA949911C5C9n, 0xFF6E2AC155AE9726n ]), /*F3*/
new BigUint64Array([ 0x49C7C844B8114144n, 0xB450E41BCA35CB00n, 0x302450EC67BEF97Cn, 0xA8662049DB1E0D8Bn, 0xDA69C022528EB8FAn, 0x6ABBF16585C1A2F7n ]), /*F4*/
new BigUint64Array([ 0x37BB420DF67F044En, 0xDCC0E9F3E2EF07B3n, 0x4D10088618777841n, 0x0492E5379305DAAEn, 0x3DA4791C37E4128Fn, 0x80688445CBA4EA17n ]), /*F5*/
new BigUint64Array([ 0x51398A7CE4CF8D9Dn, 0x49A5FCD891A69CA5n, 0x3D72A60EC2392DA5n, 0x0E8296B879AB5539n, 0x6BCB00AF2EDC0BDEn, 0xBEB93848E54B3E90n ]), /*F6*/
new BigUint64Array([ 0x7AD7C52A18922E19n, 0x29292C57C4F5B8F5n, 0xF0CF1F98A577C10Bn, 0x072B9F293BB660CDn, 0x09B8604F5575B6FBn, 0xDECB396A81B9FCDBn ]), /*F7*/
new BigUint64Array([ 0x254AD7ADB4C220DEn, 0x6C62E20F95A0070Dn, 0xADEB89F339309BD8n, 0xA2F685CC178B289Fn, 0x9343905B5DEE95A5n, 0xE0C30F34A2977C86n ]), /*F8*/
new BigUint64Array([ 0x669CD51AF7CFBFAAn, 0xE3E0806F6880271Dn, 0x6934C259E098BF90n, 0x5DFEEAF0FBCA7249n, 0x89F74B948B4118B6n, 0x53640AEAFB6807C3n ]), /*F9*/
new BigUint64Array([ 0xDD3BACDCC04BE120n, 0x6D4949BD64198E51n, 0x31FDB39666598A74n, 0xBBBC6DE9C0C15A81n, 0xF27F201C61C06279n, 0x2738AFE3E84E5CDDn ]), /*FA*/
new BigUint64Array([ 0xCDD71FD35A6411DEn, 0x3CC012793E87523Fn, 0xB0CFF8720FCA36F3n, 0x93E85FE07300F012n, 0xE894A085263F090Bn, 0x2DF60A01DAFA90ECn ]), /*FB*/
new BigUint64Array([ 0x9DA50DB1EEB4FADDn, 0xE524E49C9974799An, 0xDE09FFF26A24CBB9n, 0xAF9D71E9F3ACE7CDn, 0xEB62B1A62566EC9Dn, 0x06D02AB1217D3553n ]), /*FC*/
new BigUint64Array([ 0xDD31E6391AE03522n, 0x93ACD1065B35E915n, 0xF4EB56CC03E79218n, 0x0717815C850C97F1n, 0xBF4F6A8AC0540A6Fn, 0xFCF8AE5DE9507FF0n ]), /*FD*/
new BigUint64Array([ 0xAB45B413DC50B207n, 0x40B417369551D8D5n, 0xCA32286A108E7210n, 0x03225E54D8D093AFn, 0x4B6CA5591EA576E9n, 0x4E12AB774DC4E062n ]), /*FE*/
new BigUint64Array([ 0xD9F4F850DF6CB96Cn, 0x8ABAD81B1667335Dn, 0xCB4079CFE79C72E5n, 0xE5542F763E316996n, 0x303E4B79B9D397C4n, 0xE46933038B945111n ]), /*FF*/
new BigUint64Array([ 0x75B15CC53B0D2502n, 0xDA1BCA6BA0524358n, 0x9EDA977556C06B7En, 0x6C57727ECF0A1325n, 0xDC613D5A78E5C3F8n, 0xCE062D94A3B4945An ]) /*ZZ*/
];
const NUHASH_RND = [
new BigUint64Array([ 0x6A09E667F3BCC908n, 0xB2FB1366EA957D3En, 0x3ADEC17512775099n, 0xDA2F590B0667322An, 0x95F9060875714587n, 0x5163FCDFB907B672n ]), /*R1*/
new BigUint64Array([ 0x1EE950BC8738F694n, 0xF0090E6C7BF44ED1n, 0xA4405D0E855E3E9Cn, 0xA60B38C0237866F7n, 0x956379222D108B14n, 0x8C1578E45EF89C67n ]), /*R2*/
new BigUint64Array([ 0x8DAB5147176FD3B9n, 0x9654C68663E7909Bn, 0xEA5E241F06DCB05Dn, 0xD549411320819495n, 0x0272956DB1FA1DFBn, 0xE9A74059D7927C18n ]), /*R3*/
new BigUint64Array([ 0x84C9B579AA516CA3n, 0x719E6836DF046D8En, 0x0209B803FC646A5En, 0x6654BD3EF7B43D7Fn, 0xED437C7F9444260Fn, 0xBD40C483EF550385n ]), /*R4*/
new BigUint64Array([ 0x83F97BBD45EFB866n, 0x3107145D5FEBE765n, 0xA49E94EC7F597105n, 0xFBFC2E1FA763EF01n, 0xF3599C82F2FE500Bn, 0x848CF0BD252AE046n ]) /*R5*/
];
const NUHASH_SBX = new Uint8Array([
0x63, 0x7C, 0x77, 0x7B, 0xF2, 0x6B, 0x6F, 0xC5, 0x30, 0x01, 0x67, 0x2B, 0xFE, 0xD7, 0xAB, 0x76,
0xCA, 0x82, 0xC9, 0x7D, 0xFA, 0x59, 0x47, 0xF0, 0xAD, 0xD4, 0xA2, 0xAF, 0x9C, 0xA4, 0x72, 0xC0,
0xB7, 0xFD, 0x93, 0x26, 0x36, 0x3F, 0xF7, 0xCC, 0x34, 0xA5, 0xE5, 0xF1, 0x71, 0xD8, 0x31, 0x15,
0x04, 0xC7, 0x23, 0xC3, 0x18, 0x96, 0x05, 0x9A, 0x07, 0x12, 0x80, 0xE2, 0xEB, 0x27, 0xB2, 0x75,
0x09, 0x83, 0x2C, 0x1A, 0x1B, 0x6E, 0x5A, 0xA0, 0x52, 0x3B, 0xD6, 0xB3, 0x29, 0xE3, 0x2F, 0x84,
0x53, 0xD1, 0x00, 0xED, 0x20, 0xFC, 0xB1, 0x5B, 0x6A, 0xCB, 0xBE, 0x39, 0x4A, 0x4C, 0x58, 0xCF,
0xD0, 0xEF, 0xAA, 0xFB, 0x43, 0x4D, 0x33, 0x85, 0x45, 0xF9, 0x02, 0x7F, 0x50, 0x3C, 0x9F, 0xA8,
0x51, 0xA3, 0x40, 0x8F, 0x92, 0x9D, 0x38, 0xF5, 0xBC, 0xB6, 0xDA, 0x21, 0x10, 0xFF, 0xF3, 0xD2,
0xCD, 0x0C, 0x13, 0xEC, 0x5F, 0x97, 0x44, 0x17, 0xC4, 0xA7, 0x7E, 0x3D, 0x64, 0x5D, 0x19, 0x73,
0x60, 0x81, 0x4F, 0xDC, 0x22, 0x2A, 0x90, 0x88, 0x46, 0xEE, 0xB8, 0x14, 0xDE, 0x5E, 0x0B, 0xDB,
0xE0, 0x32, 0x3A, 0x0A, 0x49, 0x06, 0x24, 0x5C, 0xC2, 0xD3, 0xAC, 0x62, 0x91, 0x95, 0xE4, 0x79,
0xE7, 0xC8, 0x37, 0x6D, 0x8D, 0xD5, 0x4E, 0xA9, 0x6C, 0x56, 0xF4, 0xEA, 0x65, 0x7A, 0xAE, 0x08,
0xBA, 0x78, 0x25, 0x2E, 0x1C, 0xA6, 0xB4, 0xC6, 0xE8, 0xDD, 0x74, 0x1F, 0x4B, 0xBD, 0x8B, 0x8A,
0x70, 0x3E, 0xB5, 0x66, 0x48, 0x03, 0xF6, 0x0E, 0x61, 0x35, 0x57, 0xB9, 0x86, 0xC1, 0x1D, 0x9E,
0xE1, 0xF8, 0x98, 0x11, 0x69, 0xD9, 0x8E, 0x94, 0x9B, 0x1E, 0x87, 0xE9, 0xCE, 0x55, 0x28, 0xDF,
0x8C, 0xA1, 0x89, 0x0D, 0xBF, 0xE6, 0x42, 0x68, 0x41, 0x99, 0x2D, 0x0F, 0xB0, 0x54, 0xBB, 0x16
]);
const NUHASH_FIN = new Uint8Array([
0xB4, 0x98, 0x0C, 0x84, 0x24, 0xF3, 0x27, 0x8F, 0xA6, 0x5E, 0xF0, 0x65, 0x86, 0xBC, 0x09, 0x92,
0x75, 0x21, 0xB9, 0x95, 0x66, 0x8A, 0x2F, 0x13, 0xB5, 0xB7, 0x6B, 0x33, 0x2A, 0xBF, 0xF7, 0x0F,
0x0A, 0xE7, 0x16, 0x30, 0x77, 0x61, 0x48, 0x90, 0xDF, 0xAF, 0x72, 0x79, 0xF6, 0xA5, 0x58, 0xD1,
0xF2, 0x40, 0x9F, 0x41, 0xE8, 0x03, 0xA1, 0x05, 0xC5, 0x35, 0xC7, 0x97, 0x54, 0x7B, 0xB3, 0xF5,
0xB8, 0xA8, 0xD8, 0x68, 0x51, 0xAD, 0xE3, 0xC2, 0x5D, 0xCF, 0xEA, 0x89, 0x37, 0xF1, 0x55, 0x60,
0xA4, 0x26, 0xAC, 0x32, 0x0E, 0xD2, 0x85, 0x6F, 0xC8, 0xDC, 0x36, 0x6D, 0xA3, 0x22, 0x5A, 0xC9,
0x5C, 0x91, 0x1B, 0x5B, 0xE9, 0x78, 0xD7, 0x44, 0xEB, 0x1A, 0xC0, 0xCA, 0x94, 0x53, 0xC4, 0x11,
0x12, 0xCC, 0xFF, 0x88, 0x0D, 0x4E, 0xB2, 0xB1, 0x4A, 0x3A, 0xE1, 0x2E, 0x0B, 0x4C, 0x5F, 0x06,
0x81, 0x31, 0xD9, 0x3D, 0xFD, 0x43, 0x67, 0x62, 0x00, 0x9C, 0x50, 0xCE, 0x6E, 0x15, 0x82, 0x29,
0x96, 0xDA, 0x87, 0xEF, 0x6C, 0xC1, 0x8B, 0x07, 0x8E, 0x17, 0xEC, 0x9A, 0xBA, 0x46, 0x04, 0x73,
0x39, 0xE4, 0x63, 0xBE, 0x64, 0x47, 0xE6, 0x3F, 0x25, 0x52, 0x59, 0xA7, 0x42, 0x38, 0x99, 0x01,
0xE5, 0x1D, 0x28, 0x7A, 0xB0, 0x7C, 0x9D, 0x56, 0xE2, 0xD6, 0xA0, 0xF4, 0x1E, 0xE0, 0xD3, 0x83,
0x6A, 0xBB, 0x18, 0x20, 0xAE, 0x57, 0xAA, 0x8D, 0x71, 0x1F, 0x34, 0x4D, 0x2D, 0x3C, 0x2B, 0xF8,
0x10, 0x7E, 0xCB, 0xFB, 0x49, 0xA2, 0x45, 0x7F, 0x3E, 0xBD, 0xC3, 0xFC, 0x14, 0x74, 0x23, 0x4F,
0x7D, 0x69, 0x93, 0x19, 0xD0, 0x1C, 0x08, 0xF9, 0xDD, 0xC6, 0x2C, 0x9E, 0xA9, 0x4B, 0xFE, 0xED,
0x76, 0xDB, 0xAB, 0xD4, 0x80, 0xCD, 0xB6, 0x8C, 0xDE, 0x70, 0x9B, 0xD5, 0xFA, 0xEE, 0x02, 0x3B
]);
/* ------------------------------------------------------------------------ */
/* Update function */
/* ------------------------------------------------------------------------ */
function update(hash, index) {
const row_addr = NUHASH_XOR[index];
const data_view = new DataView(hash.buffer);
const begin = data_view.byteOffset, end = begin + data_view.byteLength;
for (let rnd_key of NUHASH_RND) {
const initial = hash[0];
hash[0] = BigInt.asUintN(64, (hash[0] << 32n) | (hash[1] >> 32n)) ^ row_addr[0] ^ rnd_key[0];
hash[0] = BigInt.asUintN(64, (hash[0] ^ (hash[0] >> 31n)) * 0x7FB5D329728EA185n);
hash[0] = BigInt.asUintN(64, (hash[0] ^ (hash[0] >> 27n)) * 0x81DADEF4BC2DD44Dn);
hash[0] = hash[0] ^ (hash[0] >> 33n)
hash[1] = BigInt.asUintN(64, (hash[1] << 32n) | (hash[2] >> 32n)) ^ row_addr[1] ^ rnd_key[1];
hash[1] = BigInt.asUintN(64, (hash[1] ^ (hash[1] >> 31n)) * 0x99BCF6822B23CA35n);
hash[1] = BigInt.asUintN(64, (hash[1] ^ (hash[1] >> 30n)) * 0x14020A57ACCED8B7n);
hash[1] = hash[1] ^ (hash[1] >> 33n)
hash[2] = BigInt.asUintN(64, (hash[2] << 32n) | (hash[3] >> 32n)) ^ row_addr[2] ^ rnd_key[2];
hash[2] = BigInt.asUintN(64, (hash[2] ^ (hash[2] >> 31n)) * 0x69B0BC90BD9A8C49n);
hash[2] = BigInt.asUintN(64, (hash[2] ^ (hash[2] >> 27n)) * 0x3D5E661A2A77868Dn);
hash[2] = hash[2] ^ (hash[2] >> 30n)
hash[3] = BigInt.asUintN(64, (hash[3] << 32n) | (hash[4] >> 32n)) ^ row_addr[3] ^ rnd_key[3];
hash[3] = BigInt.asUintN(64, (hash[3] ^ (hash[3] >> 30n)) * 0x16A6AC37883AF045n);
hash[3] = BigInt.asUintN(64, (hash[3] ^ (hash[3] >> 26n)) * 0xCC9C31A4274686A5n);
hash[3] = hash[3] ^ (hash[3] >> 32n)
hash[4] = BigInt.asUintN(64, (hash[4] << 32n) | (hash[5] >> 32n)) ^ row_addr[4] ^ rnd_key[4];
hash[4] = BigInt.asUintN(64, (hash[4] ^ (hash[4] >> 30n)) * 0xBF58476D1CE4E5B9n);
hash[4] = BigInt.asUintN(64, (hash[4] ^ (hash[4] >> 27n)) * 0x94D049BB133111EBn);
hash[4] = hash[4] ^ (hash[4] >> 31n)
hash[5] = BigInt.asUintN(64, (hash[5] << 32n) | (initial >> 32n)) ^ row_addr[5] ^ rnd_key[5];
hash[5] = BigInt.asUintN(64, (hash[5] ^ (hash[5] >> 30n)) * 0x4BE98134A5976FD3n);
hash[5] = BigInt.asUintN(64, (hash[5] ^ (hash[5] >> 29n)) * 0x3BC0993A5AD19A13n);
hash[5] = hash[5] ^ (hash[5] >> 31n)
for (let offset = begin; offset < end; ++offset) {
data_view.setUint8(offset, NUHASH_SBX[data_view.getUint8(offset)]);
}
}
}
/* ------------------------------------------------------------------------ */
/* Bit conversion */
/* ------------------------------------------------------------------------ */
function toBigEndian(hash) {
const result = new Uint8Array(NUHASH_BYTES);
for (let i = 0; i < result.length; ++i) {
result[i] = Number(BigInt.asUintN(8, hash[i >> 3] >> BigInt(56 - ((i & 0x7) << 3))));
}
return result;
}
/* ------------------------------------------------------------------------ */
/* Stream API */
/* ------------------------------------------------------------------------ */
export class NuHash {
#hash;
#finished;
constructor() {
this.#hash = NUHASH_INI.slice();
this.#finished = false;
}
update(src) {
if (!((src instanceof Uint8Array) || (src instanceof String) || (typeof(src) === 'string'))) {
throw Error('invalid argument: src must be of type Uint8Array or String!');
}
this.#checkState()
if (src) {
if ((src instanceof String) || (typeof(src) === 'string')) {
src = this.update(new TextEncoder().encode(src));
}
for (let b of src) {
update(this.#hash, b);
}
}
return this;
}
doFinal() {
this.#checkState(Boolean(1))
update(this.#hash, 256)
for (let b of NUHASH_FIN.slice()) {
update(this.#hash, b);
}
return toBigEndian(this.#hash);
}
reset() {
this.#hash.set(NUHASH_INI);
this.#finished = false;
}
#checkState(setFlag = false) {
if (this.#finished) {
throw Error('computation is already finished!');
}
if (setFlag) {
this.#finished = true;
}
}
}
/* ------------------------------------------------------------------------ */
/* Simple API */
/* ------------------------------------------------------------------------ */
export function compute(src) {
if (!((src instanceof Uint8Array) || (src instanceof String) || (typeof(src) === 'string'))) {
throw Error('invalid argument: src must be of type Uint8Array or String!');
}
return new NuHash().update(src).doFinal();
}
/* ------------------------------------------------------------------------ */
/* Utilities */
/* ------------------------------------------------------------------------ */
export function toHexStr(src) {
if (!(src instanceof Uint8Array)) {
throw Error('invalid argument: src must be an Uint8Array');
}
let stringBuilder = new String();
for (let value of src) {
stringBuilder += value.toString(16).padStart(2, '0');
}
return stringBuilder;
}

15
libnuhash/js/package.json Normal file
View File

@ -0,0 +1,15 @@
{
"name": "nuhash",
"version": "1.0.0",
"type": "module",
"license": "CC0-1.0",
"scripts": {
"start": "node node_modules/http-server/bin/http-server",
"test": "mocha"
},
"devDependencies": {
"console-title": "^1.1.0",
"http-server": "^14.1.1",
"mocha": "^10.2.0"
}
}

12
libnuhash/js/runme.cmd Normal file
View File

@ -0,0 +1,12 @@
@echo off
cd /d "%~dp0"
if "%NODE_HOME%"=="" (
set "NODE_HOME=C:\Program Files\nodejs"
)
set "PATH=%NODE_HOME%;%PATH%"
if "%~1"=="" (
call npm install
call npm test
) else (
call npm "%~1"
)

View File

@ -0,0 +1,96 @@
/******************************************************************************/
/* NuHash, by LoRd_MuldeR <MuldeR2@GMX.de> */
/* This work has been released under the CC0 1.0 Universal license! */
/******************************************************************************/
import { NuHash, toHexStr } from "../lib/nuhash.mjs";
import * as assert from "assert";
import setTitle from "console-title";
function runTestCase(self, iterations, expected, src) {
self.timeout(Number.MAX_VALUE);
if ((src instanceof String) || (typeof(src) === 'string')) {
src = new TextEncoder().encode(src);
}
let nuhash = new NuHash();
for (let iter = 0; iter < iterations; ++iter) {
nuhash.update(src);
if ((iter & 0x7FFF) == 0) {
setTitle((iter / iterations * 100.0).toFixed(2) + '%');
}
}
const digest = toHexStr(nuhash.doFinal());
console.log(digest);
assert.equal(expected, digest);
}
function decode(base64String) {
return Uint8Array.from(Buffer.from(base64String, 'base64'));
}
describe('NuHash Tests', function () {
it('Test #1', function () {
runTestCase(
this,
0,
"d7964fe1bec2b5ecf21ecc88c86ce4f1e89fb1ef3669d52e34eb049d7fd6c42d4b2bbeeeb70d12c3fcaf43dd2229abc9",
new Uint8Array());
});
it('Test #2', function () {
runTestCase(
this,
1,
"b3f13f534034ae8d645d410e8828673761fe2d697218879f9ea528d976ba2e15a3f7485105e612b9a46cb3988635a70f",
"abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq");
});
it('Test #3', function () {
runTestCase(
this,
1,
"63703476f4ffce4a8c758d0d3b91a857b9a2e3433ee864f931ba328fa7247b1b0ac9c2e0279243b83051aafac6a7e710",
"abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu");
});
it('Test #4', function () {
runTestCase(
this,
0xF4240,
"c6808aeb911c8837cee2e6867e589ab28526a8153494cf35a40c4bd6e20312da33cac4a390cd3b51a2eb4226e60b53e1",
"a");
});
it('Test #5', function () {
runTestCase(
this,
16777216,
"bcca6bc8d113dd3fc171d743ac7ad2d3e63163ea7107d3c78517cf5b53ee0b2f4a0fe079e6a74df350c667b7cfe3cf09",
"abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmno");
});
it('Test #6', function () {
runTestCase(
this,
16777216,
"56770e133b9eb4205f11824ad7280f5c31bc04dd333d1844b3589ab8b94ab95dc09b77be9a8128d7f155fa73de617597",
"g4tB,=[TU%/|8lv_c5Y?F9Sqs1PnV#bNO6DW\\0em~p<ifJhM(2&Qo}`!-*:jrZ{KGX]$zkuLd+)xwC^.\"@AIHR;y'a>3E7");
});
it('Test #7', function () {
runTestCase(
this,
16777216,
"9a8579bb88112b2f3285781a61348d7b04a5632fec12a73a7e0e367a556794a24a32ca7bb14da68eaed83e99c2f8f4c0",
decode("pCxVpbBe2DPzGPunIMc01x0tRo3Kiuf8aFtU2vnDdmKpPTm/F7eyjBCiH+N0akpsepLRUuqIumvWZJae5kxHQsVR8lD0e0/ph22USyPwRRqa5JEPO7RxgpnJSeW+KJOYKtlzZVjAg0iPAxRAGyQepj/3Z6s3Bqz2ZrbdHAo1n1YV7PErfFddAu2oYxZ13JtcfQ1f/QWgbpCVhdITYQijAcjThKoJ9XBv3rkEtdswvAeO/olgJk5ZyzaGEXLixq86i3/6QTjf7i8yoSdpMSlDxJx3IUS4edCtl+DhDhkuIr2A6LH4TT7CfgyzgRLMwVPPeM481Vq7nevvzf8LJa7U"));
});
it('Test #8', function () {
runTestCase(
this,
16777216,
"fbf4444b0329f508bfc6cf44920b311a718e5f4c4c1af978e78223ec3579365ff5d15c16bb5a33d69cb36f3d40564757",
decode("tcib0bpmKRnSMO0mW8SRTRT3FjVaaf6ZpUnxlCu83EzdT8obiJyp9nMv/T9AORPas3H03n8CPWR4ehcKk9/rnwcEeYyYuCiArR/ylmu9Rdn6LFbO8IcjIurFJ9NjryTHtwbkdYN7vy6k7/USXWCVp1MRdLSgnuOuu1VyWaad1Yltj0oMHc0q++7Xw/MlYo6wssI4PGpvTjsI1IY2GFzgHoF3+GjbWFT/l35hwFHJbOWCvs8yQwE6XlBHoTTMDXCsxkSaPhAO7APibqr8fTcxS+a2wRWLBYWKZ/mrjeGiSBzLUmV2DxohqKNCQZCS0IQJLTNf2HyxuVfo1gsg50bp"));
});
});

1
libnuhash/python/.gitignore vendored Normal file
View File

@ -0,0 +1 @@
*.c

View File

@ -0,0 +1,20 @@
NuHash Python module
====================
Requires Python 3.11 or later, Python 2.x is *not* supported.
Instructions
------------
1. Install the Cython package:
$ pip3 install Cython
2. Build the module:
$ python3 setup.py build_ext
3. Run unit tests:
$ python3 test_nuhash.py

458
libnuhash/python/nuhash.pyx Normal file
View File

@ -0,0 +1,458 @@
#!/usr/bin/env python3
"""NuHash, by LoRd_MuldeR <MuldeR2@GMX.de>
This work has been released under the CC0 1.0 Universal license!"""
import cython
from libc.stdint cimport uint8_t as u8, uint16_t as u16, uint64_t as u64
cdef size_t NUHASH_WORDS = 6
cdef size_t NUHASH_BYTES = NUHASH_WORDS * 8
cdef u16 VERSION_MAJOR = 1
cdef u16 VERSION_MINOR = 0
cdef u16 VERSION_PATCH = 0
# ------------------------------------------------------------------------
# Const tables
# ------------------------------------------------------------------------
cdef u64[6] _NUHASH_INI = [
0x243F6A8885A308D3, 0x13198A2E03707344, 0xA4093822299F31D0,
0x082EFA98EC4E6C89, 0x452821E638D01377, 0xBE5466CF34E90C6C
]
cdef u64[257][6] _NUHASH_XOR = [
[ 0x01DCDF00414B3037, 0xB1B3AF661B8E96F8, 0x944D2873DB393121, 0x73DA9A36662AE755, 0x1F4F318C4ECB56B1, 0xF09743D99C2AA5BC ], #00
[ 0xA81FBBC6CBBFC954, 0x39DE43648959EDDB, 0x1A641A0BDA01822F, 0xB52E607266932658, 0x2C5B1731AC802084, 0xC2EF10671FC79DD4 ], #01
[ 0xCF2A8D8E08810046, 0x8B7E9B2089E268F6, 0x930461652C5D2DEC, 0xF096E42223BFC8B9, 0x8DD338964CFE0970, 0x269C342F7CEC60BD ], #02
[ 0xB970A920D2ED0552, 0x010F894A254DA7E1, 0x8D5F205F9D1A40D8, 0x50C33DCCC3FD5F58, 0xB49F31BDE7D82C57, 0x7CDE04F62A959033 ], #03
[ 0x49FAB2822B9C84AC, 0x34B8648CD68CBEF1, 0xE5121147BB4126DE, 0xC0B31F54B2FFE00F, 0x2F193DA38E8CC632, 0x058C984B429B8AFC ], #04
[ 0xE07F9DA44D8C9942, 0xBE2AF9B39ACA65F2, 0x5D3D8FB1466DC295, 0xC0051E3EC3F962C7, 0xF8FDC3CCD4CE2BB6, 0x9024C0EFC6199937 ], #05
[ 0xA3111377EF01F5EF, 0x31F59B366C02A3FF, 0x61B82949760D16DC, 0xF6B958AF92BD3BDF, 0x7297AAEFEC69C0B2, 0xFE8A50AD9E8684CD ], #06
[ 0x3D3DD0C829EA9AA0, 0x3E77597EEC96C7A3, 0x8FD038231E7F1684, 0x64617B131FB7EDE0, 0x85C99CE4C5405874, 0xA58735D41F19C5E3 ], #07
[ 0x8028628ACAF91B9A, 0x194A640538C97064, 0x04A15E018A4F1680, 0xF4BE1B04C2360955, 0xDFB24D4CEF581A20, 0x3C59D0A0FD15879D ], #08
[ 0x88F8E2ECE78AF1BC, 0xB46B6E22297364C2, 0x9339F17F926B99F3, 0x31293489B3B8F07C, 0x3909CE1649C9BCF1, 0x0C46103BFA31BCE9 ], #09
[ 0x4D1A0B8CC7EFE2A9, 0xAFD7878CAD55E871, 0xC89CFBC858CF4153, 0xC4739486C74F75D6, 0x0BF7192C130AC9F2, 0x0084F2BC5E81BD9A ], #0A
[ 0x4AFBE975014FCACF, 0x41DEAF8CFACC41E4, 0x3C1EC23B53ED16E9, 0x78B06EB30F1C3248, 0xDD11165D04285C72, 0x6546D9B5609491E4 ], #0B
[ 0xFFD1E2E04DC8D260, 0x07B186948A74ECCE, 0xB5120E45121AC531, 0xBD0BC86330810C85, 0xDE93AFDDDB487730, 0x78DEB0DE6EB99196 ], #0C
[ 0x79BAA2AC3FDEBA55, 0xB1B7E3E1C92A567E, 0xA53F69AB4A5B0794, 0xF0DA7499954F6DDD, 0x58117C89E1132248, 0xD95DF5F794C51A6E ], #0D
[ 0x89BC8A0C65091C33, 0xB04EEAEE063135C2, 0xF53267E04AB6E689, 0xB4C579B7207E8BF2, 0x3FD31E51343CD2DF, 0x119E523E2F8197FE ], #0E
[ 0x2E10CB1C6060F32D, 0xBC92E732A94E6B63, 0xF3220D831FD04267, 0x502C5F7414BCE87F, 0x89E0651DE91D2457, 0x759E56B04482D915 ], #0F
[ 0x43AEE32C6A84E803, 0x0C5007202C0BD7E3, 0xB4F464474205D32A, 0x7D17FC95DE386C06, 0xE8DFBF64567AA545, 0x55BD889D5853046F ], #10
[ 0x687ABE14EAB8DA27, 0x397B3AB50D72C344, 0x505EAA6D1FDE618D, 0x61BE79865DA13F69, 0x17BBAB29B5E90E2D, 0x010C921972FA8B2F ], #11
[ 0x8B7223A4F56FF453, 0x291B7B5CB98B6FE1, 0xFD421625786FBF7D, 0xE33D1020D0E8CDC8, 0xCA530C708B739E87, 0x878AF1F304B8A12F ], #12
[ 0x7ECE1F24E56DD711, 0x2E0869241B2FA6DF, 0x84B834DCC459B2FD, 0xE022EDA6319E7D3B, 0x59839D8CA03C9928, 0x644790F491BBC774 ], #13
[ 0xCBDC6F49E6B0DD0D, 0x44BA2F8D00346732, 0x86BCC821586AE61C, 0xC7B7491285CEE55B, 0xED3912FFD97F3851, 0xF4AF0186BEBEBCBF ], #14
[ 0xCA8A48E54ECCE516, 0xBEDF1864B7F8F506, 0xD56A1F60A4B36AA4, 0x49B25AB5FE0DD9D9, 0x21377DBB5E49FCE1, 0x708F64F5D59D99E7 ], #15
[ 0xE9F873A569AFE02C, 0xDA66BC05CA997390, 0x8C88174756D35385, 0xEAAAF16CF4FDA730, 0xB39F7A55653A3512, 0xF10AB727BC23E852 ], #16
[ 0x93E96FF8C5BBE2AF, 0xA47785420253E97C, 0x704B25D1F77D074C, 0xC0B2093F1470559C, 0x8D5BFDD4E364AACF, 0x550518673F5B1BF7 ], #17
[ 0x8DAC832E5BE81ACB, 0x588BFB202B7583D8, 0xA34D8A70DFD1D7E4, 0xD03B0627B687033E, 0xE3D0BE7EDBDC75CF, 0x818EE8C5B09F8BEA ], #18
[ 0x8E3B02E1489D7D31, 0x5336752B64E3B532, 0xE4D4CC795C580A65, 0x6DAB08F313ED767E, 0x8E567E88FDBA36BF, 0x259490F1D8E933D0 ], #19
[ 0xEAB437D0D62CAA62, 0xC090AD28B982B003, 0xE255D768D25704EC, 0xA048511AF6256A43, 0xE79F078F4D498B5F, 0xC41735FB75B357FE ], #1A
[ 0x70DA9FC3504FF29D, 0xB9AB1F388673FF25, 0x36922F4CD17357BA, 0xF09C3AB292E7E04A, 0x90CE0BC3D9BA13EC, 0x647C4CA63C918DE3 ], #1B
[ 0xD834A38DD1ECD688, 0xA97A0020DE46AB6A, 0x9CDEC7F6E62EA71F, 0x288A5A6FD74DC47E, 0xD44A2E2765CE50F1, 0xBB9B50B5DB9E4F3C ], #1C
[ 0xC66DA90E41DDF2E6, 0x5A3FE86F160C5C09, 0x6F6AF0405108CCBE, 0xF938382EB627FC7F, 0x163DD634617F006C, 0x5184B1FEDC908497 ], #1D
[ 0xC95719ED07FCB21C, 0x5112DF043F6EE7EB, 0x50F9FD60012334CE, 0x589FA85104D96579, 0xB7129E44D71905A7, 0x3314766E0733528D ], #1E
[ 0xDC6C8014C5457CB8, 0xD635FDCD286A69B6, 0xD66F232CE27D01BF, 0x56AF4AC0F682EC0F, 0x57DF1D55B64328F5, 0x651ED4C52A87CACA ], #1F
[ 0x26D9D1CC79EEC502, 0x69BF340A34B1EBFE, 0xFAA5AAAC8E397174, 0xD0A8F9BD426BCF6F, 0x5B131F464D6D2452, 0x122DD15660D0D6DA ], #20
[ 0x6E389AEC5F51A22F, 0x7EF68F1C54C127FB, 0x986D4D46E0485C30, 0xF0A47B39E7CF8A31, 0x1D398DFDB7F2A78F, 0x2FC651D1FBB10D2E ], #21
[ 0xA44E4E8D1B49DCB0, 0x07A4822049C2F343, 0xC40AC04A8D6505BA, 0xD9B91D3F0729B16C, 0xAAF39951B50F9015, 0x966EF5D3AD3F9076 ], #22
[ 0xEA78CBAC0EB6D009, 0xA0FEA6725A23DEAB, 0xCE729C7444CB94D9, 0x40A994626627AA0D, 0x37F738CDE3D018D5, 0x4C29491C01CDB3C5 ], #23
[ 0x7C9792AEA745C87A, 0xD1FF5620C5BD8FD4, 0x9ECA84E3004B56B9, 0x5AFD3923C228B1D6, 0xE5DBF79EB3FD283B, 0x441712E354084B9F ], #24
[ 0xE35D288BD8E249BC, 0x91776C1453A366E5, 0xF5D1E1684E95EFEC, 0x9108E117D7DDF606, 0x81B30F9DA2CE7C8C, 0x6497DBD786818C0D ], #25
[ 0xC2F891FF45044BE0, 0x75A1A76D2B87E2EB, 0x85CE65798AF3C2BF, 0x213F532B4EFD09DC, 0x0DAA1DF5A53A6C88, 0x3028606A50D826B2 ], #26
[ 0x609A62616379F33A, 0xA339A3BC53E4516D, 0xD7AD92616A5ADBEC, 0xD043726D86E924AA, 0x8555B564F4C29865, 0x56AA12AB31C1D6B0 ], #27
[ 0xCED9ED85C1C17BFF, 0xEB522325ACBAFFC2, 0x04D3D8F4B2D15394, 0xD271504C04756EEA, 0x2DDBA4A91AF827F1, 0x1F67D5C28F8002E4 ], #28
[ 0x8B9C08AD432DC08F, 0x5A7543E29796BBC7, 0x34A6DB5B3C1967DE, 0x016E3BC2A2804EE4, 0x5B9BCACCE5172F75, 0x7549598B80ADBDBA ], #29
[ 0x6F3FB117C5CDD155, 0x16C3B0A59CD6EEC5, 0xD9A1A411DE538769, 0x938C54979F4AC37C, 0x3737BCC1D55284DB, 0x6CAD9F8AF9156BB7 ], #2A
[ 0xEBBF284F9C75EBDF, 0xB383EBB406753DE8, 0xAA86127AEE7C403C, 0x10BFDD10523DE027, 0x138BF6C4EB4A8A13, 0xB1EFF67DDB78B067 ], #2B
[ 0xF6D1138D7AA3DA5E, 0xBAA8098D8FB66371, 0xDAE76D1B8B6CAAF2, 0x400F1034368D1EDC, 0x7C937F5172E8D277, 0x7D05BBF83CADE6EF ], #2C
[ 0x0E9C2EA6CF34B081, 0x9036B30D58F60BA0, 0xDB3A2C5848F08BCA, 0xC87AD1B94250D564, 0x7C892E09EEF96166, 0x26DB85CF571085F3 ], #2D
[ 0x251EE3F58718C12A, 0xF9438D81178A2AE4, 0xF0929A889039A8A8, 0xF06B65225EBDCCFD, 0x2E4D14EDF7BF73C6, 0xA9369895BC1DFACF ], #2E
[ 0xCAE302B41D6979CB, 0xBBFA5A58B51EE623, 0x5113B99DC81AB52F, 0x6093795BEC17A056, 0x8F71FB4D2E5E355E, 0x762F92EDBA34A2F2 ], #2F
[ 0xD130015265A4D9FF, 0x09BEA253D71F26C8, 0x81B6EAEDC46521E6, 0xFAE268165682B8A9, 0xA89C3EC4774AB623, 0x0D2E45E055219DB2 ], #30
[ 0x2B560284C3A692AB, 0x37008AD0B379A7B8, 0xAF11CD2C30F90BFC, 0x7FE87A250F2762ED, 0xC3FBD711647242C3, 0x74ED8264F6B322BD ], #31
[ 0x28195CC8A7AD3943, 0x53CBE808464C4FC4, 0xD58E3D7A765F8726, 0xD83052F60185AA4F, 0xEFCB0D85223BB4E7, 0x5A31305E787FAC28 ], #32
[ 0x725D0EE230F19543, 0x9091D2C6BDDF34E0, 0xE3BE49C6C2754601, 0x61BE300BA4AD566B, 0x02D79D7551FA7CC1, 0x6543910F5F1CDA58 ], #33
[ 0x4099ADC44481B43F, 0xFE1361922FD9EB81, 0xA989C09E441FCEAC, 0x449B3A13D3CB9019, 0x45A9BE396F201134, 0xDC1AD05A046633FE ], #34
[ 0x1A563A6D522F3E69, 0xBE589E079F475A9E, 0x75A2A9638E4C0038, 0xDA3B6202577A0362, 0x211D3F1E0D727AF6, 0x5E1FFC529AD99233 ], #35
[ 0x47B61E86C6D6D01B, 0x437D6F83ADADC318, 0xD5A361028DED738C, 0xA00D4C630425164B, 0x1A69AFA5AF4C9DD2, 0xF99E1C67F951B582 ], #36
[ 0xA66A7740B6BDEA79, 0xFEF7FF1496AF80A3, 0x05AFD43EEACD898C, 0xB00C78ED31AD7134, 0x0ED31A1AD7846673, 0x74B96844161499BE ], #37
[ 0x46FA8D6CCBF6D12E, 0x31C2FC147F303956, 0x707F4401DE5F067F, 0x3AE5FEC7E33594E9, 0x28E39F8A63531714, 0xB7B329EA1E9FCAB2 ], #38
[ 0xEFD8F755825C7804, 0x1F5A93870BD30CD1, 0xEFBF894671FF8716, 0x28ED617FF22BDA58, 0x411289CCAE5CB62E, 0x95DD42F41801F2F9 ], #39
[ 0xA8525B8645FC59E1, 0x75E62DC00A5F7F0C, 0x09C56785210416AC, 0x50EF76E9B30D7626, 0x2B3B2CDC19F5D665, 0xA41297CD11D8F4FF ], #3A
[ 0xEAC99A649EEE5039, 0xA593C92F143C0065, 0xB314735203071206, 0xEA2761A0C764A4EC, 0x02AA7FD46CAC25B3, 0xC68CC182A96D03BF ], #3B
[ 0xB2873F024EC83CA8, 0x97470AB8FD8853EB, 0x18FE15C159B305BD, 0xB0AB08F687EAEAFD, 0x510A3FDE73602E43, 0x03E1B84DCCF0FCF0 ], #3C
[ 0xD85BBBDC8033C0D8, 0x9223D9C39CA9F34F, 0x7D3BCB6D5B63C3FD, 0x1C30F974DA0C0FB5, 0x8B24BC9EBEFB5143, 0xC58954925B7B84FC ], #3D
[ 0x6ABD7C2E0844D7A7, 0xCCF2EA456CDF530D, 0xE8938CF52B3921B8, 0xBA023CA2F281657C, 0xEC635DA675D1EDAE, 0xB4AA52F22EE1BE6C ], #3E
[ 0x981C3AC677CB5904, 0x6A92B54C84877B49, 0x745BA6BB40C55815, 0xB7AF550D22A371ED, 0xD5E8BD87C65F5374, 0x67874A37F0F538F5 ], #3F
[ 0xC23BBA2A9DECC021, 0x4E610E930B0E3450, 0x1A681AA91477577E, 0x38A3209714EDC376, 0x0FD15563EEEB4AB6, 0x7D57668A01D42178 ], #40
[ 0x6AF88CE145A098B5, 0x1AEB858CD88B8B46, 0xE8B733AFB8E2D6E8, 0x313FAA8C10A7EBFA, 0x127D375E77557CEA, 0x96BDA2F70B2F2155 ], #41
[ 0xEC8903978FAFB636, 0xC7213C425C079763, 0x760384036AB6D17C, 0xE0C63A26385F1F49, 0x299877D6811A6DF5, 0x876F90FC5304B88D ], #42
[ 0xA6FABBC2D6E0BA16, 0x9B70C9640080E6BC, 0x29B2D5265598B27B, 0x4A9657C726E4397E, 0xA801CCC6766678D5, 0x800EF7CC72619998 ], #43
[ 0x235931A8CF5490BF, 0xE798F98E0E8F879F, 0xC6EEE29C38F30CA7, 0x929A79F2D53E0024, 0x88F2E12749587A45, 0x0B85B28F38891965 ], #44
[ 0x165E0303E4A4D827, 0x67994F42D1E8436A, 0xE6CC8BCF6E130D1B, 0x50101711709DDEFC, 0x373BDEC40CD05328, 0x40B274A4AA5109F6 ], #45
[ 0xA9F88BA008FDF8C8, 0xECC897E3476EE05A, 0xBCE290AB69D57A74, 0xFA44DB1811E3115D, 0x6267AEFD64480C88, 0x2697D04A2D3AECEB ], #46
[ 0xC0782AF2ABCD3313, 0x02BA1290F2F96273, 0x63C82F1A56ADC2B9, 0x10F8E8C03EFE51C4, 0xE3EB348625CCAFFD, 0x93D607969CB8E7AE ], #47
[ 0xCC6E179443E58FBC, 0xD21C93C655A7B8EE, 0x2B9834A31F2B8BA4, 0xC83B69516025ECEE, 0x9176EB7B427AAE94, 0x8CB65B9E30B7A76E ], #48
[ 0xC1A33A0AD6EDD989, 0x18B3C5D95813B5F7, 0xB024BD263B359A8B, 0xC8C17C2216A99B50, 0x71F9A11D58237729, 0x3AA67C7618284290 ], #49
[ 0x99B7465E09201C7B, 0x9AF89FA01CA4FA81, 0xFC2EC63E761AD123, 0xE2A9A39585B17D14, 0x08394DE529F94E81, 0x479448E69794FAA4 ], #4A
[ 0x23CA3D1C4CBDCABB, 0xE3265436CE1A37E4, 0x1BBF10F69E8A4CC9, 0x05A66708048F5C4D, 0xE259DCDD9C5BFEFE, 0x439E65FAFD936EFD ], #4B
[ 0xA24D73B6978F719C, 0x3F53F343CCB0BB8E, 0xBE3C72769EE07C6A, 0xFACB9E539CF558DD, 0x67B91D4E30DE986A, 0x1DB913D11698913A ], #4C
[ 0x98BD4E140DC3C3C6, 0x142B1592BF3263E8, 0xCDBEAC59ED095B0E, 0x900763F0F625896A, 0xE213550F30324E39, 0x8A13A4417A803195 ], #4D
[ 0x2ACD98ED8C626073, 0x1CAAA6B4C4CF3238, 0x04DCB41EB677EB5D, 0xF88B5844A8105B68, 0x981D9E951A061A4D, 0xBC9471894C878EDB ], #4E
[ 0x4959FEAD5D6C2DBD, 0x6ABD59E28C503049, 0x06D2C5494CAF8B34, 0x70E4541304A4293C, 0x520F3416CAF2F503, 0xB23D09D92613DB85 ], #4F
[ 0x26B5A815C32D1791, 0x2C99E7555BB033C6, 0x09CE9D6A0002514F, 0xD485282B2B8D7997, 0x9C5B792F4A4A14C6, 0x851D9D02DC0BB4E7 ], #50
[ 0x62FEB6CACFB060EC, 0x9D977D69D5C661EA, 0xBF08EFD806D81556, 0x25F1EEA460EA5718, 0xA25346B51F5A9665, 0xD92F9ADC358CA274 ], #51
[ 0x27E63DFC63E8FFA6, 0xCDB9CCE2CE99FDA3, 0x979D5B754974830D, 0x3298C8407D6693BE, 0x629D5FADA39B42B7, 0x2654D31271CD84E1 ], #52
[ 0xAB1FA4DAF66E583C, 0xEEB6B7A236D24766, 0xA90738CDFDF5C6B3, 0x28CBA9E5648E2D4C, 0xFDE5BF6C0CFE0DA3, 0x9D00B863D7D78485 ], #53
[ 0x75FBBF094EEA16AA, 0x48931F027CD729F2, 0x5D360679009B2E7F, 0xDDFCD148BD3DE21A, 0x4DBFF544B094D0E1, 0x9C0E5C6294352C22 ], #54
[ 0x283A27FF968853D2, 0xB0960C6CEA0D03F2, 0x172BBA07A473DB38, 0x688C87D296E6F4BB, 0x5CB7E9BC5D68CF0F, 0x57A5D71B0E47BFB4 ], #55
[ 0xDE0108AAC1E4FF2F, 0xD346CFABEAC62B99, 0xB72E203F98B5F608, 0x81853D8CA54B29BE, 0xA6AED7C89FAA1680, 0xD2093B155C39D7ED ], #56
[ 0x0BAEAC99D4974B84, 0xC7F258A699C9B4DA, 0x6F622C5E4ACCF5C1, 0x58AB397D9781BEAA, 0xBF811F67E101FFE3, 0xAFBCC2881C3C0EF3 ], #57
[ 0x26B211FB518D6C3E, 0x64BADAD51A10784A, 0xE6BE4E06A587186C, 0xD471F5C61343CD5C, 0x8389BB0DD6AAED5D, 0xC88112678914A17D ], #58
[ 0x2B2D0BC3BB88D27D, 0xC5A7D1FAFF517AD2, 0x96F39056A09F82AD, 0xFB38A61A6CED4D4E, 0x9D308E4EA6F9B264, 0x9097CE294AECC6B3 ], #59
[ 0x8FCA2B950690B1A2, 0x293EFCBF03D422DF, 0x8C9125B3E76353AB, 0x3D402092A1A70173, 0x9BAB974CAB9BF676, 0x5EA8FCC55D8C586E ], #5A
[ 0x408C92E8C2E1EC8C, 0x4AF4C914B71B4350, 0x5186AEE0CDFB1069, 0x2385EAFAB9657C67, 0xF708E4D3C898CA80, 0x1EC8B9F89884907E ], #5B
[ 0x46E8958B6A2C1878, 0x2172FD410F78A647, 0x9D8E9DD83A299004, 0x390913C3265AD025, 0xD231F1E23077CBF1, 0xE7EE3E574E80D7F3 ], #5C
[ 0x5A8567A3D85E40B2, 0x16ECF161133FCF73, 0x52DA5C6FBA3C0DD7, 0x56E57983DEB34BFB, 0x83254FDCB768D153, 0x9A14F95F35C6B82D ], #5D
[ 0x498A29C6E19D4AE6, 0x2EF4AAF46027BA11, 0xBDBA7DAA84F39505, 0x940B2A04F6DC944D, 0x4E7ED35610FC0D53, 0xBADD94C2907E59E1 ], #5E
[ 0x14DF0FC43F475F80, 0x17E2AA8D264BF82F, 0x92625BDFE58B934D, 0x8384F415A4ACEA81, 0x8E9C5EAEC5D8642B, 0x4D8EF55F1C826687 ], #5F
[ 0x4A2335C4F77128D9, 0x544E1476D29ABA94, 0x654EC86321785044, 0xB04AD9B02F80445A, 0xB0E01B6480C8D020, 0x596E325E88A3CBBF ], #60
[ 0x896955157448D062, 0x0DB08C4C0F236D68, 0x3BA8FC5B3CD1C4A2, 0x04F57C53E144535B, 0xB7D04DCC7BE46840, 0x4BBE993192334646 ], #61
[ 0x1D7837E6AB02CE27, 0x3EA35BAED4493EA4, 0xD1CAFDB5DF94FABE, 0x98B580BB62170C4F, 0xC3C57A6CA9421C43, 0x68D65FC2C1201634 ], #62
[ 0xFAEABABC48717536, 0x454251E8F62F7315, 0xB318E8A7FDCDC523, 0x7C2E832013C91344, 0x4D9E5DAFD1699052, 0x12262E8C870537A7 ], #63
[ 0x8A3E5D0BEF8402A2, 0xA33BC5FAFA019909, 0x63CBE8ACD00762F5, 0xEA26A3F181984178, 0x6EEB78D1BB4AF6BB, 0x7ECF9671300E845F ], #64
[ 0x0811B67CCCF5D0FC, 0x9F8CAB3F3496BD6B, 0x57CB7D24F1355C2D, 0x58218594165BDE80, 0xFAF3368A653A78F8, 0xC04CD80176267762 ], #65
[ 0xE6417CE75AAA23B0, 0x34A7BFE3CBA61761, 0x8C13E396F8C9B6ED, 0x5C9066464B09ED63, 0x76CB6A642C5CE283, 0x498E082A3EB449C6 ], #66
[ 0x6F2ADEA6357B5AA0, 0x54DA382B15557B69, 0x302BD81946237AAE, 0x8F0CBB82111EFEDC, 0x45DD2DADCE20F2D3, 0x8A77A5E9E8A2D1D8 ], #67
[ 0xE1EC332735862A28, 0x92B68B1A7E9C7C44, 0xF45618DC99E963E3, 0x7CAC984502DD1A73, 0xC8650598CD70840D, 0x9A5DA584A26D4EFD ], #68
[ 0x16B19B010740C15C, 0xB4544AC01016439A, 0x221F749C9E2F99A5, 0xA63E8A279A65570F, 0xC7231669ADD072AD, 0xC5BC35BA740BC801 ], #69
[ 0x6C44E75A4F378694, 0xD27ACE108A577647, 0x17C487FAFA7E15D6, 0x6A3654D5C8E29EDF, 0x0CE35EEDCC611FFA, 0xD88A8C03C0095093 ], #6A
[ 0xCF106948BC4B1F2C, 0x91C0DC9990B99712, 0x193B21E3E109AB32, 0x3340DE0608DD1666, 0x8A5BB677BF602828, 0x402C410B1197B771 ], #6B
[ 0xEB080FF49CA5543E, 0xB4B9429542D6CA27, 0x5999D45DC1533205, 0xF7EA9E398A1BEF3E, 0xBE8817775476DEC6, 0x17064D7790C84100 ], #6C
[ 0xF3328E9150A7F8D6, 0x52E3E61B04ACFDF8, 0x51D82010F3CEB015, 0x59D673336676D5D8, 0x4CB3BCEF1D91C342, 0x0C589AB58033BE49 ], #6D
[ 0x54B8E70EDCE03855, 0x7BB590E99687FD57, 0x6CFF08688D2B1FDD, 0xFD0F6D068BFE994F, 0xEB9BCE302489AE44, 0x66B21F200661E3E4 ], #6E
[ 0x2F5E0060189669AD, 0x473AF1D03C00CAE4, 0x0278299268D1F3B4, 0x888714BC3A7EC9D2, 0x9FF9C7F071EBD2D9, 0x875A5DC25DFFDB10 ], #6F
[ 0xE2A97A3E468399D8, 0x3BF7EACA32C80DA1, 0x13DCAC8EB6C2231D, 0x227EC90E1102EE97, 0xB2344832F0381434, 0x8613888303B190EB ], #70
[ 0x3A3D3B6CE026BFFE, 0x18D4953B9A68ED59, 0x24BB7B574AB777A0, 0xE0CB7DD64983DCB1, 0xCF768C439869AC97, 0x8062BC7A900E6033 ], #71
[ 0x39D4C3B78A7A33C7, 0x43D72EF22AB0B4EB, 0x54AE8184DDA50394, 0x0C2A7DA083C38536, 0x9DBC6F921D4AD822, 0x2CBB61FE182EAA42 ], #72
[ 0xD8CE9A806C0BD24D, 0xF69D65A65845727C, 0xC3FF81CC76F2B048, 0x76B1FDC3CA67CE58, 0xCED0970AFBCBE78A, 0x57502941B726F5F3 ], #73
[ 0xE006AEC17FCEFCF9, 0x05CAA1629E003591, 0xB7050CC99F585312, 0x669260401E159490, 0x8442D25AA757CC5A, 0x228655CD4038770C ], #74
[ 0x93EE8D67D3F1F3A1, 0xBEA46D48DBF8D7F4, 0x3C91F02B8646453C, 0x6C3D7C1F04188A58, 0xEFA97287F89CEF84, 0xCB40364E108BFF4B ], #75
[ 0xC6DCE3730D4FF825, 0x02AF54F87D972790, 0x7D69D20F6F4F788F, 0x90C255C64C166E8F, 0xA3529FBF4BF9C9A2, 0x3ECEC41136694F6B ], #76
[ 0x3DE10A5EC6CA7B3F, 0x7E196081D085ACAA, 0xDF5F0DE3705D60F7, 0x393E7C83DCC57075, 0xA5F33BC2DCB98F97, 0x0AEB7F050D1204C0 ], #77
[ 0x6F3B3B3D11A8BC05, 0xB52269AB2B95B8DC, 0x12EDE24EB1385F13, 0x202BBA6B5836B5E1, 0xEE3636C5925ACC49, 0x42224CF6EEB509BF ], #78
[ 0x5F0CC3BBC4BE9A92, 0x584313FCCC54DD2E, 0xC11FE90F00394036, 0x3371667C72FC9723, 0x9611990B62AC8D9F, 0x4CFCB9EB3C317FAD ], #79
[ 0xCA8E520A894A3FBA, 0xBD9ED1B80098CC40, 0xBDF24507DFF3757C, 0x47AEC572E68D35EC, 0xF3D4523D27B373E4, 0x1AB11E16973A05AB ], #7A
[ 0xFFC293A6C26B817D, 0x2C9E9D134959D828, 0x7FA5216408199BBF, 0xA6F002DE0DCCD861, 0xBE8F9DC57F2CF35D, 0x1352E2DF86A47647 ], #7B
[ 0x84B55BE101708E74, 0x3ADEC53721209F3E, 0xB18F9A1E68DFADBD, 0x09A050819774CF2D, 0xE4AB295D380A8762, 0xA3605B0C689C239F ], #7C
[ 0xDDC7031FBFDFFE8F, 0x0B175DE65B832F0A, 0x31162ABC65719685, 0x51215E534BBC36B1, 0x9F2F7D3B5D01AE44, 0xCF43A2426E83B61B ], #7D
[ 0x7E32DB672B16F04A, 0xCE6F45DE0E6AB788, 0x25718548B8E70B41, 0xD7368BCF39A0FAC4, 0x956863EC49880C47, 0x720E335796341674 ], #7E
[ 0x06707A8E33D9D6C6, 0xB684BFE26CD576C6, 0x44F47E5ECD5FC46C, 0xAF1B23A856D844B7, 0x98A627916AC5657E, 0x040C3964A1127E19 ], #7F
[ 0xA5DAEC3134C0A39B, 0x0CA04160BD5ADB1F, 0xB50EC5A9F29E1ACB, 0xBE2FA1126AF7BFAF, 0xBEFC0AC4C9C5A4B3, 0x994739C71FB1EB29 ], #80
[ 0x6FEC2D343E83A763, 0x5BDBA5715757F50C, 0xD6F6282EE46A11B3, 0xA8B501F5922A5524, 0xA782A21006B605CA, 0xA10BD2E896975C81 ], #81
[ 0xB8AAE0532226D0ED, 0x891831C0470E84B7, 0x74C824D648E8FF28, 0xB5E4E02EAD3906EB, 0x5ABB086ADA60A713, 0xA80C57666A9E29F1 ], #82
[ 0x529E3E52B1E7230A, 0x0C148861C9F08E26, 0x0CFC8A131BAD803D, 0x8C09F324902FAA9F, 0x0231EE4987999848, 0x3B0688492E2B5457 ], #83
[ 0xEFA6EAC5036814CD, 0x02773C1F8DAA5DF5, 0x0E4EEDBD0702DE31, 0xBA7FD757D0D740EF, 0xA8805F0C74005F8B, 0x1448467BFF3E1EF8 ], #84
[ 0x2A07B766016AC70D, 0x64215C35364219E9, 0xCD6F7EFE35FCF6F1, 0xF05CC06084C29267, 0xAB3BF2F32579A444, 0xAC75F42D9A25B9C9 ], #85
[ 0xEF3A14B5EDDB8464, 0x2314E0802D2DD0E9, 0x14DEAEA9F928762A, 0x5763EBB480E15A02, 0x25F7CA14E8CDF5E6, 0x8E594510DC61E6BC ], #86
[ 0xE62C38DCFD21000B, 0x7BB32AE917EE3DA7, 0xE49F15E24CC9B656, 0x56E28259DCA361D8, 0xB43B8008A9285F48, 0x0DC6B4AF7E4AE61B ], #87
[ 0x703C64241142DCAE, 0x732D33342C45063A, 0x37877EA1624567CB, 0x2871D534614DD114, 0xE748092A1D94F5D1, 0x4524056F0C6D1CB7 ], #88
[ 0xE325B1823A595DF9, 0x742D0DD5C96F397C, 0x44361C9540A9F451, 0x02382F9BF6331FB9, 0x8ECBAFBBE91A0467, 0x528EBF3811F904A8 ], #89
[ 0xFD2BC6534631FB0D, 0x27A5F036FEEB9A6C, 0xD0F876D7911D0775, 0x12EFB3A29C6E0B72, 0xDC4BCA3D5E871DA1, 0x028FB6E6E608F46F ], #8A
[ 0xEF17ECC8930A7B4A, 0x9D97B34672FB273D, 0xC6AE835F35A25D8F, 0x6C27469530C21F5B, 0x2FBC16A26150E795, 0x02AD93AAE0B5C71A ], #8B
[ 0x6D24BE43CF07DD56, 0x63681D62A38D2A2F, 0x9872C9B411724AA0, 0xB882B4857C19690A, 0x87B1BA8D2804C6F4, 0xD7B199CC36F40B49 ], #8C
[ 0xEEFB8D8573FD9E0F, 0x933403199B91560A, 0xFF0DB41665D5248C, 0x322EE105EA984196, 0xDB8CE0F83890D89B, 0x3A32F8983C901F80 ], #8D
[ 0x082CDAF93F215BAC, 0x67C118A1B9274FAC, 0xAF74501CFB93198A, 0x53525CABA0E812D3, 0xC9AF3A005EFE8A6E, 0xF242DCB60DA7B2FE ], #8E
[ 0xD3887FBFBB7314DF, 0xDDDCCCF0F720C342, 0xB2C4331C33C8C415, 0x1666010767F4785B, 0x8455B7C1FD5DE487, 0xA821C5EA181875F2 ], #8F
[ 0x7E289831418562F0, 0x2AD12E3042B185C3, 0x7C20D0D735A6AE96, 0xA68BEF98E22CBD41, 0xA1411D22F8D93243, 0xD813FB404F3D2F38 ], #90
[ 0xE13FC0A76F664294, 0x7E21C9D9F7FDDDCB, 0x161E68B366D6B1F8, 0x55BF957EB5743874, 0xB23213EF8364D766, 0x529BB98AF96643D4 ], #91
[ 0x036D7ADDAADB5C33, 0x0525835F802D032E, 0x7DF7D0D8D7A2BEF2, 0x84927644B27696B7, 0x215E21E4D1F9B5B9, 0x77743669C40EB7FD ], #92
[ 0xA9B3534BE8897784, 0x5BFD4283541A5090, 0x97AFFCCD121C9778, 0xC146C4C9637989C7, 0x0820E72FCBDA59C7, 0x5526E2F4A0AE4F4F ], #93
[ 0xA4739E20FD72BDC2, 0x6D6EE5A5C1A54CA6, 0x70A97A6FCB884E5C, 0x2B6108339E979C48, 0x93A63730D6BB23A7, 0x5B1DCEAB00045EE5 ], #94
[ 0x427C14E4F88C8BDB, 0x1D8630868E039BC2, 0x33DB40A251502D1B, 0xE043C9CCB45D2B3D, 0x292B67B6EE077B2D, 0x1C3A2FBDE24C742A ], #95
[ 0x3DED69F37016D86A, 0x9A947B13AC66D7C3, 0x822D8645DF4CB39C, 0x2BA20F98F19E10DA, 0x6703138D422AC4C4, 0x8D34D6138FA04A1D ], #96
[ 0x28E59C8B257D112C, 0x8747068CC5499FCF, 0xD6C16EB780F9191A, 0xB416151633F7AF08, 0xA230E00D6BA1A1C3, 0xFD066FB9965B83D2 ], #97
[ 0x70F4BC1B7F8FFC37, 0x38DC0331E56B0FDC, 0xA9AB7290AD2B0BBD, 0xB307973C3D0783C6, 0xBDC455F6CDCA111F, 0x23F0E08317B8F0DC ], #98
[ 0x0AEEC24E9285C50F, 0x3BCDA47833B61ACE, 0x839986F959EE0723, 0xC959034A8D7F5EB9, 0xD4AD7E05B05C4FB5, 0x6C37A3D39F7A0EC4 ], #99
[ 0x0227B7230FBF2D07, 0x28D7D2AD632BED47, 0x07BD8F8B5012EFD0, 0x48A0D43AE0403442, 0x9B8939207F1449A1, 0x351EAD01B9FDF219 ], #9A
[ 0xA7119D2E311CEF25, 0x1E532CD0C4ED0479, 0x2272F878D8D30A0B, 0x769C412CED9C4C42, 0x262FFBFA65CBDDF5, 0xDB73D86721EA368E ], #9B
[ 0x4BDBE90B3FBADCB2, 0x1324EC3A8D6FEA57, 0x6D9EFBE530850D00, 0x401A88AFF8A4C8F4, 0x655CB76B8A2E271C, 0x35505B6DBDE16F43 ], #9C
[ 0x6E15E57E23F57037, 0x4962737362C1FA26, 0xC962372D1829B80B, 0xA1FE6832EA4D6211, 0x6726E307F96E7763, 0x04C761081677505B ], #9D
[ 0x42E2FF3A8A6FC164, 0xFB85B2BC9D28B268, 0xC559CFF024533A28, 0x2EC83F3911DAB3CE, 0xAE0FC74A9D736A27, 0xDB9CDD048BAB4CCF ], #9E
[ 0xD79C52221D20E765, 0x499EDD73903CE704, 0x9B016D987DF48349, 0xFCFAB44AD12FC5C1, 0x811293F3B800FDF9, 0x511DC619CA53CEBE ], #9F
[ 0xA059EE78B826EDDF, 0x4673AF294D17C85A, 0x5E527D4E4DF282B5, 0xDB5B9A2693F95CE3, 0x6551D304FB54F296, 0xAB3EB70D65912FCC ], #A0
[ 0x7D0C4F67B6C78135, 0x390CAEA7DE304D37, 0x49E19FABC8D494FE, 0x1A9E1B6437A04516, 0x886CC4BDAB6AF35A, 0x0529217344F502FE ], #A1
[ 0x3CEDF34141B52CEE, 0x8133BA924753573F, 0xCB32BE22BC66025A, 0x0C480183DE403CB3, 0xBF5B84B427DFCF31, 0x7251428DB0232156 ], #A2
[ 0x86FCE831C58E25CB, 0x5CC43FFE45CBFC75, 0x33877CC042F199BE, 0x1212FA7F0CC22E1C, 0x448EAB4B7D1F9823, 0xA7B1363A9FA7599E ], #A3
[ 0x2D8C2FEDA0E5106D, 0x192E366838BBEB3F, 0x36226AA60ACEA0AF, 0xE7E1285DC1F3926A, 0x900371FA1883D9EC, 0xBAC33B1AF360EB66 ], #A4
[ 0xD4A2A11612BDE0E3, 0x82AB0DA614CB4CB8, 0x189A4D50AC01F4C6, 0xE36A5DA1D9F6A647, 0xE43120D6B16B11B6, 0x7D395F4236E75378 ], #A5
[ 0xC0C155CD47F3877F, 0x4B03BFE5C334CA71, 0x77710F1F4B844FF7, 0x3443BBAB720E8DC5, 0xF03F8868C5863406, 0x0FD60511C872EB50 ], #A6
[ 0x8C253DAAB5286306, 0x9AA438F54A6196AC, 0x181D08C723A22C5E, 0x633C49C88E3910A1, 0xC9F54A67992675B0, 0x1FDD98ACBD38D976 ], #A7
[ 0xA10893DA7575A9F7, 0x8F5F4A025AB2A018, 0xD80538F0336BFFC0, 0x0F9751D33889626F, 0x30383EB925BF911A, 0xE6149F68CE19CC60 ], #A8
[ 0xB9081DBAC6BE0598, 0x785DD9BC69C71492, 0x8B035A0CA56E172B, 0x8946783500724888, 0xAF1E57C958650569, 0xE1DE4E944FF22261 ], #A9
[ 0xEA5EDC4D2718C0D2, 0xCB1C5D4DA15A8AE4, 0xC6272382F8163015, 0x94A934E5057B54CE, 0x658E481A3D68D10D, 0xE8F24929E50A46A0 ], #AA
[ 0x7DF146281AF482CD, 0x014B68E726407B06, 0x6CE564938C70DDBC, 0x36DAD2DE72A5DAA2, 0x6D573BF69C0B2980, 0x684DAB14B4AA0329 ], #AB
[ 0x9C69DC064E738B5F, 0x83CC16BD5A1C36F5, 0xA99B365E6E141B12, 0x2748FA5AD0FACCE8, 0x26D073A047D99C49, 0xB005B182505B0C0C ], #AC
[ 0x15B6A2A20ED0FD1C, 0x9333AF729BD65A25, 0x22CC333293BD2C1B, 0xD724D949B15E8BE1, 0x69D0DB0512B97117, 0x85ACA8980DD7653C ], #AD
[ 0x230EC629D77BB3F2, 0x43115B991D297CB2, 0xA2F955792C53C76F, 0x48A76728EBE25BA7, 0x7CE662A405384400, 0xDDC06B7E6BF49D66 ], #AE
[ 0x20DDB9BD7644410B, 0x056391B1FA2E8C06, 0xCA4EDE51CF167C00, 0x46602B550536F870, 0x5040672597C21FF4, 0x0AF8EC6E8AFB844B ], #AF
[ 0x0023C5749251B883, 0x335A4F86D66B7E00, 0xAE353DED3EFACE8F, 0x3FC80526D67B35DE, 0x0D9078FBDA80BC53, 0x467900DFF3FE4C14 ], #B0
[ 0x0F9CB2BE6A448113, 0xE38D541B6A9A5829, 0x673953DAF354FC0E, 0x3C818A277F8569E9, 0x8D16EA77DB122A3B, 0xE40A860318B6EA84 ], #B1
[ 0x78CE11F42D7D5E50, 0x84F76DFF199C998D, 0x999B578E3AE935CB, 0xD9FD092C1BE63212, 0x31F33C63ACD316D8, 0x5AA08030B8D65C0C ], #B2
[ 0x0098DBE19CA84FE9, 0xE2426617D1142137, 0x63C3C4166A78E21B, 0x74B145353E03B0E4, 0xF43C0824EAE508C4, 0x58C1E6622528602A ], #B3
[ 0x9E27EBE6D1426A6F, 0x2A6A600A6B5FA342, 0x8FF7E2306BA90370, 0xDF83D91A683EDDDD, 0x29572442F0225388, 0xE9CC0F1B6437320A ], #B4
[ 0x054DF380E896064E, 0xFAB81A4AA3AD88A4, 0xF87426486CCA156F, 0xBB1B3C8237472960, 0x7EC0B87CF73F960A, 0x5C57D7E6470F7808 ], #B5
[ 0x5758E103AC614A1A, 0x766AEE86F81358DF, 0x203FBA51DC74396A, 0x78C93DF969C5721F, 0xE69E32E230196597, 0xE287C6CECD8AB95B ], #B6
[ 0x2A06A7C10C0DCC97, 0x99D5298268A6745F, 0xF2D818BB774858B3, 0xD52A820D4F64D886, 0x2F808EF87A263981, 0xBB91206E6347C676 ], #B7
[ 0x0847C6D71CE0C746, 0x86FD451B447C1E11, 0xC20623B0E2856FCC, 0x3ADDFA2D0398181E, 0x6736A0A06B336B46, 0xD1C70AEEB2B1257D ], #B8
[ 0x5633260D141A9776, 0xD530805F596CA3DB, 0x8CE33EF69437CE46, 0xF62D54E97E747088, 0xDF5C9318489B45EA, 0xA4AAD29F0BA850CA ], #B9
[ 0xBDBD7B16767F6D9F, 0xF7968427F1B7B6DD, 0x58C76599B35276EE, 0x286F4C7F6CADD791, 0x8188C0401742117B, 0xCEC4F1964266D163 ], #BA
[ 0x97E4E8A6B5135B24, 0x8A8BD785E5297977, 0x4545C1A0975BC5BB, 0x13FAE3BD9F59E37D, 0xAFD5627C0E91DE2B, 0xA223AC778474E1A9 ], #BB
[ 0xDE1BF1EAF86C6B3B, 0xA246A3ACD50035FE, 0x6F80179DD96A21CD, 0x3F8DB7CB17300D03, 0x497A798B5D94506C, 0xAD52DCC6F61AE841 ], #BC
[ 0xF4A4E1D08E1F440B, 0x5E27633CD56422E0, 0x1465C14F1DB41420, 0x9A939043988D37C2, 0xCBE65CFA245DB368, 0x6340AEDE28DDA855 ], #BD
[ 0x1F7AB65A3F892454, 0xD70AB4167EBEB5A1, 0x9B2631E824C2028D, 0xD5D97BDEE31519BC, 0xEA2DC77449E4058C, 0xEB204F2D6D2FBAFF ], #BE
[ 0x6537E69171A2665D, 0x3FD2F835435A3F23, 0xADD5DD3E622D6C8A, 0xC522CDD5E5E243F8, 0x5AEC27F3DBFDA8A2, 0x477A65ED570E1445 ], #BF
[ 0x3BA7CB01D32E9D63, 0x9E335734E7B5416B, 0x0ED96A84F94539F6, 0x45CEE2E46DF5A70D, 0xDE142EE1E9AFEC1C, 0x78D6121C4FDC72DD ], #C0
[ 0x7BB30AF653390B77, 0x2D394F2B7F8F7BB6, 0x0277A3C213AF3489, 0x7DF6E674DD56D084, 0x5643CD3073C42451, 0xFAB15F8BD1A1DC18 ], #C1
[ 0x42B453ABF5150D8B, 0x913F109C1188E18C, 0xC27BB7631FB43BF9, 0xEBDDE685EF108419, 0x76D67C87C56D33EA, 0x95EC73C0AF40F084 ], #C2
[ 0xBCE43D59A1F50BFB, 0xBA7027CA04D84600, 0xFB6FDB98A2BE644B, 0xD5DE777E993DED4A, 0xFCA39F1EDF710F3A, 0xA5E5893C858D8841 ], #C3
[ 0xC68AC776E6AEACFC, 0x538067C7866106EB, 0xD27B4A352F4EFDE3, 0x847DA2B3BF01E378, 0x3C79E3C136926D58, 0xF957BC8726AA1610 ], #C4
[ 0x95492C4203C7C612, 0x0DD60DB1EE8321FC, 0xE1D9EBA902F62B42, 0xEA2DBF7D0E37A4F2, 0xE11FB9098BF5DA48, 0xDBFE213F818EA338 ], #C5
[ 0x17CB21316D4756DD, 0xB88952498140146A, 0x648112F580844288, 0x4947ADC3F7D58F35, 0x651CCE28E26A5377, 0x0B3803DAF337F89B ], #C6
[ 0xBEAB16E2DCE6B6E3, 0x8F39ECC8E39172DF, 0x607CC9553FF29C0E, 0x4BFD15154F4F0BA7, 0xEE6230B6BD408CE4, 0x35B654110D164E99 ], #C7
[ 0xADDDFF1BD2C11CD4, 0x2A1A262CBA6E1AA0, 0x0BF2291D09475A46, 0x4C93A0ABADF4DE32, 0x73EE8E1327333E63, 0xF3AE2031F5D13B28 ], #C8
[ 0x246C7CABB2D9A55C, 0x50E9C7282C1EE0F6, 0x2FBDA09565A0D3D7, 0x196552679C04A4EB, 0x137C66DA29A6DD82, 0x08A76B6B4BDA56BF ], #C9
[ 0x7CA3C59BE3E28610, 0x6ADD75CF1F7AE248, 0x01747450737A6435, 0xA1F2259CB2B4923B, 0xE0C8F55E8ECE7210, 0xD7964398F350B69B ], #CA
[ 0xE045864ED1825101, 0xAC54969193E1A1C5, 0x23D85A934D0794C7, 0xB4FA88CB734A4213, 0x7C5CBFD6BDA3D5F9, 0x66607FE938748825 ], #CB
[ 0xBAF36FD2A180D481, 0xEAC440AC1B9598F7, 0x9AA24D80FFB7B06C, 0x79601F517358F163, 0xD1071831418BB63B, 0x819609A6AE7D3A03 ], #CC
[ 0x3E9152D8CDBAE551, 0x86AD793F203DD016, 0xBE3AEB778AD4A891, 0x2810254DD76B6618, 0x9B5DCDE36636C327, 0x0A8AAD65868BC58C ], #CD
[ 0x6D0672780D93152A, 0xEEE705247B828091, 0x9EBDB976F137463F, 0xA7DE3E73A2D0C1BF, 0xF871A00BA0046AC7, 0x484C96A803F23486 ], #CE
[ 0x0FC7BCDABB06BFFB, 0xF75C3FFB3D6309B3, 0xECA305D103109162, 0x373F503B204FFF61, 0xCE332C9F54963FA2, 0x9A4420A52242CDB4 ], #CF
[ 0xC71D481179D198C1, 0x505A2845CEE92569, 0xF339BFF6DD6755B5, 0x8BEAD52B8DE89245, 0x4B686E65920DCA2B, 0x99593FA43EE68A37 ], #D0
[ 0xD90A68D717E61501, 0x9BB920AEA19161A6, 0x2F3D6F96D90EB1E4, 0xDF15ECBA10513D7D, 0xE6E5D539B4F01831, 0xC7D17A7528FECE36 ], #D1
[ 0xA04FF0BEB4EBFBAF, 0xE5E90A5B3DDAA3CA, 0x8453542209F4A145, 0x80A6FFD72BB5A707, 0x14E0C4705A1ABF6A, 0xD699EC1FC18A677D ], #D2
[ 0x7021A124E3181575, 0xDC7AAE2817AD945F, 0x8BB5521E7F0D565A, 0x6671D3792F0805EE, 0xD3888EA394413A1A, 0xCE4D7E47B55BF9CC ], #D3
[ 0x22F440263CAADE68, 0xE77BB287772EAC7B, 0x29493775962A40E9, 0x1E06A27FA68CB91B, 0xDDEF02932ABDB9C7, 0x79F03B88DC175233 ], #D4
[ 0x65F6D517B53E2391, 0x97DB65A2F00B1C39, 0x1D77AE9B85AA4855, 0x19133B9B3E9B0771, 0x6376D9F11A7DB3D4, 0x949AD02F5AE16184 ], #D5
[ 0xFE4434CDE09D923B, 0x03B0FCFD713B7052, 0x2D713290D4A67238, 0x2B56946FF629EE96, 0x60A15D01B2B3C428, 0x0B1D5EAF793933A0 ], #D6
[ 0xBC40FCFB0E0D494B, 0xA31C4648C7B3D1DE, 0xF1113C219A07EC8D, 0x2378BEB1A5C2BD1C, 0x190CC3478070A194, 0x63DAB6E1CCF56329 ], #D7
[ 0x901B6B9E82BABF91, 0x872A234C45D61001, 0x6CA46A95C1CC6D6C, 0x22779315E0F02295, 0x60A59396346BE6AC, 0xFB67A503CB488846 ], #D8
[ 0x50D440F74C97660B, 0xE71ECABF64EDFE0C, 0x80201B895718CE22, 0xA05D89804D35D306, 0x8F700402A2B0D086, 0x326FCB334CA4DFC0 ], #D9
[ 0xBCFBD02EA005CDD5, 0xF0225A4675553115, 0x08E18B3692A7AF62, 0x05D34A820C8CED0A, 0x51A8D7CEC33E80EA, 0x0AC007503FAE879C ], #DA
[ 0xF43EEFB5C83C521A, 0xE5E9B05FC48841AC, 0x79C52C38BF85B5F9, 0x26CD0818AE3BF7A9, 0x4F385C32CA8F5F74, 0xF17B22107B954752 ], #DB
[ 0x1A48FC969198A4B0, 0xD9A78940BB0C4E1C, 0x42781D9BE60E7691, 0x87D1CAF3680F8A30, 0xD09FF193606AAF29, 0x4518DABC60048793 ], #DC
[ 0xF05D48134A56A034, 0x89A65EEB91DC69B9, 0x8FC7F43960E63C62, 0xFA1C6B9FF9415E92, 0x7E219D4E56347935, 0x2B6A48D6DE0AEF85 ], #DD
[ 0x1A7FF9C54B045FFD, 0x44A0A9562E9468B2, 0xF11425A22D1EBF92, 0x208D33120BD28E0E, 0xF2D74197AF80E162, 0xCEEDCA73DFE66C93 ], #DE
[ 0xD57190439D29C9A4, 0x44C007DC2B5EAF9D, 0xEF6DDF48A780CEDC, 0x61B205E4A96024B1, 0x1885B6CE84C3FE5D, 0xB8B56986B6E2CE21 ], #DF
[ 0xF36DACFA34237E99, 0xBE45EB5253BCFED0, 0x402C6946B8B21AC0, 0x2460A6FCE7E9CD67, 0xF89A6D5B162629FC, 0xF66CCEA374DB821E ], #E0
[ 0x16E06074DCC31A1D, 0xF172017AC3FA38C3, 0xBBC1CE4BB784ED60, 0xDA89A8BCE82AE671, 0xA6DACFFB8D26C0BB, 0x185181AE9609F6D6 ], #E1
[ 0xF110DBDD94D17661, 0xF59FBB4CBA69F393, 0x463B60FB3F3C5E00, 0x1C60B896FE8E78AC, 0x5EB3E26795DE5AB6, 0x997328D4654D6219 ], #E2
[ 0x21069118ABE24B61, 0x811CB8C48FCEFC6A, 0x483B032CFB56F902, 0xFB32E848198CC057, 0xA620815462A04F70, 0x900038D1894959E2 ], #E3
[ 0x5AD509789BFFECD0, 0xDDCD5E8325F69CA0, 0x154D8F1ACD9B8C82, 0xAC7DF75E94CE3CAF, 0x6D6554D1B38754BE, 0xB5DB64AF738486E7 ], #E4
[ 0x35A308A1AC9A43BF, 0x2647805AB3E6E492, 0x4BB74A616F61588F, 0xFA4602EE5BDBF54E, 0x3FDD62470A7174DB, 0x5795433CA808FAAC ], #E5
[ 0x51A094B8774CA605, 0x5F07974C74EEF225, 0x022AFEF7AD81A953, 0x0967C44BBA336FD6, 0x8AA327918AECBA3D, 0xF70B8436573C3F0A ], #E6
[ 0xCF374F83420766C3, 0x71F31901A13EF07C, 0x63AD56C7DEF9DC0F, 0x9E5BB5E859F5A231, 0xD0BF453BB9893E4C, 0xA1E14B66C2719760 ], #E7
[ 0xB41861CC73FD3E48, 0x461D79A138B04BE1, 0x4010D37D37FBA817, 0x7D9622AA693225A4, 0x2204454B8126799A, 0x33A5D487DCCD6EB6 ], #E8
[ 0xD291D0317A053320, 0xE27678F1E50D1F76, 0x9A3D663A63159FC7, 0xAD7B4D3F67BAB452, 0x269CC05E2B33CE1C, 0x0FB8261CD734BCC3 ], #E9
[ 0xF3D0546D3D4A25EE, 0xB42874AD28C9B7F2, 0x73EC788B29962D28, 0x4AE73A48132B8553, 0x756C99D7A0910B66, 0xECA7E2C2712D555C ], #EA
[ 0x559FA5BF24911FDD, 0xA1DDF5DE3770554B, 0xC7C3FD139366B946, 0x6E7ECC0C881D2BA4, 0x14E76D6A27E54B87, 0x7352D5FBC4FAB878 ], #EB
[ 0xF19A622BED8DAC0A, 0x35548E5D7EFC5A2E, 0xCAC84974B4F057B2, 0xAB317ED03D0335AE, 0x710FC138F2C51738, 0x9C90CC495A403416 ], #EC
[ 0x9FA7DEB936F10461, 0xA1529B0B58462F9D, 0x9F109111C8B9EC65, 0x23A3EB28444E33EA, 0x554084CA75118937, 0x599D58A7C946EAC2 ], #ED
[ 0x6EC3AABB7856AC4E, 0x980E6907C1CBCCAF, 0x1F8557ADC700CBF5, 0x7DCB1CE0AF48D9F4, 0x7FB3DADF8199AB8A, 0xE6B36DB8FADBF312 ], #EE
[ 0xC00F0D3F7A101660, 0x605B94B12DB6C697, 0x79944F7BA2B65F38, 0x40858ADEDD47E2BC, 0x1E044BDB0E9FB02B, 0x86C79D01A3109539 ], #EF
[ 0x9731893D5B98482A, 0xFB8DE267F9790326, 0x8780F407143A505D, 0xA41CAEFCCCD3A8E3, 0xA042F0B3D7B7A7FE, 0x3E3151FEBB19A1AC ], #F0
[ 0xE7EDF679003A6950, 0xBAFC97D4A8C6AB12, 0x13C096B49C79559A, 0xC3052501434B5019, 0x1280FB23E7ADFB09, 0x1959905D31BD2FC0 ], #F1
[ 0x575C0C46FCFCC65B, 0xFE625E873F34B419, 0x1696FDCC7F51B8A3, 0xC79C56F30E5AE7C0, 0x14E3461CD27FAD15, 0x1B7BCCB9CB472859 ], #F2
[ 0x3806FE58E5CC8F16, 0xF8244ED76734C1BF, 0x4E04940E0F5DDB56, 0x5BD0AFDDC4158B7B, 0xA4C6BA949911C5C9, 0xFF6E2AC155AE9726 ], #F3
[ 0x49C7C844B8114144, 0xB450E41BCA35CB00, 0x302450EC67BEF97C, 0xA8662049DB1E0D8B, 0xDA69C022528EB8FA, 0x6ABBF16585C1A2F7 ], #F4
[ 0x37BB420DF67F044E, 0xDCC0E9F3E2EF07B3, 0x4D10088618777841, 0x0492E5379305DAAE, 0x3DA4791C37E4128F, 0x80688445CBA4EA17 ], #F5
[ 0x51398A7CE4CF8D9D, 0x49A5FCD891A69CA5, 0x3D72A60EC2392DA5, 0x0E8296B879AB5539, 0x6BCB00AF2EDC0BDE, 0xBEB93848E54B3E90 ], #F6
[ 0x7AD7C52A18922E19, 0x29292C57C4F5B8F5, 0xF0CF1F98A577C10B, 0x072B9F293BB660CD, 0x09B8604F5575B6FB, 0xDECB396A81B9FCDB ], #F7
[ 0x254AD7ADB4C220DE, 0x6C62E20F95A0070D, 0xADEB89F339309BD8, 0xA2F685CC178B289F, 0x9343905B5DEE95A5, 0xE0C30F34A2977C86 ], #F8
[ 0x669CD51AF7CFBFAA, 0xE3E0806F6880271D, 0x6934C259E098BF90, 0x5DFEEAF0FBCA7249, 0x89F74B948B4118B6, 0x53640AEAFB6807C3 ], #F9
[ 0xDD3BACDCC04BE120, 0x6D4949BD64198E51, 0x31FDB39666598A74, 0xBBBC6DE9C0C15A81, 0xF27F201C61C06279, 0x2738AFE3E84E5CDD ], #FA
[ 0xCDD71FD35A6411DE, 0x3CC012793E87523F, 0xB0CFF8720FCA36F3, 0x93E85FE07300F012, 0xE894A085263F090B, 0x2DF60A01DAFA90EC ], #FB
[ 0x9DA50DB1EEB4FADD, 0xE524E49C9974799A, 0xDE09FFF26A24CBB9, 0xAF9D71E9F3ACE7CD, 0xEB62B1A62566EC9D, 0x06D02AB1217D3553 ], #FC
[ 0xDD31E6391AE03522, 0x93ACD1065B35E915, 0xF4EB56CC03E79218, 0x0717815C850C97F1, 0xBF4F6A8AC0540A6F, 0xFCF8AE5DE9507FF0 ], #FD
[ 0xAB45B413DC50B207, 0x40B417369551D8D5, 0xCA32286A108E7210, 0x03225E54D8D093AF, 0x4B6CA5591EA576E9, 0x4E12AB774DC4E062 ], #FE
[ 0xD9F4F850DF6CB96C, 0x8ABAD81B1667335D, 0xCB4079CFE79C72E5, 0xE5542F763E316996, 0x303E4B79B9D397C4, 0xE46933038B945111 ], #FF
[ 0x75B15CC53B0D2502, 0xDA1BCA6BA0524358, 0x9EDA977556C06B7E, 0x6C57727ECF0A1325, 0xDC613D5A78E5C3F8, 0xCE062D94A3B4945A ] #ZZ
]
cdef u64[5][6] _NUHASH_RND = [
[ 0x6A09E667F3BCC908, 0xB2FB1366EA957D3E, 0x3ADEC17512775099, 0xDA2F590B0667322A, 0x95F9060875714587, 0x5163FCDFB907B672 ], #R1
[ 0x1EE950BC8738F694, 0xF0090E6C7BF44ED1, 0xA4405D0E855E3E9C, 0xA60B38C0237866F7, 0x956379222D108B14, 0x8C1578E45EF89C67 ], #R2
[ 0x8DAB5147176FD3B9, 0x9654C68663E7909B, 0xEA5E241F06DCB05D, 0xD549411320819495, 0x0272956DB1FA1DFB, 0xE9A74059D7927C18 ], #R3
[ 0x84C9B579AA516CA3, 0x719E6836DF046D8E, 0x0209B803FC646A5E, 0x6654BD3EF7B43D7F, 0xED437C7F9444260F, 0xBD40C483EF550385 ], #R4
[ 0x83F97BBD45EFB866, 0x3107145D5FEBE765, 0xA49E94EC7F597105, 0xFBFC2E1FA763EF01, 0xF3599C82F2FE500B, 0x848CF0BD252AE046 ] #R5
]
cdef u8[256] _NUHASH_SBX = [
0x63, 0x7C, 0x77, 0x7B, 0xF2, 0x6B, 0x6F, 0xC5, 0x30, 0x01, 0x67, 0x2B, 0xFE, 0xD7, 0xAB, 0x76,
0xCA, 0x82, 0xC9, 0x7D, 0xFA, 0x59, 0x47, 0xF0, 0xAD, 0xD4, 0xA2, 0xAF, 0x9C, 0xA4, 0x72, 0xC0,
0xB7, 0xFD, 0x93, 0x26, 0x36, 0x3F, 0xF7, 0xCC, 0x34, 0xA5, 0xE5, 0xF1, 0x71, 0xD8, 0x31, 0x15,
0x04, 0xC7, 0x23, 0xC3, 0x18, 0x96, 0x05, 0x9A, 0x07, 0x12, 0x80, 0xE2, 0xEB, 0x27, 0xB2, 0x75,
0x09, 0x83, 0x2C, 0x1A, 0x1B, 0x6E, 0x5A, 0xA0, 0x52, 0x3B, 0xD6, 0xB3, 0x29, 0xE3, 0x2F, 0x84,
0x53, 0xD1, 0x00, 0xED, 0x20, 0xFC, 0xB1, 0x5B, 0x6A, 0xCB, 0xBE, 0x39, 0x4A, 0x4C, 0x58, 0xCF,
0xD0, 0xEF, 0xAA, 0xFB, 0x43, 0x4D, 0x33, 0x85, 0x45, 0xF9, 0x02, 0x7F, 0x50, 0x3C, 0x9F, 0xA8,
0x51, 0xA3, 0x40, 0x8F, 0x92, 0x9D, 0x38, 0xF5, 0xBC, 0xB6, 0xDA, 0x21, 0x10, 0xFF, 0xF3, 0xD2,
0xCD, 0x0C, 0x13, 0xEC, 0x5F, 0x97, 0x44, 0x17, 0xC4, 0xA7, 0x7E, 0x3D, 0x64, 0x5D, 0x19, 0x73,
0x60, 0x81, 0x4F, 0xDC, 0x22, 0x2A, 0x90, 0x88, 0x46, 0xEE, 0xB8, 0x14, 0xDE, 0x5E, 0x0B, 0xDB,
0xE0, 0x32, 0x3A, 0x0A, 0x49, 0x06, 0x24, 0x5C, 0xC2, 0xD3, 0xAC, 0x62, 0x91, 0x95, 0xE4, 0x79,
0xE7, 0xC8, 0x37, 0x6D, 0x8D, 0xD5, 0x4E, 0xA9, 0x6C, 0x56, 0xF4, 0xEA, 0x65, 0x7A, 0xAE, 0x08,
0xBA, 0x78, 0x25, 0x2E, 0x1C, 0xA6, 0xB4, 0xC6, 0xE8, 0xDD, 0x74, 0x1F, 0x4B, 0xBD, 0x8B, 0x8A,
0x70, 0x3E, 0xB5, 0x66, 0x48, 0x03, 0xF6, 0x0E, 0x61, 0x35, 0x57, 0xB9, 0x86, 0xC1, 0x1D, 0x9E,
0xE1, 0xF8, 0x98, 0x11, 0x69, 0xD9, 0x8E, 0x94, 0x9B, 0x1E, 0x87, 0xE9, 0xCE, 0x55, 0x28, 0xDF,
0x8C, 0xA1, 0x89, 0x0D, 0xBF, 0xE6, 0x42, 0x68, 0x41, 0x99, 0x2D, 0x0F, 0xB0, 0x54, 0xBB, 0x16
]
cdef u8[256] _NUHASH_FIN = [
0xB4, 0x98, 0x0C, 0x84, 0x24, 0xF3, 0x27, 0x8F, 0xA6, 0x5E, 0xF0, 0x65, 0x86, 0xBC, 0x09, 0x92,
0x75, 0x21, 0xB9, 0x95, 0x66, 0x8A, 0x2F, 0x13, 0xB5, 0xB7, 0x6B, 0x33, 0x2A, 0xBF, 0xF7, 0x0F,
0x0A, 0xE7, 0x16, 0x30, 0x77, 0x61, 0x48, 0x90, 0xDF, 0xAF, 0x72, 0x79, 0xF6, 0xA5, 0x58, 0xD1,
0xF2, 0x40, 0x9F, 0x41, 0xE8, 0x03, 0xA1, 0x05, 0xC5, 0x35, 0xC7, 0x97, 0x54, 0x7B, 0xB3, 0xF5,
0xB8, 0xA8, 0xD8, 0x68, 0x51, 0xAD, 0xE3, 0xC2, 0x5D, 0xCF, 0xEA, 0x89, 0x37, 0xF1, 0x55, 0x60,
0xA4, 0x26, 0xAC, 0x32, 0x0E, 0xD2, 0x85, 0x6F, 0xC8, 0xDC, 0x36, 0x6D, 0xA3, 0x22, 0x5A, 0xC9,
0x5C, 0x91, 0x1B, 0x5B, 0xE9, 0x78, 0xD7, 0x44, 0xEB, 0x1A, 0xC0, 0xCA, 0x94, 0x53, 0xC4, 0x11,
0x12, 0xCC, 0xFF, 0x88, 0x0D, 0x4E, 0xB2, 0xB1, 0x4A, 0x3A, 0xE1, 0x2E, 0x0B, 0x4C, 0x5F, 0x06,
0x81, 0x31, 0xD9, 0x3D, 0xFD, 0x43, 0x67, 0x62, 0x00, 0x9C, 0x50, 0xCE, 0x6E, 0x15, 0x82, 0x29,
0x96, 0xDA, 0x87, 0xEF, 0x6C, 0xC1, 0x8B, 0x07, 0x8E, 0x17, 0xEC, 0x9A, 0xBA, 0x46, 0x04, 0x73,
0x39, 0xE4, 0x63, 0xBE, 0x64, 0x47, 0xE6, 0x3F, 0x25, 0x52, 0x59, 0xA7, 0x42, 0x38, 0x99, 0x01,
0xE5, 0x1D, 0x28, 0x7A, 0xB0, 0x7C, 0x9D, 0x56, 0xE2, 0xD6, 0xA0, 0xF4, 0x1E, 0xE0, 0xD3, 0x83,
0x6A, 0xBB, 0x18, 0x20, 0xAE, 0x57, 0xAA, 0x8D, 0x71, 0x1F, 0x34, 0x4D, 0x2D, 0x3C, 0x2B, 0xF8,
0x10, 0x7E, 0xCB, 0xFB, 0x49, 0xA2, 0x45, 0x7F, 0x3E, 0xBD, 0xC3, 0xFC, 0x14, 0x74, 0x23, 0x4F,
0x7D, 0x69, 0x93, 0x19, 0xD0, 0x1C, 0x08, 0xF9, 0xDD, 0xC6, 0x2C, 0x9E, 0xA9, 0x4B, 0xFE, 0xED,
0x76, 0xDB, 0xAB, 0xD4, 0x80, 0xCD, 0xB6, 0x8C, 0xDE, 0x70, 0x9B, 0xD5, 0xFA, 0xEE, 0x02, 0x3B
]
# ------------------------------------------------------------------------ */
# Mix functions
# ------------------------------------------------------------------------ */
cdef inline u64 _mix_function1(u64 key):
key = (key ^ (key >> 31)) * <u64>0x7FB5D329728EA185
key = (key ^ (key >> 27)) * <u64>0x81DADEF4BC2DD44D
return <u64>(key ^ (key >> 33))
cdef inline u64 _mix_function2(u64 key):
key = (key ^ (key >> 31)) * <u64>0x99BCF6822B23CA35
key = (key ^ (key >> 30)) * <u64>0x14020A57ACCED8B7
return <u64>(key ^ (key >> 33))
cdef inline u64 _mix_function3(u64 key):
key = (key ^ (key >> 31)) * <u64>0x69B0BC90BD9A8C49
key = (key ^ (key >> 27)) * <u64>0x3D5E661A2A77868D
return <u64>(key ^ (key >> 30))
cdef inline u64 _mix_function4(u64 key):
key = (key ^ (key >> 30)) * <u64>0x16A6AC37883AF045
key = (key ^ (key >> 26)) * <u64>0xCC9C31A4274686A5
return <u64>(key ^ (key >> 32))
cdef inline u64 _mix_function5(u64 key):
key = (key ^ (key >> 30)) * <u64>0xBF58476D1CE4E5B9
key = (key ^ (key >> 27)) * <u64>0x94D049BB133111EB
return <u64>(key ^ (key >> 31))
cdef inline u64 _mix_function6(u64 key):
key = (key ^ (key >> 30)) * <u64>0x4BE98134A5976FD3
key = (key ^ (key >> 29)) * <u64>0x3BC0993A5AD19A13
return <u64>(key ^ (key >> 31))
# ------------------------------------------------------------------------
# Substitute bytes
# ------------------------------------------------------------------------
cdef inline void _substitute_bytes(u64 *const hash):
cdef u8 *byte_ptr = <u8*>hash
for i in range(48):
byte_ptr[i] = _NUHASH_SBX[byte_ptr[i]]
# ------------------------------------------------------------------------
# Update function
# ------------------------------------------------------------------------
cdef inline void _update(u64 *const hash, const size_t index):
cdef u64 *row_addr = _NUHASH_XOR[index]
cdef u64 *rnd_keys
for rnd_keys in _NUHASH_RND:
initial = hash[0]
hash[0] = _mix_function1(<u64>(<u64>(hash[0] << 32) | <u64>(hash[1] >> 32)) ^ row_addr[0] ^ rnd_keys[0])
hash[1] = _mix_function2(<u64>(<u64>(hash[1] << 32) | <u64>(hash[2] >> 32)) ^ row_addr[1] ^ rnd_keys[1])
hash[2] = _mix_function3(<u64>(<u64>(hash[2] << 32) | <u64>(hash[3] >> 32)) ^ row_addr[2] ^ rnd_keys[2])
hash[3] = _mix_function4(<u64>(<u64>(hash[3] << 32) | <u64>(hash[4] >> 32)) ^ row_addr[3] ^ rnd_keys[3])
hash[4] = _mix_function5(<u64>(<u64>(hash[4] << 32) | <u64>(hash[5] >> 32)) ^ row_addr[4] ^ rnd_keys[4])
hash[5] = _mix_function6(<u64>(<u64>(hash[5] << 32) | <u64>(initial >> 32)) ^ row_addr[5] ^ rnd_keys[5])
_substitute_bytes(hash)
# ------------------------------------------------------------------------
# Utilities
# ------------------------------------------------------------------------
cdef inline bytes _store_words(const u64 *const hash):
result = b''
for i in range(6):
result += hash[i].to_bytes(8, byteorder='big')
return result
# ------------------------------------------------------------------------
# Stream API
# ------------------------------------------------------------------------
cdef class NuHash:
_hash: cython.ulonglong[6]
_finished: cython.bint
def __init__(self):
self._hash = _NUHASH_INI[:]
self._finished = False
cpdef NuHash reset(self):
self._hash[:] = _NUHASH_INI
self._finished = False
return self
cpdef NuHash update(self, src):
if not isinstance(src, (bytes, str)):
raise TypeError('input data must be of type bytes or string!')
if isinstance(src, str):
src = src.encode(encoding='UTF-8', errors='strict')
self._check_state()
cdef u8 *byte_ptr = <u8*>src
for i in range(len(src)):
_update(self._hash, byte_ptr[i])
return self
cpdef bytes do_final(self):
self._check_state(True)
_update(self._hash, 0x100)
for i in range(0x100):
_update(self._hash, _NUHASH_FIN[i])
return _store_words(self._hash)
cpdef void _check_state(self, finished = False):
if self._finished:
raise RuntimeError('the hash computation is already finished!')
if finished:
self._finished = True
# ------------------------------------------------------------------------
# Simple API
# ------------------------------------------------------------------------
cpdef bytes compute(cls, src):
return cls().update(src).do_final()
# ------------------------------------------------------------------------
# Version info
# ------------------------------------------------------------------------
cpdef (u16, u16, u16) version():
return (VERSION_MAJOR, VERSION_MINOR, VERSION_PATCH)
cpdef size_t digest_bytes():
return NUHASH_BYTES

View File

@ -0,0 +1,2 @@
[build_ext]
inplace=1

13
libnuhash/python/setup.py Normal file
View File

@ -0,0 +1,13 @@
import sys
from setuptools import setup
try:
from Cython.Build import cythonize
except ImportError:
sys.exit("Cython is required!")
setup(
name='NuHash',
ext_modules=cythonize("nuhash.pyx"),
zip_safe=False
)

View File

@ -0,0 +1,103 @@
#!/usr/bin/env python3
"""NuHash, by LoRd_MuldeR <MuldeR2@GMX.de>
This work has been released under the CC0 1.0 Universal license!"""
from nuhash import NuHash
import ctypes
import sys
import unittest
# ========================================================================
# TEST FUNCTIONS
# ========================================================================
class NuHashTests(unittest.TestCase):
@staticmethod
def set_term_title(text):
if sys.platform.lower().startswith(('win32', 'msys', 'cygwin')):
ctypes.windll.kernel32.SetConsoleTitleW(text)
elif sys.platform.lower().startswith(('linux', 'freebsd', 'openbsd', 'netbsd', 'darwin', 'aix')):
sys.stdout.write("\33]0;{}\a".format(text))
sys.stdout.flush()
def run_testcase(self, iterations, expected, input):
if isinstance(input, str):
input = input.encode(encoding='UTF-8', errors='strict')
nuhash = NuHash()
for _iter in range(iterations):
nuhash.update(input)
if _iter & 0xFFFF == 0:
self.set_term_title("{:.2f}%".format(_iter / iterations * 100.0))
digest = nuhash.do_final().hex()
self.set_term_title("100%")
print("{} - ".format(digest), end = '', sep = '', flush = True)
self.assertEqual(expected.lower(), digest.lower())
# ------------------------------------------------------------------------
# Test cases
# ------------------------------------------------------------------------
def test_function1(self):
self.run_testcase(
0x0000001,
"d7964fe1bec2b5ecf21ecc88c86ce4f1e89fb1ef3669d52e34eb049d7fd6c42d4b2bbeeeb70d12c3fcaf43dd2229abc9",
"")
def test_function2(self):
self.run_testcase(
0x0000001,
"b3f13f534034ae8d645d410e8828673761fe2d697218879f9ea528d976ba2e15a3f7485105e612b9a46cb3988635a70f",
"abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq")
def test_function3(self):
self.run_testcase(
0x0000001,
"63703476f4ffce4a8c758d0d3b91a857b9a2e3433ee864f931ba328fa7247b1b0ac9c2e0279243b83051aafac6a7e710",
"abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu")
def test_function4(self):
self.run_testcase(
0x00F4240,
"c6808aeb911c8837cee2e6867e589ab28526a8153494cf35a40c4bd6e20312da33cac4a390cd3b51a2eb4226e60b53e1",
"a")
def test_function5(self):
self.run_testcase(
0x1000000,
"bcca6bc8d113dd3fc171d743ac7ad2d3e63163ea7107d3c78517cf5b53ee0b2f4a0fe079e6a74df350c667b7cfe3cf09",
"abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmno")
def test_function6(self):
self.run_testcase(
0x1000000,
"56770e133b9eb4205f11824ad7280f5c31bc04dd333d1844b3589ab8b94ab95dc09b77be9a8128d7f155fa73de617597",
"g4tB,=[TU%/|8lv_c5Y?F9Sqs1PnV#bNO6DW\\0em~p<ifJhM(2&Qo}`!-*:jrZ{KGX]$zkuLd+)xwC^.\"@AIHR;y'a>3E7")
def test_function7(self):
self.run_testcase(
0x1000000,
"9a8579bb88112b2f3285781a61348d7b04a5632fec12a73a7e0e367a556794a24a32ca7bb14da68eaed83e99c2f8f4c0",
b'\xa4,U\xa5\xb0^\xd83\xf3\x18\xfb\xa7 \xc74\xd7\x1d-F\x8d\xca\x8a\xe7\xfch[T\xda\xf9\xc3vb\xa9=9\xbf\x17\xb7\xb2\x8c\x10\xa2\x1f\xe3tjJlz\x92\xd1R\xea\x88\xbak\xd6d\x96\x9e\xe6LGB\xc5Q\xf2P\xf4{O\xe9\x87m\x94K#\xf0E\x1a\x9a\xe4\x91\x0f;\xb4q\x82\x99\xc9I\xe5\xbe(\x93\x98*\xd9seX\xc0\x83H\x8f\x03\x14@\x1b$\x1e\xa6?\xf7g\xab7\x06\xac\xf6f\xb6\xdd\x1c\n5\x9fV\x15\xec\xf1+|W]\x02\xed\xa8c\x16u\xdc\x9b\\}\r_\xfd\x05\xa0n\x90\x95\x85\xd2\x13a\x08\xa3\x01\xc8\xd3\x84\xaa\t\xf5po\xde\xb9\x04\xb5\xdb0\xbc\x07\x8e\xfe\x89`&NY\xcb6\x86\x11r\xe2\xc6\xaf:\x8b\x7f\xfaA8\xdf\xee/2\xa1\'i1)C\xc4\x9cw!D\xb8y\xd0\xad\x97\xe0\xe1\x0e\x19."\xbd\x80\xe8\xb1\xf8M>\xc2~\x0c\xb3\x81\x12\xcc\xc1S\xcfx\xce<\xd5Z\xbb\x9d\xeb\xef\xcd\xff\x0b%\xae\xd4')
def test_function8(self):
self.run_testcase(
0x1000000,
"fbf4444b0329f508bfc6cf44920b311a718e5f4c4c1af978e78223ec3579365ff5d15c16bb5a33d69cb36f3d40564757",
b'\xb5\xc8\x9b\xd1\xbaf)\x19\xd20\xed&[\xc4\x91M\x14\xf7\x165Zi\xfe\x99\xa5I\xf1\x94+\xbc\xdcL\xddO\xca\x1b\x88\x9c\xa9\xf6s/\xfd?@9\x13\xda\xb3q\xf4\xde\x7f\x02=dxz\x17\n\x93\xdf\xeb\x9f\x07\x04y\x8c\x98\xb8(\x80\xad\x1f\xf2\x96k\xbdE\xd9\xfa,V\xce\xf0\x87#"\xea\xc5\'\xd3c\xaf$\xc7\xb7\x06\xe4u\x83{\xbf.\xa4\xef\xf5\x12]`\x95\xa7S\x11t\xb4\xa0\x9e\xe3\xae\xbbUrY\xa6\x9d\xd5\x89m\x8fJ\x0c\x1d\xcd*\xfb\xee\xd7\xc3\xf3%b\x8e\xb0\xb2\xc28<joN;\x08\xd4\x866\x18\\\xe0\x1e\x81w\xf8h\xdbXT\xff\x97~a\xc0Q\xc9l\xe5\x82\xbe\xcf2C\x01:^PG\xa14\xcc\rp\xac\xc6D\x9a>\x10\x0e\xec\x03\xe2n\xaa\xfc}71K\xe6\xb6\xc1\x15\x8b\x05\x85\x8ag\xf9\xab\x8d\xe1\xa2H\x1c\xcbRev\x0f\x1a!\xa8\xa3BA\x90\x92\xd0\x84\t-3_\xd8|\xb1\xb9W\xe8\xd6\x0b \xe7F\xe9')
# ========================================================================
# MAIN()
# ========================================================================
if __name__ == '__main__':
if sys.hexversion < 0x3000000:
print("Python version 3.0 or newer is required !!!")
sys.exit(1)
test_suite = unittest.TestSuite()
for name in filter(lambda s: s.startswith('test_function'), dir(NuHashTests)):
test_suite.addTest(NuHashTests(name))
runner = unittest.TextTestRunner(verbosity = 2)
runner.run(test_suite)

19
libnuhash/rust/Cargo.toml Normal file
View File

@ -0,0 +1,19 @@
[package]
name = "nuhash-rs"
version = "1.0.0"
edition = "2021"
description = "Pure Rust implementation of the NuHash hash algorithm"
[dependencies]
once_cell = "1.18.0"
[dev-dependencies]
base64 = "0.21.2"
ctor = "0.2.4"
easy-hex = "0.1.2"
[[test]]
name = "nuhash_tests"
[[example]]
name = "nuhash_example"

View File

@ -0,0 +1,21 @@
/******************************************************************************/
/* NuHash, by LoRd_MuldeR <MuldeR2@GMX.de> */
/* This work has been released under the CC0 1.0 Universal license! */
/******************************************************************************/
use easy_hex::Hex;
use nuhash_rs::{NuHash, nuhash_version};
fn compute(input_data: &str) {
let mut nuhash: NuHash = NuHash::default(); // create NuHash instance
nuhash.update(input_data.as_bytes()); // process some input
let digest = nuhash.do_final(); // finalize hash computation
println!("\"{}\" -> {}", input_data, Hex::from(digest)); // print as hex-string
}
pub fn main() {
let version = nuhash_version();
println!("NuHash v{}.{}.{}", version[0], version[1], version[2]);
compute("The quick brown fox jumps over the lazy dog");
compute("The quick brown fox jumps over the lazy cog");
}

10
libnuhash/rust/src/lib.rs Normal file
View File

@ -0,0 +1,10 @@
/******************************************************************************/
/* NuHash, by LoRd_MuldeR <MuldeR2@GMX.de> */
/* This work has been released under the CC0 1.0 Universal license! */
/******************************************************************************/
//! **NuHash** is a fast, portable and secure hashing library, released under the CC0 license.
mod nuhash;
pub use nuhash::{NuHash, nuhash_compute, nuhash_version};

View File

@ -0,0 +1,525 @@
/******************************************************************************/
/* NuHash, by LoRd_MuldeR <MuldeR2@GMX.de> */
/* This work has been released under the CC0 1.0 Universal license! */
/******************************************************************************/
use once_cell::sync::Lazy;
use std::mem::size_of;
use std::mem::transmute;
pub const NUHASH_WORDS: usize = 6usize;
pub const NUHASH_BYTES: usize = size_of::<u64>() * NUHASH_WORDS;
const ROUNDS: usize = 5usize;
const BYTE_SIZE: usize = u8::MAX as usize + 1usize;
/* ------------------------------------------------------------------------ */
/* State */
/* ------------------------------------------------------------------------ */
/// Pure Rust implementation of the **NuHash** hash algorithm. Provides "stream" processing functions.
pub struct NuHash {
hash: [u64; NUHASH_WORDS],
finished: bool
}
/* ------------------------------------------------------------------------ */
/* Const tables */
/* ------------------------------------------------------------------------ */
static NUHASH_INI: [u64; NUHASH_WORDS] = [
0x243F6A8885A308D3, 0x13198A2E03707344, 0xA4093822299F31D0,
0x082EFA98EC4E6C89, 0x452821E638D01377, 0xBE5466CF34E90C6C
];
static NUHASH_XOR: [[u64; NUHASH_WORDS]; 257usize] = [
[ 0x01DCDF00414B3037, 0xB1B3AF661B8E96F8, 0x944D2873DB393121, 0x73DA9A36662AE755, 0x1F4F318C4ECB56B1, 0xF09743D99C2AA5BC ], /*00*/
[ 0xA81FBBC6CBBFC954, 0x39DE43648959EDDB, 0x1A641A0BDA01822F, 0xB52E607266932658, 0x2C5B1731AC802084, 0xC2EF10671FC79DD4 ], /*01*/
[ 0xCF2A8D8E08810046, 0x8B7E9B2089E268F6, 0x930461652C5D2DEC, 0xF096E42223BFC8B9, 0x8DD338964CFE0970, 0x269C342F7CEC60BD ], /*02*/
[ 0xB970A920D2ED0552, 0x010F894A254DA7E1, 0x8D5F205F9D1A40D8, 0x50C33DCCC3FD5F58, 0xB49F31BDE7D82C57, 0x7CDE04F62A959033 ], /*03*/
[ 0x49FAB2822B9C84AC, 0x34B8648CD68CBEF1, 0xE5121147BB4126DE, 0xC0B31F54B2FFE00F, 0x2F193DA38E8CC632, 0x058C984B429B8AFC ], /*04*/
[ 0xE07F9DA44D8C9942, 0xBE2AF9B39ACA65F2, 0x5D3D8FB1466DC295, 0xC0051E3EC3F962C7, 0xF8FDC3CCD4CE2BB6, 0x9024C0EFC6199937 ], /*05*/
[ 0xA3111377EF01F5EF, 0x31F59B366C02A3FF, 0x61B82949760D16DC, 0xF6B958AF92BD3BDF, 0x7297AAEFEC69C0B2, 0xFE8A50AD9E8684CD ], /*06*/
[ 0x3D3DD0C829EA9AA0, 0x3E77597EEC96C7A3, 0x8FD038231E7F1684, 0x64617B131FB7EDE0, 0x85C99CE4C5405874, 0xA58735D41F19C5E3 ], /*07*/
[ 0x8028628ACAF91B9A, 0x194A640538C97064, 0x04A15E018A4F1680, 0xF4BE1B04C2360955, 0xDFB24D4CEF581A20, 0x3C59D0A0FD15879D ], /*08*/
[ 0x88F8E2ECE78AF1BC, 0xB46B6E22297364C2, 0x9339F17F926B99F3, 0x31293489B3B8F07C, 0x3909CE1649C9BCF1, 0x0C46103BFA31BCE9 ], /*09*/
[ 0x4D1A0B8CC7EFE2A9, 0xAFD7878CAD55E871, 0xC89CFBC858CF4153, 0xC4739486C74F75D6, 0x0BF7192C130AC9F2, 0x0084F2BC5E81BD9A ], /*0A*/
[ 0x4AFBE975014FCACF, 0x41DEAF8CFACC41E4, 0x3C1EC23B53ED16E9, 0x78B06EB30F1C3248, 0xDD11165D04285C72, 0x6546D9B5609491E4 ], /*0B*/
[ 0xFFD1E2E04DC8D260, 0x07B186948A74ECCE, 0xB5120E45121AC531, 0xBD0BC86330810C85, 0xDE93AFDDDB487730, 0x78DEB0DE6EB99196 ], /*0C*/
[ 0x79BAA2AC3FDEBA55, 0xB1B7E3E1C92A567E, 0xA53F69AB4A5B0794, 0xF0DA7499954F6DDD, 0x58117C89E1132248, 0xD95DF5F794C51A6E ], /*0D*/
[ 0x89BC8A0C65091C33, 0xB04EEAEE063135C2, 0xF53267E04AB6E689, 0xB4C579B7207E8BF2, 0x3FD31E51343CD2DF, 0x119E523E2F8197FE ], /*0E*/
[ 0x2E10CB1C6060F32D, 0xBC92E732A94E6B63, 0xF3220D831FD04267, 0x502C5F7414BCE87F, 0x89E0651DE91D2457, 0x759E56B04482D915 ], /*0F*/
[ 0x43AEE32C6A84E803, 0x0C5007202C0BD7E3, 0xB4F464474205D32A, 0x7D17FC95DE386C06, 0xE8DFBF64567AA545, 0x55BD889D5853046F ], /*10*/
[ 0x687ABE14EAB8DA27, 0x397B3AB50D72C344, 0x505EAA6D1FDE618D, 0x61BE79865DA13F69, 0x17BBAB29B5E90E2D, 0x010C921972FA8B2F ], /*11*/
[ 0x8B7223A4F56FF453, 0x291B7B5CB98B6FE1, 0xFD421625786FBF7D, 0xE33D1020D0E8CDC8, 0xCA530C708B739E87, 0x878AF1F304B8A12F ], /*12*/
[ 0x7ECE1F24E56DD711, 0x2E0869241B2FA6DF, 0x84B834DCC459B2FD, 0xE022EDA6319E7D3B, 0x59839D8CA03C9928, 0x644790F491BBC774 ], /*13*/
[ 0xCBDC6F49E6B0DD0D, 0x44BA2F8D00346732, 0x86BCC821586AE61C, 0xC7B7491285CEE55B, 0xED3912FFD97F3851, 0xF4AF0186BEBEBCBF ], /*14*/
[ 0xCA8A48E54ECCE516, 0xBEDF1864B7F8F506, 0xD56A1F60A4B36AA4, 0x49B25AB5FE0DD9D9, 0x21377DBB5E49FCE1, 0x708F64F5D59D99E7 ], /*15*/
[ 0xE9F873A569AFE02C, 0xDA66BC05CA997390, 0x8C88174756D35385, 0xEAAAF16CF4FDA730, 0xB39F7A55653A3512, 0xF10AB727BC23E852 ], /*16*/
[ 0x93E96FF8C5BBE2AF, 0xA47785420253E97C, 0x704B25D1F77D074C, 0xC0B2093F1470559C, 0x8D5BFDD4E364AACF, 0x550518673F5B1BF7 ], /*17*/
[ 0x8DAC832E5BE81ACB, 0x588BFB202B7583D8, 0xA34D8A70DFD1D7E4, 0xD03B0627B687033E, 0xE3D0BE7EDBDC75CF, 0x818EE8C5B09F8BEA ], /*18*/
[ 0x8E3B02E1489D7D31, 0x5336752B64E3B532, 0xE4D4CC795C580A65, 0x6DAB08F313ED767E, 0x8E567E88FDBA36BF, 0x259490F1D8E933D0 ], /*19*/
[ 0xEAB437D0D62CAA62, 0xC090AD28B982B003, 0xE255D768D25704EC, 0xA048511AF6256A43, 0xE79F078F4D498B5F, 0xC41735FB75B357FE ], /*1A*/
[ 0x70DA9FC3504FF29D, 0xB9AB1F388673FF25, 0x36922F4CD17357BA, 0xF09C3AB292E7E04A, 0x90CE0BC3D9BA13EC, 0x647C4CA63C918DE3 ], /*1B*/
[ 0xD834A38DD1ECD688, 0xA97A0020DE46AB6A, 0x9CDEC7F6E62EA71F, 0x288A5A6FD74DC47E, 0xD44A2E2765CE50F1, 0xBB9B50B5DB9E4F3C ], /*1C*/
[ 0xC66DA90E41DDF2E6, 0x5A3FE86F160C5C09, 0x6F6AF0405108CCBE, 0xF938382EB627FC7F, 0x163DD634617F006C, 0x5184B1FEDC908497 ], /*1D*/
[ 0xC95719ED07FCB21C, 0x5112DF043F6EE7EB, 0x50F9FD60012334CE, 0x589FA85104D96579, 0xB7129E44D71905A7, 0x3314766E0733528D ], /*1E*/
[ 0xDC6C8014C5457CB8, 0xD635FDCD286A69B6, 0xD66F232CE27D01BF, 0x56AF4AC0F682EC0F, 0x57DF1D55B64328F5, 0x651ED4C52A87CACA ], /*1F*/
[ 0x26D9D1CC79EEC502, 0x69BF340A34B1EBFE, 0xFAA5AAAC8E397174, 0xD0A8F9BD426BCF6F, 0x5B131F464D6D2452, 0x122DD15660D0D6DA ], /*20*/
[ 0x6E389AEC5F51A22F, 0x7EF68F1C54C127FB, 0x986D4D46E0485C30, 0xF0A47B39E7CF8A31, 0x1D398DFDB7F2A78F, 0x2FC651D1FBB10D2E ], /*21*/
[ 0xA44E4E8D1B49DCB0, 0x07A4822049C2F343, 0xC40AC04A8D6505BA, 0xD9B91D3F0729B16C, 0xAAF39951B50F9015, 0x966EF5D3AD3F9076 ], /*22*/
[ 0xEA78CBAC0EB6D009, 0xA0FEA6725A23DEAB, 0xCE729C7444CB94D9, 0x40A994626627AA0D, 0x37F738CDE3D018D5, 0x4C29491C01CDB3C5 ], /*23*/
[ 0x7C9792AEA745C87A, 0xD1FF5620C5BD8FD4, 0x9ECA84E3004B56B9, 0x5AFD3923C228B1D6, 0xE5DBF79EB3FD283B, 0x441712E354084B9F ], /*24*/
[ 0xE35D288BD8E249BC, 0x91776C1453A366E5, 0xF5D1E1684E95EFEC, 0x9108E117D7DDF606, 0x81B30F9DA2CE7C8C, 0x6497DBD786818C0D ], /*25*/
[ 0xC2F891FF45044BE0, 0x75A1A76D2B87E2EB, 0x85CE65798AF3C2BF, 0x213F532B4EFD09DC, 0x0DAA1DF5A53A6C88, 0x3028606A50D826B2 ], /*26*/
[ 0x609A62616379F33A, 0xA339A3BC53E4516D, 0xD7AD92616A5ADBEC, 0xD043726D86E924AA, 0x8555B564F4C29865, 0x56AA12AB31C1D6B0 ], /*27*/
[ 0xCED9ED85C1C17BFF, 0xEB522325ACBAFFC2, 0x04D3D8F4B2D15394, 0xD271504C04756EEA, 0x2DDBA4A91AF827F1, 0x1F67D5C28F8002E4 ], /*28*/
[ 0x8B9C08AD432DC08F, 0x5A7543E29796BBC7, 0x34A6DB5B3C1967DE, 0x016E3BC2A2804EE4, 0x5B9BCACCE5172F75, 0x7549598B80ADBDBA ], /*29*/
[ 0x6F3FB117C5CDD155, 0x16C3B0A59CD6EEC5, 0xD9A1A411DE538769, 0x938C54979F4AC37C, 0x3737BCC1D55284DB, 0x6CAD9F8AF9156BB7 ], /*2A*/
[ 0xEBBF284F9C75EBDF, 0xB383EBB406753DE8, 0xAA86127AEE7C403C, 0x10BFDD10523DE027, 0x138BF6C4EB4A8A13, 0xB1EFF67DDB78B067 ], /*2B*/
[ 0xF6D1138D7AA3DA5E, 0xBAA8098D8FB66371, 0xDAE76D1B8B6CAAF2, 0x400F1034368D1EDC, 0x7C937F5172E8D277, 0x7D05BBF83CADE6EF ], /*2C*/
[ 0x0E9C2EA6CF34B081, 0x9036B30D58F60BA0, 0xDB3A2C5848F08BCA, 0xC87AD1B94250D564, 0x7C892E09EEF96166, 0x26DB85CF571085F3 ], /*2D*/
[ 0x251EE3F58718C12A, 0xF9438D81178A2AE4, 0xF0929A889039A8A8, 0xF06B65225EBDCCFD, 0x2E4D14EDF7BF73C6, 0xA9369895BC1DFACF ], /*2E*/
[ 0xCAE302B41D6979CB, 0xBBFA5A58B51EE623, 0x5113B99DC81AB52F, 0x6093795BEC17A056, 0x8F71FB4D2E5E355E, 0x762F92EDBA34A2F2 ], /*2F*/
[ 0xD130015265A4D9FF, 0x09BEA253D71F26C8, 0x81B6EAEDC46521E6, 0xFAE268165682B8A9, 0xA89C3EC4774AB623, 0x0D2E45E055219DB2 ], /*30*/
[ 0x2B560284C3A692AB, 0x37008AD0B379A7B8, 0xAF11CD2C30F90BFC, 0x7FE87A250F2762ED, 0xC3FBD711647242C3, 0x74ED8264F6B322BD ], /*31*/
[ 0x28195CC8A7AD3943, 0x53CBE808464C4FC4, 0xD58E3D7A765F8726, 0xD83052F60185AA4F, 0xEFCB0D85223BB4E7, 0x5A31305E787FAC28 ], /*32*/
[ 0x725D0EE230F19543, 0x9091D2C6BDDF34E0, 0xE3BE49C6C2754601, 0x61BE300BA4AD566B, 0x02D79D7551FA7CC1, 0x6543910F5F1CDA58 ], /*33*/
[ 0x4099ADC44481B43F, 0xFE1361922FD9EB81, 0xA989C09E441FCEAC, 0x449B3A13D3CB9019, 0x45A9BE396F201134, 0xDC1AD05A046633FE ], /*34*/
[ 0x1A563A6D522F3E69, 0xBE589E079F475A9E, 0x75A2A9638E4C0038, 0xDA3B6202577A0362, 0x211D3F1E0D727AF6, 0x5E1FFC529AD99233 ], /*35*/
[ 0x47B61E86C6D6D01B, 0x437D6F83ADADC318, 0xD5A361028DED738C, 0xA00D4C630425164B, 0x1A69AFA5AF4C9DD2, 0xF99E1C67F951B582 ], /*36*/
[ 0xA66A7740B6BDEA79, 0xFEF7FF1496AF80A3, 0x05AFD43EEACD898C, 0xB00C78ED31AD7134, 0x0ED31A1AD7846673, 0x74B96844161499BE ], /*37*/
[ 0x46FA8D6CCBF6D12E, 0x31C2FC147F303956, 0x707F4401DE5F067F, 0x3AE5FEC7E33594E9, 0x28E39F8A63531714, 0xB7B329EA1E9FCAB2 ], /*38*/
[ 0xEFD8F755825C7804, 0x1F5A93870BD30CD1, 0xEFBF894671FF8716, 0x28ED617FF22BDA58, 0x411289CCAE5CB62E, 0x95DD42F41801F2F9 ], /*39*/
[ 0xA8525B8645FC59E1, 0x75E62DC00A5F7F0C, 0x09C56785210416AC, 0x50EF76E9B30D7626, 0x2B3B2CDC19F5D665, 0xA41297CD11D8F4FF ], /*3A*/
[ 0xEAC99A649EEE5039, 0xA593C92F143C0065, 0xB314735203071206, 0xEA2761A0C764A4EC, 0x02AA7FD46CAC25B3, 0xC68CC182A96D03BF ], /*3B*/
[ 0xB2873F024EC83CA8, 0x97470AB8FD8853EB, 0x18FE15C159B305BD, 0xB0AB08F687EAEAFD, 0x510A3FDE73602E43, 0x03E1B84DCCF0FCF0 ], /*3C*/
[ 0xD85BBBDC8033C0D8, 0x9223D9C39CA9F34F, 0x7D3BCB6D5B63C3FD, 0x1C30F974DA0C0FB5, 0x8B24BC9EBEFB5143, 0xC58954925B7B84FC ], /*3D*/
[ 0x6ABD7C2E0844D7A7, 0xCCF2EA456CDF530D, 0xE8938CF52B3921B8, 0xBA023CA2F281657C, 0xEC635DA675D1EDAE, 0xB4AA52F22EE1BE6C ], /*3E*/
[ 0x981C3AC677CB5904, 0x6A92B54C84877B49, 0x745BA6BB40C55815, 0xB7AF550D22A371ED, 0xD5E8BD87C65F5374, 0x67874A37F0F538F5 ], /*3F*/
[ 0xC23BBA2A9DECC021, 0x4E610E930B0E3450, 0x1A681AA91477577E, 0x38A3209714EDC376, 0x0FD15563EEEB4AB6, 0x7D57668A01D42178 ], /*40*/
[ 0x6AF88CE145A098B5, 0x1AEB858CD88B8B46, 0xE8B733AFB8E2D6E8, 0x313FAA8C10A7EBFA, 0x127D375E77557CEA, 0x96BDA2F70B2F2155 ], /*41*/
[ 0xEC8903978FAFB636, 0xC7213C425C079763, 0x760384036AB6D17C, 0xE0C63A26385F1F49, 0x299877D6811A6DF5, 0x876F90FC5304B88D ], /*42*/
[ 0xA6FABBC2D6E0BA16, 0x9B70C9640080E6BC, 0x29B2D5265598B27B, 0x4A9657C726E4397E, 0xA801CCC6766678D5, 0x800EF7CC72619998 ], /*43*/
[ 0x235931A8CF5490BF, 0xE798F98E0E8F879F, 0xC6EEE29C38F30CA7, 0x929A79F2D53E0024, 0x88F2E12749587A45, 0x0B85B28F38891965 ], /*44*/
[ 0x165E0303E4A4D827, 0x67994F42D1E8436A, 0xE6CC8BCF6E130D1B, 0x50101711709DDEFC, 0x373BDEC40CD05328, 0x40B274A4AA5109F6 ], /*45*/
[ 0xA9F88BA008FDF8C8, 0xECC897E3476EE05A, 0xBCE290AB69D57A74, 0xFA44DB1811E3115D, 0x6267AEFD64480C88, 0x2697D04A2D3AECEB ], /*46*/
[ 0xC0782AF2ABCD3313, 0x02BA1290F2F96273, 0x63C82F1A56ADC2B9, 0x10F8E8C03EFE51C4, 0xE3EB348625CCAFFD, 0x93D607969CB8E7AE ], /*47*/
[ 0xCC6E179443E58FBC, 0xD21C93C655A7B8EE, 0x2B9834A31F2B8BA4, 0xC83B69516025ECEE, 0x9176EB7B427AAE94, 0x8CB65B9E30B7A76E ], /*48*/
[ 0xC1A33A0AD6EDD989, 0x18B3C5D95813B5F7, 0xB024BD263B359A8B, 0xC8C17C2216A99B50, 0x71F9A11D58237729, 0x3AA67C7618284290 ], /*49*/
[ 0x99B7465E09201C7B, 0x9AF89FA01CA4FA81, 0xFC2EC63E761AD123, 0xE2A9A39585B17D14, 0x08394DE529F94E81, 0x479448E69794FAA4 ], /*4A*/
[ 0x23CA3D1C4CBDCABB, 0xE3265436CE1A37E4, 0x1BBF10F69E8A4CC9, 0x05A66708048F5C4D, 0xE259DCDD9C5BFEFE, 0x439E65FAFD936EFD ], /*4B*/
[ 0xA24D73B6978F719C, 0x3F53F343CCB0BB8E, 0xBE3C72769EE07C6A, 0xFACB9E539CF558DD, 0x67B91D4E30DE986A, 0x1DB913D11698913A ], /*4C*/
[ 0x98BD4E140DC3C3C6, 0x142B1592BF3263E8, 0xCDBEAC59ED095B0E, 0x900763F0F625896A, 0xE213550F30324E39, 0x8A13A4417A803195 ], /*4D*/
[ 0x2ACD98ED8C626073, 0x1CAAA6B4C4CF3238, 0x04DCB41EB677EB5D, 0xF88B5844A8105B68, 0x981D9E951A061A4D, 0xBC9471894C878EDB ], /*4E*/
[ 0x4959FEAD5D6C2DBD, 0x6ABD59E28C503049, 0x06D2C5494CAF8B34, 0x70E4541304A4293C, 0x520F3416CAF2F503, 0xB23D09D92613DB85 ], /*4F*/
[ 0x26B5A815C32D1791, 0x2C99E7555BB033C6, 0x09CE9D6A0002514F, 0xD485282B2B8D7997, 0x9C5B792F4A4A14C6, 0x851D9D02DC0BB4E7 ], /*50*/
[ 0x62FEB6CACFB060EC, 0x9D977D69D5C661EA, 0xBF08EFD806D81556, 0x25F1EEA460EA5718, 0xA25346B51F5A9665, 0xD92F9ADC358CA274 ], /*51*/
[ 0x27E63DFC63E8FFA6, 0xCDB9CCE2CE99FDA3, 0x979D5B754974830D, 0x3298C8407D6693BE, 0x629D5FADA39B42B7, 0x2654D31271CD84E1 ], /*52*/
[ 0xAB1FA4DAF66E583C, 0xEEB6B7A236D24766, 0xA90738CDFDF5C6B3, 0x28CBA9E5648E2D4C, 0xFDE5BF6C0CFE0DA3, 0x9D00B863D7D78485 ], /*53*/
[ 0x75FBBF094EEA16AA, 0x48931F027CD729F2, 0x5D360679009B2E7F, 0xDDFCD148BD3DE21A, 0x4DBFF544B094D0E1, 0x9C0E5C6294352C22 ], /*54*/
[ 0x283A27FF968853D2, 0xB0960C6CEA0D03F2, 0x172BBA07A473DB38, 0x688C87D296E6F4BB, 0x5CB7E9BC5D68CF0F, 0x57A5D71B0E47BFB4 ], /*55*/
[ 0xDE0108AAC1E4FF2F, 0xD346CFABEAC62B99, 0xB72E203F98B5F608, 0x81853D8CA54B29BE, 0xA6AED7C89FAA1680, 0xD2093B155C39D7ED ], /*56*/
[ 0x0BAEAC99D4974B84, 0xC7F258A699C9B4DA, 0x6F622C5E4ACCF5C1, 0x58AB397D9781BEAA, 0xBF811F67E101FFE3, 0xAFBCC2881C3C0EF3 ], /*57*/
[ 0x26B211FB518D6C3E, 0x64BADAD51A10784A, 0xE6BE4E06A587186C, 0xD471F5C61343CD5C, 0x8389BB0DD6AAED5D, 0xC88112678914A17D ], /*58*/
[ 0x2B2D0BC3BB88D27D, 0xC5A7D1FAFF517AD2, 0x96F39056A09F82AD, 0xFB38A61A6CED4D4E, 0x9D308E4EA6F9B264, 0x9097CE294AECC6B3 ], /*59*/
[ 0x8FCA2B950690B1A2, 0x293EFCBF03D422DF, 0x8C9125B3E76353AB, 0x3D402092A1A70173, 0x9BAB974CAB9BF676, 0x5EA8FCC55D8C586E ], /*5A*/
[ 0x408C92E8C2E1EC8C, 0x4AF4C914B71B4350, 0x5186AEE0CDFB1069, 0x2385EAFAB9657C67, 0xF708E4D3C898CA80, 0x1EC8B9F89884907E ], /*5B*/
[ 0x46E8958B6A2C1878, 0x2172FD410F78A647, 0x9D8E9DD83A299004, 0x390913C3265AD025, 0xD231F1E23077CBF1, 0xE7EE3E574E80D7F3 ], /*5C*/
[ 0x5A8567A3D85E40B2, 0x16ECF161133FCF73, 0x52DA5C6FBA3C0DD7, 0x56E57983DEB34BFB, 0x83254FDCB768D153, 0x9A14F95F35C6B82D ], /*5D*/
[ 0x498A29C6E19D4AE6, 0x2EF4AAF46027BA11, 0xBDBA7DAA84F39505, 0x940B2A04F6DC944D, 0x4E7ED35610FC0D53, 0xBADD94C2907E59E1 ], /*5E*/
[ 0x14DF0FC43F475F80, 0x17E2AA8D264BF82F, 0x92625BDFE58B934D, 0x8384F415A4ACEA81, 0x8E9C5EAEC5D8642B, 0x4D8EF55F1C826687 ], /*5F*/
[ 0x4A2335C4F77128D9, 0x544E1476D29ABA94, 0x654EC86321785044, 0xB04AD9B02F80445A, 0xB0E01B6480C8D020, 0x596E325E88A3CBBF ], /*60*/
[ 0x896955157448D062, 0x0DB08C4C0F236D68, 0x3BA8FC5B3CD1C4A2, 0x04F57C53E144535B, 0xB7D04DCC7BE46840, 0x4BBE993192334646 ], /*61*/
[ 0x1D7837E6AB02CE27, 0x3EA35BAED4493EA4, 0xD1CAFDB5DF94FABE, 0x98B580BB62170C4F, 0xC3C57A6CA9421C43, 0x68D65FC2C1201634 ], /*62*/
[ 0xFAEABABC48717536, 0x454251E8F62F7315, 0xB318E8A7FDCDC523, 0x7C2E832013C91344, 0x4D9E5DAFD1699052, 0x12262E8C870537A7 ], /*63*/
[ 0x8A3E5D0BEF8402A2, 0xA33BC5FAFA019909, 0x63CBE8ACD00762F5, 0xEA26A3F181984178, 0x6EEB78D1BB4AF6BB, 0x7ECF9671300E845F ], /*64*/
[ 0x0811B67CCCF5D0FC, 0x9F8CAB3F3496BD6B, 0x57CB7D24F1355C2D, 0x58218594165BDE80, 0xFAF3368A653A78F8, 0xC04CD80176267762 ], /*65*/
[ 0xE6417CE75AAA23B0, 0x34A7BFE3CBA61761, 0x8C13E396F8C9B6ED, 0x5C9066464B09ED63, 0x76CB6A642C5CE283, 0x498E082A3EB449C6 ], /*66*/
[ 0x6F2ADEA6357B5AA0, 0x54DA382B15557B69, 0x302BD81946237AAE, 0x8F0CBB82111EFEDC, 0x45DD2DADCE20F2D3, 0x8A77A5E9E8A2D1D8 ], /*67*/
[ 0xE1EC332735862A28, 0x92B68B1A7E9C7C44, 0xF45618DC99E963E3, 0x7CAC984502DD1A73, 0xC8650598CD70840D, 0x9A5DA584A26D4EFD ], /*68*/
[ 0x16B19B010740C15C, 0xB4544AC01016439A, 0x221F749C9E2F99A5, 0xA63E8A279A65570F, 0xC7231669ADD072AD, 0xC5BC35BA740BC801 ], /*69*/
[ 0x6C44E75A4F378694, 0xD27ACE108A577647, 0x17C487FAFA7E15D6, 0x6A3654D5C8E29EDF, 0x0CE35EEDCC611FFA, 0xD88A8C03C0095093 ], /*6A*/
[ 0xCF106948BC4B1F2C, 0x91C0DC9990B99712, 0x193B21E3E109AB32, 0x3340DE0608DD1666, 0x8A5BB677BF602828, 0x402C410B1197B771 ], /*6B*/
[ 0xEB080FF49CA5543E, 0xB4B9429542D6CA27, 0x5999D45DC1533205, 0xF7EA9E398A1BEF3E, 0xBE8817775476DEC6, 0x17064D7790C84100 ], /*6C*/
[ 0xF3328E9150A7F8D6, 0x52E3E61B04ACFDF8, 0x51D82010F3CEB015, 0x59D673336676D5D8, 0x4CB3BCEF1D91C342, 0x0C589AB58033BE49 ], /*6D*/
[ 0x54B8E70EDCE03855, 0x7BB590E99687FD57, 0x6CFF08688D2B1FDD, 0xFD0F6D068BFE994F, 0xEB9BCE302489AE44, 0x66B21F200661E3E4 ], /*6E*/
[ 0x2F5E0060189669AD, 0x473AF1D03C00CAE4, 0x0278299268D1F3B4, 0x888714BC3A7EC9D2, 0x9FF9C7F071EBD2D9, 0x875A5DC25DFFDB10 ], /*6F*/
[ 0xE2A97A3E468399D8, 0x3BF7EACA32C80DA1, 0x13DCAC8EB6C2231D, 0x227EC90E1102EE97, 0xB2344832F0381434, 0x8613888303B190EB ], /*70*/
[ 0x3A3D3B6CE026BFFE, 0x18D4953B9A68ED59, 0x24BB7B574AB777A0, 0xE0CB7DD64983DCB1, 0xCF768C439869AC97, 0x8062BC7A900E6033 ], /*71*/
[ 0x39D4C3B78A7A33C7, 0x43D72EF22AB0B4EB, 0x54AE8184DDA50394, 0x0C2A7DA083C38536, 0x9DBC6F921D4AD822, 0x2CBB61FE182EAA42 ], /*72*/
[ 0xD8CE9A806C0BD24D, 0xF69D65A65845727C, 0xC3FF81CC76F2B048, 0x76B1FDC3CA67CE58, 0xCED0970AFBCBE78A, 0x57502941B726F5F3 ], /*73*/
[ 0xE006AEC17FCEFCF9, 0x05CAA1629E003591, 0xB7050CC99F585312, 0x669260401E159490, 0x8442D25AA757CC5A, 0x228655CD4038770C ], /*74*/
[ 0x93EE8D67D3F1F3A1, 0xBEA46D48DBF8D7F4, 0x3C91F02B8646453C, 0x6C3D7C1F04188A58, 0xEFA97287F89CEF84, 0xCB40364E108BFF4B ], /*75*/
[ 0xC6DCE3730D4FF825, 0x02AF54F87D972790, 0x7D69D20F6F4F788F, 0x90C255C64C166E8F, 0xA3529FBF4BF9C9A2, 0x3ECEC41136694F6B ], /*76*/
[ 0x3DE10A5EC6CA7B3F, 0x7E196081D085ACAA, 0xDF5F0DE3705D60F7, 0x393E7C83DCC57075, 0xA5F33BC2DCB98F97, 0x0AEB7F050D1204C0 ], /*77*/
[ 0x6F3B3B3D11A8BC05, 0xB52269AB2B95B8DC, 0x12EDE24EB1385F13, 0x202BBA6B5836B5E1, 0xEE3636C5925ACC49, 0x42224CF6EEB509BF ], /*78*/
[ 0x5F0CC3BBC4BE9A92, 0x584313FCCC54DD2E, 0xC11FE90F00394036, 0x3371667C72FC9723, 0x9611990B62AC8D9F, 0x4CFCB9EB3C317FAD ], /*79*/
[ 0xCA8E520A894A3FBA, 0xBD9ED1B80098CC40, 0xBDF24507DFF3757C, 0x47AEC572E68D35EC, 0xF3D4523D27B373E4, 0x1AB11E16973A05AB ], /*7A*/
[ 0xFFC293A6C26B817D, 0x2C9E9D134959D828, 0x7FA5216408199BBF, 0xA6F002DE0DCCD861, 0xBE8F9DC57F2CF35D, 0x1352E2DF86A47647 ], /*7B*/
[ 0x84B55BE101708E74, 0x3ADEC53721209F3E, 0xB18F9A1E68DFADBD, 0x09A050819774CF2D, 0xE4AB295D380A8762, 0xA3605B0C689C239F ], /*7C*/
[ 0xDDC7031FBFDFFE8F, 0x0B175DE65B832F0A, 0x31162ABC65719685, 0x51215E534BBC36B1, 0x9F2F7D3B5D01AE44, 0xCF43A2426E83B61B ], /*7D*/
[ 0x7E32DB672B16F04A, 0xCE6F45DE0E6AB788, 0x25718548B8E70B41, 0xD7368BCF39A0FAC4, 0x956863EC49880C47, 0x720E335796341674 ], /*7E*/
[ 0x06707A8E33D9D6C6, 0xB684BFE26CD576C6, 0x44F47E5ECD5FC46C, 0xAF1B23A856D844B7, 0x98A627916AC5657E, 0x040C3964A1127E19 ], /*7F*/
[ 0xA5DAEC3134C0A39B, 0x0CA04160BD5ADB1F, 0xB50EC5A9F29E1ACB, 0xBE2FA1126AF7BFAF, 0xBEFC0AC4C9C5A4B3, 0x994739C71FB1EB29 ], /*80*/
[ 0x6FEC2D343E83A763, 0x5BDBA5715757F50C, 0xD6F6282EE46A11B3, 0xA8B501F5922A5524, 0xA782A21006B605CA, 0xA10BD2E896975C81 ], /*81*/
[ 0xB8AAE0532226D0ED, 0x891831C0470E84B7, 0x74C824D648E8FF28, 0xB5E4E02EAD3906EB, 0x5ABB086ADA60A713, 0xA80C57666A9E29F1 ], /*82*/
[ 0x529E3E52B1E7230A, 0x0C148861C9F08E26, 0x0CFC8A131BAD803D, 0x8C09F324902FAA9F, 0x0231EE4987999848, 0x3B0688492E2B5457 ], /*83*/
[ 0xEFA6EAC5036814CD, 0x02773C1F8DAA5DF5, 0x0E4EEDBD0702DE31, 0xBA7FD757D0D740EF, 0xA8805F0C74005F8B, 0x1448467BFF3E1EF8 ], /*84*/
[ 0x2A07B766016AC70D, 0x64215C35364219E9, 0xCD6F7EFE35FCF6F1, 0xF05CC06084C29267, 0xAB3BF2F32579A444, 0xAC75F42D9A25B9C9 ], /*85*/
[ 0xEF3A14B5EDDB8464, 0x2314E0802D2DD0E9, 0x14DEAEA9F928762A, 0x5763EBB480E15A02, 0x25F7CA14E8CDF5E6, 0x8E594510DC61E6BC ], /*86*/
[ 0xE62C38DCFD21000B, 0x7BB32AE917EE3DA7, 0xE49F15E24CC9B656, 0x56E28259DCA361D8, 0xB43B8008A9285F48, 0x0DC6B4AF7E4AE61B ], /*87*/
[ 0x703C64241142DCAE, 0x732D33342C45063A, 0x37877EA1624567CB, 0x2871D534614DD114, 0xE748092A1D94F5D1, 0x4524056F0C6D1CB7 ], /*88*/
[ 0xE325B1823A595DF9, 0x742D0DD5C96F397C, 0x44361C9540A9F451, 0x02382F9BF6331FB9, 0x8ECBAFBBE91A0467, 0x528EBF3811F904A8 ], /*89*/
[ 0xFD2BC6534631FB0D, 0x27A5F036FEEB9A6C, 0xD0F876D7911D0775, 0x12EFB3A29C6E0B72, 0xDC4BCA3D5E871DA1, 0x028FB6E6E608F46F ], /*8A*/
[ 0xEF17ECC8930A7B4A, 0x9D97B34672FB273D, 0xC6AE835F35A25D8F, 0x6C27469530C21F5B, 0x2FBC16A26150E795, 0x02AD93AAE0B5C71A ], /*8B*/
[ 0x6D24BE43CF07DD56, 0x63681D62A38D2A2F, 0x9872C9B411724AA0, 0xB882B4857C19690A, 0x87B1BA8D2804C6F4, 0xD7B199CC36F40B49 ], /*8C*/
[ 0xEEFB8D8573FD9E0F, 0x933403199B91560A, 0xFF0DB41665D5248C, 0x322EE105EA984196, 0xDB8CE0F83890D89B, 0x3A32F8983C901F80 ], /*8D*/
[ 0x082CDAF93F215BAC, 0x67C118A1B9274FAC, 0xAF74501CFB93198A, 0x53525CABA0E812D3, 0xC9AF3A005EFE8A6E, 0xF242DCB60DA7B2FE ], /*8E*/
[ 0xD3887FBFBB7314DF, 0xDDDCCCF0F720C342, 0xB2C4331C33C8C415, 0x1666010767F4785B, 0x8455B7C1FD5DE487, 0xA821C5EA181875F2 ], /*8F*/
[ 0x7E289831418562F0, 0x2AD12E3042B185C3, 0x7C20D0D735A6AE96, 0xA68BEF98E22CBD41, 0xA1411D22F8D93243, 0xD813FB404F3D2F38 ], /*90*/
[ 0xE13FC0A76F664294, 0x7E21C9D9F7FDDDCB, 0x161E68B366D6B1F8, 0x55BF957EB5743874, 0xB23213EF8364D766, 0x529BB98AF96643D4 ], /*91*/
[ 0x036D7ADDAADB5C33, 0x0525835F802D032E, 0x7DF7D0D8D7A2BEF2, 0x84927644B27696B7, 0x215E21E4D1F9B5B9, 0x77743669C40EB7FD ], /*92*/
[ 0xA9B3534BE8897784, 0x5BFD4283541A5090, 0x97AFFCCD121C9778, 0xC146C4C9637989C7, 0x0820E72FCBDA59C7, 0x5526E2F4A0AE4F4F ], /*93*/
[ 0xA4739E20FD72BDC2, 0x6D6EE5A5C1A54CA6, 0x70A97A6FCB884E5C, 0x2B6108339E979C48, 0x93A63730D6BB23A7, 0x5B1DCEAB00045EE5 ], /*94*/
[ 0x427C14E4F88C8BDB, 0x1D8630868E039BC2, 0x33DB40A251502D1B, 0xE043C9CCB45D2B3D, 0x292B67B6EE077B2D, 0x1C3A2FBDE24C742A ], /*95*/
[ 0x3DED69F37016D86A, 0x9A947B13AC66D7C3, 0x822D8645DF4CB39C, 0x2BA20F98F19E10DA, 0x6703138D422AC4C4, 0x8D34D6138FA04A1D ], /*96*/
[ 0x28E59C8B257D112C, 0x8747068CC5499FCF, 0xD6C16EB780F9191A, 0xB416151633F7AF08, 0xA230E00D6BA1A1C3, 0xFD066FB9965B83D2 ], /*97*/
[ 0x70F4BC1B7F8FFC37, 0x38DC0331E56B0FDC, 0xA9AB7290AD2B0BBD, 0xB307973C3D0783C6, 0xBDC455F6CDCA111F, 0x23F0E08317B8F0DC ], /*98*/
[ 0x0AEEC24E9285C50F, 0x3BCDA47833B61ACE, 0x839986F959EE0723, 0xC959034A8D7F5EB9, 0xD4AD7E05B05C4FB5, 0x6C37A3D39F7A0EC4 ], /*99*/
[ 0x0227B7230FBF2D07, 0x28D7D2AD632BED47, 0x07BD8F8B5012EFD0, 0x48A0D43AE0403442, 0x9B8939207F1449A1, 0x351EAD01B9FDF219 ], /*9A*/
[ 0xA7119D2E311CEF25, 0x1E532CD0C4ED0479, 0x2272F878D8D30A0B, 0x769C412CED9C4C42, 0x262FFBFA65CBDDF5, 0xDB73D86721EA368E ], /*9B*/
[ 0x4BDBE90B3FBADCB2, 0x1324EC3A8D6FEA57, 0x6D9EFBE530850D00, 0x401A88AFF8A4C8F4, 0x655CB76B8A2E271C, 0x35505B6DBDE16F43 ], /*9C*/
[ 0x6E15E57E23F57037, 0x4962737362C1FA26, 0xC962372D1829B80B, 0xA1FE6832EA4D6211, 0x6726E307F96E7763, 0x04C761081677505B ], /*9D*/
[ 0x42E2FF3A8A6FC164, 0xFB85B2BC9D28B268, 0xC559CFF024533A28, 0x2EC83F3911DAB3CE, 0xAE0FC74A9D736A27, 0xDB9CDD048BAB4CCF ], /*9E*/
[ 0xD79C52221D20E765, 0x499EDD73903CE704, 0x9B016D987DF48349, 0xFCFAB44AD12FC5C1, 0x811293F3B800FDF9, 0x511DC619CA53CEBE ], /*9F*/
[ 0xA059EE78B826EDDF, 0x4673AF294D17C85A, 0x5E527D4E4DF282B5, 0xDB5B9A2693F95CE3, 0x6551D304FB54F296, 0xAB3EB70D65912FCC ], /*A0*/
[ 0x7D0C4F67B6C78135, 0x390CAEA7DE304D37, 0x49E19FABC8D494FE, 0x1A9E1B6437A04516, 0x886CC4BDAB6AF35A, 0x0529217344F502FE ], /*A1*/
[ 0x3CEDF34141B52CEE, 0x8133BA924753573F, 0xCB32BE22BC66025A, 0x0C480183DE403CB3, 0xBF5B84B427DFCF31, 0x7251428DB0232156 ], /*A2*/
[ 0x86FCE831C58E25CB, 0x5CC43FFE45CBFC75, 0x33877CC042F199BE, 0x1212FA7F0CC22E1C, 0x448EAB4B7D1F9823, 0xA7B1363A9FA7599E ], /*A3*/
[ 0x2D8C2FEDA0E5106D, 0x192E366838BBEB3F, 0x36226AA60ACEA0AF, 0xE7E1285DC1F3926A, 0x900371FA1883D9EC, 0xBAC33B1AF360EB66 ], /*A4*/
[ 0xD4A2A11612BDE0E3, 0x82AB0DA614CB4CB8, 0x189A4D50AC01F4C6, 0xE36A5DA1D9F6A647, 0xE43120D6B16B11B6, 0x7D395F4236E75378 ], /*A5*/
[ 0xC0C155CD47F3877F, 0x4B03BFE5C334CA71, 0x77710F1F4B844FF7, 0x3443BBAB720E8DC5, 0xF03F8868C5863406, 0x0FD60511C872EB50 ], /*A6*/
[ 0x8C253DAAB5286306, 0x9AA438F54A6196AC, 0x181D08C723A22C5E, 0x633C49C88E3910A1, 0xC9F54A67992675B0, 0x1FDD98ACBD38D976 ], /*A7*/
[ 0xA10893DA7575A9F7, 0x8F5F4A025AB2A018, 0xD80538F0336BFFC0, 0x0F9751D33889626F, 0x30383EB925BF911A, 0xE6149F68CE19CC60 ], /*A8*/
[ 0xB9081DBAC6BE0598, 0x785DD9BC69C71492, 0x8B035A0CA56E172B, 0x8946783500724888, 0xAF1E57C958650569, 0xE1DE4E944FF22261 ], /*A9*/
[ 0xEA5EDC4D2718C0D2, 0xCB1C5D4DA15A8AE4, 0xC6272382F8163015, 0x94A934E5057B54CE, 0x658E481A3D68D10D, 0xE8F24929E50A46A0 ], /*AA*/
[ 0x7DF146281AF482CD, 0x014B68E726407B06, 0x6CE564938C70DDBC, 0x36DAD2DE72A5DAA2, 0x6D573BF69C0B2980, 0x684DAB14B4AA0329 ], /*AB*/
[ 0x9C69DC064E738B5F, 0x83CC16BD5A1C36F5, 0xA99B365E6E141B12, 0x2748FA5AD0FACCE8, 0x26D073A047D99C49, 0xB005B182505B0C0C ], /*AC*/
[ 0x15B6A2A20ED0FD1C, 0x9333AF729BD65A25, 0x22CC333293BD2C1B, 0xD724D949B15E8BE1, 0x69D0DB0512B97117, 0x85ACA8980DD7653C ], /*AD*/
[ 0x230EC629D77BB3F2, 0x43115B991D297CB2, 0xA2F955792C53C76F, 0x48A76728EBE25BA7, 0x7CE662A405384400, 0xDDC06B7E6BF49D66 ], /*AE*/
[ 0x20DDB9BD7644410B, 0x056391B1FA2E8C06, 0xCA4EDE51CF167C00, 0x46602B550536F870, 0x5040672597C21FF4, 0x0AF8EC6E8AFB844B ], /*AF*/
[ 0x0023C5749251B883, 0x335A4F86D66B7E00, 0xAE353DED3EFACE8F, 0x3FC80526D67B35DE, 0x0D9078FBDA80BC53, 0x467900DFF3FE4C14 ], /*B0*/
[ 0x0F9CB2BE6A448113, 0xE38D541B6A9A5829, 0x673953DAF354FC0E, 0x3C818A277F8569E9, 0x8D16EA77DB122A3B, 0xE40A860318B6EA84 ], /*B1*/
[ 0x78CE11F42D7D5E50, 0x84F76DFF199C998D, 0x999B578E3AE935CB, 0xD9FD092C1BE63212, 0x31F33C63ACD316D8, 0x5AA08030B8D65C0C ], /*B2*/
[ 0x0098DBE19CA84FE9, 0xE2426617D1142137, 0x63C3C4166A78E21B, 0x74B145353E03B0E4, 0xF43C0824EAE508C4, 0x58C1E6622528602A ], /*B3*/
[ 0x9E27EBE6D1426A6F, 0x2A6A600A6B5FA342, 0x8FF7E2306BA90370, 0xDF83D91A683EDDDD, 0x29572442F0225388, 0xE9CC0F1B6437320A ], /*B4*/
[ 0x054DF380E896064E, 0xFAB81A4AA3AD88A4, 0xF87426486CCA156F, 0xBB1B3C8237472960, 0x7EC0B87CF73F960A, 0x5C57D7E6470F7808 ], /*B5*/
[ 0x5758E103AC614A1A, 0x766AEE86F81358DF, 0x203FBA51DC74396A, 0x78C93DF969C5721F, 0xE69E32E230196597, 0xE287C6CECD8AB95B ], /*B6*/
[ 0x2A06A7C10C0DCC97, 0x99D5298268A6745F, 0xF2D818BB774858B3, 0xD52A820D4F64D886, 0x2F808EF87A263981, 0xBB91206E6347C676 ], /*B7*/
[ 0x0847C6D71CE0C746, 0x86FD451B447C1E11, 0xC20623B0E2856FCC, 0x3ADDFA2D0398181E, 0x6736A0A06B336B46, 0xD1C70AEEB2B1257D ], /*B8*/
[ 0x5633260D141A9776, 0xD530805F596CA3DB, 0x8CE33EF69437CE46, 0xF62D54E97E747088, 0xDF5C9318489B45EA, 0xA4AAD29F0BA850CA ], /*B9*/
[ 0xBDBD7B16767F6D9F, 0xF7968427F1B7B6DD, 0x58C76599B35276EE, 0x286F4C7F6CADD791, 0x8188C0401742117B, 0xCEC4F1964266D163 ], /*BA*/
[ 0x97E4E8A6B5135B24, 0x8A8BD785E5297977, 0x4545C1A0975BC5BB, 0x13FAE3BD9F59E37D, 0xAFD5627C0E91DE2B, 0xA223AC778474E1A9 ], /*BB*/
[ 0xDE1BF1EAF86C6B3B, 0xA246A3ACD50035FE, 0x6F80179DD96A21CD, 0x3F8DB7CB17300D03, 0x497A798B5D94506C, 0xAD52DCC6F61AE841 ], /*BC*/
[ 0xF4A4E1D08E1F440B, 0x5E27633CD56422E0, 0x1465C14F1DB41420, 0x9A939043988D37C2, 0xCBE65CFA245DB368, 0x6340AEDE28DDA855 ], /*BD*/
[ 0x1F7AB65A3F892454, 0xD70AB4167EBEB5A1, 0x9B2631E824C2028D, 0xD5D97BDEE31519BC, 0xEA2DC77449E4058C, 0xEB204F2D6D2FBAFF ], /*BE*/
[ 0x6537E69171A2665D, 0x3FD2F835435A3F23, 0xADD5DD3E622D6C8A, 0xC522CDD5E5E243F8, 0x5AEC27F3DBFDA8A2, 0x477A65ED570E1445 ], /*BF*/
[ 0x3BA7CB01D32E9D63, 0x9E335734E7B5416B, 0x0ED96A84F94539F6, 0x45CEE2E46DF5A70D, 0xDE142EE1E9AFEC1C, 0x78D6121C4FDC72DD ], /*C0*/
[ 0x7BB30AF653390B77, 0x2D394F2B7F8F7BB6, 0x0277A3C213AF3489, 0x7DF6E674DD56D084, 0x5643CD3073C42451, 0xFAB15F8BD1A1DC18 ], /*C1*/
[ 0x42B453ABF5150D8B, 0x913F109C1188E18C, 0xC27BB7631FB43BF9, 0xEBDDE685EF108419, 0x76D67C87C56D33EA, 0x95EC73C0AF40F084 ], /*C2*/
[ 0xBCE43D59A1F50BFB, 0xBA7027CA04D84600, 0xFB6FDB98A2BE644B, 0xD5DE777E993DED4A, 0xFCA39F1EDF710F3A, 0xA5E5893C858D8841 ], /*C3*/
[ 0xC68AC776E6AEACFC, 0x538067C7866106EB, 0xD27B4A352F4EFDE3, 0x847DA2B3BF01E378, 0x3C79E3C136926D58, 0xF957BC8726AA1610 ], /*C4*/
[ 0x95492C4203C7C612, 0x0DD60DB1EE8321FC, 0xE1D9EBA902F62B42, 0xEA2DBF7D0E37A4F2, 0xE11FB9098BF5DA48, 0xDBFE213F818EA338 ], /*C5*/
[ 0x17CB21316D4756DD, 0xB88952498140146A, 0x648112F580844288, 0x4947ADC3F7D58F35, 0x651CCE28E26A5377, 0x0B3803DAF337F89B ], /*C6*/
[ 0xBEAB16E2DCE6B6E3, 0x8F39ECC8E39172DF, 0x607CC9553FF29C0E, 0x4BFD15154F4F0BA7, 0xEE6230B6BD408CE4, 0x35B654110D164E99 ], /*C7*/
[ 0xADDDFF1BD2C11CD4, 0x2A1A262CBA6E1AA0, 0x0BF2291D09475A46, 0x4C93A0ABADF4DE32, 0x73EE8E1327333E63, 0xF3AE2031F5D13B28 ], /*C8*/
[ 0x246C7CABB2D9A55C, 0x50E9C7282C1EE0F6, 0x2FBDA09565A0D3D7, 0x196552679C04A4EB, 0x137C66DA29A6DD82, 0x08A76B6B4BDA56BF ], /*C9*/
[ 0x7CA3C59BE3E28610, 0x6ADD75CF1F7AE248, 0x01747450737A6435, 0xA1F2259CB2B4923B, 0xE0C8F55E8ECE7210, 0xD7964398F350B69B ], /*CA*/
[ 0xE045864ED1825101, 0xAC54969193E1A1C5, 0x23D85A934D0794C7, 0xB4FA88CB734A4213, 0x7C5CBFD6BDA3D5F9, 0x66607FE938748825 ], /*CB*/
[ 0xBAF36FD2A180D481, 0xEAC440AC1B9598F7, 0x9AA24D80FFB7B06C, 0x79601F517358F163, 0xD1071831418BB63B, 0x819609A6AE7D3A03 ], /*CC*/
[ 0x3E9152D8CDBAE551, 0x86AD793F203DD016, 0xBE3AEB778AD4A891, 0x2810254DD76B6618, 0x9B5DCDE36636C327, 0x0A8AAD65868BC58C ], /*CD*/
[ 0x6D0672780D93152A, 0xEEE705247B828091, 0x9EBDB976F137463F, 0xA7DE3E73A2D0C1BF, 0xF871A00BA0046AC7, 0x484C96A803F23486 ], /*CE*/
[ 0x0FC7BCDABB06BFFB, 0xF75C3FFB3D6309B3, 0xECA305D103109162, 0x373F503B204FFF61, 0xCE332C9F54963FA2, 0x9A4420A52242CDB4 ], /*CF*/
[ 0xC71D481179D198C1, 0x505A2845CEE92569, 0xF339BFF6DD6755B5, 0x8BEAD52B8DE89245, 0x4B686E65920DCA2B, 0x99593FA43EE68A37 ], /*D0*/
[ 0xD90A68D717E61501, 0x9BB920AEA19161A6, 0x2F3D6F96D90EB1E4, 0xDF15ECBA10513D7D, 0xE6E5D539B4F01831, 0xC7D17A7528FECE36 ], /*D1*/
[ 0xA04FF0BEB4EBFBAF, 0xE5E90A5B3DDAA3CA, 0x8453542209F4A145, 0x80A6FFD72BB5A707, 0x14E0C4705A1ABF6A, 0xD699EC1FC18A677D ], /*D2*/
[ 0x7021A124E3181575, 0xDC7AAE2817AD945F, 0x8BB5521E7F0D565A, 0x6671D3792F0805EE, 0xD3888EA394413A1A, 0xCE4D7E47B55BF9CC ], /*D3*/
[ 0x22F440263CAADE68, 0xE77BB287772EAC7B, 0x29493775962A40E9, 0x1E06A27FA68CB91B, 0xDDEF02932ABDB9C7, 0x79F03B88DC175233 ], /*D4*/
[ 0x65F6D517B53E2391, 0x97DB65A2F00B1C39, 0x1D77AE9B85AA4855, 0x19133B9B3E9B0771, 0x6376D9F11A7DB3D4, 0x949AD02F5AE16184 ], /*D5*/
[ 0xFE4434CDE09D923B, 0x03B0FCFD713B7052, 0x2D713290D4A67238, 0x2B56946FF629EE96, 0x60A15D01B2B3C428, 0x0B1D5EAF793933A0 ], /*D6*/
[ 0xBC40FCFB0E0D494B, 0xA31C4648C7B3D1DE, 0xF1113C219A07EC8D, 0x2378BEB1A5C2BD1C, 0x190CC3478070A194, 0x63DAB6E1CCF56329 ], /*D7*/
[ 0x901B6B9E82BABF91, 0x872A234C45D61001, 0x6CA46A95C1CC6D6C, 0x22779315E0F02295, 0x60A59396346BE6AC, 0xFB67A503CB488846 ], /*D8*/
[ 0x50D440F74C97660B, 0xE71ECABF64EDFE0C, 0x80201B895718CE22, 0xA05D89804D35D306, 0x8F700402A2B0D086, 0x326FCB334CA4DFC0 ], /*D9*/
[ 0xBCFBD02EA005CDD5, 0xF0225A4675553115, 0x08E18B3692A7AF62, 0x05D34A820C8CED0A, 0x51A8D7CEC33E80EA, 0x0AC007503FAE879C ], /*DA*/
[ 0xF43EEFB5C83C521A, 0xE5E9B05FC48841AC, 0x79C52C38BF85B5F9, 0x26CD0818AE3BF7A9, 0x4F385C32CA8F5F74, 0xF17B22107B954752 ], /*DB*/
[ 0x1A48FC969198A4B0, 0xD9A78940BB0C4E1C, 0x42781D9BE60E7691, 0x87D1CAF3680F8A30, 0xD09FF193606AAF29, 0x4518DABC60048793 ], /*DC*/
[ 0xF05D48134A56A034, 0x89A65EEB91DC69B9, 0x8FC7F43960E63C62, 0xFA1C6B9FF9415E92, 0x7E219D4E56347935, 0x2B6A48D6DE0AEF85 ], /*DD*/
[ 0x1A7FF9C54B045FFD, 0x44A0A9562E9468B2, 0xF11425A22D1EBF92, 0x208D33120BD28E0E, 0xF2D74197AF80E162, 0xCEEDCA73DFE66C93 ], /*DE*/
[ 0xD57190439D29C9A4, 0x44C007DC2B5EAF9D, 0xEF6DDF48A780CEDC, 0x61B205E4A96024B1, 0x1885B6CE84C3FE5D, 0xB8B56986B6E2CE21 ], /*DF*/
[ 0xF36DACFA34237E99, 0xBE45EB5253BCFED0, 0x402C6946B8B21AC0, 0x2460A6FCE7E9CD67, 0xF89A6D5B162629FC, 0xF66CCEA374DB821E ], /*E0*/
[ 0x16E06074DCC31A1D, 0xF172017AC3FA38C3, 0xBBC1CE4BB784ED60, 0xDA89A8BCE82AE671, 0xA6DACFFB8D26C0BB, 0x185181AE9609F6D6 ], /*E1*/
[ 0xF110DBDD94D17661, 0xF59FBB4CBA69F393, 0x463B60FB3F3C5E00, 0x1C60B896FE8E78AC, 0x5EB3E26795DE5AB6, 0x997328D4654D6219 ], /*E2*/
[ 0x21069118ABE24B61, 0x811CB8C48FCEFC6A, 0x483B032CFB56F902, 0xFB32E848198CC057, 0xA620815462A04F70, 0x900038D1894959E2 ], /*E3*/
[ 0x5AD509789BFFECD0, 0xDDCD5E8325F69CA0, 0x154D8F1ACD9B8C82, 0xAC7DF75E94CE3CAF, 0x6D6554D1B38754BE, 0xB5DB64AF738486E7 ], /*E4*/
[ 0x35A308A1AC9A43BF, 0x2647805AB3E6E492, 0x4BB74A616F61588F, 0xFA4602EE5BDBF54E, 0x3FDD62470A7174DB, 0x5795433CA808FAAC ], /*E5*/
[ 0x51A094B8774CA605, 0x5F07974C74EEF225, 0x022AFEF7AD81A953, 0x0967C44BBA336FD6, 0x8AA327918AECBA3D, 0xF70B8436573C3F0A ], /*E6*/
[ 0xCF374F83420766C3, 0x71F31901A13EF07C, 0x63AD56C7DEF9DC0F, 0x9E5BB5E859F5A231, 0xD0BF453BB9893E4C, 0xA1E14B66C2719760 ], /*E7*/
[ 0xB41861CC73FD3E48, 0x461D79A138B04BE1, 0x4010D37D37FBA817, 0x7D9622AA693225A4, 0x2204454B8126799A, 0x33A5D487DCCD6EB6 ], /*E8*/
[ 0xD291D0317A053320, 0xE27678F1E50D1F76, 0x9A3D663A63159FC7, 0xAD7B4D3F67BAB452, 0x269CC05E2B33CE1C, 0x0FB8261CD734BCC3 ], /*E9*/
[ 0xF3D0546D3D4A25EE, 0xB42874AD28C9B7F2, 0x73EC788B29962D28, 0x4AE73A48132B8553, 0x756C99D7A0910B66, 0xECA7E2C2712D555C ], /*EA*/
[ 0x559FA5BF24911FDD, 0xA1DDF5DE3770554B, 0xC7C3FD139366B946, 0x6E7ECC0C881D2BA4, 0x14E76D6A27E54B87, 0x7352D5FBC4FAB878 ], /*EB*/
[ 0xF19A622BED8DAC0A, 0x35548E5D7EFC5A2E, 0xCAC84974B4F057B2, 0xAB317ED03D0335AE, 0x710FC138F2C51738, 0x9C90CC495A403416 ], /*EC*/
[ 0x9FA7DEB936F10461, 0xA1529B0B58462F9D, 0x9F109111C8B9EC65, 0x23A3EB28444E33EA, 0x554084CA75118937, 0x599D58A7C946EAC2 ], /*ED*/
[ 0x6EC3AABB7856AC4E, 0x980E6907C1CBCCAF, 0x1F8557ADC700CBF5, 0x7DCB1CE0AF48D9F4, 0x7FB3DADF8199AB8A, 0xE6B36DB8FADBF312 ], /*EE*/
[ 0xC00F0D3F7A101660, 0x605B94B12DB6C697, 0x79944F7BA2B65F38, 0x40858ADEDD47E2BC, 0x1E044BDB0E9FB02B, 0x86C79D01A3109539 ], /*EF*/
[ 0x9731893D5B98482A, 0xFB8DE267F9790326, 0x8780F407143A505D, 0xA41CAEFCCCD3A8E3, 0xA042F0B3D7B7A7FE, 0x3E3151FEBB19A1AC ], /*F0*/
[ 0xE7EDF679003A6950, 0xBAFC97D4A8C6AB12, 0x13C096B49C79559A, 0xC3052501434B5019, 0x1280FB23E7ADFB09, 0x1959905D31BD2FC0 ], /*F1*/
[ 0x575C0C46FCFCC65B, 0xFE625E873F34B419, 0x1696FDCC7F51B8A3, 0xC79C56F30E5AE7C0, 0x14E3461CD27FAD15, 0x1B7BCCB9CB472859 ], /*F2*/
[ 0x3806FE58E5CC8F16, 0xF8244ED76734C1BF, 0x4E04940E0F5DDB56, 0x5BD0AFDDC4158B7B, 0xA4C6BA949911C5C9, 0xFF6E2AC155AE9726 ], /*F3*/
[ 0x49C7C844B8114144, 0xB450E41BCA35CB00, 0x302450EC67BEF97C, 0xA8662049DB1E0D8B, 0xDA69C022528EB8FA, 0x6ABBF16585C1A2F7 ], /*F4*/
[ 0x37BB420DF67F044E, 0xDCC0E9F3E2EF07B3, 0x4D10088618777841, 0x0492E5379305DAAE, 0x3DA4791C37E4128F, 0x80688445CBA4EA17 ], /*F5*/
[ 0x51398A7CE4CF8D9D, 0x49A5FCD891A69CA5, 0x3D72A60EC2392DA5, 0x0E8296B879AB5539, 0x6BCB00AF2EDC0BDE, 0xBEB93848E54B3E90 ], /*F6*/
[ 0x7AD7C52A18922E19, 0x29292C57C4F5B8F5, 0xF0CF1F98A577C10B, 0x072B9F293BB660CD, 0x09B8604F5575B6FB, 0xDECB396A81B9FCDB ], /*F7*/
[ 0x254AD7ADB4C220DE, 0x6C62E20F95A0070D, 0xADEB89F339309BD8, 0xA2F685CC178B289F, 0x9343905B5DEE95A5, 0xE0C30F34A2977C86 ], /*F8*/
[ 0x669CD51AF7CFBFAA, 0xE3E0806F6880271D, 0x6934C259E098BF90, 0x5DFEEAF0FBCA7249, 0x89F74B948B4118B6, 0x53640AEAFB6807C3 ], /*F9*/
[ 0xDD3BACDCC04BE120, 0x6D4949BD64198E51, 0x31FDB39666598A74, 0xBBBC6DE9C0C15A81, 0xF27F201C61C06279, 0x2738AFE3E84E5CDD ], /*FA*/
[ 0xCDD71FD35A6411DE, 0x3CC012793E87523F, 0xB0CFF8720FCA36F3, 0x93E85FE07300F012, 0xE894A085263F090B, 0x2DF60A01DAFA90EC ], /*FB*/
[ 0x9DA50DB1EEB4FADD, 0xE524E49C9974799A, 0xDE09FFF26A24CBB9, 0xAF9D71E9F3ACE7CD, 0xEB62B1A62566EC9D, 0x06D02AB1217D3553 ], /*FC*/
[ 0xDD31E6391AE03522, 0x93ACD1065B35E915, 0xF4EB56CC03E79218, 0x0717815C850C97F1, 0xBF4F6A8AC0540A6F, 0xFCF8AE5DE9507FF0 ], /*FD*/
[ 0xAB45B413DC50B207, 0x40B417369551D8D5, 0xCA32286A108E7210, 0x03225E54D8D093AF, 0x4B6CA5591EA576E9, 0x4E12AB774DC4E062 ], /*FE*/
[ 0xD9F4F850DF6CB96C, 0x8ABAD81B1667335D, 0xCB4079CFE79C72E5, 0xE5542F763E316996, 0x303E4B79B9D397C4, 0xE46933038B945111 ], /*FF*/
[ 0x75B15CC53B0D2502, 0xDA1BCA6BA0524358, 0x9EDA977556C06B7E, 0x6C57727ECF0A1325, 0xDC613D5A78E5C3F8, 0xCE062D94A3B4945A ] /*ZZ*/
];
static NUHASH_RND: [[u64; NUHASH_WORDS]; ROUNDS] = [
[ 0x6A09E667F3BCC908, 0xB2FB1366EA957D3E, 0x3ADEC17512775099, 0xDA2F590B0667322A, 0x95F9060875714587, 0x5163FCDFB907B672 ], /*R1*/
[ 0x1EE950BC8738F694, 0xF0090E6C7BF44ED1, 0xA4405D0E855E3E9C, 0xA60B38C0237866F7, 0x956379222D108B14, 0x8C1578E45EF89C67 ], /*R2*/
[ 0x8DAB5147176FD3B9, 0x9654C68663E7909B, 0xEA5E241F06DCB05D, 0xD549411320819495, 0x0272956DB1FA1DFB, 0xE9A74059D7927C18 ], /*R3*/
[ 0x84C9B579AA516CA3, 0x719E6836DF046D8E, 0x0209B803FC646A5E, 0x6654BD3EF7B43D7F, 0xED437C7F9444260F, 0xBD40C483EF550385 ], /*R4*/
[ 0x83F97BBD45EFB866, 0x3107145D5FEBE765, 0xA49E94EC7F597105, 0xFBFC2E1FA763EF01, 0xF3599C82F2FE500B, 0x848CF0BD252AE046 ] /*R5*/
];
static NUHASH_SBX: [u8; BYTE_SIZE] = [
0x63, 0x7C, 0x77, 0x7B, 0xF2, 0x6B, 0x6F, 0xC5, 0x30, 0x01, 0x67, 0x2B, 0xFE, 0xD7, 0xAB, 0x76,
0xCA, 0x82, 0xC9, 0x7D, 0xFA, 0x59, 0x47, 0xF0, 0xAD, 0xD4, 0xA2, 0xAF, 0x9C, 0xA4, 0x72, 0xC0,
0xB7, 0xFD, 0x93, 0x26, 0x36, 0x3F, 0xF7, 0xCC, 0x34, 0xA5, 0xE5, 0xF1, 0x71, 0xD8, 0x31, 0x15,
0x04, 0xC7, 0x23, 0xC3, 0x18, 0x96, 0x05, 0x9A, 0x07, 0x12, 0x80, 0xE2, 0xEB, 0x27, 0xB2, 0x75,
0x09, 0x83, 0x2C, 0x1A, 0x1B, 0x6E, 0x5A, 0xA0, 0x52, 0x3B, 0xD6, 0xB3, 0x29, 0xE3, 0x2F, 0x84,
0x53, 0xD1, 0x00, 0xED, 0x20, 0xFC, 0xB1, 0x5B, 0x6A, 0xCB, 0xBE, 0x39, 0x4A, 0x4C, 0x58, 0xCF,
0xD0, 0xEF, 0xAA, 0xFB, 0x43, 0x4D, 0x33, 0x85, 0x45, 0xF9, 0x02, 0x7F, 0x50, 0x3C, 0x9F, 0xA8,
0x51, 0xA3, 0x40, 0x8F, 0x92, 0x9D, 0x38, 0xF5, 0xBC, 0xB6, 0xDA, 0x21, 0x10, 0xFF, 0xF3, 0xD2,
0xCD, 0x0C, 0x13, 0xEC, 0x5F, 0x97, 0x44, 0x17, 0xC4, 0xA7, 0x7E, 0x3D, 0x64, 0x5D, 0x19, 0x73,
0x60, 0x81, 0x4F, 0xDC, 0x22, 0x2A, 0x90, 0x88, 0x46, 0xEE, 0xB8, 0x14, 0xDE, 0x5E, 0x0B, 0xDB,
0xE0, 0x32, 0x3A, 0x0A, 0x49, 0x06, 0x24, 0x5C, 0xC2, 0xD3, 0xAC, 0x62, 0x91, 0x95, 0xE4, 0x79,
0xE7, 0xC8, 0x37, 0x6D, 0x8D, 0xD5, 0x4E, 0xA9, 0x6C, 0x56, 0xF4, 0xEA, 0x65, 0x7A, 0xAE, 0x08,
0xBA, 0x78, 0x25, 0x2E, 0x1C, 0xA6, 0xB4, 0xC6, 0xE8, 0xDD, 0x74, 0x1F, 0x4B, 0xBD, 0x8B, 0x8A,
0x70, 0x3E, 0xB5, 0x66, 0x48, 0x03, 0xF6, 0x0E, 0x61, 0x35, 0x57, 0xB9, 0x86, 0xC1, 0x1D, 0x9E,
0xE1, 0xF8, 0x98, 0x11, 0x69, 0xD9, 0x8E, 0x94, 0x9B, 0x1E, 0x87, 0xE9, 0xCE, 0x55, 0x28, 0xDF,
0x8C, 0xA1, 0x89, 0x0D, 0xBF, 0xE6, 0x42, 0x68, 0x41, 0x99, 0x2D, 0x0F, 0xB0, 0x54, 0xBB, 0x16
];
static NUHASH_FIN: [u8; BYTE_SIZE] = [
0xB4, 0x98, 0x0C, 0x84, 0x24, 0xF3, 0x27, 0x8F, 0xA6, 0x5E, 0xF0, 0x65, 0x86, 0xBC, 0x09, 0x92,
0x75, 0x21, 0xB9, 0x95, 0x66, 0x8A, 0x2F, 0x13, 0xB5, 0xB7, 0x6B, 0x33, 0x2A, 0xBF, 0xF7, 0x0F,
0x0A, 0xE7, 0x16, 0x30, 0x77, 0x61, 0x48, 0x90, 0xDF, 0xAF, 0x72, 0x79, 0xF6, 0xA5, 0x58, 0xD1,
0xF2, 0x40, 0x9F, 0x41, 0xE8, 0x03, 0xA1, 0x05, 0xC5, 0x35, 0xC7, 0x97, 0x54, 0x7B, 0xB3, 0xF5,
0xB8, 0xA8, 0xD8, 0x68, 0x51, 0xAD, 0xE3, 0xC2, 0x5D, 0xCF, 0xEA, 0x89, 0x37, 0xF1, 0x55, 0x60,
0xA4, 0x26, 0xAC, 0x32, 0x0E, 0xD2, 0x85, 0x6F, 0xC8, 0xDC, 0x36, 0x6D, 0xA3, 0x22, 0x5A, 0xC9,
0x5C, 0x91, 0x1B, 0x5B, 0xE9, 0x78, 0xD7, 0x44, 0xEB, 0x1A, 0xC0, 0xCA, 0x94, 0x53, 0xC4, 0x11,
0x12, 0xCC, 0xFF, 0x88, 0x0D, 0x4E, 0xB2, 0xB1, 0x4A, 0x3A, 0xE1, 0x2E, 0x0B, 0x4C, 0x5F, 0x06,
0x81, 0x31, 0xD9, 0x3D, 0xFD, 0x43, 0x67, 0x62, 0x00, 0x9C, 0x50, 0xCE, 0x6E, 0x15, 0x82, 0x29,
0x96, 0xDA, 0x87, 0xEF, 0x6C, 0xC1, 0x8B, 0x07, 0x8E, 0x17, 0xEC, 0x9A, 0xBA, 0x46, 0x04, 0x73,
0x39, 0xE4, 0x63, 0xBE, 0x64, 0x47, 0xE6, 0x3F, 0x25, 0x52, 0x59, 0xA7, 0x42, 0x38, 0x99, 0x01,
0xE5, 0x1D, 0x28, 0x7A, 0xB0, 0x7C, 0x9D, 0x56, 0xE2, 0xD6, 0xA0, 0xF4, 0x1E, 0xE0, 0xD3, 0x83,
0x6A, 0xBB, 0x18, 0x20, 0xAE, 0x57, 0xAA, 0x8D, 0x71, 0x1F, 0x34, 0x4D, 0x2D, 0x3C, 0x2B, 0xF8,
0x10, 0x7E, 0xCB, 0xFB, 0x49, 0xA2, 0x45, 0x7F, 0x3E, 0xBD, 0xC3, 0xFC, 0x14, 0x74, 0x23, 0x4F,
0x7D, 0x69, 0x93, 0x19, 0xD0, 0x1C, 0x08, 0xF9, 0xDD, 0xC6, 0x2C, 0x9E, 0xA9, 0x4B, 0xFE, 0xED,
0x76, 0xDB, 0xAB, 0xD4, 0x80, 0xCD, 0xB6, 0x8C, 0xDE, 0x70, 0x9B, 0xD5, 0xFA, 0xEE, 0x02, 0x3B
];
/* ------------------------------------------------------------------------ */
/* Mix functions */
/* ------------------------------------------------------------------------ */
fn mix_function1(mut key: u64) -> u64 {
key = (key ^ (key >> 31)).wrapping_mul(0x7FB5D329728EA185);
key = (key ^ (key >> 27)).wrapping_mul(0x81DADEF4BC2DD44D);
key ^ (key >> 33)
}
fn mix_function2(mut key: u64) -> u64 {
key = (key ^ (key >> 31)).wrapping_mul(0x99BCF6822B23CA35);
key = (key ^ (key >> 30)).wrapping_mul(0x14020A57ACCED8B7);
key ^ (key >> 33)
}
fn mix_function3(mut key: u64) -> u64 {
key = (key ^ (key >> 31)).wrapping_mul(0x69B0BC90BD9A8C49);
key = (key ^ (key >> 27)).wrapping_mul(0x3D5E661A2A77868D);
key ^ (key >> 30)
}
fn mix_function4(mut key: u64) -> u64 {
key = (key ^ (key >> 30)).wrapping_mul(0x16A6AC37883AF045);
key = (key ^ (key >> 26)).wrapping_mul(0xCC9C31A4274686A5);
key ^ (key >> 32)
}
fn mix_function5(mut key: u64) -> u64 {
key = (key ^ (key >> 30)).wrapping_mul(0xBF58476D1CE4E5B9);
key = (key ^ (key >> 27)).wrapping_mul(0x94D049BB133111EB);
key ^ (key >> 31)
}
fn mix_function6(mut key: u64) -> u64 {
key = (key ^ (key >> 30)).wrapping_mul(0x4BE98134A5976FD3);
key = (key ^ (key >> 29)).wrapping_mul(0x3BC0993A5AD19A13);
key ^ (key >> 31)
}
/* ------------------------------------------------------------------------ */
/* Substitution function */
/* ------------------------------------------------------------------------ */
fn substitute_bytes(buffer: &mut[u64; NUHASH_WORDS]) {
unsafe {
let temp: &mut[u8; NUHASH_BYTES] = transmute(buffer);
for i in 0..NUHASH_BYTES {
temp[i] = NUHASH_SBX[temp[i] as usize];
}
}
}
/* ------------------------------------------------------------------------ */
/* Update function */
/* ------------------------------------------------------------------------ */
fn update(ctx: &mut NuHash, index: usize) {
let row_addr: &[u64; NUHASH_WORDS] = &NUHASH_XOR[index];
for rnd in NUHASH_RND {
let ctx_hash_value_0: u64 = ctx.hash[0usize];
ctx.hash[0usize] = mix_function1(((ctx.hash[0usize] << 32) | (ctx.hash[1usize] >> 32)) ^ row_addr[0usize] ^ rnd[0usize]);
ctx.hash[1usize] = mix_function2(((ctx.hash[1usize] << 32) | (ctx.hash[2usize] >> 32)) ^ row_addr[1usize] ^ rnd[1usize]);
ctx.hash[2usize] = mix_function3(((ctx.hash[2usize] << 32) | (ctx.hash[3usize] >> 32)) ^ row_addr[2usize] ^ rnd[2usize]);
ctx.hash[3usize] = mix_function4(((ctx.hash[3usize] << 32) | (ctx.hash[4usize] >> 32)) ^ row_addr[3usize] ^ rnd[3usize]);
ctx.hash[4usize] = mix_function5(((ctx.hash[4usize] << 32) | (ctx.hash[5usize] >> 32)) ^ row_addr[4usize] ^ rnd[4usize]);
ctx.hash[5usize] = mix_function6(((ctx.hash[5usize] << 32) | (ctx_hash_value_0 >> 32)) ^ row_addr[5usize] ^ rnd[5usize]);
substitute_bytes(&mut ctx.hash);
}
}
/* ------------------------------------------------------------------------ */
/* Utilities */
/* ------------------------------------------------------------------------ */
fn store_words(hash: &[u64; NUHASH_WORDS]) -> [u8; NUHASH_BYTES] {
let mut buffer: [u8; NUHASH_BYTES] = [0; NUHASH_BYTES];
let mut offset = 0usize;
for word in hash {
buffer[offset..][..size_of::<u64>()].copy_from_slice(&word.to_be_bytes());
offset += size_of::<u64>();
}
buffer
}
fn check_state(ctx: &mut NuHash) {
if ctx.finished {
panic!("Computation is already finished!");
}
}
fn check_state_and_set(ctx: &mut NuHash, value: bool) {
check_state(ctx);
ctx.finished = value;
}
/* ------------------------------------------------------------------------ */
/* Default Trait */
/* ------------------------------------------------------------------------ */
impl Default for NuHash {
fn default() -> Self {
Self::new()
}
}
impl Drop for NuHash {
fn drop(&mut self) {
self.hash.fill(0u64);
}
}
/* ------------------------------------------------------------------------ */
/* Stream API */
/* ------------------------------------------------------------------------ */
impl NuHash {
/// Create a new [`NuHash`] instance. The returned instance is already initialized for a new hash computation.
pub fn new() -> Self {
Self {
hash: NUHASH_INI,
finished: false
}
}
/// Initialize or reset the state for a new hash computation.
///
/// This function must be called after [`do_final()`](#method.do_final), before more input data can be processed!
pub fn reset(&mut self) -> &mut Self {
self.finished = false;
self.hash.copy_from_slice(&NUHASH_INI);
self
}
/// Process the next chunk of input data and update the state.
///
/// This function is supposed to be called *repeatedly* until all the input data has been processed!
pub fn update(&mut self, src: &[u8]) -> &mut Self {
check_state(self);
for b in src {
update(self, *b as usize);
}
self
}
/// Finish the hash computation and return the resulting hash value (digest).
///
/// This function is supposed to be called exactly *once* after all the input data has been processed! After calling this function, the `NuHash` instance is **invalidated**; it must be [`reset()`](#method.reset) in order to start a new hash computation.
pub fn do_final(&mut self) -> [u8; NUHASH_BYTES]
{
check_state_and_set(self, true);
update(self, BYTE_SIZE);
for b in NUHASH_FIN {
update(self, b as usize);
}
store_words(&self.hash)
}
}
/* ------------------------------------------------------------------------ */
/* Simple API */
/* ------------------------------------------------------------------------ */
/// Compute the hash value from the given input data and return the resulting hash value (digest).
///
/// This is a convenience wrapper for [`NuHash`] which can be used in situations where *all* input data is available at once.
pub fn nuhash_compute(src: &[u8]) -> [u8; NUHASH_BYTES] {
NuHash::new().update(src).do_final()
}
/* ------------------------------------------------------------------------ */
/* Utilities */
/* ------------------------------------------------------------------------ */
static VERSION: Lazy<[u16; 3]> = Lazy::new(|| {
let mut iter = env!("CARGO_PKG_VERSION").split('.').map(|x| x.parse::<u16>().unwrap());
[ iter.next().unwrap(), iter.next().unwrap(), iter.next().unwrap() ]
});
/// Returns the version number of the current `nuhash_rs` library.
pub fn nuhash_version() -> &'static[u16; 3] {
&VERSION
}

View File

@ -0,0 +1,104 @@
/******************************************************************************/
/* NuHash, by LoRd_MuldeR <MuldeR2@GMX.de> */
/* This work has been released under the CC0 1.0 Universal license! */
/******************************************************************************/
use base64::{Engine, engine::general_purpose};
use ctor::ctor;
use easy_hex::Hex;
use nuhash_rs::{NuHash, nuhash_version};
/* ------------------------------------------------------------------------ */
/* Test wrapper */
/* ------------------------------------------------------------------------ */
fn run_test(iterations: u64, expected: &str, input: &[u8]) {
let mut nuhash: NuHash = NuHash::default();
for _counter in 0..iterations {
nuhash.update(input);
}
let digest = Hex::from(nuhash.do_final());
println!("{} - {}", digest, if expected.eq(&digest.to_string()) { "OK" } else { "Failed!" });
assert_eq!(&digest.to_string(), expected);
}
fn run_test_with_string(iterations: u64, expected: &str, input: &str) {
run_test(iterations, expected, input.as_bytes());
}
fn run_test_with_base64(iterations: u64, expected: &str, input: &str) {
run_test(iterations, expected, &general_purpose::STANDARD_NO_PAD.decode(input).unwrap()[..]);
}
/* ------------------------------------------------------------------------ */
/* Test cases */
/* ------------------------------------------------------------------------ */
#[ctor]
fn initialize() {
println!("NuHash version: {:?}", nuhash_version());
}
#[test]
fn testcase_1() {
run_test_with_string(
0x0000001,
"d7964fe1bec2b5ecf21ecc88c86ce4f1e89fb1ef3669d52e34eb049d7fd6c42d4b2bbeeeb70d12c3fcaf43dd2229abc9",
"");
}
#[test]
fn testcase_2() {
run_test_with_string(
0x0000001,
"b3f13f534034ae8d645d410e8828673761fe2d697218879f9ea528d976ba2e15a3f7485105e612b9a46cb3988635a70f",
"abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq");
}
#[test]
fn testcase_3() {
run_test_with_string(
0x0000001,
"63703476f4ffce4a8c758d0d3b91a857b9a2e3433ee864f931ba328fa7247b1b0ac9c2e0279243b83051aafac6a7e710",
"abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu");
}
#[test]
fn testcase_4() {
run_test_with_string(
0x00F4240,
"c6808aeb911c8837cee2e6867e589ab28526a8153494cf35a40c4bd6e20312da33cac4a390cd3b51a2eb4226e60b53e1",
"a");
}
#[test]
fn testcase_5() {
run_test_with_string(
0x1000000,
"bcca6bc8d113dd3fc171d743ac7ad2d3e63163ea7107d3c78517cf5b53ee0b2f4a0fe079e6a74df350c667b7cfe3cf09",
"abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmno");
}
#[test]
fn testcase_6() {
run_test_with_string(
0x1000000,
"56770e133b9eb4205f11824ad7280f5c31bc04dd333d1844b3589ab8b94ab95dc09b77be9a8128d7f155fa73de617597",
"g4tB,=[TU%/|8lv_c5Y?F9Sqs1PnV#bNO6DW\\0em~p<ifJhM(2&Qo}`!-*:jrZ{KGX]$zkuLd+)xwC^.\"@AIHR;y'a>3E7");
}
#[test]
fn testcase_7() {
run_test_with_base64(
0x1000000,
"9a8579bb88112b2f3285781a61348d7b04a5632fec12a73a7e0e367a556794a24a32ca7bb14da68eaed83e99c2f8f4c0",
"pCxVpbBe2DPzGPunIMc01x0tRo3Kiuf8aFtU2vnDdmKpPTm/F7eyjBCiH+N0akpsepLRUuqIumvWZJae5kxHQsVR8lD0e0/ph22USyPwRRqa5JEPO7RxgpnJSeW+KJOYKtlzZVjAg0iPAxRAGyQepj/3Z6s3Bqz2ZrbdHAo1n1YV7PErfFddAu2oYxZ13JtcfQ1f/QWgbpCVhdITYQijAcjThKoJ9XBv3rkEtdswvAeO/olgJk5ZyzaGEXLixq86i3/6QTjf7i8yoSdpMSlDxJx3IUS4edCtl+DhDhkuIr2A6LH4TT7CfgyzgRLMwVPPeM481Vq7nevvzf8LJa7U");
}
#[test]
fn testcase_8() {
run_test_with_base64(
0x1000000,
"fbf4444b0329f508bfc6cf44920b311a718e5f4c4c1af978e78223ec3579365ff5d15c16bb5a33d69cb36f3d40564757",
"tcib0bpmKRnSMO0mW8SRTRT3FjVaaf6ZpUnxlCu83EzdT8obiJyp9nMv/T9AORPas3H03n8CPWR4ehcKk9/rnwcEeYyYuCiArR/ylmu9Rdn6LFbO8IcjIurFJ9NjryTHtwbkdYN7vy6k7/USXWCVp1MRdLSgnuOuu1VyWaad1Yltj0oMHc0q++7Xw/MlYo6wssI4PGpvTjsI1IY2GFzgHoF3+GjbWFT/l35hwFHJbOWCvs8yQwE6XlBHoTTMDXCsxkSaPhAO7APibqr8fTcxS+a2wRWLBYWKZ/mrjeGiSBzLUmV2DxohqKNCQZCS0IQJLTNf2HyxuVfo1gsg50bp");
}

View File

@ -5,7 +5,7 @@ VisualStudioVersion = 17.6.33815.320
MinimumVisualStudioVersion = 10.0.40219.1 MinimumVisualStudioVersion = 10.0.40219.1
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "NuHash", "tool\nuhash.vcxproj", "{867A1634-C6AC-4089-B645-A1BE289D597B}" Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "NuHash", "tool\nuhash.vcxproj", "{867A1634-C6AC-4089-B645-A1BE289D597B}"
EndProject EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libnuhash", "libnuhash\libnuhash.vcxproj", "{8FA5C597-887D-46BC-A6C9-2183AEF7B793}" Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libnuhash", "libnuhash\c99\libnuhash.vcxproj", "{8FA5C597-887D-46BC-A6C9-2183AEF7B793}"
EndProject EndProject
Global Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution GlobalSection(SolutionConfigurationPlatforms) = preSolution

View File

@ -206,7 +206,7 @@
<SDLCheck>false</SDLCheck> <SDLCheck>false</SDLCheck>
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;_CRT_OBSOLETE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;_CRT_OBSOLETE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode> <ConformanceMode>true</ConformanceMode>
<AdditionalIncludeDirectories>$(SolutionDir)libnuhash\include</AdditionalIncludeDirectories> <AdditionalIncludeDirectories>$(SolutionDir)libnuhash\c99\include</AdditionalIncludeDirectories>
<DisableSpecificWarnings>4706;4996;6031</DisableSpecificWarnings> <DisableSpecificWarnings>4706;4996;6031</DisableSpecificWarnings>
<BufferSecurityCheck>false</BufferSecurityCheck> <BufferSecurityCheck>false</BufferSecurityCheck>
<TreatWarningAsError>true</TreatWarningAsError> <TreatWarningAsError>true</TreatWarningAsError>
@ -224,7 +224,7 @@
<SDLCheck>false</SDLCheck> <SDLCheck>false</SDLCheck>
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;_CRT_OBSOLETE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;_CRT_OBSOLETE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode> <ConformanceMode>true</ConformanceMode>
<AdditionalIncludeDirectories>$(SolutionDir)libnuhash\include</AdditionalIncludeDirectories> <AdditionalIncludeDirectories>$(SolutionDir)libnuhash\c99\include</AdditionalIncludeDirectories>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary> <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
<BufferSecurityCheck>false</BufferSecurityCheck> <BufferSecurityCheck>false</BufferSecurityCheck>
<Optimization>MaxSpeed</Optimization> <Optimization>MaxSpeed</Optimization>
@ -257,7 +257,7 @@
<SDLCheck>false</SDLCheck> <SDLCheck>false</SDLCheck>
<PreprocessorDefinitions>LIBNUHASH_DLL;WIN32;NDEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;_CRT_OBSOLETE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions>LIBNUHASH_DLL;WIN32;NDEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;_CRT_OBSOLETE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode> <ConformanceMode>true</ConformanceMode>
<AdditionalIncludeDirectories>$(SolutionDir)libnuhash\include</AdditionalIncludeDirectories> <AdditionalIncludeDirectories>$(SolutionDir)libnuhash\c99\include</AdditionalIncludeDirectories>
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary> <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
<BufferSecurityCheck>false</BufferSecurityCheck> <BufferSecurityCheck>false</BufferSecurityCheck>
<Optimization>MaxSpeed</Optimization> <Optimization>MaxSpeed</Optimization>
@ -288,7 +288,7 @@
<SDLCheck>false</SDLCheck> <SDLCheck>false</SDLCheck>
<PreprocessorDefinitions>_DEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;_CRT_OBSOLETE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions>_DEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;_CRT_OBSOLETE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode> <ConformanceMode>true</ConformanceMode>
<AdditionalIncludeDirectories>$(SolutionDir)libnuhash\include</AdditionalIncludeDirectories> <AdditionalIncludeDirectories>$(SolutionDir)libnuhash\c99\include</AdditionalIncludeDirectories>
<DisableSpecificWarnings>4706;4996;6031</DisableSpecificWarnings> <DisableSpecificWarnings>4706;4996;6031</DisableSpecificWarnings>
<BufferSecurityCheck>false</BufferSecurityCheck> <BufferSecurityCheck>false</BufferSecurityCheck>
<TreatWarningAsError>true</TreatWarningAsError> <TreatWarningAsError>true</TreatWarningAsError>
@ -304,7 +304,7 @@
<SDLCheck>false</SDLCheck> <SDLCheck>false</SDLCheck>
<PreprocessorDefinitions>_DEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;_CRT_OBSOLETE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions>_DEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;_CRT_OBSOLETE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode> <ConformanceMode>true</ConformanceMode>
<AdditionalIncludeDirectories>$(SolutionDir)libnuhash\include</AdditionalIncludeDirectories> <AdditionalIncludeDirectories>$(SolutionDir)libnuhash\c99\include</AdditionalIncludeDirectories>
<DisableSpecificWarnings>4706;4996;6031</DisableSpecificWarnings> <DisableSpecificWarnings>4706;4996;6031</DisableSpecificWarnings>
<TreatWarningAsError>true</TreatWarningAsError> <TreatWarningAsError>true</TreatWarningAsError>
</ClCompile> </ClCompile>
@ -321,7 +321,7 @@
<SDLCheck>false</SDLCheck> <SDLCheck>false</SDLCheck>
<PreprocessorDefinitions>NDEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;_CRT_OBSOLETE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions>NDEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;_CRT_OBSOLETE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode> <ConformanceMode>true</ConformanceMode>
<AdditionalIncludeDirectories>$(SolutionDir)libnuhash\include</AdditionalIncludeDirectories> <AdditionalIncludeDirectories>$(SolutionDir)libnuhash\c99\include</AdditionalIncludeDirectories>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary> <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
<BufferSecurityCheck>false</BufferSecurityCheck> <BufferSecurityCheck>false</BufferSecurityCheck>
<Optimization>MaxSpeed</Optimization> <Optimization>MaxSpeed</Optimization>
@ -353,7 +353,7 @@
<SDLCheck>false</SDLCheck> <SDLCheck>false</SDLCheck>
<PreprocessorDefinitions>LIBNUHASH_DLL;NDEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;_CRT_OBSOLETE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions>LIBNUHASH_DLL;NDEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;_CRT_OBSOLETE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode> <ConformanceMode>true</ConformanceMode>
<AdditionalIncludeDirectories>$(SolutionDir)libnuhash\include</AdditionalIncludeDirectories> <AdditionalIncludeDirectories>$(SolutionDir)libnuhash\c99\include</AdditionalIncludeDirectories>
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary> <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
<BufferSecurityCheck>false</BufferSecurityCheck> <BufferSecurityCheck>false</BufferSecurityCheck>
<Optimization>MaxSpeed</Optimization> <Optimization>MaxSpeed</Optimization>
@ -385,7 +385,7 @@
<SDLCheck>false</SDLCheck> <SDLCheck>false</SDLCheck>
<PreprocessorDefinitions>NDEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions>NDEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode> <ConformanceMode>true</ConformanceMode>
<AdditionalIncludeDirectories>$(SolutionDir)libnuhash\include</AdditionalIncludeDirectories> <AdditionalIncludeDirectories>$(SolutionDir)libnuhash\c99\include</AdditionalIncludeDirectories>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary> <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
<BufferSecurityCheck>false</BufferSecurityCheck> <BufferSecurityCheck>false</BufferSecurityCheck>
<Optimization>MaxSpeed</Optimization> <Optimization>MaxSpeed</Optimization>
@ -416,7 +416,7 @@
<SDLCheck>false</SDLCheck> <SDLCheck>false</SDLCheck>
<PreprocessorDefinitions>LIBNUHASH_DLL;NDEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions>LIBNUHASH_DLL;NDEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode> <ConformanceMode>true</ConformanceMode>
<AdditionalIncludeDirectories>$(SolutionDir)libnuhash\include</AdditionalIncludeDirectories> <AdditionalIncludeDirectories>$(SolutionDir)libnuhash\c99\include</AdditionalIncludeDirectories>
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary> <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
<BufferSecurityCheck>false</BufferSecurityCheck> <BufferSecurityCheck>false</BufferSecurityCheck>
<Optimization>MaxSpeed</Optimization> <Optimization>MaxSpeed</Optimization>
@ -443,11 +443,6 @@
<ClCompile Include="src\main.c" /> <ClCompile Include="src\main.c" />
<ClCompile Include="src\platform.c" /> <ClCompile Include="src\platform.c" />
</ItemGroup> </ItemGroup>
<ItemGroup>
<ProjectReference Include="..\libnuhash\libnuhash.vcxproj">
<Project>{8fa5c597-887d-46bc-a6c9-2183aef7b793}</Project>
</ProjectReference>
</ItemGroup>
<ItemGroup> <ItemGroup>
<ResourceCompile Include="res\version.rc"> <ResourceCompile Include="res\version.rc">
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">_M_X64;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">_M_X64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
@ -459,6 +454,15 @@
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">_M_IX86;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">_M_IX86;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">_M_IX86;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">_M_IX86;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release_DLL|Win32'">_M_IX86;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release_DLL|Win32'">_M_IX86;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)libnuhash\c99\src</AdditionalIncludeDirectories>
<AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)libnuhash\c99\src</AdditionalIncludeDirectories>
<AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release_DLL|Win32'">$(SolutionDir)libnuhash\c99\src</AdditionalIncludeDirectories>
<AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">$(SolutionDir)libnuhash\c99\src</AdditionalIncludeDirectories>
<AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">$(SolutionDir)libnuhash\c99\src</AdditionalIncludeDirectories>
<AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release_DLL|ARM64'">$(SolutionDir)libnuhash\c99\src</AdditionalIncludeDirectories>
<AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)libnuhash\c99\src</AdditionalIncludeDirectories>
<AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)libnuhash\c99\src</AdditionalIncludeDirectories>
<AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release_DLL|x64'">$(SolutionDir)libnuhash\c99\src</AdditionalIncludeDirectories>
</ResourceCompile> </ResourceCompile>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
@ -467,6 +471,11 @@
<ItemGroup> <ItemGroup>
<ClInclude Include="src\platform.h" /> <ClInclude Include="src\platform.h" />
</ItemGroup> </ItemGroup>
<ItemGroup>
<ProjectReference Include="..\libnuhash\c99\libnuhash.vcxproj">
<Project>{8fa5c597-887d-46bc-a6c9-2183aef7b793}</Project>
</ProjectReference>
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets"> <ImportGroup Label="ExtensionTargets">
</ImportGroup> </ImportGroup>

View File

@ -3,10 +3,10 @@
// Microsoft Visual C++ generated resource script. // Microsoft Visual C++ generated resource script.
// //
#define APSTUDIO_READONLY_SYMBOLS #define APSTUDIO_READONLY_SYMBOLS
#include "WinResrc.h" #include <WinResrc.h>
#undef APSTUDIO_READONLY_SYMBOLS #undef APSTUDIO_READONLY_SYMBOLS
#include "../../libnuhash/src/version.h" #include <nuhash_version.h>
#define MY_VERSION_NUMBER NUHASH_VERSION_MAJOR, NUHASH_VERSION_MINOR, NUHASH_VERSION_PATCH, 0 #define MY_VERSION_NUMBER NUHASH_VERSION_MAJOR, NUHASH_VERSION_MINOR, NUHASH_VERSION_PATCH, 0
#define ___MY_VERSION_STRING(X) #X #define ___MY_VERSION_STRING(X) #X