0100101000001010110011000001100000001011101010011010100111010011010001111110111111110010101011100101011111011101111001100111010001111110000110010001101011011101100001101111011101010111100100011001101000111101111010101100000010111011101001000101011111001101011111010010110100011001011111111111101111111110010111101011001110001111001001101110110100110000011101000101100101010110100010011100110110101001 1100110001010011111011001000001100011111101000010101001110111001110001110000100101010001011010011000111101100101101101101001001110011111110010001010100010010101011111011010111100001011010101110110001110011101101110010111111011000111001101000101111100100111111010001101100001001111001011010101100011100110111001010110010010110111011111000010111100000010000010111011010100000110011100110100001101111100 1011111001010000100000110111100001000110111000101010010110010110111001001101101001100010111000001010101011010110110010101111100001100010001011110101010101100001000111000001110111100010001100111111111001111101111100100000100101011111001000111111101001111000111101010010100101100000111001010001110110010010011010101011001001010010010010000001010011011010000101111110100110011010101110101110011001001101 1111010111110000011000110111110111000001110100100100111100111110011110011110101000010000110011101110101000111110010100011101101101100000010001001111101110110100111010101000111110011010000111111101010110111001100011101001000001110011011001001000110100010110110101011011111010101000100011111110101111101011101000010100000100111000001010100011001100010111101100010100001011001110111111100111101000110011 0101001010010001000111001000110101010100000110011011011010100011110101101111100011111110011110000101001000010000111010010100001100101000101000100101101110101111001000110111101101010111001001100101001110111000011100001101111010001110110100101111011011111101100001111000010110110101001101011110001001110110111111001111111001110101010011110000101000001010100010110010001111100100000011110001010001010001 1011001111101011010111011010010100001011101000111011000010000011101010101101111101011011000000000111001110111110001010100010001111000111110011010111101100000101111001100111001001110111100000000010001100000111101010011110010110101010110001001101111000100100100110101010110001010001101010001011111110101011110011011000101001001101010101110010011000001001010000010011101001011000010011000110101001101100 1010111101100101000111110111001001100111100110100111110011101101011011010111010110110001111110001010010011001100010000110000011011011100111000010101100001101011010110011011111101000001100111001111001110011111100111111100111010011001001011111110011110111010100010111010000001111100010100001000110100010010001000111100000111101110001001100011100011011110011101010110111101010111111100100001111100100000 1110010000101111011010111001000101101111000110011011001110011111010000001101001001011010110100001010110011000111100111100010110011110111110010001110101110100101010101100011010100000110100000010010001010101000010110110000111111010100110000011110011011110011101101000011101010101110011100111110111010001000010111110010111111001110000010000011111011101001010011010110001010101111101110000011000100000101 1000001010111011001101000110100011011111111101110010000101101000010000110011100100000101101000110000001010011001011000110011000001010101100100011110001110001001001110010101100101111110110111000001110101101101101101111001011101010101101111100101111011101111000000101010111001110101100010011111011010110111010110000110010100011000001110111010111001011011000100100111001101111001101011011001111110010101 0000000001100011010110001011000110101011011000000001100010110000010011101100010101001110101110110100101110011000010100000111010001011110100010010111101001111000110111011011110101110000010001110011010111000100001011100001100010100100111010000111110001001000101010110001011111010110100100100000110101001010010111100101101010010111001101000001111000011001111000001100101100011011110101100011000001111010 1110011101111111010010110010001110010001101101000000010100101001110110000101100111001000101001110000010000000100011100011011110000110101011010000010101101110111011001100001110000000100001111110000010111000001101110001000000001001000111110001010011101100111010111011111011000000110011010010110010010000010101001101111010010111000110010100101011101100111000101000111111100010101100010110001111111101011 0010001110011001001001000111110001101000101101101111001101000100000101101000001101101110000011101010010110110100110000101010110100101010100010100010000101001011111010011101011110100110100001010010111110000001000111110001011100110001111101100101111010011100101110100000010001000101010100010111001110000111110100100111100111010000101101011000001110111001111010111101110101101010100011110100101001011110 0111100000111011101000111101111000000010010110100000110111000000010101111100001111001110101100010010101010000011100000101011011011111101100100101010011100000010101100010010111100111000010110110000111101001100110100001010001011111010001101101101111010100011010100111001000001111000010101101111100110011110110100100001111101111100011100000100011010000000011110011110100011001011100011100101011000001001 1100111001000110101001001101111001110010101110100011100100011100011010011101111101111010111101110100101010100010111111101101000101110011101110000111110001001011100100111101001101100100010000110001010100101011100111000111010010011101101001100100101010100101011011000010110011101101001101110110001101000100001101111101101100101001111011111100111110001111100101100001101110111010010100111010011001010000 1010110110001001101011111100010101111000011001001010011100000110010011000010101110111100101001100000001111011100000000110011010111110100010011001110110100010100001001010111101110101111110101010101001101010100100100011001000011011011110111011100100001010010100111001101011111110110110011111101011001101001000001111110010111011110110001111101100010101001101000011101010011110110111001101001110010001000 0000100110110111101011110100000110110110011010001100010011101110011111011100100010010100111111101110101100000011100010010001001011010010111001111011100100110101100000011011011011101010010000111101000000101000010111100001010001000101011101100000010111010100001111001010110010100101010001000101111101010100111110110011010100100001000111101110101110111101101111110001011001100101001101111010010010010100 1111011101100111110111100011101111100100110001011100001111011111111110101111000010110101011011111010010010000100100011100000100101101111110010000110000100000001101101100000101100101111101110010111100010001100001010111110101001000110010011101111010111001010010011001111111011100010111110110100111110101110110101101101111011010111000100011000001111111100000000100111110111000110010101001100011100110001 0111100110111001011000111101010001110000010011011011110001100100000011000001010001100100011011101011010000011111110110111000001100001001000000011101010011110101111101100011011110101000011110001000011111110101001000101100000100001010100100000111001010111001110110000010111011000010011001000100010011111001110110100011001011000110110111110011010101100010000100001000101001111000001010010101111001000011 0111011101100111000110011000010110111100011011100000111010011111000011100110110011100001100000111011101111000100000010011110000100111101011111111100010011110110111110111010101101101011101000001010110010001010001001010110100011110101111001001011010100100111001001001011001011000001110010100000111110100011101101010011001001011111111011010011010111001011011111001010100110111000100000100101100100000110 1010110111000111000101111010101100100100001110100001111001001010010010100110010011010100001100101010000111100110010100001000010100011000111100101101001111101100010000100010101111101000100110000101100011000101010001010100001110000000001101010001100010000000001011000000111101110111010000011010001111100100011011001101111001011011110001100111001001001010100110011110001111100000011011010100001001010011 1110111011101100011010000111111100110111001011101011000110111001100101110001111010000010110011001110001111101010101110100100100110001010111010010110111111010000010011001100010111100100111110100000100111000101100011111011100000000010010100100110111000000010010010111111011101001100100011011011100000111011000110010001111111000011100111011010101000001101001011101011111011010001101001010000001000000000 0000111001111001001001100111000010100011010010101010010100101000011001101001100110001000101111000110010110110001110011111100011110100000100110101000010101100010000100000100100000000001000001011010111100101011011110101101100110001001011001101110110111010010111110100110100100111000110000110101101010110001000011011101100011111111110110000101100011001011111111101100101100001100001101111101110010000111 1010111101111000000111110110010011000011001001100111001111100110111010010001101001011010000110110000000111001011101111000111101000000011111001110111000100000111110100110011010101111000101000001101011101101100110001011010110000001111110010010011111111101111011001100010000100101010110010000000101001100101010110111101010001011111010110001011110000000001010010110001001110011010100011001011110011111110 0001100101000110101010000011111100111111100101101010001111110011101101011111110011110101001110111010010010110011100010010000101111100011100001100111110011000100010000101110000101100110111000100110011101111011010110000111100100111101010000100010101111001100111010011100011101100001100011000111000110101111111010100001100011111101101001001011010111101111110010001101000111111111100001111100111100011010 1100100000100100001001011000110110000001001001011000011110110110110101110111110001111000010111011010111110001010010101111101010111100101010011101011000011000100011000111100001100101111111101010111000110111011010011000001000011101100111011111010000001111111011100010101001101000110110001001101100101101100000010000000111010111001001111100101100001011001101010100110101111011111110001011010101110001011 1111110011011101111011000001101011001011111000011101011010010001100011011100101000011000001010110001001010100011000011000101001101110101011110111001101000111111110010101111001101001011101011110001010110100010101000001011010010010100101011011111111000101111010001010001110100010011011111000000111110000010110010011100010100100111100111001111101110100000010010100010111110100101110000001011011110001101 0010010100000001011100110000011111101100001000010111111101010100011100001100100100111001011011100100010010100000011011110110100011110011011010001111100011111001110000001010001110111000000000111000010111000010011100000011010001001010010000110000100110000010101111101010110101000010100110011110001111011101101000111111101011001110001000111010001111111001111101010100100010011101111100001010010101110100 1111001111011011001011101011000001010110000100100100111100010000000001111100110110000100110111010101011101111010000111011001001001000101111100001010110100111011011000100010101000010001100000001011010110011101100001111000010001101100111110011000111011001100011111110011011101011110111101010111101111000010000111000001110101011100101111001000010000011000101111100101001011010100111111111111100010011101 1100110001101010101001111110111010010111010011011000100100110100101000110010001010100011010101111001011000000101100111010101000001010010101100110111110011110100011100111101001010010101101111101010111011100010111001100110010001000001101000101100011010111001011100110111100011100111000110010011100010111101010111000110101111110111100000001000110111011011000001010110100010110100010110110100101101011101 1010101100100001111011011101110001010111010100110110101000001101111011111000100000010010110110110100000001100110111111111100100110010101011101011100101011001101001100001100111001110101010111100110111110111000100010001000111001110001100000101011010001000010000100000101110000001001101000110010101000110100001000101001011101101100010101100111000010110010101101010011111110001011111111111010000100010110 0100010011110101101001001110010110100100000100001101110001001100000101011011000010001011010100010011101110000101000011110000010010110101000001010110011110110101001111101100010100010100111101000110000110011000000000101101010110110110000101011111011011100001011110001000110011110011010110011111100100110010111100111101111101011001110011101101100111110111110101101000001101011111000010110110101000000111 1010110110001001101000111111000111000011010101001011001000000110010101100110000011110110100101111100011001000110010000010100111111110001000001101010111111101001100110101000100101010010000010010100100101100111010100100011010000000010000000000110000000000111010100010101010110000000010001001001101010110110010011100111010100100011001000110001100110011011001111011011010110010110011111000101111000110111 0110011111001100101111010011001010111000011111000011110011111110010111010101111101011001100011001010000100111101110100011100111000010001010011001100111011110101110011111101010000101110010010011011001110001001101000001110001110010000100010010000100110000001011011001100111000101001100111101110100000111000111100001100100000001111110011100001001010100111111110000001100001010111000110101110010000011001 0101001001111100111111111001100101010110101001111001100011101001010011011011110011100100110100100000110010110110011110101111001111011100110010111100011101000001001110110011110001011011001011011011000011010110111110101111101011101010110001000011110011101101010001001111010011010001110010001110011011001000101101000100000011111110010000000100000001000001011111011100011010000101100011101100011001010001 0101100101000000111000101100001011100000100010010010110111111011111000000101110000101000110010000001001100010110010000110011001010010111100001000111001000010110101100100100001000111000110011100000001000011000110010000000111110000111011001011100111100000000110001111010101001100010000011010011111101001100100111110000001100011111111111111000010100111011011110011001001001111110000000111010000010110001 0001110000011111010110011101000001101000110000100011011000111100011101111010111110101011100101010101001010111100000001011011101111000110100001000111111011101100101111011001101100100110000111001110100011101001101010010011100000001110100100110111111010000001000011101111100110011000101110100011101100000000111011101110011100110011010110110110110100010100111111010100110000110101110010110001011111100000 0100010110000101000000000101010001100101010001101100111010110001111110000000110000000011101111011010001010010011100011111100111101001000111101101100010000011010101010011000100000111011001101000011010001011001001111110000011111111110101000101001100100101010001100111010011000110010010111101110111111000101100110110100011001101101011010101101111010011110011010011000101100011111101101000111111001001010 1101011101001011100111101001101001111110100000100001100111100001111001001100011101110010101110000110110010110110000011110110110011001000111110000100010101001000000000001111010001101000000110011101110011000011011010010111111000110011000011001010110100011111001110001101100100111000000101000000000010011011011010001101111010111110010110111111101110111011001000011011001100010001100001100111001100100011 1001110100111010001000001101100000000000000001101010110100011011011100011011100101101101110111111111010100000101000011110010000001010011011000110001111000010010110101111001010110011101000111011111011101011000100101010000000100001110001100110001000110110010010100111000110011110111011110111011110100010001100001001100111001111000001000011101000101101111110100100000111011111111001010010000000111111011 1011011001011101011110000000100000011011110011011110000110110101110111000111000001100110010000101101011011001100001000111101100000101110111111111000101111000011101101010001011101000000111011110111000101110110010011100100110000100111000100011111011001001000111110000010110101101110000111000011100110101000001011010101111110110001000100110111011000011111001011011110010000110000101100011000011100011011 0101001010010010101101101100100101101100111110010000001010000000100000101011100100110101010011000111001111110100000000001111010100111100011011101110000100100101001010001011000101101010110111101011011111001011000100011111010000110001101101000010011011001101010111100000011010001000000101100110101011110000000000011111010100010101110000000111111000100011001001001101110101010100001001101111011111011101 1101001101101000010100000000000111111101000110000001000111011001101110111100000001101101011001100110111101000010110100011010010010000100011111101111000100100000100101110111010001011100011111110010010011100000011011011000100011001100111101000111011010000010010101011001101000110111000100010010000000010010000110110101110100010000001000111001001000011101100110011111110000100000111100111111000100111111 1111000110001000100101010100000000101001111111110010100000111011111111001010000110010011010110011001110100000011100000000001111000100110111111101001111010001110101100100000101000010100001111111000111100111010110001000000101010001100101010001100111111010110111011111100110011101110001000101101001010011011111101101011001011000101011101011110011001111100001010001001111011010001010101011011101111000011 0101001101010110011111000110111100011101001110110101001000100000111001001001010111111110100010100001101110111111001101001011100100010110111100111110000101111101010101000100001100100111000001100001111100001010101100000100001011110100000110110001010100111011101100001110110100100100111011101110111000101101110111100111010101010110000100101111011001000010101010010011111110001000110010011000111110011001 0101011111000110100111111110001101000111011111011001011101010011010001101100110010101110011000011100111011001001000000101101011100111111100001001001111110110011011101100101000100010100011101110100010000101111010100111101001010001110010100101101111000001100110000001000101100010100001011001001000010110111100010000011101101000010010110110101011101010110101101011110001100110110111001000110011110110011 1101100011101110010001101110100110001011011111110111101111001010111101010110010110100110111001010111100001100011100101001101101111001101111000000011101101110011111011010010110010111000101100110011110010110000000001000110001110101011111011011010100010000110000000110100100100100011101000101100001011111011110101000000110100111100001100110010000111000011010010001010000000110011111111101001111110100001 0111011100110011001001011001000100010111010001010000010101010001001010101001111001011110110110101001101000010010100101001101111001011010110111001010011001011101100101000011100011010110010110010000000011101101101010001110010111100111110011000001010111110010001111010101111011011001110101100000010001100010011111000011011010100100010010000101001000110111111001011101001001111111000011111011000100110001 0101010100010100011000101000000111001011100010000000010111010000110100101111101110010001110010001011000111111100110010100100101111100011101111101100001101110000101000011100000011000111111100100100101111000100110001001000110111001111100101101101001010101111101011001001010001111011001110100001001010000111100100001000001000110001011110111111111100000110011011110111000101101111000010010010110000101101 1101111010110001100011001101011011100101100100101011100001111101110000010010011101000000100000111010011010111010010001010111101100101000011100000101110110111001101000010100011111001111010100110000001010011011101100011111011111101111100110001011000110011000011100001001101001111111110010010010101100111101111111000011011101101110101100001101000100111011110101010100010111100011011101001101111110000111 0011000111010010101111110111001001010000011110110101000000101101111011000001101101010001011101111011000100000110101011011010000011100100010110111100010110011110001101111111110010101000000110101010010000100001010101101110101001010001000110001110011111100110001101001101111100010010000111110111101001000011010000001111110011001111001110101101011000001111111111101000001010100010100001111100001001111000 1010001100111110000101110010111010111000010000010110010000110001110000101000110111001110001001010000001111011111110011000001101111001100100101101111011110100001010000100101011001010100000110010111011110100001000100110101011100011111001011111111011000001011101001010101111011101110001110101111001111110010100000110011110111100111111110011101101011110101011101001101101010111100100111100101010011001101 0110101001011111001101101110001101111101101000101000101000111110110000001001101001111011101101100001100010100010110010000010010001010101101111100101000101100110101001101000011000100000110011111011110101111010110010100011010111010000110010011100101101111111011010001011100011101000001101011000101100111001100111101010010001110010100011101011001100111111010111100110000111101010000111110001010011000000 1010111000101000100001001100001010010111110100101100110001110111111110010010100010100001000100000010000011111110110001000000110001011101100001011010110100100001110000111001101011011101011010011000001111110011101110111011101100110100101110011001110000011001101011010101111101010100000011101110100000100100101110011010001000011001110010001101001100110010000001111110010000110100001001010110010010110101 0110111110010000101111101011101010011100000111000110101111111101100010110110011010000110011001000010110011111111111000000110001101010000100010101011101010000000000110110111110110100000101111101000011111000010110000000111010101011010000100011000111100100101001010000001010001001100001101110100011111100110011111000011010011110000010010011110101011000101100011000111010001100101011001111100101011110100 0101001001110111001100010010111100011101001101110111110011010101110001001010011101111111110010010000010100110001101000001010111110011010010010011101110010000000101110010111110100101110011101110000110110010010111011010011100001101101010000111110111110111111000101110001111111000111010110000011101101011100111101110111100111110110100111010111111110100001110001110000000110001111111110001101101011101001 0111011101101010100000011101100010111100011110110000010000110111110011010010110111000000011010001011010011011000100001100011101011001111010111010000001000010000001001010101010001110001011100000001011000011011001000100101110111010110000100001111000110101101010001011000101111001101010000011111000101110010011010101010001110110110100010011110110001111011010000000110111100010000011011100100000111001010 1000011001110000001011001010101111110101111111111011010101011000000001111100000100010110011011101011111000011011000110111110001100111011110000100111000111001001101110001000111110110010001010101101011000000101100010100101010001001011110110011010010111110100011111101100011001000000000111100101100001011001000000000011111000011001100011110010011011011100000110010011111001001001101111011010101111111000 0111110111011000101001010100000011110000100000011001111111110000011100101001101001111010000011111000110101011001001101000000000110110100000101000100110101111100010101111001000110111000111111111100011000001001010101011000111101010000101110001100101000100111010001100010010111001011111101001110101100100010001000101101111001110001011010010011001110100011011111110110110100010010001110110100110011101000 0111001111101010001101010100101000110011111100100101001100001010001100010010011001001011111010000001011010100011010011000010100111001011011110011111011001011010011100000110011110111001101011101011000100000011000111111101101001101100110010111010001110011010110010000011010011011101010010010010110111111110110011000111100101010110110101000111101101101000110110111110100001100010111001110110101110000011 0101000100110111000100001010000001111110101001111101111111101000010001110100010000111010111110100101010001000100011000110010111001000001010111011001111001001111011010010011101001101110011001001101101011000101011010101100110100110110001110110101101000101011011010011110100110101010010101111111111000000100011010111101101111111100101101111111101000101011000001101011101011111000100100101110110011111000 0100010100001001100101110010101010010101010011000100110111111001111010110110110001100100010111000000001001011111011100101010010100110100010001110100010010100110000101100011110110101111011010101011011000110111001001101100111101010101011101010100111111001110101001010011011000001101000111101011100101110000001001111010100010001001010000111100010110010010010111100100011001011010100000110101001000010110 0000111111111010011000110100011111110001011110110011010101010011010000011001101101010001000101001000000001010001010101111011000000000110100000101000000001100101111001001111001100100001100001000001100001111100101000101110001010101101000110000001000011010101100111110101010000111011111010110000010100010111101001100111011111010101111110011111000000110011100010101101100000110110010100111011010110010110 0010100100011000010001011010110010111010101000111000000101110000011111100010001010110101110010011010101010001010011011101110111110000111101000101100011110001001101100101110100100011111101011110101110001110000011000110010010101000111101010001110110101110100101011010111001011110101001111000000001101000100110110110111000011001111011111000111001101110101100000100011001111001010000001101110101010100000 0101111011001111010001010010111010111101111100010111110001111111101001110011101001111000111100110000001001011001001011111011100001100000010001111000101011101011111011011101110001111000101000000000000000001110001011011000111011000110011001010011011101000001100110001111011011011001101010000001110011000111010110111000110101010010010000111100010011111001100110101110000010011000111001000101001001101101 0001111011110001110101010010111011000010011010010000000001001101110101101000000011011101001001000011010100011111100101110100101100101111010110100011010010011000000001110001000110001001110000101001010011010110011010010101000100111000010100010111010101001000000010101001001110110011011111100000100011001111011010100001001000100100100111101100111001111101111001101100010000001110011100101000000001010010 1000010000101010000101010000100000100011011100000100110111000011010000111101011011000010100001111010110011010111001110100010010001110001100101001011101000010111010100110100101011010101111111010000000101110001000100000011100100011100001001001001110001001011111101100101100000000111110100110101010100100111010001001110100111101101100110001111001110101011110101111011110101000101110000101000001100111000 0111001111110010000001111100010000110011011001101111000111010110111111000001000011100110010000100001000001110011111100000010100000001101001110110001101101111001111110011000010100000100001000001111100100000000100111110000100100100111111111000101011100111110111000101101111000001010000100101111010011111110100101000110110010100000101110011101100000100000011001110101111100111101000011101011101000011000 0011110011011101100110010111000010101110110001011001001111010010111111101111000000110110001100001000010101001001001100000100110100111100000010110000001100010111110011010101111111110010000101100011010111001001101001101110110111000111111111101000010110101000110110110110101111001100100101000111001000000110110111010110100000101010100000110101001111101011110101110111000100110000111100101011110010001110 0010001110101110101000110111001101011101011100111011001110110111000100111001000100000000010001011000111000100010011010010100001000100110111101011011010011001001001010111011011001010011111101101000010110100000111001110001000001101010011111111110110110011000010111100111011101011100001001100001011100101110101000100101000110110111001001001101010101000010010111100100011000111011100111010100000001110010 1110100101100110010011000000010100110111100000101110100110011101100101110111000000110001001111110101100010101110111000000110110111001101111110100000001011001000010010000111110001101100111000000110111000111110101010010110010011110100011111100001011000000001100001000100110101001111101011101110111100011110011101110100110111100010011111101100010011011011010111111100100000101000111110101001101010010010 1111110010111011000011000011101011111110100111010100001010000111111011100111111100100110011111110110100011101110010010001101001101100011101011111001111110010010101000000110000000100110000110101011010100000100011100111110001101001000010010001001000101100010011110111100010001100000101110011110110110001100000111100001111011010011001010001110100101001000010101010001010110010111000001000100001110001111 1000010000000100010100111100010110001110111111101100000001100110011111111001111101001100110111001110000110100100100010010001101000100010001000111110100111100111100110000011010101101100011111000010001101000000101000011101011100101110100000010001001100100011101100000000100001001000101001100010100000110010011011010000110111001001101011000000011000100010110101101111100111100001100111110110110000110010 1010001010001100001010010110011111001111010010111010011101010100010011000100100100100101100100110111110110011111001111110111101001101001100001110100110111111111101000101001010010001111001011111110011011110101010000011100111111001101000010001100110011100001101100010011011101000001111100001000101101110100101101110100010101001010111111111011001111001010110101111101101000100011011001000000001001110100 1000110010110110100011011000001101110110010101110000000111101001100111000111101101111000110010110101000111101010001110101001001110001001110010000110000110001111111011101001001110001111101110011011000010011000000110001010101000011110010011010110001110001001101010001100100110100010010001000111111010011011110110100110110101001011010100010001011100101011001110001101001100100010000110010010100011010111 1010100100111110000111110100001000100100000100110010101101101000001100010110010111100101000001110001100001001010000010010000001011001111111011100011001111011010111011110001111000000100010101000111101011100000010111001110011111011110110110010101001001101010100011101101000111111000100110011101110100000111000101110100111100010000110100110001111001011100010110010100001001101101100100111110111000100011 0000011100011100101001100000101100101010110100011000111101101100110100110011001010110111111011110111001101001000010100011111000010101001111011100100110110001001010111011100101001100000101111101110111011100100011010101110001100000011011010111100110111101000001110001110001101001111110001001111100010111110011100101101001111011111100111100101100110001101101100000100111101100011101000100110001110111100 0010110010001000001010001101110110111001011010101100111111101100010110111110010010011010010011001001100110000111010111011111000010100101000111101001000011000110110001010000101001111001000010111000110110010001011011011001111001010011011110101110001010110000101100011001011111110000101000001000110001101111010111010111010010001110101001001011000101011000001110000100001111110011110000010101101011110110 1011010111110011110011100101111111111000101101001010100011001000111110010101000101000111000010011100111110101011111000101110011000101011011001110000111111110100011101100111010111001100011001111100101110111000010110110010010101011010000001100011100001000011001100001111100111011101011110000101110111010101011101000111101101000100001100100110100011110000101111000100110010110010011010111011111101011111 0010001111011101001000010010111010011110111101111111111100101010111001011101010111101111110101111011001010111010011010111110000001011100001000110100101001001100011101111100100110110100010110010110101010011111101010000010101011010111111010111011101101100010001000011011011110110011010001101010011101001110000110111110001010101110110111100010010011100001100010001010100000100100000000000000000110110011 0010010010011010011000000010011001010001111001100010001100010011100110101000011011010101110011101010101000001101110101011111011101011001111100111010110110000110011001100100110010100100111010101011110110010001010011111010111000010001111111110110110000110001000110011010101101000001010110110110010000001010000010101001110100111000101010011111101010010000011001001111100110100111100010011100010100100011 1101110110011001110100000001000101110010100101111000110100010011100100011111001010001010110110111010100011100110001010100011011001000001111110011001110101010101001010001010111001011100111011011001100101100001101100110111000001101101101110101010011001001001010011101000010100011110000001011010010001101010011100111101111100100110110101110110110011111100010011011010010001000000010011100010001001000111 1000001000010100111010001111111100001010000001011100001110001011001001011110011010000101010100101011110111010101000111110011110101000010011010111000001011100101010010011110111101001001011001011101010000010011101000010101011000110010100010011110110010011000001001010001011000111010100100011011000101111000111010001010001010111101111001010000100000100101100001000100101001001011101110111101111010101110 1011111010011001100111111111000110001010000010100101011111111110001101111111011000000010101111101111101111010011011010111101011011100011011011101001000100011100001001101111100100001011101101111010110111000100010001001010001001110001000011011010011001000101011010100011001110011011111111011111101001101000010010010111010100110100110110100000111010001101110010100100101000000100010011100111110011011011 1100111011110111000110010110011010111001001100001011001001111010100101000101000101100110001011011111110110110000110011010110111100001010110101001111000010100011100100011111110011101110000010010100101001000111111111101011010011101111001000100101110000011001110101101110001000011010101101111111110100100000010010111000001111010101011001101011001101101001001101010101111101110010101001011000001110110101 1111101110100010000111011110110000010001000100100111111001011001100100100110010001101111111110110011000110011101110100010001001011001101010001111111101110000100111101010000111001011101010001011110110000101100001010110001011100001000011001111100100101111001010111110010010010111001000010101111010000101001001100100000011000101100011001000100110101010111001111001110110000000100000011000011110010001110 0011010001101100110111111111101110010110000101110011010110011000101111001100001111001111101011111111001001110110110100001010100110001110011010000011110001011101100011001110100001100001100111001001000010010101110010011110100110110110010000001011011100100110010010100111100110010110111110111110111100101010011101001001100001010101101011001000001111011011001100110110011111001011101000111011100101001010 1000010001011111101011111011000010100011100111110110000011000111001000010001011011110100101000111000001100100111000111011100001000111110101101011010111011100101111011001000001000010010101111111100011101110101110011001110000011001100110110011000001000001011000101000001101101000110000110000000001110111001011011100011110011001111110011101110010010110110001010001011100100101011101101110001110001010101 0110110011111100111111101101110010000010111001000100111011100011111111111111100110101010101000110110011010011101101101110001011100000000000011010011011010010101111011000000101010011110111000011000011000100110010000110100010001110000010101111001110100010111101110001111111100001111000011101110000001010101110100010100100001011100010000101001111010101111111110101010111010010111110001110111110000001111 0110111110111101110001100110110100000011011010011111110011010010001010001101110111110100110110000101011111100111111100111100000000010111100000001100011111001100000010001100110101010110111001011011001010100010011011000000011001011100011111100001111100010010101100111001101100101111111000111000100101001010101010110011101001011001100011010100001110001010000011100011110000011111110001110111100100111010 0100001010111001110100110111001011111000100011100101001010100101111011101001100001110111001011111111101111101010101010111100110101111010001100100000111101110001101110111110111110001101010111111100011111110000101101110100000111011100001100110100011111111010000110111110010100100010001110010100000011000111101000000010000100001000011101001111000100000100100011110000110010100000101010101111011011001111 1011111101101111010001010000110101001110001101001111110110011101110101000011100100101000000001001011011101110111111110010110101111100100101001001010000110010000001001110011011001110001001111010010001011001010101101001000011011000001011101011110000011000000100010110100010011111001000110110110100000010101111000011100101111100001100001011110000001001111111100000010011000000111100100101101110011001110 1110100101111001010010111100100010111111110101110010001100110001110010000101110111011001100011000001001110011001101110011111011001110010111111111100011100001100010011010000010100110110000101110101011010000100001111110100101010110011100010100001111100111010010000101001010111110000011001011100000000100011110010011010010111101010011111111010111110010111011110000110010110000111111010101101000110010101 0110000000111011011001101101100011110111100100011011111000001101101111111001011101110101100010100110100000000000010110010111100110111001010011000101110011010011001001011100101101001000011001000001110010001000101101111110001010000011111001101001000101100111100110101011111100110001001100010101010111000011101111001001101011111011011111011111011011100010111100000100000001010101110010101000101010001000 1010110111111000111101001101111001100001110111010011010010101001000100000000011000011111100100100000101011111110001001111010001101000001111001000111010101110110000001000110111110100101101101100111011011011000110110011000010010001011111011011011110001010101000000011001100000110010011100101100001010111110110000100011000001011111110001101010011110011110101101010000011110111010111010111101000100100100 0111100100011000110011110111000100100000011011100110000101001000000101001100100000001010001111101000011101000101011001011000111101001111100001111001011011010101101111100110101011111110101010011010000100010001011000100110010001111011010111100000000010110000011000000011110001010101010011010001011011100101110010011000010011011111011011010011101011010011000000011001010001101110100011100001011010101011 1010101111010010110110000000110111011110100110101010101111001000010011100111111001101011011001000001111110101100011011100111100101111001111101111010000101111000100000001011000100110011011010001110101101110111100000110000001100010010000010001001111000100110010111100101100110111010100010110010011101010000010011000100001000011011011011000000100111001101100010111001111111100010001101000100111101001101 1001100110001010000100000100101010111000111101011000111111100110000100101011000011111110011001100111100100001011000101000001110101101010010011010010101001001101110010110100011001100101010111011000000100111110001100111000010100100001010010000111010110110011111010010001001010011110111101001101111111001000100111001000110111000011111000010001011001100110110100011000011111101111100110001000101000011001 1111000010100111101000111101110011100101011111011010001100001011101011111101000001100010001111010010111111100100110111010010100110000111010111100000010111111010101101100111011000011000100101011110001001110101001111110001000110000111000011000001100011100110001101111101110110001010101111010100001111000000001100101010101101000011011001000001111000001010010100011000111000110001001101010000100010001111 0010100100100100101110101110010000100100010110110111110010100110100001001101101001010111001010001101110011011010011011010011110011011001101100001011100001000100001111001010101100010011110010111110110001000100011001110101001001110010001100100001110010010111001111001111000001010100101110100101111100111001100101111101011110010011011011001011100111101001000100110010111110000010110101110101000001000101 0011011101100010110110000110100100111000111110100000110100100100110011001010111000111011110001100111101001101100110001110110000010000000110111010001111011010010101100011010111110010001111110001010001011010011110010001101010100000110000001011110111011101100011000010101011000110101110011011111010001100011000111010100001111101111101101001011011101111010010101011100101111000011011111011010010001110010
FXプログラミング

【FIX API】cTraderでFIX APIを使ってみる【サンプルコード】

4/16/2021 6/29/2021

5年以上前の記事です。内容が古くなっている可能性があります。

FIX APIってなんぞや

FIXプロトコルとFIX API

FIXはFinancial Information eXchangeの略で、電子的な金融取引に使われるプロトコルです。もとは株式取引に使われていたようですが、いまや為替取引でも事実上標準のプロトコルと言われています。

もともと銀行間など大口取引で使われていたプロトコルなので個人トレーダーにとってはあまりなじみがありませんでしたが、最近では個人でもこのFIXプロトコルで取引ができるFIX APIを提供してる証券会社も出てきているのです。

国内でもOANDA、デューカスコピー、サクソバンクなどの大手証券会社でも提供されており、だんだんと身近に・・・とか書きながら調べてたんですが、以前提供してたはずのYJFXはなくなってますし、サクソバンクは使用のハードルが高そうですし、OANDAも一応あるものの現在はREST API推しみたい・・・身近どころか、前より遠ざかってる気すらしてきました。

・・・ま、まぁとにかくあまりメジャーじゃないにしても、個人でもインターバンクで使われてるのと同じプロトコルで気軽に電子取引できる時代になってきたというのはすごいですよね、うん。(グダグダ)

 

いろんなFIX API

FIX APIとか呼んでると、「そうか!『FIX API』っての使ってトレードソフトを作ればFIX対応サーバー相手ならどこでも取引できるソフトができるんだな!」と思ってしまうかもしれませんが、少し違います

というのも一口にFIX APIと言っても各社少しずつ仕様が異なるのです。例えばOANDAであればOANDA FIXなんて名前で、OANDAサーバーとやりとりするためのFIX APIになっており、そのための仕様説明書があったりします。(参考:OANDA FIX 仕様書

FIXプロトコルに準拠している以上、大枠の決まりごとは同じなのですが、そこに定められてても、「うちはこれは対応してない」とか「プロトコルにない機能使えるように拡張する」とかなんやかんやあって少しずつ違ってくるわけです。

もちろん大枠は同じなのでうまく作ればいろんなFIX対応サーバーで取引可能なソフトを作ることは可能でしょうが、基本的にはFIX APIでトレードソフトを作るならどこのFIX API基準で作るかは意識したほうがいいと思います。

 

FIX APIのいいところ

FIX 自体は単なるプロトコルなので、プログラム言語の縛りなくトレードソフトの開発が可能です。

たとえばシステムトレードをやりたい場合、メジャーなやり方ですと、MQLでEA作ってMT4/5で動かすか、C#でcBot作ってcTraderで動かすか・・・などと、プラットフォームと言語の縛りはどうしても避けられません。

しかし、FIX APIであればプログラム言語は自由ですし、プラットフォームにも縛られることはありません。自分の得意な言語で好きにチャレンジできるというのはメリットかもしれません。

まぁ、実際はFIX APIのみでシステムトレードというのは現実的ではないですし、FIX APIの使い方学ぶくらいなら MQLかC#を勉強したほうが早いような気はしますけど・・・

しかし世界標準のプロトコルで市場に注文を出せるというところに魅力を感じる方もいるのではないでしょうか。ここではそんな人のために簡単にFIX APIの使い方を説明したいと思います。

 

なお、ajinoriもわかってない部分も多いため、変なとこあったらツッコミお願いいたします。

 

 

FIX APIの基本的な仕組み

決まった形式のメッセージをやり取りする

仕組み自体は特に複雑なものでもなく、こんなメッセージをバイト配列でサーバーとやり取りするだけです。(下記で | で表してる区切り文字は実際にはSOH文字が使われます。)

8=FIX.4.4 | 9=133 | 35=A | 49=fixserver.10101010 | 56=CSERVER | 57=TRADE | 50=TRADE | 34=1 | 52=20210416-02:21:25 | 98=0 | 108=30 | 553=10101010 | 554=password | 10=008 | 

これだけだともはや暗号にしか見えないと思いますが、ちゃんと決められた形式通りに情報が並んでます。ざっくり説明するとこんな感じ。画像が見づらくてゴメンナサイ。

headerにはメッセージの基本情報が入ってます。メッセージの種類(メッセージタイプ)や送り主送り先、時間など。headerの構造はメッセージタイプによらず基本同じです。

bodyには情報本体が入っており、メッセージタイプ(headerの35タグ)によって構造が変わります。Trailerはチェックサムが入るだけ。なんかIPパケットみたいな感じですよね。

それぞれ一つ一つの情報は |タグ番号=内容|という形で表されており、タグ番号を見ればそれが何を表しているかはわかるようになってます。

例としてheader各タグの意味は次の通り。

BeginString 必須 FIXプロトコルのバージョン
9 BodyLength 必須 メッセージの長さ
35 MsgType 必須 メッセージの種類
49 SenderCompID 必須 送り主。ブローカーIDと口座番号を含みます。
56 TargetCompID 必須 送り先。メッセージを受け取るサーバーです。
57 TargetSubID 必須 送り先追加情報
50 SenderSubID   送り主追加情報
34 MsgSeqNum 必須 メッセージの番号
52 SendingTime 必須 送信時間。日時は上記の形式で記載します。

35タグの示すメッセージの種類は以下のようなものがあります。

Heartbeat セッション維持のための信号
A Logon ログオン
5 Logout ログアウト
2 Resend メッセージ再送要求。
V MarketDataRequest 価格など市場情報要求。
W MarketDataSnapshot/FullReflesh Vの返信。全部入り。
X MarketDataIncrementalRefresh Vの返信。差分のみ。
D New Order Single 注文。

ちなみにこれはほんの一部です。メッセージの種類は全部で100種類近く、タグの種類は1000種類近くあります。詳しく知りたい方はこちらの公式ページをご覧ください。

もちろんちょっと使ってみるだけなら全部覚える必要などありませんし、私もさっぱりわかってません。

 

プログラムでメッセージを作ってサーバーに送り付ける

実際の使い方はというと、上記のメッセージをプログラム内で生成したら、普通にSSL通信でも使ってサーバーに送り付けるだけです。

ここでいうFIXプロトコルはアプリケーションレイヤーのプロトコルなので、メッセージさえアプリケーション内で作ってしまえば、あとは既存の通信方法で普通に送ればいいのです。

利用の流れとしては、

1.最初にログオンメッセージを送る→ログオンの返信を受けてセッション確立

2.定期的にHeartbeatメッセージを送ってセッションを維持しながら、価格取得なり注文なりやりたいことする

3.終わったらログアウトメッセージを送って終了

メッセージ作るときの注意点としては、ヘッダーにいれる34番タグのメッセージ番号は必ず連番でふるようにします。

番号飛ばしてメッセージ送るとサーバーからResendメッセージが返ってきて、間の番号のメッセージ送るよう要求されてしまいます。

 

返信のメッセージタイプも決まってる

メッセージを送ると、サーバーからも上記の形のメッセージが返信でやって来ます。送ったメッセージの種類に応じて、どんな返信が来るかも決まっています。

例えばクライアント(こちら側)からサーバーにログオンメッセージ(“35=A”)を送ったら、サーバーからはログオン成功ならログオンメッセージ(“35=A”)が返ってきますし、失敗ならログアウトメッセージ(“35=5”)が返ってくる、といった形です。

受け取った返信内容を読み取って成否判定をしたり、処理をしたりすればいいのです。

 

 

cTraderでFIX API

やっとここまできました。本題です。cTraderでFIX API使ってみようぜ!的な話です。

 

cTrader FIX API

実はcTraderアカウントをお持ちであればだれでもFIX APIを使うことができます。FIX APIを使って、cTrader口座で取引をすることができるのです。

この場合はcTrader 用のFIX APIを使ってcTraderサーバーとやりとりする形になりますので、ブローカーごとに仕様が異なるということはありません。参考までにcTrader FIX APIの仕様書はこちらです。

 

cTrader FIX APIでできること

現在の価格や板情報などの市場情報をとったり、各種注文出したり、ポジション確認したりということができます。逆に言うとそれくらいしかできません

口座情報を取得したり、過去の価格情報を参照したりといったことは一切できません。もともとFIX API自体がそんなに多機能ではないんですよね。

なのでFIX APIを使ってシステムトレードをする場合は別のAPIを組み合わせて使うことが多いようです。cTraderだとOpenAPI2.0というのが用意されてます。

 

 

cTrader FIX APIを使ってみよう

クライアントソフトを用意する

さて、せっかくですからFIX APIで注文でもしてみましょうか。

FIX APIで特定シンボルの価格を取得して、ボタン押したら最低単位で注文するだけのテスト用cBotを用意しました。ソースコード付きです。

ダウンロード後、ダブルクリックでcTraderにインストールしてください。

ちなみにAccessRight.FullAccessが必要なため、起動時に警告が出ます。不安であれば実行は控えてください。興味があればソースコード読んで理解してから実行すればいいと思います。

なお、cTraderの開発元SpotWare社が公開してるFIX-API-Sampleを参考に作りました。こちらはWindows Form のアプリケーションです。ちゃんと学びたいならこちらのソースコードの方が勉強にはなるかもしれません。

 

接続情報を確認する

まずcTraderの場合、設定メニューの一番下にFIX APIという項目があるので、ここを開いてください。

接続のためのパスワードが必要になるため、ChangePasswordを押して適当なパスワードを設定してください。

 

接続情報を設定する

それぞれの項目をcBotの同名パラメータにコピペしてください。PriceConnectionとTradeConnectionはどっちでもいいです。一番下のSenderSubID以外は同じ値だと思います。(違う方いたらコメントください。cBot修正しないと動きません。)

 

起動してみる

正しくパラメータが設定されていればcBotを起動すると、チャート真ん中下部分にBidとAskの価格情報とSellBuyのボタンが現れます。(価格情報がcTraderと微妙に一致しないのが謎なのですが・・・何かプログラム間違ってるのかも。誰か理由わかる方いたら教えてください。)

ボタンを押すと最低発注単位で注文が入ります。本当にポジション持ってしまうのでライブ口座の接続情報を使う場合はご注意ください。cBot動かしてるのがデモ口座だろうが、バックテスト環境だろうが関係ありません。接続情報がライブ口座ならその口座に本当に注文が入ります。

cTraderからポジション情報を見るとチャネルの部分に”FIX”と表示されているのがわかると思います。

また、(価格取得以外の)FIXメッセージを送信受信ともにログに表示させるようにしてあります。トレードウォッチのcBotタブでどんなメッセージが飛んでるか確認してみてください。

 

ソースコードいじって遊んでみる

たぶんここまで読んでくれてる方は少なからずプログラムにかかわっている方だと思います。是非ソースコードいじってみていろいろ試してみてください。コメント多めに入れてあるので見ればなんとなくわかる部分も多いはずです。

今回はUI作るのが面倒だったのでcBotの形にしましたが、cBotである必要はまったくありません。プログラムのFIX通信部分はcBotを起動させたcTraderからは完全に独立してます。

例えばAxioryのcTraderで起動させていても、パラメータさえTradeView口座の情報で設定すればTradeView口座に注文できます。Indicatorに組み込めばIndicatorから発注させるなんてこともできちゃいます。

FIX通信クラスにcAlgoの機能は一切使ってませんので、コード中のFixApiBaseクラスとサブクラス丸ごと自作アプリに移植すれば自作アプリからでも発注が可能です。

あ、一般的な例外処理とかエラー処理とかもろもろ省いちゃってるので、もし実際使えるレベルまで改造してみたいならその辺も追加してくださいね。

 

あくまで勉強用として

いないと思いますが、本格的にFIX APIで開発を始めたいという方はこれをベースにするのはお勧めしません。

FIX APIでトレードソフトを作るのであれば、おそらくQuickFIXなどのライブラリを使って開発をする方が一般的だと思います。

あくまでFIX APIの勉強用プログラムとしてご利用ください。

 

 

疲れた

「ちょっとやってみようかな」のノリで始めたわりには、思った以上に手間をかけてしまいました。

今回はじめてFIX APIを使ったプログラムを作ってみたのですが、作ってみた感想としては・・・あえてこれ使わなくてもcAlgoでいいかなぁ、と。

「いやいや、お前はFIXが全然わかってない!」とか「FIX APIはこんなにすごいんだぞ!」とかありましたらコメントお待ちしています。


まだコメントはありません

新しいコメント

コメントは承認後に公開されます。承認まで次のコメントは投稿できません。

cTrader's Life

© 2026 ajinori