!!!!!!!!!!!!!!!!!!!!!!:::::::::::::::':::::':::':':::::'::''''::'::':::::::::::::::::::::::!::::::::::::!:!::::::::::::::::::::!!!:!!!
!!!!!!!!!!!!!!!!!!!!:::::!::::::::::::::::'::'::'''::'''.......'''''':'::::::::::::::::::::::::::::::::::::::!::::::::::::::::!!:!:!!!
!!!!!!!!!!!!!!!!!!!!::::::::::::::::::::::':''....''....         ... ...'''':::::::::::::::::::::::::::::::::::::::::::::::::::!:!:!!!
!!!!!!!!!!!!!!!!!!!!::::::::::::::::::::::'.. ....'':....    .....  ..  .''':'::::::::::::::::::::::::::::::::::::::::::::::::::!!!:!!
!!!!!!!!!!!!!!!!!:!!:::!:::::::::::::::::'...''''.''....    ...''.   .   ...'':::::::::::::::::::::::::::::::::::::::::::!:::::::!!!!!
!!!!!!!!!!!!!!!!!!!!!::::!:::::::::::::::::!^!^!!:'''.. .     ...'.      .   .':::::::'::::::::::::::::::::::::::::::::::::::::::!:!!^
!!!!!!!!!!!!!!!!!!!!!::::!::::::::::'''''':'!^^^^!!:'.       .            .  ..''::::'::::::':::::::::::'::::::::::::::::::::::::!:!!!
!!!!!!!!!^!!!!!!!!!!!::::::::::::'.......''!^^^!^!!::!!'.. .                     ..''''':::::::::::::::::::::::::::::::::::::::::::!!!
!!!!!!!!!!!!!!!!!!!!!::::!:::::::..''..':!!:'.............                             .'':'::::::::::::::!::::::::::::::::::::::!:!!!
!!!!!!!!!!!!!!!!!!!!!!:::!!:::::....'''!!'.....':::''......                               .'':::::::::::::::::::::::::::::::::::::::!!
!!!!!!!!!!!!!!!!!!!!!:!:!!!::::'...'''''..':!+/+!:'''..'.............                     ..'::::::::::::::::::::::::::::::::::::!!:!!
!!!!!!!!!!!!!!!^!!!!!!!!!!:!!:'.''..''::':^+++^!^:!:::'''::::::''...                        .':::::::::::::!:::::::::::::::::::!:!!:!!
!!!!^!!!!!!!!!!!!!!!!!:::!!!:'....'':!'''::!^++^!^++//+!!:''........                         .'::::::!:::::::::::!!::!::::!:::!!!!!!!!
^^!^^!^^^^!!!!!^!!!!!!!!!!:'.....''.''':!^!!!!^//CC/^:''''.'.''..                          . .'::!!::!!:::::::::!!!::!:::!:::!!!!!!!!^
!!^^^^!^^^!!!!!!!!!!!!!!!!:'.....':!^!!^+^!^//%%/^:!^^^!!!!!:'......                         .:::!!::!!!::::::::::!!!!!!!!!!!:!!!!!!!^
!!!!!!!!!!!!!!!!!!!!!!!!!!:....'::::::!^^^+%%%+!++%/%/^:''''..'....                         ..':!!::!!!!:::!!::!:!!!!!!:!!::::!!!!!!!!
!!^!!!!!!!!!!!!!!!!!!!!!!!'..'.''''':!!!+//%+!!+%CX%!'::!::!::''..     .                    ''':::::!!:!:::::::::!:::::!:!!:::!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!:!!:........':'':!^^!!:^XCC/^:!^^^+++^!'..'''''''...                 .':::::::::!:::::::!!:::::!::!::::::!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!:'.......'''.'!!!:!+%X%/^^++//XX%+/+++//++^:::..      .'.           '!::::::!::::::::::::!::::::::::::!!:!!!!!
^!!!!!!!!!!!!!!!!!!!!!!!:...........:!:''^^/+^!!^^+%XC////%%/+^!:!!:'...     :!.            .::::::::::::::!::!!::::!:::::::::!!:!!:!!
!!!!!!!!!!!!!!!!!!!!!!!::'.. .....'::'''':^^!:!!^+%%/+!^!^!!^^+/^!:::'..   ./!             ..'::::::::!::::::::!:::!:::::!::::!:!!!!!!
!!!!!!!!!!!!!!!!!!!!!:::::..    ..''...':^!::!!^^/////%++^+/%%/////^:''...!%'               ':::::::::::::::::::::::!!::!::::::!!!!!!!
!!!!!!!!!!!!!!!!!!!!!:!!:'.    ......'':::''!!!^+/XCC0C%+/%XXXCCC%+!!!:!^X/'.               .:::::::::::::::::::::!::!::!:::::!!!!:!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!'   .. ....'''''':::^^+%CCC0CXX00CCC0C%/+++/%%C^'..             ...:::::::::::::::::::::!:::!::::::!!!!!!:!!
!!!!!!!!!!!!!!!!!!!!!!!:!::.   ...'''.'...'':!^^/X0@@$00$@CCCCCX//XC0X%%!'....  . .       :::::::::::::::::!:::!:::!!!!!!::::!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!:!:!!.  .'''''..'..'''!^+XX0$BB@@$00C00CX%C0CX%/^:''.........       ':::::::::::::::::::::::!:::!::::::::!::!!!!
!!!^!!!!!!!!!!!!!!!!!!!!!!!:'.!$B0+'....''':^+%C@BNBB$$$@@00@@CCCX+^^+!:...........       .::::::::::::::::::!:!!::::!::!!!:::!!:!!!!^
!!!!!!!!!!!!!!!!!!!!!::!!!!:!:@/+$@C^!'.'::!^%0$NNB$$$$@@@@@0CXX/^^++^:'....  .           '::::::::::::::!!!!::!:!::::!:!!::!:!!!!:!!^
!^!!!!!!!!!!!!!!!!!!!!:!::!!:^B+@B@CX+:.'':!/0$$@@@$$@00@0C/%/+^^^!:''.....              .:::::::::::::::!!::!:!:!!!:!:!!!!!:!!!!:!!!!
!!!!!!!!!!!!!!!!!!!!!!::::!:!!@XMB@0%0X'.':/XC@$B$@C%%%%%%/++^!!!'....   .                '::::::::::!:!!::!:::::::::!::!!::!!!!!!!!!^
!!!!!!!!!!!!!!!!!!!!!::::::::!/@NX+XB$X%'''+C$BB$@@0CXX%/^!!:'!:... ...':''...            ':::::::::::!::::!:::::::::::::::!:!!!!!!!!!
!!!!!!!!!!!!!!!!!!!:!:::::!:::!$BB0$NMMB:.'+@BMMMMMN$@0%^/CC/%+!!!:..'/%%%//+!.           '::::::::!::::!!::!:::!:::!!:!!!:!!!:!!:!!!!
!!!!!!!!!!!!!!!!!:!!::::::::!::/BNNMNB$0+''+CBMMMMMMNNB$BBB@CC%+^:'..:C0000@0X!.          ::::::::::::::::::::::::::::::!!::!::::!!!!!
!!!!!!!!!!!!!!!!!!:!::::::!:::::%NMMMN$C+!:+C$NNNMMMMMMNNBB$@0X+^:::+C@$$$BNN@%:.        .!:::::::::::::::::::::::::::!:!!:::::!:!!!!^
!!!!!!!!!!!!!!!:!!:!:::::::!:::::^$NNBB$$0/+XC@BNNMMMNMNBBB$$0C/^+XC@$$BNNMMMN0+.. .     '!!:::::::!!!::!!:::::!:!:::::!!:::::!!!!!!!^
!!!!!!!!!!!!!!!!!!:!:::::::!!::::'.^C00CX!:^+%C$BNNNNNNBB$$@@0CC0$@00$BNNMMMMN@/...     .!:!:::::::::::::::::::!:::!::!::!:!::!!:!!!!^
!!!!!!!!!!!!!!!!!!!!!::::!::::!::.     .%^+XCC0@BBBBBBB$$@@@@@@$$$@0X0NMMMM#MN@X!.      '!!:!:::!:::::::::!:::::!::!::::::!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!:!!:::::!::!::'.      .X$BNB$B$BBBBB$$@@@@@$$BB$@CX/0MM#MMM#N@%+:.    .::!!::!!:!!!::::::::::::::!!:!!!:!:!!::!:::!!!
!!!!!!!!!!!!!!!:!::::::::::::::.       .^BBNN$$BBBB$$$$@@@$$BBBB$@CX@BNMMMMMMN@/+:.    '!!!::!::!!::!!::::!!:!!:::!!::!::!:::::!:::!!!
!!!!!!!!!!!!!!!!!:!!!::::::!!!'.      ..+$BNNB$$BBBBB$$@@@$$BBBB$@0$NNB$000CXCX^'.    .:!!!!:::::!::!::::::!:::::!!!::!:!!:!:!!!:!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'.        ^$BBNN$@$BBBB$@@@@$$BBBB$BNNNNB$$@@0^'%:      :!!!!::!!::!:::!:!:!!!:::::::!!:!:::::::!!!!:!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'.        .:BBNNNB$0@$BB$$@@@$$$BBBNNBB$@0CCCXC+!C!      '!!!!!!!!!!!!!!!!!!!!!!:!::!!!:!::!!:!:!!!:!!!!!
!!^!!!!!!!!!!!!!!!!!!!!!!!!:'..          0BNBBB$@C@$$$$$$@$$BBNBB$0X+^+%%%+^^^:.       .:!!!!!!!!!!!!!!!!!!!!!!:!!!!:!!:!!:!!!!!:!!!!!
^!!!!^!!!!^!!!!^!!!!!!!!::'''.           '$BBBB$@0CC0@@@$@@@$BNB@%++%XXCX%/^/N$!.       .:!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!:!::!!!!!!^!
!^^^!^!!!!!!!!!!!!!!::''...'.'            '0BB$$@@0CXX0@@@$$$$$@0CC@$$$@0CC%%CNN0:..    . .:!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!:!!!!!!!^^
^^^!!!!!!!!!!!!!!::'.''''.'....            .^0$$$@@0CX%X0@@$$$$$$$@@@@@0CX+^!:!BMMX.    !! .:!!!!!!!!!!!!!!!!!!:!!!!!!!!!!!::!!!!!!!!^
^^^^^^!!^^^!!!::'...........'.               .!C$@@00CX%/X0@$$$$$@00@@@C+:'''..'CMM$!. .XX ..'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!^^
^^^!^^!!!^^!'...............'    .              '/C00CCXX%%%X@@$$$$$$$@0XXX%/^!'.!$MMX..X@.   '!!!!!!!!!:!!!!!!!!!!!!!!!!!!!!!!!!!!!!^
^^^^^^^^!:'................'..                    .!/XX%////+^/C0@@@@@@00CX/!:'....%MM$:^0     .':!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!^^
^^^^^^!!:'''........'...  .'.                        .:!!!!::. .:+%%XCXX%/^'....    !@@/:^.       .':!!!!!!!!!!!!!!!!!!!!!!!!!!^!!^^^^
^^!!:!::::''''''''''....  ..                            ....       ..'':'...          ^/'.           .':!!!!!!!!!!!!!!!!!!!!!!!!!!!^^^
!!!::':''''..........'..  ..                                                                            ':!!!!!!!!!!!!!!!!!!!!!!!!!!^^
!!:':'''''''':''...............         .                                                .':             .'!!!!!!!!!!!!!!!!!!!!^^^^^^^
!!:'''''':':''.... ....  .... ....   .                                              ..!..''                '!!!!!!!!!!!!!!!!!!^!!!!!^^
!!!:::''::'.'......     ..... ...  ...                                              ^0$B0$CC' .             '!!!!!!!!!!!!!!!!!^^^!^^^^
::!:'''::...........    .......... . .                                             .$N@%NN$$^''.            .:!!!!!!!!!!!!!!!!^^^^^^^^
':'''':'..... .......  .......  ..   .                                             +MMNNNBB$%'...            .:!!!!!!!!!!!!!!!!^!!^^^^
:'::''...'............  ......  .....                                            ^X$NNBBBB$@C!..              .:!!!!!!!!!!!!!^!^^^^^^^
:::!:............. ...  .........   . . ..                                  .^%0$BNBBB$$@C%+:.                  '!!!!!!!!!!!!!!^!^^^^^
::!:..... .......  ....  .       .                                       :/0BBBB$$$@00X/^:'..                    .:!!!!!!!!!!!!!!!!^^^
!!'..............  .....         .    ...                           ...!CNNNN$@0CX%/+^:''':::::'..                .!!!!!!!!!!!!^!!^^^^
!:'................ ....              ..      ...            .     ..'XNNNNN$0CX/^^!^/X00CCX/^!'.                  '!!!!!!!!!!^^!!!^^^
'''.......... ..........             ...      .''                   +BNNNNNB$@@@@@$@@0C%+^!!:.. .                  .!!!!!!!!!!!!!!^!^^
'.............. ..... ....     .  .  ....     .:'.        ..      'CNNNNMMNNNNNNNB$0/!'.....                        :!!!!!!!!!^^^^!^^^
'...................  ....            ...      .:'          .    :@NNMNMMNNMMMMMNBX!'..                             '!!!!!!!!!^!!!!!^^
....... .......... .. .....           ...   .  ...              !$NNNMMMNNNMMNNNBC^...    .....                     .!!!!!!!!!^!!!!^^^
..........    ... ...  ....           ....    ' ..            ./BNNNNMNNNNNMNB$B@^'...':!:'...                      .!!^!^!!^^!!!!!!^^
.....................  ....           ....  . ....           .CBNNNNNNNNMNNB@0$0%^/XC00X!.                          .!!^!!^!!!!^!^^^^^
............... . ....  .'..         .....   ... ..         '@NNNNMNNNNNMN$C0@$$$$BNB@%'. .                          :^^^^^^!!^!^^^!^^
.................... .. .'..         .....   .  ....     ..'@BBNNNNNNNNN$0C0@$B$@@@@$0!.                             '^!^^^^!^^^^^^^^^
........................ '....    . ......        ...  ../@0BNBNNNBBNNB0C0$BB$$@0%%X%:.....     .                    .!^^^!^^^^^^^^^^^