blob: 73cda9af862925a893373e6129ad92b30e225684 [file] [log] [blame]
/*
* Copyright (C) 2014 The Guava Authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.google.common.base;
import com.google.caliper.BeforeExperiment;
import com.google.caliper.Benchmark;
import com.google.caliper.Param;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
@SuppressWarnings("unused") // Nested enums used reflectively in setUp.
public class EnumsBenchmark {
@Param({"Small", "Medium", "Large"})
String enumSize;
@Param({"0.2", "0.8"})
float hitRate;
private Class<? extends Enum> enumType;
private String[] sampleData;
@BeforeExperiment
@SuppressWarnings("unchecked")
void setUp() throws ClassNotFoundException {
Preconditions.checkArgument(hitRate >= 0 && hitRate <= 1, "hitRate must be in the range [0,1]");
enumType =
(Class<? extends Enum>)
Class.forName(EnumsBenchmark.class.getCanonicalName() + "$" + enumSize + "Enum");
Enum<?>[] allConstants = enumType.getEnumConstants();
List<String> hits = new ArrayList<>();
for (int i = 0; i < hitRate * 256 / 3; ++i) {
hits.add(allConstants[0].name());
hits.add(allConstants[allConstants.length / 2].name());
hits.add(allConstants[allConstants.length - 1].name());
}
List<String> misses = new ArrayList<>();
for (int i = 0; i < 256 - hits.size(); ++i) {
misses.add("INVALID");
}
List<String> sampleDataList = new ArrayList<>();
sampleDataList.addAll(hits);
sampleDataList.addAll(misses);
Collections.shuffle(sampleDataList);
sampleData = sampleDataList.toArray(new String[sampleDataList.size()]);
}
@Benchmark
boolean getIfPresent(int repetitions) {
boolean retVal = false;
for (int i = 0; i < repetitions; ++i) {
retVal &= Enums.getIfPresent(enumType, sampleData[i & 255]).isPresent();
}
return retVal;
}
private enum SmallEnum {
X0,
X1,
X2
}
private enum MediumEnum {
X0,
X1,
X2,
X3,
X4,
X5,
X6,
X7,
X8,
X9,
X10,
X11,
X12,
X13,
X14,
X15,
X16,
X17,
X18,
X19,
X20,
X21,
X22,
X23,
X24,
X25,
X26,
X27,
X28,
X29,
X30,
X31,
X32,
X33,
X34,
X35,
X36,
X37,
X38,
X39,
X40,
X41,
X42,
X43,
X44,
X45,
X46,
X47,
X48,
X49,
X50,
X51,
X52,
X53,
X54,
X55,
X56,
X57,
X58,
X59,
X60,
X61,
X62,
X63,
X64,
X65,
X66,
X67,
X68,
X69,
X70,
X71,
X72,
X73,
X74,
X75,
X76,
X77,
X78,
X79,
X80,
X81,
X82,
X83,
X84,
X85,
X86,
X87,
X88,
X89,
X90,
X91,
X92,
X93,
X94,
X95,
X96,
X97,
X98,
X99
}
private enum LargeEnum {
X0,
X1,
X2,
X3,
X4,
X5,
X6,
X7,
X8,
X9,
X10,
X11,
X12,
X13,
X14,
X15,
X16,
X17,
X18,
X19,
X20,
X21,
X22,
X23,
X24,
X25,
X26,
X27,
X28,
X29,
X30,
X31,
X32,
X33,
X34,
X35,
X36,
X37,
X38,
X39,
X40,
X41,
X42,
X43,
X44,
X45,
X46,
X47,
X48,
X49,
X50,
X51,
X52,
X53,
X54,
X55,
X56,
X57,
X58,
X59,
X60,
X61,
X62,
X63,
X64,
X65,
X66,
X67,
X68,
X69,
X70,
X71,
X72,
X73,
X74,
X75,
X76,
X77,
X78,
X79,
X80,
X81,
X82,
X83,
X84,
X85,
X86,
X87,
X88,
X89,
X90,
X91,
X92,
X93,
X94,
X95,
X96,
X97,
X98,
X99,
X100,
X101,
X102,
X103,
X104,
X105,
X106,
X107,
X108,
X109,
X110,
X111,
X112,
X113,
X114,
X115,
X116,
X117,
X118,
X119,
X120,
X121,
X122,
X123,
X124,
X125,
X126,
X127,
X128,
X129,
X130,
X131,
X132,
X133,
X134,
X135,
X136,
X137,
X138,
X139,
X140,
X141,
X142,
X143,
X144,
X145,
X146,
X147,
X148,
X149,
X150,
X151,
X152,
X153,
X154,
X155,
X156,
X157,
X158,
X159,
X160,
X161,
X162,
X163,
X164,
X165,
X166,
X167,
X168,
X169,
X170,
X171,
X172,
X173,
X174,
X175,
X176,
X177,
X178,
X179,
X180,
X181,
X182,
X183,
X184,
X185,
X186,
X187,
X188,
X189,
X190,
X191,
X192,
X193,
X194,
X195,
X196,
X197,
X198,
X199,
X200,
X201,
X202,
X203,
X204,
X205,
X206,
X207,
X208,
X209,
X210,
X211,
X212,
X213,
X214,
X215,
X216,
X217,
X218,
X219,
X220,
X221,
X222,
X223,
X224,
X225,
X226,
X227,
X228,
X229,
X230,
X231,
X232,
X233,
X234,
X235,
X236,
X237,
X238,
X239,
X240,
X241,
X242,
X243,
X244,
X245,
X246,
X247,
X248,
X249,
X250,
X251,
X252,
X253,
X254,
X255,
X256,
X257,
X258,
X259,
X260,
X261,
X262,
X263,
X264,
X265,
X266,
X267,
X268,
X269,
X270,
X271,
X272,
X273,
X274,
X275,
X276,
X277,
X278,
X279,
X280,
X281,
X282,
X283,
X284,
X285,
X286,
X287,
X288,
X289,
X290,
X291,
X292,
X293,
X294,
X295,
X296,
X297,
X298,
X299,
X300,
X301,
X302,
X303,
X304,
X305,
X306,
X307,
X308,
X309,
X310,
X311,
X312,
X313,
X314,
X315,
X316,
X317,
X318,
X319,
X320,
X321,
X322,
X323,
X324,
X325,
X326,
X327,
X328,
X329,
X330,
X331,
X332,
X333,
X334,
X335,
X336,
X337,
X338,
X339,
X340,
X341,
X342,
X343,
X344,
X345,
X346,
X347,
X348,
X349,
X350,
X351,
X352,
X353,
X354,
X355,
X356,
X357,
X358,
X359,
X360,
X361,
X362,
X363,
X364,
X365,
X366,
X367,
X368,
X369,
X370,
X371,
X372,
X373,
X374,
X375,
X376,
X377,
X378,
X379,
X380,
X381,
X382,
X383,
X384,
X385,
X386,
X387,
X388,
X389,
X390,
X391,
X392,
X393,
X394,
X395,
X396,
X397,
X398,
X399,
X400,
X401,
X402,
X403,
X404,
X405,
X406,
X407,
X408,
X409,
X410,
X411,
X412,
X413,
X414,
X415,
X416,
X417,
X418,
X419,
X420,
X421,
X422,
X423,
X424,
X425,
X426,
X427,
X428,
X429,
X430,
X431,
X432,
X433,
X434,
X435,
X436,
X437,
X438,
X439,
X440,
X441,
X442,
X443,
X444,
X445,
X446,
X447,
X448,
X449,
X450,
X451,
X452,
X453,
X454,
X455,
X456,
X457,
X458,
X459,
X460,
X461,
X462,
X463,
X464,
X465,
X466,
X467,
X468,
X469,
X470,
X471,
X472,
X473,
X474,
X475,
X476,
X477,
X478,
X479,
X480,
X481,
X482,
X483,
X484,
X485,
X486,
X487,
X488,
X489,
X490,
X491,
X492,
X493,
X494,
X495,
X496,
X497,
X498,
X499,
X500,
X501,
X502,
X503,
X504,
X505,
X506,
X507,
X508,
X509,
X510,
X511,
X512,
X513,
X514,
X515,
X516,
X517,
X518,
X519,
X520,
X521,
X522,
X523,
X524,
X525,
X526,
X527,
X528,
X529,
X530,
X531,
X532,
X533,
X534,
X535,
X536,
X537,
X538,
X539,
X540,
X541,
X542,
X543,
X544,
X545,
X546,
X547,
X548,
X549,
X550,
X551,
X552,
X553,
X554,
X555,
X556,
X557,
X558,
X559,
X560,
X561,
X562,
X563,
X564,
X565,
X566,
X567,
X568,
X569,
X570,
X571,
X572,
X573,
X574,
X575,
X576,
X577,
X578,
X579,
X580,
X581,
X582,
X583,
X584,
X585,
X586,
X587,
X588,
X589,
X590,
X591,
X592,
X593,
X594,
X595,
X596,
X597,
X598,
X599,
X600,
X601,
X602,
X603,
X604,
X605,
X606,
X607,
X608,
X609,
X610,
X611,
X612,
X613,
X614,
X615,
X616,
X617,
X618,
X619,
X620,
X621,
X622,
X623,
X624,
X625,
X626,
X627,
X628,
X629,
X630,
X631,
X632,
X633,
X634,
X635,
X636,
X637,
X638,
X639,
X640,
X641,
X642,
X643,
X644,
X645,
X646,
X647,
X648,
X649,
X650,
X651,
X652,
X653,
X654,
X655,
X656,
X657,
X658,
X659,
X660,
X661,
X662,
X663,
X664,
X665,
X666,
X667,
X668,
X669,
X670,
X671,
X672,
X673,
X674,
X675,
X676,
X677,
X678,
X679,
X680,
X681,
X682,
X683,
X684,
X685,
X686,
X687,
X688,
X689,
X690,
X691,
X692,
X693,
X694,
X695,
X696,
X697,
X698,
X699,
X700,
X701,
X702,
X703,
X704,
X705,
X706,
X707,
X708,
X709,
X710,
X711,
X712,
X713,
X714,
X715,
X716,
X717,
X718,
X719,
X720,
X721,
X722,
X723,
X724,
X725,
X726,
X727,
X728,
X729,
X730,
X731,
X732,
X733,
X734,
X735,
X736,
X737,
X738,
X739,
X740,
X741,
X742,
X743,
X744,
X745,
X746,
X747,
X748,
X749,
X750,
X751,
X752,
X753,
X754,
X755,
X756,
X757,
X758,
X759,
X760,
X761,
X762,
X763,
X764,
X765,
X766,
X767,
X768,
X769,
X770,
X771,
X772,
X773,
X774,
X775,
X776,
X777,
X778,
X779,
X780,
X781,
X782,
X783,
X784,
X785,
X786,
X787,
X788,
X789,
X790,
X791,
X792,
X793,
X794,
X795,
X796,
X797,
X798,
X799,
X800,
X801,
X802,
X803,
X804,
X805,
X806,
X807,
X808,
X809,
X810,
X811,
X812,
X813,
X814,
X815,
X816,
X817,
X818,
X819,
X820,
X821,
X822,
X823,
X824,
X825,
X826,
X827,
X828,
X829,
X830,
X831,
X832,
X833,
X834,
X835,
X836,
X837,
X838,
X839,
X840,
X841,
X842,
X843,
X844,
X845,
X846,
X847,
X848,
X849,
X850,
X851,
X852,
X853,
X854,
X855,
X856,
X857,
X858,
X859,
X860,
X861,
X862,
X863,
X864,
X865,
X866,
X867,
X868,
X869,
X870,
X871,
X872,
X873,
X874,
X875,
X876,
X877,
X878,
X879,
X880,
X881,
X882,
X883,
X884,
X885,
X886,
X887,
X888,
X889,
X890,
X891,
X892,
X893,
X894,
X895,
X896,
X897,
X898,
X899,
X900,
X901,
X902,
X903,
X904,
X905,
X906,
X907,
X908,
X909,
X910,
X911,
X912,
X913,
X914,
X915,
X916,
X917,
X918,
X919,
X920,
X921,
X922,
X923,
X924,
X925,
X926,
X927,
X928,
X929,
X930,
X931,
X932,
X933,
X934,
X935,
X936,
X937,
X938,
X939,
X940,
X941,
X942,
X943,
X944,
X945,
X946,
X947,
X948,
X949,
X950,
X951,
X952,
X953,
X954,
X955,
X956,
X957,
X958,
X959,
X960,
X961,
X962,
X963,
X964,
X965,
X966,
X967,
X968,
X969,
X970,
X971,
X972,
X973,
X974,
X975,
X976,
X977,
X978,
X979,
X980,
X981,
X982,
X983,
X984,
X985,
X986,
X987,
X988,
X989,
X990,
X991,
X992,
X993,
X994,
X995,
X996,
X997,
X998,
X999,
X1000,
X1001,
X1002,
X1003,
X1004,
X1005,
X1006,
X1007,
X1008,
X1009,
X1010,
X1011,
X1012,
X1013,
X1014,
X1015,
X1016,
X1017,
X1018,
X1019,
X1020,
X1021,
X1022,
X1023,
X1024,
X1025,
X1026,
X1027,
X1028,
X1029,
X1030,
X1031,
X1032,
X1033,
X1034,
X1035,
X1036,
X1037,
X1038,
X1039,
X1040,
X1041,
X1042,
X1043,
X1044,
X1045,
X1046,
X1047,
X1048,
X1049,
X1050,
X1051,
X1052,
X1053,
X1054,
X1055,
X1056,
X1057,
X1058,
X1059,
X1060,
X1061,
X1062,
X1063,
X1064,
X1065,
X1066,
X1067,
X1068,
X1069,
X1070,
X1071,
X1072,
X1073,
X1074,
X1075,
X1076,
X1077,
X1078,
X1079,
X1080,
X1081,
X1082,
X1083,
X1084,
X1085,
X1086,
X1087,
X1088,
X1089,
X1090,
X1091,
X1092,
X1093,
X1094,
X1095,
X1096,
X1097,
X1098,
X1099,
X1100,
X1101,
X1102,
X1103,
X1104,
X1105,
X1106,
X1107,
X1108,
X1109,
X1110,
X1111,
X1112,
X1113,
X1114,
X1115,
X1116,
X1117,
X1118,
X1119,
X1120,
X1121,
X1122,
X1123,
X1124,
X1125,
X1126,
X1127,
X1128,
X1129,
X1130,
X1131,
X1132,
X1133,
X1134,
X1135,
X1136,
X1137,
X1138,
X1139,
X1140,
X1141,
X1142,
X1143,
X1144,
X1145,
X1146,
X1147,
X1148,
X1149,
X1150,
X1151,
X1152,
X1153,
X1154,
X1155,
X1156,
X1157,
X1158,
X1159,
X1160,
X1161,
X1162,
X1163,
X1164,
X1165,
X1166,
X1167,
X1168,
X1169,
X1170,
X1171,
X1172,
X1173,
X1174,
X1175,
X1176,
X1177,
X1178,
X1179,
X1180,
X1181,
X1182,
X1183,
X1184,
X1185,
X1186,
X1187,
X1188,
X1189,
X1190,
X1191,
X1192,
X1193,
X1194,
X1195,
X1196,
X1197,
X1198,
X1199,
X1200,
X1201,
X1202,
X1203,
X1204,
X1205,
X1206,
X1207,
X1208,
X1209,
X1210,
X1211,
X1212,
X1213,
X1214,
X1215,
X1216,
X1217,
X1218,
X1219,
X1220,
X1221,
X1222,
X1223,
X1224,
X1225,
X1226,
X1227,
X1228,
X1229,
X1230,
X1231,
X1232,
X1233,
X1234,
X1235,
X1236,
X1237,
X1238,
X1239,
X1240,
X1241,
X1242,
X1243,
X1244,
X1245,
X1246,
X1247,
X1248,
X1249,
X1250,
X1251,
X1252,
X1253,
X1254,
X1255,
X1256,
X1257,
X1258,
X1259,
X1260,
X1261,
X1262,
X1263,
X1264,
X1265,
X1266,
X1267,
X1268,
X1269,
X1270,
X1271,
X1272,
X1273,
X1274,
X1275,
X1276,
X1277,
X1278,
X1279,
X1280,
X1281,
X1282,
X1283,
X1284,
X1285,
X1286,
X1287,
X1288,
X1289,
X1290,
X1291,
X1292,
X1293,
X1294,
X1295,
X1296,
X1297,
X1298,
X1299,
X1300,
X1301,
X1302,
X1303,
X1304,
X1305,
X1306,
X1307,
X1308,
X1309,
X1310,
X1311,
X1312,
X1313,
X1314,
X1315,
X1316,
X1317,
X1318,
X1319,
X1320,
X1321,
X1322,
X1323,
X1324,
X1325,
X1326,
X1327,
X1328,
X1329,
X1330,
X1331,
X1332,
X1333,
X1334,
X1335,
X1336,
X1337,
X1338,
X1339,
X1340,
X1341,
X1342,
X1343,
X1344,
X1345,
X1346,
X1347,
X1348,
X1349,
X1350,
X1351,
X1352,
X1353,
X1354,
X1355,
X1356,
X1357,
X1358,
X1359,
X1360,
X1361,
X1362,
X1363,
X1364,
X1365,
X1366,
X1367,
X1368,
X1369,
X1370,
X1371,
X1372,
X1373,
X1374,
X1375,
X1376,
X1377,
X1378,
X1379,
X1380,
X1381,
X1382,
X1383,
X1384,
X1385,
X1386,
X1387,
X1388,
X1389,
X1390,
X1391,
X1392,
X1393,
X1394,
X1395,
X1396,
X1397,
X1398,
X1399,
X1400,
X1401,
X1402,
X1403,
X1404,
X1405,
X1406,
X1407,
X1408,
X1409,
X1410,
X1411,
X1412,
X1413,
X1414,
X1415,
X1416,
X1417,
X1418,
X1419,
X1420,
X1421,
X1422,
X1423,
X1424,
X1425,
X1426,
X1427,
X1428,
X1429,
X1430,
X1431,
X1432,
X1433,
X1434,
X1435,
X1436,
X1437,
X1438,
X1439,
X1440,
X1441,
X1442,
X1443,
X1444,
X1445,
X1446,
X1447,
X1448,
X1449,
X1450,
X1451,
X1452,
X1453,
X1454,
X1455,
X1456,
X1457,
X1458,
X1459,
X1460,
X1461,
X1462,
X1463,
X1464,
X1465,
X1466,
X1467,
X1468,
X1469,
X1470,
X1471,
X1472,
X1473,
X1474,
X1475,
X1476,
X1477,
X1478,
X1479,
X1480,
X1481,
X1482,
X1483,
X1484,
X1485,
X1486,
X1487,
X1488,
X1489,
X1490,
X1491,
X1492,
X1493,
X1494,
X1495,
X1496,
X1497,
X1498,
X1499,
X1500,
X1501,
X1502,
X1503,
X1504,
X1505,
X1506,
X1507,
X1508,
X1509,
X1510,
X1511,
X1512,
X1513,
X1514,
X1515,
X1516,
X1517,
X1518,
X1519,
X1520,
X1521,
X1522,
X1523,
X1524,
X1525,
X1526,
X1527,
X1528,
X1529,
X1530,
X1531,
X1532,
X1533,
X1534,
X1535,
X1536,
X1537,
X1538,
X1539,
X1540,
X1541,
X1542,
X1543,
X1544,
X1545,
X1546,
X1547,
X1548,
X1549,
X1550,
X1551,
X1552,
X1553,
X1554,
X1555,
X1556,
X1557,
X1558,
X1559,
X1560,
X1561,
X1562,
X1563,
X1564,
X1565,
X1566,
X1567,
X1568,
X1569,
X1570,
X1571,
X1572,
X1573,
X1574,
X1575,
X1576,
X1577,
X1578,
X1579,
X1580,
X1581,
X1582,
X1583,
X1584,
X1585,
X1586,
X1587,
X1588,
X1589,
X1590,
X1591,
X1592,
X1593,
X1594,
X1595,
X1596,
X1597,
X1598,
X1599,
X1600,
X1601,
X1602,
X1603,
X1604,
X1605,
X1606,
X1607,
X1608,
X1609,
X1610,
X1611,
X1612,
X1613,
X1614,
X1615,
X1616,
X1617,
X1618,
X1619,
X1620,
X1621,
X1622,
X1623,
X1624,
X1625,
X1626,
X1627,
X1628,
X1629,
X1630,
X1631,
X1632,
X1633,
X1634,
X1635,
X1636,
X1637,
X1638,
X1639,
X1640,
X1641,
X1642,
X1643,
X1644,
X1645,
X1646,
X1647,
X1648,
X1649,
X1650,
X1651,
X1652,
X1653,
X1654,
X1655,
X1656,
X1657,
X1658,
X1659,
X1660,
X1661,
X1662,
X1663,
X1664,
X1665,
X1666,
X1667,
X1668,
X1669,
X1670,
X1671,
X1672,
X1673,
X1674,
X1675,
X1676,
X1677,
X1678,
X1679,
X1680,
X1681,
X1682,
X1683,
X1684,
X1685,
X1686,
X1687,
X1688,
X1689,
X1690,
X1691,
X1692,
X1693,
X1694,
X1695,
X1696,
X1697,
X1698,
X1699,
X1700,
X1701,
X1702,
X1703,
X1704,
X1705,
X1706,
X1707,
X1708,
X1709,
X1710,
X1711,
X1712,
X1713,
X1714,
X1715,
X1716,
X1717,
X1718,
X1719,
X1720,
X1721,
X1722,
X1723,
X1724,
X1725,
X1726,
X1727,
X1728,
X1729,
X1730,
X1731,
X1732,
X1733,
X1734,
X1735,
X1736,
X1737,
X1738,
X1739,
X1740,
X1741,
X1742,
X1743,
X1744,
X1745,
X1746,
X1747,
X1748,
X1749,
X1750,
X1751,
X1752,
X1753,
X1754,
X1755,
X1756,
X1757,
X1758,
X1759,
X1760,
X1761,
X1762,
X1763,
X1764,
X1765,
X1766,
X1767,
X1768,
X1769,
X1770,
X1771,
X1772,
X1773,
X1774,
X1775,
X1776,
X1777,
X1778,
X1779,
X1780,
X1781,
X1782,
X1783,
X1784,
X1785,
X1786,
X1787,
X1788,
X1789,
X1790,
X1791,
X1792,
X1793,
X1794,
X1795,
X1796,
X1797,
X1798,
X1799,
X1800,
X1801,
X1802,
X1803,
X1804,
X1805,
X1806,
X1807,
X1808,
X1809,
X1810,
X1811,
X1812,
X1813,
X1814,
X1815,
X1816,
X1817,
X1818,
X1819,
X1820,
X1821,
X1822,
X1823,
X1824,
X1825,
X1826,
X1827,
X1828,
X1829,
X1830,
X1831,
X1832,
X1833,
X1834,
X1835,
X1836,
X1837,
X1838,
X1839,
X1840,
X1841,
X1842,
X1843,
X1844,
X1845,
X1846,
X1847,
X1848,
X1849,
X1850,
X1851,
X1852,
X1853,
X1854,
X1855,
X1856,
X1857,
X1858,
X1859,
X1860,
X1861,
X1862,
X1863,
X1864,
X1865,
X1866,
X1867,
X1868,
X1869,
X1870,
X1871,
X1872,
X1873,
X1874,
X1875,
X1876,
X1877,
X1878,
X1879,
X1880,
X1881,
X1882,
X1883,
X1884,
X1885,
X1886,
X1887,
X1888,
X1889,
X1890,
X1891,
X1892,
X1893,
X1894,
X1895,
X1896,
X1897,
X1898,
X1899,
X1900,
X1901,
X1902,
X1903,
X1904,
X1905,
X1906,
X1907,
X1908,
X1909,
X1910,
X1911,
X1912,
X1913,
X1914,
X1915,
X1916,
X1917,
X1918,
X1919,
X1920,
X1921,
X1922,
X1923,
X1924,
X1925,
X1926,
X1927,
X1928,
X1929,
X1930,
X1931,
X1932,
X1933,
X1934,
X1935,
X1936,
X1937,
X1938,
X1939,
X1940,
X1941,
X1942,
X1943,
X1944,
X1945,
X1946,
X1947,
X1948,
X1949,
X1950,
X1951,
X1952,
X1953,
X1954,
X1955,
X1956,
X1957,
X1958,
X1959,
X1960,
X1961,
X1962,
X1963,
X1964,
X1965,
X1966,
X1967,
X1968,
X1969,
X1970,
X1971,
X1972,
X1973,
X1974,
X1975,
X1976,
X1977,
X1978,
X1979,
X1980,
X1981,
X1982,
X1983,
X1984,
X1985,
X1986,
X1987,
X1988,
X1989,
X1990,
X1991,
X1992,
X1993,
X1994,
X1995,
X1996,
X1997,
X1998,
X1999,
X2000,
X2001,
X2002,
X2003,
X2004,
X2005,
X2006,
X2007,
X2008,
X2009,
X2010,
X2011,
X2012,
X2013,
X2014,
X2015,
X2016,
X2017,
X2018,
X2019,
X2020,
X2021,
X2022,
X2023,
X2024,
X2025,
X2026,
X2027,
X2028,
X2029,
X2030,
X2031,
X2032,
X2033,
X2034,
X2035,
X2036,
X2037,
X2038,
X2039,
X2040,
X2041,
X2042,
X2043,
X2044,
X2045,
X2046,
X2047,
X2048,
X2049,
X2050,
X2051,
X2052,
X2053,
X2054,
X2055,
X2056,
X2057,
X2058,
X2059,
X2060,
X2061,
X2062,
X2063,
X2064,
X2065,
X2066,
X2067,
X2068,
X2069,
X2070,
X2071,
X2072,
X2073,
X2074,
X2075,
X2076,
X2077,
X2078,
X2079,
X2080,
X2081,
X2082,
X2083,
X2084,
X2085,
X2086,
X2087,
X2088,
X2089,
X2090,
X2091,
X2092,
X2093,
X2094,
X2095,
X2096,
X2097,
X2098,
X2099,
X2100,
X2101,
X2102,
X2103,
X2104,
X2105,
X2106,
X2107,
X2108,
X2109,
X2110,
X2111,
X2112,
X2113,
X2114,
X2115,
X2116,
X2117,
X2118,
X2119,
X2120,
X2121,
X2122,
X2123,
X2124,
X2125,
X2126,
X2127,
X2128,
X2129,
X2130,
X2131,
X2132,
X2133,
X2134,
X2135,
X2136,
X2137,
X2138,
X2139,
X2140,
X2141,
X2142,
X2143,
X2144,
X2145,
X2146,
X2147,
X2148,
X2149,
X2150,
X2151,
X2152,
X2153,
X2154,
X2155,
X2156,
X2157,
X2158,
X2159,
X2160,
X2161,
X2162,
X2163,
X2164,
X2165,
X2166,
X2167,
X2168,
X2169,
X2170,
X2171,
X2172,
X2173,
X2174,
X2175,
X2176,
X2177,
X2178,
X2179,
X2180,
X2181,
X2182,
X2183,
X2184,
X2185,
X2186,
X2187,
X2188,
X2189,
X2190,
X2191,
X2192,
X2193,
X2194,
X2195,
X2196,
X2197,
X2198,
X2199,
X2200,
X2201,
X2202,
X2203,
X2204,
X2205,
X2206,
X2207,
X2208,
X2209,
X2210,
X2211,
X2212,
X2213,
X2214,
X2215,
X2216,
X2217,
X2218,
X2219,
X2220,
X2221,
X2222,
X2223,
X2224,
X2225,
X2226,
X2227,
X2228,
X2229,
X2230,
X2231,
X2232,
X2233,
X2234,
X2235,
X2236,
X2237,
X2238,
X2239,
X2240,
X2241,
X2242,
X2243,
X2244,
X2245,
X2246,
X2247,
X2248,
X2249,
X2250,
X2251,
X2252,
X2253,
X2254,
X2255,
X2256,
X2257,
X2258,
X2259,
X2260,
X2261,
X2262,
X2263,
X2264,
X2265,
X2266,
X2267,
X2268,
X2269,
X2270,
X2271,
X2272,
X2273,
X2274,
X2275,
X2276,
X2277,
X2278,
X2279,
X2280,
X2281,
X2282,
X2283,
X2284,
X2285,
X2286,
X2287,
X2288,
X2289,
X2290,
X2291,
X2292,
X2293,
X2294,
X2295,
X2296,
X2297,
X2298,
X2299,
X2300,
X2301,
X2302,
X2303,
X2304,
X2305,
X2306,
X2307,
X2308,
X2309,
X2310,
X2311,
X2312,
X2313,
X2314,
X2315,
X2316,
X2317,
X2318,
X2319,
X2320,
X2321,
X2322,
X2323,
X2324,
X2325,
X2326,
X2327,
X2328,
X2329,
X2330,
X2331,
X2332,
X2333,
X2334,
X2335,
X2336,
X2337,
X2338,
X2339,
X2340,
X2341,
X2342,
X2343,
X2344,
X2345,
X2346,
X2347,
X2348,
X2349,
X2350,
X2351,
X2352,
X2353,
X2354,
X2355,
X2356,
X2357,
X2358,
X2359,
X2360,
X2361,
X2362,
X2363,
X2364,
X2365,
X2366,
X2367,
X2368,
X2369,
X2370,
X2371,
X2372,
X2373,
X2374,
X2375,
X2376,
X2377,
X2378,
X2379,
X2380,
X2381,
X2382,
X2383,
X2384,
X2385,
X2386,
X2387,
X2388,
X2389,
X2390,
X2391,
X2392,
X2393,
X2394,
X2395,
X2396,
X2397,
X2398,
X2399,
X2400,
X2401,
X2402,
X2403,
X2404,
X2405,
X2406,
X2407,
X2408,
X2409,
X2410,
X2411,
X2412,
X2413,
X2414,
X2415,
X2416,
X2417,
X2418,
X2419,
X2420,
X2421,
X2422,
X2423,
X2424,
X2425,
X2426,
X2427,
X2428,
X2429,
X2430,
X2431,
X2432,
X2433,
X2434,
X2435,
X2436,
X2437,
X2438,
X2439,
X2440,
X2441,
X2442,
X2443,
X2444,
X2445,
X2446,
X2447,
X2448,
X2449,
X2450,
X2451,
X2452,
X2453,
X2454,
X2455,
X2456,
X2457,
X2458,
X2459,
X2460,
X2461,
X2462,
X2463,
X2464,
X2465,
X2466,
X2467,
X2468,
X2469,
X2470,
X2471,
X2472,
X2473,
X2474,
X2475,
X2476,
X2477,
X2478,
X2479,
X2480,
X2481,
X2482,
X2483,
X2484,
X2485,
X2486,
X2487,
X2488,
X2489,
X2490,
X2491,
X2492,
X2493,
X2494,
X2495,
X2496,
X2497,
X2498,
X2499
}
}