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