{-# LANGUAGE PatternSynonyms #-}
module Game.Chess.Polyglot.Hash (hashPosition) where

import           Data.Bits                  (Bits (xor))
import           Data.Coerce                (coerce)
import           Data.Ix                    (Ix (index))
import           Data.Maybe                 (mapMaybe)
import           Data.Vector.Unboxed        (Vector, fromList, unsafeIndex)
import           Data.Word                  (Word64)
import           Game.Chess.Internal        (Castle (..), Color (..), PieceType,
                                             Position (color), attackedByPawn,
                                             castlingRights, enPassantSquare,
                                             opponent, pattern King,
                                             pattern Pawn, pieceAt)
import           Game.Chess.Internal.Square (File (..), Square, file,
                                             pattern A1, pattern H8)


hashPosition :: Position -> Word64
hashPosition :: Position -> Word64
hashPosition Position
pos = Word64
piece forall a. Bits a => a -> a -> a
`xor` Word64
castling forall a. Bits a => a -> a -> a
`xor` Word64
ep forall a. Bits a => a -> a -> a
`xor` Word64
turn where
  piece :: Word64
piece = forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr forall a. Bits a => a -> a -> a
xor Word64
0 forall a b. (a -> b) -> a -> b
$ forall a b. (a -> Maybe b) -> [a] -> [b]
mapMaybe Square -> Maybe Word64
f [Square
A1 .. Square
H8] where
    f :: Square -> Maybe Word64
f Square
sq = (\(Color
c, PieceType
p) -> (PieceType, Color, Square) -> Word64
pieceKey (PieceType
p, Color
c, Square
sq)) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Position -> Square -> Maybe (Color, PieceType)
pieceAt Position
pos Square
sq
  castling :: Word64
castling = forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr (forall a. Bits a => a -> a -> a
xor forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Color, Castle) -> Word64
castleKey) Word64
0 forall a b. (a -> b) -> a -> b
$ Position -> [(Color, Castle)]
castlingRights Position
pos
  ep :: Word64
ep = case Position -> Maybe Square
enPassantSquare Position
pos of
    Just Square
sq | Square -> Position -> Bool
attackedByPawn Square
sq Position
pos -> File -> Word64
epKey (Square -> File
file Square
sq)
    Maybe Square
_                               -> Word64
0
  turn :: Word64
turn = case Position -> Color
color Position
pos of
    Color
White -> Word64
turnKey
    Color
Black -> Word64
0

pieceKey :: (PieceType, Color, Square) -> Word64
pieceKey :: (PieceType, Color, Square) -> Word64
pieceKey = forall a. Unbox a => Vector a -> Int -> a
unsafeIndex Vector Word64
pieceKeys forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Ix a => (a, a) -> a -> Int
index ((PieceType
Pawn,Color
Black,Square
A1),(PieceType
King,Color
White,Square
H8))

castleKey :: (Color, Castle) -> Word64
castleKey :: (Color, Castle) -> Word64
castleKey (Color
c, Castle
s) = forall a. Unbox a => Vector a -> Int -> a
unsafeIndex Vector Word64
castleKeys forall a b. (a -> b) -> a -> b
$
  forall a. Ix a => (a, a) -> a -> Int
index ((Color
Black, Castle
Kingside), (Color
White, Castle
Queenside)) (Color -> Color
opponent Color
c, Castle
s)

epKey :: File -> Word64
epKey :: File -> Word64
epKey = forall a. Unbox a => Vector a -> Int -> a
unsafeIndex Vector Word64
epKeys forall b c a. (b -> c) -> (a -> b) -> a -> c
. coerce :: forall a b. Coercible a b => a -> b
coerce

pieceKeys, castleKeys, epKeys :: Vector Word64
pieceKeys :: Vector Word64
pieceKeys = forall a. Unbox a => [a] -> Vector a
fromList
  [Word64
0x9D39247E33776D41,Word64
0x2AF7398005AAA5C7,Word64
0x44DB015024623547,Word64
0x9C15F73E62A76AE2
  ,Word64
0x75834465489C0C89,Word64
0x3290AC3A203001BF,Word64
0x0FBBAD1F61042279,Word64
0xE83A908FF2FB60CA
  ,Word64
0x0D7E765D58755C10,Word64
0x1A083822CEAFE02D,Word64
0x9605D5F0E25EC3B0,Word64
0xD021FF5CD13A2ED5
  ,Word64
0x40BDF15D4A672E32,Word64
0x011355146FD56395,Word64
0x5DB4832046F3D9E5,Word64
0x239F8B2D7FF719CC
  ,Word64
0x05D1A1AE85B49AA1,Word64
0x679F848F6E8FC971,Word64
0x7449BBFF801FED0B,Word64
0x7D11CDB1C3B7ADF0
  ,Word64
0x82C7709E781EB7CC,Word64
0xF3218F1C9510786C,Word64
0x331478F3AF51BBE6,Word64
0x4BB38DE5E7219443
  ,Word64
0xAA649C6EBCFD50FC,Word64
0x8DBD98A352AFD40B,Word64
0x87D2074B81D79217,Word64
0x19F3C751D3E92AE1
  ,Word64
0xB4AB30F062B19ABF,Word64
0x7B0500AC42047AC4,Word64
0xC9452CA81A09D85D,Word64
0x24AA6C514DA27500
  ,Word64
0x4C9F34427501B447,Word64
0x14A68FD73C910841,Word64
0xA71B9B83461CBD93,Word64
0x03488B95B0F1850F
  ,Word64
0x637B2B34FF93C040,Word64
0x09D1BC9A3DD90A94,Word64
0x3575668334A1DD3B,Word64
0x735E2B97A4C45A23
  ,Word64
0x18727070F1BD400B,Word64
0x1FCBACD259BF02E7,Word64
0xD310A7C2CE9B6555,Word64
0xBF983FE0FE5D8244
  ,Word64
0x9F74D14F7454A824,Word64
0x51EBDC4AB9BA3035,Word64
0x5C82C505DB9AB0FA,Word64
0xFCF7FE8A3430B241
  ,Word64
0x3253A729B9BA3DDE,Word64
0x8C74C368081B3075,Word64
0xB9BC6C87167C33E7,Word64
0x7EF48F2B83024E20
  ,Word64
0x11D505D4C351BD7F,Word64
0x6568FCA92C76A243,Word64
0x4DE0B0F40F32A7B8,Word64
0x96D693460CC37E5D
  ,Word64
0x42E240CB63689F2F,Word64
0x6D2BDCDAE2919661,Word64
0x42880B0236E4D951,Word64
0x5F0F4A5898171BB6
  ,Word64
0x39F890F579F92F88,Word64
0x93C5B5F47356388B,Word64
0x63DC359D8D231B78,Word64
0xEC16CA8AEA98AD76
  ,Word64
0x5355F900C2A82DC7,Word64
0x07FB9F855A997142,Word64
0x5093417AA8A7ED5E,Word64
0x7BCBC38DA25A7F3C
  ,Word64
0x19FC8A768CF4B6D4,Word64
0x637A7780DECFC0D9,Word64
0x8249A47AEE0E41F7,Word64
0x79AD695501E7D1E8
  ,Word64
0x14ACBAF4777D5776,Word64
0xF145B6BECCDEA195,Word64
0xDABF2AC8201752FC,Word64
0x24C3C94DF9C8D3F6
  ,Word64
0xBB6E2924F03912EA,Word64
0x0CE26C0B95C980D9,Word64
0xA49CD132BFBF7CC4,Word64
0xE99D662AF4243939
  ,Word64
0x27E6AD7891165C3F,Word64
0x8535F040B9744FF1,Word64
0x54B3F4FA5F40D873,Word64
0x72B12C32127FED2B
  ,Word64
0xEE954D3C7B411F47,Word64
0x9A85AC909A24EAA1,Word64
0x70AC4CD9F04F21F5,Word64
0xF9B89D3E99A075C2
  ,Word64
0x87B3E2B2B5C907B1,Word64
0xA366E5B8C54F48B8,Word64
0xAE4A9346CC3F7CF2,Word64
0x1920C04D47267BBD
  ,Word64
0x87BF02C6B49E2AE9,Word64
0x092237AC237F3859,Word64
0xFF07F64EF8ED14D0,Word64
0x8DE8DCA9F03CC54E
  ,Word64
0x9C1633264DB49C89,Word64
0xB3F22C3D0B0B38ED,Word64
0x390E5FB44D01144B,Word64
0x5BFEA5B4712768E9
  ,Word64
0x1E1032911FA78984,Word64
0x9A74ACB964E78CB3,Word64
0x4F80F7A035DAFB04,Word64
0x6304D09A0B3738C4
  ,Word64
0x2171E64683023A08,Word64
0x5B9B63EB9CEFF80C,Word64
0x506AACF489889342,Word64
0x1881AFC9A3A701D6
  ,Word64
0x6503080440750644,Word64
0xDFD395339CDBF4A7,Word64
0xEF927DBCF00C20F2,Word64
0x7B32F7D1E03680EC
  ,Word64
0xB9FD7620E7316243,Word64
0x05A7E8A57DB91B77,Word64
0xB5889C6E15630A75,Word64
0x4A750A09CE9573F7
  ,Word64
0xCF464CEC899A2F8A,Word64
0xF538639CE705B824,Word64
0x3C79A0FF5580EF7F,Word64
0xEDE6C87F8477609D
  ,Word64
0x799E81F05BC93F31,Word64
0x86536B8CF3428A8C,Word64
0x97D7374C60087B73,Word64
0xA246637CFF328532
  ,Word64
0x043FCAE60CC0EBA0,Word64
0x920E449535DD359E,Word64
0x70EB093B15B290CC,Word64
0x73A1921916591CBD
  ,Word64
0x56436C9FE1A1AA8D,Word64
0xEFAC4B70633B8F81,Word64
0xBB215798D45DF7AF,Word64
0x45F20042F24F1768
  ,Word64
0x930F80F4E8EB7462,Word64
0xFF6712FFCFD75EA1,Word64
0xAE623FD67468AA70,Word64
0xDD2C5BC84BC8D8FC
  ,Word64
0x7EED120D54CF2DD9,Word64
0x22FE545401165F1C,Word64
0xC91800E98FB99929,Word64
0x808BD68E6AC10365
  ,Word64
0xDEC468145B7605F6,Word64
0x1BEDE3A3AEF53302,Word64
0x43539603D6C55602,Word64
0xAA969B5C691CCB7A
  ,Word64
0xA87832D392EFEE56,Word64
0x65942C7B3C7E11AE,Word64
0xDED2D633CAD004F6,Word64
0x21F08570F420E565
  ,Word64
0xB415938D7DA94E3C,Word64
0x91B859E59ECB6350,Word64
0x10CFF333E0ED804A,Word64
0x28AED140BE0BB7DD
  ,Word64
0xC5CC1D89724FA456,Word64
0x5648F680F11A2741,Word64
0x2D255069F0B7DAB3,Word64
0x9BC5A38EF729ABD4
  ,Word64
0xEF2F054308F6A2BC,Word64
0xAF2042F5CC5C2858,Word64
0x480412BAB7F5BE2A,Word64
0xAEF3AF4A563DFE43
  ,Word64
0x19AFE59AE451497F,Word64
0x52593803DFF1E840,Word64
0xF4F076E65F2CE6F0,Word64
0x11379625747D5AF3
  ,Word64
0xBCE5D2248682C115,Word64
0x9DA4243DE836994F,Word64
0x066F70B33FE09017,Word64
0x4DC4DE189B671A1C
  ,Word64
0x51039AB7712457C3,Word64
0xC07A3F80C31FB4B4,Word64
0xB46EE9C5E64A6E7C,Word64
0xB3819A42ABE61C87
  ,Word64
0x21A007933A522A20,Word64
0x2DF16F761598AA4F,Word64
0x763C4A1371B368FD,Word64
0xF793C46702E086A0
  ,Word64
0xD7288E012AEB8D31,Word64
0xDE336A2A4BC1C44B,Word64
0x0BF692B38D079F23,Word64
0x2C604A7A177326B3
  ,Word64
0x4850E73E03EB6064,Word64
0xCFC447F1E53C8E1B,Word64
0xB05CA3F564268D99,Word64
0x9AE182C8BC9474E8
  ,Word64
0xA4FC4BD4FC5558CA,Word64
0xE755178D58FC4E76,Word64
0x69B97DB1A4C03DFE,Word64
0xF9B5B7C4ACC67C96
  ,Word64
0xFC6A82D64B8655FB,Word64
0x9C684CB6C4D24417,Word64
0x8EC97D2917456ED0,Word64
0x6703DF9D2924E97E
  ,Word64
0xC547F57E42A7444E,Word64
0x78E37644E7CAD29E,Word64
0xFE9A44E9362F05FA,Word64
0x08BD35CC38336615
  ,Word64
0x9315E5EB3A129ACE,Word64
0x94061B871E04DF75,Word64
0xDF1D9F9D784BA010,Word64
0x3BBA57B68871B59D
  ,Word64
0xD2B7ADEEDED1F73F,Word64
0xF7A255D83BC373F8,Word64
0xD7F4F2448C0CEB81,Word64
0xD95BE88CD210FFA7
  ,Word64
0x336F52F8FF4728E7,Word64
0xA74049DAC312AC71,Word64
0xA2F61BB6E437FDB5,Word64
0x4F2A5CB07F6A35B3
  ,Word64
0x87D380BDA5BF7859,Word64
0x16B9F7E06C453A21,Word64
0x7BA2484C8A0FD54E,Word64
0xF3A678CAD9A2E38C
  ,Word64
0x39B0BF7DDE437BA2,Word64
0xFCAF55C1BF8A4424,Word64
0x18FCF680573FA594,Word64
0x4C0563B89F495AC3
  ,Word64
0x40E087931A00930D,Word64
0x8CFFA9412EB642C1,Word64
0x68CA39053261169F,Word64
0x7A1EE967D27579E2
  ,Word64
0x9D1D60E5076F5B6F,Word64
0x3810E399B6F65BA2,Word64
0x32095B6D4AB5F9B1,Word64
0x35CAB62109DD038A
  ,Word64
0xA90B24499FCFAFB1,Word64
0x77A225A07CC2C6BD,Word64
0x513E5E634C70E331,Word64
0x4361C0CA3F692F12
  ,Word64
0xD941ACA44B20A45B,Word64
0x528F7C8602C5807B,Word64
0x52AB92BEB9613989,Word64
0x9D1DFA2EFC557F73
  ,Word64
0x722FF175F572C348,Word64
0x1D1260A51107FE97,Word64
0x7A249A57EC0C9BA2,Word64
0x04208FE9E8F7F2D6
  ,Word64
0x5A110C6058B920A0,Word64
0x0CD9A497658A5698,Word64
0x56FD23C8F9715A4C,Word64
0x284C847B9D887AAE
  ,Word64
0x04FEABFBBDB619CB,Word64
0x742E1E651C60BA83,Word64
0x9A9632E65904AD3C,Word64
0x881B82A13B51B9E2
  ,Word64
0x506E6744CD974924,Word64
0xB0183DB56FFC6A79,Word64
0x0ED9B915C66ED37E,Word64
0x5E11E86D5873D484
  ,Word64
0xF678647E3519AC6E,Word64
0x1B85D488D0F20CC5,Word64
0xDAB9FE6525D89021,Word64
0x0D151D86ADB73615
  ,Word64
0xA865A54EDCC0F019,Word64
0x93C42566AEF98FFB,Word64
0x99E7AFEABE000731,Word64
0x48CBFF086DDF285A
  ,Word64
0x7F9B6AF1EBF78BAF,Word64
0x58627E1A149BBA21,Word64
0x2CD16E2ABD791E33,Word64
0xD363EFF5F0977996
  ,Word64
0x0CE2A38C344A6EED,Word64
0x1A804AADB9CFA741,Word64
0x907F30421D78C5DE,Word64
0x501F65EDB3034D07
  ,Word64
0x37624AE5A48FA6E9,Word64
0x957BAF61700CFF4E,Word64
0x3A6C27934E31188A,Word64
0xD49503536ABCA345
  ,Word64
0x088E049589C432E0,Word64
0xF943AEE7FEBF21B8,Word64
0x6C3B8E3E336139D3,Word64
0x364F6FFA464EE52E
  ,Word64
0xD60F6DCEDC314222,Word64
0x56963B0DCA418FC0,Word64
0x16F50EDF91E513AF,Word64
0xEF1955914B609F93
  ,Word64
0x565601C0364E3228,Word64
0xECB53939887E8175,Word64
0xBAC7A9A18531294B,Word64
0xB344C470397BBA52
  ,Word64
0x65D34954DAF3CEBD,Word64
0xB4B81B3FA97511E2,Word64
0xB422061193D6F6A7,Word64
0x071582401C38434D
  ,Word64
0x7A13F18BBEDC4FF5,Word64
0xBC4097B116C524D2,Word64
0x59B97885E2F2EA28,Word64
0x99170A5DC3115544
  ,Word64
0x6F423357E7C6A9F9,Word64
0x325928EE6E6F8794,Word64
0xD0E4366228B03343,Word64
0x565C31F7DE89EA27
  ,Word64
0x30F5611484119414,Word64
0xD873DB391292ED4F,Word64
0x7BD94E1D8E17DEBC,Word64
0xC7D9F16864A76E94
  ,Word64
0x947AE053EE56E63C,Word64
0xC8C93882F9475F5F,Word64
0x3A9BF55BA91F81CA,Word64
0xD9A11FBB3D9808E4
  ,Word64
0x0FD22063EDC29FCA,Word64
0xB3F256D8ACA0B0B9,Word64
0xB03031A8B4516E84,Word64
0x35DD37D5871448AF
  ,Word64
0xE9F6082B05542E4E,Word64
0xEBFAFA33D7254B59,Word64
0x9255ABB50D532280,Word64
0xB9AB4CE57F2D34F3
  ,Word64
0x693501D628297551,Word64
0xC62C58F97DD949BF,Word64
0xCD454F8F19C5126A,Word64
0xBBE83F4ECC2BDECB
  ,Word64
0xDC842B7E2819E230,Word64
0xBA89142E007503B8,Word64
0xA3BC941D0A5061CB,Word64
0xE9F6760E32CD8021
  ,Word64
0x09C7E552BC76492F,Word64
0x852F54934DA55CC9,Word64
0x8107FCCF064FCF56,Word64
0x098954D51FFF6580
  ,Word64
0x23B70EDB1955C4BF,Word64
0xC330DE426430F69D,Word64
0x4715ED43E8A45C0A,Word64
0xA8D7E4DAB780A08D
  ,Word64
0x0572B974F03CE0BB,Word64
0xB57D2E985E1419C7,Word64
0xE8D9ECBE2CF3D73F,Word64
0x2FE4B17170E59750
  ,Word64
0x11317BA87905E790,Word64
0x7FBF21EC8A1F45EC,Word64
0x1725CABFCB045B00,Word64
0x964E915CD5E2B207
  ,Word64
0x3E2B8BCBF016D66D,Word64
0xBE7444E39328A0AC,Word64
0xF85B2B4FBCDE44B7,Word64
0x49353FEA39BA63B1
  ,Word64
0x1DD01AAFCD53486A,Word64
0x1FCA8A92FD719F85,Word64
0xFC7C95D827357AFA,Word64
0x18A6A990C8B35EBD
  ,Word64
0xCCCB7005C6B9C28D,Word64
0x3BDBB92C43B17F26,Word64
0xAA70B5B4F89695A2,Word64
0xE94C39A54A98307F
  ,Word64
0xB7A0B174CFF6F36E,Word64
0xD4DBA84729AF48AD,Word64
0x2E18BC1AD9704A68,Word64
0x2DE0966DAF2F8B1C
  ,Word64
0xB9C11D5B1E43A07E,Word64
0x64972D68DEE33360,Word64
0x94628D38D0C20584,Word64
0xDBC0D2B6AB90A559
  ,Word64
0xD2733C4335C6A72F,Word64
0x7E75D99D94A70F4D,Word64
0x6CED1983376FA72B,Word64
0x97FCAACBF030BC24
  ,Word64
0x7B77497B32503B12,Word64
0x8547EDDFB81CCB94,Word64
0x79999CDFF70902CB,Word64
0xCFFE1939438E9B24
  ,Word64
0x829626E3892D95D7,Word64
0x92FAE24291F2B3F1,Word64
0x63E22C147B9C3403,Word64
0xC678B6D860284A1C
  ,Word64
0x5873888850659AE7,Word64
0x0981DCD296A8736D,Word64
0x9F65789A6509A440,Word64
0x9FF38FED72E9052F
  ,Word64
0xE479EE5B9930578C,Word64
0xE7F28ECD2D49EECD,Word64
0x56C074A581EA17FE,Word64
0x5544F7D774B14AEF
  ,Word64
0x7B3F0195FC6F290F,Word64
0x12153635B2C0CF57,Word64
0x7F5126DBBA5E0CA7,Word64
0x7A76956C3EAFB413
  ,Word64
0x3D5774A11D31AB39,Word64
0x8A1B083821F40CB4,Word64
0x7B4A38E32537DF62,Word64
0x950113646D1D6E03
  ,Word64
0x4DA8979A0041E8A9,Word64
0x3BC36E078F7515D7,Word64
0x5D0A12F27AD310D1,Word64
0x7F9D1A2E1EBE1327
  ,Word64
0xDA3A361B1C5157B1,Word64
0xDCDD7D20903D0C25,Word64
0x36833336D068F707,Word64
0xCE68341F79893389
  ,Word64
0xAB9090168DD05F34,Word64
0x43954B3252DC25E5,Word64
0xB438C2B67F98E5E9,Word64
0x10DCD78E3851A492
  ,Word64
0xDBC27AB5447822BF,Word64
0x9B3CDB65F82CA382,Word64
0xB67B7896167B4C84,Word64
0xBFCED1B0048EAC50
  ,Word64
0xA9119B60369FFEBD,Word64
0x1FFF7AC80904BF45,Word64
0xAC12FB171817EEE7,Word64
0xAF08DA9177DDA93D
  ,Word64
0x1B0CAB936E65C744,Word64
0xB559EB1D04E5E932,Word64
0xC37B45B3F8D6F2BA,Word64
0xC3A9DC228CAAC9E9
  ,Word64
0xF3B8B6675A6507FF,Word64
0x9FC477DE4ED681DA,Word64
0x67378D8ECCEF96CB,Word64
0x6DD856D94D259236
  ,Word64
0xA319CE15B0B4DB31,Word64
0x073973751F12DD5E,Word64
0x8A8E849EB32781A5,Word64
0xE1925C71285279F5
  ,Word64
0x74C04BF1790C0EFE,Word64
0x4DDA48153C94938A,Word64
0x9D266D6A1CC0542C,Word64
0x7440FB816508C4FE
  ,Word64
0x13328503DF48229F,Word64
0xD6BF7BAEE43CAC40,Word64
0x4838D65F6EF6748F,Word64
0x1E152328F3318DEA
  ,Word64
0x8F8419A348F296BF,Word64
0x72C8834A5957B511,Word64
0xD7A023A73260B45C,Word64
0x94EBC8ABCFB56DAE
  ,Word64
0x9FC10D0F989993E0,Word64
0xDE68A2355B93CAE6,Word64
0xA44CFE79AE538BBE,Word64
0x9D1D84FCCE371425
  ,Word64
0x51D2B1AB2DDFB636,Word64
0x2FD7E4B9E72CD38C,Word64
0x65CA5B96B7552210,Word64
0xDD69A0D8AB3B546D
  ,Word64
0x604D51B25FBF70E2,Word64
0x73AA8A564FB7AC9E,Word64
0x1A8C1E992B941148,Word64
0xAAC40A2703D9BEA0
  ,Word64
0x764DBEAE7FA4F3A6,Word64
0x1E99B96E70A9BE8B,Word64
0x2C5E9DEB57EF4743,Word64
0x3A938FEE32D29981
  ,Word64
0x26E6DB8FFDF5ADFE,Word64
0x469356C504EC9F9D,Word64
0xC8763C5B08D1908C,Word64
0x3F6C6AF859D80055
  ,Word64
0x7F7CC39420A3A545,Word64
0x9BFB227EBDF4C5CE,Word64
0x89039D79D6FC5C5C,Word64
0x8FE88B57305E2AB6
  ,Word64
0xA09E8C8C35AB96DE,Word64
0xFA7E393983325753,Word64
0xD6B6D0ECC617C699,Word64
0xDFEA21EA9E7557E3
  ,Word64
0xB67C1FA481680AF8,Word64
0xCA1E3785A9E724E5,Word64
0x1CFC8BED0D681639,Word64
0xD18D8549D140CAEA
  ,Word64
0x4ED0FE7E9DC91335,Word64
0xE4DBF0634473F5D2,Word64
0x1761F93A44D5AEFE,Word64
0x53898E4C3910DA55
  ,Word64
0x734DE8181F6EC39A,Word64
0x2680B122BAA28D97,Word64
0x298AF231C85BAFAB,Word64
0x7983EED3740847D5
  ,Word64
0x66C1A2A1A60CD889,Word64
0x9E17E49642A3E4C1,Word64
0xEDB454E7BADC0805,Word64
0x50B704CAB602C329
  ,Word64
0x4CC317FB9CDDD023,Word64
0x66B4835D9EAFEA22,Word64
0x219B97E26FFC81BD,Word64
0x261E4E4C0A333A9D
  ,Word64
0x1FE2CCA76517DB90,Word64
0xD7504DFA8816EDBB,Word64
0xB9571FA04DC089C8,Word64
0x1DDC0325259B27DE
  ,Word64
0xCF3F4688801EB9AA,Word64
0xF4F5D05C10CAB243,Word64
0x38B6525C21A42B0E,Word64
0x36F60E2BA4FA6800
  ,Word64
0xEB3593803173E0CE,Word64
0x9C4CD6257C5A3603,Word64
0xAF0C317D32ADAA8A,Word64
0x258E5A80C7204C4B
  ,Word64
0x8B889D624D44885D,Word64
0xF4D14597E660F855,Word64
0xD4347F66EC8941C3,Word64
0xE699ED85B0DFB40D
  ,Word64
0x2472F6207C2D0484,Word64
0xC2A1E7B5B459AEB5,Word64
0xAB4F6451CC1D45EC,Word64
0x63767572AE3D6174
  ,Word64
0xA59E0BD101731A28,Word64
0x116D0016CB948F09,Word64
0x2CF9C8CA052F6E9F,Word64
0x0B090A7560A968E3
  ,Word64
0xABEEDDB2DDE06FF1,Word64
0x58EFC10B06A2068D,Word64
0xC6E57A78FBD986E0,Word64
0x2EAB8CA63CE802D7
  ,Word64
0x14A195640116F336,Word64
0x7C0828DD624EC390,Word64
0xD74BBE77E6116AC7,Word64
0x804456AF10F5FB53
  ,Word64
0xEBE9EA2ADF4321C7,Word64
0x03219A39EE587A30,Word64
0x49787FEF17AF9924,Word64
0xA1E9300CD8520548
  ,Word64
0x5B45E522E4B1B4EF,Word64
0xB49C3B3995091A36,Word64
0xD4490AD526F14431,Word64
0x12A8F216AF9418C2
  ,Word64
0x001F837CC7350524,Word64
0x1877B51E57A764D5,Word64
0xA2853B80F17F58EE,Word64
0x993E1DE72D36D310
  ,Word64
0xB3598080CE64A656,Word64
0x252F59CF0D9F04BB,Word64
0xD23C8E176D113600,Word64
0x1BDA0492E7E4586E
  ,Word64
0x21E0BD5026C619BF,Word64
0x3B097ADAF088F94E,Word64
0x8D14DEDB30BE846E,Word64
0xF95CFFA23AF5F6F4
  ,Word64
0x3871700761B3F743,Word64
0xCA672B91E9E4FA16,Word64
0x64C8E531BFF53B55,Word64
0x241260ED4AD1E87D
  ,Word64
0x106C09B972D2E822,Word64
0x7FBA195410E5CA30,Word64
0x7884D9BC6CB569D8,Word64
0x0647DFEDCD894A29
  ,Word64
0x63573FF03E224774,Word64
0x4FC8E9560F91B123,Word64
0x1DB956E450275779,Word64
0xB8D91274B9E9D4FB
  ,Word64
0xA2EBEE47E2FBFCE1,Word64
0xD9F1F30CCD97FB09,Word64
0xEFED53D75FD64E6B,Word64
0x2E6D02C36017F67F
  ,Word64
0xA9AA4D20DB084E9B,Word64
0xB64BE8D8B25396C1,Word64
0x70CB6AF7C2D5BCF0,Word64
0x98F076A4F7A2322E
  ,Word64
0xBF84470805E69B5F,Word64
0x94C3251F06F90CF3,Word64
0x3E003E616A6591E9,Word64
0xB925A6CD0421AFF3
  ,Word64
0x61BDD1307C66E300,Word64
0xBF8D5108E27E0D48,Word64
0x240AB57A8B888B20,Word64
0xFC87614BAF287E07
  ,Word64
0xEF02CDD06FFDB432,Word64
0xA1082C0466DF6C0A,Word64
0x8215E577001332C8,Word64
0xD39BB9C3A48DB6CF
  ,Word64
0x2738259634305C14,Word64
0x61CF4F94C97DF93D,Word64
0x1B6BACA2AE4E125B,Word64
0x758F450C88572E0B
  ,Word64
0x959F587D507A8359,Word64
0xB063E962E045F54D,Word64
0x60E8ED72C0DFF5D1,Word64
0x7B64978555326F9F
  ,Word64
0xFD080D236DA814BA,Word64
0x8C90FD9B083F4558,Word64
0x106F72FE81E2C590,Word64
0x7976033A39F7D952
  ,Word64
0xA4EC0132764CA04B,Word64
0x733EA705FAE4FA77,Word64
0xB4D8F77BC3E56167,Word64
0x9E21F4F903B33FD9
  ,Word64
0x9D765E419FB69F6D,Word64
0xD30C088BA61EA5EF,Word64
0x5D94337FBFAF7F5B,Word64
0x1A4E4822EB4D7A59
  ,Word64
0x6FFE73E81B637FB3,Word64
0xDDF957BC36D8B9CA,Word64
0x64D0E29EEA8838B3,Word64
0x08DD9BDFD96B9F63
  ,Word64
0x087E79E5A57D1D13,Word64
0xE328E230E3E2B3FB,Word64
0x1C2559E30F0946BE,Word64
0x720BF5F26F4D2EAA
  ,Word64
0xB0774D261CC609DB,Word64
0x443F64EC5A371195,Word64
0x4112CF68649A260E,Word64
0xD813F2FAB7F5C5CA
  ,Word64
0x660D3257380841EE,Word64
0x59AC2C7873F910A3,Word64
0xE846963877671A17,Word64
0x93B633ABFA3469F8
  ,Word64
0xC0C0F5A60EF4CDCF,Word64
0xCAF21ECD4377B28C,Word64
0x57277707199B8175,Word64
0x506C11B9D90E8B1D
  ,Word64
0xD83CC2687A19255F,Word64
0x4A29C6465A314CD1,Word64
0xED2DF21216235097,Word64
0xB5635C95FF7296E2
  ,Word64
0x22AF003AB672E811,Word64
0x52E762596BF68235,Word64
0x9AEBA33AC6ECC6B0,Word64
0x944F6DE09134DFB6
  ,Word64
0x6C47BEC883A7DE39,Word64
0x6AD047C430A12104,Word64
0xA5B1CFDBA0AB4067,Word64
0x7C45D833AFF07862
  ,Word64
0x5092EF950A16DA0B,Word64
0x9338E69C052B8E7B,Word64
0x455A4B4CFE30E3F5,Word64
0x6B02E63195AD0CF8
  ,Word64
0x6B17B224BAD6BF27,Word64
0xD1E0CCD25BB9C169,Word64
0xDE0C89A556B9AE70,Word64
0x50065E535A213CF6
  ,Word64
0x9C1169FA2777B874,Word64
0x78EDEFD694AF1EED,Word64
0x6DC93D9526A50E68,Word64
0xEE97F453F06791ED
  ,Word64
0x32AB0EDB696703D3,Word64
0x3A6853C7E70757A7,Word64
0x31865CED6120F37D,Word64
0x67FEF95D92607890
  ,Word64
0x1F2B1D1F15F6DC9C,Word64
0xB69E38A8965C6B65,Word64
0xAA9119FF184CCCF4,Word64
0xF43C732873F24C13
  ,Word64
0xFB4A3D794A9A80D2,Word64
0x3550C2321FD6109C,Word64
0x371F77E76BB8417E,Word64
0x6BFA9AAE5EC05779
  ,Word64
0xCD04F3FF001A4778,Word64
0xE3273522064480CA,Word64
0x9F91508BFFCFC14A,Word64
0x049A7F41061A9E60
  ,Word64
0xFCB6BE43A9F2FE9B,Word64
0x08DE8A1C7797DA9B,Word64
0x8F9887E6078735A1,Word64
0xB5B4071DBFC73A66
  ,Word64
0x230E343DFBA08D33,Word64
0x43ED7F5A0FAE657D,Word64
0x3A88A0FBBCB05C63,Word64
0x21874B8B4D2DBC4F
  ,Word64
0x1BDEA12E35F6A8C9,Word64
0x53C065C6C8E63528,Word64
0xE34A1D250E7A8D6B,Word64
0xD6B04D3B7651DD7E
  ,Word64
0x5E90277E7CB39E2D,Word64
0x2C046F22062DC67D,Word64
0xB10BB459132D0A26,Word64
0x3FA9DDFB67E2F199
  ,Word64
0x0E09B88E1914F7AF,Word64
0x10E8B35AF3EEAB37,Word64
0x9EEDECA8E272B933,Word64
0xD4C718BC4AE8AE5F
  ,Word64
0x81536D601170FC20,Word64
0x91B534F885818A06,Word64
0xEC8177F83F900978,Word64
0x190E714FADA5156E
  ,Word64
0xB592BF39B0364963,Word64
0x89C350C893AE7DC1,Word64
0xAC042E70F8B383F2,Word64
0xB49B52E587A1EE60
  ,Word64
0xFB152FE3FF26DA89,Word64
0x3E666E6F69AE2C15,Word64
0x3B544EBE544C19F9,Word64
0xE805A1E290CF2456
  ,Word64
0x24B33C9D7ED25117,Word64
0xE74733427B72F0C1,Word64
0x0A804D18B7097475,Word64
0x57E3306D881EDB4F
  ,Word64
0x4AE7D6A36EB5DBCB,Word64
0x2D8D5432157064C8,Word64
0xD1E649DE1E7F268B,Word64
0x8A328A1CEDFE552C
  ,Word64
0x07A3AEC79624C7DA,Word64
0x84547DDC3E203C94,Word64
0x990A98FD5071D263,Word64
0x1A4FF12616EEFC89
  ,Word64
0xF6F7FD1431714200,Word64
0x30C05B1BA332F41C,Word64
0x8D2636B81555A786,Word64
0x46C9FEB55D120902
  ,Word64
0xCCEC0A73B49C9921,Word64
0x4E9D2827355FC492,Word64
0x19EBB029435DCB0F,Word64
0x4659D2B743848A2C
  ,Word64
0x963EF2C96B33BE31,Word64
0x74F85198B05A2E7D,Word64
0x5A0F544DD2B1FB18,Word64
0x03727073C2E134B1
  ,Word64
0xC7F6AA2DE59AEA61,Word64
0x352787BAA0D7C22F,Word64
0x9853EAB63B5E0B35,Word64
0xABBDCDD7ED5C0860
  ,Word64
0xCF05DAF5AC8D77B0,Word64
0x49CAD48CEBF4A71E,Word64
0x7A4C10EC2158C4A6,Word64
0xD9E92AA246BF719E
  ,Word64
0x13AE978D09FE5557,Word64
0x730499AF921549FF,Word64
0x4E4B705B92903BA4,Word64
0xFF577222C14F0A3A
  ,Word64
0x55B6344CF97AAFAE,Word64
0xB862225B055B6960,Word64
0xCAC09AFBDDD2CDB4,Word64
0xDAF8E9829FE96B5F
  ,Word64
0xB5FDFC5D3132C498,Word64
0x310CB380DB6F7503,Word64
0xE87FBB46217A360E,Word64
0x2102AE466EBB1148
  ,Word64
0xF8549E1A3AA5E00D,Word64
0x07A69AFDCC42261A,Word64
0xC4C118BFE78FEAAE,Word64
0xF9F4892ED96BD438
  ,Word64
0x1AF3DBE25D8F45DA,Word64
0xF5B4B0B0D2DEEEB4,Word64
0x962ACEEFA82E1C84,Word64
0x046E3ECAAF453CE9
  ,Word64
0xF05D129681949A4C,Word64
0x964781CE734B3C84,Word64
0x9C2ED44081CE5FBD,Word64
0x522E23F3925E319E
  ,Word64
0x177E00F9FC32F791,Word64
0x2BC60A63A6F3B3F2,Word64
0x222BBFAE61725606,Word64
0x486289DDCC3D6780
  ,Word64
0x7DC7785B8EFDFC80,Word64
0x8AF38731C02BA980,Word64
0x1FAB64EA29A2DDF7,Word64
0xE4D9429322CD065A
  ,Word64
0x9DA058C67844F20C,Word64
0x24C0E332B70019B0,Word64
0x233003B5A6CFE6AD,Word64
0xD586BD01C5C217F6
  ,Word64
0x5E5637885F29BC2B,Word64
0x7EBA726D8C94094B,Word64
0x0A56A5F0BFE39272,Word64
0xD79476A84EE20D06
  ,Word64
0x9E4C1269BAA4BF37,Word64
0x17EFEE45B0DEE640,Word64
0x1D95B0A5FCF90BC6,Word64
0x93CBE0B699C2585D
  ,Word64
0x65FA4F227A2B6D79,Word64
0xD5F9E858292504D5,Word64
0xC2B5A03F71471A6F,Word64
0x59300222B4561E00
  ,Word64
0xCE2F8642CA0712DC,Word64
0x7CA9723FBB2E8988,Word64
0x2785338347F2BA08,Word64
0xC61BB3A141E50E8C
  ,Word64
0x150F361DAB9DEC26,Word64
0x9F6A419D382595F4,Word64
0x64A53DC924FE7AC9,Word64
0x142DE49FFF7A7C3D
  ,Word64
0x0C335248857FA9E7,Word64
0x0A9C32D5EAE45305,Word64
0xE6C42178C4BBB92E,Word64
0x71F1CE2490D20B07
  ,Word64
0xF1BCC3D275AFE51A,Word64
0xE728E8C83C334074,Word64
0x96FBF83A12884624,Word64
0x81A1549FD6573DA5
  ,Word64
0x5FA7867CAF35E149,Word64
0x56986E2EF3ED091B,Word64
0x917F1DD5F8886C61,Word64
0xD20D8C88C8FFE65F
  ]

castleKeys :: Vector Word64
castleKeys = forall a. Unbox a => [a] -> Vector a
fromList
  [Word64
0x31D71DCE64B2C310,Word64
0xF165B587DF898190
  ,Word64
0xA57E6339DD2CF3A0,Word64
0x1EF6E6DBB1961EC9
  ]

epKeys :: Vector Word64
epKeys = forall a. Unbox a => [a] -> Vector a
fromList
  [Word64
0x70CC73D90BC26E24,Word64
0xE21A6B35DF0C3AD7,Word64
0x003A93D8B2806962,Word64
0x1C99DED33CB890A1
  ,Word64
0xCF3145DE0ADD4289,Word64
0xD0E4427A5514FB72,Word64
0x77C621CC9FB3A483,Word64
0x67A34DAC4356550B
  ]

turnKey :: Word64
turnKey :: Word64
turnKey = Word64
0xF8D626AAAF278509