MOD = 10**9 + 7 def count_valid_placements(markings): n = len(markings) left = [0] * n right = [0] * n # Count number of valid placements of gold to the left of each position left[n-1] = 1 if markings[n-1] in {'o', '<'} else 0 for i in range(n-2, -1, -1): if markings[i] == '<': left[i] = 1 elif markings[i] == '>': left[i] = 0 elif markings[i] == 'o': left[i] = (left[i+1] + 1) % MOD else: left[i] = (2 * left[i+1]) % MOD # Count number of valid placements of gold to the right of each position right[0] = 1 if markings[0] in {'o', '>'} else 0 for i in range(1, n): if markings[i] == '>': right[i] = 1 elif markings[i] == '<': right[i] = 0 elif markings[i] == 'o': right[i] = (right[i-1] + 1) % MOD else: right[i] = (2 * right[i-1]) % MOD # Count number of valid placements of gold between each pair of markings total = 0 for i in range(n): if markings[i] == 'o': continue for j in range(i+1, n): if markings[j] == 'o': continue k = i + (j-i)//2 if markings[i] == '<' and markings[j] == '>': total = (total + left[k] * right[k+1]) % MOD elif markings[i] == '<' and markings[j] == '=': total = (total + left[k] * (right[k+1] + right[k])) % MOD elif markings[i] == '=' and markings[j] == '>': total = (total + right[k+1] * (left[k] + left[k+1])) % MOD elif markings[i] == '=' and markings[j] == '=': total = (total + (left[k] * right[k+1]) % MOD + (left[k+1] * right[k]) % MOD) % MOD return total T = int(input()) for case_num in range(1, T+1): markings = input().strip() valid_placements = count_valid_placements(markings) print("Case #{}: {}".format(case_num, valid_placements))