This commit is contained in:
xl3lackout
2022-02-25 19:44:26 -05:00
commit a92897404a
690 changed files with 70775 additions and 0 deletions

2
.gitattributes vendored Normal file
View File

@@ -0,0 +1,2 @@
# Auto detect text files and perform LF normalization
* text=auto

View File

@@ -0,0 +1,911 @@
10,6,1,2146,25,1,0,0,1,1,0,1,0,0
10,6,2,2147,25,1,0,0,1,1,0,1,0,0
10,6,3,2148,25,1,0,0,1,1,0,1,0,0
10,6,4,2149,25,1,0,0,1,1,0,1,0,0
10,6,5,2150,25,1,0,0,1,1,0,1,0,0
10,6,6,2151,25,1,0,0,1,1,0,1,0,0
10,6,7,2152,25,1,0,0,1,1,0,1,0,0
10,6,8,2153,25,1,0,0,1,1,0,1,0,0
10,6,9,2154,25,1,0,0,1,1,0,1,0,0
10,6,10,2155,25,1,0,0,1,1,0,1,0,0
10,6,11,4398,25,1,0,0,1,1,0,1,0,0
10,6,12,12460,25,1,0,0,1,1,0,1,0,0
10,6,13,12461,25,1,0,0,1,1,0,1,0,0
10,6,14,12462,25,1,0,0,1,1,0,1,0,0
10,6,15,12463,25,1,0,0,1,1,0,1,0,0
10,6,16,12464,25,1,0,0,1,1,0,1,0,0
10,6,17,12465,25,1,0,0,1,1,0,1,0,0
10,6,18,12466,25,1,0,0,1,1,0,1,0,0
10,6,19,12467,25,1,0,0,1,1,0,1,0,0
10,6,20,12468,25,1,0,0,1,1,0,1,0,0
10,6,21,12469,25,1,0,0,1,1,0,1,0,0
10,6,22,15109,1000,1,0,0,1,1,0,1,0,0
10,6,23,15110,1000,1,0,0,1,1,0,1,0,0
10,6,24,2158,200,100,0,0,1,1,0,1,0,0
10,6,25,12306,2,1,0,0,1,1,0,1,80,0
10,6,26,12306,20000,10000,0,0,1,1,0,1,80,0
10,4,27,11664,20000,1,0,0,1,1,0,1,0,0
10,4,28,11665,20000,1,0,0,1,1,0,1,0,0
10,4,29,11666,20000,1,0,0,1,1,0,1,0,0
10,4,30,11667,20000,1,0,0,1,1,0,1,0,0
10,4,31,11668,20000,1,0,0,1,1,0,1,0,0
10,4,32,11669,20000,1,0,0,1,1,0,1,0,0
10,4,33,11670,20000,1,0,0,1,1,0,1,0,0
10,4,34,11671,20000,1,0,0,1,1,0,1,0,0
10,4,35,11672,20000,1,0,0,1,1,0,1,0,0
10,4,36,11673,20000,1,0,0,1,1,0,1,0,0
10,4,37,11674,20000,1,0,0,1,1,0,1,0,0
10,4,38,11675,20000,1,0,0,1,1,0,1,0,0
10,4,39,11676,20000,1,0,0,1,1,0,1,0,0
10,4,40,11677,20000,1,0,0,1,1,0,1,0,0
10,4,41,11678,20000,1,0,0,1,1,0,1,0,0
10,4,42,11679,20000,1,0,0,1,1,0,1,0,0
10,4,43,11680,20000,1,0,0,1,1,0,1,0,0
10,4,44,11681,20000,1,0,0,1,1,0,1,0,0
10,4,45,11682,20000,1,0,0,1,1,0,1,0,0
10,4,46,11683,20000,1,0,0,1,1,0,1,0,0
10,4,47,11684,20000,1,0,0,1,1,0,1,0,0
10,4,48,11685,20000,1,0,0,1,1,0,1,0,0
10,4,49,11686,20000,1,0,0,1,1,0,1,0,0
10,4,50,11687,20000,1,0,0,1,1,0,1,0,0
10,4,51,11688,20000,1,0,0,1,1,0,1,0,0
10,4,52,11689,20000,1,0,0,1,1,0,1,0,0
10,4,53,11690,20000,1,0,0,1,1,0,1,0,0
10,4,54,11691,20000,1,0,0,1,1,0,1,0,0
10,4,55,11692,20000,1,0,0,1,1,0,1,0,0
10,4,56,11693,20000,1,0,0,1,1,0,1,0,0
10,4,57,11694,20000,1,0,0,1,1,0,1,0,0
10,4,58,11695,20000,1,0,0,1,1,0,1,0,0
10,4,59,11696,20000,1,0,0,1,1,0,1,0,0
10,4,60,11697,20000,1,0,0,1,1,0,1,0,0
10,4,61,12893,20000,1,0,0,1,1,0,1,0,0
10,4,62,12894,20000,1,0,0,1,1,0,1,0,0
10,4,63,12895,20000,1,0,0,1,1,0,1,0,0
10,4,64,12896,20000,1,0,0,1,1,0,1,0,0
10,4,65,12897,20000,1,0,0,1,1,0,1,0,0
10,4,66,12898,20000,1,0,0,1,1,0,1,0,0
10,4,67,12899,20000,1,0,0,1,1,0,1,0,0
10,4,68,14337,20000,1,0,0,1,1,0,1,0,0
10,4,69,14338,20000,1,0,0,1,1,0,1,0,0
10,4,70,14339,20000,1,0,0,1,1,0,1,0,0
10,4,71,14340,20000,1,0,0,1,1,0,1,0,0
10,4,72,14341,20000,1,0,0,1,1,0,1,0,0
10,4,73,14342,20000,1,0,0,1,1,0,1,0,0
10,4,74,14343,20000,1,0,0,1,1,0,1,0,0
10,4,75,14344,20000,1,0,0,1,1,0,1,0,0
10,4,76,14345,20000,1,0,0,1,1,0,1,0,0
10,4,77,9254,10000,1,0,0,1,1,0,1,0,0
10,4,78,9255,10000,1,0,0,1,1,0,1,0,0
10,4,79,9256,10000,1,0,0,1,1,0,1,0,0
10,4,80,9257,10000,1,0,0,1,1,0,1,0,0
10,4,81,9258,10000,1,0,0,1,1,0,1,0,0
10,4,82,9259,10000,1,0,0,1,1,0,1,0,0
10,4,83,9260,10000,1,0,0,1,1,0,1,0,0
10,4,84,9261,10000,1,0,0,1,1,0,1,0,0
10,4,85,9262,10000,1,0,0,1,1,0,1,0,0
10,4,86,9263,10000,1,0,0,1,1,0,1,0,0
10,4,87,9264,10000,1,0,0,1,1,0,1,0,0
10,4,88,9265,10000,1,0,0,1,1,0,1,0,0
10,4,89,9266,10000,1,0,0,1,1,0,1,0,0
10,4,90,9267,10000,1,0,0,1,1,0,1,0,0
10,4,91,9268,10000,1,0,0,1,1,0,1,0,0
10,4,92,9269,10000,1,0,0,1,1,0,1,0,0
10,4,93,9270,10000,1,0,0,1,1,0,1,0,0
10,4,94,9271,10000,1,0,0,1,1,0,1,0,0
10,4,95,9272,10000,1,0,0,1,1,0,1,0,0
10,4,96,9273,10000,1,0,0,1,1,0,1,0,0
10,4,97,9274,10000,1,0,0,1,1,0,1,0,0
10,4,98,9275,10000,1,0,0,1,1,0,1,0,0
10,4,99,9276,10000,1,0,0,1,1,0,1,0,0
10,4,100,9277,10000,1,0,0,1,1,0,1,0,0
10,4,101,9278,10000,1,0,0,1,1,0,1,0,0
10,4,102,9279,10000,1,0,0,1,1,0,1,0,0
10,4,103,9280,10000,1,0,0,1,1,0,1,0,0
10,4,104,9281,10000,1,0,0,1,1,0,1,0,0
10,4,105,9282,10000,1,0,0,1,1,0,1,0,0
10,4,106,9283,10000,1,0,0,1,1,0,1,0,0
10,4,107,9284,10000,1,0,0,1,1,0,1,0,0
10,4,108,9285,10000,1,0,0,1,1,0,1,0,0
10,4,109,9286,10000,1,0,0,1,1,0,1,0,0
10,4,110,9287,10000,1,0,0,1,1,0,1,0,0
10,4,111,9288,10000,1,0,0,1,1,0,1,0,0
10,4,112,9289,10000,1,0,0,1,1,0,1,0,0
10,4,113,9290,10000,1,0,0,1,1,0,1,0,0
10,4,114,9291,10000,1,0,0,1,1,0,1,0,0
10,4,115,9292,10000,1,0,0,1,1,0,1,0,0
10,4,116,9293,10000,1,0,0,1,1,0,1,0,0
10,4,117,9294,10000,1,0,0,1,1,0,1,0,0
10,4,118,9295,10000,1,0,0,1,1,0,1,0,0
10,4,119,9296,10000,1,0,0,1,1,0,1,0,0
10,4,120,9297,10000,1,0,0,1,1,0,1,0,0
10,4,121,9298,10000,1,0,0,1,1,0,1,0,0
10,4,122,9299,10000,1,0,0,1,1,0,1,0,0
10,4,123,9300,10000,1,0,0,1,1,0,1,0,0
10,4,124,9301,10000,1,0,0,1,1,0,1,0,0
10,4,125,13196,10000,1,0,0,1,1,0,1,0,0
10,4,126,13197,10000,1,0,0,1,1,0,1,0,0
10,4,127,13198,10000,1,0,0,1,1,0,1,0,0
10,4,128,13199,10000,1,0,0,1,1,0,1,0,0
10,4,129,15542,10000,1,0,0,1,1,0,1,0,0
10,4,130,15543,10000,1,0,0,1,1,0,1,0,0
10,4,131,15544,10000,1,0,0,1,1,0,1,0,0
10,4,132,15545,10000,1,0,0,1,1,0,1,0,0
10,4,133,13640,20000,1,0,0,1,1,0,1,0,0
10,4,134,13641,20000,1,0,0,1,1,0,1,0,0
10,4,135,13642,20000,1,0,0,1,1,0,1,0,0
10,4,136,13643,20000,1,0,0,1,1,0,1,0,0
10,4,137,13644,20000,1,0,0,1,1,0,1,0,0
10,4,138,13645,20000,1,0,0,1,1,0,1,0,0
10,4,139,13646,20000,1,0,0,1,1,0,1,0,0
10,4,140,13647,20000,1,0,0,1,1,0,1,0,0
10,4,141,13648,20000,1,0,0,1,1,0,1,0,0
10,4,142,13649,20000,1,0,0,1,1,0,1,0,0
10,4,143,13650,20000,1,0,0,1,1,0,1,0,0
10,4,144,13651,20000,1,0,0,1,1,0,1,0,0
10,4,145,13652,20000,1,0,0,1,1,0,1,0,0
10,4,146,13653,20000,1,0,0,1,1,0,1,0,0
10,4,147,13654,20000,1,0,0,1,1,0,1,0,0
10,4,148,13655,20000,1,0,0,1,1,0,1,0,0
10,4,149,13656,20000,1,0,0,1,1,0,1,0,0
10,4,150,13657,20000,1,0,0,1,1,0,1,0,0
10,4,151,13658,20000,1,0,0,1,1,0,1,0,0
10,4,152,13659,20000,1,0,0,1,1,0,1,0,0
10,4,153,13660,20000,1,0,0,1,1,0,1,0,0
10,4,154,13661,20000,1,0,0,1,1,0,1,0,0
10,4,155,13662,20000,1,0,0,1,1,0,1,0,0
10,4,156,13663,20000,1,0,0,1,1,0,1,0,0
10,4,157,13664,20000,1,0,0,1,1,0,1,0,0
10,4,158,13665,20000,1,0,0,1,1,0,1,0,0
10,4,159,13666,20000,1,0,0,1,1,0,1,0,0
10,4,160,13667,20000,1,0,0,1,1,0,1,0,0
10,4,161,13668,20000,1,0,0,1,1,0,1,0,0
10,4,162,13669,20000,1,0,0,1,1,0,1,0,0
10,4,163,13670,20000,1,0,0,1,1,0,1,0,0
10,4,164,13671,20000,1,0,0,1,1,0,1,0,0
10,4,165,13672,20000,1,0,0,1,1,0,1,0,0
10,4,166,13673,20000,1,0,0,1,1,0,1,0,0
10,4,167,13674,20000,1,0,0,1,1,0,1,0,0
10,4,168,13675,20000,1,0,0,1,1,0,1,0,0
10,4,169,13676,20000,1,0,0,1,1,0,1,0,0
10,4,170,13677,20000,1,0,0,1,1,0,1,0,0
10,4,171,13678,20000,1,0,0,1,1,0,1,0,0
10,4,172,13679,20000,1,0,0,1,1,0,1,0,0
10,4,173,13680,20000,1,0,0,1,1,0,1,0,0
10,4,174,13681,20000,1,0,0,1,1,0,1,0,0
10,4,175,13682,20000,1,0,0,1,1,0,1,0,0
10,4,176,13683,20000,1,0,0,1,1,0,1,0,0
10,4,177,13684,20000,1,0,0,1,1,0,1,0,0
10,4,178,13685,20000,1,0,0,1,1,0,1,0,0
10,4,179,13686,20000,1,0,0,1,1,0,1,0,0
10,4,180,13687,20000,1,0,0,1,1,0,1,0,0
10,4,181,13688,20000,1,0,0,1,1,0,1,0,0
10,4,182,13689,20000,1,0,0,1,1,0,1,0,0
10,4,183,13690,20000,1,0,0,1,1,0,1,0,0
10,4,184,13691,20000,1,0,0,1,1,0,1,0,0
10,4,185,15546,20000,1,0,0,1,1,0,1,0,0
10,4,186,15547,20000,1,0,0,1,1,0,1,0,0
10,4,187,15548,20000,1,0,0,1,1,0,1,0,0
10,4,188,15549,20000,1,0,0,1,1,0,1,0,0
10,4,189,16162,35000,1,0,0,1,1,0,1,0,0
10,4,190,16163,35000,1,0,0,1,1,0,1,0,0
10,4,191,16164,35000,1,0,0,1,1,0,1,0,0
10,4,192,16165,35000,1,0,0,1,1,0,1,0,0
10,4,193,16166,35000,1,0,0,1,1,0,1,0,0
10,4,194,16167,35000,1,0,0,1,1,0,1,0,0
10,4,195,16168,35000,1,0,0,1,1,0,1,0,0
10,4,196,16169,35000,1,0,0,1,1,0,1,0,0
10,4,197,16172,35000,1,0,0,1,1,0,1,0,0
10,4,198,16173,35000,1,0,0,1,1,0,1,0,0
10,4,199,16174,35000,1,0,0,1,1,0,1,0,0
10,4,200,16175,35000,1,0,0,1,1,0,1,0,0
10,4,201,16176,35000,1,0,0,1,1,0,1,0,0
10,4,202,16177,35000,1,0,0,1,1,0,1,0,0
10,4,203,16178,35000,1,0,0,1,1,0,1,0,0
10,4,204,16179,35000,1,0,0,1,1,0,1,0,0
10,4,205,16182,35000,1,0,0,1,1,0,1,0,0
10,4,206,16183,35000,1,0,0,1,1,0,1,0,0
10,4,207,16184,35000,1,0,0,1,1,0,1,0,0
10,4,208,16185,35000,1,0,0,1,1,0,1,0,0
10,4,209,16186,35000,1,0,0,1,1,0,1,0,0
10,4,210,16187,35000,1,0,0,1,1,0,1,0,0
10,4,211,16188,35000,1,0,0,1,1,0,1,0,0
10,4,212,16189,35000,1,0,0,1,1,0,1,0,0
10,4,213,16192,35000,1,0,0,1,1,0,1,0,0
10,4,214,16193,35000,1,0,0,1,1,0,1,0,0
10,4,215,16194,35000,1,0,0,1,1,0,1,0,0
10,4,216,16195,35000,1,0,0,1,1,0,1,0,0
10,4,217,16196,35000,1,0,0,1,1,0,1,0,0
10,4,218,16197,35000,1,0,0,1,1,0,1,0,0
10,4,219,16198,35000,1,0,0,1,1,0,1,0,0
10,4,220,16199,35000,1,0,0,1,1,0,1,0,0
10,4,221,16202,35000,1,0,0,1,1,0,1,0,0
10,4,222,16203,35000,1,0,0,1,1,0,1,0,0
10,4,223,16204,35000,1,0,0,1,1,0,1,0,0
10,4,224,16205,35000,1,0,0,1,1,0,1,0,0
10,4,225,16206,35000,1,0,0,1,1,0,1,0,0
10,4,226,16207,35000,1,0,0,1,1,0,1,0,0
10,4,227,16208,35000,1,0,0,1,1,0,1,0,0
10,4,228,16209,35000,1,0,0,1,1,0,1,0,0
10,4,229,16212,35000,1,0,0,1,1,0,1,0,0
10,4,230,16213,35000,1,0,0,1,1,0,1,0,0
10,4,231,16214,35000,1,0,0,1,1,0,1,0,0
10,4,232,16215,35000,1,0,0,1,1,0,1,0,0
10,4,233,16216,35000,1,0,0,1,1,0,1,0,0
10,4,234,16217,35000,1,0,0,1,1,0,1,0,0
10,4,235,16218,35000,1,0,0,1,1,0,1,0,0
10,4,236,16219,35000,1,0,0,1,1,0,1,0,0
10,4,237,16222,35000,1,0,0,1,1,0,1,0,0
10,4,238,16223,35000,1,0,0,1,1,0,1,0,0
10,4,239,16224,35000,1,0,0,1,1,0,1,0,0
10,4,240,16225,35000,1,0,0,1,1,0,1,0,0
10,4,241,16226,35000,1,0,0,1,1,0,1,0,0
10,4,242,16227,35000,1,0,0,1,1,0,1,0,0
10,4,243,16228,35000,1,0,0,1,1,0,1,0,0
10,4,244,16229,35000,1,0,0,1,1,0,1,0,0
10,4,245,16232,35000,1,0,0,1,1,0,1,0,0
10,4,246,16233,35000,1,0,0,1,1,0,1,0,0
10,4,247,16234,35000,1,0,0,1,1,0,1,0,0
10,4,248,16235,35000,1,0,0,1,1,0,1,0,0
10,4,249,16236,35000,1,0,0,1,1,0,1,0,0
10,4,250,16237,35000,1,0,0,1,1,0,1,0,0
10,4,251,16238,35000,1,0,0,1,1,0,1,0,0
10,4,252,16239,35000,1,0,0,1,1,0,1,0,0
10,4,253,16242,35000,1,0,0,1,1,0,1,0,0
10,4,254,16243,35000,1,0,0,1,1,0,1,0,0
10,4,255,16244,35000,1,0,0,1,1,0,1,0,0
10,4,256,16245,35000,1,0,0,1,1,0,1,0,0
10,4,257,16246,35000,1,0,0,1,1,0,1,0,0
10,4,258,16247,35000,1,0,0,1,1,0,1,0,0
10,4,259,16248,35000,1,0,0,1,1,0,1,0,0
10,4,260,16249,35000,1,0,0,1,1,0,1,0,0
10,4,261,16252,35000,1,0,0,1,1,0,1,0,0
10,4,262,16253,35000,1,0,0,1,1,0,1,0,0
10,4,263,16254,35000,1,0,0,1,1,0,1,0,0
10,4,264,16255,35000,1,0,0,1,1,0,1,0,0
10,4,265,16256,35000,1,0,0,1,1,0,1,0,0
10,4,266,16257,35000,1,0,0,1,1,0,1,0,0
10,4,267,16258,35000,1,0,0,1,1,0,1,0,0
10,4,268,16259,35000,1,0,0,1,1,0,1,0,0
10,4,269,16262,35000,1,0,0,1,1,0,1,0,0
10,4,270,16263,35000,1,0,0,1,1,0,1,0,0
10,4,271,16264,35000,1,0,0,1,1,0,1,0,0
10,4,272,16265,35000,1,0,0,1,1,0,1,0,0
10,4,273,16266,35000,1,0,0,1,1,0,1,0,0
10,4,274,16267,35000,1,0,0,1,1,0,1,0,0
10,4,275,16268,35000,1,0,0,1,1,0,1,0,0
10,4,276,16269,35000,1,0,0,1,1,0,1,0,0
10,4,277,16272,35000,1,0,0,1,1,0,1,0,0
10,4,278,16273,35000,1,0,0,1,1,0,1,0,0
10,4,279,16274,35000,1,0,0,1,1,0,1,0,0
10,4,280,16275,35000,1,0,0,1,1,0,1,0,0
10,4,281,16276,35000,1,0,0,1,1,0,1,0,0
10,4,282,16277,35000,1,0,0,1,1,0,1,0,0
10,4,283,16278,35000,1,0,0,1,1,0,1,0,0
10,4,284,16279,35000,1,0,0,1,1,0,1,0,0
10,4,285,16282,35000,1,0,0,1,1,0,1,0,0
10,4,286,16283,35000,1,0,0,1,1,0,1,0,0
10,4,287,16284,35000,1,0,0,1,1,0,1,0,0
10,4,288,16285,35000,1,0,0,1,1,0,1,0,0
10,4,289,16286,35000,1,0,0,1,1,0,1,0,0
10,4,290,16287,35000,1,0,0,1,1,0,1,0,0
10,4,291,16288,35000,1,0,0,1,1,0,1,0,0
10,4,292,16289,35000,1,0,0,1,1,0,1,0,0
10,4,293,16292,35000,1,0,0,1,1,0,1,0,0
10,4,294,16293,35000,1,0,0,1,1,0,1,0,0
10,4,295,16294,35000,1,0,0,1,1,0,1,0,0
10,4,296,16295,35000,1,0,0,1,1,0,1,0,0
10,4,297,16296,35000,1,0,0,1,1,0,1,0,0
10,4,298,16297,35000,1,0,0,1,1,0,1,0,0
10,4,299,16298,35000,1,0,0,1,1,0,1,0,0
10,4,300,16299,35000,1,0,0,1,1,0,1,0,0
10,8,301,14136,15000,1,0,0,1,1,0,1,0,0
10,8,302,14137,15000,1,0,0,1,1,0,1,0,0
10,8,303,14138,15000,1,0,0,1,1,0,1,0,0
10,8,304,14139,15000,1,0,0,1,1,0,1,0,0
10,8,305,14140,15000,1,0,0,1,1,0,1,0,0
10,8,306,14141,15000,1,0,0,1,1,0,1,0,0
10,8,307,14142,15000,1,0,0,1,1,0,1,0,0
10,8,308,14143,15000,1,0,0,1,1,0,1,0,0
10,8,309,14144,15000,1,0,0,1,1,0,1,0,0
10,8,310,14145,15000,1,0,0,1,1,0,1,0,0
10,8,311,14454,30000,1,0,0,1,1,0,1,0,0
10,8,312,14455,30000,1,0,0,1,1,0,1,0,0
10,8,313,14456,30000,1,0,0,1,1,0,1,0,0
10,8,314,14457,30000,1,0,0,1,1,0,1,0,0
10,8,315,14458,30000,1,0,0,1,1,0,1,0,0
10,8,316,14459,30000,1,0,0,1,1,0,1,0,0
10,8,317,14460,30000,1,0,0,1,1,0,1,0,0
10,8,318,14461,30000,1,0,0,1,1,0,1,0,0
10,8,319,14462,30000,1,0,0,1,1,0,1,0,0
10,8,320,14463,30000,1,0,0,1,1,0,1,0,0
10,8,321,12724,50000,1,0,0,1,1,0,1,0,0
10,8,322,12725,50000,1,0,0,1,1,0,1,0,0
10,8,323,12726,50000,1,0,0,1,1,0,1,0,0
10,8,324,12727,50000,1,0,0,1,1,0,1,0,0
10,8,325,12728,50000,1,0,0,1,1,0,1,0,0
10,8,326,12729,50000,1,0,0,1,1,0,1,0,0
10,8,327,12730,50000,1,0,0,1,1,0,1,0,0
10,8,328,12731,50000,1,0,0,1,1,0,1,0,0
10,8,329,12732,50000,1,0,0,1,1,0,1,0,0
10,8,330,12733,50000,1,0,0,1,1,0,1,0,0
10,8,331,12734,50000,1,0,0,1,1,0,1,0,0
10,8,332,12735,50000,1,0,0,1,1,0,1,0,0
10,8,333,12736,50000,1,0,0,1,1,0,1,0,0
10,8,334,12737,50000,1,0,0,1,1,0,1,0,0
10,8,335,12738,50000,1,0,0,1,1,0,1,0,0
10,8,336,12739,50000,1,0,0,1,1,0,1,0,0
10,8,337,12740,50000,1,0,0,1,1,0,1,0,0
10,8,338,12741,50000,1,0,0,1,1,0,1,0,0
10,8,339,12742,50000,1,0,0,1,1,0,1,0,0
10,8,340,12743,50000,1,0,0,1,1,0,1,0,0
10,8,341,12744,50000,1,0,0,1,1,0,1,0,0
10,8,342,12745,50000,1,0,0,1,1,0,1,0,0
10,8,343,12746,50000,1,0,0,1,1,0,1,0,0
10,8,344,12747,50000,1,0,0,1,1,0,1,0,0
10,8,345,12748,50000,1,0,0,1,1,0,1,0,0
10,8,346,12749,50000,1,0,0,1,1,0,1,0,0
10,8,347,12750,50000,1,0,0,1,1,0,1,0,0
10,8,348,12751,50000,1,0,0,1,1,0,1,0,0
10,8,349,12752,50000,1,0,0,1,1,0,1,0,0
10,8,350,12753,50000,1,0,0,1,1,0,1,0,0
10,8,351,15070,50000,1,0,0,1,1,0,1,0,0
10,8,352,15071,50000,1,0,0,1,1,0,1,0,0
10,8,353,15072,50000,1,0,0,1,1,0,1,0,0
10,8,354,15073,50000,1,0,0,1,1,0,1,0,0
10,8,355,15074,50000,1,0,0,1,1,0,1,0,0
10,8,356,15075,50000,1,0,0,1,1,0,1,0,0
10,8,357,15076,50000,1,0,0,1,1,0,1,0,0
10,8,358,15077,50000,1,0,0,1,1,0,1,0,0
10,8,359,15078,50000,1,0,0,1,1,0,1,0,0
10,8,360,15079,50000,1,0,0,1,1,0,1,0,0
10,8,361,15567,20000,1,0,0,1,1,0,1,0,0
10,8,362,15568,20000,1,0,0,1,1,0,1,0,0
10,8,363,15569,20000,1,0,0,1,1,0,1,0,0
10,8,364,15570,20000,1,0,0,1,1,0,1,0,0
10,8,365,15571,20000,1,0,0,1,1,0,1,0,0
10,8,366,15572,20000,1,0,0,1,1,0,1,0,0
10,8,367,15573,20000,1,0,0,1,1,0,1,0,0
10,8,368,15574,20000,1,0,0,1,1,0,1,0,0
10,8,369,15575,20000,1,0,0,1,1,0,1,0,0
10,8,370,15576,20000,1,0,0,1,1,0,1,0,0
10,8,371,15577,20000,1,0,0,1,1,0,1,0,0
10,8,372,15578,20000,1,0,0,1,1,0,1,0,0
10,8,373,15579,20000,1,0,0,1,1,0,1,0,0
10,8,374,15580,20000,1,0,0,1,1,0,1,0,0
10,8,375,15581,20000,1,0,0,1,1,0,1,0,0
10,8,376,15582,20000,1,0,0,1,1,0,1,0,0
10,8,377,15583,20000,1,0,0,1,1,0,1,0,0
10,8,378,15584,20000,1,0,0,1,1,0,1,0,0
10,8,379,15585,20000,1,0,0,1,1,0,1,0,0
10,8,380,15586,20000,1,0,0,1,1,0,1,0,0
10,8,381,15587,20000,1,0,0,1,1,0,1,0,0
10,8,382,15588,20000,1,0,0,1,1,0,1,0,0
10,8,383,15589,20000,1,0,0,1,1,0,1,0,0
10,8,384,15590,20000,1,0,0,1,1,0,1,0,0
10,8,385,15591,20000,1,0,0,1,1,0,1,0,0
10,8,386,15592,20000,1,0,0,1,1,0,1,0,0
10,8,387,15593,20000,1,0,0,1,1,0,1,0,0
10,8,388,15594,20000,1,0,0,1,1,0,1,0,0
10,8,389,15595,20000,1,0,0,1,1,0,1,0,0
10,8,390,15596,20000,1,0,0,1,1,0,1,0,0
10,8,391,15597,20000,1,0,0,1,1,0,1,0,0
10,8,392,15598,20000,1,0,0,1,1,0,1,0,0
10,8,393,15599,20000,1,0,0,1,1,0,1,0,0
10,8,394,15600,20000,1,0,0,1,1,0,1,0,0
10,8,395,15601,20000,1,0,0,1,1,0,1,0,0
10,8,396,15602,20000,1,0,0,1,1,0,1,0,0
10,8,397,15603,20000,1,0,0,1,1,0,1,0,0
10,8,398,15604,20000,1,0,0,1,1,0,1,0,0
10,8,399,15605,20000,1,0,0,1,1,0,1,0,0
10,8,400,15606,20000,1,0,0,1,1,0,1,0,0
10,8,401,15607,20000,1,0,0,1,1,0,1,0,0
10,8,402,15608,20000,1,0,0,1,1,0,1,0,0
10,8,403,15609,20000,1,0,0,1,1,0,1,0,0
10,8,404,15610,20000,1,0,0,1,1,0,1,0,0
10,8,405,15611,20000,1,0,0,1,1,0,1,0,0
10,8,406,15612,20000,1,0,0,1,1,0,1,0,0
10,8,407,15613,20000,1,0,0,1,1,0,1,0,0
10,8,408,15614,20000,1,0,0,1,1,0,1,0,0
10,8,409,15615,20000,1,0,0,1,1,0,1,0,0
10,8,410,15616,20000,1,0,0,1,1,0,1,0,0
10,8,411,15617,20000,1,0,0,1,1,0,1,0,0
10,8,412,15618,20000,1,0,0,1,1,0,1,0,0
10,8,413,15619,20000,1,0,0,1,1,0,1,0,0
10,8,414,15620,20000,1,0,0,1,1,0,1,0,0
10,8,415,15621,20000,1,0,0,1,1,0,1,0,0
10,8,416,15622,20000,1,0,0,1,1,0,1,0,0
10,8,417,15623,20000,1,0,0,1,1,0,1,0,0
10,8,418,15624,20000,1,0,0,1,1,0,1,0,0
10,8,419,15625,20000,1,0,0,1,1,0,1,0,0
10,8,420,15626,20000,1,0,0,1,1,0,1,0,0
10,8,421,15627,20000,1,0,0,1,1,0,1,0,0
10,8,422,15628,20000,1,0,0,1,1,0,1,0,0
10,8,423,15629,20000,1,0,0,1,1,0,1,0,0
10,8,424,15630,20000,1,0,0,1,1,0,1,0,0
10,8,425,15631,20000,1,0,0,1,1,0,1,0,0
10,8,426,15632,20000,1,0,0,1,1,0,1,0,0
10,8,427,15633,20000,1,0,0,1,1,0,1,0,0
10,8,428,15634,20000,1,0,0,1,1,0,1,0,0
10,8,429,15635,20000,1,0,0,1,1,0,1,0,0
10,8,430,15636,20000,1,0,0,1,1,0,1,0,0
10,8,431,15637,20000,1,0,0,1,1,0,1,0,0
10,8,432,15638,20000,1,0,0,1,1,0,1,0,0
10,8,433,15639,20000,1,0,0,1,1,0,1,0,0
10,8,434,15640,20000,1,0,0,1,1,0,1,0,0
10,8,435,15641,20000,1,0,0,1,1,0,1,0,0
10,8,436,15642,20000,1,0,0,1,1,0,1,0,0
10,8,437,15643,20000,1,0,0,1,1,0,1,0,0
10,8,438,15644,20000,1,0,0,1,1,0,1,0,0
10,8,439,15645,20000,1,0,0,1,1,0,1,0,0
10,8,440,15646,20000,1,0,0,1,1,0,1,0,0
10,8,441,15647,20000,1,0,0,1,1,0,1,0,0
10,8,442,15648,20000,1,0,0,1,1,0,1,0,0
10,8,443,15649,20000,1,0,0,1,1,0,1,0,0
10,8,444,15650,20000,1,0,0,1,1,0,1,0,0
10,8,445,15651,20000,1,0,0,1,1,0,1,0,0
10,8,446,15652,20000,1,0,0,1,1,0,1,0,0
10,8,447,15653,20000,1,0,0,1,1,0,1,0,0
10,8,448,15654,20000,1,0,0,1,1,0,1,0,0
10,8,449,15655,20000,1,0,0,1,1,0,1,0,0
10,8,450,15656,20000,1,0,0,1,1,0,1,0,0
10,8,451,15657,20000,1,0,0,1,1,0,1,0,0
10,8,452,15658,20000,1,0,0,1,1,0,1,0,0
10,8,453,15659,20000,1,0,0,1,1,0,1,0,0
10,8,454,15660,20000,1,0,0,1,1,0,1,0,0
10,8,455,15661,20000,1,0,0,1,1,0,1,0,0
10,8,456,15662,20000,1,0,0,1,1,0,1,0,0
10,8,457,15663,20000,1,0,0,1,1,0,1,0,0
10,8,458,15664,20000,1,0,0,1,1,0,1,0,0
10,8,459,15665,20000,1,0,0,1,1,0,1,0,0
10,8,460,15666,20000,1,0,0,1,1,0,1,0,0
10,8,461,15667,20000,1,0,0,1,1,0,1,0,0
10,8,462,15668,20000,1,0,0,1,1,0,1,0,0
10,8,463,15669,20000,1,0,0,1,1,0,1,0,0
10,8,464,15670,20000,1,0,0,1,1,0,1,0,0
10,8,465,15671,20000,1,0,0,1,1,0,1,0,0
10,8,466,15672,20000,1,0,0,1,1,0,1,0,0
10,8,467,15673,20000,1,0,0,1,1,0,1,0,0
10,8,468,15674,20000,1,0,0,1,1,0,1,0,0
10,8,469,15675,20000,1,0,0,1,1,0,1,0,0
10,8,470,15676,20000,1,0,0,1,1,0,1,0,0
10,8,471,15677,20000,1,0,0,1,1,0,1,0,0
10,8,472,15678,20000,1,0,0,1,1,0,1,0,0
10,8,473,15679,20000,1,0,0,1,1,0,1,0,0
10,8,474,15680,20000,1,0,0,1,1,0,1,0,0
10,8,475,15681,20000,1,0,0,1,1,0,1,0,0
10,8,476,15682,20000,1,0,0,1,1,0,1,0,0
10,8,477,15683,20000,1,0,0,1,1,0,1,0,0
10,8,478,15684,20000,1,0,0,1,1,0,1,0,0
10,8,479,15685,20000,1,0,0,1,1,0,1,0,0
10,8,480,15686,20000,1,0,0,1,1,0,1,0,0
10,8,481,15687,20000,1,0,0,1,1,0,1,0,0
10,8,482,15688,20000,1,0,0,1,1,0,1,0,0
10,8,483,15689,20000,1,0,0,1,1,0,1,0,0
10,8,484,15690,20000,1,0,0,1,1,0,1,0,0
10,8,485,15691,20000,1,0,0,1,1,0,1,0,0
10,8,486,15692,20000,1,0,0,1,1,0,1,0,0
10,8,487,15693,20000,1,0,0,1,1,0,1,0,0
10,8,488,15694,20000,1,0,0,1,1,0,1,0,0
10,8,489,15695,20000,1,0,0,1,1,0,1,0,0
10,8,490,15696,20000,1,0,0,1,1,0,1,0,0
10,8,491,15697,20000,1,0,0,1,1,0,1,0,0
10,8,492,15698,20000,1,0,0,1,1,0,1,0,0
10,8,493,15699,20000,1,0,0,1,1,0,1,0,0
10,8,494,15700,20000,1,0,0,1,1,0,1,0,0
10,8,495,15701,20000,1,0,0,1,1,0,1,0,0
10,8,496,15702,20000,1,0,0,1,1,0,1,0,0
10,8,497,15703,20000,1,0,0,1,1,0,1,0,0
10,8,498,15704,20000,1,0,0,1,1,0,1,0,0
10,8,499,15705,20000,1,0,0,1,1,0,1,0,0
10,8,500,15706,20000,1,0,0,1,1,0,1,0,0
10,8,501,15707,20000,1,0,0,1,1,0,1,0,0
10,8,502,15708,20000,1,0,0,1,1,0,1,0,0
10,8,503,15709,20000,1,0,0,1,1,0,1,0,0
10,8,504,15710,20000,1,0,0,1,1,0,1,0,0
10,8,505,15711,20000,1,0,0,1,1,0,1,0,0
10,8,506,15712,20000,1,0,0,1,1,0,1,0,0
10,8,507,15713,20000,1,0,0,1,1,0,1,0,0
10,8,508,15714,20000,1,0,0,1,1,0,1,0,0
10,8,509,15715,20000,1,0,0,1,1,0,1,0,0
10,8,510,15716,20000,1,0,0,1,1,0,1,0,0
10,8,511,15717,20000,1,0,0,1,1,0,1,0,0
10,8,512,15718,20000,1,0,0,1,1,0,1,0,0
10,8,513,15719,20000,1,0,0,1,1,0,1,0,0
10,8,514,15720,20000,1,0,0,1,1,0,1,0,0
10,8,515,15721,20000,1,0,0,1,1,0,1,0,0
10,8,516,15722,20000,1,0,0,1,1,0,1,0,0
10,8,517,15723,20000,1,0,0,1,1,0,1,0,0
10,8,518,15724,20000,1,0,0,1,1,0,1,0,0
10,8,519,15725,20000,1,0,0,1,1,0,1,0,0
10,8,520,15726,20000,1,0,0,1,1,0,1,0,0
10,8,521,15727,20000,1,0,0,1,1,0,1,0,0
10,8,522,15728,20000,1,0,0,1,1,0,1,0,0
10,8,523,15729,20000,1,0,0,1,1,0,1,0,0
10,8,524,15730,20000,1,0,0,1,1,0,1,0,0
10,8,525,15731,20000,1,0,0,1,1,0,1,0,0
10,8,526,15732,20000,1,0,0,1,1,0,1,0,0
10,8,527,15733,20000,1,0,0,1,1,0,1,0,0
10,8,528,15734,20000,1,0,0,1,1,0,1,0,0
10,8,529,15735,20000,1,0,0,1,1,0,1,0,0
10,8,530,15736,20000,1,0,0,1,1,0,1,0,0
10,8,531,15737,20000,1,0,0,1,1,0,1,0,0
10,8,532,15738,20000,1,0,0,1,1,0,1,0,0
10,8,533,15739,20000,1,0,0,1,1,0,1,0,0
10,8,534,15740,20000,1,0,0,1,1,0,1,0,0
10,8,535,15741,20000,1,0,0,1,1,0,1,0,0
10,8,536,15742,20000,1,0,0,1,1,0,1,0,0
10,8,537,15743,20000,1,0,0,1,1,0,1,0,0
10,8,538,15744,20000,1,0,0,1,1,0,1,0,0
10,8,539,15745,20000,1,0,0,1,1,0,1,0,0
10,8,540,15746,20000,1,0,0,1,1,0,1,0,0
10,8,541,15747,20000,1,0,0,1,1,0,1,0,0
10,8,542,15748,20000,1,0,0,1,1,0,1,0,0
10,8,543,15749,20000,1,0,0,1,1,0,1,0,0
10,8,544,15750,20000,1,0,0,1,1,0,1,0,0
10,8,545,15751,20000,1,0,0,1,1,0,1,0,0
10,8,546,15752,20000,1,0,0,1,1,0,1,0,0
10,8,547,15753,20000,1,0,0,1,1,0,1,0,0
10,8,548,15754,20000,1,0,0,1,1,0,1,0,0
10,8,549,15755,20000,1,0,0,1,1,0,1,0,0
10,8,550,15756,20000,1,0,0,1,1,0,1,0,0
10,8,551,15757,20000,1,0,0,1,1,0,1,0,0
10,8,552,15758,20000,1,0,0,1,1,0,1,0,0
10,8,553,15759,20000,1,0,0,1,1,0,1,0,0
10,8,554,15760,20000,1,0,0,1,1,0,1,0,0
10,8,555,15761,20000,1,0,0,1,1,0,1,0,0
10,8,556,15762,20000,1,0,0,1,1,0,1,0,0
10,8,557,15763,20000,1,0,0,1,1,0,1,0,0
10,8,558,15764,20000,1,0,0,1,1,0,1,0,0
10,8,559,15765,20000,1,0,0,1,1,0,1,0,0
10,8,560,15766,20000,1,0,0,1,1,0,1,0,0
10,8,561,15919,20000,1,0,0,1,1,0,1,0,0
10,8,562,15920,20000,1,0,0,1,1,0,1,0,0
10,8,563,15921,20000,1,0,0,1,1,0,1,0,0
10,8,564,15922,20000,1,0,0,1,1,0,1,0,0
10,8,565,15923,20000,1,0,0,1,1,0,1,0,0
10,8,566,15924,20000,1,0,0,1,1,0,1,0,0
10,8,567,15925,20000,1,0,0,1,1,0,1,0,0
10,8,568,15926,20000,1,0,0,1,1,0,1,0,0
10,8,569,15927,20000,1,0,0,1,1,0,1,0,0
10,8,570,15928,20000,1,0,0,1,1,0,1,0,0
10,8,571,15929,20000,1,0,0,1,1,0,1,0,0
10,8,572,15930,20000,1,0,0,1,1,0,1,0,0
10,8,573,15931,20000,1,0,0,1,1,0,1,0,0
10,8,574,15932,20000,1,0,0,1,1,0,1,0,0
10,8,575,15933,20000,1,0,0,1,1,0,1,0,0
10,8,576,15934,20000,1,0,0,1,1,0,1,0,0
10,8,577,15935,20000,1,0,0,1,1,0,1,0,0
10,8,578,15936,20000,1,0,0,1,1,0,1,0,0
10,8,579,15937,20000,1,0,0,1,1,0,1,0,0
10,8,580,15938,20000,1,0,0,1,1,0,1,0,0
10,8,581,15939,20000,1,0,0,1,1,0,1,0,0
10,8,582,15940,20000,1,0,0,1,1,0,1,0,0
10,8,583,15941,20000,1,0,0,1,1,0,1,0,0
10,8,584,15942,20000,1,0,0,1,1,0,1,0,0
10,8,585,15943,20000,1,0,0,1,1,0,1,0,0
10,8,586,15944,20000,1,0,0,1,1,0,1,0,0
10,8,587,15945,20000,1,0,0,1,1,0,1,0,0
10,8,588,15946,20000,1,0,0,1,1,0,1,0,0
10,8,589,15947,20000,1,0,0,1,1,0,1,0,0
10,8,590,15948,20000,1,0,0,1,1,0,1,0,0
10,8,591,15949,20000,1,0,0,1,1,0,1,0,0
10,8,592,15950,20000,1,0,0,1,1,0,1,0,0
10,8,593,15951,20000,1,0,0,1,1,0,1,0,0
10,8,594,15952,20000,1,0,0,1,1,0,1,0,0
10,8,595,15953,20000,1,0,0,1,1,0,1,0,0
10,8,596,15954,20000,1,0,0,1,1,0,1,0,0
10,8,597,15955,20000,1,0,0,1,1,0,1,0,0
10,8,598,15956,20000,1,0,0,1,1,0,1,0,0
10,8,599,15957,20000,1,0,0,1,1,0,1,0,0
10,8,600,15958,20000,1,0,0,1,1,0,1,0,0
10,8,601,15959,20000,1,0,0,1,1,0,1,0,0
10,8,602,15960,20000,1,0,0,1,1,0,1,0,0
10,8,603,15961,20000,1,0,0,1,1,0,1,0,0
10,8,604,15962,20000,1,0,0,1,1,0,1,0,0
10,8,605,15963,20000,1,0,0,1,1,0,1,0,0
10,8,606,15964,20000,1,0,0,1,1,0,1,0,0
10,8,607,15965,20000,1,0,0,1,1,0,1,0,0
10,8,608,15966,20000,1,0,0,1,1,0,1,0,0
10,8,609,15967,20000,1,0,0,1,1,0,1,0,0
10,8,610,15968,20000,1,0,0,1,1,0,1,0,0
10,7,611,13506,250,1,0,0,1,1,0,1,50,0
10,7,612,15011,250,1,0,0,1,1,0,1,50,0
10,7,613,13636,250,1,0,0,1,1,0,1,50,0
10,7,614,1227,250,1,0,0,1,1,0,1,50,0
10,7,615,15022,250,1,0,0,1,1,0,1,50,0
10,8,616,4407,1000,1,0,0,1,1,0,1,0,0
10,8,617,4408,1000,1,0,0,1,1,0,1,0,0
10,8,618,4409,1000,1,0,0,1,1,0,1,0,0
10,8,619,4410,1000,1,0,0,1,1,0,1,0,0
10,8,620,4411,1000,1,0,0,1,1,0,1,0,0
10,8,621,4412,1000,1,0,0,1,1,0,1,0,0
10,8,622,4413,1000,1,0,0,1,1,0,1,0,0
10,8,623,4414,1000,1,0,0,1,1,0,1,0,0
10,8,624,4823,1000,1,0,0,1,1,0,1,0,0
10,8,625,4824,1000,1,0,0,1,1,0,1,0,0
10,8,626,4825,1000,1,0,0,1,1,0,1,0,0
10,8,627,4826,1000,1,0,0,1,1,0,1,0,0
10,8,628,4827,1000,1,0,0,1,1,0,1,0,0
10,8,629,4828,1000,1,0,0,1,1,0,1,0,0
10,8,630,4829,1000,1,0,0,1,1,0,1,0,0
10,8,631,4830,1000,1,0,0,1,1,0,1,0,0
10,8,632,5194,1000,1,0,0,1,1,0,1,0,0
10,8,633,5195,1000,1,0,0,1,1,0,1,0,0
10,8,634,5196,1000,1,0,0,1,1,0,1,0,0
10,8,635,5197,1000,1,0,0,1,1,0,1,0,0
10,8,636,5198,1000,1,0,0,1,1,0,1,0,0
10,8,637,5199,1000,1,0,0,1,1,0,1,0,0
10,8,638,5200,1000,1,0,0,1,1,0,1,0,0
10,8,639,5201,1000,1,0,0,1,1,0,1,0,0
10,8,640,13630,1000,1,0,0,1,1,0,1,0,0
10,8,641,13631,1000,1,0,0,1,1,0,1,0,0
10,8,642,13632,1000,1,0,0,1,1,0,1,0,0
10,8,643,13633,1000,1,0,0,1,1,0,1,0,0
10,8,644,13634,1000,1,0,0,1,1,0,1,0,0
10,8,645,13635,1000,1,0,0,1,1,0,1,0,0
10,8,646,15103,1000,1,0,0,1,1,0,1,0,0
10,8,647,15104,1000,1,0,0,1,1,0,1,0,0
10,8,648,15105,1000,1,0,0,1,1,0,1,0,0
10,8,649,15106,1000,1,0,0,1,1,0,1,0,0
10,8,650,15107,1000,1,0,0,1,1,0,1,0,0
10,8,651,15108,1000,1,0,0,1,1,0,1,0,0
10,8,652,16459,1000,1,0,0,1,1,0,1,0,0
10,8,653,16460,1000,1,0,0,1,1,0,1,0,0
10,8,654,16461,1000,1,0,0,1,1,0,1,0,0
10,8,655,16462,1000,1,0,0,1,1,0,1,0,0
10,8,656,16463,1000,1,0,0,1,1,0,1,0,0
10,8,657,16464,1000,1,0,0,1,1,0,1,0,0
10,8,658,16465,1000,1,0,0,1,1,0,1,0,0
10,8,659,16466,1000,1,0,0,1,1,0,1,0,0
10,8,660,16467,1000,1,0,0,1,1,0,1,0,0
10,8,661,16468,1000,1,0,0,1,1,0,1,0,0
10,8,662,16469,1000,1,0,0,1,1,0,1,0,0
10,8,663,16470,1000,1,0,0,1,1,0,1,0,0
10,8,664,16471,1000,1,0,0,1,1,0,1,0,0
10,8,665,16472,1000,1,0,0,1,1,0,1,0,0
10,8,666,13416,1000,1,0,0,1,1,0,1,0,0
10,8,667,13417,1000,1,0,0,1,1,0,1,0,0
10,8,668,13418,1000,1,0,0,1,1,0,1,0,0
10,8,669,13419,1000,1,0,0,1,1,0,1,0,0
10,8,670,13420,1000,1,0,0,1,1,0,1,0,0
10,8,671,14283,1000,1,0,0,1,1,0,1,0,0
10,8,672,14284,1000,1,0,0,1,1,0,1,0,0
10,8,673,14285,1000,1,0,0,1,1,0,1,0,0
10,8,674,14286,1000,1,0,0,1,1,0,1,0,0
10,8,675,13182,1000,1,0,0,1,1,0,1,0,0
10,8,676,13507,1000,1,0,0,1,1,0,1,0,0
10,8,677,13981,1000,1,0,0,1,1,0,1,0,0
10,8,678,14744,1000,1,0,0,1,1,0,1,0,0
10,8,679,14893,1000,1,0,0,1,1,0,1,0,0
10,8,680,15785,1000,1,0,0,1,1,0,1,0,0
10,8,681,16419,1000,1,0,0,1,1,0,1,0,0
10,8,682,11470,1000,1,0,0,1,1,0,1,0,0
10,8,683,12512,1000,1,0,0,1,1,0,1,0,0
10,8,684,12884,1000,1,0,0,1,1,0,1,0,0
10,8,685,12513,1000,1,0,0,1,1,0,1,0,0
10,8,686,12514,1000,1,0,0,1,1,0,1,0,0
10,8,687,12515,1000,1,0,0,1,1,0,1,0,0
10,8,688,12516,1000,1,0,0,1,1,0,1,0,0
10,8,689,12517,1000,1,0,0,1,1,0,1,0,0
10,8,690,12518,1000,1,0,0,1,1,0,1,0,0
10,8,691,12519,1000,1,0,0,1,1,0,1,0,0
10,8,692,12520,1000,1,0,0,1,1,0,1,0,0
10,8,693,12521,1000,1,0,0,1,1,0,1,0,0
10,8,694,8179,1000,1,0,0,1,1,0,1,0,0
10,8,695,9704,1000,1,0,0,1,1,0,1,0,0
10,8,696,15448,1000,1,0,0,1,1,0,1,0,0
10,8,697,11162,1000,1,0,0,1,1,0,1,0,0
10,8,698,11163,1000,1,0,0,1,1,0,1,0,0
10,8,699,11164,1000,1,0,0,1,1,0,1,0,0
10,8,700,11165,1000,1,0,0,1,1,0,1,0,0
10,8,701,11661,1000,1,0,0,1,1,0,1,0,0
10,8,702,11662,1000,1,0,0,1,1,0,1,0,0
10,8,703,14639,1000,1,0,0,1,1,0,1,0,0
10,8,704,13607,10,1,0,0,1,1,0,1,0,0
10,7,705,15774,3000,1,0,0,1,1,0,1,100,0
10,7,706,15775,3000,1,0,0,1,1,0,1,100,0
10,7,707,11420,3000,1,0,0,1,1,0,1,100,0
10,7,708,14704,3000,1,0,0,1,1,0,1,100,0
10,7,709,13177,3000,1,0,0,1,1,0,1,100,0
10,7,710,14191,3000,1,0,0,1,1,0,1,100,0
10,7,711,13449,3000,1,0,0,1,1,0,1,100,0
10,7,712,14192,3000,1,0,0,1,1,0,1,100,0
10,7,713,15772,3000,1,0,0,1,1,0,1,100,0
10,7,714,13791,3000,1,0,0,1,1,0,1,100,0
10,7,715,14006,3000,1,0,0,1,1,0,1,100,0
10,7,716,15768,3000,1,0,0,1,1,0,1,100,0
10,7,717,14069,3000,1,0,0,1,1,0,1,100,0
10,7,718,14124,3000,1,0,0,1,1,0,1,100,0
10,7,719,15507,3000,1,0,0,1,1,0,1,100,0
10,7,720,15508,3000,1,0,0,1,1,0,1,100,0
10,7,721,14855,3000,1,0,0,1,1,0,1,100,0
10,7,722,14894,3000,1,0,0,1,1,0,1,100,0
10,7,723,16444,3000,1,0,0,1,1,0,1,100,0
10,7,724,16445,3000,1,0,0,1,1,0,1,100,0
10,7,725,12509,3000,1,0,0,1,1,0,1,100,0
10,7,726,14126,3000,1,0,0,1,1,0,1,100,0
10,7,727,15062,3000,1,0,0,1,1,0,1,100,0
10,7,728,15063,3000,1,0,0,1,1,0,1,100,0
10,7,729,14891,3000,1,0,0,1,1,0,1,100,0
10,7,730,14895,3000,1,0,0,1,1,0,1,100,0
10,7,731,14091,3000,1,0,0,1,1,0,1,100,0
10,7,732,14092,3000,1,0,0,1,1,0,1,100,0
10,7,733,14501,3000,1,0,0,1,1,0,1,100,0
10,7,734,14506,3000,1,0,0,1,1,0,1,100,0
10,7,735,15285,3000,1,0,0,1,1,0,1,100,0
10,7,736,15286,3000,1,0,0,1,1,0,1,100,0
10,7,737,16442,3000,1,0,0,1,1,0,1,100,0
10,7,738,16443,3000,1,0,0,1,1,0,1,100,0
10,7,739,15027,3000,1,0,0,1,1,0,1,100,0
10,7,740,15028,3000,1,0,0,1,1,0,1,100,0
10,7,741,13453,3000,1,0,0,1,1,0,1,100,0
10,7,742,14193,3000,1,0,0,1,1,0,1,100,0
10,7,743,13178,3000,1,0,0,1,1,0,1,100,0
10,7,744,14194,3000,1,0,0,1,1,0,1,100,0
10,7,745,16454,3000,1,0,0,1,1,0,1,100,0
10,7,746,16455,3000,1,0,0,1,1,0,1,100,0
10,7,747,15030,3000,1,0,0,1,1,0,1,100,0
10,7,748,15031,3000,1,0,0,1,1,0,1,100,0
10,7,749,13790,3000,1,0,0,1,1,0,1,100,0
10,7,750,14005,3000,1,0,0,1,1,0,1,100,0
10,7,751,14406,3000,1,0,0,1,1,0,1,100,0
10,7,752,14413,3000,1,0,0,1,1,0,1,100,0
10,7,753,16448,3000,1,0,0,1,1,0,1,100,0
10,7,754,16449,3000,1,0,0,1,1,0,1,100,0
10,7,755,12872,3000,1,0,0,1,1,0,1,100,0
10,7,756,14187,3000,1,0,0,1,1,0,1,100,0
10,7,757,14125,3000,1,0,0,1,1,0,1,100,0
10,7,758,14500,3000,1,0,0,1,1,0,1,100,0
10,7,759,14505,3000,1,0,0,1,1,0,1,100,0
10,7,760,15118,3000,1,0,0,1,1,0,1,100,0
10,7,761,15119,3000,1,0,0,1,1,0,1,100,0
10,7,762,14662,3000,1,0,0,1,1,0,1,100,0
10,7,763,14663,3000,1,0,0,1,1,0,1,100,0
10,7,764,15771,3000,1,0,0,1,1,0,1,100,0
10,7,765,9700,3000,1,0,0,1,1,0,1,100,0
10,7,766,14498,3000,1,0,0,1,1,0,1,100,0
10,7,767,14913,3000,1,0,0,1,1,0,1,100,0
10,7,768,14914,3000,1,0,0,1,1,0,1,100,0
10,7,769,13508,3000,1,0,0,1,1,0,1,100,0
10,7,770,15115,3000,1,0,0,1,1,0,1,100,0
10,7,771,15116,3000,1,0,0,1,1,0,1,100,0
10,7,772,15113,3000,1,0,0,1,1,0,1,100,0
10,7,773,15114,3000,1,0,0,1,1,0,1,100,0
10,7,774,15222,3000,1,0,0,1,1,0,1,100,0
10,7,775,15223,3000,1,0,0,1,1,0,1,100,0
10,7,776,10750,3000,1,0,0,1,1,0,1,100,0
10,7,777,14705,3000,1,0,0,1,1,0,1,100,0
10,7,778,15027,3000,1,0,0,1,1,0,1,100,0
10,7,779,15028,3000,1,0,0,1,1,0,1,100,0
10,7,780,10380,3000,1,0,0,1,1,0,1,100,0
10,7,781,15060,3000,1,0,0,1,1,0,1,100,0
10,7,782,13963,3000,1,0,0,1,1,0,1,100,0
10,7,783,14026,3000,1,0,0,1,1,0,1,100,0
10,7,784,13964,3000,1,0,0,1,1,0,1,100,0
10,7,785,14027,3000,1,0,0,1,1,0,1,100,0
10,7,786,15064,3000,1,0,0,1,1,0,1,100,0
10,7,787,15065,3000,1,0,0,1,1,0,1,100,0
10,7,788,15524,3000,1,0,0,1,1,0,1,100,0
10,7,789,15525,3000,1,0,0,1,1,0,1,100,0
10,7,790,16450,3000,1,0,0,1,1,0,1,100,0
10,7,791,16451,3000,1,0,0,1,1,0,1,100,0
10,7,792,16344,3000,1,0,0,1,1,0,1,100,0
10,7,793,16345,3000,1,0,0,1,1,0,1,100,0
10,7,794,16342,3000,1,0,0,1,1,0,1,100,0
10,7,795,16343,3000,1,0,0,1,1,0,1,100,0
10,7,796,15220,3000,1,0,0,1,1,0,1,100,0
10,7,797,15221,3000,1,0,0,1,1,0,1,100,0
10,7,798,15066,3000,1,0,0,1,1,0,1,100,0
10,7,799,15067,3000,1,0,0,1,1,0,1,100,0
10,7,800,14089,3000,1,0,0,1,1,0,1,100,0
10,7,801,14090,3000,1,0,0,1,1,0,1,100,0
10,7,802,14195,3000,1,0,0,1,1,0,1,100,0
10,7,803,14196,3000,1,0,0,1,1,0,1,100,0
10,7,804,13965,3000,1,0,0,1,1,0,1,100,0
10,7,805,14028,3000,1,0,0,1,1,0,1,100,0
10,7,806,13508,3000,1,0,0,1,1,0,1,100,0
10,7,807,13962,3000,1,0,0,1,1,0,1,100,0
10,7,808,14314,3000,1,0,0,1,1,0,1,100,0
10,7,809,13404,3000,1,0,0,1,1,0,1,100,0
10,7,810,14188,3000,1,0,0,1,1,0,1,100,0
10,7,811,14032,3000,1,0,0,1,1,0,1,100,0
10,7,812,13960,3000,1,0,0,1,1,0,1,100,0
10,7,813,15819,3000,1,0,0,1,1,0,1,100,0
10,7,814,15820,3000,1,0,0,1,1,0,1,100,0
10,7,815,10750,3000,1,0,0,1,1,0,1,100,0
10,7,816,14705,3000,1,0,0,1,1,0,1,100,0
10,7,817,14407,3000,1,0,0,1,1,0,1,100,0
10,7,818,14414,3000,1,0,0,1,1,0,1,100,0
10,7,819,16352,3000,1,0,0,1,1,0,1,100,0
10,7,820,16353,3000,1,0,0,1,1,0,1,100,0
10,7,821,14502,3000,1,0,0,1,1,0,1,100,0
10,7,822,14507,3000,1,0,0,1,1,0,1,100,0
10,7,823,10811,3000,1,0,0,1,1,0,1,100,0
10,7,824,15061,3000,1,0,0,1,1,0,1,100,0
10,7,825,15823,3000,1,0,0,1,1,0,1,100,0
10,7,826,15824,3000,1,0,0,1,1,0,1,100,0
10,7,827,15224,3000,1,0,0,1,1,0,1,100,0
10,7,828,15225,3000,1,0,0,1,1,0,1,100,0
10,7,829,14503,3000,1,0,0,1,1,0,1,100,0
10,7,830,14510,3000,1,0,0,1,1,0,1,100,0
10,7,831,15776,3000,1,0,0,1,1,0,1,100,0
10,7,832,15777,3000,1,0,0,1,1,0,1,100,0
10,7,833,15821,3000,1,0,0,1,1,0,1,100,0
10,7,834,15822,3000,1,0,0,1,1,0,1,100,0
10,7,835,14198,3000,1,0,0,1,1,0,1,100,0
10,7,836,14197,3000,1,0,0,1,1,0,1,100,0
10,7,837,16446,3000,1,0,0,1,1,0,1,100,0
10,7,838,16447,3000,1,0,0,1,1,0,1,100,0
10,7,839,14905,3000,1,0,0,1,1,0,1,100,0
10,7,840,14907,3000,1,0,0,1,1,0,1,100,0
10,7,841,14904,3000,1,0,0,1,1,0,1,100,0
10,7,842,14906,3000,1,0,0,1,1,0,1,100,0
10,7,843,14659,3000,1,0,0,1,1,0,1,100,0
10,7,844,14660,3000,1,0,0,1,1,0,1,100,0
10,7,845,13326,3000,1,0,0,1,1,0,1,100,0
10,7,846,14416,3000,1,0,0,1,1,0,1,100,0
10,7,847,13450,3000,1,0,0,1,1,0,1,100,0
10,7,848,14031,3000,1,0,0,1,1,0,1,100,0
10,7,849,16492,3000,1,0,0,1,1,0,1,100,0
10,7,850,16493,3000,1,0,0,1,1,0,1,100,0
10,8,851,1520,1,1,0,0,1,1,0,1,0,0
10,8,852,7011,1,1,0,0,1,1,0,1,0,0
10,7,853,14299,500,1,0,0,1,1,0,1,20,0
10,7,854,14389,500,1,0,0,1,1,0,1,20,0
10,7,855,15177,500,1,0,0,1,1,0,1,20,0
10,7,856,14537,500,1,0,0,1,1,0,1,20,0
10,7,857,14758,500,1,0,0,1,1,0,1,20,0
10,7,858,14854,500,1,0,0,1,1,0,1,20,0
10,7,859,13974,500,1,0,0,1,1,0,1,20,0
10,7,860,15021,500,1,0,0,1,1,0,1,20,0
10,7,861,15111,500,1,0,0,1,1,0,1,20,0
10,7,862,15226,500,1,0,0,1,1,0,1,20,0
10,7,863,15773,500,1,0,0,1,1,0,1,20,0
10,7,864,15825,500,1,0,0,1,1,0,1,20,0
10,7,865,15827,500,1,0,0,1,1,0,1,20,0
10,7,866,16340,500,1,0,0,1,1,0,1,20,0
10,7,867,16341,500,1,0,0,1,1,0,1,20,0
10,7,868,16457,500,1,0,0,1,1,0,1,20,0
10,7,869,16458,500,1,0,0,1,1,0,1,20,0
10,7,870,11698,250,1,0,0,1,1,0,1,50,0
10,7,871,11700,250,1,0,0,1,1,0,1,50,0
10,8,872,4358,10,1,0,0,1,1,0,1,0,0
10,8,873,7981,1,1,0,0,1,1,0,1,0,0
10,8,874,7267,20,1,0,0,1,1,0,1,0,0
10,8,875,9958,20,1,0,0,1,1,0,1,0,999
10,8,876,1548,20,1,0,0,1,1,0,1,0,0
10,8,877,1613,20,1,0,0,1,1,0,1,0,0
10,8,878,1026,1,1,0,0,1,1,0,1,0,0
10,8,879,5380,1,1,0,0,1,1,0,1,0,0
10,8,880,11284,15,1,0,0,1,1,0,1,0,0
10,8,881,11285,15,1,0,0,1,1,0,1,0,0
10,8,882,11286,15,1,0,0,1,1,0,1,0,0
10,8,883,10356,500,1,0,0,1,1,0,1,0,0
10,8,884,12511,500,1,0,0,1,1,0,1,0,0
10,8,885,13238,500,1,0,0,1,1,0,1,0,0
10,8,886,1691,1,1,0,0,1,1,0,1,0,0
10,8,887,9708,1,1,0,0,1,1,0,1,0,0
10,8,888,11383,10,1,0,0,1,1,0,1,0,0
10,8,889,11382,10,1,0,0,1,1,0,1,0,0
10,8,890,11381,10,1,0,0,1,1,0,1,0,0
10,7,891,16348,3000,1,0,0,1,1,0,1,100,0
10,8,892,11386,10,1,0,0,1,1,0,1,0,0
10,8,893,5767,1,10000,0,0,1,1,0,1,0,0
10,8,894,5765,1,10000,0,0,1,1,0,1,0,0
10,8,895,5768,1,10000,0,0,1,1,0,1,0,0
10,8,896,14444,10,1,0,0,1,1,0,1,0,0
10,8,897,14443,10,1,0,0,1,1,0,1,0,0
10,8,898,14445,10,1,0,0,1,1,0,1,0,0
10,8,899,15068,500,1,0,0,1,1,0,1,20,0
10,7,900,16532,1000,1,0,0,1,1,0,1,0,0
10,8,901,100,1,10000,0,0,1,1,0,1,0,0
10,8,902,11243,1,1,0,0,1,1,0,1,0,0
10,8,903,101,1,10000,0,0,1,1,0,1,0,0
10,7,904,14368,3000,1,0,0,1,1,0,1,50,0
10,8,905,8943,1,20,0,0,1,1,0,1,0,0
10,7,906,1622,3000,1,0,0,1,1,0,1,0,0
10,8,907,8953,1,20,0,0,1,1,0,1,0,0
10,8,908,13693,1,20,0,0,1,1,0,1,0,0
10,8,909,8949,1,20,0,0,1,1,0,1,0,0
10,8,910,8955,1,20,0,0,1,1,0,1,0,0
10,7,911,16456,500,1,0,0,1,1,0,1,0,0
1 10 6 1 2146 25 1 0 0 1 1 0 1 0 0
2 10 6 2 2147 25 1 0 0 1 1 0 1 0 0
3 10 6 3 2148 25 1 0 0 1 1 0 1 0 0
4 10 6 4 2149 25 1 0 0 1 1 0 1 0 0
5 10 6 5 2150 25 1 0 0 1 1 0 1 0 0
6 10 6 6 2151 25 1 0 0 1 1 0 1 0 0
7 10 6 7 2152 25 1 0 0 1 1 0 1 0 0
8 10 6 8 2153 25 1 0 0 1 1 0 1 0 0
9 10 6 9 2154 25 1 0 0 1 1 0 1 0 0
10 10 6 10 2155 25 1 0 0 1 1 0 1 0 0
11 10 6 11 4398 25 1 0 0 1 1 0 1 0 0
12 10 6 12 12460 25 1 0 0 1 1 0 1 0 0
13 10 6 13 12461 25 1 0 0 1 1 0 1 0 0
14 10 6 14 12462 25 1 0 0 1 1 0 1 0 0
15 10 6 15 12463 25 1 0 0 1 1 0 1 0 0
16 10 6 16 12464 25 1 0 0 1 1 0 1 0 0
17 10 6 17 12465 25 1 0 0 1 1 0 1 0 0
18 10 6 18 12466 25 1 0 0 1 1 0 1 0 0
19 10 6 19 12467 25 1 0 0 1 1 0 1 0 0
20 10 6 20 12468 25 1 0 0 1 1 0 1 0 0
21 10 6 21 12469 25 1 0 0 1 1 0 1 0 0
22 10 6 22 15109 1000 1 0 0 1 1 0 1 0 0
23 10 6 23 15110 1000 1 0 0 1 1 0 1 0 0
24 10 6 24 2158 200 100 0 0 1 1 0 1 0 0
25 10 6 25 12306 2 1 0 0 1 1 0 1 80 0
26 10 6 26 12306 20000 10000 0 0 1 1 0 1 80 0
27 10 4 27 11664 20000 1 0 0 1 1 0 1 0 0
28 10 4 28 11665 20000 1 0 0 1 1 0 1 0 0
29 10 4 29 11666 20000 1 0 0 1 1 0 1 0 0
30 10 4 30 11667 20000 1 0 0 1 1 0 1 0 0
31 10 4 31 11668 20000 1 0 0 1 1 0 1 0 0
32 10 4 32 11669 20000 1 0 0 1 1 0 1 0 0
33 10 4 33 11670 20000 1 0 0 1 1 0 1 0 0
34 10 4 34 11671 20000 1 0 0 1 1 0 1 0 0
35 10 4 35 11672 20000 1 0 0 1 1 0 1 0 0
36 10 4 36 11673 20000 1 0 0 1 1 0 1 0 0
37 10 4 37 11674 20000 1 0 0 1 1 0 1 0 0
38 10 4 38 11675 20000 1 0 0 1 1 0 1 0 0
39 10 4 39 11676 20000 1 0 0 1 1 0 1 0 0
40 10 4 40 11677 20000 1 0 0 1 1 0 1 0 0
41 10 4 41 11678 20000 1 0 0 1 1 0 1 0 0
42 10 4 42 11679 20000 1 0 0 1 1 0 1 0 0
43 10 4 43 11680 20000 1 0 0 1 1 0 1 0 0
44 10 4 44 11681 20000 1 0 0 1 1 0 1 0 0
45 10 4 45 11682 20000 1 0 0 1 1 0 1 0 0
46 10 4 46 11683 20000 1 0 0 1 1 0 1 0 0
47 10 4 47 11684 20000 1 0 0 1 1 0 1 0 0
48 10 4 48 11685 20000 1 0 0 1 1 0 1 0 0
49 10 4 49 11686 20000 1 0 0 1 1 0 1 0 0
50 10 4 50 11687 20000 1 0 0 1 1 0 1 0 0
51 10 4 51 11688 20000 1 0 0 1 1 0 1 0 0
52 10 4 52 11689 20000 1 0 0 1 1 0 1 0 0
53 10 4 53 11690 20000 1 0 0 1 1 0 1 0 0
54 10 4 54 11691 20000 1 0 0 1 1 0 1 0 0
55 10 4 55 11692 20000 1 0 0 1 1 0 1 0 0
56 10 4 56 11693 20000 1 0 0 1 1 0 1 0 0
57 10 4 57 11694 20000 1 0 0 1 1 0 1 0 0
58 10 4 58 11695 20000 1 0 0 1 1 0 1 0 0
59 10 4 59 11696 20000 1 0 0 1 1 0 1 0 0
60 10 4 60 11697 20000 1 0 0 1 1 0 1 0 0
61 10 4 61 12893 20000 1 0 0 1 1 0 1 0 0
62 10 4 62 12894 20000 1 0 0 1 1 0 1 0 0
63 10 4 63 12895 20000 1 0 0 1 1 0 1 0 0
64 10 4 64 12896 20000 1 0 0 1 1 0 1 0 0
65 10 4 65 12897 20000 1 0 0 1 1 0 1 0 0
66 10 4 66 12898 20000 1 0 0 1 1 0 1 0 0
67 10 4 67 12899 20000 1 0 0 1 1 0 1 0 0
68 10 4 68 14337 20000 1 0 0 1 1 0 1 0 0
69 10 4 69 14338 20000 1 0 0 1 1 0 1 0 0
70 10 4 70 14339 20000 1 0 0 1 1 0 1 0 0
71 10 4 71 14340 20000 1 0 0 1 1 0 1 0 0
72 10 4 72 14341 20000 1 0 0 1 1 0 1 0 0
73 10 4 73 14342 20000 1 0 0 1 1 0 1 0 0
74 10 4 74 14343 20000 1 0 0 1 1 0 1 0 0
75 10 4 75 14344 20000 1 0 0 1 1 0 1 0 0
76 10 4 76 14345 20000 1 0 0 1 1 0 1 0 0
77 10 4 77 9254 10000 1 0 0 1 1 0 1 0 0
78 10 4 78 9255 10000 1 0 0 1 1 0 1 0 0
79 10 4 79 9256 10000 1 0 0 1 1 0 1 0 0
80 10 4 80 9257 10000 1 0 0 1 1 0 1 0 0
81 10 4 81 9258 10000 1 0 0 1 1 0 1 0 0
82 10 4 82 9259 10000 1 0 0 1 1 0 1 0 0
83 10 4 83 9260 10000 1 0 0 1 1 0 1 0 0
84 10 4 84 9261 10000 1 0 0 1 1 0 1 0 0
85 10 4 85 9262 10000 1 0 0 1 1 0 1 0 0
86 10 4 86 9263 10000 1 0 0 1 1 0 1 0 0
87 10 4 87 9264 10000 1 0 0 1 1 0 1 0 0
88 10 4 88 9265 10000 1 0 0 1 1 0 1 0 0
89 10 4 89 9266 10000 1 0 0 1 1 0 1 0 0
90 10 4 90 9267 10000 1 0 0 1 1 0 1 0 0
91 10 4 91 9268 10000 1 0 0 1 1 0 1 0 0
92 10 4 92 9269 10000 1 0 0 1 1 0 1 0 0
93 10 4 93 9270 10000 1 0 0 1 1 0 1 0 0
94 10 4 94 9271 10000 1 0 0 1 1 0 1 0 0
95 10 4 95 9272 10000 1 0 0 1 1 0 1 0 0
96 10 4 96 9273 10000 1 0 0 1 1 0 1 0 0
97 10 4 97 9274 10000 1 0 0 1 1 0 1 0 0
98 10 4 98 9275 10000 1 0 0 1 1 0 1 0 0
99 10 4 99 9276 10000 1 0 0 1 1 0 1 0 0
100 10 4 100 9277 10000 1 0 0 1 1 0 1 0 0
101 10 4 101 9278 10000 1 0 0 1 1 0 1 0 0
102 10 4 102 9279 10000 1 0 0 1 1 0 1 0 0
103 10 4 103 9280 10000 1 0 0 1 1 0 1 0 0
104 10 4 104 9281 10000 1 0 0 1 1 0 1 0 0
105 10 4 105 9282 10000 1 0 0 1 1 0 1 0 0
106 10 4 106 9283 10000 1 0 0 1 1 0 1 0 0
107 10 4 107 9284 10000 1 0 0 1 1 0 1 0 0
108 10 4 108 9285 10000 1 0 0 1 1 0 1 0 0
109 10 4 109 9286 10000 1 0 0 1 1 0 1 0 0
110 10 4 110 9287 10000 1 0 0 1 1 0 1 0 0
111 10 4 111 9288 10000 1 0 0 1 1 0 1 0 0
112 10 4 112 9289 10000 1 0 0 1 1 0 1 0 0
113 10 4 113 9290 10000 1 0 0 1 1 0 1 0 0
114 10 4 114 9291 10000 1 0 0 1 1 0 1 0 0
115 10 4 115 9292 10000 1 0 0 1 1 0 1 0 0
116 10 4 116 9293 10000 1 0 0 1 1 0 1 0 0
117 10 4 117 9294 10000 1 0 0 1 1 0 1 0 0
118 10 4 118 9295 10000 1 0 0 1 1 0 1 0 0
119 10 4 119 9296 10000 1 0 0 1 1 0 1 0 0
120 10 4 120 9297 10000 1 0 0 1 1 0 1 0 0
121 10 4 121 9298 10000 1 0 0 1 1 0 1 0 0
122 10 4 122 9299 10000 1 0 0 1 1 0 1 0 0
123 10 4 123 9300 10000 1 0 0 1 1 0 1 0 0
124 10 4 124 9301 10000 1 0 0 1 1 0 1 0 0
125 10 4 125 13196 10000 1 0 0 1 1 0 1 0 0
126 10 4 126 13197 10000 1 0 0 1 1 0 1 0 0
127 10 4 127 13198 10000 1 0 0 1 1 0 1 0 0
128 10 4 128 13199 10000 1 0 0 1 1 0 1 0 0
129 10 4 129 15542 10000 1 0 0 1 1 0 1 0 0
130 10 4 130 15543 10000 1 0 0 1 1 0 1 0 0
131 10 4 131 15544 10000 1 0 0 1 1 0 1 0 0
132 10 4 132 15545 10000 1 0 0 1 1 0 1 0 0
133 10 4 133 13640 20000 1 0 0 1 1 0 1 0 0
134 10 4 134 13641 20000 1 0 0 1 1 0 1 0 0
135 10 4 135 13642 20000 1 0 0 1 1 0 1 0 0
136 10 4 136 13643 20000 1 0 0 1 1 0 1 0 0
137 10 4 137 13644 20000 1 0 0 1 1 0 1 0 0
138 10 4 138 13645 20000 1 0 0 1 1 0 1 0 0
139 10 4 139 13646 20000 1 0 0 1 1 0 1 0 0
140 10 4 140 13647 20000 1 0 0 1 1 0 1 0 0
141 10 4 141 13648 20000 1 0 0 1 1 0 1 0 0
142 10 4 142 13649 20000 1 0 0 1 1 0 1 0 0
143 10 4 143 13650 20000 1 0 0 1 1 0 1 0 0
144 10 4 144 13651 20000 1 0 0 1 1 0 1 0 0
145 10 4 145 13652 20000 1 0 0 1 1 0 1 0 0
146 10 4 146 13653 20000 1 0 0 1 1 0 1 0 0
147 10 4 147 13654 20000 1 0 0 1 1 0 1 0 0
148 10 4 148 13655 20000 1 0 0 1 1 0 1 0 0
149 10 4 149 13656 20000 1 0 0 1 1 0 1 0 0
150 10 4 150 13657 20000 1 0 0 1 1 0 1 0 0
151 10 4 151 13658 20000 1 0 0 1 1 0 1 0 0
152 10 4 152 13659 20000 1 0 0 1 1 0 1 0 0
153 10 4 153 13660 20000 1 0 0 1 1 0 1 0 0
154 10 4 154 13661 20000 1 0 0 1 1 0 1 0 0
155 10 4 155 13662 20000 1 0 0 1 1 0 1 0 0
156 10 4 156 13663 20000 1 0 0 1 1 0 1 0 0
157 10 4 157 13664 20000 1 0 0 1 1 0 1 0 0
158 10 4 158 13665 20000 1 0 0 1 1 0 1 0 0
159 10 4 159 13666 20000 1 0 0 1 1 0 1 0 0
160 10 4 160 13667 20000 1 0 0 1 1 0 1 0 0
161 10 4 161 13668 20000 1 0 0 1 1 0 1 0 0
162 10 4 162 13669 20000 1 0 0 1 1 0 1 0 0
163 10 4 163 13670 20000 1 0 0 1 1 0 1 0 0
164 10 4 164 13671 20000 1 0 0 1 1 0 1 0 0
165 10 4 165 13672 20000 1 0 0 1 1 0 1 0 0
166 10 4 166 13673 20000 1 0 0 1 1 0 1 0 0
167 10 4 167 13674 20000 1 0 0 1 1 0 1 0 0
168 10 4 168 13675 20000 1 0 0 1 1 0 1 0 0
169 10 4 169 13676 20000 1 0 0 1 1 0 1 0 0
170 10 4 170 13677 20000 1 0 0 1 1 0 1 0 0
171 10 4 171 13678 20000 1 0 0 1 1 0 1 0 0
172 10 4 172 13679 20000 1 0 0 1 1 0 1 0 0
173 10 4 173 13680 20000 1 0 0 1 1 0 1 0 0
174 10 4 174 13681 20000 1 0 0 1 1 0 1 0 0
175 10 4 175 13682 20000 1 0 0 1 1 0 1 0 0
176 10 4 176 13683 20000 1 0 0 1 1 0 1 0 0
177 10 4 177 13684 20000 1 0 0 1 1 0 1 0 0
178 10 4 178 13685 20000 1 0 0 1 1 0 1 0 0
179 10 4 179 13686 20000 1 0 0 1 1 0 1 0 0
180 10 4 180 13687 20000 1 0 0 1 1 0 1 0 0
181 10 4 181 13688 20000 1 0 0 1 1 0 1 0 0
182 10 4 182 13689 20000 1 0 0 1 1 0 1 0 0
183 10 4 183 13690 20000 1 0 0 1 1 0 1 0 0
184 10 4 184 13691 20000 1 0 0 1 1 0 1 0 0
185 10 4 185 15546 20000 1 0 0 1 1 0 1 0 0
186 10 4 186 15547 20000 1 0 0 1 1 0 1 0 0
187 10 4 187 15548 20000 1 0 0 1 1 0 1 0 0
188 10 4 188 15549 20000 1 0 0 1 1 0 1 0 0
189 10 4 189 16162 35000 1 0 0 1 1 0 1 0 0
190 10 4 190 16163 35000 1 0 0 1 1 0 1 0 0
191 10 4 191 16164 35000 1 0 0 1 1 0 1 0 0
192 10 4 192 16165 35000 1 0 0 1 1 0 1 0 0
193 10 4 193 16166 35000 1 0 0 1 1 0 1 0 0
194 10 4 194 16167 35000 1 0 0 1 1 0 1 0 0
195 10 4 195 16168 35000 1 0 0 1 1 0 1 0 0
196 10 4 196 16169 35000 1 0 0 1 1 0 1 0 0
197 10 4 197 16172 35000 1 0 0 1 1 0 1 0 0
198 10 4 198 16173 35000 1 0 0 1 1 0 1 0 0
199 10 4 199 16174 35000 1 0 0 1 1 0 1 0 0
200 10 4 200 16175 35000 1 0 0 1 1 0 1 0 0
201 10 4 201 16176 35000 1 0 0 1 1 0 1 0 0
202 10 4 202 16177 35000 1 0 0 1 1 0 1 0 0
203 10 4 203 16178 35000 1 0 0 1 1 0 1 0 0
204 10 4 204 16179 35000 1 0 0 1 1 0 1 0 0
205 10 4 205 16182 35000 1 0 0 1 1 0 1 0 0
206 10 4 206 16183 35000 1 0 0 1 1 0 1 0 0
207 10 4 207 16184 35000 1 0 0 1 1 0 1 0 0
208 10 4 208 16185 35000 1 0 0 1 1 0 1 0 0
209 10 4 209 16186 35000 1 0 0 1 1 0 1 0 0
210 10 4 210 16187 35000 1 0 0 1 1 0 1 0 0
211 10 4 211 16188 35000 1 0 0 1 1 0 1 0 0
212 10 4 212 16189 35000 1 0 0 1 1 0 1 0 0
213 10 4 213 16192 35000 1 0 0 1 1 0 1 0 0
214 10 4 214 16193 35000 1 0 0 1 1 0 1 0 0
215 10 4 215 16194 35000 1 0 0 1 1 0 1 0 0
216 10 4 216 16195 35000 1 0 0 1 1 0 1 0 0
217 10 4 217 16196 35000 1 0 0 1 1 0 1 0 0
218 10 4 218 16197 35000 1 0 0 1 1 0 1 0 0
219 10 4 219 16198 35000 1 0 0 1 1 0 1 0 0
220 10 4 220 16199 35000 1 0 0 1 1 0 1 0 0
221 10 4 221 16202 35000 1 0 0 1 1 0 1 0 0
222 10 4 222 16203 35000 1 0 0 1 1 0 1 0 0
223 10 4 223 16204 35000 1 0 0 1 1 0 1 0 0
224 10 4 224 16205 35000 1 0 0 1 1 0 1 0 0
225 10 4 225 16206 35000 1 0 0 1 1 0 1 0 0
226 10 4 226 16207 35000 1 0 0 1 1 0 1 0 0
227 10 4 227 16208 35000 1 0 0 1 1 0 1 0 0
228 10 4 228 16209 35000 1 0 0 1 1 0 1 0 0
229 10 4 229 16212 35000 1 0 0 1 1 0 1 0 0
230 10 4 230 16213 35000 1 0 0 1 1 0 1 0 0
231 10 4 231 16214 35000 1 0 0 1 1 0 1 0 0
232 10 4 232 16215 35000 1 0 0 1 1 0 1 0 0
233 10 4 233 16216 35000 1 0 0 1 1 0 1 0 0
234 10 4 234 16217 35000 1 0 0 1 1 0 1 0 0
235 10 4 235 16218 35000 1 0 0 1 1 0 1 0 0
236 10 4 236 16219 35000 1 0 0 1 1 0 1 0 0
237 10 4 237 16222 35000 1 0 0 1 1 0 1 0 0
238 10 4 238 16223 35000 1 0 0 1 1 0 1 0 0
239 10 4 239 16224 35000 1 0 0 1 1 0 1 0 0
240 10 4 240 16225 35000 1 0 0 1 1 0 1 0 0
241 10 4 241 16226 35000 1 0 0 1 1 0 1 0 0
242 10 4 242 16227 35000 1 0 0 1 1 0 1 0 0
243 10 4 243 16228 35000 1 0 0 1 1 0 1 0 0
244 10 4 244 16229 35000 1 0 0 1 1 0 1 0 0
245 10 4 245 16232 35000 1 0 0 1 1 0 1 0 0
246 10 4 246 16233 35000 1 0 0 1 1 0 1 0 0
247 10 4 247 16234 35000 1 0 0 1 1 0 1 0 0
248 10 4 248 16235 35000 1 0 0 1 1 0 1 0 0
249 10 4 249 16236 35000 1 0 0 1 1 0 1 0 0
250 10 4 250 16237 35000 1 0 0 1 1 0 1 0 0
251 10 4 251 16238 35000 1 0 0 1 1 0 1 0 0
252 10 4 252 16239 35000 1 0 0 1 1 0 1 0 0
253 10 4 253 16242 35000 1 0 0 1 1 0 1 0 0
254 10 4 254 16243 35000 1 0 0 1 1 0 1 0 0
255 10 4 255 16244 35000 1 0 0 1 1 0 1 0 0
256 10 4 256 16245 35000 1 0 0 1 1 0 1 0 0
257 10 4 257 16246 35000 1 0 0 1 1 0 1 0 0
258 10 4 258 16247 35000 1 0 0 1 1 0 1 0 0
259 10 4 259 16248 35000 1 0 0 1 1 0 1 0 0
260 10 4 260 16249 35000 1 0 0 1 1 0 1 0 0
261 10 4 261 16252 35000 1 0 0 1 1 0 1 0 0
262 10 4 262 16253 35000 1 0 0 1 1 0 1 0 0
263 10 4 263 16254 35000 1 0 0 1 1 0 1 0 0
264 10 4 264 16255 35000 1 0 0 1 1 0 1 0 0
265 10 4 265 16256 35000 1 0 0 1 1 0 1 0 0
266 10 4 266 16257 35000 1 0 0 1 1 0 1 0 0
267 10 4 267 16258 35000 1 0 0 1 1 0 1 0 0
268 10 4 268 16259 35000 1 0 0 1 1 0 1 0 0
269 10 4 269 16262 35000 1 0 0 1 1 0 1 0 0
270 10 4 270 16263 35000 1 0 0 1 1 0 1 0 0
271 10 4 271 16264 35000 1 0 0 1 1 0 1 0 0
272 10 4 272 16265 35000 1 0 0 1 1 0 1 0 0
273 10 4 273 16266 35000 1 0 0 1 1 0 1 0 0
274 10 4 274 16267 35000 1 0 0 1 1 0 1 0 0
275 10 4 275 16268 35000 1 0 0 1 1 0 1 0 0
276 10 4 276 16269 35000 1 0 0 1 1 0 1 0 0
277 10 4 277 16272 35000 1 0 0 1 1 0 1 0 0
278 10 4 278 16273 35000 1 0 0 1 1 0 1 0 0
279 10 4 279 16274 35000 1 0 0 1 1 0 1 0 0
280 10 4 280 16275 35000 1 0 0 1 1 0 1 0 0
281 10 4 281 16276 35000 1 0 0 1 1 0 1 0 0
282 10 4 282 16277 35000 1 0 0 1 1 0 1 0 0
283 10 4 283 16278 35000 1 0 0 1 1 0 1 0 0
284 10 4 284 16279 35000 1 0 0 1 1 0 1 0 0
285 10 4 285 16282 35000 1 0 0 1 1 0 1 0 0
286 10 4 286 16283 35000 1 0 0 1 1 0 1 0 0
287 10 4 287 16284 35000 1 0 0 1 1 0 1 0 0
288 10 4 288 16285 35000 1 0 0 1 1 0 1 0 0
289 10 4 289 16286 35000 1 0 0 1 1 0 1 0 0
290 10 4 290 16287 35000 1 0 0 1 1 0 1 0 0
291 10 4 291 16288 35000 1 0 0 1 1 0 1 0 0
292 10 4 292 16289 35000 1 0 0 1 1 0 1 0 0
293 10 4 293 16292 35000 1 0 0 1 1 0 1 0 0
294 10 4 294 16293 35000 1 0 0 1 1 0 1 0 0
295 10 4 295 16294 35000 1 0 0 1 1 0 1 0 0
296 10 4 296 16295 35000 1 0 0 1 1 0 1 0 0
297 10 4 297 16296 35000 1 0 0 1 1 0 1 0 0
298 10 4 298 16297 35000 1 0 0 1 1 0 1 0 0
299 10 4 299 16298 35000 1 0 0 1 1 0 1 0 0
300 10 4 300 16299 35000 1 0 0 1 1 0 1 0 0
301 10 8 301 14136 15000 1 0 0 1 1 0 1 0 0
302 10 8 302 14137 15000 1 0 0 1 1 0 1 0 0
303 10 8 303 14138 15000 1 0 0 1 1 0 1 0 0
304 10 8 304 14139 15000 1 0 0 1 1 0 1 0 0
305 10 8 305 14140 15000 1 0 0 1 1 0 1 0 0
306 10 8 306 14141 15000 1 0 0 1 1 0 1 0 0
307 10 8 307 14142 15000 1 0 0 1 1 0 1 0 0
308 10 8 308 14143 15000 1 0 0 1 1 0 1 0 0
309 10 8 309 14144 15000 1 0 0 1 1 0 1 0 0
310 10 8 310 14145 15000 1 0 0 1 1 0 1 0 0
311 10 8 311 14454 30000 1 0 0 1 1 0 1 0 0
312 10 8 312 14455 30000 1 0 0 1 1 0 1 0 0
313 10 8 313 14456 30000 1 0 0 1 1 0 1 0 0
314 10 8 314 14457 30000 1 0 0 1 1 0 1 0 0
315 10 8 315 14458 30000 1 0 0 1 1 0 1 0 0
316 10 8 316 14459 30000 1 0 0 1 1 0 1 0 0
317 10 8 317 14460 30000 1 0 0 1 1 0 1 0 0
318 10 8 318 14461 30000 1 0 0 1 1 0 1 0 0
319 10 8 319 14462 30000 1 0 0 1 1 0 1 0 0
320 10 8 320 14463 30000 1 0 0 1 1 0 1 0 0
321 10 8 321 12724 50000 1 0 0 1 1 0 1 0 0
322 10 8 322 12725 50000 1 0 0 1 1 0 1 0 0
323 10 8 323 12726 50000 1 0 0 1 1 0 1 0 0
324 10 8 324 12727 50000 1 0 0 1 1 0 1 0 0
325 10 8 325 12728 50000 1 0 0 1 1 0 1 0 0
326 10 8 326 12729 50000 1 0 0 1 1 0 1 0 0
327 10 8 327 12730 50000 1 0 0 1 1 0 1 0 0
328 10 8 328 12731 50000 1 0 0 1 1 0 1 0 0
329 10 8 329 12732 50000 1 0 0 1 1 0 1 0 0
330 10 8 330 12733 50000 1 0 0 1 1 0 1 0 0
331 10 8 331 12734 50000 1 0 0 1 1 0 1 0 0
332 10 8 332 12735 50000 1 0 0 1 1 0 1 0 0
333 10 8 333 12736 50000 1 0 0 1 1 0 1 0 0
334 10 8 334 12737 50000 1 0 0 1 1 0 1 0 0
335 10 8 335 12738 50000 1 0 0 1 1 0 1 0 0
336 10 8 336 12739 50000 1 0 0 1 1 0 1 0 0
337 10 8 337 12740 50000 1 0 0 1 1 0 1 0 0
338 10 8 338 12741 50000 1 0 0 1 1 0 1 0 0
339 10 8 339 12742 50000 1 0 0 1 1 0 1 0 0
340 10 8 340 12743 50000 1 0 0 1 1 0 1 0 0
341 10 8 341 12744 50000 1 0 0 1 1 0 1 0 0
342 10 8 342 12745 50000 1 0 0 1 1 0 1 0 0
343 10 8 343 12746 50000 1 0 0 1 1 0 1 0 0
344 10 8 344 12747 50000 1 0 0 1 1 0 1 0 0
345 10 8 345 12748 50000 1 0 0 1 1 0 1 0 0
346 10 8 346 12749 50000 1 0 0 1 1 0 1 0 0
347 10 8 347 12750 50000 1 0 0 1 1 0 1 0 0
348 10 8 348 12751 50000 1 0 0 1 1 0 1 0 0
349 10 8 349 12752 50000 1 0 0 1 1 0 1 0 0
350 10 8 350 12753 50000 1 0 0 1 1 0 1 0 0
351 10 8 351 15070 50000 1 0 0 1 1 0 1 0 0
352 10 8 352 15071 50000 1 0 0 1 1 0 1 0 0
353 10 8 353 15072 50000 1 0 0 1 1 0 1 0 0
354 10 8 354 15073 50000 1 0 0 1 1 0 1 0 0
355 10 8 355 15074 50000 1 0 0 1 1 0 1 0 0
356 10 8 356 15075 50000 1 0 0 1 1 0 1 0 0
357 10 8 357 15076 50000 1 0 0 1 1 0 1 0 0
358 10 8 358 15077 50000 1 0 0 1 1 0 1 0 0
359 10 8 359 15078 50000 1 0 0 1 1 0 1 0 0
360 10 8 360 15079 50000 1 0 0 1 1 0 1 0 0
361 10 8 361 15567 20000 1 0 0 1 1 0 1 0 0
362 10 8 362 15568 20000 1 0 0 1 1 0 1 0 0
363 10 8 363 15569 20000 1 0 0 1 1 0 1 0 0
364 10 8 364 15570 20000 1 0 0 1 1 0 1 0 0
365 10 8 365 15571 20000 1 0 0 1 1 0 1 0 0
366 10 8 366 15572 20000 1 0 0 1 1 0 1 0 0
367 10 8 367 15573 20000 1 0 0 1 1 0 1 0 0
368 10 8 368 15574 20000 1 0 0 1 1 0 1 0 0
369 10 8 369 15575 20000 1 0 0 1 1 0 1 0 0
370 10 8 370 15576 20000 1 0 0 1 1 0 1 0 0
371 10 8 371 15577 20000 1 0 0 1 1 0 1 0 0
372 10 8 372 15578 20000 1 0 0 1 1 0 1 0 0
373 10 8 373 15579 20000 1 0 0 1 1 0 1 0 0
374 10 8 374 15580 20000 1 0 0 1 1 0 1 0 0
375 10 8 375 15581 20000 1 0 0 1 1 0 1 0 0
376 10 8 376 15582 20000 1 0 0 1 1 0 1 0 0
377 10 8 377 15583 20000 1 0 0 1 1 0 1 0 0
378 10 8 378 15584 20000 1 0 0 1 1 0 1 0 0
379 10 8 379 15585 20000 1 0 0 1 1 0 1 0 0
380 10 8 380 15586 20000 1 0 0 1 1 0 1 0 0
381 10 8 381 15587 20000 1 0 0 1 1 0 1 0 0
382 10 8 382 15588 20000 1 0 0 1 1 0 1 0 0
383 10 8 383 15589 20000 1 0 0 1 1 0 1 0 0
384 10 8 384 15590 20000 1 0 0 1 1 0 1 0 0
385 10 8 385 15591 20000 1 0 0 1 1 0 1 0 0
386 10 8 386 15592 20000 1 0 0 1 1 0 1 0 0
387 10 8 387 15593 20000 1 0 0 1 1 0 1 0 0
388 10 8 388 15594 20000 1 0 0 1 1 0 1 0 0
389 10 8 389 15595 20000 1 0 0 1 1 0 1 0 0
390 10 8 390 15596 20000 1 0 0 1 1 0 1 0 0
391 10 8 391 15597 20000 1 0 0 1 1 0 1 0 0
392 10 8 392 15598 20000 1 0 0 1 1 0 1 0 0
393 10 8 393 15599 20000 1 0 0 1 1 0 1 0 0
394 10 8 394 15600 20000 1 0 0 1 1 0 1 0 0
395 10 8 395 15601 20000 1 0 0 1 1 0 1 0 0
396 10 8 396 15602 20000 1 0 0 1 1 0 1 0 0
397 10 8 397 15603 20000 1 0 0 1 1 0 1 0 0
398 10 8 398 15604 20000 1 0 0 1 1 0 1 0 0
399 10 8 399 15605 20000 1 0 0 1 1 0 1 0 0
400 10 8 400 15606 20000 1 0 0 1 1 0 1 0 0
401 10 8 401 15607 20000 1 0 0 1 1 0 1 0 0
402 10 8 402 15608 20000 1 0 0 1 1 0 1 0 0
403 10 8 403 15609 20000 1 0 0 1 1 0 1 0 0
404 10 8 404 15610 20000 1 0 0 1 1 0 1 0 0
405 10 8 405 15611 20000 1 0 0 1 1 0 1 0 0
406 10 8 406 15612 20000 1 0 0 1 1 0 1 0 0
407 10 8 407 15613 20000 1 0 0 1 1 0 1 0 0
408 10 8 408 15614 20000 1 0 0 1 1 0 1 0 0
409 10 8 409 15615 20000 1 0 0 1 1 0 1 0 0
410 10 8 410 15616 20000 1 0 0 1 1 0 1 0 0
411 10 8 411 15617 20000 1 0 0 1 1 0 1 0 0
412 10 8 412 15618 20000 1 0 0 1 1 0 1 0 0
413 10 8 413 15619 20000 1 0 0 1 1 0 1 0 0
414 10 8 414 15620 20000 1 0 0 1 1 0 1 0 0
415 10 8 415 15621 20000 1 0 0 1 1 0 1 0 0
416 10 8 416 15622 20000 1 0 0 1 1 0 1 0 0
417 10 8 417 15623 20000 1 0 0 1 1 0 1 0 0
418 10 8 418 15624 20000 1 0 0 1 1 0 1 0 0
419 10 8 419 15625 20000 1 0 0 1 1 0 1 0 0
420 10 8 420 15626 20000 1 0 0 1 1 0 1 0 0
421 10 8 421 15627 20000 1 0 0 1 1 0 1 0 0
422 10 8 422 15628 20000 1 0 0 1 1 0 1 0 0
423 10 8 423 15629 20000 1 0 0 1 1 0 1 0 0
424 10 8 424 15630 20000 1 0 0 1 1 0 1 0 0
425 10 8 425 15631 20000 1 0 0 1 1 0 1 0 0
426 10 8 426 15632 20000 1 0 0 1 1 0 1 0 0
427 10 8 427 15633 20000 1 0 0 1 1 0 1 0 0
428 10 8 428 15634 20000 1 0 0 1 1 0 1 0 0
429 10 8 429 15635 20000 1 0 0 1 1 0 1 0 0
430 10 8 430 15636 20000 1 0 0 1 1 0 1 0 0
431 10 8 431 15637 20000 1 0 0 1 1 0 1 0 0
432 10 8 432 15638 20000 1 0 0 1 1 0 1 0 0
433 10 8 433 15639 20000 1 0 0 1 1 0 1 0 0
434 10 8 434 15640 20000 1 0 0 1 1 0 1 0 0
435 10 8 435 15641 20000 1 0 0 1 1 0 1 0 0
436 10 8 436 15642 20000 1 0 0 1 1 0 1 0 0
437 10 8 437 15643 20000 1 0 0 1 1 0 1 0 0
438 10 8 438 15644 20000 1 0 0 1 1 0 1 0 0
439 10 8 439 15645 20000 1 0 0 1 1 0 1 0 0
440 10 8 440 15646 20000 1 0 0 1 1 0 1 0 0
441 10 8 441 15647 20000 1 0 0 1 1 0 1 0 0
442 10 8 442 15648 20000 1 0 0 1 1 0 1 0 0
443 10 8 443 15649 20000 1 0 0 1 1 0 1 0 0
444 10 8 444 15650 20000 1 0 0 1 1 0 1 0 0
445 10 8 445 15651 20000 1 0 0 1 1 0 1 0 0
446 10 8 446 15652 20000 1 0 0 1 1 0 1 0 0
447 10 8 447 15653 20000 1 0 0 1 1 0 1 0 0
448 10 8 448 15654 20000 1 0 0 1 1 0 1 0 0
449 10 8 449 15655 20000 1 0 0 1 1 0 1 0 0
450 10 8 450 15656 20000 1 0 0 1 1 0 1 0 0
451 10 8 451 15657 20000 1 0 0 1 1 0 1 0 0
452 10 8 452 15658 20000 1 0 0 1 1 0 1 0 0
453 10 8 453 15659 20000 1 0 0 1 1 0 1 0 0
454 10 8 454 15660 20000 1 0 0 1 1 0 1 0 0
455 10 8 455 15661 20000 1 0 0 1 1 0 1 0 0
456 10 8 456 15662 20000 1 0 0 1 1 0 1 0 0
457 10 8 457 15663 20000 1 0 0 1 1 0 1 0 0
458 10 8 458 15664 20000 1 0 0 1 1 0 1 0 0
459 10 8 459 15665 20000 1 0 0 1 1 0 1 0 0
460 10 8 460 15666 20000 1 0 0 1 1 0 1 0 0
461 10 8 461 15667 20000 1 0 0 1 1 0 1 0 0
462 10 8 462 15668 20000 1 0 0 1 1 0 1 0 0
463 10 8 463 15669 20000 1 0 0 1 1 0 1 0 0
464 10 8 464 15670 20000 1 0 0 1 1 0 1 0 0
465 10 8 465 15671 20000 1 0 0 1 1 0 1 0 0
466 10 8 466 15672 20000 1 0 0 1 1 0 1 0 0
467 10 8 467 15673 20000 1 0 0 1 1 0 1 0 0
468 10 8 468 15674 20000 1 0 0 1 1 0 1 0 0
469 10 8 469 15675 20000 1 0 0 1 1 0 1 0 0
470 10 8 470 15676 20000 1 0 0 1 1 0 1 0 0
471 10 8 471 15677 20000 1 0 0 1 1 0 1 0 0
472 10 8 472 15678 20000 1 0 0 1 1 0 1 0 0
473 10 8 473 15679 20000 1 0 0 1 1 0 1 0 0
474 10 8 474 15680 20000 1 0 0 1 1 0 1 0 0
475 10 8 475 15681 20000 1 0 0 1 1 0 1 0 0
476 10 8 476 15682 20000 1 0 0 1 1 0 1 0 0
477 10 8 477 15683 20000 1 0 0 1 1 0 1 0 0
478 10 8 478 15684 20000 1 0 0 1 1 0 1 0 0
479 10 8 479 15685 20000 1 0 0 1 1 0 1 0 0
480 10 8 480 15686 20000 1 0 0 1 1 0 1 0 0
481 10 8 481 15687 20000 1 0 0 1 1 0 1 0 0
482 10 8 482 15688 20000 1 0 0 1 1 0 1 0 0
483 10 8 483 15689 20000 1 0 0 1 1 0 1 0 0
484 10 8 484 15690 20000 1 0 0 1 1 0 1 0 0
485 10 8 485 15691 20000 1 0 0 1 1 0 1 0 0
486 10 8 486 15692 20000 1 0 0 1 1 0 1 0 0
487 10 8 487 15693 20000 1 0 0 1 1 0 1 0 0
488 10 8 488 15694 20000 1 0 0 1 1 0 1 0 0
489 10 8 489 15695 20000 1 0 0 1 1 0 1 0 0
490 10 8 490 15696 20000 1 0 0 1 1 0 1 0 0
491 10 8 491 15697 20000 1 0 0 1 1 0 1 0 0
492 10 8 492 15698 20000 1 0 0 1 1 0 1 0 0
493 10 8 493 15699 20000 1 0 0 1 1 0 1 0 0
494 10 8 494 15700 20000 1 0 0 1 1 0 1 0 0
495 10 8 495 15701 20000 1 0 0 1 1 0 1 0 0
496 10 8 496 15702 20000 1 0 0 1 1 0 1 0 0
497 10 8 497 15703 20000 1 0 0 1 1 0 1 0 0
498 10 8 498 15704 20000 1 0 0 1 1 0 1 0 0
499 10 8 499 15705 20000 1 0 0 1 1 0 1 0 0
500 10 8 500 15706 20000 1 0 0 1 1 0 1 0 0
501 10 8 501 15707 20000 1 0 0 1 1 0 1 0 0
502 10 8 502 15708 20000 1 0 0 1 1 0 1 0 0
503 10 8 503 15709 20000 1 0 0 1 1 0 1 0 0
504 10 8 504 15710 20000 1 0 0 1 1 0 1 0 0
505 10 8 505 15711 20000 1 0 0 1 1 0 1 0 0
506 10 8 506 15712 20000 1 0 0 1 1 0 1 0 0
507 10 8 507 15713 20000 1 0 0 1 1 0 1 0 0
508 10 8 508 15714 20000 1 0 0 1 1 0 1 0 0
509 10 8 509 15715 20000 1 0 0 1 1 0 1 0 0
510 10 8 510 15716 20000 1 0 0 1 1 0 1 0 0
511 10 8 511 15717 20000 1 0 0 1 1 0 1 0 0
512 10 8 512 15718 20000 1 0 0 1 1 0 1 0 0
513 10 8 513 15719 20000 1 0 0 1 1 0 1 0 0
514 10 8 514 15720 20000 1 0 0 1 1 0 1 0 0
515 10 8 515 15721 20000 1 0 0 1 1 0 1 0 0
516 10 8 516 15722 20000 1 0 0 1 1 0 1 0 0
517 10 8 517 15723 20000 1 0 0 1 1 0 1 0 0
518 10 8 518 15724 20000 1 0 0 1 1 0 1 0 0
519 10 8 519 15725 20000 1 0 0 1 1 0 1 0 0
520 10 8 520 15726 20000 1 0 0 1 1 0 1 0 0
521 10 8 521 15727 20000 1 0 0 1 1 0 1 0 0
522 10 8 522 15728 20000 1 0 0 1 1 0 1 0 0
523 10 8 523 15729 20000 1 0 0 1 1 0 1 0 0
524 10 8 524 15730 20000 1 0 0 1 1 0 1 0 0
525 10 8 525 15731 20000 1 0 0 1 1 0 1 0 0
526 10 8 526 15732 20000 1 0 0 1 1 0 1 0 0
527 10 8 527 15733 20000 1 0 0 1 1 0 1 0 0
528 10 8 528 15734 20000 1 0 0 1 1 0 1 0 0
529 10 8 529 15735 20000 1 0 0 1 1 0 1 0 0
530 10 8 530 15736 20000 1 0 0 1 1 0 1 0 0
531 10 8 531 15737 20000 1 0 0 1 1 0 1 0 0
532 10 8 532 15738 20000 1 0 0 1 1 0 1 0 0
533 10 8 533 15739 20000 1 0 0 1 1 0 1 0 0
534 10 8 534 15740 20000 1 0 0 1 1 0 1 0 0
535 10 8 535 15741 20000 1 0 0 1 1 0 1 0 0
536 10 8 536 15742 20000 1 0 0 1 1 0 1 0 0
537 10 8 537 15743 20000 1 0 0 1 1 0 1 0 0
538 10 8 538 15744 20000 1 0 0 1 1 0 1 0 0
539 10 8 539 15745 20000 1 0 0 1 1 0 1 0 0
540 10 8 540 15746 20000 1 0 0 1 1 0 1 0 0
541 10 8 541 15747 20000 1 0 0 1 1 0 1 0 0
542 10 8 542 15748 20000 1 0 0 1 1 0 1 0 0
543 10 8 543 15749 20000 1 0 0 1 1 0 1 0 0
544 10 8 544 15750 20000 1 0 0 1 1 0 1 0 0
545 10 8 545 15751 20000 1 0 0 1 1 0 1 0 0
546 10 8 546 15752 20000 1 0 0 1 1 0 1 0 0
547 10 8 547 15753 20000 1 0 0 1 1 0 1 0 0
548 10 8 548 15754 20000 1 0 0 1 1 0 1 0 0
549 10 8 549 15755 20000 1 0 0 1 1 0 1 0 0
550 10 8 550 15756 20000 1 0 0 1 1 0 1 0 0
551 10 8 551 15757 20000 1 0 0 1 1 0 1 0 0
552 10 8 552 15758 20000 1 0 0 1 1 0 1 0 0
553 10 8 553 15759 20000 1 0 0 1 1 0 1 0 0
554 10 8 554 15760 20000 1 0 0 1 1 0 1 0 0
555 10 8 555 15761 20000 1 0 0 1 1 0 1 0 0
556 10 8 556 15762 20000 1 0 0 1 1 0 1 0 0
557 10 8 557 15763 20000 1 0 0 1 1 0 1 0 0
558 10 8 558 15764 20000 1 0 0 1 1 0 1 0 0
559 10 8 559 15765 20000 1 0 0 1 1 0 1 0 0
560 10 8 560 15766 20000 1 0 0 1 1 0 1 0 0
561 10 8 561 15919 20000 1 0 0 1 1 0 1 0 0
562 10 8 562 15920 20000 1 0 0 1 1 0 1 0 0
563 10 8 563 15921 20000 1 0 0 1 1 0 1 0 0
564 10 8 564 15922 20000 1 0 0 1 1 0 1 0 0
565 10 8 565 15923 20000 1 0 0 1 1 0 1 0 0
566 10 8 566 15924 20000 1 0 0 1 1 0 1 0 0
567 10 8 567 15925 20000 1 0 0 1 1 0 1 0 0
568 10 8 568 15926 20000 1 0 0 1 1 0 1 0 0
569 10 8 569 15927 20000 1 0 0 1 1 0 1 0 0
570 10 8 570 15928 20000 1 0 0 1 1 0 1 0 0
571 10 8 571 15929 20000 1 0 0 1 1 0 1 0 0
572 10 8 572 15930 20000 1 0 0 1 1 0 1 0 0
573 10 8 573 15931 20000 1 0 0 1 1 0 1 0 0
574 10 8 574 15932 20000 1 0 0 1 1 0 1 0 0
575 10 8 575 15933 20000 1 0 0 1 1 0 1 0 0
576 10 8 576 15934 20000 1 0 0 1 1 0 1 0 0
577 10 8 577 15935 20000 1 0 0 1 1 0 1 0 0
578 10 8 578 15936 20000 1 0 0 1 1 0 1 0 0
579 10 8 579 15937 20000 1 0 0 1 1 0 1 0 0
580 10 8 580 15938 20000 1 0 0 1 1 0 1 0 0
581 10 8 581 15939 20000 1 0 0 1 1 0 1 0 0
582 10 8 582 15940 20000 1 0 0 1 1 0 1 0 0
583 10 8 583 15941 20000 1 0 0 1 1 0 1 0 0
584 10 8 584 15942 20000 1 0 0 1 1 0 1 0 0
585 10 8 585 15943 20000 1 0 0 1 1 0 1 0 0
586 10 8 586 15944 20000 1 0 0 1 1 0 1 0 0
587 10 8 587 15945 20000 1 0 0 1 1 0 1 0 0
588 10 8 588 15946 20000 1 0 0 1 1 0 1 0 0
589 10 8 589 15947 20000 1 0 0 1 1 0 1 0 0
590 10 8 590 15948 20000 1 0 0 1 1 0 1 0 0
591 10 8 591 15949 20000 1 0 0 1 1 0 1 0 0
592 10 8 592 15950 20000 1 0 0 1 1 0 1 0 0
593 10 8 593 15951 20000 1 0 0 1 1 0 1 0 0
594 10 8 594 15952 20000 1 0 0 1 1 0 1 0 0
595 10 8 595 15953 20000 1 0 0 1 1 0 1 0 0
596 10 8 596 15954 20000 1 0 0 1 1 0 1 0 0
597 10 8 597 15955 20000 1 0 0 1 1 0 1 0 0
598 10 8 598 15956 20000 1 0 0 1 1 0 1 0 0
599 10 8 599 15957 20000 1 0 0 1 1 0 1 0 0
600 10 8 600 15958 20000 1 0 0 1 1 0 1 0 0
601 10 8 601 15959 20000 1 0 0 1 1 0 1 0 0
602 10 8 602 15960 20000 1 0 0 1 1 0 1 0 0
603 10 8 603 15961 20000 1 0 0 1 1 0 1 0 0
604 10 8 604 15962 20000 1 0 0 1 1 0 1 0 0
605 10 8 605 15963 20000 1 0 0 1 1 0 1 0 0
606 10 8 606 15964 20000 1 0 0 1 1 0 1 0 0
607 10 8 607 15965 20000 1 0 0 1 1 0 1 0 0
608 10 8 608 15966 20000 1 0 0 1 1 0 1 0 0
609 10 8 609 15967 20000 1 0 0 1 1 0 1 0 0
610 10 8 610 15968 20000 1 0 0 1 1 0 1 0 0
611 10 7 611 13506 250 1 0 0 1 1 0 1 50 0
612 10 7 612 15011 250 1 0 0 1 1 0 1 50 0
613 10 7 613 13636 250 1 0 0 1 1 0 1 50 0
614 10 7 614 1227 250 1 0 0 1 1 0 1 50 0
615 10 7 615 15022 250 1 0 0 1 1 0 1 50 0
616 10 8 616 4407 1000 1 0 0 1 1 0 1 0 0
617 10 8 617 4408 1000 1 0 0 1 1 0 1 0 0
618 10 8 618 4409 1000 1 0 0 1 1 0 1 0 0
619 10 8 619 4410 1000 1 0 0 1 1 0 1 0 0
620 10 8 620 4411 1000 1 0 0 1 1 0 1 0 0
621 10 8 621 4412 1000 1 0 0 1 1 0 1 0 0
622 10 8 622 4413 1000 1 0 0 1 1 0 1 0 0
623 10 8 623 4414 1000 1 0 0 1 1 0 1 0 0
624 10 8 624 4823 1000 1 0 0 1 1 0 1 0 0
625 10 8 625 4824 1000 1 0 0 1 1 0 1 0 0
626 10 8 626 4825 1000 1 0 0 1 1 0 1 0 0
627 10 8 627 4826 1000 1 0 0 1 1 0 1 0 0
628 10 8 628 4827 1000 1 0 0 1 1 0 1 0 0
629 10 8 629 4828 1000 1 0 0 1 1 0 1 0 0
630 10 8 630 4829 1000 1 0 0 1 1 0 1 0 0
631 10 8 631 4830 1000 1 0 0 1 1 0 1 0 0
632 10 8 632 5194 1000 1 0 0 1 1 0 1 0 0
633 10 8 633 5195 1000 1 0 0 1 1 0 1 0 0
634 10 8 634 5196 1000 1 0 0 1 1 0 1 0 0
635 10 8 635 5197 1000 1 0 0 1 1 0 1 0 0
636 10 8 636 5198 1000 1 0 0 1 1 0 1 0 0
637 10 8 637 5199 1000 1 0 0 1 1 0 1 0 0
638 10 8 638 5200 1000 1 0 0 1 1 0 1 0 0
639 10 8 639 5201 1000 1 0 0 1 1 0 1 0 0
640 10 8 640 13630 1000 1 0 0 1 1 0 1 0 0
641 10 8 641 13631 1000 1 0 0 1 1 0 1 0 0
642 10 8 642 13632 1000 1 0 0 1 1 0 1 0 0
643 10 8 643 13633 1000 1 0 0 1 1 0 1 0 0
644 10 8 644 13634 1000 1 0 0 1 1 0 1 0 0
645 10 8 645 13635 1000 1 0 0 1 1 0 1 0 0
646 10 8 646 15103 1000 1 0 0 1 1 0 1 0 0
647 10 8 647 15104 1000 1 0 0 1 1 0 1 0 0
648 10 8 648 15105 1000 1 0 0 1 1 0 1 0 0
649 10 8 649 15106 1000 1 0 0 1 1 0 1 0 0
650 10 8 650 15107 1000 1 0 0 1 1 0 1 0 0
651 10 8 651 15108 1000 1 0 0 1 1 0 1 0 0
652 10 8 652 16459 1000 1 0 0 1 1 0 1 0 0
653 10 8 653 16460 1000 1 0 0 1 1 0 1 0 0
654 10 8 654 16461 1000 1 0 0 1 1 0 1 0 0
655 10 8 655 16462 1000 1 0 0 1 1 0 1 0 0
656 10 8 656 16463 1000 1 0 0 1 1 0 1 0 0
657 10 8 657 16464 1000 1 0 0 1 1 0 1 0 0
658 10 8 658 16465 1000 1 0 0 1 1 0 1 0 0
659 10 8 659 16466 1000 1 0 0 1 1 0 1 0 0
660 10 8 660 16467 1000 1 0 0 1 1 0 1 0 0
661 10 8 661 16468 1000 1 0 0 1 1 0 1 0 0
662 10 8 662 16469 1000 1 0 0 1 1 0 1 0 0
663 10 8 663 16470 1000 1 0 0 1 1 0 1 0 0
664 10 8 664 16471 1000 1 0 0 1 1 0 1 0 0
665 10 8 665 16472 1000 1 0 0 1 1 0 1 0 0
666 10 8 666 13416 1000 1 0 0 1 1 0 1 0 0
667 10 8 667 13417 1000 1 0 0 1 1 0 1 0 0
668 10 8 668 13418 1000 1 0 0 1 1 0 1 0 0
669 10 8 669 13419 1000 1 0 0 1 1 0 1 0 0
670 10 8 670 13420 1000 1 0 0 1 1 0 1 0 0
671 10 8 671 14283 1000 1 0 0 1 1 0 1 0 0
672 10 8 672 14284 1000 1 0 0 1 1 0 1 0 0
673 10 8 673 14285 1000 1 0 0 1 1 0 1 0 0
674 10 8 674 14286 1000 1 0 0 1 1 0 1 0 0
675 10 8 675 13182 1000 1 0 0 1 1 0 1 0 0
676 10 8 676 13507 1000 1 0 0 1 1 0 1 0 0
677 10 8 677 13981 1000 1 0 0 1 1 0 1 0 0
678 10 8 678 14744 1000 1 0 0 1 1 0 1 0 0
679 10 8 679 14893 1000 1 0 0 1 1 0 1 0 0
680 10 8 680 15785 1000 1 0 0 1 1 0 1 0 0
681 10 8 681 16419 1000 1 0 0 1 1 0 1 0 0
682 10 8 682 11470 1000 1 0 0 1 1 0 1 0 0
683 10 8 683 12512 1000 1 0 0 1 1 0 1 0 0
684 10 8 684 12884 1000 1 0 0 1 1 0 1 0 0
685 10 8 685 12513 1000 1 0 0 1 1 0 1 0 0
686 10 8 686 12514 1000 1 0 0 1 1 0 1 0 0
687 10 8 687 12515 1000 1 0 0 1 1 0 1 0 0
688 10 8 688 12516 1000 1 0 0 1 1 0 1 0 0
689 10 8 689 12517 1000 1 0 0 1 1 0 1 0 0
690 10 8 690 12518 1000 1 0 0 1 1 0 1 0 0
691 10 8 691 12519 1000 1 0 0 1 1 0 1 0 0
692 10 8 692 12520 1000 1 0 0 1 1 0 1 0 0
693 10 8 693 12521 1000 1 0 0 1 1 0 1 0 0
694 10 8 694 8179 1000 1 0 0 1 1 0 1 0 0
695 10 8 695 9704 1000 1 0 0 1 1 0 1 0 0
696 10 8 696 15448 1000 1 0 0 1 1 0 1 0 0
697 10 8 697 11162 1000 1 0 0 1 1 0 1 0 0
698 10 8 698 11163 1000 1 0 0 1 1 0 1 0 0
699 10 8 699 11164 1000 1 0 0 1 1 0 1 0 0
700 10 8 700 11165 1000 1 0 0 1 1 0 1 0 0
701 10 8 701 11661 1000 1 0 0 1 1 0 1 0 0
702 10 8 702 11662 1000 1 0 0 1 1 0 1 0 0
703 10 8 703 14639 1000 1 0 0 1 1 0 1 0 0
704 10 8 704 13607 10 1 0 0 1 1 0 1 0 0
705 10 7 705 15774 3000 1 0 0 1 1 0 1 100 0
706 10 7 706 15775 3000 1 0 0 1 1 0 1 100 0
707 10 7 707 11420 3000 1 0 0 1 1 0 1 100 0
708 10 7 708 14704 3000 1 0 0 1 1 0 1 100 0
709 10 7 709 13177 3000 1 0 0 1 1 0 1 100 0
710 10 7 710 14191 3000 1 0 0 1 1 0 1 100 0
711 10 7 711 13449 3000 1 0 0 1 1 0 1 100 0
712 10 7 712 14192 3000 1 0 0 1 1 0 1 100 0
713 10 7 713 15772 3000 1 0 0 1 1 0 1 100 0
714 10 7 714 13791 3000 1 0 0 1 1 0 1 100 0
715 10 7 715 14006 3000 1 0 0 1 1 0 1 100 0
716 10 7 716 15768 3000 1 0 0 1 1 0 1 100 0
717 10 7 717 14069 3000 1 0 0 1 1 0 1 100 0
718 10 7 718 14124 3000 1 0 0 1 1 0 1 100 0
719 10 7 719 15507 3000 1 0 0 1 1 0 1 100 0
720 10 7 720 15508 3000 1 0 0 1 1 0 1 100 0
721 10 7 721 14855 3000 1 0 0 1 1 0 1 100 0
722 10 7 722 14894 3000 1 0 0 1 1 0 1 100 0
723 10 7 723 16444 3000 1 0 0 1 1 0 1 100 0
724 10 7 724 16445 3000 1 0 0 1 1 0 1 100 0
725 10 7 725 12509 3000 1 0 0 1 1 0 1 100 0
726 10 7 726 14126 3000 1 0 0 1 1 0 1 100 0
727 10 7 727 15062 3000 1 0 0 1 1 0 1 100 0
728 10 7 728 15063 3000 1 0 0 1 1 0 1 100 0
729 10 7 729 14891 3000 1 0 0 1 1 0 1 100 0
730 10 7 730 14895 3000 1 0 0 1 1 0 1 100 0
731 10 7 731 14091 3000 1 0 0 1 1 0 1 100 0
732 10 7 732 14092 3000 1 0 0 1 1 0 1 100 0
733 10 7 733 14501 3000 1 0 0 1 1 0 1 100 0
734 10 7 734 14506 3000 1 0 0 1 1 0 1 100 0
735 10 7 735 15285 3000 1 0 0 1 1 0 1 100 0
736 10 7 736 15286 3000 1 0 0 1 1 0 1 100 0
737 10 7 737 16442 3000 1 0 0 1 1 0 1 100 0
738 10 7 738 16443 3000 1 0 0 1 1 0 1 100 0
739 10 7 739 15027 3000 1 0 0 1 1 0 1 100 0
740 10 7 740 15028 3000 1 0 0 1 1 0 1 100 0
741 10 7 741 13453 3000 1 0 0 1 1 0 1 100 0
742 10 7 742 14193 3000 1 0 0 1 1 0 1 100 0
743 10 7 743 13178 3000 1 0 0 1 1 0 1 100 0
744 10 7 744 14194 3000 1 0 0 1 1 0 1 100 0
745 10 7 745 16454 3000 1 0 0 1 1 0 1 100 0
746 10 7 746 16455 3000 1 0 0 1 1 0 1 100 0
747 10 7 747 15030 3000 1 0 0 1 1 0 1 100 0
748 10 7 748 15031 3000 1 0 0 1 1 0 1 100 0
749 10 7 749 13790 3000 1 0 0 1 1 0 1 100 0
750 10 7 750 14005 3000 1 0 0 1 1 0 1 100 0
751 10 7 751 14406 3000 1 0 0 1 1 0 1 100 0
752 10 7 752 14413 3000 1 0 0 1 1 0 1 100 0
753 10 7 753 16448 3000 1 0 0 1 1 0 1 100 0
754 10 7 754 16449 3000 1 0 0 1 1 0 1 100 0
755 10 7 755 12872 3000 1 0 0 1 1 0 1 100 0
756 10 7 756 14187 3000 1 0 0 1 1 0 1 100 0
757 10 7 757 14125 3000 1 0 0 1 1 0 1 100 0
758 10 7 758 14500 3000 1 0 0 1 1 0 1 100 0
759 10 7 759 14505 3000 1 0 0 1 1 0 1 100 0
760 10 7 760 15118 3000 1 0 0 1 1 0 1 100 0
761 10 7 761 15119 3000 1 0 0 1 1 0 1 100 0
762 10 7 762 14662 3000 1 0 0 1 1 0 1 100 0
763 10 7 763 14663 3000 1 0 0 1 1 0 1 100 0
764 10 7 764 15771 3000 1 0 0 1 1 0 1 100 0
765 10 7 765 9700 3000 1 0 0 1 1 0 1 100 0
766 10 7 766 14498 3000 1 0 0 1 1 0 1 100 0
767 10 7 767 14913 3000 1 0 0 1 1 0 1 100 0
768 10 7 768 14914 3000 1 0 0 1 1 0 1 100 0
769 10 7 769 13508 3000 1 0 0 1 1 0 1 100 0
770 10 7 770 15115 3000 1 0 0 1 1 0 1 100 0
771 10 7 771 15116 3000 1 0 0 1 1 0 1 100 0
772 10 7 772 15113 3000 1 0 0 1 1 0 1 100 0
773 10 7 773 15114 3000 1 0 0 1 1 0 1 100 0
774 10 7 774 15222 3000 1 0 0 1 1 0 1 100 0
775 10 7 775 15223 3000 1 0 0 1 1 0 1 100 0
776 10 7 776 10750 3000 1 0 0 1 1 0 1 100 0
777 10 7 777 14705 3000 1 0 0 1 1 0 1 100 0
778 10 7 778 15027 3000 1 0 0 1 1 0 1 100 0
779 10 7 779 15028 3000 1 0 0 1 1 0 1 100 0
780 10 7 780 10380 3000 1 0 0 1 1 0 1 100 0
781 10 7 781 15060 3000 1 0 0 1 1 0 1 100 0
782 10 7 782 13963 3000 1 0 0 1 1 0 1 100 0
783 10 7 783 14026 3000 1 0 0 1 1 0 1 100 0
784 10 7 784 13964 3000 1 0 0 1 1 0 1 100 0
785 10 7 785 14027 3000 1 0 0 1 1 0 1 100 0
786 10 7 786 15064 3000 1 0 0 1 1 0 1 100 0
787 10 7 787 15065 3000 1 0 0 1 1 0 1 100 0
788 10 7 788 15524 3000 1 0 0 1 1 0 1 100 0
789 10 7 789 15525 3000 1 0 0 1 1 0 1 100 0
790 10 7 790 16450 3000 1 0 0 1 1 0 1 100 0
791 10 7 791 16451 3000 1 0 0 1 1 0 1 100 0
792 10 7 792 16344 3000 1 0 0 1 1 0 1 100 0
793 10 7 793 16345 3000 1 0 0 1 1 0 1 100 0
794 10 7 794 16342 3000 1 0 0 1 1 0 1 100 0
795 10 7 795 16343 3000 1 0 0 1 1 0 1 100 0
796 10 7 796 15220 3000 1 0 0 1 1 0 1 100 0
797 10 7 797 15221 3000 1 0 0 1 1 0 1 100 0
798 10 7 798 15066 3000 1 0 0 1 1 0 1 100 0
799 10 7 799 15067 3000 1 0 0 1 1 0 1 100 0
800 10 7 800 14089 3000 1 0 0 1 1 0 1 100 0
801 10 7 801 14090 3000 1 0 0 1 1 0 1 100 0
802 10 7 802 14195 3000 1 0 0 1 1 0 1 100 0
803 10 7 803 14196 3000 1 0 0 1 1 0 1 100 0
804 10 7 804 13965 3000 1 0 0 1 1 0 1 100 0
805 10 7 805 14028 3000 1 0 0 1 1 0 1 100 0
806 10 7 806 13508 3000 1 0 0 1 1 0 1 100 0
807 10 7 807 13962 3000 1 0 0 1 1 0 1 100 0
808 10 7 808 14314 3000 1 0 0 1 1 0 1 100 0
809 10 7 809 13404 3000 1 0 0 1 1 0 1 100 0
810 10 7 810 14188 3000 1 0 0 1 1 0 1 100 0
811 10 7 811 14032 3000 1 0 0 1 1 0 1 100 0
812 10 7 812 13960 3000 1 0 0 1 1 0 1 100 0
813 10 7 813 15819 3000 1 0 0 1 1 0 1 100 0
814 10 7 814 15820 3000 1 0 0 1 1 0 1 100 0
815 10 7 815 10750 3000 1 0 0 1 1 0 1 100 0
816 10 7 816 14705 3000 1 0 0 1 1 0 1 100 0
817 10 7 817 14407 3000 1 0 0 1 1 0 1 100 0
818 10 7 818 14414 3000 1 0 0 1 1 0 1 100 0
819 10 7 819 16352 3000 1 0 0 1 1 0 1 100 0
820 10 7 820 16353 3000 1 0 0 1 1 0 1 100 0
821 10 7 821 14502 3000 1 0 0 1 1 0 1 100 0
822 10 7 822 14507 3000 1 0 0 1 1 0 1 100 0
823 10 7 823 10811 3000 1 0 0 1 1 0 1 100 0
824 10 7 824 15061 3000 1 0 0 1 1 0 1 100 0
825 10 7 825 15823 3000 1 0 0 1 1 0 1 100 0
826 10 7 826 15824 3000 1 0 0 1 1 0 1 100 0
827 10 7 827 15224 3000 1 0 0 1 1 0 1 100 0
828 10 7 828 15225 3000 1 0 0 1 1 0 1 100 0
829 10 7 829 14503 3000 1 0 0 1 1 0 1 100 0
830 10 7 830 14510 3000 1 0 0 1 1 0 1 100 0
831 10 7 831 15776 3000 1 0 0 1 1 0 1 100 0
832 10 7 832 15777 3000 1 0 0 1 1 0 1 100 0
833 10 7 833 15821 3000 1 0 0 1 1 0 1 100 0
834 10 7 834 15822 3000 1 0 0 1 1 0 1 100 0
835 10 7 835 14198 3000 1 0 0 1 1 0 1 100 0
836 10 7 836 14197 3000 1 0 0 1 1 0 1 100 0
837 10 7 837 16446 3000 1 0 0 1 1 0 1 100 0
838 10 7 838 16447 3000 1 0 0 1 1 0 1 100 0
839 10 7 839 14905 3000 1 0 0 1 1 0 1 100 0
840 10 7 840 14907 3000 1 0 0 1 1 0 1 100 0
841 10 7 841 14904 3000 1 0 0 1 1 0 1 100 0
842 10 7 842 14906 3000 1 0 0 1 1 0 1 100 0
843 10 7 843 14659 3000 1 0 0 1 1 0 1 100 0
844 10 7 844 14660 3000 1 0 0 1 1 0 1 100 0
845 10 7 845 13326 3000 1 0 0 1 1 0 1 100 0
846 10 7 846 14416 3000 1 0 0 1 1 0 1 100 0
847 10 7 847 13450 3000 1 0 0 1 1 0 1 100 0
848 10 7 848 14031 3000 1 0 0 1 1 0 1 100 0
849 10 7 849 16492 3000 1 0 0 1 1 0 1 100 0
850 10 7 850 16493 3000 1 0 0 1 1 0 1 100 0
851 10 8 851 1520 1 1 0 0 1 1 0 1 0 0
852 10 8 852 7011 1 1 0 0 1 1 0 1 0 0
853 10 7 853 14299 500 1 0 0 1 1 0 1 20 0
854 10 7 854 14389 500 1 0 0 1 1 0 1 20 0
855 10 7 855 15177 500 1 0 0 1 1 0 1 20 0
856 10 7 856 14537 500 1 0 0 1 1 0 1 20 0
857 10 7 857 14758 500 1 0 0 1 1 0 1 20 0
858 10 7 858 14854 500 1 0 0 1 1 0 1 20 0
859 10 7 859 13974 500 1 0 0 1 1 0 1 20 0
860 10 7 860 15021 500 1 0 0 1 1 0 1 20 0
861 10 7 861 15111 500 1 0 0 1 1 0 1 20 0
862 10 7 862 15226 500 1 0 0 1 1 0 1 20 0
863 10 7 863 15773 500 1 0 0 1 1 0 1 20 0
864 10 7 864 15825 500 1 0 0 1 1 0 1 20 0
865 10 7 865 15827 500 1 0 0 1 1 0 1 20 0
866 10 7 866 16340 500 1 0 0 1 1 0 1 20 0
867 10 7 867 16341 500 1 0 0 1 1 0 1 20 0
868 10 7 868 16457 500 1 0 0 1 1 0 1 20 0
869 10 7 869 16458 500 1 0 0 1 1 0 1 20 0
870 10 7 870 11698 250 1 0 0 1 1 0 1 50 0
871 10 7 871 11700 250 1 0 0 1 1 0 1 50 0
872 10 8 872 4358 10 1 0 0 1 1 0 1 0 0
873 10 8 873 7981 1 1 0 0 1 1 0 1 0 0
874 10 8 874 7267 20 1 0 0 1 1 0 1 0 0
875 10 8 875 9958 20 1 0 0 1 1 0 1 0 999
876 10 8 876 1548 20 1 0 0 1 1 0 1 0 0
877 10 8 877 1613 20 1 0 0 1 1 0 1 0 0
878 10 8 878 1026 1 1 0 0 1 1 0 1 0 0
879 10 8 879 5380 1 1 0 0 1 1 0 1 0 0
880 10 8 880 11284 15 1 0 0 1 1 0 1 0 0
881 10 8 881 11285 15 1 0 0 1 1 0 1 0 0
882 10 8 882 11286 15 1 0 0 1 1 0 1 0 0
883 10 8 883 10356 500 1 0 0 1 1 0 1 0 0
884 10 8 884 12511 500 1 0 0 1 1 0 1 0 0
885 10 8 885 13238 500 1 0 0 1 1 0 1 0 0
886 10 8 886 1691 1 1 0 0 1 1 0 1 0 0
887 10 8 887 9708 1 1 0 0 1 1 0 1 0 0
888 10 8 888 11383 10 1 0 0 1 1 0 1 0 0
889 10 8 889 11382 10 1 0 0 1 1 0 1 0 0
890 10 8 890 11381 10 1 0 0 1 1 0 1 0 0
891 10 7 891 16348 3000 1 0 0 1 1 0 1 100 0
892 10 8 892 11386 10 1 0 0 1 1 0 1 0 0
893 10 8 893 5767 1 10000 0 0 1 1 0 1 0 0
894 10 8 894 5765 1 10000 0 0 1 1 0 1 0 0
895 10 8 895 5768 1 10000 0 0 1 1 0 1 0 0
896 10 8 896 14444 10 1 0 0 1 1 0 1 0 0
897 10 8 897 14443 10 1 0 0 1 1 0 1 0 0
898 10 8 898 14445 10 1 0 0 1 1 0 1 0 0
899 10 8 899 15068 500 1 0 0 1 1 0 1 20 0
900 10 7 900 16532 1000 1 0 0 1 1 0 1 0 0
901 10 8 901 100 1 10000 0 0 1 1 0 1 0 0
902 10 8 902 11243 1 1 0 0 1 1 0 1 0 0
903 10 8 903 101 1 10000 0 0 1 1 0 1 0 0
904 10 7 904 14368 3000 1 0 0 1 1 0 1 50 0
905 10 8 905 8943 1 20 0 0 1 1 0 1 0 0
906 10 7 906 1622 3000 1 0 0 1 1 0 1 0 0
907 10 8 907 8953 1 20 0 0 1 1 0 1 0 0
908 10 8 908 13693 1 20 0 0 1 1 0 1 0 0
909 10 8 909 8949 1 20 0 0 1 1 0 1 0 0
910 10 8 910 8955 1 20 0 0 1 1 0 1 0 0
911 10 7 911 16456 500 1 0 0 1 1 0 1 0 0

13
Erupe/.gitignore vendored Normal file
View File

@@ -0,0 +1,13 @@
www/jp/
.idea/
vendor/
bin/*.bin
bin/quests/*.bin
bin/questlists/*.bin
bin/scenarios/*.bin
bin/debug/*.bin
savedata/
Erupe.exe
*.lnk
*.bat

1
Erupe/Event List.txt Normal file
View File

@@ -0,0 +1 @@
0 is no event, 1 is "Week 1 Timestamp (broken), 2 is "Week 2 Timestamp (broken), 3 is Diva Defense

BIN
Erupe/Gifts/Cadeaux.bin Normal file

Binary file not shown.

BIN
Erupe/Gifts/Description.bin Normal file

Binary file not shown.

21
Erupe/LICENSE Normal file
View File

@@ -0,0 +1,21 @@
The MIT License (MIT)
Copyright (c) 2019 The Erupe Developers from Einherjar Team
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

83
Erupe/README.md Normal file
View File

@@ -0,0 +1,83 @@
# Erupe
## WARNING
This project is in its infancy and has no reliable active developer, no documentation, and no support.
# General info
Currently allows a JP MHF client (with GameGuard removed) to:
* Login and register an account (registration is automatic if account doesn't exist)
* Create a character
* Get ingame to the main city
* See other players walk around
* Do quests
* Use chat*
# Installation
## Server
1. Clone the repo with `git clone https://github.com/Andoryuuta/Erupe.git`
2. Install PostgreSQL
3. Launch psql shell, `CREATE DATABASE erupe;`.
4. Setup database with golang-migrate:
Windows:
```
> go get -tags 'postgres' -u github.com/golang-migrate/migrate/v4/cmd/migrate/
> set POSTGRESQL_URL=postgres://postgres:password@localhost:5432/erupe?sslmode=disable
> cd erupe
> migrate -database %POSTGRESQL_URL% -path migrations up
```
Linux:
```
> go get -tags 'postgres' -u github.com/golang-migrate/migrate/v4/cmd/migrate/
> export POSTGRESQL_URL=postgres://postgres:password@localhost:5432/erupe?sslmode=disable
> cd erupe
> migrate -database $POSTGRESQL_URL -path migrations up
```
(Replacing `postgres:password` with your postgres username and password)
5. Edit the config.json
Namely:
* Update the database username and password
* Update the `host_ip` and `ip` fields (there are multiple) to your external IP if you are hosting for multiple clients.
6. Place quest/scenario binaries.
The quest and scenario binary files should be placed in `bin/quests/` and `bin/scenarios` respectively.
## Launcher
Erupe ships with a rudimentary custom launcher, so you don't need to obtain the original TW/JP files to simply get ingame. However, it does still support using the original files if you choose to. To set this up, place a copy of the original launcher html/js/css in `./www/tw/`, and `/www/jp/` for the TW and JP files respectively.
Then, modify the the `/launcher/js/launcher.js` file as such:
* Find the call to `startUpdateProcess();` in a case statement and replace it with `finishUpdateProcess();`. (This disables the file check and updating)
* (JP ONLY): replace all uses of "https://" with "http://" in the file.
Finally, edit the config.json and set `UseOriginalLauncherFiles` to `true` under the launcher settings.
# Usage
### Note: If you are switching to/from the custom launcher html, you will have to clear your IE cache @ `C:\Users\<user>\AppData\Local\Microsoft\Windows\INetCache`.
## Server
```
cd Erupe
go run .
```
## Client
Add to hosts:
```
127.0.0.1 mhfg.capcom.com.tw
127.0.0.1 mhf-n.capcom.com.tw
127.0.0.1 cog-members.mhf-z.jp
127.0.0.1 www.capcom-onlinegames.jp
127.0.0.1 srv-mhf.capcom-networks.jp
```
Run mhf.exe normally (with locale emulator or appropriate timezone).

View File

@@ -0,0 +1,16 @@
BEGIN;
CREATE TABLE questlists (
ind int NOT NULL PRIMARY KEY,
questlist bytea
);
END;
INSERT INTO questlists (ind, questlist) VALUES ('0', pg_read_binary_file('c:\save\quest_0_0.bin'));
INSERT INTO questlists (ind, questlist) VALUES ('42', pg_read_binary_file('c:\save\quest_42_2A.bin'));
INSERT INTO questlists (ind, questlist) VALUES ('84', pg_read_binary_file('c:\save\quest_84_54.bin'));
INSERT INTO questlists (ind, questlist) VALUES ('126', pg_read_binary_file('c:\save\quest_126_7E.bin'));
INSERT INTO questlists (ind, questlist) VALUES ('168', pg_read_binary_file('c:\save\quest_168_A8.bin'));

View File

@@ -0,0 +1,8 @@
package bfutil
import "bytes"
// UpToNull returns the given byte slice's data, up to (not including) the first null byte.
func UpToNull(data []byte) []byte {
return bytes.SplitN(data, []byte{0x00}, 2)[0]
}

View File

@@ -0,0 +1,40 @@
package stringstack
import (
"errors"
"sync"
)
// StringStack is a basic LIFO "stack" for storing strings.
type StringStack struct {
sync.Mutex
stack []string
}
// New creates a new instance of StringStack
func New() *StringStack {
return &StringStack{}
}
// Push pushes a string onto the stack.
func (s *StringStack) Push(v string) {
s.Lock()
defer s.Unlock()
s.stack = append(s.stack, v)
}
// Pop pops a string from the stack.
func (s *StringStack) Pop() (string, error) {
s.Lock()
defer s.Unlock()
if len(s.stack) == 0 {
return "", errors.New("no items on stack")
}
x := s.stack[len(s.stack)-1]
s.stack = s.stack[:len(s.stack)-1]
return x, nil
}

View File

@@ -0,0 +1,93 @@
package stringsupport
import (
"bytes"
"io/ioutil"
"golang.org/x/text/encoding"
"golang.org/x/text/encoding/japanese"
"golang.org/x/text/transform"
)
// StringConverter is a small helper for encoding/decoding strings.
type StringConverter struct {
Encoding encoding.Encoding
}
// Decode decodes the given bytes as the set encoding.
func (sc *StringConverter) Decode(data []byte) (string, error) {
decoded, err := ioutil.ReadAll(transform.NewReader(bytes.NewBuffer(data), sc.Encoding.NewDecoder()))
if err != nil {
return "", err
}
return string(decoded), nil
}
// MustDecode decodes the given bytes as the set encoding. Panics on decode failure.
func (sc *StringConverter) MustDecode(data []byte) string {
decoded, err := sc.Decode(data)
if err != nil {
panic(err)
}
return decoded
}
// Encode encodes the given string as the set encoding.
func (sc *StringConverter) Encode(data string) ([]byte, error) {
encoded, err := ioutil.ReadAll(transform.NewReader(bytes.NewBuffer([]byte(data)), sc.Encoding.NewEncoder()))
if err != nil {
return nil, err
}
return encoded, nil
}
// MustEncode encodes the given string as the set encoding. Panics on encode failure.
func (sc *StringConverter) MustEncode(data string) []byte {
encoded, err := sc.Encode(data)
if err != nil {
panic(err)
}
return encoded
}
/*
func MustConvertShiftJISToUTF8(text string) string {
result, err := ConvertShiftJISToUTF8(text)
if err != nil {
panic(err)
}
return result
}
func MustConvertUTF8ToShiftJIS(text string) string {
result, err := ConvertUTF8ToShiftJIS(text)
if err != nil {
panic(err)
}
return result
}
func ConvertShiftJISToUTF8(text string) (string, error) {
r := bytes.NewBuffer([]byte(text))
decoded, err := ioutil.ReadAll(transform.NewReader(r, japanese.ShiftJIS.NewDecoder()))
if err != nil {
return "", err
}
return string(decoded), nil
}
*/
// ConvertUTF8ToShiftJIS converts a UTF8 string to a Shift-JIS []byte.
func ConvertUTF8ToShiftJIS(text string) ([]byte, error) {
r := bytes.NewBuffer([]byte(text))
encoded, err := ioutil.ReadAll(transform.NewReader(r, japanese.ShiftJIS.NewEncoder()))
if err != nil {
return nil, err
}
return encoded, nil
}

153
Erupe/config.json Normal file
View File

@@ -0,0 +1,153 @@
{
"host_ip": "",
"bin_path": "bin",
"devmode": true,
"devmodeoptions": {
"serverName" : "",
"cleandb": false,
"maxlauncherhr": true,
"LogOutboundMessages": false,
"Event": 0,
"OpcodeMessages": false,
"SaveDumps": {
"Enabled": true,
"OutputDir": "savedata"
}
},
"discord": {
"enabled": false,
"bottoken": "",
"channelid": ""
},
"database": {
"host": "localhost",
"port": 5432,
"user": "postgres",
"password": "",
"database": "erupe"
},
"launcher": {
"port": 80,
"UseOriginalLauncherFiles": false
},
"sign": {
"port": 53312
},
"channel": {
"port1": 54001,
"port2": 54002,
"port3": 54003,
"port4": 54004
},
"entrance": {
"port": 53310,
"entries": [
{
"name": " Server #1",
"ip": "",
"unk2": 0,
"type": 3,
"season": 3,
"unk6": 0,
"allowedclientflags": "4096",
"channels": [
{
"port": 54001,
"MaxPlayers": 100,
"CurrentPlayers": 0,
"Unk4": 0,
"Unk5": 0,
"Unk6": 0,
"Unk7": 0,
"Unk8": 0,
"Unk9": 0,
"Unk10": 319,
"Unk11": 248,
"Unk12": 159,
"Unk13": 12345
}
]
},
{
"name": " Server #2",
"ip": "",
"unk2": 0,
"type": 1,
"season": 3,
"unk6": 0,
"allowedclientflags": 0,
"channels": [
{
"port": 54002,
"MaxPlayers": 50,
"CurrentPlayers": 0,
"Unk4": 0,
"Unk5": 0,
"Unk6": 0,
"Unk7": 0,
"Unk8": 0,
"Unk9": 0,
"Unk10": 318,
"Unk11": 251,
"Unk12": 155,
"Unk13": 12345
}
]
},
{
"name": " Server #3",
"ip": "",
"unk2": 0,
"type": 2,
"season": 1,
"unk6": 0,
"allowedclientflags": 0,
"channels": [
{
"port": 54003,
"MaxPlayers": 50,
"CurrentPlayers": 0,
"Unk4": 0,
"Unk5": 0,
"Unk6": 0,
"Unk7": 0,
"Unk8": 0,
"Unk9": 0,
"Unk10": 318,
"Unk11": 251,
"Unk12": 155,
"Unk13": 12345
}
]
},
{
"name": " Server #4",
"ip": "",
"unk2": 0,
"type": 4,
"season": 0,
"unk6": 0,
"allowedclientflags": 0,
"channels": [
{
"port": 54004,
"MaxPlayers": 50,
"CurrentPlayers": 0,
"Unk4": 0,
"Unk5": 0,
"Unk6": 0,
"Unk7": 0,
"Unk8": 0,
"Unk9": 0,
"Unk10": 318,
"Unk11": 251,
"Unk12": 155,
"Unk13": 12345
}
]
}
]
}
}

157
Erupe/config/config.go Normal file
View File

@@ -0,0 +1,157 @@
package config
import (
"log"
"net"
"github.com/spf13/viper"
)
// Config holds the global server-wide config.
type Config struct {
HostIP string `mapstructure:"host_ip"`
BinPath string `mapstructure:"bin_path"`
DevMode bool
DevModeOptions DevModeOptions
Discord Discord
Database Database
Launcher Launcher
Sign Sign
Channel Channel
Entrance Entrance
}
// DevModeOptions holds various debug/temporary options for use while developing Erupe.
type DevModeOptions struct {
ServerName string // To get specific instance server about (Current Players/Event Week)
CleanDB bool // Automatically wipes the DB on server reset.
MaxLauncherHR bool // Sets the HR returned in the launcher to HR9 so that you can join non-beginner worlds.
FixedStageID bool // Causes all move_stage to use the ID sl1Ns200p0a0u0 to get you into all stages
LogOutboundMessages bool // Log all messages sent to the clients
Event int // Changes the current event
OpcodeMessages bool // Get all message for Opcodes
SaveDumps SaveDumpOptions
}
type SaveDumpOptions struct {
Enabled bool
OutputDir string
}
// Discord holds the discord integration config.
type Discord struct {
Enabled bool
BotToken string
ChannelID string
}
// Database holds the postgres database config.
type Database struct {
Host string
Port int
User string
Password string
Database string
}
// Launcher holds the launcher server config.
type Launcher struct {
Port int
UseOriginalLauncherFiles bool
}
// Sign holds the sign server config.
type Sign struct {
Port int
}
// Channel holds the channel server config.
type Channel struct {
Port1 int
Port2 int
Port3 int
Port4 int
}
// Entrance holds the entrance server config.
type Entrance struct {
Port uint16
Entries []EntranceServerInfo
}
// EntranceServerInfo represents an entry in the serverlist.
type EntranceServerInfo struct {
IP string
Unk2 uint16
Type uint8 // Server type. 0=?, 1=open, 2=cities, 3=newbie, 4=bar
Season uint8 // Server activity. 0 = green, 1 = orange, 2 = blue
Unk6 uint8 // Something to do with server recommendation on 0, 3, and 5.
Name string // Server name, 66 byte null terminated Shift-JIS(JP) or Big5(TW).
// 4096(PC, PS3/PS4)?, 8258(PC, PS3/PS4)?, 8192 == nothing?
// THIS ONLY EXISTS IF Binary8Header.type == "SV2", NOT "SVR"!
AllowedClientFlags uint32
Channels []EntranceChannelInfo
}
// EntranceChannelInfo represents an entry in a server's channel list.
type EntranceChannelInfo struct {
Port uint16
MaxPlayers uint16
CurrentPlayers uint16
Unk4 uint16
Unk5 uint16
Unk6 uint16
Unk7 uint16
Unk8 uint16
Unk9 uint16
Unk10 uint16
Unk11 uint16
Unk12 uint16
Unk13 uint16
}
// getOutboundIP4 gets the preferred outbound ip4 of this machine
// From https://stackoverflow.com/a/37382208
func getOutboundIP4() net.IP {
conn, err := net.Dial("udp4", "8.8.8.8:80")
if err != nil {
log.Fatal(err)
}
defer conn.Close()
localAddr := conn.LocalAddr().(*net.UDPAddr)
return localAddr.IP.To4()
}
// LoadConfig loads the given config toml file.
func LoadConfig() (*Config, error) {
viper.SetConfigName("config")
viper.AddConfigPath(".")
viper.SetDefault("DevModeOptions.SaveDumps", SaveDumpOptions{
Enabled: false,
OutputDir: "savedata",
})
err := viper.ReadInConfig()
if err != nil {
return nil, err
}
c := &Config{}
err = viper.Unmarshal(c)
if err != nil {
return nil, err
}
if c.HostIP == "" {
c.HostIP = getOutboundIP4().To4().String()
}
return c, nil
}

75
Erupe/go.mod Normal file
View File

@@ -0,0 +1,75 @@
module github.com/Solenataris/Erupe
go 1.16
require (
cloud.google.com/go v0.98.0 // indirect
cloud.google.com/go/spanner v1.27.0 // indirect
cloud.google.com/go/storage v1.18.2 // indirect
github.com/Andoryuuta/byteframe v0.0.0-20200114030334-8979c5cc4c4a
github.com/Azure/go-autorest/autorest/adal v0.9.17 // indirect
github.com/ClickHouse/clickhouse-go v1.5.1 // indirect
github.com/apache/arrow/go/arrow v0.0.0-20211112161151-bc219186db40 // indirect
github.com/aws/aws-sdk-go v1.42.19 // indirect
github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.7.4 // indirect
github.com/bwmarrin/discordgo v0.23.2
github.com/cenkalti/backoff/v4 v4.1.2 // indirect
github.com/census-instrumentation/opencensus-proto v0.3.0 // indirect
github.com/cespare/xxhash/v2 v2.1.2 // indirect
github.com/cncf/xds/go v0.0.0-20211130200136-a8f946100490 // indirect
github.com/cockroachdb/cockroach-go/v2 v2.2.4 // indirect
github.com/cznic/mathutil v0.0.0-20181122101859-297441e03548 // indirect
github.com/denisenkom/go-mssqldb v0.11.0 // indirect
github.com/envoyproxy/go-control-plane v0.10.1 // indirect
github.com/envoyproxy/protoc-gen-validate v0.6.2 // indirect
github.com/go-sql-driver/mysql v1.6.0 // indirect
github.com/go-stack/stack v1.8.1 // indirect
github.com/gocql/gocql v0.0.0-20211015133455-b225f9b53fa1 // indirect
github.com/golang-jwt/jwt/v4 v4.2.0 // indirect
github.com/golang-migrate/migrate/v4 v4.15.1 // indirect
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
github.com/golang/mock v1.6.0 // indirect
github.com/google/go-github/v35 v35.3.0 // indirect
github.com/google/go-querystring v1.1.0 // indirect
github.com/gorilla/handlers v1.5.1
github.com/gorilla/mux v1.8.0
github.com/gorilla/websocket v1.4.2 // indirect
github.com/hashicorp/errwrap v1.1.0 // indirect
github.com/hashicorp/go-cleanhttp v0.5.2 // indirect
github.com/hashicorp/go-multierror v1.1.1 // indirect
github.com/hashicorp/go-retryablehttp v0.7.0 // indirect
github.com/jackc/pgx/v4 v4.14.1 // indirect
github.com/jmoiron/sqlx v1.3.4
github.com/k0kubun/pp v3.0.1+incompatible // indirect
github.com/ktrysmt/go-bitbucket v0.9.32 // indirect
github.com/lib/pq v1.10.4
github.com/mattn/go-colorable v0.1.12 // indirect
github.com/mattn/go-sqlite3 v2.0.3+incompatible // indirect
github.com/mitchellh/mapstructure v1.4.3 // indirect
github.com/mutecomm/go-sqlcipher/v4 v4.4.2 // indirect
github.com/nakagami/firebirdsql v0.9.3 // indirect
github.com/neo4j/neo4j-go-driver v1.8.3 // indirect
github.com/pierrec/lz4/v4 v4.1.12 // indirect
github.com/pkg/errors v0.9.1 // indirect
github.com/sachaos/lottery v0.0.0-20180520074626-61949d99bd96
github.com/shopspring/decimal v1.3.1 // indirect
github.com/snowflakedb/gosnowflake v1.6.4 // indirect
github.com/spf13/viper v1.8.1
github.com/xanzy/go-gitlab v0.52.2 // indirect
github.com/youmark/pkcs8 v0.0.0-20201027041543-1326539a0a0a // indirect
go.mongodb.org/mongo-driver v1.8.0 // indirect
go.uber.org/atomic v1.9.0 // indirect
go.uber.org/multierr v1.7.0 // indirect
go.uber.org/zap v1.18.1
golang.org/x/crypto v0.0.0-20211202192323-5770296d904e
golang.org/x/net v0.0.0-20211205041911-012df41ee64c // indirect
golang.org/x/sys v0.0.0-20211205182925-97ca703d548d // indirect
golang.org/x/text v0.3.7
golang.org/x/time v0.0.0-20211116232009-f0f3c7e86c11 // indirect
golang.org/x/tools v0.1.8 // indirect
google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0 // indirect
google.golang.org/grpc v1.42.0 // indirect
modernc.org/ccgo/v3 v3.12.86 // indirect
modernc.org/ql v1.4.0 // indirect
modernc.org/sqlite v1.14.2 // indirect
)

1972
Erupe/go.sum Normal file

File diff suppressed because it is too large Load Diff

177
Erupe/main.go Normal file
View File

@@ -0,0 +1,177 @@
package main
import (
"fmt"
"os"
"os/signal"
"syscall"
"time"
"github.com/Solenataris/Erupe/config"
"github.com/Solenataris/Erupe/server/channelserver"
"github.com/Solenataris/Erupe/server/entranceserver"
"github.com/Solenataris/Erupe/server/launcherserver"
"github.com/Solenataris/Erupe/server/signserver"
"github.com/jmoiron/sqlx"
_ "github.com/lib/pq"
"go.uber.org/zap"
)
// Temporary DB auto clean on startup for quick development & testing.
func cleanDB(db *sqlx.DB) {
_ = db.MustExec("DELETE FROM guild_characters")
_ = db.MustExec("DELETE FROM guilds")
_ = db.MustExec("DELETE FROM characters")
_ = db.MustExec("DELETE FROM sign_sessions")
_ = db.MustExec("DELETE FROM users")
}
func main() {
zapLogger, _ := zap.NewDevelopment()
defer zapLogger.Sync()
logger := zapLogger.Named("main")
logger.Info("Starting Erupe")
// Load the configuration.
erupeConfig, err := config.LoadConfig()
if err != nil {
logger.Fatal("Failed to load config", zap.Error(err))
}
// Create the postgres DB pool.
connectString := fmt.Sprintf(
"host=%s port=%d user=%s password=%s dbname= %s sslmode=disable",
erupeConfig.Database.Host,
erupeConfig.Database.Port,
erupeConfig.Database.User,
erupeConfig.Database.Password,
erupeConfig.Database.Database,
)
db, err := sqlx.Open("postgres", connectString)
if err != nil {
logger.Fatal("Failed to open sql database", zap.Error(err))
}
// Test the DB connection.
err = db.Ping()
if err != nil {
logger.Fatal("Failed to ping database", zap.Error(err))
}
logger.Info("Connected to database")
// Clean the DB if the option is on.
if erupeConfig.DevMode && erupeConfig.DevModeOptions.CleanDB {
logger.Info("Cleaning DB")
cleanDB(db)
logger.Info("Done cleaning DB")
}
// Now start our server(s).
// Launcher HTTP server.
launcherServer := launcherserver.NewServer(
&launcherserver.Config{
Logger: logger.Named("launcher"),
ErupeConfig: erupeConfig,
DB: db,
UseOriginalLauncherFiles: erupeConfig.Launcher.UseOriginalLauncherFiles,
})
err = launcherServer.Start()
if err != nil {
logger.Fatal("Failed to start launcher server", zap.Error(err))
}
logger.Info("Started launcher server.")
// Entrance server.
entranceServer := entranceserver.NewServer(
&entranceserver.Config{
Logger: logger.Named("entrance"),
ErupeConfig: erupeConfig,
DB: db,
})
err = entranceServer.Start()
if err != nil {
logger.Fatal("Failed to start entrance server", zap.Error(err))
}
logger.Info("Started entrance server.")
// Sign server.
signServer := signserver.NewServer(
&signserver.Config{
Logger: logger.Named("sign"),
ErupeConfig: erupeConfig,
DB: db,
})
err = signServer.Start()
if err != nil {
logger.Fatal("Failed to start sign server", zap.Error(err))
}
logger.Info("Started sign server.")
// Channel Server
channelServer1 := channelserver.NewServer(
&channelserver.Config{
Logger: logger.Named("channel"),
ErupeConfig: erupeConfig,
DB: db,
})
err = channelServer1.Start(erupeConfig.Channel.Port1)
if err != nil {
logger.Fatal("Failed to start channel server1", zap.Error(err))
}
logger.Info("Started channel server.")
// Channel Server
channelServer2 := channelserver.NewServer(
&channelserver.Config{
Logger: logger.Named("channel"),
ErupeConfig: erupeConfig,
DB: db,
})
err = channelServer2.Start(erupeConfig.Channel.Port2)
if err != nil {
logger.Fatal("Failed to start channel server2", zap.Error(err))
}
// Channel Server
channelServer3 := channelserver.NewServer(
&channelserver.Config{
Logger: logger.Named("channel"),
ErupeConfig: erupeConfig,
DB: db,
})
err = channelServer3.Start(erupeConfig.Channel.Port3)
if err != nil {
logger.Fatal("Failed to start channel server3", zap.Error(err))
}
// Channel Server
channelServer4 := channelserver.NewServer(
&channelserver.Config{
Logger: logger.Named("channel"),
ErupeConfig: erupeConfig,
DB: db,
})
err = channelServer4.Start(erupeConfig.Channel.Port4)
if err != nil {
logger.Fatal("Failed to start channel server4", zap.Error(err))
}
// Wait for exit or interrupt with ctrl+C.
c := make(chan os.Signal, 1)
signal.Notify(c, os.Interrupt, syscall.SIGTERM)
<-c
logger.Info("Trying to shutdown gracefully.")
channelServer4.Shutdown()
channelServer3.Shutdown()
channelServer2.Shutdown()
channelServer1.Shutdown()
signServer.Shutdown()
entranceServer.Shutdown()
launcherServer.Shutdown()
time.Sleep(1 * time.Second)
}

View File

@@ -0,0 +1,10 @@
BEGIN;
DROP TABLE IF EXISTS sign_sessions;
DROP TABLE IF EXISTS characters;
DROP TABLE IF EXISTS users;
DROP DOMAIN IF EXISTS uint8;
DROP DOMAIN IF EXISTS uint16;
END;

View File

@@ -0,0 +1,36 @@
BEGIN;
CREATE DOMAIN uint8 AS smallint
CHECK(VALUE >= 0 AND VALUE <= 255);
CREATE DOMAIN uint16 AS integer
CHECK(VALUE >= 0 AND VALUE <= 65536);
CREATE TABLE users (
id serial NOT NULL PRIMARY KEY,
username text UNIQUE NOT NULL,
password text NOT NULL
);
CREATE TABLE characters (
id serial NOT NULL PRIMARY KEY,
user_id bigint REFERENCES users(id),
is_female boolean,
is_new_character boolean,
small_gr_level uint8,
gr_override_mode boolean,
name varchar(15),
unk_desc_string varchar(31),
gr_override_level uint16,
gr_override_unk0 uint8,
gr_override_unk1 uint8
);
CREATE TABLE sign_sessions (
id serial NOT NULL PRIMARY KEY,
user_id bigint REFERENCES users(id),
auth_token_num bigint,
auth_token_str text
);
END;

View File

@@ -0,0 +1,8 @@
BEGIN;
ALTER TABLE characters
DROP COLUMN exp,
DROP COLUMN weapon,
DROP COLUMN last_login;
END;

View File

@@ -0,0 +1,8 @@
BEGIN;
ALTER TABLE characters
ADD COLUMN exp uint16,
ADD COLUMN weapon uint16,
ADD COLUMN last_login integer;
END;

View File

@@ -0,0 +1,6 @@
BEGIN;
ALTER TABLE characters
DROP COLUMN savedata;
END;

View File

@@ -0,0 +1,6 @@
BEGIN;
ALTER TABLE characters
ADD COLUMN savedata bytea;
END;

View File

@@ -0,0 +1,13 @@
BEGIN;
ALTER TABLE characters
DROP COLUMN decomyset,
DROP COLUMN hunternavi,
DROP COLUMN otomoairou,
DROP COLUMN partner,
DROP COLUMN platebox,
DROP COLUMN platedata,
DROP COLUMN platemyset,
DROP COLUMN rengokudata;
END;

View File

@@ -0,0 +1,14 @@
BEGIN;
ALTER TABLE characters
ADD COLUMN decomyset bytea,
ADD COLUMN hunternavi bytea,
ADD COLUMN otomoairou bytea,
ADD COLUMN partner bytea,
ADD COLUMN platebox bytea,
ADD COLUMN platedata bytea,
ADD COLUMN platemyset bytea,
ADD COLUMN trophy bytea,
ADD COLUMN rengokudata bytea;
END;

View File

@@ -0,0 +1,5 @@
BEGIN;
DROP TABLE IF EXISTS questlists;
END;

View File

@@ -0,0 +1,8 @@
BEGIN;
CREATE TABLE questlists (
ind int NOT NULL PRIMARY KEY,
questlist bytea
);
END;

View File

@@ -0,0 +1,6 @@
BEGIN;
ALTER TABLE characters
DROP COLUMN savemercenary;
END;

View File

@@ -0,0 +1,6 @@
BEGIN;
ALTER TABLE characters
ADD COLUMN savemercenary bytea;
END;

View File

@@ -0,0 +1,6 @@
BEGIN;
DROP TABLE guild_characters;
DROP TABLE guilds;
END;

View File

@@ -0,0 +1,22 @@
BEGIN;
CREATE TABLE guilds
(
id serial NOT NULL PRIMARY KEY,
name varchar(24),
created_at timestamp DEFAULT NOW(),
leader_id int NOT NULL,
main_motto varchar(255) DEFAULT ''
);
CREATE TABLE guild_characters
(
id serial NOT NULL PRIMARY KEY,
guild_id bigint REFERENCES guilds (id),
character_id bigint REFERENCES characters (id),
joined_at timestamp DEFAULT NOW()
);
CREATE UNIQUE INDEX guild_character_unique_index ON guild_characters (character_id);
END;

View File

@@ -0,0 +1,11 @@
BEGIN;
ALTER TABLE guilds
DROP COLUMN rp;
ALTER TABLE guild_characters
DROP COLUMN is_applicant,
DROP COLUMN is_sub_leader,
DROP COLUMN order_index;
END;

View File

@@ -0,0 +1,11 @@
BEGIN;
ALTER TABLE guild_characters
ADD COLUMN is_applicant bool NOT NULL DEFAULT false,
ADD COLUMN is_sub_leader bool NOT NULL DEFAULT false,
ADD COLUMN order_index int NOT NULL DEFAULT 1;
ALTER TABLE guilds
ADD COLUMN rp uint16 NOT NULL DEFAULT 0;
END;

View File

@@ -0,0 +1,6 @@
BEGIN;
ALTER TABLE characters
DROP COLUMN restrict_guild_scout;
END;

View File

@@ -0,0 +1,6 @@
BEGIN;
ALTER TABLE characters
ADD COLUMN restrict_guild_scout bool NOT NULL DEFAULT false;
END;

View File

@@ -0,0 +1,10 @@
BEGIN;
ALTER TABLE guilds
DROP COLUMN comment,
DROP COLUMN festival_colour,
DROP COLUMN guild_hall;
DROP TYPE festival_colour;
END;

View File

@@ -0,0 +1,11 @@
BEGIN;
CREATE TYPE festival_colour AS ENUM ('none', 'red', 'blue');
ALTER TABLE guilds
ADD COLUMN comment varchar(255) NOT NULL DEFAULT '',
ADD COLUMN festival_colour festival_colour DEFAULT 'none',
ADD COLUMN guild_hall int DEFAULT 0;
END;

View File

@@ -0,0 +1,24 @@
BEGIN;
ALTER TABLE characters
DROP COLUMN minidata,
DROP COLUMN gacha_trial,
DROP COLUMN gacha_prem,
DROP COLUMN gacha_items,
DROP COLUMN daily_time,
DROP COLUMN frontier_points,
DROP COLUMN netcafe_points,
DROP COLUMN house_info,
DROP COLUMN login_boost,
DROP COLUMN skin_hist,
DROP COLUMN gcp;
DROP TABLE fpoint_items;
DROP TABLE gacha_shop;
DROP TABLE gacha_shop_items;
DROP TABLE lucky_box_state;
DROP TABLE stepup_state;
DROP TABLE normal_shop_items;
DROP TABLE shop_item_state;
END;

View File

@@ -0,0 +1,100 @@
BEGIN;
ALTER TABLE characters
ADD COLUMN minidata bytea,
ADD COLUMN gacha_trial int,
ADD COLUMN gacha_prem int,
ADD COLUMN gacha_items bytea,
ADD COLUMN daily_time timestamp,
ADD COLUMN frontier_points int,
ADD COLUMN netcafe_points int,
ADD COLUMN house_info bytea,
ADD COLUMN login_boost bytea,
ADD COLUMN skin_hist bytea,
ADD COLUMN kouryou_point int,
ADD COLUMN gcp int;
CREATE TABLE fpoint_items
(
hash int,
itemType uint8,
itemID uint16,
quant uint16,
itemValue uint16,
tradeType uint8
);
CREATE TABLE gacha_shop
(
hash bigint,
reqGR int,
reqHR int,
gachaName varchar(255),
gachaLink0 varchar(255),
gachaLink1 varchar(255),
gachaLink2 varchar(255),
extraIcon int,
gachaType int,
hideFlag bool
);
CREATE TABLE gacha_shop_items
(
shophash int,
entryType uint8,
itemhash int UNIQUE NOT NULL,
currType uint8,
currNumber uint16,
currQuant uint16,
percentage uint16,
rarityIcon uint8,
rollsCount uint8,
itemCount uint8,
dailyLimit uint8,
itemType int[],
itemId int[],
quantity int[]
);
CREATE TABLE lucky_box_state
(
char_id bigint REFERENCES characters (id),
shophash int UNIQUE NOT NULL,
used_itemhash int[]
);
CREATE TABLE stepup_state
(
char_id bigint REFERENCES characters (id),
shophash int UNIQUE NOT NULL,
step_progression int,
step_time timestamp
);
CREATE TABLE normal_shop_items
(
shoptype int,
shopid int,
itemhash int UNIQUE NOT NULL,
itemID uint16,
Points uint16,
TradeQuantity uint16,
rankReqLow uint16,
rankReqHigh uint16,
rankReqG uint16,
storeLevelReq uint16,
maximumQuantity uint16,
boughtQuantity uint16,
roadFloorsRequired uint16,
weeklyFatalisKills uint16
);
CREATE TABLE shop_item_state
(
char_id bigint REFERENCES characters (id),
itemhash int UNIQUE NOT NULL,
usedquantity int
);
END;

View File

@@ -0,0 +1,5 @@
BEGIN;
DROP TABLE login_boost_state;
END;

View File

@@ -0,0 +1,13 @@
BEGIN;
CREATE TABLE login_boost_state
(
char_id bigint REFERENCES characters (id),
week_req uint8,
week_count uint8,
available bool,
end_time int,
CONSTRAINT id_week UNIQUE(char_id, week_req)
);
END;

View File

@@ -0,0 +1,12 @@
BEGIN;
ALTER TABLE shop_item_state DROP CONSTRAINT shop_item_state_id_itemhash;
ALTER TABLE shop_item_state ADD CONSTRAINT shop_item_state_itemhash_key UNIQUE (itemhash);
ALTER TABLE stepup_state DROP CONSTRAINT stepup_state_id_shophash;
ALTER TABLE stepup_state ADD CONSTRAINT stepup_state_shophash_key UNIQUE (shophash);
ALTER TABLE lucky_box_state DROP CONSTRAINT lucky_box_state_id_shophash;
ALTER TABLE lucky_box_state ADD CONSTRAINT lucky_box_state_shophash_key UNIQUE (shophash);
END;

View File

@@ -0,0 +1,12 @@
BEGIN;
ALTER TABLE shop_item_state DROP CONSTRAINT shop_item_state_itemhash_key;
ALTER TABLE shop_item_state ADD CONSTRAINT shop_item_state_id_itemhash UNIQUE(char_id, itemhash);
ALTER TABLE stepup_state DROP CONSTRAINT stepup_state_shophash_key;
ALTER TABLE stepup_state ADD CONSTRAINT stepup_state_id_shophash UNIQUE(char_id, shophash);
ALTER TABLE lucky_box_state DROP CONSTRAINT lucky_box_state_shophash_key;
ALTER TABLE lucky_box_state ADD CONSTRAINT lucky_box_state_id_shophash UNIQUE(char_id, shophash);
END;

View File

@@ -0,0 +1,18 @@
BEGIN;
ALTER TABLE guild_characters
RENAME COLUMN avoid_leadership TO is_sub_leader;
ALTER TABLE guild_characters
ADD COLUMN is_applicant bool NOT NULL DEFAULT false;
ALTER TABLE guilds
DROP COLUMN icon,
ALTER COLUMN main_motto TYPE varchar USING '',
DROP COLUMN sub_motto;
ALTER TABLE guilds
ALTER COLUMN main_motto SET DEFAULT '';
DROP TABLE guild_applications;
DROP TYPE guild_application_type;
END;

View File

@@ -0,0 +1,30 @@
BEGIN;
CREATE TYPE guild_application_type AS ENUM ('applied', 'invited');
CREATE TABLE guild_applications
(
id serial NOT NULL PRIMARY KEY,
guild_id int NOT NULL REFERENCES guilds (id),
character_id int NOT NULL REFERENCES characters (id),
actor_id int NOT NULL REFERENCES characters (id),
application_type guild_application_type NOT NULL,
created_at timestamp NOT NULL DEFAULT now(),
CONSTRAINT guild_application_character_id UNIQUE (guild_id, character_id)
);
CREATE INDEX guild_application_type_index ON guild_applications (application_type);
ALTER TABLE guild_characters
DROP COLUMN is_applicant;
ALTER TABLE guild_characters
RENAME COLUMN is_sub_leader TO avoid_leadership;
ALTER TABLE guilds
ALTER COLUMN main_motto SET DEFAULT 0;
ALTER TABLE guilds
ADD COLUMN icon bytea,
ADD COLUMN sub_motto int DEFAULT 0,
ALTER COLUMN main_motto TYPE int USING 0;
END;

View File

@@ -0,0 +1,3 @@
BEGIN;
DROP TABLE mail;
END;

View File

@@ -0,0 +1,19 @@
BEGIN;
CREATE TABLE mail
(
id SERIAL NOT NULL PRIMARY KEY,
sender_id INT NOT NULL REFERENCES characters (id),
recipient_id INT NOT NULL REFERENCES characters (id),
subject VARCHAR NOT NULL DEFAULT '',
body VARCHAR NOT NULL DEFAULT '',
read BOOL NOT NULL DEFAULT FALSE,
attached_item_received BOOL NOT NULL DEFAULT FALSE,
attached_item INT DEFAULT NULL,
attached_item_amount INT NOT NULL DEFAULT 1,
is_guild_invite BOOL NOT NULL DEFAULT FALSE,
created_at TIMESTAMP NOT NULL DEFAULT NOW(),
deleted BOOL NOT NULL DEFAULT FALSE
);
CREATE INDEX mail_recipient_deleted_created_id_index ON mail (recipient_id, deleted, created_at DESC, id DESC);
END;

View File

@@ -0,0 +1,3 @@
BEGIN;
DROP TABLE public.servers;
END;

View File

@@ -0,0 +1,21 @@
BEGIN;
-- Table: public.servers
-- DROP TABLE IF EXISTS public.servers;
CREATE TABLE IF NOT EXISTS public.servers
(
server_id integer NOT NULL GENERATED ALWAYS AS IDENTITY ( INCREMENT 1 START 1 MINVALUE 1 MAXVALUE 2147483647 CACHE 1 ),
server_name text COLLATE pg_catalog."default",
season integer,
current_players integer,
event_id integer,
event_expiration integer,
CONSTRAINT servers_pkey PRIMARY KEY (server_id)
)
TABLESPACE pg_default;
ALTER TABLE IF EXISTS public.servers
OWNER to postgres;
END;

View File

@@ -0,0 +1,6 @@
BEGIN;
DROP TABLE public.account_ban;
DROP TABLE public.account_history;
DROP TABLE public.account_moderation;
DROP TABLE public.account_sub;
END;

View File

@@ -0,0 +1,45 @@
BEGIN;
CREATE TABLE IF NOT EXISTS public.account_ban
(
user_id integer NOT NULL,
title text COLLATE pg_catalog."default",
reason text COLLATE pg_catalog."default",
date text COLLATE pg_catalog."default",
pass_origin text COLLATE pg_catalog."default",
pass_block text COLLATE pg_catalog."default",
CONSTRAINT ban_pkey PRIMARY KEY (user_id)
);
CREATE TABLE IF NOT EXISTS public.account_history
(
report_id integer NOT NULL GENERATED ALWAYS AS IDENTITY ( INCREMENT 1 START 1 MINVALUE 1 MAXVALUE 2147483647 CACHE 1 ),
user_id integer,
title text COLLATE pg_catalog."default",
reason text COLLATE pg_catalog."default",
date date,
CONSTRAINT account_history_pkey PRIMARY KEY (report_id)
);
CREATE TABLE IF NOT EXISTS public.account_moderation
(
id integer NOT NULL GENERATED ALWAYS AS IDENTITY ( INCREMENT 1 START 1 MINVALUE 1 MAXVALUE 2147483647 CACHE 1 ),
username text COLLATE pg_catalog."default",
password text COLLATE pg_catalog."default",
type text COLLATE pg_catalog."default",
CONSTRAINT account_moderation_pkey PRIMARY KEY (id)
);
CREATE TABLE IF NOT EXISTS public.account_sub
(
id integer NOT NULL GENERATED BY DEFAULT AS IDENTITY ( INCREMENT 1 START 1 MINVALUE 1 MAXVALUE 2147483647 CACHE 1 ),
discord_id text COLLATE pg_catalog."default",
erupe_account text COLLATE pg_catalog."default",
erupe_password text COLLATE pg_catalog."default",
date_inscription date,
country text COLLATE pg_catalog."default",
presentation text COLLATE pg_catalog."default",
CONSTRAINT account_auth_pkey PRIMARY KEY (id)
);
END;

View File

@@ -0,0 +1,3 @@
BEGIN;
DROP TABLE public.event_week;
END;

View File

@@ -0,0 +1,11 @@
BEGIN;
CREATE TABLE IF NOT EXISTS public.event_week
(
id integer NOT NULL,
event_id integer NOT NULL,
date_expiration integer NOT NULL,
CONSTRAINT event_week_pkey PRIMARY KEY (id)
);
END;

View File

@@ -0,0 +1,3 @@
BEGIN;
DROP TABLE public.gook;
END;

View File

@@ -0,0 +1,20 @@
BEGIN;
CREATE TABLE IF NOT EXISTS public.gook
(
id serial NOT NULL PRIMARY KEY,
gook0 bytea,
gook1 bytea,
gook2 bytea,
gook3 bytea,
gook4 bytea,
gook5 bytea,
gook0status boolean,
gook1status boolean,
gook2status boolean,
gook3status boolean,
gook4status boolean,
gook5status boolean
);
END;

View File

@@ -0,0 +1,3 @@
BEGIN;
DROP TABLE public.history;
END;

View File

@@ -0,0 +1,13 @@
BEGIN;
CREATE TABLE IF NOT EXISTS public.history
(
user_id integer,
admin_id integer,
report_id integer NOT NULL,
title text COLLATE pg_catalog."default",
reason text COLLATE pg_catalog."default",
CONSTRAINT history_pkey PRIMARY KEY (report_id)
);
END;

View File

@@ -0,0 +1,60 @@
package binpacket
import (
"github.com/Solenataris/Erupe/network"
"github.com/Andoryuuta/byteframe"
)
// ChatType represents the chat message type (Thanks to @Alice on discord for identifying these!)
type ChatType uint8
// Chat types
const (
ChatTypeLocal ChatType = 1
ChatTypeGuild = 2
ChatTypeAlliance = 3
ChatTypeParty = 4
ChatTypeWhisper = 5
)
// MsgBinChat is a binpacket for chat messages.
type MsgBinChat struct {
Unk0 uint8
Type ChatType
Flags uint16
Message string
SenderName string
}
// Opcode returns the ID associated with this packet type.
func (m *MsgBinChat) Opcode() network.PacketID {
return network.MSG_SYS_CAST_BINARY
}
// Parse parses the packet from binary
func (m *MsgBinChat) Parse(bf *byteframe.ByteFrame) error {
m.Unk0 = bf.ReadUint8()
m.Type = ChatType(bf.ReadUint8())
m.Flags = bf.ReadUint16()
senderNameSize := bf.ReadUint16()
messageSize := bf.ReadUint16()
// TODO(Andoryuuta): Need proper shift-jis and null termination.
m.Message = string(bf.ReadBytes(uint(messageSize))[:messageSize-1])
m.SenderName = string(bf.ReadBytes(uint(senderNameSize))[:senderNameSize-1])
return nil
}
// Build builds a binary packet from the current data.
func (m *MsgBinChat) Build(bf *byteframe.ByteFrame) error {
bf.WriteUint8(m.Unk0)
bf.WriteUint8(uint8(m.Type))
bf.WriteUint16(m.Flags)
bf.WriteUint16(uint16(len(m.SenderName) + 1))
bf.WriteUint16(uint16(len(m.Message) + 1))
bf.WriteNullTerminatedBytes([]byte(m.Message))
bf.WriteNullTerminatedBytes([]byte(m.SenderName))
return nil
}

View File

@@ -0,0 +1,29 @@
package binpacket
import (
"github.com/Solenataris/Erupe/common/stringsupport"
"github.com/Solenataris/Erupe/network"
"github.com/Andoryuuta/byteframe"
)
type MsgBinMailNotify struct {
SenderName string
}
func (m MsgBinMailNotify) Parse(bf *byteframe.ByteFrame) error {
panic("implement me")
}
func (m MsgBinMailNotify) Build(bf *byteframe.ByteFrame) error {
bf.WriteUint8(0x01) // Unk
byteName, _ := stringsupport.ConvertUTF8ToShiftJIS(m.SenderName)
bf.WriteBytes(byteName)
bf.WriteBytes(make([]byte, 21-len(byteName)))
return nil
}
func (m MsgBinMailNotify) Opcode() network.PacketID {
return network.MSG_SYS_CASTED_BINARY
}

View File

@@ -0,0 +1,46 @@
package binpacket
import (
"github.com/Solenataris/Erupe/network"
"github.com/Andoryuuta/byteframe"
)
// MsgBinTargeted is a format used for some broadcast types
// to target specific players, instead of groups (world, stage, etc).
// It forwards a normal binpacket in it's RawDataPayload
type MsgBinTargeted struct {
TargetCount uint16
TargetCharIDs []uint32
RawDataPayload []byte // The regular binary payload to be forwarded to the targets.
}
// Opcode returns the ID associated with this packet type.
func (m *MsgBinTargeted) Opcode() network.PacketID {
return network.MSG_SYS_CAST_BINARY
}
// Parse parses the packet from binary
func (m *MsgBinTargeted) Parse(bf *byteframe.ByteFrame) error {
m.TargetCount = bf.ReadUint16()
m.TargetCharIDs = make([]uint32, m.TargetCount)
for i := uint16(0); i < m.TargetCount; i++ {
m.TargetCharIDs[i] = bf.ReadUint32()
}
m.RawDataPayload = bf.DataFromCurrent()
return nil
}
// Build builds a binary packet from the current data.
func (m *MsgBinTargeted) Build(bf *byteframe.ByteFrame) error {
bf.WriteUint16(m.TargetCount)
for i := 0; i < int(m.TargetCount); i++ {
bf.WriteUint32(m.TargetCharIDs[i])
}
bf.WriteBytes(m.RawDataPayload)
return nil
}

View File

@@ -0,0 +1,8 @@
package clientctx
import "github.com/Solenataris/Erupe/common/stringsupport"
// ClientContext holds contextual data required for packet encoding/decoding.
type ClientContext struct {
StrConv *stringsupport.StringConverter
}

125
Erupe/network/crypt_conn.go Normal file
View File

@@ -0,0 +1,125 @@
package network
import (
"encoding/hex"
"errors"
"fmt"
"io"
"net"
"github.com/Solenataris/Erupe/network/crypto"
)
// CryptConn represents a MHF encrypted two-way connection,
// it automatically handles encryption, decryption, and key rotation via it's methods.
type CryptConn struct {
conn net.Conn
readKeyRot uint32
sendKeyRot uint32
sentPackets int32
prevRecvPacketCombinedCheck uint16
prevSendPacketCombinedCheck uint16
}
// NewCryptConn creates a new CryptConn with proper default values.
func NewCryptConn(conn net.Conn) *CryptConn {
cc := &CryptConn{
conn: conn,
readKeyRot: 995117,
sendKeyRot: 995117,
}
return cc
}
// ReadPacket reads an packet from the connection and returns the decrypted data.
func (cc *CryptConn) ReadPacket() ([]byte, error) {
// Read the raw 14 byte header.
headerData := make([]byte, CryptPacketHeaderLength)
_, err := io.ReadFull(cc.conn, headerData)
if err != nil {
return nil, err
}
// Parse the data into a usable struct.
cph, err := NewCryptPacketHeader(headerData)
if err != nil {
return nil, err
}
// Now read the encrypted packet body after getting its size from the header.
encryptedPacketBody := make([]byte, cph.DataSize)
_, err = io.ReadFull(cc.conn, encryptedPacketBody)
if err != nil {
return nil, err
}
// Update the key rotation before decrypting.
if cph.KeyRotDelta != 0 {
cc.readKeyRot = (uint32(cph.KeyRotDelta) * (cc.readKeyRot + 1))
}
out, combinedCheck, check0, check1, check2 := crypto.Decrypt(encryptedPacketBody, cc.readKeyRot, nil)
if cph.Check0 != check0 || cph.Check1 != check1 || cph.Check2 != check2 {
fmt.Printf("got c0 %X, c1 %X, c2 %X\n", check0, check1, check2)
fmt.Printf("want c0 %X, c1 %X, c2 %X\n", cph.Check0, cph.Check1, cph.Check2)
fmt.Printf("headerData:\n%s\n", hex.Dump(headerData))
fmt.Printf("encryptedPacketBody:\n%s\n", hex.Dump(encryptedPacketBody))
// Attempt to bruteforce it.
fmt.Println("Crypto out of sync? Attempting bruteforce")
for key := byte(0); key < 255; key++ {
out, combinedCheck, check0, check1, check2 = crypto.Decrypt(encryptedPacketBody, 0, &key)
//fmt.Printf("Key: 0x%X\n%s\n", key, hex.Dump(out))
if cph.Check0 == check0 && cph.Check1 == check1 && cph.Check2 == check2 {
fmt.Printf("Bruceforce successful, override key: 0x%X\n", key)
// Try to fix key for subsequent packets?
//cc.readKeyRot = (uint32(key) << 1) + 999983
cc.prevRecvPacketCombinedCheck = combinedCheck
return out, nil
}
}
return nil, errors.New("decrypted data checksum doesn't match header")
}
cc.prevRecvPacketCombinedCheck = combinedCheck
return out, nil
}
// SendPacket encrypts and sends a packet.
func (cc *CryptConn) SendPacket(data []byte) error {
keyRotDelta := byte(3)
if keyRotDelta != 0 {
cc.sendKeyRot = (uint32(keyRotDelta) * (cc.sendKeyRot + 1))
}
// Encrypt the data
encData, combinedCheck, check0, check1, check2 := crypto.Encrypt(data, cc.sendKeyRot, nil)
header := &CryptPacketHeader{}
header.Pf0 = byte(((uint(len(encData)) >> 12) & 0xF3) | 3)
header.KeyRotDelta = keyRotDelta
header.PacketNum = uint16(cc.sentPackets)
header.DataSize = uint16(len(encData))
header.PrevPacketCombinedCheck = cc.prevSendPacketCombinedCheck
header.Check0 = check0
header.Check1 = check1
header.Check2 = check2
headerBytes, err := header.Encode()
if err != nil {
return err
}
cc.conn.Write(headerBytes)
cc.conn.Write(encData)
cc.sentPackets++
cc.prevSendPacketCombinedCheck = combinedCheck
return nil
}

View File

@@ -0,0 +1,90 @@
package network
import (
"bytes"
"encoding/binary"
)
const (
// CryptPacketHeaderLength represents the byte-length of
// an encrypted packet header.
CryptPacketHeaderLength = 14
)
// CryptPacketHeader represents the parsed information of an encrypted packet header.
type CryptPacketHeader struct {
Pf0 byte
KeyRotDelta byte
PacketNum uint16
DataSize uint16
PrevPacketCombinedCheck uint16
Check0 uint16
Check1 uint16
Check2 uint16
}
// NewCryptPacketHeader parses raw bytes into a CryptPacketHeader
func NewCryptPacketHeader(data []byte) (*CryptPacketHeader, error) {
var c = CryptPacketHeader{}
r := bytes.NewReader(data)
var err error
err = binary.Read(r, binary.BigEndian, &c.Pf0)
if err != nil {
return nil, err
}
err = binary.Read(r, binary.BigEndian, &c.KeyRotDelta)
if err != nil {
return nil, err
}
err = binary.Read(r, binary.BigEndian, &c.PacketNum)
if err != nil {
return nil, err
}
err = binary.Read(r, binary.BigEndian, &c.DataSize)
if err != nil {
return nil, err
}
err = binary.Read(r, binary.BigEndian, &c.PrevPacketCombinedCheck)
if err != nil {
return nil, err
}
err = binary.Read(r, binary.BigEndian, &c.Check0)
if err != nil {
return nil, err
}
err = binary.Read(r, binary.BigEndian, &c.Check1)
if err != nil {
return nil, err
}
err = binary.Read(r, binary.BigEndian, &c.Check2)
if err != nil {
return nil, err
}
return &c, nil
}
// Encode encodes the CryptPacketHeader into raw bytes.
func (c *CryptPacketHeader) Encode() ([]byte, error) {
buf := bytes.NewBuffer([]byte{})
var data = []interface{}{
c.Pf0,
c.KeyRotDelta,
c.PacketNum,
c.DataSize,
c.PrevPacketCombinedCheck,
c.Check0,
c.Check1,
c.Check2,
}
for _, v := range data {
err := binary.Write(buf, binary.BigEndian, v)
if err != nil {
return nil, err
}
}
return buf.Bytes(), nil
}

View File

@@ -0,0 +1,84 @@
package crypto
var (
_encryptKey = []byte{0x90, 0x51, 0x26, 0x25, 0x04, 0xBF, 0xCF, 0x4C, 0x92, 0x02, 0x52, 0x7A, 0x70, 0x1A, 0x41, 0x88, 0x8C, 0xC2, 0xCE, 0xB8, 0xF6, 0x57, 0x7E, 0xBA, 0x83, 0x63, 0x2C, 0x24, 0x9A, 0x67, 0x86, 0x0C, 0xBE, 0x72, 0xFD, 0xB6, 0x7B, 0x79, 0xB0, 0x22, 0x5A, 0x60, 0x5C, 0x4F, 0x49, 0xE2, 0x0E, 0xF5, 0x3A, 0x81, 0xAE, 0x11, 0x6B, 0xF0, 0xA1, 0x01, 0xE8, 0x65, 0x8D, 0x5B, 0xDC, 0xCC, 0x93, 0x18, 0xB3, 0xAB, 0x77, 0xF7, 0x8E, 0xEC, 0xEF, 0x05, 0x00, 0xCA, 0x4E, 0xA7, 0xBC, 0xB5, 0x10, 0xC6, 0x6C, 0xC0, 0xC4, 0xE5, 0x87, 0x3F, 0xC1, 0x82, 0x29, 0x96, 0x45, 0x73, 0x07, 0xCB, 0x43, 0xF9, 0xF3, 0x08, 0x89, 0xD0, 0x99, 0x6A, 0x3B, 0x37, 0x19, 0xD4, 0x40, 0xEA, 0xD7, 0x85, 0x16, 0x66, 0x1E, 0x9C, 0x39, 0xBB, 0xEE, 0x4A, 0x03, 0x8A, 0x36, 0x2D, 0x13, 0x1D, 0x56, 0x48, 0xC7, 0x0D, 0x59, 0xB2, 0x44, 0xA3, 0xFE, 0x8B, 0x32, 0x1B, 0x84, 0xA0, 0x2E, 0x62, 0x17, 0x42, 0xB9, 0x9B, 0x2B, 0x75, 0xD8, 0x1C, 0x3C, 0x4D, 0x76, 0x27, 0x6E, 0x28, 0xD3, 0x33, 0xC3, 0x21, 0xAF, 0x34, 0x23, 0xDD, 0x68, 0x9F, 0xF1, 0xAD, 0xE1, 0xB4, 0xE7, 0xA6, 0x74, 0x15, 0x4B, 0xFA, 0x3D, 0x5F, 0x7C, 0xDA, 0x2F, 0x0A, 0xE3, 0x7D, 0xC8, 0xB7, 0x12, 0x6F, 0x9E, 0xA9, 0x14, 0x53, 0x97, 0x8F, 0x64, 0xF4, 0xF8, 0xA2, 0xA4, 0x2A, 0xD2, 0x47, 0x9D, 0x71, 0xC5, 0xE9, 0x06, 0x98, 0x20, 0x54, 0x80, 0xAA, 0xF2, 0xAC, 0x50, 0xD6, 0x7F, 0xD9, 0xC9, 0xCD, 0x69, 0x46, 0x6D, 0x30, 0xB1, 0x58, 0x0B, 0x55, 0xD1, 0x5D, 0xD5, 0xBD, 0x31, 0xDE, 0xA5, 0xE4, 0x91, 0x0F, 0x61, 0x38, 0xDF, 0xA8, 0xE6, 0x3E, 0x1F, 0x35, 0xED, 0xDB, 0x94, 0xEB, 0x09, 0x5E, 0x95, 0xFB, 0xFC, 0xE0, 0x78, 0xFF}
_decryptKey = []byte{0x48, 0x37, 0x09, 0x76, 0x04, 0x47, 0xCC, 0x5C, 0x61, 0xF8, 0xB3, 0xE0, 0x1F, 0x7F, 0x2E, 0xEB, 0x4E, 0x33, 0xB8, 0x7A, 0xBC, 0xAB, 0x6E, 0x8C, 0x3F, 0x68, 0x0D, 0x87, 0x93, 0x7B, 0x70, 0xF2, 0xCE, 0x9D, 0x27, 0xA0, 0x1B, 0x03, 0x02, 0x97, 0x99, 0x58, 0xC5, 0x90, 0x1A, 0x79, 0x8A, 0xB2, 0xDD, 0xE6, 0x86, 0x9B, 0x9F, 0xF3, 0x78, 0x67, 0xED, 0x72, 0x30, 0x66, 0x94, 0xAE, 0xF1, 0x55, 0x6A, 0x0E, 0x8D, 0x5E, 0x82, 0x5A, 0xDB, 0xC7, 0x7D, 0x2C, 0x75, 0xAC, 0x07, 0x95, 0x4A, 0x2B, 0xD4, 0x01, 0x0A, 0xBD, 0xCF, 0xE1, 0x7C, 0x15, 0xDF, 0x80, 0x28, 0x3B, 0x2A, 0xE3, 0xF9, 0xAF, 0x29, 0xEC, 0x8B, 0x19, 0xC0, 0x39, 0x6F, 0x1D, 0xA2, 0xDA, 0x65, 0x34, 0x50, 0xDC, 0x98, 0xB9, 0x0C, 0xC9, 0x21, 0x5B, 0xAA, 0x91, 0x96, 0x42, 0xFE, 0x25, 0x0B, 0x24, 0xB0, 0xB5, 0x16, 0xD6, 0xD0, 0x31, 0x57, 0x18, 0x88, 0x6D, 0x1E, 0x54, 0x0F, 0x62, 0x77, 0x85, 0x10, 0x3A, 0x44, 0xBF, 0x00, 0xEA, 0x08, 0x3E, 0xF6, 0xFA, 0x59, 0xBE, 0xCD, 0x64, 0x1C, 0x8F, 0x71, 0xC8, 0xBA, 0xA3, 0x89, 0x36, 0xC3, 0x83, 0xC4, 0xE8, 0xA9, 0x4B, 0xEF, 0xBB, 0xD1, 0x41, 0xD3, 0xA5, 0x32, 0x9E, 0x26, 0xDE, 0x81, 0x40, 0xA7, 0x4D, 0x23, 0xB7, 0x13, 0x8E, 0x17, 0x73, 0x4C, 0xE5, 0x20, 0x05, 0x51, 0x56, 0x11, 0x9C, 0x52, 0xCA, 0x4F, 0x7E, 0xB6, 0xD8, 0x49, 0x5D, 0x3D, 0xD9, 0x12, 0x06, 0x63, 0xE2, 0xC6, 0x9A, 0x69, 0xE4, 0xD5, 0x6C, 0x92, 0xD7, 0xB1, 0xF5, 0x3C, 0xA1, 0xE7, 0xEE, 0xFD, 0xA6, 0x2D, 0xB4, 0xE9, 0x53, 0xF0, 0xA8, 0x38, 0xCB, 0x6B, 0xF7, 0x45, 0xF4, 0x74, 0x46, 0x35, 0xA4, 0xD2, 0x60, 0xC1, 0x2F, 0x14, 0x43, 0xC2, 0x5F, 0xAD, 0xFB, 0xFC, 0x22, 0x84, 0xFF}
_sharedCryptKey = []byte{0xDD, 0xA8, 0x5F, 0x1E, 0x57, 0xAF, 0xC0, 0xCC, 0x43, 0x35, 0x8F, 0xBB, 0x6F, 0xE6, 0xA1, 0xD6, 0x60, 0xB9, 0x1A, 0xAE, 0x20, 0x49, 0x24, 0x81, 0x21, 0xFE, 0x86, 0x2B, 0x98, 0xB7, 0xB3, 0xD2, 0x91, 0x01, 0x3A, 0x4C, 0x65, 0x92, 0x1C, 0xF4, 0xBE, 0xDD, 0xD9, 0x08, 0xE6, 0x81, 0x98, 0x1B, 0x8D, 0x60, 0xF3, 0x6F, 0xA1, 0x47, 0x24, 0xF1, 0x53, 0x45, 0xC8, 0x7B, 0x88, 0x80, 0x4E, 0x36, 0xC3, 0x0D, 0xC9, 0xD6, 0x8B, 0x08, 0x19, 0x0B, 0xA5, 0xC1, 0x11, 0x4C, 0x60, 0xF8, 0x5D, 0xFC, 0x15, 0x68, 0x7E, 0x32, 0xC0, 0x50, 0xAB, 0x64, 0x1F, 0x8A, 0xD4, 0x08, 0x39, 0x7F, 0xC2, 0xFB, 0xBA, 0x6C, 0xF0, 0xE6, 0xB0, 0x31, 0x10, 0xC1, 0xBF, 0x75, 0x43, 0xBB, 0x18, 0x04, 0x0D, 0xD1, 0x97, 0xF7, 0x23, 0x21, 0x83, 0x8B, 0xCA, 0x25, 0x2B, 0xA3, 0x03, 0x13, 0xEA, 0xAE, 0xFE, 0xF0, 0xEB, 0xFD, 0x85, 0x57, 0x53, 0x65, 0x41, 0x2A, 0x40, 0x99, 0xC0, 0x94, 0x65, 0x7E, 0x7C, 0x93, 0x82, 0xB0, 0xB3, 0xE5, 0xC0, 0x21, 0x09, 0x84, 0xD5, 0xEF, 0x9F, 0xD1, 0x7E, 0xDC, 0x4D, 0xF5, 0x7E, 0xCD, 0x45, 0x3C, 0x7F, 0xF5, 0x59, 0x98, 0xC6, 0x55, 0xFC, 0x9F, 0xA3, 0xB7, 0x74, 0xEE, 0x31, 0x98, 0xE6, 0xB7, 0xBE, 0x26, 0xF4, 0x3C, 0x76, 0xF1, 0x23, 0x7E, 0x02, 0x4E, 0x3C, 0xD1, 0xC7, 0x28, 0x23, 0x73, 0xC4, 0xD9, 0x5E, 0x0D, 0xA1, 0x80, 0xA5, 0xAA, 0x26, 0x0A, 0xA3, 0x44, 0x82, 0x74, 0xE6, 0x3C, 0x44, 0x27, 0x51, 0x0D, 0x5F, 0xC7, 0x9C, 0xD6, 0x63, 0x67, 0xA5, 0x27, 0x97, 0x38, 0xFB, 0x2D, 0xD3, 0xD6, 0x60, 0x25, 0x83, 0x4D, 0x37, 0x5B, 0x40, 0x59, 0x11, 0x77, 0x51, 0x11, 0x14, 0x18, 0x07, 0x63, 0xB1, 0x34, 0x3D, 0xB8, 0x60, 0x13, 0xC2, 0xE8, 0x13, 0x82}
)
// Encrypt encrypts the given data using MHF's custom encryption+checksum method.
// if a overrideByteKey value is supplied (!= nil), it will be used to override the derived/truncated key byte.
func Encrypt(data []byte, key uint32, overrideByteKey *byte) (outputData []byte, combinedCheck uint16, check0 uint16, check1 uint16, check2 uint16) {
return _generalCrypt(data, key, 0, overrideByteKey)
}
// Decrypt decrypts the given data using MHF's custom decryption+checksum method.
// if a overrideByteKey value is supplied (!= nil), it will be used to override the derived/truncated key byte.
func Decrypt(data []byte, key uint32, overrideByteKey *byte) (outputData []byte, combinedCheck uint16, check0 uint16, check1 uint16, check2 uint16) {
return _generalCrypt(data, key, 1, overrideByteKey)
}
// _generalCrypt is a generalized MHF crypto function that can perform both encryption and decryption,
// these two crypto operations are combined into a single function because they shared most of their logic.
// encrypt: cryptType==0
// decrypt: cryptType==1
func _generalCrypt(data []byte, rotKey uint32, cryptType int, overrideByteKey *byte) ([]byte, uint16, uint16, uint16, uint16) {
cryptKeyTruncByte := byte(((rotKey >> 1) % 999983) & 0xFF)
if overrideByteKey != nil {
cryptKeyTruncByte = *overrideByteKey
}
derivedCryptKey := int32((uint32(len(data)) * (uint32(cryptKeyTruncByte) + 1)) & 0xFFFFFFFF)
sharedBufIdx := byte(1)
accumulator0 := uint32(0)
accumulator1 := uint32(0)
accumulator2 := uint32(0)
var outputData []byte
if cryptType == 0 {
for i := 0; i < len(data); i++ {
// Do the encryption for this iteration
encKeyIdx := int32(((uint32(derivedCryptKey) >> 10) ^ uint32(data[i])) & 0xFF)
derivedCryptKey = (0x4FD * (derivedCryptKey + 1))
encKeyByte := _encryptKey[encKeyIdx]
// Update the checksum accumulators.
accumulator2 = uint32((accumulator2 + (uint32(sharedBufIdx) * uint32(data[i]))) & 0xFFFFFFFF)
accumulator1 = uint32((accumulator1 + uint32(encKeyIdx)) & 0xFFFFFFFF)
accumulator0 = uint32((accumulator0 + (uint32(encKeyByte)<<(i&7))&0xFFFFFFFF) & 0xFFFFFFFF)
// Append the output.
outputData = append(outputData, _sharedCryptKey[sharedBufIdx]^encKeyByte)
// Update the sharedBufIdx for the next iteration.
sharedBufIdx = data[i]
}
} else if cryptType == 1 {
for i := 0; i < len(data); i++ {
// Do the decryption for this iteration
oldSharedBufIdx := sharedBufIdx
tIdx := data[i] ^ _sharedCryptKey[sharedBufIdx]
decKeyByte := _decryptKey[tIdx]
sharedBufIdx = byte(((uint32(derivedCryptKey) >> 10) ^ uint32(decKeyByte)) & 0xFF)
// Update the checksum accumulators.
accumulator0 = (accumulator0 + ((uint32(tIdx) << (i & 7)) & 0xFFFFFFFF))
accumulator1 = (accumulator1 + uint32(decKeyByte)) & 0xFFFFFFFF
accumulator2 = (accumulator2 + ((uint32(oldSharedBufIdx) * uint32(sharedBufIdx)) & 0xFFFFFFFF)) & 0xFFFFFFFF
// Append the output.
outputData = append(outputData, sharedBufIdx)
// Update the key pos for next iteration.
derivedCryptKey = (0x4FD * (derivedCryptKey + 1))
}
}
combinedCheck := uint16((accumulator1 + (accumulator0 >> 1) + (accumulator2 >> 2)) & 0xFFFF)
check0 := uint16((accumulator0 ^ ((accumulator0 & 0xFFFF0000) >> 16)) & 0xFFFF)
check1 := uint16((accumulator1 ^ ((accumulator1 & 0xFFFF0000) >> 16)) & 0xFFFF)
check2 := uint16((accumulator2 ^ ((accumulator2 & 0xFFFF0000) >> 16)) & 0xFFFF)
return outputData, combinedCheck, check0, check1, check2
}

View File

@@ -0,0 +1,104 @@
package crypto
import (
"bytes"
"encoding/hex"
"fmt"
"testing"
)
var commonTestData = []byte{0x74, 0x65, 0x73, 0x74}
var tests = []struct {
decryptedData []byte
key uint32
encryptedData []byte
ecc, ec0, ec1, ec2 uint16
}{
{
commonTestData,
0,
[]byte{0x46, 0x53, 0x28, 0x5E},
0x2976, 0x06ea, 0x0215, 0x08FB3,
},
{
commonTestData,
3,
[]byte{0x46, 0x95, 0x88, 0xEA},
0x2AE4, 0x0A56, 0x01CD, 0x08FB3,
},
/*
// TODO(Andoryuuta): This case fails. Debug the client and figure out if this is valid expected data.
{
commonTestData,
995117,
[]byte{0x46, 0x28, 0xFF, 0xAA},
0x2A22, 0x09D4, 0x014C, 0x08FB3,
},
*/
{
commonTestData,
0x7FFFFFFF,
[]byte{0x46, 0x53, 0x28, 0x5E},
0x2976, 0x06ea, 0x0215, 0x08FB3,
},
{
commonTestData,
0x80000000,
[]byte{0x46, 0x95, 0x88, 0xEA},
0x2AE4, 0x0A56, 0x01CD, 0x08FB3,
},
{
commonTestData,
0xFFFFFFFF,
[]byte{0x46, 0xB5, 0xDC, 0xB2},
0x2ADD, 0x09A6, 0x021E, 0x08FB3,
},
{
[]byte{0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x03, 0x02, 0x00, 0x6C, 0x6C, 0x00, 0x00, 0x00, 0x12, 0x00, 0xDE, 0x00, 0x03, 0x00, 0x00, 0x00, 0x30, 0x00, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x03, 0x20, 0x18, 0x46, 0x00, 0x00, 0x80, 0x3F, 0xDC, 0xE4, 0x0A, 0x46, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x67, 0xD3, 0x5B, 0x00, 0x77, 0x01, 0x78, 0x00, 0x77, 0x01, 0x4F, 0x01, 0x5B, 0x6F, 0x76, 0xC5, 0x30, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xDD, 0x17, 0x46, 0x00, 0x00, 0x80, 0x3F, 0x9E, 0x11, 0x0C, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x37, 0x64, 0x00, 0x2C, 0x01, 0x64, 0x00, 0x2C, 0x01, 0x4F, 0x01, 0x5B, 0x6F, 0x76, 0xC5, 0x00, 0x10},
2000476,
[]byte{0x2E, 0x52, 0x24, 0xE3, 0x05, 0x2B, 0xFC, 0x04, 0x0B, 0x26, 0x90, 0xEA, 0x61, 0xDB, 0x8D, 0x27, 0xCB, 0xB1, 0x69, 0xA1, 0x77, 0x80, 0x4A, 0xC2, 0xA0, 0xBD, 0x50, 0x54, 0xF5, 0xC2, 0x94, 0x66, 0xBB, 0xCE, 0x53, 0x29, 0xEE, 0xB4, 0xFA, 0xF6, 0x5F, 0x8D, 0x80, 0x3E, 0x5D, 0x5F, 0xB0, 0x53, 0xE6, 0x92, 0x17, 0x80, 0xE7, 0xED, 0xE7, 0xDC, 0x61, 0xF0, 0xCD, 0xE4, 0x41, 0x82, 0x21, 0xBA, 0x47, 0xAB, 0x58, 0xFF, 0x30, 0x76, 0x80, 0x2D, 0x38, 0xF4, 0xDF, 0x86, 0x8C, 0x6C, 0x8D, 0x33, 0x4C, 0x37, 0xA3, 0xDA, 0x01, 0x3C, 0x98, 0x66, 0x1F, 0xB9, 0xE2, 0xEA, 0xF0, 0x84, 0xE8, 0xAA, 0x00, 0x3D, 0x4A, 0xB6, 0xF2, 0x3D, 0x91, 0x58, 0x4B, 0x0B, 0xE2, 0xD5, 0xC7, 0x39, 0x4D, 0x59, 0xED, 0xC3, 0x61, 0x6F, 0x6E, 0x69, 0x9B, 0x3C},
0xCFF8, 0x086B, 0x3BAE, 0x4057,
},
}
func TestEncrypt(t *testing.T) {
for k, tt := range tests {
testname := fmt.Sprintf("encrypt_test_%d", k)
t.Run(testname, func(t *testing.T) {
out, cc, c0, c1, c2 := Encrypt(tt.decryptedData, tt.key, nil)
if cc != tt.ecc {
t.Errorf("got cc 0x%X, want 0x%X", cc, tt.ecc)
} else if c0 != tt.ec0 {
t.Errorf("got c0 0x%X, want 0x%X", c0, tt.ec0)
} else if c1 != tt.ec1 {
t.Errorf("got c1 0x%X, want 0x%X", c1, tt.ec1)
} else if c2 != tt.ec2 {
t.Errorf("got c2 0x%X, want 0x%X", c2, tt.ec2)
} else if !bytes.Equal(out, tt.encryptedData) {
t.Errorf("got out\n\t%s\nwant\n\t%s", hex.Dump(out), hex.Dump(tt.encryptedData))
}
})
}
}
func TestDecrypt(t *testing.T) {
for k, tt := range tests {
testname := fmt.Sprintf("decrypt_test_%d", k)
t.Run(testname, func(t *testing.T) {
out, cc, c0, c1, c2 := Decrypt(tt.encryptedData, tt.key, nil)
if cc != tt.ecc {
t.Errorf("got cc 0x%X, want 0x%X", cc, tt.ecc)
} else if c0 != tt.ec0 {
t.Errorf("got c0 0x%X, want 0x%X", c0, tt.ec0)
} else if c1 != tt.ec1 {
t.Errorf("got c1 0x%X, want 0x%X", c1, tt.ec1)
} else if c2 != tt.ec2 {
t.Errorf("got c2 0x%X, want 0x%X", c2, tt.ec2)
} else if !bytes.Equal(out, tt.decryptedData) {
t.Errorf("got out\n\t%s\nwant\n\t%s", hex.Dump(out), hex.Dump(tt.decryptedData))
}
})
}
}

View File

@@ -0,0 +1,29 @@
package mhfpacket
import (
"github.com/Andoryuuta/byteframe"
"github.com/Solenataris/Erupe/network"
"github.com/Solenataris/Erupe/network/clientctx"
)
// Parser is the interface that wraps the Parse method.
type Parser interface {
Parse(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error
}
// Builder is the interface that wraps the Build method.
type Builder interface {
Build(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error
}
// Opcoder is the interface that wraps the Opcode method.
type Opcoder interface {
Opcode() network.PacketID
}
// MHFPacket is the interface that groups the Parse, Build, and Opcode methods.
type MHFPacket interface {
Parser
Builder
Opcoder
}

View File

@@ -0,0 +1,27 @@
package mhfpacket
import (
"errors"
"github.com/Andoryuuta/byteframe"
"github.com/Solenataris/Erupe/network"
"github.com/Solenataris/Erupe/network/clientctx"
)
// MsgCaExchangeItem represents the MSG_CA_EXCHANGE_ITEM
type MsgCaExchangeItem struct{}
// Opcode returns the ID associated with this packet type.
func (m *MsgCaExchangeItem) Opcode() network.PacketID {
return network.MSG_CA_EXCHANGE_ITEM
}
// Parse parses the packet from binary
func (m *MsgCaExchangeItem) Parse(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
return errors.New("NOT IMPLEMENTED")
}
// Build builds a binary packet from the current data.
func (m *MsgCaExchangeItem) Build(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
return errors.New("NOT IMPLEMENTED")
}

View File

@@ -0,0 +1,28 @@
package mhfpacket
import (
"errors"
"github.com/Solenataris/Erupe/network/clientctx"
"github.com/Solenataris/Erupe/network"
"github.com/Andoryuuta/byteframe"
)
// MsgHead represents the MSG_HEAD
type MsgHead struct{}
// Opcode returns the ID associated with this packet type.
func (m *MsgHead) Opcode() network.PacketID {
return network.MSG_HEAD
}
// Parse parses the packet from binary
func (m *MsgHead) Parse(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
return errors.New("NOT IMPLEMENTED")
}
// Build builds a binary packet from the current data.
func (m *MsgHead) Build(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
return errors.New("NOT IMPLEMENTED")
}

View File

@@ -0,0 +1,28 @@
package mhfpacket
import (
"errors"
"github.com/Solenataris/Erupe/network/clientctx"
"github.com/Solenataris/Erupe/network"
"github.com/Andoryuuta/byteframe"
)
// MsgMhfAcceptReadReward represents the MSG_MHF_ACCEPT_READ_REWARD
type MsgMhfAcceptReadReward struct{}
// Opcode returns the ID associated with this packet type.
func (m *MsgMhfAcceptReadReward) Opcode() network.PacketID {
return network.MSG_MHF_ACCEPT_READ_REWARD
}
// Parse parses the packet from binary
func (m *MsgMhfAcceptReadReward) Parse(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
return errors.New("NOT IMPLEMENTED")
}
// Build builds a binary packet from the current data.
func (m *MsgMhfAcceptReadReward) Build(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
return errors.New("NOT IMPLEMENTED")
}

View File

@@ -0,0 +1,41 @@
package mhfpacket
import (
"errors"
"github.com/Solenataris/Erupe/network"
"github.com/Solenataris/Erupe/network/clientctx"
"github.com/Andoryuuta/byteframe"
)
// MsgMhfAcquireCafeItem represents the MSG_MHF_ACQUIRE_CAFE_ITEM
type MsgMhfAcquireCafeItem struct {
AckHandle uint32
// Valid sizes, not sure if [un]signed.
ItemType uint16
ItemID uint16
Quant uint16
PointCost uint32
Unk0 uint16
}
// Opcode returns the ID associated with this packet type.
func (m *MsgMhfAcquireCafeItem) Opcode() network.PacketID {
return network.MSG_MHF_ACQUIRE_CAFE_ITEM
}
// Parse parses the packet from binary
func (m *MsgMhfAcquireCafeItem) Parse(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
m.AckHandle = bf.ReadUint32()
m.ItemType = bf.ReadUint16()
m.ItemID = bf.ReadUint16()
m.Quant = bf.ReadUint16()
m.PointCost = bf.ReadUint32()
m.Unk0 = bf.ReadUint16()
return nil
}
// Build builds a binary packet from the current data.
func (m *MsgMhfAcquireCafeItem) Build(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
return errors.New("NOT IMPLEMENTED")
}

View File

@@ -0,0 +1,35 @@
package mhfpacket
import (
"errors"
"github.com/Solenataris/Erupe/network"
"github.com/Solenataris/Erupe/network/clientctx"
"github.com/Andoryuuta/byteframe"
)
// MsgMhfAcquireDistItem represents the MSG_MHF_ACQUIRE_DIST_ITEM
type MsgMhfAcquireDistItem struct {
AckHandle uint32
// Valid field size(s), not sure about the types.
Unk0 uint8
Unk1 uint32
}
// Opcode returns the ID associated with this packet type.
func (m *MsgMhfAcquireDistItem) Opcode() network.PacketID {
return network.MSG_MHF_ACQUIRE_DIST_ITEM
}
// Parse parses the packet from binary
func (m *MsgMhfAcquireDistItem) Parse(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
m.AckHandle = bf.ReadUint32()
m.Unk0 = bf.ReadUint8()
m.Unk1 = bf.ReadUint32()
return nil
}
// Build builds a binary packet from the current data.
func (m *MsgMhfAcquireDistItem) Build(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
return errors.New("NOT IMPLEMENTED")
}

View File

@@ -0,0 +1,35 @@
package mhfpacket
import (
"github.com/Solenataris/Erupe/network"
"github.com/Solenataris/Erupe/network/clientctx"
"github.com/Andoryuuta/byteframe"
)
// MsgMhfAcquireExchangeShop represents the MSG_MHF_ACQUIRE_EXCHANGE_SHOP
type MsgMhfAcquireExchangeShop struct {
AckHandle uint32
DataSize uint16
RawDataPayload []byte
}
// Opcode returns the ID associated with this packet type.
func (m *MsgMhfAcquireExchangeShop) Opcode() network.PacketID {
return network.MSG_MHF_ACQUIRE_EXCHANGE_SHOP
}
// Parse parses the packet from binary
func (m *MsgMhfAcquireExchangeShop) Parse(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
m.AckHandle = bf.ReadUint32()
m.DataSize = bf.ReadUint16()
m.RawDataPayload = bf.ReadBytes(uint(m.DataSize))
return nil
}
// Build builds a binary packet from the current data.
func (m *MsgMhfAcquireExchangeShop) Build(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
bf.WriteUint32(m.AckHandle)
bf.WriteUint16(m.DataSize)
bf.WriteBytes(m.RawDataPayload)
return nil
}

View File

@@ -0,0 +1,27 @@
package mhfpacket
import (
"errors"
"github.com/Solenataris/Erupe/network/clientctx"
"github.com/Solenataris/Erupe/network"
"github.com/Andoryuuta/byteframe"
)
// MsgMhfAcquireFesta represents the MSG_MHF_ACQUIRE_FESTA
type MsgMhfAcquireFesta struct{}
// Opcode returns the ID associated with this packet type.
func (m *MsgMhfAcquireFesta) Opcode() network.PacketID {
return network.MSG_MHF_ACQUIRE_FESTA
}
// Parse parses the packet from binary
func (m *MsgMhfAcquireFesta) Parse(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
return errors.New("NOT IMPLEMENTED")
}
// Build builds a binary packet from the current data.
func (m *MsgMhfAcquireFesta) Build(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
return errors.New("NOT IMPLEMENTED")
}

View File

@@ -0,0 +1,27 @@
package mhfpacket
import (
"errors"
"github.com/Solenataris/Erupe/network"
"github.com/Solenataris/Erupe/network/clientctx"
"github.com/Andoryuuta/byteframe"
)
// MsgMhfAcquireFestaIntermediatePrize represents the MSG_MHF_ACQUIRE_FESTA_INTERMEDIATE_PRIZE
type MsgMhfAcquireFestaIntermediatePrize struct{}
// Opcode returns the ID associated with this packet type.
func (m *MsgMhfAcquireFestaIntermediatePrize) Opcode() network.PacketID {
return network.MSG_MHF_ACQUIRE_FESTA_INTERMEDIATE_PRIZE
}
// Parse parses the packet from binary
func (m *MsgMhfAcquireFestaIntermediatePrize) Parse(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
return errors.New("NOT IMPLEMENTED")
}
// Build builds a binary packet from the current data.
func (m *MsgMhfAcquireFestaIntermediatePrize) Build(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
return errors.New("NOT IMPLEMENTED")
}

View File

@@ -0,0 +1,27 @@
package mhfpacket
import (
"errors"
"github.com/Solenataris/Erupe/network/clientctx"
"github.com/Solenataris/Erupe/network"
"github.com/Andoryuuta/byteframe"
)
// MsgMhfAcquireFestaPersonalPrize represents the MSG_MHF_ACQUIRE_FESTA_PERSONAL_PRIZE
type MsgMhfAcquireFestaPersonalPrize struct{}
// Opcode returns the ID associated with this packet type.
func (m *MsgMhfAcquireFestaPersonalPrize) Opcode() network.PacketID {
return network.MSG_MHF_ACQUIRE_FESTA_PERSONAL_PRIZE
}
// Parse parses the packet from binary
func (m *MsgMhfAcquireFestaPersonalPrize) Parse(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
return errors.New("NOT IMPLEMENTED")
}
// Build builds a binary packet from the current data.
func (m *MsgMhfAcquireFestaPersonalPrize) Build(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
return errors.New("NOT IMPLEMENTED")
}

View File

@@ -0,0 +1,27 @@
package mhfpacket
import (
"errors"
"github.com/Solenataris/Erupe/network/clientctx"
"github.com/Solenataris/Erupe/network"
"github.com/Andoryuuta/byteframe"
)
// MsgMhfAcquireGuildAdventure represents the MSG_MHF_ACQUIRE_GUILD_ADVENTURE
type MsgMhfAcquireGuildAdventure struct{}
// Opcode returns the ID associated with this packet type.
func (m *MsgMhfAcquireGuildAdventure) Opcode() network.PacketID {
return network.MSG_MHF_ACQUIRE_GUILD_ADVENTURE
}
// Parse parses the packet from binary
func (m *MsgMhfAcquireGuildAdventure) Parse(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
return errors.New("NOT IMPLEMENTED")
}
// Build builds a binary packet from the current data.
func (m *MsgMhfAcquireGuildAdventure) Build(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
return errors.New("NOT IMPLEMENTED")
}

View File

@@ -0,0 +1,27 @@
package mhfpacket
import (
"errors"
"github.com/Solenataris/Erupe/network/clientctx"
"github.com/Solenataris/Erupe/network"
"github.com/Andoryuuta/byteframe"
)
// MsgMhfAcquireGuildTresure represents the MSG_MHF_ACQUIRE_GUILD_TRESURE
type MsgMhfAcquireGuildTresure struct{}
// Opcode returns the ID associated with this packet type.
func (m *MsgMhfAcquireGuildTresure) Opcode() network.PacketID {
return network.MSG_MHF_ACQUIRE_GUILD_TRESURE
}
// Parse parses the packet from binary
func (m *MsgMhfAcquireGuildTresure) Parse(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
return errors.New("NOT IMPLEMENTED")
}
// Build builds a binary packet from the current data.
func (m *MsgMhfAcquireGuildTresure) Build(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
return errors.New("NOT IMPLEMENTED")
}

View File

@@ -0,0 +1,30 @@
package mhfpacket
import (
"errors"
"github.com/Solenataris/Erupe/network/clientctx"
"github.com/Solenataris/Erupe/network"
"github.com/Andoryuuta/byteframe"
)
// MsgMhfAcquireGuildTresureSouvenir represents the MSG_MHF_ACQUIRE_GUILD_TRESURE_SOUVENIR
type MsgMhfAcquireGuildTresureSouvenir struct {
AckHandle uint32
}
// Opcode returns the ID associated with this packet type.
func (m *MsgMhfAcquireGuildTresureSouvenir) Opcode() network.PacketID {
return network.MSG_MHF_ACQUIRE_GUILD_TRESURE_SOUVENIR
}
// Parse parses the packet from binary
func (m *MsgMhfAcquireGuildTresureSouvenir) Parse(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
m.AckHandle = bf.ReadUint32()
return nil
}
// Build builds a binary packet from the current data.
func (m *MsgMhfAcquireGuildTresureSouvenir) Build(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
return errors.New("NOT IMPLEMENTED")
}

View File

@@ -0,0 +1,27 @@
package mhfpacket
import (
"errors"
"github.com/Solenataris/Erupe/network/clientctx"
"github.com/Solenataris/Erupe/network"
"github.com/Andoryuuta/byteframe"
)
// MsgMhfAcquireItem represents the MSG_MHF_ACQUIRE_ITEM
type MsgMhfAcquireItem struct{}
// Opcode returns the ID associated with this packet type.
func (m *MsgMhfAcquireItem) Opcode() network.PacketID {
return network.MSG_MHF_ACQUIRE_ITEM
}
// Parse parses the packet from binary
func (m *MsgMhfAcquireItem) Parse(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
return errors.New("NOT IMPLEMENTED")
}
// Build builds a binary packet from the current data.
func (m *MsgMhfAcquireItem) Build(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
return errors.New("NOT IMPLEMENTED")
}

View File

@@ -0,0 +1,27 @@
package mhfpacket
import (
"errors"
"github.com/Solenataris/Erupe/network/clientctx"
"github.com/Solenataris/Erupe/network"
"github.com/Andoryuuta/byteframe"
)
// MsgMhfAcquireMonthlyItem represents the MSG_MHF_ACQUIRE_MONTHLY_ITEM
type MsgMhfAcquireMonthlyItem struct{}
// Opcode returns the ID associated with this packet type.
func (m *MsgMhfAcquireMonthlyItem) Opcode() network.PacketID {
return network.MSG_MHF_ACQUIRE_MONTHLY_ITEM
}
// Parse parses the packet from binary
func (m *MsgMhfAcquireMonthlyItem) Parse(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
return errors.New("NOT IMPLEMENTED")
}
// Build builds a binary packet from the current data.
func (m *MsgMhfAcquireMonthlyItem) Build(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
return errors.New("NOT IMPLEMENTED")
}

View File

@@ -0,0 +1,30 @@
package mhfpacket
import (
"errors"
"github.com/Solenataris/Erupe/network/clientctx"
"github.com/Solenataris/Erupe/network"
"github.com/Andoryuuta/byteframe"
)
// MsgMhfAcquireMonthlyReward represents the MSG_MHF_ACQUIRE_MONTHLY_REWARD
type MsgMhfAcquireMonthlyReward struct {
AckHandle uint32
}
// Opcode returns the ID associated with this packet type.
func (m *MsgMhfAcquireMonthlyReward) Opcode() network.PacketID {
return network.MSG_MHF_ACQUIRE_MONTHLY_REWARD
}
// Parse parses the packet from binary
func (m *MsgMhfAcquireMonthlyReward) Parse(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
m.AckHandle = bf.ReadUint32()
return nil
}
// Build builds a binary packet from the current data.
func (m *MsgMhfAcquireMonthlyReward) Build(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
return errors.New("NOT IMPLEMENTED")
}

View File

@@ -0,0 +1,27 @@
package mhfpacket
import (
"errors"
"github.com/Solenataris/Erupe/network/clientctx"
"github.com/Solenataris/Erupe/network"
"github.com/Andoryuuta/byteframe"
)
// MsgMhfAcquireTitle represents the MSG_MHF_ACQUIRE_TITLE
type MsgMhfAcquireTitle struct{}
// Opcode returns the ID associated with this packet type.
func (m *MsgMhfAcquireTitle) Opcode() network.PacketID {
return network.MSG_MHF_ACQUIRE_TITLE
}
// Parse parses the packet from binary
func (m *MsgMhfAcquireTitle) Parse(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
return errors.New("NOT IMPLEMENTED")
}
// Build builds a binary packet from the current data.
func (m *MsgMhfAcquireTitle) Build(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
return errors.New("NOT IMPLEMENTED")
}

View File

@@ -0,0 +1,27 @@
package mhfpacket
import (
"errors"
"github.com/Solenataris/Erupe/network/clientctx"
"github.com/Solenataris/Erupe/network"
"github.com/Andoryuuta/byteframe"
)
// MsgMhfAcquireTournament represents the MSG_MHF_ACQUIRE_TOURNAMENT
type MsgMhfAcquireTournament struct{}
// Opcode returns the ID associated with this packet type.
func (m *MsgMhfAcquireTournament) Opcode() network.PacketID {
return network.MSG_MHF_ACQUIRE_TOURNAMENT
}
// Parse parses the packet from binary
func (m *MsgMhfAcquireTournament) Parse(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
return errors.New("NOT IMPLEMENTED")
}
// Build builds a binary packet from the current data.
func (m *MsgMhfAcquireTournament) Build(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
return errors.New("NOT IMPLEMENTED")
}

View File

@@ -0,0 +1,27 @@
package mhfpacket
import (
"errors"
"github.com/Solenataris/Erupe/network/clientctx"
"github.com/Solenataris/Erupe/network"
"github.com/Andoryuuta/byteframe"
)
// MsgMhfAcquireUdItem represents the MSG_MHF_ACQUIRE_UD_ITEM
type MsgMhfAcquireUdItem struct{}
// Opcode returns the ID associated with this packet type.
func (m *MsgMhfAcquireUdItem) Opcode() network.PacketID {
return network.MSG_MHF_ACQUIRE_UD_ITEM
}
// Parse parses the packet from binary
func (m *MsgMhfAcquireUdItem) Parse(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
return errors.New("NOT IMPLEMENTED")
}
// Build builds a binary packet from the current data.
func (m *MsgMhfAcquireUdItem) Build(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
return errors.New("NOT IMPLEMENTED")
}

View File

@@ -0,0 +1,36 @@
package mhfpacket
import (
"github.com/Solenataris/Erupe/network"
"github.com/Solenataris/Erupe/network/clientctx"
"github.com/Andoryuuta/byteframe"
)
// MsgMhfAddAchievement represents the MSG_MHF_ADD_ACHIEVEMENT
type MsgMhfAddAchievement struct {
Unk0 uint8
Unk1 uint16
Unk2 uint16
}
// Opcode returns the ID associated with this packet type.
func (m *MsgMhfAddAchievement) Opcode() network.PacketID {
return network.MSG_MHF_ADD_ACHIEVEMENT
}
// Parse parses the packet from binary
func (m *MsgMhfAddAchievement) Parse(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
m.Unk0 = bf.ReadUint8()
m.Unk1 = bf.ReadUint16()
m.Unk2 = bf.ReadUint16()
// doesn't expect a response
return nil
}
// Build builds a binary packet from the current data.
func (m *MsgMhfAddAchievement) Build(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
bf.WriteUint8(m.Unk0)
bf.WriteUint16(m.Unk1)
bf.WriteUint16(m.Unk2)
return nil
}

View File

@@ -0,0 +1,27 @@
package mhfpacket
import (
"errors"
"github.com/Solenataris/Erupe/network/clientctx"
"github.com/Solenataris/Erupe/network"
"github.com/Andoryuuta/byteframe"
)
// MsgMhfAddGuildMissionCount represents the MSG_MHF_ADD_GUILD_MISSION_COUNT
type MsgMhfAddGuildMissionCount struct{}
// Opcode returns the ID associated with this packet type.
func (m *MsgMhfAddGuildMissionCount) Opcode() network.PacketID {
return network.MSG_MHF_ADD_GUILD_MISSION_COUNT
}
// Parse parses the packet from binary
func (m *MsgMhfAddGuildMissionCount) Parse(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
return errors.New("NOT IMPLEMENTED")
}
// Build builds a binary packet from the current data.
func (m *MsgMhfAddGuildMissionCount) Build(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
return errors.New("NOT IMPLEMENTED")
}

View File

@@ -0,0 +1,27 @@
package mhfpacket
import (
"errors"
"github.com/Solenataris/Erupe/network/clientctx"
"github.com/Solenataris/Erupe/network"
"github.com/Andoryuuta/byteframe"
)
// MsgMhfAddGuildWeeklyBonusExceptionalUser represents the MSG_MHF_ADD_GUILD_WEEKLY_BONUS_EXCEPTIONAL_USER
type MsgMhfAddGuildWeeklyBonusExceptionalUser struct{}
// Opcode returns the ID associated with this packet type.
func (m *MsgMhfAddGuildWeeklyBonusExceptionalUser) Opcode() network.PacketID {
return network.MSG_MHF_ADD_GUILD_WEEKLY_BONUS_EXCEPTIONAL_USER
}
// Parse parses the packet from binary
func (m *MsgMhfAddGuildWeeklyBonusExceptionalUser) Parse(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
return errors.New("NOT IMPLEMENTED")
}
// Build builds a binary packet from the current data.
func (m *MsgMhfAddGuildWeeklyBonusExceptionalUser) Build(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
return errors.New("NOT IMPLEMENTED")
}

View File

@@ -0,0 +1,32 @@
package mhfpacket
import (
"github.com/Solenataris/Erupe/network"
"github.com/Solenataris/Erupe/network/clientctx"
"github.com/Andoryuuta/byteframe"
)
// MsgMhfAddKouryouPoint represents the MSG_MHF_ADD_KOURYOU_POINT
type MsgMhfAddKouryouPoint struct {
AckHandle uint32
KouryouPoints uint32
}
// Opcode returns the ID associated with this packet type.
func (m *MsgMhfAddKouryouPoint) Opcode() network.PacketID {
return network.MSG_MHF_ADD_KOURYOU_POINT
}
// Parse parses the packet from binary
func (m *MsgMhfAddKouryouPoint) Parse(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
m.AckHandle = bf.ReadUint32()
m.KouryouPoints = bf.ReadUint32()
return nil
}
// Build builds a binary packet from the current data.
func (m *MsgMhfAddKouryouPoint) Build(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
bf.WriteUint32(m.AckHandle)
bf.WriteUint32(m.KouryouPoints)
return nil
}

View File

@@ -0,0 +1,27 @@
package mhfpacket
import (
"errors"
"github.com/Solenataris/Erupe/network/clientctx"
"github.com/Solenataris/Erupe/network"
"github.com/Andoryuuta/byteframe"
)
// MsgMhfAddRewardSongCount represents the MSG_MHF_ADD_REWARD_SONG_COUNT
type MsgMhfAddRewardSongCount struct{}
// Opcode returns the ID associated with this packet type.
func (m *MsgMhfAddRewardSongCount) Opcode() network.PacketID {
return network.MSG_MHF_ADD_REWARD_SONG_COUNT
}
// Parse parses the packet from binary
func (m *MsgMhfAddRewardSongCount) Parse(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
return errors.New("NOT IMPLEMENTED")
}
// Build builds a binary packet from the current data.
func (m *MsgMhfAddRewardSongCount) Build(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
return errors.New("NOT IMPLEMENTED")
}

View File

@@ -0,0 +1,36 @@
package mhfpacket
import (
"errors"
"github.com/Solenataris/Erupe/network/clientctx"
"github.com/Solenataris/Erupe/network"
"github.com/Andoryuuta/byteframe"
)
// MsgMhfAddUdPoint represents the MSG_MHF_ADD_UD_POINT
type MsgMhfAddUdPoint struct {
AckHandle uint32
Unk1 uint32
Unk2 uint32
}
// Opcode returns the ID associated with this packet type.
func (m *MsgMhfAddUdPoint) Opcode() network.PacketID {
return network.MSG_MHF_ADD_UD_POINT
}
// Parse parses the packet from binary
func (m *MsgMhfAddUdPoint) Parse(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
m.AckHandle = bf.ReadUint32()
m.Unk1 = bf.ReadUint32()
m.Unk2 = bf.ReadUint32()
return nil
//panic("Not implemented")
}
// Build builds a binary packet from the current data.
func (m *MsgMhfAddUdPoint) Build(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
return errors.New("NOT IMPLEMENTED")
}

View File

@@ -0,0 +1,35 @@
package mhfpacket
import (
"github.com/Solenataris/Erupe/network"
"github.com/Solenataris/Erupe/network/clientctx"
"github.com/Andoryuuta/byteframe"
)
// MsgMhfAddUdTacticsPoint represents the MSG_MHF_ADD_UD_TACTICS_POINT
type MsgMhfAddUdTacticsPoint struct {
AckHandle uint32
Unk0 uint16
Unk1 uint32
}
// Opcode returns the ID associated with this packet type.
func (m *MsgMhfAddUdTacticsPoint) Opcode() network.PacketID {
return network.MSG_MHF_ADD_UD_TACTICS_POINT
}
// Parse parses the packet from binary
func (m *MsgMhfAddUdTacticsPoint) Parse(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
m.AckHandle = bf.ReadUint32()
m.Unk0 = bf.ReadUint16()
m.Unk1 = bf.ReadUint32()
return nil
}
// Build builds a binary packet from the current data.
func (m *MsgMhfAddUdTacticsPoint) Build(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
bf.WriteUint32(m.AckHandle)
bf.WriteUint16(m.Unk0)
bf.WriteUint32(m.Unk1)
return nil
}

View File

@@ -0,0 +1,27 @@
package mhfpacket
import (
"errors"
"github.com/Solenataris/Erupe/network/clientctx"
"github.com/Solenataris/Erupe/network"
"github.com/Andoryuuta/byteframe"
)
// MsgMhfAnnounce represents the MSG_MHF_ANNOUNCE
type MsgMhfAnnounce struct{}
// Opcode returns the ID associated with this packet type.
func (m *MsgMhfAnnounce) Opcode() network.PacketID {
return network.MSG_MHF_ANNOUNCE
}
// Parse parses the packet from binary
func (m *MsgMhfAnnounce) Parse(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
return errors.New("NOT IMPLEMENTED")
}
// Build builds a binary packet from the current data.
func (m *MsgMhfAnnounce) Build(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
return errors.New("NOT IMPLEMENTED")
}

View File

@@ -0,0 +1,34 @@
package mhfpacket
import (
"errors"
"github.com/Solenataris/Erupe/network/clientctx"
"github.com/Solenataris/Erupe/network"
"github.com/Andoryuuta/byteframe"
)
// MsgMhfAnswerGuildScout represents the MSG_MHF_ANSWER_GUILD_SCOUT
type MsgMhfAnswerGuildScout struct {
AckHandle uint32
LeaderID uint32
Answer bool
}
// Opcode returns the ID associated with this packet type.
func (m *MsgMhfAnswerGuildScout) Opcode() network.PacketID {
return network.MSG_MHF_ANSWER_GUILD_SCOUT
}
// Parse parses the packet from binary
func (m *MsgMhfAnswerGuildScout) Parse(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
m.AckHandle = bf.ReadUint32()
m.LeaderID = bf.ReadUint32()
m.Answer = bf.ReadBool()
return nil
}
// Build builds a binary packet from the current data.
func (m *MsgMhfAnswerGuildScout) Build(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
return errors.New("NOT IMPLEMENTED")
}

View File

@@ -0,0 +1,27 @@
package mhfpacket
import (
"errors"
"github.com/Solenataris/Erupe/network/clientctx"
"github.com/Solenataris/Erupe/network"
"github.com/Andoryuuta/byteframe"
)
// MsgMhfApplyBbsArticle represents the MSG_MHF_APPLY_BBS_ARTICLE
type MsgMhfApplyBbsArticle struct{}
// Opcode returns the ID associated with this packet type.
func (m *MsgMhfApplyBbsArticle) Opcode() network.PacketID {
return network.MSG_MHF_APPLY_BBS_ARTICLE
}
// Parse parses the packet from binary
func (m *MsgMhfApplyBbsArticle) Parse(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
return errors.New("NOT IMPLEMENTED")
}
// Build builds a binary packet from the current data.
func (m *MsgMhfApplyBbsArticle) Build(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
return errors.New("NOT IMPLEMENTED")
}

View File

@@ -0,0 +1,38 @@
package mhfpacket
import (
"github.com/Solenataris/Erupe/network"
"github.com/Solenataris/Erupe/network/clientctx"
"github.com/Andoryuuta/byteframe"
)
// MsgMhfApplyCampaign represents the MSG_MHF_APPLY_CAMPAIGN
type MsgMhfApplyCampaign struct {
AckHandle uint32
Unk0 uint8
Unk1 uint8
Unk2 uint16
}
// Opcode returns the ID associated with this packet type.
func (m *MsgMhfApplyCampaign) Opcode() network.PacketID {
return network.MSG_MHF_APPLY_CAMPAIGN
}
// Parse parses the packet from binary
func (m *MsgMhfApplyCampaign) Parse(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
m.AckHandle = bf.ReadUint32()
m.Unk0 = bf.ReadUint8()
m.Unk1 = bf.ReadUint8()
m.Unk2 = bf.ReadUint16()
return nil
}
// Build builds a binary packet from the current data.
func (m *MsgMhfApplyCampaign) Build(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
bf.WriteUint32(m.AckHandle)
bf.WriteUint8(m.Unk0)
bf.WriteUint8(m.Unk1)
bf.WriteUint16(m.Unk2)
return nil
}

View File

@@ -0,0 +1,41 @@
package mhfpacket
import (
"github.com/Solenataris/Erupe/network"
"github.com/Solenataris/Erupe/network/clientctx"
"github.com/Andoryuuta/byteframe"
)
// MsgMhfApplyDistItem represents the MSG_MHF_APPLY_DIST_ITEM
type MsgMhfApplyDistItem struct {
AckHandle uint32
Unk0 uint8
RequestType uint32
Unk2 uint32
Unk3 uint32
}
// Opcode returns the ID associated with this packet type.
func (m *MsgMhfApplyDistItem) Opcode() network.PacketID {
return network.MSG_MHF_APPLY_DIST_ITEM
}
// Parse parses the packet from binary
func (m *MsgMhfApplyDistItem) Parse(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
m.AckHandle = bf.ReadUint32()
m.Unk0 = bf.ReadUint8()
m.RequestType = bf.ReadUint32()
m.Unk2 = bf.ReadUint32()
m.Unk3 = bf.ReadUint32()
return nil
}
// Build builds a binary packet from the current data.
func (m *MsgMhfApplyDistItem) Build(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
bf.WriteUint32(m.AckHandle)
bf.WriteUint8(m.Unk0)
bf.WriteUint32(m.RequestType)
bf.WriteUint32(m.Unk2)
bf.WriteUint32(m.Unk3)
return nil
}

View File

@@ -0,0 +1,47 @@
package mhfpacket
import (
"github.com/Solenataris/Erupe/network"
"github.com/Solenataris/Erupe/network/clientctx"
"github.com/Andoryuuta/byteframe"
)
// MsgMhfArrangeGuildMember represents the MSG_MHF_ARRANGE_GUILD_MEMBER
type MsgMhfArrangeGuildMember struct {
AckHandle uint32
GuildID uint32
CharIDs []uint32
}
// Opcode returns the ID associated with this packet type.
func (m *MsgMhfArrangeGuildMember) Opcode() network.PacketID {
return network.MSG_MHF_ARRANGE_GUILD_MEMBER
}
// Parse parses the packet from binary
func (m *MsgMhfArrangeGuildMember) Parse(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
m.AckHandle = bf.ReadUint32()
m.GuildID = bf.ReadUint32()
charCount := bf.ReadUint16()
m.CharIDs = make([]uint32, charCount)
for i := uint16(0); i < charCount; i++ {
m.CharIDs[i] = bf.ReadUint32()
}
return nil
}
// Build builds a binary packet from the current data.
func (m *MsgMhfArrangeGuildMember) Build(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
bf.WriteUint32(m.AckHandle)
bf.WriteUint32(m.GuildID)
bf.WriteUint16(uint16(len(m.CharIDs)))
for _, charID := range m.CharIDs {
bf.WriteUint32(charID)
}
return nil
}

View File

@@ -0,0 +1,27 @@
package mhfpacket
import (
"errors"
"github.com/Solenataris/Erupe/network/clientctx"
"github.com/Solenataris/Erupe/network"
"github.com/Andoryuuta/byteframe"
)
// MsgMhfCancelGuildMissionTarget represents the MSG_MHF_CANCEL_GUILD_MISSION_TARGET
type MsgMhfCancelGuildMissionTarget struct{}
// Opcode returns the ID associated with this packet type.
func (m *MsgMhfCancelGuildMissionTarget) Opcode() network.PacketID {
return network.MSG_MHF_CANCEL_GUILD_MISSION_TARGET
}
// Parse parses the packet from binary
func (m *MsgMhfCancelGuildMissionTarget) Parse(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
return errors.New("NOT IMPLEMENTED")
}
// Build builds a binary packet from the current data.
func (m *MsgMhfCancelGuildMissionTarget) Build(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
return errors.New("NOT IMPLEMENTED")
}

View File

@@ -0,0 +1,32 @@
package mhfpacket
import (
"errors"
"github.com/Solenataris/Erupe/network/clientctx"
"github.com/Solenataris/Erupe/network"
"github.com/Andoryuuta/byteframe"
)
// MsgMhfCancelGuildScout represents the MSG_MHF_CANCEL_GUILD_SCOUT
type MsgMhfCancelGuildScout struct {
AckHandle uint32
InvitationID uint32
}
// Opcode returns the ID associated with this packet type.
func (m *MsgMhfCancelGuildScout) Opcode() network.PacketID {
return network.MSG_MHF_CANCEL_GUILD_SCOUT
}
// Parse parses the packet from binary
func (m *MsgMhfCancelGuildScout) Parse(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
m.AckHandle = bf.ReadUint32()
m.InvitationID = bf.ReadUint32()
return nil
}
// Build builds a binary packet from the current data.
func (m *MsgMhfCancelGuildScout) Build(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
return errors.New("NOT IMPLEMENTED")
}

View File

@@ -0,0 +1,27 @@
package mhfpacket
import (
"errors"
"github.com/Solenataris/Erupe/network/clientctx"
"github.com/Solenataris/Erupe/network"
"github.com/Andoryuuta/byteframe"
)
// MsgMhfCaravanMyRank represents the MSG_MHF_CARAVAN_MY_RANK
type MsgMhfCaravanMyRank struct{}
// Opcode returns the ID associated with this packet type.
func (m *MsgMhfCaravanMyRank) Opcode() network.PacketID {
return network.MSG_MHF_CARAVAN_MY_RANK
}
// Parse parses the packet from binary
func (m *MsgMhfCaravanMyRank) Parse(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
return errors.New("NOT IMPLEMENTED")
}
// Build builds a binary packet from the current data.
func (m *MsgMhfCaravanMyRank) Build(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
return errors.New("NOT IMPLEMENTED")
}

Some files were not shown because too many files have changed in this diff Show More