This hasn’t been proofread by anyone besides myself (or code reviewed), so it might be a little rough.