#include <stdio.h>

int main (int argc, char *argv[]) {
    unsigned long crc;
    unsigned int inputByte, inputBit;
    int i, j;

    if (argc < 2) {
        return 0;
    }

    crc = 0;
    if (argc >= 3) {
        sscanf (argv[2], "%04lX", &crc);
    }

    for (i = 0; argv[1][2 * i] != '\0'; i++) {
        sscanf (argv[1] + 2 * i, "%02X", &inputByte);
        for (j = 0; j < 8; j++) {
            inputBit = ( (inputByte & (1 << j)) != 0 );
            inputBit ^= (crc & 1);
            crc >>= 1;
            if (inputBit) {
                crc ^= 0xA001;
            }
        }
    }

    printf ("%04lX\n", crc);

    return 0;
}