#!/usr/bin/env python3
# RAWAQ — reverse (hard). A tiny virtual machine guards the flag.
# It runs a micro-program over each byte while a state accumulator evolves
# from the *input* itself. Understand the ISA, then unwind it, byte by byte.
#   ISA:  1=XOR_ACC   2 k=ROL k   3 k=ADD k   4=ADD_IDX   5 k=XOR k
PROG = [1, 2, 3, 3, 90, 4, 5, 44, 2, 1]
SEED = 61
T    = [243, 26, 106, 39, 128, 139, 22, 243, 45, 120, 213, 174, 121, 231, 160, 91, 232, 67, 79, 139, 247, 179, 175, 154, 134, 227, 108, 168, 211, 127, 169, 116, 1]

def _rotl(x, k): return ((x << k) | (x >> (8 - k))) & 0xFF

def run(flag: str) -> bool:
    b = flag.encode()
    if len(b) != len(T): return False
    acc = SEED; ok = True
    for i, ch in enumerate(b):
        r = ch; ip = 0
        while ip < len(PROG):
            op = PROG[ip]
            if   op == 1: r ^= acc;                 ip += 1
            elif op == 2: r = _rotl(r, PROG[ip+1]); ip += 2
            elif op == 3: r = (r + PROG[ip+1]) & 0xFF; ip += 2
            elif op == 4: r = (r + i) & 0xFF;       ip += 1
            elif op == 5: r ^= PROG[ip+1];          ip += 2
            else: ip += 1
        ok &= (r == T[i])
        acc = (acc + ch) & 0xFF
    return ok

if __name__ == "__main__":
    import sys
    g = sys.argv[1] if len(sys.argv) > 1 else input("flag> ")
    print("ACCESS GRANTED" if run(g) else "ACCESS DENIED")
