Contributed by Zakharia Metreveli
Contributed by mikhail lychkovskiy
Contributed by Adelina Shaydullina