      :::::::::: ::::::::  :::    ::: :::::::::   :::::::: ::::::::::: 
     :+:       :+:    :+: :+:    :+: :+:    :+: :+:    :+:    :+:      
    +:+       +:+    +:+  +:+  +:+  +:+    +:+ +:+    +:+    +:+       
   :#::+::#  +#+    +:+   +#++:+   +#+    +:+ +#+    +:+    +#+        
  +#+       +#+    +#+  +#+  +#+  +#+    +#+ +#+    +#+    +#+         
 #+#       #+#    #+# #+#    #+# #+#    #+# #+#    #+#    #+#          
###        ########  ###    ### #########   ########     ###           