Validation code:

                                                                                                       ##'+#             ##+                                                                            
                                                                                                      ####'+,           @#++@                                                                           
                                                                                                     :#'  :', `  `     ;#+';'#                                                                          
                                                                                                     ##````#`   .      ####+;#                                                                          
                                                                                                     ##```;#   :;      #@  +'+:                                                                         
                                                                                                     ,#,;`#.   ;+     ,#:  `++'                                                                         
                                                                                                      #@'.+    ,      '# .  #+'                                                                         
                                                                                                       #+'';` `' `'+. ##`'`.##:                                                                         
                                                                                                        #@###;:;+######;#` @##                                                                          
                                                                                                       '#####:;;#####@##`.###;                                                                          
                                                                                                      .@@   ;:;'.   :#@@####:                                                                           
                                                                                                      @,   `::;'   ``,#.                                                                                
                                                                                                     .: .` ;:;' `+;  `##                                                                                
                                                                                                     +  @` +;;+    ` `;;`                                                                               
                                                                                                     + +,+`:;'  #+.  ``;+                                                                               
                                                                                                    .. :,:+:;' ,,,+    ;+                                                                               
                                                                                                    @ .,+;:;'` ',,+    ;:                                                                               
                                                                                                  :## .'++:;+` ,`@#   `;;;                                                                              
                                                                            ;`                  :#:+; .+;,;;,` .@#:   `'##                                                                              
                                                                              `':             '@##'`+'.:;::;:  ,#+`   ,#@+                                                                              
                                                                                 `#`        :@@; ;+,,:;;;::;+` +#'    ,'+;:                                                                             
                                                                           ;#''#,   #      ##'`##@@#+;:::::;':        `;;;+                                                                             
                                                                          '.;:::,+` ` #   ##:`;;;;;;':'#@;:;;+  ;.    ,;';:;                                                                            
                                                                          ;:;:::..'`   ;.#+:` :;''''''';;:+@;;'     ` :;;;;',                                                                           
                                                                         `,;;:,`   ;    .#:.  ;;;'';;''''''';@;      ;#@@@#;'`                                                                          
                                                                         `,;;:,     '   #'@   ##@#''''''''''''+.       :#@@@##+@+;,,,,,;'+',                                                            
                                                                          ';;:.     , #.#:,+: #@@''+''''''''''+     `+: ,@@@@##:                                                                        
                                                                          +;;:`     ,  .#;` +`,@+''+''''#@''''#     `.#' `;@@@##:                                                                       
                                                                          ',;:`     .  :,:+.   #'''+''''#@@@+#     :' '````,@@@#+.                                                                      
                                                                          ,,;:`     .  ',; .+  ,;''+'''';@@@#.    ' ``: ````:@@@#+                                                                      
                                                                           ;;:`     ,  ',: ;``  #''+'''''#@@`       ` ,```..`#@@@+#                                                                     
                                                                           +;:``    .  ;,: ;``   #'+'''';++       :+;,:.`    .@@@@#'.                                                                   
                                                                           +;:`````    ;:: . ``   #';'+@;         ````:` ````,;@@@'+  :@,                                                               
                                                                          .''';:,` `   ::,#````    `.`  `        ```` +  ````,:#@@++      +,                                                            
                                                                       `++:,,,,,,:;'+#`.:#, '`````  ````````````````` +  ````,:;@@'+         +                                                          
                                                    .++#++#:          ;',:::::::::::::;''@  .```````#````````````````,` `````:;;@@'+                                                                    
                                                  `+',,:::,:++       .'::::::::::::::::'#@   ; `````` `````````````  +  ````.:;;+#'+                                                                    
                                                 ;+,::::::;;;:+`     +.::::::::::::::::;'@    .'  `  '`````.``````` @   ````,:;;;#+`                                                                    
                                                ';,:::::::::;;;+`    +,::::::::::::::::;;+       :##+#@. `````````,+    ````:;;;;#@                                                                     
                                               ':,::::::::::;;;;+    +,:::::::::::::::::''`       :#####@`      '#.     ;``.:;;;;+,                                                                     
                                              ,',::::::::::::;;;;+   +::::::::::::::::::';,        ########@@@###;     `@:`,;;'';#                                                                      
                                              +,::::::::::::::;;;;+``+::::::::::::::::::;;+        ##############      `@#.:;'';;.                                                                      
                                             +.::::::::;:::::::;;;';+,:::::::::::;;::;;:;;+       .#############.     ``@#+;;'':+                                                                       
                                             +,::::::#+:::::::::;;;;',:::::::::::::;++;;;;+`      :#############      ``#@@;'';+                                                                        
                                            '.::::::@@:::::::::::;;'::::::::::::::::::;+;;+:      +###''#+''+##`     `` #@@'''+`                                                                        
                                            +,:::::#@+:::::::::::;;;'::::::::::::::::::;+''.      ###;'#'''++'#      `` @@@@''.                                                                         
                                           `',::::+#@:::::::::::::;;+,::::::::::::::::::;+'      ,##;;'''''''@      `` :@@@@'.                                                                          
                                           ,,::::;#@#:::::::::::::;;;+;:::::::::::::::::''+`      :@';''';''#.      ``,+@@@@.              `,,,`                                                        
                                           ',::::@@@'::::::::::::::;;+::::::::::::::::::';+``       .#''';;+,      ``:;#@@@`           ;#+'''''';'+                                                     
                                           +,;::+@@@:::::::::::::':;;',:::::::::::::::::';+ :         ,#+##`       `;;;@##'          '+';'';'';;'':                                                     
                                           +,;::@@@@::::::::::::#:::;',:::::::::::::::::''+`.`                     ';;;@'''   '++; `+';;''++'';;;'                                                      
                                           +,;:'@@@#:::::::::::;@:::;+,::::::::::::::::;;;''``                  `:';;'+';':  '''''++'''+''''';';;+                                                      
                                           +,;;@@@@#:::::::::::@@::::+:::::::::::::;:::';;+'.`                 ``';'+'''''+:+'''';''''+'';''''';'                                                       
                                           +,;;@@@@+:::::::::::@@::::';::::::::::+++;;;;;++',``               ``.'+'';''''''+''''''+'''''''';'';,                                                       
                                           +,;'@@@@+::::::::::'@@::::+::::::::::::::'+';;++'+```          ``````+'''''''''++'+'''''+++++''''';';                                                        
                                           ;,;#@@@@#::::::::::#@@::::+::::::::::::::::+;+'''+````        `` ;``+'''#+''''''''++''''+';;''+'''',                                                         
                                           ,:;@@@@@#::::::::::@@@':::::::::::::::::::;;+'''+'+ ````````````:.+''''#;#'''''''++'''''+'''''''+:                                                           
                                            +:@@@@@@::::::::::@@@#::::::::::::::::::::;+'''''++ ````````` '+'';''@#'+';''++;;+''+''++''';;';+                                                           
                                            +,#@@@@@::::::::::@@@@:::::::::::::::::::;;+'''''+'#   ``   ,+''####+'@+'''++;;;;;++''+'''+'''';',                                                          
                                            .'+#@@@@':::::::::@@@@:::::::::::::::::::;;+'''''''''#+';'#+'''##;+#+''''+':;;;;;;;':+''''''';;''+                                                          
                                             +'+#@@@#;;::::;;:@@@@+;::;;;:. ```` ,::;;;';'''''''''+++'+'''''#;##;''+':::+#@@@@+'.+'''';''';;';,                                                         
                                             `#'+#@@@;;;;;;;;;#@@@@;;;;;,````````.:;;;+'''''''''''''''''''''#';''+'::;@@@@@@@@#'+ ''''''''';';+                                                         
                                              :#'++#@';;;;;;;;+@@@@+';+;,```   ``,;;;+';;;''''''''''''''''';;''++:;:@@@@@@@@@@#+':`''''''';''';`                                                        
                                               ,@+'++#'''''''''@@#@@++++;.````. ,;;;+';';'''''''''''''''';;'''+:::':,:;#@@@@@@@#'+  +'''''''''''                                                        
                                                 @#+++;''''';''####';;;;++:,`.;++++'''++++'''+++++++''';''''+':::::::::::;@@@@@#+'`   '+''''''''`                                                       
                                                  `#@@#+++++++';''';;;;;;;;::;;;;;;+;:;;;;;;;;;;;;:;'++++'+':;:::::::::::::;@@@@#'+      ``.,,,,.                                                       
                                                       ``    ;'''';;;;;:;:::::::;;;;:::::::::::::;;;;;;;;++:::::::::::::::::;+@@#''                                                                     
                                                             ;''';;;;:::::::::::::::::::::::::::::::;;:;;::::::::::::::::::;;;;@#+'                                                                     
                                                             :''';;+;::::::::::::::::::::;:::::::::::::::::::::::::::::::::;;;;;#+',                                                                    
                                                             ;''''@:;::::::::::::::::::::+:::::::::::::::::::::::::::::::::;;;;;;#';                                                                    
                                                             ;''#@:;;::::::::::::::::::::++::::::::::::::::::::::::::::::::;;;;;;;+'                                                                    
                                                             ''+@';;;::::::::::::::::::::#@::::::::::::::::::::::::::::::::;;;;;;;:'                                                                    
                                                             ';@@;;;;::::::::::::::::::::#@;:::::::::::::::::::::::::::::::;;;'';;:+                                                                    
                                                             +#@+;;;;::::::::::::::::::::@@+:::::::::::::::::::::::::::::::;;;'';;:+                                                                    
                                                             +#@';;;;::::::::::::::::::::@@#::::::::::::::::::::::::::::::;;;;;;;;:+                                                                    
                                                             ;+@'';;;:::::::::::::::::::;@@@::::::::::::::::::::::::::::::;;;;';;;:+                                                                    
                                                             .+#'';;;:::::::::::::::::::#@@@:::::::::::::::::::::::::::::;;;;;';;;:'                                                                    
                                                             ,+#''';;;::::::::::::::::::@@@@:::::::::::::#:::::::::::::::;;;;;';;;;:                                                                    
                                                             .#+''';;;:;:::::::::::::::;@@@@;::::::::::::@':::::::::::::;;;;;'';;:+`                                                                    
                                                             .:+;'';;;:;:::::::::::::::#@@@@;::::::::::::@#::::::::::::;;;;;'';;;:+                                                                     
                                                             .`@:''';+;;;::::::::::::::@@@@@;::::::::::::@@::::::::::;;;;;;;'';;;:+                                                                     
                                                             .`:';;';+;;;;;:::::::::::;@@@@@;::::::::::::@@::::::::;;;;;;;;'';;;:',                                                                     
                                                             ,``+,;';';;;;;;;;::::::::@@@@@@;:::::::::::+@@'::::;;;;;;;;;;;'';;;:+                                                                      
                                                             ,```+:;''';;;;;;;;;:;:::;@@@@@@::::::::::::#@@+:;;;;;;;;;;;;;'';;;:;'                                                                      
                                                             ,```,+:;;+';;;;;;;;;;;;:@@@@@@@:::::::::;;:@@@+;;;;;;;;;;;;;;;';;;:+                                                                       
                                                             ,````;':;'';;;;;;;;;;;;+@@@@@@@::;;;;;;;;;'@@@#;;;;;;;;;;;;;';;;;;';                                                                       
                                                             .`````;'::;;''';;;;;;;;@@@@@@@#;;;;;;;;;;;#@@@+;;;;;;;;;;;;;';;;;;+                                                                        
                                                             `.`````:+,:;;;;;'';;;;@@@@@@@@+;;;;;;;;;;;@@@@+;;;;;;;;;;;;;;;;;:+`                                                                        
                                                              .```````+',:;;;';;';@@@@@@@@@;;;;;;;;;;;#@@@@';;;;;;;;;;;;;;;;:+,                                                                         
                                                              ,````````;+',::;;;;#@@@@@@@@@;;;;;;;;;;;@@@@@;;;;;;;;;;;;;';;:+:                                                                          
                                                              ,``````````:++',::+####@@@@@#;;'';';;;;#@@@@@;;;;;;;;;;;;;;;:+:                                                                           
                                                              .``````````.``:+++++++++++++;;;;;;;;;;;###@@#;;;;;;;;;;;;;;:+,                                                                            
                                                              `.`````````.`....`,+#@#+++++++''''''''@@@@@@;;;;;;;;;;;;;;'+`                                                                             
                                                               .`````````............``.,,:;;''''''+#++;;;;;;;;;;;;;;;;++                                                                               
                                                               ,``````````...................;;''''';;;';;;;;;;;;;;;;;++                                                                                
                                                               ,``````````..................,;;''';;;;;;';;;;;;;;;;;;+;                                                                                 
                                                               .``````````..................;;;;;;::;;;;;;;;;;;;;;;'+.                                                                                  
                                                               `.`````````..................;;:::::;;;;;;;;;;;;;;;++`                                                                                   
                                                                ,```````````.........``````::::::::;;;;;;;;;;;';:++                                                                                     
                                                                ,```````````````.....:####@@#+;::;;;;;;;;;;';;;:++`                                                                                     
                                                                ,``````````````````````###@@@@@@@@@#+';;;;;;;:;++                                                                                       
                                                                ,`````````````````````` #@@@@@@@@@@@@@@@@@@#+++'                                                                                        
                                                                `.`````````````````````` :@@@@@@@@@@@@@@@@#+'+,                                                                                         
                                                                 ,``````````````````````.:,#@@@@@@@@@@@@@#+++`                                                                                          
                                                                 ,``````````````````````,::::@@@@@@@@@@@#+'+                                                                                            
                                                                 ,`````````````````````.::::::;@@@@@@@@#+++                                                                                             
                                                                 ,`````````````````````,:::::;;;'@@@@@@+''                                                                                              
                                                                 `.```````````````````.:::::;;;;;;'@#@+'+`                                                                                              
                                                                  ,```````````````````,::::;;;;;''';;++''                                                                                               
                                                                  ,```````````````````:::::;;;;;'';;;;'+                                                                                                
                                                                  ,``````````````````,:::::;;;;'';;;;:+.                                                                                                
                                                                  ,``````````````````:::::;;;;;''';;;'+                                                                                                 
                                                                  .`````````````````,:::::;;;;''';;::+.                                                                                                 
                                                                  `.````````````` ``,::::;;;;;'';;;;'+                                                                                                  
                                                                  `.``````````````:`:::::;;;;;'';;;:+,                                                                                                  
                                                                   ,```````````` ``@#+::::;;'';;;;;'+                                                                                                   
                                                                   ,```````````````,@@@@@@@@@@@@@#+++                                                                                                   
                                                                   ,``````````````.::@@@@@@@@@@@@#++`                                                                                                   
                                                                   ,``````````````,::;'@@@@@@@@@@+'+                                                                                                    
                                                                   ,``````````````::::;:+@@@@@@@#++#