Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
99 | pmbaty | 1 | /* |
2 | Texel - A UCI chess engine. |
||
3 | Copyright (C) 2012-2014 Peter Ă–sterlund, peterosterlund2@gmail.com |
||
4 | |||
5 | This program is free software: you can redistribute it and/or modify |
||
6 | it under the terms of the GNU General Public License as published by |
||
7 | the Free Software Foundation, either version 3 of the License, or |
||
8 | (at your option) any later version. |
||
9 | |||
10 | This program is distributed in the hope that it will be useful, |
||
11 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
||
12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||
13 | GNU General Public License for more details. |
||
14 | |||
15 | You should have received a copy of the GNU General Public License |
||
16 | along with this program. If not, see <http://www.gnu.org/licenses/>. |
||
17 | */ |
||
18 | |||
19 | /* |
||
20 | * position.cpp |
||
21 | * |
||
22 | * Created on: Feb 25, 2012 |
||
23 | * Author: petero |
||
24 | */ |
||
25 | |||
26 | #include "position.hpp" |
||
27 | #include "evaluate.hpp" |
||
28 | #include "textio.hpp" |
||
29 | |||
30 | #include <iostream> |
||
31 | #include <cassert> |
||
32 | |||
33 | U64 Position::psHashKeys[Piece::nPieceTypes][64]; |
||
34 | U64 Position::whiteHashKey; |
||
35 | U64 Position::castleHashKeys[16]; |
||
36 | U64 Position::epHashKeys[9]; |
||
37 | U64 Position::moveCntKeys[101]; |
||
38 | |||
39 | |||
40 | static StaticInitializer<Position> posInit; |
||
41 | |||
42 | void |
||
43 | Position::staticInitialize() { |
||
44 | int rndNo = 0; |
||
45 | for (int p = 0; p < Piece::nPieceTypes; p++) |
||
46 | for (int sq = 0; sq < 64; sq++) |
||
47 | psHashKeys[p][sq] = getRandomHashVal(rndNo++); |
||
48 | whiteHashKey = getRandomHashVal(rndNo++); |
||
49 | for (size_t cm = 0; cm < COUNT_OF(castleHashKeys); cm++) |
||
50 | castleHashKeys[cm] = getRandomHashVal(rndNo++); |
||
51 | for (size_t f = 0; f < COUNT_OF(epHashKeys); f++) |
||
52 | epHashKeys[f] = getRandomHashVal(rndNo++); |
||
53 | for (size_t mc = 0; mc < COUNT_OF(moveCntKeys); mc++) |
||
54 | moveCntKeys[mc] = getRandomHashVal(rndNo++); |
||
55 | } |
||
56 | |||
57 | |||
58 | Position::Position() { |
||
59 | for (int i = 0; i < 64; i++) |
||
60 | squares[i] = Piece::EMPTY; |
||
61 | for (int i = 0; i < Piece::nPieceTypes; i++) { |
||
62 | psScore1_[i] = 0; |
||
63 | psScore2_[i] = 0; |
||
64 | pieceTypeBB_[i] = 0; |
||
65 | } |
||
66 | whiteBB_ = blackBB_ = 0; |
||
67 | whiteMove = true; |
||
68 | castleMask = 0; |
||
69 | epSquare = -1; |
||
70 | halfMoveClock = 0; |
||
71 | fullMoveCounter = 1; |
||
72 | computeZobristHash(); |
||
73 | wKingSq_ = bKingSq_ = -1; |
||
74 | wMtrl_ = bMtrl_ = -::kV; |
||
75 | wMtrlPawns_ = bMtrlPawns_ = 0; |
||
76 | } |
||
77 | |||
78 | void |
||
79 | Position::setPiece(int square, int piece) { |
||
80 | int removedPiece = squares[square]; |
||
81 | squares[square] = piece; |
||
82 | |||
83 | // Update hash key |
||
84 | hashKey ^= psHashKeys[removedPiece][square]; |
||
85 | hashKey ^= psHashKeys[piece][square]; |
||
86 | |||
87 | // Update material identifier |
||
88 | matId.removePiece(removedPiece); |
||
89 | matId.addPiece(piece); |
||
90 | |||
91 | // Update bitboards |
||
92 | const U64 sqMask = 1ULL << square; |
||
93 | pieceTypeBB_[removedPiece] &= ~sqMask; |
||
94 | pieceTypeBB_[piece] |= sqMask; |
||
95 | |||
96 | if (removedPiece != Piece::EMPTY) { |
||
97 | int pVal = ::pieceValue[removedPiece]; |
||
98 | if (Piece::isWhite(removedPiece)) { |
||
99 | wMtrl_ -= pVal; |
||
100 | whiteBB_ &= ~sqMask; |
||
101 | if (removedPiece == Piece::WPAWN) { |
||
102 | wMtrlPawns_ -= pVal; |
||
103 | pHashKey ^= psHashKeys[Piece::WPAWN][square]; |
||
104 | } |
||
105 | } else { |
||
106 | bMtrl_ -= pVal; |
||
107 | blackBB_ &= ~sqMask; |
||
108 | if (removedPiece == Piece::BPAWN) { |
||
109 | bMtrlPawns_ -= pVal; |
||
110 | pHashKey ^= psHashKeys[Piece::BPAWN][square]; |
||
111 | } |
||
112 | } |
||
113 | } |
||
114 | |||
115 | if (piece != Piece::EMPTY) { |
||
116 | int pVal = ::pieceValue[piece]; |
||
117 | if (Piece::isWhite(piece)) { |
||
118 | wMtrl_ += pVal; |
||
119 | whiteBB_ |= sqMask; |
||
120 | if (piece == Piece::WPAWN) { |
||
121 | wMtrlPawns_ += pVal; |
||
122 | pHashKey ^= psHashKeys[Piece::WPAWN][square]; |
||
123 | } |
||
124 | if (piece == Piece::WKING) |
||
125 | wKingSq_ = square; |
||
126 | } else { |
||
127 | bMtrl_ += pVal; |
||
128 | blackBB_ |= sqMask; |
||
129 | if (piece == Piece::BPAWN) { |
||
130 | bMtrlPawns_ += pVal; |
||
131 | pHashKey ^= psHashKeys[Piece::BPAWN][square]; |
||
132 | } |
||
133 | if (piece == Piece::BKING) |
||
134 | bKingSq_ = square; |
||
135 | } |
||
136 | } |
||
137 | |||
138 | // Update piece/square table scores |
||
139 | psScore1_[removedPiece] -= Evaluate::psTab1[removedPiece][square]; |
||
140 | psScore2_[removedPiece] -= Evaluate::psTab2[removedPiece][square]; |
||
141 | psScore1_[piece] += Evaluate::psTab1[piece][square]; |
||
142 | psScore2_[piece] += Evaluate::psTab2[piece][square]; |
||
143 | } |
||
144 | |||
145 | U64 |
||
146 | Position::hashAfterMove(const Move& move) const { |
||
147 | int from = move.from(); |
||
148 | int to = move.to(); |
||
149 | int p = squares[from]; |
||
150 | int capP = squares[to]; |
||
151 | |||
152 | U64 ret = hashKey ^ whiteHashKey; |
||
153 | ret ^= psHashKeys[capP][to]; |
||
154 | ret ^= psHashKeys[p][to]; |
||
155 | ret ^= psHashKeys[p][from]; |
||
156 | ret ^= psHashKeys[Piece::EMPTY][from]; |
||
157 | |||
158 | return ret; |
||
159 | } |
||
160 | |||
161 | void |
||
162 | Position::makeMove(const Move& move, UndoInfo& ui) { |
||
163 | ui.capturedPiece = squares[move.to()]; |
||
164 | ui.castleMask = castleMask; |
||
165 | ui.epSquare = epSquare; |
||
166 | ui.halfMoveClock = halfMoveClock; |
||
167 | bool wtm = whiteMove; |
||
168 | |||
169 | hashKey ^= whiteHashKey; |
||
170 | |||
171 | const int p = squares[move.from()]; |
||
172 | int capP = squares[move.to()]; |
||
173 | U64 fromMask = 1ULL << move.from(); |
||
174 | |||
175 | int prevEpSquare = epSquare; |
||
176 | setEpSquare(-1); |
||
177 | |||
178 | if ((capP != Piece::EMPTY) || ((pieceTypeBB(Piece::WPAWN, Piece::BPAWN) & fromMask) != 0)) { |
||
179 | halfMoveClock = 0; |
||
180 | |||
181 | // Handle en passant and epSquare |
||
182 | if (p == Piece::WPAWN) { |
||
183 | if (move.to() - move.from() == 2 * 8) { |
||
184 | int x = getX(move.to()); |
||
185 | if (BitBoard::epMaskW[x] & pieceTypeBB(Piece::BPAWN)) |
||
186 | setEpSquare(move.from() + 8); |
||
187 | } else if (move.to() == prevEpSquare) { |
||
188 | setPiece(move.to() - 8, Piece::EMPTY); |
||
189 | } |
||
190 | } else if (p == Piece::BPAWN) { |
||
191 | if (move.to() - move.from() == -2 * 8) { |
||
192 | int x = getX(move.to()); |
||
193 | if (BitBoard::epMaskB[x] & pieceTypeBB(Piece::WPAWN)) |
||
194 | setEpSquare(move.from() - 8); |
||
195 | } else if (move.to() == prevEpSquare) { |
||
196 | setPiece(move.to() + 8, Piece::EMPTY); |
||
197 | } |
||
198 | } |
||
199 | |||
200 | if ((pieceTypeBB(Piece::WKING, Piece::BKING) & fromMask) != 0) { |
||
201 | if (wtm) { |
||
202 | setCastleMask(castleMask & ~(1 << A1_CASTLE)); |
||
203 | setCastleMask(castleMask & ~(1 << H1_CASTLE)); |
||
204 | } else { |
||
205 | setCastleMask(castleMask & ~(1 << A8_CASTLE)); |
||
206 | setCastleMask(castleMask & ~(1 << H8_CASTLE)); |
||
207 | } |
||
208 | } |
||
209 | |||
210 | // Perform move |
||
211 | setPiece(move.from(), Piece::EMPTY); |
||
212 | // Handle promotion |
||
213 | if (move.promoteTo() != Piece::EMPTY) { |
||
214 | setPiece(move.to(), move.promoteTo()); |
||
215 | } else { |
||
216 | setPiece(move.to(), p); |
||
217 | } |
||
218 | } else { |
||
219 | halfMoveClock++; |
||
220 | |||
221 | // Handle castling |
||
222 | if ((pieceTypeBB(Piece::WKING, Piece::BKING) & fromMask) != 0) { |
||
223 | int k0 = move.from(); |
||
224 | if (move.to() == k0 + 2) { // O-O |
||
225 | movePieceNotPawn(k0 + 3, k0 + 1); |
||
226 | } else if (move.to() == k0 - 2) { // O-O-O |
||
227 | movePieceNotPawn(k0 - 4, k0 - 1); |
||
228 | } |
||
229 | if (wtm) { |
||
230 | setCastleMask(castleMask & ~(1 << A1_CASTLE)); |
||
231 | setCastleMask(castleMask & ~(1 << H1_CASTLE)); |
||
232 | } else { |
||
233 | setCastleMask(castleMask & ~(1 << A8_CASTLE)); |
||
234 | setCastleMask(castleMask & ~(1 << H8_CASTLE)); |
||
235 | } |
||
236 | } |
||
237 | |||
238 | // Perform move |
||
239 | movePieceNotPawn(move.from(), move.to()); |
||
240 | } |
||
241 | if (wtm) { |
||
242 | // Update castling rights when rook moves |
||
243 | if ((BitBoard::maskCorners & fromMask) != 0) { |
||
244 | if (p == Piece::WROOK) |
||
245 | removeCastleRights(move.from()); |
||
246 | } |
||
247 | if ((BitBoard::maskCorners & (1ULL << move.to())) != 0) { |
||
248 | if (capP == Piece::BROOK) |
||
249 | removeCastleRights(move.to()); |
||
250 | } |
||
251 | } else { |
||
252 | fullMoveCounter++; |
||
253 | // Update castling rights when rook moves |
||
254 | if ((BitBoard::maskCorners & fromMask) != 0) { |
||
255 | if (p == Piece::BROOK) |
||
256 | removeCastleRights(move.from()); |
||
257 | } |
||
258 | if ((BitBoard::maskCorners & (1ULL << move.to())) != 0) { |
||
259 | if (capP == Piece::WROOK) |
||
260 | removeCastleRights(move.to()); |
||
261 | } |
||
262 | } |
||
263 | |||
264 | whiteMove = !wtm; |
||
265 | } |
||
266 | |||
267 | void |
||
268 | Position::makeMoveB(const Move& move, UndoInfo& ui) { |
||
269 | ui.capturedPiece = squares[move.to()]; |
||
270 | ui.castleMask = castleMask; |
||
271 | |||
272 | const int p = squares[move.from()]; |
||
273 | int capP = squares[move.to()]; |
||
274 | U64 fromMask = 1ULL << move.from(); |
||
275 | |||
276 | int prevEpSquare = epSquare; |
||
277 | |||
278 | if ((capP != Piece::EMPTY) || ((pieceTypeBB(Piece::WPAWN, Piece::BPAWN) & fromMask) != 0)) { |
||
279 | // Handle en passant |
||
280 | if (p == Piece::WPAWN) { |
||
281 | if (move.to() == prevEpSquare) |
||
282 | setPieceB(move.to() - 8, Piece::EMPTY); |
||
283 | } else if (p == Piece::BPAWN) { |
||
284 | if (move.to() == prevEpSquare) |
||
285 | setPieceB(move.to() + 8, Piece::EMPTY); |
||
286 | } |
||
287 | |||
288 | // Perform move |
||
289 | setPieceB(move.from(), Piece::EMPTY); |
||
290 | // Handle promotion |
||
291 | if (move.promoteTo() != Piece::EMPTY) { |
||
292 | setPieceB(move.to(), move.promoteTo()); |
||
293 | } else { |
||
294 | setPieceB(move.to(), p); |
||
295 | } |
||
296 | } else { |
||
297 | // Handle castling |
||
298 | if ((pieceTypeBB(Piece::WKING, Piece::BKING) & fromMask) != 0) { |
||
299 | int k0 = move.from(); |
||
300 | if (move.to() == k0 + 2) { // O-O |
||
301 | movePieceNotPawnB(k0 + 3, k0 + 1); |
||
302 | } else if (move.to() == k0 - 2) { // O-O-O |
||
303 | movePieceNotPawnB(k0 - 4, k0 - 1); |
||
304 | } |
||
305 | } |
||
306 | |||
307 | // Perform move |
||
308 | movePieceNotPawnB(move.from(), move.to()); |
||
309 | } |
||
310 | } |
||
311 | |||
312 | void |
||
313 | Position::movePieceNotPawn(int from, int to) { |
||
314 | const int piece = squares[from]; |
||
315 | hashKey ^= psHashKeys[piece][from]; |
||
316 | hashKey ^= psHashKeys[piece][to]; |
||
317 | hashKey ^= psHashKeys[Piece::EMPTY][from]; |
||
318 | hashKey ^= psHashKeys[Piece::EMPTY][to]; |
||
319 | |||
320 | squares[from] = Piece::EMPTY; |
||
321 | squares[to] = piece; |
||
322 | |||
323 | const U64 sqMaskF = 1ULL << from; |
||
324 | const U64 sqMaskT = 1ULL << to; |
||
325 | pieceTypeBB_[piece] &= ~sqMaskF; |
||
326 | pieceTypeBB_[piece] |= sqMaskT; |
||
327 | if (Piece::isWhite(piece)) { |
||
328 | whiteBB_ &= ~sqMaskF; |
||
329 | whiteBB_ |= sqMaskT; |
||
330 | if (piece == Piece::WKING) |
||
331 | wKingSq_ = to; |
||
332 | } else { |
||
333 | blackBB_ &= ~sqMaskF; |
||
334 | blackBB_ |= sqMaskT; |
||
335 | if (piece == Piece::BKING) |
||
336 | bKingSq_ = to; |
||
337 | } |
||
338 | |||
339 | psScore1_[piece] += Evaluate::psTab1[piece][to] - Evaluate::psTab1[piece][from]; |
||
340 | psScore2_[piece] += Evaluate::psTab2[piece][to] - Evaluate::psTab2[piece][from]; |
||
341 | } |
||
342 | |||
343 | // ---------------------------------------------------------------------------- |
||
344 | |||
345 | void |
||
346 | Position::serialize(SerializeData& data) const { |
||
347 | for (int i = 0; i < 4; i++) { |
||
348 | int sq0 = i * 16; |
||
349 | U64 v = 0; |
||
350 | for (int sq = 0; sq < 16; sq++) |
||
351 | v = (v << 4) | squares[sq0 + sq]; |
||
352 | data.v[i] = v; |
||
353 | } |
||
354 | U64 flags = whiteMove; |
||
355 | flags = (flags << 4) | castleMask; |
||
356 | flags = (flags << 8) | (epSquare & 0xff); |
||
357 | flags = (flags << 8) | (halfMoveClock & 0xff); |
||
358 | flags = (flags << 16) | (fullMoveCounter & 0xffff); |
||
359 | data.v[4] = flags; |
||
360 | } |
||
361 | |||
362 | void |
||
363 | Position::deSerialize(const SerializeData& data) { |
||
364 | for (int i = 0; i < Piece::nPieceTypes; i++) { |
||
365 | psScore1_[i] = 0; |
||
366 | psScore2_[i] = 0; |
||
367 | pieceTypeBB_[i] = 0; |
||
368 | } |
||
369 | whiteBB_ = blackBB_ = 0; |
||
370 | wMtrl_ = bMtrl_ = -::kV; |
||
371 | wMtrlPawns_ = bMtrlPawns_ = 0; |
||
372 | for (int i = 0; i < 4; i++) { |
||
373 | int sq0 = i * 16; |
||
374 | U64 v = data.v[i]; |
||
375 | for (int sq = 15; sq >= 0; sq--) { |
||
376 | int piece = v & 0xf; |
||
377 | v >>= 4; |
||
378 | int square = sq0 + sq; |
||
379 | squares[square] = piece; |
||
380 | |||
381 | const U64 sqMask = 1ULL << square; |
||
382 | pieceTypeBB_[piece] |= sqMask; |
||
383 | if (piece != Piece::EMPTY) { |
||
384 | int pVal = ::pieceValue[piece]; |
||
385 | if (Piece::isWhite(piece)) { |
||
386 | wMtrl_ += pVal; |
||
387 | whiteBB_ |= sqMask; |
||
388 | if (piece == Piece::WPAWN) |
||
389 | wMtrlPawns_ += pVal; |
||
390 | if (piece == Piece::WKING) |
||
391 | wKingSq_ = square; |
||
392 | } else { |
||
393 | bMtrl_ += pVal; |
||
394 | blackBB_ |= sqMask; |
||
395 | if (piece == Piece::BPAWN) |
||
396 | bMtrlPawns_ += pVal; |
||
397 | if (piece == Piece::BKING) |
||
398 | bKingSq_ = square; |
||
399 | } |
||
400 | } |
||
401 | psScore1_[piece] += Evaluate::psTab1[piece][square]; |
||
402 | psScore2_[piece] += Evaluate::psTab2[piece][square]; |
||
403 | } |
||
404 | } |
||
405 | |||
406 | U64 flags = data.v[4]; |
||
407 | fullMoveCounter = flags & 0xffff; |
||
408 | flags >>= 16; |
||
409 | halfMoveClock = flags & 0xff; |
||
410 | flags >>= 8; |
||
411 | int ep = flags & 0xff; if (ep == 0xff) ep = -1; |
||
412 | epSquare = ep; |
||
413 | flags >>= 8; |
||
414 | castleMask = flags & 0xf; |
||
415 | flags >>= 4; |
||
416 | whiteMove = (flags & 1) != 0; |
||
417 | |||
418 | computeZobristHash(); |
||
419 | } |
||
420 | |||
421 | // ---------------------------------------------------------------------------- |
||
422 | |||
423 | std::ostream& |
||
424 | operator<<(std::ostream& os, const Position& pos) { |
||
425 | std::stringstream ss; |
||
426 | ss << std::hex << pos.zobristHash(); |
||
427 | os << TextIO::asciiBoard(pos) << (pos.isWhiteMove() ? "white\n" : "black\n") << ss.str(); |
||
428 | return os; |
||
429 | } |
||
430 | |||
431 | U64 |
||
432 | Position::computeZobristHash() { |
||
433 | U64 hash = 0; |
||
434 | pHashKey = 0; |
||
435 | matId = {}; |
||
436 | for (int sq = 0; sq < 64; sq++) { |
||
437 | int p = squares[sq]; |
||
438 | matId.addPiece(p); |
||
439 | hash ^= psHashKeys[p][sq]; |
||
440 | if ((p == Piece::WPAWN) || (p == Piece::BPAWN)) |
||
441 | pHashKey ^= psHashKeys[p][sq]; |
||
442 | } |
||
443 | if (whiteMove) |
||
444 | hash ^= whiteHashKey; |
||
445 | hash ^= castleHashKeys[castleMask]; |
||
446 | hash ^= epHashKeys[(epSquare >= 0) ? getX(epSquare) + 1 : 0]; |
||
447 | hashKey = hash; |
||
448 | return hash; |
||
449 | } |
||
450 | |||
451 | const U64 |
||
452 | Position::zobristRndKeys[] = { |
||
453 | 0xd7f5bae778359690ULL, 0x597a80e80456583cULL, 0xf41fc6250b89af0aULL, 0x60bbccb1c393eb8eULL, |
||
454 | 0x609a7b63b265bad6ULL, 0x7c2203b2d50e50ddULL, 0x5cdb65b020e76780ULL, 0x3ada5f98c76f082fULL, |
||
455 | 0xb8664a3b4835aba4ULL, 0xfd52e04af3634f9dULL, 0x19845bb0dc72bfebULL, 0x323f11923ad0ce94ULL, |
||
456 | 0x840b643592625af3ULL, 0x08d0487ddf83e6b1ULL, 0xe102c4c56f3cbcf1ULL, 0x8796d332562f05aeULL, |
||
457 | 0x8da8c0e4914f9754ULL, 0x8d33ff34f6348b49ULL, 0x9d19aea59af28996ULL, 0x9eb6168a4359a5feULL, |
||
458 | 0x31663b93847b0fc7ULL, 0x90eba80ddb28d49aULL, 0xccee52c57542c041ULL, 0x0860882a3e8279cfULL, |
||
459 | 0xde316bf1225afa4aULL, 0xc7b1c13ea1ba90c6ULL, 0x86dee889c37e993aULL, 0x84a546382686f7f9ULL, |
||
460 | 0xf5279c7d250960a6ULL, 0x74c682f9a715318dULL, 0xe7df0efd43f4030aULL, 0xdc6746e82902823cULL, |
||
461 | 0x166d42c650423d16ULL, 0xf0ec64304812b32dULL, 0x1332e60d6eec5b48ULL, 0xa6edf8bd55663265ULL, |
||
462 | 0x9be3edd5fba6cfd3ULL, 0xea3c98aad8c558f1ULL, 0x577d05d0fcff765dULL, 0xf4dffef665484f9aULL, |
||
463 | 0x80522262e9120108ULL, 0x47e9fa92bc64f2eeULL, 0x689ed873d813ba14ULL, 0xdbe14e4bad57221aULL, |
||
464 | 0x27dde4dac822503bULL, 0xeb54f328a3ec06bbULL, 0x385875cea7e74a41ULL, 0x9939e2b74efb03ecULL, |
||
465 | 0xe9dab3b1f89ac50eULL, 0x542e57cd136b4844ULL, 0xfd0d99e83d6b34b8ULL, 0x2ab51be0b039bdd7ULL, |
||
466 | 0xa848485bf044dac6ULL, 0xfb8b9ccc055dda28ULL, 0x6bd5fcf11932c643ULL, 0x5562cc1783eafc90ULL, |
||
467 | 0x84c2258075a4fc77ULL, 0xa3e2654a1b9ac399ULL, 0xa0d0b4498debbc94ULL, 0x7b5a612c9e7f4013ULL, |
||
468 | 0x541ad1f5345860e9ULL, 0xe994fc3ad27d8421ULL, 0x7d004d11c8d81c45ULL, 0xdf060a0b1ba0a5d0ULL, |
||
469 | 0xd7554261378a32ebULL, 0x3833239c3fe92c7dULL, 0xdf6f7a5e977113d5ULL, 0xe04fc2e2017aa5cdULL, |
||
470 | 0x7670776c650e1507ULL, 0x2b7cbce40c6231ddULL, 0xda383fc3dd431843ULL, 0xe5b36397cf1ec05dULL, |
||
471 | 0xdc984f60c622c2a9ULL, 0x51ef8d0af8fe2607ULL, 0x1511f2e39e554dffULL, 0x5f2c921d80f3be07ULL, |
||
472 | 0x2015c1d1cc6b9e92ULL, 0x99f7e5a26196f13bULL, 0x7a93cc38310fb397ULL, 0xd11d2eba53c47047ULL, |
||
473 | 0x070f46cdfa04dd80ULL, 0x0ebb465f6fea9c74ULL, 0xfb61452fb27308d9ULL, 0xa952f5d52c3eb97dULL, |
||
474 | 0x95799379a4a515abULL, 0x06508b45a2745539ULL, 0xaf69d20bf29de152ULL, 0xb0ad19b1f4ee4eb8ULL, |
||
475 | 0x2bd91aa7c8200e4dULL, 0xcecee5089679a9c2ULL, 0xc189667953231141ULL, 0x24f90ceadfd2ece5ULL, |
||
476 | 0x3518487a931724d2ULL, 0x5244fe5f9e40057cULL, 0x366ce132f59078ffULL, 0xe63f79535cf61cdeULL, |
||
477 | 0xefdfab636b84b733ULL, 0xe38c18fdb5bf9f22ULL, 0xa4064c6acad42a58ULL, 0xcce22e73ebafa83aULL, |
||
478 | 0xa40b98bb7736c6e0ULL, 0xb75dd212bc092f4dULL, 0x41cb16cdede1750eULL, 0xc079f0fc98bb6a11ULL, |
||
479 | 0xb6aa18d94d9b37baULL, 0x1647aa4c407d1244ULL, 0x8c705a13349e10c3ULL, 0xce30a5c3e1dabee9ULL, |
||
480 | 0x2d6ca598c617b183ULL, 0xca21c9cddd1af110ULL, 0xb5e68f6381dacedaULL, 0xd9c61ec96684461fULL, |
||
481 | 0x0b1fa1bcae112ee1ULL, 0x154042c24e0404c6ULL, 0xb4efbfbf8ea0e4f8ULL, 0xfd436a8b275b1c15ULL, |
||
482 | 0x47dacd95f41bd571ULL, 0xf7714e0b7756278aULL, 0x559e24fc8d287691ULL, 0x91c041e4c56036f7ULL, |
||
483 | 0x1f6578f865919a79ULL, 0xc8cdcdd242fab4d9ULL, 0x28302a7558bebb6bULL, 0xa6fbdd97c0895919ULL, |
||
484 | 0xcbadb431be485173ULL, 0x703991cf429a8bbdULL, 0x9ec19ced4781bba6ULL, 0x94af792408408df7ULL, |
||
485 | 0xabed4ed1677c86e1ULL, 0x0f6e9cbb41089de3ULL, 0x3c88eacbb947dc3bULL, 0x99b3fbd4c65fe1cfULL, |
||
486 | 0x034cd4892067845cULL, 0xbcabc47135a8c209ULL, 0x8d553cd1b31bed9dULL, 0x0d8a566720267700ULL, |
||
487 | 0x3bed637a9a370afdULL, 0x41494335f1d0adfbULL, 0x9f12bfff16b28edeULL, 0xce6453efe358988dULL, |
||
488 | 0x2215954804510ab6ULL, 0x6b4394e84989f5f2ULL, 0xca8c91dd50847010ULL, 0xa947c7e59c35417aULL, |
||
489 | 0x8f95c01ab298ec1eULL, 0xe95721786359e315ULL, 0xb4a2d874cec85136ULL, 0x7f1f7f8bce470897ULL, |
||
490 | 0x7437e83c9fd5e424ULL, 0x6eeb30c64a162b8cULL, 0x23c1516503b4f507ULL, 0xcb321488c3757420ULL, |
||
491 | 0xcebed99b362fd959ULL, 0x6c127ce789a52e6dULL, 0x980b79769c8813e0ULL, 0x26c25f71471c7e54ULL, |
||
492 | 0x53934724e51cc126ULL, 0xd8680dabd6b9d852ULL, 0xd1bacb3c3b6f4daeULL, 0x2597310144a51aadULL, |
||
493 | 0xdb11576656984ffcULL, 0xab667b46feae063cULL, 0x503558ac4b13be6fULL, 0x3a3e7d2c081594d7ULL, |
||
494 | 0x4157037c0c54ea64ULL, 0xf6126e71ad203300ULL, 0xc3f04d0b97cad0fdULL, 0xbff96410f693d8b3ULL, |
||
495 | 0xac6ae032fbaab91eULL, 0xc00eeb6a400bb962ULL, 0x2477bdbbcf3a2976ULL, 0x094c7b15ce23247cULL, |
||
496 | 0x01e71a4167f69b90ULL, 0x6e29b4138facff1fULL, 0x565686f589cc4d65ULL, 0x73f81ca8ebee9fcbULL, |
||
497 | 0x05a346d75398ffb3ULL, 0x4a69fb255d62ed90ULL, 0xccced0c1106d1c93ULL, 0x625916cfa21515e0ULL, |
||
498 | 0x6f8ee1626c380dc1ULL, 0xf2e16898283cd0c3ULL, 0x727321be23832a2bULL, 0x43441f936eeb2d87ULL, |
||
499 | 0x14b45b1ecb3f7714ULL, 0x7ddfc1f328929f1aULL, 0x2d55a0468e13ec26ULL, 0x21dd2c1f3057970fULL, |
||
500 | 0xa6e1a5ce99fdd971ULL, 0x701c90f12059e247ULL, 0x1b7ae58e5c64ff4cULL, 0x05de117111a62053ULL, |
||
501 | 0x137b6510a83e5ca8ULL, 0x07fc44272c5becf7ULL, 0x0f16dafab947f490ULL, 0x0895b0033e5e8900ULL, |
||
502 | 0xeed683f7b95fd966ULL, 0x46506e5194dc9ccbULL, 0x408031d8bc251a31ULL, 0x26f999eeac14cfd6ULL, |
||
503 | 0xc720d88aaede1459ULL, 0x1339ca054c720e1dULL, 0x70111e113ba72600ULL, 0xdb22a28a6dc25133ULL, |
||
504 | 0x72e937c0bff13900ULL, 0x107808448080fbfaULL, 0x34f3338c200fdb4fULL, 0x4a0eadbe656dbc83ULL, |
||
505 | 0x84dd6549f109d3bfULL, 0x746c4aecbae19826ULL, 0x513838a22e0cfe1cULL, 0x11b8f4b8fa368a3fULL, |
||
506 | 0xdf6d5ae667795071ULL, 0xcf130962ae8c6607ULL, 0x82858c9a6b5d69e9ULL, 0x1da5a0a49b579480ULL, |
||
507 | 0xd84db8c20e132aa6ULL, 0x0c3b0392ff2e1e63ULL, 0x912d3070ad153aa2ULL, 0x6d8ff71426c0d062ULL, |
||
508 | 0xdbed3534b24e6bd3ULL, 0xa876821775929182ULL, 0xcdaa7d29acfa4a83ULL, 0x10333764a610f69fULL, |
||
509 | 0x63e24d99bc37a324ULL, 0x8c25823bad7029f5ULL, 0x2ef28a1deece6115ULL, 0x32b90c23208a0008ULL, |
||
510 | 0x723589f592ed6591ULL, 0x00c7516ed0d83959ULL, 0xe0fc684a298682e4ULL, 0x36fa668e47c35a84ULL, |
||
511 | 0xe9b3118ed5043e35ULL, 0x75d8783d5a29f16aULL, 0x7c3c86fa947f09aeULL, 0x56f2a5e6daf19aaeULL, |
||
512 | 0x00900521d0b38f6cULL, 0x26fa3cdcdd8cabc0ULL, 0x4a83b4473548d939ULL, 0x784f302daf6e022aULL, |
||
513 | 0xe46c4deeeb312976ULL, 0xa9b98bd7ba7011adULL, 0x64c14cfea7abc8f5ULL, 0xc1497eb0406690faULL, |
||
514 | 0x9511d4de569276efULL, 0xabf024a50a90b64aULL, 0x49b19b07c3e22da3ULL, 0x706bd69e20520907ULL, |
||
515 | 0x894b149339d83ad9ULL, 0xbcf1438efca42924ULL, 0xdb560b04bef14919ULL, 0x9b7482cbecc444d6ULL, |
||
516 | 0xed2bb01a83016742ULL, 0x71f684628505a4e1ULL, 0x670bcdc8f1042d61ULL, 0xa8f134df95b5d080ULL, |
||
517 | 0xffb794a24165093fULL, 0x50d032fa1d662fb4ULL, 0x2810a6f28ffbb86fULL, 0xe67681ca3f1c85c7ULL, |
||
518 | 0x03cb85ef8d956f64ULL, 0x1738ad2440ba2ca9ULL, 0xd0407f7f7463398fULL, 0x160b8d8af7dc2f9bULL, |
||
519 | 0x0405a3e372380b98ULL, 0x6c7e379ee9d8b82dULL, 0xdc4fe04fd1875ffeULL, 0x7d644123159cfb27ULL, |
||
520 | 0x49606435071bb986ULL, 0x90996d41b01eb18dULL, 0x5183897c42d1975eULL, 0xf56aeaa393372306ULL, |
||
521 | 0x3e61ec92c30aaacfULL, 0x325b84d16be4df60ULL, 0x1e5bca8358d2da94ULL, 0x6b927e82bfa69929ULL, |
||
522 | 0x085ad4d97f3dc0cfULL, 0x8cae40fec0c216aaULL, 0x764c17024ef6c979ULL, 0xc96b7917c5ab12b3ULL, |
||
523 | 0xb1f58a09d022290fULL, 0x4549907a6ebf95f1ULL, 0x1d00457d45793c60ULL, 0x0d4301ba9f5832cbULL, |
||
524 | 0xa2836b7853af8349ULL, 0xba9f1018ecdd2d0fULL, 0xf3f596aada6e690dULL, 0xc6649514b3e81409ULL, |
||
525 | 0xb6d8a6c7ebfe4afcULL, 0x115175cfa1169485ULL, 0xe4a59f8ae8f01b9bULL, 0x05415ed13bb46446ULL, |
||
526 | 0x8902f6711e2897a9ULL, 0x1ea71ce7028495e6ULL, 0x34fb7b46530d0bc3ULL, 0xb244f37d544d11b4ULL, |
||
527 | 0x4b7706d4e0d4a2c8ULL, 0x28e623ef474904f5ULL, 0x961ebd4357a2a031ULL, 0xca8ddd9ea423647fULL, |
||
528 | 0x3c3aea6f91215fbaULL, 0x2c89ecf10fe90db9ULL, 0x823e33b306ce8675ULL, 0x66dbe9c27aa0cbc8ULL, |
||
529 | 0xa5393f1e6a80d339ULL, 0x68b115fc5b13af32ULL, 0x4a5a983409430b7cULL, 0x30b18f3cfdd3c98eULL, |
||
530 | 0x929ddbbe3a82803eULL, 0x64ccccd7140f4a9bULL, 0xd7f803762450fec5ULL, 0x832e6ceca2780550ULL, |
||
531 | 0x7c6840451f7a0143ULL, 0x02655066b6f784e9ULL, 0xee1659bae59fb670ULL, 0x4542a44ed14050fdULL, |
||
532 | 0xe4f07584584e1e14ULL, 0x83dc19959c56dee9ULL, 0x8aeb3988a882c1c5ULL, 0xe19b46fed3c4f2bfULL, |
||
533 | 0xce1258daee0a0946ULL, 0x247c26799366976aULL, 0x10acf6eca81488a3ULL, 0xa7ad75899d582d56ULL, |
||
534 | 0xe315be1a51f538ffULL, 0xb5be8993675b7872ULL, 0x3db8d2d7608bbde8ULL, 0x9ff1c2c3ce3ceac1ULL, |
||
535 | 0xeeecc280de870e1bULL, 0x5d77564297d99e2aULL, 0x4c3f25277aa1a701ULL, 0xff06a70466279913ULL, |
||
536 | 0xc026377450f01f65ULL, 0x1b2494641bf91608ULL, 0x5f1b74fb08c332b9ULL, 0xea2c64e3db9f9057ULL, |
||
537 | 0x9d4f807cbff85025ULL, 0xcee8670f094702b7ULL, 0xf340eef21642e7c3ULL, 0x19606d55ebe426beULL, |
||
538 | 0xed97dc58e1711875ULL, 0xa417f28f24dea798ULL, 0x11cd6acb68c72546ULL, 0xf1921aac289d9dd6ULL, |
||
539 | 0x6bd0fcfc448bc595ULL, 0x3e1f240d8fdc4618ULL, 0xa3828d7a1ff27fc8ULL, 0x46a4b0335abbf426ULL, |
||
540 | 0xdf7115c761657e18ULL, 0x3d28f804775cffc4ULL, 0x30342adb438b9c69ULL, 0xb9937f6ce61ea1cdULL, |
||
541 | 0xd4b5567c46873e35ULL, 0x940200555367edb0ULL, 0xb9d944f5f979e14fULL, 0x3b8bd9a0316d97b1ULL, |
||
542 | 0x96798a6bc116783eULL, 0x39acfcb474f282e4ULL, 0xdb94a39f58a94510ULL, 0xaa7980b4175d122fULL, |
||
543 | 0xc9efca1c00e61953ULL, 0x33de221d4b8295e7ULL, 0xf2c235e73e3b2542ULL, 0x83215ca5453dcb65ULL, |
||
544 | 0xf58ff8a8df56fb2dULL, 0x09559195c7cb434eULL, 0x1161fe1c7f8f7187ULL, 0x148818fc6eaca639ULL, |
||
545 | 0xd5298696e9d8cc30ULL, 0xfa6b53e9a9d6a4c7ULL, 0xb7cfd2c1d2ed429eULL, 0x33df557fb7aa966fULL, |
||
546 | 0xe556777cddbba676ULL, 0x05c1c1887877a56eULL, 0x2e89de6e661bd34bULL, 0xa17a85d2b115f694ULL, |
||
547 | 0xa807afd9ce6c2628ULL, 0xa555ddd592ebdf55ULL, 0xf1b79535a4a444e6ULL, 0x6778915e7b1823c8ULL, |
||
548 | 0xd0bceed9f840f9c1ULL, 0x5760eb1fe0d2758bULL, 0x342d44714e3c65b9ULL, 0xed7a362bcbe6feb6ULL, |
||
549 | 0x1705103c42821aedULL, 0xc501924ccd211bf5ULL, 0xcfe2ea8d5d1b6856ULL, 0x24ae2eb2f6bfc818ULL, |
||
550 | 0x7fb97dbbee485d64ULL, 0xd64b84c4aeeb08d0ULL, 0xe2fd0cc4a47204a0ULL, 0xaf55b1facc3987a1ULL, |
||
551 | 0x1dfd4be371d6f91aULL, 0x20fda8869c9263eeULL, 0x999bd21d8576298aULL, 0x1eb57256cbe60d94ULL, |
||
552 | 0x4dceb0738230ace0ULL, 0x2dcc0846f5f39d84ULL, 0xbf22300cf9173002ULL, 0x5a1aa9b8743c632cULL, |
||
553 | 0x9070299e5bbf03ebULL, 0xbfeb907c9407f326ULL, 0x190423598b0cbaf6ULL, 0x309e4bf71e4c443bULL, |
||
554 | 0x79ec14272ad6eeccULL, 0xc80fc37f51135e15ULL, 0xe648d34336875121ULL, 0x773e4ab9e8b0acc0ULL, |
||
555 | 0xfb44a070ffd3a52aULL, 0x10696674757da91bULL, 0x41a63ec5b12cede6ULL, 0x4028279f3697edc4ULL, |
||
556 | 0xf968fbc2fabe7cc6ULL, 0x8d7f9f58b58c124cULL, 0xd8ea949dbab5a05dULL, 0x54bd7bbd38c9b3afULL, |
||
557 | 0x474005f184ab67ddULL, 0x3d5607cf170fb906ULL, 0x7d5c3e449ecf9a7bULL, 0x64252034d8f92f53ULL, |
||
558 | 0xbc687bb81f55f180ULL, 0x192de7c9da91f403ULL, 0xbeb7d9e0019a8b18ULL, 0x7db48efae4df737cULL, |
||
559 | 0x175ec9517c5c4c0eULL, 0x717a7d0ebda47f15ULL, 0xa587e3e6f2b8e954ULL, 0xab2cd98817f315e2ULL, |
||
560 | 0xcc0e745d179b1998ULL, 0x6649139d5d71f1d0ULL, 0xfcc5b6186974a8f5ULL, 0xa7059f06a374e713ULL, |
||
561 | 0x213cef524ef7b75fULL, 0x281fda3316b40c85ULL, 0xeebd55e267534c75ULL, 0xcab02b62892df3b9ULL, |
||
562 | 0x3b808869d5a722a5ULL, 0x4d97222b49abd9dfULL, 0x4ddc171d34629f30ULL, 0xd3752bcdc5ef181dULL, |
||
563 | 0xab4d39c6aa8a5ca7ULL, 0x6ba8bd4d5cb06082ULL, 0x583d4de08802857dULL, 0x026c5618433aa7edULL, |
||
564 | 0x1232c81cafbfd167ULL, 0x5a33e75840166131ULL, 0x3ea02e990724ef4dULL, 0x3951fad4b82928bcULL, |
||
565 | 0xf1e92e7fb0846900ULL, 0x15fed7db76b1e8feULL, 0x5052710ed579d80eULL, 0xd783125e16b47e73ULL, |
||
566 | 0x98d8b7da8bdc9c2bULL, 0x98ce50243f35581eULL, 0xb141d678f827a0d4ULL, 0xb0f8e3094f49fa61ULL, |
||
567 | 0xab19151f7a7cdb52ULL, 0x6ba2c537f521a4f1ULL, 0x1ade518a3d9c178dULL, 0x8500515c23f51115ULL, |
||
568 | 0xf3cc5c2fefd7a98dULL, 0xd8bbbb3e9ae20b79ULL, 0xf871825bb7ac5147ULL, 0xbb781a17cca93d0aULL, |
||
569 | 0xf3575106b160c93cULL, 0xf844c703f58f2e1fULL, 0x2a5c72d4367ca657ULL, 0x99d7c01cf853ec21ULL, |
||
570 | 0x1a6f335ad74dfff5ULL, 0x4fbdc8c120b994f2ULL, 0x408461eb155418cdULL, 0x157916359ffe2c1eULL, |
||
571 | 0x525f1a7db4223dbfULL, 0x25c3000b1e90fb19ULL, 0x57bdd0c1d663fa2dULL, 0xfb802e7119bfbe24ULL, |
||
572 | 0xaae1c35ec6eb14c4ULL, 0x652583024fcd306dULL, 0xe8be1108b58af685ULL, 0x77a89f20ae1f8a94ULL, |
||
573 | 0xbc22aa4ab340e4bfULL, 0x78bfc970c96c221cULL, 0x1d3f7809a295ee76ULL, 0xda430da50a13a883ULL, |
||
574 | 0xc1306bf82a441264ULL, 0xe31afb1e6fd6451cULL, 0x3a2d9759aa34eeb3ULL, 0xbf5ceaf7ab48104dULL, |
||
575 | 0x3400ed26b9495770ULL, 0x3b296387eb154befULL, 0x1c93c216ecba4af5ULL, 0x5a34070cf1e792aaULL, |
||
576 | 0x42c9d7c5a3609633ULL, 0x4379936a9a13d21fULL, 0x84e2a6c2f892c5d7ULL, 0xb23b8143286b71edULL, |
||
577 | 0x7d2a12b06074cab3ULL, 0x8540d38e599343fbULL, 0x3b3b8f9db8e41f17ULL, 0x161e4e09e20ab0c6ULL, |
||
578 | 0x162298b0f8723d99ULL, 0x9afbdb3f8b032893ULL, 0x5ec3f04936e0883aULL, 0xc50c2bce3a56ef64ULL, |
||
579 | 0x4460c752721c55d4ULL, 0xf015b1f777a6afdcULL, 0x06f1e56f14c48c36ULL, 0x33e7235f85296282ULL, |
||
580 | 0x06040eb1efdd11b9ULL, 0x346b7f7b751f66f3ULL, 0xbb4fa9a8e6d1d035ULL, 0xe1d3d700a82e48d5ULL, |
||
581 | 0x8135cfd26c74b440ULL, 0x65d5d35b5696f10cULL, 0xbf9838f966bb07e8ULL, 0xebd2eb4bbcb43720ULL, |
||
582 | 0xbbfeec86250e9350ULL, 0x66aba8170e00c52fULL, 0xabccc4a86f130675ULL, 0x2ca5716416ed7185ULL, |
||
583 | 0x010b20c0e57bc195ULL, 0x2fe60878da02ad71ULL, 0x1b0fef55ed00184eULL, 0x1261c170eeb052b6ULL, |
||
584 | 0x6a13113537136749ULL, 0x61c36852fc8ed2d0ULL, 0x3792d791924af876ULL, 0x5ec74fb3066e0ab6ULL, |
||
585 | 0x08e5788888816a21ULL, 0x238b94c0003b284dULL, 0x7d712871cee92534ULL, 0x4848d5aa004ba38aULL, |
||
586 | 0x1205c02c9b1ce8e5ULL, 0xba3aac58d085586eULL, 0xb0fa368bfeb857abULL, 0x29046208a0f9a5ecULL, |
||
587 | 0x7e9cd0525a6a8cefULL, 0x205f2c43beab7fc5ULL, 0xd6a2d6213b8fd0f3ULL, 0x0897451e05d3e003ULL, |
||
588 | 0x37df4af89203d875ULL, 0x103862149234cca6ULL, 0x19953ac4237d4439ULL, 0x4a089784e1bad7d8ULL, |
||
589 | 0xfefa933f9266f384ULL, 0xd7153f3f27c9855cULL, 0x82dfe8503c066585ULL, 0xd1b163cce1e1794cULL, |
||
590 | 0x50a0c5f3b4e0185aULL, 0xc1aa0810e07a4a11ULL, 0xf923c43f65456424ULL, 0x725076b178a0cec6ULL, |
||
591 | 0x6a8ffed38d48e8c1ULL, 0x98c7d98b58632ce9ULL, 0x10d9eaa19eb6646dULL, 0x09d53df4e86ed7c1ULL, |
||
592 | 0x351546a5962fd169ULL, 0x9a9e3300af4c96b3ULL, 0x2c0efad71fe68509ULL, 0x55465603290e4df8ULL, |
||
593 | 0x3c6a5b9948795195ULL, 0xdec4cbaf18698cb6ULL, 0x22a7fc751a85732fULL, 0x237aca9e62b6ee42ULL, |
||
594 | 0x3ec48c5a1a0eeadaULL, 0xdca8d6c1752a75b0ULL, 0x551d35ee59e8df71ULL, 0x6abcfa8e5bbce350ULL, |
||
595 | 0xe572c1e3e84c1878ULL, 0x735166f77889b868ULL, 0x4fa1a3b5f083865fULL, 0x8e681cc7db9e5cc1ULL, |
||
596 | 0xbdd3e56d0c286e7dULL, 0xb0a86df0d313440eULL, 0x1cf34137a8f0dd3dULL, 0x489c25283ca067b7ULL, |
||
597 | 0x0c1ca8135db56e13ULL, 0xff7e6858fcd20f2fULL, 0x2a920c1a2fb1c744ULL, 0x49ade1415c0f4579ULL, |
||
598 | 0xc87e5ccefb5965cfULL, 0x210c7df122a3a8d1ULL, 0x01ba3a70643d903fULL, 0xe07ccb713c01a278ULL, |
||
599 | 0x62c4a7883e9408b6ULL, 0x5ee17e7a19fe78dcULL, 0x0ae510b98403b793ULL, 0x21557b4ba5db3c1dULL, |
||
600 | 0xdb9583eb7765f872ULL, 0x1d81a84105cb6a78ULL, 0x8083f770c8a9ba2eULL, 0xc26d49a4d229f025ULL, |
||
601 | 0x71296a23163a7939ULL, 0x3c5c70a50a4f78afULL, 0x0764005abc6939e0ULL, 0x8789dc959a95e3a7ULL, |
||
602 | 0x3d33823ef2e4667dULL, 0xac0d4840351a939aULL, 0x3a1e288f96e7befcULL, 0x0b0acf1eeb03e0e6ULL, |
||
603 | 0x5af734f93a1f45abULL, 0x26a757c07ebb8db1ULL, 0x213234b390a5ea73ULL, 0xde773d9c51af6f74ULL, |
||
604 | 0xd49f3afe03115a77ULL, 0x5f633306505f406bULL, 0x02e449a05a0562c0ULL, 0x314666b3bc46b3dfULL, |
||
605 | 0xece9fb5e19a2aa37ULL, 0xe6c59b7170283f22ULL, 0xb46eefb8b8a61f82ULL, 0x096a87d165af2088ULL, |
||
606 | 0x39c222e996b6f76dULL, 0x6a36fa7cea8230f5ULL, 0xae8e037994cad44fULL, 0xbab83290685556c1ULL, |
||
607 | 0x4647f6a1aee27fedULL, 0xf7555e9a540b8d18ULL, 0x40b059b1ceb14081ULL, 0x079823a46fccb19bULL, |
||
608 | 0x52149b6c54c621a9ULL, 0x179d81ca92e38367ULL, 0xa4b7a879aeec1968ULL, 0x46bafea8e15407b4ULL, |
||
609 | 0x7b82184063a31cb8ULL, 0xc2a7d35965bb02d9ULL, 0x20a1b2b01c93ecc3ULL, 0x9f20f598305af5eaULL, |
||
610 | 0x0be76e68eabbfb22ULL, 0xe45c23075b6a5c1eULL, 0xa2804a249b3cf0c0ULL, 0x48afb9bef6c4e536ULL, |
||
611 | 0xce14af50e72e33d6ULL, 0xb3b78d21e4c01949ULL, 0xda9c1933e182091eULL, 0x848482ce26352dcbULL, |
||
612 | 0x800ff9ef2e1b00ddULL, 0x878c5d32481c244bULL, 0x1c6e9aa00137637cULL, 0xf872c37c83005a46ULL, |
||
613 | 0x7fa48f34e9f56c13ULL, 0x2ace3766cddcc711ULL, 0xc17b1e2d4baf85abULL, 0x76ceade0c91a543aULL, |
||
614 | 0x9056b0651be35aabULL, 0xd1782c9c5d85ef5eULL, 0x10200abecac6936dULL, 0xdc32c02478a5d493ULL, |
||
615 | 0x312a8b39d2e30863ULL, 0xe90c092fb5e7fedeULL, 0x05a0a4173c2a42faULL, 0xa306c98b558ec17fULL, |
||
616 | 0xa5c0b6af2641fe9dULL, 0xc0988090c5d6c130ULL, 0x83cf195ea8474febULL, 0x11d4ad1165868aa7ULL, |
||
617 | 0xb7a6fc6bfe40f3f9ULL, 0x344debcb5d483760ULL, 0xb01627e1b014c80cULL, 0xee324b6baa3b32eaULL, |
||
618 | 0xcdc83a3c452b5cb3ULL, 0xf491453b385a69abULL, 0x9c2c3555a589cd4cULL, 0x5aa3bc66d8cd5cf7ULL, |
||
619 | 0x9b1f928b19ba6b0bULL, 0x8c84e00fd7f06d9bULL, 0x3fad17cbd0278447ULL, 0xeb7a41f56e2c5f2eULL, |
||
620 | 0xfbc63c4d2c6c3965ULL, 0x9ab96ff21a641a28ULL, 0xa832bf87b363fdc4ULL, 0x2b812317410a4379ULL, |
||
621 | 0x2bd1c5e152843155ULL, 0xcc24d8b28bc935b7ULL, 0x3fca0d25fdff806bULL, 0xefd4afea47bf0930ULL, |
||
622 | 0xd16793374903e8c9ULL, 0x48af011da240633fULL, 0x9e3a22216c89b468ULL, 0x50689dc217481424ULL, |
||
623 | 0x4b43c0dc7b5fbce2ULL, 0x30be1725b1412644ULL, 0x8ad173e150b56693ULL, 0x23ec5789dac251eaULL, |
||
624 | 0x1ba4f07a78684deeULL, 0xe14d05d473a5f091ULL, 0x2e5646f0688fc5d4ULL, 0xcc6055f3bb092632ULL, |
||
625 | 0x84c0232dfe2fa15bULL, 0x3a948cc8bca8f4d4ULL, 0xebbab53f8b2cd488ULL, 0x8e355721af8e4399ULL, |
||
626 | 0x8bab9ede93d1efe6ULL, 0x6bd30d7339afa1faULL, 0x1dff66a347f8b750ULL, 0x820d0ac4c04a5431ULL, |
||
627 | 0x00945bfeaa4da653ULL, 0xf65203cde1c67a14ULL, 0x64017b1f6d7660e6ULL, 0x4c23fe7c46272a2eULL, |
||
628 | 0x610365dd8fa1e5b2ULL, 0x26e1842faf459b6aULL, 0x1f961aefb6770961ULL, 0x09c3397165c36f30ULL, |
||
629 | 0xf2136ef9fbc45fc2ULL, 0xe88d6dd9adcce726ULL, 0x8d003d5edc84418cULL, 0x7c4d6b6c3d7304e9ULL, |
||
630 | 0x88ae6ae8726245a6ULL, 0x3412f396edea2b07ULL, 0x2f65e37016e9a869ULL, 0x8df912cd07f489e3ULL, |
||
631 | 0xe6af3fc7b992ac5cULL, 0x198b75fd3330c88cULL, 0x920edd264d30bab5ULL, 0x7f1fa0d7af191e17ULL, |
||
632 | 0x395d8a980e403790ULL, 0x8a402b7b2acdca5eULL, 0xc030e6695e214c9cULL, 0x22e0dcf37ff4c145ULL, |
||
633 | 0x2111f336bab565bfULL, 0x61a2770d697989e9ULL, 0xcba8f5b67005f6ceULL, 0x1a0a499cd71b0ef4ULL, |
||
634 | 0xa9dcc2c35a4f3905ULL, 0xfca509f2c373804cULL, 0x82b2185d68a7d270ULL, 0xc90f71c6982e71dcULL, |
||
635 | 0xa0fbe5e49cc20e03ULL, 0x8cbb93a5ee1bf578ULL, 0xab98e26c684fafb9ULL, 0xbcfc7f32ed9e9d0eULL, |
||
636 | 0xd7c39e4893d23142ULL, 0x29367a1a9aaa1c65ULL, 0x5909c56f588f7685ULL, 0x65c3930d9faa698aULL, |
||
637 | 0x802d369653fd8b5cULL, 0x2f890d4546b8f490ULL, 0x1346134080dd7835ULL, 0xe3eb6fbab330b08eULL, |
||
638 | 0x77dbb5da01eb53f4ULL, 0x377171d4350c661eULL, 0xea1161836a59ae79ULL, 0xa6feebb40ae5f830ULL, |
||
639 | 0xe6cc130af9337850ULL, 0x9c1120b73bb280aaULL, 0x2fed2c970fa8f45aULL, 0x80300f25880b1c84ULL, |
||
640 | 0x9c2abb0207dce1afULL, 0x58569aac7cb10a43ULL, 0x0f7546be97cab5acULL, 0xf87857864a1061afULL, |
||
641 | 0x4996455690b6293eULL, 0x8f35d2d6a5c426bbULL, 0x076f2bab8ffd52c6ULL, 0xbe48212ad0b9c51aULL, |
||
642 | 0x80d0e7ba33bf2edfULL, 0xc30f0aa8957168f7ULL, 0x253729f26a5a53b1ULL, 0x503df089f39c8e42ULL, |
||
643 | 0x88f857d06544265fULL, 0x3c61e1a5d4aea8a0ULL, 0x4fa7d9282963c1beULL, 0x03678fa2487bb947ULL, |
||
644 | 0x5d2492f527aefb51ULL, 0xcf0a306c104d0364ULL, 0x5be920772cad0c02ULL, 0x37705f8902c5f913ULL, |
||
645 | 0x6d1624633bd07072ULL, 0x4b5017f055f75d27ULL, 0x619a4b5f06babf49ULL, 0x53a53263a185b4c2ULL, |
||
646 | 0xe808f04864e997ecULL, 0x3868f76efc5ee1e8ULL, 0xb6c4f39fe63c108bULL, 0x7910f9529f2a051eULL, |
||
647 | 0x3a1e8bf70918df16ULL, 0x60ce2ad57e56893fULL, 0x8ffebebb87334674ULL, 0xf2d1e502e685f6f0ULL, |
||
648 | 0x802c514db9b0ee0eULL, 0x266a15b5e189ac9aULL, 0x9654b4dd610a5ac7ULL, 0xa7e6a2acb6522521ULL, |
||
649 | 0xe1452641949e3aedULL, 0xf852eb37d8292272ULL, 0x23440b894539e2dcULL, 0x3de3135d2480e2eaULL, |
||
650 | 0xf35b2a0a2e456d6cULL, 0x457c0694aa06eab7ULL, 0x10f8f60e000d20c4ULL, 0x3ee2e03bfccde830ULL, |
||
651 | 0x4bd6b8c76b8c2078ULL, 0x14a004df9b5c767dULL, 0x6465d9f58082ef7bULL, 0xacfef0a936ff1047ULL, |
||
652 | 0xe5044ad195710642ULL, 0x773310d1465bdb40ULL, 0x98cd081351af90edULL, 0xbdd24a947f995f9eULL, |
||
653 | 0x0b783c8add1fdcbfULL, 0x4c07f0d821ffe777ULL, 0xf9649e68057f1071ULL, 0x92b9fee00900c1dbULL, |
||
654 | 0xc10cd24cf919e4fbULL, 0x430da99db7548368ULL, 0x9ffbc57261a9bf18ULL, 0x93fe31caceb19a49ULL, |
||
655 | 0x3ff9497f33400965ULL, 0x355923fa7f6dfaa8ULL, 0x82b2de4000477a0fULL, 0x9f36510c4db52a2fULL, |
||
656 | 0x35fe019be7ce0446ULL, 0x854b79c6cf45d796ULL, 0xc7a8669ed85eab29ULL, 0x0616cc03ef9f5883ULL, |
||
657 | 0x05f32f21e7e08c08ULL, 0x3d7b96cc202021bdULL, 0x294d253dd6250389ULL, 0x396b20c1c40fbcd5ULL, |
||
658 | 0x924d5b892e00f5aaULL, 0x46f663fd7afec7b9ULL, 0x2dcb4fed2f62cf54ULL, 0x867656fb399a763bULL, |
||
659 | 0x6e645b42b0ed3df0ULL, 0xefbda0a959a82efaULL, 0x1e57f0d772fc387dULL, 0x0674d8a0f91d418fULL, |
||
660 | 0x7d505da665fb9ed1ULL, 0xb92f926e73571550ULL, 0xca4afd00ae0f2651ULL, 0x4ebfad7e532820f1ULL, |
||
661 | 0xc98143a7869aa213ULL, 0x659e2fb4bcff90a7ULL, 0x11ae0639334eee27ULL, 0x83e7533307ff2e6fULL, |
||
662 | 0x60f5f716547d8cc3ULL, 0xc4bfead179135b68ULL, 0x08f766a9a3a8de62ULL, 0xb684258554ee0537ULL, |
||
663 | 0x4891d873f8e3e0feULL, 0xf54572e5ac0b3a3cULL, 0x977a735beb8878cfULL, 0x4be958fbc1d86455ULL, |
||
664 | 0x0d7de03cb6629efdULL, 0x7b2c68ae5c970120ULL, 0x5ed392cce09f00e4ULL, 0x7da97f4ab6824d5bULL, |
||
665 | 0xa23b535e2b4a30c3ULL, 0xcbe9d4ab2a70eeccULL, 0x158896735f4e2fccULL, 0x83df96151a52fc84ULL, |
||
666 | 0xa6a2844c5b1131c4ULL, 0xe4e63b91dbcf8115ULL, 0xc83c4b75bc1a5b80ULL, 0x09f3cd287f693d64ULL, |
||
667 | 0xa366a3a824cec2f0ULL, 0x7e17190295ea7e8bULL, 0x65d4cb9fc6225bc2ULL, 0x29c5a0905e3c2736ULL, |
||
668 | 0x68e90502619dbf85ULL, 0xc1c427d5896e405cULL, 0xfa4afc8f8de8ecefULL, 0x8e5301dd532114e7ULL, |
||
669 | 0x933156b65ee4a918ULL, 0x76fd40da0354fd37ULL, 0x295d788895520e8aULL, 0x82d8f759909f819eULL, |
||
670 | 0x6f8be0b29b366883ULL, 0x57192fcaf5eb578aULL, 0x86a3f9fa0fd932f0ULL, 0x3a9712777a36e539ULL, |
||
671 | 0x4e9a81b491b610d4ULL, 0x112ab256f111f7b3ULL, 0xeb18a646723db641ULL, 0xf5df4391e176cfdfULL, |
||
672 | 0x0988c3ae0a878c1eULL, 0x83eee968ca9994a3ULL, 0x2f87a0054d15a108ULL, 0x8e8f6ad28a52fb62ULL, |
||
673 | 0x4506387e508b536eULL, 0xf4be16fd24b9def7ULL, 0xccdee07b69cfc3dcULL, 0x1d61f742a60333e8ULL, |
||
674 | 0x2bf5dd9169aa7f01ULL, 0xc226cf16c071fa2eULL, 0x817f04841559b8a3ULL, 0xf6af48567c6e78c2ULL, |
||
675 | 0xcd804be16811e77bULL, 0x6b397f055a9882efULL, 0x088fda249f941a3fULL, 0x6dbf67f07092c293ULL, |
||
676 | 0x1645327035a2bd54ULL, 0xc39c205b04ec4e8dULL, 0xc01c17f1dbd0fc6aULL, 0xa28db4ab9710fa3aULL, |
||
677 | 0x7d90dcc1fdbb11c3ULL, 0x103546bdb065c73eULL, 0x8141482edf322617ULL, 0x4a346c9c5f8d353bULL, |
||
678 | 0xb383563ab40c28f6ULL, 0x02d49f9b654646e2ULL, 0x40cf6a1d632f905cULL, 0xc79b313acfb4b5f7ULL, |
||
679 | 0xef662c62dca07ef1ULL, 0xcef5d422f7659834ULL, 0x8c73e6fb1b697f4eULL, 0x7231cadcef269eadULL, |
||
680 | 0x9951b99f01fb70f1ULL, 0x536778b8e9f3b25bULL, 0xa75da0d5cb39c1beULL, 0xabcaba5e733f76a3ULL, |
||
681 | 0x5a3b1f3f07d061f6ULL, 0xb96c2bd8a2f04332ULL, 0xb9205d72024398b9ULL, 0x7b3dee2a6799b3bdULL, |
||
682 | 0xaa9c6adb7db1a38aULL, 0x08b635cdf28e5f5dULL, 0xc915c83f2ee319ebULL, 0xcd207081bbf6d18fULL, |
||
683 | 0xd4fef1db4cd1fb0dULL, 0x481eda802b30c94aULL, 0x7b404bcd3fb72ca8ULL, 0xbedcddb701683d01ULL, |
||
684 | 0x0d0e7d869fc2a5c9ULL, 0x9f32dc09ea332545ULL, 0x932528e46eff6c95ULL, 0x3e4c75e674bd93fbULL, |
||
685 | 0x8c8391e4a1861342ULL, 0xe7ae7559f3c3c3adULL, 0x62c883f00d9e4d9fULL, 0x0bc550d471eac53eULL, |
||
686 | 0xb6b944c871a8565dULL, 0x2a01cfb60b741f8eULL, 0x49db94bdff8b73b5ULL, 0x80b474d2d8fd36f6ULL, |
||
687 | 0xa6c75296fb9f028aULL, 0xfc0f8bbf3ad79375ULL, 0xeaeb54285d08c14fULL, 0x0eef9a5fb0c3e2edULL, |
||
688 | 0x54d588939fe544f6ULL, 0x17084509804201ffULL, 0x31b8372478d93e4dULL, 0x5885e4f1e37edfceULL, |
||
689 | 0x4e1bdff27c17069aULL, 0x08a253bd9b9cb273ULL, 0x5435a8db7d2a894eULL, 0x975dafbadbaa58a0ULL, |
||
690 | 0xfdc47ff3f5f9a594ULL, 0x4323e44de8a86bb3ULL, 0x2be02fa2a15f8860ULL, 0xa0f6d6b4378d111eULL, |
||
691 | 0x628b1647a8f34039ULL, 0xb1ae42641adc6944ULL, 0xce22f3b15bbca65dULL, 0xff839edc88ee6833ULL, |
||
692 | 0x9b944c8fbaffbe94ULL, 0x4dcf12e95dbf59d8ULL, 0xd4e8006c8265fa6dULL |
||
693 | }; |
||
694 | |||
695 | U64 |
||
696 | Position::getRandomHashVal(int rndNo) { |
||
697 | assert(rndNo >= 0); |
||
698 | assert(rndNo < (int)COUNT_OF(zobristRndKeys)); |
||
699 | return zobristRndKeys[rndNo]; |
||
700 | } |