phew, a few hours into this but I'm done!