/*

CUMSHOT TOKEN

MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMWWWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMWNXNNWWWWWWWWNKKXNWNNNXXNWMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMWWNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNXXKXNNNNNNNNNNNNNNNNNNNNNWWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMWWWWWWWWWWWWWNKxdxOKXXNNNNXXKKKK0OkdoooOXNNNWWWMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMWWWWWWWWWWNOdooooooooooooodddoooooooooddddoolloodddoddddddooodddddodx0NWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMWWWNK0KKXKKXKK0KKXK0O0XNWWWWWWWWWNNXKOdlc:ccoddddkXWMMMWWWWWMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMWX0kxxxxxxxxdl:;;;::::::cccccccccc:::cccccccccccccccccccccccccccccccc::cdONMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNKO0KXKKXNNXXNXXXXNNWWWWMMMMMMMMMMWWWWNXOdl:;,';codkKXXXK0Okk0NMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNOl;;;::cc:::ccccccccllllllllllllllllllllllloolllllllllooollllloooooll:;:oKWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMXkdkKNWMMMMMMMMMMMWWNXXXNWWWMMMMMMMMMMMWNKOdocccox0XNNXXK0OkkkOKNWMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMWXXXXKOOOOOko:;:cclllllllllllooooooooooooooooooooooooooooooooooooooooooooooooooolc:;lxOOOOOOO00KKKNWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMWX0O0XWMMMWMMMMMMWNXKKKKXKK0OO0KXNWMMMMMMMMWWNXK0000XNWWWWWNNWN0xd0WMMMMM
MMMMMMMMMMMMMMMMMMMMMMMWXKKKKKKKOdlllc;,,;;:::cloddddddddddddddddddddddddddddddddddddddddddddddddddddddddoooddddolc:;;;;;;;;;:ccllx0XXXXXNWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMWXKKKKXXX0kk0NWMMMWWNXXXXX0kookNWWWX0xdxkOO0KKKXXNWMMMMMMWWWWWMMMMWNNNNN0xx0WMMMMM
MMMMMMMMMMMMMMMMMMMMMNKkoc:cccccc::::;;;::cclodxxxxxxxxxxxkkkkkkkkkkkkkkkkkkkkkkkkOOOOOOOOOOOkkkkkkkkkxxxxxxxkkkxdollcccccccccccccloddolldOXWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMWNNNNWWWWWWWWWWWWWWWWWNKxoooddxO0KXWMMMWNXXK0OOkxoc:lONWWWWWNNNNN0xdddxkO0XNWMMMMMMMMMMMMMWNNNNKkx0WMMMMM
MMMMMMMMMMMMMMMMMMMWKxl::::ccccccccccccllloodxxkkkkkkkkkkkOOOOOO00000000000000000000000000000000OOOOOOkkkkkkkkOOkkxdooooooooooooooooooolc:coOXNNNWWWWWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMWWWWWN0xdxO0KKKKXXXXKK0000KXXKKKKKKXXNNWMWWNX0O0XNNNNX0dlokKNXOk0WMMMMMWNXXXXXX0OO0NWMMMMMMMMMMMMWWNXOdd0WMMMMM
MMMMMMMMMWWWWWWWWWKxc;;:clooooooooooooooooodxxkkkOOkkkkkOOOOOO000000000000000000000000000000000000OOOOOOkkkkOOOOkkxdoooooooooooooooddddol:;,:loooxxdx0XNWWWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMWX00KXXXK00KXXNNNNNNNNNNNXXNNNWWMMMMMMMMMWWX0xdx0NWMMMMMWN0kxkOkdoONMMMMMMMMMMMMMWNK00XWMMMMMMMMMMMMWXkxOKNWMMMMM
MMMMMMMNKOxxxxxxxxo:;:cloddxxxxxxxxxxxxxxxxxxkkOOOOOOOOOOOOO000000000000000000000000000000000000000OOOOOOOOOOOOOOkxxxxxxxxxxddxxddddddddolc:;;;;::::codxxxkKWMMMMMMMMMMMMMMMMMMMMMMMMMWX0KXNXKXXNNWWWMMMMMMMMMMMMMMMMMMMMMMMMMMMWWNXKKKK0OKWMMMMMMMMMWX00KKK0XWMMMMMMMMMMMMMMMWX0KWMMMMMMMMMMMWNOodKWMMMMMMM
MMMMMMNOo:;;::::::cccloddxxkkkkkkOOOOOOOOOOOOO00000000000000000000000000000000000000000000000000000000000000000000OOOOOOOOOOOkkOOkkkxxxxddolllllllllllllc:cONMMMMMMMMMMMMMMMMMMMMMMMNKOkOKXWWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMWNKKKXXKXNMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMN00XWMMMMMMMMMMWKxcoKMMMMMMMM
XXWMWKxc:::ccllllllloodxxkkkkOOO0000000000000000000000000KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK0000000000000000000000000000000OOkkkkkxxddooooooooooolc::ok0KNWMMMMMMMMMMMMMMMMMWN0xx0NWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMWXOkOXWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMXkdkXWMMMMMMMMMWXOddOKNMMMMMM
xok0kl:;:cloooooooooodxkkkkkOOO0000000000000000000000KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK0K0000000000000000000OOOkkkkkxddooooooooooool:;;,;cdOKKXNMMMMMMMMMMMMWX0kOKWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMWWWWWNKOk0NMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMXkokXWMMMMMMMMMMWNX0kx0NMMMMM
o:ccc:clooddxdxxxxxxxkkOOOOOOO00000000000000000000000KKKKKKKKKKKKKKKKKKKKKKKKK000KKKKKKK0000KKKKKKKKKKKKKKKKKKKKKK0000000000000000OOOOOOkkxxdxxxddddddddol::;,;;:::cxKXNNWMMMMMMMWXkOKWMMMMMMMMMMMMMMMMMMMMWWWWWWNNNNXXXXXNX0kkKWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMN0k0NMMMMMMMMMMMMMMWX0O0NWMMM
xlllloodxxkkkkkOOOOOOOOO000O0000000000KKKKKKKKKKKKKKKKKKKKKK0000KKKKKKKKKK0000000000000000000000KKKKKKKKKKKKKKKKKKK0000KKKKKKKKK0000000000OOOOOOOkkkkkkkxdlccc:::;;:cllld0WMMMMMWN0O0NMMMMMMMMMMMMMMMMMMMWWNNXK0Okxxx0NWWWWWNNNWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMN0O0NWMMMMMMMMMMMMMMMN0O0XWMM
kooooddxkkkOOOO000000000000000000000KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK000000000000000000KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK0KK0000000000OOOOOOkxxdolllllllllc:;ckXWWWMN0xxOXWMMMMMMMMMMMMMMMMWNXXNWWNNXXKK0KNWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMWNKKXNWMMMMMMMMMMMMMMWNKOkOXW
OdddddxkkkkOOOO0000000000000000000000KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK0000KKKKKKKKKKKK00000000OOOOOOkkxxddddddddddolccldxxONXkld0NMMMMMMMMMMMMMMMMWN0xkXWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMW0kOXWMMMMMMMMMMMMMMMWKkkXW
0kkkxkkkOOOOOOO00000000000000KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK00KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK00000KKKKKKKKKKKK000000000OO00OOOOkkkkkkkxxxxxddlc:;;cdxoldKWMMMMMMMMMMMMMMWN0kdxOXWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMWXOkk0KXNWMMMMMMMMMMMMWXKKK
K00OOOOOO000000000000KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK000KKKKKK00KKKKKKKK000000KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK0000000000000000OOOOOOkkkkkkxdolc::;;;cd0NMMMMMMMMMMMMMWN0xxOXWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMWX0O0K0KKNWWMMMMMMMMMWNK0
XK0000O0000000000000KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK00000KKKKKKK0KKKKKKKKKKKKKKK00000000KKKKKKKKKKKKKKKKKKKKKKK000KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK00000OOOOOOkkkkkxdollc:;;:d0NWMMMMMMMMMMMMWKO0XWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMWWWWKOk0XNNNWWMMMMWNX0O
X0K000O0000000000000KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK00KKKKKKKK000KKKKKKKKKKKKKKKK0000KKKKKKKKKKKKKKKKKKKKKK000000KKKKKKKKKKKKKKKKKKKKKKKKKK0KKKKKK00000000O0OOOOOOkkkxdddolc:coOXWMMMMMMMMMMMWXOx0WMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMWNNWNK0O0KXXXXK0kdo
XK0000000000000KKKK0KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK000KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK0000000KKKKKK0000KKKKKKKKKKKKKK00000KK0000000000000000OOOOOkkkxxdollokKNWMMMMMMMMMMN0xdONMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMWNNNKkoodOXXKK
X0000000000000KKKKKK00KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK0000000KKKKKK0000KKKKKKKKKKKKKKKKKKKKKKKKKKK0000KKKKK0000000OOOOkxdddOKNWMMMMMMMMMN0kOKNWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMWX0OKNWMMM
X00000000000000KKKK0000KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK00K0KKKKKKKKK00KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK000000OkxkOKNWMMMMMMMMMW0dd0WMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
XKK000000KKK00KKKKKKKKKKKKKK00KKKKKK0000000000OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO000000000KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK00000000OOOOOOOOOOOOOOOOOOOOOOOOOOOOOO00000000000000000KXNWMMMMMMMMMWXOxkXWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
XKKK00000KKKKKKKKKKKKKKKKKKKKKKKKKKK00OOkkkkkkxxxxddddooooooooooooooooooooodxkkOOOOO0000KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK000OOOOOOkxddooooooooooooooooooooooddddxxxxkkkOOO000000KKXNWWMMMMMMMMMMNKOKNWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
XKKKK000KKKKKKKKKKKKKKKKKKKKKKKKKKKK0OkkkkxxxddoooolllcccccccccccccccccccccldxxkkkOOO000KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK00OOkkkkkxolcc::ccccccccc::::::::ccllllooddxxxkkOO00KKXXNWWMMMMMMMMMMMWKOOXMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
XKKKK00KKKKKKKKKKK0000000000000000000OkkxxxxxddooooolllccccccccccccccccccclodxkkOOO00000KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK00OOOkkkkxdllc:cccccccccccccccccccllooooodddxxxxkO0KKXNWWWMMMMMMMMMMMWXOdxKNNNNNWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
XKKK000KKKKKKK000000OOOOOOOOOkkkkkkkkxxxxxxddddddddddooddddooooooooooooooodxxkOOOOO0000KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK000OOOOOOkddoooodooooooddddddddddddddddddddddddxkOKNWWWMMMMMMMMMMMMWN0xlllollloONMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
XKKK000KKKKKK00OOOOOkkxxxxdddddooooooooddddddddxxxxxxkkkkkkkkkkkkkkkkkkkkkkOO00000000KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK00000000OOkkkkkkkkkkkkkkkkkkkkkkkkOOkkxxxdddddxk0XWWMMMMMMMMMMMMMWNX0xdlc::;,;dKWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
XKKKK0KKKKKKK00OOkkkkxdooooollcccccccclloooodddxxxkkOO00000000000000000000000KKKK000KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK0000000000000000000000000KKKKKKXXNXXKK0OOkkO0XNWWMMMMMMMMMMMMWWNXK0kxdolcc::coOXWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
NKKKK0000KKK000Okkkkxxdoolllllcc::ccccllloodddxxkkkkO00KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK0KKKKKKKKKKKKKKK0000KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKXXNNNWWWWWWWWWNNXNNWWWWWWMMMMMMMMWWWNXXK0OOkxdoolc:;,c0WMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
NXKK00OOkkkkkxxxxxxxdddddddddooooodddddddxxxkkkOOOOOO000KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK00000KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKXXNWWWWWMMMMMMMMWWMMMMMMMWWMMWWWWWNXXKKKK00Okkxxddolc:cx0KKKXNWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
NXKK0OxdoolllllllooooddxxxxxkkkOOOOO00000000000000000000KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK00KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKXNWWWMMMMMMMMMMMMMMMMMMMMWWWWWWNNXKKKKKKKK00OOkkkkxxollccc::lkXWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
NXXK0kxolc:::::cclllodxxkkkkkO00KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKXNWWWMMMMMMMMMMMMMMMMMMMMWWWWNNXKKKKKKKKKKK00OOOOOkkxdolc:;,;lOXNNNNWWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
NXXK0OkdollcllloooooddxkkkkkkO00KKKKKKK00KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKXNWWWMMMMMMMMMMMMMMMMMMMWWWNNXKK000000KKKKK00OOOOOkkxxdoolc:;;:lllldkXWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
NXXK00OkkxxdxxxkkkkkkkkkkOOOO0O00000000000000000000000KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKXNWWWMMMMMMMMMMMMMMMMWWWWWNXK0000000000KKKK0000OOOOOkkxxddolc::;;;;;l0WMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
NXKK000000OOOO000000OOOOOOO0000000000000000000000000000KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK00KKKKKKKKKKKKKXNWWWMMMMMMMMMMMMMMMWWWWWNNX0000000000KKKKK00000000OOOkkkkxxdollcc:;lOWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
NXKK0000KK000000KKKKK00000000000000000000000000000000000KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK00000KKKKKKKKKKXNWWWWMMMMMMMMMMMMMMMWWNNNNXK00O0000000KKKKKK00KKK0000OOkkkkxdoooolc:lkXWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
NXKK0000KK0000000000000000OOOOOOO000000OOOOO000000000000000KKKKKKKKKKKKKKKK0KKKKKKKKKKKKKKKKKKKKK000KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK00KKKKKKKKKKXNWWMMMMMMMMMMMMMMMWWWWNNNXKK0000OOO000000KKKK000000000OOkkOkxddooool::okXWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
NXKK0000000000000000000OOOOOOOOOOOOOOOOOOOOOOOO0000000000000000KKKKKKKKKKK000KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKXNWWMMMMMMMMMMMMWWNXXXXXXK00OOOOOOOOOOO00000000000000000OOOOOkxdoooll:;cd0WMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
NXKK000000000000000OOOOOOkkkkkkkOOOOOOkkkkkkOOO000000000000000000KKKKKKKKKKKK0KKKKKKKKKKKKKKKKKKKKKKKK0KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK00KKXNWWMMMMMMMMMMMWNXK0OO0000OOOOkkkkkkOOOOO0000000000000000000Okxdooolc:;:okXWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
XKKK000000000000000OOOOOkkkkkkkkkkkkkkkkkkkkOOO00000000000000000KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK000KKKKKK0KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK0KKXNWWMMMMMMMMMMWNX0OkkkkOOOOOOkkkkkkkkOOOO0000000000000000000Okxdoooll:;,,;ckXWWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
XKKK000000OOOOOO0OOOOOOOkkkkkkkkkkkkkkkkkkkkOOOOOOOO00000000000KKKKKKKKKKKKKKKKKKKKKKKKK000KKKKKKKKKKKKK00KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKXNNWWMMMMMMMMWNXKOOkkkkkkkkkOOkkkkkkkOOOOOOOO0000000000000000Okxdddool:;,,,:oxOKNWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
XKK000OOOOOOOOOOOOOOOOOkkkkkkkkkkkkkkkkkkkkkkOOOOOOOOOOO0000000KKKKKKKKKKKKKKKKK0000KKK000KKKKKKKKKKKKKK00KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKXNNWWMMMMMMMWWNK0OOkkkkkkkkkkkkkkkkkkkOOOOOOOOO000000000000000Okxxxxddollccc:::oONMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
XKK00OOOOkkkkkkkkkkkkOkkkkkkkkOOkkkkkkkkkkkkkkkkOOOOOOOO0000000KKKKKKKKKKKKKKKKKK000000KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK000KKKKKK000KKKKKKKKKKKKKKKXNWWWMMMMMWWXK0OOOOOkkkkkkkkkkkkkkkkkkkkkkkkkOOOOO00000000000OOkkkkxxdoooool:,:xNMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
XK000OOOOOkkkkkkkkkkkkkkkkkkkkOOOOkkOkkkkkkkkkkkkOOOOOO00000000KKKKKKKKKKKKKKKKKKKKKKKKKKKK000000KK00000000000000000000000KKK000000KKKKKKKKKKKKKKKXNWWWMMMMWWNK0OOOOOOOOOOkkkkkkkkkkkkkkkkkkkkkOOOOO00000000000OOkkkkkxddooool:;:xNMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
X000OOOOOOOkkkkkkkkkkkkkkkkkkkOOOOOOOOOOOOOOOOOOOOOOO0000000000KKKKKKKKKKKKKKKKKKKKKKKKKKK000000000OOOOOOOOOOOOOOOOOOOOOOOOOOOOO0000000KKKKKKKKKKKKXNWWWMMMWNXK0OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO000000000000OOOOOkkxdooool:,;xNMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
K0OOOkkOOOOkkOOOkkkkkkkkkkkkkkOOOOO0OOOOOOOOOOOOOOOO000000000KKKKKKKKKKKKKKKKKKKKKKKKKKK0000OOOOOOkxxdddddddddddddxxxdxxxxxkkkkkkO000KKKKKKKK0KKKKKKXNWWMMWWNXK0000OOOOOOOOOOOOOOOOOOOOOOOOO00000OO00000000KK0000OOOOOkxddoool:,;xNMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
KOOOkkkkkkkkkkkkkkkkkkkkkkkkkOOOO0000O00000000000000000KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK0000OOOOkkxddoooooooooooooooooooodddxxxxkkO00KKKKKKKKKKKKKKKXNNWMMWWNXK000000000000000000000000000000000000000000KKKKK000000OOkxdooool:,:xNMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
KOOOkkkkkkkkkkkkkkkkkkkkkkkkkOOO00000000000000000000000KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK000OOkkkkkxdooooollllloolllllooooooddxxxkkO000KKKKKKKKKKKKKKXNNWWMWWNXK000000000000000000000000000000000000000000KKKKK000000OOkxdddool:;:xXMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
X00OOOkOOOOOOOOOOOOOOOOOOOOOOOO000000000000000000000000KKKKKKKKKKKKKKKKKKKKKKKKKK00000000OOkxxxxdddolllllcccllccccccllllloooddddxxkkOOOO000KKKKKKKKKXNNWMMWWNXK000000000000000000000000000000000000000000KKKKK000000OOkkxxxxxdl::lxkkk0XWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
XK00OOO000OOOOOO00OOOOOOOO00000000000KKK000KKKKKK00000KKKKKKKKKKKKKKKKKKKKKKKKKK000OOOOOkkkxdooooolcc::::::::::::::::cccccllooooddxxxkkkkOO00000KKKXNWWWMMWWNXKK000KKKK000000000KKKKKKKKKKKKK0000000KKKKKKKK00000000OOOkkkkkkxdlc::;;;cd0WMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
XK000OO00000000000000000000000000KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK000OOkkkkkxdooooollc:::::::::::::::::::::cclllooooddxxxxkkO000KKKKXNWWWWMMWWNXKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK0000000000OOOkkkkkkxdlcc::;,;oOXWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
XK000OO0000000000000000000000000000KKKKKKKKKKKKKK00KKKKKKKKKKKKKKKKKKKKKKKKKKKKK000OOkkkkxxdolllllcc:::::::::::::::::::::ccclllloodddxxxkkO00KKKKXXNWWWMMMWWNXKKKKKKKKKKKKKKKKK00K0KKKKKKKKKKKKKKKKKKKKKKKK000000000000OOOkkkkxxdoollc:;,:o0NWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
XKKK00000000000000000000000000000000KKKKKKKKKKKKK00KKKKKKKKKKKKKKKKKKKKKKKKKKKKK00OOkxxxxddollccccc:::::::::::::::::::::::cccccclloodddxxkO00KKKKXNWWWWMMMWWNXKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK000000000OOOOOOOkkxxxxdolc;;;cd0NWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
XKKK0000000000000000000000000000KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK00Okxdooooolcc::::::::::::::::::::::::::::::cc::ccloooodxkO000KKKXNWWWWWMWWWNXKK00KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK000000OOOO000OOOOOkxdolc:;;co0NMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
XKKK000000000000000KKK000000KKKKKKKKKKK0KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK000Okdoooollcc:::::::::::::::::::::::::::::::::::ccllooodxkO0000KKXNWWWWMMWWNNXKK00KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK000000000000000Okxdollc:;:xXMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
XKKK000KKKKK000KKKKKKKKKKKKKKKKKKKKKK0000KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK0000Okxdooollcc::::::::::::::::::::::::::::::::::::cloooodxkO0000KXNWWMMMMMWWNXXK000KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK00000000000000Okkxddool::lxkkkkOXWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
XKKK000KKKKKKKKKKKKKKKKKKKKKKKKKKKKKK0000KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK000Okxdoolllcc:::::::::::::::::::::::::::::::::::clooddddxkO000KKXNWMMMMMMWWNXKK0000KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK000000000000000OOkkkxxxolccccc:cd0NWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
XKKKK00KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK00KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK000Okdoollllc::;;:::::::::::::::::::::::::::::;;:cloddxxxkOO00KKKXNWMWWWMWWNXKK00K00KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK000000000000KKKK000OOOOOkxdoollc::lkNMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
XKKKK00KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK00Okxdoolllcc::::::::::::::::::::::::::::::::;;:clodxxxxkO000KKKXNWWWWWWWNNXKK00000KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK0000000000KKKKK0000000Okxddoool:;;lOXNNWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
XKKK0000KKK0KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK00OkxxdddddollllllllllllllllllllllllllllllllllllodxxkkkkkO00KKKXXNWWWWWWWNXKK000000KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK000000000KKKK00000000OOkxddddol:;;clloOXWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
XKKK0000KK00K0KKKKKKKKKKKKKKKKKKKKKKKKK00KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK0000OOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkOOOOOO00000KKXNWWWWWWWNXKK00000KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK0000000KKKKK0000000000Okkkkkxdolcccc:coONMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
XKKK0000KKKKKK0KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK00000000000000000000000000000000000000000000000000000KKKKKKKXNWWWWWWWNXK00000KKKK000KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK00000KKKKKK000000KK0000O000Okdoolllc;;oKWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
XKKKK000KKKKKKKKKKKKKKK00KKKKKKKKK0KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK0000KKKKKKKK000KKKKKKKKKKKKKKKKKKK000000KKKKKKKKKKKXNWWWWWNNXKK0KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK0000000KK00000000Okxdooolc:;:dOXWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
XKKKK000KKKKKKKKKKKK00K00KKKKKKKKK0KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK00KKKKKKKKK0000000KKKKKKKKKKXNWWMWNNXKKK0KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK0000000000KKK00000000Okkxdddooc:;,ckXMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
NKKKK00KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKXNNWMMWNXXKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK000000000000KKK000KK000OOkkkkxxdlc::lkKNWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
XKKKK00KKKKKKKKK0KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKXNWWWWNXXKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK000000000000KKKKKKKK00000000OOkxdlc:::lx0NMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
NXKKK00KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK0KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKXNWWWWNXKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK0000O000000KKKKKKKKKKK00000000OOkdolc:;;:dKWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
NXKKK00KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK000KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKXNWWWWNXKKK0KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK0000OOOO00000000000KKKKK0000000Okxddolc:;,l0WMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
NXKKK00KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKXNNWWWNXXKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK000OOOOOOOOO00000000KKKKKK000000Okxdolc:;;lKWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
NXXKK00KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKXNWWWWNXKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK000OOkkkkkOOOO000000KKKKKKKKK000Okxdollc;;oKWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
NXXKK00KKKKKKK0KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKXNWWWNXKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK0000KKK000OOkkkkOOOO0000000KKKKKKKKKK00Okxdddolc:lx00KNWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
NXKKK00KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK00KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKXNWWWNXKK0KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK00000000OOOkkkOOO000000000KKKKKKKKKK000Okxxxxdoc::::lONMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
NXKKK00KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK0KK00KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKXNWWNNXKK0KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK0000000OOkkkkOOOO00000000KKKKKKKKKKK000OOOOOkxol:;;:xXMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
NXKKK00KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK00KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKXNNWWNXXKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK00000000OOkkkkOOOO00000000KKKKKKKKKKKK0000000Okxolc::o0NWMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
NXKKK00KKKKKKKKKKKK000KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK000KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKXNWWWNXKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK000000000OOOkkkOOOO00000000000KKKKKKKKK00000000OxdolccclkXWMMMMMMMMMMMMMMMMMMMMMMMMMMMM
NXKKK00KKKKKKKKKKKKK00KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK000KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKXNWWNNXKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK00KKKK00000000000OOkkkkkOOOOOOOOOO0000000KKKKKK00000000Oxdolcc:;oKWMMMMMMMMMMMMMMMMMMMMMMMMMMMM
XKKKK00KKKKKKK0KKKKK00KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK0000KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK0KKKKKKKKKKKKKKKKXNWWNXKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK0KK0000000000OOOkkkkkkkkOOOOOOO0000000000KKKKKKKKKK0Oxdollc:;l0WMMMMMMMMMMMMMMMMMMMMMMMMMMMM
XKKKK00KKKKKK00KKKKK0KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK0KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKXNNWWNXKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK00K000000000OOOOkkkkkkkkkkkkkOO00000000000KKKKKKKKK0Oxdollc:;cd0NMMMMMMMMMMMMMMMMMMMMMMMMMMM
XKKKK00KKKKKK00KKKKKKKKKKKKKKKKKKK00KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKXNWWWNXKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK0000000000000OOOOkkkkkkkkkkkkkOOO0000000000KKKKKKKKK0Okxddool:;;ckKNWMMMMMMMMMMMMMMMMMMMMMMMM
XKKKK00KKKKKK00KKKKKKKKKKKKKK00KK000KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKXNNWNXXKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK00000000000000OOOOkkkkkkkkxxxkkOO000000000KKKKKKKKKK00OOkkxxdlc:::lONMMMMMMMMMMMMMMMMMMMMMMMM
XKKKK00KKKKKKK0KKKKKKKKKKKKKKKKKKK0KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK0KKKXNNNNXKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK000000000000000OOOOkkkkkkxxxxxxkkOO00000000KKKKKKKKKKK0000OOOkxdol:cxXMMMMMMMMMMMMMMMMMMMMMMMM
XKKKK00KKKKKKK0KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK0KKXXNNNXXKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK000000K000000000000000OOOOOkkkkkxxxxxxxkkOOO0000000KKKKKKKKKKK000000OOkxdollkNMMMMMMMMMMMMMMMMMMMMMMMM
XKKKK000KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK0KKXXNNNXKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK0000KKK00000000OOOOOOOOOkkkkkxxxxxxxxxkkkOOO00000000000KKKKKK0000000OkxxdllkXMMMMMMMMMMMMMMMMMMMMMMMM
XKKKK000KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKXNNNXKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK000KKKKKKKKKKKK0000000OOOOOOOOkkkkkxxxxxxxxxxxxkkkOOOOO000000000KKKKK0000000Okxxdlld0NMMMMMMMMMMMMMMMMMMMMMMM
XKKKK000KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK0KKKKKKKKKKKKKKKKKKKKKKXNNNXKKK0KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK000KKKKKKKKKKKK0000000OOOOkkkkkkxxxxxxxxxxxxxxxkkkkOOOOO000000000KKKK00KKK00Okxxdlclx0NMMMMMMMMMMMMMMMMMMMMMM
XKKK0000KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKXXNNXXKK00KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK00000000OOOkkkkkkxxxxxxxxxxxxxxxxkkkkkkOOOO00000000KKKKKKKKK0Okxxdl::lkXMMMMMMMMMMMMMMMMMMMMMM
XKKK0000KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKXXNXXKK0KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK0000000OOOOkkkkkxxddddddxxxxxxxxxxkkkkkkkOOOO0000000000KKKKK0Okxxdlc:cxXWMMMMMMMMMMMMMMMMMMMMM
XKK00000KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKXXXXKK00KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK0000KKKK0000000OOOkkkkkkxddoooodddxxxxxxxxxxxxxxkkkOOOOOO00000000KKK0Okxxdlc;:dKWMMMMMMMMMMMMMMMMMMMMM
XKK000000000KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKXXXXK00KKKKKKKKKKKKKKKKKKKKKKKKKKKK0KKKKKKKK000K0KKKKKKKKKKK0000000K00000000OOOkkkkkkxdoolloodddxxxxxxxxxxxxxkkkkkOOOOO0000000KKK0Okxxdlccd0NMMMMMMMMMMMMMMMMMMMMMM
XK000000000000KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKXXXXXK00KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK00KK00000KKKKKKK000KK0000000000000000OOOkkkkkkxdolllooddddddxxxxxxxxxxxkkkkkkOOOOO00000KKK0Okxddlcd0NMMMMMMMMMMMMMMMMMMMMMMM
XK0000000000000KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKXXXXKK00KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK000000000KKK00000KKKKKK00000000000000OOOOkkOkkxdoollooodddddddxxxxxxxxxxxkkkkkOOOOOOO00KK00kxxddlloONWMMMMMMMMMMMMMMMMMMMMMM
XK00000000000000KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKXXXXKK0KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK00000KKKKKK00000000000000OOOOOOkkkxdoollooooooooodddxxxxxxxxxxxxkkkkOOOOOO0000OkxxddlcokXWMMMMMMMMMMMMMMMMMMMMMM
XKK0000000000000KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKXXXXKK0KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK0KK000K00KKKKKK0000000000000000OOOOkkkkxdoollllooooooooddxxxxxxxxxxxxxxkkkkkkOOO000OkxxddlloONWMMMMMMMMMMMMMMMMMMMMMM
X0000OOO00000000000000KKKKKKKKK000000KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKXXXXXK00KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK0K000KKKKKKKKK00000000000000OOOOOOOkkkkxdoollllooolooooddxxxxxxxxxxxxxxkkkkkkkOO000OkxxdollxXWMMMMMMMMMMMMMMMMMMMMMMM
K00OOOOOO000000000000000000KKKKKKK00KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKXXXXXKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK0K000KKKK0000000000000000OOOOOOOOOOkkkxxdooloooooolooooddxxxxxxxxxxxxxkkkkkkkkOO000OkxxdollkNMMMMMMMMMMMMMMMMMMMMMMMM
K0OOOOOOO000000000000000000KKKKKKK00KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK00KKKKXXNNXXKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK00KKKKKKKKKKKKKKKKKK0000000000000000OOOOOOOOOOOkkkkkxdooooooooooooooddxxxxxxxxxxxxxkkkkkkkkOO000OOxxdollkNMMMMMMMMMMMMMMMMMMMMMMMM
KOOOkkOOO000000000000000000KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKXNNNXXKK0KKKKKKKKKKKKKKKKK00KKKKKKKK00KK00KKKKKKKKKKKKKK000000000000000OOOOkkkkkOkOOkkkkxdoollooooooooooddxxxxxxxxxxxxxkkkkkkkOOO000OkxddlclkNMMMMMMMMMMMMMMMMMMMMMMMM
KOOkkkkOOO00000000000000000KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK000KKKXXNNNXKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK00KKKKKKKKKKKKKKKKK0000000000000000OOkkkkkkkkkkkkkkkxdollloooooollooddxxxxxxxxxxxxxkkkkkkkkOOOOOkdoccclx0NMMMMMMMMMMMMMMMMMMMMMMMM
KOOOkkkkOOOOOOO0000000000000000K00KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK00KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK000KKKXNNNNXKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK000000000000000OOOOOOOkkkxxxxkkkkkkkkxxdolllooooooooooddxxxxxxxxxxxxxkkkkkkkkkxxxdoc;;:o0NWMMMMMMMMMMMMMMMMMMMMMMMMM
KOOOkkkkkOOOkOOO00000000000000000000KKKKKKK00KKK000KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKXNNNNXXKK00KKKKKKK000KKKKKKKKKKKKKKKK0KKKKKKKKKKKK00000000000000OOOOOOOOkkxxxxxxxxkkkkkkkxdolllloooooooooddxxxxxxxxxxxxxkkkkOkkxddoooc;,:xKWMMMMMMMMMMMMMMMMMMMMMMMMMMM
KOOOkkkkkOOkkOOOO00000000000000000000KKKKKKKKKKK000KKKKKKKKKKKKKKKKKKKKK0KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKXNNWWNXXKKK0KKKKKKKK00KKKKKKKKKKKKKK0000KKKKK00KKK000000000000000OOOOOOOkkkxxxxxxxxkkkkkkkxdoollloooooooooddxxxxxxxxxxxxxkkkkOOkxdoollc;;l0WMMMMMMMMMMMMMMMMMMMMMMMMMMMM
KOOOkkkkkOOkkkOOOO00000000000000000000000000KKKKKKKKKKKKKKKKKKKKKK00000000KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKXNNWNNXXKKKKKKKKKKKKKKKK0000KKKKKKK00000KK00000000000000000OOOOOOOOOOkkkkkxxxxxxxxxxkkkkkkxdoolloooooolloodddxxxxxxxxxkkkkkkkOOkxdoollcldONMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
KOOOkkkkOOOkkkOOOOOOOO000000000000000000000000KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKXNNWWNNXXKKKKKKKK0KKKKKKKKKKKKKKKKK00000000000000000000000OOOOOOOOOkkkkxxxxxxxxxxxxxkkkkkkkxdoollooooolllooddxxxxxxxxkkkkkkkkkOOkkxdolccdKWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
KOOOOkkkkOkkkkkkkOOOOOOO00000000000000000000000KKKKKKKKKKKKKKKKKKK00KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKXNWWWNNXKKKKKKKKKKKKKKKKKKKKKKKKKKK000000000000000000000000OOOOOOkkkkxxxxxxxxxxxxxxkkkkkkkkxdoolloooollloooddxxxxxxxkkkkkkkkkkkOkkdollclkNMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
KOOOkkkkkkkkkkkkkkkkkOOOO00000000000000000000000000KKKKKKKKKKKKKKKKKKKKKKKKKKKKK0KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK00KKKKXXNWWWWNXKKKKKKKKKKKKKKKKKKKKKKKKKKK0000000000OO00000000000OOOOOOkkkkxxxxxxxxxxxxxxxxkkkkkkxxdoollooooooooodddxxxxxxkkkkkOOOkkkkkkxolc::cxNMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
KOkkkkkkkkkkkkkkkkkkOOOOOOOOOOOOOOOOO000000000000000000000000000KKKKKKKKKKKKKKK0000KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK000KKXXNWWWWWNXKKKKKKKKKKKKKKKKKK0000000000000000000OOOOOOOOOOOOOOOOkkkkkkkxxxxxxxxxxxxxxxxxxxxxxddoolllooooooodddxxxxxxxxxxxxxxxkkxxxxdolc::coONMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
0kkkxxxkkkkkkkkkkkkkkOOOOOOOOOOOOOOOOOO000000000000000000000000000KKKKKKKKKKKKKKKKKKKKKKKKKKK000KKKKKKKKKKKKKKKKKKKKKKKKKKKKK0KKKXNWWMMWWNXKKKKKKKKKKKKK000000000000000000000000OOOOOOOOOOOOOOkkkxxxxxxxxxxxxxxxxxxxkxxxdddoooooolloooodddddxxxkkkkkxxddddddddddooolc::lx0XWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
OxxxxxxkkkkkkkkkkkkkkkkOOOOkkkkkkkkkOOOOO0000000000000000000000000KKKK00KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKXNWWWMMWWNXKKKKKKKKKKKKK0000000000000000000000OOOOOkkkkkkkOOOkkkxxxddxxxxxxxxxxxkkkkkkxddooolloolllooodddxxxxxkkkkkkkxdooooollllllc:;;lONMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
0kxxxxxxkkkkkkkkkkkkkkkkkkOOOOkkkOOOOOOO0OOOO00000000000000000KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK0KKXNWWWMMWWNXXKKKKKKKKKKKK000000000000000000000OOOOOOkkkkkkkkkkkkkxxxxxxxxxxxxxxxkkkkkkkxddoollloollloooddddxxxxxkkkkkkxdollllcccc::::coONMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
0kkxxxxxxxkkkkkkkkkkkkkkkkkkOkkkkkkkOOOOOOOOOOOOOOOOOOO000000000000000000000000000000000000000KKKKKK00000KKKKK0000000000000000KXNNWWMMMMWNXXK000000000000000OOOOOOOOOOOOOOOOOOOOOkkkkkkkkkkkkkxxxxxxxxxxxxxxxxxkkkkkkxxddoollloooooooooodddddddxxxxxdolcc::::;;;;:ok0XWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
OdxxxxxxxxxxxxxxxxxxxxxkkkkkkkkkkkkkkkOOkkkkkkOOOOOOOOOOOOOOO0000000000000000000000000000000000KKK0000000000000000000000000000XNNWWMMMMMWNNX0000000000000OOOOOOOOOOOkkkkkkkkkkkkkxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxkkkkkkxxddoolllooooooooooooooooodddddoc:;;,;coddddkXWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
kddxxxxxxxxxxxxxxxxxxkkkkkkkOOkkkkkkOOOOOOOkkkkkkOOOOOOOOO000000000000000000000000000000000000KKKKKKKKKKKKKKKKK0000000000000KKXNWWWMMMMMWWNXK0000000000000000000OOOOOkkkkkOkkkkkkxxxxxxxxdxxxxxxxxxxxxxxxxxxxxkkkkkkkkxxdoooooooooooooooododdddddddolc;;,,:d0XNNNWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM

*/
// SPDX-License-Identifier: MIT                                                                               
                                                    
pragma solidity = 0.8.17;

abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

interface IUniswapV2Pair {
    function factory() external view returns (address);
}

interface IUniswapV2Factory {
    function createPair(address tokenA, address tokenB) external returns (address pair);
}

interface IERC20 {
    function totalSupply() external view returns (uint256);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address recipient, uint256 amount) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

interface IERC20Metadata is IERC20 {
    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
    function decimals() external view returns (uint8);
}


contract ERC20 is Context, IERC20, IERC20Metadata {
    using SafeMath for uint256;
    mapping(address => uint256) private _balances;
    mapping(address => mapping(address => uint256)) private _allowances;
    uint256 private _totalSupply;
    string private _name;
    string private _symbol;
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }
    function name() public view virtual override returns (string memory) {return _name;}
    function symbol() public view virtual override returns (string memory) {return _symbol;}
    function decimals() public view virtual override returns (uint8) {return 18;}
    function totalSupply() public view virtual override returns (uint256) {return _totalSupply;}
    function balanceOf(address account) public view virtual override returns (uint256) {return _balances[account];}
    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }
    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
        return true;
    }
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));
        return true;
    }
    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
        return true;
    }
    function _transfer(
        address sender,
        address recipient,
        uint256 amount
    ) internal virtual {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");
        _beforeTokenTransfer(sender, recipient, amount);
        _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance");
        _balances[recipient] = _balances[recipient].add(amount);
        emit Transfer(sender, recipient, amount);
    }
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");
        _beforeTokenTransfer(address(0), account, amount);
        _totalSupply = _totalSupply.add(amount);
        _balances[account] = _balances[account].add(amount);
        emit Transfer(address(0), account, amount);
    }
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");
        _beforeTokenTransfer(account, address(0), amount);
        _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance");
        _totalSupply = _totalSupply.sub(amount);
        emit Transfer(account, address(0), amount);
    }
    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);
    }
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}

library SafeMath {
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");
        return c;
    }
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;
        return c;
    }
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }
        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");
        return c;
    }
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        return c;
    }
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

contract Ownable is Context {
    address private _owner;
    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
    constructor () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }
    function owner() public view returns (address) {return _owner;}
    modifier onlyOwner() {
        require(_owner == _msgSender(), "Ownable: caller is not the owner");
        _;
    }
    function renounceOwnership() public virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}



library SafeMathInt {
    int256 private constant MIN_INT256 = int256(1) << 255;
    int256 private constant MAX_INT256 = ~(int256(1) << 255);
    function mul(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a * b;
        require(c != MIN_INT256 || (a & MIN_INT256) != (b & MIN_INT256));
        require((b == 0) || (c / b == a));
        return c;
    }
    function div(int256 a, int256 b) internal pure returns (int256) {
        require(b != -1 || a != MIN_INT256);
        return a / b;
    }
    function sub(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a - b;
        require((b >= 0 && c <= a) || (b < 0 && c > a));
        return c;
    }
    function add(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a + b;
        require((b >= 0 && c >= a) || (b < 0 && c < a));
        return c;
    }
    function abs(int256 a) internal pure returns (int256) {
        require(a != MIN_INT256);
        return a < 0 ? -a : a;
    }
    function toUint256Safe(int256 a) internal pure returns (uint256) {
        require(a >= 0);
        return uint256(a);
    }
}

library SafeMathUint {
  function toInt256Safe(uint256 a) internal pure returns (int256) {
    int256 b = int256(a);
    require(b >= 0);
    return b;
  }
}


interface IUniswapV2Router01 {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);

    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
}

interface IUniswapV2Router02 is IUniswapV2Router01 {
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
}

contract CUMSHOT is ERC20, Ownable {

    IUniswapV2Router02 public immutable uniswapV2Router;
    address public immutable uniswapV2Pair;
    address public constant deadAddress = address(0xdead);

    bool private swapping;

    address public marketingWallet;
    address public devWallet;
    
    uint256 public maxTransactionAmount;
    uint256 public swapTokensAtAmount;
    uint256 public maxWallet;

    bool public limitsInEffect = true;
    bool public tradingActive = false;
    bool public swapEnabled = false;
    
     // Anti-bot and anti-whale mappings and variables
    mapping(address => uint256) private _holderLastTransferTimestamp; // to hold last Transfers temporarily during launch
    mapping (address => bool) public isBlacklisted;
    bool public transferDelayEnabled = true;

    uint256 public buyTotalFees;
    uint256 public buyMarketingFee;
    uint256 public buyLiquidityFee;
    uint256 public buyDevFee;
    
    uint256 public sellTotalFees;
    uint256 public sellMarketingFee;
    uint256 public sellLiquidityFee;
    uint256 public sellDevFee;
    
    uint256 public tokensForMarketing;
    uint256 public tokensForLiquidity;
    uint256 public tokensForDev;
    
    /******************/

    // exlcude from fees and max transaction amount
    mapping (address => bool) private _isExcludedFromFees;
    mapping (address => bool) public _isExcludedMaxTransactionAmount;

    // store addresses that a automatic market maker pairs. Any transfer *to* these addresses
    // could be subject to a maximum transfer amount
    mapping (address => bool) public automatedMarketMakerPairs;

    event UpdateUniswapV2Router(address indexed newAddress, address indexed oldAddress);
    event ExcludeFromFees(address indexed account, bool isExcluded);
    event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value);
    event marketingWalletUpdated(address indexed newWallet, address indexed oldWallet);
    event devWalletUpdated(address indexed newWallet, address indexed oldWallet);
    event SwapAndLiquify(
        uint256 tokensSwapped,
        uint256 ethReceived,
        uint256 tokensIntoLiquidity
    );

    constructor() ERC20("CUMSHOT", "CSHOT") {
        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
        
        excludeFromMaxTransaction(address(_uniswapV2Router), true);
        uniswapV2Router = _uniswapV2Router;
        
        uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory()).createPair(address(this), _uniswapV2Router.WETH());
        excludeFromMaxTransaction(address(uniswapV2Pair), true);
        _setAutomatedMarketMakerPair(address(uniswapV2Pair), true);
        
        uint256 _buyMarketingFee = 20;
        uint256 _buyLiquidityFee = 5;
        uint256 _buyDevFee = 0;

        uint256 _sellMarketingFee = 20;
        uint256 _sellLiquidityFee = 5;
        uint256 _sellDevFee = 0;
        
        uint256 totalSupply = 69000000000 * 1e18; 
        
        maxTransactionAmount = totalSupply * 5 / 1000; // 0.5% maxTransactionAmountTxn
        maxWallet = totalSupply * 5 / 1000; // 0.5% maxWallet
        swapTokensAtAmount = totalSupply * 5 / 10000; // 0.05% swap wallet

        buyMarketingFee = _buyMarketingFee;
        buyLiquidityFee = _buyLiquidityFee;
        buyDevFee = _buyDevFee;
        buyTotalFees = buyMarketingFee + buyLiquidityFee + buyDevFee;
        
        sellMarketingFee = _sellMarketingFee;
        sellLiquidityFee = _sellLiquidityFee;
        sellDevFee = _sellDevFee;
        sellTotalFees = sellMarketingFee + sellLiquidityFee + sellDevFee;
        
        marketingWallet = address(owner());
        devWallet = address(owner()); 

        // exclude from paying fees or having max transaction amount
        excludeFromFees(owner(), true);
        excludeFromFees(address(this), true);
        excludeFromFees(address(0xdead), true);
        
        excludeFromMaxTransaction(owner(), true);
        excludeFromMaxTransaction(address(this), true);
        excludeFromMaxTransaction(address(0xdead), true);
        
        /*
            _mint is an internal function in ERC20.sol that is only called here,
            and CANNOT be called ever again
        */
        _mint(msg.sender, totalSupply);
    }

    receive() external payable {

  	}

    // once enabled, can never be turned off
    function enableTrading() external onlyOwner {
        tradingActive = true;
        swapEnabled = true;
    }
    
    // remove limits after token is stable
    function removeLimits() external onlyOwner returns (bool){
        limitsInEffect = false;
        return true;
    }
    
    // disable Transfer delay - cannot be reenabled
    function disableTransferDelay() external onlyOwner returns (bool){
        transferDelayEnabled = false;
        return true;
    }
    
     // change the minimum amount of tokens to sell from fees
    function updateSwapTokensAtAmount(uint256 newAmount) external onlyOwner returns (bool){
  	    require(newAmount >= totalSupply() * 1 / 100000, "Swap amount cannot be lower than 0.001% total supply.");
  	    require(newAmount <= totalSupply() * 5 / 1000, "Swap amount cannot be higher than 0.5% total supply.");
  	    swapTokensAtAmount = newAmount;
  	    return true;
  	}
    
    function updateMaxTxnAmount(uint256 newNum) external onlyOwner {
        require(newNum >= (totalSupply() * 1 / 1000)/1e18, "Cannot set maxTransactionAmount lower than 0.1%");
        maxTransactionAmount = newNum * (10**18);
    }

    function updateMaxWalletAmount(uint256 newNum) external onlyOwner {
        require(newNum >= (totalSupply() * 5 / 1000)/1e18, "Cannot set maxWallet lower than 0.5%");
        maxWallet = newNum * (10**18);
    }
    
    function excludeFromMaxTransaction(address updAds, bool isEx) public onlyOwner {
        _isExcludedMaxTransactionAmount[updAds] = isEx;
    }
    
    // only use to disable contract sales if absolutely necessary (emergency use only)
    function updateSwapEnabled(bool enabled) external onlyOwner(){
        swapEnabled = enabled;
    }
    
    function updateBuyFees(uint256 _marketingFee, uint256 _liquidityFee, uint256 _devFee) external onlyOwner {
        buyMarketingFee = _marketingFee;
        buyLiquidityFee = _liquidityFee;
        buyDevFee = _devFee;
        buyTotalFees = buyMarketingFee + buyLiquidityFee + buyDevFee;
        require(buyTotalFees <= 30, "Must keep fees at 30% or less");
    }
    
    function updateSellFees(uint256 _marketingFee, uint256 _liquidityFee, uint256 _devFee) external onlyOwner {
        sellMarketingFee = _marketingFee;
        sellLiquidityFee = _liquidityFee;
        sellDevFee = _devFee;
        sellTotalFees = sellMarketingFee + sellLiquidityFee + sellDevFee;
        require(sellTotalFees <= 30, "Must keep fees at 30% or less");
    }

    function excludeFromFees(address account, bool excluded) public onlyOwner {
        _isExcludedFromFees[account] = excluded;
        emit ExcludeFromFees(account, excluded);
    }

    function setAutomatedMarketMakerPair(address pair, bool value) public onlyOwner {
        require(pair != uniswapV2Pair, "The pair cannot be removed from automatedMarketMakerPairs");

        _setAutomatedMarketMakerPair(pair, value);
    }

    function _setAutomatedMarketMakerPair(address pair, bool value) private {
        automatedMarketMakerPairs[pair] = value;

        emit SetAutomatedMarketMakerPair(pair, value);
    }

    function updateMarketingWallet(address newMarketingWallet) external onlyOwner {
        emit marketingWalletUpdated(newMarketingWallet, marketingWallet);
        marketingWallet = newMarketingWallet;
    }
    
    function updateDevWallet(address newWallet) external onlyOwner {
        emit devWalletUpdated(newWallet, devWallet);
        devWallet = newWallet;
    }
    

    function isExcludedFromFees(address account) public view returns(bool) {
        return _isExcludedFromFees[account];
    }

    function manage_blacklist(address _address, bool status) external onlyOwner {
        require(_address != address(0),"Address should not be 0");
        isBlacklisted[_address] = status;
    }

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal override {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
        require(!isBlacklisted[from] && !isBlacklisted[to],"Blacklisted");
        
         if(amount == 0) {
            super._transfer(from, to, 0);
            return;
        }
        
        if(limitsInEffect){
            if (
                from != owner() &&
                to != owner() &&
                to != address(0) &&
                to != address(0xdead) &&
                !swapping
            ){
                if(!tradingActive){
                    require(_isExcludedFromFees[from] || _isExcludedFromFees[to], "Trading is not active.");
                }

                // at launch if the transfer delay is enabled, ensure the block timestamps for purchasers is set -- during launch.  
                if (transferDelayEnabled){
                    if (to != owner() && to != address(uniswapV2Router) && to != address(uniswapV2Pair)){
                        require(_holderLastTransferTimestamp[tx.origin] < block.number, "_transfer:: Transfer Delay enabled.  Only one purchase per block allowed.");
                        _holderLastTransferTimestamp[tx.origin] = block.number;
                    }
                }
                 
                //when buy
                if (automatedMarketMakerPairs[from] && !_isExcludedMaxTransactionAmount[to]) {
                        require(amount <= maxTransactionAmount, "Buy transfer amount exceeds the maxTransactionAmount.");
                        require(amount + balanceOf(to) <= maxWallet, "Max wallet exceeded");
                }
                
                //when sell
                else if (automatedMarketMakerPairs[to] && !_isExcludedMaxTransactionAmount[from]) {
                        require(amount <= maxTransactionAmount, "Sell transfer amount exceeds the maxTransactionAmount.");
                }
                else if(!_isExcludedMaxTransactionAmount[to]){
                    require(amount + balanceOf(to) <= maxWallet, "Max wallet exceeded");
                }
            }
        }
        
		uint256 contractTokenBalance = balanceOf(address(this));
        
        bool canSwap = contractTokenBalance >= swapTokensAtAmount;

        if( 
            canSwap &&
            swapEnabled &&
            !swapping &&
            !automatedMarketMakerPairs[from] &&
            !_isExcludedFromFees[from] &&
            !_isExcludedFromFees[to]
        ) {
            swapping = true;
            
            swapBack();

            swapping = false;
        }

        bool takeFee = !swapping;

        // if any account belongs to _isExcludedFromFee account then remove the fee
        if(_isExcludedFromFees[from] || _isExcludedFromFees[to]) {
            takeFee = false;
        }
        
        uint256 fees = 0;
        // only take fees on buys/sells, do not take on wallet transfers
        if(takeFee){
            // on sell
            if (automatedMarketMakerPairs[to] && sellTotalFees > 0){
                fees = amount * sellTotalFees/100;
                tokensForLiquidity += fees * sellLiquidityFee / sellTotalFees;
                tokensForDev += fees * sellDevFee / sellTotalFees;
                tokensForMarketing += fees * sellMarketingFee / sellTotalFees;
            }
            // on buy
            else if(automatedMarketMakerPairs[from] && buyTotalFees > 0) {
        	    fees = amount * buyTotalFees/100;
        	    tokensForLiquidity += fees * buyLiquidityFee / buyTotalFees;
                tokensForDev += fees * buyDevFee / buyTotalFees;
                tokensForMarketing += fees * buyMarketingFee / buyTotalFees;
            }
            
            if(fees > 0){    
                super._transfer(from, address(this), fees);
            }
        	
        	amount -= fees;
        }

        super._transfer(from, to, amount);
    }

    function swapTokensForEth(uint256 tokenAmount) private {

        // generate the uniswap pair path of token -> weth
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();

        _approve(address(this), address(uniswapV2Router), tokenAmount);

        // make the swap
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0, // accept any amount of ETH
            path,
            address(this),
            block.timestamp
        );
        
    }
    
    
    
    function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
        // approve token transfer to cover all possible scenarios
        _approve(address(this), address(uniswapV2Router), tokenAmount);

        // add the liquidity
        uniswapV2Router.addLiquidityETH{value: ethAmount}(
            address(this),
            tokenAmount,
            0, // slippage is unavoidable
            0, // slippage is unavoidable
            deadAddress,
            block.timestamp
        );
    }

    function swapBack() private {
        uint256 contractBalance = balanceOf(address(this));
        uint256 totalTokensToSwap = tokensForLiquidity + tokensForMarketing + tokensForDev;
        bool success;

        if(contractBalance == 0 || totalTokensToSwap == 0) {return;}
        if(contractBalance > swapTokensAtAmount * 20){
          contractBalance = swapTokensAtAmount * 20;
        }
        uint256 liquidityTokens = contractBalance * tokensForLiquidity / totalTokensToSwap / 2;
        uint256 amountToSwapForETH = contractBalance - liquidityTokens;
        uint256 initialETHBalance = address(this).balance;
        swapTokensForEth(amountToSwapForETH); 
        uint256 ethBalance = address(this).balance - initialETHBalance;
        uint256 ethForMarketing = ethBalance * tokensForMarketing/totalTokensToSwap;
        uint256 ethForDev = ethBalance * tokensForDev/totalTokensToSwap;
        uint256 ethForLiquidity = ethBalance - ethForMarketing - ethForDev;
        tokensForLiquidity = 0;
        tokensForMarketing = 0;
        tokensForDev = 0;
        (success,) = address(devWallet).call{value: ethForDev}("");
        if(liquidityTokens > 0 && ethForLiquidity > 0){
            addLiquidity(liquidityTokens, ethForLiquidity);
            emit SwapAndLiquify(amountToSwapForETH, ethForLiquidity, tokensForLiquidity);
        }
        (success,) = address(marketingWallet).call{value: address(this).balance}("");
    }
    

}