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