wow i put way too much work into this