1.実行
#@title 1.実行
!pip install qrcode[pil]
import os
if not os.path.exists("/content/unifont-16.0.03.ttf"):
!wget https://github.com/multitheftauto/unifont/releases/download/v16.0.03/unifont-16.0.03.ttf
!git clone https://github.com/chocomint024/ndrf_dataset2
from PIL import Image, ImageDraw, ImageFont
import qrcode
import subprocess
import io
import json
import base64
import ipywidgets as widgets
from IPython.display import display, clear_output, HTML, Javascript
from google.colab import output
code="""
#include <array>
#include <iostream>
#include <utility>
#include <vector>
#include <string>
#include <filesystem>
#include <fstream>
#include <sstream>
#include <unordered_map>
#include <cstring>
#include <random>
#include <algorithm>
#include <openssl/evp.h>
#include <cstdio>
const std::vector<uint32_t> HeadIdList{
0x8000004d,0x80000017,0x80000036,0x80000002,0x80000007,0x80000048,0x8000001f,0x80000047,
0x8000003d,0x80000009,0x8000000c,0x8000000b,0x80000042,0x80000018,0x80000020,0x8000003a,
0x80000003,0x80000005,0x80000045,0x80000004,0x80000038,0x80000008,0x80000034,0x80000021,
0x8000000a,0x8000003e,0x8000001e,0x80000033,0x80000022,0x80000014,0x8000002c,0x8000000d,
0x8000000e,0x8000004c,0x8000002d,0x80000011,0x8000004f,0x80000027,0x80000023,0x80000024,
0x80000001,0x80000049,0x80000006,0x8000002e,0x8000002f,0x80000016,0x80000025,0x80000026,
0x80000031,0x80000035,0x80000040,0x8000000f,0x8000001b,0x80000041,0x80000015,0x80000028,
0x80000010
};
const std::vector<uint32_t> HeadIdMap = [] {
std::vector<uint32_t> v(0x100, 0);
for (uint32_t i = 0; i < HeadIdList.size(); ++i) {
v[HeadIdList[i] & 0xff] = i;
}
return v;
}();
const std::vector<std::vector<uint32_t> > LotHead{
{0x8000004d, 0x80000017, 0x80000036, 0x80000002, 0x80000048, 0x8000001f}
};
const std::vector<uint32_t> LotHeadLen{6};
const std::vector<std::vector<uint32_t> > HeadFusionData{
{0x8000004d,0x80000009,0x80000047,0x8000000c,0x8000004f,0x80000017,0x80000026,100,75,30},
{0x80000017,0x80000049,0x80000042,0x80000034,0x80000021,0x8000004d,0x80000026,100,40,30},
{0x80000036,0x80000020,0x8000004c,0x8000003e,0x00000000,0x8000003d,0x80000023,100,30,25},
{0x80000002,0x80000014,0x8000002c,0x00000000,0x00000000,0x8000004d,0x80000007,100,30,50},
{0x80000007,0x8000001e,0x00000000,0x00000000,0x00000000,0x80000034,0x80000016,100,20,25},
{0x80000048,0x80000006,0x80000031,0x80000011,0x00000000,0x8000004d,0x8000001f,100,30,75},
{0x8000001f,0x80000042,0x80000034,0x80000021,0x00000000,0x00000000,0x00000000,100,50,0},
{0x8000004d,0x80000033,0x80000025,0x8000003d,0x80000001,0x00000000,0x00000000,95,67,0},
{0x8000004d,0x8000000b,0x80000033,0x80000025,0x80000001,0x80000001,0x8000000b,80,30,75},
{0x8000004d,0x80000003,0x8000002e,0x80000035,0x80000045,0x80000003,0x80000041,95,50,30},
{0x8000004d,0x80000033,0x80000025,0x00000000,0x00000000,0x00000000,0x00000000,95,67,0},
{0x80000017,0x80000005,0x8000001b,0x00000000,0x00000000,0x00000000,0x00000000,90,15,0},
{0x8000004d,0x80000004,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,95,2,0},
{0x80000002,0x80000021,0x80000020,0x80000014,0x00000000,0x8000000c,0x80000038,80,50,2},
{0x80000036,0x80000023,0x8000004c,0x8000003e,0x00000000,0x00000000,0x00000000,80,75,0},
{0x80000014,0x8000000d,0x00000000,0x00000000,0x00000000,0x80000038,0x80000027,5,10,10},
{0x8000004d,0x8000000e,0x8000002f,0x80000022,0x00000000,0x80000018,0x80000041,80,30,30},
{0x8000000e,0x80000027,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,10,10,0},
{0x8000004d,0x8000000e,0x8000002f,0x80000022,0x00000000,0x00000000,0x00000000,80,50,0},
{0x80000034,0x80000040,0x00000000,0x00000000,0x00000000,0x80000026,0x80000038,10,15,33},
{0x80000026,0x00000000,0x00000000,0x00000000,0x00000000,0x80000014,0x8000003a,10,0,33},
{0x80000036,0x8000002c,0x80000018,0x00000000,0x00000000,0x00000000,0x00000000,95,50,0},
{0x80000048,0x00000000,0x00000000,0x00000000,0x00000000,0x80000021,0x80000004,95,0,10},
{0x80000034,0x80000004,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,80,5,0},
{0x80000036,0x80000008,0x80000047,0x00000000,0x00000000,0x00000000,0x00000000,95,50,0},
{0x80000036,0x80000023,0x8000001b,0x00000000,0x00000000,0x8000004c,0x80000023,80,25,40},
{0x80000009,0x8000000e,0x8000002f,0x80000022,0x00000000,0x8000000e,0x80000005,80,15,10},
{0x8000000c,0x8000000b,0x8000003d,0x80000025,0x80000001,0x80000001,0x8000000b,80,30,75},
{0x8000002e,0x80000005,0x8000000e,0x8000002f,0x00000000,0x80000026,0x80000038,50,10,30},
{0x80000002,0x8000003a,0x00000000,0x00000000,0x00000000,0x8000002d,0x8000003a,80,5,20},
{0x80000002,0x80000014,0x00000000,0x00000000,0x00000000,0x80000026,0x80000038,80,50,30},
{0x8000004d,0x8000004d,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,10,100,0},
{0x8000001e,0x80000005,0x80000022,0x8000002f,0x00000000,0x00000000,0x00000000,50,10,0},
{0x80000036,0x80000023,0x80000020,0x8000003e,0x00000000,0x00000000,0x00000000,80,75,0},
{0x8000003e,0x80000015,0x00000000,0x00000000,0x00000000,0x80000014,0x8000003a,50,20,30},
{0x80000048,0x80000006,0x80000031,0x8000002d,0x00000000,0x00000000,0x00000000,80,33,0},
{0x8000004d,0x8000003d,0x80000033,0x80000025,0x80000001,0x80000001,0x8000000b,90,50,75},
{0x8000004d,0x80000027,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,5,30,0},
{0x80000020,0x8000002d,0x8000004c,0x8000003e,0x80000020,0x80000049,0x80000040,5,30,15},
{0x8000004d,0x80000024,0x80000041,0x00000000,0x00000000,0x00000000,0x00000000,5,30,0},
{0x80000033,0x8000000b,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,80,33,0},
{0x80000042,0x80000034,0x80000042,0x80000021,0x00000000,0x80000005,0x80000024,80,50,20},
{0x80000048,0x80000011,0x80000031,0x00000000,0x00000000,0x80000031,0x8000002d,80,67,20},
{0x80000003,0x8000002f,0x8000000e,0x80000022,0x00000000,0x00000000,0x00000000,80,25,0},
{0x8000002e,0x80000005,0x80000022,0x8000000e,0x00000000,0x8000000e,0x80000010,50,10,10},
{0x80000007,0x8000000d,0x80000016,0x00000000,0x00000000,0x00000000,0x00000000,50,10,0},
{0x8000000c,0x80000033,0x80000001,0x00000000,0x00000000,0x80000033,0x80000023,80,67,33},
{0x80000017,0x80000038,0x00000000,0x00000000,0x00000000,0x80000034,0x8000001b,80,10,30},
{0x80000048,0x80000023,0x80000006,0x00000000,0x00000000,0x80000006,0x8000002d,80,33,20},
{0x80000045,0x8000000e,0x8000002f,0x80000022,0x00000000,0x00000000,0x00000000,80,33,0},
{0x8000001e,0x80000038,0x80000022,0x00000000,0x00000000,0x8000000f,0x80000010,5,33,10},
{0x80000048,0x80000011,0x8000001b,0x00000000,0x00000000,0x80000015,0x80000028,10,33,15},
{0x80000026,0x8000000f,0x00000000,0x00000000,0x00000000,0x80000022,0x80000004,50,33,30},
{0x80000003,0x8000003a,0x00000000,0x00000000,0x00000000,0x80000015,0x80000024,50,25,15},
{0x80000048,0x80000023,0x80000031,0x00000000,0x00000000,0x8000000f,0x80000028,10,33,15},
{0x8000003e,0x8000000f,0x8000002d,0x8000003e,0x00000000,0x00000000,0x00000000,5,33,0},
{0x80000045,0x80000004,0x8000002f,0x00000000,0x00000000,0x00000000,0x00000000,5,33,0}
};
const std::vector<std::string> HeadStringList{
"まる","よこまる","たてまる","さんかく","おにぎり","しかく","かどまる","しずく",
"つぼ","こぐま","あまつゆ","チューリップ","ロボ","イカ","ロケット","スター",
"くま","ハート","ねこみみ","デビル","みかづき","とんがり","でんち","トゲトゲ",
"たまご","タワー","いぬみみ","メラメラ","クワガタ","ダイヤ","ルビー","たいよう",
"うさみみ","まきがい","キャッスル","ブロック","たまねぎ","わっか","コック","おさかな",
"スポーティ","キャンディ","でこ","ピエロ","おだんご","おんがくか","りゅうせい","まめ",
"ぼこ","ひつじ","ヒレ","シルクハット","おかっぱ","かえる","しょくパン","てんしゅ",
"はね","真プリミティブ系","準プリミティブ系","丸形変系R1","丸形変系R2","丸形変系R3","丸形変系R4","丸形飾り具象系",
"丸角張り系","三角角張り系","四角変系","縦丸変系","耳ツノ系","たいよう"
};
const std::vector<std::vector<uint32_t> > LotFaceType{
{0, 1, 2, 3, 4, 5, 6, 7, 8, 40, 41, 64, 65},
{0, 1, 2, 3, 6, 40, 41, 64},
{0, 1, 2, 3, 4, 5, 6, 7, 8, 41, 42, 65, 66},
{0, 2, 3, 4, 7, 8, 41, 64},
{0, 3, 64},
{0, 2, 3, 4, 5, 6, 7, 8, 40, 41, 42, 65, 66},
{0, 1, 2, 3, 4, 5, 6, 7, 8, 40, 41, 42, 64, 65, 66},
{0, 1, 2, 3, 6, 41},
{0, 1, 2, 3, 4, 5, 6, 7, 8, 40, 41, 42, 64, 65, 66},
{9, 10, 13, 14, 16, 18, 23, 24, 26, 27, 29, 31, 32, 34, 35, 36, 37, 38, 39, 43, 44, 45, 49, 50, 51, 52, 53, 54, 55, 56, 58, 60, 61, 62, 67, 68, 69, 71, 78, 79, 80, 81, 83, 84, 85, 86, 87, 88, 89, 90, 91},
{9, 14, 16, 26, 27, 29, 31, 32, 34, 35, 37, 38, 39, 44, 46, 49, 50, 52, 53, 54, 55, 56, 58, 59, 60, 61, 62, 63, 69, 71, 75, 78, 80, 81, 82, 83, 84, 85, 86, 87, 88, 91, 93},
{9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 31, 32, 33, 35, 36, 37, 38, 39, 43, 45, 46, 47, 48, 49, 50, 52, 53, 54, 55, 56, 58, 61, 62, 63, 67, 68, 69, 70, 71, 76, 78, 79, 81, 84, 85, 87, 88, 89, 90, 91, 93, 94},
{9, 10, 16, 18, 24, 25, 28, 30, 31, 32, 33, 35, 37, 38, 39, 44, 47, 48, 49, 50, 51, 53, 54, 57, 58, 59, 60, 63, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 79, 80, 81, 82, 83, 87, 94},
{9, 16, 28, 30, 31, 33, 35, 38, 44, 47, 48, 53, 54, 57, 58, 70, 71, 72, 73, 74, 76, 77, 80, 82, 83},
{9, 10, 11, 13, 14, 15, 16, 17, 18, 21, 22, 24, 25, 26, 28, 29, 30, 31, 32, 33, 34, 35, 37, 38, 39, 43, 45, 46, 47, 48, 49, 50, 51, 53, 54, 57, 59, 60, 62, 63, 68, 69, 70, 72, 73, 74, 75, 76, 77, 79, 80, 84, 85, 86, 87, 88, 90, 91, 93},
{9, 10, 14, 16, 18, 24, 26, 27, 29, 31, 32, 33, 35, 37, 38, 39, 43, 44, 45, 47, 48, 49, 50, 51, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 68, 69, 71, 75, 76, 77, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 91, 94},
{9, 14, 16, 26, 27, 31, 35, 37, 38, 44, 46, 47, 48, 49, 50, 51, 53, 54, 55, 56, 57, 58, 59, 60, 61, 63, 69, 75, 79, 80, 82, 83, 85, 86, 88, 93, 94},
{9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 20, 21, 22, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 43, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 62, 63, 67, 68, 70, 71, 72, 73, 74, 75, 76, 77, 78, 80, 81, 84, 85, 88, 89, 90, 91}
};
const std::vector<uint32_t> LotFaceTypeLen{13, 8, 13, 8, 3, 13, 15, 6, 15, 51, 43, 63, 45, 25, 59, 53, 37, 66};
const std::vector<uint32_t> FaceData{
0, 1, 2, 3, 4, 5, 6, 7, 8, 0, 0, 4, 0, 7, 6, 1, 0, 2, 0, 7, 2, 7, 4, 1, 3, 1, 5, 3, 0, 8, 8, 0, 0, 0, 0, 0, 1, 0, 0, 3, 9, 10, 11, 1, 0, 10, 3, 0, 4, 3, 0, 9, 6, 0, 10, 0, 9, 0, 0, 9, 3, 6, 0, 9, 12, 13, 14, 12, 12, 12, 12, 15, 15, 12, 12, 15, 12, 15, 12, 13, 13, 15, 15, 15, 0, 0, 12, 0, 12, 0, 0, 12, 15, 3, 4
};
const std::vector<uint32_t> HairData{
0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 0, 0, 0, 32, 33, 34, 35, 36, 37, 38, 39, 4, 11, 12, 12, 15, 15, 17, 21, 21, 26, 26, 28, 39, 0, 0, 0, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 1, 27, 19, 55, 55, 56, 56, 51, 57, 57, 0, 58, 59
};
const std::vector<uint32_t> FaceColorIdList{
0x80000004, 0x80000011, 0x80000015, 0x8000000f, 0x8000000c, 0x80000014, 0x80000010, 0x80000016,
0x80000001, 0x80000012, 0x8000001a, 0x80000003, 0x80000017, 0x80000018, 0x80000013, 0x8000000a
};
const std::vector<uint32_t> FaceColorIdMap = [] {
std::vector<uint32_t> v(0x100, 0);
for (uint32_t i = 0; i < FaceColorIdList.size(); ++i) {
v[FaceColorIdList[i] & 0xff] = i;
}
return v;
}();
const std::vector<std::vector<uint32_t> > LotFaceColor{
{0x80000011, 0x80000015, 0x8000000f}, {0x80000004, 0x8000000c, 0x80000014}
};
const std::vector<std::vector<uint32_t> > LotFaceColor2{
{0x80000010, 0x80000016, 0x80000001}, {0x80000014, 0x80000012, 0x8000001a}
};
const std::vector<uint32_t> HairColorIdList{
0x8000000c, 0x80000004, 0x8000000f, 0x80000010, 0x80000015, 0x80000021, 0x80000016, 0x8000000d,
0x80000026, 0x80000018, 0x8000002f, 0x80000027, 0x8000000e, 0x80000003, 0x80000011, 0x80000014,
0x80000012, 0x80000017, 0x8000001d, 0x80000028, 0x80000025, 0x80000029, 0x80000024, 0x8000002b,
0x80000030, 0x8000001f, 0x80000019, 0x80000022, 0x80000023, 0x8000002a, 0x80000006, 0x80000031
};
const std::vector<uint32_t> HairColorIdMap = [] {
std::vector<uint32_t> v(0x100, 0);
for (uint32_t i = 0; i < HairColorIdList.size(); ++i) {
v[HairColorIdList[i] & 0xff] = i;
}
return v;
}();
const std::vector<std::vector<uint32_t> > LotHairColor{
{0x8000000c, 0x80000004, 0x8000000f, 0x80000010, 0x80000015, 0x80000021},
{0x8000000c, 0x80000004, 0x8000000f, 0x80000010, 0x80000015, 0x80000021},
{0x8000000c, 0x80000004, 0x8000000f, 0x80000010, 0x80000015, 0x80000021},
{0x8000000c, 0x80000004, 0x8000000f, 0x80000010, 0x80000015, 0x80000021},
{0x8000000c, 0x80000004, 0x8000000f, 0x80000010, 0x80000015, 0x80000021},
{0x8000000c, 0x80000004, 0x8000000f, 0x80000010, 0x80000015, 0x80000021},
{0x8000000c, 0x80000004, 0x8000000f, 0x80000010, 0x80000015, 0x80000021},
{0x8000000c, 0x80000004, 0x8000000f, 0x80000010, 0x80000015, 0x80000021},
{0x8000000c, 0x80000004, 0x8000000f, 0x80000010, 0x80000015, 0x80000021},
{0x80000016, 0x8000000d, 0x80000026, 0x80000018, 0x8000002f, 0x80000027},
{0x80000018, 0x8000002f},
{0x80000016, 0x8000000d, 0x80000026, 0x80000018, 0x8000002f, 0x80000027},
{0x80000016, 0x8000000d, 0x80000026, 0x80000018, 0x8000002f, 0x80000027},
{0x80000018, 0x8000002f},
{0x80000016, 0x8000000d, 0x80000026, 0x80000018, 0x8000002f, 0x80000027},
{0x80000016, 0x8000000d, 0x80000026, 0x80000018, 0x8000002f, 0x80000027},
{0x80000018, 0x8000002f},
{0x80000016, 0x8000000d, 0x80000026, 0x80000018, 0x8000002f, 0x80000027}
};
const std::vector<uint32_t> LotHairColorLen{6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 2, 6, 6, 2, 6, 6, 2, 6};
const std::vector<std::vector<uint32_t> > LotPartsEyes{
{0, 1, 2, 3, 4, 5, 6, 12, 14, 17, 19, 20, 21, 22, 23, 24, 26, 27, 30, 31, 32, 33, 34, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 53, 54, 55, 58, 60, 62, 63, 64, 67},
{0, 2, 3, 21, 27, 32, 33, 34, 42, 45, 48, 53, 55, 60},
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 19, 20, 21, 22, 23, 24, 25, 26, 27, 29, 30, 31, 32, 33, 34, 35, 37, 39, 41, 43, 44, 47, 48, 49, 50, 51, 53, 54, 57, 58, 61, 62, 63, 64, 65, 66},
{0, 1, 2, 3, 5, 7, 8, 11, 12, 14, 15, 18, 19, 20, 21, 24, 27, 28, 30, 32, 33, 34, 36, 37, 38, 40, 41, 42, 45, 46, 47, 48, 51, 52, 55, 56, 59, 60, 67},
{2, 3, 7, 11, 18, 21, 27, 28, 34, 36, 38, 48, 51, 56, 59},
{0, 1, 2, 3, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 41, 43, 44, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 57, 58, 60, 61, 62, 63, 64, 65, 66},
{0, 1, 2, 3, 5, 6, 7, 8, 11, 12, 14, 15, 17, 18, 19, 20, 21, 22, 23, 24, 26, 27, 29, 30, 31, 32, 33, 34, 36, 37, 38, 39, 40, 42, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 58, 59, 60, 61, 63, 64, 65, 67},
{2, 3, 7, 11, 18, 21, 22, 27, 32, 33, 34, 42, 45, 48, 59, 64},
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 41, 43, 44, 46, 48, 49, 50, 51, 52, 53, 54, 57, 58, 60, 61, 62, 63, 64, 65, 66}
};
const std::vector<uint32_t> LotPartsEyesLen{44, 14, 54, 39, 15, 60, 54, 16, 60};
const std::vector<std::vector<uint32_t> > LotPartsMouth{
{0, 1, 2, 3, 4, 5, 6, 8, 10, 11, 13, 14, 16, 19, 21, 24, 25, 26, 27, 28, 29, 31, 32, 34, 35, 36, 37, 38, 39, 40, 42, 43, 44, 45, 46, 47, 49, 50, 51, 52, 53, 54, 55, 56, 57, 60, 61, 62, 63, 64, 66, 67, 69, 70},
{0, 1, 2, 11, 32, 35, 36, 37, 38, 41, 42, 44, 51, 53, 56, 60, 64, 69, 70},
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 33, 34, 36, 39, 41, 43, 45, 46, 47, 48, 49, 50, 52, 54, 55, 56, 57, 61, 62, 63, 65, 66, 67, 68},
{0, 1, 2, 3, 4, 6, 8, 11, 13, 14, 16, 18, 19, 21, 24, 29, 31, 32, 35, 37, 38, 40, 42, 43, 44, 46, 47, 50, 51, 53, 56, 57, 58, 59, 60, 62, 64, 69, 70},
{0, 2, 11, 18, 32, 37, 42, 51, 53, 59, 60, 69, 70},
{0, 1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 28, 29, 30, 31, 33, 35, 38, 39, 40, 41, 43, 44, 45, 46, 47, 48, 49, 50, 52, 55, 56, 57, 58, 59, 61, 64, 66, 67, 68},
{0, 1, 2, 3, 4, 6, 7, 8, 9, 10, 11, 13, 14, 16, 19, 21, 23, 24, 28, 29, 31, 32, 33, 35, 37, 38, 40, 41, 42, 43, 44, 45, 46, 47, 49, 50, 51, 52, 53, 56, 57, 60, 61, 62, 64, 66, 67, 68, 69, 70},
{0, 1, 2, 3, 6, 9, 11, 13, 19, 24, 29, 31, 32, 35, 37, 38, 41, 42, 44, 46, 49, 51, 53, 57, 60, 64, 69, 70},
{0, 1, 2, 3, 4, 5, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 33, 34, 39, 40, 41, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 54, 55, 56, 58, 61, 62, 64, 66, 67, 68}
};
const std::vector<uint32_t> LotPartsMouthLen{54, 19, 55, 39, 13, 53, 50, 28, 56};
const std::vector<std::vector<uint32_t> > LotPartsNose{
{0, 1, 2, 3, 4, 6, 7, 10, 11, 14, 16, 17, 18, 19, 20, 21, 22, 24, 25, 27, 28, 29, 30, 32, 33, 34, 36, 37, 41},
{0, 4, 16, 17, 18, 19, 20, 27, 31, 32, 37},
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 21, 22, 23, 24, 25, 26, 28, 29, 30, 32, 34, 35, 36, 38, 40, 41},
{0, 2, 4, 6, 7, 10, 11, 14, 16, 17, 18, 19, 20, 21, 27, 31, 32, 36, 37},
{0, 4, 16, 17, 18, 20, 27, 31, 32, 36},
{0, 1, 2, 3, 4, 6, 7, 8, 10, 11, 12, 14, 15, 16, 17, 18, 21, 22, 23, 24, 25, 27, 29, 30, 33, 34, 35, 36, 37, 38, 40, 41},
{0, 1, 2, 3, 4, 6, 7, 8, 10, 11, 14, 16, 17, 18, 19, 20, 21, 23, 24, 26, 27, 29, 31, 32, 33, 35, 36, 37, 38, 39, 41},
{0, 4, 16, 17, 18, 19, 20, 27, 31, 37, 39},
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 21, 22, 23, 24, 25, 26, 28, 29, 30, 33, 34, 35, 36, 37, 38, 39, 40, 41}
};
const std::vector<uint32_t> LotPartsNoseLen{29, 11, 35, 19, 10, 32, 31, 11, 37};
const std::vector<std::vector<uint32_t> > LotPartsBrows{
{0, 1, 2, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14, 16, 17, 18, 19, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 33, 35, 36, 37, 38},
{0, 4, 5, 8, 9, 10, 12, 13, 21, 25, 26, 27, 29, 31, 36, 38},
{0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 11, 13, 14, 15, 16, 17, 18, 19, 20, 23, 24, 28, 30, 31, 32, 33, 34, 35, 37, 38},
{0, 1, 3, 5, 7, 8, 9, 10, 11, 12, 13, 17, 21, 25, 26, 27, 28, 29, 30, 36, 38},
{0, 3, 8, 9, 11, 12, 13, 27, 38},
{0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 11, 13, 14, 15, 17, 18, 20, 21, 22, 23, 24, 25, 28, 29, 30, 31, 32, 33, 34, 35, 37, 38},
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 17, 18, 21, 22, 23, 25, 26, 27, 28, 29, 30, 31, 35, 36, 37, 38},
{0, 2, 3, 5, 9, 11, 13, 23, 25, 27, 28, 35, 38},
{0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 11, 13, 14, 15, 16, 19, 20, 21, 22, 24, 26, 29, 30, 31, 32, 33, 34, 36, 38}
};
const std::vector<uint32_t> LotPartsBrowsLen{33, 16, 30, 21, 9, 32, 31, 13, 29};
const std::vector<std::vector<uint32_t> > LotPartsCheek{
{1, 2, 3, 4, 8, 10, 12},
{1, 3, 8, 9, 11, 12},
{1, 2, 3, 4, 5, 6, 7, 10, 11, 13},
{1, 2, 3, 4, 8, 9, 12},
{1, 3, 8, 9, 11},
{1, 2, 3, 4, 5, 6, 7, 10, 11, 13},
{1, 2, 3, 4, 9, 11, 12},
{1, 3, 8, 9, 11, 12},
{1, 2, 3, 4, 5, 6, 7, 8, 10, 13}
};
const std::vector<uint32_t> LotPartsCheekLen{7, 6, 10, 7, 5, 10, 7, 6, 10};
const std::vector<std::vector<int32_t> > PartsEyesCategoryData{
{0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1},
{10, 20, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1},
{0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1},
{10, 0, 0, 20, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1},
{0, 0, 30, 0, 0, 10, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1},
{0, 30, 0, 0, 10, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1},
{0, 20, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 1},
{10, 0, 0, 10, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1},
{10, 0, 0, 30, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 1},
{-10, 0, 10, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1},
{-20, 0, 30, -20, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1},
{0, 0, 10, 20, 10, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1},
{0, 0, 0, 0, 0, 0, -10, 1, 0, 1, 1, 0, 1, 1, 0, 1},
{0, 0, 20, -20, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1},
{0, 20, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1},
{0, 0, -20, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 1},
{10, 10, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1},
{0, 0, 0, 0, 0, 0, 50, 1, 0, 1, 0, 0, 1, 1, 0, 1},
{10, -10, -20, 0, 10, 0, -30, 0, 0, 0, 1, 1, 1, 1, 1, 1},
{0, 20, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1},
{0, 20, 0, -10, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1},
{10, 0, 0, 30, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1},
{0, 0, 0, 0, 0, 0, 70, 1, 0, 1, 0, 0, 1, 1, 1, 1},
{0, 30, 10, 0, 0, 0, 10, 1, 0, 1, 0, 0, 0, 1, 0, 1},
{0, 0, 0, 10, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1},
{10, 0, 0, 10, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1},
{0, 0, 40, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 1},
{10, 0, 0, 20, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1},
{0, 0, -20, 0, 30, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1},
{0, 0, 0, 0, 0, 0, 40, 0, 0, 1, 0, 0, 1, 1, 0, 1},
{0, 25, 0, 0, 15, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1},
{0, 20, 20, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 1},
{0, 10, 0, 10, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1},
{10, 0, 0, 10, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1},
{20, 20, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1},
{0, 0, 0, 0, -20, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1},
{10, 0, 0, 20, 20, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1},
{0, 10, 0, 0, 30, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 1},
{20, 0, 0, 0, 30, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1},
{0, 0, 25, 0, 20, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1},
{0, 0, -20, -20, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0},
{0, 10, 25, 0, 20, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1},
{0, 0, 30, 0, 10, 0, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0},
{0, 0, 40, 0, 0, 0, 30, 1, 0, 1, 0, 0, 1, 0, 0, 1},
{0, 0, 30, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 1},
{-10, -10, 15, 0, 0, 0, -30, 1, 1, 0, 1, 0, 0, 1, 1, 0},
{0, 0, -30, 0, -20, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1},
{0, 20, 0, 0, 30, 0, 50, 1, 0, 1, 1, 0, 1, 1, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1},
{0, 20, 0, 0, 10, 0, 20, 1, 0, 1, 0, 0, 1, 1, 0, 1},
{0, 10, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 1},
{20, 0, 0, 10, 10, 0, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1},
{0, 0, 0, 0, 30, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1},
{0, 20, 30, 0, 10, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1},
{0, 10, 0, -20, 0, 0, 30, 1, 0, 1, 0, 0, 1, 1, 0, 1},
{10, 10, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 1, 0, 0},
{25, 0, -30, 0, 10, -10, -20, 0, 0, 0, 1, 1, 0, 0, 0, 0},
{0, 30, 0, 0, 20, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1},
{0, 20, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 1},
{30, 0, 0, 10, 10, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0},
{0, 20, 10, 0, 20, 0, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1},
{0, 20, 10, 0, 0, 10, 20, 0, 0, 1, 0, 0, 1, 1, 0, 1},
{0, 0, 15, 0, 10, 0, 30, 1, 0, 1, 0, 0, 1, 0, 0, 1},
{0, 30, 20, 0, 0, 0, 20, 1, 0, 1, 0, 0, 1, 1, 0, 1},
{20, 0, 0, 30, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1},
{0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1},
{0, 10, 0, 0, -10, 0, 30, 0, 0, 1, 0, 0, 1, 0, 0, 1},
{0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0}
};
const std::vector<std::vector<int32_t> > PartsMouthCategoryData{
{160, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 161},
{160, 10, 20, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 161},
{160, 10, 0, 0, 10, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 161},
{160, 0, 0, 20, -10, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 161},
{160, -20, -20, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 160},
{160, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 161},
{160, 0, 0, 0, 20, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 161},
{160, 0, 0, 30, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 161},
{160, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 161},
{160, 0, 0, 0, 20, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 161},
{160, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 1, 161},
{160, 10, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 161},
{160, 0, 0, 10, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 161},
{160, 0, 0, 0, 20, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 161},
{160, 0, 0, 20, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 161},
{160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 161},
{160, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 161},
{160, 10, 0, 0, 0, 50, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 160},
{160, 10, 0, 0, 0, 30, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 161},
{160, 30, 0, 0, 20, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 161},
{160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 161},
{160, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 161},
{160, 0, 0, 30, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 160},
{160, 0, 0, 20, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 160},
{160, 20, 0, 0, 30, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 161},
{161, 0, 0, 10, 0, 0, 40, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 160},
{161, 0, 0, 0, 0, 0, 60, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 160},
{161, 0, 15, 0, 0, 0, 50, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 160},
{160, 0, -20, 10, 30, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 1, 161},
{160, 20, 0, 0, 30, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 161},
{160, 0, 0, 30, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 161},
{160, 0, 10, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 161},
{160, 15, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 161},
{160, 0, 0, 30, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 161},
{160, 0, 0, 40, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 160},
{160, 0, 0, 0, 20, 10, 0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 161},
{160, 0, 20, 0, 0, 0, 60, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 160},
{160, 0, 30, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 161},
{160, 0, 0, 30, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 161},
{160, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 161},
{160, 20, 20, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 161},
{160, 10, 0, 0, 30, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 161},
{160, 20, 10, 0, 10, 10, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 161},
{160, 0, 20, 10, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 161},
{160, 10, 0, 0, 20, 0, 0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 161},
{160, 0, 0, 0, 20, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 1, 161},
{160, 10, 0, 0, 20, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 161},
{160, 0, 0, 20, 10, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 161},
{160, 0, 0, 0, 0, 0, -20, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 161},
{160, 0, 20, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 161},
{160, 0, 0, 0, 10, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 161},
{160, 20, 10, 0, 10, 0, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 161},
{160, 0, 10, 30, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 1, 161},
{160, 0, 20, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 161},
{160, 0, 0, 40, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 161},
{160, 0, 0, 30, 0, 15, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 161},
{160, -10, 20, 20, -10, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 161},
{160, 10, 0, 0, 10, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 161},
{160, 20, 0, 0, 0, 50, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 161},
{160, 30, 0, 0, 0, 30, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 161},
{160, 0, 0, 0, 30, 0, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 161},
{160, 0, 0, 0, 0, 0, 20, 0, 1, 0, 1, 0, 0, 1, 1, 0, 1, 161},
{160, 0, 10, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1, 161},
{161, 0, 10, 10, 0, 0, 50, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 160},
{160, 10, 0, 0, 30, 0, 0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 161},
{161, 0, 0, 0, 0, 0, 50, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 160},
{160, 0, 10, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 1, 161},
{160, -10, -20, 10, 0, 0, -20, 50, 1, 0, 1, 0, 0, 1, 1, 0, 1, 161},
{160, 0, 0, 10, 10, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 161},
{160, 20, 10, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 161},
{160, 20, 10, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 161}
};
const std::vector<std::vector<int32_t> > PartsNoseCategoryData{
{160, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1},
{161, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 1},
{160, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1},
{161, 0, 0, 15, 0, -20, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 1},
{161, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1},
{161, 0, 0, 20, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1},
{161, 0, 0, 10, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1},
{161, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1},
{160, 0, 0, 0, 30, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1},
{161, 0, 0, 20, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1},
{161, 0, 10, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1},
{161, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1},
{161, 0, 0, 10, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1},
{161, 0, 0, 20, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1},
{161, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1},
{161, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1},
{160, 20, 0, 0, 10, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1},
{161, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1},
{161, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1},
{161, 0, 10, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0},
{160, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0},
{161, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1},
{160, 0, 0, 30, 20, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1},
{160, 30, 0, 0, 20, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1},
{160, 0, 0, 20, 20, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 1},
{161, 0, 10, 20, -20, 0, 10, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1},
{161, 0, 0, 10, 10, 0, 10, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1},
{161, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0},
{161, 0, 0, 0, -30, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1},
{160, 0, 10, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 1},
{161, 0, 0, 20, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1},
{160, 10, 0, 0, 10, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0},
{161, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0},
{161, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 1},
{161, 0, 10, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1},
{160, 0, 20, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1},
{160, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1},
{160, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1},
{160, 10, 0, 0, 10, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1},
{160, 20, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1},
{161, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1},
{161, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 1}
};
const std::vector<std::vector<int32_t> > PartsBrowsCategoryData{
{160, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1},
{160, 0, 20, 10, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1},
{160, 0, 0, 0, 10, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1},
{160, 10, 0, 0, 0, 10, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1},
{160, 0, 0, 30, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1},
{160, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1},
{160, 0, 0, 30, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 1},
{160, 10, 0, 10, 0, 10, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 1},
{160, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1},
{160, 10, 10, 0, 10, 0, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0},
{160, 0, 10, 10, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1},
{160, 20, 20, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1},
{160, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0},
{160, 20, 30, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1},
{160, 0, 0, 0, 10, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 1},
{161, 0, 0, 10, 0, 0, 20, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1},
{160, 0, 0, 30, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1},
{160, 0, 20, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 0},
{160, 10, 10, 0, 10, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0},
{160, 0, 0, 10, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1},
{160, 0, 0, 20, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1},
{160, 0, 20, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1},
{160, 0, 10, 10, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 1},
{160, 10, 0, 0, 10, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0},
{160, 0, 0, 10, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1},
{160, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 0},
{160, 0, 10, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1},
{160, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0},
{160, 0, 10, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0},
{160, 0, 10, 20, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1},
{160, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1},
{161, 0, 0, 20, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1},
{161, 0, 0, 10, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1},
{161, 0, 0, 15, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1},
{160, 0, 0, 30, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1},
{161, 0, 0, 0, 10, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0},
{160, -10, 10, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1},
{160, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0},
{160, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1}
};
const std::vector<std::vector<int32_t> > PartsCheekCategoryData{
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, -20, 0, 10, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1},
{0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1},
{0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1},
{10, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1},
{0, 0, 20, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1},
{0, 0, 0, -30, 0, 20, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1},
{0, 0, 0, 20, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1},
{20, 10, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1},
{20, 0, 0, 20, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0},
{0, 0, 0, -20, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1},
{0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0},
{0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1}
};
const std::vector<uint32_t> BodyIdList{
0x00000000, 0x8000000b, 0x8000000c, 0x80000017, 0x8000001c, 0x80000004, 0x80000009, 0x8000000d,
0x80000013, 0x8000000e, 0x8000001d, 0x80000014, 0x8000000f, 0x80000019, 0x8000001e, 0x80000015,
0x80000006, 0x80000010, 0x80000008, 0x8000001b, 0x80000012, 0x80000011, 0x80000016, 0x80000003,
0x80000007, 0x8000000a, 0x8000001f, 0x80000001, 0x8000001a, 0x80000018, 0x80000002
};
const std::vector<uint32_t> BodyIdMap = [] {
std::vector<uint32_t> v(0x100, 0);
for (uint32_t i = 0; i < BodyIdList.size(); ++i) {
v[BodyIdList[i] & 0xff] = i;
}
return v;
}();
const std::vector<std::vector<uint32_t> > LotBody{
{0x8000000d, 0x80000013, 0x8000000e, 0x8000000f, 0x80000019, 0x8000001e, 0x80000010, 0x80000008, 0x8000001b, 0x80000016, 0x80000003, 0x80000007},
{0x8000000c, 0x80000017, 0x8000001c, 0x80000009, 0x8000001d, 0x80000014, 0x80000015, 0x80000006, 0x80000012, 0x80000011, 0x8000000a, 0x80000001, 0x8000001a, 0x80000018},
{0x8000000b, 0x80000004, 0x8000001f, 0x80000002}
};
const std::vector<std::vector<uint32_t> > LotBody2{
{0x80000016, 0x80000003, 0x80000007, 0x80000001, 0x8000001a, 0x80000018, 0x8000000c, 0x80000017, 0x8000001c, 0x8000000d, 0x80000013, 0x8000000e},
{0x80000010, 0x80000008, 0x8000001b, 0x80000011, 0x8000000a, 0x8000001f, 0x80000002, 0x8000000b, 0x80000004, 0x80000009, 0x8000001d, 0x8000000f, 0x80000019, 0x8000001e},
{0x80000006, 0x80000012, 0x80000014, 0x80000015}
};
const std::vector<uint32_t> LotBodyLen{12, 14, 4};
const std::vector<std::string> BodyStringList{
"",
"1A(0最速)", "1B(0準速)", "1C(0中間)", "1D(0準大)", "1E(0最大)",
"2A(3+最速)", "2B(3+準速)", "2C(3+中間)", "2D(3+準大)", "2E(3+最大)",
"3A(3-最速)", "3B(3-準速)", "3C(3-中間)", "3D(3-準大)", "3E(3-最大)",
"4A(6+最速)", "4B(6+準速)", "4C(6+中間)", "4D(6+準大)", "4E(6+最大)",
"5A(10最速)", "5B(6-準速)", "5C(6-中間)", "5D(6-準大)", "5E(6-最大)",
"6A(15最速)", "6B(15準速)", "6C(15中間)", "6D(10準大)", "6E(10最大)"
};
const std::vector<uint32_t> BodyColorIdList{
0x00000000, 0x8000001c, 0x8000002b, 0x80000014, 0x8000001f, 0x80000004, 0x80000024, 0x80000027,
0x80000025, 0x8000001a, 0x80000010, 0x80000026, 0x80000013, 0x80000029, 0x80000009, 0x80000031,
0x80000028, 0x80000015, 0x80000012, 0x8000002c, 0x8000001b, 0x80000003, 0x80000016, 0x80000021,
0x80000007, 0x8000002a, 0x8000002d, 0x8000002e, 0x8000002f, 0x80000001, 0x80000017, 0x80000030,
0x8000000d, 0x80000011, 0x80000018, 0x80000002, 0x80000019, 0x8000001d
};
const std::vector<uint32_t> BodyColorIdMap = [] {
std::vector<uint32_t> v(0x100, 0);
for (uint32_t i = 0; i < BodyColorIdList.size(); ++i) {
v[BodyColorIdList[i] & 0xff] = i;
}
return v;
}();
const std::vector<std::vector<uint32_t> > LotBodyColor{
{0x8000002B, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
{0x80000004, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
{0x80000025, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
{0x80000026, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
{0x80000009, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
{0x80000015, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
{0x8000001B, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
{0x80000021, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
{0x8000002D, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
{0x80000004, 0x80000025, 0x80000026, 0x80000009, 0x80000015, 0x8000001B, 0x80000021, 0x8000002D, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
{0x8000002B, 0x80000025, 0x80000026, 0x80000009, 0x80000015, 0x8000001B, 0x80000021, 0x8000002D, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
{0x8000002B, 0x80000004, 0x80000026, 0x80000009, 0x80000015, 0x8000001B, 0x80000021, 0x8000002D, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
{0x8000002B, 0x80000004, 0x80000025, 0x80000009, 0x80000015, 0x8000001B, 0x80000021, 0x8000002D, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
{0x8000002B, 0x80000004, 0x80000025, 0x80000026, 0x80000015, 0x8000001B, 0x80000021, 0x8000002D, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
{0x8000002B, 0x80000004, 0x80000025, 0x80000026, 0x80000009, 0x8000001B, 0x80000021, 0x8000002D, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
{0x8000002B, 0x80000004, 0x80000025, 0x80000026, 0x80000009, 0x80000015, 0x80000021, 0x8000002D, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
{0x8000002B, 0x80000004, 0x80000025, 0x80000026, 0x80000009, 0x80000015, 0x8000001B, 0x8000002D, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
{0x8000002B, 0x80000004, 0x80000025, 0x80000026, 0x80000009, 0x80000015, 0x8000001B, 0x80000021, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
{0x80000014, 0x8000001F, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
{0x80000024, 0x80000027, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
{0x8000001A, 0x80000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
{0x80000013, 0x80000029, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
{0x80000031, 0x80000028, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
{0x80000012, 0x8000002C, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
{0x80000003, 0x80000016, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
{0x80000007, 0x8000002A, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
{0x8000002E, 0x8000002F, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
{0x80000002, 0x80000019, 0x8000001D, 0x80000002, 0x80000002, 0x80000002, 0x80000002, 0x80000002, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
{0x80000002, 0x80000019, 0x8000001D, 0x80000002, 0x80000002, 0x80000002, 0x80000002, 0x80000002, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
{0x80000002, 0x80000019, 0x8000001D, 0x80000002, 0x80000002, 0x80000002, 0x80000002, 0x80000002, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
{0x80000002, 0x80000019, 0x8000001D, 0x80000002, 0x80000002, 0x80000002, 0x80000002, 0x80000002, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
{0x80000002, 0x80000019, 0x8000001D, 0x80000002, 0x80000002, 0x80000002, 0x80000002, 0x80000002, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
{0x80000002, 0x80000019, 0x8000001D, 0x80000002, 0x80000002, 0x80000002, 0x80000002, 0x80000002, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
{0x80000002, 0x80000019, 0x8000001D, 0x80000002, 0x80000002, 0x80000002, 0x80000002, 0x80000002, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
{0x80000002, 0x80000019, 0x8000001D, 0x80000002, 0x80000002, 0x80000002, 0x80000002, 0x80000002, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
{0x80000002, 0x80000019, 0x8000001D, 0x80000002, 0x80000002, 0x80000002, 0x80000002, 0x80000002, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
{0x8000000D, 0x80000011, 0x80000018, 0x8000000D, 0x8000000D, 0x8000000D, 0x8000000D, 0x8000000D, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
{0x8000000D, 0x80000011, 0x80000018, 0x8000000D, 0x8000000D, 0x8000000D, 0x8000000D, 0x8000000D, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
{0x8000000D, 0x80000011, 0x80000018, 0x8000000D, 0x8000000D, 0x8000000D, 0x8000000D, 0x8000000D, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
{0x8000000D, 0x80000011, 0x80000018, 0x8000000D, 0x8000000D, 0x8000000D, 0x8000000D, 0x8000000D, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
{0x8000000D, 0x80000011, 0x80000018, 0x8000000D, 0x8000000D, 0x8000000D, 0x8000000D, 0x8000000D, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
{0x8000000D, 0x80000011, 0x80000018, 0x8000000D, 0x8000000D, 0x8000000D, 0x8000000D, 0x8000000D, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
{0x8000000D, 0x80000011, 0x80000018, 0x8000000D, 0x8000000D, 0x8000000D, 0x8000000D, 0x8000000D, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
{0x8000000D, 0x80000011, 0x80000018, 0x8000000D, 0x8000000D, 0x8000000D, 0x8000000D, 0x8000000D, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
{0x8000000D, 0x80000011, 0x80000018, 0x8000000D, 0x8000000D, 0x8000000D, 0x8000000D, 0x8000000D, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
{0x80000001, 0x80000017, 0x80000030, 0x80000001, 0x80000001, 0x80000001, 0x80000001, 0x80000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
{0x80000001, 0x80000017, 0x80000030, 0x80000001, 0x80000001, 0x80000001, 0x80000001, 0x80000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
{0x80000001, 0x80000017, 0x80000030, 0x80000001, 0x80000001, 0x80000001, 0x80000001, 0x80000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
{0x80000001, 0x80000017, 0x80000030, 0x80000001, 0x80000001, 0x80000001, 0x80000001, 0x80000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
{0x80000001, 0x80000017, 0x80000030, 0x80000001, 0x80000001, 0x80000001, 0x80000001, 0x80000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
{0x80000001, 0x80000017, 0x80000030, 0x80000001, 0x80000001, 0x80000001, 0x80000001, 0x80000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
{0x80000001, 0x80000017, 0x80000030, 0x80000001, 0x80000001, 0x80000001, 0x80000001, 0x80000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
{0x80000001, 0x80000017, 0x80000030, 0x80000001, 0x80000001, 0x80000001, 0x80000001, 0x80000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
{0x80000001, 0x80000017, 0x80000030, 0x80000001, 0x80000001, 0x80000001, 0x80000001, 0x80000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000}
};
const std::vector<uint32_t> LotBodyColorLen{
1, 1, 1, 1, 1, 1, 1, 1, 1, 8, 8, 8, 8, 8, 8, 8, 8, 8, 2, 2, 2, 2, 2, 2, 2, 2, 2, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8
};
const std::vector<uint32_t> BodyColorFusionData{8, 10, 10, 10, 10, 10, 10, 10, 10, 3, 2, 4};
const std::vector<std::string> BodyColorStringList{
"", "SP", "黒", "濃黒", "薄黒", "赤", "濃赤", "薄赤",
"水色", "濃水色", "薄水色", "緑", "濃緑", "薄緑", "橙", "濃橙",
"薄橙", "黄色", "濃黄色", "薄黄色", "青", "濃青", "薄青", "白",
"濃白", "薄白", "紫", "濃紫", "薄紫", "桃", "濃桃", "薄桃",
"金", "濃金", "薄金", "銀", "濃銀", "薄銀"
};
const std::vector<uint32_t> BodyPatternIdList{
0x00000000, 0x8000000e, 0x80000015, 0x80000016, 0x80000006, 0x8000001e, 0x8000002c, 0x80000017,
0x8000000c, 0x80000003, 0x80000026, 0x8000002d, 0x80000004, 0x80000025, 0x8000002e, 0x80000008,
0x8000000f, 0x80000002, 0x80000027, 0x8000000d, 0x8000002f, 0x80000005, 0x80000007, 0x80000013,
0x80000030
};
const std::vector<uint32_t> BodyPatternIdMap = [] {
std::vector<uint32_t> v(0x100, 0);
for (uint32_t i = 0; i < BodyPatternIdList.size(); ++i) {
v[BodyPatternIdList[i] & 0xff] = i;
}
return v;
}();
const std::vector<std::vector<uint32_t> > BodyPatternData{
{0x8000000e},
{0x80000015, 0x80000016, 0x80000006, 0x8000001e, 0x8000002c, 0x80000017},
{0x80000003, 0x80000026, 0x8000002e, 0x8000000f, 0x8000002f, 0x80000007},
{0x8000000c, 0x8000002d, 0x80000004, 0x80000025, 0x80000008, 0x80000027, 0x8000000d},
{0x80000002, 0x80000005, 0x80000013}
};
const std::vector<uint32_t> BodyPatternDataLen{1, 6, 6, 7, 3};
const std::vector<uint32_t> BodyPatternRankData{
0, 1, 2, 2, 2, 2, 2, 2, 4, 3, 3, 4, 4, 4, 3, 4, 3, 5, 4, 4, 3, 5, 3, 5, 0
};
const std::vector<std::vector<uint32_t> > BodyPatternFusionData{
{95, 5, 0, 0}, {10, 85, 5, 0}, {0, 10, 85, 5}, {0, 5, 10, 85}, {25, 25, 25, 25}
};
const std::vector<std::string> BodyPatternStringList{
"", "なし", "ツートン", "ボーダー", "ストライプ", "水玉", "アニマル", "斜めボーダー",
"ピンドット", "ギンガムチェック", "ダイヤ", "レンガ", "スプラッシュ", "マーブル", "鱗文", "ヘビ",
"シェブロン", "トラ", "しずく", "うろこ", "バブルドット", "花", "スペード", "星",
""
};
const std::vector<std::vector<uint32_t> > NameIdList{
{
0x00000000,0x80701240,0x8070199a,0x80701bb0,0x80701354,0x80701994,0x80701dca,0x80701e46,
0x80701766,0x80701860,0x80701b9f,0x80701ad6,0x807018f2,0x80701394,0x8070185d,0x80701b9e,
0x80701015,0x807019f1,0x80701a0b,0x80701389,0x807010cb,0x8070138b,0x80701180,0x807017ca,
0x8070157b,0x80701b61,0x8070127e,0x8070110c,0x80701c82,0x80701b5c,0x80701837,0x807018f6,
0x80701eec,0x80701b10,0x80701de4,0x80701952,0x807019e7,0x80701edf,0x807010f8,0x80701130,
0x80701115,0x80701ada,0x80701de9,0x80701dc4,0x80701dd6,0x80701744,0x80701c81,0x807012a3,
0x807017f5,0x80701474,0x807015c2,0x807018d9,0x80701615,0x80701183,0x80701d8d,0x807013f7,
0x80701038,0x80701a42,0x807013eb,0x807019bf,0x80701f49,0x80701849,0x80701184,0x807013a2,
0x80701a6a,0x807010a0,0x80701be0,0x80701933,0x807015fd,0x80701c3d,0x807014a2,0x8070116b,
0x807010a9,0x80701e41,0x80701b4b,0x80701bcc,0x80701c3e,0x807010f3,0x807015b3,0x80701449,
0x8070184f,0x8070132c,0x807015a9,0x80701c61,0x80701d0e,0x80701173,0x8070152b,0x80701042,
0x80701c47,0x8070136b,0x80701a81,0x8070125e,0x80701fe3,0x80701ffc,0x80701cc3,0x80701a6d,
0x80701579,0x8070119c,0x80701fda,0x807014c6,0x80701e3b,0x8070137a,0x807018da,0x807011c8,
0x8070103a,0x807013d7,0x80701b7d,0x80701d86,0x807012c7,0x807014c3,0x80701e4f,0x80701028,
0x807011d1,0x807011be,0x80701524,0x807019b3,0x8070114b,0x807018a6,0x8070163d,0x80701fa5,
0x80701309,0x807018e7,0x80701c66,0x807014b3,0x807011dc,0x80701050,0x807014ae,0x80701ac4,
0x80701246,0x807011e7,0x8070167a,0x807017ad,0x80701645,0x8070121a,0x80701e3d,0x807010ec,
0x80701e88,0x80701e1a,0x807018db,0x8070160a,0x80701531,0x807012bb,0x80701ac7,0x80701ce1,
0x80701411,0x80701178,0x80701b0f,0x80701a01,0x807011f3,0x80701fe2,0x8070178b,0x80701201,
0x80701ba8,0x80701f41,0x8070160b,0x8070114c,0x8070134d,0x80701488,0x8070163e,0x8070116e,
0x80701200,0x8070176a,0x80701c36,0x807016ae,0x80701f11,0x80701747,0x80701186,0x80701f5a,
0x807019cc,0x80701169,0x80701793,0x80701b8a,0x807013ae,0x80701ea3,0x8070117d,0x80701a06,
0x8070147c,0x80701a6b,0x8070185e,0x8070116c,0x80701306,0x80701dfc,0x80701b29,0x8070112e,
0x80701e20,0x80701c50,0x8070138a,0x80701259,0x807017a5,0x80701efe,0x807019cd,0x807018b0,
0x80701d34,0x807017e2,0x80701fd7,0x807019e9,0x80701234,0x80701089,0x80701440,0x80701752,
0x80701798,0x80701197,0x807011b7,0x80701a8a,0x80701cec,0x80701876,0x807016bc,0x80701f0f,
0x807011dd,0x807015ae,0x807015a1,0x80701941,0x80701242,0x80701509,0x80701c52,0x807017cf,
0x80701ed5,0x80701d84,0x807018e8,0x80701063,0x80701c10,0x80701345,0x807011a1,0x8070178d,
0x80701867,0x80701aff,0x807016c3,0x807011b6,0x80701359,0x807019c8,0x80701601,0x807019f7,
0x807019a1,0x80701ead,0x8070104d,0x8070142d,0x80701341,0x80701551,0x8070151d,0x80701996,
0x8070144e,0x80701254,0x80701b14,0x80701189,0x80701549,0x80701c96,0x80701496,0x807013f9,
0x807019a3,0x80701d62,0x80701147,0x80701783,0x807014f7,0x80701975,0x807017a2,0x80701ecd,
0x8070183c,0x8070110d,0x80701b6f,0x80701095,0x8070104f,0x80701156,0x80701ece,0x807019eb,
0x80701b75,0x807015c4,0x80701afb,0x80701dab,0x8070123f,0x80701c2f,0x80701585,0x80701d91,
0x80701d88,0x80701907,0x80701b6d,0x80701c0a,0x80701f7d,0x80701b98,0x80701260,0x80701f75,
0x80701ef8,0x80701886,0x80701c6e,0x80701420,0x80701e82,0x80701ccf,0x80701690,0x8070118f,
0x80701ad3,0x8070177e,0x80701d47,0x807016d2,0x80701cdb,0x807017d6,0x807016c9,0x80701e3f,
0x807010cc,0x80701a79,0x807013c3,0x807015c1,0x80701861,0x80701f8a,0x80701ac8,0x80701b3c,
0x80701a09,0x8070111e,0x807016f4,0x8070132b,0x807015b6,0x807013fe,0x8070107b,0x80701a14,
0x80701e21,0x80701cfb,0x80701157,0x807011a4,0x807012f5,0x80701139,0x80701dcc,0x80701dc0,
0x807012a4,0x80701946,0x80701f10,0x80701b64,0x807015e6,0x80701a8d,0x807012d4,0x80701966,
0x807016fa,0x8070161f,0x807017c4,0x807018b3,0x80701eba,0x807019f4,0x80701c48,0x80701f89,
0x807019e3,0x807019b4,0x80701bdc,0x80701dea,0x80701458,0x807010d5,0x807013e0,0x807012b2,
0x8070126d,0x80701c13,0x807018c6,0x80701a16,0x80701ed3,0x807013b0,0x80701448,0x807017fc,
0x80701230,0x80701c99,0x80701880,0x807010eb,0x80701c73,0x80701270,0x8070117e,0x8070130b,
0x80701826,0x80701b1e,0x807015f9,0x807010f4,0x80701f12,0x80701de2,0x807012b3,0x80701b93,
0x80701816,0x80701bc4,0x807010a8,0x80701125,0x80701010,0x80701c28,0x807015ac,0x807019b7,
0x80701ec8,0x807018c1,0x80701d69,0x8070170f,0x8070176d,0x8070101b,0x80701786,0x807017f6,
0x8070138f,0x80701d99,0x8070173c,0x80701f32,0x80701ab8,0x80701a68,0x807015ea,0x80701b99,
0x80701893,0x8070118c,0x8070196a,0x80701497,0x80701aba,0x807010a1,0x80701679,0x80701ba2,
0x8070161a,0x80701ad9,0x807015d4,0x8070197e,0x807018c7,0x80701b35,0x80701923,0x80701ee4,
0x80701de0,0x80701e08,0x80701764,0x80701b6a,0x80701a90,0x80701f13,0x80701457,0x80701145,
0x80701ed6,0x8070176b,0x807015f1,0x8070161b,0x8070151e,0x807016c4,0x80701f47,0x80701cba,
0x8070164a,0x807012c1,0x80701f45,0x80701f2c,0x8070142a,0x80701659,0x8070107a,0x80701521,
0x80701785,0x807019f3,0x80701470,0x80701382,0x80701285,0x8070184d,0x80701232,0x80701493,
0x807015f2,0x80701ab7,0x80701947,0x80701021,0x80701ad5,0x807015d9,0x8070167c,0x8070123a,
0x80701492,0x807013fc,0x80701008,0x80701023,0x8070157c,0x80701b90,0x80701bfa,0x80701494,
0x80701505,0x80701383,0x80701cbd,0x807018a7,0x807012ca,0x80701d7e,0x8070140c,0x80701db1,
0x80701aee,0x8070172a,0x80701f67,0x80701b23,0x80701d04,0x80701408,0x80701d54,0x80701f31,
0x807011d2,0x80701bb1,0x80701ebb,0x80701f96,0x8070141a,0x80701ddb,0x80701455,0x8070139f,
0x807018d8,0x807019e5,0x807011d8,0x80701743,0x8070105e,0x8070161e,0x80701729,0x80701070,
0x80701b37,0x80701a54,0x80701fff,0x8070126c,0x80701132,0x80701c72,0x80701e35,0x80701921,
0x80701e45,0x80701929,0x80701af7,0x807019e2,0x80701dc1,0x8070103c,0x807011e3,0x8070167f,
0x807014e4,0x807019ac,0x80701564,0x80701a07,0x8070124b,0x80701d16,0x80701f21,0x80701a10,
0x80701126,0x80701b66,0x80701261,0x80701b4d,0x80701161,0x8070124c,0x807019d6,0x80701b74,
0x807016cc,0x807012eb,0x8070174c,0x80701286,0x80701c7d,0x8070116d,0x80701985,0x8070120c,
0x80701074,0x80701a34,0x80701dd5,0x8070177d,0x80701791,0x80701666,0x80701895,0x80701051,
0x80701087,0x807019f8,0x807011c6,0x8070126e,0x807014f1,0x807017d7,0x80701a00,0x80701ac9,
0x807016d6,0x80701702,0x80701ec5,0x80701be6,0x8070179e,0x80701cd3,0x8070148d,0x80701f2f,
0x807010c3,0x807010d2,0x807014fc,0x807017ee,0x807016bb,0x80701280,0x80701c04,0x80701b0d,
0x80701806,0x80701b0a,0x807013a4,0x8070136d,0x80701bea,0x80701414,0x80701f24,0x8070185f,
0x80701b25,0x80701187,0x80701965,0x80701158,0x80701da4,0x80701b22,0x80701364,0x807012c2,
0x80701502,0x80701aa0,0x80701e0d,0x80701677,0x80701573,0x807015da,0x80701a2a,0x807018f3,
0x80701ec3,0x80701e17,0x80701fa6,0x80701c6f,0x80701e42,0x807013df,0x80701205,0x80701216,
0x807019a5,0x8070173d,0x80701971,0x807017e5,0x80701377,0x8070171a,0x80701636,0x80701045,
0x80701c85,0x80701983,0x80701054,0x80701904,0x80701967,0x807013c5,0x807014e0,0x807010d4,
0x807018eb,0x80701856,0x8070101a,0x80701891,0x80701dfd,0x807017e0,0x80701199,0x80701ac3,
0x80701763,0x8070123c,0x80701174,0x8070178e,0x80701691,0x807014dd,0x80701fcf,0x80701ace,
0x8070104c,0x80701aef,0x80701f59,0x80701aa1,0x8070179f,0x8070172b,0x80701603,0x80701a41,
0x80701b19,0x80701bff,0x807016e9,0x80701d53,0x807013a0,0x80701655,0x807013aa,0x80701a02,
0x80701de3,0x80701d1f,0x80701722,0x807015bc,0x80701c38,0x80701a2d,0x807013e9,0x807014d1,
0x80701017,0x807011a5,0x80701ea6,0x8070170b,0x80701213,0x80701a25,0x80701958,0x80701c62,
0x80701ddd,0x80701a08,0x8070115f,0x80701094,0x807018a8,0x80701a44,0x807010b5,0x8070160c,
0x80701998,0x80701518,0x80701b7f,0x80701256,0x807010d0,0x807012b1,0x80701808,0x807013f1,
0x80701fe1,0x807016c6,0x80701777,0x807011a3,0x8070113c,0x8070161d,0x807014a1,0x8070133c,
0x80701d93,0x80701088,0x80701b76,0x80701e6b,0x807017dd,0x80701ae0,0x807015fa,0x80701181,
0x80701373,0x80701f19,0x80701765,0x807019ce,0x80701165,0x80701e16,0x807011d0,0x807013fa,
0x80701e50,0x80701bc1,0x80701d67,0x80701688,0x80701e86,0x8070112c,0x80701b3d,0x8070107c,
0x8070137d,0x8070103b,0x807016f1,0x80701583,0x80701959,0x80701bd0,0x80701de5,0x807015ee,
0x807017fb,0x80701ed4,0x80701cd8,0x80701d51,0x80701784,0x8070160e,0x807018bc
},
{
0x00000000, 0x80702c83, 0x807027a1, 0x80702597, 0x807026f2, 0x807020fa, 0x80702dce, 0x80702c84,
0x8070202d, 0x807023ee, 0x80702790, 0x80702c01, 0x807023da, 0x807023b1, 0x80702209, 0x80702e96,
0x80702f0f, 0x8070261e, 0x80702965, 0x807026f8, 0x80702016, 0x807025ff, 0x80702ae5, 0x807025f9,
0x807022dc, 0x8070203b, 0x80702015, 0x80702a69, 0x80702db8, 0x80702827, 0x807026cd, 0x8070201c,
0x80702b30, 0x807026de, 0x80702e6d, 0x80702f7f, 0x80702079, 0x807022b3, 0x80702803, 0x807029a9,
0x807020af, 0x80702294, 0x80702d94, 0x807026c4, 0x807027e2, 0x80702510, 0x80702bbb, 0x807021d3,
0x80702b26, 0x8070255f, 0x807020e2, 0x807024a2, 0x80702f12, 0x80702982, 0x80702acf, 0x8070228a,
0x807026f1, 0x80702f6c, 0x8070299a, 0x80702b5e, 0x807021fd, 0x8070244f, 0x80702d59, 0x807023d9,
0x80702c08, 0x807029a3, 0x807029d8, 0x80702c85, 0x8070248e, 0x80702869, 0x80702bf9, 0x80702473,
0x80702d07, 0x8070265b, 0x8070229a, 0x80702872, 0x80702416, 0x807021e8, 0x807020c0, 0x8070249d,
0x8070270c, 0x80702ecc, 0x80702fcc, 0x80702a09, 0x807023a9, 0x80702089, 0x80702be3, 0x80702f9a,
0x80702efc, 0x80702a00, 0x807028c2, 0x80702a26, 0x80702fee, 0x807027d5, 0x80702a9e, 0x80702a05,
0x80702140, 0x8070228c, 0x807028fc, 0x807027e8, 0x80702f3a, 0x80702376, 0x80702a65, 0x80702b15,
0x80702af4, 0x807028d3, 0x80702066, 0x80702331, 0x80702931, 0x807021e0, 0x80702eec, 0x80702b2e,
0x80702c67, 0x80702511, 0x80702f86, 0x807027a9, 0x80702610, 0x807028e3, 0x80702313, 0x807024bc,
0x80702e6e, 0x80702336, 0x80702e7f, 0x80702d61, 0x8070283c, 0x8070265c, 0x80702f0d, 0x807022e8,
0x80702cf2, 0x807026ce, 0x80702b89, 0x80702f7e, 0x80702c13, 0x807028ba, 0x80702f3d, 0x807023ca,
0x807022f8, 0x80702df4, 0x80702de9, 0x80702df2, 0x807026b6, 0x80702b8d, 0x80702261, 0x80702863,
0x8070205e, 0x80702258, 0x80702c96, 0x80702979, 0x807024f8, 0x80702b38, 0x8070207a, 0x80702548,
0x807029cd, 0x80702b8a, 0x80702aaf, 0x80702cf7, 0x80702d03, 0x8070279c, 0x80702fed, 0x80702167,
0x8070266b, 0x80702e3b, 0x80702be5, 0x80702e10, 0x80702355, 0x80702a74, 0x80702e4e, 0x80702e64,
0x80702bad, 0x80702ffc, 0x80702977, 0x80702122, 0x8070291e, 0x80702547, 0x80702865, 0x807025fa,
0x807024db, 0x80702574, 0x8070247c, 0x8070235d, 0x80702b24, 0x80702540, 0x8070239b, 0x80702ba6,
0x80702f73, 0x8070240f, 0x80702394, 0x80702fef, 0x807024a9, 0x807023c6, 0x80702ca2, 0x8070260a,
0x80702b2f, 0x80702cdb, 0x80702e81, 0x807024bd, 0x80702b93, 0x80702866, 0x80702589, 0x80702cb7,
0x80702eb1, 0x807022ea, 0x80702244, 0x8070267a, 0x80702ff6, 0x8070243b, 0x8070248a, 0x80702558,
0x80702d48, 0x80702906, 0x80702f21, 0x8070274a, 0x80702732, 0x80702454, 0x80702bfb, 0x80702bc2,
0x807022df, 0x8070280a, 0x80702e8c, 0x807028c6, 0x8070226f, 0x80702a37, 0x80702441, 0x80702606,
0x807023c7, 0x80702b8b, 0x8070272f, 0x80702e79, 0x8070290f, 0x80702df5, 0x8070235e, 0x807025fb,
0x80702b6d, 0x80702455, 0x80702448, 0x807026df, 0x8070261b, 0x8070270d, 0x80702262, 0x80702f80,
0x8070211b, 0x80702d09, 0x80702c98, 0x80702b3f, 0x80702bcf, 0x80702e55, 0x80702b4d, 0x807025b6,
0x80702b5d, 0x80702e11, 0x80702731, 0x807025b7, 0x8070212d, 0x807029e0, 0x8070234c, 0x80702043,
0x80702b6e, 0x80702921, 0x80702000, 0x80702cf0, 0x807026fc, 0x80702f9b, 0x80702fc4, 0x80702d88,
0x80702443, 0x80702cc0, 0x807020e3, 0x80702956, 0x80702e22, 0x80702295, 0x80702c66, 0x80702175,
0x80702ae0, 0x807029c6, 0x80702840, 0x807024a3, 0x807022e9, 0x807024ae, 0x80702648, 0x807024d8,
0x80702f84, 0x80702ce6, 0x80702305, 0x8070222f, 0x80702e24, 0x807028d4, 0x80702ed4, 0x807029f1,
0x8070228e, 0x807029ee, 0x807028f8, 0x80702dc3, 0x807022b1, 0x80702c6f, 0x80702e3e, 0x80702eb3,
0x80702575, 0x8070290b, 0x8070215b, 0x80702ddf, 0x80702c3c, 0x80702569, 0x80702370, 0x80702f65,
0x80702ef4, 0x80702fbb, 0x807020e0, 0x807029e9, 0x80702288, 0x80702687, 0x807028d7, 0x8070229b,
0x807025d5, 0x80702dea, 0x80702791, 0x80702ab0, 0x807025f7, 0x80702c92, 0x8070293d, 0x80702474,
0x80702958, 0x80702d86, 0x80702351, 0x807028c9, 0x80702661, 0x8070231d, 0x80702bce, 0x80702927,
0x80702b33, 0x80702b87, 0x807022bf, 0x80702414, 0x8070281e, 0x8070245c, 0x807027bf, 0x807022b9,
0x8070246e, 0x807025a3, 0x80702335, 0x80702a86, 0x80702ea9, 0x80702cc1, 0x8070235f, 0x80702d08,
0x80702352, 0x807025a8, 0x807029ca, 0x80702b7a, 0x80702a4a, 0x80702b86, 0x8070249a, 0x807023db,
0x8070285d, 0x80702e8f, 0x8070222e, 0x80702709, 0x8070244d, 0x8070287c, 0x8070260f, 0x807025ef,
0x80702e98, 0x807026f5, 0x807023be, 0x80702fc5, 0x807026a6, 0x80702162, 0x80702181, 0x80702ec9,
0x8070297a, 0x80702523, 0x80702ad3, 0x807020db, 0x80702df6, 0x80702078, 0x80702c22, 0x80702861,
0x80702f4c, 0x80702ec7, 0x807020ca, 0x80702564, 0x80702673, 0x80702275, 0x807021a4, 0x807027f5,
0x80702440, 0x807027f7, 0x80702eab, 0x8070277e, 0x807022cb, 0x80702eae, 0x807023ef, 0x8070243d,
0x80702a39, 0x80702770, 0x80702f1b, 0x80702d3c, 0x80702a5e, 0x80702cf1, 0x80702a79, 0x807022be,
0x80702ca0, 0x80702ab1, 0x80702ee1, 0x807028f9, 0x80702b4b, 0x8070209e, 0x8070226d, 0x8070200b,
0x807024b0, 0x807027d0, 0x80702a5b, 0x8070220d, 0x80702799, 0x80702de7, 0x8070280d, 0x807024fe,
0x80702422, 0x8070273a, 0x80702d41, 0x80702943, 0x80702959, 0x80702c14, 0x8070271a, 0x807023a0,
0x80702b83, 0x807022fe, 0x8070270e, 0x80702f2f, 0x80702aa4, 0x80702123, 0x8070254f, 0x8070223f,
0x80702960, 0x80702191, 0x80702049, 0x80702bd0, 0x8070239d, 0x80702f78, 0x80702fd9, 0x80702360,
0x8070224a, 0x807024c4, 0x807020ec, 0x80702c6b, 0x80702b0e, 0x80702ea5, 0x807021af, 0x807029aa,
0x807025c3, 0x807028cf, 0x80702024, 0x8070272c, 0x807022ff, 0x8070231e, 0x807022fb, 0x80702eb4,
0x807023c4, 0x8070255b, 0x8070209d, 0x80702476, 0x807022c2, 0x807029b1, 0x80702c77, 0x807022eb,
0x807027df, 0x8070283f, 0x807021d4, 0x807027d8, 0x80702348, 0x80702998, 0x80702b69, 0x80702670,
0x807026cf, 0x80702975, 0x80702296, 0x807021c7, 0x807024fd, 0x80702d2c, 0x80702836, 0x80702c1a,
0x8070215f, 0x80702100, 0x8070279d, 0x80702e2e, 0x807025bf, 0x80702d99, 0x807023fc, 0x80702d47,
0x807027b2, 0x80702a5c, 0x80702b70, 0x80702551, 0x807020a1, 0x80702a4b, 0x80702753, 0x80702773,
0x80702c19, 0x807026a9, 0x80702a18, 0x80702332, 0x80702da1, 0x8070270f, 0x80702475, 0x80702faa,
0x80702b4a, 0x80702daf, 0x80702f3f, 0x80702db6, 0x8070249c, 0x807024e4, 0x80702b0c, 0x80702f5c,
0x80702f5f, 0x807029d3, 0x80702f1e, 0x8070231f, 0x80702dc1, 0x80702e2f, 0x80702d0d, 0x80702cbb,
0x807027e6, 0x8070222b, 0x807026a3, 0x807027b9, 0x807020de, 0x80702057, 0x80702d62, 0x80702883,
0x8070224f, 0x80702340, 0x807021ae, 0x8070239f, 0x807028ef, 0x8070217b, 0x80702c0a, 0x80702180,
0x80702ac4, 0x80702f79, 0x807025c9, 0x80702243, 0x80702361, 0x80702dc9, 0x80702538, 0x80702153,
0x80702ce5, 0x80702ea2, 0x80702c44, 0x80702a2b, 0x80702442, 0x80702ff0, 0x807025b5, 0x80702b07,
0x807029f3, 0x80702ed8, 0x80702245, 0x80702caa, 0x8070282e, 0x80702320, 0x80702918, 0x807023b8,
0x80702419, 0x80702456, 0x8070223b, 0x80702a4d, 0x807028c8, 0x80702d49, 0x807022a8, 0x80702d33,
0x807029a1, 0x80702554, 0x80702838, 0x807022ab, 0x80702a20, 0x80702876, 0x80702194, 0x80702f90,
0x8070296a, 0x8070207b, 0x807029e1, 0x80702cd0, 0x80702afd, 0x8070208d, 0x80702e8e, 0x80702d3f,
0x80702b27, 0x80702a14, 0x80702995, 0x80702e87, 0x80702096, 0x8070216f, 0x807023a1, 0x807020f8,
0x80702415, 0x807021c5, 0x8070243a, 0x8070258a, 0x80702058, 0x807024e5, 0x80702c97, 0x8070220f,
0x80702678, 0x80702f1f, 0x80702fb0, 0x807025fc, 0x80702a1d, 0x8070209b, 0x80702431, 0x80702d13,
0x80702e90, 0x80702160, 0x807024b1, 0x80702a2a, 0x80702885, 0x80702485, 0x80702c74, 0x80702c25,
0x80702be1, 0x80702f47, 0x80702377, 0x80702a58, 0x80702936, 0x8070225f, 0x807027e3, 0x807029c9,
0x80702794, 0x8070252f, 0x807023a8, 0x80702bdb, 0x80702856, 0x80702da4, 0x807028af, 0x807023d2,
0x80702acc, 0x807024d6, 0x80702269, 0x80702ae6, 0x807024fa, 0x80702ba9, 0x80702436, 0x80702d63,
0x80702890, 0x807020d9, 0x807024d1, 0x807027c4, 0x80702b41, 0x80702192, 0x807027ed, 0x8070208a,
0x80702edc, 0x80702c0c, 0x807020df, 0x80702ae8, 0x80702663, 0x80702405, 0x80702f55, 0x8070258e,
0x80702378, 0x80702322, 0x80702bd8, 0x807029b6, 0x8070223c, 0x8070256f, 0x807023c8, 0x807025d9,
0x80702a82, 0x80702c2e, 0x8070284b, 0x80702e00, 0x80702571, 0x80702a60, 0x80702991, 0x8070276e,
0x807022a6, 0x80702d91, 0x80702fae, 0x80702d05, 0x80702f48, 0x80702bda, 0x807020e8, 0x80702535,
0x807020ef, 0x80702c09, 0x8070296b, 0x80702070, 0x80702d8d, 0x807028e4, 0x8070247f, 0x807029f7,
0x80702dfc, 0x80702855, 0x80702170, 0x807028f1, 0x80702d6b, 0x80702c05, 0x80702206, 0x80702ae4,
0x80702ba7, 0x8070232b, 0x80702e50, 0x807024ef, 0x8070216a, 0x8070205d, 0x807021c1, 0x80702059,
0x80702df8, 0x807024f0, 0x80702df0, 0x80702486, 0x807021ff, 0x80702074, 0x80702f91, 0x807028e5,
0x80702293, 0x8070248b, 0x80702ed5, 0x80702138, 0x80702841, 0x807020e1, 0x80702d8f, 0x8070207c,
0x80702c68, 0x807024e2, 0x80702539, 0x80702ebc, 0x8070273b, 0x8070258c, 0x80702ad2, 0x8070214f,
0x80702955, 0x80702020, 0x807029f2, 0x80702273, 0x80702c34, 0x80702b4e, 0x8070256a, 0x80702dd9,
0x80702c3d, 0x80702dec, 0x80702a97, 0x80702813, 0x80702647, 0x80702ae3, 0x80702099, 0x807020c4,
0x80702ef5, 0x8070293f, 0x80702150, 0x80702eb9, 0x807024e0, 0x80702550, 0x807022a4, 0x80702517,
0x807029fa, 0x80702470, 0x807026cc, 0x80702028, 0x80702cfb, 0x80702297, 0x80702937, 0x8070232c,
0x80702247, 0x80702042, 0x80702e5a, 0x80702735, 0x80702efa, 0x80702c8d, 0x80702136, 0x807023cf,
0x807029cc, 0x807024fb, 0x80702ae9, 0x80702ea6, 0x80702938, 0x807025a7, 0x8070246c, 0x80702d69,
0x80702249, 0x807027ff, 0x80702cab, 0x807026d7, 0x80702c0d, 0x8070254e, 0x80702301, 0x80702d7a,
0x80702dd5, 0x80702a11, 0x80702af6, 0x80702730, 0x80702aa2, 0x80702c75, 0x807029bb, 0x80702fa7,
0x80702210, 0x80702d95, 0x807023e4, 0x8070245d, 0x8070241e, 0x807026fa, 0x80702af5, 0x807026f3,
0x80702bae, 0x80702afe, 0x80702b84, 0x80702114, 0x807028f3, 0x80702572, 0x80702b5f, 0x807026d2,
0x807023f9, 0x80702abc, 0x807020da, 0x80702679, 0x80702cae, 0x807029b9, 0x8070285f, 0x80702393,
0x807027d6, 0x80702e4b, 0x80702c91, 0x80702dd3, 0x80702823, 0x807027dc, 0x80702d66, 0x80702271,
0x80702f57, 0x80702fb6, 0x80702346, 0x80702b4f, 0x80702d23, 0x8070259f, 0x807027ae, 0x80702e12,
0x80702482, 0x8070209f, 0x8070232d, 0x80702417, 0x807021e7, 0x807025bd, 0x80702ae1, 0x80702cdc,
0x8070256e, 0x807029dc, 0x807022ec, 0x8070242d, 0x80702076, 0x8070262d, 0x80702ab7, 0x80702d29,
0x807022c0, 0x80702581, 0x80702d20, 0x80702334, 0x807023fe, 0x80702f68, 0x807027f8, 0x80702892,
0x80702df3, 0x80702e6b, 0x80702940, 0x80702573, 0x80702146, 0x80702ac7, 0x807022e7, 0x807022ac,
0x807022bc, 0x8070276f, 0x807020a4, 0x807025a9, 0x80702224, 0x807021db, 0x807026a7, 0x80702fa1,
0x8070267f, 0x80702b12, 0x80702eff, 0x80702298, 0x80702c4e, 0x80702274, 0x80702fc7, 0x8070230d,
0x80702941, 0x80702bb7, 0x807023dc, 0x8070282c, 0x80702d90, 0x80702418, 0x8070282f, 0x80702374,
0x8070221f, 0x80702097, 0x807021ce, 0x807028bd, 0x80702ec1, 0x80702283, 0x807022d2, 0x807024ff,
0x807023a2, 0x807028dd, 0x8070238e, 0x807027dd, 0x8070221d, 0x80702388, 0x8070275d, 0x80702f5e,
0x80702cf6, 0x80702137, 0x8070241f, 0x80702ecf, 0x8070256b, 0x80702d2d, 0x80702339, 0x807028c5,
0x807024c7, 0x80702420, 0x80702795, 0x807023b6, 0x80702a43, 0x80702bf3, 0x807029bf, 0x80702fda,
0x8070253c, 0x80702aa6, 0x8070274b, 0x80702fa4, 0x80702a27, 0x80702796, 0x807025d3, 0x807020f9,
0x807027bb, 0x8070284c, 0x8070278f, 0x80702584, 0x8070255c, 0x80702747, 0x80702c33, 0x80702db3,
0x807021dc, 0x80702b5c, 0x8070282d, 0x80702ab9, 0x80702ee2, 0x807026c6, 0x80702aa3, 0x80702ce8,
0x80702d96, 0x8070268b, 0x80702beb, 0x8070288e, 0x80702a7f, 0x8070291b, 0x807023a3, 0x80702ff9,
0x807022a9, 0x8070288f, 0x807029b7, 0x807020b8, 0x807028d9, 0x807023de, 0x807022cc, 0x807027a8,
0x807029ef, 0x80702aa7, 0x807028f6, 0x80702b6b, 0x80702eb5, 0x80702649, 0x807021e6, 0x8070252b,
0x8070276c, 0x80702ec4, 0x80702b60, 0x80702faf, 0x80702e63, 0x80702c50, 0x807025d1, 0x80702285,
0x80702d2f, 0x80702e37, 0x807024d9, 0x80702898, 0x807028f7, 0x80702135, 0x807021e1, 0x80702686,
0x807020c1, 0x80702ffa, 0x80702198, 0x8070261c, 0x80702b13, 0x80702e99, 0x80702878, 0x807022c4,
0x80702bd1, 0x8070232f, 0x8070274d, 0x80702672, 0x80702daa, 0x80702c15, 0x80702b9b, 0x80702dd4,
0x80702972, 0x807027d7, 0x80702889, 0x807029af, 0x80702884, 0x807029d6, 0x807021f3, 0x80702d1a,
0x80702b2a, 0x80702232, 0x807022b4, 0x80702498, 0x80702bef, 0x80702e3a, 0x80702327, 0x807023d5,
0x80702fd2, 0x8070247d, 0x80702a56, 0x80702692, 0x80702d12, 0x8070213c, 0x80702719, 0x807020e4,
0x807029f8, 0x80702849, 0x807021bd, 0x80702560, 0x80702c2c, 0x80702782, 0x80702344, 0x807025b8,
0x80702328, 0x8070240e, 0x80702444, 0x80702dc5, 0x80702250, 0x80702751, 0x807024f5, 0x80702f92,
0x80702354, 0x80702a89, 0x80702c5f, 0x80702903, 0x80702842, 0x8070283d, 0x80702362, 0x80702912,
0x80702e70, 0x8070260b, 0x807021d5, 0x80702978, 0x80702812, 0x80702030, 0x8070272e, 0x80702733,
0x80702139, 0x80702c8c, 0x80702b20, 0x80702fbd, 0x80702047, 0x80702565, 0x80702cad, 0x80702276,
0x80702053, 0x8070274f, 0x80702cdd, 0x80702f13, 0x807026d0, 0x80702919, 0x807023a4, 0x80702125,
0x80702d79, 0x80702df1, 0x80702b0b, 0x80702432, 0x80702496, 0x80702cf3, 0x80702b50, 0x80702f4a,
0x8070271d, 0x80702d4b, 0x8070218c, 0x8070284d, 0x807020d5, 0x80702939, 0x8070216d, 0x807021da,
0x80702eb6, 0x80702553, 0x8070201b, 0x80702f38, 0x80702c06, 0x80702f60, 0x807027b8, 0x8070268d,
0x807029a8, 0x80702b00, 0x8070221a, 0x80702853, 0x8070261d, 0x807027ee, 0x80702103, 0x80702da5,
0x8070241a, 0x80702500, 0x807023d4, 0x80702b1c, 0x80702490, 0x80702bfa, 0x80702746, 0x80702373,
0x80702bb5, 0x8070298b, 0x807027f9, 0x807027ef, 0x80702379, 0x807026b3, 0x8070286c, 0x8070287d,
0x80702711, 0x80702717, 0x80702457, 0x807028ee, 0x80702b9d, 0x807029d5, 0x80702e56, 0x807025da,
0x80702435, 0x80702774, 0x807024be, 0x80702349, 0x80702726, 0x80702141, 0x807021c4, 0x80702319,
0x80702e97, 0x807028cd, 0x80702839, 0x80702237, 0x80702f69, 0x807026e0, 0x807026ae, 0x80702ee7,
0x807024b2, 0x8070262e, 0x80702942, 0x80702750, 0x80702f0e, 0x80702fb3, 0x80702bfc, 0x80702a42,
0x80702964, 0x80702859, 0x807022ad, 0x80702157, 0x80702ba8, 0x80702665, 0x8070239e, 0x80702cf4,
0x80702148, 0x80702a10, 0x80702d87, 0x80702259, 0x80702341, 0x80702c62, 0x807025e7, 0x8070266d,
0x80702a5d, 0x80702c3f, 0x807021c2, 0x8070296c, 0x80702ef9, 0x80702950, 0x807020a8, 0x80702c6c,
0x80702533, 0x80702b85, 0x8070262f, 0x807029ac, 0x80702b6a, 0x8070220b, 0x807021e9, 0x80702737,
0x807027ea, 0x80702989, 0x80702fab, 0x80702cbf, 0x807029fd, 0x80702edb, 0x807023b3
},
{
0x00000000, 0x80704c83, 0x807047a1, 0x80704597, 0x807046f2, 0x807040fa, 0x80704dce, 0x80704c84,
0x8070402d, 0x807043ee, 0x80704790, 0x80704c01, 0x807043da, 0x807043b1, 0x80704209, 0x80704e96,
0x80704f0f, 0x8070461e, 0x80704965, 0x807046f8, 0x80704016, 0x807045ff, 0x80704ae5, 0x807045f9,
0x807042dc, 0x8070403b, 0x80704015, 0x80704a69, 0x80704db8, 0x80704827, 0x807046cd, 0x8070401c,
0x80704b30, 0x807046de, 0x80704e6d, 0x80704f7f, 0x80704079, 0x807042b3, 0x80704803, 0x807049a9,
0x807040af, 0x80704294, 0x80704d94, 0x807046c4, 0x807047e2, 0x80704510, 0x80704bbb, 0x807041d3,
0x80704b26, 0x8070455f, 0x807040e2, 0x807044a2, 0x80704f12, 0x80704982, 0x80704acf, 0x8070428a,
0x807046f1, 0x80704f6c, 0x8070499a, 0x80704b5e, 0x807041fd, 0x8070444f, 0x80704d59, 0x807043d9,
0x80704c08, 0x807049a3, 0x807049d8, 0x80704c85, 0x8070448e, 0x80704869, 0x80704bf9, 0x80704473,
0x80704d07, 0x8070465b, 0x8070429a, 0x80704872, 0x80704416, 0x807041e8, 0x807040c0, 0x8070449d,
0x8070470c, 0x80704ecc, 0x80704fcc, 0x80704a09, 0x807043a9, 0x80704089, 0x80704be3, 0x80704f9a,
0x80704efc, 0x80704a00, 0x807048c2, 0x80704a26, 0x80704fee, 0x807047d5, 0x80704a9e, 0x80704a05,
0x80704140, 0x8070428c, 0x807048fc, 0x807047e8, 0x80704f3a, 0x80704376, 0x80704a65, 0x80704b15,
0x80704af4, 0x807048d3, 0x80704066, 0x80704331, 0x80704931, 0x807041e0, 0x80704eec, 0x80704b2e,
0x80704c67, 0x80704511, 0x80704f86, 0x807047a9, 0x80704610, 0x807048e3, 0x80704313, 0x807044bc,
0x80704e6e, 0x80704336, 0x80704e7f, 0x80704d61, 0x8070483c, 0x8070465c, 0x80704f0d, 0x807042e8,
0x80704cf2, 0x807046ce, 0x80704b89, 0x80704f7e, 0x80704c13, 0x807048ba, 0x80704f3d, 0x807043ca,
0x807042f8, 0x80704df4, 0x80704de9, 0x80704df2, 0x807046b6, 0x80704b8d, 0x80704261, 0x80704863,
0x8070405e, 0x80704258, 0x80704c96, 0x80704979, 0x807044f8, 0x80704b38, 0x8070407a, 0x80704548,
0x807049cd, 0x80704b8a, 0x80704aaf, 0x80704cf7, 0x80704d03, 0x8070479c, 0x80704fed, 0x80704167,
0x8070466b, 0x80704e3b, 0x80704be5, 0x80704e10, 0x80704355, 0x80704a74, 0x80704e4e, 0x80704e64,
0x80704bad, 0x80704ffc, 0x80704977, 0x80704122, 0x8070491e, 0x80704547, 0x80704865, 0x807045fa,
0x807044db, 0x80704574, 0x8070447c, 0x8070435d, 0x80704b24, 0x80704540, 0x8070439b, 0x80704ba6,
0x80704f73, 0x8070440f, 0x80704394, 0x80704fef, 0x807044a9, 0x807043c6, 0x80704ca2, 0x8070460a,
0x80704b2f, 0x80704cdb, 0x80704e81, 0x807044bd, 0x80704b93, 0x80704866, 0x80704589, 0x80704cb7,
0x80704eb1, 0x807042ea, 0x80704244, 0x8070467a, 0x80704ff6, 0x8070443b, 0x8070448a, 0x80704558,
0x80704d48, 0x80704906, 0x80704f21, 0x8070474a, 0x80704732, 0x80704454, 0x80704bfb, 0x80704bc2,
0x807042df, 0x8070480a, 0x80704e8c, 0x807048c6, 0x8070426f, 0x80704a37, 0x80704441, 0x80704606,
0x807043c7, 0x80704b8b, 0x8070472f, 0x80704e79, 0x8070490f, 0x80704df5, 0x8070435e, 0x807045fb,
0x80704b6d, 0x80704455, 0x80704448, 0x807046df, 0x8070461b, 0x8070470d, 0x80704262, 0x80704f80,
0x8070411b, 0x80704d09, 0x80704c98, 0x80704b3f, 0x80704bcf, 0x80704e55, 0x80704b4d, 0x807045b6,
0x80704b5d, 0x80704e11, 0x80704731, 0x807045b7, 0x8070412d, 0x807049e0, 0x8070434c, 0x80704043,
0x80704b6e, 0x80704921, 0x80704000, 0x80704cf0, 0x807046fc, 0x80704f9b, 0x80704fc4, 0x80704d88,
0x80704443, 0x80704cc0, 0x807040e3, 0x80704956, 0x80704e22, 0x80704295, 0x80704c66, 0x80704175,
0x80704ae0, 0x807049c6, 0x80704840, 0x807044a3, 0x807042e9, 0x807044ae, 0x80704648, 0x807044d8,
0x80704f84, 0x80704ce6, 0x80704305, 0x8070422f, 0x80704e24, 0x807048d4, 0x80704ed4, 0x807049f1,
0x8070428e, 0x807049ee, 0x807048f8, 0x80704dc3, 0x807042b1, 0x80704c6f, 0x80704e3e, 0x80704eb3,
0x80704575, 0x8070490b, 0x8070415b, 0x80704ddf, 0x80704c3c, 0x80704569, 0x80704370, 0x80704f65,
0x80704ef4, 0x80704fbb, 0x807040e0, 0x807049e9, 0x80704288, 0x80704687, 0x807048d7, 0x8070429b,
0x807045d5, 0x80704dea, 0x80704791, 0x80704ab0, 0x807045f7, 0x80704c92, 0x8070493d, 0x80704474,
0x80704958, 0x80704d86, 0x80704351, 0x807048c9, 0x80704661, 0x8070431d, 0x80704bce, 0x80704927,
0x80704b33, 0x80704b87, 0x807042bf, 0x80704414, 0x8070481e, 0x8070445c, 0x807047bf, 0x807042b9,
0x8070446e, 0x807045a3, 0x80704335, 0x80704a86, 0x80704ea9, 0x80704cc1, 0x8070435f, 0x80704d08,
0x80704352, 0x807045a8, 0x807049ca, 0x80704b7a, 0x80704a4a, 0x80704b86, 0x8070449a, 0x807043db,
0x8070485d, 0x80704e8f, 0x8070422e, 0x80704709, 0x8070444d, 0x8070487c, 0x8070460f, 0x807045ef,
0x80704e98, 0x807046f5, 0x807043be, 0x80704fc5, 0x807046a6, 0x80704162, 0x80704181, 0x80704ec9,
0x8070497a, 0x80704523, 0x80704ad3, 0x807040db, 0x80704df6, 0x80704078, 0x80704c22, 0x80704861,
0x80704f4c, 0x80704ec7, 0x807040ca, 0x80704564, 0x80704673, 0x80704275, 0x807041a4, 0x807047f5,
0x80704440, 0x807047f7, 0x80704eab, 0x8070477e, 0x807042cb, 0x80704eae, 0x807043ef, 0x8070443d,
0x80704a39, 0x80704770, 0x80704f1b, 0x80704d3c, 0x80704a5e, 0x80704cf1, 0x80704a79, 0x807042be,
0x80704ca0, 0x80704ab1, 0x80704ee1, 0x807048f9, 0x80704b4b, 0x8070409e, 0x8070426d, 0x8070400b,
0x807044b0, 0x807047d0, 0x80704a5b, 0x8070420d, 0x80704799, 0x80704de7, 0x8070480d, 0x807044fe,
0x80704422, 0x8070473a, 0x80704d41, 0x80704943, 0x80704959, 0x80704c14, 0x8070471a, 0x807043a0,
0x80704b83, 0x807042fe, 0x8070470e, 0x80704f2f, 0x80704aa4, 0x80704123, 0x8070454f, 0x8070423f,
0x80704960, 0x80704191, 0x80704049, 0x80704bd0, 0x8070439d, 0x80704f78, 0x80704fd9, 0x80704360,
0x8070424a, 0x807044c4, 0x807040ec, 0x80704c6b, 0x80704b0e, 0x80704ea5, 0x807041af, 0x807049aa,
0x807045c3, 0x807048cf, 0x80704024, 0x8070472c, 0x807042ff, 0x8070431e, 0x807042fb, 0x80704eb4,
0x807043c4, 0x8070455b, 0x8070409d, 0x80704476, 0x807042c2, 0x807049b1, 0x80704c77, 0x807042eb,
0x807047df, 0x8070483f, 0x807041d4, 0x807047d8, 0x80704348, 0x80704998, 0x80704b69, 0x80704670,
0x807046cf, 0x80704975, 0x80704296, 0x807041c7, 0x807044fd, 0x80704d2c, 0x80704836, 0x80704c1a,
0x8070415f, 0x80704100, 0x8070479d, 0x80704e2e, 0x807045bf, 0x80704d99, 0x807043fc, 0x80704d47,
0x807047b2, 0x80704a5c, 0x80704b70, 0x80704551, 0x807040a1, 0x80704a4b, 0x80704753, 0x80704773,
0x80704c19, 0x807046a9, 0x80704a18, 0x80704332, 0x80704da1, 0x8070470f, 0x80704475, 0x80704faa,
0x80704b4a, 0x80704daf, 0x80704f3f, 0x80704db6, 0x8070449c, 0x807044e4, 0x80704b0c, 0x80704f5c,
0x80704f5f, 0x807049d3, 0x80704f1e, 0x8070431f, 0x80704dc1, 0x80704e2f, 0x80704d0d, 0x80704cbb,
0x807047e6, 0x8070422b, 0x807046a3, 0x807047b9, 0x807040de, 0x80704057, 0x80704d62, 0x80704883,
0x8070424f, 0x80704340, 0x807041ae, 0x8070439f, 0x807048ef, 0x8070417b, 0x80704c0a, 0x80704180,
0x80704ac4, 0x80704f79, 0x807045c9, 0x80704243, 0x80704361, 0x80704dc9, 0x80704538, 0x80704153,
0x80704ce5, 0x80704ea2, 0x80704c44, 0x80704a2b, 0x80704442, 0x80704ff0, 0x807045b5, 0x80704b07,
0x807049f3, 0x80704ed8, 0x80704245, 0x80704caa, 0x8070482e, 0x80704320, 0x80704918, 0x807043b8,
0x80704419, 0x80704456, 0x8070423b, 0x80704a4d, 0x807048c8, 0x80704d49, 0x807042a8, 0x80704d33,
0x807049a1, 0x80704554, 0x80704838, 0x807042ab, 0x80704a20, 0x80704876, 0x80704194, 0x80704f90,
0x8070496a, 0x8070407b, 0x807049e1, 0x80704cd0, 0x80704afd, 0x8070408d, 0x80704e8e, 0x80704d3f,
0x80704b27, 0x80704a14, 0x80704995, 0x80704e87, 0x80704096, 0x8070416f, 0x807043a1, 0x807040f8,
0x80704415, 0x807041c5, 0x8070443a, 0x8070458a, 0x80704058, 0x807044e5, 0x80704c97, 0x8070420f,
0x80704678, 0x80704f1f, 0x80704fb0, 0x807045fc, 0x80704a1d, 0x8070409b, 0x80704431, 0x80704d13,
0x80704e90, 0x80704160, 0x807044b1, 0x80704a2a, 0x80704885, 0x80704485, 0x80704c74, 0x80704c25,
0x80704be1, 0x80704f47, 0x80704377, 0x80704a58, 0x80704936, 0x8070425f, 0x807047e3, 0x807049c9,
0x80704794, 0x8070452f, 0x807043a8, 0x80704bdb, 0x80704856, 0x80704da4, 0x807048af, 0x807043d2,
0x80704acc, 0x807044d6, 0x80704269, 0x80704ae6, 0x807044fa, 0x80704ba9, 0x80704436, 0x80704d63,
0x80704890, 0x807040d9, 0x807044d1, 0x807047c4, 0x80704b41, 0x80704192, 0x807047ed, 0x8070408a,
0x80704edc, 0x80704c0c, 0x807040df, 0x80704ae8, 0x80704663, 0x80704405, 0x80704f55, 0x8070458e,
0x80704378, 0x80704322, 0x80704bd8, 0x807049b6, 0x8070423c, 0x8070456f, 0x807043c8, 0x807045d9,
0x80704a82, 0x80704c2e, 0x8070484b, 0x80704e00, 0x80704571, 0x80704a60, 0x80704991, 0x8070476e,
0x807042a6, 0x80704d91, 0x80704fae, 0x80704d05, 0x80704f48, 0x80704bda, 0x807040e8, 0x80704535,
0x807040ef, 0x80704c09, 0x8070496b, 0x80704070, 0x80704d8d, 0x807048e4, 0x8070447f, 0x807049f7,
0x80704dfc, 0x80704855, 0x80704170, 0x807048f1, 0x80704d6b, 0x80704c05, 0x80704206, 0x80704ae4,
0x80704ba7, 0x8070432b, 0x80704e50, 0x807044ef, 0x8070416a, 0x8070405d, 0x807041c1, 0x80704059,
0x80704df8, 0x807044f0, 0x80704df0, 0x80704486, 0x807041ff, 0x80704074, 0x80704f91, 0x807048e5,
0x80704293, 0x8070448b, 0x80704ed5, 0x80704138, 0x80704841, 0x807040e1, 0x80704d8f, 0x8070407c,
0x80704c68, 0x807044e2, 0x80704539, 0x80704ebc, 0x8070473b, 0x8070458c, 0x80704ad2, 0x8070414f,
0x80704955, 0x80704020, 0x807049f2, 0x80704273, 0x80704c34, 0x80704b4e, 0x8070456a, 0x80704dd9,
0x80704c3d, 0x80704dec, 0x80704a97, 0x80704813, 0x80704647, 0x80704ae3, 0x80704099, 0x807040c4,
0x80704ef5, 0x8070493f, 0x80704150, 0x80704eb9, 0x807044e0, 0x80704550, 0x807042a4, 0x80704517,
0x807049fa, 0x80704470, 0x807046cc, 0x80704028, 0x80704cfb, 0x80704297, 0x80704937, 0x8070432c,
0x80704247, 0x80704042, 0x80704e5a, 0x80704735, 0x80704efa, 0x80704c8d, 0x80704136, 0x807043cf,
0x807049cc, 0x807044fb, 0x80704ae9, 0x80704ea6, 0x80704938, 0x807045a7, 0x8070446c, 0x80704d69,
0x80704249, 0x807047ff, 0x80704cab, 0x807046d7, 0x80704c0d, 0x8070454e, 0x80704301, 0x80704d7a,
0x80704dd5, 0x80704a11, 0x80704af6, 0x80704730, 0x80704aa2, 0x80704c75, 0x807049bb, 0x80704fa7,
0x80704210, 0x80704d95, 0x807043e4, 0x8070445d, 0x8070441e, 0x807046fa, 0x80704af5, 0x807046f3,
0x80704bae, 0x80704afe, 0x80704b84, 0x80704114, 0x807048f3, 0x80704572, 0x80704b5f, 0x807046d2,
0x807043f9, 0x80704abc, 0x807040da, 0x80704679, 0x80704cae, 0x807049b9, 0x8070485f, 0x80704393,
0x807047d6, 0x80704e4b, 0x80704c91, 0x80704dd3, 0x80704823, 0x807047dc, 0x80704d66, 0x80704271,
0x80704f57, 0x80704fb6, 0x80704346, 0x80704b4f, 0x80704d23, 0x8070459f, 0x807047ae, 0x80704e12,
0x80704482, 0x8070409f, 0x8070432d, 0x80704417, 0x807041e7, 0x807045bd, 0x80704ae1, 0x80704cdc,
0x8070456e, 0x807049dc, 0x807042ec, 0x8070442d, 0x80704076, 0x8070462d, 0x80704ab7, 0x80704d29,
0x807042c0, 0x80704581, 0x80704d20, 0x80704334, 0x807043fe, 0x80704f68, 0x807047f8, 0x80704892,
0x80704df3, 0x80704e6b, 0x80704940, 0x80704573, 0x80704146, 0x80704ac7, 0x807042e7, 0x807042ac,
0x807042bc, 0x8070476f, 0x807040a4, 0x807045a9, 0x80704224, 0x807041db, 0x807046a7, 0x80704fa1,
0x8070467f, 0x80704b12, 0x80704eff, 0x80704298, 0x80704c4e, 0x80704274, 0x80704fc7, 0x8070430d,
0x80704941, 0x80704bb7, 0x807043dc, 0x8070482c, 0x80704d90
},
{
0x00000000, 0x80703c83, 0x807037a1, 0x80703597, 0x807036f2, 0x807030fa, 0x80703dce, 0x80703c84,
0x8070302d, 0x807033ee, 0x80703790, 0x80703c01, 0x807033da, 0x807033b1, 0x80703209, 0x80703e96,
0x80703f0f, 0x8070361e, 0x80703965, 0x807036f8, 0x80703016, 0x807035ff, 0x80703ae5, 0x807035f9,
0x807032dc, 0x8070303b, 0x80703015, 0x80703a69, 0x80703db8, 0x80703827, 0x807036cd, 0x8070301c,
0x80703b30, 0x807036de, 0x80703e6d, 0x80703f7f, 0x80703079, 0x807032b3, 0x80703803, 0x807039a9,
0x807030af, 0x80703294, 0x80703d94, 0x807036c4, 0x807037e2, 0x80703510, 0x80703bbb, 0x807031d3,
0x80703b26, 0x8070355f, 0x807030e2, 0x807034a2, 0x80703f12, 0x80703982, 0x80703acf, 0x8070328a,
0x807036f1, 0x80703f6c, 0x8070399a, 0x80703b5e, 0x807031fd, 0x8070344f, 0x80703d59, 0x807033d9,
0x80703c08, 0x807039a3, 0x807039d8, 0x80703c85, 0x8070348e, 0x80703869, 0x80703bf9, 0x80703473,
0x80703d07, 0x8070365b, 0x8070329a, 0x80703872, 0x80703416, 0x807031e8, 0x807030c0, 0x8070349d,
0x8070370c, 0x80703ecc, 0x80703fcc, 0x80703a09, 0x807033a9, 0x80703089, 0x80703be3, 0x80703f9a,
0x80703efc, 0x80703a00, 0x807038c2, 0x80703a26, 0x80703fee, 0x807037d5, 0x80703a9e, 0x80703a05,
0x80703140, 0x8070328c, 0x807038fc, 0x807037e8, 0x80703f3a, 0x80703376, 0x80703a65, 0x80703b15,
0x80703af4, 0x807038d3, 0x80703066, 0x80703331, 0x80703931, 0x807031e0, 0x80703eec, 0x80703b2e,
0x80703c67, 0x80703511, 0x80703f86, 0x807037a9, 0x80703610, 0x807038e3, 0x80703313, 0x807034bc,
0x80703e6e, 0x80703336, 0x80703e7f, 0x80703d61, 0x8070383c, 0x8070365c, 0x80703f0d, 0x807032e8,
0x80703cf2, 0x807036ce, 0x80703b89, 0x80703f7e, 0x80703c13, 0x807038ba, 0x80703f3d, 0x807033ca,
0x807032f8, 0x80703df4, 0x80703de9, 0x80703df2, 0x807036b6, 0x80703b8d, 0x80703261, 0x80703863,
0x8070305e, 0x80703258, 0x80703c96, 0x80703979, 0x807034f8, 0x80703b38, 0x8070307a, 0x80703548,
0x807039cd, 0x80703b8a, 0x80703aaf, 0x80703cf7, 0x80703d03, 0x8070379c, 0x80703fed, 0x80703167,
0x8070366b, 0x80703e3b, 0x80703be5, 0x80703e10, 0x80703355, 0x80703a74, 0x80703e4e, 0x80703e64,
0x80703bad, 0x80703ffc, 0x80703977, 0x80703122, 0x8070391e, 0x80703547, 0x80703865, 0x807035fa,
0x807034db, 0x80703574, 0x8070347c, 0x8070335d, 0x80703b24, 0x80703540, 0x8070339b, 0x80703ba6,
0x80703f73, 0x8070340f, 0x80703394, 0x80703fef, 0x807034a9, 0x807033c6, 0x80703ca2, 0x8070360a,
0x80703b2f, 0x80703cdb, 0x80703e81, 0x807034bd, 0x80703b93, 0x80703866, 0x80703589, 0x80703cb7,
0x80703eb1, 0x807032ea, 0x80703244, 0x8070367a, 0x80703ff6, 0x8070343b, 0x8070348a, 0x80703558,
0x80703d48, 0x80703906, 0x80703f21, 0x8070374a, 0x80703732, 0x80703454, 0x80703bfb, 0x80703bc2,
0x807032df, 0x8070380a, 0x80703e8c, 0x807038c6, 0x8070326f, 0x80703a37, 0x80703441, 0x80703606,
0x807033c7, 0x80703b8b, 0x8070372f, 0x80703e79, 0x8070390f, 0x80703df5, 0x8070335e, 0x807035fb,
0x80703b6d, 0x80703455, 0x80703448, 0x807036df, 0x8070361b, 0x8070370d, 0x80703262, 0x80703f80,
0x8070311b, 0x80703d09, 0x80703c98, 0x80703b3f, 0x80703bcf, 0x80703e55, 0x80703b4d, 0x807035b6,
0x80703b5d, 0x80703e11, 0x80703731, 0x807035b7, 0x8070312d, 0x807039e0, 0x8070334c, 0x80703043,
0x80703b6e, 0x80703921, 0x80703000, 0x80703cf0, 0x807036fc, 0x80703f9b, 0x80703fc4, 0x80703d88,
0x80703443, 0x80703cc0, 0x807030e3, 0x80703956, 0x80703e22, 0x80703295, 0x80703c66, 0x80703175,
0x80703ae0, 0x807039c6, 0x80703840, 0x807034a3, 0x807032e9, 0x807034ae, 0x80703648, 0x807034d8,
0x80703f84, 0x80703ce6, 0x80703305, 0x8070322f, 0x80703e24, 0x807038d4, 0x80703ed4, 0x807039f1,
0x8070328e, 0x807039ee, 0x807038f8, 0x80703dc3, 0x807032b1, 0x80703c6f, 0x80703e3e, 0x80703eb3,
0x80703575, 0x8070390b, 0x8070315b, 0x80703ddf, 0x80703c3c, 0x80703569, 0x80703370, 0x80703f65,
0x80703ef4, 0x80703fbb, 0x807030e0, 0x807039e9, 0x80703288, 0x80703687, 0x807038d7, 0x8070329b,
0x807035d5, 0x80703dea, 0x80703791, 0x80703ab0, 0x807035f7, 0x80703c92, 0x8070393d, 0x80703474,
0x80703958, 0x80703d86, 0x80703351, 0x807038c9, 0x80703661, 0x8070331d, 0x80703bce, 0x80703927,
0x80703b33, 0x80703b87, 0x807032bf, 0x80703414, 0x8070381e, 0x8070345c, 0x807037bf, 0x807032b9,
0x8070346e, 0x807035a3, 0x80703335, 0x80703a86, 0x80703ea9, 0x80703cc1, 0x8070335f, 0x80703d08,
0x80703352, 0x807035a8, 0x807039ca, 0x80703b7a, 0x80703a4a, 0x80703b86, 0x8070349a, 0x807033db,
0x8070385d, 0x80703e8f, 0x8070322e, 0x80703709, 0x8070344d, 0x8070387c, 0x8070360f, 0x807035ef,
0x80703e98, 0x807036f5, 0x807033be, 0x80703fc5, 0x807036a6, 0x80703162, 0x80703181, 0x80703ec9,
0x8070397a, 0x80703523, 0x80703ad3, 0x807030db, 0x80703df6, 0x80703078, 0x80703c22, 0x80703861,
0x80703f4c, 0x80703ec7, 0x807030ca, 0x80703564, 0x80703673, 0x80703275, 0x807031a4, 0x807037f5,
0x80703440, 0x807037f7, 0x80703eab, 0x8070377e, 0x807032cb, 0x80703eae, 0x807033ef, 0x8070343d,
0x80703a39, 0x80703770, 0x80703f1b, 0x80703d3c, 0x80703a5e, 0x80703cf1, 0x80703a79, 0x807032be,
0x80703ca0, 0x80703ab1, 0x80703ee1, 0x807038f9, 0x80703b4b, 0x8070309e, 0x8070326d, 0x8070300b,
0x807034b0, 0x807037d0, 0x80703a5b, 0x8070320d, 0x80703799, 0x80703de7, 0x8070380d, 0x807034fe,
0x80703422, 0x8070373a, 0x80703d41, 0x80703943, 0x80703959, 0x80703c14, 0x8070371a, 0x807033a0,
0x80703b83, 0x807032fe, 0x8070370e, 0x80703f2f, 0x80703aa4, 0x80703123, 0x8070354f, 0x8070323f,
0x80703960, 0x80703191, 0x80703049, 0x80703bd0, 0x8070339d, 0x80703f78, 0x80703fd9, 0x80703360,
0x8070324a, 0x807034c4, 0x807030ec, 0x80703c6b, 0x80703b0e, 0x80703ea5, 0x807031af, 0x807039aa,
0x807035c3, 0x807038cf, 0x80703024, 0x8070372c, 0x807032ff, 0x8070331e, 0x807032fb, 0x80703eb4,
0x807033c4, 0x8070355b, 0x8070309d, 0x80703476, 0x807032c2, 0x807039b1, 0x80703c77, 0x807032eb,
0x807037df, 0x8070383f, 0x807031d4, 0x807037d8, 0x80703348, 0x80703998, 0x80703b69, 0x80703670,
0x807036cf, 0x80703975, 0x80703296, 0x807031c7, 0x807034fd, 0x80703d2c, 0x80703836, 0x80703c1a,
0x8070315f, 0x80703100, 0x8070379d, 0x80703e2e, 0x807035bf, 0x80703d99, 0x807033fc, 0x80703d47,
0x807037b2, 0x80703a5c, 0x80703b70, 0x80703551, 0x807030a1, 0x80703a4b, 0x80703753, 0x80703773,
0x80703c19, 0x807036a9, 0x80703a18, 0x80703332, 0x80703da1, 0x8070370f, 0x80703475, 0x80703faa,
0x80703b4a, 0x80703daf, 0x80703f3f, 0x80703db6, 0x8070349c, 0x807034e4, 0x80703b0c, 0x80703f5c,
0x80703f5f, 0x807039d3, 0x80703f1e, 0x8070331f, 0x80703dc1, 0x80703e2f, 0x80703d0d, 0x80703cbb,
0x807037e6, 0x8070322b, 0x807036a3, 0x807037b9, 0x807030de, 0x80703057, 0x80703d62, 0x80703883,
0x8070324f, 0x80703340, 0x807031ae, 0x8070339f, 0x807038ef, 0x8070317b, 0x80703c0a, 0x80703180,
0x80703ac4, 0x80703f79, 0x807035c9, 0x80703243, 0x80703361, 0x80703dc9, 0x80703538, 0x80703153,
0x80703ce5, 0x80703ea2, 0x80703c44, 0x80703a2b, 0x80703442, 0x80703ff0, 0x807035b5, 0x80703b07,
0x807039f3, 0x80703ed8, 0x80703245, 0x80703caa, 0x8070382e, 0x80703320, 0x80703918, 0x807033b8,
0x80703419, 0x80703456, 0x8070323b, 0x80703a4d, 0x807038c8, 0x80703d49, 0x807032a8, 0x80703d33,
0x807039a1, 0x80703554, 0x80703838, 0x807032ab, 0x80703a20, 0x80703876, 0x80703194, 0x80703f90,
0x8070396a, 0x8070307b, 0x807039e1, 0x80703cd0, 0x80703afd, 0x8070308d, 0x80703e8e, 0x80703d3f,
0x80703b27, 0x80703a14, 0x80703995, 0x80703e87, 0x80703096, 0x8070316f, 0x807033a1, 0x807030f8,
0x80703415, 0x807031c5, 0x8070343a, 0x8070358a, 0x80703058, 0x807034e5, 0x80703c97, 0x8070320f,
0x80703678, 0x80703f1f, 0x80703fb0, 0x807035fc, 0x80703a1d, 0x8070309b, 0x80703431, 0x80703d13,
0x80703e90, 0x80703160, 0x807034b1, 0x80703a2a, 0x80703885, 0x80703485, 0x80703c74, 0x80703c25,
0x80703be1, 0x80703f47, 0x80703377, 0x80703a58, 0x80703936, 0x8070325f, 0x807037e3, 0x807039c9,
0x80703794, 0x8070352f, 0x807033a8, 0x80703bdb, 0x80703856, 0x80703da4, 0x807038af, 0x807033d2,
0x80703acc, 0x807034d6, 0x80703269, 0x80703ae6, 0x807034fa, 0x80703ba9, 0x80703436, 0x80703d63,
0x80703890, 0x807030d9, 0x807034d1, 0x807037c4, 0x80703b41, 0x80703192, 0x807037ed, 0x8070308a,
0x80703edc, 0x80703c0c, 0x807030df, 0x80703ae8, 0x80703663, 0x80703405, 0x80703f55, 0x8070358e,
0x80703378, 0x80703322, 0x80703bd8, 0x807039b6, 0x8070323c, 0x8070356f, 0x807033c8, 0x807035d9,
0x80703a82, 0x80703c2e, 0x8070384b, 0x80703e00, 0x80703571, 0x80703a60, 0x80703991, 0x8070376e,
0x807032a6, 0x80703d91, 0x80703fae, 0x80703d05, 0x80703f48, 0x80703bda, 0x807030e8, 0x80703535,
0x807030ef, 0x80703c09, 0x8070396b, 0x80703070, 0x80703d8d, 0x807038e4, 0x8070347f, 0x807039f7,
0x80703dfc, 0x80703855, 0x80703170, 0x807038f1, 0x80703d6b, 0x80703c05, 0x80703206, 0x80703ae4,
0x80703ba7, 0x8070332b, 0x80703e50, 0x807034ef, 0x8070316a, 0x8070305d, 0x807031c1
}
};
const std::vector<std::pair<uint32_t, uint32_t> > NameIdMap = [] {
std::vector<std::pair<uint32_t, uint32_t> > v(0x10000, {0, 0});
for (uint32_t i = 0; i < NameIdList.size(); ++i) {
for (uint32_t j = 0; j < NameIdList[i].size(); ++j) {
v[NameIdList[i][j] & 0xffff] = {i, j};
}
}
return v;
}();
const std::vector<uint32_t> NameIdListLen{718, 1190, 884, 702};
const std::vector<std::vector<std::string> > NameStringList{
{
"","こうた","さくじろう","ももか","はるき","かんきち","あかり","テル",
"ルナ","ジェッソン","カツーン","ロッチェル","ジェモリ","アカシ","オーロ","クイン",
"ウィード","ジェミニ","マッド","ミーティア","モリオン","ピヨ","クレオメ","ポイズ",
"パララ","ナップ","プリンツ","カネコ","リラ","ジェモリ","ドーロ","バスーラ",
"アルジェント","ローザ","レプス","フェーロ","ピクシス","パティ","やすお","まおう",
"エリアーノ","プリンツ","カリーナ","ポンヌせいじん","ワカバ","アラタ","モエ","タケル",
"ピーノ","キーノ","モンド","アオイ","シズク","マリン","ナギ","ナミ",
"クラマ","ボン","ヒトミ","セレナ","ツキノ","モモチ","サリー","クロ",
"ヴィクター","カエデ","アンズ","コノハ","メリー","スズ","リース","マルモ",
"キンジ","ギンジ","トルテ","ラズベル","ネーブル","アピス","ハニー","ペロ",
"タロー","ジロー","サブロー","カール","マツリ","ハヅキ","ベニ","マシュ",
"キノ","ユウト","レイト","ニーナ","ナッシュ","ナスピ","ユキノ","カイ",
"フロスト","テマリ","コウミ","ハヤテ","キララ","イブキ","ダイキ","バニラ",
"ピスタ","メル","パレット","ラパン","デイジー","キントキ","ボルト","ナット",
"アマネ","シノ","ミオ","カクタ","サンジ","マルオ","キラ","フローリィ",
"モイス","ピート","フウト","カイト","メロ","ライラ","ゴチリン","ピコ",
"リョウコ","ショウコ","ウルベエ","シンマオウ","マオウ","ミイナ","ナイト","ルフィン",
"パンチョ","シュウト","バン","カイナ","サンタ","クリス","オフク","シンゲン",
"シンネン","ハリー","ビリー","マット","ナナコ","ツキオ","ウィント","ココア",
"ミント","ショコラ","しろがねまる","こがねまる","ハルカ","ヒカリ","ビシット","モモ",
"キンタロ","ムサシ","ジョー","レイラ","アイコ","モエカ","フーラ","リオ",
"カワタロウ","イチロウ","テン","ピオーネ","ナスミ","マルーン","マジョカ","ソラ",
"ヨウジ","ケイタ","ココ","ジロウ","キョウコ","スノウ","ホリー","ミサ",
"カグラ","シンジ","ダイコク","アラレ","ユキヤ","キサラ","ケイスケ","カレン",
"ハルト","ツヅミ","マーチ","ハッチ","ショウ","ハルナ","ヒビキ","アオコ",
"ガモン","テルル","アニー","ミスター","カモメ","ミナト","ナギサ","テラ",
"トプス","レックス","メイゲツ","モッチ","ミツキ","ルージュ","キョウ","ケン",
"グラ","ギンコ","クレハ","オルカ","エリー","キャンディ","ティコ","ぽむ",
"ねこた","まとん","コハル","ラビ","こいさぶろう","あきつ","うぶきぬ","はちりょう",
"たてなし","うすかね","ひざまる","めいと","めろでぃ","はあと","カガミ","いち",
"にい","さん","よん","ごう","ろく","なな","はち","のぼる",
"ほむら","えん","あきら","てる","とうか","ひいろ","ほたる","ごろう",
"しゅうと","まなぶ","えいと","さとる","けんご","ちか","ひろと","しろう",
"だいき","ひとみ","しんじ","おきと","たかし","あんね","たくま","ねね",
"くま","すると","みけ","しろう","じゅん","ころ","ろろ","ふうた",
"めぐみ","こうだい","たいへい","ようすけ","ゆうが","りお","ひろむ","かれん",
"あられ","せっか","しずり","つばき","つらら","こゆき","ぼたん","ぱっく",
"べる","うぃんでぃ","えありー","ぴっと","くりす","じゃっく","しぃ","うるる",
"しぐれ","ゆう","しずく","うめ","いなり","そそぐ","しの","きりや",
"かんな","とる","こうき","けんたろう","れい","るみ","ふらん","すすむ",
"なぎ","はやて","しょう","いくぞう","そよ","かざみ","ふうか","さぼたん",
"まつかな","びこ","かぶと","ひぼたん","うちわ","かげろう","ぼたん","さき",
"れな","ひなた","ここみ","ゆうな","まい","あい","こなつ","ないと",
"かげちよ","さよ","かいむ","つくよ","れいら","くろと","おうま","のぞむ",
"こう","ひすい","ざくろ","るり","さんご","こはく","さぐる","かずちか",
"よしのぶ","ゆうじろう","てつや","ようた","さとる","ゆうと","ひろむ","さとる",
"じんや","かいしん","そうか","としみつ","はやか","しゅんた","たいち","マルオ",
"マルコ","マルノ","マルミ","マルエ","マルラ","マルン","マルデ","えりか",
"ゆうし","たける","まさや","そうご","まもる","ごうた","けんと","あとむ",
"ろびん","けい","すず","むさし","りんぞう","うらん","やすひろ","めいと",
"めろでぃ","はあと","みるく","るる","りりむ","りあん","ぽえむ","まりん",
"りこ","あや","えり","はる","まおまお","ひめ","れん","えど",
"そてつ","しあん","ぎる","かぶと","にこ","ゆりね","よみ","たけし",
"まさよし","ひろ","みのり","ごう","ゆたか","ひかる","やまと","まさむね",
"きよまさ","みつなり","ひであき","ただつぐ","まさゆき","よしひろ","けいじ","こむぎ",
"くるみ","りんご","あずき","めろん","まめ","なっつ","ころね","きら",
"いつき","こがね","はな","こうせい","ごうじ","せれす","りあ","てつじ",
"ひろゆき","たかのり","のぶあき","こうたろう","けんじ","じょう","ただのぶ","ほのか",
"のどか","なごみ","いやし","のぞみ","いのり","めぐみ","ここな","あいみ",
"きらり","ゆの","にーな","えりさ","まこ","ぴゅあ","あず","きたろう",
"きょうや","ゆうすけ","さだこ","かずお","ひろし","つかさ","かよこ","かいじ",
"みなと","きさらぎ","いずみ","あん","おきつぐ","あきつ","こうへい","どらこ",
"りゅういち","くうご","そら","こうすけ","おぼろ","もね","やくも","とら",
"りゅうき","ちはや","れお","たいが","ししお","こてつ","ひょうご","あやか",
"わかば","ひなの","うらら","つくし","かすみ","もえぎ","よもぎ","あいりん",
"べりぃ","ここあ","ももか","りずむ","ちぇりー","かのん","みるきぃ","りりす",
"える","のえる","みんてぃ","しすこ","のあ","みつき","れあ","はなこ",
"きく","すみれ","あおい","さくら","つばき","もも","ゆり","れい",
"そら","なみ","かおり","ひな","まひな","りこ","さや","じん",
"みちこ","けいと","みやび","しゅういち","みお","けんすけ","みこと","らん",
"すず","みかげ","りん","きみか","べる","こはな","すずの","いわまる",
"だいや","らるど","るい","かず","はるか","はんと","じん","こはく",
"ほくと","ぎんが","しゅうせい","すばる","やくも","せいや","ななせ","りんぞう",
"はじめ","りょうたろう","さくらこ","わたる","こずえ","ひでとし","くらのすけ","しずか",
"あきな","しずえ","れいか","ゆき","くみ","ひとみ","あけみ","りゅうせい",
"らいと","せんり","めい","いなさ","ごう","しでん","ひかる","せつな",
"ひびき","うた","かなめ","しおり","とおる","たまき","みづき","りりあ",
"あらん","けん","るか","じょうじ","りさ","だん","さむ","げき",
"がい","げん","だい","がん","ぶん","ぐん","だん","きゃぷてん",
"へんりー","えどわーど","しるばー","へくたー","じょん","ぴーと","ふっく","たいち",
"りく","みね","いわお","てんま","りょう","たいざん","はるもり","うぶきぬ",
"はちりょう","たてなし","うすかね","ひざまる","おもだか","つきかず","ひかず","とうこんファイヤーズ",
"<280;>特攻<281;>とっこう<282;>エースチーム","マジシャンズ","ワイルドアニマル","あしたからほんきだし<280;>隊<281;>たい<282;>","クールビューティーズ","<280;>森<281;>もり<282;>のイタズラ<280;>遊撃隊<281;>ゆうげきたい<282;>","レインドロップス","<280;>電撃<281;>でんげき<282;>ビリビリ<280;>隊<281;>たい<282;>",
"かざあなドリラー","ちくちくサボテン<280;>団<281;>だん<282;>","ファイトガールズ","<280;>暗黒<281;>あんこく<282;>のまじゅつだん","おたからドロップス","ハンマーボンバーズ","スピードレーサーズ","マルオパーティ",
"お<280;>姫<281;>ひめ<282;>さまとSPさん","<280;>鋼鉄<281;>こうてつ<282;>のブレイブ","メルヘンちゃーむ","シグナル8","どくどくゾンビーズ","デンパメン","ちいむもののふ","ウェルカムオーダーズ",
"<280;>金色<281;>こんじき<282;>のストレングス","クリティカルキング","ホワイトナイチンゲール","シグナレス8","ゴーストスナイプス","ジョーリーロジャーズ","ドラゴンチーム","<280;>猛虎愚蓮隊<281;>もうこぐれんたい<282;>",
"チューリップス","ももいろチャーム","ダークネスちゃーむ","ももいろナイチンゲール","ブラックビューティー","チーム・ドクター","ティンカーズ","<280;>漆黒<281;>しっこく<282;>の<280;>巨人<281;>きょじん<282;>",
"<280;>白虎<281;>びゃっこ<282;>シャインスターズ","マスタースピリッツ","みわくレディース","でんげきパンチ","ブラボーチーム","<280;>夕<281;>ゆう<282;>やけガンマンズ","アンテナオブザデス","レッドパイレーツ",
"グレートジャイアンツ","ラセツ八人衆","<62;>たち","電波人間たち","モンスターたち","<62;>A","<62;>B","<62;>C",
"<62;>D","<62;>E","<62;>F","<62;>G","<62;>H","<62;>I","<62;>J"
},
{
"", "あいのすけ", "あおし", "あおた", "あおと", "あきかず", "あきすけ", "あきずみ",
"あきた", "あきたか", "あきと", "あぎと", "あきとし", "あきとら", "あきなお", "あきなり",
"あきのしん", "あきのすけ", "あきひこ", "あきひさ", "あきひろ", "あきまさ", "あきよし", "あさたろう",
"あさと", "あさひと", "あさや", "あつし", "あつと", "あつとし", "あつひろ", "あつや",
"あやた", "あやたか", "あやたろう", "あやと", "あゆと", "あらし", "あらた", "あんと",
"いいひこ", "いえみつ", "いえやす", "いえよし", "いがまる", "いくえもん", "いくし", "いくぞう",
"いくま", "いくまさ", "いさく", "いさじ", "いざむ", "いしん", "いぞう", "いそろく",
"いちせい", "いちた", "いちだい", "いちたろう", "いちと", "いちのしん", "いちひろ", "いちや",
"いちろう", "いちろうた", "いつお", "いっきゅう", "いっこう", "いっしんさい", "いっせい", "いった",
"いつひと", "いっぺい", "いどむ", "いのきち", "いわお", "いわん", "うさまろ", "うしお",
"うじやす", "うしわかまる", "うたまろ", "うみたろう", "うみのすけ", "うみや", "うめじろう", "うめたろう",
"うめわかまる", "えいいち", "えいいちろう", "えいが", "えいき", "えいきち", "えいご", "えいさく",
"えいし", "えいじ", "えいしゅん", "えいじろう", "えいすけ", "えいた", "えいだい", "えいたろう",
"えいち", "えいと", "えいのすけ", "えいま", "えいや", "えつお", "えつろう", "えびぞう",
"えんぞう", "おういち", "おういちろう", "おうがい", "おうし", "おうじ", "おうしろう", "おうすけ",
"おうた", "おうや", "おおぞら", "おおや", "おさむ", "おとき", "おとや", "おとわかまる",
"おにまる", "がい", "かいお", "かいが", "かいき", "かいこう", "かいし", "かいじ",
"かいすけ", "かいせい", "かいぞう", "かいと", "がいと", "かいへい", "がくた", "がくや",
"かげあき", "かげきよ", "かげと", "かげとら", "かげひろ", "かける", "かざと", "かしお",
"かずあき", "かずお", "かずおみ", "かずき", "かずし", "かずしげ", "かずたか", "かずたけ",
"かずただ", "かずちか", "かずと", "かずとら", "かずのしん", "かずのすけ", "かずのぶ", "かずのり",
"かずはる", "かずひさ", "かずひで", "かずひと", "かずひろ", "かずふみ", "かずま", "かずまさ",
"かずみつ", "かずむ", "かずや", "かずやす", "かずゆき", "かつ", "かつあき", "かつお",
"かつじ", "かつと", "かつなり", "かつのり", "かつひこ", "かつひと", "かっぺい", "かつや",
"かつゆき", "かつよし", "かつより", "かなと", "かなや", "かぶと", "かまのすけ", "かみゅ",
"がもん", "かやと", "かんいち", "かんう", "かんきち", "かんくろう", "がんじ", "かんすけ",
"かんぞう", "かんた", "かんたろう", "かんぱち", "かんべえ", "ぎいちろう", "ぎえん", "きくたろう",
"きさぶろう", "きさんじ", "きしん", "きすけ", "きたろう", "きちえもん", "きっぺい", "きひと",
"きへい", "きみあき", "きみのぶ", "きみひろ", "きみまろ", "きゅうさく", "きゅうべえ", "きょういち",
"きょうが", "きょうき", "きょうご", "きょうじろう", "きょうすけ", "ぎょうすけ", "きょうたろう", "きょうと",
"きょうま", "きよおみ", "きよし", "きよしげ", "きよすみ", "きよた", "きよつぐ", "きよと",
"きよなり", "きよのぶ", "きよのり", "きよはる", "きよひこ", "きよひと", "きよひら", "きよふみ",
"きよま", "きよまさ", "きよまろ", "きよもり", "きりお", "きりと", "きりや", "きりゅう",
"きんえもん", "きんじろう", "ぎんじろう", "ぎんすけ", "きんたろう", "ぎんたろう", "ぎんと", "きんとき",
"ぎんとき", "きんぺい", "きんや", "くうご", "くうと", "くうや", "くえひこ", "くさぶろう",
"くすお", "くにあき", "くにお", "くにとりまる", "くにのり", "くにひで", "くにひと", "くまきち",
"くまたろう", "くまはち", "くめたろう", "くらのすけ", "くらま", "くろうど", "ぐんじ", "くんた",
"けいいち", "けいいちろう", "けいえつ", "けいご", "けいし", "けいしゅん", "けいしん", "けいすけ",
"けいた", "けいだい", "けいたろう", "けいん", "けん", "けんいち", "けんいちすけ", "けんいちろう",
"けんき", "げんき", "けんさく", "げんざぶろう", "けんじ", "げんじ", "けんしろう", "げんじろう",
"けんしん", "けんすけ", "げんすけ", "けんせい", "けんぞう", "けんた", "けんたすけ", "けんたひこ",
"げんたろう", "げんと", "げんのすけ", "けんま", "こいざぶろう", "こいちろう", "こういち", "こういちろう",
"こうう", "こうえい", "こうえつ", "こうお", "こうさく", "こうし", "こうじ", "こうしろう",
"こうじろう", "こうすけ", "ごうすけ", "こうぞう", "ごうだい", "こうたろう", "ごうたろう", "こうふ",
"こうへい", "こうめい", "こうよう", "こうりゅう", "こうわ", "ごえもん", "ごくう", "こごろう",
"こじゅうろう", "こじろう", "こすけ", "こたろう", "ことまる", "ことや", "ごへい", "これきよ",
"ごろう", "ころく", "ころすけ", "ごん", "ごんぞう", "ごんた", "ごんべえ", "さいぞう",
"さいた", "さいと", "さくいち", "さくお", "さくじ", "さくた", "さくたろう", "さくはる",
"さくへい", "ささまる", "さすけ", "さだしげ", "さだはる", "さだむ", "さだゆき", "さだよし",
"さちお", "さちと", "さちひろ", "さちや", "さとし", "さとゆき", "さとる", "さねひと",
"さのすけ", "さぶろう", "さへい", "さもん", "さるひこ", "さわお", "しいち", "じいちろう",
"じえい", "しげ", "しげあき", "しげお", "しげかず", "しげき", "しげた", "しげと",
"しげなり", "しげひこ", "しげひさ", "しげひろ", "しげまつ", "しげゆき", "しこう", "ししお",
"ししまる", "じじろう", "しちえもん", "しのすけ", "しばたろう", "しまじろう", "しゅういち", "しゅうう",
"しゅうが", "しゅうげつ", "しゅうご", "しゅうさく", "しゅうじ", "しゅうすけ", "しゅうぞう", "じゅうぞう",
"しゅうたろう", "じゅうたろう", "しゅうと", "しゅうのすけ", "しゅうへい", "しゅうべえ", "しゅうや", "しゅうわ",
"しゅんいち", "じゅんいち", "じゅんきち", "じゅんすけ", "じゅんせい", "しゅんた", "じゅんと", "じゅんのすけ",
"しゅんぺい", "しゅんま", "じゅんま", "しょうい", "しょういち", "しょうご", "じょうじ", "しょうじろう",
"しょうせい", "しょうた", "じょうた", "しょうだい", "しょうたろう", "しょうのすけ", "しょうへい", "しょうや",
"しょうりゅう", "しりゅう", "しろう", "じろう", "しん", "しんいち", "じんいち", "しんげん",
"しんご", "しんざぶろう", "しんじ", "しんじろう", "しんた", "しんたろう", "しんぱち", "じんぱち",
"しんぺい", "じんぺい", "しんめい", "しんや", "すいた", "すいと", "すけきよ", "すけろく",
"すずし", "すすむ", "すみお", "すみと", "すみはる", "すみひこ", "せいいちろう", "せいぎ",
"せいきち", "せいざぶろう", "せいじ", "せいしろう", "せいじろう", "せいしん", "せいすけ", "せいたろう",
"せいと", "せいめい", "せいよう", "せつお", "せつや", "ぜん", "せんいち", "せんいちろう",
"せんきち", "せんご", "せんと", "せんま", "そうが", "そうき", "そうけん", "そうご",
"そうじ", "そうじろう", "そうすけ", "そうせき", "そうた", "そうだい", "そうたろう", "そうと",
"そうま", "そうや", "そめごろう", "そらお", "そらき", "そらや", "たいが", "たいかい",
"だいき", "だいきち", "だいごろう", "だいさく", "たいし", "たいじゅ", "だいしょう", "たいじろう",
"だいじろう", "だいすけ", "たいち", "だいち", "たいと", "だいと", "たいよう", "たかあき",
"たかいち", "たかお", "たかおみ", "たかし", "たかちか", "たかつぐ", "たかと", "たかとし",
"たかのぶ", "たかひこ", "たかひさ", "たかひろ", "たかま", "たかみち", "たかみつ", "たかむ",
"たかや", "たかゆき", "たきお", "たくい", "たくお", "たくし", "たくすけ", "たくた",
"たくたろう", "たくと", "たくのすけ", "たくふみ", "たくま", "たくむ", "たくや", "たくろう",
"たけあき", "たけお", "たけき", "たけし", "たけじ", "たけじろう", "たけちよ", "たけとし",
"たけとも", "たけのぶ", "たけのり", "たけひさ", "たけひと", "たけひろ", "たけふみ", "たけまつ",
"たけまる", "たけみつ", "たけゆき", "たける", "たすけ", "ただあき", "ただお", "ただかつ",
"ただし", "ただすけ", "ただずみ", "ただたか", "ただつぐ", "ただのぶ", "ただみね", "ただむね",
"ただやす", "ただゆき", "たつ", "たつあき", "たつお", "たつおみ", "たつし", "たつじろう",
"たつぞう", "たっと", "たつとし", "たつなり", "たつひこ", "たつひさ", "たつひと", "たつひろ",
"たっぺい", "たつや", "たつよし", "たつろう", "たにお", "たへい", "たみひで", "たみや",
"ためきち", "たもつ", "たらお", "たろう", "ちかと", "ちかひさ", "ちかゆき", "ちずお",
"ちせい", "ちづお", "ちゃちゃまる", "ちゅうすけ", "ちょういち", "ちょうじ", "ちょうた", "つたまる",
"つとむ", "つなと", "つなよし", "つねあき", "つねお", "つねのり", "つねひと", "つねゆき",
"つねろう", "ていすけ", "ていた", "ていと", "てつ", "てつお", "てつき", "てっさい",
"てっしん", "てっしんさい", "てっせい", "てつた", "てつひさ", "てつひで", "てつひと", "てつま",
"てつや", "てつろう", "てるあき", "てるお", "てるかず", "てると", "てるとし", "てるのり",
"てるまさ", "てるみち", "てるゆき", "てるよし", "てんいち", "てんさく", "てんせい", "てんたろう",
"てんと", "てんどう", "とうじ", "とうじろう", "とうた", "とうたろう", "とうべえ", "とうま",
"とうや", "とおま", "とおる", "ときじろう", "ときつぐ", "ときと", "ときひさ", "ときむね",
"ときや", "とくひろ", "としいえ", "としお", "としき", "としぞう", "としたか", "としなり",
"としのぶ", "としまさ", "としみち", "としや", "としやす", "とみお", "とみなり", "とみひさ",
"ともかず", "ともき", "ともし", "ともたか", "ともたろう", "ともちか", "ともと", "ともなお",
"とものすけ", "とものり", "ともひで", "ともひと", "ともひろ", "ともみつ", "ともゆき", "ともよし",
"ともろう", "とよき", "とらお", "とらきち", "とらじろう", "とらひと", "なおかず", "なおざね",
"なおじろう", "なおた", "なおたか", "なおたろう", "なおと", "なおとし", "なおはる", "なおひこ",
"なおひろ", "なおま", "なおや", "ながひさ", "なぎと", "なついち", "なつお", "なつた",
"なつひと", "ななき", "なみへい", "なゆた", "なりたつ", "なりひろ", "なりゆき", "なるひと",
"にじひこ", "にじや", "にじろう", "ねんじ", "のびた", "のぶお", "のぶき", "のぶたか",
"のぶてる", "のぶなが", "のぶひで", "のぶひろ", "のぶゆき", "のぶよし", "のぼる", "のりかず",
"のりすけ", "のりひこ", "のりひと", "のりゆき", "はじめ", "はちろう", "はつま", "はつまさ",
"はなみち", "はやき", "はやたか", "はやて", "はやと", "はやとし", "はやとも", "はやぶさ",
"はゆま", "はるあき", "はるいち", "はるお", "はるかず", "はるき", "はるきよ", "はるすけ",
"はるたか", "はるたけ", "はるただ", "はるたろう", "はると", "はるとも", "はるとら", "はるなお",
"はるなり", "はるのぶ", "はるのり", "はるひこ", "はるひで", "はるま", "はるみち", "ばん",
"はんぞう", "はんた", "ばんたろう", "ひえい", "ひこぼし", "ひこまろ", "ひさあき", "ひさお",
"ひさたか", "ひさと", "ひさのぶ", "ひさのり", "ひさひろ", "ひさや", "ひさよし", "ひで",
"ひでお", "ひでき", "ひでたか", "ひでちか", "ひでと", "ひでとし", "ひでとも", "ひでなり",
"ひでのり", "ひでひさ", "ひでまさ", "ひでゆき", "ひでよし", "ひとし", "ひなと", "ひゅう",
"ひゅうが", "ひゅうま", "ひょう", "ひょうえ", "ひょうが", "ひらお", "ひろあき", "ひろかつ",
"ひろき", "ひろし", "ひろた", "ひろたか", "ひろたろう", "ひろと", "ひろなり", "ひろのぶ",
"ひろひこ", "ひろひで", "ひろまさ", "ひろみち", "ひろみつ", "ふうすけ", "ふうた", "ふうたろう",
"ふうと", "ぶきち", "ふくすけ", "ふくと", "ふくや", "ふじお", "ふじまる", "ふみたけ",
"ふみひさ", "ふみひと", "ふみや", "ふゆき", "ふゆと", "ぶんじ", "ぶんぞう", "ぶんたろう",
"ぶんや", "へいじ", "へいぞう", "へいた", "べにまる", "べんけい", "べんぞう", "ほうせい",
"まいじろう", "まいたろう", "まきと", "まさ", "まさあき", "まさお", "まさおみ", "まさかつ",
"まさかど", "まさし", "まさじ", "まさしげ", "まさた", "まさたか", "まさただ", "まさちか",
"まさと", "まさなお", "まさはる", "まさひろ", "まさみつ", "まさむね", "まさや", "まさやす",
"まさゆき", "まさゆみ", "まさよし", "まさる", "ますお", "ますじ", "またざぶろう", "まつたろう",
"まなと", "まなぶ", "まみち", "まもる", "まりお", "まれすけ", "まんじろう", "まんた",
"まんぺい", "みおと", "みかど", "みきたか", "みきたろう", "みきひこ", "みきまる", "みくや",
"みずと", "みずや", "みちお", "みちき", "みちざね", "みちた", "みちと", "みちなが",
"みちなり", "みちはる", "みちひこ", "みちひさ", "みちひと", "みちまさ", "みちろう", "みつあき",
"みつお", "みつくに", "みつたか", "みつと", "みつなが", "みつのぶ", "みつはる", "みつひこ",
"みつひさ", "みつひで", "みつひろ", "みつまさ", "みつろう", "みどう", "みなと", "みのや",
"みのる", "むが", "むがい", "むくなが", "むさし", "むさしまる", "むつお", "むつや",
"むねお", "むねじ", "むねひさ", "めいとく", "もこみち", "もときよ", "もとすけ", "もとちか",
"もとなり", "もとのぶ", "もとのり", "もとひこ", "もとひろ", "もとみち", "ももた", "ももたろう",
"もりお", "もりひこ", "もりや", "やいち", "やいちろう", "やしゃまる", "やすあき", "やすお",
"やすざぶろう", "やすし", "やすとし", "やすなり", "やすのぶ", "やすひこ", "やすひで", "やすひと",
"やすひろ", "やすま", "やすまさ", "やすや", "やすろう", "やひこ", "ゆいいちろう", "ゆいと",
"ゆいのすけ", "ゆいや", "ゆうあき", "ゆうさく", "ゆうざぶろう", "ゆうじ", "ゆうしょう", "ゆうじろう",
"ゆうしん", "ゆうすけ", "ゆうせい", "ゆうた", "ゆうだい", "ゆうと", "ゆうま", "ゆうや",
"ゆきお", "ゆきち", "ゆきつぐ", "ゆきと", "ゆきとも", "ゆきとら", "ゆきのじょう", "ゆきのしん",
"ゆきのすけ", "ゆきのぶ", "ゆきひさ", "ゆきひと", "ゆきま", "ゆきまさ", "ゆきむら", "ゆきや",
"ゆみと", "ゆめじ", "ゆめた", "よういち", "ようく", "ようじ", "ようた", "ようたろう",
"ようと", "ようへい", "よしあき", "よしいえ", "よしき", "よしくに", "よした", "よしたろう",
"よしちか", "よしつぐ", "よしつね", "よしなお", "よしのり", "よしひこ", "よしひろ", "よしまさ",
"よしみつ", "よしや", "よしろう", "よりとも", "よりひと", "らいじ", "らんたろう", "らんのすけ",
"らんぽ", "らんまる", "りきいち", "りきお", "りきじ", "りきと", "りきや", "りきゅう",
"りくたろう", "りくと", "りくのすけ", "りくひろ", "りくへい", "りくや", "りたろう", "りつし",
"りつじ", "りつたろう", "りつと", "りつま", "りゅういち", "りゅうし", "りゅうた", "りゅうだい",
"りゅうたろう", "りゅうのすけ", "りゅうへい", "りゅうほ", "りゅうほう", "りゅうま", "りゅうや", "りょうい",
"りょうえい", "りょうご", "りょうこう", "りょうじろう", "りょうすけ", "りょうた", "りょうのしん", "りょうのすけ",
"りょうふう", "りょうま", "りんいち", "りんいちろう", "りんぞう", "りんた", "りんたろう", "りんのすけ",
"りんや", "るいじ", "れいいち", "れいき", "れいし", "れいじ", "れいじろう", "れいのすけ",
"れいめい", "れんいちろう", "れんご", "れんじ", "れんじろう", "れんたろう", "れんぺい", "れんま",
"れんや", "ろくた", "ろくろう", "ろはん", "わいち", "わかおみ", "わかき", "わかぎ",
"わかと", "わかひろ", "わきち", "わさぶろう", "わしひと", "わじろう", "わたる"
},
{
"", "あい", "あいか", "あいこ", "あいさ", "あいな", "あいね", "あいの",
"あいみ", "あいら", "あいり", "あおな", "あかね", "あきえ", "あきこ", "あきな",
"あきほ", "あきよ", "あけみ", "あこ", "あさこ", "あさみ", "あずさ", "あすな",
"あすみ", "あつこ", "あつみ", "あみ", "あみか", "あみん", "あめり", "あや",
"あやか", "あやこ", "あやさ", "あやな", "あやね", "あやの", "あやは", "あやみ",
"あやめ", "あゆ", "あゆか", "あゆこ", "あゆな", "あゆみ", "あゆり", "ありあ",
"ありか", "ありさ", "ありす", "ありな", "あるる", "あん", "あんず", "あんな",
"あんり", "いおな", "いくえ", "いくこ", "いくよ", "いさな", "いすず", "いち",
"いちか", "いちこ", "いちの", "いとね", "いのり", "いばら", "いまり", "いよ",
"いりあ", "ういか", "うさ", "うさき", "うさぎ", "うた", "うたう", "うたこ",
"うたの", "うめ", "うらら", "えいか", "えいこ", "えいみ", "えこ", "えつこ",
"えな", "えまり", "えみ", "えみか", "えみこ", "えみり", "えり", "えりい",
"えりか", "えりこ", "えりさ", "えりす", "えりな", "えるな", "えれな", "おくに",
"おしん", "おとか", "おとは", "おとめ", "おりえ", "おりびあ", "おりひめ", "かえ",
"かえら", "かおり", "かおるこ", "かおん", "かぐや", "かこ", "かさね", "かずえ",
"かずこ", "かずな", "かずね", "かずは", "かずほ", "かすみ", "かずよ", "かな",
"かなえ", "かなこ", "かなは", "かなみ", "かの", "かのこ", "かのは", "かほ",
"かほり", "かや", "かやこ", "かやの", "かよ", "かよこ", "かりあ", "かりな",
"かれん", "かんな", "きえ", "きお", "きおこ", "きき", "ききょう", "きくえ",
"きくの", "きくのじょう", "きくり", "きこ", "きさ", "きな", "きなこ", "きぬ",
"きぬえ", "きぬよ", "きのこ", "きほ", "きみ", "きみえ", "きみか", "きみこ",
"きみよ", "きよ", "きょうか", "きょうこ", "きよえ", "きよか", "きよこ", "きよみ",
"きらら", "きらり", "きりえ", "きりか", "きりこ", "きわ", "きわこ", "くきこ",
"くこ", "くすえ", "くにこ", "くみ", "くみえ", "くみこ", "くめこ", "くらら",
"くりえ", "くりこ", "くるみ", "くれあ", "くれは", "くろえ", "けいか", "けいこ",
"けいな", "こあ", "こうこ", "こうみ", "こうめ", "ここあ", "ここな", "ここね",
"ここの", "ここは", "ここみ", "こずえ", "ことえ", "ことか", "ことこ", "ことな",
"ことね", "ことの", "ことは", "ことみ", "ことり", "こな", "こなみ", "このえ",
"このか", "このは", "このみ", "こはぎ", "こはな", "こはね", "こはる", "こまき",
"こまち", "こまり", "こもも", "こゆき", "こゆり", "こより", "さあや", "さいか",
"さいね", "さえか", "さえこ", "さえり", "さお", "さおり", "さき", "さきえ",
"さきか", "さきこ", "さきな", "さきの", "さきほ", "さくら", "さくらこ", "さこ",
"さざえ", "ささら", "さしゃ", "さち", "さちえ", "さちか", "さちこ", "さちほ",
"さちよ", "さと", "さとえ", "さとか", "さとこ", "さとな", "さとみ", "さな",
"さなえ", "さなみ", "さほ", "さほこ", "さや", "さやか", "さやこ", "さやな",
"さやね", "さやの", "さゆ", "さゆか", "さゆき", "さゆな", "さゆみ", "さゆり",
"さよ", "さよこ", "さより", "さら", "さらさ", "さり", "さりい", "さりな",
"さわ", "さわか", "さわこ", "しあ", "しあら", "しい", "しいか", "しいな",
"しえ", "しえな", "しえみ", "しお", "しおね", "しおり", "しきぶ", "しげみ",
"しげよ", "しずえ", "しずか", "しずこ", "しずな", "しずほ", "しずよ", "しづき",
"しほ", "しほこ", "しほり", "しまこ", "しゃな", "しゅうか", "しゅうこ", "じゅな",
"じゅの", "じゅり", "じゅりあ", "じゅりな", "じゅんこ", "じゅんな", "しょうこ", "しらゆき",
"しんじゅ", "すいれん", "すぎの", "すず", "すずか", "すずこ", "すずな", "すずね",
"すずの", "すずは", "すずめ", "すずらん", "すなこ", "すまこ", "すみ", "すみえ",
"すみか", "すみこ", "すみれ", "すもも", "すわこ", "せあら", "せいあ", "せいか",
"せいこ", "せいな", "せいね", "せいら", "せつこ", "せつの", "せつよ", "せりあ",
"せりか", "せりな", "せれな", "そあら", "そうこ", "そな", "その", "そのえ",
"そのか", "そのこ", "そのみ", "そのり", "そめこ", "そよ", "そよか", "そよこ",
"たいこ", "たえ", "たえこ", "たかえ", "たかこ", "たかよ", "たつえ", "たにえ",
"たまえ", "たまこ", "たまみ", "たみえ", "たみこ", "たみよ", "たよこ", "だりあ",
"ちえ", "ちえこ", "ちえの", "ちえみ", "ちえり", "ちおり", "ちか", "ちかげ",
"ちかこ", "ちかの", "ちぐさ", "ちこ", "ちさ", "ちさき", "ちさこ", "ちず",
"ちずえ", "ちせ", "ちづこ", "ちづる", "ちどり", "ちな", "ちなみ", "ちの",
"ちはぎ", "ちはな", "ちはる", "ちふゆ", "ちほ", "ちまこ", "ちゆき", "ちよ",
"ちよえ", "ちよこ", "ちよの", "ちより", "ちわこ", "つき", "つきか", "つきこ",
"つきの", "つきみ", "つくし", "つぐみ", "つたえ", "つづみ", "つね", "つばき",
"つぼみ", "つゆか", "つゆこ", "ていこ", "てつこ", "てまり", "てるこ", "てるみ",
"とあ", "とうか", "とうこ", "とき", "ときこ", "ときね", "としえ", "としこ",
"としほ", "とみこ", "ともえ", "ともか", "ともこ", "ともな", "ともは", "ともみ",
"ともよ", "ともり", "とわこ", "なえ", "なおえ", "なおか", "なおこ", "なおみ",
"なこ", "なずな", "なつか", "なつこ", "なつたろう", "なつね", "なつは", "なつほ",
"なつみ", "なでしこ", "なな", "ななえ", "ななか", "ななこ", "ななは", "ななほ",
"なの", "なのか", "なのは", "なほ", "なほこ", "なみ", "なみえ", "なみこ",
"なるこ", "にいな", "にか", "にこ", "にちか", "にな", "ねいろ", "ねね",
"ねねこ", "のえ", "のえこ", "のぎく", "のどか", "のの", "ののか", "ののこ",
"ののは", "のばら", "のぶえ", "のぶこ", "のぶよ", "のりえ", "のりか", "のりこ",
"はすみ", "はつえ", "はつね", "はつみ", "はな", "はなえ", "はなか", "はなこ",
"はなの", "はなみ", "はの", "はのん", "はるあ", "はるえ", "はるこ", "はるな",
"はるね", "はるの", "はるほ", "はるよ", "はんな", "ひいな", "ひおな", "ひおり",
"ひかり", "ひさえ", "ひさこ", "ひさな", "ひでこ", "ひでみ", "ひとみ", "ひな",
"ひなか", "ひなこ", "ひなの", "ひなみ", "ひなり", "ひふみ", "ひまり", "ひまわり",
"ひめ", "ひめか", "ひめな", "ひめの", "ひめり", "ひめる", "ひよ", "ひより",
"ひらり", "ひろえ", "ひろか", "ひろこ", "ひろな", "ふうか", "ふうこ", "ふうな",
"ふきこ", "ふさえ", "ふじこ", "ふね", "ふみ", "ふみえ", "ふみか", "ふみこ",
"ふみな", "ふみの", "ふゆか", "ふゆな", "ほうこ", "ぼたん", "ほなみ", "ほの",
"ほのか", "ほのみ", "ほのり", "ぽぷり", "まあさ", "まあち", "まあや", "まい",
"まいか", "まいこ", "まいな", "まいみ", "まおり", "まかな", "まきこ", "まきな",
"まさえ", "まさこ", "まさよ", "まちこ", "まつこ", "まな", "まなえ", "まなか",
"まなは", "まなみ", "まはな", "まひな", "まほ", "まみ", "まみこ", "まや",
"まゆ", "まゆう", "まゆか", "まゆこ", "まゆな", "まゆみ", "まゆり", "まよ",
"まり", "まりあ", "まりい", "まりえ", "まりか", "まりこ", "まりさ", "まりな",
"まりの", "まりん", "みあ", "みあか", "みい", "みいこ", "みいな", "みう",
"みえ", "みえこ", "みお", "みおか", "みおこ", "みおな", "みおり", "みか",
"みかこ", "みかさ", "みきえ", "みきこ", "みく", "みくり", "みこ", "みここ",
"みさ", "みさこ", "みさと", "みずえ", "みずか", "みすず", "みずは", "みずほ",
"みその", "みそら", "みちか", "みちこ", "みちよ", "みつえ", "みつこ", "みつよ",
"みな", "みなこ", "みなも", "みのり", "みはな", "みはね", "みふゆ", "みほ",
"みほこ", "みみ", "みやこ", "みゆ", "みゆう", "みゆか", "みゆな", "みゆり",
"みよ", "みよこ", "みり", "みりあ", "みれい", "みわ", "みわこ", "むつみ",
"めい", "めいか", "めいこ", "めいさ", "めいな", "めいみ", "めぐ", "めぐみ",
"もあな", "もえ", "もえか", "もえこ", "もえな", "もえみ", "もこ", "もとこ",
"もな", "もなみ", "もにか", "もね", "もも", "ももあ", "ももえ", "ももか",
"ももこ", "ももな", "ももね", "ももの", "ももは", "ももみ", "ももよ", "もゆ",
"もよこ", "もわ", "やえ", "やえこ", "やすえ", "やすこ", "やすよ", "ややこ",
"やよい", "ゆあ", "ゆい", "ゆいか", "ゆいこ", "ゆいな", "ゆいね", "ゆいの",
"ゆいは", "ゆうあ", "ゆうか", "ゆうこ", "ゆうな", "ゆうね", "ゆうの", "ゆうは",
"ゆえ", "ゆか", "ゆかこ", "ゆかな", "ゆかり", "ゆきえ", "ゆきか", "ゆきこ",
"ゆきな", "ゆきね", "ゆきの", "ゆきは", "ゆきほ", "ゆきみ", "ゆずか", "ゆずき",
"ゆずな", "ゆずの", "ゆずは", "ゆずほ", "ゆな", "ゆの", "ゆみ", "ゆみか",
"ゆみこ", "ゆめ", "ゆめか", "ゆめこ", "ゆめな", "ゆめの", "ゆり", "ゆりあ",
"ゆりえ", "ゆりか", "ゆりこ", "ゆりな", "ゆりね", "ゆりの", "ようか", "ようこ",
"よしえ", "よしか", "よしこ", "よしの", "よりこ", "らいら", "らうら", "らな",
"らら", "らんこ", "りあ", "りあな", "りい", "りいさ", "りいな", "りえ",
"りえこ", "りおこ", "りおな", "りか", "りかこ", "りこ", "りさ", "りさこ",
"りず", "りせ", "りっか", "りつこ", "りな", "りなこ", "りね", "りのあ",
"りのか", "りほ", "りみ", "りゆ", "りよ", "りょうか", "りょうこ", "りら",
"りり", "りりあ", "りりい", "りりか", "りりこ", "りりな", "りりむ", "りんか",
"りんこ", "りんな", "るうな", "るな", "るみ", "るみこ", "るりか", "るりこ",
"れあ", "れいあ", "れいか", "れいこ", "れいさ", "れいな", "れいね", "れいみ",
"れいら", "れおな", "れな", "れね", "れみ", "れんか", "れんげ", "ろこ",
"ろみ", "わかこ", "わかな", "わかめ", "わこ"
},
{
"", "あいむ", "あいる", "あお", "あおい", "あおの", "あおば", "あおみ",
"あかつき", "あき", "あきの", "あきは", "あきひ", "あきら", "あくあ", "あくび",
"あぐり", "あげは", "あけび", "あさ", "あさか", "あさき", "あさぎ", "あさひ",
"あざみ", "あじゃり", "あじゅ", "あしゅら", "あしゅり", "あず", "あすか", "あずき",
"あすま", "あずみ", "あすら", "あたる", "あつき", "あど", "あとむ", "あのん",
"あひる", "あまね", "あむ", "あやせ", "あゆむ", "あゆら", "あられ", "あり",
"ありお", "ある", "あると", "あれん", "あんじ", "あんじゅ", "いお", "いおり",
"いおん", "いきる", "いく", "いくお", "いくと", "いくみ", "いくむ", "いくら",
"いさお", "いさき", "いさみ", "いさむ", "いざや", "いざよい", "いさり", "いすみ",
"いずみ", "いずむ", "いずも", "いずる", "いたる", "いちき", "いちご", "いちは",
"いちよう", "いちる", "いちろ", "いつき", "いっさ", "いと", "いとし", "いとは",
"いなり", "いぶき", "いぶみ", "いまる", "いりや", "いるか", "いろは", "うい",
"うきょう", "うこん", "うちゅう", "うてな", "うの", "うみ", "うゆう", "うり",
"うるう", "うるる", "えいす", "えと", "えにし", "えま", "えみる", "えむ",
"えりざべす", "える", "えるも", "えれん", "おうか", "おうが", "おうじゅ", "おうる",
"おと", "おぼろ", "おりと", "かい", "がいあ", "かいや", "かいり", "かえで",
"かえる", "かお", "かおる", "かかお", "かがみ", "かがり", "かぐら", "かげろう",
"かごめ", "かざね", "かざみ", "かじゅ", "かずさ", "かずちよ", "かずひ", "かずみ",
"かせつ", "かたる", "かづき", "かっぱ", "かつみ", "かつら", "かなた", "かなで",
"かなめ", "かなり", "かなん", "かのん", "かはく", "かみる", "かむい", "かもめ",
"かりん", "かるあ", "かるた", "かるま", "かをる", "かんろ", "きあな", "きあら",
"きい", "きく", "きさき", "きさら", "きずな", "きの", "きのと", "きのり",
"きはる", "きひろ", "きみお", "きゃら", "きゅうり", "きょう", "きよら", "きら",
"きり", "きりの", "きるあ", "きわむ", "きん", "ぎん", "ぎんが", "きんかく",
"ぎんかく", "くいん", "くう", "くおん", "くじら", "くらげ", "くりす", "ぐりむ",
"くるむ", "くるり", "くれい", "くれない", "ぐれん", "くろ", "くろがね", "けい",
"けいじゅ", "けいと", "けいま", "げっこう", "こあら", "こいち", "こいる", "こう",
"こうき", "こうた", "こうま", "こうや", "こうり", "こお", "こおり", "こがね",
"ここ", "こころ", "こすも", "こだま", "こちょう", "こつぶ", "こてつ", "こと",
"ことら", "こなつ", "こなん", "こはく", "こばこ", "こよみ", "こりん", "こるく",
"ころん", "さあら", "さい", "さいき", "さうら", "さえ", "さかえ", "さかな",
"さきょう", "さぎり", "さく", "さくも", "さくや", "ざくろ", "さこん", "ささ",
"さざなみ", "ささみ", "さそり", "さつき", "さとり", "さなぎ", "さやき", "さらら",
"さんご", "しあん", "しえる", "しおん", "しき", "しぐま", "しぐれ", "しげる",
"しじみ", "しずく", "しずる", "しの", "しのび", "しのぶ", "しひろ", "しま",
"しもん", "しゃら", "しゅう", "しゅか", "しゅしゅ", "じゅじゅ", "しゅり", "しゅん",
"じゅん", "しょう", "しらぬい", "しろ", "しろがね", "しんく", "しんら", "すい",
"すいげつ", "すおう", "すぐる", "すなお", "すばる", "するが", "せい", "せいや",
"せいる", "せさみ", "せしる", "せつな", "せつり", "せと", "せな", "せら",
"せり", "せん", "せんや", "せんり", "そう", "そうし", "そうじゅ", "そうる",
"そら", "そらね", "だいや", "たかね", "たかみ", "たから", "たくみ", "たけ",
"たけみ", "たすく", "たたら", "たつき", "たつみ", "たまお", "たまき", "たまも",
"たらこ", "たる", "たると", "ちあき", "ちおん", "ちくわ", "ちさお", "ちさと",
"ちたる", "ちとせ", "ちなつ", "ちはや", "ちひろ", "ちゃちゃ", "ちゅちゅ", "ちょこ",
"ちろる", "つかさ", "つきよ", "つくね", "つくも", "つつじ", "つばさ", "つばめ",
"つぶら", "つみき", "つむぎ", "つむじ", "つらら", "つるぎ", "てるま", "てれさ",
"てんか", "てんし", "とがり", "とこ", "としみ", "とま", "とも", "どれみ",
"とわ", "ないと", "ないる", "なお", "ながれ", "なぎ", "なぎさ", "なごみ",
"なごむ", "なち", "なつ", "なつき", "なつの", "なつめ", "なつる", "ななお",
"ななせ", "ななみ", "なひろ", "なみき", "なゆ", "なり", "なる", "なると",
"なるみ", "にこら", "にこる", "にの", "にや", "ぬい", "ねい", "ねいら",
"ねお", "ねおん", "ねむ", "ねる", "ねろ", "のあ", "のい", "のえる",
"のぞみ", "のん", "はがね", "はぎ", "はく", "はくあ", "はぐみ", "はずき",
"ぱせり", "はっか", "はつき", "はづき", "はなび", "はや", "はゆる", "はる",
"はるか", "はるひ", "はるみ", "はるむ", "ばんり", "ひいらぎ", "ひいろ", "ひかる",
"ひこ", "ひこの", "ひさ", "ひさき", "ひさの", "ひじり", "ひすい", "ひそか",
"ひたぎ", "ひづき", "ひつじ", "ひづる", "ひなき", "ひなぎく", "ひなた", "ひの",
"ひのき", "ひので", "ひばな", "ひばり", "ひびき", "ひむろ", "ひよこ", "ひろ",
"ひろの", "ひろみ", "ひろむ", "びん", "ふう", "ふき", "ふく", "ふじ",
"ふたば", "ぶどう", "ふゆ", "ふよう", "ふわり", "へきる", "ぺこ", "べに",
"べる", "ぽえむ", "ほかげ", "ほくと", "ぽこ", "ほずき", "ほたる", "ほづみ",
"ぼなぱると", "ほまれ", "ほむら", "まいむ", "まう", "まお", "まき", "まこ",
"まごころ", "まこと", "まこも", "まさき", "まさほ", "まさみ", "ましろ", "ますみ",
"まち", "まつ", "まっちゃ", "まつり", "まとい", "まどか", "まなつ", "まなほ",
"まの", "まはる", "まひる", "まひろ", "まほろ", "まみる", "まゆき", "まゆる",
"まよい", "まりも", "まりや", "まる", "まるも", "まろ", "まろん", "みおう",
"みおん", "みかげ", "みかん", "みき", "みくる", "みこと", "みさお", "みさき",
"みずき", "みぞれ", "みち", "みちる", "みつき", "みづき", "みつる", "みと",
"みどり", "みなみ", "みの", "みはる", "みひろ", "みもざ", "みや", "みやび",
"みゅう", "みゆき", "みら", "みらい", "みらの", "みらん", "みる", "みるく",
"みるも", "みんと", "むう", "むげん", "むつき", "めぐむ", "めだか", "めのう",
"める", "めるも", "めろ", "もあ", "もえぎ", "もか", "もぐら", "もくれん",
"もみじ", "やくも", "やしろ", "やなぎ", "やひろ", "やまと", "やや", "やわら",
"ゆあん", "ゆいり", "ゆう", "ゆうき", "ゆうさ", "ゆうじゅ", "ゆうひ", "ゆうほ",
"ゆうみ", "ゆうり", "ゆおん", "ゆき", "ゆきじ", "ゆきよ", "ゆさ", "ゆず",
"ゆずる", "ゆたか", "ゆつき", "ゆづき", "ゆのん", "ゆま", "ゆみや", "ゆめき",
"ゆめちよ", "ゆゆ", "ゆら", "ゆらい", "ゆりや", "ゆりん", "ゆわ", "ゆん",
"よう", "よしみ", "よつば", "よづる", "よもぎ", "らい", "らいか", "らいち",
"らいと", "らいむ", "らいる", "らうる", "らせん", "らっこ", "らて", "らび",
"らむ", "らむね", "らん", "りあら", "りあん", "りう", "りお", "りおと",
"りおる", "りおん", "りき", "りきあ", "りく", "りくみ", "りじゅ", "りずむ",
"りつ", "りつか", "りつき", "りっと", "りと", "りねん", "りの", "りのん",
"りま", "りむ", "りゅう", "りゅうじゅ", "りょう", "りょお", "りる", "りん",
"りんご", "りんね", "るあ", "るい", "るう", "るうま", "るおん", "るか",
"るきあ", "るね", "るの", "るり", "るる", "れある", "れい", "れいや",
"れいり", "れいん", "れお", "れおん", "れき", "れの", "れのん", "れむ",
"れもん", "れん", "れんじゅ", "ろか", "ろく", "ろまん", "ろん", "わおん",
"わか", "わかさ", "わかば", "わく", "わさび", "わむ", "わらび"
}
};
const std::vector<uint32_t> SkillGroupIdList{
0x00000000,0x80000128,0x80000102,0x80000086,0x800000b4,0x800000d5,0x800000a9,0x800000d4,
0x80000013,0x80000001,0x80000077,0x800000d9,0x800000dd,0x800000b7,0x80000123,0x800000fe,
0x800000ef,0x800000e6,0x8000011e,0x80000004,0x800000af,0x80000104,0x800000d2,0x800000b9,
0x80000028,0x800000e1,0x80000119,0x800000a1,0x800000ab,0x800000c5,0x80000127,0x80000009,
0x800000c0,0x80000092,0x800000c9,0x800000c3,0x80000025,0x80000045,0x80000035,0x800000a3,
0x8000005f,0x80000105,0x80000043,0x800000a4,0x8000003b,0x800000e0,0x80000021,0x800000d6,
0x8000007b,0x80000030,0x8000008f,0x8000004c,0x80000034,0x800000ac,0x8000006e,0x800000bd,
0x800000f0,0x8000005e,0x8000009b,0x80000074,0x80000116,0x800000b5,0x80000033,0x80000087,
0x80000090,0x8000009d,0x800000bf,0x80000007,0x8000008e,0x8000007e,0x8000009e,0x80000042,
0x8000009f,0x80000027,0x80000005,0x800000d7,0x800000c7,0x8000005d,0x800000ae,0x8000001b,
0x80000094,0x8000010d,0x80000068,0x80000103,0x8000011f,0x8000002f,0x80000067,0x800000df,
0x800000cd,0x80000079,0x800000fb,0x8000003c,0x80000024,0x80000075,0x800000cf,0x8000008d,
0x8000000e,0x80000017,0x80000036,0x800000ba,0x80000124,0x80000098,0x80000088,0x8000011a,
0x8000006f,0x800000ea,0x80000020,0x800000de,0x80000049,0x8000010e,0x8000005a
};
const std::vector<uint32_t> SkillGroupIdMap = [] {
std::vector<uint32_t> v(0x1000, 0);
for (uint32_t i = 0; i < SkillGroupIdList.size(); ++i) {
v[SkillGroupIdList[i] & 0xfff] = i;
}
return v;
}();
const std::vector<std::vector<uint32_t> > LotSkillGroup{
{0x80000128, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
{0x8000005E, 0x80000116, 0x80000087, 0x800000BF, 0x8000007E, 0x8000009F, 0x800000D7, 0x800000AE, 0x800000B4, 0x80000001, 0x80000077, 0x00000000, 0x00000000, 0x00000000},
{0x800000D6, 0x80000030, 0x8000004C, 0x8000006E, 0x800000E1, 0x800000A1, 0x800000C5, 0x80000009, 0x80000013, 0x80000128, 0x80000128, 0x00000000, 0x00000000, 0x00000000},
{0x80000092, 0x800000C3, 0x80000045, 0x800000A3, 0x800000C3, 0x80000045, 0x800000A3, 0x800000D9, 0x80000128, 0x80000128, 0x80000128, 0x00000000, 0x00000000, 0x00000000},
{0x8000009B, 0x800000B5, 0x80000090, 0x80000007, 0x8000009E, 0x80000027, 0x800000A9, 0x80000128, 0x80000128, 0x80000128, 0x80000128, 0x00000000, 0x00000000, 0x00000000},
{0x80000123, 0x800000EF, 0x8000011E, 0x800000DD, 0x80000086, 0x800000C7, 0x8000001B, 0x8000010D, 0x80000128, 0x80000128, 0x80000128, 0x00000000, 0x00000000, 0x00000000}
};
const std::vector<uint32_t> LotSkillGroupLen{1, 11, 11, 11, 11, 11};
const std::vector<std::vector<uint32_t> > LotSkillGroupColor{
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{1, 2, 3, 4, 5, 6, 7, 8, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{1, 2, 3, 4, 5, 6, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 7, 8, 0, 0, 0, 0, 0, 0, 0}
};
const std::vector<std::vector<uint32_t> > SkillGroupFusionData{
{0x00000000,50,1},{0x00000000,50,1},{0x00000000,0,1},{0x00000000,10,1},{0x800000d5,50,30},{0x00000000,10,1},{0x800000d4,50,20},{0x00000000,10,1},
{0x00000000,50,1},{0x00000000,50,1},{0x00000000,50,1},{0x00000000,50,1},{0x00000000,10,1},{0x00000000,50,1},{0x800000fe,5,1},{0x00000000,0,1},
{0x800000e6,5,10},{0x00000000,5,1},{0x00000000,50,1},{0x800000af,0,10},{0x00000000,0,1},{0x800000d2,0,2},{0x00000000,0,1},{0x80000028,0,10},
{0x00000000,0,1},{0x80000119,50,50},{0x00000000,10,1},{0x800000ab,50,50},{0x00000000,10,1},{0x80000127,50,50},{0x00000000,10,1},{0x800000c0,50,50},
{0x00000000,10,1},{0x800000c9,50,30},{0x00000000,10,1},{0x80000025,50,40},{0x00000000,10,1},{0x80000035,50,30},{0x00000000,10,1},{0x8000005f,50,50},
{0x00000000,10,1},{0x80000043,0,5},{0x00000000,0,1},{0x8000003b,0,5},{0x00000000,0,1},{0x80000021,50,20},{0x00000000,10,1},{0x8000007b,50,70},
{0x00000000,10,1},{0x8000008f,50,70},{0x00000000,10,1},{0x80000034,50,70},{0x00000000,10,1},{0x8000006e,50,70},{0x00000000,10,1},{0x800000f0,10,2},
{0x00000000,5,1},{0x8000009b,50,70},{0x80000074,30,50},{0x00000000,10,30},{0x800000b5,50,70},{0x80000033,30,50},{0x00000000,10,30},{0x80000090,50,70},
{0x8000009d,30,50},{0x00000000,10,30},{0x80000007,50,70},{0x8000008e,30,50},{0x00000000,10,30},{0x8000009e,50,70},{0x80000042,30,50},{0x00000000,10,30},
{0x80000027,50,70},{0x80000005,30,50},{0x00000000,10,30},{0x800000c7,50,70},{0x8000005d,30,50},{0x00000000,10,30},{0x8000001b,50,70},{0x80000094,30,50},
{0x00000000,10,30},{0x80000068,10,2},{0x00000000,5,1},{0x00000000,10,1},{0x00000000,10,1},{0x00000000,10,1},{0x00000000,10,1},{0x00000000,10,1},
{0x00000000,10,1},{0x00000000,10,1},{0x00000000,10,1},{0x00000000,10,1},{0x00000000,10,1},{0x00000000,10,1},{0x00000000,10,1},{0x00000000,10,1},
{0x00000000,10,1},{0x00000000,10,1},{0x00000000,10,1},{0x00000000,10,1},{0x00000000,10,1},{0x00000000,10,1},{0x00000000,10,1},{0x00000000,10,1},
{0x00000000,10,1},{0x00000000,10,1},{0x00000000,10,1},{0x00000000,10,1},{0x00000000,10,1},{0x00000000,10,1},{0x00000000,10,1}
};
const std::vector<uint32_t> SkillGroupMixColor{
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,1,0,0,2,0,
0,3,0,0,4,0,0,5,
0,0,6,0,0,7,0,0,
8,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0
};
const std::vector<std::vector<uint32_t> > SkillGroupMixTable{
{0x00000000,0x80000103,0x8000011f,0x8000002f,0x80000067,0x800000df,0x800000cd,0x80000079},
{0x80000103,0x00000000,0x800000fb,0x8000003c,0x80000024,0x80000075,0x800000cf,0x8000008d},
{0x8000011f,0x800000fb,0x00000000,0x8000000e,0x80000017,0x80000036,0x800000ba,0x80000124},
{0x8000002f,0x8000003c,0x8000000e,0x00000000,0x80000098,0x80000088,0x8000011a,0x8000006f},
{0x80000067,0x80000024,0x80000017,0x80000098,0x00000000,0x800000ea,0x80000020,0x800000de},
{0x800000df,0x80000075,0x80000036,0x80000088,0x800000ea,0x00000000,0x80000049,0x8000010e},
{0x800000cd,0x800000cf,0x800000ba,0x8000011a,0x80000020,0x80000049,0x00000000,0x8000005a},
{0x80000079,0x8000008d,0x80000124,0x8000006f,0x800000de,0x8000010e,0x8000005a,0x00000000}
};
const std::vector<std::string> SkillGroupStringList{
"アンテナのねっこ", "アンテナなし", "ちょっとステルス", "ちょっとあしもとガード", "ちょっとかいふく", "みんなちょっとかいふく", "ちょっとふっかつ", "みんなちょっとふっかつ",
"げどく", "しびれとる", "めざめる", "ぞくせいなおす", "ぜんぶなおす", "かいほうする","すこしむてき", "みんなすこしむてき", "すこしこうふん",
"みんなすこしこうふん", "たくわえる", "わざはねかえす1", "みんなわざはねかえす1", "すこしひっちゅう", "みんなすこしひっちゅう", "ちいさくトゲトゲ", "みんなちいさくトゲトゲ",
"すこしつよくなれ", "みんなつよめになれ", "すこしかたくなれ", "みんなかためになれ", "すこしはやくなれ", "みんなはやめになれ", "すこしかわしやすい", "みんなあてられにくい",
"どくになれ", "みんなどくになれ", "すこしねむらせる", "みんなすこしねむらせる", "すこししびれさせる", "みんなすこししびれさせる", "すこしめかくし", "みんなすこしめかくし",
"すこしブレスふうじ", "みんなすこしブレスふうじ", "すこしアンテナふうじ", "みんなすこしアンテナふうじ", "すこしあやつる","みんなすこしあやつる","すこしよわくなれ", "みんなよわめになれ", "すこしやわくなれ", "みんなやわらかめ",
"すこしおそくなれ", "みんなおそめになれ", "すこしよけにくい", "みんなすこしよけにくい", "むてきかいじょ", "みんなむてきかいじょ", "ひのたま", "ばくはつ",
"やまかじ", "とがったこおり", "ロックアイス", "あられ", "つむじかぜ", "ビルかぜ", "かまいたち", "らくせき",
"いしつぶて", "マグニチュード3", "せいでんき", "いなづま", "ひゃくボルト", "みずでっぽう", "バケツのみず", "たかなみ",
"よわいこうせん", "スポットライト", "ふゆのひざし", "おどかす", "ダークボール", "くろいきり", "ノックダウン", "みんなノックダウン",
"もえさかるこおり", "かさいせんぷう", "だいふんか", "らくらいかさい", "ほのおのうみ", "もえるひかりのや", "じゃあくなほのお", "こおりあらし",
"こおりいんせき", "かみなりふぶき", "ひさめ", "かがやくれいき", "あんこくのれいき", "つちけむり", "でんきあらし", "ぼうふうう",
"ひかりたつまき", "じゃあくなかぜ", "かみなりがんせき", "どせきりゅう", "だいちのひかり", "じゃあくなじわれ", "らいう", "でんこう",
"やみのいかづち", "ひかりのあめ", "ダークシャワー", "ならくのたいよう"
};
const std::vector<std::uint32_t> AbilityIdList{
0x00000000,0x870203b6,0x870201d8,0x8702026c,0x87020184,0x87020160,0x8702014e,0x870200b0,
0x8702013f,0x870202b9,0x87020120,0x87020042,0x8702026a,0x8702016c,0x870200b8,0x8702030c,
0x870203aa,0x870200bd
};
const std::vector<uint32_t> AbilityIdMap = [] {
std::vector<uint32_t> v(0x100, 0);
for (uint32_t i = 0; i < AbilityIdList.size(); ++i) {
v[AbilityIdList[i] & 0xff] = i;
}
return v;
}();
const std::vector<std::uint32_t> AbilityFusionData{
50,50,20,10,5,2
};
const std::vector<std::string> AbilityStringList{
"","HP12突2補正","S25補正","S50補正","S90補正","HP30突恐補正","HP30攻25補正","防25回避3補正",
"S20補正","回避5補正","誘惑3補正","誘惑耐性1補正","恐怖3補正","恐怖耐性1補正","急所5補正","ダウン耐性1補正",
"HP50補正","AP1補正"
};
struct BirthParams {
std::array<uint32_t, 26> data;
uint32_t ability1;
uint32_t ability2;
uint8_t personal_type;
uint8_t pair_param;
uint8_t category1;
uint8_t category2;
std::array<char, 8> rsid;
uint32_t left_index;
uint32_t right_index;
BirthParams(): data{},
ability1(0),
ability2(0),
personal_type(0),
pair_param(0),
category1(0),
category2(0),
rsid{},
left_index(0xFFFFFFFF),
right_index(0xFFFFFFFF) {
}
};
BirthParams bp_from_hex(const std::string& str, const uint32_t ability1) {
BirthParams bp;
for (uint32_t i = 0;i < 26;++i) {
const std::string s1 = str.substr(i * 8, 2);
const std::string s2 = str.substr(i * 8 + 2, 2);
const std::string s3 = str.substr(i * 8 + 4, 2);
const std::string s4 = str.substr(i * 8 + 6, 2);
bp.data[i] = std::stoul(s1, nullptr, 16) | std::stoul(s2, nullptr, 16) << 8 | std::stoul(s3, nullptr, 16) << 16 | std::stoul(s4, nullptr, 16) << 24;
}
bp.ability1 = ability1;
return bp;
}
inline bool bp_same(const BirthParams &l, const BirthParams &r) {
if (l.data[23] != r.data[23]) { return false; }
if (l.data[24] != r.data[24]) { return false; }
if (l.data[1] != r.data[1]) { return false; }
if (l.data[2] != r.data[2]) { return false; }
if (l.data[3] != r.data[3]) { return false; }
if (l.data[4] != r.data[4]) { return false; }
if (l.data[5] != r.data[5]) { return false; }
if (l.data[6] != r.data[6]) { return false; }
if (l.data[7] != r.data[7]) { return false; }
if (l.data[8] != r.data[8]) { return false; }
if (l.data[9] != r.data[9]) { return false; }
if (l.data[10] != r.data[10]) { return false; }
if (l.data[11] != r.data[11]) { return false; }
if (l.data[14] != r.data[14]) { return false; }
if (l.data[14] != BodyPatternIdList[1] && l.data[12] != r.data[12]) { return false; }
return true;
}
struct Charas {
uint32_t index;
std::vector<BirthParams> bps;
Charas(): index(0) {
}
explicit Charas(std::vector<BirthParams> new_bps): index(0), bps(std::move(new_bps)) {
}
};
bool save_charas(const std::string &filename, const Charas &charas) {
std::ofstream ofs(filename, std::ios::binary);
if (!ofs) {
return false;
}
ofs.write(reinterpret_cast<const char *>(&charas.index), sizeof(charas.index));
uint32_t bps_count = charas.bps.size();
ofs.write(reinterpret_cast<const char *>(&bps_count), sizeof(bps_count));
if (bps_count > 0) {
ofs.write(reinterpret_cast<const char *>(charas.bps.data()),
static_cast<std::streamsize>(bps_count * sizeof(BirthParams)));
}
return ofs.good();
}
bool load_charas(const std::string &filename, Charas &charas) {
std::ifstream ifs(filename, std::ios::binary);
if (!ifs) {
return false;
}
charas = {};
ifs.read(reinterpret_cast<char *>(&charas.index), sizeof(charas.index));
uint32_t bps_count = 0;
ifs.read(reinterpret_cast<char *>(&bps_count), sizeof(bps_count));
if (bps_count > 0) {
charas.bps.resize(bps_count);
ifs.read(reinterpret_cast<char *>(charas.bps.data()),
static_cast<std::streamsize>(bps_count * sizeof(BirthParams)));
}
return true;
}
Charas qr_init() {
Charas charas;
if (load_charas("saves/qr.hype.bin", charas)) {
return charas;
}
charas.bps.reserve(17170186);
EVP_MD_CTX *ctx = EVP_MD_CTX_new();
std::array<uint8_t, 7> bytes1{};
bytes1[6] = 0;
std::array<uint8_t, 6> bytes2{};
bytes2[0] = 0x8f;
bytes2[1] = 0x51;
bytes2[2] = 0x52;
std::array<uint8_t, 32> hash_result{};
std::array<uint64_t, 4> hash_u64{};
BirthParams bp{};
std::string line;
for (uint32_t t = 0; t < 256; ++t) {
std::stringstream ss_filename;
ss_filename << "ndrf_dataset2/rsids/" << std::hex << std::setw(2) << std::setfill('0') << t << ".txt";
std::string filename = ss_filename.str();
std::ifstream ifs(filename);
while (std::getline(ifs, line)) {
if (line.empty()) {
continue;
}
for (uint32_t i = 0; i < 6; ++i) {
bytes1[i] = static_cast<uint8_t>(line[i]);
}
EVP_DigestInit_ex(ctx, EVP_sha256(), nullptr);
EVP_DigestUpdate(ctx, bytes1.data(), 7);
EVP_DigestFinal_ex(ctx, hash_result.data(), nullptr);
for (uint32_t i = 0; i < 3; ++i) {
bytes2[3 + i] = hash_result[1 + i];
}
EVP_DigestInit_ex(ctx, EVP_sha256(), nullptr);
EVP_DigestUpdate(ctx, bytes2.data(), 6);
EVP_DigestFinal_ex(ctx, hash_result.data(), nullptr);
for (auto i = 0; i < 4; ++i) {
memcpy(&hash_u64[i], hash_result.data() + i * 8, sizeof(uint64_t));
}
for (auto i = 0; i < 6; ++i) {
bp.rsid[i] = line[i];
}
bp.rsid[6]=0;
bp.data[14] = 0x8000000e;
uint32_t p1;
uint32_t p2;
uint32_t p3;
//Category1
p1 = hash_u64[0] & 0x7f;
bp.category1 = p1 < 76 ? 1 : p1 < 90 ? 2 : 3;
//Category2
p1 = (hash_u64[0] >> 7) & 0x7f;
bp.category2 = p1 < 60 ? 0 : p1 < 70 ? 1 : 2;
p3 = bp.category1 * 3 + bp.category2 - 3;
//Name
bp.data[23] = NameIdList[bp.category1][1 + ((hash_u64[0] >> 14) & 0xfff) % NameIdListLen[bp.category1]];
//SkillGroup
p1 = hash_u64[1] & 0x3ff;
p1 = p1 < 512 ? 0 : p1 < 841 ? 1 : p1 < 971 ? 2 : p1 < 1019 ? 3 : p1 < 1022 ? 4 : 5;
p2 = ((hash_u64[1] >> 10) & 0xfff) % LotSkillGroupLen[p1];
bp.data[24] = LotSkillGroup[p1][p2];
//BodyColor
p2 = LotSkillGroupColor[p1][p2];
p1 = hash_u64[2] & 0x3fff;
p1 = (p1 < 3960 ? 0 : p1 < 16096 ? 9 : 18) + p2;
bp.data[11] = LotBodyColor[p1][((hash_u64[2] >> 14) & 0x3f) % LotBodyColorLen[p1]];
//Body
p1 = (hash_u64[1] >> 41) & 0x7f;
p1 = p1 < 103 ? 0 : p1 < 126 ? 1 : 2;
bp.data[10] = LotBody[p1][((hash_u64[1] >> 48) & 0x7f) % LotBodyLen[p1]];
//Head
bp.data[1] = LotHead[0][((hash_u64[2] >> 27) & 0xff) % LotHeadLen[0]];
//FaceType
p1 = (((hash_u64[2] >> 35) & 0x7f) < 83 ? 0 : 9) + p3;
bp.data[2] = LotFaceType[p1][((hash_u64[2] >> 42) & 0x1ff) % LotFaceTypeLen[p1]];
//FaceColor
bp.data[3] = LotFaceColor[((hash_u64[2] >> 51) & 0x7f) < 118 ? 0 : 1][(hash_u64[2] >> 58) % 3];
//HairColor
p1 = ((hash_u64[3] & 0x7f) < 118 ? 0 : 9) + p3;
bp.data[4] = LotHairColor[p1][((hash_u64[3] >> 7) & 0x7f) % LotHairColorLen[p1]];
//Eyes
bp.data[5] = LotPartsEyes[p3][((hash_u64[3] >> 14) & 0xff) % LotPartsEyesLen[p3]];
//Mouth
bp.data[6] = LotPartsMouth[p3][((hash_u64[3] >> 22) & 0xff) % LotPartsMouthLen[p3]];
//Nose
bp.data[7] = LotPartsNose[p3][(p2 = (hash_u64[3] >> 30) & 0x7f) % LotPartsNoseLen[p3]];
//Brows
bp.data[8] = LotPartsBrows[p3][((hash_u64[3] >> 37) & 0x7f) % LotPartsBrowsLen[p3]];
//Cheek
if (((hash_u64[3] >> 44) & 0x7f) >= (bp.category2 == 0 ? 118 : bp.category2 == 1 ? 123 : 98)) {
bp.data[9] = LotPartsCheek[p3][((hash_u64[3] >> 51) & 0x3f) % LotPartsCheekLen[p3]];
}else {
bp.data[9]=0;
}
//Pair
p2 = hash_u64[3] >> 57;
bp.pair_param = p2 < 125 ? 0 : p2 < 126 ? 1 : 2;
charas.bps.emplace_back(bp);
if (p2 >= 125) {
bp.rsid[6] = '_';
bp.data[23] = NameIdList[bp.category1][1 + (((hash_u64[0] >> 14) & 0xfff) + p2) % NameIdListLen[bp.category1]];
if (p2 == 125) {
bp.data[3] = LotFaceColor2[((hash_u64[2] >> 51) & 0x7f) < 118 ? 0 : 1][(hash_u64[2] >> 58) % 3];
} else {
p1 = (hash_u64[1] >> 41) & 0x7f;
p1 = p1 < 103 ? 0 : p1 < 126 ? 1 : 2;
bp.data[10] = LotBody2[p1][((hash_u64[1] >> 48) & 0x7f) % LotBodyLen[p1]];
}
charas.bps.emplace_back(bp);
}
}
}
EVP_MD_CTX_free(ctx);
save_charas("saves/qr.hype.bin", charas);
return charas;
}
struct SearchConfig {
bool head[0x100]{};
bool face_type[0x100]{};
bool face_color[0x100]{};
bool hair_color[0x100]{};
bool eyes[0x100]{};
bool mouth[0x100]{};
bool nose[0x100]{};
bool brows[0x100]{};
bool cheek[0x100]{};
bool body[0x100]{};
bool body_color1[0x100]{};
bool body_color2[0x100]{};
bool body_color_swap{};
bool body_pattern[0x100]{};
uint32_t name{0};
bool skill_group[0x200]{};
std::array<char, 8> rsid{};
bool ability1[0x100]{};
bool ability2[0x100]{};
bool personal_type[0x10]{};
bool pair_param[0x10]{};
bool category1[0x10]{};
bool category2[0x10]{};
bool over_100{};
bool enable_swap{};
uint32_t limiter{100000000};
SearchConfig() = default;
};
SearchConfig config_all() {
SearchConfig config;
std::fill(std::begin(config.head), std::end(config.head), true);
std::fill(std::begin(config.face_type), std::end(config.face_type), true);
std::fill(std::begin(config.face_color), std::end(config.face_color), true);
std::fill(std::begin(config.hair_color), std::end(config.hair_color), true);
std::fill(std::begin(config.eyes), std::end(config.eyes), true);
std::fill(std::begin(config.mouth), std::end(config.mouth), true);
std::fill(std::begin(config.nose), std::end(config.nose), true);
std::fill(std::begin(config.brows), std::end(config.brows), true);
std::fill(std::begin(config.cheek), std::end(config.cheek), true);
std::fill(std::begin(config.body), std::end(config.body), true);
std::fill(std::begin(config.body_color1), std::end(config.body_color1), true);
std::fill(std::begin(config.body_color2), std::end(config.body_color2), true);
config.body_color_swap = true;
std::fill(std::begin(config.body_pattern), std::end(config.body_pattern), true);
config.name=0;
std::fill(std::begin(config.skill_group), std::end(config.skill_group), true);
config.rsid[0] = 0;
std::fill(std::begin(config.ability1), std::end(config.ability1), true);
std::fill(std::begin(config.ability2), std::end(config.ability2), true);
std::fill(std::begin(config.personal_type), std::end(config.personal_type), true);
std::fill(std::begin(config.pair_param), std::end(config.pair_param), true);
std::fill(std::begin(config.category1), std::end(config.category1), true);
std::fill(std::begin(config.category2), std::end(config.category2), true);
config.over_100 = false;
config.enable_swap=false;
config.limiter=100000000;
return config;
}
SearchConfig config_from_map(const std::unordered_map<std::string, std::vector<uint32_t> > ¶ms) {
SearchConfig config = config_all();
for (const auto &pair: params) {
const std::string &key = pair.first;
const std::vector<uint32_t> &values = pair.second;
if (key == "head") {
std::fill(std::begin(config.head), std::end(config.head), false);
for (const uint32_t v: values) {
config.head[v & 0xff] = true;
}
} else if (key == "face_type") {
std::fill(std::begin(config.face_type), std::end(config.face_type), false);
for (const uint32_t v: values) {
config.face_type[v & 0xff] = true;
}
} else if (key == "face_color") {
std::fill(std::begin(config.face_color), std::end(config.face_color), false);
for (const uint32_t v: values) {
config.face_color[v & 0xff] = true;
}
} else if (key == "hair_color") {
std::fill(std::begin(config.hair_color), std::end(config.hair_color), false);
for (const uint32_t v: values) {
config.hair_color[v & 0xff] = true;
}
} else if (key == "eyes") {
std::fill(std::begin(config.eyes), std::end(config.eyes), false);
for (const uint32_t v: values) {
config.eyes[v & 0xff] = true;
}
} else if (key == "mouth") {
std::fill(std::begin(config.mouth), std::end(config.mouth), false);
for (const uint32_t v: values) {
config.mouth[v & 0xff] = true;
}
} else if (key == "nose") {
std::fill(std::begin(config.nose), std::end(config.nose), false);
for (const uint32_t v: values) {
config.nose[v & 0xff] = true;
}
} else if (key == "brows") {
std::fill(std::begin(config.brows), std::end(config.brows), false);
for (const uint32_t v: values) {
config.brows[v & 0xff] = true;
}
} else if (key == "cheek") {
std::fill(std::begin(config.cheek), std::end(config.cheek), false);
for (const uint32_t v: values) {
config.cheek[v & 0xff] = true;
}
} else if (key == "body") {
std::fill(std::begin(config.body), std::end(config.body), false);
for (const uint32_t v: values) {
config.body[v & 0xff] = true;
}
} else if (key == "body_color1") {
std::fill(std::begin(config.body_color1), std::end(config.body_color1), false);
for (const uint32_t v: values) {
config.body_color1[v & 0xff] = true;
}
} else if (key == "body_color2") {
std::fill(std::begin(config.body_color2), std::end(config.body_color2), false);
for (const uint32_t v: values) {
config.body_color2[v & 0xff] = true;
}
} else if (key == "body_color_swap") {
for (const uint32_t v: values) {
if (v == 0) {
config.body_color_swap = false;
} else {
config.body_color_swap = true;
}
}
} else if (key == "body_pattern") {
std::fill(std::begin(config.body_pattern), std::end(config.body_pattern), false);
for (const uint32_t v: values) {
config.body_pattern[v & 0xff] = true;
}
} else if (key == "name") {
for (const uint32_t v: values) {
config.name = v;
}
} else if (key == "skill_group") {
std::fill(std::begin(config.skill_group), std::end(config.skill_group), false);
for (const uint32_t v: values) {
config.skill_group[v & 0x1ff] = true;
}
} else if (key == "rsid") {
for (uint32_t i = 0; i < 8; ++i) {
if (i == 7 || i >= values.size()) {
break;
}
config.rsid[i] = static_cast<char>(values[i] & 0x7f);
}
} else if (key == "ability1") {
std::fill(std::begin(config.ability1), std::end(config.ability1), false);
for (const uint32_t v: values) {
config.ability1[v & 0xff] = true;
}
} else if (key == "ability2") {
std::fill(std::begin(config.ability2), std::end(config.ability2), false);
for (const uint32_t v: values) {
config.ability2[v & 0xff] = true;
}
} else if (key == "personal_type") {
std::fill(std::begin(config.personal_type), std::end(config.personal_type), false);
for (const uint32_t v: values) {
config.personal_type[v & 0xf] = true;
}
} else if (key == "pair_param") {
std::fill(std::begin(config.pair_param), std::end(config.pair_param), false);
for (const uint32_t v: values) {
config.pair_param[v & 0xf] = true;
}
} else if (key == "category1") {
std::fill(std::begin(config.category1), std::end(config.category1), false);
for (const uint32_t v: values) {
config.category1[v & 0xf] = true;
}
} else if (key == "category2") {
std::fill(std::begin(config.category2), std::end(config.category2), false);
for (const uint32_t v: values) {
config.category2[v & 0xf] = true;
}
}else if (key == "over_100") {
for (const uint32_t v: values) {
if (v == 0) {
config.over_100 = false;
} else {
config.over_100 = true;
}
}
}else if (key=="enable_swap") {
for (const uint32_t v: values) {
if (v == 0) {
config.enable_swap = false;
}else {
config.enable_swap = true;
}
}
} else if (key == "limiter") {
for (const uint32_t v: values) {
config.limiter = v;
}
}
}
return config;
}
SearchConfig config_from_rsid(const std::string &rsid) {
SearchConfig config = config_all();
for (uint32_t i = 0; i < 8; ++i) {
if (i < rsid.size()) {
config.rsid[i] = rsid[i];
} else {
config.rsid[i] = 0;
}
}
return config;
}
inline bool config_check(const BirthParams &bp, const SearchConfig &config) {
if (!config.skill_group[bp.data[24] & 0x1ff]) {
return false;
}
if (!config.head[bp.data[1] & 0xff]) {
return false;
}
if (config.name!=0&&config.name!=bp.data[23]) {
return false;
}
if (config.rsid[0] != 0) {
for (uint32_t i = 0; i < 8; ++i) {
if (config.rsid[i] != bp.rsid[i]) {
return false;
}
}
}
if (!config.face_type[bp.data[2] & 0xff]) {
return false;
}
if (!config.face_color[bp.data[3] & 0xff]) {
return false;
}
if (!config.hair_color[bp.data[4] & 0xff]) {
return false;
}
if (!config.eyes[bp.data[5] & 0xff]) {
return false;
}
if (!config.mouth[bp.data[6] & 0xff]) {
return false;
}
if (!config.nose[bp.data[7] & 0xff]) {
return false;
}
if (!config.brows[bp.data[8] & 0xff]) {
return false;
}
if (!config.cheek[bp.data[9] & 0xff]) {
return false;
}
if (!config.body[bp.data[10] & 0xff]) {
return false;
}
if (!config.body_pattern[bp.data[14] & 0xff]) {
return false;
}
if (bp.data[14] == BodyPatternIdList[1]) {
if (!config.body_color1[bp.data[11] & 0xff]) {
return false;
}
} else {
if (!config.body_color_swap) {
if (!config.body_color1[bp.data[11] & 0xff] || !config.body_color2[bp.data[12] & 0xff]) {
return false;
}
} else {
if (!config.body_color1[bp.data[11] & 0xff] || !config.body_color2[bp.data[12] & 0xff]) {
if (!config.body_color2[bp.data[11] & 0xff] || !config.body_color1[bp.data[12] & 0xff]) {
return false;
}
}
}
}
if (!config.ability1[bp.ability1 & 0xff]) {
return false;
}
if (!config.ability2[bp.ability2 & 0xff]) {
return false;
}
if (!config.personal_type[bp.personal_type & 0xf]) {
return false;
}
if (!config.pair_param[bp.pair_param & 0xf]) {
return false;
}
if (!config.category1[bp.category1 & 0xf]) {
return false;
}
if (!config.category2[bp.category2 & 0xf]) {
return false;
}
return true;
}
std::vector<uint32_t> vector_combine(std::initializer_list<std::vector<uint32_t>> vecs) {
std::vector<uint32_t> result;
size_t total_size = 0;
for (const auto& v : vecs) {
total_size += v.size();
}
result.reserve(total_size);
for (const auto& v : vecs) {
result.insert(result.end(), v.begin(), v.end());
}
return result;
}
uint32_t ProcessAncestors(uint32_t parent_index,
Charas &charas,
const Charas &source_charas,
std::vector<uint32_t> &bps_map) {
if (bps_map[parent_index] != 0xffffffff) {
return bps_map[parent_index];
}
uint32_t p1 = charas.bps.size();
charas.bps.emplace_back(source_charas.bps[parent_index]);
bps_map[parent_index] = p1;
if (charas.bps[p1].left_index != 0xffffffff) {
charas.bps[p1].left_index = ProcessAncestors(charas.bps[p1].left_index, charas, source_charas, bps_map);
}
if (charas.bps[p1].right_index != 0xffffffff) {
charas.bps[p1].right_index = ProcessAncestors(charas.bps[p1].right_index, charas, source_charas, bps_map);
}
return p1;
}
Charas Scylla(const Charas &charas1, const SearchConfig &config) {
Charas charas;
std::vector<BirthParams> bps;
std::vector<uint32_t> bps_map(charas1.bps.size(), 0xffffffff);
for (uint32_t i = charas1.index; i < charas1.bps.size(); ++i) {
BirthParams bp = charas1.bps[i];
if (!config_check(bp, config)) {
continue;
}
if (bp.left_index != 0xffffffff) {
bp.left_index = ProcessAncestors(bp.left_index, charas, charas1, bps_map);
}
if (bp.right_index != 0xffffffff) {
bp.right_index = ProcessAncestors(bp.right_index, charas, charas1, bps_map);
}
bps.emplace_back(bp);
}
charas.index = charas.bps.size();
if (!bps.empty()) {
charas.bps.reserve(charas.bps.size() + bps.size());
charas.bps.insert(charas.bps.end(), bps.begin(), bps.end());
}
return charas;
}
Charas Hyperion(const Charas &charas1_, const Charas &charas2_, const SearchConfig &config) {
Charas charas;
std::vector<BirthParams> bps;
std::vector<uint32_t> bps1_map(charas1_.bps.size(), 0xffffffff);
std::vector<uint32_t> bps2_map(charas2_.bps.size(), 0xffffffff);
EVP_MD_CTX *ctx = EVP_MD_CTX_new();
std::array<uint8_t, 32> hash_result{};
std::array<uint64_t, 4> hash_u64{};
BirthParams bp{};
std::random_device rd;
std::mt19937 g(rd());
EVP_MD_CTX *base_ctx = EVP_MD_CTX_new();
EVP_MD_CTX *temp_ctx = EVP_MD_CTX_new();
for (uint32_t Q=0;Q<(config.enable_swap?2:1);++Q) {
const Charas &charas1=Q==0?charas1_:charas2_;
const Charas &charas2=Q==0?charas2_:charas1_;
for (uint32_t l = charas1.index; l < charas1.bps.size(); ++l) {
const BirthParams &bp1 = charas1.bps[l];
EVP_DigestInit_ex(base_ctx, EVP_sha256(), nullptr);
EVP_DigestUpdate(base_ctx, bp1.data.data(), sizeof(bp1.data));
for (uint32_t r = charas2.index; r < charas2.bps.size(); ++r) {
const BirthParams &bp2 = charas2.bps[r];
if (bp_same(bp1,bp2)) {
continue;
}
EVP_MD_CTX_copy_ex(temp_ctx, base_ctx);
EVP_DigestUpdate(temp_ctx, bp2.data.data(), sizeof(bp2.data));
EVP_DigestFinal_ex(temp_ctx, hash_result.data(), nullptr);
for (auto i = 0; i < 4; ++i) {
memcpy(&hash_u64[i], hash_result.data() + i * 8, sizeof(uint64_t));
}
uint32_t p1;
uint32_t p2;
uint32_t p3;
uint32_t p4;
if (bp1.data[24] == bp2.data[24]) {
p1 = SkillGroupIdMap[bp1.data[24] & 0xfff];
p2 = SkillGroupFusionData[p1][0];
if (p2 != 0 && ((hash_u64[0] >> 10) & 0x3ff) % 100 < SkillGroupFusionData[p1][2]) {
bp.data[24] = p2;
} else if (SkillGroupFusionData[p1][1] > 0) {
bp.data[24] = bp1.data[24];
} else {
bp.data[24] = SkillGroupIdList[1];
}
}else if (config.over_100&&SkillGroupMixColor[SkillGroupIdMap[bp1.data[24] & 0xfff]]!=0&&SkillGroupMixColor[SkillGroupIdMap[bp2.data[24] & 0xfff]]!=0&&((hash_u64[0] >> 10) & 0x3ff) % 100 < 30){
//currently hardcoded for lightning speed
p1=SkillGroupMixColor[SkillGroupIdMap[bp1.data[24] & 0xfff]];
p2=SkillGroupMixColor[SkillGroupIdMap[bp2.data[24] & 0xfff]];
bp.data[24] = SkillGroupMixTable[p1-1][p2-1];
} else {
p1 = SkillGroupFusionData[SkillGroupIdMap[bp1.data[24] & 0xfff]][1];
p2 = SkillGroupFusionData[SkillGroupIdMap[bp2.data[24] & 0xfff]][1];
if (p1 + p2 > 0) {
bp.data[24] = (hash_u64[0] & 0x3ff) % (p1 + p2) < p1 ? bp1.data[24] : bp2.data[24];
} else {
bp.data[24] = SkillGroupIdList[1];
}
}
bp.data[2] = ((hash_u64[0] >> 30) & 0x1) ? bp1.data[2] : bp2.data[2];
bp.data[3] = ((hash_u64[0] >> 31) & 0x1) ? bp1.data[3] : bp2.data[3];
bp.data[4] = ((hash_u64[0] >> 32) & 0x1) ? bp1.data[4] : bp2.data[4];
bp.data[5] = ((hash_u64[0] >> 33) & 0x1) ? bp1.data[5] : bp2.data[5];
bp.data[6] = ((hash_u64[0] >> 34) & 0x1) ? bp1.data[6] : bp2.data[6];
bp.data[7] = ((hash_u64[0] >> 35) & 0x1) ? bp1.data[7] : bp2.data[7];
bp.data[8] = ((hash_u64[0] >> 36) & 0x1) ? bp1.data[8] : bp2.data[8];
bp.data[9] = ((hash_u64[0] >> 37) & 0x1) ? bp1.data[9] : bp2.data[9];
p1 = bp.data[2] == bp1.data[2] && bp.data[3] == bp1.data[3] &&
bp.data[4] == bp1.data[4] && bp.data[5] == bp1.data[5] &&
bp.data[6] == bp1.data[6] && bp.data[7] == bp1.data[7] &&
bp.data[8] == bp1.data[8] && bp.data[9] == bp1.data[9];
p2 = bp.data[2] == bp2.data[2] && bp.data[3] == bp2.data[3] &&
bp.data[4] == bp2.data[4] && bp.data[5] == bp2.data[5] &&
bp.data[6] == bp2.data[6] && bp.data[7] == bp2.data[7] &&
bp.data[8] == bp2.data[8] && bp.data[9] == bp2.data[9];
if (p1 ^ p2) {
uint32_t chara1_array[8];
p1 = 0;
for (uint32_t i = 0; i < 8; ++i) {
if (bp1.data[2 + i] != bp2.data[2 + i]) {
chara1_array[p1++] = i;
}
}
p1 = chara1_array[((hash_u64[0] >> 38) & 0x3f) % p1];
bp.data[2 + p1] = p2 ? bp1.data[2 + p1] : bp2.data[2 + p1];
}
p1 = (PartsEyesCategoryData[bp.data[5]][7] | PartsEyesCategoryData[bp.data[5]][8] | PartsEyesCategoryData[bp.data[5]][9]) &&
(PartsMouthCategoryData[bp.data[6]][8] | PartsMouthCategoryData[bp.data[6]][9] | PartsMouthCategoryData[bp.data[6]][10]) &&
(PartsNoseCategoryData[bp.data[7]][8] | PartsNoseCategoryData[bp.data[7]][9] | PartsNoseCategoryData[bp.data[7]][10]) &&
(PartsBrowsCategoryData[bp.data[8]][8] | PartsBrowsCategoryData[bp.data[8]][9] | PartsBrowsCategoryData[bp.data[8]][10]) &&
(PartsCheekCategoryData[bp.data[9]][7] | PartsCheekCategoryData[bp.data[9]][8] | PartsCheekCategoryData[bp.data[9]][9])
? 76: 0;
p2 = (PartsEyesCategoryData[bp.data[5]][10] | PartsEyesCategoryData[bp.data[5]][11] | PartsEyesCategoryData[bp.data[5]][12]) &&
(PartsMouthCategoryData[bp.data[6]][11] | PartsMouthCategoryData[bp.data[6]][12] |PartsMouthCategoryData[bp.data[6]][13]) &&
(PartsNoseCategoryData[bp.data[7]][11] | PartsNoseCategoryData[bp.data[7]][12] | PartsNoseCategoryData[bp.data[7]][13]) &&
(PartsBrowsCategoryData[bp.data[8]][11] | PartsBrowsCategoryData[bp.data[8]][12] |PartsBrowsCategoryData[bp.data[8]][13]) &&
(PartsCheekCategoryData[bp.data[9]][10] | PartsCheekCategoryData[bp.data[9]][11] |PartsCheekCategoryData[bp.data[9]][12])
? 14: 0;
p3 = (PartsEyesCategoryData[bp.data[5]][13] | PartsEyesCategoryData[bp.data[5]][14] | PartsEyesCategoryData[bp.data[5]][15]) &&
(PartsMouthCategoryData[bp.data[6]][14] | PartsMouthCategoryData[bp.data[6]][15] |PartsMouthCategoryData[bp.data[6]][16]) &&
(PartsNoseCategoryData[bp.data[7]][14] | PartsNoseCategoryData[bp.data[7]][15] | PartsNoseCategoryData[bp.data[7]][16]) &&
(PartsBrowsCategoryData[bp.data[8]][14] | PartsBrowsCategoryData[bp.data[8]][15] |PartsBrowsCategoryData[bp.data[8]][16]) &&
(PartsCheekCategoryData[bp.data[9]][13] | PartsCheekCategoryData[bp.data[9]][14] |PartsCheekCategoryData[bp.data[9]][15])
? 38: 0;
if (p1 + p2 + p3 == 0) {
bp.category1 = 3;
} else {
p3 = ((hash_u64[1] >> 12) & 0x7f) % (p1 + p2 + p3);
bp.category1 = p3 < p1 ? 1 : p3 < p1 + p2 ? 2 : 3;
}
p1 = (BodyIdMap[bp1.data[10] & 0xff] - 1) % 5;
p2 = (BodyIdMap[bp2.data[10] & 0xff] - 1) % 5;
if (p1 > p2) {
p3 = p1;
p1 = p2;
p2 = p3;
}
p4 = p1 + ((hash_u64[0] >> 44) & 0x3ff) % (p2 - p1 + 1);
p1 = (BodyIdMap[bp1.data[10] & 0xff] - 1) / 5;
p2 = (BodyIdMap[bp2.data[10] & 0xff] - 1) / 5;
if (p1 > p2) {
p3 = p1;
p1 = p2;
p2 = p3;
}
bp.data[10] = BodyIdList[5 * (p1 + ((hash_u64[0] >> 54) & 0x3ff) % (p2 - p1 + 1)) + p4 + 1];
p1 = (hash_u64[1] & 0xfff) % NameIdListLen[bp.category1];
p2 = NameIdList[bp.category1][1 + p1];
while (p2 == bp1.data[23] || p2 == bp2.data[23]) {
p1 = (p1 + 1) % NameIdListLen[bp.category1];
p2 = NameIdList[bp.category1][1 + p1];
}
bp.data[23] = p2;
p1 = HeadIdMap[bp1.data[1] & 0xff];
p2 = HeadIdMap[bp2.data[1] & 0xff];
bp.data[1] = 0;
if (p1 == p2) {
if (((hash_u64[1] >> 19) & 0x7fff) % 100 < HeadFusionData[p1][8]) {
bp.data[1] = HeadFusionData[p1][1 + ((hash_u64[1] >> 34) & 0x3)];
}
} else if (HeadFusionData[p1][5] == bp2.data[1]) {
if (((hash_u64[1] >> 19) & 0x7fff) % 100 < HeadFusionData[p1][9]) {
bp.data[1] = HeadFusionData[p1][6];
}
} else if (HeadFusionData[p2][5] == bp1.data[1]) {
if (((hash_u64[1] >> 19) & 0x7fff) % 100 < HeadFusionData[p2][9]) {
bp.data[1] = HeadFusionData[p2][6];
}
}
if (bp.data[1] == 0) {
p3 = ((hash_u64[1] >> 40) & 0x7fff) % 200;
if (p3 < HeadFusionData[p1][7]) {
bp.data[1] = bp1.data[1];
} else if (p3 < 100) {
bp.data[1] = HeadFusionData[p1][0];
} else if (p3 - 100 < HeadFusionData[p2][7]) {
bp.data[1] = bp2.data[1];
} else {
bp.data[1] = HeadFusionData[p2][0];
}
}
uint32_t body_color_array[4];
p1 = 0;
body_color_array[p1++] = bp1.data[11];
if (bp1.data[14] != BodyPatternIdList[1]) {
body_color_array[p1++] = bp1.data[12];
if (bp2.data[11] != bp1.data[11] && bp2.data[11] != bp1.data[12]) {
body_color_array[p1++] = bp2.data[11];
}
if (bp2.data[14] != BodyPatternIdList[1] && bp2.data[12] != bp1.data[11] && bp2.data[12] != bp1.data[12]) {
body_color_array[p1++] = bp2.data[12];
}
} else {
if (bp2.data[11] != bp1.data[11]) {
body_color_array[p1++] = bp2.data[11];
}
if (bp2.data[14] != BodyPatternIdList[1] && bp2.data[12] != bp1.data[11]) {
body_color_array[p1++] = bp2.data[12];
}
}
if (p1 == 1) {
bp.data[11] = body_color_array[0];
bp.data[12] = 0;
bp.data[14] = BodyPatternIdList[1];
} else if ((hash_u64[2] & 0x7fff) % 100 < (p1 == 4 || bp1.data[14] == BodyPatternIdList[1] && bp2.data[14] == BodyPatternIdList[1] ? 20 : 30)) {
p2 = 0;
for (uint32_t i = 0; i < p1; ++i) {
body_color_array[i] = BodyColorIdMap[body_color_array[i] & 0xff];
p2 += BodyColorFusionData[(body_color_array[i] - 2) / 3];
}
p2 = ((hash_u64[2] >> 15) & 0xfff) % p2;
for (uint32_t i = 0; i < p1; ++i) {
if (p2 < BodyColorFusionData[(body_color_array[i] - 2) / 3]) {
bp.data[11] = BodyColorIdList[body_color_array[i]];
bp.data[12] = 0;
bp.data[14] = BodyPatternIdList[1];
break;
}
p2 -= BodyColorFusionData[(body_color_array[i] - 2) / 3];
}
} else {
p2 = ((hash_u64[2] >> 15) & 0xfff);
p3 = body_color_array[p2 % p1];
p4 = body_color_array[p2 % (p1 - 1)];
if (p3 == p4) {
p4 = body_color_array[p1 - 1];
}
bp.data[11] = p3;
if ((BodyColorIdMap[p3 & 0xff] - 2) / 3 == (BodyColorIdMap[p4 & 0xff] - 2) / 3
&& (hash_u64[2] & 0x7fff) % 100 < (bp1.data[14] == BodyPatternIdList[1] && bp2.data[14] == BodyPatternIdList[1] ? 99 : p1 == 2 ? 95 : p1 == 3 ? 90 : 85)) {
bp.data[12] = 0;
bp.data[14] = BodyPatternIdList[1];
} else {
bp.data[12] = p4;
p1 = (BodyPatternRankData[BodyPatternIdMap[bp1.data[14] & 0xff]] + BodyPatternRankData[BodyPatternIdMap[bp2.data[14] & 0xff]]) / 2 - 1;
p2 = ((hash_u64[2] >> 36) & 0x7fff) % 100;
for (uint32_t i = 0; i < 4; ++i) {
if (p2 < BodyPatternFusionData[p1][i]) {
bp.data[14] = BodyPatternData[i+1][(hash_u64[2] >> 51) % BodyPatternDataLen[i+1]];
break;
}
p2 -= BodyPatternFusionData[p1][i];
}
}
}
if (bp1.ability1==bp2.ability1) {
bp.ability1 = bp1.ability1;
}else {
p1=AbilityFusionData[AbilityIdMap[bp1.ability1&0xff]];
p2=AbilityFusionData[AbilityIdMap[bp2.ability1&0xff]];
bp.ability1=((hash_u64[0] >> 20) & 0x3ff) % (p1+p2)<p1?bp1.ability1:bp2.ability1;
}
if (!config_check(bp, config)) {
continue;
}
bp.left_index = ProcessAncestors(l, charas, charas1, Q==0?bps1_map:bps2_map);
bp.right_index = ProcessAncestors(r, charas, charas2, Q==0?bps2_map:bps1_map);
bps.emplace_back(bp);
if(bps.size()+charas.bps.size()>=2000000||(l-charas1.index)*(charas2.bps.size()-charas2.index)+r-charas2.index>=config.limiter){
break;
}
}
if(bps.size()+charas.bps.size()>=2000000||(l-charas1.index+1)*(charas2.bps.size()-charas2.index)>=config.limiter){
break;
}
}
}
EVP_MD_CTX_free(ctx);
EVP_MD_CTX_free(base_ctx);
EVP_MD_CTX_free(temp_ctx);
charas.index = charas.bps.size();
if (!bps.empty()) {
std::shuffle(bps.begin(), bps.end(), g);
charas.bps.reserve(charas.bps.size() + bps.size());
charas.bps.insert(charas.bps.end(), bps.begin(), bps.end());
}
return charas;
}
Charas Merge(const Charas &charas1_,const Charas &charas2_) {
Charas charas;
std::vector<BirthParams> bps;
std::vector<uint32_t> bps1_map(charas1_.bps.size(), 0xffffffff);
std::vector<uint32_t> bps2_map(charas2_.bps.size(), 0xffffffff);
BirthParams bp{};
for (uint32_t Q=0;Q<2;++Q) {
const Charas &charas1=Q==0?charas1_:charas2_;
for (uint32_t l = charas1.index; l < charas1.bps.size(); ++l) {
const BirthParams &bp1 = charas1.bps[l];
bp=bp1;
bp.left_index = ProcessAncestors(bp.left_index, charas, charas1, Q==0?bps1_map:bps2_map);
bp.right_index = ProcessAncestors(bp.right_index, charas, charas1, Q==0?bps1_map:bps2_map);
bps.emplace_back(bp);
}
}
charas.index = charas.bps.size();
if (!bps.empty()) {
charas.bps.reserve(charas.bps.size() + bps.size());
charas.bps.insert(charas.bps.end(), bps.begin(), bps.end());
}
return charas;
}
std::string char_array_to_string(const std::array<char, 8> &arr) {
std::string s;
// 特殊モード(1文字目が '_' の場合)
if (arr[0] == '_') {
s += "_";
char buf[4]; // 2文字 + 終端文字用
for (size_t i = 1; i < 7; ++i) {
if (i > 1) {
s += ":";
}
// std::format の代わりに snprintf を使用
// %02x -> 16進数、2桁、0埋め
std::snprintf(buf, sizeof(buf), "%02x", static_cast<uint8_t>(arr[i]));
s += buf;
}
return s;
}
// 通常モード
for (size_t i = 0; i < 8 && arr[i] != 0; ++i) {
s += arr[i];
}
return s;
}
void trace_chara(const Charas &charas, const uint32_t index) {
const auto &chara = charas.bps[index];
if (chara.left_index != 0xffffffff && chara.right_index != 0xffffffff) {
std::cout << "( ";
trace_chara(charas, chara.left_index);
std::cout << "+ ";
trace_chara(charas, chara.right_index);
std::cout << ") ";
}
if (chara.rsid[0] != 0) {
std::cout << char_array_to_string(chara.rsid) << " ";
}
const auto &p = NameIdMap[chara.data[23] & 0xffff];
std::cout << NameStringList[p.first][p.second] << " ";
}
void print_chara(const Charas &charas, const uint32_t index) {
auto &chara = charas.bps[index];
trace_chara(charas, index);
const auto &p = NameIdMap[chara.data[23] & 0xffff];
std::cout << "頭:" << HeadStringList[HeadIdMap[chara.data[1] & 0xff]] << " ";
std::cout << "髪:" << chara.data[2] << "(" << FaceData[chara.data[2]] << " " << HairData[chara.data[2]] << ")" <<" ";
std::cout << "肌:" << FaceColorIdMap[chara.data[3] & 0xff] << " ";
std::cout << "髪色:" << HairColorIdMap[chara.data[4] & 0xff] << " ";
std::cout << "目:" << chara.data[5] << " ";
std::cout << "口:" << chara.data[6] << " ";
std::cout << "鼻:" << chara.data[7] << " ";
std::cout << "眉:" << chara.data[8] << " ";
std::cout << "頬:" << chara.data[9] << " ";
std::cout << "体格:" << BodyStringList[BodyIdMap[chara.data[10] & 0xff]] << " ";
std::cout << "色:" << BodyColorStringList[BodyColorIdMap[chara.data[11] & 0xff]] << " " << BodyColorStringList[BodyColorIdMap[chara.data[12] & 0xff]] << " ";
std::cout << "柄:" << BodyPatternStringList[BodyPatternIdMap[chara.data[14] & 0xff]] << " ";
std::cout << "アンテナ:" << SkillGroupStringList[SkillGroupIdMap[chara.data[24] & 0xfff]] << " ";
std::cout << AbilityStringList[AbilityIdMap[chara.ability1& 0xff]];
std::cout << std::endl;
}
void print_chara_json(const Charas &charas, const uint32_t index) {
auto &chara = charas.bps[index];
std::cout << "{";
std::cout << '"'<<"rsid"<<'"'<<":"<<'"' << char_array_to_string(chara.rsid) <<'"'<<",";
const auto &p = NameIdMap[chara.data[23] & 0xffff];
std::cout <<'"'<< "name_first"<<'"'<<":" << p.first << ",";
std::cout <<'"'<< "name_second"<<'"'<<":" << p.second << ",";
std::cout <<'"'<< "head"<<'"'<<":" << HeadIdMap[chara.data[1] & 0xff] << ",";
std::cout <<'"'<< "face_type"<<'"'<<":" << chara.data[2]<< ",";
std::cout <<'"'<< "face_color"<<'"'<<":" << FaceColorIdMap[chara.data[3] & 0xff] << ",";
std::cout <<'"'<< "hair_color"<<'"'<<":" << HairColorIdMap[chara.data[4] & 0xff] << ",";
std::cout <<'"'<< "eyes"<<'"'<<":" << chara.data[5]<< ",";
std::cout <<'"'<< "mouth"<<'"'<<":" << chara.data[6]<< ",";
std::cout <<'"'<< "nose"<<'"'<<":" << chara.data[7]<< ",";
std::cout <<'"'<< "brows"<<'"'<<":" << chara.data[8]<< ",";
std::cout <<'"'<< "cheek"<<'"'<<":" << chara.data[9]<< ",";
std::cout <<'"'<< "body"<<'"'<<":" << BodyIdMap[chara.data[10] & 0xff] << ",";
std::cout <<'"'<< "body_color1"<<'"'<<":" << BodyColorIdMap[chara.data[11] & 0xff] << ",";
std::cout <<'"'<< "body_color2"<<'"'<<":" << BodyColorIdMap[chara.data[12] & 0xff] << ",";
std::cout <<'"'<< "body_pattern"<<'"'<<":" << BodyPatternIdMap[chara.data[14] & 0xff] << ",";
std::cout <<'"'<< "skill_group"<<'"'<<":" << SkillGroupIdMap[chara.data[24] & 0xfff] << ",";
std::cout <<'"'<< "ability1"<<'"'<<":" << AbilityIdMap[chara.ability1 & 0xff] << ",";
std::cout <<'"'<< "birth_count"<<'"'<<":" <<chara.data[25] << ",";
std::cout <<'"'<< "pair_param"<<'"'<<":" << static_cast<uint32_t>(chara.pair_param) << ",";
std::cout <<'"'<< "left_index"<<'"'<<":" << chara.left_index << ",";
std::cout <<'"'<< "right_index"<<'"'<<":" << chara.right_index;
std::cout << "}";
}
Charas mac_from_file(const std::string fin,const std::string fout) {
Charas charas;
EVP_MD_CTX *ctx = EVP_MD_CTX_new();
std::array<uint8_t, 7> bytes1{};
bytes1[6] = 0;
std::array<uint8_t, 6> bytes2{};
bytes2[0] = 0x8f;
bytes2[1] = 0x51;
bytes2[2] = 0x52;
std::array<uint8_t, 32> hash_result{};
std::array<uint64_t, 4> hash_u64{};
BirthParams bp{};
std::string line;
std::string filename = fin;
std::ifstream ifs(filename);
while (std::getline(ifs, line)) {
if (line.empty()) {
continue;
}
for (uint32_t i = 0; i < 6; ++i) {
bytes2[i]=0;
if ('0'<=line[3*i]&&line[3*i]<='9') {
bytes2[i]+=line[3*i]-'0';
}
if ('a'<=line[3*i]&&line[3*i]<='f') {
bytes2[i]+=line[3*i]-'a'+10;
}
if ('A'<=line[3*i]&&line[3*i]<='F') {
bytes2[i]+=line[3*i]-'A'+10;
}
bytes2[i]*=16;
if ('0'<=line[3*i+1]&&line[3*i+1]<='9') {
bytes2[i]+=line[3*i+1]-'0';
}
if ('a'<=line[3*i+1]&&line[3*i+1]<='f') {
bytes2[i]+=line[3*i+1]-'a'+10;
}
if ('A'<=line[3*i+1]&&line[3*i+1]<='F') {
bytes2[i]+=line[3*i+1]-'A'+10;
}
}
EVP_DigestInit_ex(ctx, EVP_sha256(), nullptr);
EVP_DigestUpdate(ctx, bytes2.data(), 6);
EVP_DigestFinal_ex(ctx, hash_result.data(), nullptr);
for (auto i = 0; i < 4; ++i) {
memcpy(&hash_u64[i], hash_result.data() + i * 8, sizeof(uint64_t));
}
bp.rsid[0]='_';
for (auto i = 0; i < 6; ++i) {
bp.rsid[i+1] = static_cast<char>(bytes2[i]);
}
bp.rsid[7]=0;
bp.data[14] = 0x8000000e;
uint32_t p1;
uint32_t p2;
uint32_t p3;
//Category1
p1 = hash_u64[0] & 0x7f;
bp.category1 = p1 < 76 ? 1 : p1 < 90 ? 2 : 3;
//Category2
p1 = (hash_u64[0] >> 7) & 0x7f;
bp.category2 = p1 < 60 ? 0 : p1 < 70 ? 1 : 2;
p3 = bp.category1 * 3 + bp.category2 - 3;
//Name
bp.data[23] = NameIdList[bp.category1][1 + ((hash_u64[0] >> 14) & 0xfff) % NameIdListLen[bp.category1]];
//SkillGroup
p1 = hash_u64[1] & 0x3ff;
p1 = p1 < 512 ? 0 : p1 < 841 ? 1 : p1 < 971 ? 2 : p1 < 1019 ? 3 : p1 < 1022 ? 4 : 5;
p2 = ((hash_u64[1] >> 10) & 0xfff) % LotSkillGroupLen[p1];
bp.data[24] = LotSkillGroup[p1][p2];
//BodyColor
p2 = LotSkillGroupColor[p1][p2];
p1 = hash_u64[2] & 0x3fff;
p1 = (p1 < 3960 ? 0 : p1 < 16096 ? 9 : 18) + p2;
bp.data[11] = LotBodyColor[p1][((hash_u64[2] >> 14) & 0x3f) % LotBodyColorLen[p1]];
//Body
p1 = (hash_u64[1] >> 41) & 0x7f;
p1 = p1 < 103 ? 0 : p1 < 126 ? 1 : 2;
bp.data[10] = LotBody[p1][((hash_u64[1] >> 48) & 0x7f) % LotBodyLen[p1]];
//Head
bp.data[1] = LotHead[0][((hash_u64[2] >> 27) & 0xff) % LotHeadLen[0]];
//FaceType
p1 = (((hash_u64[2] >> 35) & 0x7f) < 83 ? 0 : 9) + p3;
bp.data[2] = LotFaceType[p1][((hash_u64[2] >> 42) & 0x1ff) % LotFaceTypeLen[p1]];
//FaceColor
bp.data[3] = LotFaceColor[((hash_u64[2] >> 51) & 0x7f) < 118 ? 0 : 1][(hash_u64[2] >> 58) % 3];
//HairColor
p1 = ((hash_u64[3] & 0x7f) < 118 ? 0 : 9) + p3;
bp.data[4] = LotHairColor[p1][((hash_u64[3] >> 7) & 0x7f) % LotHairColorLen[p1]];
//Eyes
bp.data[5] = LotPartsEyes[p3][((hash_u64[3] >> 14) & 0xff) % LotPartsEyesLen[p3]];
//Mouth
bp.data[6] = LotPartsMouth[p3][((hash_u64[3] >> 22) & 0xff) % LotPartsMouthLen[p3]];
//Nose
bp.data[7] = LotPartsNose[p3][(p2 = (hash_u64[3] >> 30) & 0x7f) % LotPartsNoseLen[p3]];
//Brows
bp.data[8] = LotPartsBrows[p3][((hash_u64[3] >> 37) & 0x7f) % LotPartsBrowsLen[p3]];
//Cheek
if (((hash_u64[3] >> 44) & 0x7f) >= (bp.category2 == 0 ? 118 : bp.category2 == 1 ? 123 : 98)) {
bp.data[9] = LotPartsCheek[p3][((hash_u64[3] >> 51) & 0x3f) % LotPartsCheekLen[p3]];
}else {
bp.data[9]=0;
}
//Pair
p2 = hash_u64[3] >> 57;
bp.pair_param = p2 < 125 ? 0 : p2 < 126 ? 1 : 2;
charas.bps.emplace_back(bp);
if (p2 >= 125) {
bp.data[23] = NameIdList[bp.category1][1 + (((hash_u64[0] >> 14) & 0xfff) + p2) % NameIdListLen[bp.category1]];
if (p2 == 125) {
bp.data[3] = LotFaceColor2[((hash_u64[2] >> 51) & 0x7f) < 118 ? 0 : 1][(hash_u64[2] >> 58) % 3];
} else {
p1 = (hash_u64[1] >> 41) & 0x7f;
p1 = p1 < 103 ? 0 : p1 < 126 ? 1 : 2;
bp.data[10] = LotBody2[p1][((hash_u64[1] >> 48) & 0x7f) % LotBodyLen[p1]];
}
charas.bps.emplace_back(bp);
}
}
EVP_MD_CTX_free(ctx);
save_charas("saves/"+fout+".hype.bin", charas);
return charas;
}
int main(int argc, char *argv[]) {
const std::vector<std::string> args(argv, argv + argc);
if (args.size() < 2) {
std::cout << "ヽ(゚∀。)ノウェ" << std::endl;
return 0;
}
std::filesystem::path saves_dir("saves");
if (!std::filesystem::exists(saves_dir)) {
if (!std::filesystem::create_directory(saves_dir)) {
return 0;
}
}
if (args[1] == "init") {
Charas charas = qr_init();
std::cout << charas.bps.size() << "体のQRキャラを生成しました。" << std::endl;
std::vector<BirthParams> bps;
bps.emplace_back(bp_from_hex("000000000b0000801e00000013000080240000801500000029000000000000000000000001000000070000800400008000000000000000000e0000800000000000000000000000000000000000000000000000000000000000000000d61d70802301008000000000",0));
bps.emplace_back(bp_from_hex("00000000110000803700000016000080120000803a00000046000000130000000700000000000000190000802b0000801f000080000000002d0000800000000000000000000000000000000000000000000000000000000000000000441770801e01008000000000",0));
bps.emplace_back(bp_from_hex("000000001e0000802f000000040000800d000080080000002300000014000000030000000c00000010000080260000802900008000000000260000800000000000000000000000000000000000000000000000000000000000000000811c70803300008000000000",0));
bps.emplace_back(bp_from_hex("000000002200008010000000160000800c00008043000000280000002000000004000000080000001b0000800200008000000000000000000e0000800000000000000000000000000000000000000000000000000000000000000000a3127080ef00008000000000",0));
bps.emplace_back(bp_from_hex("00000000260000800d00000015000080120000803300000013000000120000000900000009000000080000803100008009000080000000001e0000800000000000000000000000000000000000000000000000000000000000000000f51770809d00008000000000",0));
bps.emplace_back(bp_from_hex("000000002c0000805d00000015000080140000801600000023000000250000000c00000008000000080000802600008013000080000000000f0000800000000000000000000000000000000000000000000000000000000000000000741470800201008000000000",0));
bps.emplace_back(bp_from_hex("00000000140000805100000016000080270000803c00000038000000000000001e000000000000000f0000802b0000802d000080000000002f0000800000000000000000000000000000000000000000000000000000000000000000c2157080ab00008000000000",0));
bps.emplace_back(bp_from_hex("00000000240000802e00000010000080250000803b0000002a000000000000000000000009000000060000801b00008016000080000000000d0000800000000000000000000000000000000000000000000000000000000000000000d91870800500008000000000",0));
bps.emplace_back(bp_from_hex("00000000350000804d0000001000008016000080240000004600000000000000000000000900000006000080100000802500008000000000270000800000000000000000000000000000000000000000000000000000000000000000151670807400008000000000",0));
bps.emplace_back(bp_from_hex("0000000001000080550000001000008021000080340000003c00000014000000090000000c0000001b0000802a00008000000000000000000e000080000000000000000000000000000000000000000000000000000000000000000083117080bd00008000000000",0));
bps.emplace_back(bp_from_hex("000000000600008036000000110000801100008001000000060000000000000005000000010000001e0000800d0000802c000080000000001700008000000000000000000000000000000000000000000000000000000000000000008d1d70800400008000000000",0));
bps.emplace_back(bp_from_hex("00000000310000805e00000010000080140000801200000020000000250000000a000000080000000f000080160000802e000080000000000f0000800000000000000000000000000000000000000000000000000000000000000000f71370804200008000000000",0));
bps.emplace_back(bp_from_hex("00000000080000802e0000001600008004000080270000003d000000230000001f000000000000001e0000802e00008000000000000000000e0000800000000000000000000000000000000000000000000000000000000000000000381070809200008000000000",0));
bps.emplace_back(bp_from_hex("000000003600008000000000100000800c0000800e000000010000001400000001000000030000000f0000802a00008000000000000000000e0000800000000000000000000000000000000000000000000000000000000000000000421a7080d700008000000000",0));
bps.emplace_back(bp_from_hex("000000004d00008020000000170000802b0000804200000028000000000000001d00000008000000060000802f00008000000000000000000e0000800000000000000000000000000000000000000000000000000000000000000000eb137080ae00008000000000",0));
bps.emplace_back(bp_from_hex("000000004d000080520000001100008021000080260000003b000000140000000000000009000000140000801200008000000000000000000e0000800000000000000000000000000000000000000000000000000000000000000000bf197080d500008000000000",0));
bps.emplace_back(bp_from_hex("00000000170000804d00000004000080210000800b00000006000000260000000900000001000000080000802c0000802a00008000000000170000800000000000000000000000000000000000000000000000000000000000000000491f70807400008000000000",0));
bps.emplace_back(bp_from_hex("0000000017000080500000001500008018000080310000000600000026000000090000000100000008000080300000802a00008000000000170000800000000000000000000000000000000000000000000000000000000000000000491870809d00008000000000",0));
bps.emplace_back(bp_from_hex("00000000210000804400000010000080270000803c0000002a000000140000000c0000000900000008000080240000802e00008000000000250000800000000000000000000000000000000000000000000000000000000000000000841170804200008000000000",0));
bps.emplace_back(bp_from_hex("00000000450000802600000016000080260000803700000043000000260000000c0000000d000000060000802b00008000000000000000000e0000800000000000000000000000000000000000000000000000000000000000000000a2137080bd00008000000000",0));
bps.emplace_back(bp_from_hex("00000000340000803d00000017000080160000803f000000240000000000000015000000000000000d0000801600008000000000000000000e00008000000000000000000000000000000000000000000000000000000000000000006a1a70801901008000000000",2265055704));
bps.emplace_back(bp_from_hex("0000000021000080210000001500008015000080380000000b000000000000000000000009000000080000802400008004000080000000000e0000800000000000000000000000000000000000000000000000000000000000000000a01070800500008000000000",0));
bps.emplace_back(bp_from_hex("00000000020000804b00000011000080100000803a00000045000000000000000c00000009000000080000801200008015000080000000000e0000800000000000000000000000000000000000000000000000000000000000000000e01b70808e00008000000000",0));
bps.emplace_back(bp_from_hex("000000000b0000803900000015000080270000803c0000003e000000000000000c00000004000000060000803100008000000000000000000e0000800000000000000000000000000000000000000000000000000000000000000000331970803500008000000000",2265055704));
bps.emplace_back(bp_from_hex("000000003a0000801c000000150000800300008012000000460000001400000009000000010000000f000080040000801800008000000000130000800000000000000000000000000000000000000000000000000000000000000000fd157080d400008000000000",0));
bps.emplace_back(bp_from_hex("00000000270000804700000010000080140000803b00000020000000140000000c0000000100000008000080030000801d000080000000000c00008000000000000000000000000000000000000000000000000000000000000000003d1c70802500008000000000",0));
bps.emplace_back(bp_from_hex("00000000040000802600000010000080300000800800000039000000140000000c0000000c0000000a0000801300008018000080000000000c0000800000000000000000000000000000000000000000000000000000000000000000a21470803300008000000000",0));
bps.emplace_back(bp_from_hex("000000004c000080360000000400008004000080400000003c000000000000000000000004000000120000802a00008007000080000000000200008000000000000000000000000000000000000000000000000000000000000000006b117080dd00008000000000",0));
bps.emplace_back(bp_from_hex("00000000180000800e0000001000008012000080290000001b0000000f00000022000000000000000f000080110000801800008000000000250000800000000000000000000000000000000000000000000000000000000000000000a91070805d00008000000000",0));
bps.emplace_back(bp_from_hex("000000002d000080100000001000008028000080010000000b00000000000000230000000c0000000f000080190000801d00008000000000250000800000000000000000000000000000000000000000000000000000000000000000411e70809400008000000000",0));
bps.emplace_back(bp_from_hex("000000003e00008009000000140000800e0000802d00000039000000250000000400000008000000190000801700008030000080000000000800008000000000000000000000000000000000000000000000000000000000000000004b1b7080d500008000000000",0));
bps.emplace_back(bp_from_hex("0000000049000080490000001500008027000080380000002a00000010000000260000000900000008000080270000802400008000000000030000800000000000000000000000000000000000000000000000000000000000000000cc1b70800d01008000000000",0));
bps.emplace_back(bp_from_hex("000000002300008048000000110000802f000080240000000b000000140000000300000009000000080000800900008028000080000000000700008000000000000000000000000000000000000000000000000000000000000000003e1c70800401008000000000",0));
bps.emplace_back(bp_from_hex("0000000021000080230000000c000080110000801b00000026000000270000000000000008000000080000802b00008012000080000000000c0000800000000000000000000000000000000000000000000000000000000000000000f3107080b900008000000000",0));
bps.emplace_back(bp_from_hex("000000000d0000804400000010000080240000800300000046000000000000000c00000009000000080000802c00008012000080000000000c0000800000000000000000000000000000000000000000000000000000000000000000b31570808e00008000000000",0));
bps.emplace_back(bp_from_hex("000000000300008032000000110000802f000080190000003900000008000000000000000400000007000080280000802c00008000000000050000800000000000000000000000000000000000000000000000000000000000000000491470800201008000000000",0));
bps.emplace_back(bp_from_hex("000000004d0000805400000015000080270000804000000035000000000000001b00000001000000140000800400008000000000000000000e00008000000000000000000000000000000000000000000000000000000000000000004f1870809f00008000000000",0));
bps.emplace_back(bp_from_hex("00000000480000802300000010000080160000804000000021000000000000002500000008000000140000802500008000000000000000000e00008000000000000000000000000000000000000000000000000000000000000000002c1370805e00008000000000",0));
bps.emplace_back(bp_from_hex("000000000200008026000000160000800d0000804000000040000000000000001c00000004000000140000802600008000000000000000000e0000800000000000000000000000000000000000000000000000000000000000000000a9157080b400008000000000",0));
bps.emplace_back(bp_from_hex("00000000050000801e0000001100008018000080080000000b0000001400000009000000090000001e000080100000802c00008000000000060000800000000000000000000000000000000000000000000000000000000000000000b7117080d500008000000000",0));
bps.emplace_back(bp_from_hex("00000000030000801f00000004000080180000802400000013000000000000000c000000080000000b0000800100008004000080000000001e0000800000000000000000000000000000000000000000000000000000000000000000e7117080dd00008000000000",0));
bps.emplace_back(bp_from_hex("000000001e0000800900000004000080180000801200000002000000130000000900000009000000080000802b00008000000000000000000e000080000000000000000000000000000000000000000000000000000000000000000045137080d400008000000000",0));
bps.emplace_back(bp_from_hex("000000002000008026000000140000800c000080330000002900000004000000050000000c0000001e0000800d00008000000000000000000e0000800000000000000000000000000000000000000000000000000000000000000000611c70805d00008000000000",0));
bps.emplace_back(bp_from_hex("0000000033000080460000001500008028000080270000003b0000002400000003000000090000000f000080240000802e000080000000000c00008000000000000000000000000000000000000000000000000000000000000000000e1d70809b00008000000000",0));
bps.emplace_back(bp_from_hex("000000003d0000801b0000000300008016000080410000000400000014000000090000000100000009000080070000802b00008000000000150000800000000000000000000000000000000000000000000000000000000000000000731170808600008000000000",0));
bps.emplace_back(bp_from_hex("000000000a0000804d00000011000080210000803b0000004600000020000000090000000100000010000080240000802a000080000000000c00008000000000000000000000000000000000000000000000000000000000000000002b1570800500008000000000",0));
bps.emplace_back(bp_from_hex("0000000045000080500000001000008003000080300000001a0000000300000026000000010000000a000080130000802a000080000000001e000080000000000000000000000000000000000000000000000000000000000000000042107080b500008000000000",0));
bps.emplace_back(bp_from_hex("0000000007000080120000000300008029000080080000003500000000000000000000000c000000110000802800008000000000000000000e0000800000000000000000000000000000000000000000000000000000000000000000471c70800d01008000000000",0));
bps.emplace_back(bp_from_hex("000000001e0000800c00000011000080270000801600000009000000100000000900000001000000100000802d0000802e00008000000000250000800000000000000000000000000000000000000000000000000000000000000000521c70807b00008000000000",0));
bps.emplace_back(bp_from_hex("00000000090000805d00000015000080040000803e0000002600000014000000160000000b000000140000801a00008000000000000000000e00008000000000000000000000000000000000000000000000000000000000000000006b1370800700008000000000",0));
bps.emplace_back(bp_from_hex("000000002c00008047000000040000802500008007000000250000001f0000000b00000009000000140000802b0000801000008000000000040000800000000000000000000000000000000000000000000000000000000000000000811a70800501008000000000",0));
bps.emplace_back(bp_from_hex("000000000b000080480000001600008014000080240000000b000000140000000c000000090000001b0000802e00008000000000000000000e00008000000000000000000000000000000000000000000000000000000000000000005e1270809000008000000000",0));
bps.emplace_back(bp_from_hex("00000000470000800900000018000080260000803f00000040000000000000001500000003000000080000800200008021000080000000002f0000800000000000000000000000000000000000000000000000000000000000000000e31f70808f00008000000000",0));
bps.emplace_back(bp_from_hex("000000002000008012000000100000800d00008041000000320000000000000000000000010000001b000080030000801b000080000000002c0000800000000000000000000000000000000000000000000000000000000000000000fc1f70804200008000000000",0));
bps.emplace_back(bp_from_hex("000000002e0000804600000017000080250000803c0000003b0000001400000009000000080000000f0000801d0000801000008000000000250000800000000000000000000000000000000000000000000000000000000000000000c31c70803300008000000000",0));
bps.emplace_back(bp_from_hex("0000000001000080570000001300008012000080150000000b000000000000000000000001000000080000802c00008011000080000000002c00008000000000000000000000000000000000000000000000000000000000000000006d1a7080a400008000000000",0));
bps.emplace_back(bp_from_hex("000000000f00008014000000040000800400008040000000010000000000000000000000090000001500008007000080190000800000000013000080000000000000000000000000000000000000000000000000000000000000000079157080d500008000000000",0));
bps.emplace_back(bp_from_hex("000000001b00008021000000100000802f000080010000000b0000001400000002000000010000000f0000802b00008000000000000000000e00008000000000000000000000000000000000000000000000000000000000000000009c1170802301008000000000",0));
bps.emplace_back(bp_from_hex("000000000a0000802600000010000080270000803b0000002000000000000000090000000100000008000080110000801800008000000000170000800000000000000000000000000000000000000000000000000000000000000000da1f7080d400008000000000",0));
bps.emplace_back(bp_from_hex("00000000030000801f000000010000800c000080330000001d000000040000000a0000000b000000190000802e0000803000008000000000080000800000000000000000000000000000000000000000000000000000000000000000c61470809d00008000000000",2265055704));
bps.emplace_back(bp_from_hex("00000000450000804900000013000080240000801c00000034000000140000000a00000009000000140000802b00008017000080000000000f00008000000000000000000000000000000000000000000000000000000000000000003b1e7080e000008000000000",0));
bps.emplace_back(bp_from_hex("00000000040000805d00000016000080210000802900000026000000240000000000000003000000190000802b00008003000080000000002e00008000000000000000000000000000000000000000000000000000000000000000007a1370809400008000000000",0));
bps.emplace_back(bp_from_hex("00000000220000805900000011000080260000802d000000030000001800000022000000080000001e0000802b00008013000080000000002d0000800000000000000000000000000000000000000000000000000000000000000000da1870801901008000000000",0));
bps.emplace_back(bp_from_hex("00000000250000802500000010000080030000804300000046000000100000001d000000090000000d0000802a0000801000008000000000030000800000000000000000000000000000000000000000000000000000000000000000c81170807400008000000000",2265055596));
bps.emplace_back(bp_from_hex("000000004500008045000000030000800d00008031000000420000001400000015000000080000000f0000802a00008029000080000000001700008000000000000000000000000000000000000000000000000000000000000000003a107080b700008000000000",0));
bps.emplace_back(bp_from_hex("000000000b00008047000000110000802f000080120000003c00000014000000090000000c00000019000080280000802a00008000000000080000800000000000000000000000000000000000000000000000000000000000000000d7137080bd00008000000000",0));
bps.emplace_back(bp_from_hex("000000000e0000801c0000000400008004000080210000000b000000140000000c000000010000000f000080290000802c000080000000002600008000000000000000000000000000000000000000000000000000000000000000007d1b7080dd00008000000000",0));
bps.emplace_back(bp_from_hex("000000000a0000805100000010000080300000804100000006000000260000000c0000000d0000001b0000802700008028000080000000002c0000800000000000000000000000000000000000000000000000000000000000000000861d70800201008000000000",0));
bps.emplace_back(bp_from_hex("00000000030000804f00000010000080180000801b0000002e00000027000000260000000c000000080000802c00008027000080000000001e0000800000000000000000000000000000000000000000000000000000000000000000c71270800500008000000000",2265055929));
bps.emplace_back(bp_from_hex("00000000420000802000000010000080270000802d00000009000000200000000000000001000000120000801f00008014000080000000002d0000800000000000000000000000000000000000000000000000000000000000000000c31470801e01008000000000",0));
bps.emplace_back(bp_from_hex("00000000210000803d000000160000801200008002000000070000001d00000001000000080000000f0000801100008003000080000000000f00008000000000000000000000000000000000000000000000000000000000000000004f1e70809e00008000000000",0));
bps.emplace_back(bp_from_hex("000000003400008001000000040000800c0000803d000000010000002300000015000000000000000f0000801d0000801200008000000000150000800000000000000000000000000000000000000000000000000000000000000000281070808e00008000000000",2265055408));
bps.emplace_back(bp_from_hex("00000000240000805700000003000080210000802400000020000000000000000c000000080000001b0000802a00008000000000000000000e0000800000000000000000000000000000000000000000000000000000000000000000d11170805d00008000000000",0));
bps.emplace_back(bp_from_hex("00000000490000801f000000100000802b000080380000003900000020000000260000000100000010000080270000802f000080000000002e000080000000000000000000000000000000000000000000000000000000000000000024157080d500008000000000",0));
bps.emplace_back(bp_from_hex("00000000230000801e0000000400008030000080330000002a000000140000000900000001000000100000802f0000801600008000000000250000800000000000000000000000000000000000000000000000000000000000000000be1170802700008000000000",2265055421));
bps.emplace_back(bp_from_hex("000000004d0000804f00000010000080030000800200000001000000140000000000000009000000100000802b00008000000000000000000e000080000000000000000000000000000000000000000000000000000000000000000040127080a900008000000000",2265056182));
bps.emplace_back(bp_from_hex("000000004d0000801900000010000080100000801800000045000000040000000000000004000000140000802800008000000000000000000e0000800000000000000000000000000000000000000000000000000000000000000000ca1d7080d500008000000000",0));
bps.emplace_back(bp_from_hex("000000004d00008018000000100000801000008018000000450000000400000000000000010000001f0000802c00008000000000000000000e0000800000000000000000000000000000000000000000000000000000000000000000461e70801901008000000000",0));
bps.emplace_back(bp_from_hex("000000004d0000800c000000100000801000008002000000000000000400000000000000010000001f0000803000008000000000000000000e0000800000000000000000000000000000000000000000000000000000000000000000661770800201008000000000",0));
bps.emplace_back(bp_from_hex("00000000210000801d0000001300008021000080090000000a0000001e00000005000000030000001d0000802d00008000000000000000000e00008000000000000000000000000000000000000000000000000000000000000000009a1970807e00008000000000",0));
bps.emplace_back(bp_from_hex("0000000045000080390000000f00008010000080260000000c00000002000000050000000c0000000f0000800100008000000000000000000e0000800000000000000000000000000000000000000000000000000000000000000000b01b7080b400008000000000",0));
bps.emplace_back(bp_from_hex("000000002c00008058000000170000802f0000801a0000003d0000000e0000001200000008000000140000802600008000000000000000000e0000800000000000000000000000000000000000000000000000000000000000000000541370809200008000000000",0));
bps.emplace_back(bp_from_hex("00000000090000804100000003000080100000802200000003000000000000000c0000000c000000160000800900008000000000000000000e000080000000000000000000000000000000000000000000000000000000000000000094197080a900008000000000",0));
bps.emplace_back(bp_from_hex("00000000210000801d0000001300008021000080090000000a0000001e00000005000000030000001d0000802d00008000000000000000000e00008000000000000000000000000000000000000000000000000000000000000000009a1970804200008000000000",0));
bps.emplace_back(bp_from_hex("0000000045000080390000000f00008010000080260000000c00000002000000050000000c0000000f0000800100008000000000000000000e0000800000000000000000000000000000000000000000000000000000000000000000b01b7080d500008000000000",0));
bps.emplace_back(bp_from_hex("000000002c00008058000000170000802f0000801a0000003d0000000e0000001200000008000000140000802600008000000000000000000e000080000000000000000000000000000000000000000000000000000000000000000054137080c900008000000000",0));
bps.emplace_back(bp_from_hex("00000000090000804100000003000080100000802200000003000000000000000c0000000c000000160000800900008000000000000000000e000080000000000000000000000000000000000000000000000000000000000000000094197080b700008000000000",0));
bps.emplace_back(bp_from_hex("00000000090000804100000003000080100000802200000003000000000000000c0000000c000000160000800900008000000000000000000e0000800000000000000000000000000000000000000000000000000000000000000000941970802100008000000000",0));
bps.emplace_back(bp_from_hex("000000002e0000803000000010000080280000803100000017000000170000000000000001000000190000801400008000000000000000000e0000800000000000000000000000000000000000000000000000000000000000000000011270802801008000000000",0));
bps.emplace_back(bp_from_hex("000000002e0000803000000010000080170000802300000008000000170000000000000001000000190000802500008000000000000000000e0000800000000000000000000000000000000000000000000000000000000000000000a81b70802801008000000000",0));
bps.emplace_back(bp_from_hex("000000002e0000803000000010000080240000800800000030000000170000000000000001000000190000800100008000000000000000000e0000800000000000000000000000000000000000000000000000000000000000000000411f70802801008000000000",0));
bps.emplace_back(bp_from_hex("000000004d000080000000001000008010000080020000002a000000000000000000000009000000100000802100008000000000000000000e0000800000000000000000000000000000000000000000000000000000000000000000b7117080a900008000000000",0));
bps.emplace_back(bp_from_hex("000000003d0000800a000000100000801600008004000000010000001f0000000b00000000000000100000801b00008000000000000000000e0000800000000000000000000000000000000000000000000000000000000000000000691170809f00008000000000",0));
bps.emplace_back(bp_from_hex("00000000090000801f0000001000008018000080240000000b000000140000000300000009000000100000800900008000000000000000000e0000800000000000000000000000000000000000000000000000000000000000000000b0187080b400008000000000",0));
bps.emplace_back(bp_from_hex("00000000050000804100000015000080100000800800000040000000140000000c00000001000000100000800400008000000000000000000e000080000000000000000000000000000000000000000000000000000000000000000045137080d500008000000000",0));
bps.emplace_back(bp_from_hex("0000000034000080010000000f0000800c0000801700000018000000140000000100000000000000100000801b00008000000000000000000e0000800000000000000000000000000000000000000000000000000000000000000000d51e7080bf00008000000000",0));
bps.emplace_back(bp_from_hex("000000003600008014000000150000802f000080150000002e000000000000000000000003000000100000802800008000000000000000000e0000800000000000000000000000000000000000000000000000000000000000000000cf1770802801008000000000",0));
bps.emplace_back(bp_from_hex("000000002d00008029000000160000800c0000802f0000003d000000190000000400000000000000100000802d0000802e00008000000000060000800000000000000000000000000000000000000000000000000000000000000000011270804c00008000000000",0));
bps.emplace_back(bp_from_hex("0000000048000080260000001000008026000080160000001f000000000000000c00000000000000100000802b00008000000000000000000e00008000000000000000000000000000000000000000000000000000000000000000004b1170809200008000000000",0));
bps.emplace_back(bp_from_hex("000000000b0000801000000004000080170000802200000018000000120000000c00000006000000160000800400008000000000000000000e0000800000000000000000000000000000000000000000000000000000000000000000341270802801008000000000",0));
bps.emplace_back(bp_from_hex("000000004d00008008000000150000800c000080180000001d000000070000000200000000000000100000802500008000000000000000000e0000800000000000000000000000000000000000000000000000000000000000000000fc1d70802801008000000000",0));
bps.emplace_back(bp_from_hex("00000000240000800c00000010000080100000801b00000006000000080000000000000004000000100000802600008000000000000000000e0000800000000000000000000000000000000000000000000000000000000000000000061a70802801008000000000",0));
bps.emplace_back(bp_from_hex("000000003a0000801d000000110000800d0000801b00000002000000120000000c00000001000000060000801500008000000000000000000e0000800000000000000000000000000000000000000000000000000000000000000000a11970802801008000000000",0));
bps.emplace_back(bp_from_hex("000000002c00008002000000040000800c0000801a0000000400000000000000020000000000000016000080150000800900008000000000160000800000000000000000000000000000000000000000000000000000000000000000a11170807e00008000000000",0));
bps.emplace_back(bp_from_hex("00000000070000800100000014000080100000800000000001000000000000000500000001000000160000802600008000000000000000000e0000800000000000000000000000000000000000000000000000000000000000000000971170805e00008000000000",0));
bps.emplace_back(bp_from_hex("00000000330000800100000016000080110000802d0000002f000000000000001d00000000000000100000800900008000000000000000000e0000800000000000000000000000000000000000000000000000000000000000000000dd1170802801008000000000",0));
bps.emplace_back(bp_from_hex("000000001e0000802d000000150000802f0000804000000000000000270000000b00000009000000100000802d00008000000000000000000e00008000000000000000000000000000000000000000000000000000000000000000003d1e70801601008000000000",0));
bps.emplace_back(bp_from_hex("00000000210000802200000011000080270000800e00000035000000000000000000000000000000100000802600008000000000000000000e0000800000000000000000000000000000000000000000000000000000000000000000bc167080ef00008000000000",0));
bps.emplace_back(bp_from_hex("000000002e00008024000000100000800c000080030000000b000000000000000000000000000000100000801000008000000000000000000e0000800000000000000000000000000000000000000000000000000000000000000000671870802801008000000000",0));
bps.emplace_back(bp_from_hex("000000000c00008001000000100000800c0000803d000000010000001d0000001500000008000000100000800200008000000000000000000e0000800000000000000000000000000000000000000000000000000000000000000000e91970802801008000000000",0));
bps.emplace_back(bp_from_hex("0000000045000080120000000c0000800f000080020000000800000000000000000000000b000000160000800900008000000000000000000e0000800000000000000000000000000000000000000000000000000000000000000000db1870808700008000000000",0));
bps.emplace_back(bp_from_hex("000000004d00008000000000100000800c0000800000000000000000000000000000000000000000190000802b00008000000000000000000e0000800000000000000000000000000000000000000000000000000000000000000000401270802801008000000000",0));
bps.emplace_back(bp_from_hex("00000000350000802600000015000080030000800200000002000000200000000500000004000000140000802a0000801c000080000000000e000080000000000000000000000000000000000000000000000000000000000000000045137080d500008000000000",0));
bps.emplace_back(bp_from_hex("000000002700008045000000040000801700008014000000000000002300000015000000080000001b0000801a00008000000000000000000e00008000000000000000000000000000000000000000000000000000000000000000001d1570802801008000000000",0));
bps.emplace_back(bp_from_hex("00000000310000802e000000160000800c0000802d000000210000000200000022000000030000001e000080240000801c000080000000000e0000800000000000000000000000000000000000000000000000000000000000000000111470801901008000000000",0));
bps.emplace_back(bp_from_hex("00000000240000801d000000110000800d0000801b00000002000000120000000c000000010000001f0000802c00008000000000000000000e00008000000000000000000000000000000000000000000000000000000000000000008d177080a900008000000000",0));
bps.emplace_back(bp_from_hex("0000000038000080480000001000008030000080080000000900000010000000070000000900000010000080010000801c000080000000000e0000800000000000000000000000000000000000000000000000000000000000000000411370802801008000000000",0));
bps.emplace_back(bp_from_hex("00000000200000802d00000001000080110000802900000024000000030000002000000000000000040000800d00008000000000000000000e00008000000000000000000000000000000000000000000000000000000000000000008a1a70802801008000000000",0));
bps.emplace_back(bp_from_hex("0000000026000080350000001a0000802b0000801600000043000000140000000300000000000000080000802d0000801c000080000000000e0000800000000000000000000000000000000000000000000000000000000000000000011670800201008000000000",0));
bps.emplace_back(bp_from_hex("000000004d00008000000000040000800c00008000000000000000000000000000000000000000000b0000802b00008000000000000000000e00008000000000000000000000000000000000000000000000000000000000000000004b2770802801008000000000",0));
bps.emplace_back(bp_from_hex("000000001700008001000000110000800400008001000000010000000100000001000000010000000c000080140000801c000080000000000e0000800000000000000000000000000000000000000000000000000000000000000000292d70800201008000000000",0));
bps.emplace_back(bp_from_hex("000000003600008002000000150000800f0000800200000002000000020000000200000002000000170000801f0000800200008000000000150000800000000000000000000000000000000000000000000000000000000000000000572470808600008000000000",0));
bps.emplace_back(bp_from_hex("0000000002000080030000000f0000801000008003000000030000000300000003000000030000001c0000800400008000000000000000000e0000800000000000000000000000000000000000000000000000000000000000000000e9217080b400008000000000",0));
bps.emplace_back(bp_from_hex("0000000007000080040000000c00008015000080040000000400000004000000040000000400000004000080240000801c000080000000000e00008000000000000000000000000000000000000000000000000000000000000000003d297080a900008000000000",0));
bps.emplace_back(bp_from_hex("0000000048000080050000001400008021000080050000000500000005000000050000000500000009000080270000802b00008000000000160000800000000000000000000000000000000000000000000000000000000000000000d32870801300008000000000",0));
bps.emplace_back(bp_from_hex("000000001f00008006000000100000801600008006000000060000000600000006000000060000000d0000802500008000000000000000000e0000800000000000000000000000000000000000000000000000000000000000000000b52e70800100008000000000",0));
bps.emplace_back(bp_from_hex("000000004700008007000000160000800d0000800700000007000000070000000700000007000000130000801a0000801c000080000000000e00008000000000000000000000000000000000000000000000000000000000000000005e2370807700008000000000",0));
bps.emplace_back(bp_from_hex("000000003d00008008000000010000802600008008000000080000000800000008000000080000000e000080100000800400008000000000160000800000000000000000000000000000000000000000000000000000000000000000062c7080d900008000000000",0));
bps.emplace_back(bp_from_hex("000000000900008009000000120000801800008009000000090000000900000009000000090000001d0000802600008000000000000000000e0000800000000000000000000000000000000000000000000000000000000000000000c7237080dd00008000000000",0));
bps.emplace_back(bp_from_hex("000000000c0000800a0000001a0000802f0000800a0000000a0000000a0000000a0000000a00000014000080130000801c000080000000000e0000800000000000000000000000000000000000000000000000000000000000000000e82270802301008000000000",0));
bps.emplace_back(bp_from_hex("000000000b0000800b00000003000080270000800b0000000b0000000b0000000b0000000b0000000f000080290000802500008000000000060000800000000000000000000000000000000000000000000000000000000000000000552f7080ef00008000000000",0));
bps.emplace_back(bp_from_hex("00000000420000800c000000170000800e0000800c0000000c0000000c0000000c0000000c000000190000800900008000000000000000000e0000800000000000000000000000000000000000000000000000000000000000000000182970801e01008000000000",0));
bps.emplace_back(bp_from_hex("00000000180000800d00000018000080030000800d0000000d0000000d0000000d0000000d0000001e000080310000801c000080000000000e0000800000000000000000000000000000000000000000000000000000000000000000752470800400008000000000",0));
bps.emplace_back(bp_from_hex("00000000200000800e00000013000080110000800e0000000e0000000e0000000e0000000000000015000080280000802600008000000000060000800000000000000000000000000000000000000000000000000000000000000000832b70800401008000000000",0));
bps.emplace_back(bp_from_hex("000000003a0000800f00000004000080140000800f0000000f0000000f0000000f00000001000000060000801500008000000000000000000e000080000000000000000000000000000000000000000000000000000000000000000021297080b900008000000000",0));
bps.emplace_back(bp_from_hex("0000000003000080100000001100008012000080100000001000000010000000100000000200000010000080120000801c000080000000000e0000800000000000000000000000000000000000000000000000000000000000000000d22f7080e100008000000000",0));
bps.emplace_back(bp_from_hex("00000000050000801100000015000080170000801100000011000000110000001100000003000000080000802c00008009000080000000001e0000800000000000000000000000000000000000000000000000000000000000000000cc267080a100008000000000",0));
bps.emplace_back(bp_from_hex("0000000045000080120000000f0000801d00008012000000120000001200000012000000040000001b0000801b00008000000000000000000e0000800000000000000000000000000000000000000000000000000000000000000000bf297080c500008000000000",0));
bps.emplace_back(bp_from_hex("0000000004000080130000000c00008028000080130000001300000013000000130000000500000012000080030000801c000080000000000e0000800000000000000000000000000000000000000000000000000000000000000000882270800900008000000000",0));
bps.emplace_back(bp_from_hex("00000000380000801400000014000080250000801400000014000000140000001400000006000000110000801600008015000080000000001e0000800000000000000000000000000000000000000000000000000000000000000000ef2b70809200008000000000",0));
bps.emplace_back(bp_from_hex("00000000080000801500000010000080290000801500000015000000150000001500000007000000160000802100008000000000000000000e0000800000000000000000000000000000000000000000000000000000000000000000f42d7080c300008000000000",0));
bps.emplace_back(bp_from_hex("0000000034000080160000001600008024000080160000001600000016000000160000000800000003000080070000801c000080000000000e0000800000000000000000000000000000000000000000000000000000000000000000cf2a70804500008000000000",0));
bps.emplace_back(bp_from_hex("000000002100008017000000010000802b0000801700000017000000170000001700000009000000070000802a0000801b000080000000002c0000800000000000000000000000000000000000000000000000000000000000000000c7247080a300008000000000",0));
bps.emplace_back(bp_from_hex("000000000a000080180000001200008030000080180000001800000018000000180000000a0000000a0000802d00008000000000000000000e0000800000000000000000000000000000000000000000000000000000000000000000692570800501008000000000",0));
bps.emplace_back(bp_from_hex("000000003e000080190000001a0000800c000080190000001900000019000000190000000b0000001f0000802e0000801c000080000000000e0000800000000000000000000000000000000000000000000000000000000000000000b6297080a400008000000000",0));
bps.emplace_back(bp_from_hex("000000001e0000801a00000003000080040000801a0000001a0000001a0000001a0000000c000000010000802f00008021000080000000002c0000800000000000000000000000000000000000000000000000000000000000000000e12a7080d600008000000000",0));
bps.emplace_back(bp_from_hex("00000000330000801b000000170000800f0000801b0000001b0000001b0000001b0000000d0000001a0000800100008000000000000000000e0000800000000000000000000000000000000000000000000000000000000000000000922670803000008000000000",0));
bps.emplace_back(bp_from_hex("00000000220000801c00000018000080100000801c0000001c0000001c0000001c0000000000000018000080170000801c000080000000000e0000800000000000000000000000000000000000000000000000000000000000000000622370804c00008000000000",0));
bps.emplace_back(bp_from_hex("00000000140000801d00000013000080150000801d0000001d0000001d0000001d0000000100000002000080300000802d00008000000000170000800000000000000000000000000000000000000000000000000000000000000000af2f7080ac00008000000000",0));
bps.emplace_back(bp_from_hex("000000002c0000801e00000004000080210000801e0000001e0000001e0000001e000000020000000b0000800d00008000000000000000000e00008000000000000000000000000000000000000000000000000000000000000000004b277080bd00008000000000",0));
bps.emplace_back(bp_from_hex("000000000d0000801f00000011000080160000801f0000001f0000001f0000001f000000030000000c000080110000801c000080000000000e0000800000000000000000000000000000000000000000000000000000000000000000292d70805e00008000000000",0));
bps.emplace_back(bp_from_hex("000000000e00008020000000150000800d000080200000002000000020000000200000000400000017000080180000800100008000000000170000800000000000000000000000000000000000000000000000000000000000000000572470809b00008000000000",0));
bps.emplace_back(bp_from_hex("000000004c000080210000000f0000802600008021000000210000002100000021000000050000001c0000800200008000000000000000000e0000800000000000000000000000000000000000000000000000000000000000000000e92170807400008000000000",0));
bps.emplace_back(bp_from_hex("000000002d000080220000000c00008018000080220000002200000022000000220000000600000004000080190000801c000080000000000e00008000000000000000000000000000000000000000000000000000000000000000003d2970801601008000000000",0));
bps.emplace_back(bp_from_hex("000000001100008023000000140000802f0000802300000023000000230000002300000007000000090000801d0000800d000080000000000c0000800000000000000000000000000000000000000000000000000000000000000000d3287080b500008000000000",0));
bps.emplace_back(bp_from_hex("000000004f00008024000000100000802700008024000000240000002400000024000000080000000d0000802b00008000000000000000000e0000800000000000000000000000000000000000000000000000000000000000000000b52e70803300008000000000",0));
bps.emplace_back(bp_from_hex("000000002700008025000000160000800e000080250000002500000025000000250000000900000013000080140000801c000080000000000e00008000000000000000000000000000000000000000000000000000000000000000005e2370808700008000000000",0));
bps.emplace_back(bp_from_hex("0000000023000080260000000100008003000080260000002600000026000000260000000a0000000e0000801f00008004000080000000000c0000800000000000000000000000000000000000000000000000000000000000000000062c70809000008000000000",0));
bps.emplace_back(bp_from_hex("0000000024000080270000001200008011000080270000002700000027000000000000000b0000001d0000800400008000000000000000000e0000800000000000000000000000000000000000000000000000000000000000000000c72370809d00008000000000",0));
bps.emplace_back(bp_from_hex("0000000001000080280000001a00008014000080280000002800000028000000010000000c00000014000080240000801c000080000000000e0000800000000000000000000000000000000000000000000000000000000000000000e8227080bf00008000000000",0));
bps.emplace_back(bp_from_hex("0000000049000080290000000300008012000080290000002900000029000000020000000d0000000f000080270000802500008000000000030000800000000000000000000000000000000000000000000000000000000000000000552f70800700008000000000",0));
bps.emplace_back(bp_from_hex("00000000060000802a00000017000080170000802a0000002a000000000000000300000000000000190000802500008000000000000000000e0000800000000000000000000000000000000000000000000000000000000000000000182970808e00008000000000",0));
bps.emplace_back(bp_from_hex("000000002e0000802b000000180000801d0000802b0000002b0000000100000004000000010000001e0000801a0000801c000080000000000e0000800000000000000000000000000000000000000000000000000000000000000000752470807e00008000000000",0));
bps.emplace_back(bp_from_hex("000000002f0000802c00000013000080280000802c0000002c00000002000000050000000200000015000080100000802600008000000000030000800000000000000000000000000000000000000000000000000000000000000000832b70809e00008000000000",0));
bps.emplace_back(bp_from_hex("00000000160000802d00000004000080250000802d0000002d000000030000000600000003000000060000802600008000000000000000000e0000800000000000000000000000000000000000000000000000000000000000000000212970804200008000000000",0));
bps.emplace_back(bp_from_hex("00000000250000802e00000011000080290000802e0000002e00000004000000070000000400000010000080130000801c000080000000000e0000800000000000000000000000000000000000000000000000000000000000000000d22f70809f00008000000000",0));
bps.emplace_back(bp_from_hex("00000000260000802f00000015000080240000802f0000002f00000005000000080000000500000008000080290000800900008000000000260000800000000000000000000000000000000000000000000000000000000000000000cc2670802700008000000000",0));
bps.emplace_back(bp_from_hex("0000000031000080300000000f0000802b00008030000000300000000600000009000000060000001b0000800900008000000000000000000e0000800000000000000000000000000000000000000000000000000000000000000000bf2970800500008000000000",0));
bps.emplace_back(bp_from_hex("0000000035000080310000000c000080300000803100000031000000070000000a0000000700000012000080310000801c000080000000000e000080000000000000000000000000000000000000000000000000000000000000000088227080d700008000000000",0));
bps.emplace_back(bp_from_hex("000000004d00008032000000140000800c0000803200000032000000080000000b0000000800000011000080280000801500008000000000260000800000000000000000000000000000000000000000000000000000000000000000ef2b7080c700008000000000",0));
bps.emplace_back(bp_from_hex("00000000170000803300000010000080040000803300000033000000090000000c00000009000000160000801500008000000000000000000e0000800000000000000000000000000000000000000000000000000000000000000000f42d70805d00008000000000",0));
bps.emplace_back(bp_from_hex("000000003600008034000000160000800f00008034000000340000000a0000000d0000000a00000003000080120000801c000080000000000e0000800000000000000000000000000000000000000000000000000000000000000000cf2a7080ae00008000000000",0));
bps.emplace_back(bp_from_hex("000000000200008035000000010000801000008035000000350000000b0000000e0000000b000000070000802c0000801b000080000000002d0000800000000000000000000000000000000000000000000000000000000000000000c72470801b00008000000000",0));
bps.emplace_back(bp_from_hex("000000000700008036000000120000801500008036000000360000000c0000000f0000000c0000000a0000801b00008000000000000000000e0000800000000000000000000000000000000000000000000000000000000000000000692570809400008000000000",0));
bps.emplace_back(bp_from_hex("0000000048000080370000001a0000802100008037000000370000000d000000100000000d0000001f000080030000801c000080000000000e0000800000000000000000000000000000000000000000000000000000000000000000b62970800d01008000000000",0));
bps.emplace_back(bp_from_hex("000000001f00008038000000030000801600008038000000380000000e0000001100000000000000010000801600008021000080000000002d0000800000000000000000000000000000000000000000000000000000000000000000e12a7080d500008000000000",0));
bps.emplace_back(bp_from_hex("000000004700008039000000170000800d00008039000000390000000f00000012000000010000001a0000802100008000000000000000000e000080000000000000000000000000000000000000000000000000000000000000000092267080d400008000000000",0));
bps.emplace_back(bp_from_hex("000000003d0000803a00000018000080260000803a0000003a00000010000000130000000200000018000080070000801c000080000000000e000080000000000000000000000000000000000000000000000000000000000000000062237080c000008000000000",0));
bps.emplace_back(bp_from_hex("00000000090000803b00000013000080180000803b0000003b000000110000001400000003000000020000802a0000802d00008000000000040000800000000000000000000000000000000000000000000000000000000000000000af2f70803b00008000000000",0));
bps.emplace_back(bp_from_hex("000000004d00008000000000100000800c0000800000000000000000000000000000000000000000190000802b00008000000000000000000e0000800000000000000000000000000000000000000000000000000000000000000000401270802801008000000000",0));
bps.emplace_back(bp_from_hex("000000000d00008026000000150000800300008002000000020000002000000005000000040000000b0000802b00008000000000000000000e00008000000000000000000000000000000000000000000000000000000000000000004b277080d400008000000000",0));
bps.emplace_back(bp_from_hex("000000000d00008045000000040000801700008014000000000000002300000015000000080000000b0000802b00008000000000000000000e0000800000000000000000000000000000000000000000000000000000000000000000292d7080d500008000000000",0));
bps.emplace_back(bp_from_hex("000000000d0000802e000000160000800c0000802d000000210000000200000022000000030000000b0000802b00008000000000000000000e0000800000000000000000000000000000000000000000000000000000000000000000572470805d00008000000000",0));
bps.emplace_back(bp_from_hex("00000000100000801d000000110000800d0000801b00000002000000120000000c000000010000000b0000802b00008000000000000000000e0000800000000000000000000000000000000000000000000000000000000000000000e9217080fe00008000000000",0));
bps.emplace_back(bp_from_hex("000000000d00008048000000100000803000008008000000090000001000000007000000090000000b0000802b00008000000000000000000e00008000000000000000000000000000000000000000000000000000000000000000003d297080d400008000000000",0));
bps.emplace_back(bp_from_hex("000000000d0000802d000000010000801100008029000000240000000300000020000000000000000b0000802b00008000000000000000000e0000800000000000000000000000000000000000000000000000000000000000000000d3287080dd00008000000000",0));
bps.emplace_back(bp_from_hex("0000000010000080350000001a0000802b00008016000000430000001400000003000000000000000b0000802b00008000000000000000000e0000800000000000000000000000000000000000000000000000000000000000000000b52e70801901008000000000",0));
bps.emplace_back(bp_from_hex("00000000330000802e0000000f000080270000801c000000030000001800000004000000030000000d000080040000802400008000000000170000800000000000000000000000000000000000000000000000000000000000000000f91370805e00008000000000",0));
bps.emplace_back(bp_from_hex("000000003300008034000000150000801500008010000000040000001800000020000000000000001d000080270000800400008000000000170000800000000000000000000000000000000000000000000000000000000000000000a31970802801008000000000",0));
bps.emplace_back(bp_from_hex("000000003300008050000000100000800f00008033000000420000001600000017000000000000000b000080240000800400008000000000170000800000000000000000000000000000000000000000000000000000000000000000621d70802801008000000000",0));
bps.emplace_back(bp_from_hex("00000000330000802400000013000080160000802d0000003800000011000000230000000d00000019000080240000800400008000000000170000800000000000000000000000000000000000000000000000000000000000000000471170809b00008000000000",0));
bps.emplace_back(bp_from_hex("000000003300008026000000110000802700008017000000190000000500000018000000060000000b000080270000802400008000000000170000800000000000000000000000000000000000000000000000000000000000000000831770802801008000000000",0));
bps.emplace_back(bp_from_hex("000000003300008027000000130000802f00008031000000330000000e000000070000000000000001000080270000800400008000000000170000800000000000000000000000000000000000000000000000000000000000000000f71470807400008000000000",0));
bps.emplace_back(bp_from_hex("00000000330000801500000016000080240000803e0000003e0000000300000000000000030000001d00008024000080270000800000000017000080000000000000000000000000000000000000000000000000000000000000000075197080d900008000000000",0));
bps.emplace_back(bp_from_hex("0000000033000080490000000400008011000080400000001c000000010000001c0000000000000002000080270000800400008000000000170000800000000000000000000000000000000000000000000000000000000000000000a21770802801008000000000",0));
bps.emplace_back(bp_from_hex("00000000340000802d0000000f000080160000802a000000080000001d00000013000000080000001d0000801400008000000000000000000e0000800000000000000000000000000000000000000000000000000000000000000000cd1e70802801008000000000",0));
bps.emplace_back(bp_from_hex("000000001f0000802300000003000080170000803e0000001a00000023000000130000000600000007000080260000801f000080000000000400008000000000000000000000000000000000000000000000000000000000000000003c1870802801008000000000",0));
bps.emplace_back(bp_from_hex("000000004c000080220000001a0000800c000080190000003f000000120000001e00000000000000080000801200008009000080000000000600008000000000000000000000000000000000000000000000000000000000000000000d1170802801008000000000",0));
bps.emplace_back(bp_from_hex("00000000060000804400000012000080100000800c000000240000000d0000000200000000000000010000802b00008000000000000000000e00008000000000000000000000000000000000000000000000000000000000000000006f1b70802801008000000000",0));
bps.emplace_back(bp_from_hex("0000000023000080350000000f0000801500008041000000280000001900000021000000090000000d000080250000801b000080000000000c0000800000000000000000000000000000000000000000000000000000000000000000951070802801008000000000",0));
bps.emplace_back(bp_from_hex("000000000a0000803b000000110000800f0000800f000000190000002500000008000000000000000e0000800200008000000000000000000e00008000000000000000000000000000000000000000000000000000000000000000004f1070802801008000000000",0));
bps.emplace_back(bp_from_hex("00000000040000800d00000013000080300000801400000005000000070000001b00000004000000100000801500008003000080000000001e0000800000000000000000000000000000000000000000000000000000000000000000561170802801008000000000",0));
bps.emplace_back(bp_from_hex("00000000360000801b000000150000802b000080000000001b0000001a00000000000000000000000c000080150000802100008000000000170000800000000000000000000000000000000000000000000000000000000000000000ce1e70802801008000000000",0));
bps.emplace_back(bp_from_hex("0000000027000080260000000400008026000080110000001a0000000f00000001000000000000000c0000802f0000801b00008000000000060000800000000000000000000000000000000000000000000000000000000000000000eb1970809400008000000000",0));
bps.emplace_back(bp_from_hex("0000000027000080090000000f00008011000080360000000800000016000000020000000b0000000f0000800900008026000080000000001e0000800000000000000000000000000000000000000000000000000000000000000000751b70809000008000000000",0));
bps.emplace_back(bp_from_hex("000000002700008025000000170000800400008030000000330000000400000000000000000000000e000080160000803100008000000000170000800000000000000000000000000000000000000000000000000000000000000000c41570808e00008000000000",0));
bps.emplace_back(bp_from_hex("0000000027000080400000000c0000802700008027000000050000001b000000000000000300000019000080250000801500008000000000150000800000000000000000000000000000000000000000000000000000000000000000fb1a70807e00008000000000",0));
bps.emplace_back(bp_from_hex("0000000027000080590000001400008028000080170000003200000005000000190000000000000013000080120000802a000080000000001e0000800000000000000000000000000000000000000000000000000000000000000000ab1d7080c700008000000000",0));
bps.emplace_back(bp_from_hex("000000002700008035000000110000801d0000804200000037000000110000000000000000000000010000800d00008003000080000000001500008000000000000000000000000000000000000000000000000000000000000000003f1270800500008000000000",0));
bps.emplace_back(bp_from_hex("00000000270000801e00000016000080290000802f0000002e000000180000000b000000000000001d0000800700008004000080000000001e00008000000000000000000000000000000000000000000000000000000000000000002f1c70809b00008000000000",0));
bps.emplace_back(bp_from_hex("00000000270000805b0000001500008014000080190000002d000000200000001e000000090000001a000080020000801000008000000000170000800000000000000000000000000000000000000000000000000000000000000000851570801601008000000000",0));
bps.emplace_back(bp_from_hex("00000000450000800300000004000080040000800c00000026000000080000000e00000000000000060000802100008031000080000000002c0000800000000000000000000000000000000000000000000000000000000000000000911d7080a900008000000000",0));
bps.emplace_back(bp_from_hex("000000000900008012000000110000800c00008017000000060000000d00000008000000000000000c0000802b00008027000080000000002c0000800000000000000000000000000000000000000000000000000000000000000000881d7080b400008000000000",0));
bps.emplace_back(bp_from_hex("000000000300008021000000040000800c0000802700000006000000170000000c00000000000000030000801a00008003000080000000002c000080000000000000000000000000000000000000000000000000000000000000000007197080c300008000000000",0));
bps.emplace_back(bp_from_hex("000000001e00008009000000140000800d0000801d0000001c0000000d00000011000000000000000e0000802d0000802a000080000000002c00008000000000000000000000000000000000000000000000000000000000000000006d1b70803300008000000000",0));
bps.emplace_back(bp_from_hex("000000004500008039000000110000800400008017000000180000001a000000060000000000000001000080300000802b000080000000002c00008000000000000000000000000000000000000000000000000000000000000000000a1c7080d900008000000000",0));
bps.emplace_back(bp_from_hex("00000000090000803a000000040000802f0000801700000010000000170000000a000000000000001d000080270000801a000080000000002c00008000000000000000000000000000000000000000000000000000000000000000007d1f7080b400008000000000",0));
bps.emplace_back(bp_from_hex("000000001e0000802a0000000f000080260000801a0000001800000008000000070000000000000013000080030000802d000080000000002c0000800000000000000000000000000000000000000000000000000000000000000000981b70809200008000000000",0));
bps.emplace_back(bp_from_hex("0000000003000080220000000c000080270000800800000014000000080000001100000000000000070000802a00008030000080000000002c000080000000000000000000000000000000000000000000000000000000000000000060127080ef00008000000000",0));
bps.emplace_back(bp_from_hex("000000001e00008012000000040000800c0000800b00000004000000100000000b00000000000000080000801a00008000000000000000000e0000800000000000000000000000000000000000000000000000000000000000000000751f7080a300008000000000",0));
bps.emplace_back(bp_from_hex("00000000170000801e0000000f000080040000801a0000001500000025000000240000000000000017000080190000801000008000000000250000800000000000000000000000000000000000000000000000000000000000000000f81e7080c300008000000000",0));
bps.emplace_back(bp_from_hex("00000000060000803000000015000080300000800200000031000000120000000c00000009000000090000801b0000802100008000000000150000800000000000000000000000000000000000000000000000000000000000000000861870808f00008000000000",0));
bps.emplace_back(bp_from_hex("00000000180000800100000015000080160000802100000046000000140000000300000000000000130000802b00008000000000000000000e00008000000000000000000000000000000000000000000000000000000000000000006e1c70807b00008000000000",0));
bps.emplace_back(bp_from_hex("000000002600008036000000160000802900008024000000250000000f00000015000000070000000e000080250000800400008000000000260000800000000000000000000000000000000000000000000000000000000000000000201470803400008000000000",0));
bps.emplace_back(bp_from_hex("00000000020000803c000000180000802600008006000000040000002700000000000000000000000e0000800900008000000000000000000e0000800000000000000000000000000000000000000000000000000000000000000000821e7080c300008000000000",0));
bps.emplace_back(bp_from_hex("000000001f000080200000001a000080120000801d000000180000000a0000001800000004000000110000802100008011000080000000002e0000800000000000000000000000000000000000000000000000000000000000000000cf1c70809200008000000000",0));
bps.emplace_back(bp_from_hex("000000000c000080290000000f0000802f000080170000000700000002000000000000000000000010000080210000802600008000000000170000800000000000000000000000000000000000000000000000000000000000000000901670807b00008000000000",0));
bps.emplace_back(bp_from_hex("000000000800008009000000040000801000008026000000120000001b000000080000000000000009000080250000801a000080000000001700008000000000000000000000000000000000000000000000000000000000000000008f1170801601008000000000",0));
bps.emplace_back(bp_from_hex("00000000090000802600000015000080160000801c00000025000000140000000800000000000000190000801a0000802500008000000000060000800000000000000000000000000000000000000000000000000000000000000000d31a70802801008000000000",0));
bps.emplace_back(bp_from_hex("00000000420000801c000000110000800400008025000000030000000000000003000000030000000f000080250000801a000080000000001700008000000000000000000000000000000000000000000000000000000000000000007e177080b500008000000000",0));
bps.emplace_back(bp_from_hex("000000000800008010000000040000801000008029000000120000001f0000000a000000080000000f0000801a0000801000008000000000060000800000000000000000000000000000000000000000000000000000000000000000471d70802801008000000000",0));
bps.emplace_back(bp_from_hex("000000000200008039000000040000800c00008026000000230000001b00000003000000000000000f000080250000801a00008000000000170000800000000000000000000000000000000000000000000000000000000000000000d21670803300008000000000",0));
bps.emplace_back(bp_from_hex("000000000c00008023000000040000801600008027000000130000001400000003000000080000001e000080250000801000008000000000060000800000000000000000000000000000000000000000000000000000000000000000db1c70802801008000000000",0));
bps.emplace_back(bp_from_hex("000000004500008026000000040000800400008026000000000000001b0000000a0000000900000010000080100000801a00008000000000170000800000000000000000000000000000000000000000000000000000000000000000d6177080d900008000000000",0));
bps.emplace_back(bp_from_hex("00000000240000800900000015000080210000801100000012000000140000000c000000000000000d000080250000801a00008000000000060000800000000000000000000000000000000000000000000000000000000000000000c91670802801008000000000",0));
bps.emplace_back(bp_from_hex("00000000040000801b0000000400008010000080190000001d000000120000000100000004000000190000801300008000000000000000000e00008000000000000000000000000000000000000000000000000000000000000000003f1e70808700008000000000",0));
bps.emplace_back(bp_from_hex("00000000090000800b000000110000802f0000801900000018000000140000001100000004000000120000800900008031000080000000001e0000800000000000000000000000000000000000000000000000000000000000000000cc1070802801008000000000",0));
bps.emplace_back(bp_from_hex("00000000070000800f00000011000080100000801900000026000000140000000c0000000400000008000080280000803100008000000000150000800000000000000000000000000000000000000000000000000000000000000000791a7080bf00008000000000",0));
bps.emplace_back(bp_from_hex("000000004d000080290000000400008015000080190000000d000000000000000d000000040000001e0000802600008029000080000000000c0000800000000000000000000000000000000000000000000000000000000000000000c31370802801008000000000",0));
bps.emplace_back(bp_from_hex("000000000b00008025000000110000802f0000801900000024000000120000000f00000004000000100000802600008013000080000000001e0000800000000000000000000000000000000000000000000000000000000000000000c11570802801008000000000",0));
bps.emplace_back(bp_from_hex("000000000a00008030000000040000802f0000801900000021000000000000000c00000004000000150000802c0000802800008000000000150000800000000000000000000000000000000000000000000000000000000000000000611870805f00008000000000",0));
bps.emplace_back(bp_from_hex("000000004500008026000000040000801500008019000000250000001f00000012000000040000000f0000802900008013000080000000000400008000000000000000000000000000000000000000000000000000000000000000008a1f70802801008000000000",0));
bps.emplace_back(bp_from_hex("000000001f0000800b000000110000801000008019000000230000001f0000000d00000004000000100000802800008009000080000000001e0000800000000000000000000000000000000000000000000000000000000000000000c81a70802701008000000000",0));
bps.emplace_back(bp_from_hex("000000004700008000000000040000800c000080240000001300000000000000000000000900000012000080160000802a000080000000001e00008000000000000000000000000000000000000000000000000000000000000000003c1b70809f00008000000000",0));
bps.emplace_back(bp_from_hex("000000000800008003000000040000800c0000800b0000000b000000000000000000000000000000090000801b0000801600008000000000060000800000000000000000000000000000000000000000000000000000000000000000091a70802801008000000000",0));
bps.emplace_back(bp_from_hex("000000004700008004000000040000800c0000800b000000180000001f000000000000000000000006000080030000801b000080000000001e00008000000000000000000000000000000000000000000000000000000000000000001e1170802700008000000000",0));
bps.emplace_back(bp_from_hex("000000002c00008000000000040000800c000080240000000d00000012000000000000000900000014000080160000800700008000000000060000800000000000000000000000000000000000000000000000000000000000000000f41670809f00008000000000",0));
bps.emplace_back(bp_from_hex("000000000800008004000000040000800c00008024000000130000000000000000000000000000001e0000801b00008007000080000000001500008000000000000000000000000000000000000000000000000000000000000000002b1370802801008000000000",0));
bps.emplace_back(bp_from_hex("000000004700008003000000040000800c00008023000000180000001f000000000000000000000010000080030000801600008000000000060000800000000000000000000000000000000000000000000000000000000000000000b61570802801008000000000",0));
bps.emplace_back(bp_from_hex("000000002c00008000000000040000800c000080240000000c00000012000000000000000900000019000080160000801b000080000000001e0000800000000000000000000000000000000000000000000000000000000000000000fe1370802801008000000000",0));
bps.emplace_back(bp_from_hex("000000004700008000000000040000800c0000802300000025000000000000000000000000000000090000800700008003000080000000001e00008000000000000000000000000000000000000000000000000000000000000000007b1070809f00008000000000",0));
bps.emplace_back(bp_from_hex("000000000400008022000000040000802f0000801f000000230000001300000001000000000000000f000080150000801200008000000000060000800000000000000000000000000000000000000000000000000000000000000000141a70807e00008000000000",0));
bps.emplace_back(bp_from_hex("000000003800008004000000110000802100008010000000260000001b0000001c0000000000000017000080120000802500008000000000260000800000000000000000000000000000000000000000000000000000000000000000211e70802801008000000000",0));
bps.emplace_back(bp_from_hex("00000000220000801200000011000080100000802a0000000100000023000000040000000300000007000080090000802c00008000000000060000800000000000000000000000000000000000000000000000000000000000000000fb1c70809e00008000000000",0));
bps.emplace_back(bp_from_hex("0000000014000080070000000f000080210000803d00000033000000000000000a00000000000000030000802c0000801a00008000000000260000800000000000000000000000000000000000000000000000000000000000000000571170802801008000000000",0));
bps.emplace_back(bp_from_hex("00000000420000802200000011000080210000800a000000030000000f0000002500000000000000080000803100008015000080000000000f0000800000000000000000000000000000000000000000000000000000000000000000a41170804200008000000000",0));
bps.emplace_back(bp_from_hex("00000000180000800d000000110000802f00008009000000020000000a0000000000000000000000100000801500008000000000000000000e0000800000000000000000000000000000000000000000000000000000000000000000f51270802801008000000000",0));
bps.emplace_back(bp_from_hex("0000000008000080440000000f000080140000801e00000042000000000000001d0000000800000017000080280000802c000080000000000f0000800000000000000000000000000000000000000000000000000000000000000000391170802801008000000000",0));
bps.emplace_back(bp_from_hex("00000000250000800600000011000080210000802d00000008000000000000000800000000000000110000802c0000801000008000000000060000800000000000000000000000000000000000000000000000000000000000000000cc1d70802801008000000000",0));
bps.emplace_back(bp_from_hex("000000000c0000800300000011000080040000800200000020000000110000000900000000000000190000801b0000801500008000000000150000800000000000000000000000000000000000000000000000000000000000000000c01d70804500008000000000",0));
bps.emplace_back(bp_from_hex("00000000360000801d0000001a00008026000080350000000200000015000000250000000000000009000080260000802b00008000000000150000800000000000000000000000000000000000000000000000000000000000000000a41270808e00008000000000",0));
bps.emplace_back(bp_from_hex("000000004d00008005000000120000801d000080320000000f0000000000000026000000000000000e000080010000801b0000800000000015000080000000000000000000000000000000000000000000000000000000000000000046197080b400008000000000",0));
bps.emplace_back(bp_from_hex("00000000240000803a0000001a0000801500008003000000160000000e0000000a0000000000000007000080090000802600008000000000150000800000000000000000000000000000000000000000000000000000000000000000101f70809000008000000000",0));
bps.emplace_back(bp_from_hex("000000000700008055000000180000800e0000802f0000000e000000050000001a0000000000000003000080260000802b00008000000000150000800000000000000000000000000000000000000000000000000000000000000000641b7080b400008000000000",0));
bps.emplace_back(bp_from_hex("000000000e0000804400000004000080150000802300000017000000000000000000000003000000040000802b0000800100008000000000150000800000000000000000000000000000000000000000000000000000000000000000e6157080a900008000000000",0));
bps.emplace_back(bp_from_hex("0000000018000080270000000400008027000080040000001b0000000c00000024000000040000000e000080010000802b000080000000001500008000000000000000000000000000000000000000000000000000000000000000008d1a7080a300008000000000",0));
bps.emplace_back(bp_from_hex("00000000420000804600000011000080110000801e0000003900000028000000120000000800000017000080040000802600008000000000150000800000000000000000000000000000000000000000000000000000000000000000d41270807400008000000000",0));
bps.emplace_back(bp_from_hex("00000000210000800a000000140000800d000080150000002100000000000000120000000b000000070000802600008000000000000000000e000080000000000000000000000000000000000000000000000000000000000000000066197080b900008000000000",0));
bps.emplace_back(bp_from_hex("00000000210000804f0000001600008011000080050000002900000026000000000000000b0000001c0000802600008000000000000000000e0000800000000000000000000000000000000000000000000000000000000000000000fa167080b400008000000000",0));
bps.emplace_back(bp_from_hex("00000000210000802f000000150000800d00008000000000150000002500000023000000000000001b0000801300008026000080000000000600008000000000000000000000000000000000000000000000000000000000000000001f1670809200008000000000",0));
bps.emplace_back(bp_from_hex("0000000021000080000000001000008029000080240000002b000000110000000000000000000000010000802600008000000000000000000e0000800000000000000000000000000000000000000000000000000000000000000000c41770800400008000000000",0));
bps.emplace_back(bp_from_hex("0000000021000080460000001600008028000080320000003c00000004000000080000000a000000090000802900008000000000000000000e0000800000000000000000000000000000000000000000000000000000000000000000b3187080b900008000000000",0));
bps.emplace_back(bp_from_hex("000000002100008034000000040000802500008020000000010000001a0000001b00000000000000120000802600008000000000000000000e0000800000000000000000000000000000000000000000000000000000000000000000ba1e7080a900008000000000",0));
bps.emplace_back(bp_from_hex("00000000210000802d000000040000802b0000803a0000001100000018000000000000000700000018000080130000802600008000000000060000800000000000000000000000000000000000000000000000000000000000000000f4197080b900008000000000",0));
bps.emplace_back(bp_from_hex("00000000210000803b00000010000080100000801100000030000000160000000700000009000000140000802600008000000000000000000e0000800000000000000000000000000000000000000000000000000000000000000000481c7080b400008000000000",0));
bps.emplace_back(bp_from_hex("0000000003000080200000001500008018000080080000001d000000100000000c0000000100000008000080090000800400008000000000170000800000000000000000000000000000000000000000000000000000000000000000891f70801e01008000000000",0));
bps.emplace_back(bp_from_hex("000000002300008022000000040000800f0000800900000025000000110000000c00000000000000100000800400008000000000000000000e0000800000000000000000000000000000000000000000000000000000000000000000e31970802801008000000000",0));
bps.emplace_back(bp_from_hex("000000004800008021000000110000800c0000800a00000002000000120000000c0000000300000008000080070000802b000080000000000c0000800000000000000000000000000000000000000000000000000000000000000000b4197080a900008000000000",0));
bps.emplace_back(bp_from_hex("00000000180000802300000015000080100000800b0000000b000000130000000c000000010000001b000080180000800400008000000000030000800000000000000000000000000000000000000000000000000000000000000000dc1b70802701008000000000",0));
bps.emplace_back(bp_from_hex("000000001f000080250000000f000080150000800c0000000c000000140000000c0000000900000008000080010000802d00008000000000160000800000000000000000000000000000000000000000000000000000000000000000ea1d70801901008000000000",0));
bps.emplace_back(bp_from_hex("000000003d00008026000000140000800d0000800d00000010000000150000000c000000010000001b0000801000008021000080000000002d0000800000000000000000000000000000000000000000000000000000000000000000581470802801008000000000",0));
bps.emplace_back(bp_from_hex("00000000360000802700000015000080260000800e00000013000000000000000c0000000900000008000080170000802d00008000000000020000800000000000000000000000000000000000000000000000000000000000000000d51070801e01008000000000",0));
bps.emplace_back(bp_from_hex("000000003e0000802d0000000c0000802f0000800f00000017000000010000000c00000000000000100000802b0000802500008000000000270000800000000000000000000000000000000000000000000000000000000000000000e0137080b400008000000000",0));
bps.emplace_back(bp_from_hex("0000000008000080160000000f000080210000801f00000000000000130000000700000008000000130000802b0000800300008000000000150000800000000000000000000000000000000000000000000000000000000000000000b2127080a900008000000000",0));
bps.emplace_back(bp_from_hex("000000004d00008037000000100000800f0000803000000004000000000000001d0000000d000000190000802d00008000000000000000000e00008000000000000000000000000000000000000000000000000000000000000000006d127080ae00008000000000",0));
bps.emplace_back(bp_from_hex("000000001800008012000000110000802700008041000000230000002100000001000000000000001f0000801400008000000000000000000e0000800000000000000000000000000000000000000000000000000000000000000000131c70801b00008000000000",0));
bps.emplace_back(bp_from_hex("000000000400008027000000150000801d0000803500000003000000060000000800000000000000140000802b0000802e00008000000000060000800000000000000000000000000000000000000000000000000000000000000000c61870809400008000000000",0));
bps.emplace_back(bp_from_hex("000000003d000080150000000400008017000080400000002c0000000e0000001500000000000000040000802e00008000000000000000000e0000800000000000000000000000000000000000000000000000000000000000000000161a7080ae00008000000000",0));
bps.emplace_back(bp_from_hex("00000000210000802f00000003000080150000801c000000150000002700000000000000000000000e0000802b0000801a00008000000000150000800000000000000000000000000000000000000000000000000000000000000000d31e70809400008000000000",0));
bps.emplace_back(bp_from_hex("0000000004000080360000001000008014000080020000000a0000001c000000130000000b0000001b0000801400008000000000000000000e0000800000000000000000000000000000000000000000000000000000000000000000b01370801b00008000000000",0));
bps.emplace_back(bp_from_hex("000000003d0000805700000010000080170000802a000000440000000a0000000000000000000000040000802e0000800300008000000000170000800000000000000000000000000000000000000000000000000000000000000000481470809200008000000000",0));
bps.emplace_back(bp_from_hex("000000003300008025000000040000800f00008019000000000000001800000007000000080000001b0000800400008000000000000000000e0000800000000000000000000000000000000000000000000000000000000000000000fc177080d400008000000000",0));
bps.emplace_back(bp_from_hex("00000000260000802300000018000080140000802700000027000000000000000b00000001000000150000801b000080040000800000000017000080000000000000000000000000000000000000000000000000000000000000000030127080a400008000000000",0));
bps.emplace_back(bp_from_hex("00000000030000804000000011000080110000804100000008000000140000001b0000000b000000100000802f0000802900008000000000060000800000000000000000000000000000000000000000000000000000000000000000991c70801901008000000000",0));
bps.emplace_back(bp_from_hex("00000000470000803600000016000080140000802c0000002e0000002100000011000000090000000a000080240000802d00008000000000050000800000000000000000000000000000000000000000000000000000000000000000801870800401008000000000",0));
bps.emplace_back(bp_from_hex("000000000a00008005000000100000802b000080100000002c0000002700000000000000000000000d0000800300008000000000000000000e0000800000000000000000000000000000000000000000000000000000000000000000eb1070800400008000000000",0));
bps.emplace_back(bp_from_hex("000000002200008000000000160000801000008031000000330000000100000019000000070000000f000080270000803000008000000000150000800000000000000000000000000000000000000000000000000000000000000000731c70802301008000000000",0));
bps.emplace_back(bp_from_hex("000000004900008009000000030000800f000080050000000b00000011000000010000000c000000090000800900008000000000000000000e000080000000000000000000000000000000000000000000000000000000000000000070127080a900008000000000",0));
bps.emplace_back(bp_from_hex("00000000140000800a00000018000080300000803200000045000000180000000000000000000000180000801b00008021000080000000001600008000000000000000000000000000000000000000000000000000000000000000007e117080d500008000000000",0));
bps.emplace_back(bp_from_hex("000000003400008006000000140000800c0000802f0000001a00000006000000100000000300000004000080020000802b000080000000000600008000000000000000000000000000000000000000000000000000000000000000000b1370802801008000000000",0));
bps.emplace_back(bp_from_hex("000000002100008041000000110000801200008018000000000000000e00000015000000020000001d000080140000800200008000000000060000800000000000000000000000000000000000000000000000000000000000000000261870802801008000000000",0));
bps.emplace_back(bp_from_hex("00000000340000803a00000017000080180000800600000009000000250000001b0000000000000018000080270000801f000080000000000600008000000000000000000000000000000000000000000000000000000000000000001e1b70802801008000000000",0));
bps.emplace_back(bp_from_hex("000000002d0000804300000001000080170000800c000000210000001b00000007000000010000001a000080090000801900008000000000060000800000000000000000000000000000000000000000000000000000000000000000f91570802801008000000000",0));
bps.emplace_back(bp_from_hex("000000003400008027000000160000802f000080430000001e00000024000000170000000b0000000c000080210000801f00008000000000060000800000000000000000000000000000000000000000000000000000000000000000f41070802801008000000000",0));
bps.emplace_back(bp_from_hex("000000001100008003000000170000800e00008011000000180000000000000002000000000000001a000080120000801f00008000000000060000800000000000000000000000000000000000000000000000000000000000000000121f70802801008000000000",0));
bps.emplace_back(bp_from_hex("00000000340000800d0000000f0000800c0000801500000020000000030000000000000000000000160000802f0000801f00008000000000060000800000000000000000000000000000000000000000000000000000000000000000e21d70802801008000000000",0));
bps.emplace_back(bp_from_hex("000000002d0000803f00000010000080150000803d00000019000000220000000c0000000a00000004000080260000801d00008000000000060000800000000000000000000000000000000000000000000000000000000000000000b31270802801008000000000",0));
bps.emplace_back(bp_from_hex("000000000c0000801000000015000080260000802a000000090000001300000007000000080000000d000080030000801d00008000000000170000800000000000000000000000000000000000000000000000000000000000000000931b70802701008000000000",0));
bps.emplace_back(bp_from_hex("00000000140000801f000000040000800f0000803a0000002a000000000000002500000000000000010000802500008015000080000000002d000080000000000000000000000000000000000000000000000000000000000000000016187080c500008000000000",0));
bps.emplace_back(bp_from_hex("00000000250000800e0000000f0000801000008017000000340000000a0000000000000008000000020000801b0000802d00008000000000150000800000000000000000000000000000000000000000000000000000000000000000c41b7080d500008000000000",0));
bps.emplace_back(bp_from_hex("000000004500008042000000150000801500008020000000380000001800000015000000000000000c0000801f0000802400008000000000170000800000000000000000000000000000000000000000000000000000000000000000a81070804c00008000000000",0));
bps.emplace_back(bp_from_hex("00000000380000801b0000000f0000801400008037000000020000000000000009000000000000000e000080010000803100008000000000160000800000000000000000000000000000000000000000000000000000000000000000251170802701008000000000",0));
bps.emplace_back(bp_from_hex("00000000180000800700000011000080100000802c0000002800000000000000000000000000000013000080260000800d000080000000002e000080000000000000000000000000000000000000000000000000000000000000000010107080c500008000000000",0));
bps.emplace_back(bp_from_hex("000000001e0000803e0000001100008021000080410000001c000000230000001a0000000c0000000c0000802d0000801200008000000000150000800000000000000000000000000000000000000000000000000000000000000000281c7080a900008000000000",0));
bps.emplace_back(bp_from_hex("0000000033000080170000000c000080040000804300000043000000100000001e0000000000000015000080090000800400008000000000160000800000000000000000000000000000000000000000000000000000000000000000ac1570803400008000000000",0));
bps.emplace_back(bp_from_hex("000000004d00008000000000040000800c00008000000000000000000000000000000000000000000b0000802b0000801c000080000000000e0000800000000000000000000000000000000000000000000000000000000000000000b7197080a100008000000000",0));
bps.emplace_back(bp_from_hex("000000004d00008000000000040000800c00008000000000000000000000000000000000000000000b000080010000802b000080000000001e0000800000000000000000000000000000000000000000000000000000000000000000c81e70807400008000000000",0));
bps.emplace_back(bp_from_hex("000000004d00008000000000040000800c00008000000000000000000000000000000000000000000b000080150000802b00008000000000170000800000000000000000000000000000000000000000000000000000000000000000c11870802800008000000000",0));
bps.emplace_back(bp_from_hex("000000004d00008000000000040000800c00008000000000000000000000000000000000000000000b0000802d0000802b00008000000000150000800000000000000000000000000000000000000000000000000000000000000000691d7080d400008000000000",0));
bps.emplace_back(bp_from_hex("000000004d00008000000000040000800c00008000000000000000000000000000000000000000000b000080090000802b000080000000002600008000000000000000000000000000000000000000000000000000000000000000000f1770802301008000000000",0));
bps.emplace_back(bp_from_hex("000000004d00008000000000040000800c00008000000000000000000000000000000000000000000b000080260000802b000080000000000f00008000000000000000000000000000000000000000000000000000000000000000006d1770807b00008000000000",0));
bps.emplace_back(bp_from_hex("000000004d00008000000000040000800c00008000000000000000000000000000000000000000000b000080210000801c000080000000000e00008000000000000000000000000000000000000000000000000000000000000000001b107080d500008000000000",0));
bps.emplace_back(bp_from_hex("000000004d00008000000000040000800c00008000000000000000000000000000000000000000000b000080250000802b000080000000000d0000800000000000000000000000000000000000000000000000000000000000000000861770803300008000000000",0));
bps.emplace_back(bp_from_hex("00000000050000801c0000001500008010000080240000000b0000001f000000090000000900000008000080010000803000008000000000260000800000000000000000000000000000000000000000000000000000000000000000f61770802801008000000000",0));
bps.emplace_back(bp_from_hex("000000004800008005000000110000800f0000800600000013000000280000001e0000000000000009000080020000802b000080000000001500008000000000000000000000000000000000000000000000000000000000000000008f137080d500008000000000",0));
bps.emplace_back(bp_from_hex("0000000048000080580000000c000080140000802100000024000000000000001b000000000000001d0000801400008000000000000000000e0000800000000000000000000000000000000000000000000000000000000000000000991d7080a900008000000000",0));
bps.emplace_back(bp_from_hex("00000000480000802a000000110000800c00008008000000360000000a0000000000000000000000040000802b0000801d000080000000001700008000000000000000000000000000000000000000000000000000000000000000003c177080ab00008000000000",0));
bps.emplace_back(bp_from_hex("000000004800008028000000110000800f0000801a00000025000000240000001600000000000000080000801f00008000000000000000000e0000800000000000000000000000000000000000000000000000000000000000000000321f7080dd00008000000000",0));
bps.emplace_back(bp_from_hex("000000004800008055000000160000800c000080290000002b0000000b000000000000000000000015000080020000801400008000000000150000800000000000000000000000000000000000000000000000000000000000000000b81a7080d400008000000000",0));
bps.emplace_back(bp_from_hex("00000000480000805c0000000f0000801d000080360000001a0000000000000021000000060000001f0000800200008000000000000000000e0000800000000000000000000000000000000000000000000000000000000000000000681a7080b400008000000000",0));
bps.emplace_back(bp_from_hex("00000000480000805a000000110000800c000080320000001b0000000000000022000000000000000b0000802b0000801900008000000000170000800000000000000000000000000000000000000000000000000000000000000000ea157080a100008000000000",0));
bps.emplace_back(bp_from_hex("00000000040000800000000004000080040000801a000000070000001d00000001000000000000000c0000800200008000000000000000000e0000800000000000000000000000000000000000000000000000000000000000000000991b70802801008000000000",0));
bps.emplace_back(bp_from_hex("000000004200008053000000110000800c0000802c00000043000000110000001b00000003000000120000800200008000000000000000000e000080000000000000000000000000000000000000000000000000000000000000000093187080a900008000000000",0));
bps.emplace_back(bp_from_hex("00000000340000800400000012000080140000800a0000000b000000140000000000000004000000150000800200008000000000000000000e00008000000000000000000000000000000000000000000000000000000000000000008c1170802301008000000000",0));
bps.emplace_back(bp_from_hex("000000003e000080000000000c000080210000800f000000180000001b0000000c00000000000000160000800200008000000000000000000e00008000000000000000000000000000000000000000000000000000000000000000006a197080ab00008000000000",0));
bps.emplace_back(bp_from_hex("000000000400008040000000160000802700008040000000070000000d0000000000000002000000120000800200008000000000000000000e0000800000000000000000000000000000000000000000000000000000000000000000971470802801008000000000",0));
bps.emplace_back(bp_from_hex("00000000340000803600000001000080110000803700000023000000160000000100000000000000170000800200008000000000000000000e0000800000000000000000000000000000000000000000000000000000000000000000ba1a70801901008000000000",0));
bps.emplace_back(bp_from_hex("0000000042000080490000000400008015000080240000002a000000250000002400000000000000150000800200008000000000000000000e0000800000000000000000000000000000000000000000000000000000000000000000a1107080a900008000000000",0));
bps.emplace_back(bp_from_hex("000000003e0000802700000010000080240000800e00000042000000080000001a0000000a0000000e0000800200008000000000000000000e000080000000000000000000000000000000000000000000000000000000000000000079167080d400008000000000",0));
bps.emplace_back(bp_from_hex("000000002c0000802100000015000080100000801200000002000000130000000b00000009000000190000803000008021000080000000001e0000800000000000000000000000000000000000000000000000000000000000000000a21b7080dd00008000000000",0));
bps.emplace_back(bp_from_hex("000000000900008030000000040000800c00008001000000000000001400000005000000000000001d0000801d00008001000080000000001e00008000000000000000000000000000000000000000000000000000000000000000001a1670805d00008000000000",0));
bps.emplace_back(bp_from_hex("000000000c0000802000000015000080180000800400000009000000150000000800000003000000150000802a00008002000080000000001e0000800000000000000000000000000000000000000000000000000000000000000000d91a7080a900008000000000",0));
bps.emplace_back(bp_from_hex("000000003a00008021000000110000802f000080020000000b000000190000000900000001000000190000803000008001000080000000001e0000800000000000000000000000000000000000000000000000000000000000000000d4157080b400008000000000",0));
bps.emplace_back(bp_from_hex("0000000045000080360000000400008027000080080000000c0000001b0000000a000000000000000e0000802a00008001000080000000001e00008000000000000000000000000000000000000000000000000000000000000000007e197080b400008000000000",0));
bps.emplace_back(bp_from_hex("000000000300008039000000110000800c00008007000000100000001f0000000b00000001000000190000803000008002000080000000001e0000800000000000000000000000000000000000000000000000000000000000000000c71870803300008000000000",0));
bps.emplace_back(bp_from_hex("000000000500008009000000040000800f000080090000000d000000000000000c00000008000000060000802a00008001000080000000001e0000800000000000000000000000000000000000000000000000000000000000000000351b7080a900008000000000",0));
bps.emplace_back(bp_from_hex("000000000d0000801900000015000080100000800b000000130000000a0000000d00000000000000140000801d00008021000080000000001e000080000000000000000000000000000000000000000000000000000000000000000023197080c300008000000000",0));
bps.emplace_back(bp_from_hex("000000000e000080260000001500008018000080240000000b0000001f000000080000000100000019000080120000802c00008000000000060000800000000000000000000000000000000000000000000000000000000000000000e41e70803500008000000000",0));
bps.emplace_back(bp_from_hex("000000000c0000802600000015000080160000801c000000130000001000000003000000000000000f000080160000801a00008000000000170000800000000000000000000000000000000000000000000000000000000000000000e01d7080c700008000000000",0));
bps.emplace_back(bp_from_hex("0000000003000080100000001100008027000080080000000b00000014000000090000000900000013000080270000802a00008000000000060000800000000000000000000000000000000000000000000000000000000000000000081e7080e600008000000000",0));
bps.emplace_back(bp_from_hex("00000000050000802300000004000080100000801b0000000b0000000400000008000000010000000f000080090000802800008000000000170000800000000000000000000000000000000000000000000000000000000000000000641770804500008000000000",0));
bps.emplace_back(bp_from_hex("000000000b000080250000000f0000802f0000800f00000018000000040000000c000000010000000d0000802c00008010000080000000000600008000000000000000000000000000000000000000000000000000000000000000006a1b70803400008000000000",0));
bps.emplace_back(bp_from_hex("000000001e0000802f0000001500008027000080240000001800000000000000030000000100000003000080270000800400008000000000060000800000000000000000000000000000000000000000000000000000000000000000901a7080ef00008000000000",0));
bps.emplace_back(bp_from_hex("000000000a0000802100000004000080260000801b00000025000000140000000b00000009000000190000802f0000802c00008000000000170000800000000000000000000000000000000000000000000000000000000000000000131f7080c700008000000000",0));
bps.emplace_back(bp_from_hex("0000000021000080300000001100008027000080080000002300000004000000090000000100000010000080260000801300008000000000170000800000000000000000000000000000000000000000000000000000000000000000571470804500008000000000",0));
bps.emplace_back(bp_from_hex("0000000033000080090000000400008016000080110000002100000002000000120000000a0000000b0000802d000080090000800000000025000080000000000000000000000000000000000000000000000000000000000000000045117080c900008000000000",0));
bps.emplace_back(bp_from_hex("00000000230000803000000001000080250000804100000034000000080000000000000007000000080000800300008000000000000000000e0000800000000000000000000000000000000000000000000000000000000000000000d61e7080a900008000000000",0));
bps.emplace_back(bp_from_hex("000000000900008009000000160000802f000080050000000700000022000000230000000c0000000b0000802e0000801a000080000000001500008000000000000000000000000000000000000000000000000000000000000000006b1770804500008000000000",0));
bps.emplace_back(bp_from_hex("00000000220000803200000018000080160000801f000000100000001b000000000000000a00000015000080240000802d00008000000000170000800000000000000000000000000000000000000000000000000000000000000000f1157080c900008000000000",0));
bps.emplace_back(bp_from_hex("0000000018000080330000000f00008021000080350000000b000000210000002100000000000000120000801f00008024000080000000000600008000000000000000000000000000000000000000000000000000000000000000001b167080a900008000000000",0));
bps.emplace_back(bp_from_hex("0000000021000080510000000c0000801400008022000000410000000f0000000d000000050000001c0000802b00008031000080000000002500008000000000000000000000000000000000000000000000000000000000000000001e1570803500008000000000",0));
bps.emplace_back(bp_from_hex("000000002c0000800d0000001500008015000080370000001c0000002400000000000000000000001e0000802e0000801f00008000000000150000800000000000000000000000000000000000000000000000000000000000000000c4167080c900008000000000",0));
bps.emplace_back(bp_from_hex("00000000340000804b00000003000080110000802700000030000000250000001e00000003000000100000801300008000000000000000000e0000800000000000000000000000000000000000000000000000000000000000000000471f7080a900008000000000",0));
bps.emplace_back(bp_from_hex("0000000042000080050000001500008010000080010000000a0000000600000006000000000000001d000080040000801c000080000000000e0000800000000000000000000000000000000000000000000000000000000000000000ba1c70802701008000000000",0));
bps.emplace_back(bp_from_hex("000000003e0000800200000011000080110000800600000002000000090000001c00000008000000160000801900008000000000000000000e00008000000000000000000000000000000000000000000000000000000000000000004a167080dd00008000000000",0));
bps.emplace_back(bp_from_hex("00000000030000803600000004000080290000800d000000310000000a000000050000000000000011000080020000801b000080000000000f0000800000000000000000000000000000000000000000000000000000000000000000c11270804200008000000000",0));
bps.emplace_back(bp_from_hex("000000003d0000803900000010000080150000800f0000002300000011000000220000000000000014000080290000802500008000000000130000800000000000000000000000000000000000000000000000000000000000000000451f70802801008000000000",0));
bps.emplace_back(bp_from_hex("000000001f0000800f0000000400008014000080100000000f000000040000001d00000000000000010000802d00008013000080000000002c00008000000000000000000000000000000000000000000000000000000000000000002c1f70803500008000000000",0));
bps.emplace_back(bp_from_hex("00000000070000804f00000003000080240000800200000039000000280000001700000000000000180000802500008009000080000000000c00008000000000000000000000000000000000000000000000000000000000000000002a147080a900008000000000",0));
bps.emplace_back(bp_from_hex("000000003600008038000000110000802f000080270000001d0000000d000000140000000b0000000d0000802b0000800100008000000000260000800000000000000000000000000000000000000000000000000000000000000000591670805f00008000000000",0));
bps.emplace_back(bp_from_hex("000000000a0000801d00000010000080170000800e00000020000000180000000c000000000000000f000080270000802a000080000000001500008000000000000000000000000000000000000000000000000000000000000000007a107080a900008000000000",0));
bps.emplace_back(bp_from_hex("000000003800008009000000150000800c0000802f000000260000001b000000040000000000000009000080030000801500008000000000150000800000000000000000000000000000000000000000000000000000000000000000211570809400008000000000",0));
bps.emplace_back(bp_from_hex("00000000420000802a00000011000080260000802c000000090000000a0000000000000000000000030000802b000080260000800000000015000080000000000000000000000000000000000000000000000000000000000000000085177080dd00008000000000",0));
bps.emplace_back(bp_from_hex("00000000340000800b000000150000802500008002000000380000000c0000000000000000000000180000801b0000800100008000000000150000800000000000000000000000000000000000000000000000000000000000000000f3197080d500008000000000",0));
bps.emplace_back(bp_from_hex("000000000d0000803300000013000080240000801f0000003000000028000000170000000000000003000080040000802400008000000000150000800000000000000000000000000000000000000000000000000000000000000000701470802801008000000000",0));
bps.emplace_back(bp_from_hex("00000000040000803a00000017000080280000803d00000018000000220000001d0000000000000001000080010000802b00008000000000150000800000000000000000000000000000000000000000000000000000000000000000821370801901008000000000",0));
bps.emplace_back(bp_from_hex("000000000d0000800000000018000080300000804000000040000000270000000400000006000000080000801b0000800300008000000000150000800000000000000000000000000000000000000000000000000000000000000000851270802801008000000000",0));
bps.emplace_back(bp_from_hex("000000004200008053000000110000801200008014000000130000000a0000002200000000000000120000802b00008002000080000000001500008000000000000000000000000000000000000000000000000000000000000000004d187080a900008000000000",0));
bps.emplace_back(bp_from_hex("000000003e00008055000000030000800f000080110000003c00000010000000010000000000000011000080260000800900008000000000150000800000000000000000000000000000000000000000000000000000000000000000321270802701008000000000",0));
bps.emplace_back(bp_from_hex("000000001e00008023000000110000800f0000801200000002000000130000000300000009000000190000802a0000802c000080000000001e000080000000000000000000000000000000000000000000000000000000000000000093147080d500008000000000",0));
bps.emplace_back(bp_from_hex("00000000090000802f000000110000802f0000802200000020000000130000000300000009000000080000801d00008010000080000000001e0000800000000000000000000000000000000000000000000000000000000000000000f2157080fe00008000000000",0));
bps.emplace_back(bp_from_hex("000000000b00008026000000150000802f000080080000001800000014000000090000000b000000170000802a0000802c000080000000001e0000800000000000000000000000000000000000000000000000000000000000000000b71a7080dd00008000000000",0));
bps.emplace_back(bp_from_hex("00000000090000801c000000150000801800008012000000250000001f00000009000000010000001e0000802400008027000080000000001e0000800000000000000000000000000000000000000000000000000000000000000000471970802500008000000000",0));
bps.emplace_back(bp_from_hex("00000000330000803900000015000080180000801c0000000b000000000000000c00000001000000190000802a0000802c000080000000001e000080000000000000000000000000000000000000000000000000000000000000000021107080a900008000000000",0));
bps.emplace_back(bp_from_hex("000000000900008010000000110000802f0000800f000000120000001b0000000800000009000000080000801d00008029000080000000001e0000800000000000000000000000000000000000000000000000000000000000000000d51a70802701008000000000",0));
bps.emplace_back(bp_from_hex("000000001e000080390000001100008010000080240000000b0000001f00000008000000000000000d0000802a0000802c000080000000001e0000800000000000000000000000000000000000000000000000000000000000000000d91570802700008000000000",0));
bps.emplace_back(bp_from_hex("000000003d0000803f00000015000080210000801200000002000000130000000c000000010000000f0000800900008028000080000000001e00008000000000000000000000000000000000000000000000000000000000000000007c1670807400008000000000",0));
bps.emplace_back(bp_from_hex("000000003e00008006000000110000802700008017000000070000000f000000040000000000000004000080020000802c000080000000002600008000000000000000000000000000000000000000000000000000000000000000003a127080fe00008000000000",0));
bps.emplace_back(bp_from_hex("00000000210000800900000010000080140000801d00000024000000000000000300000000000000190000802b000080270000800000000026000080000000000000000000000000000000000000000000000000000000000000000092147080a900008000000000",0));
bps.emplace_back(bp_from_hex("00000000220000800300000004000080100000800c0000003900000017000000090000000000000007000080020000801000008000000000260000800000000000000000000000000000000000000000000000000000000000000000fc1370801901008000000000",0));
bps.emplace_back(bp_from_hex("00000000140000801e00000004000080120000800f000000020000001f0000000c000000090000001c0000802b0000802900008000000000260000800000000000000000000000000000000000000000000000000000000000000000081070802801008000000000",0));
bps.emplace_back(bp_from_hex("000000002c00008020000000150000802100008023000000190000002700000020000000080000000d000080020000802800008000000000260000800000000000000000000000000000000000000000000000000000000000000000231070802801008000000000",0));
bps.emplace_back(bp_from_hex("0000000042000080410000000400008014000080150000002e00000000000000080000000b000000180000802b00008016000080000000002600008000000000000000000000000000000000000000000000000000000000000000007c1570806800008000000000",0));
bps.emplace_back(bp_from_hex("000000002d0000802b0000000f0000802100008024000000110000001200000000000000000000000a000080020000802f00008000000000260000800000000000000000000000000000000000000000000000000000000000000000901b70802801008000000000",0));
bps.emplace_back(bp_from_hex("00000000200000804d0000001000008010000080080000003b00000013000000150000000c000000100000802b0000803000008000000000260000800000000000000000000000000000000000000000000000000000000000000000fa1b7080d400008000000000",0));
bps.emplace_back(bp_from_hex("000000000f0000800900000004000080150000801300000024000000290000000100000000000000090000800d0000802d0000800000000002000080000000000000000000000000000000000000000000000000000000000000000094147080ef00008000000000",0));
bps.emplace_back(bp_from_hex("00000000160000801000000011000080160000802c0000003f000000070000000f000000000000000400008002000080030000800000000006000080000000000000000000000000000000000000000000000000000000000000000005157080ef00008000000000",0));
bps.emplace_back(bp_from_hex("0000000014000080190000000400008021000080310000001b0000001900000018000000060000001b0000801100008025000080000000002c0000800000000000000000000000000000000000000000000000000000000000000000831370801e01008000000000",0));
bps.emplace_back(bp_from_hex("00000000230000801f0000000c000080280000802b0000001a00000013000000060000000a000000180000801d00008028000080000000000c0000800000000000000000000000000000000000000000000000000000000000000000bd1c7080a900008000000000",0));
bps.emplace_back(bp_from_hex("000000002e00008027000000160000800c0000803e000000220000001500000025000000000000001d000080180000801900008000000000150000800000000000000000000000000000000000000000000000000000000000000000a7187080ef00008000000000",0));
bps.emplace_back(bp_from_hex("00000000140000802d00000001000080170000802a0000004100000006000000020000000000000019000080020000802b000080000000002c0000800000000000000000000000000000000000000000000000000000000000000000ca127080ef00008000000000",0));
bps.emplace_back(bp_from_hex("000000002d0000803b000000110000800f0000802f000000190000002600000003000000050000001c0000800d00008000000000000000000e00008000000000000000000000000000000000000000000000000000000000000000007e1d7080d500008000000000",0));
bps.emplace_back(bp_from_hex("0000000014000080330000001000008010000080050000003f0000000100000014000000000000000a000080190000801d000080000000000200008000000000000000000000000000000000000000000000000000000000000000000c147080b400008000000000",0));
bps.emplace_back(bp_from_hex("00000000270000801c000000150000801500008026000000230000001b00000009000000000000000d000080100000801d00008000000000250000800000000000000000000000000000000000000000000000000000000000000000b11d7080d500008000000000",0));
bps.emplace_back(bp_from_hex("000000002c00008010000000150000801000008026000000120000001b0000000c000000000000001e000080100000801d00008000000000250000800000000000000000000000000000000000000000000000000000000000000000ee1a70805d00008000000000",0));
bps.emplace_back(bp_from_hex("000000002c0000801c000000150000801500008026000000200000001b00000000000000000000000d000080100000801d000080000000002500008000000000000000000000000000000000000000000000000000000000000000002a177080c300008000000000",0));
bps.emplace_back(bp_from_hex("00000000270000801e000000110000800f00008026000000120000001b0000000c0000000000000017000080100000801d00008000000000250000800000000000000000000000000000000000000000000000000000000000000000671f7080d400008000000000",0));
bps.emplace_back(bp_from_hex("000000002700008018000000150000802f00008025000000130000001b000000030000000000000014000080100000801d00008000000000250000800000000000000000000000000000000000000000000000000000000000000000231b70800e00008000000000",0));
bps.emplace_back(bp_from_hex("000000002c0000801c0000001100008010000080260000000b0000001b0000000c000000000000001e000080100000801d00008000000000250000800000000000000000000000000000000000000000000000000000000000000000041d7080dd00008000000000",0));
bps.emplace_back(bp_from_hex("000000002700008010000000150000800f00008026000000130000001b00000003000000000000000f000080100000801d0000800000000025000080000000000000000000000000000000000000000000000000000000000000000008147080d400008000000000",0));
bps.emplace_back(bp_from_hex("000000002c000080090000001500008015000080250000000b0000001b0000000c0000000000000013000080100000801d00008000000000250000800000000000000000000000000000000000000000000000000000000000000000541d70802801008000000000",0));
bps.emplace_back(bp_from_hex("000000000500008021000000150000802700008024000000130000001f0000000b000000090000000f000080010000803000008000000000250000800000000000000000000000000000000000000000000000000000000000000000311f7080d400008000000000",0));
bps.emplace_back(bp_from_hex("00000000140000802600000015000080100000801c000000200000001400000009000000090000000d0000802a00008021000080000000001e0000800000000000000000000000000000000000000000000000000000000000000000d2117080c700008000000000",0));
bps.emplace_back(bp_from_hex("00000000140000800900000015000080210000800b0000000b0000001400000008000000090000001e0000803000008000000000000000000e0000800000000000000000000000000000000000000000000000000000000000000000b11b7080dd00008000000000",0));
bps.emplace_back(bp_from_hex("000000001e000080260000000400008027000080260000000b000000140000000c00000009000000080000802700008030000080000000001e0000800000000000000000000000000000000000000000000000000000000000000000bb1e7080a900008000000000",0));
bps.emplace_back(bp_from_hex("000000002c0000803900000011000080150000801c000000130000001400000009000000010000000f0000802c00008028000080000000001e0000800000000000000000000000000000000000000000000000000000000000000000961f70800301008000000000",0));
bps.emplace_back(bp_from_hex("0000000005000080230000000f0000802f000080240000000000000010000000030000000100000013000080280000802c000080000000002500008000000000000000000000000000000000000000000000000000000000000000001a1470807b00008000000000",0));
bps.emplace_back(bp_from_hex("0000000014000080090000000400008026000080260000000b0000001000000009000000090000000f0000800700008001000080000000001e0000800000000000000000000000000000000000000000000000000000000000000000db1d7080d500008000000000",0));
bps.emplace_back(bp_from_hex("000000001e0000801c0000000f0000800c00008024000000000000001f0000000b000000010000001e0000802f00008030000080000000001e0000800000000000000000000000000000000000000000000000000000000000000000551470802801008000000000",0));
bps.emplace_back(bp_from_hex("00000000070000801d0000000c0000800c000080230000001c0000001c0000000400000008000000040000802e0000802d000080000000002500008000000000000000000000000000000000000000000000000000000000000000009f1370809400008000000000",0));
bps.emplace_back(bp_from_hex("000000002600008052000000030000800e000080040000002900000000000000050000000c000000080000802100008000000000000000000e0000800000000000000000000000000000000000000000000000000000000000000000d81870803300008000000000",0));
bps.emplace_back(bp_from_hex("00000000220000805a000000160000802700008042000000010000002800000000000000000000000c000080250000801500008000000000150000800000000000000000000000000000000000000000000000000000000000000000e51970809d00008000000000",0));
bps.emplace_back(bp_from_hex("00000000330000803f000000160000800d0000803400000037000000140000000000000000000000100000802d00008003000080000000000c0000800000000000000000000000000000000000000000000000000000000000000000d81170808e00008000000000",0));
bps.emplace_back(bp_from_hex("00000000240000802d0000001000008016000080140000000e000000060000000b0000000000000003000080040000801400008000000000040000800000000000000000000000000000000000000000000000000000000000000000431770804200008000000000",0));
bps.emplace_back(bp_from_hex("00000000480000801500000011000080030000801a0000002b00000005000000090000000a0000000e000080030000802d000080000000001500008000000000000000000000000000000000000000000000000000000000000000005e1070800500008000000000",0));
bps.emplace_back(bp_from_hex("000000002d0000803c0000000f00008010000080100000003d000000230000000e0000000100000004000080310000801f000080000000000600008000000000000000000000000000000000000000000000000000000000000000001e1670805d00008000000000",0));
bps.emplace_back(bp_from_hex("000000003400008011000000150000802f0000803500000004000000110000000600000000000000060000802b00008009000080000000002c0000800000000000000000000000000000000000000000000000000000000000000000291770807400008000000000",0));
bps.emplace_back(bp_from_hex("000000002100008007000000110000800f0000802f0000001b0000001900000004000000000000000e000080030000801600008000000000250000800000000000000000000000000000000000000000000000000000000000000000701070800500008000000000",0));
bps.emplace_back(bp_from_hex("00000000200000801100000016000080280000802f0000002300000000000000260000000000000006000080180000801500008000000000160000800000000000000000000000000000000000000000000000000000000000000000371b7080a900008000000000",0));
bps.emplace_back(bp_from_hex("000000000800008015000000150000801000008029000000120000000000000006000000000000000c000080170000800100008000000000250000800000000000000000000000000000000000000000000000000000000000000000541a7080d500008000000000",0));
bps.emplace_back(bp_from_hex("000000001700008013000000150000802f0000801b000000300000001400000005000000060000001a000080090000802d00008000000000020000800000000000000000000000000000000000000000000000000000000000000000ff1f7080d400008000000000",0));
bps.emplace_back(bp_from_hex("00000000480000801e0000001000008011000080080000003b000000000000000e000000000000000f0000802100008025000080000000000300008000000000000000000000000000000000000000000000000000000000000000006c127080af00008000000000",0));
bps.emplace_back(bp_from_hex("00000000090000800500000018000080140000801a00000011000000130000000b000000000000000e0000800400008026000080000000000f0000800000000000000000000000000000000000000000000000000000000000000000321170804500008000000000",0));
bps.emplace_back(bp_from_hex("000000001f0000801a00000015000080100000802c000000220000001e0000000600000003000000020000802b0000801900008000000000170000800000000000000000000000000000000000000000000000000000000000000000721c70802701008000000000",0));
bps.emplace_back(bp_from_hex("00000000470000802e00000013000080150000802e0000001d000000040000000c00000009000000160000802f0000801400008000000000070000800000000000000000000000000000000000000000000000000000000000000000351e70800500008000000000",0));
bps.emplace_back(bp_from_hex("000000000b0000802d000000110000802700008017000000240000000800000007000000000000001c000080240000801c000080000000000e000080000000000000000000000000000000000000000000000000000000000000000021197080d400008000000000",0));
bps.emplace_back(bp_from_hex("00000000080000803200000018000080280000800c000000160000000b00000026000000030000001e0000800100008009000080000000000c0000800000000000000000000000000000000000000000000000000000000000000000451e70807400008000000000",0));
bps.emplace_back(bp_from_hex("000000000c0000802c000000010000800c000080410000001f0000000f000000000000000000000018000080150000800200008000000000250000800000000000000000000000000000000000000000000000000000000000000000291970802801008000000000",0));
bps.emplace_back(bp_from_hex("00000000060000801e0000001600008012000080030000000a000000190000000000000000000000030000801100008021000080000000000d0000800000000000000000000000000000000000000000000000000000000000000000f71a70801901008000000000",0));
bps.emplace_back(bp_from_hex("000000003600008043000000100000801100008014000000130000002500000002000000000000000c000080210000800200008000000000170000800000000000000000000000000000000000000000000000000000000000000000e21970807400008000000000",0));
bps.emplace_back(bp_from_hex("000000004900008051000000040000800c000080090000002d0000001600000000000000080000001f000080090000801500008000000000080000800000000000000000000000000000000000000000000000000000000000000000c11d70809b00008000000000",0));
bps.emplace_back(bp_from_hex("00000000040000803000000015000080210000800b0000001100000010000000200000000b000000130000802b00008000000000000000000e00008000000000000000000000000000000000000000000000000000000000000000003c107080d500008000000000",0));
bps.emplace_back(bp_from_hex("0000000047000080360000000f000080030000803f0000001d0000001e0000001200000007000000170000802b0000802700008000000000060000800000000000000000000000000000000000000000000000000000000000000000e31170802801008000000000",0));
bps.emplace_back(bp_from_hex("0000000009000080370000000c000080100000802d00000026000000100000000300000000000000170000800d0000802b000080000000000600008000000000000000000000000000000000000000000000000000000000000000007f167080d200008000000000",0));
bps.emplace_back(bp_from_hex("000000002000008022000000170000800d0000800f0000000c000000290000001a00000007000000100000801500008000000000000000000e0000800000000000000000000000000000000000000000000000000000000000000000e41470802800008000000000",0));
bps.emplace_back(bp_from_hex("0000000033000080390000001500008028000080240000000a000000080000001d000000010000000a000080090000802500008000000000040000800000000000000000000000000000000000000000000000000000000000000000ac197080c900008000000000",0));
bps.emplace_back(bp_from_hex("00000000480000805800000004000080240000802e00000020000000050000000400000000000000190000800d000080010000800000000008000080000000000000000000000000000000000000000000000000000000000000000064157080d400008000000000",0));
bps.emplace_back(bp_from_hex("00000000070000805b000000130000800400008015000000350000000f000000230000000d000000080000802b0000802c000080000000002c0000800000000000000000000000000000000000000000000000000000000000000000071a70802301008000000000",0));
bps.emplace_back(bp_from_hex("000000004d0000805400000010000080180000801b00000042000000240000000100000006000000130000802900008013000080000000000c00008000000000000000000000000000000000000000000000000000000000000000004b1270801901008000000000",0));
bps.emplace_back(bp_from_hex("00000000330000800e0000000c000080170000801f00000011000000000000000000000003000000140000802100008001000080000000002c0000800000000000000000000000000000000000000000000000000000000000000000161d7080d500008000000000",0));
bps.emplace_back(bp_from_hex("000000001f0000802c0000001000008026000080400000002e000000030000001800000000000000120000802a0000800400008000000000150000800000000000000000000000000000000000000000000000000000000000000000211f7080af00008000000000",0));
bps.emplace_back(bp_from_hex("000000000b0000802f000000040000802f0000801200000013000000130000000000000009000000130000802500008009000080000000001e0000800000000000000000000000000000000000000000000000000000000000000000101a7080dd00008000000000",0));
bps.emplace_back(bp_from_hex("000000000b000080100000001500008018000080010000001300000000000000090000000100000008000080090000801c000080000000000e0000800000000000000000000000000000000000000000000000000000000000000000261170802801008000000000",0));
bps.emplace_back(bp_from_hex("00000000330000801f000000040000801000008012000000120000001300000003000000080000001e000080090000801c000080000000000e0000800000000000000000000000000000000000000000000000000000000000000000661b7080a900008000000000",0));
bps.emplace_back(bp_from_hex("000000000b00008030000000040000800f0000801b000000180000001300000005000000010000001e000080090000802900008000000000170000800000000000000000000000000000000000000000000000000000000000000000611270805f00008000000000",0));
bps.emplace_back(bp_from_hex("000000000b00008036000000150000802f0000800b00000008000000000000000000000009000000070000800900008027000080000000000600008000000000000000000000000000000000000000000000000000000000000000004d1b70808e00008000000000",0));
bps.emplace_back(bp_from_hex("0000000033000080350000001100008027000080260000000b00000013000000090000000900000014000080090000801c000080000000000e000080000000000000000000000000000000000000000000000000000000000000000061117080d400008000000000",0));
bps.emplace_back(bp_from_hex("000000000b00008023000000040000800c00008026000000130000001f0000000c000000000000000f000080090000801c000080000000000e00008000000000000000000000000000000000000000000000000000000000000000004c127080d500008000000000",0));
bps.emplace_back(bp_from_hex("000000000b0000802c00000015000080210000801c000000250000001f00000000000000080000001d000080090000802a000080000000002c0000800000000000000000000000000000000000000000000000000000000000000000d61970808e00008000000000",0));
bps.emplace_back(bp_from_hex("000000000a0000801c00000011000080100000800300000013000000000000000c0000000100000015000080010000803000008000000000250000800000000000000000000000000000000000000000000000000000000000000000741b7080d500008000000000",0));
bps.emplace_back(bp_from_hex("00000000050000801e00000011000080180000801200000002000000040000000c000000090000001b000080010000803000008000000000250000800000000000000000000000000000000000000000000000000000000000000000cc1670804200008000000000",0));
bps.emplace_back(bp_from_hex("00000000210000802300000011000080270000800700000023000000040000000c0000000200000014000080010000803000008000000000250000800000000000000000000000000000000000000000000000000000000000000000eb127080a900008000000000",0));
bps.emplace_back(bp_from_hex("000000000d0000801800000011000080260000801c0000001d000000040000000800000009000000030000800100008030000080000000002500008000000000000000000000000000000000000000000000000000000000000000004c177080b400008000000000",0));
bps.emplace_back(bp_from_hex("000000003e00008020000000150000802600008008000000120000001000000011000000000000000d00008001000080300000800000000025000080000000000000000000000000000000000000000000000000000000000000000086127080dd00008000000000",0));
bps.emplace_back(bp_from_hex("000000001e0000801200000015000080210000800f0000001f0000001f0000000d00000000000000080000800100008030000080000000002500008000000000000000000000000000000000000000000000000000000000000000007d1c70807400008000000000",0));
bps.emplace_back(bp_from_hex("000000003a00008031000000110000802f0000800b000000250000001f00000009000000090000000f0000800100008030000080000000002500008000000000000000000000000000000000000000000000000000000000000000006d117080a900008000000000",0));
bps.emplace_back(bp_from_hex("0000000005000080100000000f000080040000802200000018000000120000000b0000000600000010000080010000803000008000000000250000800000000000000000000000000000000000000000000000000000000000000000851970803500008000000000",0));
bps.emplace_back(bp_from_hex("00000000080000800b00000004000080180000800b0000000b000000110000000e000000080000000f0000801400008017000080000000001700008000000000000000000000000000000000000000000000000000000000000000000c127080d400008000000000",0));
bps.emplace_back(bp_from_hex("00000000230000801800000011000080260000800c0000001d0000001200000009000000090000001d000080170000801900008000000000060000800000000000000000000000000000000000000000000000000000000000000000741070809400008000000000",0));
bps.emplace_back(bp_from_hex("000000002700008014000000150000802f0000800400000009000000190000000800000003000000150000801d0000801400008000000000150000800000000000000000000000000000000000000000000000000000000000000000341a7080d900008000000000",0));
bps.emplace_back(bp_from_hex("000000004f0000801000000011000080270000800200000000000000130000000a00000000000000190000801400008019000080000000001e0000800000000000000000000000000000000000000000000000000000000000000000d51d7080b400008000000000",0));
bps.emplace_back(bp_from_hex("000000004500008012000000040000800c0000800d000000230000000700000009000000090000000e0000801d00008019000080000000001700008000000000000000000000000000000000000000000000000000000000000000007d177080d500008000000000",0));
bps.emplace_back(bp_from_hex("000000002200008039000000150000800f00008007000000130000000b0000000c0000000a000000190000801d000080170000800000000006000080000000000000000000000000000000000000000000000000000000000000000091177080c900008000000000",0));
bps.emplace_back(bp_from_hex("00000000050000801600000004000080040000800f000000260000001b0000000d0000000b0000000600008014000080190000800000000015000080000000000000000000000000000000000000000000000000000000000000000066167080a900008000000000",0));
bps.emplace_back(bp_from_hex("000000003a000080090000000f000080260000800b000000100000000a0000000b00000008000000140000801d00008017000080000000001e0000800000000000000000000000000000000000000000000000000000000000000000951870802500008000000000",0));
bps.emplace_back(bp_from_hex("00000000050000801e00000011000080210000801200000013000000100000000c000000090000000800008030000080210000800000000026000080000000000000000000000000000000000000000000000000000000000000000051107080d400008000000000",0));
bps.emplace_back(bp_from_hex("000000004500008023000000040000800c0000801c000000000000001300000009000000030000000f00008030000080210000800000000026000080000000000000000000000000000000000000000000000000000000000000000087107080b400008000000000",0));
bps.emplace_back(bp_from_hex("000000000800008010000000110000802700008029000000120000001f0000000a000000090000000c000080300000802100008000000000260000800000000000000000000000000000000000000000000000000000000000000000f81970804200008000000000",0));
bps.emplace_back(bp_from_hex("000000001e0000802600000011000080040000800b0000001f000000100000000b0000000800000010000080300000802100008000000000260000800000000000000000000000000000000000000000000000000000000000000000c6117080d900008000000000",0));
bps.emplace_back(bp_from_hex("000000000e0000800900000011000080180000802600000012000000040000000300000009000000190000803000008021000080000000002600008000000000000000000000000000000000000000000000000000000000000000006e127080a900008000000000",0));
bps.emplace_back(bp_from_hex("00000000360000803000000011000080100000800f00000009000000100000000a000000030000000d000080300000802100008000000000260000800000000000000000000000000000000000000000000000000000000000000000f11470807500008000000000",0));
bps.emplace_back(bp_from_hex("000000001f00008021000000150000802100008012000000130000001f000000090000000000000016000080300000802100008000000000260000800000000000000000000000000000000000000000000000000000000000000000d71770807b00008000000000",0));
bps.emplace_back(bp_from_hex("000000000a000080210000001100008026000080050000000c000000100000000c000000090000000e000080300000802100008000000000260000800000000000000000000000000000000000000000000000000000000000000000001a70803500008000000000",0));
bps.emplace_back(bp_from_hex("000000000d0000802e00000014000080150000803c0000000c0000002400000000000000040000000c0000802b0000801700008000000000130000800000000000000000000000000000000000000000000000000000000000000000c91a7080d400008000000000",0));
bps.emplace_back(bp_from_hex("000000000d00008023000000010000800c0000800800000011000000130000000300000001000000140000802b0000802400008000000000050000800000000000000000000000000000000000000000000000000000000000000000d61670803500008000000000",0));
bps.emplace_back(bp_from_hex("000000000d0000802c00000014000080210000803800000039000000100000000c000000000000000c0000802b000080300000800000000002000080000000000000000000000000000000000000000000000000000000000000000002177080d900008000000000",0));
bps.emplace_back(bp_from_hex("000000000d00008010000000120000802f00008027000000110000001f00000008000000010000000d0000802b0000802400008000000000050000800000000000000000000000000000000000000000000000000000000000000000c51e70809800008000000000",0));
bps.emplace_back(bp_from_hex("000000000d0000805300000014000080100000802a00000012000000140000001100000009000000170000802b0000800100008000000000250000800000000000000000000000000000000000000000000000000000000000000000e61b70802500008000000000",0));
bps.emplace_back(bp_from_hex("000000000d0000801f000000010000802100008008000000170000001300000003000000090000001e0000802b00008024000080000000000500008000000000000000000000000000000000000000000000000000000000000000009e1770809800008000000000",0));
bps.emplace_back(bp_from_hex("000000000d00008025000000140000800f000080270000003a0000002100000008000000010000000f0000802b0000801700008000000000250000800000000000000000000000000000000000000000000000000000000000000000d31c70803400008000000000",0));
bps.emplace_back(bp_from_hex("000000000d00008039000000120000800c0000800f00000011000000150000000900000009000000040000802b00008030000080000000000200008000000000000000000000000000000000000000000000000000000000000000008d147080d500008000000000",0));
bps.emplace_back(bp_from_hex("000000002d0000800e0000000f0000800f0000801e000000190000000a00000001000000000000000d000080070000801c000080000000000e00008000000000000000000000000000000000000000000000000000000000000000002f1f7080d500008000000000",0));
bps.emplace_back(bp_from_hex("000000002d0000802100000004000080180000800700000003000000110000000c0000000c0000000c000080210000801c000080000000000e0000800000000000000000000000000000000000000000000000000000000000000000c31070802801008000000000",0));
bps.emplace_back(bp_from_hex("000000003e0000802700000010000080140000801f0000000b00000013000000150000000000000013000080210000801c000080000000000e0000800000000000000000000000000000000000000000000000000000000000000000d21070802500008000000000",0));
bps.emplace_back(bp_from_hex("000000002d0000802b00000011000080160000803400000011000000140000001d0000000000000010000080210000801c000080000000000e0000800000000000000000000000000000000000000000000000000000000000000000fc147080d400008000000000",0));
bps.emplace_back(bp_from_hex("000000002d000080290000001600008004000080360000002900000023000000200000000100000015000080210000801c000080000000000e0000800000000000000000000000000000000000000000000000000000000000000000ee177080dd00008000000000",0));
bps.emplace_back(bp_from_hex("000000003e000080300000001500008003000080350000002b0000000000000008000000000000000f000080210000801c000080000000000e0000800000000000000000000000000000000000000000000000000000000000000000bb1670803500008000000000",0));
bps.emplace_back(bp_from_hex("000000003e000080420000001a00008010000080430000004000000028000000090000000000000002000080210000801c000080000000000e000080000000000000000000000000000000000000000000000000000000000000000080127080a900008000000000",0));
bps.emplace_back(bp_from_hex("000000002d000080510000000100008017000080220000003b00000007000000000000000800000012000080210000801c000080000000000e0000800000000000000000000000000000000000000000000000000000000000000000041c70802801008000000000",0));
bps.emplace_back(bp_from_hex("000000000b0000801e000000040000800400008024000000000000001f000000090000000900000006000080210000802a000080000000001e00008000000000000000000000000000000000000000000000000000000000000000000d1b70802801008000000000",0));
bps.emplace_back(bp_from_hex("0000000023000080090000000400008016000080260000000b0000001f00000009000000090000000f0000802100008016000080000000001e0000800000000000000000000000000000000000000000000000000000000000000000061870802801008000000000",0));
bps.emplace_back(bp_from_hex("000000000b000080250000000400008026000080240000001f000000140000000900000008000000140000802100008010000080000000001e00008000000000000000000000000000000000000000000000000000000000000000000a1b7080d400008000000000",0));
bps.emplace_back(bp_from_hex("00000000230000802600000015000080040000801b000000200000000400000009000000000000000f0000802100008007000080000000001e0000800000000000000000000000000000000000000000000000000000000000000000a41370803b00008000000000",0));
bps.emplace_back(bp_from_hex("00000000230000801e000000040000802100008022000000130000001400000009000000010000001e0000802100008007000080000000001e00008000000000000000000000000000000000000000000000000000000000000000006d1370809d00008000000000",0));
bps.emplace_back(bp_from_hex("000000000b00008026000000150000801800008024000000200000001f0000000300000000000000060000802100008030000080000000001e0000800000000000000000000000000000000000000000000000000000000000000000ea1b70802801008000000000",0));
bps.emplace_back(bp_from_hex("000000000b0000801c0000000400008010000080240000000b0000001f000000090000000900000014000080210000802c000080000000001e0000800000000000000000000000000000000000000000000000000000000000000000141470802801008000000000",0));
bps.emplace_back(bp_from_hex("000000000b00008030000000150000802f0000800700000013000000100000000c000000010000000f0000802100008007000080000000001e0000800000000000000000000000000000000000000000000000000000000000000000241f7080fb00008000000000",0));
bps.emplace_back(bp_from_hex("000000002200008002000000140000800c000080160000000100000007000000000000000600000004000080190000801c000080000000000e00008000000000000000000000000000000000000000000000000000000000000000005f1870802801008000000000",0));
bps.emplace_back(bp_from_hex("000000002100008009000000040000801000008023000000010000001f0000000c0000000100000004000080190000801c000080000000000e0000800000000000000000000000000000000000000000000000000000000000000000251b70802301008000000000",0));
bps.emplace_back(bp_from_hex("000000003e00008013000000140000800f0000802f0000001b000000110000000d0000000000000004000080190000801c000080000000000e0000800000000000000000000000000000000000000000000000000000000000000000871170800401008000000000",0));
bps.emplace_back(bp_from_hex("00000000140000802e0000001100008015000080130000002500000019000000010000000600000004000080190000801c000080000000000e000080000000000000000000000000000000000000000000000000000000000000000065197080ab00008000000000",0));
bps.emplace_back(bp_from_hex("000000002c000080180000000f0000801500008021000000070000000b000000090000000900000004000080190000801c000080000000000e0000800000000000000000000000000000000000000000000000000000000000000000581170802801008000000000",0));
bps.emplace_back(bp_from_hex("00000000420000801b0000000400008021000080050000001b00000003000000030000000b00000004000080190000801c000080000000000e0000800000000000000000000000000000000000000000000000000000000000000000a41d70804200008000000000",0));
bps.emplace_back(bp_from_hex("00000000200000800c0000001100008027000080230000001e00000001000000020000000600000004000080190000801c000080000000000e0000800000000000000000000000000000000000000000000000000000000000000000221b7080a900008000000000",0));
bps.emplace_back(bp_from_hex("000000002d000080160000000f0000802700008029000000110000001d000000000000000600000004000080190000801c000080000000000e000080000000000000000000000000000000000000000000000000000000000000000064137080d400008000000000",0));
bps.emplace_back(bp_from_hex("00000000450000802e000000040000800400008027000000030000001000000007000000000000000c000080070000801c000080000000000e0000800000000000000000000000000000000000000000000000000000000000000000c21270801901008000000000",0));
bps.emplace_back(bp_from_hex("00000000210000803800000016000080290000802b00000024000000220000001a0000000000000019000080270000800d000080000000000c0000800000000000000000000000000000000000000000000000000000000000000000021570803500008000000000",0));
bps.emplace_back(bp_from_hex("00000000270000805200000010000080210000802e0000000f000000020000000c00000000000000130000801a0000802d00008000000000260000800000000000000000000000000000000000000000000000000000000000000000a01a7080c000008000000000",0));
bps.emplace_back(bp_from_hex("000000002f00008027000000160000800c0000801500000029000000000000000e000000000000000c000080090000801b000080000000001300008000000000000000000000000000000000000000000000000000000000000000000d1e7080d400008000000000",0));
bps.emplace_back(bp_from_hex("000000003a0000800600000010000080040000800c000000280000000e000000000000000000000011000080290000800300008000000000060000800000000000000000000000000000000000000000000000000000000000000000771670801e01008000000000",0));
bps.emplace_back(bp_from_hex("0000000038000080150000001100008028000080280000000e00000012000000000000000c000000190000800400008009000080000000001e000080000000000000000000000000000000000000000000000000000000000000000073157080a900008000000000",0));
bps.emplace_back(bp_from_hex("000000000c000080140000000c0000800f0000800200000022000000050000001300000000000000190000800100008004000080000000002e0000800000000000000000000000000000000000000000000000000000000000000000da157080d500008000000000",0));
bps.emplace_back(bp_from_hex("00000000140000804b0000001500008026000080070000003000000025000000000000000b00000015000080110000801b000080000000000700008000000000000000000000000000000000000000000000000000000000000000002a1a70802801008000000000",0));
bps.emplace_back(bp_from_hex("000000003a0000801b0000000f000080040000801a0000001a000000190000000f000000060000000c000080140000801c000080000000000e0000800000000000000000000000000000000000000000000000000000000000000000f31870809400008000000000",0));
bps.emplace_back(bp_from_hex("000000001f0000804c000000040000802b0000801000000035000000360000000f0000000a0000000e0000802b0000802500008000000000040000800000000000000000000000000000000000000000000000000000000000000000c31e7080dd00008000000000",0));
bps.emplace_back(bp_from_hex("0000000047000080410000000300008026000080370000000f0000003200000017000000040000001f0000802b0000800100008000000000170000800000000000000000000000000000000000000000000000000000000000000000171e70800500008000000000",0));
bps.emplace_back(bp_from_hex("00000000420000801e000000110000800d000080270000003b00000023000000000000000200000008000080300000803100008000000000060000800000000000000000000000000000000000000000000000000000000000000000a61f7080d400008000000000",0));
bps.emplace_back(bp_from_hex("0000000007000080040000001a000080150000800400000041000000040000001400000009000000010000802d00008013000080000000001500008000000000000000000000000000000000000000000000000000000000000000006f1c70804200008000000000",0));
bps.emplace_back(bp_from_hex("000000002c0000804900000017000080030000800500000002000000100000000000000000000000120000802b00008019000080000000002e0000800000000000000000000000000000000000000000000000000000000000000000421e70802801008000000000",0));
bps.emplace_back(bp_from_hex("000000000a0000805700000011000080150000801b00000004000000030000000a000000050000001e0000802b0000800900008000000000150000800000000000000000000000000000000000000000000000000000000000000000df1370808e00008000000000",0));
bps.emplace_back(bp_from_hex("0000000006000080210000000c0000800e000080010000000000000009000000220000000c0000001c0000802d00008001000080000000001e0000800000000000000000000000000000000000000000000000000000000000000000051270802801008000000000",0));
bps.emplace_back(bp_from_hex("000000004c00008005000000040000800c0000800b000000110000001e0000000a00000009000000020000802f00008017000080000000001e000080000000000000000000000000000000000000000000000000000000000000000016127080d500008000000000",0));
bps.emplace_back(bp_from_hex("0000000033000080130000000f0000802f0000800e000000120000000e0000000300000004000000040000800700008021000080000000001e0000800000000000000000000000000000000000000000000000000000000000000000a51970805d00008000000000",0));
bps.emplace_back(bp_from_hex("00000000380000801e000000110000801500008010000000110000001b0000000600000008000000140000801200008015000080000000001e00008000000000000000000000000000000000000000000000000000000000000000003d1770804200008000000000",0));
bps.emplace_back(bp_from_hex("000000004f00008025000000150000800d00008025000000120000001900000011000000050000001b0000801a00008025000080000000001e0000800000000000000000000000000000000000000000000000000000000000000000711970803300008000000000",0));
bps.emplace_back(bp_from_hex("00000000230000800200000014000080260000801b000000110000000a00000006000000090000000e0000802c0000802b000080000000001e0000800000000000000000000000000000000000000000000000000000000000000000e51770804200008000000000",0));
bps.emplace_back(bp_from_hex("000000002d0000800e0000000c000080270000800b00000011000000080000000c000000000000001d0000801700008007000080000000001e0000800000000000000000000000000000000000000000000000000000000000000000771370805d00008000000000",0));
bps.emplace_back(bp_from_hex("0000000008000080310000000f000080160000802f000000120000000f0000000f0000000000000018000080100000801a000080000000001e00008000000000000000000000000000000000000000000000000000000000000000001a1770803300008000000000",0));
bps.emplace_back(bp_from_hex("000000001800008030000000140000800c00008008000000110000001d0000000c00000003000000170000802a0000802e000080000000001e000080000000000000000000000000000000000000000000000000000000000000000036167080d400008000000000",0));
bps.emplace_back(bp_from_hex("00000000210000800a00000014000080270000802d00000026000000140000000a000000090000001e000080150000801c000080000000000e0000800000000000000000000000000000000000000000000000000000000000000000451070804200008000000000",0));
bps.emplace_back(bp_from_hex("000000004d000080350000000c0000801700008028000000270000001b000000110000000300000001000080120000801c000080000000000e0000800000000000000000000000000000000000000000000000000000000000000000851c7080d500008000000000",0));
bps.emplace_back(bp_from_hex("0000000009000080110000001600008025000080040000003d0000001c000000100000000c000000130000801500008012000080000000002c0000800000000000000000000000000000000000000000000000000000000000000000831970802801008000000000",0));
bps.emplace_back(bp_from_hex("0000000018000080260000000400008012000080210000003300000018000000000000000100000003000080150000802c000080000000002c0000800000000000000000000000000000000000000000000000000000000000000000541070802801008000000000",0));
bps.emplace_back(bp_from_hex("00000000490000800a000000170000801100008000000000320000000e0000000000000008000000140000801500008012000080000000002c0000800000000000000000000000000000000000000000000000000000000000000000041970804200008000000000",0));
bps.emplace_back(bp_from_hex("000000001f0000805a00000014000080280000800b0000001c000000250000001500000000000000020000802c0000801c000080000000000e000080000000000000000000000000000000000000000000000000000000000000000067197080a900008000000000",0));
bps.emplace_back(bp_from_hex("000000000a0000803e00000011000080240000800300000015000000140000000f0000000000000003000080150000802c000080000000002c0000800000000000000000000000000000000000000000000000000000000000000000c51370802801008000000000",0));
bps.emplace_back(bp_from_hex("00000000010000805400000015000080170000801e00000045000000170000000b000000000000001e000080150000801c000080000000000e0000800000000000000000000000000000000000000000000000000000000000000000e01470801901008000000000",0));
bps.emplace_back(bp_from_hex("0000000017000080230000000f0000802f000080270000001300000014000000070000000800000013000080130000801f00008000000000150000800000000000000000000000000000000000000000000000000000000000000000d41070802801008000000000",0));
bps.emplace_back(bp_from_hex("000000002f0000802300000004000080140000801b000000230000001200000003000000000000001c000080260000801f00008000000000020000800000000000000000000000000000000000000000000000000000000000000000eb187080d400008000000000",0));
bps.emplace_back(bp_from_hex("000000000a0000804c0000001500008025000080080000003c000000250000000c000000030000001e0000801f00008013000080000000002c0000800000000000000000000000000000000000000000000000000000000000000000561870807400008000000000",0));
bps.emplace_back(bp_from_hex("000000003a0000805600000004000080110000801e000000030000000000000000000000000000001b000080130000801f000080000000001e00008000000000000000000000000000000000000000000000000000000000000000001a107080d500008000000000",0));
bps.emplace_back(bp_from_hex("000000002600008051000000110000801000008024000000460000001f000000150000000900000017000080260000801f00008000000000150000800000000000000000000000000000000000000000000000000000000000000000911870805f00008000000000",0));
bps.emplace_back(bp_from_hex("000000003500008047000000040000800c00008036000000020000001b000000000000000c000000090000801f00008026000080000000002c0000800000000000000000000000000000000000000000000000000000000000000000fd1d70802801008000000000",0));
bps.emplace_back(bp_from_hex("00000000380000801c0000001100008018000080150000001d000000000000001b0000000000000007000080130000801f00008000000000020000800000000000000000000000000000000000000000000000000000000000000000e01770805d00008000000000",0));
bps.emplace_back(bp_from_hex("000000004c0000805a00000011000080040000802e0000000100000024000000090000000000000002000080260000801f0000800000000015000080000000000000000000000000000000000000000000000000000000000000000099117080dd00008000000000",0));
bps.emplace_back(bp_from_hex("0000000045000080090000000f000080210000801b0000001300000013000000070000000300000013000080210000802b000080000000002c0000800000000000000000000000000000000000000000000000000000000000000000c31a70802301008000000000",0));
bps.emplace_back(bp_from_hex("00000000360000801b00000016000080280000801500000009000000130000001a0000000000000015000080240000801c000080000000000e0000800000000000000000000000000000000000000000000000000000000000000000631770802801008000000000",0));
bps.emplace_back(bp_from_hex("000000000b0000802e00000017000080290000802c00000008000000200000001f00000000000000160000800400008024000080000000002500008000000000000000000000000000000000000000000000000000000000000000003c1270807400008000000000",0));
bps.emplace_back(bp_from_hex("00000000040000802b00000011000080040000803500000038000000270000001d000000000000000e000080210000802b000080000000002c000080000000000000000000000000000000000000000000000000000000000000000074117080d400008000000000",0));
bps.emplace_back(bp_from_hex("0000000018000080410000001a000080030000802e0000001000000005000000060000000000000016000080040000801c000080000000000e00008000000000000000000000000000000000000000000000000000000000000000008e1770802801008000000000",0));
bps.emplace_back(bp_from_hex("000000000700008039000000040000801700008034000000230000001100000003000000000000001c000080240000800400008000000000250000800000000000000000000000000000000000000000000000000000000000000000911670807400008000000000",0));
bps.emplace_back(bp_from_hex("0000000049000080530000000300008027000080160000002b00000008000000000000000200000008000080040000801c000080000000000e0000800000000000000000000000000000000000000000000000000000000000000000dd147080d500008000000000",0));
bps.emplace_back(bp_from_hex("00000000420000805600000011000080300000803c0000004600000022000000040000000a0000001e000080270000801c000080000000000e0000800000000000000000000000000000000000000000000000000000000000000000cf1f70802801008000000000",0));
bps.emplace_back(bp_from_hex("0000000008000080060000000c0000800c0000802b0000000700000009000000100000000a0000000d000080140000802d00008000000000260000800000000000000000000000000000000000000000000000000000000000000000ce1a70806800008000000000",0));
bps.emplace_back(bp_from_hex("000000003d00008059000000110000800f0000801a000000210000001500000004000000000000000c0000801400008001000080000000002600008000000000000000000000000000000000000000000000000000000000000000004c1070802801008000000000",0));
bps.emplace_back(bp_from_hex("00000000050000803c0000000f0000800c0000802d000000030000001d00000013000000000000001c000080140000802d000080000000002d0000800000000000000000000000000000000000000000000000000000000000000000ef1a70802801008000000000",0));
bps.emplace_back(bp_from_hex("00000000080000802800000010000080150000803e000000280000002300000022000000000000001e000080140000800100008000000000260000800000000000000000000000000000000000000000000000000000000000000000591f7080d400008000000000",0));
bps.emplace_back(bp_from_hex("000000003800008005000000150000800c0000800a0000000900000018000000010000000500000012000080140000802d000080000000002d0000800000000000000000000000000000000000000000000000000000000000000000a11a70802801008000000000",0));
bps.emplace_back(bp_from_hex("00000000080000800f00000014000080270000802a00000008000000030000001d000000000000000d0000801400008001000080000000002600008000000000000000000000000000000000000000000000000000000000000000009f1770802801008000000000",0));
bps.emplace_back(bp_from_hex("000000003e000080010000000c0000800c00008014000000190000000f0000000f000000000000001a000080140000802d000080000000002600008000000000000000000000000000000000000000000000000000000000000000002b177080d400008000000000",0));
bps.emplace_back(bp_from_hex("00000000330000801b0000001500008011000080350000002f000000050000001f0000000b0000000b000080140000800100008000000000260000800000000000000000000000000000000000000000000000000000000000000000031670806800008000000000",0));
bps.emplace_back(bp_from_hex("00000000240000801f0000000f000080140000801a0000001a0000000a00000007000000000000001c000080030000800400008000000000080000800000000000000000000000000000000000000000000000000000000000000000411a7080df00008000000000",0));
bps.emplace_back(bp_from_hex("00000000040000802e00000010000080100000802f000000430000000000000000000000000000001c000080240000801b000080000000000d0000800000000000000000000000000000000000000000000000000000000000000000191b7080d400008000000000",0));
bps.emplace_back(bp_from_hex("000000000100008050000000110000800c0000803d000000440000000e00000016000000090000001c0000800300008004000080000000002e0000800000000000000000000000000000000000000000000000000000000000000000ff1b70802801008000000000",0));
bps.emplace_back(bp_from_hex("0000000040000080230000000f00008004000080310000003f0000001900000026000000000000001c000080240000801b00008000000000040000800000000000000000000000000000000000000000000000000000000000000000e91670800401008000000000",0));
bps.emplace_back(bp_from_hex("00000000250000802c000000040000800d0000802c0000000e0000001a0000001e000000000000001c000080040000800300008000000000030000800000000000000000000000000000000000000000000000000000000000000000531d70800e01008000000000",0));
bps.emplace_back(bp_from_hex("000000000c00008026000000160000801600008017000000220000000f00000002000000000000001c000080240000801b000080000000000f0000800000000000000000000000000000000000000000000000000000000000000000a0137080d400008000000000",0));
bps.emplace_back(bp_from_hex("0000000041000080270000001400008021000080320000001b0000001c0000001c000000000000001c00008003000080040000800000000025000080000000000000000000000000000000000000000000000000000000000000000055167080d500008000000000",0));
bps.emplace_back(bp_from_hex("000000003300008004000000040000800f000080290000003d0000002300000025000000000000001c0000801b0000802400008000000000020000800000000000000000000000000000000000000000000000000000000000000000aa1370802801008000000000",0));
bps.emplace_back(bp_from_hex("00000000360000801b000000150000802f000080170000002100000000000000040000000800000017000080020000802b000080000000002d0000800000000000000000000000000000000000000000000000000000000000000000021a7080d400008000000000",0));
bps.emplace_back(bp_from_hex("000000002d0000801d00000011000080260000804300000021000000150000000200000000000000040000801d00008019000080000000002d0000800000000000000000000000000000000000000000000000000000000000000000e31d70802801008000000000",0));
bps.emplace_back(bp_from_hex("000000002d0000800e000000150000801d000080130000000400000007000000000000000000000004000080020000802b000080000000002d00008000000000000000000000000000000000000000000000000000000000000000001f1d70801901008000000000",0));
bps.emplace_back(bp_from_hex("000000003600008006000000010000800c00008018000000390000000c0000001a00000002000000040000801d00008019000080000000002d0000800000000000000000000000000000000000000000000000000000000000000000221770802801008000000000",0));
bps.emplace_back(bp_from_hex("000000003e000080320000001100008016000080370000000b000000040000000c00000000000000040000800200008019000080000000002d0000800000000000000000000000000000000000000000000000000000000000000000bc157080d500008000000000",0));
bps.emplace_back(bp_from_hex("000000002d000080220000000c0000800f00008010000000250000001c0000000f00000000000000040000801d0000802b000080000000002d0000800000000000000000000000000000000000000000000000000000000000000000381c70802801008000000000",0));
bps.emplace_back(bp_from_hex("00000000360000803e0000001100008027000080210000001600000000000000070000000000000004000080020000801d000080000000002d00008000000000000000000000000000000000000000000000000000000000000000002d1a70801e01008000000000",0));
bps.emplace_back(bp_from_hex("000000003e0000802d0000001500008010000080200000003e000000120000002000000000000000040000801d0000802b000080000000002d0000800000000000000000000000000000000000000000000000000000000000000000e9137080a900008000000000",0));
bps.emplace_back(bp_from_hex("000000003800008030000000040000800c000080290000001b0000000a00000011000000000000000d0000801f0000802d00008000000000260000800000000000000000000000000000000000000000000000000000000000000000d11470802801008000000000",0));
bps.emplace_back(bp_from_hex("0000000038000080160000000f00008016000080290000000e000000000000000a00000008000000140000802a0000801f00008000000000020000800000000000000000000000000000000000000000000000000000000000000000171070802801008000000000",0));
bps.emplace_back(bp_from_hex("00000000380000802e000000110000800c000080290000001a0000001a00000013000000000000000b0000801f00008019000080000000002d0000800000000000000000000000000000000000000000000000000000000000000000a51170802801008000000000",0));
bps.emplace_back(bp_from_hex("00000000380000803d00000015000080100000802b00000024000000070000000d0000000a0000000f0000801f00008004000080000000002d0000800000000000000000000000000000000000000000000000000000000000000000a61e7080d500008000000000",0));
bps.emplace_back(bp_from_hex("0000000038000080100000000f000080260000802900000026000000100000000c000000090000000d0000801f00008013000080000000002c00008000000000000000000000000000000000000000000000000000000000000000000b1770801901008000000000",0));
bps.emplace_back(bp_from_hex("00000000380000801b000000040000802f0000802b000000240000000f0000001000000000000000170000801f000080280000800000000026000080000000000000000000000000000000000000000000000000000000000000000013127080a900008000000000",0));
bps.emplace_back(bp_from_hex("000000003800008021000000040000800400008029000000090000001300000011000000000000000e0000801f0000800100008000000000020000800000000000000000000000000000000000000000000000000000000000000000251a7080d400008000000000",0));
bps.emplace_back(bp_from_hex("0000000038000080120000000c00008016000080110000001b0000000e00000007000000000000000f0000801f0000801000008000000000250000800000000000000000000000000000000000000000000000000000000000000000581970802801008000000000",0));
Charas charas_ev{bps};
save_charas("saves/event.hype.bin",charas_ev);
std::cout << charas_ev.bps.size() << "体のイベントキャラを生成しました。" << std::endl;
}
if (args[1] == "register") {
Charas charas{{bp_from_hex(args[3],std::stoul(args[4]))}};
save_charas("saves/"+args[2]+".hype.bin",charas);
std::cout << charas.bps.size() << "体のキャラを生成しました。" << std::endl;
}
if (args[1]=="mac") {
std::string input_name="tmp";
std::string output_name="tmp";
std::unordered_map<std::string, std::vector<uint32_t>> mp;
if (args.size()<3) {
std::cout<<"x"<<std::endl;
return 0;
}
std::stringstream ss(args[2]);
std::string line;
std::string key;
std::string value;
std::string elem;
while (std::getline(ss, line, ';')) {
std::stringstream ss2(line);
std::getline(ss2, key, '=');
std::getline(ss2, value);
std::cout<<key<<" = "<<value<<std::endl;
if (key=="input1") {
input_name=value;
}else if (key=="output") {
output_name=value;
}
}
Charas charas=mac_from_file(input_name,output_name);
}
if (args[1] == "scylla"||args[1]=="hyperion"||args[1]=="merge") {
Charas charas1;
Charas charas2;
Charas charas3;
std::string output_name="tmp";
std::unordered_map<std::string, std::vector<uint32_t>> mp;
if (args.size()<3) {
std::cout<<"x"<<std::endl;
return 0;
}
std::stringstream ss(args[2]);
std::string line;
std::string key;
std::string value;
std::string elem;
while (std::getline(ss, line, ';')) {
std::stringstream ss2(line);
std::getline(ss2, key, '=');
std::getline(ss2, value);
std::cout<<key<<" = "<<value<<std::endl;
if (key=="input1") {
if (!load_charas("saves/"+value+".hype.bin", charas1)) {
std::cout<<"x"<<std::endl;
return 0;
}
}else if (key=="input2") {
if (!load_charas("saves/"+value+".hype.bin", charas2)) {
std::cout<<"x"<<std::endl;
return 0;
}
}else if (key=="output") {
output_name=value;
}else if (key=="rsid"){
std::vector<uint32_t> v(8,0);
for (uint32_t i = 0; i < value.size(); ++i) {
v[i] = static_cast<uint8_t>(value[i]);
}
mp.emplace(key,v);
}else {
std::vector<uint32_t> v{};
std::stringstream ss3(value);
while (std::getline(ss3, elem, ',')) {
v.emplace_back(std::stoul(elem));
}
mp.emplace(key,v);
}
}
if (args[1] == "scylla") {
charas3=Scylla(charas1,config_from_map(mp));
}
if (args[1] == "hyperion") {
charas3=Hyperion(charas1,charas2,config_from_map(mp));
}
if (args[1] == "merge") {
charas3=Merge(charas1,charas2);
}
save_charas("saves/"+output_name+".hype.bin", charas3);
/*
for (uint32_t i = charas3.index; i < charas3.bps.size()&&i<charas3.index+100; ++i) {
print_chara(charas3, i);
}
std::cout <<charas3.index<<"+"<< charas3.bps.size()-charas3.index <<"体"<< std::endl;
*/
}
if (args[1] == "json") {
if (args.size()<3) {
std::cout<<"{}"<<std::endl;
return 0;
}
Charas charas;
if (!load_charas("saves/"+args[2]+".hype.bin",charas)) {
std::cout<<"{}"<<std::endl;
return 0;
}
std::cout<<"{"<<'"'<<"index"<<'"'<<":"<<charas.index<<","<<'"'<<"size"<<'"'<<":"<<charas.bps.size()<<","<<'"'<<"bps"<<'"'<<":[";
for (uint32_t i = 0; i < charas.bps.size()&&i<charas.index+1000; ++i) {
if (i!=0) {
std::cout<<",";
}
print_chara_json(charas, i);
}
std::cout<<"]}"<<std::endl;
return 0;
}
if (args[1]=="sample") {
Charas charas;
if (!load_charas("saves/qr.hype.bin",charas)) {
std::cout<<"{}"<<std::endl;
return 0;
}
Charas renjiro=Scylla(charas,config_from_rsid("acePDw"));
Charas ev;
if (!load_charas("saves/event.hype.bin",ev)) {
std::cout<<"{}"<<std::endl;
return 0;
}
Charas charas3=Hyperion(ev,renjiro,config_all());
for (uint32_t i = charas3.index; i < charas3.bps.size()&&i<charas3.index+100; ++i) {
print_chara(charas3, i);
}
std::cout <<charas3.index<<"+"<< charas3.bps.size()-charas3.index <<"体"<< std::endl;
}
return 0;
}
"""
HeadIdList = [
0x8000004d,0x80000017,0x80000036,0x80000002,0x80000007,0x80000048,0x8000001f,0x80000047,
0x8000003d,0x80000009,0x8000000c,0x8000000b,0x80000042,0x80000018,0x80000020,0x8000003a,
0x80000003,0x80000005,0x80000045,0x80000004,0x80000038,0x80000008,0x80000034,0x80000021,
0x8000000a,0x8000003e,0x8000001e,0x80000033,0x80000022,0x80000014,0x8000002c,0x8000000d,
0x8000000e,0x8000004c,0x8000002d,0x80000011,0x8000004f,0x80000027,0x80000023,0x80000024,
0x80000001,0x80000049,0x80000006,0x8000002e,0x8000002f,0x80000016,0x80000025,0x80000026,
0x80000031,0x80000035,0x80000040,0x8000000f,0x8000001b,0x80000041,0x80000015,0x80000028,
0x80000010
]
HeadStringList = [
"まる","よこまる","たてまる","さんかく","おにぎり","しかく","かどまる","しずく",
"つぼ","こぐま","あまつゆ","チューリップ","ロボ","イカ","ロケット","スター",
"くま","ハート","ねこみみ","デビル","みかづき","とんがり","でんち","トゲトゲ",
"たまご","タワー","いぬみみ","メラメラ","クワガタ","ダイヤ","ルビー","たいよう",
"うさみみ","まきがい","キャッスル","ブロック","たまねぎ","わっか","コック","おさかな",
"スポーティ","キャンディ","でこ","ピエロ","おだんご","おんがくか","りゅうせい","まめ",
"ぼこ","ひつじ","ヒレ","シルクハット","おかっぱ","かえる","しょくパン","てんしゅ",
"はね"
]
head_map={HeadStringList[i]:HeadIdList[i] for i in range(len(HeadIdList))}
QRHeadStringList=[
"まる","よこまる","たてまる","さんかく","しかく","かどまる"
]
FaceColorIdList = [
0x80000004, 0x80000011, 0x80000015, 0x8000000f, 0x8000000c, 0x80000014, 0x80000010, 0x80000016,
0x80000001, 0x80000012, 0x8000001a, 0x80000003, 0x80000017, 0x80000018, 0x80000013, 0x8000000a
]
HairColorIdList = [
0x8000000c, 0x80000004, 0x8000000f, 0x80000010, 0x80000015, 0x80000021, 0x80000016, 0x8000000d,
0x80000026, 0x80000018, 0x8000002f, 0x80000027, 0x8000000e, 0x80000003, 0x80000011, 0x80000014,
0x80000012, 0x80000017, 0x8000001d, 0x80000028, 0x80000025, 0x80000029, 0x80000024, 0x8000002b,
0x80000030, 0x8000001f, 0x80000019, 0x80000022, 0x80000023, 0x8000002a, 0x80000006, 0x80000031
]
BodyIdList = [
0x00000000, 0x8000000b, 0x8000000c, 0x80000017, 0x8000001c, 0x80000004, 0x80000009, 0x8000000d,
0x80000013, 0x8000000e, 0x8000001d, 0x80000014, 0x8000000f, 0x80000019, 0x8000001e, 0x80000015,
0x80000006, 0x80000010, 0x80000008, 0x8000001b, 0x80000012, 0x80000011, 0x80000016, 0x80000003,
0x80000007, 0x8000000a, 0x8000001f, 0x80000001, 0x8000001a, 0x80000018, 0x80000002
]
BodyStringList = [
"","1A(0最速)", "1B(0準速)", "1C(0中間)", "1D(0準大)", "1E(0最大)","2A(3+最速)", "2B(3+準速)", "2C(3+中間)", "2D(3+準大)", "2E(3+最大)","3A(3-最速)", "3B(3-準速)", "3C(3-中間)", "3D(3-準大)", "3E(3-最大)","4A(6+最速)", "4B(6+準速)", "4C(6+中間)", "4D(6+準大)", "4E(6+最大)","5A(10最速)", "5B(6-準速)", "5C(6-中間)", "5D(6-準大)", "5E(6-最大)","6A(15最速)", "6B(15準速)", "6C(15中間)", "6D(10準大)", "6E(10最大)"
]
body_map={BodyStringList[i]:BodyIdList[i] for i in range(len(BodyIdList))}
BodyColorIdList = [
0x00000000, 0x8000001c, 0x8000002b, 0x80000014, 0x8000001f, 0x80000004, 0x80000024, 0x80000027,
0x80000025, 0x8000001a, 0x80000010, 0x80000026, 0x80000013, 0x80000029, 0x80000009, 0x80000031,
0x80000028, 0x80000015, 0x80000012, 0x8000002c, 0x8000001b, 0x80000003, 0x80000016, 0x80000021,
0x80000007, 0x8000002a, 0x8000002d, 0x8000002e, 0x8000002f, 0x80000001, 0x80000017, 0x80000030,
0x8000000d, 0x80000011, 0x80000018, 0x80000002, 0x80000019, 0x8000001d
]
BodyColorStringList = [
"", "SP", "黒", "濃黒", "薄黒", "赤", "濃赤", "薄赤",
"水色", "濃水色", "薄水色", "緑", "濃緑", "薄緑", "橙", "濃橙",
"薄橙", "黄色", "濃黄色", "薄黄色", "青", "濃青", "薄青", "白",
"濃白", "薄白", "紫", "濃紫", "薄紫", "桃", "濃桃", "薄桃",
"金", "濃金", "薄金", "銀", "濃銀", "薄銀"
]
body_color_map={BodyColorStringList[i]:BodyColorIdList[i] for i in range(len(BodyColorIdList))}
BodyPatternIdList = [
0x00000000, 0x8000000e, 0x80000015, 0x80000016, 0x80000006, 0x8000001e, 0x8000002c, 0x80000017,
0x8000000c, 0x80000003, 0x80000026, 0x8000002d, 0x80000004, 0x80000025, 0x8000002e, 0x80000008,
0x8000000f, 0x80000002, 0x80000027, 0x8000000d, 0x8000002f, 0x80000005, 0x80000007, 0x80000013,
0x80000030
]
BodyPatternStringList = [
"", "なし", "ツートン", "ボーダー", "ストライプ", "水玉", "アニマル", "斜めボーダー",
"ピンドット", "ギンガムチェック", "ダイヤ", "レンガ", "スプラッシュ", "マーブル", "鱗文", "ヘビ",
"シェブロン", "トラ", "しずく", "うろこ", "バブルドット", "花", "スペード", "星",
""
]
body_pattern_map={BodyPatternStringList[i]:BodyPatternIdList[i] for i in range(len(BodyPatternIdList)-1)}
SkillGroupIdList = [
0x00000000,0x80000128,0x80000102,0x80000086,0x800000b4,0x800000d5,0x800000a9,0x800000d4,
0x80000013,0x80000001,0x80000077,0x800000d9,0x800000dd,0x800000b7,0x80000123,0x800000fe,
0x800000ef,0x800000e6,0x8000011e,0x80000004,0x800000af,0x80000104,0x800000d2,0x800000b9,
0x80000028,0x800000e1,0x80000119,0x800000a1,0x800000ab,0x800000c5,0x80000127,0x80000009,
0x800000c0,0x80000092,0x800000c9,0x800000c3,0x80000025,0x80000045,0x80000035,0x800000a3,
0x8000005f,0x80000105,0x80000043,0x800000a4,0x8000003b,0x800000e0,0x80000021,0x800000d6,
0x8000007b,0x80000030,0x8000008f,0x8000004c,0x80000034,0x800000ac,0x8000006e,0x800000bd,
0x800000f0,0x8000005e,0x8000009b,0x80000074,0x80000116,0x800000b5,0x80000033,0x80000087,
0x80000090,0x8000009d,0x800000bf,0x80000007,0x8000008e,0x8000007e,0x8000009e,0x80000042,
0x8000009f,0x80000027,0x80000005,0x800000d7,0x800000c7,0x8000005d,0x800000ae,0x8000001b,
0x80000094,0x8000010d,0x80000068,0x80000103,0x8000011f,0x8000002f,0x80000067,0x800000df,
0x800000cd,0x80000079,0x800000fb,0x8000003c,0x80000024,0x80000075,0x800000cf,0x8000008d,
0x8000000e,0x80000017,0x80000036,0x800000ba,0x80000124,0x80000098,0x80000088,0x8000011a,
0x8000006f,0x800000ea,0x80000020,0x800000de,0x80000049,0x8000010e,0x8000005a
]
SkillGroupStringList = [
"アンテナのねっこ", "アンテナなし", "ちょっとステルス", "ちょっとあしもとガード", "ちょっとかいふく", "みんなちょっとかいふく", "ちょっとふっかつ", "みんなちょっとふっかつ",
"げどく", "しびれとる", "めざめる", "ぞくせいなおす", "ぜんぶなおす", "かいほうする","すこしむてき", "みんなすこしむてき", "すこしこうふん",
"みんなすこしこうふん", "たくわえる", "わざはねかえす1", "みんなわざはねかえす1", "すこしひっちゅう", "みんなすこしひっちゅう", "ちいさくトゲトゲ", "みんなちいさくトゲトゲ",
"すこしつよくなれ", "みんなつよめになれ", "すこしかたくなれ", "みんなかためになれ", "すこしはやくなれ", "みんなはやめになれ", "すこしかわしやすい", "みんなあてられにくい",
"どくになれ", "みんなどくになれ", "すこしねむらせる", "みんなすこしねむらせる", "すこししびれさせる", "みんなすこししびれさせる", "すこしめかくし", "みんなすこしめかくし",
"すこしブレスふうじ", "みんなすこしブレスふうじ", "すこしアンテナふうじ", "みんなすこしアンテナふうじ", "すこしあやつる","みんなすこしあやつる","すこしよわくなれ", "みんなよわめになれ", "すこしやわくなれ", "みんなやわらかめ",
"すこしおそくなれ", "みんなおそめになれ", "すこしよけにくい", "みんなすこしよけにくい", "むてきかいじょ", "みんなむてきかいじょ", "ひのたま", "ばくはつ",
"やまかじ", "とがったこおり", "ロックアイス", "あられ", "つむじかぜ", "ビルかぜ", "かまいたち", "らくせき",
"いしつぶて", "マグニチュード3", "せいでんき", "いなづま", "ひゃくボルト", "みずでっぽう", "バケツのみず", "たかなみ",
"よわいこうせん", "スポットライト", "ふゆのひざし", "おどかす", "ダークボール", "くろいきり", "ノックダウン", "みんなノックダウン",
"もえさかるこおり", "かさいせんぷう", "だいふんか", "らくらいかさい", "ほのおのうみ", "もえるひかりのや", "じゃあくなほのお", "こおりあらし",
"こおりいんせき", "かみなりふぶき", "ひさめ", "かがやくれいき", "あんこくのれいき", "つちけむり", "でんきあらし", "ぼうふうう",
"ひかりたつまき", "じゃあくなかぜ", "かみなりがんせき", "どせきりゅう", "だいちのひかり", "じゃあくなじわれ", "らいう", "でんこう",
"やみのいかづち", "ひかりのあめ", "ダークシャワー", "ならくのたいよう"
]
skill_group_map={SkillGroupStringList[i]:SkillGroupIdList[i] for i in range(len(SkillGroupIdList))}
QRSkillGroupStringList=["アンテナなし","ひのたま","とがったこおり","つむじかぜ","らくせき","せいでんき","みずでっぽう","よわいこうせん","おどかす","ちょっとかいふく","しびれとる","めざめる",
"すこしよわくなれ","すこしやわくなれ","すこしおそくなれ","みんなすこしよけにくい","すこしつよくなれ","すこしかたくなれ","すこしはやくなれ","すこしかわしやすい","げどく",
"どくになれ","すこしねむらせる","すこししびれさせる","すこしめかくし","ぞくせいなおす",
"ばくはつ","ロックアイス","ビルかぜ","いしつぶて","いなづま","バケツのみず","ちょっとふっかつ",
"すこしむてき","すこしこうふん","たくわえる","ぜんぶなおす","ちょっとあしもとガード","スポットライト","ダークボール","ノックダウン"]
AbilityIdList = [
0x00000000,0x870203b6,0x870201d8,0x8702026c,0x87020184,0x87020160,0x8702014e,0x870200b0,
0x8702013f,0x870202b9,0x87020120,0x87020042,0x8702026a,0x8702016c,0x870200b8,0x8702030c,
0x870203aa,0x870200bd
]
AbilityStringList = [
"","HP12突2補正","S25補正","S50補正","S90補正","HP30突恐補正","HP30攻25補正","防25回避3補正",
"S20補正","回避5補正","誘惑3補正","誘惑耐性1補正","恐怖3補正","恐怖耐性1補正","急所5補正","ダウン耐性1補正",
"HP50補正","AP1補正"
]
NameIdList=[
[
0x00000000,0x80701240,0x8070199a,0x80701bb0,0x80701354,0x80701994,0x80701dca,0x80701e46,
0x80701766,0x80701860,0x80701b9f,0x80701ad6,0x807018f2,0x80701394,0x8070185d,0x80701b9e,
0x80701015,0x807019f1,0x80701a0b,0x80701389,0x807010cb,0x8070138b,0x80701180,0x807017ca,
0x8070157b,0x80701b61,0x8070127e,0x8070110c,0x80701c82,0x80701b5c,0x80701837,0x807018f6,
0x80701eec,0x80701b10,0x80701de4,0x80701952,0x807019e7,0x80701edf,0x807010f8,0x80701130,
0x80701115,0x80701ada,0x80701de9,0x80701dc4,0x80701dd6,0x80701744,0x80701c81,0x807012a3,
0x807017f5,0x80701474,0x807015c2,0x807018d9,0x80701615,0x80701183,0x80701d8d,0x807013f7,
0x80701038,0x80701a42,0x807013eb,0x807019bf,0x80701f49,0x80701849,0x80701184,0x807013a2,
0x80701a6a,0x807010a0,0x80701be0,0x80701933,0x807015fd,0x80701c3d,0x807014a2,0x8070116b,
0x807010a9,0x80701e41,0x80701b4b,0x80701bcc,0x80701c3e,0x807010f3,0x807015b3,0x80701449,
0x8070184f,0x8070132c,0x807015a9,0x80701c61,0x80701d0e,0x80701173,0x8070152b,0x80701042,
0x80701c47,0x8070136b,0x80701a81,0x8070125e,0x80701fe3,0x80701ffc,0x80701cc3,0x80701a6d,
0x80701579,0x8070119c,0x80701fda,0x807014c6,0x80701e3b,0x8070137a,0x807018da,0x807011c8,
0x8070103a,0x807013d7,0x80701b7d,0x80701d86,0x807012c7,0x807014c3,0x80701e4f,0x80701028,
0x807011d1,0x807011be,0x80701524,0x807019b3,0x8070114b,0x807018a6,0x8070163d,0x80701fa5,
0x80701309,0x807018e7,0x80701c66,0x807014b3,0x807011dc,0x80701050,0x807014ae,0x80701ac4,
0x80701246,0x807011e7,0x8070167a,0x807017ad,0x80701645,0x8070121a,0x80701e3d,0x807010ec,
0x80701e88,0x80701e1a,0x807018db,0x8070160a,0x80701531,0x807012bb,0x80701ac7,0x80701ce1,
0x80701411,0x80701178,0x80701b0f,0x80701a01,0x807011f3,0x80701fe2,0x8070178b,0x80701201,
0x80701ba8,0x80701f41,0x8070160b,0x8070114c,0x8070134d,0x80701488,0x8070163e,0x8070116e,
0x80701200,0x8070176a,0x80701c36,0x807016ae,0x80701f11,0x80701747,0x80701186,0x80701f5a,
0x807019cc,0x80701169,0x80701793,0x80701b8a,0x807013ae,0x80701ea3,0x8070117d,0x80701a06,
0x8070147c,0x80701a6b,0x8070185e,0x8070116c,0x80701306,0x80701dfc,0x80701b29,0x8070112e,
0x80701e20,0x80701c50,0x8070138a,0x80701259,0x807017a5,0x80701efe,0x807019cd,0x807018b0,
0x80701d34,0x807017e2,0x80701fd7,0x807019e9,0x80701234,0x80701089,0x80701440,0x80701752,
0x80701798,0x80701197,0x807011b7,0x80701a8a,0x80701cec,0x80701876,0x807016bc,0x80701f0f,
0x807011dd,0x807015ae,0x807015a1,0x80701941,0x80701242,0x80701509,0x80701c52,0x807017cf,
0x80701ed5,0x80701d84,0x807018e8,0x80701063,0x80701c10,0x80701345,0x807011a1,0x8070178d,
0x80701867,0x80701aff,0x807016c3,0x807011b6,0x80701359,0x807019c8,0x80701601,0x807019f7,
0x807019a1,0x80701ead,0x8070104d,0x8070142d,0x80701341,0x80701551,0x8070151d,0x80701996,
0x8070144e,0x80701254,0x80701b14,0x80701189,0x80701549,0x80701c96,0x80701496,0x807013f9,
0x807019a3,0x80701d62,0x80701147,0x80701783,0x807014f7,0x80701975,0x807017a2,0x80701ecd,
0x8070183c,0x8070110d,0x80701b6f,0x80701095,0x8070104f,0x80701156,0x80701ece,0x807019eb,
0x80701b75,0x807015c4,0x80701afb,0x80701dab,0x8070123f,0x80701c2f,0x80701585,0x80701d91,
0x80701d88,0x80701907,0x80701b6d,0x80701c0a,0x80701f7d,0x80701b98,0x80701260,0x80701f75,
0x80701ef8,0x80701886,0x80701c6e,0x80701420,0x80701e82,0x80701ccf,0x80701690,0x8070118f,
0x80701ad3,0x8070177e,0x80701d47,0x807016d2,0x80701cdb,0x807017d6,0x807016c9,0x80701e3f,
0x807010cc,0x80701a79,0x807013c3,0x807015c1,0x80701861,0x80701f8a,0x80701ac8,0x80701b3c,
0x80701a09,0x8070111e,0x807016f4,0x8070132b,0x807015b6,0x807013fe,0x8070107b,0x80701a14,
0x80701e21,0x80701cfb,0x80701157,0x807011a4,0x807012f5,0x80701139,0x80701dcc,0x80701dc0,
0x807012a4,0x80701946,0x80701f10,0x80701b64,0x807015e6,0x80701a8d,0x807012d4,0x80701966,
0x807016fa,0x8070161f,0x807017c4,0x807018b3,0x80701eba,0x807019f4,0x80701c48,0x80701f89,
0x807019e3,0x807019b4,0x80701bdc,0x80701dea,0x80701458,0x807010d5,0x807013e0,0x807012b2,
0x8070126d,0x80701c13,0x807018c6,0x80701a16,0x80701ed3,0x807013b0,0x80701448,0x807017fc,
0x80701230,0x80701c99,0x80701880,0x807010eb,0x80701c73,0x80701270,0x8070117e,0x8070130b,
0x80701826,0x80701b1e,0x807015f9,0x807010f4,0x80701f12,0x80701de2,0x807012b3,0x80701b93,
0x80701816,0x80701bc4,0x807010a8,0x80701125,0x80701010,0x80701c28,0x807015ac,0x807019b7,
0x80701ec8,0x807018c1,0x80701d69,0x8070170f,0x8070176d,0x8070101b,0x80701786,0x807017f6,
0x8070138f,0x80701d99,0x8070173c,0x80701f32,0x80701ab8,0x80701a68,0x807015ea,0x80701b99,
0x80701893,0x8070118c,0x8070196a,0x80701497,0x80701aba,0x807010a1,0x80701679,0x80701ba2,
0x8070161a,0x80701ad9,0x807015d4,0x8070197e,0x807018c7,0x80701b35,0x80701923,0x80701ee4,
0x80701de0,0x80701e08,0x80701764,0x80701b6a,0x80701a90,0x80701f13,0x80701457,0x80701145,
0x80701ed6,0x8070176b,0x807015f1,0x8070161b,0x8070151e,0x807016c4,0x80701f47,0x80701cba,
0x8070164a,0x807012c1,0x80701f45,0x80701f2c,0x8070142a,0x80701659,0x8070107a,0x80701521,
0x80701785,0x807019f3,0x80701470,0x80701382,0x80701285,0x8070184d,0x80701232,0x80701493,
0x807015f2,0x80701ab7,0x80701947,0x80701021,0x80701ad5,0x807015d9,0x8070167c,0x8070123a,
0x80701492,0x807013fc,0x80701008,0x80701023,0x8070157c,0x80701b90,0x80701bfa,0x80701494,
0x80701505,0x80701383,0x80701cbd,0x807018a7,0x807012ca,0x80701d7e,0x8070140c,0x80701db1,
0x80701aee,0x8070172a,0x80701f67,0x80701b23,0x80701d04,0x80701408,0x80701d54,0x80701f31,
0x807011d2,0x80701bb1,0x80701ebb,0x80701f96,0x8070141a,0x80701ddb,0x80701455,0x8070139f,
0x807018d8,0x807019e5,0x807011d8,0x80701743,0x8070105e,0x8070161e,0x80701729,0x80701070,
0x80701b37,0x80701a54,0x80701fff,0x8070126c,0x80701132,0x80701c72,0x80701e35,0x80701921,
0x80701e45,0x80701929,0x80701af7,0x807019e2,0x80701dc1,0x8070103c,0x807011e3,0x8070167f,
0x807014e4,0x807019ac,0x80701564,0x80701a07,0x8070124b,0x80701d16,0x80701f21,0x80701a10,
0x80701126,0x80701b66,0x80701261,0x80701b4d,0x80701161,0x8070124c,0x807019d6,0x80701b74,
0x807016cc,0x807012eb,0x8070174c,0x80701286,0x80701c7d,0x8070116d,0x80701985,0x8070120c,
0x80701074,0x80701a34,0x80701dd5,0x8070177d,0x80701791,0x80701666,0x80701895,0x80701051,
0x80701087,0x807019f8,0x807011c6,0x8070126e,0x807014f1,0x807017d7,0x80701a00,0x80701ac9,
0x807016d6,0x80701702,0x80701ec5,0x80701be6,0x8070179e,0x80701cd3,0x8070148d,0x80701f2f,
0x807010c3,0x807010d2,0x807014fc,0x807017ee,0x807016bb,0x80701280,0x80701c04,0x80701b0d,
0x80701806,0x80701b0a,0x807013a4,0x8070136d,0x80701bea,0x80701414,0x80701f24,0x8070185f,
0x80701b25,0x80701187,0x80701965,0x80701158,0x80701da4,0x80701b22,0x80701364,0x807012c2,
0x80701502,0x80701aa0,0x80701e0d,0x80701677,0x80701573,0x807015da,0x80701a2a,0x807018f3,
0x80701ec3,0x80701e17,0x80701fa6,0x80701c6f,0x80701e42,0x807013df,0x80701205,0x80701216,
0x807019a5,0x8070173d,0x80701971,0x807017e5,0x80701377,0x8070171a,0x80701636,0x80701045,
0x80701c85,0x80701983,0x80701054,0x80701904,0x80701967,0x807013c5,0x807014e0,0x807010d4,
0x807018eb,0x80701856,0x8070101a,0x80701891,0x80701dfd,0x807017e0,0x80701199,0x80701ac3,
0x80701763,0x8070123c,0x80701174,0x8070178e,0x80701691,0x807014dd,0x80701fcf,0x80701ace,
0x8070104c,0x80701aef,0x80701f59,0x80701aa1,0x8070179f,0x8070172b,0x80701603,0x80701a41,
0x80701b19,0x80701bff,0x807016e9,0x80701d53,0x807013a0,0x80701655,0x807013aa,0x80701a02,
0x80701de3,0x80701d1f,0x80701722,0x807015bc,0x80701c38,0x80701a2d,0x807013e9,0x807014d1,
0x80701017,0x807011a5,0x80701ea6,0x8070170b,0x80701213,0x80701a25,0x80701958,0x80701c62,
0x80701ddd,0x80701a08,0x8070115f,0x80701094,0x807018a8,0x80701a44,0x807010b5,0x8070160c,
0x80701998,0x80701518,0x80701b7f,0x80701256,0x807010d0,0x807012b1,0x80701808,0x807013f1,
0x80701fe1,0x807016c6,0x80701777,0x807011a3,0x8070113c,0x8070161d,0x807014a1,0x8070133c,
0x80701d93,0x80701088,0x80701b76,0x80701e6b,0x807017dd,0x80701ae0,0x807015fa,0x80701181,
0x80701373,0x80701f19,0x80701765,0x807019ce,0x80701165,0x80701e16,0x807011d0,0x807013fa,
0x80701e50,0x80701bc1,0x80701d67,0x80701688,0x80701e86,0x8070112c,0x80701b3d,0x8070107c,
0x8070137d,0x8070103b,0x807016f1,0x80701583,0x80701959,0x80701bd0,0x80701de5,0x807015ee,
0x807017fb,0x80701ed4,0x80701cd8,0x80701d51,0x80701784,0x8070160e,0x807018bc
],
[
0x00000000, 0x80702c83, 0x807027a1, 0x80702597, 0x807026f2, 0x807020fa, 0x80702dce, 0x80702c84,
0x8070202d, 0x807023ee, 0x80702790, 0x80702c01, 0x807023da, 0x807023b1, 0x80702209, 0x80702e96,
0x80702f0f, 0x8070261e, 0x80702965, 0x807026f8, 0x80702016, 0x807025ff, 0x80702ae5, 0x807025f9,
0x807022dc, 0x8070203b, 0x80702015, 0x80702a69, 0x80702db8, 0x80702827, 0x807026cd, 0x8070201c,
0x80702b30, 0x807026de, 0x80702e6d, 0x80702f7f, 0x80702079, 0x807022b3, 0x80702803, 0x807029a9,
0x807020af, 0x80702294, 0x80702d94, 0x807026c4, 0x807027e2, 0x80702510, 0x80702bbb, 0x807021d3,
0x80702b26, 0x8070255f, 0x807020e2, 0x807024a2, 0x80702f12, 0x80702982, 0x80702acf, 0x8070228a,
0x807026f1, 0x80702f6c, 0x8070299a, 0x80702b5e, 0x807021fd, 0x8070244f, 0x80702d59, 0x807023d9,
0x80702c08, 0x807029a3, 0x807029d8, 0x80702c85, 0x8070248e, 0x80702869, 0x80702bf9, 0x80702473,
0x80702d07, 0x8070265b, 0x8070229a, 0x80702872, 0x80702416, 0x807021e8, 0x807020c0, 0x8070249d,
0x8070270c, 0x80702ecc, 0x80702fcc, 0x80702a09, 0x807023a9, 0x80702089, 0x80702be3, 0x80702f9a,
0x80702efc, 0x80702a00, 0x807028c2, 0x80702a26, 0x80702fee, 0x807027d5, 0x80702a9e, 0x80702a05,
0x80702140, 0x8070228c, 0x807028fc, 0x807027e8, 0x80702f3a, 0x80702376, 0x80702a65, 0x80702b15,
0x80702af4, 0x807028d3, 0x80702066, 0x80702331, 0x80702931, 0x807021e0, 0x80702eec, 0x80702b2e,
0x80702c67, 0x80702511, 0x80702f86, 0x807027a9, 0x80702610, 0x807028e3, 0x80702313, 0x807024bc,
0x80702e6e, 0x80702336, 0x80702e7f, 0x80702d61, 0x8070283c, 0x8070265c, 0x80702f0d, 0x807022e8,
0x80702cf2, 0x807026ce, 0x80702b89, 0x80702f7e, 0x80702c13, 0x807028ba, 0x80702f3d, 0x807023ca,
0x807022f8, 0x80702df4, 0x80702de9, 0x80702df2, 0x807026b6, 0x80702b8d, 0x80702261, 0x80702863,
0x8070205e, 0x80702258, 0x80702c96, 0x80702979, 0x807024f8, 0x80702b38, 0x8070207a, 0x80702548,
0x807029cd, 0x80702b8a, 0x80702aaf, 0x80702cf7, 0x80702d03, 0x8070279c, 0x80702fed, 0x80702167,
0x8070266b, 0x80702e3b, 0x80702be5, 0x80702e10, 0x80702355, 0x80702a74, 0x80702e4e, 0x80702e64,
0x80702bad, 0x80702ffc, 0x80702977, 0x80702122, 0x8070291e, 0x80702547, 0x80702865, 0x807025fa,
0x807024db, 0x80702574, 0x8070247c, 0x8070235d, 0x80702b24, 0x80702540, 0x8070239b, 0x80702ba6,
0x80702f73, 0x8070240f, 0x80702394, 0x80702fef, 0x807024a9, 0x807023c6, 0x80702ca2, 0x8070260a,
0x80702b2f, 0x80702cdb, 0x80702e81, 0x807024bd, 0x80702b93, 0x80702866, 0x80702589, 0x80702cb7,
0x80702eb1, 0x807022ea, 0x80702244, 0x8070267a, 0x80702ff6, 0x8070243b, 0x8070248a, 0x80702558,
0x80702d48, 0x80702906, 0x80702f21, 0x8070274a, 0x80702732, 0x80702454, 0x80702bfb, 0x80702bc2,
0x807022df, 0x8070280a, 0x80702e8c, 0x807028c6, 0x8070226f, 0x80702a37, 0x80702441, 0x80702606,
0x807023c7, 0x80702b8b, 0x8070272f, 0x80702e79, 0x8070290f, 0x80702df5, 0x8070235e, 0x807025fb,
0x80702b6d, 0x80702455, 0x80702448, 0x807026df, 0x8070261b, 0x8070270d, 0x80702262, 0x80702f80,
0x8070211b, 0x80702d09, 0x80702c98, 0x80702b3f, 0x80702bcf, 0x80702e55, 0x80702b4d, 0x807025b6,
0x80702b5d, 0x80702e11, 0x80702731, 0x807025b7, 0x8070212d, 0x807029e0, 0x8070234c, 0x80702043,
0x80702b6e, 0x80702921, 0x80702000, 0x80702cf0, 0x807026fc, 0x80702f9b, 0x80702fc4, 0x80702d88,
0x80702443, 0x80702cc0, 0x807020e3, 0x80702956, 0x80702e22, 0x80702295, 0x80702c66, 0x80702175,
0x80702ae0, 0x807029c6, 0x80702840, 0x807024a3, 0x807022e9, 0x807024ae, 0x80702648, 0x807024d8,
0x80702f84, 0x80702ce6, 0x80702305, 0x8070222f, 0x80702e24, 0x807028d4, 0x80702ed4, 0x807029f1,
0x8070228e, 0x807029ee, 0x807028f8, 0x80702dc3, 0x807022b1, 0x80702c6f, 0x80702e3e, 0x80702eb3,
0x80702575, 0x8070290b, 0x8070215b, 0x80702ddf, 0x80702c3c, 0x80702569, 0x80702370, 0x80702f65,
0x80702ef4, 0x80702fbb, 0x807020e0, 0x807029e9, 0x80702288, 0x80702687, 0x807028d7, 0x8070229b,
0x807025d5, 0x80702dea, 0x80702791, 0x80702ab0, 0x807025f7, 0x80702c92, 0x8070293d, 0x80702474,
0x80702958, 0x80702d86, 0x80702351, 0x807028c9, 0x80702661, 0x8070231d, 0x80702bce, 0x80702927,
0x80702b33, 0x80702b87, 0x807022bf, 0x80702414, 0x8070281e, 0x8070245c, 0x807027bf, 0x807022b9,
0x8070246e, 0x807025a3, 0x80702335, 0x80702a86, 0x80702ea9, 0x80702cc1, 0x8070235f, 0x80702d08,
0x80702352, 0x807025a8, 0x807029ca, 0x80702b7a, 0x80702a4a, 0x80702b86, 0x8070249a, 0x807023db,
0x8070285d, 0x80702e8f, 0x8070222e, 0x80702709, 0x8070244d, 0x8070287c, 0x8070260f, 0x807025ef,
0x80702e98, 0x807026f5, 0x807023be, 0x80702fc5, 0x807026a6, 0x80702162, 0x80702181, 0x80702ec9,
0x8070297a, 0x80702523, 0x80702ad3, 0x807020db, 0x80702df6, 0x80702078, 0x80702c22, 0x80702861,
0x80702f4c, 0x80702ec7, 0x807020ca, 0x80702564, 0x80702673, 0x80702275, 0x807021a4, 0x807027f5,
0x80702440, 0x807027f7, 0x80702eab, 0x8070277e, 0x807022cb, 0x80702eae, 0x807023ef, 0x8070243d,
0x80702a39, 0x80702770, 0x80702f1b, 0x80702d3c, 0x80702a5e, 0x80702cf1, 0x80702a79, 0x807022be,
0x80702ca0, 0x80702ab1, 0x80702ee1, 0x807028f9, 0x80702b4b, 0x8070209e, 0x8070226d, 0x8070200b,
0x807024b0, 0x807027d0, 0x80702a5b, 0x8070220d, 0x80702799, 0x80702de7, 0x8070280d, 0x807024fe,
0x80702422, 0x8070273a, 0x80702d41, 0x80702943, 0x80702959, 0x80702c14, 0x8070271a, 0x807023a0,
0x80702b83, 0x807022fe, 0x8070270e, 0x80702f2f, 0x80702aa4, 0x80702123, 0x8070254f, 0x8070223f,
0x80702960, 0x80702191, 0x80702049, 0x80702bd0, 0x8070239d, 0x80702f78, 0x80702fd9, 0x80702360,
0x8070224a, 0x807024c4, 0x807020ec, 0x80702c6b, 0x80702b0e, 0x80702ea5, 0x807021af, 0x807029aa,
0x807025c3, 0x807028cf, 0x80702024, 0x8070272c, 0x807022ff, 0x8070231e, 0x807022fb, 0x80702eb4,
0x807023c4, 0x8070255b, 0x8070209d, 0x80702476, 0x807022c2, 0x807029b1, 0x80702c77, 0x807022eb,
0x807027df, 0x8070283f, 0x807021d4, 0x807027d8, 0x80702348, 0x80702998, 0x80702b69, 0x80702670,
0x807026cf, 0x80702975, 0x80702296, 0x807021c7, 0x807024fd, 0x80702d2c, 0x80702836, 0x80702c1a,
0x8070215f, 0x80702100, 0x8070279d, 0x80702e2e, 0x807025bf, 0x80702d99, 0x807023fc, 0x80702d47,
0x807027b2, 0x80702a5c, 0x80702b70, 0x80702551, 0x807020a1, 0x80702a4b, 0x80702753, 0x80702773,
0x80702c19, 0x807026a9, 0x80702a18, 0x80702332, 0x80702da1, 0x8070270f, 0x80702475, 0x80702faa,
0x80702b4a, 0x80702daf, 0x80702f3f, 0x80702db6, 0x8070249c, 0x807024e4, 0x80702b0c, 0x80702f5c,
0x80702f5f, 0x807029d3, 0x80702f1e, 0x8070231f, 0x80702dc1, 0x80702e2f, 0x80702d0d, 0x80702cbb,
0x807027e6, 0x8070222b, 0x807026a3, 0x807027b9, 0x807020de, 0x80702057, 0x80702d62, 0x80702883,
0x8070224f, 0x80702340, 0x807021ae, 0x8070239f, 0x807028ef, 0x8070217b, 0x80702c0a, 0x80702180,
0x80702ac4, 0x80702f79, 0x807025c9, 0x80702243, 0x80702361, 0x80702dc9, 0x80702538, 0x80702153,
0x80702ce5, 0x80702ea2, 0x80702c44, 0x80702a2b, 0x80702442, 0x80702ff0, 0x807025b5, 0x80702b07,
0x807029f3, 0x80702ed8, 0x80702245, 0x80702caa, 0x8070282e, 0x80702320, 0x80702918, 0x807023b8,
0x80702419, 0x80702456, 0x8070223b, 0x80702a4d, 0x807028c8, 0x80702d49, 0x807022a8, 0x80702d33,
0x807029a1, 0x80702554, 0x80702838, 0x807022ab, 0x80702a20, 0x80702876, 0x80702194, 0x80702f90,
0x8070296a, 0x8070207b, 0x807029e1, 0x80702cd0, 0x80702afd, 0x8070208d, 0x80702e8e, 0x80702d3f,
0x80702b27, 0x80702a14, 0x80702995, 0x80702e87, 0x80702096, 0x8070216f, 0x807023a1, 0x807020f8,
0x80702415, 0x807021c5, 0x8070243a, 0x8070258a, 0x80702058, 0x807024e5, 0x80702c97, 0x8070220f,
0x80702678, 0x80702f1f, 0x80702fb0, 0x807025fc, 0x80702a1d, 0x8070209b, 0x80702431, 0x80702d13,
0x80702e90, 0x80702160, 0x807024b1, 0x80702a2a, 0x80702885, 0x80702485, 0x80702c74, 0x80702c25,
0x80702be1, 0x80702f47, 0x80702377, 0x80702a58, 0x80702936, 0x8070225f, 0x807027e3, 0x807029c9,
0x80702794, 0x8070252f, 0x807023a8, 0x80702bdb, 0x80702856, 0x80702da4, 0x807028af, 0x807023d2,
0x80702acc, 0x807024d6, 0x80702269, 0x80702ae6, 0x807024fa, 0x80702ba9, 0x80702436, 0x80702d63,
0x80702890, 0x807020d9, 0x807024d1, 0x807027c4, 0x80702b41, 0x80702192, 0x807027ed, 0x8070208a,
0x80702edc, 0x80702c0c, 0x807020df, 0x80702ae8, 0x80702663, 0x80702405, 0x80702f55, 0x8070258e,
0x80702378, 0x80702322, 0x80702bd8, 0x807029b6, 0x8070223c, 0x8070256f, 0x807023c8, 0x807025d9,
0x80702a82, 0x80702c2e, 0x8070284b, 0x80702e00, 0x80702571, 0x80702a60, 0x80702991, 0x8070276e,
0x807022a6, 0x80702d91, 0x80702fae, 0x80702d05, 0x80702f48, 0x80702bda, 0x807020e8, 0x80702535,
0x807020ef, 0x80702c09, 0x8070296b, 0x80702070, 0x80702d8d, 0x807028e4, 0x8070247f, 0x807029f7,
0x80702dfc, 0x80702855, 0x80702170, 0x807028f1, 0x80702d6b, 0x80702c05, 0x80702206, 0x80702ae4,
0x80702ba7, 0x8070232b, 0x80702e50, 0x807024ef, 0x8070216a, 0x8070205d, 0x807021c1, 0x80702059,
0x80702df8, 0x807024f0, 0x80702df0, 0x80702486, 0x807021ff, 0x80702074, 0x80702f91, 0x807028e5,
0x80702293, 0x8070248b, 0x80702ed5, 0x80702138, 0x80702841, 0x807020e1, 0x80702d8f, 0x8070207c,
0x80702c68, 0x807024e2, 0x80702539, 0x80702ebc, 0x8070273b, 0x8070258c, 0x80702ad2, 0x8070214f,
0x80702955, 0x80702020, 0x807029f2, 0x80702273, 0x80702c34, 0x80702b4e, 0x8070256a, 0x80702dd9,
0x80702c3d, 0x80702dec, 0x80702a97, 0x80702813, 0x80702647, 0x80702ae3, 0x80702099, 0x807020c4,
0x80702ef5, 0x8070293f, 0x80702150, 0x80702eb9, 0x807024e0, 0x80702550, 0x807022a4, 0x80702517,
0x807029fa, 0x80702470, 0x807026cc, 0x80702028, 0x80702cfb, 0x80702297, 0x80702937, 0x8070232c,
0x80702247, 0x80702042, 0x80702e5a, 0x80702735, 0x80702efa, 0x80702c8d, 0x80702136, 0x807023cf,
0x807029cc, 0x807024fb, 0x80702ae9, 0x80702ea6, 0x80702938, 0x807025a7, 0x8070246c, 0x80702d69,
0x80702249, 0x807027ff, 0x80702cab, 0x807026d7, 0x80702c0d, 0x8070254e, 0x80702301, 0x80702d7a,
0x80702dd5, 0x80702a11, 0x80702af6, 0x80702730, 0x80702aa2, 0x80702c75, 0x807029bb, 0x80702fa7,
0x80702210, 0x80702d95, 0x807023e4, 0x8070245d, 0x8070241e, 0x807026fa, 0x80702af5, 0x807026f3,
0x80702bae, 0x80702afe, 0x80702b84, 0x80702114, 0x807028f3, 0x80702572, 0x80702b5f, 0x807026d2,
0x807023f9, 0x80702abc, 0x807020da, 0x80702679, 0x80702cae, 0x807029b9, 0x8070285f, 0x80702393,
0x807027d6, 0x80702e4b, 0x80702c91, 0x80702dd3, 0x80702823, 0x807027dc, 0x80702d66, 0x80702271,
0x80702f57, 0x80702fb6, 0x80702346, 0x80702b4f, 0x80702d23, 0x8070259f, 0x807027ae, 0x80702e12,
0x80702482, 0x8070209f, 0x8070232d, 0x80702417, 0x807021e7, 0x807025bd, 0x80702ae1, 0x80702cdc,
0x8070256e, 0x807029dc, 0x807022ec, 0x8070242d, 0x80702076, 0x8070262d, 0x80702ab7, 0x80702d29,
0x807022c0, 0x80702581, 0x80702d20, 0x80702334, 0x807023fe, 0x80702f68, 0x807027f8, 0x80702892,
0x80702df3, 0x80702e6b, 0x80702940, 0x80702573, 0x80702146, 0x80702ac7, 0x807022e7, 0x807022ac,
0x807022bc, 0x8070276f, 0x807020a4, 0x807025a9, 0x80702224, 0x807021db, 0x807026a7, 0x80702fa1,
0x8070267f, 0x80702b12, 0x80702eff, 0x80702298, 0x80702c4e, 0x80702274, 0x80702fc7, 0x8070230d,
0x80702941, 0x80702bb7, 0x807023dc, 0x8070282c, 0x80702d90, 0x80702418, 0x8070282f, 0x80702374,
0x8070221f, 0x80702097, 0x807021ce, 0x807028bd, 0x80702ec1, 0x80702283, 0x807022d2, 0x807024ff,
0x807023a2, 0x807028dd, 0x8070238e, 0x807027dd, 0x8070221d, 0x80702388, 0x8070275d, 0x80702f5e,
0x80702cf6, 0x80702137, 0x8070241f, 0x80702ecf, 0x8070256b, 0x80702d2d, 0x80702339, 0x807028c5,
0x807024c7, 0x80702420, 0x80702795, 0x807023b6, 0x80702a43, 0x80702bf3, 0x807029bf, 0x80702fda,
0x8070253c, 0x80702aa6, 0x8070274b, 0x80702fa4, 0x80702a27, 0x80702796, 0x807025d3, 0x807020f9,
0x807027bb, 0x8070284c, 0x8070278f, 0x80702584, 0x8070255c, 0x80702747, 0x80702c33, 0x80702db3,
0x807021dc, 0x80702b5c, 0x8070282d, 0x80702ab9, 0x80702ee2, 0x807026c6, 0x80702aa3, 0x80702ce8,
0x80702d96, 0x8070268b, 0x80702beb, 0x8070288e, 0x80702a7f, 0x8070291b, 0x807023a3, 0x80702ff9,
0x807022a9, 0x8070288f, 0x807029b7, 0x807020b8, 0x807028d9, 0x807023de, 0x807022cc, 0x807027a8,
0x807029ef, 0x80702aa7, 0x807028f6, 0x80702b6b, 0x80702eb5, 0x80702649, 0x807021e6, 0x8070252b,
0x8070276c, 0x80702ec4, 0x80702b60, 0x80702faf, 0x80702e63, 0x80702c50, 0x807025d1, 0x80702285,
0x80702d2f, 0x80702e37, 0x807024d9, 0x80702898, 0x807028f7, 0x80702135, 0x807021e1, 0x80702686,
0x807020c1, 0x80702ffa, 0x80702198, 0x8070261c, 0x80702b13, 0x80702e99, 0x80702878, 0x807022c4,
0x80702bd1, 0x8070232f, 0x8070274d, 0x80702672, 0x80702daa, 0x80702c15, 0x80702b9b, 0x80702dd4,
0x80702972, 0x807027d7, 0x80702889, 0x807029af, 0x80702884, 0x807029d6, 0x807021f3, 0x80702d1a,
0x80702b2a, 0x80702232, 0x807022b4, 0x80702498, 0x80702bef, 0x80702e3a, 0x80702327, 0x807023d5,
0x80702fd2, 0x8070247d, 0x80702a56, 0x80702692, 0x80702d12, 0x8070213c, 0x80702719, 0x807020e4,
0x807029f8, 0x80702849, 0x807021bd, 0x80702560, 0x80702c2c, 0x80702782, 0x80702344, 0x807025b8,
0x80702328, 0x8070240e, 0x80702444, 0x80702dc5, 0x80702250, 0x80702751, 0x807024f5, 0x80702f92,
0x80702354, 0x80702a89, 0x80702c5f, 0x80702903, 0x80702842, 0x8070283d, 0x80702362, 0x80702912,
0x80702e70, 0x8070260b, 0x807021d5, 0x80702978, 0x80702812, 0x80702030, 0x8070272e, 0x80702733,
0x80702139, 0x80702c8c, 0x80702b20, 0x80702fbd, 0x80702047, 0x80702565, 0x80702cad, 0x80702276,
0x80702053, 0x8070274f, 0x80702cdd, 0x80702f13, 0x807026d0, 0x80702919, 0x807023a4, 0x80702125,
0x80702d79, 0x80702df1, 0x80702b0b, 0x80702432, 0x80702496, 0x80702cf3, 0x80702b50, 0x80702f4a,
0x8070271d, 0x80702d4b, 0x8070218c, 0x8070284d, 0x807020d5, 0x80702939, 0x8070216d, 0x807021da,
0x80702eb6, 0x80702553, 0x8070201b, 0x80702f38, 0x80702c06, 0x80702f60, 0x807027b8, 0x8070268d,
0x807029a8, 0x80702b00, 0x8070221a, 0x80702853, 0x8070261d, 0x807027ee, 0x80702103, 0x80702da5,
0x8070241a, 0x80702500, 0x807023d4, 0x80702b1c, 0x80702490, 0x80702bfa, 0x80702746, 0x80702373,
0x80702bb5, 0x8070298b, 0x807027f9, 0x807027ef, 0x80702379, 0x807026b3, 0x8070286c, 0x8070287d,
0x80702711, 0x80702717, 0x80702457, 0x807028ee, 0x80702b9d, 0x807029d5, 0x80702e56, 0x807025da,
0x80702435, 0x80702774, 0x807024be, 0x80702349, 0x80702726, 0x80702141, 0x807021c4, 0x80702319,
0x80702e97, 0x807028cd, 0x80702839, 0x80702237, 0x80702f69, 0x807026e0, 0x807026ae, 0x80702ee7,
0x807024b2, 0x8070262e, 0x80702942, 0x80702750, 0x80702f0e, 0x80702fb3, 0x80702bfc, 0x80702a42,
0x80702964, 0x80702859, 0x807022ad, 0x80702157, 0x80702ba8, 0x80702665, 0x8070239e, 0x80702cf4,
0x80702148, 0x80702a10, 0x80702d87, 0x80702259, 0x80702341, 0x80702c62, 0x807025e7, 0x8070266d,
0x80702a5d, 0x80702c3f, 0x807021c2, 0x8070296c, 0x80702ef9, 0x80702950, 0x807020a8, 0x80702c6c,
0x80702533, 0x80702b85, 0x8070262f, 0x807029ac, 0x80702b6a, 0x8070220b, 0x807021e9, 0x80702737,
0x807027ea, 0x80702989, 0x80702fab, 0x80702cbf, 0x807029fd, 0x80702edb, 0x807023b3
],
[
0x00000000, 0x80704c83, 0x807047a1, 0x80704597, 0x807046f2, 0x807040fa, 0x80704dce, 0x80704c84,
0x8070402d, 0x807043ee, 0x80704790, 0x80704c01, 0x807043da, 0x807043b1, 0x80704209, 0x80704e96,
0x80704f0f, 0x8070461e, 0x80704965, 0x807046f8, 0x80704016, 0x807045ff, 0x80704ae5, 0x807045f9,
0x807042dc, 0x8070403b, 0x80704015, 0x80704a69, 0x80704db8, 0x80704827, 0x807046cd, 0x8070401c,
0x80704b30, 0x807046de, 0x80704e6d, 0x80704f7f, 0x80704079, 0x807042b3, 0x80704803, 0x807049a9,
0x807040af, 0x80704294, 0x80704d94, 0x807046c4, 0x807047e2, 0x80704510, 0x80704bbb, 0x807041d3,
0x80704b26, 0x8070455f, 0x807040e2, 0x807044a2, 0x80704f12, 0x80704982, 0x80704acf, 0x8070428a,
0x807046f1, 0x80704f6c, 0x8070499a, 0x80704b5e, 0x807041fd, 0x8070444f, 0x80704d59, 0x807043d9,
0x80704c08, 0x807049a3, 0x807049d8, 0x80704c85, 0x8070448e, 0x80704869, 0x80704bf9, 0x80704473,
0x80704d07, 0x8070465b, 0x8070429a, 0x80704872, 0x80704416, 0x807041e8, 0x807040c0, 0x8070449d,
0x8070470c, 0x80704ecc, 0x80704fcc, 0x80704a09, 0x807043a9, 0x80704089, 0x80704be3, 0x80704f9a,
0x80704efc, 0x80704a00, 0x807048c2, 0x80704a26, 0x80704fee, 0x807047d5, 0x80704a9e, 0x80704a05,
0x80704140, 0x8070428c, 0x807048fc, 0x807047e8, 0x80704f3a, 0x80704376, 0x80704a65, 0x80704b15,
0x80704af4, 0x807048d3, 0x80704066, 0x80704331, 0x80704931, 0x807041e0, 0x80704eec, 0x80704b2e,
0x80704c67, 0x80704511, 0x80704f86, 0x807047a9, 0x80704610, 0x807048e3, 0x80704313, 0x807044bc,
0x80704e6e, 0x80704336, 0x80704e7f, 0x80704d61, 0x8070483c, 0x8070465c, 0x80704f0d, 0x807042e8,
0x80704cf2, 0x807046ce, 0x80704b89, 0x80704f7e, 0x80704c13, 0x807048ba, 0x80704f3d, 0x807043ca,
0x807042f8, 0x80704df4, 0x80704de9, 0x80704df2, 0x807046b6, 0x80704b8d, 0x80704261, 0x80704863,
0x8070405e, 0x80704258, 0x80704c96, 0x80704979, 0x807044f8, 0x80704b38, 0x8070407a, 0x80704548,
0x807049cd, 0x80704b8a, 0x80704aaf, 0x80704cf7, 0x80704d03, 0x8070479c, 0x80704fed, 0x80704167,
0x8070466b, 0x80704e3b, 0x80704be5, 0x80704e10, 0x80704355, 0x80704a74, 0x80704e4e, 0x80704e64,
0x80704bad, 0x80704ffc, 0x80704977, 0x80704122, 0x8070491e, 0x80704547, 0x80704865, 0x807045fa,
0x807044db, 0x80704574, 0x8070447c, 0x8070435d, 0x80704b24, 0x80704540, 0x8070439b, 0x80704ba6,
0x80704f73, 0x8070440f, 0x80704394, 0x80704fef, 0x807044a9, 0x807043c6, 0x80704ca2, 0x8070460a,
0x80704b2f, 0x80704cdb, 0x80704e81, 0x807044bd, 0x80704b93, 0x80704866, 0x80704589, 0x80704cb7,
0x80704eb1, 0x807042ea, 0x80704244, 0x8070467a, 0x80704ff6, 0x8070443b, 0x8070448a, 0x80704558,
0x80704d48, 0x80704906, 0x80704f21, 0x8070474a, 0x80704732, 0x80704454, 0x80704bfb, 0x80704bc2,
0x807042df, 0x8070480a, 0x80704e8c, 0x807048c6, 0x8070426f, 0x80704a37, 0x80704441, 0x80704606,
0x807043c7, 0x80704b8b, 0x8070472f, 0x80704e79, 0x8070490f, 0x80704df5, 0x8070435e, 0x807045fb,
0x80704b6d, 0x80704455, 0x80704448, 0x807046df, 0x8070461b, 0x8070470d, 0x80704262, 0x80704f80,
0x8070411b, 0x80704d09, 0x80704c98, 0x80704b3f, 0x80704bcf, 0x80704e55, 0x80704b4d, 0x807045b6,
0x80704b5d, 0x80704e11, 0x80704731, 0x807045b7, 0x8070412d, 0x807049e0, 0x8070434c, 0x80704043,
0x80704b6e, 0x80704921, 0x80704000, 0x80704cf0, 0x807046fc, 0x80704f9b, 0x80704fc4, 0x80704d88,
0x80704443, 0x80704cc0, 0x807040e3, 0x80704956, 0x80704e22, 0x80704295, 0x80704c66, 0x80704175,
0x80704ae0, 0x807049c6, 0x80704840, 0x807044a3, 0x807042e9, 0x807044ae, 0x80704648, 0x807044d8,
0x80704f84, 0x80704ce6, 0x80704305, 0x8070422f, 0x80704e24, 0x807048d4, 0x80704ed4, 0x807049f1,
0x8070428e, 0x807049ee, 0x807048f8, 0x80704dc3, 0x807042b1, 0x80704c6f, 0x80704e3e, 0x80704eb3,
0x80704575, 0x8070490b, 0x8070415b, 0x80704ddf, 0x80704c3c, 0x80704569, 0x80704370, 0x80704f65,
0x80704ef4, 0x80704fbb, 0x807040e0, 0x807049e9, 0x80704288, 0x80704687, 0x807048d7, 0x8070429b,
0x807045d5, 0x80704dea, 0x80704791, 0x80704ab0, 0x807045f7, 0x80704c92, 0x8070493d, 0x80704474,
0x80704958, 0x80704d86, 0x80704351, 0x807048c9, 0x80704661, 0x8070431d, 0x80704bce, 0x80704927,
0x80704b33, 0x80704b87, 0x807042bf, 0x80704414, 0x8070481e, 0x8070445c, 0x807047bf, 0x807042b9,
0x8070446e, 0x807045a3, 0x80704335, 0x80704a86, 0x80704ea9, 0x80704cc1, 0x8070435f, 0x80704d08,
0x80704352, 0x807045a8, 0x807049ca, 0x80704b7a, 0x80704a4a, 0x80704b86, 0x8070449a, 0x807043db,
0x8070485d, 0x80704e8f, 0x8070422e, 0x80704709, 0x8070444d, 0x8070487c, 0x8070460f, 0x807045ef,
0x80704e98, 0x807046f5, 0x807043be, 0x80704fc5, 0x807046a6, 0x80704162, 0x80704181, 0x80704ec9,
0x8070497a, 0x80704523, 0x80704ad3, 0x807040db, 0x80704df6, 0x80704078, 0x80704c22, 0x80704861,
0x80704f4c, 0x80704ec7, 0x807040ca, 0x80704564, 0x80704673, 0x80704275, 0x807041a4, 0x807047f5,
0x80704440, 0x807047f7, 0x80704eab, 0x8070477e, 0x807042cb, 0x80704eae, 0x807043ef, 0x8070443d,
0x80704a39, 0x80704770, 0x80704f1b, 0x80704d3c, 0x80704a5e, 0x80704cf1, 0x80704a79, 0x807042be,
0x80704ca0, 0x80704ab1, 0x80704ee1, 0x807048f9, 0x80704b4b, 0x8070409e, 0x8070426d, 0x8070400b,
0x807044b0, 0x807047d0, 0x80704a5b, 0x8070420d, 0x80704799, 0x80704de7, 0x8070480d, 0x807044fe,
0x80704422, 0x8070473a, 0x80704d41, 0x80704943, 0x80704959, 0x80704c14, 0x8070471a, 0x807043a0,
0x80704b83, 0x807042fe, 0x8070470e, 0x80704f2f, 0x80704aa4, 0x80704123, 0x8070454f, 0x8070423f,
0x80704960, 0x80704191, 0x80704049, 0x80704bd0, 0x8070439d, 0x80704f78, 0x80704fd9, 0x80704360,
0x8070424a, 0x807044c4, 0x807040ec, 0x80704c6b, 0x80704b0e, 0x80704ea5, 0x807041af, 0x807049aa,
0x807045c3, 0x807048cf, 0x80704024, 0x8070472c, 0x807042ff, 0x8070431e, 0x807042fb, 0x80704eb4,
0x807043c4, 0x8070455b, 0x8070409d, 0x80704476, 0x807042c2, 0x807049b1, 0x80704c77, 0x807042eb,
0x807047df, 0x8070483f, 0x807041d4, 0x807047d8, 0x80704348, 0x80704998, 0x80704b69, 0x80704670,
0x807046cf, 0x80704975, 0x80704296, 0x807041c7, 0x807044fd, 0x80704d2c, 0x80704836, 0x80704c1a,
0x8070415f, 0x80704100, 0x8070479d, 0x80704e2e, 0x807045bf, 0x80704d99, 0x807043fc, 0x80704d47,
0x807047b2, 0x80704a5c, 0x80704b70, 0x80704551, 0x807040a1, 0x80704a4b, 0x80704753, 0x80704773,
0x80704c19, 0x807046a9, 0x80704a18, 0x80704332, 0x80704da1, 0x8070470f, 0x80704475, 0x80704faa,
0x80704b4a, 0x80704daf, 0x80704f3f, 0x80704db6, 0x8070449c, 0x807044e4, 0x80704b0c, 0x80704f5c,
0x80704f5f, 0x807049d3, 0x80704f1e, 0x8070431f, 0x80704dc1, 0x80704e2f, 0x80704d0d, 0x80704cbb,
0x807047e6, 0x8070422b, 0x807046a3, 0x807047b9, 0x807040de, 0x80704057, 0x80704d62, 0x80704883,
0x8070424f, 0x80704340, 0x807041ae, 0x8070439f, 0x807048ef, 0x8070417b, 0x80704c0a, 0x80704180,
0x80704ac4, 0x80704f79, 0x807045c9, 0x80704243, 0x80704361, 0x80704dc9, 0x80704538, 0x80704153,
0x80704ce5, 0x80704ea2, 0x80704c44, 0x80704a2b, 0x80704442, 0x80704ff0, 0x807045b5, 0x80704b07,
0x807049f3, 0x80704ed8, 0x80704245, 0x80704caa, 0x8070482e, 0x80704320, 0x80704918, 0x807043b8,
0x80704419, 0x80704456, 0x8070423b, 0x80704a4d, 0x807048c8, 0x80704d49, 0x807042a8, 0x80704d33,
0x807049a1, 0x80704554, 0x80704838, 0x807042ab, 0x80704a20, 0x80704876, 0x80704194, 0x80704f90,
0x8070496a, 0x8070407b, 0x807049e1, 0x80704cd0, 0x80704afd, 0x8070408d, 0x80704e8e, 0x80704d3f,
0x80704b27, 0x80704a14, 0x80704995, 0x80704e87, 0x80704096, 0x8070416f, 0x807043a1, 0x807040f8,
0x80704415, 0x807041c5, 0x8070443a, 0x8070458a, 0x80704058, 0x807044e5, 0x80704c97, 0x8070420f,
0x80704678, 0x80704f1f, 0x80704fb0, 0x807045fc, 0x80704a1d, 0x8070409b, 0x80704431, 0x80704d13,
0x80704e90, 0x80704160, 0x807044b1, 0x80704a2a, 0x80704885, 0x80704485, 0x80704c74, 0x80704c25,
0x80704be1, 0x80704f47, 0x80704377, 0x80704a58, 0x80704936, 0x8070425f, 0x807047e3, 0x807049c9,
0x80704794, 0x8070452f, 0x807043a8, 0x80704bdb, 0x80704856, 0x80704da4, 0x807048af, 0x807043d2,
0x80704acc, 0x807044d6, 0x80704269, 0x80704ae6, 0x807044fa, 0x80704ba9, 0x80704436, 0x80704d63,
0x80704890, 0x807040d9, 0x807044d1, 0x807047c4, 0x80704b41, 0x80704192, 0x807047ed, 0x8070408a,
0x80704edc, 0x80704c0c, 0x807040df, 0x80704ae8, 0x80704663, 0x80704405, 0x80704f55, 0x8070458e,
0x80704378, 0x80704322, 0x80704bd8, 0x807049b6, 0x8070423c, 0x8070456f, 0x807043c8, 0x807045d9,
0x80704a82, 0x80704c2e, 0x8070484b, 0x80704e00, 0x80704571, 0x80704a60, 0x80704991, 0x8070476e,
0x807042a6, 0x80704d91, 0x80704fae, 0x80704d05, 0x80704f48, 0x80704bda, 0x807040e8, 0x80704535,
0x807040ef, 0x80704c09, 0x8070496b, 0x80704070, 0x80704d8d, 0x807048e4, 0x8070447f, 0x807049f7,
0x80704dfc, 0x80704855, 0x80704170, 0x807048f1, 0x80704d6b, 0x80704c05, 0x80704206, 0x80704ae4,
0x80704ba7, 0x8070432b, 0x80704e50, 0x807044ef, 0x8070416a, 0x8070405d, 0x807041c1, 0x80704059,
0x80704df8, 0x807044f0, 0x80704df0, 0x80704486, 0x807041ff, 0x80704074, 0x80704f91, 0x807048e5,
0x80704293, 0x8070448b, 0x80704ed5, 0x80704138, 0x80704841, 0x807040e1, 0x80704d8f, 0x8070407c,
0x80704c68, 0x807044e2, 0x80704539, 0x80704ebc, 0x8070473b, 0x8070458c, 0x80704ad2, 0x8070414f,
0x80704955, 0x80704020, 0x807049f2, 0x80704273, 0x80704c34, 0x80704b4e, 0x8070456a, 0x80704dd9,
0x80704c3d, 0x80704dec, 0x80704a97, 0x80704813, 0x80704647, 0x80704ae3, 0x80704099, 0x807040c4,
0x80704ef5, 0x8070493f, 0x80704150, 0x80704eb9, 0x807044e0, 0x80704550, 0x807042a4, 0x80704517,
0x807049fa, 0x80704470, 0x807046cc, 0x80704028, 0x80704cfb, 0x80704297, 0x80704937, 0x8070432c,
0x80704247, 0x80704042, 0x80704e5a, 0x80704735, 0x80704efa, 0x80704c8d, 0x80704136, 0x807043cf,
0x807049cc, 0x807044fb, 0x80704ae9, 0x80704ea6, 0x80704938, 0x807045a7, 0x8070446c, 0x80704d69,
0x80704249, 0x807047ff, 0x80704cab, 0x807046d7, 0x80704c0d, 0x8070454e, 0x80704301, 0x80704d7a,
0x80704dd5, 0x80704a11, 0x80704af6, 0x80704730, 0x80704aa2, 0x80704c75, 0x807049bb, 0x80704fa7,
0x80704210, 0x80704d95, 0x807043e4, 0x8070445d, 0x8070441e, 0x807046fa, 0x80704af5, 0x807046f3,
0x80704bae, 0x80704afe, 0x80704b84, 0x80704114, 0x807048f3, 0x80704572, 0x80704b5f, 0x807046d2,
0x807043f9, 0x80704abc, 0x807040da, 0x80704679, 0x80704cae, 0x807049b9, 0x8070485f, 0x80704393,
0x807047d6, 0x80704e4b, 0x80704c91, 0x80704dd3, 0x80704823, 0x807047dc, 0x80704d66, 0x80704271,
0x80704f57, 0x80704fb6, 0x80704346, 0x80704b4f, 0x80704d23, 0x8070459f, 0x807047ae, 0x80704e12,
0x80704482, 0x8070409f, 0x8070432d, 0x80704417, 0x807041e7, 0x807045bd, 0x80704ae1, 0x80704cdc,
0x8070456e, 0x807049dc, 0x807042ec, 0x8070442d, 0x80704076, 0x8070462d, 0x80704ab7, 0x80704d29,
0x807042c0, 0x80704581, 0x80704d20, 0x80704334, 0x807043fe, 0x80704f68, 0x807047f8, 0x80704892,
0x80704df3, 0x80704e6b, 0x80704940, 0x80704573, 0x80704146, 0x80704ac7, 0x807042e7, 0x807042ac,
0x807042bc, 0x8070476f, 0x807040a4, 0x807045a9, 0x80704224, 0x807041db, 0x807046a7, 0x80704fa1,
0x8070467f, 0x80704b12, 0x80704eff, 0x80704298, 0x80704c4e, 0x80704274, 0x80704fc7, 0x8070430d,
0x80704941, 0x80704bb7, 0x807043dc, 0x8070482c, 0x80704d90
],
[
0x00000000, 0x80703c83, 0x807037a1, 0x80703597, 0x807036f2, 0x807030fa, 0x80703dce, 0x80703c84,
0x8070302d, 0x807033ee, 0x80703790, 0x80703c01, 0x807033da, 0x807033b1, 0x80703209, 0x80703e96,
0x80703f0f, 0x8070361e, 0x80703965, 0x807036f8, 0x80703016, 0x807035ff, 0x80703ae5, 0x807035f9,
0x807032dc, 0x8070303b, 0x80703015, 0x80703a69, 0x80703db8, 0x80703827, 0x807036cd, 0x8070301c,
0x80703b30, 0x807036de, 0x80703e6d, 0x80703f7f, 0x80703079, 0x807032b3, 0x80703803, 0x807039a9,
0x807030af, 0x80703294, 0x80703d94, 0x807036c4, 0x807037e2, 0x80703510, 0x80703bbb, 0x807031d3,
0x80703b26, 0x8070355f, 0x807030e2, 0x807034a2, 0x80703f12, 0x80703982, 0x80703acf, 0x8070328a,
0x807036f1, 0x80703f6c, 0x8070399a, 0x80703b5e, 0x807031fd, 0x8070344f, 0x80703d59, 0x807033d9,
0x80703c08, 0x807039a3, 0x807039d8, 0x80703c85, 0x8070348e, 0x80703869, 0x80703bf9, 0x80703473,
0x80703d07, 0x8070365b, 0x8070329a, 0x80703872, 0x80703416, 0x807031e8, 0x807030c0, 0x8070349d,
0x8070370c, 0x80703ecc, 0x80703fcc, 0x80703a09, 0x807033a9, 0x80703089, 0x80703be3, 0x80703f9a,
0x80703efc, 0x80703a00, 0x807038c2, 0x80703a26, 0x80703fee, 0x807037d5, 0x80703a9e, 0x80703a05,
0x80703140, 0x8070328c, 0x807038fc, 0x807037e8, 0x80703f3a, 0x80703376, 0x80703a65, 0x80703b15,
0x80703af4, 0x807038d3, 0x80703066, 0x80703331, 0x80703931, 0x807031e0, 0x80703eec, 0x80703b2e,
0x80703c67, 0x80703511, 0x80703f86, 0x807037a9, 0x80703610, 0x807038e3, 0x80703313, 0x807034bc,
0x80703e6e, 0x80703336, 0x80703e7f, 0x80703d61, 0x8070383c, 0x8070365c, 0x80703f0d, 0x807032e8,
0x80703cf2, 0x807036ce, 0x80703b89, 0x80703f7e, 0x80703c13, 0x807038ba, 0x80703f3d, 0x807033ca,
0x807032f8, 0x80703df4, 0x80703de9, 0x80703df2, 0x807036b6, 0x80703b8d, 0x80703261, 0x80703863,
0x8070305e, 0x80703258, 0x80703c96, 0x80703979, 0x807034f8, 0x80703b38, 0x8070307a, 0x80703548,
0x807039cd, 0x80703b8a, 0x80703aaf, 0x80703cf7, 0x80703d03, 0x8070379c, 0x80703fed, 0x80703167,
0x8070366b, 0x80703e3b, 0x80703be5, 0x80703e10, 0x80703355, 0x80703a74, 0x80703e4e, 0x80703e64,
0x80703bad, 0x80703ffc, 0x80703977, 0x80703122, 0x8070391e, 0x80703547, 0x80703865, 0x807035fa,
0x807034db, 0x80703574, 0x8070347c, 0x8070335d, 0x80703b24, 0x80703540, 0x8070339b, 0x80703ba6,
0x80703f73, 0x8070340f, 0x80703394, 0x80703fef, 0x807034a9, 0x807033c6, 0x80703ca2, 0x8070360a,
0x80703b2f, 0x80703cdb, 0x80703e81, 0x807034bd, 0x80703b93, 0x80703866, 0x80703589, 0x80703cb7,
0x80703eb1, 0x807032ea, 0x80703244, 0x8070367a, 0x80703ff6, 0x8070343b, 0x8070348a, 0x80703558,
0x80703d48, 0x80703906, 0x80703f21, 0x8070374a, 0x80703732, 0x80703454, 0x80703bfb, 0x80703bc2,
0x807032df, 0x8070380a, 0x80703e8c, 0x807038c6, 0x8070326f, 0x80703a37, 0x80703441, 0x80703606,
0x807033c7, 0x80703b8b, 0x8070372f, 0x80703e79, 0x8070390f, 0x80703df5, 0x8070335e, 0x807035fb,
0x80703b6d, 0x80703455, 0x80703448, 0x807036df, 0x8070361b, 0x8070370d, 0x80703262, 0x80703f80,
0x8070311b, 0x80703d09, 0x80703c98, 0x80703b3f, 0x80703bcf, 0x80703e55, 0x80703b4d, 0x807035b6,
0x80703b5d, 0x80703e11, 0x80703731, 0x807035b7, 0x8070312d, 0x807039e0, 0x8070334c, 0x80703043,
0x80703b6e, 0x80703921, 0x80703000, 0x80703cf0, 0x807036fc, 0x80703f9b, 0x80703fc4, 0x80703d88,
0x80703443, 0x80703cc0, 0x807030e3, 0x80703956, 0x80703e22, 0x80703295, 0x80703c66, 0x80703175,
0x80703ae0, 0x807039c6, 0x80703840, 0x807034a3, 0x807032e9, 0x807034ae, 0x80703648, 0x807034d8,
0x80703f84, 0x80703ce6, 0x80703305, 0x8070322f, 0x80703e24, 0x807038d4, 0x80703ed4, 0x807039f1,
0x8070328e, 0x807039ee, 0x807038f8, 0x80703dc3, 0x807032b1, 0x80703c6f, 0x80703e3e, 0x80703eb3,
0x80703575, 0x8070390b, 0x8070315b, 0x80703ddf, 0x80703c3c, 0x80703569, 0x80703370, 0x80703f65,
0x80703ef4, 0x80703fbb, 0x807030e0, 0x807039e9, 0x80703288, 0x80703687, 0x807038d7, 0x8070329b,
0x807035d5, 0x80703dea, 0x80703791, 0x80703ab0, 0x807035f7, 0x80703c92, 0x8070393d, 0x80703474,
0x80703958, 0x80703d86, 0x80703351, 0x807038c9, 0x80703661, 0x8070331d, 0x80703bce, 0x80703927,
0x80703b33, 0x80703b87, 0x807032bf, 0x80703414, 0x8070381e, 0x8070345c, 0x807037bf, 0x807032b9,
0x8070346e, 0x807035a3, 0x80703335, 0x80703a86, 0x80703ea9, 0x80703cc1, 0x8070335f, 0x80703d08,
0x80703352, 0x807035a8, 0x807039ca, 0x80703b7a, 0x80703a4a, 0x80703b86, 0x8070349a, 0x807033db,
0x8070385d, 0x80703e8f, 0x8070322e, 0x80703709, 0x8070344d, 0x8070387c, 0x8070360f, 0x807035ef,
0x80703e98, 0x807036f5, 0x807033be, 0x80703fc5, 0x807036a6, 0x80703162, 0x80703181, 0x80703ec9,
0x8070397a, 0x80703523, 0x80703ad3, 0x807030db, 0x80703df6, 0x80703078, 0x80703c22, 0x80703861,
0x80703f4c, 0x80703ec7, 0x807030ca, 0x80703564, 0x80703673, 0x80703275, 0x807031a4, 0x807037f5,
0x80703440, 0x807037f7, 0x80703eab, 0x8070377e, 0x807032cb, 0x80703eae, 0x807033ef, 0x8070343d,
0x80703a39, 0x80703770, 0x80703f1b, 0x80703d3c, 0x80703a5e, 0x80703cf1, 0x80703a79, 0x807032be,
0x80703ca0, 0x80703ab1, 0x80703ee1, 0x807038f9, 0x80703b4b, 0x8070309e, 0x8070326d, 0x8070300b,
0x807034b0, 0x807037d0, 0x80703a5b, 0x8070320d, 0x80703799, 0x80703de7, 0x8070380d, 0x807034fe,
0x80703422, 0x8070373a, 0x80703d41, 0x80703943, 0x80703959, 0x80703c14, 0x8070371a, 0x807033a0,
0x80703b83, 0x807032fe, 0x8070370e, 0x80703f2f, 0x80703aa4, 0x80703123, 0x8070354f, 0x8070323f,
0x80703960, 0x80703191, 0x80703049, 0x80703bd0, 0x8070339d, 0x80703f78, 0x80703fd9, 0x80703360,
0x8070324a, 0x807034c4, 0x807030ec, 0x80703c6b, 0x80703b0e, 0x80703ea5, 0x807031af, 0x807039aa,
0x807035c3, 0x807038cf, 0x80703024, 0x8070372c, 0x807032ff, 0x8070331e, 0x807032fb, 0x80703eb4,
0x807033c4, 0x8070355b, 0x8070309d, 0x80703476, 0x807032c2, 0x807039b1, 0x80703c77, 0x807032eb,
0x807037df, 0x8070383f, 0x807031d4, 0x807037d8, 0x80703348, 0x80703998, 0x80703b69, 0x80703670,
0x807036cf, 0x80703975, 0x80703296, 0x807031c7, 0x807034fd, 0x80703d2c, 0x80703836, 0x80703c1a,
0x8070315f, 0x80703100, 0x8070379d, 0x80703e2e, 0x807035bf, 0x80703d99, 0x807033fc, 0x80703d47,
0x807037b2, 0x80703a5c, 0x80703b70, 0x80703551, 0x807030a1, 0x80703a4b, 0x80703753, 0x80703773,
0x80703c19, 0x807036a9, 0x80703a18, 0x80703332, 0x80703da1, 0x8070370f, 0x80703475, 0x80703faa,
0x80703b4a, 0x80703daf, 0x80703f3f, 0x80703db6, 0x8070349c, 0x807034e4, 0x80703b0c, 0x80703f5c,
0x80703f5f, 0x807039d3, 0x80703f1e, 0x8070331f, 0x80703dc1, 0x80703e2f, 0x80703d0d, 0x80703cbb,
0x807037e6, 0x8070322b, 0x807036a3, 0x807037b9, 0x807030de, 0x80703057, 0x80703d62, 0x80703883,
0x8070324f, 0x80703340, 0x807031ae, 0x8070339f, 0x807038ef, 0x8070317b, 0x80703c0a, 0x80703180,
0x80703ac4, 0x80703f79, 0x807035c9, 0x80703243, 0x80703361, 0x80703dc9, 0x80703538, 0x80703153,
0x80703ce5, 0x80703ea2, 0x80703c44, 0x80703a2b, 0x80703442, 0x80703ff0, 0x807035b5, 0x80703b07,
0x807039f3, 0x80703ed8, 0x80703245, 0x80703caa, 0x8070382e, 0x80703320, 0x80703918, 0x807033b8,
0x80703419, 0x80703456, 0x8070323b, 0x80703a4d, 0x807038c8, 0x80703d49, 0x807032a8, 0x80703d33,
0x807039a1, 0x80703554, 0x80703838, 0x807032ab, 0x80703a20, 0x80703876, 0x80703194, 0x80703f90,
0x8070396a, 0x8070307b, 0x807039e1, 0x80703cd0, 0x80703afd, 0x8070308d, 0x80703e8e, 0x80703d3f,
0x80703b27, 0x80703a14, 0x80703995, 0x80703e87, 0x80703096, 0x8070316f, 0x807033a1, 0x807030f8,
0x80703415, 0x807031c5, 0x8070343a, 0x8070358a, 0x80703058, 0x807034e5, 0x80703c97, 0x8070320f,
0x80703678, 0x80703f1f, 0x80703fb0, 0x807035fc, 0x80703a1d, 0x8070309b, 0x80703431, 0x80703d13,
0x80703e90, 0x80703160, 0x807034b1, 0x80703a2a, 0x80703885, 0x80703485, 0x80703c74, 0x80703c25,
0x80703be1, 0x80703f47, 0x80703377, 0x80703a58, 0x80703936, 0x8070325f, 0x807037e3, 0x807039c9,
0x80703794, 0x8070352f, 0x807033a8, 0x80703bdb, 0x80703856, 0x80703da4, 0x807038af, 0x807033d2,
0x80703acc, 0x807034d6, 0x80703269, 0x80703ae6, 0x807034fa, 0x80703ba9, 0x80703436, 0x80703d63,
0x80703890, 0x807030d9, 0x807034d1, 0x807037c4, 0x80703b41, 0x80703192, 0x807037ed, 0x8070308a,
0x80703edc, 0x80703c0c, 0x807030df, 0x80703ae8, 0x80703663, 0x80703405, 0x80703f55, 0x8070358e,
0x80703378, 0x80703322, 0x80703bd8, 0x807039b6, 0x8070323c, 0x8070356f, 0x807033c8, 0x807035d9,
0x80703a82, 0x80703c2e, 0x8070384b, 0x80703e00, 0x80703571, 0x80703a60, 0x80703991, 0x8070376e,
0x807032a6, 0x80703d91, 0x80703fae, 0x80703d05, 0x80703f48, 0x80703bda, 0x807030e8, 0x80703535,
0x807030ef, 0x80703c09, 0x8070396b, 0x80703070, 0x80703d8d, 0x807038e4, 0x8070347f, 0x807039f7,
0x80703dfc, 0x80703855, 0x80703170, 0x807038f1, 0x80703d6b, 0x80703c05, 0x80703206, 0x80703ae4,
0x80703ba7, 0x8070332b, 0x80703e50, 0x807034ef, 0x8070316a, 0x8070305d, 0x807031c1
]
]
NameStringList = [[
"","こうた","さくじろう","ももか","はるき","かんきち","あかり","テル",
"ルナ","ジェッソン","カツーン","ロッチェル","ジェモリ","アカシ","オーロ","クイン",
"ウィード","ジェミニ","マッド","ミーティア","モリオン","ピヨ","クレオメ","ポイズ",
"パララ","ナップ","プリンツ","カネコ","リラ","ジェモリ","ドーロ","バスーラ",
"アルジェント","ローザ","レプス","フェーロ","ピクシス","パティ","やすお","まおう",
"エリアーノ","プリンツ","カリーナ","ポンヌせいじん","ワカバ","アラタ","モエ","タケル",
"ピーノ","キーノ","モンド","アオイ","シズク","マリン","ナギ","ナミ",
"クラマ","ボン","ヒトミ","セレナ","ツキノ","モモチ","サリー","クロ",
"ヴィクター","カエデ","アンズ","コノハ","メリー","スズ","リース","マルモ",
"キンジ","ギンジ","トルテ","ラズベル","ネーブル","アピス","ハニー","ペロ",
"タロー","ジロー","サブロー","カール","マツリ","ハヅキ","ベニ","マシュ",
"キノ","ユウト","レイト","ニーナ","ナッシュ","ナスピ","ユキノ","カイ",
"フロスト","テマリ","コウミ","ハヤテ","キララ","イブキ","ダイキ","バニラ",
"ピスタ","メル","パレット","ラパン","デイジー","キントキ","ボルト","ナット",
"アマネ","シノ","ミオ","カクタ","サンジ","マルオ","キラ","フローリィ",
"モイス","ピート","フウト","カイト","メロ","ライラ","ゴチリン","ピコ",
"リョウコ","ショウコ","ウルベエ","シンマオウ","マオウ","ミイナ","ナイト","ルフィン",
"パンチョ","シュウト","バン","カイナ","サンタ","クリス","オフク","シンゲン",
"シンネン","ハリー","ビリー","マット","ナナコ","ツキオ","ウィント","ココア",
"ミント","ショコラ","しろがねまる","こがねまる","ハルカ","ヒカリ","ビシット","モモ",
"キンタロ","ムサシ","ジョー","レイラ","アイコ","モエカ","フーラ","リオ",
"カワタロウ","イチロウ","テン","ピオーネ","ナスミ","マルーン","マジョカ","ソラ",
"ヨウジ","ケイタ","ココ","ジロウ","キョウコ","スノウ","ホリー","ミサ",
"カグラ","シンジ","ダイコク","アラレ","ユキヤ","キサラ","ケイスケ","カレン",
"ハルト","ツヅミ","マーチ","ハッチ","ショウ","ハルナ","ヒビキ","アオコ",
"ガモン","テルル","アニー","ミスター","カモメ","ミナト","ナギサ","テラ",
"トプス","レックス","メイゲツ","モッチ","ミツキ","ルージュ","キョウ","ケン",
"グラ","ギンコ","クレハ","オルカ","エリー","キャンディ","ティコ","ぽむ",
"ねこた","まとん","コハル","ラビ","こいさぶろう","あきつ","うぶきぬ","はちりょう",
"たてなし","うすかね","ひざまる","めいと","めろでぃ","はあと","カガミ","いち",
"にい","さん","よん","ごう","ろく","なな","はち","のぼる",
"ほむら","えん","あきら","てる","とうか","ひいろ","ほたる","ごろう",
"しゅうと","まなぶ","えいと","さとる","けんご","ちか","ひろと","しろう",
"だいき","ひとみ","しんじ","おきと","たかし","あんね","たくま","ねね",
"くま","すると","みけ","しろう","じゅん","ころ","ろろ","ふうた",
"めぐみ","こうだい","たいへい","ようすけ","ゆうが","りお","ひろむ","かれん",
"あられ","せっか","しずり","つばき","つらら","こゆき","ぼたん","ぱっく",
"べる","うぃんでぃ","えありー","ぴっと","くりす","じゃっく","しぃ","うるる",
"しぐれ","ゆう","しずく","うめ","いなり","そそぐ","しの","きりや",
"かんな","とる","こうき","けんたろう","れい","るみ","ふらん","すすむ",
"なぎ","はやて","しょう","いくぞう","そよ","かざみ","ふうか","さぼたん",
"まつかな","びこ","かぶと","ひぼたん","うちわ","かげろう","ぼたん","さき",
"れな","ひなた","ここみ","ゆうな","まい","あい","こなつ","ないと",
"かげちよ","さよ","かいむ","つくよ","れいら","くろと","おうま","のぞむ",
"こう","ひすい","ざくろ","るり","さんご","こはく","さぐる","かずちか",
"よしのぶ","ゆうじろう","てつや","ようた","さとる","ゆうと","ひろむ","さとる",
"じんや","かいしん","そうか","としみつ","はやか","しゅんた","たいち","マルオ",
"マルコ","マルノ","マルミ","マルエ","マルラ","マルン","マルデ","えりか",
"ゆうし","たける","まさや","そうご","まもる","ごうた","けんと","あとむ",
"ろびん","けい","すず","むさし","りんぞう","うらん","やすひろ","めいと",
"めろでぃ","はあと","みるく","るる","りりむ","りあん","ぽえむ","まりん",
"りこ","あや","えり","はる","まおまお","ひめ","れん","えど",
"そてつ","しあん","ぎる","かぶと","にこ","ゆりね","よみ","たけし",
"まさよし","ひろ","みのり","ごう","ゆたか","ひかる","やまと","まさむね",
"きよまさ","みつなり","ひであき","ただつぐ","まさゆき","よしひろ","けいじ","こむぎ",
"くるみ","りんご","あずき","めろん","まめ","なっつ","ころね","きら",
"いつき","こがね","はな","こうせい","ごうじ","せれす","りあ","てつじ",
"ひろゆき","たかのり","のぶあき","こうたろう","けんじ","じょう","ただのぶ","ほのか",
"のどか","なごみ","いやし","のぞみ","いのり","めぐみ","ここな","あいみ",
"きらり","ゆの","にーな","えりさ","まこ","ぴゅあ","あず","きたろう",
"きょうや","ゆうすけ","さだこ","かずお","ひろし","つかさ","かよこ","かいじ",
"みなと","きさらぎ","いずみ","あん","おきつぐ","あきつ","こうへい","どらこ",
"りゅういち","くうご","そら","こうすけ","おぼろ","もね","やくも","とら",
"りゅうき","ちはや","れお","たいが","ししお","こてつ","ひょうご","あやか",
"わかば","ひなの","うらら","つくし","かすみ","もえぎ","よもぎ","あいりん",
"べりぃ","ここあ","ももか","りずむ","ちぇりー","かのん","みるきぃ","りりす",
"える","のえる","みんてぃ","しすこ","のあ","みつき","れあ","はなこ",
"きく","すみれ","あおい","さくら","つばき","もも","ゆり","れい",
"そら","なみ","かおり","ひな","まひな","りこ","さや","じん",
"みちこ","けいと","みやび","しゅういち","みお","けんすけ","みこと","らん",
"すず","みかげ","りん","きみか","べる","こはな","すずの","いわまる",
"だいや","らるど","るい","かず","はるか","はんと","じん","こはく",
"ほくと","ぎんが","しゅうせい","すばる","やくも","せいや","ななせ","りんぞう",
"はじめ","りょうたろう","さくらこ","わたる","こずえ","ひでとし","くらのすけ","しずか",
"あきな","しずえ","れいか","ゆき","くみ","ひとみ","あけみ","りゅうせい",
"らいと","せんり","めい","いなさ","ごう","しでん","ひかる","せつな",
"ひびき","うた","かなめ","しおり","とおる","たまき","みづき","りりあ",
"あらん","けん","るか","じょうじ","りさ","だん","さむ","げき",
"がい","げん","だい","がん","ぶん","ぐん","だん","きゃぷてん",
"へんりー","えどわーど","しるばー","へくたー","じょん","ぴーと","ふっく","たいち",
"りく","みね","いわお","てんま","りょう","たいざん","はるもり","うぶきぬ",
"はちりょう","たてなし","うすかね","ひざまる","おもだか","つきかず","ひかず","とうこんファイヤーズ",
"<280;>特攻<281;>とっこう<282;>エースチーム","マジシャンズ","ワイルドアニマル","あしたからほんきだし<280;>隊<281;>たい<282;>","クールビューティーズ","<280;>森<281;>もり<282;>のイタズラ<280;>遊撃隊<281;>ゆうげきたい<282;>","レインドロップス","<280;>電撃<281;>でんげき<282;>ビリビリ<280;>隊<281;>たい<282;>",
"かざあなドリラー","ちくちくサボテン<280;>団<281;>だん<282;>","ファイトガールズ","<280;>暗黒<281;>あんこく<282;>のまじゅつだん","おたからドロップス","ハンマーボンバーズ","スピードレーサーズ","マルオパーティ",
"お<280;>姫<281;>ひめ<282;>さまとSPさん","<280;>鋼鉄<281;>こうてつ<282;>のブレイブ","メルヘンちゃーむ","シグナル8","どくどくゾンビーズ","デンパメン","ちいむもののふ","ウェルカムオーダーズ",
"<280;>金色<281;>こんじき<282;>のストレングス","クリティカルキング","ホワイトナイチンゲール","シグナレス8","ゴーストスナイプス","ジョーリーロジャーズ","ドラゴンチーム","<280;>猛虎愚蓮隊<281;>もうこぐれんたい<282;>",
"チューリップス","ももいろチャーム","ダークネスちゃーむ","ももいろナイチンゲール","ブラックビューティー","チーム・ドクター","ティンカーズ","<280;>漆黒<281;>しっこく<282;>の<280;>巨人<281;>きょじん<282;>",
"<280;>白虎<281;>びゃっこ<282;>シャインスターズ","マスタースピリッツ","みわくレディース","でんげきパンチ","ブラボーチーム","<280;>夕<281;>ゆう<282;>やけガンマンズ","アンテナオブザデス","レッドパイレーツ",
"グレートジャイアンツ","ラセツ八人衆","<62;>たち","電波人間たち","モンスターたち","<62;>A","<62;>B","<62;>C",
"<62;>D","<62;>E","<62;>F","<62;>G","<62;>H","<62;>I","<62;>J"
],
[
"", "あいのすけ", "あおし", "あおた", "あおと", "あきかず", "あきすけ", "あきずみ",
"あきた", "あきたか", "あきと", "あぎと", "あきとし", "あきとら", "あきなお", "あきなり",
"あきのしん", "あきのすけ", "あきひこ", "あきひさ", "あきひろ", "あきまさ", "あきよし", "あさたろう",
"あさと", "あさひと", "あさや", "あつし", "あつと", "あつとし", "あつひろ", "あつや",
"あやた", "あやたか", "あやたろう", "あやと", "あゆと", "あらし", "あらた", "あんと",
"いいひこ", "いえみつ", "いえやす", "いえよし", "いがまる", "いくえもん", "いくし", "いくぞう",
"いくま", "いくまさ", "いさく", "いさじ", "いざむ", "いしん", "いぞう", "いそろく",
"いちせい", "いちた", "いちだい", "いちたろう", "いちと", "いちのしん", "いちひろ", "いちや",
"いちろう", "いちろうた", "いつお", "いっきゅう", "いっこう", "いっしんさい", "いっせい", "いった",
"いつひと", "いっぺい", "いどむ", "いのきち", "いわお", "いわん", "うさまろ", "うしお",
"うじやす", "うしわかまる", "うたまろ", "うみたろう", "うみのすけ", "うみや", "うめじろう", "うめたろう",
"うめわかまる", "えいいち", "えいいちろう", "えいが", "えいき", "えいきち", "えいご", "えいさく",
"えいし", "えいじ", "えいしゅん", "えいじろう", "えいすけ", "えいた", "えいだい", "えいたろう",
"えいち", "えいと", "えいのすけ", "えいま", "えいや", "えつお", "えつろう", "えびぞう",
"えんぞう", "おういち", "おういちろう", "おうがい", "おうし", "おうじ", "おうしろう", "おうすけ",
"おうた", "おうや", "おおぞら", "おおや", "おさむ", "おとき", "おとや", "おとわかまる",
"おにまる", "がい", "かいお", "かいが", "かいき", "かいこう", "かいし", "かいじ",
"かいすけ", "かいせい", "かいぞう", "かいと", "がいと", "かいへい", "がくた", "がくや",
"かげあき", "かげきよ", "かげと", "かげとら", "かげひろ", "かける", "かざと", "かしお",
"かずあき", "かずお", "かずおみ", "かずき", "かずし", "かずしげ", "かずたか", "かずたけ",
"かずただ", "かずちか", "かずと", "かずとら", "かずのしん", "かずのすけ", "かずのぶ", "かずのり",
"かずはる", "かずひさ", "かずひで", "かずひと", "かずひろ", "かずふみ", "かずま", "かずまさ",
"かずみつ", "かずむ", "かずや", "かずやす", "かずゆき", "かつ", "かつあき", "かつお",
"かつじ", "かつと", "かつなり", "かつのり", "かつひこ", "かつひと", "かっぺい", "かつや",
"かつゆき", "かつよし", "かつより", "かなと", "かなや", "かぶと", "かまのすけ", "かみゅ",
"がもん", "かやと", "かんいち", "かんう", "かんきち", "かんくろう", "がんじ", "かんすけ",
"かんぞう", "かんた", "かんたろう", "かんぱち", "かんべえ", "ぎいちろう", "ぎえん", "きくたろう",
"きさぶろう", "きさんじ", "きしん", "きすけ", "きたろう", "きちえもん", "きっぺい", "きひと",
"きへい", "きみあき", "きみのぶ", "きみひろ", "きみまろ", "きゅうさく", "きゅうべえ", "きょういち",
"きょうが", "きょうき", "きょうご", "きょうじろう", "きょうすけ", "ぎょうすけ", "きょうたろう", "きょうと",
"きょうま", "きよおみ", "きよし", "きよしげ", "きよすみ", "きよた", "きよつぐ", "きよと",
"きよなり", "きよのぶ", "きよのり", "きよはる", "きよひこ", "きよひと", "きよひら", "きよふみ",
"きよま", "きよまさ", "きよまろ", "きよもり", "きりお", "きりと", "きりや", "きりゅう",
"きんえもん", "きんじろう", "ぎんじろう", "ぎんすけ", "きんたろう", "ぎんたろう", "ぎんと", "きんとき",
"ぎんとき", "きんぺい", "きんや", "くうご", "くうと", "くうや", "くえひこ", "くさぶろう",
"くすお", "くにあき", "くにお", "くにとりまる", "くにのり", "くにひで", "くにひと", "くまきち",
"くまたろう", "くまはち", "くめたろう", "くらのすけ", "くらま", "くろうど", "ぐんじ", "くんた",
"けいいち", "けいいちろう", "けいえつ", "けいご", "けいし", "けいしゅん", "けいしん", "けいすけ",
"けいた", "けいだい", "けいたろう", "けいん", "けん", "けんいち", "けんいちすけ", "けんいちろう",
"けんき", "げんき", "けんさく", "げんざぶろう", "けんじ", "げんじ", "けんしろう", "げんじろう",
"けんしん", "けんすけ", "げんすけ", "けんせい", "けんぞう", "けんた", "けんたすけ", "けんたひこ",
"げんたろう", "げんと", "げんのすけ", "けんま", "こいざぶろう", "こいちろう", "こういち", "こういちろう",
"こうう", "こうえい", "こうえつ", "こうお", "こうさく", "こうし", "こうじ", "こうしろう",
"こうじろう", "こうすけ", "ごうすけ", "こうぞう", "ごうだい", "こうたろう", "ごうたろう", "こうふ",
"こうへい", "こうめい", "こうよう", "こうりゅう", "こうわ", "ごえもん", "ごくう", "こごろう",
"こじゅうろう", "こじろう", "こすけ", "こたろう", "ことまる", "ことや", "ごへい", "これきよ",
"ごろう", "ころく", "ころすけ", "ごん", "ごんぞう", "ごんた", "ごんべえ", "さいぞう",
"さいた", "さいと", "さくいち", "さくお", "さくじ", "さくた", "さくたろう", "さくはる",
"さくへい", "ささまる", "さすけ", "さだしげ", "さだはる", "さだむ", "さだゆき", "さだよし",
"さちお", "さちと", "さちひろ", "さちや", "さとし", "さとゆき", "さとる", "さねひと",
"さのすけ", "さぶろう", "さへい", "さもん", "さるひこ", "さわお", "しいち", "じいちろう",
"じえい", "しげ", "しげあき", "しげお", "しげかず", "しげき", "しげた", "しげと",
"しげなり", "しげひこ", "しげひさ", "しげひろ", "しげまつ", "しげゆき", "しこう", "ししお",
"ししまる", "じじろう", "しちえもん", "しのすけ", "しばたろう", "しまじろう", "しゅういち", "しゅうう",
"しゅうが", "しゅうげつ", "しゅうご", "しゅうさく", "しゅうじ", "しゅうすけ", "しゅうぞう", "じゅうぞう",
"しゅうたろう", "じゅうたろう", "しゅうと", "しゅうのすけ", "しゅうへい", "しゅうべえ", "しゅうや", "しゅうわ",
"しゅんいち", "じゅんいち", "じゅんきち", "じゅんすけ", "じゅんせい", "しゅんた", "じゅんと", "じゅんのすけ",
"しゅんぺい", "しゅんま", "じゅんま", "しょうい", "しょういち", "しょうご", "じょうじ", "しょうじろう",
"しょうせい", "しょうた", "じょうた", "しょうだい", "しょうたろう", "しょうのすけ", "しょうへい", "しょうや",
"しょうりゅう", "しりゅう", "しろう", "じろう", "しん", "しんいち", "じんいち", "しんげん",
"しんご", "しんざぶろう", "しんじ", "しんじろう", "しんた", "しんたろう", "しんぱち", "じんぱち",
"しんぺい", "じんぺい", "しんめい", "しんや", "すいた", "すいと", "すけきよ", "すけろく",
"すずし", "すすむ", "すみお", "すみと", "すみはる", "すみひこ", "せいいちろう", "せいぎ",
"せいきち", "せいざぶろう", "せいじ", "せいしろう", "せいじろう", "せいしん", "せいすけ", "せいたろう",
"せいと", "せいめい", "せいよう", "せつお", "せつや", "ぜん", "せんいち", "せんいちろう",
"せんきち", "せんご", "せんと", "せんま", "そうが", "そうき", "そうけん", "そうご",
"そうじ", "そうじろう", "そうすけ", "そうせき", "そうた", "そうだい", "そうたろう", "そうと",
"そうま", "そうや", "そめごろう", "そらお", "そらき", "そらや", "たいが", "たいかい",
"だいき", "だいきち", "だいごろう", "だいさく", "たいし", "たいじゅ", "だいしょう", "たいじろう",
"だいじろう", "だいすけ", "たいち", "だいち", "たいと", "だいと", "たいよう", "たかあき",
"たかいち", "たかお", "たかおみ", "たかし", "たかちか", "たかつぐ", "たかと", "たかとし",
"たかのぶ", "たかひこ", "たかひさ", "たかひろ", "たかま", "たかみち", "たかみつ", "たかむ",
"たかや", "たかゆき", "たきお", "たくい", "たくお", "たくし", "たくすけ", "たくた",
"たくたろう", "たくと", "たくのすけ", "たくふみ", "たくま", "たくむ", "たくや", "たくろう",
"たけあき", "たけお", "たけき", "たけし", "たけじ", "たけじろう", "たけちよ", "たけとし",
"たけとも", "たけのぶ", "たけのり", "たけひさ", "たけひと", "たけひろ", "たけふみ", "たけまつ",
"たけまる", "たけみつ", "たけゆき", "たける", "たすけ", "ただあき", "ただお", "ただかつ",
"ただし", "ただすけ", "ただずみ", "ただたか", "ただつぐ", "ただのぶ", "ただみね", "ただむね",
"ただやす", "ただゆき", "たつ", "たつあき", "たつお", "たつおみ", "たつし", "たつじろう",
"たつぞう", "たっと", "たつとし", "たつなり", "たつひこ", "たつひさ", "たつひと", "たつひろ",
"たっぺい", "たつや", "たつよし", "たつろう", "たにお", "たへい", "たみひで", "たみや",
"ためきち", "たもつ", "たらお", "たろう", "ちかと", "ちかひさ", "ちかゆき", "ちずお",
"ちせい", "ちづお", "ちゃちゃまる", "ちゅうすけ", "ちょういち", "ちょうじ", "ちょうた", "つたまる",
"つとむ", "つなと", "つなよし", "つねあき", "つねお", "つねのり", "つねひと", "つねゆき",
"つねろう", "ていすけ", "ていた", "ていと", "てつ", "てつお", "てつき", "てっさい",
"てっしん", "てっしんさい", "てっせい", "てつた", "てつひさ", "てつひで", "てつひと", "てつま",
"てつや", "てつろう", "てるあき", "てるお", "てるかず", "てると", "てるとし", "てるのり",
"てるまさ", "てるみち", "てるゆき", "てるよし", "てんいち", "てんさく", "てんせい", "てんたろう",
"てんと", "てんどう", "とうじ", "とうじろう", "とうた", "とうたろう", "とうべえ", "とうま",
"とうや", "とおま", "とおる", "ときじろう", "ときつぐ", "ときと", "ときひさ", "ときむね",
"ときや", "とくひろ", "としいえ", "としお", "としき", "としぞう", "としたか", "としなり",
"としのぶ", "としまさ", "としみち", "としや", "としやす", "とみお", "とみなり", "とみひさ",
"ともかず", "ともき", "ともし", "ともたか", "ともたろう", "ともちか", "ともと", "ともなお",
"とものすけ", "とものり", "ともひで", "ともひと", "ともひろ", "ともみつ", "ともゆき", "ともよし",
"ともろう", "とよき", "とらお", "とらきち", "とらじろう", "とらひと", "なおかず", "なおざね",
"なおじろう", "なおた", "なおたか", "なおたろう", "なおと", "なおとし", "なおはる", "なおひこ",
"なおひろ", "なおま", "なおや", "ながひさ", "なぎと", "なついち", "なつお", "なつた",
"なつひと", "ななき", "なみへい", "なゆた", "なりたつ", "なりひろ", "なりゆき", "なるひと",
"にじひこ", "にじや", "にじろう", "ねんじ", "のびた", "のぶお", "のぶき", "のぶたか",
"のぶてる", "のぶなが", "のぶひで", "のぶひろ", "のぶゆき", "のぶよし", "のぼる", "のりかず",
"のりすけ", "のりひこ", "のりひと", "のりゆき", "はじめ", "はちろう", "はつま", "はつまさ",
"はなみち", "はやき", "はやたか", "はやて", "はやと", "はやとし", "はやとも", "はやぶさ",
"はゆま", "はるあき", "はるいち", "はるお", "はるかず", "はるき", "はるきよ", "はるすけ",
"はるたか", "はるたけ", "はるただ", "はるたろう", "はると", "はるとも", "はるとら", "はるなお",
"はるなり", "はるのぶ", "はるのり", "はるひこ", "はるひで", "はるま", "はるみち", "ばん",
"はんぞう", "はんた", "ばんたろう", "ひえい", "ひこぼし", "ひこまろ", "ひさあき", "ひさお",
"ひさたか", "ひさと", "ひさのぶ", "ひさのり", "ひさひろ", "ひさや", "ひさよし", "ひで",
"ひでお", "ひでき", "ひでたか", "ひでちか", "ひでと", "ひでとし", "ひでとも", "ひでなり",
"ひでのり", "ひでひさ", "ひでまさ", "ひでゆき", "ひでよし", "ひとし", "ひなと", "ひゅう",
"ひゅうが", "ひゅうま", "ひょう", "ひょうえ", "ひょうが", "ひらお", "ひろあき", "ひろかつ",
"ひろき", "ひろし", "ひろた", "ひろたか", "ひろたろう", "ひろと", "ひろなり", "ひろのぶ",
"ひろひこ", "ひろひで", "ひろまさ", "ひろみち", "ひろみつ", "ふうすけ", "ふうた", "ふうたろう",
"ふうと", "ぶきち", "ふくすけ", "ふくと", "ふくや", "ふじお", "ふじまる", "ふみたけ",
"ふみひさ", "ふみひと", "ふみや", "ふゆき", "ふゆと", "ぶんじ", "ぶんぞう", "ぶんたろう",
"ぶんや", "へいじ", "へいぞう", "へいた", "べにまる", "べんけい", "べんぞう", "ほうせい",
"まいじろう", "まいたろう", "まきと", "まさ", "まさあき", "まさお", "まさおみ", "まさかつ",
"まさかど", "まさし", "まさじ", "まさしげ", "まさた", "まさたか", "まさただ", "まさちか",
"まさと", "まさなお", "まさはる", "まさひろ", "まさみつ", "まさむね", "まさや", "まさやす",
"まさゆき", "まさゆみ", "まさよし", "まさる", "ますお", "ますじ", "またざぶろう", "まつたろう",
"まなと", "まなぶ", "まみち", "まもる", "まりお", "まれすけ", "まんじろう", "まんた",
"まんぺい", "みおと", "みかど", "みきたか", "みきたろう", "みきひこ", "みきまる", "みくや",
"みずと", "みずや", "みちお", "みちき", "みちざね", "みちた", "みちと", "みちなが",
"みちなり", "みちはる", "みちひこ", "みちひさ", "みちひと", "みちまさ", "みちろう", "みつあき",
"みつお", "みつくに", "みつたか", "みつと", "みつなが", "みつのぶ", "みつはる", "みつひこ",
"みつひさ", "みつひで", "みつひろ", "みつまさ", "みつろう", "みどう", "みなと", "みのや",
"みのる", "むが", "むがい", "むくなが", "むさし", "むさしまる", "むつお", "むつや",
"むねお", "むねじ", "むねひさ", "めいとく", "もこみち", "もときよ", "もとすけ", "もとちか",
"もとなり", "もとのぶ", "もとのり", "もとひこ", "もとひろ", "もとみち", "ももた", "ももたろう",
"もりお", "もりひこ", "もりや", "やいち", "やいちろう", "やしゃまる", "やすあき", "やすお",
"やすざぶろう", "やすし", "やすとし", "やすなり", "やすのぶ", "やすひこ", "やすひで", "やすひと",
"やすひろ", "やすま", "やすまさ", "やすや", "やすろう", "やひこ", "ゆいいちろう", "ゆいと",
"ゆいのすけ", "ゆいや", "ゆうあき", "ゆうさく", "ゆうざぶろう", "ゆうじ", "ゆうしょう", "ゆうじろう",
"ゆうしん", "ゆうすけ", "ゆうせい", "ゆうた", "ゆうだい", "ゆうと", "ゆうま", "ゆうや",
"ゆきお", "ゆきち", "ゆきつぐ", "ゆきと", "ゆきとも", "ゆきとら", "ゆきのじょう", "ゆきのしん",
"ゆきのすけ", "ゆきのぶ", "ゆきひさ", "ゆきひと", "ゆきま", "ゆきまさ", "ゆきむら", "ゆきや",
"ゆみと", "ゆめじ", "ゆめた", "よういち", "ようく", "ようじ", "ようた", "ようたろう",
"ようと", "ようへい", "よしあき", "よしいえ", "よしき", "よしくに", "よした", "よしたろう",
"よしちか", "よしつぐ", "よしつね", "よしなお", "よしのり", "よしひこ", "よしひろ", "よしまさ",
"よしみつ", "よしや", "よしろう", "よりとも", "よりひと", "らいじ", "らんたろう", "らんのすけ",
"らんぽ", "らんまる", "りきいち", "りきお", "りきじ", "りきと", "りきや", "りきゅう",
"りくたろう", "りくと", "りくのすけ", "りくひろ", "りくへい", "りくや", "りたろう", "りつし",
"りつじ", "りつたろう", "りつと", "りつま", "りゅういち", "りゅうし", "りゅうた", "りゅうだい",
"りゅうたろう", "りゅうのすけ", "りゅうへい", "りゅうほ", "りゅうほう", "りゅうま", "りゅうや", "りょうい",
"りょうえい", "りょうご", "りょうこう", "りょうじろう", "りょうすけ", "りょうた", "りょうのしん", "りょうのすけ",
"りょうふう", "りょうま", "りんいち", "りんいちろう", "りんぞう", "りんた", "りんたろう", "りんのすけ",
"りんや", "るいじ", "れいいち", "れいき", "れいし", "れいじ", "れいじろう", "れいのすけ",
"れいめい", "れんいちろう", "れんご", "れんじ", "れんじろう", "れんたろう", "れんぺい", "れんま",
"れんや", "ろくた", "ろくろう", "ろはん", "わいち", "わかおみ", "わかき", "わかぎ",
"わかと", "わかひろ", "わきち", "わさぶろう", "わしひと", "わじろう", "わたる"
],
[
"", "あい", "あいか", "あいこ", "あいさ", "あいな", "あいね", "あいの",
"あいみ", "あいら", "あいり", "あおな", "あかね", "あきえ", "あきこ", "あきな",
"あきほ", "あきよ", "あけみ", "あこ", "あさこ", "あさみ", "あずさ", "あすな",
"あすみ", "あつこ", "あつみ", "あみ", "あみか", "あみん", "あめり", "あや",
"あやか", "あやこ", "あやさ", "あやな", "あやね", "あやの", "あやは", "あやみ",
"あやめ", "あゆ", "あゆか", "あゆこ", "あゆな", "あゆみ", "あゆり", "ありあ",
"ありか", "ありさ", "ありす", "ありな", "あるる", "あん", "あんず", "あんな",
"あんり", "いおな", "いくえ", "いくこ", "いくよ", "いさな", "いすず", "いち",
"いちか", "いちこ", "いちの", "いとね", "いのり", "いばら", "いまり", "いよ",
"いりあ", "ういか", "うさ", "うさき", "うさぎ", "うた", "うたう", "うたこ",
"うたの", "うめ", "うらら", "えいか", "えいこ", "えいみ", "えこ", "えつこ",
"えな", "えまり", "えみ", "えみか", "えみこ", "えみり", "えり", "えりい",
"えりか", "えりこ", "えりさ", "えりす", "えりな", "えるな", "えれな", "おくに",
"おしん", "おとか", "おとは", "おとめ", "おりえ", "おりびあ", "おりひめ", "かえ",
"かえら", "かおり", "かおるこ", "かおん", "かぐや", "かこ", "かさね", "かずえ",
"かずこ", "かずな", "かずね", "かずは", "かずほ", "かすみ", "かずよ", "かな",
"かなえ", "かなこ", "かなは", "かなみ", "かの", "かのこ", "かのは", "かほ",
"かほり", "かや", "かやこ", "かやの", "かよ", "かよこ", "かりあ", "かりな",
"かれん", "かんな", "きえ", "きお", "きおこ", "きき", "ききょう", "きくえ",
"きくの", "きくのじょう", "きくり", "きこ", "きさ", "きな", "きなこ", "きぬ",
"きぬえ", "きぬよ", "きのこ", "きほ", "きみ", "きみえ", "きみか", "きみこ",
"きみよ", "きよ", "きょうか", "きょうこ", "きよえ", "きよか", "きよこ", "きよみ",
"きらら", "きらり", "きりえ", "きりか", "きりこ", "きわ", "きわこ", "くきこ",
"くこ", "くすえ", "くにこ", "くみ", "くみえ", "くみこ", "くめこ", "くらら",
"くりえ", "くりこ", "くるみ", "くれあ", "くれは", "くろえ", "けいか", "けいこ",
"けいな", "こあ", "こうこ", "こうみ", "こうめ", "ここあ", "ここな", "ここね",
"ここの", "ここは", "ここみ", "こずえ", "ことえ", "ことか", "ことこ", "ことな",
"ことね", "ことの", "ことは", "ことみ", "ことり", "こな", "こなみ", "このえ",
"このか", "このは", "このみ", "こはぎ", "こはな", "こはね", "こはる", "こまき",
"こまち", "こまり", "こもも", "こゆき", "こゆり", "こより", "さあや", "さいか",
"さいね", "さえか", "さえこ", "さえり", "さお", "さおり", "さき", "さきえ",
"さきか", "さきこ", "さきな", "さきの", "さきほ", "さくら", "さくらこ", "さこ",
"さざえ", "ささら", "さしゃ", "さち", "さちえ", "さちか", "さちこ", "さちほ",
"さちよ", "さと", "さとえ", "さとか", "さとこ", "さとな", "さとみ", "さな",
"さなえ", "さなみ", "さほ", "さほこ", "さや", "さやか", "さやこ", "さやな",
"さやね", "さやの", "さゆ", "さゆか", "さゆき", "さゆな", "さゆみ", "さゆり",
"さよ", "さよこ", "さより", "さら", "さらさ", "さり", "さりい", "さりな",
"さわ", "さわか", "さわこ", "しあ", "しあら", "しい", "しいか", "しいな",
"しえ", "しえな", "しえみ", "しお", "しおね", "しおり", "しきぶ", "しげみ",
"しげよ", "しずえ", "しずか", "しずこ", "しずな", "しずほ", "しずよ", "しづき",
"しほ", "しほこ", "しほり", "しまこ", "しゃな", "しゅうか", "しゅうこ", "じゅな",
"じゅの", "じゅり", "じゅりあ", "じゅりな", "じゅんこ", "じゅんな", "しょうこ", "しらゆき",
"しんじゅ", "すいれん", "すぎの", "すず", "すずか", "すずこ", "すずな", "すずね",
"すずの", "すずは", "すずめ", "すずらん", "すなこ", "すまこ", "すみ", "すみえ",
"すみか", "すみこ", "すみれ", "すもも", "すわこ", "せあら", "せいあ", "せいか",
"せいこ", "せいな", "せいね", "せいら", "せつこ", "せつの", "せつよ", "せりあ",
"せりか", "せりな", "せれな", "そあら", "そうこ", "そな", "その", "そのえ",
"そのか", "そのこ", "そのみ", "そのり", "そめこ", "そよ", "そよか", "そよこ",
"たいこ", "たえ", "たえこ", "たかえ", "たかこ", "たかよ", "たつえ", "たにえ",
"たまえ", "たまこ", "たまみ", "たみえ", "たみこ", "たみよ", "たよこ", "だりあ",
"ちえ", "ちえこ", "ちえの", "ちえみ", "ちえり", "ちおり", "ちか", "ちかげ",
"ちかこ", "ちかの", "ちぐさ", "ちこ", "ちさ", "ちさき", "ちさこ", "ちず",
"ちずえ", "ちせ", "ちづこ", "ちづる", "ちどり", "ちな", "ちなみ", "ちの",
"ちはぎ", "ちはな", "ちはる", "ちふゆ", "ちほ", "ちまこ", "ちゆき", "ちよ",
"ちよえ", "ちよこ", "ちよの", "ちより", "ちわこ", "つき", "つきか", "つきこ",
"つきの", "つきみ", "つくし", "つぐみ", "つたえ", "つづみ", "つね", "つばき",
"つぼみ", "つゆか", "つゆこ", "ていこ", "てつこ", "てまり", "てるこ", "てるみ",
"とあ", "とうか", "とうこ", "とき", "ときこ", "ときね", "としえ", "としこ",
"としほ", "とみこ", "ともえ", "ともか", "ともこ", "ともな", "ともは", "ともみ",
"ともよ", "ともり", "とわこ", "なえ", "なおえ", "なおか", "なおこ", "なおみ",
"なこ", "なずな", "なつか", "なつこ", "なつたろう", "なつね", "なつは", "なつほ",
"なつみ", "なでしこ", "なな", "ななえ", "ななか", "ななこ", "ななは", "ななほ",
"なの", "なのか", "なのは", "なほ", "なほこ", "なみ", "なみえ", "なみこ",
"なるこ", "にいな", "にか", "にこ", "にちか", "にな", "ねいろ", "ねね",
"ねねこ", "のえ", "のえこ", "のぎく", "のどか", "のの", "ののか", "ののこ",
"ののは", "のばら", "のぶえ", "のぶこ", "のぶよ", "のりえ", "のりか", "のりこ",
"はすみ", "はつえ", "はつね", "はつみ", "はな", "はなえ", "はなか", "はなこ",
"はなの", "はなみ", "はの", "はのん", "はるあ", "はるえ", "はるこ", "はるな",
"はるね", "はるの", "はるほ", "はるよ", "はんな", "ひいな", "ひおな", "ひおり",
"ひかり", "ひさえ", "ひさこ", "ひさな", "ひでこ", "ひでみ", "ひとみ", "ひな",
"ひなか", "ひなこ", "ひなの", "ひなみ", "ひなり", "ひふみ", "ひまり", "ひまわり",
"ひめ", "ひめか", "ひめな", "ひめの", "ひめり", "ひめる", "ひよ", "ひより",
"ひらり", "ひろえ", "ひろか", "ひろこ", "ひろな", "ふうか", "ふうこ", "ふうな",
"ふきこ", "ふさえ", "ふじこ", "ふね", "ふみ", "ふみえ", "ふみか", "ふみこ",
"ふみな", "ふみの", "ふゆか", "ふゆな", "ほうこ", "ぼたん", "ほなみ", "ほの",
"ほのか", "ほのみ", "ほのり", "ぽぷり", "まあさ", "まあち", "まあや", "まい",
"まいか", "まいこ", "まいな", "まいみ", "まおり", "まかな", "まきこ", "まきな",
"まさえ", "まさこ", "まさよ", "まちこ", "まつこ", "まな", "まなえ", "まなか",
"まなは", "まなみ", "まはな", "まひな", "まほ", "まみ", "まみこ", "まや",
"まゆ", "まゆう", "まゆか", "まゆこ", "まゆな", "まゆみ", "まゆり", "まよ",
"まり", "まりあ", "まりい", "まりえ", "まりか", "まりこ", "まりさ", "まりな",
"まりの", "まりん", "みあ", "みあか", "みい", "みいこ", "みいな", "みう",
"みえ", "みえこ", "みお", "みおか", "みおこ", "みおな", "みおり", "みか",
"みかこ", "みかさ", "みきえ", "みきこ", "みく", "みくり", "みこ", "みここ",
"みさ", "みさこ", "みさと", "みずえ", "みずか", "みすず", "みずは", "みずほ",
"みその", "みそら", "みちか", "みちこ", "みちよ", "みつえ", "みつこ", "みつよ",
"みな", "みなこ", "みなも", "みのり", "みはな", "みはね", "みふゆ", "みほ",
"みほこ", "みみ", "みやこ", "みゆ", "みゆう", "みゆか", "みゆな", "みゆり",
"みよ", "みよこ", "みり", "みりあ", "みれい", "みわ", "みわこ", "むつみ",
"めい", "めいか", "めいこ", "めいさ", "めいな", "めいみ", "めぐ", "めぐみ",
"もあな", "もえ", "もえか", "もえこ", "もえな", "もえみ", "もこ", "もとこ",
"もな", "もなみ", "もにか", "もね", "もも", "ももあ", "ももえ", "ももか",
"ももこ", "ももな", "ももね", "ももの", "ももは", "ももみ", "ももよ", "もゆ",
"もよこ", "もわ", "やえ", "やえこ", "やすえ", "やすこ", "やすよ", "ややこ",
"やよい", "ゆあ", "ゆい", "ゆいか", "ゆいこ", "ゆいな", "ゆいね", "ゆいの",
"ゆいは", "ゆうあ", "ゆうか", "ゆうこ", "ゆうな", "ゆうね", "ゆうの", "ゆうは",
"ゆえ", "ゆか", "ゆかこ", "ゆかな", "ゆかり", "ゆきえ", "ゆきか", "ゆきこ",
"ゆきな", "ゆきね", "ゆきの", "ゆきは", "ゆきほ", "ゆきみ", "ゆずか", "ゆずき",
"ゆずな", "ゆずの", "ゆずは", "ゆずほ", "ゆな", "ゆの", "ゆみ", "ゆみか",
"ゆみこ", "ゆめ", "ゆめか", "ゆめこ", "ゆめな", "ゆめの", "ゆり", "ゆりあ",
"ゆりえ", "ゆりか", "ゆりこ", "ゆりな", "ゆりね", "ゆりの", "ようか", "ようこ",
"よしえ", "よしか", "よしこ", "よしの", "よりこ", "らいら", "らうら", "らな",
"らら", "らんこ", "りあ", "りあな", "りい", "りいさ", "りいな", "りえ",
"りえこ", "りおこ", "りおな", "りか", "りかこ", "りこ", "りさ", "りさこ",
"りず", "りせ", "りっか", "りつこ", "りな", "りなこ", "りね", "りのあ",
"りのか", "りほ", "りみ", "りゆ", "りよ", "りょうか", "りょうこ", "りら",
"りり", "りりあ", "りりい", "りりか", "りりこ", "りりな", "りりむ", "りんか",
"りんこ", "りんな", "るうな", "るな", "るみ", "るみこ", "るりか", "るりこ",
"れあ", "れいあ", "れいか", "れいこ", "れいさ", "れいな", "れいね", "れいみ",
"れいら", "れおな", "れな", "れね", "れみ", "れんか", "れんげ", "ろこ",
"ろみ", "わかこ", "わかな", "わかめ", "わこ"
],
[
"", "あいむ", "あいる", "あお", "あおい", "あおの", "あおば", "あおみ",
"あかつき", "あき", "あきの", "あきは", "あきひ", "あきら", "あくあ", "あくび",
"あぐり", "あげは", "あけび", "あさ", "あさか", "あさき", "あさぎ", "あさひ",
"あざみ", "あじゃり", "あじゅ", "あしゅら", "あしゅり", "あず", "あすか", "あずき",
"あすま", "あずみ", "あすら", "あたる", "あつき", "あど", "あとむ", "あのん",
"あひる", "あまね", "あむ", "あやせ", "あゆむ", "あゆら", "あられ", "あり",
"ありお", "ある", "あると", "あれん", "あんじ", "あんじゅ", "いお", "いおり",
"いおん", "いきる", "いく", "いくお", "いくと", "いくみ", "いくむ", "いくら",
"いさお", "いさき", "いさみ", "いさむ", "いざや", "いざよい", "いさり", "いすみ",
"いずみ", "いずむ", "いずも", "いずる", "いたる", "いちき", "いちご", "いちは",
"いちよう", "いちる", "いちろ", "いつき", "いっさ", "いと", "いとし", "いとは",
"いなり", "いぶき", "いぶみ", "いまる", "いりや", "いるか", "いろは", "うい",
"うきょう", "うこん", "うちゅう", "うてな", "うの", "うみ", "うゆう", "うり",
"うるう", "うるる", "えいす", "えと", "えにし", "えま", "えみる", "えむ",
"えりざべす", "える", "えるも", "えれん", "おうか", "おうが", "おうじゅ", "おうる",
"おと", "おぼろ", "おりと", "かい", "がいあ", "かいや", "かいり", "かえで",
"かえる", "かお", "かおる", "かかお", "かがみ", "かがり", "かぐら", "かげろう",
"かごめ", "かざね", "かざみ", "かじゅ", "かずさ", "かずちよ", "かずひ", "かずみ",
"かせつ", "かたる", "かづき", "かっぱ", "かつみ", "かつら", "かなた", "かなで",
"かなめ", "かなり", "かなん", "かのん", "かはく", "かみる", "かむい", "かもめ",
"かりん", "かるあ", "かるた", "かるま", "かをる", "かんろ", "きあな", "きあら",
"きい", "きく", "きさき", "きさら", "きずな", "きの", "きのと", "きのり",
"きはる", "きひろ", "きみお", "きゃら", "きゅうり", "きょう", "きよら", "きら",
"きり", "きりの", "きるあ", "きわむ", "きん", "ぎん", "ぎんが", "きんかく",
"ぎんかく", "くいん", "くう", "くおん", "くじら", "くらげ", "くりす", "ぐりむ",
"くるむ", "くるり", "くれい", "くれない", "ぐれん", "くろ", "くろがね", "けい",
"けいじゅ", "けいと", "けいま", "げっこう", "こあら", "こいち", "こいる", "こう",
"こうき", "こうた", "こうま", "こうや", "こうり", "こお", "こおり", "こがね",
"ここ", "こころ", "こすも", "こだま", "こちょう", "こつぶ", "こてつ", "こと",
"ことら", "こなつ", "こなん", "こはく", "こばこ", "こよみ", "こりん", "こるく",
"ころん", "さあら", "さい", "さいき", "さうら", "さえ", "さかえ", "さかな",
"さきょう", "さぎり", "さく", "さくも", "さくや", "ざくろ", "さこん", "ささ",
"さざなみ", "ささみ", "さそり", "さつき", "さとり", "さなぎ", "さやき", "さらら",
"さんご", "しあん", "しえる", "しおん", "しき", "しぐま", "しぐれ", "しげる",
"しじみ", "しずく", "しずる", "しの", "しのび", "しのぶ", "しひろ", "しま",
"しもん", "しゃら", "しゅう", "しゅか", "しゅしゅ", "じゅじゅ", "しゅり", "しゅん",
"じゅん", "しょう", "しらぬい", "しろ", "しろがね", "しんく", "しんら", "すい",
"すいげつ", "すおう", "すぐる", "すなお", "すばる", "するが", "せい", "せいや",
"せいる", "せさみ", "せしる", "せつな", "せつり", "せと", "せな", "せら",
"せり", "せん", "せんや", "せんり", "そう", "そうし", "そうじゅ", "そうる",
"そら", "そらね", "だいや", "たかね", "たかみ", "たから", "たくみ", "たけ",
"たけみ", "たすく", "たたら", "たつき", "たつみ", "たまお", "たまき", "たまも",
"たらこ", "たる", "たると", "ちあき", "ちおん", "ちくわ", "ちさお", "ちさと",
"ちたる", "ちとせ", "ちなつ", "ちはや", "ちひろ", "ちゃちゃ", "ちゅちゅ", "ちょこ",
"ちろる", "つかさ", "つきよ", "つくね", "つくも", "つつじ", "つばさ", "つばめ",
"つぶら", "つみき", "つむぎ", "つむじ", "つらら", "つるぎ", "てるま", "てれさ",
"てんか", "てんし", "とがり", "とこ", "としみ", "とま", "とも", "どれみ",
"とわ", "ないと", "ないる", "なお", "ながれ", "なぎ", "なぎさ", "なごみ",
"なごむ", "なち", "なつ", "なつき", "なつの", "なつめ", "なつる", "ななお",
"ななせ", "ななみ", "なひろ", "なみき", "なゆ", "なり", "なる", "なると",
"なるみ", "にこら", "にこる", "にの", "にや", "ぬい", "ねい", "ねいら",
"ねお", "ねおん", "ねむ", "ねる", "ねろ", "のあ", "のい", "のえる",
"のぞみ", "のん", "はがね", "はぎ", "はく", "はくあ", "はぐみ", "はずき",
"ぱせり", "はっか", "はつき", "はづき", "はなび", "はや", "はゆる", "はる",
"はるか", "はるひ", "はるみ", "はるむ", "ばんり", "ひいらぎ", "ひいろ", "ひかる",
"ひこ", "ひこの", "ひさ", "ひさき", "ひさの", "ひじり", "ひすい", "ひそか",
"ひたぎ", "ひづき", "ひつじ", "ひづる", "ひなき", "ひなぎく", "ひなた", "ひの",
"ひのき", "ひので", "ひばな", "ひばり", "ひびき", "ひむろ", "ひよこ", "ひろ",
"ひろの", "ひろみ", "ひろむ", "びん", "ふう", "ふき", "ふく", "ふじ",
"ふたば", "ぶどう", "ふゆ", "ふよう", "ふわり", "へきる", "ぺこ", "べに",
"べる", "ぽえむ", "ほかげ", "ほくと", "ぽこ", "ほずき", "ほたる", "ほづみ",
"ぼなぱると", "ほまれ", "ほむら", "まいむ", "まう", "まお", "まき", "まこ",
"まごころ", "まこと", "まこも", "まさき", "まさほ", "まさみ", "ましろ", "ますみ",
"まち", "まつ", "まっちゃ", "まつり", "まとい", "まどか", "まなつ", "まなほ",
"まの", "まはる", "まひる", "まひろ", "まほろ", "まみる", "まゆき", "まゆる",
"まよい", "まりも", "まりや", "まる", "まるも", "まろ", "まろん", "みおう",
"みおん", "みかげ", "みかん", "みき", "みくる", "みこと", "みさお", "みさき",
"みずき", "みぞれ", "みち", "みちる", "みつき", "みづき", "みつる", "みと",
"みどり", "みなみ", "みの", "みはる", "みひろ", "みもざ", "みや", "みやび",
"みゅう", "みゆき", "みら", "みらい", "みらの", "みらん", "みる", "みるく",
"みるも", "みんと", "むう", "むげん", "むつき", "めぐむ", "めだか", "めのう",
"める", "めるも", "めろ", "もあ", "もえぎ", "もか", "もぐら", "もくれん",
"もみじ", "やくも", "やしろ", "やなぎ", "やひろ", "やまと", "やや", "やわら",
"ゆあん", "ゆいり", "ゆう", "ゆうき", "ゆうさ", "ゆうじゅ", "ゆうひ", "ゆうほ",
"ゆうみ", "ゆうり", "ゆおん", "ゆき", "ゆきじ", "ゆきよ", "ゆさ", "ゆず",
"ゆずる", "ゆたか", "ゆつき", "ゆづき", "ゆのん", "ゆま", "ゆみや", "ゆめき",
"ゆめちよ", "ゆゆ", "ゆら", "ゆらい", "ゆりや", "ゆりん", "ゆわ", "ゆん",
"よう", "よしみ", "よつば", "よづる", "よもぎ", "らい", "らいか", "らいち",
"らいと", "らいむ", "らいる", "らうる", "らせん", "らっこ", "らて", "らび",
"らむ", "らむね", "らん", "りあら", "りあん", "りう", "りお", "りおと",
"りおる", "りおん", "りき", "りきあ", "りく", "りくみ", "りじゅ", "りずむ",
"りつ", "りつか", "りつき", "りっと", "りと", "りねん", "りの", "りのん",
"りま", "りむ", "りゅう", "りゅうじゅ", "りょう", "りょお", "りる", "りん",
"りんご", "りんね", "るあ", "るい", "るう", "るうま", "るおん", "るか",
"るきあ", "るね", "るの", "るり", "るる", "れある", "れい", "れいや",
"れいり", "れいん", "れお", "れおん", "れき", "れの", "れのん", "れむ",
"れもん", "れん", "れんじゅ", "ろか", "ろく", "ろまん", "ろん", "わおん",
"わか", "わかさ", "わかば", "わく", "わさび", "わむ", "わらび"
]
]
name_map={}
for j in range(1,4):
for i in range(1,len(NameIdList[j])):
name_map[NameStringList[j][i]]=NameIdList[j][i]
for i in range(1,len(NameIdList[0])):
name_map[NameStringList[0][i]+"_"]=NameIdList[0][i]
font = ImageFont.truetype("unifont-16.0.03.ttf", 16)
def generate_qr(rsid,qr_str,qr_title,qr_color):
qr = qrcode.QRCode(
version=1,
error_correction=qrcode.constants.ERROR_CORRECT_M,
box_size=16,
border=4,
)
qr.add_data(qr_str)
qr.make()
img = qr.make_image(fill_color="#1e1f22", back_color="#ffffff")
draw = ImageDraw.Draw(img)
c=["#474747","#ec413a","#35d0e0","#7bde3a","#e16223","#eeec44","#384bea","#fcfcdf","#9e6cf0"][qr_color]
draw.rectangle([(0,0),img.size], outline=c, width=40)
draw.rounded_rectangle([(28,28),(img.size[0]-28,img.size[1]-28)],radius=28,outline="#ffffff",width=28)
draw.text((37, 37), qr_title, fill="#ccbec4", font=font)
draw.text((37, 36), qr_title, fill="#bcced4", font=font)
draw.text((36, 36), qr_title, fill="#1e1f22", font=font)
draw.text((img.size[0]-207, img.size[1]-51), f"{rsid} / Scylla v3", fill="#ccbec4", font=font)
draw.text((img.size[0]-207, img.size[1]-52), f"{rsid} / Scylla v3", fill="#bcced4", font=font)
draw.text((img.size[0]-208, img.size[1]-52), f"{rsid} / Scylla v3", fill="#1e1f22", font=font)
return img
def generate_qr_base64(img):
buffer = io.BytesIO()
img.save(buffer, format="PNG")
img_str = base64.b64encode(buffer.getvalue()).decode("utf-8")
return f"data:image/png;base64,{img_str}"
def generate_qr_for_frontend(rsid, qr_str, name_s, clr_s, body_s, ant_s, color_idx):
return generate_qr_base64(generate_qr(rsid, qr_str, f"{name_s} {clr_s} {body_s} {ant_s}", color_idx))
output.register_callback('generate_qr_for_frontend', generate_qr_for_frontend)
global_results={"bps":[]}
def reg(idx):
j=global_results["bps"][idx]
register_file_output_widget.value=""
if j["name_first"]==0:
register_name_widget.value=NameStringList[j["name_first"]][j["name_second"]]+"_"
else:
register_name_widget.value=NameStringList[j["name_first"]][j["name_second"]]
register_skill_group_widget.value=SkillGroupStringList[j["skill_group"]]
register_head_widget.value=HeadStringList[j["head"]]
register_body_widget.value=BodyStringList[j["body"]]
register_pattern_widget.value=BodyPatternStringList[j["body_pattern"]]
color1_val=BodyColorStringList[j["body_color1"]]
if "濃" not in color1_val and "薄" not in color1_val:
color1_val="通常"+color1_val
register_color_widget1.value=color1_val
if register_pattern_widget.value!="なし":
color2_val=BodyColorStringList[j["body_color2"]]
if "濃" not in color2_val and "薄" not in color2_val:
color2_val="通常"+color2_val
register_color_widget2.value=color2_val
register_face_type_widget.value=j["face_type"]
register_hair_color_widget.value=j["hair_color"]
register_face_color_widget.value=j["face_color"]
register_eyes_widget.value=j["eyes"]
register_mouth_widget.value=j["mouth"]
register_nose_widget.value=j["nose"]
register_brows_widget.value=j["brows"]
register_cheek_widget.value=j["cheek"]
register_ability_widget.value=AbilityStringList[j["ability1"]]
register_birth_count_widget.value=j["birth_count"]
#mode_selector.value="個体登録"
output.register_callback('reg', reg)
def generate_ancestry_string(index,all_bps):
row_data = all_bps[index]
name_s = NameStringList[row_data["name_first"]][row_data["name_second"]]
if row_data.get("left_index", 0xFFFFFFFF) != 0xFFFFFFFF:
parent1_str = generate_ancestry_string(row_data["left_index"],all_bps)
parent2_str = generate_ancestry_string(row_data["right_index"],all_bps)
return f"( {parent1_str} + {parent2_str} ) {name_s}"
else:
rsid = row_data.get("rsid", "")
if rsid:
return f"{rsid} {name_s}"
return f"{name_s}"
def print_text(results):
all_bps = results["bps"]
table_body_text=""
for i in range(results["index"], len(all_bps)):
if i - results["index"] >= 1000: break
index=i
row_data = all_bps[index]
table_body_text += generate_ancestry_string(i,all_bps)
table_body_text+= f' アンテナ:{SkillGroupStringList[row_data["skill_group"]]}'
table_body_text+= f' 頭:{HeadStringList[row_data["head"]]}'
table_body_text+= f' 体格:{BodyStringList[row_data["body"]]}'
table_body_text+= f' 色:{BodyColorStringList[row_data["body_color1"]]} {BodyColorStringList[row_data["body_color2"]]}'
table_body_text+= f' 柄:{BodyPatternStringList[row_data["body_pattern"]]}'
table_body_text+= f' 髪:{row_data["face_type"]}'
table_body_text+= f' 髪色:{row_data["hair_color"]}'
table_body_text+= f' 肌色:{row_data["face_color"]}'
table_body_text+= f' 目:{row_data["eyes"]}'
table_body_text+= f' 口:{row_data["mouth"]}'
table_body_text+= f' 鼻:{row_data["nose"]}'
table_body_text+= f' 眉:{row_data["brows"]}'
table_body_text+= f' 頬:{row_data["cheek"]}'
table_body_text+= f' {AbilityStringList[row_data["ability1"]]}'
table_body_text+="\n"
print(table_body_text)
def print_html(results):
all_bps = results["bps"]
unique_row_counter = 0
def generate_ancestry_html(index, depth=0):
nonlocal unique_row_counter
current_row_id = unique_row_counter
unique_row_counter += 1
row_data = all_bps[index]
rsid = row_data.get("rsid", "")
has_children = row_data.get("left_index", 0xFFFFFFFF) != 0xFFFFFFFF
qr_actions_cell = "<td></td>"
row_id = f"row-{current_row_id}"
toggle_html = ""
if has_children:
toggle_html = f'<span class="toggle" onclick="toggleChildren(\'{row_id}\')">▶</span>'
qr_container_html = ""
if rsid and rsid[0]!='_':
qr_str = rsid.replace("_", "")
name_s = NameStringList[row_data["name_first"]][row_data["name_second"]]
skill_s = SkillGroupStringList[row_data["skill_group"]]
body_s = BodyStringList[row_data["body"]]
clr1_s = BodyColorStringList[row_data["body_color1"]]
color_idx = (row_data["body_color1"] - 2) // 3 if row_data["body_color1"] > 1 else 0
unique_qr_id = f"qr-{current_row_id}"
qr_container_html = f"""
<div class="qr-action-container">
<div class="qr-placeholder" id="qr-placeholder-{unique_qr_id}"
data-rsid="{rsid}" data-unique-id="{unique_qr_id}" data-qr-str="{qr_str}"
data-name-s="{name_s}" data-clr1-s="{clr1_s}{'' if '色' in clr1_s else '色'}"
data-body-s="{body_s}" data-ant-s="{skill_s}" data-color-idx="{color_idx}">QR</div>
<img src="" class="qr-thumb" id="qr-thumb-{unique_qr_id}" style="display: none;" onclick="showLargeQr('{unique_qr_id}')">
<div class="button-stack">
<button class="copy-btn" id="copy-btn-{unique_qr_id}" onclick="copyQrToClipboard('{unique_qr_id}', this)" disabled>コピー</button>
<button class="save-btn" id="save-btn-{unique_qr_id}" onclick="saveQrImage('{unique_qr_id}', '{rsid}')" disabled>保存</button>
</div>
</div>
"""
qr_actions_cell = f'<td class="qr-actions-cell"><div class="qr-cell-wrapper">{toggle_html}{qr_container_html}</div></td>'
#indent_style = f"padding-left: {5 + depth * 20}px;"
if has_children:
ancestry_string_for_copy = generate_ancestry_string(index,all_bps)
ancestry_string_for_copy+= f' アンテナ:{SkillGroupStringList[row_data["skill_group"]]}'
ancestry_string_for_copy+= f' 頭:{HeadStringList[row_data["head"]]}'
ancestry_string_for_copy+= f' 体格:{BodyStringList[row_data["body"]]}'
ancestry_string_for_copy+= f' 色:{BodyColorStringList[row_data["body_color1"]]} {BodyColorStringList[row_data["body_color2"]]}'
ancestry_string_for_copy+= f' 柄:{BodyPatternStringList[row_data["body_pattern"]]}'
ancestry_string_for_copy+= f' 髪:{row_data["face_type"]}'
ancestry_string_for_copy+= f' 髪色:{row_data["hair_color"]}'
ancestry_string_for_copy+= f' 肌色:{row_data["face_color"]}'
ancestry_string_for_copy+= f' 目:{row_data["eyes"]}'
ancestry_string_for_copy+= f' 口:{row_data["mouth"]}'
ancestry_string_for_copy+= f' 鼻:{row_data["nose"]}'
ancestry_string_for_copy+= f' 眉:{row_data["brows"]}'
ancestry_string_for_copy+= f' 頬:{row_data["cheek"]}'
ancestry_string_for_copy+= f' {AbilityStringList[row_data["ability1"]]}'
rsid_text = f"""
<button class="ancestry-copy" onclick="copyAncestryToClipboard('{ancestry_string_for_copy}', this)" title="{ancestry_string_for_copy}">
コピー
</button>
"""
else:
if rsid and rsid[0]=='_':
rsid=rsid[1:]
rsid_text = rsid
#rsid_cell = f'<td style="{indent_style}">{rsid_text}</td>'
rsid_cell = f'<td>{rsid_text}</td>'
name_cell = f"<td>{NameStringList[row_data['name_first']][row_data['name_second']]}</td>"
pair_s = ["", "双子", "親子"][row_data["pair_param"]]
ability_s=AbilityStringList[row_data["ability1"]]
if ability_s=="アビリティなし":
ability_s=""
birth_s=""
if row_data["birth_count"]!=0:
birth_s=f' 出生回数{row_data["birth_count"]}'
other_cells = f"""
<td>{SkillGroupStringList[row_data["skill_group"]]}</td>
<td>{HeadStringList[row_data["head"]]}</td>
<td>{BodyStringList[row_data["body"]]}</td>
<td>{BodyColorStringList[row_data["body_color1"]]}</td>
<td>{BodyColorStringList[row_data["body_color2"]]}</td>
<td>{BodyPatternStringList[row_data["body_pattern"]]}</td>
<td>{row_data["face_type"]}</td><td>{row_data["hair_color"]}</td>
<td>{row_data["face_color"]}</td><td>{row_data["eyes"]}</td>
<td>{row_data["mouth"]}</td><td>{row_data["nose"]}</td>
<td>{row_data["brows"]}</td><td>{row_data["cheek"]}</td>
<td>{pair_s+ability_s+birth_s}</td>
"""
html = f'<tr class="qr-actions-cell" id="{row_id}" data-depth="{depth}" style="--depth: {depth};">'
html += f"""<td><button class="register_chara" onclick="registerNewCharacter({index},this)">登録</button></td>"""
html += qr_actions_cell
html += rsid_cell
html += name_cell
html += other_cells
html += '</tr>'
if has_children:
html += generate_ancestry_html(row_data["left_index"], depth + 1)
html += generate_ancestry_html(row_data["right_index"], depth + 1)
return html
table_body_html = ""
for i in range(results["index"], len(all_bps)):
if i - results["index"] >= 1000: break
table_body_html += generate_ancestry_html(i, depth=0)
table_html = f"""
<style>
.toggle {{ cursor: pointer; user-select: none; font-family: monospace; display: inline-block; width: 1em; text-align: center; }}
.ancestry-copy {{ cursor: pointer; text-decoration: underline; text-decoration-style: dotted; }}
.qr-overlay {{ position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-color: rgba(0, 0, 0, 0.9); display: none; justify-content: center; align-items: center; z-index: 1000; cursor: pointer; }}
.qr-overlay img {{ max-width: 90%; max-height: 90%; object-fit: contain; border: 5px solid white; background-color: white; cursor: default; box-shadow: 0 0 15px rgba(0,0,0,0.5); }}
table.sr {{ border-collapse: collapse; width: 100%; font-size: 14px; }}
.sr th, .sr td {{ border: 1px solid #ddd; padding: 5px; text-align: left; vertical-align: middle; overflow: hidden; white-space: nowrap; text-overflow: ellipsis; }}
.sr .qr-actions-cell {{padding-top: 2px;padding-bottom: 2px;padding-right: 2px;padding-left: calc(2px + var(--depth, 0) * 12px);}}
.sr .qr-action-container {{ display: flex; align-items: center; justify-content: center; gap: 4px;}}
.sr .button-stack {{ display: flex; flex-direction: column; align-items: stretch; gap: 2px; }}
.sr .qr-thumb {{ width: 36px; height: 36px; cursor: pointer; border: 1px solid #eee; object-fit: contain; flex-shrink: 0; }}
.sr .copy-btn, .sr .save-btn , .sr .ancestry-copy ,.sr .register_chara{{ font-size: 10px; padding: 1px 3px; cursor: pointer; border: 1px solid #ccc; background-color: #f8f8f8; border-radius: 3px; line-height: 1.2; text-align: center; }}
.sr .copy-btn:hover,.sr .save-btn:hover , .sr .ancestry-copy:hover,.sr .register_chara:hover{{ background-color: #e0e0e0; }}
.sr .copy-btn:disabled,.sr .save-btn:disabled ,, .sr .ancestry-copy:disabled,.sr .register_chara:disabled{{ background-color: #eee; cursor: not-allowed; }}
</style>
<table class='sr'>
<thead>
<tr>
<th></th>
<th>QR</th>
<th>RSID</th>
<th>名前</th><th>アンテナ</th><th>頭の形</th><th>体格</th><th>色1</th><th>色2</th><th>柄</th>
<th>髪</th><th>色</th><th>肌</th><th>目</th><th>口</th><th>鼻</th><th>眉</th><th>頬</th><th>メモ</th>
</tr>
</thead>
<tbody>
{table_body_html}
</tbody>
</table>
<div id="qrOverlay" class="qr-overlay" onclick="hideLargeQr()">
<img id="largeQrImage" src="" onclick="event.stopPropagation()">
</div>
<script>
(function() {{
if (window.qrCodeObserver) {{ window.qrCodeObserver.disconnect(); }}
window.qrDataStorage = {{}};
const observerOptions = {{ root: null, rootMargin: '200px', threshold: 0.1 }};
const observerCallback = async (entries, observer) => {{
for (const entry of entries) {{
if (entry.isIntersecting) {{
const placeholder = entry.target;
observer.unobserve(placeholder);
if (placeholder.classList.contains('loaded')) continue;
placeholder.classList.add('loaded');
const uniqueId = placeholder.dataset.uniqueId;
const rsid = placeholder.dataset.rsid;
try {{
const result = await google.colab.kernel.invokeFunction(
'generate_qr_for_frontend',
[rsid, placeholder.dataset.qrStr, placeholder.dataset.nameS, placeholder.dataset.clr1S, placeholder.dataset.bodyS, placeholder.dataset.antS, parseInt(placeholder.dataset.colorIdx)],
{{}}
);
const base64Data = result?.data?.['text/plain']?.slice(1,-1);
if (base64Data && base64Data.startsWith('data:image/png;base64,')) {{
window.qrDataStorage[uniqueId] = base64Data;
const thumbImg = document.getElementById(`qr-thumb-${{uniqueId}}`);
if (thumbImg) {{
thumbImg.src = base64Data;
thumbImg.style.display = 'block';
placeholder.style.display = 'none';
}}
document.getElementById(`copy-btn-${{uniqueId}}`)?.removeAttribute('disabled');
document.getElementById(`save-btn-${{uniqueId}}`)?.removeAttribute('disabled');
}}
}} catch (error) {{
console.error('Error fetching QR for', rsid, ':', error);
}}
}}
}}
}};
window.qrCodeObserver = new IntersectionObserver(observerCallback, observerOptions);
document.querySelectorAll('.qr-placeholder').forEach(el => window.qrCodeObserver.observe(el));
window.showLargeQr = (uniqueId) => {{
const qrOverlay = document.getElementById('qrOverlay');
const largeQrImage = document.getElementById('largeQrImage');
if (window.qrDataStorage && window.qrDataStorage[uniqueId]) {{
largeQrImage.src = window.qrDataStorage[uniqueId];
qrOverlay.style.display = 'flex';
}}
}};
window.hideLargeQr = () => {{ document.getElementById('qrOverlay').style.display = 'none'; }};
window.copyQrToClipboard = async function(uniqueId, buttonElement) {{
const base64Data = window.qrDataStorage[uniqueId];
if (!base64Data || !navigator.clipboard) return;
buttonElement.disabled = true;
const originalText = buttonElement.textContent;
buttonElement.textContent = '...';
try {{
const response = await fetch(base64Data);
const blob = await response.blob();
await navigator.clipboard.write([ new ClipboardItem({{ [blob.type]: blob }}) ]);
buttonElement.textContent = '完了!';
}} catch (err) {{
buttonElement.textContent = '失敗';
console.error('Copy failed:', err);
}} finally {{
setTimeout(() => {{
buttonElement.textContent = originalText;
buttonElement.disabled = false;
}}, 2000);
}}
}};
window.saveQrImage = async function(uniqueId, rsid) {{
const base64Data = window.qrDataStorage[uniqueId];
if (!base64Data) return;
const link = document.createElement('a');
link.href = base64Data;
link.download = `${{rsid}}.png`;
link.click();
}};
window.registerNewCharacter = async function(index,element) {{
if (!navigator.clipboard) return;
const originalContent = element.innerHTML;
element.innerHTML = '...';
try {{
google.colab.kernel.invokeFunction('reg',[index],{{}});
element.innerHTML = '完了!';
}} catch (err) {{
element.innerHTML = '失敗';
}} finally {{
setTimeout(() => {{
element.innerHTML = originalContent;
}}, 2000);
}}
}};
window.copyAncestryToClipboard = async function(ancestryString, element) {{
if (!navigator.clipboard) return;
const originalContent = element.innerHTML;
element.innerHTML = '...';
try {{
await navigator.clipboard.writeText(ancestryString);
element.innerHTML = '完了!';
}} catch (err) {{
element.innerHTML = '失敗';
console.error('Copy failed:', err);
}} finally {{
setTimeout(() => {{
element.innerHTML = originalContent;
}}, 2000);
}}
}};
window.toggleChildren = function(parentId) {{
const parentRow = document.getElementById(parentId);
const toggle = parentRow.querySelector('.toggle');
if (!toggle) return;
const parentDepth = parseInt(parentRow.dataset.depth, 10);
const isOpening = toggle.textContent === '▶';
toggle.textContent = isOpening ? '▼' : '▶';
let currentRow = parentRow.nextElementSibling;
while (currentRow) {{
const currentDepth = parseInt(currentRow.dataset.depth, 10);
if (currentDepth <= parentDepth) break;
if (isOpening) {{
if (currentDepth === parentDepth + 1) {{
currentRow.style.display = '';
}}
}} else {{
currentRow.style.display = 'none';
const childToggle = currentRow.querySelector('.toggle');
if (childToggle) {{
childToggle.textContent = '▶';
}}
}}
currentRow = currentRow.nextElementSibling;
}}
}};
document.querySelectorAll("table.sr tbody tr").forEach(row => {{
if (parseInt(row.dataset.depth, 10) > 0) {{
row.style.display = 'none';
}}
}});
if (!window.qrEscapeListenerAdded) {{
document.addEventListener('keydown', (event) => {{ if (event.key === "Escape") window.hideLargeQr(); }});
window.qrEscapeListenerAdded = true;
}}
}})();
</script>
"""
clear_output(wait=True)
display(HTML(table_html))
if not os.path.isfile("Hyperion"):
with open("Hyperion.cpp", "w") as f:
f.write(code)
compile_command = ["g++","Hyperion.cpp","-o","Hyperion","-lcrypto","-O3"]
compile_result = subprocess.run(compile_command, capture_output=True, text=True)
if compile_result.returncode != 0:
print("C++ Compilation Error:")
print(compile_result.stdout)
print(compile_result.stderr)
exit()
print("C++ compiled successfully.\n")
run_command = [f"./Hyperion","init"]
print(f"Running C++: {' '.join(run_command)}")
run_result = subprocess.run(run_command, capture_output=True, text=True)
if run_result.returncode != 0:
print("C++ Execution Error:")
print(run_result.stdout)
print(run_result.stderr)
exit()
cpp_output_line = run_result.stdout.strip()
cpp_stderr_output = run_result.stderr.strip()
print(f"C++ Raw Output (stdout): '{cpp_output_line}'")
if cpp_stderr_output:
print(f"C++ Debug Output (stderr): {cpp_stderr_output}\n")
def run(mode,config):
t=""
for k in config:
t+=k+"="
if k=="rsid" or k=="input1" or k=="input2" or k=="output":
t+=config[k]
elif isinstance(config[k],list):
t+=",".join([str(kk) for kk in config[k]])
else:
t+=str(config[k])
t+=";"
print(t)
run_command = [f"./Hyperion",mode,t]
run_result = subprocess.run(run_command, capture_output=True, text=True)
if run_result.returncode != 0:
print("C++ Execution Error:")
print(run_result.stdout)
print(run_result.stderr)
exit()
cpp_output_line = run_result.stdout.strip()
cpp_stderr_output = run_result.stderr.strip()
print(f"{cpp_output_line}")
if cpp_stderr_output:
print(f"error\n{cpp_stderr_output}")
def get_files():
res=[]
for filename in os.listdir("saves/"):
full_path = os.path.join("saves/", filename)
if os.path.isfile(full_path) and full_path.endswith(".hype.bin"):
if not full_path.endswith("scylla.hype.bin") and not full_path.endswith("hyperion.hype.bin"):
res.append(filename.replace("/","").replace(".hype.bin",""))
return res
BodyColorStringList2 = ["黒","赤","水色","緑","橙","黄色", "青","白","紫","桃","金","銀",
"通常黒", "濃黒", "薄黒", "通常赤", "濃赤", "薄赤",
"通常水色", "濃水色", "薄水色", "通常緑", "濃緑", "薄緑", "通常橙", "濃橙",
"薄橙", "通常黄色", "濃黄色", "薄黄色", "通常青", "濃青", "薄青", "通常白",
"濃白", "薄白", "通常紫", "濃紫", "薄紫", "通常桃", "濃桃", "薄桃",
"通常金", "濃金", "薄金", "通常銀", "濃銀", "薄銀"
]
QRBodyColorStringList2 = ["黒","赤","水色","緑","橙","黄色", "青","白","紫",
"通常黒", "濃黒", "薄黒", "通常赤", "濃赤", "薄赤",
"通常水色", "濃水色", "薄水色", "通常緑", "濃緑", "薄緑", "通常橙", "濃橙",
"薄橙", "通常黄色", "濃黄色", "薄黄色", "通常青", "濃青", "薄青", "通常白",
"濃白", "薄白", "通常紫", "濃紫", "薄紫"
]
QRBodyColorStringList3 = ["黒","赤","水色","緑","橙","黄色", "青","白","紫","桃","金","銀",
"通常黒", "濃黒", "薄黒", "通常赤", "濃赤", "薄赤",
"通常水色", "濃水色", "薄水色", "通常緑", "濃緑", "薄緑", "通常橙", "濃橙",
"薄橙", "通常黄色", "濃黄色", "薄黄色", "通常青", "濃青", "薄青", "通常白",
"濃白", "薄白", "通常紫", "濃紫", "薄紫","通常桃","濃桃","薄桃","通常金","濃金","薄金","通常銀","濃銀","薄銀"
]
QRBodyColorStringList4 = [
"通常黒", "濃黒", "薄黒", "通常赤", "濃赤", "薄赤",
"通常水色", "濃水色", "薄水色", "通常緑", "濃緑", "薄緑", "通常橙", "濃橙",
"薄橙", "通常黄色", "濃黄色", "薄黄色", "通常青", "濃青", "薄青", "通常白",
"濃白", "薄白", "通常紫", "濃紫", "薄紫","通常桃","濃桃","薄桃","通常金","濃金","薄金","通常銀","濃銀","薄銀"
]
body_color_map2={"なし":0}
for c in ["黒","赤","水色","緑","橙","黄色", "青","白","紫","桃","金","銀"]:
body_color_map2["通常"+c]=[body_color_map[c]]
body_color_map2["濃"+c]=[body_color_map["濃"+c]]
body_color_map2["薄"+c]=[body_color_map["薄"+c]]
body_color_map2[c]=[body_color_map[c],body_color_map["濃"+c],body_color_map["薄"+c]]
BodyPatternStringList2 = [
"なし", "あり","ランク2","ランク3","ランク4","ランク5",
"ツートン", "ボーダー", "ストライプ", "水玉", "アニマル", "斜めボーダー",
"ギンガムチェック", "ダイヤ","鱗文","シェブロン","バブルドット","スペード",
"ピンドット", "レンガ", "スプラッシュ", "マーブル", "ヘビ","しずく", "うろこ",
"トラ", "花", "星",
]
BodyPatternIdList2=[
[0x8000000e],
[0x80000015, 0x80000016, 0x80000006, 0x8000001e, 0x8000002c, 0x80000017],
[0x80000003, 0x80000026, 0x8000002e, 0x8000000f, 0x8000002f, 0x80000007],
[0x8000000c, 0x8000002d, 0x80000004, 0x80000025, 0x80000008, 0x80000027, 0x8000000d],
[0x80000002, 0x80000005, 0x80000013]
]
body_pattern_map2={}
for b in BodyPatternStringList2:
if b=="あり":
body_pattern_map2[b]=BodyPatternIdList2[1]+BodyPatternIdList2[2]+BodyPatternIdList2[3]+BodyPatternIdList2[4]
elif b=="ランク2":
body_pattern_map2[b]=BodyPatternIdList2[1]
elif b=="ランク3":
body_pattern_map2[b]=BodyPatternIdList2[2]
elif b=="ランク4":
body_pattern_map2[b]=BodyPatternIdList2[3]
elif b=="ランク5":
body_pattern_map2[b]=BodyPatternIdList2[4]
else:
body_pattern_map2[b]=[body_pattern_map[b]]
HeadStringList2=[
"まる","よこまる","たてまる","さんかく","しかく","かどまる","おにぎり","しずく","こぐま","あまつゆ","ロボ","とんがり","でんち","たまご","たまねぎ",
"イカ","ルビー","スポーティ","キャンディ","ピエロ","まめ","ひつじ",
"タワー","ブロック","でこ","ぼこ","チューリップ","キャッスル","おかっぱ","おさかな","シルクハット","しょくパン","てんしゅ",
"ねこみみ","トゲトゲ","メラメラ","ダイヤ","りゅうせい","クワガタ","うさみみ","おだんご","デビル","みかづき","ヒレ","はね",
"つぼ","ロケット","くま","いぬみみ","まきがい","コック","おんがくか","かえる","スター","ハート","たいよう","わっか"
]
ability_map={}
for i in range(len(AbilityIdList)):
ability_map[AbilityStringList[i]]=AbilityIdList[i]
qr_rsid_widget = widgets.Text(description="RSID:", placeholder='例: aoFMuZ')
scylla_rsid_widget = widgets.Text(description="RSID:", placeholder='例: aoFMuZ')
qr_name_widget = widgets.Text(description="名前:", placeholder='例: けいこ')
scylla_name_widget = widgets.Text(description="名前:", placeholder='例: けいこ')
hyperion_name_widget = widgets.Text(description="名前:", placeholder='例: けいこ')
register_name_widget = widgets.Text(description="名前:", placeholder='例: けいこ')
qr_file_input1_widget = widgets.Dropdown(options=get_files(),value='qr',description="入力1:")
scylla_file_input1_widget = widgets.Dropdown(options=get_files(),value='qr',description="入力1:")
hyperion_file_input1_widget = widgets.Dropdown(options=get_files(),value='qr',description="入力1:")
hyperion_file_input2_widget = widgets.Dropdown(options=get_files(),value='qr',description="入力2:")
hyperion_file_enable_swap_widget=widgets.Checkbox(description="逆順を許可",value=False)
hyperion_over_100_widget=widgets.Checkbox(description="レベル101以上(Experimental)",value=False)
scylla_file_output_widget = widgets.Text(description="出力:",placeholder='例: 1手B柄全体化')
hyperion_file_output_widget = widgets.Text(description="出力:",placeholder='例: 1手B柄全体化')
register_file_output_widget = widgets.Text(description="出力:",placeholder='例: 1手B柄全体化')
qr_skill_group_options = ['指定なし'] + QRSkillGroupStringList
qr_skill_group_widget = widgets.Dropdown(options=qr_skill_group_options, value='指定なし', description='アンテナ:')
skill_group_options = ['指定なし'] + SkillGroupStringList[1:]
scylla_skill_group_widget = widgets.Dropdown(options=skill_group_options, value='指定なし', description='アンテナ:')
hyperion_skill_group_widget = widgets.Dropdown(options=skill_group_options, value='指定なし', description='アンテナ:')
register_skill_group_widget = widgets.Dropdown(options=skill_group_options, value='指定なし', description='アンテナ:')
body_options_tuples = ['指定なし'] + BodyStringList[1:]
qr_body_widget = widgets.Dropdown(options=body_options_tuples, value='指定なし', description='体格:')
scylla_body_widget = widgets.Dropdown(options=body_options_tuples, value='指定なし', description='体格:')
hyperion_body_widget = widgets.Dropdown(options=body_options_tuples, value='指定なし', description='体格:')
register_body_widget = widgets.Dropdown(options=body_options_tuples, value='指定なし', description='体格:')
qr_color_options = ['指定なし'] + QRBodyColorStringList2
qr_color_widget = widgets.Dropdown(options=qr_color_options, value='指定なし', description='体色:')
color_options1=['指定なし'] + QRBodyColorStringList3
scylla_color_widget1 = widgets.Dropdown(options=color_options1, value='指定なし', description='体色1:')
hyperion_color_widget1 = widgets.Dropdown(options=color_options1, value='指定なし', description='体色1:')
color_options2=['指定なし'] + QRBodyColorStringList3
scylla_color_widget2 = widgets.Dropdown(options=color_options2, value='指定なし', description='体色2:')
hyperion_color_widget2 = widgets.Dropdown(options=color_options2, value='指定なし', description='体色2:')
r_color_options1=['指定なし'] + QRBodyColorStringList4
register_color_widget1 = widgets.Dropdown(options=r_color_options1, value='指定なし', description='体色1:')
r_color_options2=['指定なし'] + QRBodyColorStringList4
register_color_widget2 = widgets.Dropdown(options=r_color_options2, value='指定なし', description='体色2:')
pattern_options=['指定なし'] + BodyPatternStringList2
scylla_pattern_widget = widgets.Dropdown(options=pattern_options, value='指定なし', description='柄:')
hyperion_pattern_widget = widgets.Dropdown(options=pattern_options, value='指定なし', description='柄:')
r_pattern_options=['指定なし'] + BodyPatternStringList[1:-1]
register_pattern_widget = widgets.Dropdown(options=r_pattern_options, value='指定なし', description='柄:')
scylla_color_enable_swap_widget=widgets.Checkbox(description="逆順を許可",value=True)
hyperion_color_enable_swap_widget=widgets.Checkbox(description="逆順を許可",value=True)
qr_head_options = ['指定なし'] + QRHeadStringList
qr_head_widget = widgets.Dropdown(options=qr_head_options, value='指定なし', description='頭の形:')
head_options = ['指定なし'] + HeadStringList2
scylla_head_widget = widgets.Dropdown(options=head_options, value='指定なし', description='頭の形:')
hyperion_head_widget = widgets.Dropdown(options=head_options, value='指定なし', description='頭の形:')
register_head_widget = widgets.Dropdown(options=head_options, value='指定なし', description='頭の形:')
pair_options = ['指定なし','なし','双子','親子']
qr_pair_widget = widgets.Dropdown(options=pair_options, value='指定なし', description='ペア:')
ability_options = ['指定なし'] + AbilityStringList[:3]
scylla_ability_widget = widgets.Dropdown(options=ability_options, value='指定なし', description='補正:')
hyperion_ability_widget = widgets.Dropdown(options=ability_options, value='指定なし', description='補正:')
register_ability_widget = widgets.Dropdown(options=ability_options, value='指定なし', description='補正:')
register_birth_count_widget = widgets.widgets.IntText(description="出生回数:",value=0)
qr_face_type_widget = widgets.Dropdown(options=['指定なし']+list(range(95)), value='指定なし', description='輪郭/髪:')
scylla_face_type_widget = widgets.Dropdown(options=['指定なし']+list(range(95)), value='指定なし', description='輪郭/髪:')
hyperion_face_type_widget = widgets.Dropdown(options=['指定なし']+list(range(95)), value='指定なし', description='輪郭/髪:')
register_face_type_widget = widgets.Dropdown(options=['指定なし']+list(range(95)), value='指定なし', description='輪郭/髪:')
qr_hair_color_widget = widgets.Dropdown(options=['指定なし']+list(range(12)), value='指定なし', description='髪色:')
qr_face_color_widget = widgets.Dropdown(options=['指定なし']+list(range(11)), value='指定なし', description='肌色:')
scylla_hair_color_widget = widgets.Dropdown(options=['指定なし']+list(range(25)), value='指定なし', description='髪色:')
hyperion_hair_color_widget = widgets.Dropdown(options=['指定なし']+list(range(25)), value='指定なし', description='髪色:')
register_hair_color_widget = widgets.Dropdown(options=['指定なし']+list(range(25)), value='指定なし', description='髪色:')
scylla_face_color_widget = widgets.Dropdown(options=['指定なし']+list(range(16)), value='指定なし', description='肌色:')
hyperion_face_color_widget = widgets.Dropdown(options=['指定なし']+list(range(16)), value='指定なし', description='肌色:')
register_face_color_widget = widgets.Dropdown(options=['指定なし']+list(range(16)), value='指定なし', description='肌色:')
qr_eyes_widget = widgets.Dropdown(options=['指定なし']+list(range(68)), value='指定なし', description='目:')
qr_mouth_widget = widgets.Dropdown(options=['指定なし']+list(range(71)), value='指定なし', description='口:')
qr_nose_widget = widgets.Dropdown(options=['指定なし']+list(range(42)), value='指定なし', description='鼻:')
qr_brows_widget = widgets.Dropdown(options=['指定なし']+list(range(39)), value='指定なし', description='眉:')
qr_cheek_widget = widgets.Dropdown(options=['指定なし']+list(range(14)), value='指定なし', description='頬:')
scylla_eyes_widget = widgets.Dropdown(options=['指定なし']+list(range(68)), value='指定なし', description='目:')
scylla_mouth_widget = widgets.Dropdown(options=['指定なし']+list(range(71)), value='指定なし', description='口:')
scylla_nose_widget = widgets.Dropdown(options=['指定なし']+list(range(42)), value='指定なし', description='鼻:')
scylla_brows_widget = widgets.Dropdown(options=['指定なし']+list(range(39)), value='指定なし', description='眉:')
scylla_cheek_widget = widgets.Dropdown(options=['指定なし']+list(range(14)), value='指定なし', description='頬:')
hyperion_eyes_widget = widgets.Dropdown(options=['指定なし']+list(range(68)), value='指定なし', description='目:')
hyperion_mouth_widget = widgets.Dropdown(options=['指定なし']+list(range(71)), value='指定なし', description='口:')
hyperion_nose_widget = widgets.Dropdown(options=['指定なし']+list(range(42)), value='指定なし', description='鼻:')
hyperion_brows_widget = widgets.Dropdown(options=['指定なし']+list(range(39)), value='指定なし', description='眉:')
hyperion_cheek_widget = widgets.Dropdown(options=['指定なし']+list(range(14)), value='指定なし', description='頬:')
register_eyes_widget = widgets.Dropdown(options=['指定なし']+list(range(68)), value='指定なし', description='目:')
register_mouth_widget = widgets.Dropdown(options=['指定なし']+list(range(71)), value='指定なし', description='口:')
register_nose_widget = widgets.Dropdown(options=['指定なし']+list(range(42)), value='指定なし', description='鼻:')
register_brows_widget = widgets.Dropdown(options=['指定なし']+list(range(39)), value='指定なし', description='眉:')
register_cheek_widget = widgets.Dropdown(options=['指定なし']+list(range(14)), value='指定なし', description='頬:')
#text_mode_checkbox = widgets.Checkbox(value=True,description='html',disabled=False,indent=False)
search_button = widgets.Button(description="検索実行", button_style='info', icon='search')
results_count_label = widgets.Label(value="")
output_areaS = widgets.Output(layout=widgets.Layout(
height='480px',
overflow='scroll',
border='1px solid #ccc',
padding='5px'
))
def reload_input_files():
op1=qr_file_input1_widget.value
qr_file_input1_widget.options=get_files()
if op1 in qr_file_input1_widget.options:
qr_file_input1_widget.value=op1
op1=scylla_file_input1_widget.value
scylla_file_input1_widget.options=get_files()
if op1 in scylla_file_input1_widget.options:
scylla_file_input1_widget.value=op1
op1=hyperion_file_input1_widget.value
op2=hyperion_file_input2_widget.value
hyperion_file_input1_widget.options=get_files()
hyperion_file_input2_widget.options=get_files()
if op1 in hyperion_file_input1_widget.options:
hyperion_file_input1_widget.value=op1
if op2 in hyperion_file_input2_widget.options:
hyperion_file_input2_widget.value=op2
def itlhs(n: int) -> str:
byte_data = n.to_bytes(4, 'little')
hex_string = byte_data.hex()
return hex_string
def on_search_button_clicked(b):
global global_results
results_count_label.value = "検索中..."
play_js=f"""document.getElementById('bgm').currentTime = 0;document.getElementById('bgm').play();"""
#display(Javascript(play_js))
with output_areaS:
if mode_selector.value == '簡易検索':
clear_output(wait=True)
input1_val=qr_file_input1_widget.value if qr_file_input1_widget.value else "qr"
rsid_val = qr_rsid_widget.value if qr_rsid_widget.value else None
name_val = qr_name_widget.value if qr_name_widget.value else None
skill_group_val = qr_skill_group_widget.value if qr_skill_group_widget.value != '指定なし' else None
body_val = qr_body_widget.value if qr_body_widget.value != '指定なし' else None
color_val = qr_color_widget.value if qr_color_widget.value != '指定なし' else None
head_val = qr_head_widget.value if qr_head_widget.value != '指定なし' else None
pair_val = qr_pair_widget.value if qr_pair_widget.value != '指定なし' else None
face_type_val=qr_face_type_widget.value if qr_face_type_widget.value!='指定なし' else None
face_color_val=qr_face_color_widget.value if qr_face_color_widget.value!='指定なし' else None
hair_color_val=qr_hair_color_widget.value if qr_hair_color_widget.value!='指定なし' else None
eyes_val=qr_eyes_widget.value if qr_eyes_widget.value!='指定なし' else None
mouth_val=qr_mouth_widget.value if qr_mouth_widget.value!='指定なし' else None
nose_val=qr_nose_widget.value if qr_nose_widget.value!='指定なし' else None
brows_val=qr_brows_widget.value if qr_brows_widget.value!='指定なし' else None
cheek_val=qr_cheek_widget.value if qr_cheek_widget.value!='指定なし' else None
t="input1="+input1_val+";output=scylla;"
if rsid_val:
t+="rsid="+rsid_val+";"
if name_val and name_val in name_map:
t+="name="+str(name_map[name_val])+";"
if skill_group_val!=None:
t+="skill_group="+str(skill_group_map[skill_group_val])+";"
if body_val!=None:
t+="body="+str(body_map[body_val])+";"
if color_val!=None:
t+="body_color1="+(",".join([str(c) for c in body_color_map2[color_val]]))+";"
if head_val!=None:
t+="head="+str(head_map[head_val])+";"
if pair_val!=None:
t+="pair_param="+str({"なし":0,"双子":1,"親子":2}[pair_val])+";"
if face_type_val!=None:
t+="face_type="+str(face_type_val)+";"
if face_color_val!=None:
t+="face_color="+str(FaceColorIdList[face_color_val])+";"
if hair_color_val!=None:
t+="hair_color="+str(HairColorIdList[hair_color_val])+";"
if eyes_val!=None:
t+="eyes="+str(eyes_val)+";"
if mouth_val!=None:
t+="mouth="+str(mouth_val)+";"
if nose_val!=None:
t+="nose="+str(nose_val)+";"
if brows_val!=None:
t+="brows="+str(brows_val)+";"
if cheek_val!=None:
t+="cheek="+str(cheek_val)+";"
run_result = subprocess.run([f"./Hyperion","scylla",t], capture_output=True, text=True)
run_result = subprocess.run([f"./Hyperion","json","scylla"], capture_output=True, text=True)
results = json.loads(run_result.stdout.strip())
global_results=results
if len(results["bps"])-results['index']==0:
results_count_label.value = "虚無が見つかりました"
else:
results_count_label.value = f"{results['size']-results['index']} 体見つかりました"
if text_mode_checkbox.value:
print_html(results)
else:
print_text(results)
elif mode_selector.value == '絞り込み':
if not scylla_file_output_widget.value or scylla_file_output_widget.value in ["","qr"]:
results_count_label.value = "出力ファイル名を指定してください"
return
clear_output(wait=True)
input1_val=scylla_file_input1_widget.value if scylla_file_input1_widget.value else "qr"
output_val=scylla_file_output_widget.value
rsid_val = scylla_rsid_widget.value if scylla_rsid_widget.value else None
name_val = scylla_name_widget.value if scylla_name_widget.value else None
skill_group_val = scylla_skill_group_widget.value if scylla_skill_group_widget.value != '指定なし' else None
body_val = scylla_body_widget.value if scylla_body_widget.value != '指定なし' else None
color1_val = scylla_color_widget1.value if scylla_color_widget1.value != '指定なし' else None
color2_val = scylla_color_widget2.value if scylla_color_widget2.value != '指定なし' else None
color_swap_val = scylla_color_enable_swap_widget.value
pattern_val = scylla_pattern_widget.value if scylla_pattern_widget.value != '指定なし' else None
head_val = scylla_head_widget.value if scylla_head_widget.value != '指定なし' else None
face_type_val=scylla_face_type_widget.value if scylla_face_type_widget.value!='指定なし' else None
face_color_val=scylla_face_color_widget.value if scylla_face_color_widget.value!='指定なし' else None
hair_color_val=scylla_hair_color_widget.value if scylla_hair_color_widget.value!='指定なし' else None
eyes_val=scylla_eyes_widget.value if scylla_eyes_widget.value!='指定なし' else None
mouth_val=scylla_mouth_widget.value if scylla_mouth_widget.value!='指定なし' else None
nose_val=scylla_nose_widget.value if scylla_nose_widget.value!='指定なし' else None
brows_val=scylla_brows_widget.value if scylla_brows_widget.value!='指定なし' else None
cheek_val=scylla_cheek_widget.value if scylla_cheek_widget.value!='指定なし' else None
ability_val=scylla_ability_widget.value if scylla_ability_widget.value!='指定なし' else None
t="input1="+input1_val+";output="+output_val+";"
if rsid_val:
t+="rsid="+rsid_val+";"
if name_val and name_val in name_map:
t+="name="+str(name_map[name_val])+";"
if skill_group_val!=None:
t+="skill_group="+str(skill_group_map[skill_group_val])+";"
if body_val!=None:
t+="body="+str(body_map[body_val])+";"
if color1_val!=None:
t+="body_color1="+(",".join([str(c) for c in body_color_map2[color1_val]]))+";"
if color2_val!=None and pattern_val!=None and pattern_val!="なし":
t+="body_color2="+(",".join([str(c) for c in body_color_map2[color2_val]]))+";"
if color_swap_val:
t+="body_color_swap=1;"
else:
t+="body_color_swap=0;"
if pattern_val!=None:
t+="body_pattern="+(",".join([str(c) for c in body_pattern_map2[pattern_val]]))+";"
if head_val!=None:
t+="head="+str(head_map[head_val])+";"
if face_type_val!=None:
t+="face_type="+str(face_type_val)+";"
if face_color_val!=None:
t+="face_color="+str(FaceColorIdList[face_color_val])+";"
if hair_color_val!=None:
t+="hair_color="+str(HairColorIdList[hair_color_val])+";"
if eyes_val!=None:
t+="eyes="+str(eyes_val)+";"
if mouth_val!=None:
t+="mouth="+str(mouth_val)+";"
if nose_val!=None:
t+="nose="+str(nose_val)+";"
if brows_val!=None:
t+="brows="+str(brows_val)+";"
if cheek_val!=None:
t+="cheek="+str(cheek_val)+";"
if ability_val!=None:
t+="ability1="+str(ability_map[ability_val])+";"
run_result = subprocess.run([f"./Hyperion","scylla",t], capture_output=True, text=True)
run_result = subprocess.run([f"./Hyperion","json",output_val], capture_output=True, text=True)
results = json.loads(run_result.stdout.strip())
global_results=results
if len(results["bps"])-results['index']==0:
results_count_label.value = "虚無が見つかりました"
else:
results_count_label.value = f"{results['size']-results['index']} 体見つかりました"
if text_mode_checkbox.value:
print_html(results)
else:
print_text(results)
elif mode_selector.value == '出生':
if not hyperion_file_output_widget.value or hyperion_file_output_widget.value in ["","qr"]:
results_count_label.value = "出力ファイル名を指定してください"
return
clear_output(wait=True)
input1_val=hyperion_file_input1_widget.value if hyperion_file_input1_widget.value else "qr"
input2_val=hyperion_file_input2_widget.value if hyperion_file_input2_widget.value else "qr"
input_swap_val=hyperion_file_enable_swap_widget.value
output_val=hyperion_file_output_widget.value
name_val = hyperion_name_widget.value if hyperion_name_widget.value else None
skill_group_val = hyperion_skill_group_widget.value if hyperion_skill_group_widget.value != '指定なし' else None
body_val = hyperion_body_widget.value if hyperion_body_widget.value != '指定なし' else None
color1_val = hyperion_color_widget1.value if hyperion_color_widget1.value != '指定なし' else None
color2_val = hyperion_color_widget2.value if hyperion_color_widget2.value != '指定なし' else None
color_swap_val = hyperion_color_enable_swap_widget.value
pattern_val = hyperion_pattern_widget.value if hyperion_pattern_widget.value != '指定なし' else None
head_val = hyperion_head_widget.value if hyperion_head_widget.value != '指定なし' else None
face_type_val=hyperion_face_type_widget.value if hyperion_face_type_widget.value!='指定なし' else None
face_color_val=hyperion_face_color_widget.value if hyperion_face_color_widget.value!='指定なし' else None
hair_color_val=hyperion_hair_color_widget.value if hyperion_hair_color_widget.value!='指定なし' else None
eyes_val=hyperion_eyes_widget.value if hyperion_eyes_widget.value!='指定なし' else None
mouth_val=hyperion_mouth_widget.value if hyperion_mouth_widget.value!='指定なし' else None
nose_val=hyperion_nose_widget.value if hyperion_nose_widget.value!='指定なし' else None
brows_val=hyperion_brows_widget.value if hyperion_brows_widget.value!='指定なし' else None
cheek_val=hyperion_cheek_widget.value if hyperion_cheek_widget.value!='指定なし' else None
ability_val=hyperion_ability_widget.value if hyperion_ability_widget.value!='指定なし' else None
over_100_val=hyperion_over_100_widget.value
t="input1="+input1_val+";input2="+input2_val+";output="+output_val+";"
if input_swap_val:
t+="enable_swap=1;"
else:
t+="enable_swap=0;"
if name_val and name_val in name_map:
t+="name="+str(name_map[name_val])+";"
if skill_group_val!=None:
t+="skill_group="+str(skill_group_map[skill_group_val])+";"
if body_val!=None:
t+="body="+str(body_map[body_val])+";"
if color1_val!=None:
t+="body_color1="+(",".join([str(c) for c in body_color_map2[color1_val]]))+";"
if color2_val!=None and pattern_val!=None and pattern_val!="なし":
t+="body_color2="+(",".join([str(c) for c in body_color_map2[color2_val]]))+";"
if color_swap_val:
t+="body_color_swap=1;"
else:
t+="body_color_swap=0;"
if pattern_val!=None:
t+="body_pattern="+(",".join([str(c) for c in body_pattern_map2[pattern_val]]))+";"
if head_val!=None:
t+="head="+str(head_map[head_val])+";"
if face_type_val!=None:
t+="face_type="+str(face_type_val)+";"
if face_color_val!=None:
t+="face_color="+str(FaceColorIdList[face_color_val])+";"
if hair_color_val!=None:
t+="hair_color="+str(HairColorIdList[hair_color_val])+";"
if eyes_val!=None:
t+="eyes="+str(eyes_val)+";"
if mouth_val!=None:
t+="mouth="+str(mouth_val)+";"
if nose_val!=None:
t+="nose="+str(nose_val)+";"
if brows_val!=None:
t+="brows="+str(brows_val)+";"
if cheek_val!=None:
t+="cheek="+str(cheek_val)+";"
if ability_val!=None:
t+="ability1="+str(ability_map[ability_val])+";"
if over_100_val:
t+="over_100=1;"
else:
t+="over_100=0;"
run_result = subprocess.run([f"./Hyperion","hyperion",t], capture_output=True, text=True)
run_result = subprocess.run([f"./Hyperion","json",output_val], capture_output=True, text=True)
results = json.loads(run_result.stdout.strip())
global_results=results
if len(results["bps"])-results['index']==0:
results_count_label.value = "虚無が見つかりました"
else:
results_count_label.value = f"{results['size']-results['index']} 体見つかりました"
if text_mode_checkbox.value:
print_html(results)
else:
print_text(results)
elif mode_selector.value == '個体登録':
if not register_file_output_widget.value or register_file_output_widget.value in ["","qr"]:
results_count_label.value = "出力ファイル名を指定してください"
return
clear_output(wait=True)
output_val=register_file_output_widget.value
name_val = register_name_widget.value if register_name_widget.value else None
skill_group_val = register_skill_group_widget.value if register_skill_group_widget.value != '指定なし' else None
body_val = register_body_widget.value if register_body_widget.value != '指定なし' else None
color1_val = register_color_widget1.value if register_color_widget1.value != '指定なし' else None
color2_val = register_color_widget2.value if register_color_widget2.value != '指定なし' else None
pattern_val = register_pattern_widget.value if register_pattern_widget.value != '指定なし' else None
head_val = register_head_widget.value if register_head_widget.value != '指定なし' else None
face_type_val=register_face_type_widget.value if register_face_type_widget.value!='指定なし' else None
face_color_val=register_face_color_widget.value if register_face_color_widget.value!='指定なし' else None
hair_color_val=register_hair_color_widget.value if register_hair_color_widget.value!='指定なし' else None
eyes_val=register_eyes_widget.value if register_eyes_widget.value!='指定なし' else None
mouth_val=register_mouth_widget.value if register_mouth_widget.value!='指定なし' else None
nose_val=register_nose_widget.value if register_nose_widget.value!='指定なし' else None
brows_val=register_brows_widget.value if register_brows_widget.value!='指定なし' else None
cheek_val=register_cheek_widget.value if register_cheek_widget.value!='指定なし' else None
ability_val=register_ability_widget.value if register_ability_widget.value!='指定なし' else None
birth_count_val=register_birth_count_widget.value
if name_val==None or skill_group_val==None or body_val==None or color1_val==None or pattern_val==None or (body_pattern_map2[pattern_val][0]!=0x8000000e and color2_val==None) or\
head_val==None or face_type_val==None or face_color_val==None or hair_color_val==None or eyes_val==None or mouth_val==None or\
nose_val==None or brows_val==None or cheek_val==None or ability_val==None:
results_count_label.value = "すべて指定してください"
return
bps_data=""
bps_data+=itlhs(0)
bps_data+=itlhs(head_map[head_val])
bps_data+=itlhs(int(face_type_val))
bps_data+=itlhs(FaceColorIdList[face_color_val])
bps_data+=itlhs(HairColorIdList[hair_color_val])
bps_data+=itlhs(int(eyes_val))
bps_data+=itlhs(int(mouth_val))
bps_data+=itlhs(int(nose_val))
bps_data+=itlhs(int(brows_val))
bps_data+=itlhs(int(cheek_val))
bps_data+=itlhs(body_map[body_val])
bps_data+=itlhs(body_color_map2[color1_val][0])
if body_pattern_map2[pattern_val][0]!=0x8000000e:
bps_data+=itlhs(body_color_map2[color2_val][0])
else:
bps_data+=itlhs(0)
bps_data+=itlhs(0)
bps_data+=itlhs(body_pattern_map2[pattern_val][0])
bps_data+=itlhs(0)
bps_data+=itlhs(0)
bps_data+=itlhs(0)
bps_data+=itlhs(0)
bps_data+=itlhs(0)
bps_data+=itlhs(0)
bps_data+=itlhs(0)
bps_data+=itlhs(0)
bps_data+=itlhs(name_map[name_val])
bps_data+=itlhs(skill_group_map[skill_group_val])
bps_data+=itlhs(birth_count_val)
#print(output_val,bps_data,ability_val)
run_command = [f"./Hyperion","register",output_val,bps_data,str(ability_map[ability_val])]
run_result = subprocess.run(run_command, capture_output=True, text=True)
run_result = subprocess.run([f"./Hyperion","json",output_val], capture_output=True, text=True)
results = json.loads(run_result.stdout.strip())
global_results=results
if len(results["bps"])-results['index']==0:
results_count_label.value = "虚無が見つかりました"
else:
results_count_label.value = f"{results['size']-results['index']} 体登録しました"
if text_mode_checkbox.value:
print_html(results)
else:
print_text(results)
#print(name_val,name_map[name_val])
reload_input_files()
search_button.on_click(on_search_button_clicked)
mode_selector = widgets.RadioButtons(
options=['簡易検索', '絞り込み','出生','個体登録'],
description='モード:',
value='簡易検索',
disabled=False,
layout=widgets.Layout(width='auto')
)
qr_search_box=widgets.VBox([
qr_file_input1_widget,
widgets.HBox([
widgets.VBox([
qr_rsid_widget,
qr_name_widget,
qr_skill_group_widget,
qr_head_widget,
qr_body_widget,
qr_color_widget,
qr_pair_widget
]),widgets.VBox([
qr_face_type_widget,
qr_hair_color_widget,
qr_face_color_widget,
qr_eyes_widget,
qr_mouth_widget,
qr_nose_widget,
qr_brows_widget,
qr_cheek_widget
])])])
scylla_box=widgets.VBox([
widgets.HBox([
scylla_file_input1_widget
]),
scylla_file_output_widget,
widgets.HBox([
widgets.VBox([
scylla_rsid_widget,
scylla_name_widget,
scylla_skill_group_widget,
scylla_head_widget,
scylla_body_widget,
scylla_pattern_widget,
scylla_color_widget1,
scylla_color_widget2,
scylla_color_enable_swap_widget
]),widgets.VBox([
scylla_face_type_widget,
scylla_hair_color_widget,
scylla_face_color_widget,
scylla_eyes_widget,
scylla_mouth_widget,
scylla_nose_widget,
scylla_brows_widget,
scylla_cheek_widget
]),widgets.VBox([
scylla_ability_widget])])])
scylla_box.layout.display = 'none'
hyperion_box=widgets.VBox([
widgets.HBox([
hyperion_file_input1_widget,
hyperion_file_input2_widget,
hyperion_file_enable_swap_widget
]),
hyperion_file_output_widget,
widgets.HBox([
widgets.VBox([
hyperion_name_widget,
hyperion_skill_group_widget,
hyperion_head_widget,
hyperion_body_widget,
hyperion_pattern_widget,
hyperion_color_widget1,
hyperion_color_widget2,
hyperion_color_enable_swap_widget,
]),widgets.VBox([
hyperion_face_type_widget,
hyperion_hair_color_widget,
hyperion_face_color_widget,
hyperion_eyes_widget,
hyperion_mouth_widget,
hyperion_nose_widget,
hyperion_brows_widget,
hyperion_cheek_widget
]),widgets.VBox([
hyperion_ability_widget,
hyperion_over_100_widget])])])
hyperion_box.layout.display = 'none'
register_box=widgets.VBox([
register_file_output_widget,
widgets.HBox([
widgets.VBox([
register_name_widget,
register_skill_group_widget,
register_head_widget,
register_body_widget,
register_pattern_widget,
register_color_widget1,
register_color_widget2
]),widgets.VBox([
register_face_type_widget,
register_hair_color_widget,
register_face_color_widget,
register_eyes_widget,
register_mouth_widget,
register_nose_widget,
register_brows_widget,
register_cheek_widget
]),widgets.VBox([
register_ability_widget,
register_birth_count_widget])
])])
register_box.layout.display = 'none'
def on_mode_change(change):
if change.new == '簡易検索':
qr_search_box.layout.display = 'flex'
scylla_box.layout.display = 'none'
hyperion_box.layout.display='none'
register_box.layout.display = 'none'
elif change.new == '個体登録':
qr_search_box.layout.display = 'none'
scylla_box.layout.display = 'none'
hyperion_box.layout.display='none'
register_box.layout.display = 'flex'
else:
#if change.old == '簡易検索' or change.old=='個体登録':
if change.new == '絞り込み':
qr_search_box.layout.display = 'none'
scylla_box.layout.display = 'flex'
hyperion_box.layout.display='none'
register_box.layout.display = 'none'
elif change.new == '出生':
qr_search_box.layout.display = 'none'
scylla_box.layout.display = 'none'
hyperion_box.layout.display='flex'
register_box.layout.display = 'none'
mode_selector.observe(on_mode_change, names='value')
def scylla_pattern_widget_observe(change):
if change.new in ['なし','指定なし']:
scylla_color_widget2.layout.display='none'
scylla_color_enable_swap_widget.layout.display='none'
else:
scylla_color_widget2.layout.display='flex'
scylla_color_enable_swap_widget.layout.display='flex'
scylla_color_enable_swap_widget.layout.display='none'
scylla_color_widget2.layout.display='none'
scylla_pattern_widget.observe(scylla_pattern_widget_observe,names='value')
def hyperion_pattern_widget_observe(change):
if change.new in ['なし','指定なし']:
hyperion_color_widget2.layout.display='none'
hyperion_color_enable_swap_widget.layout.display='none'
else:
hyperion_color_widget2.layout.display='flex'
hyperion_color_enable_swap_widget.layout.display='flex'
hyperion_color_enable_swap_widget.layout.display='none'
hyperion_color_widget2.layout.display='none'
hyperion_pattern_widget.observe(hyperion_pattern_widget_observe,names='value')
def register_pattern_widget_observe(change):
if change.new in ['なし','指定なし']:
register_color_widget2.layout.display='none'
else:
register_color_widget2.layout.display='flex'
register_color_widget2.layout.display='none'
register_pattern_widget.observe(register_pattern_widget_observe,names='value')
def qr_search_observe(change):
print(change.new)
if change.new=="qr":
qr_skill_group_widget.options=qr_skill_group_options
qr_head_widget.options=qr_head_options
qr_color_widget.options=qr_color_options
qr_pair_widget.options=pair_options
qr_hair_color_widget.options=['指定なし']+list(range(12))
qr_face_color_widget.options=['指定なし']+list(range(11))
else:
qr_skill_group_widget.options=skill_group_options
qr_head_widget.options=head_options
qr_color_widget.options=color_options1
qr_pair_widget.options=pair_options
qr_hair_color_widget.options=['指定なし']+list(range(25))
qr_face_color_widget.options=['指定なし']+list(range(16))
qr_file_input1_widget.observe(qr_search_observe,names='value')
text_mode_checkbox = widgets.Checkbox(value=True,description='html',disabled=False,indent=False)
bgm_url="https://cdn.discordapp.com/attachments/1432387194861129798/1433094555598590005/Mixdown.mp3?ex=690370cf&is=69021f4f&hm=65843719a1e6383334fc05eb98347bacccbdfbcd402089b3744e478d90d80693&"
audio_html=widgets.HTML(f"""<audio id="bgm" src="{bgm_url}" preload="auto">お使いのブラウザはaudioタグをサポートしていません。</audio>""")
bgm_url2="https://cdn.discordapp.com/attachments/1432387194861129798/1433103438564163604/110._Spirit_ShrineTdmf.mp3?ex=69037915&is=69022795&hm=11785713ca092e32b2cb321ed0a14b410f045e5c4cfc10e4849b063fd8f21101&"
audio_html2=widgets.HTML(f"""<audio id="bgm2" src="{bgm_url2}" preload="auto">お使いのブラウザはaudioタグをサポートしていません。</audio>""")
gui = widgets.VBox([
mode_selector,
qr_search_box,
scylla_box,
hyperion_box,
register_box,
widgets.HBox([
search_button,
results_count_label,
text_mode_checkbox,
]),
output_areaS,
#audio_html,
#audio_html2
])
clear_output(wait=True)
display(gui)
play_js2=f"""document.getElementById('bgm2').currentTime = 0;document.getElementById('bgm2').play();"""
#display(Javascript(play_js2))