// File: QR.sol



/*                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             
             .777777777777777777777777777777777777777777777!!~^:.                         .7777^                                !777~             :7777:             ~777!    ^7777.   .7777^             ^7777.                         .:^~!!77777777777777777777777777777777777777777777~                
             ^@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&#GY!:                   ^~J@@@@5^^                           :~!@@@@B~~.        ^^5@@@@J^^        .~~#@@@&!~~^P@@@@?^~^?@@@@P^^         ^^P@@@@?~:                  .~?5B#&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@B                
             ^@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&GJ^                G@@@@@@@@B                           J@@@@@@@@@:        #@@@@@@@@G        ~@@@@@@@@@@@@@@@@@@@@@@@@@@@&.       .&@@@@@@@@Y                ~5#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@G                
             ^@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@P~              P@&@@@@@&G                           ?@&@@@@@&&:        G&@@@@@&@P        ~&&@@@@@&&&&@@@@@&&&&&@@@@@&B.       .#&@@@@@&@Y             .?B@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@G                
             ^@@@@@@@@@&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&@@@@@@@@@@@@@@@@P:            ..7@@@@Y..  .....    .....           ..^&@@@G.:         ..J@@@@?..  .....  ::B@@@&:.:.Y@@@@7.:.!@@@@5..  .....  :.5@@@@!..            !B@@@@@@@@@@@@@@@&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&@@@@@@@@@G                
             ^@@@@@@@@@~................................::^~7JG&@@@@@@@@@@@#!             !@@@@J   .B&&&P    5&&&#:            :&@@@G             ?@@@@7   ^#&&&5    B@@@#.   J@@@@!   .^^^^:   .B&&&B.   :^^^^.             Y@@@@@@@@@@@@#5?!^:::................................Y@@@@@@@@G                
             ^@@@@@@@@@:                                       :7G@@@@@@@@@@@!          Y##@@@@&BBBB@@@@@BBBB&@@@@##7        7##@@@@&BB:        PB#@@@@#BBB#@@@@&BBBB@@@@@BBBB&@@@@##J        ~#B@@@@@BB~                   5@@@@@@@@@@&Y~.                                       J@@@@@@@@G                
             ^@@@@@@@@@^                                          ~B@@@@@@@@@&:         G@@@@@@@@@@@@@@@@@@@@@@@@@@@J        J@@@@@@@@@^        #@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@P        !@@@@@@@@@!                  J@@@@@@@@@@5:                                          J@@@@@@@@G                
             ^@@@@@@@@@^                                           .P@@@@@@@@@Y         !7Y@@@@P777?@@@@#7777B@@@@J7^        ^?J@@@@B77.        !7P@@@@5777J@@@@B7777#@@@&?777G@@@@Y7~        :??&@@@&?7:                 .&@@@@@@@@@7                                            J@@@@@@@@G                
             ^@@@@@@@@@^        7555555555555555555555555555~       .B@@@@@@@@#.          ~@@@@?    JJJJ7    !JJJJ.   ^5555~   .&@@@P             ^YJJY^   :@@@@5    B@@@#    ~YJJJ:   :55557    #@@@#    75555:          !@@@@@@@@@J        ?555555555555555555555555555:        J@@@@@@@@G                
             ^@@@@@@@@@^        5@@@@@@@@@@@@@@@@@@@@@@@@@@@7        ?@@@@@@@@&.        7J5@@@@GJ7                  7JP@@@@P?JJY@@@@#JJ.                 ~JY@@@@B?JJJ#@@@&JJ^        !J5@@@@B?JJJ&@@@&JJJ?B@@@@5J!        7@@@@@@@@&:        B@@@@@@@@@@@@@@@@@@@@@@@@@@@^        J@@@@@@@@G                
             ^@@@@@@@@@^        Y@@@@@@@@@@@@@@@@@@@@@@@@@@@7        !@@@@@@@@&.        G@@@@@@@@#                  B@@@@@@@@@@@@@@@@@@^                 Y@@@@@@@@@@@@@@@@@@7        P@@@@@@@@@@@@@@@@@@@@@@@@@@@5        7@@@@@@@@#.        G@@@@@@@@@@@@@@@@@@@@@@@@@@@^        J@@@@@@@@G                
             ^@@@@@@@@@^        Y@@@@@@@@@@@@@@@@@@@@@@@@@@@7        !@@@@@@@@&.        YGB@@@@#G5                  YG#@@@@#GGGB@@@@&GG:                 ?GB@@@@&GGGG&@@@@GG~        ?GB@@@@&GGGG&@@@&GGGG&@@@@BG?        7@@@@@@@@#.        G@@@@@@@@@@@@@@@@@@@@@@@@@@@^        J@@@@@@@@G                
             ^@@@@@@@@@^        Y@@@@@@@@@@@@@@@@@@@@@@@@@@@7        !@@@@@@@@&.          ~#BB#?             ^~~~~    7@@@@7   .B#B#5    ^~~~~    :~~~~.   :B#B#Y    B@@@#    :~~~~.   ^#BB#J    #@@@#    J#B##^          7@@@@@@@@#.        G@@@@@@@@@@@@@@@@@@@@@@@@@@@^        J@@@@@@@@G                
             ^@@@@@@@@@^        Y@@@@@@@@@@@@@@@@@@@@@@@@@@@7        !@@@@@@@@&.                           ::G@@@@!:::J@@@@J::         ^:B@@@@~:^:Y@@@@?::        .^^B@@@&^:^:5@@@@7::        .^^#@@@#^:.                 7@@@@@@@@#.        G@@@@@@@@@@@@@@@@@@@@@@@@@@@^        J@@@@@@@@G                
             ^@@@@@@@@@^        Y@@@@@@@@@@@@@@@@@@@@@@@@@@@7        !@@@@@@@@&.                          :&@@@@@@@@@@@@@@@@@G        ^@@@@@@@@@@@@@@@@@@P        ~@@@@@@@@@@@@@@@@@@5        !@@@@@@@@@~                 7@@@@@@@@#.        G@@@@@@@@@@@@@@@@@@@@@@@@@@@^        J@@@@@@@@G                
             ^@@@@@@@@@^        Y@@@@@@@@@@@@@@@@@@@@@@@@@@@7        !@@@@@@@@&.                          :&@@@@@@@@@@@@@@@@@G        ^@@@@@@@@@@@@@@@@@@P        ~@@@@@@@@@@@@@@@@@@5        !@@@@@@@@@~                 7@@@@@@@@#.        G@@@@@@@@@@@@@@@@@@@@@@@@@@@^        J@@@@@@@@G                
             ^@@@@@@@@@^        Y@@@@@@@@@@@@@@@@@@@@@@@@@@@7        !@@@@@@@@&.                           ^:G@@@@!:^:J@@@@J::        .^^B@@@@~^^:Y@@@@?::        .^^B@@@&^^^:5@@@@?::        .^^#@@@#^^.                 7@@@@@@@@#.        G@@@@@@@@@@@@@@@@@@@@@@@@@@@^        J@@@@@@@@G                
             ^@@@@@@@@@^        Y@@@@@@@@@@@@@@@@@@@@@@@@@@@7        !@@@@@@@@&.                   .G#B#P    P@@@@:   7@@@@7   .BBB#5    ^~~~~    :~~~~.             B@@@#    :~~~~.   ^#BB#J    #@@@#                    7@@@@@@@@#.        G@@@@@@@@@@@@@@@@@@@@@@@@@@@^        J@@@@@@@@G                
             ^@@@@@@@@@^        Y@@@@@@@@@@@@@@@@@@@@@@@@@@@7        !@@@@@@@@&.                 !GG@@@@&GGGG&@@@@GGGGB@@@@BGGGG@@@@&GP:                          ^GG&@@@@GG~        ?GB@@@@#GGGG&@@@&GG^                 7@@@@@@@@#.        G@@@@@@@@@@@@@@@@@@@@@@@@@@@^        J@@@@@@@@G                
             ^@@@@@@@@@^        Y@@@@@@@@@@@@@@@@@@@@@@@@@@@7        !@@@@@@@@&.                 ?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@^                          ~@@@@@@@@@7        P@@@@@@@@@@@@@@@@@@!                 7@@@@@@@@#.        G@@@@@@@@@@@@@@@@@@@@@@@@@@@^        J@@@@@@@@G                
             ^@@@@@@@@@!        5@@@@@@@@@@@@@@@@@@@@@@@@@@@7        J@@@@@@@@#.                 ^JY&@@@#JJJJ#@@@@YJJJP@@@@GJJJY@@@@#JJ.                          :JJ#@@@&YJ^        !J5@@@@BJJJJ&@@@&JJ:                 7@@@@@@@@&:        B@@@@@@@@@@@@@@@@@@@@@@@@@@@^        P@@@@@@@@G                
             :&@@@@@@@@G        !JJJJJJJJJJJJJJJJJJJJJJJJJJJ^       :#@@@@@@@@B           :JJJJ~    &@@@G    P@@@@.   ^5555~   .&@@@P                      .JJJJ!    B@@@#             ^@@@@Y    J555J                    ~@@@@@@@@@Y        7JJJJJJJJJJJJJJJJJJJJJJJJJJJ:       ~&@@@@@@@@P                
              G@@@@@@@@@5.                                         :G@@@@@@@@@Y         ~7Y@@@@P777?&@@@#7777B@@@@J7^        ^7?@@@@B77.                 ^7J@@@@B7777#@@@&?7:        ~7J@@@@G7!                           .B@@@@@@@@@J                                          ^#@@@@@@@@@7                
              ~@@@@@@@@@@B~                                       7#@@@@@@@@@#:         G@@@@@@@@@@@@@@@@@@@@@@@@@@@J        J@@@@@@@@@^                 Y@@@@@@@@@@@@@@@@@@7        P@@@@@@@@&.                           !@@@@@@@@@@P^                                      .J&@@@@@@@@@G                 
               7@@@@@@@@@@@G7:                                 ^?B@@@@@@@@@@&~          5##@@@@&BBB#@@@@@BBBB&@@@@##?        7##@@@@&BB:                 ?##@@@@&BBBB@@@@@##!        J##@@@@&#G.                            J@@@@@@@@@@@P!.                                .^Y#@@@@@@@@@@B:                 
                !&@@@@@@@@@@@&BY?!~^^^^^^^^^^^^^^^^^^^^^^^~!?5B@@@@@@@@@@@@B^             !@@@@J   .B&&&G    P@@@@^            :&@@@G             .^^^^.   ^#&&&5    B@@@#.            ~@@@@5             :^^^^              ?&@@@@@@@@@@@&GY7~~^^^^^^^^^^^^^^^^^^^^^^^~7J5#@@@@@@@@@@@@G:                  
                 :P@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&J.            ..7@@@@Y..  .....  ..P@@@@^..        ..^&@@@G..         ..J@@@@7..  .....  ..B@@@&:.         ..!@@@@5..         ..5@@@@!..            ^G@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#?                    
                   ~P&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#Y:              P&&@@@@&&G        :#&@@@@@&&?        ?&&@@@@@&#:        G&&@@@@&&P        ~&&@@@@@&&!        Y&&@@@@@&B.       .#&@@@@@&&Y              !P@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#J:                     
                     :?G&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#5!.                G@@@@@@@@#        :@@@@@@@@@J        J@@@@@@@@@:        #@@@@@@@@G        ~@@@@@@@@@7        5@@@@@@@@&.       .&@@@@@@@@5                ^JG&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#5!.                       
                        :!JPB#&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&BGY7^.                   ^~J@@@@5~^        .~~G@@@@7~:        :~7@@@@B~~.        ^~5@@@@J~^        .~~#@@@&!~:        ^~?@@@@P~~         ~~G@@@@?~^                   :!JPB#&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&#GY?^.                          
                             .:^^~~~~~~~~~~~~~~~~~~~~~~~~~~~^:..                          ~@@@@?             P@@@@.   ~GGGB!   .&@@@P             :7777:   :GGGGJ    B@@@#             .7777^    5GGG5    ^7777.                          .:^~~~~~~~~~~~~~~~~~~~~~~~~~~~~^:..                               
                                                                                        ?5G@@@@B5J        .55#@@@@P555B@@@@B555P@@@@#55:                 7PP@@@@#5555&@@@&P5~                 ^55@@@@@55^                                                                                                   
                                                                                        G@@@@@@@@#        :@@@@@@@@@@@@@@@@@@@@@@@@@@@@^                 Y@@@@@@@@@@@@@@@@@@7                 !@@@@@@@@@!                                                                                                   
                                                                                        ?5G@@@@B5J        .55#@@@@P555G@@@@B555P@@@@#55.                 !5P@@@@#5555&@@@&55^                 ^55@@@@@55^                                                                                                   
                                  .777?~    !?777    ^?77?.             777?!             ~@@@@?    777?!    P@@@@.   ~GPPG!   .&@@@P    !?777    ^?77?:   :@@@@5    B@@@#             .777?~    5GPG5             .?77?^    777?!    ~?777.                      !?777    ^?77?:   .777?~                  
                                ^~?@@@@G~~~!#@@@&!~~~P@@@@J~^        .!!&@@@&!~.        ^~J@@@@5~~~!@@@@#~~~~G@@@@7~:        :~7@@@@B~~~~#@@@@7~~~5@@@@Y~~~7@@@@G~~~~#@@@&!~:        ^~?@@@@G~~                  ^~J@@@@P~~~!@@@@#~~!~B@@@@7~:                 .~~B@@@@7~~~5@@@@Y~~~7@@@@B~~.               
                                Y@@@@@@@@@@@@@@@@@@@@@@@@@@@5        !@@@@@@@@@~        G@@@@@@@@@@@@@@@@@@@@@@@@@@@J        J@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@7        5@@@@@@@@&.                 P@@@@@@@@@@@@@@@@@@@@@@@@@@@J                 ^@@@@@@@@@@@@@@@@@@@@@@@@@@@@:               
                                J&&@@@@@&&&&@@@@@&&&&&@@@@&&Y        !&&@@@@@&&~        5&&@@@@&&&&&@@@@@&&&&@@@@@&&?        ?&&@@@@@&&&&@@@@@&&&&&@@@@&&&&&@@@@@&&&&@@@@@&&!        Y&&@@@@@&B.                 5&&@@@@&&&&&@@@@@&&&&@@@@@&&?                 ^#&@@@@@&&&&&@@@@&&&&&@@@@@&#:               
                                ..~@@@@P....B@@@#:...Y@&@@!..  ::::.  .:#@@@B..  .::::  ..7@@&@J...:&@@@B....P@@@&^.. .::::.  .^&@@@G....G@&@&^.. J@@@@7 ..~@@@@P ...B@@@#:.  .::::  ..~@@@@5..                  ..!@&@@Y...:&@@@B....P@@@@~..  ::::.    .:::.  ..G@@@&^...?@@@@7...^@@@@P..                
                                  ^@@@@5    :::::    .::::.   ~&&&@Y    :::::    5@&&&^   .::::.   .&@@@B    :::::    7@&&@?   :&@@@G    :::::    ?@@@@7   ^@@@@P    :::::    J@&&&!    ::::.                      .::::.   .&@@@B    P@@@@^   7@&&@?   :#&&&P    G@@@&:   .::::.   ^@@@@P                  
                                J##@@@@&#B.                 Y##@@@@&#G.       .B#&@@@@##J        7##@@@@@##^        P#&@@@@&####@@@@&#B:        P#&@@@@&####@@@@&#B.       .G#&@@@@##Y                                    !##@@@@@####&@@@@####&@@@@&####@@@@@####&@@@@##7        ?##@@@@&#B:               
                                5@@@@@@@@@.                 P@@@@@@@@&.       .@@@@@@@@@Y        ?@@@@@@@@@^        B@@@@@@@@@@@@@@@@@@^        #@@@@@@@@@@@@@@@@@@:       .&@@@@@@@@P                                    7@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@?        Y@@@@@@@@@:               
                                ^7J@@@@B!!                  ~7J@@@@G!!         !!G@@@@J7^        :7?@@@@#77.        ~!5@@@@5!7!?@@@@#77.        !!P@@@@5!77J@@@@B!!.        !!P@@@@Y7~                                    :77&@@@#777!B@@@@?!7!Y@@@@5!77?@@@@B!77!B@@@@?7^        ^7?@@@@B!!.               
                         !PPPP^   .???J!             !PPPP:   ^@@@@Y    YPPPY    5@@@@:             ?J?J7             :7!!7:    !7!7~             :7!!7:   .!7!7^             ^7!!7.                      7PPPP:   ^PPPP!    #@@@B    !J???.   !@@@@7   .&@@@G    P@@@&.            .???J!                  
                       ?JG@@@@PY7                  JJB@@@@PJYJ5@@@@BJYJY@@@@&YJYJB@@@@5Y!                                                                                                              .JJB@@@@5JYJP@@@@BJYJY&@@@&YY:        7YP@@@@GJYJY@@@@#JYYJ#@@@@YY~                                  
                       #@@@@@@@@G                 .&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@5                                                                                                              .@@@@@@@@@@@@@@@@@@@@@@@@@@@@~        B@@@@@@@@@@@@@@@@@@@@@@@@@@@?                                  
                       5P#@@@@BGJ                 .5P#@@@@BPPPB@@@@#PPPG@@@@@GPPP#@@@@GG7                                                                                                              .PP#@@@@GPPPB@@@@#PPPG@@@@&PP^        YGB@@@@#PPPG@@@@&PPPP&@@@@GG!                                  
                         7BBBB~             ~!!!~    ?BBBB^   ^BBBB?    PBBBP    5@@@@^   .!!!!:    ~!!!~                                                                                                 JBBBB^   ~@@@@J    &@@@B             ~BBBB7   .&@@@G    YBBBG.   :!!!!:                           
                                         .^^#@@@&~^.                           ^^P@@@@7^^^?@@@@5^^^~&@@@#^^                               .^^:.                                                                  :^?@@@@5^^^~&@@@B^^.                 .^~&@@@B^^.        ^^Y@@@@J^:                         
                                         ~@@@@@@@@@!                          .&@@@@@@@@@@@@@@@@@@@@@@@@@@#                          .^!?557:    :^~~~~!!~^:.                                                    P@@@@@@@@@@@@@@@@@@^                 ?@@@@@@@@@^        B@@@@@@@@G                         
                                         ~@@@@@@@@@!                          .#@@@@@@@@@@@@@@@@@@@@@@@@@@B.                       ^JPB##J.   :!7!^^?J?..:^~!7!^                                                 P@@@@@@@@@@@@@@@@@@^                 ?@@@@@@@@&^        B@@@@@@@@P                         
                          ....           .::#@@@&^:.  ....     ....     .....  ::P@@@@!:::7@@@@Y:::^&@@@B::                      ^5B#BBG~   :77:   .P##!      :!7!:                                        ....  .:7@@@@Y:::^&@@@B::   ....           .:~&@@@G::   ....  ::J@@@@?::  ....                   
                         ?&###!             B@@@#    J####~   ^###&J    G###G    5@@@@^   !@@@@J    ^~~~^                       ?B#BBBB~   ~J^      :GBG^...     ^77:                                     J####^   ~@@@@J    ^~~~^    Y####:            .&@@@G    5###B:   ?@@@@7   :####5                  
                       PB#@@@@#BY        ^BG&@@@@BGGG&@@@@BGGGB@@@@&GGGB@@@@@BGGG&@@@@BGGG#@@@@#B5                            .Y#BBBB#7   ~J.       ~PBBBGGGP5?.   :77.                                .PG&@@@@BGGGB@@@@#BP        :GG&@@@@BB7        7BB@@@@&GGGG&@@@@BGGG#@@@@#GGGB@@@@&GG.               
                       #@@@@@@@@G        !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#                            Y#BBBBBP.  :5.      .5BBBBBBBBB#B:     ^J~                               .@@@@@@@@@@@@@@@@@@#        :@@@@@@@@@Y        J@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@:               
                       7?G@@@@5?!        :??#@@@&J???G@@@@5???5@@@@G???J@@@@&J???B@@@@Y???5@@@@G?7                           !#BBBBB#7   J!       Y#BBBBBB####B:      .7?                              .??G@@@@Y???5@@@@G?7        .??#@@@@Y?~        ^JJ@@@@#????#@@@@J???P@@@@P???Y@@@@B??.               
                         ~5YY5^   .YYYY!    B@@@#    !5YYY:   ^@@@@Y    JYYYJ    Y@@@@:   :5YY5~                            .PBBBBBBB^  .5.      .GBBBBBBPJ?J5G:        !J.                      JYYYJ    Y@@@@^   ~@@@@J    JYYY?    75YYY.   ^YYYY~   .&@@@G    ?YYYY.   7@@@@!   .@@@@P                  
                                ~?Y@@@@B7???#@@@&??:        ~?Y@@@@G?7        .7?G@@@@Y?~                                   ~BBBBBBBG:  ^J       .GBBBB#Y     .          ~Y.                  :??&@@@&???7G@@@@Y???5@@@@G7???@@@@&??.        !?5@@@@P7??J@@@@#??.        7?P@@@@57??J@@@@B?7.               
                                5@@@@@@@@@@@@@@@@@@!        P@@@@@@@@&.       .@@@@@@@@@Y                                   ?#BBBBBBG:  ~J        5#BBBBP:                ~J                  !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@~        B@@@@@@@@@@@@@@@@@@^        #@@@@@@@@@@@@@@@@@@:               
                                ?BB@@@@&BBBB@@@@@BB~        JB#@@@@&BP.       .GB&@@@@#B?                                   J#BBBBBBB:  ~J        ^BBBBBBB5J7!~^.          77                 ~BB@@@@@BBBB&@@@@#BBB#@@@@#BBBB@@@@@BB^        5B#@@@@#BBBB@@@@&BB:        PB#@@@@#BBBB@@@@&BG.               
                         .^^^^.   ^###&Y    G###B.            ~###&J    ^^^^^    Y&###^   .^^^^:                            ?#BBBBBBB~  :Y         !BBBBBB####BBG5?~        Y^                  .G###G    5@@@@^   !@@@@J   .B###P    :^^^^    !&##&7   :B##&P             ?@@@@7   :###&5                  
                       :.Y@@@@?..  ....     .....              ....  .::#@@@#::   ....  ..7@@@@Y.:                          7#BBBBBB#J   Y:         !G##BBBBBBBBB##BP~      ~J                   .....  :.5@@@@!.:.7@@@@Y..  .....  :.P@@@@~:.  ....     .....           ..J@@@@?..  .....                  
                       B@@@@@@@@P                                    !@&@@@@@&@~        P@@@@@@@@B                          ^BBBBBBBBG.  !?          .!YPGBB####BBBB#B!      Y:                        .#&@@@@@&&&&@@@@@@@B        :&&@@@@@&@J                           G@@@@@@@@P                         
                       #@@@@@@@@P                                    !@@@@@@@@@~        P@@@@@@@@B                           PBBBBBBB#?  .5:             :^~!?J5GBBBBBB~     ?!                        .&@@@@@@@@@@@@@@@@@#        :@@@@@@@@@J                           B@@@@@@@@G                         
                       ^^5@@@@J^^                                    .^~&@@@#~^.        ^^?@@@@5^^                           !BBBBBBBBG:  ~Y                    :YBBBB#P     !?                         ^^P@@@@7^^^?@@@@5^^        .^^G@@@@7^:                           ^^Y@@@@J^^                         
                5BBBG.   :!!!!.   :BBBBJ                      ^BBBB?    ~!!!~    JBBBB:   ~@@@@?                             .P#BBBBBB#5   7?                    :BBBBBB~    ~J                           ^!!!!.   ~@@@@J             ^!!!!    ~BBBB!   .GBBBY             :!!!!:   :GBBBJ                  
             :PP&@@@@PP~        7PG@@@@#P5.                 ?PG@@@@#P5.       .5P#@@@@GPPPG@@@@BPY                            ^BBBBBBBB#J   ?7          :5?~:...^YBBBBB#!    !?                                  JPG@@@@#PY                  JPB@@@@BPPPP@@@@&PP:                 7PG@@@@&P5.               
             ~@@@@@@@@@?        5@@@@@@@@@.                 P@@@@@@@@&.       :@@@@@@@@@@@@@@@@@@#                             7BBBBBBBBB?   ?7         ^B#BBGGGBBBBBB#G.    ?!                                  G@@@@@@@@#                  B@@@@@@@@@@@@@@@@@@^                 Y@@@@@@@@@:               
             :YY#@@@@5Y~        !Y5@@@@BYJ.                 7YP@@@@BYJ.       .YYB@@@@PYYYP@@@@BYJ                              ?#BBBBBBBB?   !?.       ^BBBBBBBBBBBB#G^    .5.                                  7YP@@@@BYJ                  ?YG@@@@GYYY5@@@@#YY:                 !Y5@@@@#YY.               
                G@@@&             :@@@@5             ~????:   :PPPP7    7???7    5@@@@:   ^PPPP!    ????!                        ?#BBBBBBB#Y.  ^J~      ^G########BBBJ:     ?7                                     ^PPPP!                      ~PPPP~   .&@@@G    !????             .@@@@P                  
             .!!B@@@&7!:        ^!?@@@@G!!         !!P@@@@J!^        :!7&@@@&!!!!G@@@@?!^        :!7@@@@#!~                       7B#BBBBBB#P^  .7?^     :!?Y5PP5YGBB^     !J                                                                         :!7&@@@B!!!!#@@@@?!:        ^!?@@@@B!!.               
             ^@@@@@@@@@?        5@@@@@@@@&.       .&@@@@@@@@P        7@@@@@@@@@@@@@@@@@@Y        ?@@@@@@@@#.                       ^P#BBBBBB#B?.  :77^            ~B#P.   7?.                                                                         J@@@@@@@@@@@@@@@@@@?        Y@@@@@@@@@:               
             ^##@@@@@#&!        J&#@@@@&#B.       .B#&@@@@&&Y        !&#@@@@@####&@@@@&&J        7&#@@@@@#G                         .JB#BBBBBB#G7.  :!7!:          ?BB7 ~?~                                                                           7&#@@@@@####@@@@@#&7        ?&#@@@@&#B:               
              . G@@@&:            ~@@@@5 .  :::::  . Y@@@@!           ..B&&&B... 5@@@@~   .::::.  .:#&&&G..                           ^5B#BBBBBB#P7.   ^!7!~^..    :!!77~.                                .::::                       .::::    .::::.  .:#&&@P... P@&&#^.  .::::.   ^@@@@P .                
              ..G@@@&:.           ~@@@@P ...B@&@#:.. Y@@@@!             ::::.  . 5@@@@~ . !@&&@J .  ::::.                               ~YB#BBBBBB#GJ~.   .^~!!!!!!!~^.                                 . 5@&&@~                    . P@&&&^.. 7@&&@? .  ::::.    .::::  . ?@&&@7 . ^@@@@P .                
             ^##@@@@@#&7        J&&@@@@&####@@@@@####&@@@@&&Y                 .B#&@@@@&###&@@@@&#G                                        ^?PB##BBBB#BPJ!:.                                            .B#&@@@@&&J                 :##@@@@@&###&@@@@&&P                  G&&@@@@&###&@@@@@#B:               
             ^@@@@@@@@@7        5@@@@@@@@@@@@@@@@@@@@@@@@@@@5                 .@@@@@@@@@@@@@@@@@@#                                          .^?5GB#######BG5J?!~^:.                                    .@@@@@@@@@5                 :@@@@@@@@@@@@@@@@@@B                  #@@@@@@@@@@@@@@@@@@:               
             .!!B@@@&7!:        ^!?@@@@G!!!!&@@@&7!!~P@@@@J!^                  !!G@@@@?!!!J@@@@5!~                                              :~7JY5PPPPP5J7!^:.                                      !!G@@@@J!^                 .!!G@@@@?!!!Y@@@@5!~                  ~!5@@@@Y!!!?@@@@B!!.               
                G@@@&             :@@@@5    !???7    J@@@@^   :PPPG7    5PPPY    5@@@@:   ~@@@@?    5PPGY                                              ..                                                 ~????.             5PPGY    5@@@@:   :????^             JGPPP.   ^????:   .????~                  
             :YY#@@@@55~        !5P@@@@#YY.        JYB@@@@PYYYP@@@@BYYY5@@@@&YYYYB@@@@PYYYP@@@@BYYY5@@@@&5J                                                                                                               ~55@@@@&YYYY#@@@@55!                 :YY&@@@@55~                                  
             ~@@@@@@@@@?        5@@@@@@@@@.       .&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&.                                                                                                              ?@@@@@@@@@@@@@@@@@@Y                 ^@@@@@@@@@?                                  
             :PP&@@@@PP~        7PG@@@@#P5.       .5P#@@@@GPPPG@@@@#5PPP@@@@@PPP5#@@@@GPPPG@@@@#PPPP@@@@&PY                                                                                                               ~PP@@@@&PPPP#@@@@GP!                 :PP&@@@@PP!                                  
                G@@@&.            :GGGBJ             J@@@@~   ^GGGB?    PGGB5    5@@@@^   ^BGGB7   .PGGB5    ~7!7!              !7!7~    ~7!7!    :7!!7:   .!7!7~    ~7!7!                                ^7!77.             &@@@B    5@@@@:   :7!!7:             YBGGG.   :7!!7:   .!7!7~                  
             .~~B@@@&!~.                           ^^5@@@@?^:                  ^^P@@@@7~:                 .~^G@@@@7~:        :~!@@@@B^~~^B@@@@!~~^5@@@@J^~^7@@@@G^~~~#@@@&~~.                           ^^P@@@@?~:        .~~&@@@#~~~^G@@@@7^~^J@@@@Y^^                  ^^Y@@@@J^~^7@@@@G^~.               
             ^@@@@@@@@@7                          .&@@@@@@@@5                 .&@@@@@@@@Y                 :@@@@@@@@@J        J@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@7                          .&@@@@@@@@Y        7@@@@@@@@@@@@@@@@@@@@@@@@@@@B                  B@@@@@@@@@@@@@@@@@&:               
             ^&&@@@@@&@7                          .#&@@@@@&@5                 .#&@@@@@&@J                 :&&@@@@@&@?        ?@&@@@@@&&&&@@@@@&&&&@@@@@&&&&&@@@@@&&&&@@@@@&@!                          .#&@@@@@&@Y        7@&@@@@@&&&&@@@@@&&&&&@@@@@&G                  G&@@@@@&&&&&@@@@@&#:               
              :.B@@@&^..           .....    .....  ..Y@@@@!..  .....    .....  :.P@@@@!..  .....           :.P@@@@~..  ....  ..^&@@@G.::.G@@@&^::.J@@@@?.:.~@@@@P.:::B@@@&^:.                    .....  ..5@@@@!..  ..... .:^&@@@B:::.P@@@@~.:.?@@@@J..           .....  ..J@@@@?.:.~@@@@P.:                
                G@@@&.            ^#&#&Y    G&#&B.   .^^^^.   ~&##&J   .B&#&G    :^^^^    !&##&?             :^^^^    7&##&7   :&@@@G    :^^^^    ?@@@@7    ^^^^:    B@@@#.                     .G&#&G.   5@@@@^   ~&##&J   .&@@@B    P@@@@^   7@@@@?             P&#&#:   .^^^^.    ^^^^:                  
             ^BB&@@@@BB!        ?##@@@@&BBBB@@@@@BB~        JB#@@@@&BBBB@@@@@BB^        YB#@@@@&BP                  5B#@@@@#BBBB@@@@&BB:        PB#@@@@#BY        ^BB&@@@@BB~                 ~BB@@@@@BBBB&@@@@#BBB#@@@@&BBBB@@@@&BBBB&@@@@#BBB#@@@@#B5        :BB&@@@@BB7                                  
             ^@@@@@@@@@?        5@@@@@@@@@@@@@@@@@@!        P@@@@@@@@@@@@@@@@@@~        G@@@@@@@@#                  B@@@@@@@@@@@@@@@@@@^        #@@@@@@@@G        ~@@@@@@@@@7                 !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@B        ^@@@@@@@@@?                                  
             .??#@@@@??^        ~?J@@@@B7???&@@@@??:        ~?Y@@@@G7?7?@@@@&??:        !75@@@@P7!                  !75@@@@P7?7J@@@@B77.        !7P@@@@57!        :??&@@@@??:                 :??&@@@&???7G@@@@Y7?75@@@@G7?7?@@@@&???7B@@@@J7?75@@@@P7!        .?7#@@@@J?^                                  
                7YJJJ             .JJJY!    ?YJJ?             :YJJY!    ?JJY?             ~@@@@?    Y555?    7555Y.   !@@@@7   .&@@@P             ?@@@@!   .55557    ?YJJJ             :5555!    #@@@#    Y@@@@^   :YJJY~    JJJY?    !YJJJ.   !@@@@7    Y555?    7YJJJ    ~5555^   .Y5557                  
                                                                                        !J5@@@@G?J?J@@@@&JJJ?#@@@@Y?J?P@@@@P?J?Y@@@@#??.        7?P@@@@P?J?Y@@@@#??.                 !J5@@@@B?JJJ&@@@&JJJ?B@@@@YJ~                           7?P@@@@P?J?Y@@@@#??.        7?P@@@@P?J?Y@@@@#??.               
                                                                                        G@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@^        #@@@@@@@@@@@@@@@@@@:                 P@@@@@@@@@@@@@@@@@@@@@@@@@@@5                           B@@@@@@@@@@@@@@@@@@^        #@@@@@@@@@@@@@@@@@@:               
                                                                                        YGB@@@@#GGGB@@@@&GGGG&@@@@BGGG#@@@@#GGGB@@@@&GG:        5G#@@@@#GGGB@@@@&GP.                 JBB@@@@#GGGG@@@@&GGGG#@@@@BB?                           YG#@@@@#GGGB@@@@&GG:        5G#@@@@#GGGB@@@@&GG.               
                             .:^^~~~~~~~~~~~~~~~~~~~~~~~~~~~^^:.                          ~####?   .B###P    P@@@@:   7@@@@7   :B###5    ^~~~~    7####!   :@@@@5                      ^@@@@Y    #@@@#    Y@@@@^             ~~~~^             !@@@@?   .B###5             7####!   :B###Y                  
                        :!JPB#&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&#G5?~.                         .            ::G@@@@~:::J@@@@J::         ::B@@@@~:.        .:!@@@@P::                  .:!@@@@5:::^#@@@#^:::P@@@@!:.        .:^&@@@#::.        ::?@@@@J::                                                     
                     :?G&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#P7.                                  :&@@@@@@@@@@@@@@@@@G        ^@@@@@@@@@7        Y@@@@@@@@&:                 5@@@@@@@@@@@@@@@@@@@@@@@@@@@Y        7@@@@@@@@@^        G@@@@@@@@G                                                     
                   ~P&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#Y:                                :@@@@@@@@@@@@@@@@@@G        ^@@@@@@@@@?        Y@@@@@@@@&:                 5@@@@@@@@@@@@@@@@@@@@@@@@@@@Y        7@@@@@@@@@^        G@@@@@@@@B                                                     
                 :P@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&J.                               ^^G@@@@!^^:J@@@@Y^:        .^^B@@@&~^.        :^!@@@@P:^                  :^7@@@@P:^^^#@@@#^^^:P@@@@7^:        .^~&@@@#^^.        :^J@@@@Y::                                                     
                !&@@@@@@@@@@@&BY?!~^^^^^^^^^^^^^^^^^^^^^^^~!J5B@@@@@@@@@@@@B^                      .GBB#5    ^!~~~    .!~~!:             G@@@&.            :@@@@5                      ^@@@@Y    #@@@#    Y@@@@^             ~~~~^             !@@@@?   .BBB#5                                              
               7@@@@@@@@@@@G7:                                 ^?B@@@@@@@@@@#^                   !GG@@@@&GG:                          :GG&@@@@GG!        7GG@@@@#GP.                 ?GB@@@@#PGGG&@@@&GGGP#@@@@BG?                           YGB@@@@#PGGG@@@@&GP:                                           
              ~@@@@@@@@@@B!                                       7#@@@@@@@@@B.                  ?@@@@@@@@@^                          ^@@@@@@@@@?        Y@@@@@@@@@:                 P@@@@@@@@@@@@@@@@@@@@@@@@@@@5                           B@@@@@@@@@@@@@@@@@@^                                           
              G@@@@@@@@@5.                                         :G@@@@@@@@@J                  ^YY&@@@#JJ:                          :JJ&@@@@YJ^        !J5@@@@BJJ.                 !J5@@@@BJJJY&@@@&YJJJB@@@@5J!                           7JP@@@@GJJJY@@@@#JJ.                                           
             :&@@@@@@@@G        !JJJJJJJJJJJJJJJJJJJJJJJJJJJ^       :#@@@@@@@@B           :JJJJ~    &@@@G                       JJJJ7    ?5555.            :@@@@5             ~JJJJ:   ^@@@@Y    Y555Y    Y@@@@^   :JJJJ~    ?JJJ7    !JJJJ.   !@@@@7   .&@@@G    7JJJJ    ^JJJJ^   .JJJJ!                  
             ^@@@@@@@@@!        5@@@@@@@@@@@@@@@@@@@@@@@@@@@7        J@@@@@@@@#.        ~7Y@@@@P!77?&@@@#77.                 ^7?@@@@#77.                 ^7J@@@@B7!.        !7P@@@@Y777J@@@@G7!         !7G@@@@J777Y@@@@P!77?@@@@&7777B@@@@J7775@@@@5!77?@@@@B7777#@@@@?77!P@@@@5!77J@@@@B77.               
             ^@@@@@@@@@^        Y@@@@@@@@@@@@@@@@@@@@@@@@@@@7        !@@@@@@@@&.        G@@@@@@@@@@@@@@@@@@^                 J@@@@@@@@@^                 Y@@@@@@@@@:       .&@@@@@@@@@@@@@@@@@&.       .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@:               
             ^@@@@@@@@@^        Y@@@@@@@@@@@@@@@@@@@@@@@@@@@7        !@@@@@@@@&.        5##@@@@&B###@@@@@#B^                 7##@@@@&#B:                 ?##@@@@&#B.       .G#&@@@@#B###@@@@&#G.       .B#&@@@@###B#@@@@&B###@@@@@####&@@@@###B&@@@@&B###@@@@&####&@@@@###B&@@@@&B###@@@@&#B:               
             ^@@@@@@@@@^        Y@@@@@@@@@@@@@@@@@@@@@@@@@@@7        !@@@@@@@@&.          !@@@@J   .&@@@B    :^^^^             :&@@@G             .^^^^.   ^@@@@P    :^^^:    J&&&&!   ~@@@@5    :^^^:    5@@@@~   !@@@@J   .B&&&G    P@@@@^   7&&&&?   :&@@@G    G@@@&:   ?&&&&7   ^#&&&5                  
             ^@@@@@@@@@^        Y@@@@@@@@@@@@@@@@@@@@@@@@@@@7        !@@@@@@@@&.        ..7@@@@Y...:&@@@B....P@@@&^..        ..^&@@@G..         ..J@@@@7...~@@@@P....B@@@#:.  .....  ..!@@@@5...:#@@@#:...5@@@@~...!@@@@Y..  .....  ..P@@@@~.. ......  .^&@@@G....G@@@&^.  ......    .....                  
             ^@@@@@@@@@^        Y@@@@@@@@@@@@@@@@@@@@@@@@@@@7        !@@@@@@@@&.        P&&@@@@&&&&&@@@@@&&&&@@@@@&&?        ?&&@@@@@&#:        G&&@@@@&&&&&@@@@@&&&&@@@@@&&!        Y&&@@@@@&&&&@@@@@&&&&@@@@@&&&&&@@@@&&G        :#&@@@@@&&?        ?&&@@@@@&&&&@@@@@&&7                                  
             ^@@@@@@@@@^        Y@@@@@@@@@@@@@@@@@@@@@@@@@@@7        !@@@@@@@@&.        G@@@@@@@@@@@@@@@@@@@@@@@@@@@J        J@@@@@@@@@:        #@@@@@@@@@@@@@@@@@@@@@@@@@@@7        5@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#        :@@@@@@@@@J        ?@@@@@@@@@@@@@@@@@@?                                  
             ^@@@@@@@@@^        Y@@@@@@@@@@@@@@@@@@@@@@@@@@@7        !@@@@@@@@&.        ^~J@@@@5~~~!&@@@B~~~~B@@@@7~:        :~7@@@@B~~.        ~~5@@@@J~~~7@@@@G~~~~#@@@&!~.        ^~?@@@@P~~~!#@@@#!~~~P@@@@?~~~J@@@@5~~        .~~G@@@@7~:        :~7&@@@B~~~~B@@@@7~:                                  
             ^@@@@@@@@@^        Y@@@@@@@@@@@@@@@@@@@@@@@@@@@7        !@@@@@@@@&.          ~@@@@?    &@@@G    ~7777             .&@@@P             ?@@@@!   :@@@@5    !777!             ^@@@@Y    #@@@#    Y@@@@^   ~@@@@J    PGGG5    5@@@@:   ~GGGG!   .&@@@G    P@@@&.   !GGGG~                           
             ^@@@@@@@@@^        Y@@@@@@@@@@@@@@@@@@@@@@@@@@@7        !@@@@@@@@&.        ?5G@@@@B555P@@@@&55:                 !5P@@@@#55:        J5B@@@@G555P@@@@#5Y.                 75P@@@@#5555&@@@&5555#@@@@P555G@@@@B555P@@@@&5555#@@@@P555G@@@@B555P@@@@#5555#@@@@P555B@@@@G5?                         
             ^@@@@@@@@@^        Y@@@@@@@@@@@@@@@@@@@@@@@@@@@7        !@@@@@@@@&.        G@@@@@@@@@@@@@@@@@@^                 J@@@@@@@@@^        #@@@@@@@@@@@@@@@@@@:                 P@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@B                         
             ^@@@@@@@@@^        5@@@@@@@@@@@@@@@@@@@@@@@@@@@7        J@@@@@@@@&.        ?5G@@@@B5555@@@@&55:                 !5P@@@@&55:        J5B@@@@G555P@@@@#5Y.                 75P@@@@#5555@@@@@5555#@@@@P555G@@@@B5555@@@@&5555#@@@@P555G@@@@B555P@@@@#5555&@@@@P555G@@@@G5?                         
             ^@@@@@@@@@^        7555555555555555555555555555~       .B@@@@@@@@B           ^GGGG!    PGGGY    ~7777.   :?77?:   .PGGGJ    !7777    ?@@@@!   :PGGG?    !7777             :GGGG?    5GGG5    ?GGGG:   ^GGGG7    PGGGY    JGGGP.   !@@@@7   .&@@@G    JGGGP.   7@@@@!                           
             ^@@@@@@@@@^                                           .P@@@@@@@@@5                           .~~B@@@@7~~~Y@@@@5~^        .~~#@@@@7~~~5@@@@J~^        .~~#@@@&!~:                                                                ^~Y@@@@5~~~7&@@@B~~.        ~~Y@@@@Y~^                         
             ^@@@@@@@@@^                                          ~B@@@@@@@@@&:                           :@@@@@@@@@@@@@@@@@@B        ^@@@@@@@@@@@@@@@@@@G        ~@@@@@@@@@7                                                                G@@@@@@@@@@@@@@@@@@^        B@@@@@@@@G                         
             ^@@@@@@@@@:                                       .7G@@@@@@@@@@@!                            :#&@@@@@&&&&&@@@@&&P        ^&&@@@@@&&&&&@@@@&&5        ~&&@@@@@&&!                                                                P&&@@@@&&&&&@@@@@&#:        G&&@@@@&&P                         
             ^@@@@@@@@@~................................::^~!JG&@@@@@@@@@@@&!                              ..P@@@@^...?@@@@?..         ..G@@@&^...J@@@@7..  ...:.  ..B@@@&:.  .:..:              .:...              :..:.    ...:.           ..7@@@@J ..^&@@@G..  .:...  ..?@@@@?..                         
             ^@@@@@@@@@&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&@@@@@@@@@@@@@@@@P:                                 P@@@@^   .^::^.             :^:::    .^:::.   ^&&&&5    B@@@&.   J@&&&!            .B&&&B.            !&&&@J   .#&&&G             7@@@@?    :::^:    P&&&#:   .^::^.                           
             ^@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@P~                                :B#&@@@@##?                                    ?##@@@@&####@@@@@###B&@@@@##Y        ~##@@@@@##~        Y##@@@@&B###@@@@@##^        5##@@@@&#P        :B#@@@@@##7                                  
             ^@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&GJ^                                  :@@@@@@@@@J                                    Y@@@@@@@@@@@@@@@@@@@@@@@@@@@P        !@@@@@@@@@!        G@@@@@@@@@@@@@@@@@@~        B@@@@@@@@B        ^@@@@@@@@@?                                  
             ^@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&#GY!:                                     .77B@@@@?7^                                    ^7J@@@@B!777&@@@@777!P@@@@Y7~        :77&@@@&77:        ~7Y@@@@P!77?@@@@&77.        ~75@@@@P7!        .77#@@@@?7^                                  
             .777777777777777777777777777777777777777777777!!~^:.                                            !JJJ?.                                        .?JJJ!    7JJJ?    ~JJJJ:             ?JJJ7             :JJJJ~    ?JJJ7             :JJJJ^             !JJJ?                                     
*/
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;

import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol";

contract QRToken is ERC20, ERC20Burnable {
    constructor() ERC20("QR", "QR") {
        _mint(msg.sender, 9612746631306688 * 10 ** decimals());
    }
}
// File: @openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol



// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/extensions/ERC20Burnable.sol)

pragma solidity ^0.8.0;

import "../ERC20.sol";
import "../../../utils/Context.sol";

/**
 * @dev Extension of {ERC20} that allows token holders to destroy both their own
 * tokens and those that they have an allowance for, in a way that can be
 * recognized off-chain (via event analysis).
 */
abstract contract ERC20Burnable is Context, ERC20 {
    /**
     * @dev Destroys `amount` tokens from the caller.
     *
     * See {ERC20-_burn}.
     */
    function burn(uint256 amount) public virtual {
        _burn(_msgSender(), amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, deducting from the caller's
     * allowance.
     *
     * See {ERC20-_burn} and {ERC20-allowance}.
     *
     * Requirements:
     *
     * - the caller must have allowance for ``accounts``'s tokens of at least
     * `amount`.
     */
    function burnFrom(address account, uint256 amount) public virtual {
        _spendAllowance(account, _msgSender(), amount);
        _burn(account, amount);
    }
}

// File: @openzeppelin/contracts/token/ERC20/ERC20.sol



// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/ERC20.sol)

pragma solidity ^0.8.0;

import "./IERC20.sol";
import "./extensions/IERC20Metadata.sol";
import "../../utils/Context.sol";

/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin Contracts guidelines: functions revert
 * instead returning `false` on failure. This behavior is nonetheless
 * conventional and does not conflict with the expectations of ERC20
 * applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

    mapping(address => mapping(address => uint256)) private _allowances;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * The default value of {decimals} is 18. To select a different value for
     * {decimals} you should overload it.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5.05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the value {ERC20} uses, unless this function is
     * overridden;
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view virtual override returns (uint8) {
        return 18;
    }

    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view virtual override returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address to, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _transfer(owner, to, amount);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on
     * `transferFrom`. This is semantically equivalent to an infinite approval.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * NOTE: Does not update the allowance if the current allowance
     * is the maximum `uint256`.
     *
     * Requirements:
     *
     * - `from` and `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);
        _transfer(from, to, amount);
        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, allowance(owner, spender) + addedValue);
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        address owner = _msgSender();
        uint256 currentAllowance = allowance(owner, spender);
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(owner, spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    /**
     * @dev Moves `amount` of tokens from `sender` to `recipient`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     */
    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(from, to, amount);

        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[from] = fromBalance - amount;
        }
        _balances[to] += amount;

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _beforeTokenTransfer(address(0), account, amount);

        _totalSupply += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);

        _afterTokenTransfer(address(0), account, amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
        }
        _totalSupply -= amount;

        emit Transfer(account, address(0), amount);

        _afterTokenTransfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    /**
     * @dev Updates `owner` s allowance for `spender` based on spent `amount`.
     *
     * Does not update the allowance amount in case of infinite allowance.
     * Revert if not enough allowance is available.
     *
     * Might emit an {Approval} event.
     */
    function _spendAllowance(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            require(currentAllowance >= amount, "ERC20: insufficient allowance");
            unchecked {
                _approve(owner, spender, currentAllowance - amount);
            }
        }
    }

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * has been transferred to `to`.
     * - when `from` is zero, `amount` tokens have been minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens have been burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}

// File: @openzeppelin/contracts/utils/Context.sol



// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

// File: @openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol



// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.0;

import "../IERC20.sol";

/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the symbol of the token.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}

// File: @openzeppelin/contracts/token/ERC20/IERC20.sol



// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);

    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `from` to `to` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) external returns (bool);
}