{"files":{"main.py":"from core import run\nfrom policy import POLICY\n\n\ndef evaluate(payload):\n    return run(payload, POLICY)\n","policy.py":"POLICY = {\n    \"adjacency_allowed\": True,\n    \"blackout_day\": \"2026-11-01\",\n    \"cancelled_blocks\": True,\n    \"capacity\": 1,\n    \"cutoff_hour\": 17,\n    \"cutoff_inclusive\": True,\n    \"duplicate_policy\": \"first\",\n    \"duration_max\": 120,\n    \"lead_minutes\": 30,\n    \"priority_high_first\": True,\n    \"report_order\": \"id\",\n    \"timezone\": \"America/New_York\",\n}\n","helpers.py":"import math\nfrom datetime import datetime, timezone\n\n\ndef parse_instant(value):\n    if not isinstance(value, str):\n        raise ValueError(\"Expected an offset-aware ISO datetime\")\n    parsed = datetime.fromisoformat(value)\n    if parsed.tzinfo is None or parsed.utcoffset() is None:\n        raise ValueError(\"Datetime must include an offset\")\n    return parsed.astimezone(timezone.utc)\n\n\ndef valid_duration(value, maximum):\n    return (\n        isinstance(value, (int, float))\n        and not isinstance(value, bool)\n        and 0 < value <= maximum\n        and math.isfinite(value)\n    )\n\n\ndef overlaps(start, end, other_start, other_end, adjacency_allowed):\n    if adjacency_allowed:\n        return start < other_end and other_start < end\n    return start <= other_end and other_start <= end\n\n\ndef make_report(groups, order):\n    key = (lambda entry: entry[0]) if order == \"id\" else (lambda entry: entry[1])\n    return {\n        name: [entry[0] for entry in sorted(entries, key=key)]\n        for name, entries in groups.items()\n    }\n","core.py":"from datetime import datetime, time, timedelta, timezone\nfrom zoneinfo import ZoneInfo\n\nfrom helpers import make_report, overlaps, parse_instant, valid_duration\n\n\ndef run(payload, policy):\n    groups = {\"selected\": [], \"blocked\": [], \"rejected\": []}\n    retained = {}\n    for index, row in enumerate(payload[\"appointments\"]):\n        identifier = row[\"id\"]\n        if identifier not in retained or policy[\"duplicate_policy\"] == \"last\":\n            retained[identifier] = (index, row)\n\n    try:\n        earliest = parse_instant(payload[\"now\"]) + timedelta(minutes=policy[\"lead_minutes\"])\n    except (KeyError, TypeError, ValueError, OverflowError):\n        groups[\"rejected\"] = [(identifier, index) for identifier, (index, _) in retained.items()]\n        return make_report(groups, policy[\"report_order\"])\n\n    zone = ZoneInfo(policy[\"timezone\"])\n    candidates = []\n    for identifier, (index, row) in retained.items():\n        try:\n            priority = row[\"priority\"]\n            if not isinstance(priority, int) or isinstance(priority, bool):\n                raise ValueError(\"Priority must be an integer\")\n            duration = row[\"duration\"]\n            if not valid_duration(duration, policy[\"duration_max\"]):\n                raise ValueError(\"Invalid duration\")\n            cancelled = row[\"cancelled\"]\n            if not isinstance(cancelled, bool):\n                raise ValueError(\"Cancelled must be a boolean\")\n            if cancelled and not policy[\"cancelled_blocks\"]:\n                raise ValueError(\"Cancelled appointment\")\n            start = parse_instant(row[\"start\"])\n            end = start + timedelta(minutes=duration)\n            if start < earliest:\n                raise ValueError(\"Insufficient lead time\")\n            local_start = start.astimezone(zone)\n            if local_start.date().isoformat() == policy[\"blackout_day\"]:\n                raise ValueError(\"Blackout day\")\n            cutoff = datetime.combine(\n                local_start.date(), time(hour=policy[\"cutoff_hour\"]), tzinfo=zone\n            ).astimezone(timezone.utc)\n            if policy[\"cutoff_inclusive\"]:\n                if end > cutoff:\n                    raise ValueError(\"After cutoff\")\n            elif end >= cutoff:\n                raise ValueError(\"At or after cutoff\")\n            candidates.append((identifier, index, priority, start, end, cancelled))\n        except (KeyError, TypeError, ValueError, OverflowError):\n            groups[\"rejected\"].append((identifier, index))\n\n    candidates.sort(key=lambda item: (\n        -item[2] if policy[\"priority_high_first\"] else item[2], item[1]\n    ))\n    accepted = []\n    for identifier, index, _, start, end, cancelled in candidates:\n        intersections = sum(\n            overlaps(start, end, other_start, other_end, policy[\"adjacency_allowed\"])\n            for other_start, other_end in accepted\n        )\n        if intersections >= policy[\"capacity\"]:\n            groups[\"rejected\"].append((identifier, index))\n            continue\n        accepted.append((start, end))\n        groups[\"blocked\" if cancelled else \"selected\"].append((identifier, index))\n\n    return make_report(groups, policy[\"report_order\"])\n"}}