1111011100010011011000011100111111000001100010001001010000100010010010001000000001010100001110110111110110111111101101111110100100010010010011100100010010011101100101011101001010101101010010110000111010100111110011101000111001110000100011100010011011001100110010001111101110110001110001011111110111111011011010010010110010001000100011111011111010100110100000100100001111111001101111001011011011110110 1111110001110011010010101100100101011011010010101111101111111000110001110101010011101111000110100111101000111101011011000011011011101010111001111011101111100111111110111011110010110100101001100101010100100111110000001100000111101100011111001001100010001001110111111101011011000010101011011000101110001101000001000010100000110100110110001101001001011100011111001100110001111010101101101010000100100000 0010100000101011111100010111010001000111000011000001111010101000100001100101111100101110100100000100111010111101010111111101111000001000011101010101101110101001101011010000000011011110011001000010010001101011010010010001110111101000101010001111011001100110011100101000100010001001000001110011111101000101011011001001000010011110010110100001000001000000101011001000011010000101100100100110110000111010 0101111100011001010001111011001101000100101111111010011110101010111001110100101001111110100000010001101000011111100100110000101010110001010110111101110010000110011001110101111001101101111011011110100010101111111111000101010110101101010110111011010010001101010111001101100011110010100010100110111000001100010111001010000001011111011001101101110010101010010000111000100000000000011010110010010111110111 0101100001101110010011000111101011101110100110110111000000000101111000101101101000000011100010110010100011110010100101000010101111010111100101110010001111110111111110110100100011010010110011110011000010011010011000110011101011100100110110111101011011010100011111111110001000100111000011000111100111011001000010110110111001000111101100111010111011101110001010001101111011010001111110000010111000001100 1010101110100001110110010001110110011101110100110001101100011010000011000011010100010101111000001010001101010100010100000110010110001000001000100001010100111101010001111110010100011111100111000010010001111111101000001100111010100101100111111110111001100101111000111110010111110010000110011001101000001100011001110011001110101110011101101000101110001001111000000111110010101110011110010111001100011011 0111011000001111101010100001010101010010110001111001011010110110111001100011101101000101110010111100010101010111100101010111110000011111011010001100000010101100101110111000011000110111101000110101010000010010000110011101110000100100010111010010001111100110011101111110111010010101100000110000011100100110101111010001011110010011110011011111011110010010001110110010000011001110101101010011011111111000 0011010101011000110000110000101011111000101111001011100001101001100111101100111101101101011000111001111011110110101111010000010101101001010011010111000100010100111101001010001110010000010111001000001001110111110100110101001110010011010000101101000101001101101111110001001001101100111011100001000111010110010001000111111000001010110010110111001011111110010100111001110111001000100011011101011011010011 0000101100100001011101110010001101001110000110001100111100110001110010011101111010001101111101101111110111010011000111000111011010001010010000000001101100001111011110100101100111110101101001111100101001000100111000011001100000111101110100000000001100010111100111011101010000001000001001110001001000100010101000101111101011100111011100110010100101100100101010001101110111111111100001010111000011110011 0000110000101001010101100111001000111110001110000111110110001011010111111000001010101110000011100010100101101001000101110000011001010011011010000001000010010111111001111111111010000111100110111010111100111111111000101011001110111010100001100110110100111100010110011101100101111011101010100001110000001001101100111011011010000100110111011000110000110111001010101001111100011101110010110001000000111011 1000110000111111110100010001000111011010010001010100011011001000101100111100011101010111100010011010011001011111101001111000101100110101111000011101111111011010101001100110101001100111110001101000011001011101010011000000100101110101011111110000001100111101001110001110111001101101010111101101111110010011111100001111010101110101000011101001100010110000010000011011011100010101111100101111011110001110 1001111010010100101100011001111000111000011101111100001111110100001001000001000011100000100011101111110100100110011010111100010111001000001100101000110100110011110101001110011100110110011011000011001101110101010101001000110110010111110111100100001111100011011110011101001111001100101010110110011111001001111000000010000001101000101100101100101011001011110101110100110010011000101110111000101110111001 1111101010000101110110110110100011010010001101100100110011011010011011100000100010110111010100110110101011000101010000110111001110100001100100111111110101010000100101001101101001100110000001000100011001000110111011000111010001110000000100011001110100111100100000110010111110101110110010011101001100010010000110101001110100110011111001000101110000101010101110100000001111011110101100110110101100111011 1011100010101001010001100110110101001010000010101100101110000101001000110100111011100001011010011000000011010011110111110011101101001110000011011101101011111111101010100010100100101010100101010111110100000001000101010010011011001111000010000101111100010011100100110000111010000000001111001110100111010011001000100001110010100001000010011010110001000101011111011001011101100010011110011000111000101110 0111010111110100101110010100100010010011011111001000101100101110110110111001000101011000011000110001110000001010101110011010111111110100011110010010101101011010010000100000011110100101011001110100111001011011100010001011001000001000111110110101001100100100011110101111001100101111110010100001101110011011001011001011011101000101001010011000001110011001011111100110100101100111101110000101010011011011 0111010110110011101101110101000101010111101001100010110001110010010101010110011010100101011110110110010111101001110000010100011000001111001001001011110101011000110000100100001000101010011110001011001111101000101010010000111111110111001111000110110101011010101101111001001101100111010001100111000001110101101011010010001101101111010111011101010001110110001110010000000100000110110001100100011000100011 1000101111011100110000001001011001100100100000010010011111100010010110001011010101010111110101101101011000000110100111010100111110001001111100111010111011100000111000011011010111001011100111010001010010101110110011001000010011011111111101010001000111110101011100111101110001110111001111110101000110100101101110111010101001101100110110100110111000010110110011000011010101100100110000001101000101100011 0100100000010111110111001100111101000001001010000001101011001101001011110100011001100111011001101001011111101011000111111010011100111111111111001011011011111010011110000111110010111111110001100010010100110111000000000100100110001000011000010100111001111001010000111011111011011100000000101001100111011111100110100001000100111111111100111001000100000011110111000110000101000001111011010010111110100100 0010001011000010001110011000010100100101000001011000110010100101110110101010111111101111000011011010110011010110110111010010011111110000111111110111101111011110111111011110000010100011100110010001000111011010001101111000111000110101001001001111001000111011000100010111110001110111001110001010011101010011110100001111001000100111001110110101001111110100110010111101110000100111101111001000001101100101 0001110101101110010111101001001000100111001010100110101010011100010010101001110010000010110110000000101011001110000011000111100110100100000010011011111001000111111001110000111100010100110110000100100110011111001001010011000110101100000101101111100000001011101111111100110100111010100001111010000111101001010110100110100110010110111111010110010011110001111110101001101100000001111000010000010101111011 0010100001011110010111100101100001111111010110011100010001001000100110011000110110011000001001000011110000111110101000101111011011001111100010100011111100111011100001101011010100000100011001111011000010001101010010101110010111100101100110011111011110011110101010111000110000011011000011000111100101100000001101011100101001000100000000001100111010000111010010111110100010110100100011001110011100011101 0111001000110010110010110100110000111110111101011110101110010111001000001010110101011000000010010000100001100110010000010110100100010100111100011010010101110000110010010011101010101110000101111110110001010010110101100000010001000001010100101001001100111011011111011001000001100100111001101100011110100001111010100100101001010010100101001001100100101001101001010010010001000011011110110010100110001000 1101100001011010110100000110100100000011010110000100111010110100111000110100110100011101100010110101101010011110101010101000101011010001000000100010100000010010011111101010101110110101110110000101001100000011111000011110010000101100000111100011000011000110100111010001111000001110100010000010010100111111010100011011010011011001100000001000110010010010001001000100011110100000000110000000010101101101 1001010100010111100000100010111011000001101101000111101111100111110001100001111011100100001111100100110101011000001010010101111100001011111000101110010100101101001100100101101011101000110111100110011000011110000010101101101011100001110011000101001100110001011100100000100111011101111100001011111100000001011010001111000101100111100010111100011011100001011101100110010001000101111011111010100110101100 1011000111111110100010000001010100111101010011100100101001010100011010011000011010011000000011011001000110010000011111001011111110011011110000110011101000011111100110011110100111001000011110111100101011011110000110000011000010000011110100100110101110000011011101001101110101011110100111000000001000010111010000101101111111101101010010111111100100010100010100010110010111100000011111010111001110100010 0000011000011100101111010101111111001101100001111001000101011000001110010010110110101100010110000010010111010001101010010001000011101011111011110100111100101111000001001111100000001100110010010001110001001001000101101011101001001001110111111100010011001001111110010100111001000001000000010010000010110100001100111101010001010011100001101011111110101001011001010001111101101111111001101011101111101101 1110110100100011111110111000110001101011110101001010101100001011010110010010111111110000000101111011001111100100110110111100100010011111000000101010100101000010110001111000000000010100000001000001011011111010101011111001111010010110100010101001010111010001110100101011001100001101001111111011110100010011011100011101010011110010111000101101111111011100111101011011010010011001010000011101010010011110 0010000001000101110101010000011101010111111110000100001100110100111001010010010000000011101011000101001001000100001110010111110100111000011010101000111111000010011100001001100000010001001000010111010000011101110101101110011001001001010010100111111011100111011110011011101101111101110011000000110101011100110011011000110110000000000011011011100011100110000000011000111111110101001101111010000111111010 1011100101110101110011100001101011100110000000100010011011000001100011100001000101111110011001110101011010011000011011110110110101010000010100001101010110100000101101110011001111011110000100010100011000000001100101111111110010000110010111011100000000000110100001100110001100100100100110110001111101100100000010001000101100100001101111111011100101111100001100111110011000011001110011101110001110011100 1101000000000000010011101111010111110011000111110011000100011011010000101101000101100111111101101001001110011001100011101100010100110011101110000111101011100111101101001000011110100010110111011010001100100011110111010011000110111011111011001111010010111100011000000011001111110000000010111110111110101110011101111010010010101101001110100110000001010110111010110010110111111110000110101111101111011010 1100100011000111100100111010100011001011101010110010011111110011110001111100000000000011000110101011001001011010100110011000011010111010011011101011111001000001000110101001111001010110001110101101100110101100001001011100111101000111111001000100001110101011001001100011000110110010111000010010000011011010100100001011100000001011010011110100010111011101011011001110101001100001110111101001100000011111 1110000100011001110111011110101101111011000110111011010111100100000110110001110111110011010001100000110111001001110100010110110100000010010001110001010010010001100010001111000101011101110000100000111110111010011100001111111011111111010100001001101111010110010100010101100100010101000001011101110000011000100110100111100000011011001001100011000110100010100010100011001110111001010100100101000100011101 1101000000001010100111000011010111110010101011110101110011101111010000010110110000111010110100100110001101111010001011101010000101110110000111001110111101101000100100111010000101111001011101000110010101100001110101111101101111110111111000111011100001001110001010101111001011010100000010110111111110111110101001101111010110100000111000001000100110001011111100101001010110010001100001000000101010101110 0001011110110011010001100110000111100001001000010101100011100011110100011000011111000111010100001110001001010111110101000001100000010110100011111001011110001101111000100000010000000100000100010111010101111110001110010110000110010011111001000001000010000010011010000110111010110000010100101110010011000010010100010111111111011010110110011001001010000010010110010010000100011010110010101001110011010101 0011010110100010100111101001010011110101111101011111100110101000011010010000010001101101000011011001001101000111001000001011001010111110011100110000101101111111110011011011001100011000111000111001001110001100110010010110110000111011110001000100100100111111111000011010010100000100100101101110001100110010100111101000101011001011010110011000101110110000000000110110110111101101011000110001000010001000 0110001101111010100110100001100110111011011111101000101101111111011000010100110000010011001101000101100101100111101001011001100111111111100110010001001001101101000010011111111010000011110010010100101100111010110001010011111111001110011001111101100101101010010000001010000100001100011010100010110001100100111100111000010101000101000110110100100000000010100100100111101100111100110010101100001101010010 0001111011010001000101100001010101011000101100111011001000001101010111000101100001011011010110010110101011000100101010001100001100001101010101101100001000011111111001011101011001000001101001100111110001101111000010101111001101011011100001000011000011111110011001101000000110010001011100100000110101100101101001011010001010001111100010000000111011000111111000010010111011101111010011101101101010000010 1000011111100000101010010100111111001011101011111100010101111100101100001010101101110011100100011101110010010001001100011000001110001011100011100011010011011101101010100010101101010010000110011100010101110110010100011101001010000111110001011011000001101101000101000001100011110100011010110010001000010110011101101100111100110011010111111110110110000100111010101000111010000000111110000110011111011000 1100100111101100100100100000000000101000110101100111111111010100011010011100010001011110111010010000000101100000111110011110001010010111111111001001001101110111101111101110100101110000011011011000001101001111000010100000100100110000101001111000011110100111111101101010100100100111111111101111101111011010111111110100100000100111011100011101010110101110000101011101101100001110111010101010010100110111 1110111101110010101011000010100110010101101010100100100111010001010001101010000101111110011010110111111111000110101000001100101100010100010110101101001010001010010011010101001001010100111100000010100111111101000011010101001011110000111111000000110100010110011111100110011100111011100010010010001001100110100001100000001100111011111010101101001101010000011001001100010001001010000101010101010111100110 1011111000110110001100001001010101001110001110101110010000010011111101010100010101100110111110101011001001101000000111101000001010110100101111100110000010111001010100000011001110010000100011110011000101001110001111101100101001000011001111011001001000110001111000101000011111100010111001011001011101101100010110011010000111101100101100001100001011101000000100010101100100111111101111010001011001110110 1111010000111100110000010010110110011000000010001101011010101011010000100001001000110100000010100011100010000111000110111000011000100010100111010110001101110001101000001101000001111110011101101001001110010010110100000101100001010101111100101110110010001111100000011100101111110100111100001111001010000100100010100100001101000100111010011010010111001000110101110110101101000010011010101001101001100010 0111001010111011111011100001110100011011101010101100101010110101001001110101011000001101101000011101111100011000001001001100010101101011000000110010111010100000101111110110001001010110001111001100010101001100001100111101001001000001101001111001111110000111010110110011111000111100110101001011111011101110111010011110011100100010110111100110011111001011111000001110111111111000001001110000010000100001 0010000010111110110111000100010111100101000111101010000101100011101110101100011001000010101010011100010001101000110011101011000100010100101010100111110001001100111110101001100011010011001010101111110100101011101010001001000001110100110000000111101110001010011011100010000110011010101111101110110110101011100011101100101111010000011011100000001010011101001101110010001011001000111100001001110110000110 0111111101010100011101001001001101001110101111011101111010000110100101011001101001001100011100101010111100111001110000010110100011001011100010111101100100011001000110111000011101010011001001111101000000000110100001111111101100000111010101001101001010000101101100000000111110001001011011111100101011000010010101011000100100011100010000001111111110101001011011110000010000000011001110111011100001100101 0001110111010011001011111110110000001100010101000111001101011011110011000111011110011100101001110011001110001011110000100100111100010010010100011100011011111110111110011011010111011011000110100001010010111101011110001110100001011100101111001000010001111010000001000110011011111100011001110011101011011100101111111111001100000011110000101101100100101110100000010000111110101101010111011110011010001000 1011011111110001111101010111010000101010001110100011000010011011010110010010011011010011011001000100011100101110110101100111000011110010010000000110110110001000010011000001101111110010101010010000001111011010011011001101110001111000010111000110110100101110110010111000010111101100011011110010001100100000011011010000111111001010101000100111001100100011101000011111111000000101111100010101011111000110 0101011010111000010100001010111110101000000011101110101000011100010100101111100101011011100011110100001000100111100001000111111100000000101100010101110100010010011000100110001010101000101000010010110010010110000010000011100110100000111010111001100001001110111011000110011110100001000101010001111011001100101001101110001111010110010111101100000111000111100101010001011110001000110001111100101111101001 1111101010001110101111011001110000101001011000011100000110011010100101110101111011010100101000001000000100111111000010010110110100001111010001010100000011001100110101110110000000000011010111000000101101001110100110011010111000101101010110100100110010000011001100110101010100011110111110000010111111110111100000111100111110101101110001100110010000011010101110101111101110111011010110110001001100111010 1110111101001011000111001110011100000000010100110101010001011011010100101010100011100010011000100011101110010101111110100110110100001110001000101111010111101001010010110101000111100000010100000001001000111100110010111110111111101001110110111011000110111011011011000111101101101011010011101111001011101100111110011100101111000110111000000010110111010100001001100100000101010100101100010101101100111100 0011011010101110001101000111111100000100010010011101111111110111001110101110001111101111011111101011010111101101000001011111101111111010010011010000101000010111111001000111001100110000110000001010111011010011111010001111100010110101011111001010101110100100000001100010110101110110000111101011000010000100100100001001000111110101010000100110001100001110101011001100010010111101100001010110000111001000 1110101111010100010100010100101000101001011100100111111000010101101101000000011001001100010001110101101111011010100000001100101001111101001011100000101100100100000111001100101001001111000100111111110111100101101011011111110110110010000100001011110000111100101100000100001101101001101100010001100000111000000100010101010001000011110001100010001101100101100100000101010001100101011110011101100110000010 1100100100101001110111100101100011001101000101101100100101110111100001001011001111110000000101001110011101000010111111111011011101000000011001011000100100001001010110101010011111001100111010100010001001100000000010110111000111100110000100010110100001010011110001010001111000110110100010100000010001010110110101100000101001101010001010000011000000111010101100011000000001000101000100011110110010111101 1101111001100110000101001000100011101000101000001101001001111010110101100000101011100110110001011111011110010111001000101111000000000011111001111111100011111101101100000111101011110011001110100001010000101110111011100110100101100101011011010101101101110000011101111001101011111010001111001101100110100010011001011011011111100011000010111101011011000100101001001000101011110000000100000000110111110110 1010011100111011000110001011001011110111111100001000111111110111011010000011000110001101111101111110000010010100001011111110011001110111010011100110000111111110100000100101001000001100001011111010101101110010011010010010101000100101111111001110010000010110111111101111111001101110111001110101101011000000100101110100010011010111011010101111011101110100100001010100010111111110001001100001100000001111 1100010000011111101110000101001100010001110010110101100100010101011011110111100101011010100010001101011011101011011101011010101001110110011111110011000110110001011111011101101110001000011010010101111110001000101110000111101011111111001111010010101010101010110010101101000010000000111011010010101111101111001110110000011100101111111000110000000100011001110101111101101001000100001001011000100101000110 1111110000000100111110110010101101001001001001111100000010001111001010101000001000000111110001010101110010100110011000110000110111011101110101101000000001110010010110111110001000111000110000001011011010000001000011100000111111010000001100100000000001001010011100010000011100111000111000011001110010100001100010111000100110101101100111011010011001000010101001101001100011000010010110010100111000110010 1000000100010010000011010111011010110100001001011100011110101101000011000110111111000011011010110011111001010111010011100100111111100010011011111010100010111001001111101001010101110111111001011111011010100101100000011011001101101000101100010100011110110011101010100001111001100001001110001000010111010111000000111010011100010101110000110110001110011000110110110010000101101100011110110110011110011000 0101001010010000101010100110010000001101000101000000010001100100010110100110010110011101010100011000100010110101001110001001101101111110110101011111010001000011111100110111111011010110001001100001110111011011001001110111100001100000111101110000000010111101010010101101001101010100010100000100101100000100001110111000110100111100110001011011100100001111100010101010011110000010001011011010011001100111 1100100100010101001011111001100110110101101111101011001010001111110000000010000010111101100110101111101111100011111110101011010100001100001010010010100010010110111101000011111011001001100011111011011010100100011111100101000111001000011110101011111100101001111100110101000010100111001001011111000111110001011011110101101010010001100111000001110111000001000011111100110000000100001110010011000000100110 0010010100110101110010011010100110100101011101011010100110001000010000111100101001100110011000010100000100001001101000110111100111100111010011000101011110101110010010000001101001001100110110000000101011111111010101000101111101111110110101111101111000011101010000100010010000010011001101111001010111010010000110011000000100010001000010000100011010010101101110011111111001101000000001110100001001101010 1111000000101100111100000111110110111101011111110111011000100001010000101011001001001011100010011111101101010100101011001001101010110101001111100101000110001001110110000000001111100101111111000001010111101110010101111011001110001001101111111010101111011101110100111011110000001001000110110111010001100111100100110010000001000011110001111000010100001010000101001011010000000110000110011010111001001000 1011101111110101100110010101000000111110111111010111111001111100000000101010001000011111100000110010011010111101111011110101011010111011101111001010011110011011000010100011001100010111111110001111110010010111100000110110011111110101101000100000100110001011100110011101001100011010010010010101001010001111111110001101001000000110010010010110101110110100111011111001101001010010000101001110001010010011 1110111110010000000010111101000100010100101100010001100110010011110010101101101101111100100100001110000011000100000001111001100010110010101101011100101011100001001001011100010001111101011010101111001001100000101111111110010011001011110000101111100000100001011000001001101110001110110011000100100001111010111101110111111001011001110101100010001101010010101011001110110001110001011010010100100111100110 0101000110010101011000011000001010110110011000100111001001000011011110011101100011010010110110000000001000100111110101010010100111000001110000111111000010001101000011011000000001000000011100010011100000011001001111110100010110110011101111100011010100001101110110101101111000101010001011110100010001000110101010011000001000110000011011101010001011111111000100011001011001010001100101111110100000011010 0000011010010011000010100001010000111000011101111110000101000000011110011101101011001110010101100111000010010101011000011110110110001100001001010101010111110110111010100010011000100100111100000101101011110101000011001100111001100101000001011101100010000110111001101101011000001111011000000000001010110011110100101110101010100001111011000110000110010010000110101010101011000011100111110011000100001001 1111001101011111111101110101010111001111011001011011011010011001101101111110101010011000011001111111000011001100110011101111011001010100110100111011110110111111101110010001011110001000110110000001110110110110101001111011000010111111110011000010101000110000101011111000100110111011101101010100101001000010010000110000010110111110010111000100010101000110001110110001111000110110001001100001111001111001 0000110101101001000000011101111011011110000011001100010110000010100111011110111001111111110001110100101001101110000101001000011001001001001011001001110000011010101000010010000111010001001110011110011010100110100101000100001100111000110001100000001001110100010111011110110011100111100001011101111111010101000010100111010110111100000011001001011110001100001110101000100101110101011100011101001101101110 0010001101010100011011101011010100000010010111000001101011110100001000110110000010111001100001101010101001110000111000010000110100011110001100101010000011100111100011111011110000100101110111110011110010000100010111001101001001010101010110111101101101011100101100111111110100011001110000110011110110100001001000000100010110010111000111011100111101001010111010111001001101000011111010100101111000111010 1100010011111001110101010010000001110110100111110011111101001010001010011111010000001011101101110100111010010111011000110111011100111001100110110011101101000110001010000001110111100101011000011110101111100101000010000000111111111100110000010000101011001111010101111111001100011101000100011100111100000010100101001001111110001110000100000110011011001001110000010001100101010110010001111110111101000010 1100000101001011010011100000011001001101110011100110101110011001011001011011110001000001100110000100010001000011111011111100101101001100101100101000000001110000101110000000100101100011011101100010101010100011001100100000101101001100001100100111011010011111101001010111011101011000001011101101001101000111100000100110000010110100011110101001010001100101000010011110010000011010100011001110100001001010 1111011111011000111010111001100011000100001010101110010101011101000111101001100111100100000011111110110110000101001101011110011011111101100011001101010100011101111111111101001011001010011101100100101110111110100101100000110111001011011100100111111100001111000100001110000110010100010111111000011001100011011110110110010100001110000111111111001011011010000001010001011110110110110110110110011111010010 1101000111010100010101001100001101000101110111111001000110010010100111110011000001100001101101110001000011001001101001011101011100010001111100101001101111011110000001110110110000001001110010110001010100111101011010001000100000011100111100011000000110000001010010110000001101000110101000011110110010100011100100000001000011110110010000000111110101001111101000111011010111001110010100001011000111111001 1000001011101011010011000001110100111010000100001001101110100011100001111110101110100101010010100010111011111100101111101000110001010110101111110111001011100110101110110000000100100101000111101010001000000110110101001101000011101011011011111110010001011010111000100000111011011011001100000011110000001110101010101101100101110001110100111100011110100011100011111000100110100001010101000100110100001011 0010010110110111011100001100011110010010111101010101101001111010100111000011110101011001101111000110101100110101001010000000011000111111100101110110010001110011101100000010000101100100000011011000111011111110101100101011111101011011101001111101111111101001000010111001000001111101101011101101011000001000000100011010000110010110111011100101000110001101110100101001100000000010000111100011101101001011 1111001000001000001001011010111100001001100000101011000000100110110011100000110000001010000100000001011001011000010010110010111011001010000101000111000000001001011100110001110110111110111001001110010110010100011110100110100100100100000111111001000110100101101100100111110111111001011111110101111010000010011101001110010110000100001001100100101011101110100100000010111101100000100010110110010110010001 1100100011110011010101110011001100101001100000000110100000001100000101101001010010101010101100110000010000110000001011001100011110111001101110001001001010111000110011110101101101000100000011100101101111110110100110101111111000101001101000001001011011000000000001101001010010000101001001101101111000010010100011011110001100100011110001010010110100000111111110001101100111010100000000001101011110010011 0101000111100101010011010101101001000010010101011111111011111110111010010000000011000010100111000110011001000111010000110010000111100001110101111111001010010011000111000010110010000101110100001101101100010001010101110001001010001001111111101000011111100100001000100011100011011001000101011100110110011011110011000000110001000110110001011011010110010100011111111110100110110101010001111010011010100100 1101000111000011010011100001111000111101100000010110011000000110010010011110110001110011000101111110011010110010100011111100101000101011001111100110100111011011000010011001100001100010110111000010100000111110011111110001111100001101111101111101011011011001010000001011010110000010111100110111011110100110110001111110011010011100110110101100101011111100011100010010101101101001011010000011011101011001 1100101000111010001001011001101110011011111110110111010011110100010110100111110100101111111000011100000110011101100011100111111111111000100110000110011100001110001010100001110000101001111100111101011111101100011001100100001110011011101100111011000100001110000011010011101101111110000000001101001110011000001010010010110010110011011000001110100000111011101011110000101101100011001111010000011010111101 0011010100011010101111100101011100001001000001100101000000000100110010011101010110010000010001100100000011100101101100100000110000011010110111111010101001011010011000110111110100100101010011110110010010011011101001010001100100001011111100001101000000010111010001111000010011010010011101111001101001101100000111011100110110010000011001011001101011101101000100111100100100101110010010000100111111100110 0001010100001111010010011000111010111111100100101001001010000110100001101100101100011000011001111010010101000101100011000000011111101000100111111000100111001111101110010011011000100100111111111010110001110100111100001001101000011010100010110011101110100000101100101100111111011100011011000010111000000010010000111000011100000000110111111110100100110111101111110110111101011010000011100100011011100110 0100010001001001011001010001100101110010010101010110001011110111010001101010101111111011110100010110101001001101000111101000000101011111101111100100011101000110110110001100101100011000011101011001001011011101000011101110001011011011111001111001001001111010100110000110010000000010100010100001000000111101010000000001001011101110111100010100100101110001011010111001100001111101001000001000100110000011 1001010001001100011110010110101000110110011101101001100110000101110001011000101011010000001100001001000111010001100011110011100000000100011101101101101101010110101100000010000011010010001001101011111001110110000101000100110111010110001100010011010100110100100010000111010111101011011111001101010001111100101001010010011100100011100110011000000011100001101010101000011101011110001010000101011010011010 0001101110111000111001011100010111001100111000010001011110111100010101100011110111010001010011001100001101010100101110101101011100110111001101010001101110000101011001001101000101111011111101110000000011011110001010101111011011100000101011111010101001101000010101100001011101011000100111011000101101011011001001110001000010010101000111000111010100111100011001100111000001000101001010101000010101011100 0101100010010001010011110010011110110001010101000100110000101001100010010110101111010010111011111101100100001001110010100101000110100011010110001101110011001111011110111001101111001101110100011000111101000101100001000111010101001111101010011110010110000000100110001101110101100000110111110100101111000000110011110101001110010100101110110010100110001110010111110001100010001001101111110000000000101000 0000111101100001000101011111010100111100010010110011011101010000000100000000100101001011110001000110001110100101101001110100100001100110101101010100001110011110000010101010011001101100000100011101111101111000111110010100001100111110111100011110100001011101001010101010110010111011001111001000001010001100101101000101010010001111011100000110100000000000010010011110000100000101000010110000011101111000 1001100111100110000001101000110110110010011011111101011110010010001010100010010001100100001011110101110100110011110011101000000010011111001100010000010100001111000000110010000010100100000110010000100010010011101000011100100101100100010101101011110010000100001110000000111110111001111111110010100101000001011001111110101110000111101010000100111111111010111001000111110011011001010101101111110010111111 1110101110011000011001000100011011111011111011101010101101101000111110101001101011000110111000011011010000000100101111111101100000000101011111110001001111111000001001111111001110111011000010010001010110010101111100011011010001001101100011001000000110111101111101110011110101000100010011101101011111010100101110111000011010000101101111100010011010110110010011110000100100101111011000110100100001111101 1010110000000000110000000011111110001110001110110101111011011101100100000011110010110001001100011000101001000010011001101101110110110010110010010001111110010100001101100001010100111010010011010111000000011001111010011110001101111111000100101101100011001101100111001011111110010100101101101001110100100000100011010111001011110101100110101010100100010001000101111001110010111001011001100011001100100000 0001000101011111010010110111100010010111011101000010111100000010010111001011001101111110000111000010000001011000011100110110001100111010110111101111101110010100011010111001101011000110010100100100010110001010010111110010000011101001010110011101110111001101001000000010011111010001011010110100110111110010000110100000010000001001100010001111010111111010101101101110101111011111100111110111110001111100 0000111100101101100100010111001100111110110100101100001110001100000111010111100111100001110101110111000000100001111000110101001101011110000010000000001010001011111011100100100000100010100100111010001101001101000010010000111001011100111000101111100110001110101111101110001101101110101101001100010101001110100101010100110101011100111010001001101110010101000011011000011000000000001001000110111111010110 1110110110111100000101101100110101111000000000100100100100000111100100011100000000001011001000111001000110010111101001010111110111100110000110111010011001010011000110111011001101110100110001101001010000100110100111000001010010010011001000000101111101110001100110001000011100110000010000000110010011111011011011011110001111000001100001110010001010110010101001011011110011001101010010110111010110001101 1101001001101011100000101100110110011001111110100000011011011110100001110110001000110001000101011011000100111010010011110011001011111000010100000010111100011000100110001110110000011100100101110110110011001011111100000110010001110010110011000100001111001110100100100100001101110111011110110001011101101011010001011100101001010101101010101001111111011011110101000011111101110000000110111100000001010111 1010011001100010001001101010011110010000001100110100100101110100111101101111111010101111110111010001011000010011100111111101100101101000110001011011011101110110101010000110000011110111111010010110011011101010100011000110110011110010010100110110011010101110000011010101011011111111011101100101000101100010000011001010000101100011010110111111100001010000000000011000001110000111011000011010111100000011 1001110000010110100101110111111111011100000000001000001101101011001011100100001001101001101001011010000101110100100001001011100111100011001001001011111011110100010101101111001001101111010000101001111011010110000110000111100100110000111100010000010110111010110000000001010000011110110111000100101011010010001010000100011101111101101101110011000101100110010001000100110100011011101100101000000011100101 0011000101011101011110011100100101011111111101100010101010001001101100101111001111000010010000110001011000110110001010000010011001100011100010010010011111111101110110111010001000110001111111100010110101110000110100000111011010100000100000010101000010101110100110101000010010111100010001000110000001110000110111010001110111100111010010001011101111011011001000101111011101000010111111100101010110001001 0100000010111110000001100100001001101000101111100111001000001010100111010101001100111010000100100101110011100110110011001000010100010010000110000010010011101010100000010100010111010111000110100011110101110101000111100010111011001010100110011100001000001001110100011011001111101110101001111011101100101010011000010110110100110000101110010101111101011110010110100011101001100110001000011011100110011110 1111010111000011101110011110011011111001001011011101110110010100100010111010010101001101100000001011101000000010011101110010001001010110100110000000000110001101110111110010111101011010010001100110111000110101000001101101010000011010000100101010110011010110011111011101000101010000100011100110111010101001100000001110100111010000010000001010100110000000011011100011000011010100011000001111110001000001 1010001101010111100001000000001101100011111011010010000010111101110010001100001110001101001100100000000110100010010110100110110011001010000010101010011110100100010110100011110100000110010110100100110000001111011101111111011111000010000110000000110001101110100000000011111111100010011000011010010101110010101100111101111100101000000011100000101000111101010100000000110010010111001001001111111010101100
cTrader Algo

【cAlgo】過去のBarsやTicksのロードする【Tips】

4/7/2021

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

LoadMoerHistory

もっと昔の価格情報を使いたい

cBotやインジケーター内で最初に読み込まれているより昔の価格情報を使いたい場合はBars.LoadMoreHistoryメソッドで明示的にロードしてあげないといけません。

少し前の情報なら1回BarsプロパティのLoadMoreHistoryメソッドを呼び出すだけでいいのですが、ずーっと前の情報となるとこんな感じでループ回して呼び出すことになります。targetDateTimeに欲しい日時が入ってると思ってください。

var count = 1;
while (Bars.OpenTimes.GetIndexByTime(targetDateTime) == -1 ||  count != 0) {
    count = Bars.LoadMoreHistory();
}

Bars.OpenTimes.GetIndexByTimeメソッドは対象の時間がBarsにないと-1を返すので、Barsにない場合は延々とLoadMoreHistoryを繰り返させるコードです。

ただ条件式がこれだけだと、最後まで読み込んでも対象の時間のデータがなかったときに無限ループになってしまうので、LoadMoreHistory()で読めるデータがなくなった時点でループを抜けるようにしてます。

LoadMoreHistoryメソッドは追加で読み込んだローソク足の本数を返しますので、これが0を返した場合、これ以上のデータはないということになります。

このコード自体は問題ないのですが、ご想像のとおりものすごく時間がかかります。たぶん知らない人が見たらフリーズしてると思うでしょう。自分で使うにしてもフリーズしてるか処理中かわからなくなるのはあまり好ましくないですよね。

 

ロード中であることを示したい

これをやるならチャート上にロード中である旨を表示させておく方が親切でしょう。ついついこんな風に書きたくなってしまうかもしれません。

var count = 1;
while (Bars.OpenTimes.GetIndexByTime(targetDateTime) == -1 || count != 0) {
    count = Bars.LoadMoreHistory();
    Chart.DrawStaticText("loading_text", "NowLoading..." + Bars[0].OpenTime.ToString(), VerticalAlignment.Center, HorizontalAlignment.Center, Color.White);
}
Chart.RemoveObject("loading_text");

1回読み込むたびにチャート上に1本目のバー(読み込んだ一番昔のローソク足)の時間を表示させようとしています。が、実はこれでは何も表示されません

DrawStaticTextで追加したテキストはcTrader側に処理が戻ってからチャート上に表示されるのです。このコードだとロード中は処理を戻さないため、ロード中のテキストは表示されずに、ロード終了後に消されてしまうのです。

なので、読み込むたびにテキストを表示させたり更新させたりしたい場合は、一度読み込むたびに処理を抜ける必要があるのです。非同期メソッドの出番ですね。

 

LoadMoreHistoryAsync

非同期ローディング

非同期でロードさせることのできるこのメソッドは処理が終わり次第実行するコールバックを引数に指定することができるため、これを利用して連続読み込みを行います。

具体的にはこんなメソッドを用意してあげるといいでしょう。

private void LoadMoreBars(DateTime targetDateTime) {
    Chart.DrawStaticText("loading_text", "NowLoading..." + Bars[0].OpenTime.ToString(), VerticalAlignment.Center, HorizontalAlignment.Center, Color.White);
    Bars.LoadMoreHistoryAsync(args => {
        if (Bars.OpenTimes.GetIndexByTime(targetDateTime) == -1) {
            if (args.Count != 0) {
                LoadMoreBars(targetDateTime);
            } else {
                // 全部読んでも欲しいデータがなかった時の処理
            }
        } else {
            // 欲しいデータまで読み終えた後にする処理
        }
    });
}

使い方は欲しい時間を指定してMoreLoadBarsを呼び出してあげるだけです。

動きとしては

1.MoreLoadBarsが呼び出されたら、チャートに状況テキスト表示して非同期でLoadMoreHistoryして処理終える。

2.LoadMoreHistoryが終わり次第、コールバックが呼び出され、目的のデータがあるか確認される

3.データがあるか、全部読み終えてもなければelse内に進む。再読み込みが必要なら再度MoreLoadBarsを呼び出し、1に戻る

この場合は1が終われば一旦cTraderに処理が戻るため、ロード状況を示すStaticTextが表示されるようになります。

 

 

Ticksでも同様だが要注意

Ticksデータが欲しい場合はまず最初にこんな感じでMarketDataプロパティから取得します。

var ticks = MarketData.GetTicks();

これで取得できるのは直近のTicksデータのみですが、あとはBars同様LoadMoreHistoryメソッドで過去にさかのぼって読み込みが可能です。

ただし、Tickは数が多いため、昔のデータが必要な場合は非常に時間がかかります。残念ながら特定期間だけ読み込むということはできず、常に現在のデータから過去にたどっていく形となります。

そしてここが一番要注意なのですが、途中で接続が切断されるとReloadが発生し、最初からやり直しになるようです。

どういうことかというと

var ticks = MarketData.GetTicks();
var count = 1;
while(count != 0) {
    count = ticks.LoadMoreHistory();
}

このコードは無限ループになる可能性があるということです。

実際サーバーにあるTicksをすべて読もうとしたら丸一日近くかかると思われるため、サーバーが安定してないと結構な確率で無限ループになります。

このような理由からLoadMoreHistory()で何年も前のTicksデータを取得するのはやめておいた方がいいでしょう。

 

 

過去のTicksデータを使いたいときはどうするか

「バックテスターのデータをPCに保存して使えばいいじゃん」

というのが公式の回答のようです。

どういうことかというと、バックテスト上のcBotでGetTicksを呼び出すと、そのバックテスト内時間のTicksデータが返ってくるのです。これを利用して

①内部でGetTicksして読み込んだTicksデータをローカルに保存するcBot作る。

②そのデータ保存用cBotをTicksデータが欲しい期間を指定し、バックテストで動かす。→ファイルが出来上がる。

③別のcBotから保存されたファイルを呼んで使う。

ということですね。言われてみれば確かにこうすれば可能ですが、ただ、配布するプログラムではちょっと使いにく方法です。ユーザー側でTicksデータ保存作業もやってもらう必要が出てきますし。

やっぱり特定期間のTicksデータだけ取得するメソッドが欲しいなぁ・・・


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

新しいコメント

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

cTrader's Life

© 2026 ajinori