Updated version, added Alexander Shakov as a contributor.