It's a pretty complicated algorithm