https://shikhalev.github.io/2000/07/hap.html