Skip to content

Instantly share code, notes, and snippets.

@0x1F9F1
Created June 22, 2022 13:15
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save 0x1F9F1/29b698befd17cd54dcf6517954d05b5e to your computer and use it in GitHub Desktop.
Save 0x1F9F1/29b698befd17cd54dcf6517954d05b5e to your computer and use it in GitHub Desktop.
Case Folding
#include <vector>
using u16 = uint16_t;
using u32 = uint32_t;
using usize = size_t;
// clang-format off
static const u16 casefold_mph_tab[] {
0x563,0x4B3,0x040,0x04C,0x4C2,0x36A,0x50F,0x2F8,0x09F,0x587,0x150,0x20A,0x4D0,0x34E,0x2D1,0x1E8,
0x5AD,0x0F2,0x133,0x3CF,0x567,0x179,0x423,0x5E3,0x33D,0x51B,0x577,0x2F6,0x2DD,0x33A,0x23E,0x52C,
0x443,0x530,0x403,0x1A1,0x47F,0x0EC,0x37B,0x138,0x05E,0x021,0x507,0x004,0x4B4,0x1C7,0x18B,0x323,
0x499,0x000,0x2A7,0x000,0x084,0x000,0x0BC,0x000,0x591,0x000,0x1ED,0x053,0x3A5,0x455,0x095,0x000,
0x37E,0x474,0x48D,0x520,0x45C,0x1FC,0x3DC,0x4BC,0x120,0x09F,0x3E8,0x41A,0x1B8,0x00B,0x125,0x2E1,
0x167,0x07C,0x595,0x3D6,0x30D,0x4BF,0x0B4,0x5BB,0x06D,0x1A1,0x0D0,0x4B3,0x430,0x5F9,0x202,0x567,
0x229,0x000,0x2EA,0x262,0x2A2,0x000,0x59E,0x159,0x0D3,0x5F2,0x154,0x2E0,0x52B,0x3ED,0x091,0x542,
0x092,0x000,0x175,0x000,0x02D,0x233,0x241,0x000,0x231,0x000,0x1D5,0x000,0x0A2,0x000,0x59A,0x28B,
0x1FC,0x18B,0x453,0x167,0x3FC,0x380,0x5FA,0x206,0x15F,0x5E5,0x0D7,0x229,0x4D4,0x45F,0x10F,0x084,
0x5C9,0x343,0x337,0x175,0x18F,0x411,0x1AB,0x4C7,0x338,0x255,0x0C5,0x2F8,0x14D,0x098,0x39C,0x28A,
0x520,0x33D,0x2FC,0x237,0x4BD,0x210,0x299,0x2DD,0x205,0x109,0x2BE,0x1BC,0x25D,0x0B3,0x4BC,0x3DA,
0x000,0x45C,0x143,0x41A,0x360,0x275,0x119,0x3DC,0x00B,0x5E5,0x474,0x5C9,0x053,0x1FA,0x412,0x244,
0x455,0x414,0x276,0x2FA,0x598,0x006,0x319,0x5CC,0x4A5,0x03E,0x5C5,0x2AC,0x374,0x4C7,0x15B,0x3AF,
0x0F9,0x26C,0x1D9,0x262,0x29C,0x222,0x5EE,0x000,0x206,0x3CF,0x34B,0x356,0x0EF,0x545,0x38D,0x3EF,
0x3A9,0x000,0x07A,0x000,0x0B5,0x000,0x549,0x000,0x569,0x000,0x2F7,0x097,0x57E,0x241,0x0AC,0x000,
0x50D,0x000,0x505,0x000,0x3A8,0x000,0x0FE,0x000,0x35A,0x000,0x181,0x000,0x176,0x000,0x0DB,0x000,
0x1FA,0x18F,0x577,0x15F,0x47F,0x167,0x02F,0x45C,0x563,0x444,0x2EA,0x258,0x595,0x153,0x193,0x24A,
0x0EF,0x23E,0x59E,0x131,0x12F,0x496,0x3AF,0x454,0x03E,0x233,0x36A,0x3EA,0x557,0x186,0x12E,0x5CC,
0x087,0x474,0x1D9,0x26C,0x4E1,0x17B,0x412,0x066,0x520,0x4C5,0x143,0x5D5,0x337,0x294,0x18F,0x056,
0x4A5,0x4DB,0x414,0x587,0x2AC,0x040,0x41D,0x3CB,0x06F,0x237,0x10F,0x5C5,0x5CC,0x1E8,0x4C7,0x3CC,
0x5E5,0x1E2,0x06D,0x300,0x15D,0x4CA,0x058,0x1E0,0x356,0x285,0x32F,0x49F,0x5EE,0x50A,0x5F2,0x119,
0x596,0x00B,0x428,0x347,0x3B8,0x528,0x5F3,0x000,0x401,0x2F8,0x396,0x551,0x1C4,0x3AA,0x314,0x2C8,
0x360,0x205,0x50F,0x4BC,0x422,0x040,0x4B5,0x2FA,0x319,0x3BA,0x2B0,0x369,0x37C,0x212,0x3A5,0x25F,
0x53A,0x04A,0x033,0x18F,0x0D0,0x0B3,0x0B4,0x2C1,0x379,0x276,0x048,0x458,0x587,0x1BC,0x1C7,0x46F,
0x4C2,0x109,0x474,0x2AC,0x0C5,0x499,0x053,0x1AB,0x45C,0x09F,0x39C,0x006,0x2D1,0x33D,0x5AD,0x133,
0x00B,0x423,0x2FC,0x25D,0x3E8,0x26C,0x455,0x23E,0x3DC,0x314,0x4EF,0x08B,0x2FA,0x167,0x591,0x2A2,
0x210,0x2DF,0x0D3,0x3F9,0x41A,0x5BC,0x48D,0x2B5,0x02E,0x092,0x262,0x358,0x5CF,0x1DD,0x31F,0x15F,
0x432,0x5A3,0x19F,0x0F2,0x23C,0x2BF,0x0ED,0x467,0x5BF,0x4F9,0x50D,0x47D,0x38B,0x5D5,0x5E7,0x214,
0x125,0x000,0x59A,0x4AD,0x4EE,0x4AF,0x26D,0x31B,0x231,0x2F7,0x022,0x398,0x105,0x068,0x000,0x1B3,
0x0FF,0x066,0x0A7,0x02A,0x000,0x5BB,0x1CD,0x1C9,0x19E,0x1AC,0x4FA,0x28B,0x0E6,0x000,0x3A3,0x000,
0x1B8,0x000,0x38D,0x2E8,0x542,0x000,0x278,0x1F1,0x3E4,0x172,0x313,0x0C3,0x209,0x000,0x0E7,0x000,
0x0F4,0x3ED,0x5A6,0x281,0x027,0x545,0x29E,0x4EB,0x120,0x3FE,0x1CC,0x4B4,0x257,0x559,0x43A,0x34E,
};
static const u32 casefold_table[] {
0x4000042B,0x400118B6,0x400004C5,0x40010C8E,0x400004B0,0x40010CA9,0x400000C5,0x4000018B,
0xC0000390,0x40416E50,0x40400190,0x4040004D,0x40410581,0x40402C29,0x40400551,0x404004B8,
0x404010B0,0x404118A9,0x4040A656,0x4041E900,0x80401F90,0x40601EB8,0x406010C5,0x40601CB8,
0x4060AB75,0x80601F8B,0x408024C9,0x408010B8,0x40801CB0,0x408104B6,0x40801EB0,0x4080AB76,
0x4080AB9B,0x40801F18,0x408024C5,0x408001CA,0x408003F4,0x40800429,0x408001F4,0x40802CB8,
0x40802C2B,0x40800474,0x40800506,0x408001D3,0x40802CB0,0x408003A8,0x40800106,0x408024B8,
0x40800372,0x80801FA8,0x40A00172,0x40A01E74,0x40A0AB89,0xC0A01FD3,0x40E1058F,0x40E10412,
0x80E01FF4,0x4100ABA9,0x410004C9,0x41000518,0x41010427,0x41001FCA,0x410000C9,0x41000118,
0x41001E28,0x41010C9C,0x41000202,0x410010BC,0x41000402,0x41000535,0x4100ABB6,0x410104B2,
0x41000403,0x41001F2F,0x4100A7B6,0x41016E4E,0x81001F86,0x41201EBC,0x41216E48,0x41210CB2,
0x41200386,0x4120023B,0x41200186,0x41210C88,0x4121040A,0x4120A7B3,0x41202CE2,0x412004BC,
0x4120A7D0,0x4120ABB3,0x41200428,0x412118B2,0x41200228,0x41200546,0x41201E02,0x412104CE,
0x41202C03,0x41202165,0x4120A784,0x4120A69A,0x41201EE2,0x412003D1,0x4121E901,0x412001D1,
0x41200542,0x412001CD,0x41200538,0x41210C83,0x41202C02,0x41200058,0x4120AB84,0x4121E91D,
0x41201F38,0x4120A68A,0x41202C28,0x41201E58,0x4120A7A2,0x4120A668,0x4120A65A,0x412024BC,
0x4120ABA2,0x41210C93,0x4121E90E,0x4120AB74,0x41200051,0x41210415,0x412004E2,0x41202CBC,
0x81201F89,0x41401E08,0x41400520,0x41410C94,0x41401C9D,0x4140ABA8,0x41400120,0x41410C81,
0x4140039B,0x4140A7A8,0x41410573,0x41401E3E,0x41401E70,0x81401FA9,0x4161E905,0x41601E6E,
0x4160FF38,0x416003A9,0x41616E45,0x416001A9,0x81601F9B,0x4180046E,0x41800470,0x4180023E,
0x4180AB72,0x4180FF27,0x41801E34,0x41800408,0x41800389,0x41800208,0x41800189,0x41800049,
0x4180AB90,0x4180A78B,0x41801E36,0x418010AD,0x418118AB,0x41810423,0x4180047C,0x41810C96,
0x418004EE,0x4180FF2F,0x41801E56,0x41801EE4,0x4180A790,0x4180AB8B,0x41810587,0x41801CAD,
0x41810CAB,0x418004E4,0x41801EEE,0x41802C08,0x41800056,0x41800176,0x4181E903,0x41800376,
0xC1801FD2,0x41C1057D,0x41C1E90D,0x41C02CEB,0x41C01E7C,0x41C02C6E,0x41C02C70,0x41C0FF35,
0x41C02C25,0x41C0049A,0x41C1057E,0x41C02CDC,0x41C00184,0x41C01EFE,0x41C1E914,0x41C1E91E,
0x41C0A738,0x41C01E8A,0x41C0A742,0x41C0A658,0x81C01FA2,0x41E01E68,0x41E01E5A,0x41E16E59,
0x41E0005A,0x41E00174,0x41E001A2,0x41E0048A,0x81E0FB06,0x42002CD0,0x42016E4C,0x42000468,
0x4201E913,0x42001C9A,0x82001F84,0x82201E9A,0x42401FEB,0x424104D2,0x42402C11,0x424004FE,
0x42401EF6,0x4240AB71,0x424118BD,0x4240AB7A,0x424003EE,0x424003DC,0x424001EE,0x42401ED0,
0x42400425,0x42402C9A,0x42400510,0x424004DC,0x4241040F,0x82401FB3,0x42600110,0x426000DC,
0x42610C80,0x42601EDC,0x82601FB6,0x428001B3,0x4280A786,0x828001F0,0x42A00411,0x42A003F0,
0x42A0AB86,0x42A000D0,0x42A004F6,0x42A02C8A,0x42A003D0,0x42A004D0,0x42A104BD,0x42A0A746,
0x42A0AB87,0x82A0FB00,0x42C104C5,0x42C16E58,0x42C104B0,0x42C01CB6,0x42C1E910,0x42C01EB6,
0x42C00181,0x42C010B6,0x42C0053A,0x42C0048E,0x42C10CB0,0x42C0A696,0x42C10590,0x42C104B8,
0x42C01F3A,0x42C01E8E,0x42C16E51,0x42C118B8,0x42C02C27,0x42C01CA9,0x82C01F81,0x42E0AB7D,
0x42E118B0,0x42E010A9,0x82E01FCC,0x4300A77D,0x4300054F,0x430004B6,0x4300A64C,0x43002C12,
0x43000048,0x430001F8,0x43000248,0x43002C8E,0x4300AB73,0x4300004E,0x4300FF22,0x4300024E,
0x4300A72E,0x4300A694,0x43000514,0x4300051E,0x83001F8F,0x43201E12,0x43200114,0x4320011E,
0x4320038F,0x43200212,0x4320018F,0x432013F8,0x4320ABB2,0x43202CB6,0x43210572,0x43200412,
0x4320A7B2,0x4320A7D8,0x432104C9,0x43201E4E,0x43200427,0x432024B6,0x43201E48,0x43201FF8,
0x83201FAF,0x43401E88,0x4340012A,0x43401C88,0x43410402,0x43401ECE,0x4340052A,0x434004B2,
0x43410403,0x4340049C,0x43401E6A,0x434118BC,0x43401F0D,0x4341057A,0x43401E0A,0x43410571,
0x4340046A,0x43401C9C,0x4340020A,0x434010B2,0x4340040A,0x43402C15,0x43410586,0x434104BC,
0x43400544,0x43402C72,0x4340A680,0x434000CE,0x43401F2A,0x43401EB2,0x434001AF,0x43401CB2,
0x4340A77E,0x43402C9C,0x4340212A,0x4340A75C,0x4340039D,0x43416E4D,0x4340019D,0x43400050,
0x43401EFC,0x43401C93,0x4340A7D6,0x43401E72,0x4340AB7E,0x43401FE9,0x4341E920,0x43402CB2,
0x4340FF2E,0x43400472,0x434004FC,0x43402C88,0x8340FB01,0x43602C67,0x4360ABAD,0x43602CCE,
0x83601F9D,0x43801E50,0x4380A7AD,0x43801C83,0x43802C0A,0x43800415,0x4380A722,0x438024CE,
0x83801FB2,0x43A01FD8,0x43A0A7C0,0x43A0A64E,0x43A0FF25,0x43A004FA,0x43A0A648,0x43A02C96,
0x43A10C8F,0x43A0022E,0x43A0052E,0x43A00494,0x43A01F0E,0x43A02C23,0x43A0012E,0x43A0042E,
0x43A01F2E,0x43A01E94,0x43A0010E,0x43A01C94,0x43A10C9D,0x43A01E2E,0x43A0050E,0x43A01C81,
0x43A0AB8F,0x43A01F1D,0x43A10589,0x43A10408,0x83A0FB05,0x43C003D8,0x43C001B2,0x43C01EFA,
0x43C01CAB,0x43C00059,0x43C0AB81,0x43C02C94,0xC3C0FB03,0x44000423,0x44001E4C,0x44002C2E,
0x4400A73A,0x4400A68E,0x44000187,0x440118AD,0x440010AB,0x440001D9,0x84000587,0x44200496,
0x442003CF,0x44210576,0x442001CF,0x44201FD9,0x84201F87,0x84401E96,0x44610575,0x44601C96,
0x4460004C,0x446001E0,0x4460024C,0x446003E0,0x4460FF2A,0x4460017D,0x44616E5A,0x44610CAD,
0x44610584,0x4460A650,0x84601FAD,0x4480042D,0x44802C0F,0x4480015C,0x4481E906,0x44801ED2,
0x448001D7,0x44810C9A,0x8480FB13,0x44A01E7A,0x44A0AB9D,0x44A001FA,0x44A003D6,0x44A003FA,
0x44A02C80,0x44A0047A,0x84A01FD6,0x44C01FFA,0x84C0FB14,0x44E10574,0xC4E01FD7,0x4521E918,
0x45200122,0x452000D2,0x45216E56,0x45210C8A,0x45200522,0x452004D2,0x452024BD,0x452013FA,
0x45201C80,0x45200147,0x45201E80,0x45200141,0x4520A72A,0x45200547,0x45201CBD,0x45200541,
0x45210425,0x4520013D,0x452010BD,0x45202C2D,0x4520040F,0x4520053D,0xC5201FE7,0x4560023A,
0x4560FF3A,0x45616E49,0x4560A66A,0x45601E3A,0x4560ABAF,0x45602CD2,0x45610411,0x45601F3D,
0x45600480,0x4560A688,0x4560A744,0x45600100,0x45600045,0x456104D0,0x45600245,0x45600500,
0x456010A5,0x456004A8,0x456004D8,0x4561E91B,0x4560A664,0x45602C60,0x456000D8,0x4560AB83,
0x456001EC,0x4560AB9F,0x456003EC,0x4560A734,0x45601CA5,0x45601F6D,0x4560040B,0x85601FA0,
0x45816E40,0x458001A0,0x45802C1E,0x458003A0,0x4580ABB5,0x458010A8,0x45801FEC,0x4580A76A,
0x45801ED8,0x45801CA8,0x45801C87,0x45801EA8,0x45801E5E,0x458104C6,0x4580ABA7,0x45802C75,
0x45801E1E,0x85801F97,0x45A000D5,0x85A01FB4,0x45C02161,0x45C118A1,0x45C02C0B,0x45C010A3,
0x45C01F39,0x45C02CA8,0x45C02CD8,0x45C01CA3,0x45C01F19,0x45C00460,0x45C01FC8,0x45C01E78,
0x45C001C8,0x45C10CA1,0x45C00539,0x45C0216D,0x45C10C98,0x45C00478,0x45C00139,0x45C01E60,
0x45C1058D,0x45C10418,0x45C0041E,0x45C10C92,0x45C0021E,0x45C00397,0x45C1041D,0x45C00197,
0x45C01F6F,0x45C01CAC,0x85C01F93,0x45E01EAC,0x45E013FC,0x45E00476,0x45E1E916,0x45E01F0B,
0x85E01FFC,0x46001C99,0x4601040D,0x86001E99,0x4620A662,0x462010AC,0x46202C63,0x46210C91,
0x4620A7C9,0x4620AB9C,0x462024C2,0x4620FF34,0x462010BF,0x46201F0F,0x462001FC,0x4620AB92,
0x46201CBF,0x462004AC,0x46202CC2,0x4620A792,0x46200193,0x4620A79C,0x46200393,0x46201E76,
0x462024BF,0x462003AA,0x462000D3,0x46216E54,0x462104B4,0x462010B5,0x462010C2,0x86201FE6,
0x46401EC2,0x46401CB5,0x4640AB77,0x4640FF2D,0x464000D1,0x46402CED,0x46410405,0x46400395,
0x464104CC,0x46402CAC,0x86401FC6,0x86601F95,0x4680ABA1,0x468000B5,0x468000C2,0x46800179,
0x468118B4,0x468001E6,0x4680AB8C,0x468003E6,0x46810578,0x86801FAA,0x46A0216F,0x46A10426,
0x46A00549,0x86A01FF6,0x46C01ED4,0x46C1E91A,0x86C00149,0x46E01CA6,0x46E16E4A,0x46E01EA6,
0x46E024CB,0x46E010A6,0x46E001DB,0x46E01F2D,0x46E10C85,0x46E02183,0x46E02C64,0x46E0A660,
0x46E10C9E,0x46E0216A,0x46E02CAA,0x46E0FF23,0x46E01FDB,0x46E0AB97,0x46E01C9F,0x46E0ABB4,
0x46E004D4,0x46E1058A,0x46E01F49,0x46E0A7B4,0x46E000D4,0x46E004A6,0x86E01FF3,0x470001F6,
0x47001EAA,0x4700039F,0x47001CAA,0x4700019F,0x4700A65E,0x47000232,0x47000464,0x47002C7F,
0x470004CB,0x47000534,0x87001FA7,0x472104CF,0x472000CB,0x47200134,0x472010AA,0x47201F6A,
0x47202CD4,0x4720016A,0x47216E46,0x87201F83,0x474001A7,0x47402CA6,0x474003A7,0x4740A7A0,
0x47416E53,0x47401E32,0x474004AA,0x4740ABA0,0x47401E64,0x87401F9F,0x476001B5,0x4760ABBF,
0x87601FA1,0x47801CA7,0x478118AF,0x47801E1C,0x478118B7,0x4780A7AA,0x47802C62,0x4780AB95,
0x4780FF39,0x4780ABAA,0x4780A7C6,0x47810413,0x47802C6B,0x478010A7,0x87801F8C,0x47A01E0E,
0x47A02CA2,0x47A0A779,0x47A0038C,0x47A0020E,0x47A02C07,0x47A0040E,0x47A10CAF,0x47A01F5F,
0x47A104B7,0x47A0041C,0x47A02C1B,0x47A02167,0x47A003A1,0x47A0AB79,0x47A024C3,0x47A0021C,
0x47A01CA2,0x47A0004F,0x47A01EA2,0x87A01F92,0x47C01C9B,0x87C01F9C,0x47E01E9B,0x47E01F59,
0x47E01FC9,0x47E01EEA,0x47E010C3,0x47E0010A,0x47E010A2,0x47E10594,0x47E00462,0x47E0050A,
0x47E10C84,0x47E02C1C,0x47E0041B,0x47E004EA,0x47E01E62,0x47E01F0A,0x47E0AB93,0xC7E01FE3,
0x482004A2,0x4820039C,0x482000C3,0x4820019C,0x48200407,0x48202C0E,0x482004C3,0x48200392,
0x88201FAE,0x48400143,0x4840A76E,0x4841E90A,0xC8401FC7,0x48800543,0x48801F68,0x48801EC6,
0x488118A5,0x48810CA8,0x48810C87,0x88801F99,0x48A01FEA,0x48A00054,0x48A1040B,0x48A02C2F,
0x48A003EA,0x48A02C18,0x48A001EA,0x48A01E54,0x48A02C98,0x48A0015E,0x48A02C1D,0x48A00399,
0x48A00168,0x48A000C6,0x48A001C7,0x48A02C92,0x48A10CA5,0x48A118A8,0x48A001AE,0x48A0A754,
0x48A0ABBC,0x48A01CA1,0x88A01F8D,0x48C01E18,0x48C01C98,0x48C10C8B,0x88C01E98,0x48E0042F,
0x48E01F2C,0x48E01E92,0x48E0054A,0x48E01C92,0x48E0A7BC,0x48E010A1,0x48E0014A,0x48E118A3,
0x48E01F4A,0x48E0A75A,0x48E0052C,0x48E00492,0x48E0FF37,0x48E02CC6,0x48E0012C,0x48E0AB8A,
0x48E02168,0x48E00418,0x48E1041E,0x48E10CA3,0x48E00498,0x48E024C6,0x48E0041D,0x48E00218,
0x48E104BF,0x48E02160,0x48E00553,0x48E0AB94,0x48E01EF8,0x48E118AC,0x48E02C05,0x88E01FAB,
0x4900216B,0x49001F48,0x4900040D,0x490000DA,0x49002CB4,0x490003FF,0x4900A64A,0x490004DA,
0x490024CC,0x49010CAC,0x4900ABA3,0x49000548,0x8900FB16,0x49201EDA,0x492000DB,0x49202C26,
0x49202CCC,0x49210C99,0x4920A684,0x492003AB,0x492118BF,0x4920216C,0x492004F8,0x49201C91,
0x49201E40,0x49200160,0x49202C0D,0x49201F6C,0x492004B4,0x49201E26,0x492104D3,0x49202CDA,
0x492104D1,0x49210595,0x49201ECC,0x4920011A,0x49216E5E,0x492118B5,0x49200405,0x4920051A,
0x492010B4,0x492104B5,0x492104C2,0x49210579,0x492000CC,0x49201F1A,0x49201F6B,0x4920AB98,
0x49200178,0x49200226,0x4920A646,0x4920A798,0x49201CB4,0x4920016C,0x49201EB4,0x49200426,
0x49201C9E,0x492118A6,0x89201E9E,0x89401F8A,0x4960216E,0x49602CE0,0x49610C9F,0x49601FCB,
0x4960A74A,0x496004DE,0x496001BC,0x496024CF,0x496001E2,0x496000DE,0x496003E2,0x49616E4F,
0x4960A72C,0x4960A692,0xC9601FE2,0x49A01EDE,0x89A01FBC,0x49C10CA6,0x49C0AB8D,0x49C0015A,
0x49C0049E,0x49C001CB,0x49C0A78D,0x49C02169,0x49C01C85,0x49C0018A,0x49C0A698,0x49C0038A,
0x49C003DE,0x49C02CDE,0x49C001DE,0x49C1E90F,0x49C0016E,0x49C01F69,0x49C118AA,0xC9C01F54,
0x4A0104CB,0x4A010583,0x4A000516,0x4A00A654,0x4A0004F4,0x4A0004E0,0x4A000116,0x4A0000CF,
0x4A002C9E,0x4A01E90B,0x4A010CAA,0x4A00A75E,0x4A00ABAE,0x4A001F5D,0x4A001EF4,0x4A001EE0,
0x4A00A7AE,0x4A000154,0x4A001F6E,0x4A001E3C,0x4A00A7C7,0x4A000554,0x4A00A768,0x4A00AB99,
0x4A001CB7,0x4A002C6D,0x4A001E46,0x8A001F98,0x4A210577,0x4A2118A7,0x4A201CAF,0x4A20A760,
0x4A20FF2C,0x4A20053F,0x4A2010AF,0x4A200413,0x4A2010B7,0x4A20013F,0x4A200537,0x4A2000D9,
0x4A202C84,0x4A210CA7,0x4A20AB78,0x4A201F3F,0x4A21058C,0x4A21040E,0x4A200053,0x4A21E911,
0x4A20A640,0x4A21041C,0x4A21E919,0x4A20A76C,0x4A200046,0x4A200198,0x4A200246,0x4A200398,
0x4A201C84,0x4A201FF9,0x4A201E84,0x4A202C13,0x4A2118A2,0x4A2001E8,0x8A201FA3,0x4A4003E8,
0x4A40004A,0x4A400194,0x4A40024A,0x4A400394,0x4A4001F1,0x4A4013F9,0x4A4003F1,0x8A4000DF,
0x4A610CA2,0x4A60A748,0x4A61041B,0x4A60ABAB,0x4A610C9B,0x4A601F1B,0x4A601E4A,0x8A601F94,
0x4A8024B7,0x4A810592,0x4A8003A3,0x4A801FE8,0x4A810407,0x4A8003F9,0x4A8104C3,0x4A80A7AB,
0x4A800158,0x4A800222,0x4A8010BE,0x4A802164,0x4A8010C1,0x8A801FA4,0x4AA01CB3,0x4AA00422,
0x4AA0A7C5,0x4AA16E5F,0x4AA010B3,0x4AA10406,0x4AA01EBE,0x4AA01C95,0x4AA01CBE,0x4AA02C16,
0x4AA004C1,0x4AA00532,0x4AA0A766,0x4AA00126,0x4AA000C1,0x4AA00132,0x4AA004BE,0x4AA00526,
0x4AA00536,0x4AA003A4,0x4AA0004B,0x4AA001A4,0x4AA00136,0x4AA01E22,0x4AA0FF24,0x4AA10419,
0x4AA00391,0x4AA00216,0x4AA00191,0x4AA00164,0x4AA0FF31,0x4AA1E91F,0x4AA0ABA6,0x4AA00416,
0x4AA1041F,0x4AA00152,0x4AA0A7A6,0x4AA0A642,0x4AA10CA0,0x4AA00552,0x4AA01E5C,0x4AA02C22,
0x4AA024C1,0xCAA003B0,0x4AE0AB85,0x4AE02126,0x4AE10421,0x4AE02132,0x4AE024BE,0xCAE01F52,
0x4B2118A0,0x4B2003FE,0x4B20FF29,0x4B2001FE,0x8B201F91,0x4B401E16,0x4B402CBE,0x4B410570,
0x4B401CB1,0x4B400220,0x4B401E44,0x8B401F88,0x4B60AB9A,0x4B6010C0,0x4B60A724,0x4B600420,
0x4B60A79A,0x4B60A7C4,0x8B601F96,0x4B801EC0,0x4B8010B1,0x4B801E82,0x4B816E43,0x4B801C82,
0x4B8024BA,0x4B8004C0,0x4B80ABB9,0x4B802C24,0x4B800196,0x4B8000C0,0x4B800396,0x4B80023D,
0x4B802CBA,0x4B80017B,0x4B80FF30,0x4B801F09,0x4B800044,0x4B801E20,0x4B800244,0x4B800388,
0x4B80A73E,0x4B801E24,0x4B801FBB,0x4B810414,0x4B8010BA,0x4B80A780,0x4B8001B7,0x4B810400,
0x4B801CBA,0x4B80AB80,0x4B801EBA,0x8B801F82,0x4BA0037F,0x8BA0FB15,0x4BC0017F,0x4BC02C20,
0x4BC004BA,0x4BC024C0,0x4BC0A68C,0x4BC1041A,0x4BC00041,0x4BC00182,0x4BC00241,0x4BC1E912,
0xCBC01FB7,0x4C002CC0,0x4C000504,0x4C000424,0x4C01E90C,0x4C000224,0x4C000104,0x4C002C82,
0x4C001F4B,0x4C0024C8,0x4C01057C,0x4C010409,0xCC00FB04,0x4C40A764,0x8C401F85,0x4C601E30,
0x4C60AB91,0x4C602CC8,0x4C61E908,0x4C60FF21,0x4C6001A6,0x4C600042,0x4C6003A6,0x4C60A752,
0x4C602CAE,0x4C602CA4,0x8C601FA6,0x4C801E42,0x4C802166,0x4C80A7B0,0x4C80A65C,0x4C816E5D,
0x4C802C2C,0x4C80ABB0,0x4C80054B,0x4C800230,0x4C8104C4,0x4C802163,0x4C81E902,0x4C802C01,
0x4C801CAE,0x4C801CA4,0x4C801EAE,0x4C801EA4,0x8C800130,0x4CA000C8,0x4CA0A758,0x4CA013FB,
0x4CA1058E,0x4CA10410,0x4CA01E2C,0x4CA01FFB,0x4CA010AE,0x4CA010A4,0x4CA001C5,0x8CA0FB17,
0x4CC0042C,0x4CC0ABA4,0x8CC01FC3,0x4CE0A732,0x4CE00166,0x4CE0A726,0x4CE0022C,0x4CE00401,
0x4CE004AE,0x4CE004A4,0x4CE0A736,0x4CE01EC8,0x4CE00047,0x4CE0A7A4,0x4CE1E91C,0x4CE00055,
0x4CE00204,0x4CE104CA,0x4CE0053E,0x4CE004CD,0x4CE0AB7F,0x4CE10C90,0x4CE00404,0x4CE000CD,
0x4CE104C7,0x4CE00345,0x4CE01E8C,0x4CE00145,0x4CE0ABB7,0x4CE104BB,0x4CE01E0C,0x4CE00545,
0x4CE0048C,0x4CE118BB,0x4CE0020C,0x4CE0A782,0x4CE0040C,0x4CE16E57,0x4CE0ABBB,0x4CE010CD,
0x4CE01F3E,0x8CE01E97,0x4D001F29,0x4D001C97,0x4D001E04,0x8D001F80,0x4D200531,0x4D20AB82,
0x4D200124,0x4D2104B9,0x4D20FF36,0x4D2024CD,0x4D200524,0x4D201FDA,0x4D201FB9,0x4D210417,
0x4D2003F7,0x4D210C89,0x4D2001F7,0x4D20FF32,0x4D20039A,0x4D20FF26,0x4D202C04,0x4D2001C4,
0x8D201F9A,0x8D401FC4,0x4D60A796,0x4D60AB7B,0xCD601FF7,0x4DA0A682,0x4DA10C86,0x4DA0AB88,
0x4DA02C8C,0x4DA003DA,0x4DA0A644,0x4DA16E52,0x4DA02C0C,0x4DA118B9,0x4DA0AB96,0x4DA0A77B,
0x4DA02C1F,0x4DA004F2,0x4DA118B3,0x4DA0042A,0x4DA0A7B1,0x4DA0022A,0x4DA0AB8E,0x4DA10422,
0x4DA0ABB1,0x4DA004F0,0x4DA118BE,0x4DA00406,0x4DA02CA0,0x4DA00206,0x4DA00162,0x4DA0054D,
0x4DA104C1,0x4DA01E06,0x4DA01FBA,0x4DA01EF0,0x4DA0ABB8,0x4DA01F4D,0x4DA104BE,0x4DA0ABA5,
0x4DA0A7B8,0x4DA01E2A,0x4DA16E41,0x4DA01EF2,0x4DA02C21,0x4DA10C95,0x4DA104B3,0x4DA00419,
0x4DA00043,0x4DA00128,0x4DA00243,0x4DA02C06,0x4DA004A0,0x4DA00528,0x4DA10591,0x4DA10416,
0x4DA0041F,0x4DA02CF2,0x4DA0FF2B,0x4DA02C2A,0x4DA0AB7C,0x4DA00555,0x4DA02162,0x4DA0046C,
0x4DA010A0,0x4DA0A750,0x4DA16E44,0x4DA0A652,0x4DA00421,0x4DA01E6C,0x4DA0A79E,0x4DA02C19,
0x4DA0A666,0x4DA00370,0x4DA0AB9E,0x4DA00170,0x4DA01CA0,0x4DA0A7C2,0x4DA01EA0,0x4DA01F28,
0x4DA0A7BE,0x4DA003E4,0x4DA0A740,0x4DA001E4,0x4DA118B1,0x4DA000DD,0x4DA003F5,0x4DA10420,
0x4DA01F1C,0x4DA0A74C,0x4DA013FD,0x4DA02C14,0x4DA0ABBE,0x4DA004E6,0x4DA01F5B,0x4DA02C00,
0x4DA10CB1,0x4DA104C0,0x4DA0051C,0x4DA10C8D,0x4DA0A756,0x4DA0A74E,0x4DA0011C,0x4DA01EE6,
0x4DA104B1,0x4DA10588,0x4DA003FD,0x4DA02C1A,0x4DA0A686,0x8DA01FE4,0x4DC16E5C,0x4DC10C82,
0x4DC01EEC,0x4DC00200,0x4DC00108,0x4DC00414,0x4DC0ABAC,0x4DC00214,0x4DC00508,0x4DC00400,
0x4DC0A7AC,0x4DC01E1A,0x4DC1057F,0x4DC0A73C,0x4DC118BA,0x4DC004E8,0x4DC02C6F,0x4DC0A690,
0x4DC104BA,0x4DC10582,0x4DC00502,0x4DC0041A,0x4DC16E4B,0x4DC0021A,0x4DC00102,0x4DC01EE8,
0x4DC0FF33,0x4DC01E14,0x4DC004EC,0x4DC10424,0x4DC01F08,0x4DC01E00,0x4DC0ABBD,0x4DC1E915,
0x4DC01E66,0x4DC02C10,0x4DC00533,0x4DC00409,0x4DC01E7E,0x8DC01FC2,0x4DE01EC4,0x4DE0A728,
0x4DE010C4,0x8DE01F50,0x4E001F0C,0x4E001E52,0x8E00FB02,0x4E20A66C,0x8E201F9E,0x4E401E38,
0x4E40050C,0x4E40AB70,0x4E40039E,0x4E400550,0x4E40010C,0x4E400052,0x4E41E904,0x4E400150,
0x4E4000C4,0x4E4003C2,0x4E400466,0x4E400512,0x4E410585,0x4E41E921,0x4E40047E,0x4E400112,
0x4E401FB8,0x4E4104C8,0x4E4001B1,0x8E401FA5,0x4E6118AE,0x4E6118A4,0x4E60ABBA,0x4E6001F2,
0x4E60A762,0x4E600410,0x4E60A7BA,0x4E602C09,0x4E60018E,0x4E61E909,0x4E60038E,0x4E600210,
0x4E610CAE,0x4E610CA4,0x8E601F8E,0x4E801E10,0x4E802CC4,0x4E81E907,0x4E802C7E,0x4E810401,
0x4E8003D5,0x8E801FF2,0x4EA001D5,0x4EA00057,0x4EA024C4,0x4EA1E917,0x4EA001B8,0x4EA003A5,
0x4EA0053B,0x4EA024B9,0x4EA02CD6,0x4EA104CD,0x4EA0013B,0x4EA000CA,0x4EA10404,0x4EA10580,
0x4EA004C7,0x4EA0053C,0x4EA01F2B,0x4EA10C97,0x4EA000C7,0x4EA00490,0x4EA001AC,0x4EA02C17,
0x8EA01FAC,0x4EC16E55,0x4EC16E47,0x4EC01F3C,0x4EC1040C,0x4EC01C90,0x4EC02C86,0x4EC01E90,
0x4EC10C8C,0x4EC010BB,0x4EC01F3B,0x4EC01ECA,0x4EC010C7,0x4EC16E5B,0x4EC02C69,0x4EC0FF28,
0x4EC00540,0x4EC024CA,0x4EC0A7F5,0x4EC16E42,0x4EC01E86,0x4EC02C90,0x4EC01C86,0x4EC00417,
0x4EC024C7,0x4EC02CCA,0x4EC004D6,0x4EC0054C,0xCEC01F56,0x4F0024BB,0x4F0000D6,0x4F00014C,
0x4F001ED6,0x4F001F4C,0x4F000156,0x4F00014E,0x4F00212B,0x4F0010B9,0x4F000556,0x4F00054E,
0x4F001FBE,0x4F001CB9,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,
0x0044B,0x118D6,0x004C6,0x10CCE,0x004B1,0x10CE9,0x000E5,0x0018C,
0x003B9,0x00308,0x00301,0x16E70,0x0025B,0x0006D,0x105A8,0x02C59,
0x00581,0x004B9,0x02D10,0x118C9,0x0A657,0x1E922,0x01F20,0x003B9,
0x01EB9,0x02D25,0x010F8,0x013A5,0x01F03,0x003B9,0x024E3,0x02D18,
0x010F0,0x104DE,0x01EB1,0x013A6,0x013CB,0x01F10,0x024DF,0x001CC,
0x003B8,0x00449,0x001F5,0x02CB9,0x02C5B,0x00475,0x00507,0x001D4,
0x02CB1,0x003C8,0x00107,0x024D2,0x00373,0x01F60,0x003B9,0x00173,
0x01E75,0x013B9,0x003B9,0x00308,0x00301,0x105B6,0x1043A,0x003CE,
0x003B9,0x013D9,0x004CA,0x00519,0x1044F,0x01F74,0x000E9,0x00119,
0x01E29,0x10CDC,0x00203,0x02D1C,0x00452,0x00565,0x013E6,0x104DA,
0x00453,0x01F27,0x0A7B7,0x16E6E,0x01F06,0x003B9,0x01EBD,0x16E68,
0x10CF2,0x003AC,0x0023C,0x00254,0x10CC8,0x10432,0x0AB53,0x02CE3,
0x004BD,0x0A7D1,0x013E3,0x00448,0x118D2,0x00229,0x00576,0x01E03,
0x104F6,0x02C33,0x02175,0x0A785,0x0A69B,0x01EE3,0x003B8,0x1E923,
0x001D2,0x00572,0x001CE,0x00568,0x10CC3,0x02C32,0x00078,0x013B4,
0x1E93F,0x01F30,0x0A68B,0x02C58,0x01E59,0x0A7A3,0x0A669,0x0A65B,
0x024D6,0x013D2,0x10CD3,0x1E930,0x013A4,0x00071,0x1043D,0x004E3,
0x02CBD,0x01F01,0x003B9,0x01E09,0x00521,0x10CD4,0x010DD,0x013D8,
0x00121,0x10CC1,0x003BB,0x0A7A9,0x1059A,0x01E3F,0x01E71,0x01F61,
0x003B9,0x1E927,0x01E6F,0x0FF58,0x003C9,0x16E65,0x00283,0x01F23,
0x003B9,0x0046F,0x00471,0x02C66,0x013A2,0x0FF47,0x01E35,0x00458,
0x003AE,0x00209,0x00256,0x00069,0x013C0,0x0A78C,0x01E37,0x02D0D,
0x118CB,0x1044B,0x0047D,0x10CD6,0x004EF,0x0FF4F,0x01E57,0x01EE5,
0x0A791,0x013BB,0x105AE,0x010ED,0x10CEB,0x004E5,0x01EEF,0x02C38,
0x00076,0x00177,0x1E925,0x00377,0x003B9,0x00308,0x00300,0x105A4,
0x1E92F,0x02CEC,0x01E7D,0x00271,0x00252,0x0FF55,0x02C55,0x0049B,
0x105A5,0x02CDD,0x00185,0x01EFF,0x1E936,0x1E940,0x0A739,0x01E8B,
0x0A743,0x0A659,0x01F62,0x003B9,0x01E69,0x01E5B,0x16E79,0x0007A,
0x00175,0x001A3,0x0048B,0x00073,0x00074,0x02CD1,0x16E6C,0x00469,
0x1E935,0x010DA,0x01F04,0x003B9,0x00061,0x002BE,0x01F7B,0x104FA,
0x02C41,0x004FF,0x01EF7,0x013A1,0x118DD,0x013AA,0x003EF,0x003DD,
0x001EF,0x01ED1,0x00445,0x02C9B,0x00511,0x004DD,0x10437,0x003B1,
0x003B9,0x00111,0x000FC,0x10CC0,0x01EDD,0x003B1,0x00342,0x001B4,
0x0A787,0x0006A,0x0030C,0x00431,0x003BA,0x013B6,0x000F0,0x004F7,
0x02C8B,0x003B2,0x004D1,0x104E5,0x0A747,0x013B7,0x00066,0x00066,
0x104ED,0x16E78,0x104D8,0x010F6,0x1E932,0x01EB7,0x00253,0x02D16,
0x0056A,0x0048F,0x10CF0,0x0A697,0x105B7,0x104E0,0x01F32,0x01E8F,
0x16E71,0x118D8,0x02C57,0x010E9,0x01F01,0x003B9,0x013AD,0x118D0,
0x02D09,0x003B7,0x003B9,0x01D79,0x0057F,0x004B7,0x0A64D,0x02C42,
0x00068,0x001F9,0x00249,0x02C8F,0x013A3,0x0006E,0x0FF42,0x0024F,
0x0A72F,0x0A695,0x00515,0x0051F,0x01F07,0x003B9,0x01E13,0x00115,
0x0011F,0x003CE,0x00213,0x00259,0x013F0,0x013E2,0x02CB7,0x10599,
0x00432,0x0029D,0x0A7D9,0x104F1,0x01E4F,0x00447,0x024D0,0x01E49,
0x01F78,0x01F67,0x003B9,0x01E89,0x0012B,0x0A64B,0x1042A,0x01ECF,
0x0052B,0x004B3,0x1042B,0x0049D,0x01E6B,0x118DC,0x01F05,0x105A1,
0x01E0B,0x10598,0x0046B,0x010DC,0x0020B,0x02D12,0x0045A,0x02C45,
0x105AD,0x104E4,0x00574,0x02C73,0x0A681,0x000EE,0x01F22,0x01EB3,
0x001B0,0x010F2,0x0A77F,0x02C9D,0x0006B,0x0A75D,0x003BD,0x16E6D,
0x00272,0x00070,0x01EFD,0x010D3,0x0A7D7,0x01E73,0x013AE,0x01FE1,
0x1E942,0x02CB3,0x0FF4E,0x00473,0x004FD,0x02C89,0x00066,0x00069,
0x02C68,0x013DD,0x02CCF,0x01F25,0x003B9,0x01E51,0x0026C,0x00441,
0x02C3A,0x00435,0x0A723,0x024E8,0x01F70,0x003B9,0x01FD0,0x0A7C1,
0x0A64F,0x0FF45,0x004FB,0x0A649,0x02C97,0x10CCF,0x0022F,0x0052F,
0x00495,0x01F06,0x02C53,0x0012F,0x0044E,0x01F26,0x01E95,0x0010F,
0x010D4,0x10CDD,0x01E2F,0x0050F,0x00434,0x013BF,0x01F15,0x105B0,
0x10430,0x00073,0x00074,0x003D9,0x0028B,0x01EFB,0x010EB,0x00079,
0x013B1,0x02C95,0x00066,0x00066,0x00069,0x00443,0x01E4D,0x02C5E,
0x0A73B,0x0A68F,0x00188,0x118CD,0x02D0B,0x001DA,0x00565,0x00582,
0x00497,0x003D7,0x1059D,0x001D0,0x01FD1,0x01F07,0x003B9,0x00068,
0x00331,0x1059C,0x010D6,0x0006C,0x001E1,0x0024D,0x003E1,0x0FF4A,
0x0017E,0x16E7A,0x10CED,0x105AB,0x0A651,0x01F65,0x003B9,0x0044D,
0x02C3F,0x0015D,0x1E928,0x01ED3,0x001D8,0x10CDA,0x00574,0x00576,
0x01E7B,0x013CD,0x001FB,0x003C0,0x003FB,0x02C81,0x0047B,0x003B9,
0x00342,0x01F7C,0x00574,0x00565,0x1059B,0x003B9,0x00308,0x00342,
0x1E93A,0x00123,0x000F2,0x16E76,0x10CCA,0x00523,0x004D3,0x024D7,
0x013F2,0x00432,0x00148,0x01E81,0x00142,0x0A72B,0x00577,0x010FD,
0x00571,0x1044D,0x0013E,0x02D1D,0x02C5D,0x0045F,0x0056D,0x003C5,
0x00308,0x00342,0x02C65,0x0FF5A,0x16E69,0x0A66B,0x01E3B,0x013DF,
0x02CD3,0x10439,0x01F35,0x00481,0x0A689,0x0A745,0x00101,0x00065,
0x104F8,0x0028C,0x00501,0x02D05,0x004A9,0x004D9,0x1E93D,0x0A665,
0x02C61,0x000F8,0x013B3,0x001ED,0x013CF,0x003ED,0x0A735,0x010E5,
0x01F65,0x0045B,0x01F60,0x003B9,0x16E60,0x001A1,0x02C4E,0x003C0,
0x013E5,0x02D08,0x01FE5,0x0A76B,0x01ED9,0x010E8,0x00463,0x01EA9,
0x01E5F,0x104EE,0x013D7,0x02C76,0x01E1F,0x01F27,0x003B9,0x000F5,
0x003AC,0x003B9,0x02171,0x118C1,0x02C3B,0x02D03,0x01F31,0x02CA9,
0x02CD9,0x010E3,0x01F11,0x00461,0x01F72,0x01E79,0x001C9,0x10CE1,
0x00569,0x0217D,0x10CD8,0x00479,0x0013A,0x01E61,0x105B4,0x10440,
0x0043E,0x10CD2,0x0021F,0x003B7,0x10445,0x00268,0x01F67,0x010EC,
0x01F23,0x003B9,0x01EAD,0x013F4,0x00477,0x1E938,0x01F03,0x003C9,
0x003B9,0x010D9,0x10435,0x00079,0x0030A,0x0A663,0x02D0C,0x01D7D,
0x10CD1,0x0A7CA,0x013CC,0x024DC,0x0FF54,0x02D1F,0x01F07,0x001FD,
0x013C2,0x010FF,0x004AD,0x02CC3,0x0A793,0x00260,0x0A79D,0x003B3,
0x01E77,0x024D9,0x003CA,0x000F3,0x16E74,0x104DC,0x02D15,0x02D22,
0x003C5,0x00342,0x01EC3,0x010F5,0x013A7,0x0FF4D,0x000F1,0x02CEE,
0x1042D,0x003B5,0x104F4,0x02CAD,0x003B7,0x00342,0x01F25,0x003B9,
0x013D1,0x003BC,0x000E2,0x0017A,0x118D4,0x001E7,0x013BC,0x003E7,
0x1059F,0x01F62,0x003B9,0x0217F,0x1044E,0x00579,0x003C9,0x00342,
0x01ED5,0x1E93C,0x002BC,0x0006E,0x010E6,0x16E6A,0x01EA7,0x024E5,
0x02D06,0x001DC,0x01F25,0x10CC5,0x02184,0x0027D,0x0A661,0x10CDE,
0x0217A,0x02CAB,0x0FF43,0x01F77,0x013C7,0x010DF,0x013E4,0x004D5,
0x105B1,0x01F41,0x0A7B5,0x000F4,0x004A7,0x003C9,0x003B9,0x00195,
0x01EAB,0x003BF,0x010EA,0x00275,0x0A65F,0x00233,0x00465,0x00240,
0x004CC,0x00564,0x01F67,0x003B9,0x104F7,0x000EB,0x00135,0x02D0A,
0x01F62,0x02CD5,0x0016B,0x16E66,0x01F03,0x003B9,0x001A8,0x02CA7,
0x003C7,0x0A7A1,0x16E73,0x01E33,0x004AB,0x013D0,0x01E65,0x01F27,
0x003B9,0x001B6,0x013EF,0x01F61,0x003B9,0x010E7,0x118CF,0x01E1D,
0x118D7,0x00266,0x0026B,0x013C5,0x0FF59,0x013DA,0x01D8E,0x1043B,
0x02C6C,0x02D07,0x01F04,0x003B9,0x01E0F,0x02CA3,0x0A77A,0x003CC,
0x0020F,0x02C37,0x0045E,0x10CEF,0x01F57,0x104DF,0x0043C,0x02C4B,
0x02177,0x003C1,0x013A9,0x024DD,0x0021D,0x010E2,0x0006F,0x01EA3,
0x01F22,0x003B9,0x010DB,0x01F24,0x003B9,0x01E61,0x01F51,0x01F73,
0x01EEB,0x02D23,0x0010B,0x02D02,0x105BB,0x00463,0x0050B,0x10CC4,
0x02C4C,0x0043B,0x004EB,0x01E63,0x01F02,0x013C3,0x003C5,0x00308,
0x00301,0x004A3,0x003BC,0x000E3,0x0026F,0x00457,0x02C3E,0x004C4,
0x003B2,0x01F66,0x003B9,0x00144,0x0A76F,0x1E92C,0x003B7,0x00342,
0x003B9,0x00573,0x01F60,0x01EC7,0x118C5,0x10CE8,0x10CC7,0x01F21,
0x003B9,0x01F7A,0x00074,0x10433,0x02C5F,0x003EB,0x02C48,0x001EB,
0x01E55,0x02C99,0x0015F,0x02C4D,0x003B9,0x00169,0x000E6,0x001C9,
0x02C93,0x10CE5,0x118C8,0x00288,0x0A755,0x013EC,0x010E1,0x01F05,
0x003B9,0x01E19,0x010D8,0x10CCB,0x00077,0x0030A,0x0044F,0x01F24,
0x01E93,0x0057A,0x010D2,0x0A7BD,0x02D01,0x0014B,0x118C3,0x01F42,
0x0A75B,0x0052D,0x00493,0x0FF57,0x02CC7,0x0012D,0x013BA,0x02178,
0x00438,0x10446,0x10CE3,0x00499,0x024E0,0x0043D,0x00219,0x104E7,
0x02170,0x00583,0x013C4,0x01EF9,0x118CC,0x02C35,0x01F63,0x003B9,
0x0217B,0x01F40,0x0045D,0x000FA,0x02CB5,0x0037D,0x0A64B,0x004DB,
0x024E6,0x10CEC,0x013D3,0x00578,0x0057E,0x00576,0x01EDB,0x000FB,
0x02C56,0x02CCD,0x10CD9,0x0A685,0x003CB,0x118DF,0x0217C,0x004F9,
0x010D1,0x01E41,0x00161,0x02C3D,0x01F64,0x004B5,0x01E27,0x104FB,
0x02CDB,0x104F9,0x105BC,0x01ECD,0x0011B,0x16E7E,0x118D5,0x00455,
0x0051B,0x02D14,0x104DD,0x104EA,0x105A0,0x000EC,0x01F12,0x01F63,
0x013C8,0x000FF,0x00227,0x0A647,0x0A799,0x010F4,0x0016D,0x01EB5,
0x00446,0x010DE,0x118C6,0x00073,0x00073,0x01F02,0x003B9,0x0217E,
0x02CE1,0x10CDF,0x01F75,0x0A74B,0x004DF,0x001BD,0x024E9,0x001E3,
0x000FE,0x003E3,0x16E6F,0x0A72D,0x0A693,0x003C5,0x00308,0x00300,
0x01EDF,0x003B1,0x003B9,0x10CE6,0x013BD,0x0015B,0x0049F,0x001CC,
0x00265,0x02179,0x00442,0x00257,0x0A699,0x003AF,0x003DF,0x02CDF,
0x001DF,0x1E931,0x0016F,0x01F61,0x118CA,0x003C5,0x00313,0x00301,
0x104F3,0x105AA,0x00517,0x0A655,0x004F5,0x004E1,0x00117,0x000EF,
0x02C9F,0x1E92D,0x10CEA,0x0A75F,0x013DE,0x01F55,0x01EF5,0x01EE1,
0x0026A,0x00155,0x01F66,0x01E3D,0x0A7C8,0x00584,0x0A769,0x013C9,
0x010F7,0x00251,0x01E47,0x01F20,0x003B9,0x1059E,0x118C7,0x010EF,
0x0A761,0x0FF4C,0x0056F,0x02D0F,0x00433,0x02D17,0x00140,0x00567,
0x000F9,0x02C85,0x10CE7,0x013A8,0x01F37,0x105B3,0x10436,0x00073,
0x1E933,0x0A641,0x10444,0x1E93B,0x0A76D,0x00066,0x00199,0x00247,
0x003B8,0x00442,0x01F79,0x01E85,0x02C43,0x118C2,0x001E9,0x01F63,
0x003B9,0x003E9,0x0006A,0x00263,0x0024B,0x003B4,0x001F3,0x013F1,
0x003C1,0x00073,0x00073,0x10CE2,0x0A749,0x10443,0x013DB,0x10CDB,
0x01F13,0x01E4B,0x01F24,0x003B9,0x024D1,0x105B9,0x003C3,0x01FE0,
0x1042F,0x003F2,0x104EB,0x0025C,0x00159,0x00223,0x02D1E,0x02174,
0x02D21,0x01F64,0x003B9,0x010F3,0x00442,0x00282,0x16E7F,0x02D13,
0x1042E,0x01EBF,0x010D5,0x010FE,0x02C46,0x004C2,0x00562,0x0A767,
0x00127,0x000E1,0x00133,0x004BF,0x00527,0x00566,0x003C4,0x0006B,
0x001A5,0x00137,0x01E23,0x0FF44,0x10441,0x003B1,0x00217,0x00192,
0x00165,0x0FF51,0x1E941,0x013D6,0x00436,0x10447,0x00153,0x0A7A7,
0x0A643,0x10CE0,0x00582,0x01E5D,0x02C52,0x024DB,0x003C5,0x00308,
0x00301,0x013B5,0x003C9,0x10449,0x0214E,0x024D8,0x003C5,0x00313,
0x00300,0x118C0,0x0037C,0x0FF49,0x001FF,0x01F21,0x003B9,0x01E17,
0x02CBF,0x10597,0x010F1,0x0019E,0x01E45,0x01F00,0x003B9,0x013CA,
0x02D20,0x0A725,0x00440,0x0A79B,0x0A794,0x01F26,0x003B9,0x01EC1,
0x02D11,0x01E83,0x16E63,0x0043E,0x024D4,0x004CF,0x013E9,0x02C54,
0x00269,0x000E0,0x003B6,0x0019A,0x02CBB,0x0017C,0x0FF50,0x01F01,
0x00064,0x01E21,0x00289,0x003AD,0x0A73F,0x01E25,0x01F71,0x1043C,
0x02D1A,0x0A781,0x00292,0x10428,0x010FA,0x013B0,0x01EBB,0x01F02,
0x003B9,0x003F3,0x00574,0x0056B,0x00073,0x02C50,0x004BB,0x024DA,
0x0A68D,0x10442,0x00061,0x00183,0x00242,0x1E934,0x003B1,0x00342,
0x003B9,0x02CC1,0x00505,0x00444,0x1E92E,0x00225,0x00105,0x02C83,
0x01F43,0x024E2,0x105A3,0x10431,0x00066,0x00066,0x0006C,0x0A765,
0x01F05,0x003B9,0x01E31,0x013C1,0x02CC9,0x1E92A,0x0FF41,0x00280,
0x00062,0x003C6,0x0A753,0x02CAF,0x02CA5,0x01F66,0x003B9,0x01E43,
0x02176,0x0029E,0x0A65D,0x16E7D,0x02C5C,0x013E0,0x0057B,0x00231,
0x104EC,0x02173,0x1E924,0x02C31,0x010EE,0x010E4,0x01EAF,0x01EA5,
0x00069,0x00307,0x000E8,0x0A759,0x013F3,0x105B5,0x10438,0x01E2D,
0x01F7D,0x02D0E,0x02D04,0x001C6,0x00574,0x0056D,0x0044C,0x013D4,
0x003B7,0x003B9,0x0A733,0x00167,0x0A727,0x0022D,0x00451,0x004AF,
0x004A5,0x0A737,0x01EC9,0x00067,0x0A7A5,0x1E93E,0x00075,0x00205,
0x104F2,0x0056E,0x004CE,0x013AF,0x10CD0,0x00454,0x000ED,0x104EF,
0x003B9,0x01E8D,0x00146,0x013E7,0x104E3,0x01E0D,0x00575,0x0048D,
0x118DB,0x0020D,0x0A783,0x0045C,0x16E77,0x013EB,0x02D2D,0x01F36,
0x00074,0x00308,0x01F21,0x010D7,0x01E05,0x01F00,0x003B9,0x00561,
0x013B2,0x00125,0x104E1,0x0FF56,0x024E7,0x00525,0x01F76,0x01FB1,
0x1043F,0x003F8,0x10CC9,0x001BF,0x0FF52,0x003BA,0x0FF46,0x02C34,
0x001C6,0x01F22,0x003B9,0x003AE,0x003B9,0x0A797,0x013AB,0x003C9,
0x00342,0x003B9,0x0A683,0x10CC6,0x013B8,0x02C8D,0x003DB,0x0A645,
0x16E72,0x02C3C,0x118D9,0x013C6,0x0A77C,0x02C4F,0x004F3,0x118D3,
0x0044A,0x00287,0x0022B,0x013BE,0x1044A,0x013E1,0x004F1,0x118DE,
0x00456,0x02CA1,0x00207,0x00163,0x0057D,0x104E9,0x01E07,0x01F70,
0x01EF1,0x013E8,0x01F45,0x104E6,0x013D5,0x0A7B9,0x01E2B,0x16E61,
0x01EF3,0x02C51,0x10CD5,0x104DB,0x00439,0x00063,0x00129,0x00180,
0x02C36,0x004A1,0x00529,0x105B8,0x1043E,0x0043F,0x02CF3,0x0FF4B,
0x02C5A,0x013AC,0x00585,0x02172,0x0046D,0x02D00,0x0A751,0x16E64,
0x0A653,0x00441,0x01E6D,0x0A79F,0x02C49,0x0A667,0x00371,0x013CE,
0x00171,0x010E0,0x0A7C3,0x01EA1,0x01F20,0x0A7BF,0x003E5,0x0A741,
0x001E5,0x118D1,0x000FD,0x003B5,0x10448,0x01F14,0x0A74D,0x013F5,
0x02C44,0x013EE,0x004E7,0x01F53,0x02C30,0x10CF1,0x104E8,0x0051D,
0x10CCD,0x0A757,0x0A74F,0x0011D,0x01EE7,0x104D9,0x105AF,0x0037B,
0x02C4A,0x0A687,0x003C1,0x00313,0x16E7C,0x10CC2,0x01EED,0x00201,
0x00109,0x00434,0x013DC,0x00215,0x00509,0x00450,0x00261,0x01E1B,
0x105A6,0x0A73D,0x118DA,0x004E9,0x00250,0x0A691,0x104E2,0x105A9,
0x00503,0x0043A,0x16E6B,0x0021B,0x00103,0x01EE9,0x0FF53,0x01E15,
0x004ED,0x1044C,0x01F00,0x01E01,0x013ED,0x1E937,0x01E67,0x02C40,
0x00563,0x00459,0x01E7F,0x01F74,0x003B9,0x01EC5,0x0A729,0x02D24,
0x003C5,0x00313,0x01F04,0x01E53,0x00066,0x0006C,0x0A66D,0x01F26,
0x003B9,0x01E39,0x0050D,0x013A0,0x003BE,0x00580,0x0010D,0x00072,
0x1E926,0x00151,0x000E4,0x003C3,0x00467,0x00513,0x105AC,0x1E943,
0x0047F,0x00113,0x01FB0,0x104F0,0x0028A,0x01F65,0x003B9,0x118CE,
0x118C4,0x013EA,0x001F3,0x0A763,0x00430,0x0A7BB,0x02C39,0x001DD,
0x1E92B,0x003CD,0x00211,0x10CEE,0x10CE4,0x01F06,0x003B9,0x01E11,
0x02CC5,0x1E929,0x0023F,0x10429,0x003C6,0x01F7C,0x003B9,0x001D6,
0x00077,0x024DE,0x1E939,0x001B9,0x003C5,0x0056B,0x024D3,0x02CD7,
0x104F5,0x0013C,0x000EA,0x1042C,0x105A7,0x004C8,0x0056C,0x01F23,
0x10CD7,0x000E7,0x00491,0x001AD,0x02C47,0x01F64,0x003B9,0x16E75,
0x16E67,0x01F34,0x10434,0x010D0,0x02C87,0x01E91,0x10CCC,0x02D1B,
0x01F33,0x01ECB,0x02D27,0x16E7B,0x02C6A,0x0FF48,0x00570,0x024E4,
0x0A7F6,0x16E62,0x01E87,0x02C91,0x0044A,0x00437,0x024E1,0x02CCB,
0x004D7,0x0057C,0x003C5,0x00313,0x00342,0x024D5,0x000F6,0x0014D,
0x01ED7,0x01F44,0x00157,0x0014F,0x000E5,0x02D19,0x00586,0x0057E,
0x003B9,0x010F9,
};
// clang-format on
usize casefold(u32 from, u32* to)
{
if (from < 128) {
to[0] = from - ((from >= 'A' && from <= 'Z') ? ('A' - 'a') : 0);
return 1;
}
const u32* table = &casefold_table[((from >> 8) & 0x1FF) ^ casefold_mph_tab[from & 0x1FF]];
u32 data = *table;
if (from != (data & 0x1FFFFF)) {
to[0] = from;
return 1;
}
table += 0x600 + ((data >> 21) & 0x1FF);
usize n = data >> 30;
switch (n) {
case 3:
to[2] = table[2];
case 2:
to[1] = table[1];
default:
to[0] = table[0];
}
return n;
}
int main()
{
u32 x = 0;
u32 i = 0;
do {
u32 codes[3];
usize n = casefold(i, codes);
if (n != 1 || i != codes[0]) {
std::printf("%04X;", i);
for (usize j = 0; j < n; ++j)
std::printf(" %04X", codes[j]);
std::printf("\n");
}
for (usize j = 0; j < n; ++j) {
x += codes[j];
}
} while (++i);
std::printf("%08X\n", x);
}
with open('CaseFolding-15.0.0d1.txt', 'r') as f:
lines = f.readlines()
all_codes = {}
codes = []
for line in lines:
line = line.strip()
if not line:
continue
if line.startswith('#'):
continue
parts = [ part.strip() for part in line.split(';') ]
assert len(parts) == 4
if parts[1] not in ['C', 'F']:
print('Skipped', parts)
continue
mapping = [ int(v, 16) for v in parts[2].split(' ') ]
assert len(mapping) > 0
assert len(mapping) < 4
code = int(parts[0], 16)
all_codes[code] = mapping
# for code, mapping in all_codes.items():
# print('{:06X} {}'.format(code, ' '.join('{:06X}'.format(v) for v in mapping)))
# exit()
with open('case_keys.txt', 'w') as f:
for code, mapping in all_codes.items():
f.write('{:08X}\n'.format(code))
print('Now calculate the perfect hash')
# exit()
# Generated using https://burtleburtle.net/bob/hash/perfect.html on case_keys.txt
mph_perf_tab = [1379,1203,64,76,1218,874,1295,760,159,1415,336,522,1232,846,721,488,
1453,242,307,975,1383,377,1059,1507,829,1307,1399,758,733,826,574,1324,
1091,1328,1027,417,1151,236,891,312,94,33,1287,4,1204,455,395,803,
1177,0,679,0,132,0,188,0,1425,0,493,83,933,1109,149,0,
894,1140,1165,1312,1116,508,988,1212,288,159,1000,1050,440,11,293,737,
359,124,1429,982,781,1215,180,1467,109,417,208,1203,1072,1529,514,1383,
553,0,746,610,674,0,1438,345,211,1522,340,736,1323,1005,145,1346,
146,0,373,0,45,563,577,0,561,0,469,0,162,0,1434,651,
508,395,1107,359,1020,896,1530,518,351,1509,215,553,1236,1119,271,132,
1481,835,823,373,399,1041,427,1223,824,597,197,760,333,152,924,650,
1312,829,764,567,1213,528,665,733,517,265,702,444,605,179,1212,986,
0,1116,323,1050,864,629,281,988,11,1509,1140,1481,83,506,1042,580,
1109,1044,630,762,1432,6,793,1484,1189,62,1477,684,884,1223,347,943,
249,620,473,610,668,546,1518,0,518,975,843,854,239,1349,909,1007,
937,0,122,0,181,0,1353,0,1385,0,759,151,1406,577,172,0,
1293,0,1285,0,936,0,254,0,858,0,385,0,374,0,219,0,
506,399,1399,351,1151,359,47,1116,1379,1092,746,600,1429,339,403,586,
239,574,1438,305,303,1174,943,1108,62,563,874,1002,1367,390,302,1484,
135,1140,473,620,1249,379,1042,102,1312,1221,323,1493,823,660,399,86,
1189,1243,1044,1415,684,64,1053,971,111,567,271,1477,1484,488,1223,972,
1509,482,109,768,349,1226,88,480,854,645,815,1183,1518,1290,1522,281,
1430,11,1064,839,952,1320,1523,0,1025,760,918,1361,452,938,788,712,
864,517,1295,1212,1058,64,1205,762,793,954,688,873,892,530,933,607,
1338,74,51,399,208,179,180,705,889,630,72,1112,1415,444,455,1135,
1218,265,1140,684,197,1177,83,427,1116,159,924,6,721,829,1453,307,
11,1059,764,605,1000,620,1109,574,988,788,1263,139,762,359,1425,674,
528,735,211,1017,1050,1468,1165,693,46,146,610,856,1487,477,799,351,
1074,1443,415,242,572,703,237,1127,1471,1273,1293,1149,907,1493,1511,532,
293,0,1434,1197,1262,1199,621,795,561,759,34,920,261,104,0,435,
255,102,167,42,0,1467,461,457,414,428,1274,651,230,0,931,0,
440,0,909,744,1346,0,632,497,996,370,787,195,521,0,231,0,
244,1005,1446,641,39,1349,670,1259,288,1022,460,1204,599,1369,1082,846]
def mph_perf_s(val):
return ((val >> 8) & 0x1FF) ^ mph_perf_tab[val & 0x1FF]
# Largest output of mph_perf_s + 1
table_size = (max(mph_perf_tab) | 0x1FF) + 1
sorted_mappings = [ (mph_perf_s(code), code, mapping) for code, mapping in all_codes.items() ]
sorted_mappings.sort()
mappings = []
tab_deltas = []
for tab_index, code, mapping in sorted_mappings:
map_index = len(mappings)
mappings.extend(mapping)
map_delta = map_index - tab_index
assert map_delta < 0x200 # 9 bits available for delta
tab_deltas.append((tab_index, code, map_delta, mapping))
output_table = [0]*table_size
output_table.extend(mappings)
for tab_index, code, delta, mapping in tab_deltas:
assert output_table[tab_index] == 0
output_table[tab_index] = code | (delta << 21) | (len(mapping) << 30)
assert output_table[mph_perf_s(0)] & 0x1FFFFF != 0
print(len(output_table))
for code, mapping in all_codes.items():
tab_index = mph_perf_s(code)
tab_data = output_table[tab_index]
tab_code = tab_data & 0x1FFFFF
assert code == tab_code
tab_offset = (tab_data >> 21) & 0x1FF
tab_count = (tab_data >> 30)
assert tab_count == len(mapping)
tab_mappings = output_table[tab_index+table_size+tab_offset:]
tab_mappings = tab_mappings[0:tab_count]
assert tab_mappings == mapping
output = 'static const u16 casefold_mph_tab[] {'
for i, v in enumerate(mph_perf_tab):
if not(i%16):
output += '\n\t'
output += '0x{:03X},'.format(v)
output += '\n};\n\n'
output += 'static const u32 casefold_table[] {'
for i, v in enumerate(output_table):
if (i == table_size):
output += '\n'
if not(i%8):
output += '\n\t'
output += ('0x{:08X},' if (i < table_size) else '0x{:05X},').format(v)
output += '\n};\n\n'
print(output)
print(hex(table_size))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment