broken_source:
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(events):
    stack = []
    open_uv = []
    closures = {}
    out = []
    try:
        for ev in events:
            op = ev[0]
            if op == 'local':
                stack.append(ev[1])
            elif op == 'set':
                stack[ev[1]] = ev[2]
            elif op == 'get':
                out.append(stack[ev[1]])
            elif op == 'closure':
                ups = []
                for s in ev[2]:
                    uv = next((u for u in open_uv if u['slot'] == s), None)
                    if uv is None:
                        uv = {'slot': s, 'open': True, 'value': None}
                        open_uv.append(uv)
                    ups.append(uv)
                closures[ev[1]] = ups
            elif op == 'uset':
                uv = closures[ev[1]][ev[2]]
                if uv['open']:
                    stack[uv['slot']] = ev[3]
                else:
                    uv['value'] = ev[3]
            elif op == 'uget':
                uv = closures[ev[1]][ev[2]]
                out.append(stack[uv['slot']] if uv['slot'] < len(stack) else uv['value'])
            elif op == 'close':
                level = ev[1]
                for uv in open_uv:
                    if uv['slot'] >= level:
                        uv['value'] = stack[uv['slot']]
                        uv['open'] = False
                open_uv = [u for u in open_uv if u['open']]
                del stack[level:]
    except IndexError:
        out.append('dangling-slot')
    return out
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
cases = [[('two closures share one open upvalue',
   ([['local', 10],
     ['local', 0],
     ['closure', 'f', [0, 1]],
     ['closure', 'g', [1]],
     ['uset', 'f', 1, 6],
     ['uget', 'g', 0],
     ['get', 1]],),
   [6, 6]),
  ('closing a scope keeps closures linked',
   ([['local', 10],
     ['local', 0],
     ['closure', 'f', [0, 1]],
     ['closure', 'g', [1]],
     ['uset', 'f', 1, 6],
     ['uget', 'g', 0],
     ['get', 1],
     ['close', 1],
     ['uset', 'g', 0, 0],
     ['uget', 'f', 1]],),
   [6, 6, 0]),
  ('regression: new local reusing a closed slot',
   ([['local', 10],
     ['local', 0],
     ['closure', 'f', [0, 1]],
     ['closure', 'g', [1]],
     ['uset', 'f', 1, 6],
     ['uget', 'g', 0],
     ['get', 1],
     ['close', 1],
     ['uset', 'g', 0, 0],
     ['uget', 'f', 1],
     ['local', 78],
     ['closure', 'h', [1]],
     ['uget', 'h', 0],
     ['uget', 'f', 1]],),
   [6, 6, 0, 78, 0]),
  ('open upvalue tracks later stack writes',
   ([['local', 10],
     ['local', 0],
     ['closure', 'f', [0, 1]],
     ['closure', 'g', [1]],
     ['uset', 'f', 1, 6],
     ['uget', 'g', 0],
     ['get', 1],
     ['close', 1],
     ['uset', 'g', 0, 0],
     ['uget', 'f', 1],
     ['local', 78],
     ['closure', 'h', [1]],
     ['uget', 'h', 0],
     ['uget', 'f', 1],
     ['uget', 'f', 0],
     ['set', 0, 3],
     ['uget', 'f', 0],
     ['close', 0],
     ['uget', 'h', 0]],),
   [6, 6, 0, 78, 0, 10, 3, 78]),
  ('slot reuse after closing everything',
   ([['local', 10],
     ['local', 0],
     ['closure', 'f', [0, 1]],
     ['closure', 'g', [1]],
     ['uset', 'f', 1, 6],
     ['uget', 'g', 0],
     ['get', 1],
     ['close', 1],
     ['uset', 'g', 0, 0],
     ['uget', 'f', 1],
     ['local', 78],
     ['closure', 'h', [1]],
     ['uget', 'h', 0],
     ['uget', 'f', 1],
     ['uget', 'f', 0],
     ['set', 0, 3],
     ['uget', 'f', 0],
     ['close', 0],
     ['uget', 'h', 0],
     ['local', 109],
     ['closure', 'k', [0]],
     ['uget', 'k', 0],
     ['uget', 'f', 0],
     ['get', 0]],),
   [6, 6, 0, 78, 0, 10, 3, 78, 109, 3, 109]),
  ('closure over only the outer local',
   ([['local', 1], ['closure', 'c', [0]], ['close', 0], ['local', 2], ['uget', 'c', 0], ['get', 0]],),
   [1, 2]),
  ('control: plain locals', ([['local', 1], ['local', 2], ['set', 1, 4], ['get', 1], ['get', 0]],), [4, 1])],
 [('two closures share one open upvalue',
   ([['local', 20],
     ['local', 0],
     ['closure', 'f', [0, 1]],
     ['closure', 'g', [1]],
     ['uset', 'f', 1, 7],
     ['uget', 'g', 0],
     ['get', 1]],),
   [7, 7]),
  ('closing a scope keeps closures linked',
   ([['local', 20],
     ['local', 0],
     ['closure', 'f', [0, 1]],
     ['closure', 'g', [1]],
     ['uset', 'f', 1, 7],
     ['uget', 'g', 0],
     ['get', 1],
     ['close', 1],
     ['uset', 'g', 0, 0],
     ['uget', 'f', 1]],),
   [7, 7, 0]),
  ('regression: new local reusing a closed slot',
   ([['local', 20],
     ['local', 0],
     ['closure', 'f', [0, 1]],
     ['closure', 'g', [1]],
     ['uset', 'f', 1, 7],
     ['uget', 'g', 0],
     ['get', 1],
     ['close', 1],
     ['uset', 'g', 0, 0],
     ['uget', 'f', 1],
     ['local', 79],
     ['closure', 'h', [1]],
     ['uget', 'h', 0],
     ['uget', 'f', 1]],),
   [7, 7, 0, 79, 0]),
  ('open upvalue tracks later stack writes',
   ([['local', 20],
     ['local', 0],
     ['closure', 'f', [0, 1]],
     ['closure', 'g', [1]],
     ['uset', 'f', 1, 7],
     ['uget', 'g', 0],
     ['get', 1],
     ['close', 1],
     ['uset', 'g', 0, 0],
     ['uget', 'f', 1],
     ['local', 79],
     ['closure', 'h', [1]],
     ['uget', 'h', 0],
     ['uget', 'f', 1],
     ['uget', 'f', 0],
     ['set', 0, 6],
     ['uget', 'f', 0],
     ['close', 0],
     ['uget', 'h', 0]],),
   [7, 7, 0, 79, 0, 20, 6, 79]),
  ('slot reuse after closing everything',
   ([['local', 20],
     ['local', 0],
     ['closure', 'f', [0, 1]],
     ['closure', 'g', [1]],
     ['uset', 'f', 1, 7],
     ['uget', 'g', 0],
     ['get', 1],
     ['close', 1],
     ['uset', 'g', 0, 0],
     ['uget', 'f', 1],
     ['local', 79],
     ['closure', 'h', [1]],
     ['uget', 'h', 0],
     ['uget', 'f', 1],
     ['uget', 'f', 0],
     ['set', 0, 6],
     ['uget', 'f', 0],
     ['close', 0],
     ['uget', 'h', 0],
     ['local', 109],
     ['closure', 'k', [0]],
     ['uget', 'k', 0],
     ['uget', 'f', 0],
     ['get', 0]],),
   [7, 7, 0, 79, 0, 20, 6, 79, 109, 6, 109]),
  ('closure over only the outer local',
   ([['local', 2], ['closure', 'c', [0]], ['close', 0], ['local', 2], ['uget', 'c', 0], ['get', 0]],),
   [2, 2]),
  ('control: plain locals', ([['local', 2], ['local', 2], ['set', 1, 4], ['get', 1], ['get', 0]],), [4, 2])],
 [('two closures share one open upvalue',
   ([['local', 30],
     ['local', 0],
     ['closure', 'f', [0, 1]],
     ['closure', 'g', [1]],
     ['uset', 'f', 1, 8],
     ['uget', 'g', 0],
     ['get', 1]],),
   [8, 8]),
  ('closing a scope keeps closures linked',
   ([['local', 30],
     ['local', 0],
     ['closure', 'f', [0, 1]],
     ['closure', 'g', [1]],
     ['uset', 'f', 1, 8],
     ['uget', 'g', 0],
     ['get', 1],
     ['close', 1],
     ['uset', 'g', 0, 0],
     ['uget', 'f', 1]],),
   [8, 8, 0]),
  ('regression: new local reusing a closed slot',
   ([['local', 30],
     ['local', 0],
     ['closure', 'f', [0, 1]],
     ['closure', 'g', [1]],
     ['uset', 'f', 1, 8],
     ['uget', 'g', 0],
     ['get', 1],
     ['close', 1],
     ['uset', 'g', 0, 0],
     ['uget', 'f', 1],
     ['local', 80],
     ['closure', 'h', [1]],
     ['uget', 'h', 0],
     ['uget', 'f', 1]],),
   [8, 8, 0, 80, 0]),
  ('open upvalue tracks later stack writes',
   ([['local', 30],
     ['local', 0],
     ['closure', 'f', [0, 1]],
     ['closure', 'g', [1]],
     ['uset', 'f', 1, 8],
     ['uget', 'g', 0],
     ['get', 1],
     ['close', 1],
     ['uset', 'g', 0, 0],
     ['uget', 'f', 1],
     ['local', 80],
     ['closure', 'h', [1]],
     ['uget', 'h', 0],
     ['uget', 'f', 1],
     ['uget', 'f', 0],
     ['set', 0, 9],
     ['uget', 'f', 0],
     ['close', 0],
     ['uget', 'h', 0]],),
   [8, 8, 0, 80, 0, 30, 9, 80]),
  ('slot reuse after closing everything',
   ([['local', 30],
     ['local', 0],
     ['closure', 'f', [0, 1]],
     ['closure', 'g', [1]],
     ['uset', 'f', 1, 8],
     ['uget', 'g', 0],
     ['get', 1],
     ['close', 1],
     ['uset', 'g', 0, 0],
     ['uget', 'f', 1],
     ['local', 80],
     ['closure', 'h', [1]],
     ['uget', 'h', 0],
     ['uget', 'f', 1],
     ['uget', 'f', 0],
     ['set', 0, 9],
     ['uget', 'f', 0],
     ['close', 0],
     ['uget', 'h', 0],
     ['local', 109],
     ['closure', 'k', [0]],
     ['uget', 'k', 0],
     ['uget', 'f', 0],
     ['get', 0]],),
   [8, 8, 0, 80, 0, 30, 9, 80, 109, 9, 109]),
  ('closure over only the outer local',
   ([['local', 3], ['closure', 'c', [0]], ['close', 0], ['local', 2], ['uget', 'c', 0], ['get', 0]],),
   [3, 2]),
  ('control: plain locals', ([['local', 3], ['local', 2], ['set', 1, 4], ['get', 1], ['get', 0]],), [4, 3])],
 [('two closures share one open upvalue',
   ([['local', 40],
     ['local', 0],
     ['closure', 'f', [0, 1]],
     ['closure', 'g', [1]],
     ['uset', 'f', 1, 9],
     ['uget', 'g', 0],
     ['get', 1]],),
   [9, 9]),
  ('closing a scope keeps closures linked',
   ([['local', 40],
     ['local', 0],
     ['closure', 'f', [0, 1]],
     ['closure', 'g', [1]],
     ['uset', 'f', 1, 9],
     ['uget', 'g', 0],
     ['get', 1],
     ['close', 1],
     ['uset', 'g', 0, 0],
     ['uget', 'f', 1]],),
   [9, 9, 0]),
  ('regression: new local reusing a closed slot',
   ([['local', 40],
     ['local', 0],
     ['closure', 'f', [0, 1]],
     ['closure', 'g', [1]],
     ['uset', 'f', 1, 9],
     ['uget', 'g', 0],
     ['get', 1],
     ['close', 1],
     ['uset', 'g', 0, 0],
     ['uget', 'f', 1],
     ['local', 81],
     ['closure', 'h', [1]],
     ['uget', 'h', 0],
     ['uget', 'f', 1]],),
   [9, 9, 0, 81, 0]),
  ('open upvalue tracks later stack writes',
   ([['local', 40],
     ['local', 0],
     ['closure', 'f', [0, 1]],
     ['closure', 'g', [1]],
     ['uset', 'f', 1, 9],
     ['uget', 'g', 0],
     ['get', 1],
     ['close', 1],
     ['uset', 'g', 0, 0],
     ['uget', 'f', 1],
     ['local', 81],
     ['closure', 'h', [1]],
     ['uget', 'h', 0],
     ['uget', 'f', 1],
     ['uget', 'f', 0],
     ['set', 0, 12],
     ['uget', 'f', 0],
     ['close', 0],
     ['uget', 'h', 0]],),
   [9, 9, 0, 81, 0, 40, 12, 81]),
  ('slot reuse after closing everything',
   ([['local', 40],
     ['local', 0],
     ['closure', 'f', [0, 1]],
     ['closure', 'g', [1]],
     ['uset', 'f', 1, 9],
     ['uget', 'g', 0],
     ['get', 1],
     ['close', 1],
     ['uset', 'g', 0, 0],
     ['uget', 'f', 1],
     ['local', 81],
     ['closure', 'h', [1]],
     ['uget', 'h', 0],
     ['uget', 'f', 1],
     ['uget', 'f', 0],
     ['set', 0, 12],
     ['uget', 'f', 0],
     ['close', 0],
     ['uget', 'h', 0],
     ['local', 109],
     ['closure', 'k', [0]],
     ['uget', 'k', 0],
     ['uget', 'f', 0],
     ['get', 0]],),
   [9, 9, 0, 81, 0, 40, 12, 81, 109, 12, 109]),
  ('closure over only the outer local',
   ([['local', 4], ['closure', 'c', [0]], ['close', 0], ['local', 2], ['uget', 'c', 0], ['get', 0]],),
   [4, 2]),
  ('control: plain locals', ([['local', 4], ['local', 2], ['set', 1, 4], ['get', 1], ['get', 0]],), [4, 4])],
 [('two closures share one open upvalue',
   ([['local', 50],
     ['local', 0],
     ['closure', 'f', [0, 1]],
     ['closure', 'g', [1]],
     ['uset', 'f', 1, 10],
     ['uget', 'g', 0],
     ['get', 1]],),
   [10, 10]),
  ('closing a scope keeps closures linked',
   ([['local', 50],
     ['local', 0],
     ['closure', 'f', [0, 1]],
     ['closure', 'g', [1]],
     ['uset', 'f', 1, 10],
     ['uget', 'g', 0],
     ['get', 1],
     ['close', 1],
     ['uset', 'g', 0, 0],
     ['uget', 'f', 1]],),
   [10, 10, 0]),
  ('regression: new local reusing a closed slot',
   ([['local', 50],
     ['local', 0],
     ['closure', 'f', [0, 1]],
     ['closure', 'g', [1]],
     ['uset', 'f', 1, 10],
     ['uget', 'g', 0],
     ['get', 1],
     ['close', 1],
     ['uset', 'g', 0, 0],
     ['uget', 'f', 1],
     ['local', 82],
     ['closure', 'h', [1]],
     ['uget', 'h', 0],
     ['uget', 'f', 1]],),
   [10, 10, 0, 82, 0]),
  ('open upvalue tracks later stack writes',
   ([['local', 50],
     ['local', 0],
     ['closure', 'f', [0, 1]],
     ['closure', 'g', [1]],
     ['uset', 'f', 1, 10],
     ['uget', 'g', 0],
     ['get', 1],
     ['close', 1],
     ['uset', 'g', 0, 0],
     ['uget', 'f', 1],
     ['local', 82],
     ['closure', 'h', [1]],
     ['uget', 'h', 0],
     ['uget', 'f', 1],
     ['uget', 'f', 0],
     ['set', 0, 15],
     ['uget', 'f', 0],
     ['close', 0],
     ['uget', 'h', 0]],),
   [10, 10, 0, 82, 0, 50, 15, 82]),
  ('slot reuse after closing everything',
   ([['local', 50],
     ['local', 0],
     ['closure', 'f', [0, 1]],
     ['closure', 'g', [1]],
     ['uset', 'f', 1, 10],
     ['uget', 'g', 0],
     ['get', 1],
     ['close', 1],
     ['uset', 'g', 0, 0],
     ['uget', 'f', 1],
     ['local', 82],
     ['closure', 'h', [1]],
     ['uget', 'h', 0],
     ['uget', 'f', 1],
     ['uget', 'f', 0],
     ['set', 0, 15],
     ['uget', 'f', 0],
     ['close', 0],
     ['uget', 'h', 0],
     ['local', 109],
     ['closure', 'k', [0]],
     ['uget', 'k', 0],
     ['uget', 'f', 0],
     ['get', 0]],),
   [10, 10, 0, 82, 0, 50, 15, 82, 109, 15, 109]),
  ('closure over only the outer local',
   ([['local', 5], ['closure', 'c', [0]], ['close', 0], ['local', 2], ['uget', 'c', 0], ['get', 0]],),
   [5, 2]),
  ('control: plain locals', ([['local', 5], ['local', 2], ['set', 1, 4], ['get', 1], ['get', 0]],), [4, 5])]]
for label, args, expected in cases[N - 1]:
    check(label, solve(*args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)

source:
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(events):
    stack = []
    open_uv = []
    closures = {}
    out = []
    try:
        for ev in events:
            op = ev[0]
            if op == 'local':
                stack.append(ev[1])
            elif op == 'set':
                stack[ev[1]] = ev[2]
            elif op == 'get':
                out.append(stack[ev[1]])
            elif op == 'closure':
                ups = []
                for s in ev[2]:
                    uv = next((u for u in open_uv if u['slot'] == s), None)
                    if uv is None:
                        uv = {'slot': s, 'open': True, 'value': None}
                        open_uv.append(uv)
                    ups.append(uv)
                closures[ev[1]] = ups
            elif op == 'uset':
                uv = closures[ev[1]][ev[2]]
                if uv['open']:
                    stack[uv['slot']] = ev[3]
                else:
                    uv['value'] = ev[3]
            elif op == 'uget':
                uv = closures[ev[1]][ev[2]]
                out.append(uv['value'] if not uv['open'] and uv['value'] else stack[uv['slot']])
            elif op == 'close':
                level = ev[1]
                for uv in open_uv:
                    if uv['slot'] >= level:
                        uv['value'] = stack[uv['slot']]
                        uv['open'] = False
                open_uv = [u for u in open_uv if u['open']]
                del stack[level:]
    except IndexError:
        out.append('dangling-slot')
    return out
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
cases = [[('two closures share one open upvalue',
   ([['local', 10],
     ['local', 0],
     ['closure', 'f', [0, 1]],
     ['closure', 'g', [1]],
     ['uset', 'f', 1, 6],
     ['uget', 'g', 0],
     ['get', 1]],),
   [6, 6]),
  ('closing a scope keeps closures linked',
   ([['local', 10],
     ['local', 0],
     ['closure', 'f', [0, 1]],
     ['closure', 'g', [1]],
     ['uset', 'f', 1, 6],
     ['uget', 'g', 0],
     ['get', 1],
     ['close', 1],
     ['uset', 'g', 0, 0],
     ['uget', 'f', 1]],),
   [6, 6, 0]),
  ('regression: new local reusing a closed slot',
   ([['local', 10],
     ['local', 0],
     ['closure', 'f', [0, 1]],
     ['closure', 'g', [1]],
     ['uset', 'f', 1, 6],
     ['uget', 'g', 0],
     ['get', 1],
     ['close', 1],
     ['uset', 'g', 0, 0],
     ['uget', 'f', 1],
     ['local', 78],
     ['closure', 'h', [1]],
     ['uget', 'h', 0],
     ['uget', 'f', 1]],),
   [6, 6, 0, 78, 0]),
  ('open upvalue tracks later stack writes',
   ([['local', 10],
     ['local', 0],
     ['closure', 'f', [0, 1]],
     ['closure', 'g', [1]],
     ['uset', 'f', 1, 6],
     ['uget', 'g', 0],
     ['get', 1],
     ['close', 1],
     ['uset', 'g', 0, 0],
     ['uget', 'f', 1],
     ['local', 78],
     ['closure', 'h', [1]],
     ['uget', 'h', 0],
     ['uget', 'f', 1],
     ['uget', 'f', 0],
     ['set', 0, 3],
     ['uget', 'f', 0],
     ['close', 0],
     ['uget', 'h', 0]],),
   [6, 6, 0, 78, 0, 10, 3, 78]),
  ('slot reuse after closing everything',
   ([['local', 10],
     ['local', 0],
     ['closure', 'f', [0, 1]],
     ['closure', 'g', [1]],
     ['uset', 'f', 1, 6],
     ['uget', 'g', 0],
     ['get', 1],
     ['close', 1],
     ['uset', 'g', 0, 0],
     ['uget', 'f', 1],
     ['local', 78],
     ['closure', 'h', [1]],
     ['uget', 'h', 0],
     ['uget', 'f', 1],
     ['uget', 'f', 0],
     ['set', 0, 3],
     ['uget', 'f', 0],
     ['close', 0],
     ['uget', 'h', 0],
     ['local', 109],
     ['closure', 'k', [0]],
     ['uget', 'k', 0],
     ['uget', 'f', 0],
     ['get', 0]],),
   [6, 6, 0, 78, 0, 10, 3, 78, 109, 3, 109]),
  ('closure over only the outer local',
   ([['local', 1], ['closure', 'c', [0]], ['close', 0], ['local', 2], ['uget', 'c', 0], ['get', 0]],),
   [1, 2]),
  ('control: plain locals', ([['local', 1], ['local', 2], ['set', 1, 4], ['get', 1], ['get', 0]],), [4, 1])],
 [('two closures share one open upvalue',
   ([['local', 20],
     ['local', 0],
     ['closure', 'f', [0, 1]],
     ['closure', 'g', [1]],
     ['uset', 'f', 1, 7],
     ['uget', 'g', 0],
     ['get', 1]],),
   [7, 7]),
  ('closing a scope keeps closures linked',
   ([['local', 20],
     ['local', 0],
     ['closure', 'f', [0, 1]],
     ['closure', 'g', [1]],
     ['uset', 'f', 1, 7],
     ['uget', 'g', 0],
     ['get', 1],
     ['close', 1],
     ['uset', 'g', 0, 0],
     ['uget', 'f', 1]],),
   [7, 7, 0]),
  ('regression: new local reusing a closed slot',
   ([['local', 20],
     ['local', 0],
     ['closure', 'f', [0, 1]],
     ['closure', 'g', [1]],
     ['uset', 'f', 1, 7],
     ['uget', 'g', 0],
     ['get', 1],
     ['close', 1],
     ['uset', 'g', 0, 0],
     ['uget', 'f', 1],
     ['local', 79],
     ['closure', 'h', [1]],
     ['uget', 'h', 0],
     ['uget', 'f', 1]],),
   [7, 7, 0, 79, 0]),
  ('open upvalue tracks later stack writes',
   ([['local', 20],
     ['local', 0],
     ['closure', 'f', [0, 1]],
     ['closure', 'g', [1]],
     ['uset', 'f', 1, 7],
     ['uget', 'g', 0],
     ['get', 1],
     ['close', 1],
     ['uset', 'g', 0, 0],
     ['uget', 'f', 1],
     ['local', 79],
     ['closure', 'h', [1]],
     ['uget', 'h', 0],
     ['uget', 'f', 1],
     ['uget', 'f', 0],
     ['set', 0, 6],
     ['uget', 'f', 0],
     ['close', 0],
     ['uget', 'h', 0]],),
   [7, 7, 0, 79, 0, 20, 6, 79]),
  ('slot reuse after closing everything',
   ([['local', 20],
     ['local', 0],
     ['closure', 'f', [0, 1]],
     ['closure', 'g', [1]],
     ['uset', 'f', 1, 7],
     ['uget', 'g', 0],
     ['get', 1],
     ['close', 1],
     ['uset', 'g', 0, 0],
     ['uget', 'f', 1],
     ['local', 79],
     ['closure', 'h', [1]],
     ['uget', 'h', 0],
     ['uget', 'f', 1],
     ['uget', 'f', 0],
     ['set', 0, 6],
     ['uget', 'f', 0],
     ['close', 0],
     ['uget', 'h', 0],
     ['local', 109],
     ['closure', 'k', [0]],
     ['uget', 'k', 0],
     ['uget', 'f', 0],
     ['get', 0]],),
   [7, 7, 0, 79, 0, 20, 6, 79, 109, 6, 109]),
  ('closure over only the outer local',
   ([['local', 2], ['closure', 'c', [0]], ['close', 0], ['local', 2], ['uget', 'c', 0], ['get', 0]],),
   [2, 2]),
  ('control: plain locals', ([['local', 2], ['local', 2], ['set', 1, 4], ['get', 1], ['get', 0]],), [4, 2])],
 [('two closures share one open upvalue',
   ([['local', 30],
     ['local', 0],
     ['closure', 'f', [0, 1]],
     ['closure', 'g', [1]],
     ['uset', 'f', 1, 8],
     ['uget', 'g', 0],
     ['get', 1]],),
   [8, 8]),
  ('closing a scope keeps closures linked',
   ([['local', 30],
     ['local', 0],
     ['closure', 'f', [0, 1]],
     ['closure', 'g', [1]],
     ['uset', 'f', 1, 8],
     ['uget', 'g', 0],
     ['get', 1],
     ['close', 1],
     ['uset', 'g', 0, 0],
     ['uget', 'f', 1]],),
   [8, 8, 0]),
  ('regression: new local reusing a closed slot',
   ([['local', 30],
     ['local', 0],
     ['closure', 'f', [0, 1]],
     ['closure', 'g', [1]],
     ['uset', 'f', 1, 8],
     ['uget', 'g', 0],
     ['get', 1],
     ['close', 1],
     ['uset', 'g', 0, 0],
     ['uget', 'f', 1],
     ['local', 80],
     ['closure', 'h', [1]],
     ['uget', 'h', 0],
     ['uget', 'f', 1]],),
   [8, 8, 0, 80, 0]),
  ('open upvalue tracks later stack writes',
   ([['local', 30],
     ['local', 0],
     ['closure', 'f', [0, 1]],
     ['closure', 'g', [1]],
     ['uset', 'f', 1, 8],
     ['uget', 'g', 0],
     ['get', 1],
     ['close', 1],
     ['uset', 'g', 0, 0],
     ['uget', 'f', 1],
     ['local', 80],
     ['closure', 'h', [1]],
     ['uget', 'h', 0],
     ['uget', 'f', 1],
     ['uget', 'f', 0],
     ['set', 0, 9],
     ['uget', 'f', 0],
     ['close', 0],
     ['uget', 'h', 0]],),
   [8, 8, 0, 80, 0, 30, 9, 80]),
  ('slot reuse after closing everything',
   ([['local', 30],
     ['local', 0],
     ['closure', 'f', [0, 1]],
     ['closure', 'g', [1]],
     ['uset', 'f', 1, 8],
     ['uget', 'g', 0],
     ['get', 1],
     ['close', 1],
     ['uset', 'g', 0, 0],
     ['uget', 'f', 1],
     ['local', 80],
     ['closure', 'h', [1]],
     ['uget', 'h', 0],
     ['uget', 'f', 1],
     ['uget', 'f', 0],
     ['set', 0, 9],
     ['uget', 'f', 0],
     ['close', 0],
     ['uget', 'h', 0],
     ['local', 109],
     ['closure', 'k', [0]],
     ['uget', 'k', 0],
     ['uget', 'f', 0],
     ['get', 0]],),
   [8, 8, 0, 80, 0, 30, 9, 80, 109, 9, 109]),
  ('closure over only the outer local',
   ([['local', 3], ['closure', 'c', [0]], ['close', 0], ['local', 2], ['uget', 'c', 0], ['get', 0]],),
   [3, 2]),
  ('control: plain locals', ([['local', 3], ['local', 2], ['set', 1, 4], ['get', 1], ['get', 0]],), [4, 3])],
 [('two closures share one open upvalue',
   ([['local', 40],
     ['local', 0],
     ['closure', 'f', [0, 1]],
     ['closure', 'g', [1]],
     ['uset', 'f', 1, 9],
     ['uget', 'g', 0],
     ['get', 1]],),
   [9, 9]),
  ('closing a scope keeps closures linked',
   ([['local', 40],
     ['local', 0],
     ['closure', 'f', [0, 1]],
     ['closure', 'g', [1]],
     ['uset', 'f', 1, 9],
     ['uget', 'g', 0],
     ['get', 1],
     ['close', 1],
     ['uset', 'g', 0, 0],
     ['uget', 'f', 1]],),
   [9, 9, 0]),
  ('regression: new local reusing a closed slot',
   ([['local', 40],
     ['local', 0],
     ['closure', 'f', [0, 1]],
     ['closure', 'g', [1]],
     ['uset', 'f', 1, 9],
     ['uget', 'g', 0],
     ['get', 1],
     ['close', 1],
     ['uset', 'g', 0, 0],
     ['uget', 'f', 1],
     ['local', 81],
     ['closure', 'h', [1]],
     ['uget', 'h', 0],
     ['uget', 'f', 1]],),
   [9, 9, 0, 81, 0]),
  ('open upvalue tracks later stack writes',
   ([['local', 40],
     ['local', 0],
     ['closure', 'f', [0, 1]],
     ['closure', 'g', [1]],
     ['uset', 'f', 1, 9],
     ['uget', 'g', 0],
     ['get', 1],
     ['close', 1],
     ['uset', 'g', 0, 0],
     ['uget', 'f', 1],
     ['local', 81],
     ['closure', 'h', [1]],
     ['uget', 'h', 0],
     ['uget', 'f', 1],
     ['uget', 'f', 0],
     ['set', 0, 12],
     ['uget', 'f', 0],
     ['close', 0],
     ['uget', 'h', 0]],),
   [9, 9, 0, 81, 0, 40, 12, 81]),
  ('slot reuse after closing everything',
   ([['local', 40],
     ['local', 0],
     ['closure', 'f', [0, 1]],
     ['closure', 'g', [1]],
     ['uset', 'f', 1, 9],
     ['uget', 'g', 0],
     ['get', 1],
     ['close', 1],
     ['uset', 'g', 0, 0],
     ['uget', 'f', 1],
     ['local', 81],
     ['closure', 'h', [1]],
     ['uget', 'h', 0],
     ['uget', 'f', 1],
     ['uget', 'f', 0],
     ['set', 0, 12],
     ['uget', 'f', 0],
     ['close', 0],
     ['uget', 'h', 0],
     ['local', 109],
     ['closure', 'k', [0]],
     ['uget', 'k', 0],
     ['uget', 'f', 0],
     ['get', 0]],),
   [9, 9, 0, 81, 0, 40, 12, 81, 109, 12, 109]),
  ('closure over only the outer local',
   ([['local', 4], ['closure', 'c', [0]], ['close', 0], ['local', 2], ['uget', 'c', 0], ['get', 0]],),
   [4, 2]),
  ('control: plain locals', ([['local', 4], ['local', 2], ['set', 1, 4], ['get', 1], ['get', 0]],), [4, 4])],
 [('two closures share one open upvalue',
   ([['local', 50],
     ['local', 0],
     ['closure', 'f', [0, 1]],
     ['closure', 'g', [1]],
     ['uset', 'f', 1, 10],
     ['uget', 'g', 0],
     ['get', 1]],),
   [10, 10]),
  ('closing a scope keeps closures linked',
   ([['local', 50],
     ['local', 0],
     ['closure', 'f', [0, 1]],
     ['closure', 'g', [1]],
     ['uset', 'f', 1, 10],
     ['uget', 'g', 0],
     ['get', 1],
     ['close', 1],
     ['uset', 'g', 0, 0],
     ['uget', 'f', 1]],),
   [10, 10, 0]),
  ('regression: new local reusing a closed slot',
   ([['local', 50],
     ['local', 0],
     ['closure', 'f', [0, 1]],
     ['closure', 'g', [1]],
     ['uset', 'f', 1, 10],
     ['uget', 'g', 0],
     ['get', 1],
     ['close', 1],
     ['uset', 'g', 0, 0],
     ['uget', 'f', 1],
     ['local', 82],
     ['closure', 'h', [1]],
     ['uget', 'h', 0],
     ['uget', 'f', 1]],),
   [10, 10, 0, 82, 0]),
  ('open upvalue tracks later stack writes',
   ([['local', 50],
     ['local', 0],
     ['closure', 'f', [0, 1]],
     ['closure', 'g', [1]],
     ['uset', 'f', 1, 10],
     ['uget', 'g', 0],
     ['get', 1],
     ['close', 1],
     ['uset', 'g', 0, 0],
     ['uget', 'f', 1],
     ['local', 82],
     ['closure', 'h', [1]],
     ['uget', 'h', 0],
     ['uget', 'f', 1],
     ['uget', 'f', 0],
     ['set', 0, 15],
     ['uget', 'f', 0],
     ['close', 0],
     ['uget', 'h', 0]],),
   [10, 10, 0, 82, 0, 50, 15, 82]),
  ('slot reuse after closing everything',
   ([['local', 50],
     ['local', 0],
     ['closure', 'f', [0, 1]],
     ['closure', 'g', [1]],
     ['uset', 'f', 1, 10],
     ['uget', 'g', 0],
     ['get', 1],
     ['close', 1],
     ['uset', 'g', 0, 0],
     ['uget', 'f', 1],
     ['local', 82],
     ['closure', 'h', [1]],
     ['uget', 'h', 0],
     ['uget', 'f', 1],
     ['uget', 'f', 0],
     ['set', 0, 15],
     ['uget', 'f', 0],
     ['close', 0],
     ['uget', 'h', 0],
     ['local', 109],
     ['closure', 'k', [0]],
     ['uget', 'k', 0],
     ['uget', 'f', 0],
     ['get', 0]],),
   [10, 10, 0, 82, 0, 50, 15, 82, 109, 15, 109]),
  ('closure over only the outer local',
   ([['local', 5], ['closure', 'c', [0]], ['close', 0], ['local', 2], ['uget', 'c', 0], ['get', 0]],),
   [5, 2]),
  ('control: plain locals', ([['local', 5], ['local', 2], ['set', 1, 4], ['get', 1], ['get', 0]],), [4, 5])]]
for label, args, expected in cases[N - 1]:
    check(label, solve(*args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)

prompt:
A closure reads whatever local now occupies its old slot.

A register/stack VM with open and closed upvalues. ["local", v] pushes a slot; ["set", s, v] and ["get", s] access slots; ["closure", id, [slots]] captures slots, reusing the existing open upvalue for a slot so closures share variables; ["uset"/"uget", id, k, (v)] access the k-th upvalue, going to the stack slot while open and to the upvalue's own cell once closed; ["close", level] closes every open upvalue whose slot >= level (copying the slot value) and truncates the stack to level. Accessing a vanished slot appends "dangling-slot" and stops.

split: open-access


broken_source:
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(events):
    stack = []
    open_uv = []
    closures = {}
    out = []
    try:
        for ev in events:
            op = ev[0]
            if op == 'local':
                stack.append(ev[1])
            elif op == 'set':
                stack[ev[1]] = ev[2]
            elif op == 'get':
                out.append(stack[ev[1]])
            elif op == 'closure':
                ups = []
                for s in ev[2]:
                    uv = next((u for u in open_uv if u['slot'] == s), None)
                    if uv is None:
                        uv = {'slot': s, 'open': True, 'value': None}
                        open_uv.append(uv)
                    ups.append(uv)
                closures[ev[1]] = ups
            elif op == 'uset':
                uv = closures[ev[1]][ev[2]]
                if uv['open']:
                    stack[uv['slot']] = ev[3]
                else:
                    uv['value'] = ev[3]
            elif op == 'uget':
                uv = closures[ev[1]][ev[2]]
                out.append(stack[uv['slot']] if uv['open'] else uv['value'])
            elif op == 'close':
                level = ev[1]
                for uv in open_uv:
                    if uv['slot'] >= level:
                        uv['value'] = stack[uv['slot']]
                        uv['open'] = False
                open_uv = [u for u in open_uv if u['open']]
                del stack[level + 1:]
    except IndexError:
        out.append('dangling-slot')
    return out
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
cases = [[('two closures share one open upvalue',
   ([['local', 10],
     ['local', 0],
     ['closure', 'f', [0, 1]],
     ['closure', 'g', [1]],
     ['uset', 'f', 1, 6],
     ['uget', 'g', 0],
     ['get', 1]],),
   [6, 6]),
  ('closing a scope keeps closures linked',
   ([['local', 10],
     ['local', 0],
     ['closure', 'f', [0, 1]],
     ['closure', 'g', [1]],
     ['uset', 'f', 1, 6],
     ['uget', 'g', 0],
     ['get', 1],
     ['close', 1],
     ['uset', 'g', 0, 0],
     ['uget', 'f', 1]],),
   [6, 6, 0]),
  ('regression: new local reusing a closed slot',
   ([['local', 10],
     ['local', 0],
     ['closure', 'f', [0, 1]],
     ['closure', 'g', [1]],
     ['uset', 'f', 1, 6],
     ['uget', 'g', 0],
     ['get', 1],
     ['close', 1],
     ['uset', 'g', 0, 0],
     ['uget', 'f', 1],
     ['local', 78],
     ['closure', 'h', [1]],
     ['uget', 'h', 0],
     ['uget', 'f', 1]],),
   [6, 6, 0, 78, 0]),
  ('open upvalue tracks later stack writes',
   ([['local', 10],
     ['local', 0],
     ['closure', 'f', [0, 1]],
     ['closure', 'g', [1]],
     ['uset', 'f', 1, 6],
     ['uget', 'g', 0],
     ['get', 1],
     ['close', 1],
     ['uset', 'g', 0, 0],
     ['uget', 'f', 1],
     ['local', 78],
     ['closure', 'h', [1]],
     ['uget', 'h', 0],
     ['uget', 'f', 1],
     ['uget', 'f', 0],
     ['set', 0, 3],
     ['uget', 'f', 0],
     ['close', 0],
     ['uget', 'h', 0]],),
   [6, 6, 0, 78, 0, 10, 3, 78]),
  ('slot reuse after closing everything',
   ([['local', 10],
     ['local', 0],
     ['closure', 'f', [0, 1]],
     ['closure', 'g', [1]],
     ['uset', 'f', 1, 6],
     ['uget', 'g', 0],
     ['get', 1],
     ['close', 1],
     ['uset', 'g', 0, 0],
     ['uget', 'f', 1],
     ['local', 78],
     ['closure', 'h', [1]],
     ['uget', 'h', 0],
     ['uget', 'f', 1],
     ['uget', 'f', 0],
     ['set', 0, 3],
     ['uget', 'f', 0],
     ['close', 0],
     ['uget', 'h', 0],
     ['local', 109],
     ['closure', 'k', [0]],
     ['uget', 'k', 0],
     ['uget', 'f', 0],
     ['get', 0]],),
   [6, 6, 0, 78, 0, 10, 3, 78, 109, 3, 109]),
  ('closure over only the outer local',
   ([['local', 1], ['closure', 'c', [0]], ['close', 0], ['local', 2], ['uget', 'c', 0], ['get', 0]],),
   [1, 2]),
  ('control: plain locals', ([['local', 1], ['local', 2], ['set', 1, 4], ['get', 1], ['get', 0]],), [4, 1])],
 [('two closures share one open upvalue',
   ([['local', 20],
     ['local', 0],
     ['closure', 'f', [0, 1]],
     ['closure', 'g', [1]],
     ['uset', 'f', 1, 7],
     ['uget', 'g', 0],
     ['get', 1]],),
   [7, 7]),
  ('closing a scope keeps closures linked',
   ([['local', 20],
     ['local', 0],
     ['closure', 'f', [0, 1]],
     ['closure', 'g', [1]],
     ['uset', 'f', 1, 7],
     ['uget', 'g', 0],
     ['get', 1],
     ['close', 1],
     ['uset', 'g', 0, 0],
     ['uget', 'f', 1]],),
   [7, 7, 0]),
  ('regression: new local reusing a closed slot',
   ([['local', 20],
     ['local', 0],
     ['closure', 'f', [0, 1]],
     ['closure', 'g', [1]],
     ['uset', 'f', 1, 7],
     ['uget', 'g', 0],
     ['get', 1],
     ['close', 1],
     ['uset', 'g', 0, 0],
     ['uget', 'f', 1],
     ['local', 79],
     ['closure', 'h', [1]],
     ['uget', 'h', 0],
     ['uget', 'f', 1]],),
   [7, 7, 0, 79, 0]),
  ('open upvalue tracks later stack writes',
   ([['local', 20],
     ['local', 0],
     ['closure', 'f', [0, 1]],
     ['closure', 'g', [1]],
     ['uset', 'f', 1, 7],
     ['uget', 'g', 0],
     ['get', 1],
     ['close', 1],
     ['uset', 'g', 0, 0],
     ['uget', 'f', 1],
     ['local', 79],
     ['closure', 'h', [1]],
     ['uget', 'h', 0],
     ['uget', 'f', 1],
     ['uget', 'f', 0],
     ['set', 0, 6],
     ['uget', 'f', 0],
     ['close', 0],
     ['uget', 'h', 0]],),
   [7, 7, 0, 79, 0, 20, 6, 79]),
  ('slot reuse after closing everything',
   ([['local', 20],
     ['local', 0],
     ['closure', 'f', [0, 1]],
     ['closure', 'g', [1]],
     ['uset', 'f', 1, 7],
     ['uget', 'g', 0],
     ['get', 1],
     ['close', 1],
     ['uset', 'g', 0, 0],
     ['uget', 'f', 1],
     ['local', 79],
     ['closure', 'h', [1]],
     ['uget', 'h', 0],
     ['uget', 'f', 1],
     ['uget', 'f', 0],
     ['set', 0, 6],
     ['uget', 'f', 0],
     ['close', 0],
     ['uget', 'h', 0],
     ['local', 109],
     ['closure', 'k', [0]],
     ['uget', 'k', 0],
     ['uget', 'f', 0],
     ['get', 0]],),
   [7, 7, 0, 79, 0, 20, 6, 79, 109, 6, 109]),
  ('closure over only the outer local',
   ([['local', 2], ['closure', 'c', [0]], ['close', 0], ['local', 2], ['uget', 'c', 0], ['get', 0]],),
   [2, 2]),
  ('control: plain locals', ([['local', 2], ['local', 2], ['set', 1, 4], ['get', 1], ['get', 0]],), [4, 2])],
 [('two closures share one open upvalue',
   ([['local', 30],
     ['local', 0],
     ['closure', 'f', [0, 1]],
     ['closure', 'g', [1]],
     ['uset', 'f', 1, 8],
     ['uget', 'g', 0],
     ['get', 1]],),
   [8, 8]),
  ('closing a scope keeps closures linked',
   ([['local', 30],
     ['local', 0],
     ['closure', 'f', [0, 1]],
     ['closure', 'g', [1]],
     ['uset', 'f', 1, 8],
     ['uget', 'g', 0],
     ['get', 1],
     ['close', 1],
     ['uset', 'g', 0, 0],
     ['uget', 'f', 1]],),
   [8, 8, 0]),
  ('regression: new local reusing a closed slot',
   ([['local', 30],
     ['local', 0],
     ['closure', 'f', [0, 1]],
     ['closure', 'g', [1]],
     ['uset', 'f', 1, 8],
     ['uget', 'g', 0],
     ['get', 1],
     ['close', 1],
     ['uset', 'g', 0, 0],
     ['uget', 'f', 1],
     ['local', 80],
     ['closure', 'h', [1]],
     ['uget', 'h', 0],
     ['uget', 'f', 1]],),
   [8, 8, 0, 80, 0]),
  ('open upvalue tracks later stack writes',
   ([['local', 30],
     ['local', 0],
     ['closure', 'f', [0, 1]],
     ['closure', 'g', [1]],
     ['uset', 'f', 1, 8],
     ['uget', 'g', 0],
     ['get', 1],
     ['close', 1],
     ['uset', 'g', 0, 0],
     ['uget', 'f', 1],
     ['local', 80],
     ['closure', 'h', [1]],
     ['uget', 'h', 0],
     ['uget', 'f', 1],
     ['uget', 'f', 0],
     ['set', 0, 9],
     ['uget', 'f', 0],
     ['close', 0],
     ['uget', 'h', 0]],),
   [8, 8, 0, 80, 0, 30, 9, 80]),
  ('slot reuse after closing everything',
   ([['local', 30],
     ['local', 0],
     ['closure', 'f', [0, 1]],
     ['closure', 'g', [1]],
     ['uset', 'f', 1, 8],
     ['uget', 'g', 0],
     ['get', 1],
     ['close', 1],
     ['uset', 'g', 0, 0],
     ['uget', 'f', 1],
     ['local', 80],
     ['closure', 'h', [1]],
     ['uget', 'h', 0],
     ['uget', 'f', 1],
     ['uget', 'f', 0],
     ['set', 0, 9],
     ['uget', 'f', 0],
     ['close', 0],
     ['uget', 'h', 0],
     ['local', 109],
     ['closure', 'k', [0]],
     ['uget', 'k', 0],
     ['uget', 'f', 0],
     ['get', 0]],),
   [8, 8, 0, 80, 0, 30, 9, 80, 109, 9, 109]),
  ('closure over only the outer local',
   ([['local', 3], ['closure', 'c', [0]], ['close', 0], ['local', 2], ['uget', 'c', 0], ['get', 0]],),
   [3, 2]),
  ('control: plain locals', ([['local', 3], ['local', 2], ['set', 1, 4], ['get', 1], ['get', 0]],), [4, 3])],
 [('two closures share one open upvalue',
   ([['local', 40],
     ['local', 0],
     ['closure', 'f', [0, 1]],
     ['closure', 'g', [1]],
     ['uset', 'f', 1, 9],
     ['uget', 'g', 0],
     ['get', 1]],),
   [9, 9]),
  ('closing a scope keeps closures linked',
   ([['local', 40],
     ['local', 0],
     ['closure', 'f', [0, 1]],
     ['closure', 'g', [1]],
     ['uset', 'f', 1, 9],
     ['uget', 'g', 0],
     ['get', 1],
     ['close', 1],
     ['uset', 'g', 0, 0],
     ['uget', 'f', 1]],),
   [9, 9, 0]),
  ('regression: new local reusing a closed slot',
   ([['local', 40],
     ['local', 0],
     ['closure', 'f', [0, 1]],
     ['closure', 'g', [1]],
     ['uset', 'f', 1, 9],
     ['uget', 'g', 0],
     ['get', 1],
     ['close', 1],
     ['uset', 'g', 0, 0],
     ['uget', 'f', 1],
     ['local', 81],
     ['closure', 'h', [1]],
     ['uget', 'h', 0],
     ['uget', 'f', 1]],),
   [9, 9, 0, 81, 0]),
  ('open upvalue tracks later stack writes',
   ([['local', 40],
     ['local', 0],
     ['closure', 'f', [0, 1]],
     ['closure', 'g', [1]],
     ['uset', 'f', 1, 9],
     ['uget', 'g', 0],
     ['get', 1],
     ['close', 1],
     ['uset', 'g', 0, 0],
     ['uget', 'f', 1],
     ['local', 81],
     ['closure', 'h', [1]],
     ['uget', 'h', 0],
     ['uget', 'f', 1],
     ['uget', 'f', 0],
     ['set', 0, 12],
     ['uget', 'f', 0],
     ['close', 0],
     ['uget', 'h', 0]],),
   [9, 9, 0, 81, 0, 40, 12, 81]),
  ('slot reuse after closing everything',
   ([['local', 40],
     ['local', 0],
     ['closure', 'f', [0, 1]],
     ['closure', 'g', [1]],
     ['uset', 'f', 1, 9],
     ['uget', 'g', 0],
     ['get', 1],
     ['close', 1],
     ['uset', 'g', 0, 0],
     ['uget', 'f', 1],
     ['local', 81],
     ['closure', 'h', [1]],
     ['uget', 'h', 0],
     ['uget', 'f', 1],
     ['uget', 'f', 0],
     ['set', 0, 12],
     ['uget', 'f', 0],
     ['close', 0],
     ['uget', 'h', 0],
     ['local', 109],
     ['closure', 'k', [0]],
     ['uget', 'k', 0],
     ['uget', 'f', 0],
     ['get', 0]],),
   [9, 9, 0, 81, 0, 40, 12, 81, 109, 12, 109]),
  ('closure over only the outer local',
   ([['local', 4], ['closure', 'c', [0]], ['close', 0], ['local', 2], ['uget', 'c', 0], ['get', 0]],),
   [4, 2]),
  ('control: plain locals', ([['local', 4], ['local', 2], ['set', 1, 4], ['get', 1], ['get', 0]],), [4, 4])],
 [('two closures share one open upvalue',
   ([['local', 50],
     ['local', 0],
     ['closure', 'f', [0, 1]],
     ['closure', 'g', [1]],
     ['uset', 'f', 1, 10],
     ['uget', 'g', 0],
     ['get', 1]],),
   [10, 10]),
  ('closing a scope keeps closures linked',
   ([['local', 50],
     ['local', 0],
     ['closure', 'f', [0, 1]],
     ['closure', 'g', [1]],
     ['uset', 'f', 1, 10],
     ['uget', 'g', 0],
     ['get', 1],
     ['close', 1],
     ['uset', 'g', 0, 0],
     ['uget', 'f', 1]],),
   [10, 10, 0]),
  ('regression: new local reusing a closed slot',
   ([['local', 50],
     ['local', 0],
     ['closure', 'f', [0, 1]],
     ['closure', 'g', [1]],
     ['uset', 'f', 1, 10],
     ['uget', 'g', 0],
     ['get', 1],
     ['close', 1],
     ['uset', 'g', 0, 0],
     ['uget', 'f', 1],
     ['local', 82],
     ['closure', 'h', [1]],
     ['uget', 'h', 0],
     ['uget', 'f', 1]],),
   [10, 10, 0, 82, 0]),
  ('open upvalue tracks later stack writes',
   ([['local', 50],
     ['local', 0],
     ['closure', 'f', [0, 1]],
     ['closure', 'g', [1]],
     ['uset', 'f', 1, 10],
     ['uget', 'g', 0],
     ['get', 1],
     ['close', 1],
     ['uset', 'g', 0, 0],
     ['uget', 'f', 1],
     ['local', 82],
     ['closure', 'h', [1]],
     ['uget', 'h', 0],
     ['uget', 'f', 1],
     ['uget', 'f', 0],
     ['set', 0, 15],
     ['uget', 'f', 0],
     ['close', 0],
     ['uget', 'h', 0]],),
   [10, 10, 0, 82, 0, 50, 15, 82]),
  ('slot reuse after closing everything',
   ([['local', 50],
     ['local', 0],
     ['closure', 'f', [0, 1]],
     ['closure', 'g', [1]],
     ['uset', 'f', 1, 10],
     ['uget', 'g', 0],
     ['get', 1],
     ['close', 1],
     ['uset', 'g', 0, 0],
     ['uget', 'f', 1],
     ['local', 82],
     ['closure', 'h', [1]],
     ['uget', 'h', 0],
     ['uget', 'f', 1],
     ['uget', 'f', 0],
     ['set', 0, 15],
     ['uget', 'f', 0],
     ['close', 0],
     ['uget', 'h', 0],
     ['local', 109],
     ['closure', 'k', [0]],
     ['uget', 'k', 0],
     ['uget', 'f', 0],
     ['get', 0]],),
   [10, 10, 0, 82, 0, 50, 15, 82, 109, 15, 109]),
  ('closure over only the outer local',
   ([['local', 5], ['closure', 'c', [0]], ['close', 0], ['local', 2], ['uget', 'c', 0], ['get', 0]],),
   [5, 2]),
  ('control: plain locals', ([['local', 5], ['local', 2], ['set', 1, 4], ['get', 1], ['get', 0]],), [4, 5])]]
for label, args, expected in cases[N - 1]:
    check(label, solve(*args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)

meaning: Fixture-count band, not measured model difficulty

deps: stdlib

source:
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(events):
    stack = []
    open_uv = []
    closures = {}
    out = []
    try:
        for ev in events:
            op = ev[0]
            if op == 'local':
                stack.append(ev[1])
            elif op == 'set':
                stack[ev[1]] = ev[2]
            elif op == 'get':
                out.append(stack[ev[1]])
            elif op == 'closure':
                ups = []
                for s in ev[2]:
                    uv = next((u for u in open_uv if u['slot'] == s), None)
                    if uv is None:
                        uv = {'slot': s, 'open': True, 'value': None}
                        open_uv.append(uv)
                    ups.append(uv)
                closures[ev[1]] = ups
            elif op == 'uset':
                uv = closures[ev[1]][ev[2]]
                if uv['open']:
                    stack[uv['slot']] = ev[3]
                else:
                    uv['value'] = ev[3]
            elif op == 'uget':
                uv = closures[ev[1]][ev[2]]
                out.append(stack[uv['slot']] if uv['open'] else uv['value'])
            elif op == 'close':
                level = ev[1]
                for uv in open_uv:
                    if uv['slot'] >= level:
                        uv['value'] = stack[uv['slot']]
                        uv['open'] = False
                open_uv = [u for u in open_uv if u['open']]
                del stack[level - 1:]
    except IndexError:
        out.append('dangling-slot')
    return out
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
cases = [[('two closures share one open upvalue',
   ([['local', 10],
     ['local', 0],
     ['closure', 'f', [0, 1]],
     ['closure', 'g', [1]],
     ['uset', 'f', 1, 6],
     ['uget', 'g', 0],
     ['get', 1]],),
   [6, 6]),
  ('closing a scope keeps closures linked',
   ([['local', 10],
     ['local', 0],
     ['closure', 'f', [0, 1]],
     ['closure', 'g', [1]],
     ['uset', 'f', 1, 6],
     ['uget', 'g', 0],
     ['get', 1],
     ['close', 1],
     ['uset', 'g', 0, 0],
     ['uget', 'f', 1]],),
   [6, 6, 0]),
  ('regression: new local reusing a closed slot',
   ([['local', 10],
     ['local', 0],
     ['closure', 'f', [0, 1]],
     ['closure', 'g', [1]],
     ['uset', 'f', 1, 6],
     ['uget', 'g', 0],
     ['get', 1],
     ['close', 1],
     ['uset', 'g', 0, 0],
     ['uget', 'f', 1],
     ['local', 78],
     ['closure', 'h', [1]],
     ['uget', 'h', 0],
     ['uget', 'f', 1]],),
   [6, 6, 0, 78, 0]),
  ('open upvalue tracks later stack writes',
   ([['local', 10],
     ['local', 0],
     ['closure', 'f', [0, 1]],
     ['closure', 'g', [1]],
     ['uset', 'f', 1, 6],
     ['uget', 'g', 0],
     ['get', 1],
     ['close', 1],
     ['uset', 'g', 0, 0],
     ['uget', 'f', 1],
     ['local', 78],
     ['closure', 'h', [1]],
     ['uget', 'h', 0],
     ['uget', 'f', 1],
     ['uget', 'f', 0],
     ['set', 0, 3],
     ['uget', 'f', 0],
     ['close', 0],
     ['uget', 'h', 0]],),
   [6, 6, 0, 78, 0, 10, 3, 78]),
  ('slot reuse after closing everything',
   ([['local', 10],
     ['local', 0],
     ['closure', 'f', [0, 1]],
     ['closure', 'g', [1]],
     ['uset', 'f', 1, 6],
     ['uget', 'g', 0],
     ['get', 1],
     ['close', 1],
     ['uset', 'g', 0, 0],
     ['uget', 'f', 1],
     ['local', 78],
     ['closure', 'h', [1]],
     ['uget', 'h', 0],
     ['uget', 'f', 1],
     ['uget', 'f', 0],
     ['set', 0, 3],
     ['uget', 'f', 0],
     ['close', 0],
     ['uget', 'h', 0],
     ['local', 109],
     ['closure', 'k', [0]],
     ['uget', 'k', 0],
     ['uget', 'f', 0],
     ['get', 0]],),
   [6, 6, 0, 78, 0, 10, 3, 78, 109, 3, 109]),
  ('closure over only the outer local',
   ([['local', 1], ['closure', 'c', [0]], ['close', 0], ['local', 2], ['uget', 'c', 0], ['get', 0]],),
   [1, 2]),
  ('control: plain locals', ([['local', 1], ['local', 2], ['set', 1, 4], ['get', 1], ['get', 0]],), [4, 1])],
 [('two closures share one open upvalue',
   ([['local', 20],
     ['local', 0],
     ['closure', 'f', [0, 1]],
     ['closure', 'g', [1]],
     ['uset', 'f', 1, 7],
     ['uget', 'g', 0],
     ['get', 1]],),
   [7, 7]),
  ('closing a scope keeps closures linked',
   ([['local', 20],
     ['local', 0],
     ['closure', 'f', [0, 1]],
     ['closure', 'g', [1]],
     ['uset', 'f', 1, 7],
     ['uget', 'g', 0],
     ['get', 1],
     ['close', 1],
     ['uset', 'g', 0, 0],
     ['uget', 'f', 1]],),
   [7, 7, 0]),
  ('regression: new local reusing a closed slot',
   ([['local', 20],
     ['local', 0],
     ['closure', 'f', [0, 1]],
     ['closure', 'g', [1]],
     ['uset', 'f', 1, 7],
     ['uget', 'g', 0],
     ['get', 1],
     ['close', 1],
     ['uset', 'g', 0, 0],
     ['uget', 'f', 1],
     ['local', 79],
     ['closure', 'h', [1]],
     ['uget', 'h', 0],
     ['uget', 'f', 1]],),
   [7, 7, 0, 79, 0]),
  ('open upvalue tracks later stack writes',
   ([['local', 20],
     ['local', 0],
     ['closure', 'f', [0, 1]],
     ['closure', 'g', [1]],
     ['uset', 'f', 1, 7],
     ['uget', 'g', 0],
     ['get', 1],
     ['close', 1],
     ['uset', 'g', 0, 0],
     ['uget', 'f', 1],
     ['local', 79],
     ['closure', 'h', [1]],
     ['uget', 'h', 0],
     ['uget', 'f', 1],
     ['uget', 'f', 0],
     ['set', 0, 6],
     ['uget', 'f', 0],
     ['close', 0],
     ['uget', 'h', 0]],),
   [7, 7, 0, 79, 0, 20, 6, 79]),
  ('slot reuse after closing everything',
   ([['local', 20],
     ['local', 0],
     ['closure', 'f', [0, 1]],
     ['closure', 'g', [1]],
     ['uset', 'f', 1, 7],
     ['uget', 'g', 0],
     ['get', 1],
     ['close', 1],
     ['uset', 'g', 0, 0],
     ['uget', 'f', 1],
     ['local', 79],
     ['closure', 'h', [1]],
     ['uget', 'h', 0],
     ['uget', 'f', 1],
     ['uget', 'f', 0],
     ['set', 0, 6],
     ['uget', 'f', 0],
     ['close', 0],
     ['uget', 'h', 0],
     ['local', 109],
     ['closure', 'k', [0]],
     ['uget', 'k', 0],
     ['uget', 'f', 0],
     ['get', 0]],),
   [7, 7, 0, 79, 0, 20, 6, 79, 109, 6, 109]),
  ('closure over only the outer local',
   ([['local', 2], ['closure', 'c', [0]], ['close', 0], ['local', 2], ['uget', 'c', 0], ['get', 0]],),
   [2, 2]),
  ('control: plain locals', ([['local', 2], ['local', 2], ['set', 1, 4], ['get', 1], ['get', 0]],), [4, 2])],
 [('two closures share one open upvalue',
   ([['local', 30],
     ['local', 0],
     ['closure', 'f', [0, 1]],
     ['closure', 'g', [1]],
     ['uset', 'f', 1, 8],
     ['uget', 'g', 0],
     ['get', 1]],),
   [8, 8]),
  ('closing a scope keeps closures linked',
   ([['local', 30],
     ['local', 0],
     ['closure', 'f', [0, 1]],
     ['closure', 'g', [1]],
     ['uset', 'f', 1, 8],
     ['uget', 'g', 0],
     ['get', 1],
     ['close', 1],
     ['uset', 'g', 0, 0],
     ['uget', 'f', 1]],),
   [8, 8, 0]),
  ('regression: new local reusing a closed slot',
   ([['local', 30],
     ['local', 0],
     ['closure', 'f', [0, 1]],
     ['closure', 'g', [1]],
     ['uset', 'f', 1, 8],
     ['uget', 'g', 0],
     ['get', 1],
     ['close', 1],
     ['uset', 'g', 0, 0],
     ['uget', 'f', 1],
     ['local', 80],
     ['closure', 'h', [1]],
     ['uget', 'h', 0],
     ['uget', 'f', 1]],),
   [8, 8, 0, 80, 0]),
  ('open upvalue tracks later stack writes',
   ([['local', 30],
     ['local', 0],
     ['closure', 'f', [0, 1]],
     ['closure', 'g', [1]],
     ['uset', 'f', 1, 8],
     ['uget', 'g', 0],
     ['get', 1],
     ['close', 1],
     ['uset', 'g', 0, 0],
     ['uget', 'f', 1],
     ['local', 80],
     ['closure', 'h', [1]],
     ['uget', 'h', 0],
     ['uget', 'f', 1],
     ['uget', 'f', 0],
     ['set', 0, 9],
     ['uget', 'f', 0],
     ['close', 0],
     ['uget', 'h', 0]],),
   [8, 8, 0, 80, 0, 30, 9, 80]),
  ('slot reuse after closing everything',
   ([['local', 30],
     ['local', 0],
     ['closure', 'f', [0, 1]],
     ['closure', 'g', [1]],
     ['uset', 'f', 1, 8],
     ['uget', 'g', 0],
     ['get', 1],
     ['close', 1],
     ['uset', 'g', 0, 0],
     ['uget', 'f', 1],
     ['local', 80],
     ['closure', 'h', [1]],
     ['uget', 'h', 0],
     ['uget', 'f', 1],
     ['uget', 'f', 0],
     ['set', 0, 9],
     ['uget', 'f', 0],
     ['close', 0],
     ['uget', 'h', 0],
     ['local', 109],
     ['closure', 'k', [0]],
     ['uget', 'k', 0],
     ['uget', 'f', 0],
     ['get', 0]],),
   [8, 8, 0, 80, 0, 30, 9, 80, 109, 9, 109]),
  ('closure over only the outer local',
   ([['local', 3], ['closure', 'c', [0]], ['close', 0], ['local', 2], ['uget', 'c', 0], ['get', 0]],),
   [3, 2]),
  ('control: plain locals', ([['local', 3], ['local', 2], ['set', 1, 4], ['get', 1], ['get', 0]],), [4, 3])],
 [('two closures share one open upvalue',
   ([['local', 40],
     ['local', 0],
     ['closure', 'f', [0, 1]],
     ['closure', 'g', [1]],
     ['uset', 'f', 1, 9],
     ['uget', 'g', 0],
     ['get', 1]],),
   [9, 9]),
  ('closing a scope keeps closures linked',
   ([['local', 40],
     ['local', 0],
     ['closure', 'f', [0, 1]],
     ['closure', 'g', [1]],
     ['uset', 'f', 1, 9],
     ['uget', 'g', 0],
     ['get', 1],
     ['close', 1],
     ['uset', 'g', 0, 0],
     ['uget', 'f', 1]],),
   [9, 9, 0]),
  ('regression: new local reusing a closed slot',
   ([['local', 40],
     ['local', 0],
     ['closure', 'f', [0, 1]],
     ['closure', 'g', [1]],
     ['uset', 'f', 1, 9],
     ['uget', 'g', 0],
     ['get', 1],
     ['close', 1],
     ['uset', 'g', 0, 0],
     ['uget', 'f', 1],
     ['local', 81],
     ['closure', 'h', [1]],
     ['uget', 'h', 0],
     ['uget', 'f', 1]],),
   [9, 9, 0, 81, 0]),
  ('open upvalue tracks later stack writes',
   ([['local', 40],
     ['local', 0],
     ['closure', 'f', [0, 1]],
     ['closure', 'g', [1]],
     ['uset', 'f', 1, 9],
     ['uget', 'g', 0],
     ['get', 1],
     ['close', 1],
     ['uset', 'g', 0, 0],
     ['uget', 'f', 1],
     ['local', 81],
     ['closure', 'h', [1]],
     ['uget', 'h', 0],
     ['uget', 'f', 1],
     ['uget', 'f', 0],
     ['set', 0, 12],
     ['uget', 'f', 0],
     ['close', 0],
     ['uget', 'h', 0]],),
   [9, 9, 0, 81, 0, 40, 12, 81]),
  ('slot reuse after closing everything',
   ([['local', 40],
     ['local', 0],
     ['closure', 'f', [0, 1]],
     ['closure', 'g', [1]],
     ['uset', 'f', 1, 9],
     ['uget', 'g', 0],
     ['get', 1],
     ['close', 1],
     ['uset', 'g', 0, 0],
     ['uget', 'f', 1],
     ['local', 81],
     ['closure', 'h', [1]],
     ['uget', 'h', 0],
     ['uget', 'f', 1],
     ['uget', 'f', 0],
     ['set', 0, 12],
     ['uget', 'f', 0],
     ['close', 0],
     ['uget', 'h', 0],
     ['local', 109],
     ['closure', 'k', [0]],
     ['uget', 'k', 0],
     ['uget', 'f', 0],
     ['get', 0]],),
   [9, 9, 0, 81, 0, 40, 12, 81, 109, 12, 109]),
  ('closure over only the outer local',
   ([['local', 4], ['closure', 'c', [0]], ['close', 0], ['local', 2], ['uget', 'c', 0], ['get', 0]],),
   [4, 2]),
  ('control: plain locals', ([['local', 4], ['local', 2], ['set', 1, 4], ['get', 1], ['get', 0]],), [4, 4])],
 [('two closures share one open upvalue',
   ([['local', 50],
     ['local', 0],
     ['closure', 'f', [0, 1]],
     ['closure', 'g', [1]],
     ['uset', 'f', 1, 10],
     ['uget', 'g', 0],
     ['get', 1]],),
   [10, 10]),
  ('closing a scope keeps closures linked',
   ([['local', 50],
     ['local', 0],
     ['closure', 'f', [0, 1]],
     ['closure', 'g', [1]],
     ['uset', 'f', 1, 10],
     ['uget', 'g', 0],
     ['get', 1],
     ['close', 1],
     ['uset', 'g', 0, 0],
     ['uget', 'f', 1]],),
   [10, 10, 0]),
  ('regression: new local reusing a closed slot',
   ([['local', 50],
     ['local', 0],
     ['closure', 'f', [0, 1]],
     ['closure', 'g', [1]],
     ['uset', 'f', 1, 10],
     ['uget', 'g', 0],
     ['get', 1],
     ['close', 1],
     ['uset', 'g', 0, 0],
     ['uget', 'f', 1],
     ['local', 82],
     ['closure', 'h', [1]],
     ['uget', 'h', 0],
     ['uget', 'f', 1]],),
   [10, 10, 0, 82, 0]),
  ('open upvalue tracks later stack writes',
   ([['local', 50],
     ['local', 0],
     ['closure', 'f', [0, 1]],
     ['closure', 'g', [1]],
     ['uset', 'f', 1, 10],
     ['uget', 'g', 0],
     ['get', 1],
     ['close', 1],
     ['uset', 'g', 0, 0],
     ['uget', 'f', 1],
     ['local', 82],
     ['closure', 'h', [1]],
     ['uget', 'h', 0],
     ['uget', 'f', 1],
     ['uget', 'f', 0],
     ['set', 0, 15],
     ['uget', 'f', 0],
     ['close', 0],
     ['uget', 'h', 0]],),
   [10, 10, 0, 82, 0, 50, 15, 82]),
  ('slot reuse after closing everything',
   ([['local', 50],
     ['local', 0],
     ['closure', 'f', [0, 1]],
     ['closure', 'g', [1]],
     ['uset', 'f', 1, 10],
     ['uget', 'g', 0],
     ['get', 1],
     ['close', 1],
     ['uset', 'g', 0, 0],
     ['uget', 'f', 1],
     ['local', 82],
     ['closure', 'h', [1]],
     ['uget', 'h', 0],
     ['uget', 'f', 1],
     ['uget', 'f', 0],
     ['set', 0, 15],
     ['uget', 'f', 0],
     ['close', 0],
     ['uget', 'h', 0],
     ['local', 109],
     ['closure', 'k', [0]],
     ['uget', 'k', 0],
     ['uget', 'f', 0],
     ['get', 0]],),
   [10, 10, 0, 82, 0, 50, 15, 82, 109, 15, 109]),
  ('closure over only the outer local',
   ([['local', 5], ['closure', 'c', [0]], ['close', 0], ['local', 2], ['uget', 'c', 0], ['get', 0]],),
   [5, 2]),
  ('control: plain locals', ([['local', 5], ['local', 2], ['set', 1, 4], ['get', 1], ['get', 0]],), [4, 5])]]
for label, args, expected in cases[N - 1]:
    check(label, solve(*args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)

prompt:
Locals declared after a scope ends get shifted slot numbers.

A register/stack VM with open and closed upvalues. ["local", v] pushes a slot; ["set", s, v] and ["get", s] access slots; ["closure", id, [slots]] captures slots, reusing the existing open upvalue for a slot so closures share variables; ["uset"/"uget", id, k, (v)] access the k-th upvalue, going to the stack slot while open and to the upvalue's own cell once closed; ["close", level] closes every open upvalue whose slot >= level (copying the slot value) and truncates the stack to level. Accessing a vanished slot appends "dangling-slot" and stops.

split: open-access


broken_source:
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(code, locals_, fuel):
    match = {}
    opens = []
    for i, ins in enumerate(code):
        if ins[0] in ('block', 'loop'):
            opens.append(i)
        elif ins[0] == 'end':
            match[opens.pop()] = i
    loc = list(locals_)
    stack = []
    labels = []
    pc = 0
    steps = 0
    try:
        while pc < len(code):
            if steps == fuel:
                return {'status': 'fuel', 'stack': stack, 'locals': loc}
            steps += 1
            ins = code[pc]
            op = ins[0]
            if op in ('block', 'loop'):
                labels.append({'kind': op, 'pc': pc, 'end': match[pc], 'height': len(stack),
                               'arity': ins[1] if op == 'block' else 0})
                pc += 1
            elif op == 'end':
                labels.pop()
                pc += 1
            elif op in ('br', 'br_if'):
                if op == 'br_if' and stack.pop() == 0:
                    pc += 1
                    continue
                target = labels[ins[1]]
                keep = stack[len(stack) - target['arity']:] if target['arity'] else []
                del stack[target['height']:]
                stack.extend(keep)
                if target['kind'] == 'loop':
                    del labels[len(labels) - ins[1]:]
                    pc = target['pc'] + 1
                else:
                    del labels[len(labels) - 1 - ins[1]:]
                    pc = target['end'] + 1
            elif op == 'const':
                stack.append(ins[1])
                pc += 1
            elif op in ('add', 'sub'):
                b = stack.pop()
                a = stack.pop()
                stack.append(a + b if op == 'add' else a - b)
                pc += 1
            elif op == 'eqz':
                stack.append(1 if stack.pop() == 0 else 0)
                pc += 1
            elif op == 'get':
                stack.append(loc[ins[1]])
                pc += 1
            elif op == 'set':
                loc[ins[1]] = stack.pop()
                pc += 1
            else:
                stack.pop()
                pc += 1
    except IndexError:
        return {'status': 'trap', 'stack': stack, 'locals': loc}
    return {'status': 'done', 'stack': stack, 'locals': loc}
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
cases = [[('regression: counted loop exits through outer block',
   ([['block', 0],
     ['loop', 0],
     ['get', 0],
     ['eqz'],
     ['br_if', 1],
     ['get', 1],
     ['get', 0],
     ['add'],
     ['set', 1],
     ['get', 0],
     ['const', 1],
     ['sub'],
     ['set', 0],
     ['br', 0],
     ['end'],
     ['end']],
    [2, 0],
    500),
   {'locals': [0, 3], 'stack': [], 'status': 'done'}),
  ('continue from inside a nested block',
   ([['block', 0],
     ['loop', 0],
     ['get', 0],
     ['eqz'],
     ['br_if', 1],
     ['block', 0],
     ['get', 0],
     ['const', 1],
     ['sub'],
     ['set', 0],
     ['get', 1],
     ['const', 2],
     ['add'],
     ['set', 1],
     ['br', 1],
     ['end'],
     ['const', 999],
     ['set', 1],
     ['end'],
     ['end']],
    [2, 0],
    500),
   {'locals': [0, 4], 'stack': [], 'status': 'done'}),
  ('continue loop with more iterations',
   ([['block', 0],
     ['loop', 0],
     ['get', 0],
     ['eqz'],
     ['br_if', 1],
     ['block', 0],
     ['get', 0],
     ['const', 1],
     ['sub'],
     ['set', 0],
     ['get', 1],
     ['const', 2],
     ['add'],
     ['set', 1],
     ['br', 1],
     ['end'],
     ['const', 999],
     ['set', 1],
     ['end'],
     ['end']],
    [4, 0],
    900),
   {'locals': [0, 8], 'stack': [], 'status': 'done'}),
  ('block result keeps one value above outer operand',
   ([['const', 41], ['block', 1], ['const', 5], ['const', 7], ['br', 0], ['const', 99], ['end']], [], 50),
   {'locals': [], 'stack': [41, 7], 'status': 'done'}),
  ('void block branch discards operands',
   ([['block', 0], ['const', 1], ['const', 1], ['br', 0], ['end'], ['const', 3]], [], 50),
   {'locals': [], 'stack': [3], 'status': 'done'}),
  ('untaken br_if consumes its condition',
   ([['const', 10], ['block', 0], ['const', 0], ['br_if', 0], ['const', 3], ['add'], ['end']], [], 50),
   {'locals': [], 'stack': [13], 'status': 'done'}),
  ('taken br_if exits the block',
   ([['const', 10], ['block', 0], ['const', 1], ['br_if', 0], ['const', 3], ['add'], ['end']], [], 50),
   {'locals': [], 'stack': [10], 'status': 'done'}),
  ('control: fuel exhaustion',
   ([['block', 0],
     ['loop', 0],
     ['get', 0],
     ['eqz'],
     ['br_if', 1],
     ['get', 1],
     ['get', 0],
     ['add'],
     ['set', 1],
     ['get', 0],
     ['const', 1],
     ['sub'],
     ['set', 0],
     ['br', 0],
     ['end'],
     ['end']],
    [50, 0],
    21),
   {'locals': [49, 99], 'stack': [], 'status': 'fuel'})],
 [('regression: counted loop exits through outer block',
   ([['block', 0],
     ['loop', 0],
     ['get', 0],
     ['eqz'],
     ['br_if', 1],
     ['get', 1],
     ['get', 0],
     ['add'],
     ['set', 1],
     ['get', 0],
     ['const', 1],
     ['sub'],
     ['set', 0],
     ['br', 0],
     ['end'],
     ['end']],
    [3, 0],
    500),
   {'locals': [0, 6], 'stack': [], 'status': 'done'}),
  ('continue from inside a nested block',
   ([['block', 0],
     ['loop', 0],
     ['get', 0],
     ['eqz'],
     ['br_if', 1],
     ['block', 0],
     ['get', 0],
     ['const', 1],
     ['sub'],
     ['set', 0],
     ['get', 1],
     ['const', 2],
     ['add'],
     ['set', 1],
     ['br', 1],
     ['end'],
     ['const', 999],
     ['set', 1],
     ['end'],
     ['end']],
    [3, 0],
    500),
   {'locals': [0, 6], 'stack': [], 'status': 'done'}),
  ('continue loop with more iterations',
   ([['block', 0],
     ['loop', 0],
     ['get', 0],
     ['eqz'],
     ['br_if', 1],
     ['block', 0],
     ['get', 0],
     ['const', 1],
     ['sub'],
     ['set', 0],
     ['get', 1],
     ['const', 2],
     ['add'],
     ['set', 1],
     ['br', 1],
     ['end'],
     ['const', 999],
     ['set', 1],
     ['end'],
     ['end']],
    [5, 0],
    900),
   {'locals': [0, 10], 'stack': [], 'status': 'done'}),
  ('block result keeps one value above outer operand',
   ([['const', 42], ['block', 1], ['const', 5], ['const', 7], ['br', 0], ['const', 99], ['end']], [], 50),
   {'locals': [], 'stack': [42, 7], 'status': 'done'}),
  ('void block branch discards operands',
   ([['block', 0], ['const', 1], ['const', 2], ['br', 0], ['end'], ['const', 3]], [], 50),
   {'locals': [], 'stack': [3], 'status': 'done'}),
  ('untaken br_if consumes its condition',
   ([['const', 20], ['block', 0], ['const', 0], ['br_if', 0], ['const', 3], ['add'], ['end']], [], 50),
   {'locals': [], 'stack': [23], 'status': 'done'}),
  ('taken br_if exits the block',
   ([['const', 10], ['block', 0], ['const', 2], ['br_if', 0], ['const', 3], ['add'], ['end']], [], 50),
   {'locals': [], 'stack': [10], 'status': 'done'}),
  ('control: fuel exhaustion',
   ([['block', 0],
     ['loop', 0],
     ['get', 0],
     ['eqz'],
     ['br_if', 1],
     ['get', 1],
     ['get', 0],
     ['add'],
     ['set', 1],
     ['get', 0],
     ['const', 1],
     ['sub'],
     ['set', 0],
     ['br', 0],
     ['end'],
     ['end']],
    [50, 0],
    22),
   {'locals': [49, 99], 'stack': [49], 'status': 'fuel'})],
 [('regression: counted loop exits through outer block',
   ([['block', 0],
     ['loop', 0],
     ['get', 0],
     ['eqz'],
     ['br_if', 1],
     ['get', 1],
     ['get', 0],
     ['add'],
     ['set', 1],
     ['get', 0],
     ['const', 1],
     ['sub'],
     ['set', 0],
     ['br', 0],
     ['end'],
     ['end']],
    [4, 0],
    500),
   {'locals': [0, 10], 'stack': [], 'status': 'done'}),
  ('continue from inside a nested block',
   ([['block', 0],
     ['loop', 0],
     ['get', 0],
     ['eqz'],
     ['br_if', 1],
     ['block', 0],
     ['get', 0],
     ['const', 1],
     ['sub'],
     ['set', 0],
     ['get', 1],
     ['const', 2],
     ['add'],
     ['set', 1],
     ['br', 1],
     ['end'],
     ['const', 999],
     ['set', 1],
     ['end'],
     ['end']],
    [4, 0],
    500),
   {'locals': [0, 8], 'stack': [], 'status': 'done'}),
  ('continue loop with more iterations',
   ([['block', 0],
     ['loop', 0],
     ['get', 0],
     ['eqz'],
     ['br_if', 1],
     ['block', 0],
     ['get', 0],
     ['const', 1],
     ['sub'],
     ['set', 0],
     ['get', 1],
     ['const', 2],
     ['add'],
     ['set', 1],
     ['br', 1],
     ['end'],
     ['const', 999],
     ['set', 1],
     ['end'],
     ['end']],
    [6, 0],
    900),
   {'locals': [0, 12], 'stack': [], 'status': 'done'}),
  ('block result keeps one value above outer operand',
   ([['const', 43], ['block', 1], ['const', 5], ['const', 7], ['br', 0], ['const', 99], ['end']], [], 50),
   {'locals': [], 'stack': [43, 7], 'status': 'done'}),
  ('void block branch discards operands',
   ([['block', 0], ['const', 1], ['const', 3], ['br', 0], ['end'], ['const', 3]], [], 50),
   {'locals': [], 'stack': [3], 'status': 'done'}),
  ('untaken br_if consumes its condition',
   ([['const', 30], ['block', 0], ['const', 0], ['br_if', 0], ['const', 3], ['add'], ['end']], [], 50),
   {'locals': [], 'stack': [33], 'status': 'done'}),
  ('taken br_if exits the block',
   ([['const', 10], ['block', 0], ['const', 3], ['br_if', 0], ['const', 3], ['add'], ['end']], [], 50),
   {'locals': [], 'stack': [10], 'status': 'done'}),
  ('control: fuel exhaustion',
   ([['block', 0],
     ['loop', 0],
     ['get', 0],
     ['eqz'],
     ['br_if', 1],
     ['get', 1],
     ['get', 0],
     ['add'],
     ['set', 1],
     ['get', 0],
     ['const', 1],
     ['sub'],
     ['set', 0],
     ['br', 0],
     ['end'],
     ['end']],
    [50, 0],
    23),
   {'locals': [49, 99], 'stack': [49, 1], 'status': 'fuel'})],
 [('regression: counted loop exits through outer block',
   ([['block', 0],
     ['loop', 0],
     ['get', 0],
     ['eqz'],
     ['br_if', 1],
     ['get', 1],
     ['get', 0],
     ['add'],
     ['set', 1],
     ['get', 0],
     ['const', 1],
     ['sub'],
     ['set', 0],
     ['br', 0],
     ['end'],
     ['end']],
    [5, 0],
    500),
   {'locals': [0, 15], 'stack': [], 'status': 'done'}),
  ('continue from inside a nested block',
   ([['block', 0],
     ['loop', 0],
     ['get', 0],
     ['eqz'],
     ['br_if', 1],
     ['block', 0],
     ['get', 0],
     ['const', 1],
     ['sub'],
     ['set', 0],
     ['get', 1],
     ['const', 2],
     ['add'],
     ['set', 1],
     ['br', 1],
     ['end'],
     ['const', 999],
     ['set', 1],
     ['end'],
     ['end']],
    [5, 0],
    500),
   {'locals': [0, 10], 'stack': [], 'status': 'done'}),
  ('continue loop with more iterations',
   ([['block', 0],
     ['loop', 0],
     ['get', 0],
     ['eqz'],
     ['br_if', 1],
     ['block', 0],
     ['get', 0],
     ['const', 1],
     ['sub'],
     ['set', 0],
     ['get', 1],
     ['const', 2],
     ['add'],
     ['set', 1],
     ['br', 1],
     ['end'],
     ['const', 999],
     ['set', 1],
     ['end'],
     ['end']],
    [7, 0],
    900),
   {'locals': [0, 14], 'stack': [], 'status': 'done'}),
  ('block result keeps one value above outer operand',
   ([['const', 44], ['block', 1], ['const', 5], ['const', 7], ['br', 0], ['const', 99], ['end']], [], 50),
   {'locals': [], 'stack': [44, 7], 'status': 'done'}),
  ('void block branch discards operands',
   ([['block', 0], ['const', 1], ['const', 4], ['br', 0], ['end'], ['const', 3]], [], 50),
   {'locals': [], 'stack': [3], 'status': 'done'}),
  ('untaken br_if consumes its condition',
   ([['const', 40], ['block', 0], ['const', 0], ['br_if', 0], ['const', 3], ['add'], ['end']], [], 50),
   {'locals': [], 'stack': [43], 'status': 'done'}),
  ('taken br_if exits the block',
   ([['const', 10], ['block', 0], ['const', 4], ['br_if', 0], ['const', 3], ['add'], ['end']], [], 50),
   {'locals': [], 'stack': [10], 'status': 'done'}),
  ('control: fuel exhaustion',
   ([['block', 0],
     ['loop', 0],
     ['get', 0],
     ['eqz'],
     ['br_if', 1],
     ['get', 1],
     ['get', 0],
     ['add'],
     ['set', 1],
     ['get', 0],
     ['const', 1],
     ['sub'],
     ['set', 0],
     ['br', 0],
     ['end'],
     ['end']],
    [50, 0],
    24),
   {'locals': [49, 99], 'stack': [48], 'status': 'fuel'})],
 [('regression: counted loop exits through outer block',
   ([['block', 0],
     ['loop', 0],
     ['get', 0],
     ['eqz'],
     ['br_if', 1],
     ['get', 1],
     ['get', 0],
     ['add'],
     ['set', 1],
     ['get', 0],
     ['const', 1],
     ['sub'],
     ['set', 0],
     ['br', 0],
     ['end'],
     ['end']],
    [6, 0],
    500),
   {'locals': [0, 21], 'stack': [], 'status': 'done'}),
  ('continue from inside a nested block',
   ([['block', 0],
     ['loop', 0],
     ['get', 0],
     ['eqz'],
     ['br_if', 1],
     ['block', 0],
     ['get', 0],
     ['const', 1],
     ['sub'],
     ['set', 0],
     ['get', 1],
     ['const', 2],
     ['add'],
     ['set', 1],
     ['br', 1],
     ['end'],
     ['const', 999],
     ['set', 1],
     ['end'],
     ['end']],
    [6, 0],
    500),
   {'locals': [0, 12], 'stack': [], 'status': 'done'}),
  ('continue loop with more iterations',
   ([['block', 0],
     ['loop', 0],
     ['get', 0],
     ['eqz'],
     ['br_if', 1],
     ['block', 0],
     ['get', 0],
     ['const', 1],
     ['sub'],
     ['set', 0],
     ['get', 1],
     ['const', 2],
     ['add'],
     ['set', 1],
     ['br', 1],
     ['end'],
     ['const', 999],
     ['set', 1],
     ['end'],
     ['end']],
    [8, 0],
    900),
   {'locals': [0, 16], 'stack': [], 'status': 'done'}),
  ('block result keeps one value above outer operand',
   ([['const', 45], ['block', 1], ['const', 5], ['const', 7], ['br', 0], ['const', 99], ['end']], [], 50),
   {'locals': [], 'stack': [45, 7], 'status': 'done'}),
  ('void block branch discards operands',
   ([['block', 0], ['const', 1], ['const', 5], ['br', 0], ['end'], ['const', 3]], [], 50),
   {'locals': [], 'stack': [3], 'status': 'done'}),
  ('untaken br_if consumes its condition',
   ([['const', 50], ['block', 0], ['const', 0], ['br_if', 0], ['const', 3], ['add'], ['end']], [], 50),
   {'locals': [], 'stack': [53], 'status': 'done'}),
  ('taken br_if exits the block',
   ([['const', 10], ['block', 0], ['const', 5], ['br_if', 0], ['const', 3], ['add'], ['end']], [], 50),
   {'locals': [], 'stack': [10], 'status': 'done'}),
  ('control: fuel exhaustion',
   ([['block', 0],
     ['loop', 0],
     ['get', 0],
     ['eqz'],
     ['br_if', 1],
     ['get', 1],
     ['get', 0],
     ['add'],
     ['set', 1],
     ['get', 0],
     ['const', 1],
     ['sub'],
     ['set', 0],
     ['br', 0],
     ['end'],
     ['end']],
    [50, 0],
    25),
   {'locals': [48, 99], 'stack': [], 'status': 'fuel'})]]
for label, args, expected in cases[N - 1]:
    check(label, solve(*args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)

source:
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(code, locals_, fuel):
    match = {}
    opens = []
    for i, ins in enumerate(code):
        if ins[0] in ('block', 'loop'):
            opens.append(i)
        elif ins[0] == 'end':
            match[opens.pop()] = i
    loc = list(locals_)
    stack = []
    labels = []
    pc = 0
    steps = 0
    try:
        while pc < len(code):
            if steps == fuel:
                return {'status': 'fuel', 'stack': stack, 'locals': loc}
            steps += 1
            ins = code[pc]
            op = ins[0]
            if op in ('block', 'loop'):
                labels.append({'kind': op, 'pc': pc, 'end': match[pc], 'height': len(stack),
                               'arity': ins[1] if op == 'block' else 0})
                pc += 1
            elif op == 'end':
                labels.pop()
                pc += 1
            elif op in ('br', 'br_if'):
                if op == 'br_if' and stack.pop() == 0:
                    pc += 1
                    continue
                target = labels[-ins[1]]
                keep = stack[len(stack) - target['arity']:] if target['arity'] else []
                del stack[target['height']:]
                stack.extend(keep)
                if target['kind'] == 'loop':
                    del labels[len(labels) - ins[1]:]
                    pc = target['pc'] + 1
                else:
                    del labels[len(labels) - 1 - ins[1]:]
                    pc = target['end'] + 1
            elif op == 'const':
                stack.append(ins[1])
                pc += 1
            elif op in ('add', 'sub'):
                b = stack.pop()
                a = stack.pop()
                stack.append(a + b if op == 'add' else a - b)
                pc += 1
            elif op == 'eqz':
                stack.append(1 if stack.pop() == 0 else 0)
                pc += 1
            elif op == 'get':
                stack.append(loc[ins[1]])
                pc += 1
            elif op == 'set':
                loc[ins[1]] = stack.pop()
                pc += 1
            else:
                stack.pop()
                pc += 1
    except IndexError:
        return {'status': 'trap', 'stack': stack, 'locals': loc}
    return {'status': 'done', 'stack': stack, 'locals': loc}
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
cases = [[('regression: counted loop exits through outer block',
   ([['block', 0],
     ['loop', 0],
     ['get', 0],
     ['eqz'],
     ['br_if', 1],
     ['get', 1],
     ['get', 0],
     ['add'],
     ['set', 1],
     ['get', 0],
     ['const', 1],
     ['sub'],
     ['set', 0],
     ['br', 0],
     ['end'],
     ['end']],
    [2, 0],
    500),
   {'locals': [0, 3], 'stack': [], 'status': 'done'}),
  ('continue from inside a nested block',
   ([['block', 0],
     ['loop', 0],
     ['get', 0],
     ['eqz'],
     ['br_if', 1],
     ['block', 0],
     ['get', 0],
     ['const', 1],
     ['sub'],
     ['set', 0],
     ['get', 1],
     ['const', 2],
     ['add'],
     ['set', 1],
     ['br', 1],
     ['end'],
     ['const', 999],
     ['set', 1],
     ['end'],
     ['end']],
    [2, 0],
    500),
   {'locals': [0, 4], 'stack': [], 'status': 'done'}),
  ('continue loop with more iterations',
   ([['block', 0],
     ['loop', 0],
     ['get', 0],
     ['eqz'],
     ['br_if', 1],
     ['block', 0],
     ['get', 0],
     ['const', 1],
     ['sub'],
     ['set', 0],
     ['get', 1],
     ['const', 2],
     ['add'],
     ['set', 1],
     ['br', 1],
     ['end'],
     ['const', 999],
     ['set', 1],
     ['end'],
     ['end']],
    [4, 0],
    900),
   {'locals': [0, 8], 'stack': [], 'status': 'done'}),
  ('block result keeps one value above outer operand',
   ([['const', 41], ['block', 1], ['const', 5], ['const', 7], ['br', 0], ['const', 99], ['end']], [], 50),
   {'locals': [], 'stack': [41, 7], 'status': 'done'}),
  ('void block branch discards operands',
   ([['block', 0], ['const', 1], ['const', 1], ['br', 0], ['end'], ['const', 3]], [], 50),
   {'locals': [], 'stack': [3], 'status': 'done'}),
  ('untaken br_if consumes its condition',
   ([['const', 10], ['block', 0], ['const', 0], ['br_if', 0], ['const', 3], ['add'], ['end']], [], 50),
   {'locals': [], 'stack': [13], 'status': 'done'}),
  ('taken br_if exits the block',
   ([['const', 10], ['block', 0], ['const', 1], ['br_if', 0], ['const', 3], ['add'], ['end']], [], 50),
   {'locals': [], 'stack': [10], 'status': 'done'}),
  ('control: fuel exhaustion',
   ([['block', 0],
     ['loop', 0],
     ['get', 0],
     ['eqz'],
     ['br_if', 1],
     ['get', 1],
     ['get', 0],
     ['add'],
     ['set', 1],
     ['get', 0],
     ['const', 1],
     ['sub'],
     ['set', 0],
     ['br', 0],
     ['end'],
     ['end']],
    [50, 0],
    21),
   {'locals': [49, 99], 'stack': [], 'status': 'fuel'})],
 [('regression: counted loop exits through outer block',
   ([['block', 0],
     ['loop', 0],
     ['get', 0],
     ['eqz'],
     ['br_if', 1],
     ['get', 1],
     ['get', 0],
     ['add'],
     ['set', 1],
     ['get', 0],
     ['const', 1],
     ['sub'],
     ['set', 0],
     ['br', 0],
     ['end'],
     ['end']],
    [3, 0],
    500),
   {'locals': [0, 6], 'stack': [], 'status': 'done'}),
  ('continue from inside a nested block',
   ([['block', 0],
     ['loop', 0],
     ['get', 0],
     ['eqz'],
     ['br_if', 1],
     ['block', 0],
     ['get', 0],
     ['const', 1],
     ['sub'],
     ['set', 0],
     ['get', 1],
     ['const', 2],
     ['add'],
     ['set', 1],
     ['br', 1],
     ['end'],
     ['const', 999],
     ['set', 1],
     ['end'],
     ['end']],
    [3, 0],
    500),
   {'locals': [0, 6], 'stack': [], 'status': 'done'}),
  ('continue loop with more iterations',
   ([['block', 0],
     ['loop', 0],
     ['get', 0],
     ['eqz'],
     ['br_if', 1],
     ['block', 0],
     ['get', 0],
     ['const', 1],
     ['sub'],
     ['set', 0],
     ['get', 1],
     ['const', 2],
     ['add'],
     ['set', 1],
     ['br', 1],
     ['end'],
     ['const', 999],
     ['set', 1],
     ['end'],
     ['end']],
    [5, 0],
    900),
   {'locals': [0, 10], 'stack': [], 'status': 'done'}),
  ('block result keeps one value above outer operand',
   ([['const', 42], ['block', 1], ['const', 5], ['const', 7], ['br', 0], ['const', 99], ['end']], [], 50),
   {'locals': [], 'stack': [42, 7], 'status': 'done'}),
  ('void block branch discards operands',
   ([['block', 0], ['const', 1], ['const', 2], ['br', 0], ['end'], ['const', 3]], [], 50),
   {'locals': [], 'stack': [3], 'status': 'done'}),
  ('untaken br_if consumes its condition',
   ([['const', 20], ['block', 0], ['const', 0], ['br_if', 0], ['const', 3], ['add'], ['end']], [], 50),
   {'locals': [], 'stack': [23], 'status': 'done'}),
  ('taken br_if exits the block',
   ([['const', 10], ['block', 0], ['const', 2], ['br_if', 0], ['const', 3], ['add'], ['end']], [], 50),
   {'locals': [], 'stack': [10], 'status': 'done'}),
  ('control: fuel exhaustion',
   ([['block', 0],
     ['loop', 0],
     ['get', 0],
     ['eqz'],
     ['br_if', 1],
     ['get', 1],
     ['get', 0],
     ['add'],
     ['set', 1],
     ['get', 0],
     ['const', 1],
     ['sub'],
     ['set', 0],
     ['br', 0],
     ['end'],
     ['end']],
    [50, 0],
    22),
   {'locals': [49, 99], 'stack': [49], 'status': 'fuel'})],
 [('regression: counted loop exits through outer block',
   ([['block', 0],
     ['loop', 0],
     ['get', 0],
     ['eqz'],
     ['br_if', 1],
     ['get', 1],
     ['get', 0],
     ['add'],
     ['set', 1],
     ['get', 0],
     ['const', 1],
     ['sub'],
     ['set', 0],
     ['br', 0],
     ['end'],
     ['end']],
    [4, 0],
    500),
   {'locals': [0, 10], 'stack': [], 'status': 'done'}),
  ('continue from inside a nested block',
   ([['block', 0],
     ['loop', 0],
     ['get', 0],
     ['eqz'],
     ['br_if', 1],
     ['block', 0],
     ['get', 0],
     ['const', 1],
     ['sub'],
     ['set', 0],
     ['get', 1],
     ['const', 2],
     ['add'],
     ['set', 1],
     ['br', 1],
     ['end'],
     ['const', 999],
     ['set', 1],
     ['end'],
     ['end']],
    [4, 0],
    500),
   {'locals': [0, 8], 'stack': [], 'status': 'done'}),
  ('continue loop with more iterations',
   ([['block', 0],
     ['loop', 0],
     ['get', 0],
     ['eqz'],
     ['br_if', 1],
     ['block', 0],
     ['get', 0],
     ['const', 1],
     ['sub'],
     ['set', 0],
     ['get', 1],
     ['const', 2],
     ['add'],
     ['set', 1],
     ['br', 1],
     ['end'],
     ['const', 999],
     ['set', 1],
     ['end'],
     ['end']],
    [6, 0],
    900),
   {'locals': [0, 12], 'stack': [], 'status': 'done'}),
  ('block result keeps one value above outer operand',
   ([['const', 43], ['block', 1], ['const', 5], ['const', 7], ['br', 0], ['const', 99], ['end']], [], 50),
   {'locals': [], 'stack': [43, 7], 'status': 'done'}),
  ('void block branch discards operands',
   ([['block', 0], ['const', 1], ['const', 3], ['br', 0], ['end'], ['const', 3]], [], 50),
   {'locals': [], 'stack': [3], 'status': 'done'}),
  ('untaken br_if consumes its condition',
   ([['const', 30], ['block', 0], ['const', 0], ['br_if', 0], ['const', 3], ['add'], ['end']], [], 50),
   {'locals': [], 'stack': [33], 'status': 'done'}),
  ('taken br_if exits the block',
   ([['const', 10], ['block', 0], ['const', 3], ['br_if', 0], ['const', 3], ['add'], ['end']], [], 50),
   {'locals': [], 'stack': [10], 'status': 'done'}),
  ('control: fuel exhaustion',
   ([['block', 0],
     ['loop', 0],
     ['get', 0],
     ['eqz'],
     ['br_if', 1],
     ['get', 1],
     ['get', 0],
     ['add'],
     ['set', 1],
     ['get', 0],
     ['const', 1],
     ['sub'],
     ['set', 0],
     ['br', 0],
     ['end'],
     ['end']],
    [50, 0],
    23),
   {'locals': [49, 99], 'stack': [49, 1], 'status': 'fuel'})],
 [('regression: counted loop exits through outer block',
   ([['block', 0],
     ['loop', 0],
     ['get', 0],
     ['eqz'],
     ['br_if', 1],
     ['get', 1],
     ['get', 0],
     ['add'],
     ['set', 1],
     ['get', 0],
     ['const', 1],
     ['sub'],
     ['set', 0],
     ['br', 0],
     ['end'],
     ['end']],
    [5, 0],
    500),
   {'locals': [0, 15], 'stack': [], 'status': 'done'}),
  ('continue from inside a nested block',
   ([['block', 0],
     ['loop', 0],
     ['get', 0],
     ['eqz'],
     ['br_if', 1],
     ['block', 0],
     ['get', 0],
     ['const', 1],
     ['sub'],
     ['set', 0],
     ['get', 1],
     ['const', 2],
     ['add'],
     ['set', 1],
     ['br', 1],
     ['end'],
     ['const', 999],
     ['set', 1],
     ['end'],
     ['end']],
    [5, 0],
    500),
   {'locals': [0, 10], 'stack': [], 'status': 'done'}),
  ('continue loop with more iterations',
   ([['block', 0],
     ['loop', 0],
     ['get', 0],
     ['eqz'],
     ['br_if', 1],
     ['block', 0],
     ['get', 0],
     ['const', 1],
     ['sub'],
     ['set', 0],
     ['get', 1],
     ['const', 2],
     ['add'],
     ['set', 1],
     ['br', 1],
     ['end'],
     ['const', 999],
     ['set', 1],
     ['end'],
     ['end']],
    [7, 0],
    900),
   {'locals': [0, 14], 'stack': [], 'status': 'done'}),
  ('block result keeps one value above outer operand',
   ([['const', 44], ['block', 1], ['const', 5], ['const', 7], ['br', 0], ['const', 99], ['end']], [], 50),
   {'locals': [], 'stack': [44, 7], 'status': 'done'}),
  ('void block branch discards operands',
   ([['block', 0], ['const', 1], ['const', 4], ['br', 0], ['end'], ['const', 3]], [], 50),
   {'locals': [], 'stack': [3], 'status': 'done'}),
  ('untaken br_if consumes its condition',
   ([['const', 40], ['block', 0], ['const', 0], ['br_if', 0], ['const', 3], ['add'], ['end']], [], 50),
   {'locals': [], 'stack': [43], 'status': 'done'}),
  ('taken br_if exits the block',
   ([['const', 10], ['block', 0], ['const', 4], ['br_if', 0], ['const', 3], ['add'], ['end']], [], 50),
   {'locals': [], 'stack': [10], 'status': 'done'}),
  ('control: fuel exhaustion',
   ([['block', 0],
     ['loop', 0],
     ['get', 0],
     ['eqz'],
     ['br_if', 1],
     ['get', 1],
     ['get', 0],
     ['add'],
     ['set', 1],
     ['get', 0],
     ['const', 1],
     ['sub'],
     ['set', 0],
     ['br', 0],
     ['end'],
     ['end']],
    [50, 0],
    24),
   {'locals': [49, 99], 'stack': [48], 'status': 'fuel'})],
 [('regression: counted loop exits through outer block',
   ([['block', 0],
     ['loop', 0],
     ['get', 0],
     ['eqz'],
     ['br_if', 1],
     ['get', 1],
     ['get', 0],
     ['add'],
     ['set', 1],
     ['get', 0],
     ['const', 1],
     ['sub'],
     ['set', 0],
     ['br', 0],
     ['end'],
     ['end']],
    [6, 0],
    500),
   {'locals': [0, 21], 'stack': [], 'status': 'done'}),
  ('continue from inside a nested block',
   ([['block', 0],
     ['loop', 0],
     ['get', 0],
     ['eqz'],
     ['br_if', 1],
     ['block', 0],
     ['get', 0],
     ['const', 1],
     ['sub'],
     ['set', 0],
     ['get', 1],
     ['const', 2],
     ['add'],
     ['set', 1],
     ['br', 1],
     ['end'],
     ['const', 999],
     ['set', 1],
     ['end'],
     ['end']],
    [6, 0],
    500),
   {'locals': [0, 12], 'stack': [], 'status': 'done'}),
  ('continue loop with more iterations',
   ([['block', 0],
     ['loop', 0],
     ['get', 0],
     ['eqz'],
     ['br_if', 1],
     ['block', 0],
     ['get', 0],
     ['const', 1],
     ['sub'],
     ['set', 0],
     ['get', 1],
     ['const', 2],
     ['add'],
     ['set', 1],
     ['br', 1],
     ['end'],
     ['const', 999],
     ['set', 1],
     ['end'],
     ['end']],
    [8, 0],
    900),
   {'locals': [0, 16], 'stack': [], 'status': 'done'}),
  ('block result keeps one value above outer operand',
   ([['const', 45], ['block', 1], ['const', 5], ['const', 7], ['br', 0], ['const', 99], ['end']], [], 50),
   {'locals': [], 'stack': [45, 7], 'status': 'done'}),
  ('void block branch discards operands',
   ([['block', 0], ['const', 1], ['const', 5], ['br', 0], ['end'], ['const', 3]], [], 50),
   {'locals': [], 'stack': [3], 'status': 'done'}),
  ('untaken br_if consumes its condition',
   ([['const', 50], ['block', 0], ['const', 0], ['br_if', 0], ['const', 3], ['add'], ['end']], [], 50),
   {'locals': [], 'stack': [53], 'status': 'done'}),
  ('taken br_if exits the block',
   ([['const', 10], ['block', 0], ['const', 5], ['br_if', 0], ['const', 3], ['add'], ['end']], [], 50),
   {'locals': [], 'stack': [10], 'status': 'done'}),
  ('control: fuel exhaustion',
   ([['block', 0],
     ['loop', 0],
     ['get', 0],
     ['eqz'],
     ['br_if', 1],
     ['get', 1],
     ['get', 0],
     ['add'],
     ['set', 1],
     ['get', 0],
     ['const', 1],
     ['sub'],
     ['set', 0],
     ['br', 0],
     ['end'],
     ['end']],
    [50, 0],
    25),
   {'locals': [48, 99], 'stack': [], 'status': 'fuel'})]]
for label, args, expected in cases[N - 1]:
    check(label, solve(*args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)

prompt:
br_if 1 inside a loop jumps back to the loop instead of leaving the enclosing block, so loops never end.

WebAssembly-style structured control over a value stack. block k / loop / end nest; each block or loop pushes a label recording its operand height and arity (block: k result values, loop: 0). br d targets the d-th enclosing label counting outward from 0; the branch keeps the top arity values, discards operands down to the label height, then for a block pops that label and continues after its end, for a loop keeps the loop label and continues at the first instruction inside the loop. br_if pops a condition and branches when it is non-zero. Other ops: const v, add, sub, eqz, get k, set k, drop. Each instruction costs one fuel. Return status (done/fuel/trap), stack and locals.

split: open-access