ETH Price: $2,853.62 (-9.71%)
Gas: 9 Gwei

Contract

0xeE372d2b7e7C83DE7e345267b5e4eFC1899a4FAB
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

More Info

Private Name Tags

TokenTracker

XTrack (XTRACK) (@$0.0091)

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Value
Approve202310592024-07-04 5:28:1127 hrs ago1720070891IN
Xtrack: XTRACK Token
0 ETH0.00010692.29553783
Approve202299932024-07-04 1:53:3531 hrs ago1720058015IN
Xtrack: XTRACK Token
0 ETH0.0016245134.83845677
Transfer202277162024-07-03 18:16:4739 hrs ago1720030607IN
Xtrack: XTRACK Token
0 ETH0.000464749.29239141
Transfer202277032024-07-03 18:14:1139 hrs ago1720030451IN
Xtrack: XTRACK Token
0 ETH0.000525329.58803461
Approve202240912024-07-03 6:07:472 days ago1719986867IN
Xtrack: XTRACK Token
0 ETH0.000327167.01621251
Approve202142112024-07-01 20:58:593 days ago1719867539IN
Xtrack: XTRACK Token
0 ETH0.000297626.39091512
Approve202141192024-07-01 20:40:353 days ago1719866435IN
Xtrack: XTRACK Token
0 ETH0.000219698.32000676
Approve202141162024-07-01 20:39:593 days ago1719866399IN
Xtrack: XTRACK Token
0 ETH0.00025748.81359831
Approve202140032024-07-01 20:17:233 days ago1719865043IN
Xtrack: XTRACK Token
0 ETH0.000446759.59313425
Approve202139432024-07-01 20:05:233 days ago1719864323IN
Xtrack: XTRACK Token
0 ETH0.000519611.14319646
Approve202136442024-07-01 19:05:233 days ago1719860723IN
Xtrack: XTRACK Token
0 ETH0.0008266117.72715986
Approve202104832024-07-01 8:29:594 days ago1719822599IN
Xtrack: XTRACK Token
0 ETH0.000151313.26761761
Approve202017742024-06-30 3:19:595 days ago1719717599IN
Xtrack: XTRACK Token
0 ETH0.000079161.69980975
Transfer202001612024-06-29 21:55:355 days ago1719698135IN
Xtrack: XTRACK Token
0 ETH0.000235421.44257027
Approve201991222024-06-29 18:26:355 days ago1719685595IN
Xtrack: XTRACK Token
0 ETH0.000139042.98572793
Approve201975162024-06-29 13:03:115 days ago1719666191IN
Xtrack: XTRACK Token
0 ETH0.000098413.69003818
Approve201975102024-06-29 13:01:595 days ago1719666119IN
Xtrack: XTRACK Token
0 ETH0.000172833.71136115
Approve201966512024-06-29 10:09:115 days ago1719655751IN
Xtrack: XTRACK Token
0 ETH0.000113642.45420875
Transfer201965432024-06-29 9:47:235 days ago1719654443IN
Xtrack: XTRACK Token
0 ETH0.000096141.92244005
Approve201947622024-06-29 3:49:116 days ago1719632951IN
Xtrack: XTRACK Token
0 ETH0.00015763.38434614
Approve201937622024-06-29 0:27:476 days ago1719620867IN
Xtrack: XTRACK Token
0 ETH0.000072941.56645712
Approve201903622024-06-28 13:03:596 days ago1719579839IN
Xtrack: XTRACK Token
0 ETH0.000338087.25979063
Approve201866812024-06-28 0:43:597 days ago1719535439IN
Xtrack: XTRACK Token
0 ETH0.00022464.82302629
Approve201837952024-06-27 15:02:597 days ago1719500579IN
Xtrack: XTRACK Token
0 ETH0.0004181414.29961186
Transfer201837882024-06-27 15:01:357 days ago1719500495IN
Xtrack: XTRACK Token
0 ETH0.002508114.92963795
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To Value
202247152024-07-03 8:12:592 days ago1719994379
Xtrack: XTRACK Token
0.08095551 ETH
202247152024-07-03 8:12:592 days ago1719994379
Xtrack: XTRACK Token
0.08095551 ETH
202001612024-06-29 21:55:355 days ago1719698135
Xtrack: XTRACK Token
0.0979699 ETH
202001612024-06-29 21:55:355 days ago1719698135
Xtrack: XTRACK Token
0.0979699 ETH
201837882024-06-27 15:01:357 days ago1719500495
Xtrack: XTRACK Token
0.16224346 ETH
201837882024-06-27 15:01:357 days ago1719500495
Xtrack: XTRACK Token
0.16224346 ETH
201737372024-06-26 5:21:119 days ago1719379271
Xtrack: XTRACK Token
0.17297622 ETH
201737372024-06-26 5:21:119 days ago1719379271
Xtrack: XTRACK Token
0.17297622 ETH
201153122024-06-18 1:14:5917 days ago1718673299
Xtrack: XTRACK Token
0.36208402 ETH
201153122024-06-18 1:14:5917 days ago1718673299
Xtrack: XTRACK Token
0.36208402 ETH
200856582024-06-13 21:43:5921 days ago1718315039
Xtrack: XTRACK Token
0.54715738 ETH
200856582024-06-13 21:43:5921 days ago1718315039
Xtrack: XTRACK Token
0.54715738 ETH
199886932024-05-31 8:42:2335 days ago1717144943
Xtrack: XTRACK Token
0.61164739 ETH
199886932024-05-31 8:42:2335 days ago1717144943
Xtrack: XTRACK Token
0.61164739 ETH
198317362024-05-09 9:57:3556 days ago1715248655
Xtrack: XTRACK Token
1.08322489 ETH
198317362024-05-09 9:57:3556 days ago1715248655
Xtrack: XTRACK Token
1.08322489 ETH
197397732024-04-26 13:17:2369 days ago1714137443
Xtrack: XTRACK Token
1.01122786 ETH
197397732024-04-26 13:17:2369 days ago1714137443
Xtrack: XTRACK Token
1.01122786 ETH
196696972024-04-16 18:01:4779 days ago1713290507
Xtrack: XTRACK Token
1.40081827 ETH
196696972024-04-16 18:01:4779 days ago1713290507
Xtrack: XTRACK Token
1.40081827 ETH
196351642024-04-11 21:49:5984 days ago1712872199
Xtrack: XTRACK Token
1.79057897 ETH
196351642024-04-11 21:49:5984 days ago1712872199
Xtrack: XTRACK Token
1.79057897 ETH
196164112024-04-09 6:50:1187 days ago1712645411
Xtrack: XTRACK Token
2.51300627 ETH
196164112024-04-09 6:50:1187 days ago1712645411
Xtrack: XTRACK Token
2.51300627 ETH
196164062024-04-09 6:49:1187 days ago1712645351
Xtrack: XTRACK Token
2.51300627 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
XTrack

Compiler Version
v0.8.23+commit.f704f362

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-12-08
*/

/*
https://twitter.com/XtrackERC
https://t.me/XtrackERC
https://linktr.ee/xtracktech
Website: https://xtrackerc.com/

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%%%%%%%%@%%%%%%####*#*##=++***+*+*+=+====================--------------------------------------------------------=:=------
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%@@%@%@#*@%%%#*#  **%%##%=#%%%%#%%#########***********+****++=+++++=+====================================-
@@@@@@@@+=+*%=#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%@@=%%%%%@#@@@%%%#%%=*%#######%###%@@@##+*********++*+*++++*=++++++++==+=====+=======================-
@@*#*%#@@@@@@%%+=@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%++%@%%%@@%%%%%@#-%%%%##%####%#%--@*#*##+********++***+++++++++++++++=============================-
@*%@###%%%%%#%%#%+=@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%@@@@@@+*@%%%%%%%%%#-%@%%%%%##%%#%#%@*%#######**********+****++****+++++++++++++======================-
@=@#%%@@@@@@@@%%%@%*#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%%@@#=%@###+=++#%@%%%%%%%%#%##############+***********+*++++++++++++++============================-
@=@@%%@@@@@@@@@@%@#@-@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%@@@@@%@%@@@@@@@@#=#%%@@@@@@%%%@%%%%%%#%%#%%%%%#####*###+*****+++==+*****+*++*=++++=+==+==+==================-
@%@#@@@@@   @@@@@%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%@@@%@@@%%%%%%%%%%%%#%%%%%%#######%###########***######****++++++++*+++++**+++++++==+============-
-@@%@@@@@@@@@@@@%%@-@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%@@@@@@@@%%@%%%%@%%%%%%%%@%%%%%%%###########%#####***********+*****++++++=++++==+===+================-
=@@@%#%%@@@@@@@%#%#@@@@@@@@@@@@@@@@--@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%%@%%%%%%##%%%%%%%%%##%###%######**+*+****++*++++*+*+++++++++=*==+====================-
@#=@@%@%%%%%%*#%@@+%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%@@@@@%@%%@@@@@@@@%%%@%%%%%%%@%%%%%%%%%%%%#%#############*********+*++*++++++++*++**+++==============+++=-
@@@@=#%@%%@@@@%++-*@@@@@@@@@@@@@@@@@@@@@@@%@@@@@@@@@@@@@@@@*#%@@@@@@@@@@@@@@@@@%%@@%%%%%%@%%%%%%%%%%%%%%%#%########*+*****+***+++***++++++++++++++++=+++========+::=-
@@@@@@-##*+===@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%@@%%@@@@@@%@@@@@@%%%%#%%%%%%%%%#####*#%#########*****##*****++*****++++++++++++++==========**#+-
@@@@@@@@%%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%@@@@@@@@@+.@@%@@%%%%#%%%%%%%####%%%##########*#*****#***+*+*++++++++++++++=+++=============-
=@@@@@@@@@@@@@@@@@@@#-*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%%@@@@@@@@@@#%@%@%%##%%%%%%%%%@@@@@#%%#####*#+******++***+++**+++++++++++##%###+=+=========-
@#-+@@@@@@@@@@@+=-+%@@@==@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%@%@@%%%%%%%%%%%%%= =@####%####*##+*******+****++***++##@@#+=====%**==+=======-
%@@@-@@@@@@--*@@@@@@@%@@@-=@@@@@@@@@@@@%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%%%%@%%%%@%%@#%%%%%%%@@@%%####%########***@@@#*****++****%=======*+*==%*++=+=====-
%@@@-@@@@@@=@@@@@@@@%@@@@@@=-*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%@@@@@@@@%@%@@@@%%@%%%%%%%@@@@@@%%%%%%%%%%%%%%###%##%#########*@:=#***+**++++#==++=======+==@%*++++===-
%@@=%@@@@@+=@%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%@@%@@@@@@@%%%%@@@@@%%##%%@%%%%%%%%%%%%@%%##%%%%%%%#%#############%@@#***#***+*%#=+*++*##*+=++*==#+=++*++-
%@@-@@@@@@-@@@@@@@# *#@@@@@@-=@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#@@@@@@@@@@@@%%%%%%#@@@@@@@@@%%%#%###%############*********#@=#*++=# =#+===#==#+++==++-
%@@-@@@@@@-@@@@@@%= =%@@@@@@-@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@      @@@@%@%@@@@@@%@     @%%%%%@@@@%%@@@      @@%#########%#%########+*******%==#++*+@  **+=++=**=++++++-
@@%-@@@@@*@@@@@@@@@@@@@@@@@%-@@@@@@@@@@@@@@%+%@@@@@@@@@%@   @@@   @@%@@@@@@@@@@@     @@%@@@%%@@%%@   @@@   @#%%%%###%%###############****%==++=++##%#+==+=+#*++++++=-
-=%@@@@@@@-#@@@@@@@@@@@@%@@=@@@@@@@@@@@@@@@@%@@@@@@@@@@@@  @@@@@  =@@@@@@@@@@@%@@  =@@@%%%%@%%%%#@  @@@@@  @@%%%%%%####%##%%%#######*#+**%@@==#+=+++===%==%**+**=+++-
@@@@@@@@@@@@-=@@@%@%@@@@@@--@@@@@@@@%@@@@@@@@@@@@@@@@@%%@%   @@   @=+@@@@@@@%@@%@  @@@@@@@%%%%@#@@@   @@   @%%%%#%%%%%##%####%##@@@@@@@@@%##@==+*#===++==@*+++++++*+-
@@@@@@@@@@@@@@=-@@@@*=--=@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%@@@@        @@@@@@@%@@@@%@  @@@@@%@@@@%@@@        @@@%%%%%%%%%%%###%##@@@%-----=-=@%##@@=====++%%@%**++++++++-
@@@@@@@@@@@@@@@@*--=@@@@@@@@@@@@@@@@@@%@@@@@@@@@@@@@@%%@@%@@@@@@@@   @@@@@@@%@@@@  %@@%@%@-+@@@    @@@@@@@@@%%@@@@%%%%%%####%@--=*##%#*#*=*@%*%@@@%%***%@@@@%*++++++-
@@@@@@@@@@@@@@@@@@@@@@%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%@@@@@@@@@@@   @@@@@@@@%@  %@@%@@@@@@+   @@@@@@%%%%%@@@=@@@%%%%%%%#%@-=##*#%%##*#+#=+%**+#@@@@@+=====%#*++++-
@@@@@@@@@@@@@@@@@@@@@@%@@@@@@@@@@@@@@@@@@@@@@@@@@@     @@@@@@@@@%%@@@    @@@%@@%@  @@@%@@@@@   @@@@@%%%%%@%%@     @@%%%%%%%%@=##+#+**==+#+*@=%*#+@=:=%@%%=-+@=@%*+*+-
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%@     @%%@@@@@%@@@%@@@   @@@@@%@  @@@@@%@   @@@@@%@@@@@@%%@@     @@%%%%@%#@==#*#*=  ==-*+#%=%+#@@=@---------@==@%*+-
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%@@@@@@@@@@@@@@@@@@@     @%@@%@@@@@@@@@@@@  @@@@@%@  @@@%@%@  @@@@@@@@@@@@%@@%@     @@%%%##%%@-@*#*==**+==#+#=@@+%@=@=-=@@@@@=--=#=%#*-
@@@#=@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%@@@@@@@%@@@=  @@%@@@@@@@@@@@@@#@  @@@@@%@  %@@@%%@  @@%@@@@@%%%%%%@%@@@  @@@%%%##%%@-+@###*++***+%==%##%==*-=@+  #=@=--@=#++-
@@@#=@@@@@@@@@@@@@@@@%@@@@@@*+@@@@@@@%@@@@@%@@@@@%@   @@@@%@@%@@@@@@@%%@  @@@@@%@  %@%@@%@  @@%@@@@@%@%%%%%%%@@  @@%%%%%%%@@@@-=%%*##%@@%%-@@##%=%--=@*#=#=@--%=%#**-
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%%@@@@@@@@@@@@%@   @%%@@@@@@@@@%@@%#@  @@#%%@@  @@@###@  @@%@@@@@@@@%%%%%%@@  @%%%%%%%%%%%%@*=*%++----%@@###@-%#--=@@@@@=-=+=@*#+-
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%%@@@@@@@@@@@@@@@@@%@   @%@%@@@ +@@@@@@@@@  @@@@@@@  =@@@@@@  @@@%%@@* @@%%%%%%@@  @%%%%%%%%%%%%%@@--#@@@@@@%%%%%@@*=@=-------=@=%#**+-
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%@@@@@@@%%@@%@   @%@%%@   @@@@@@@@@                     @@@@@@   @%%%%%%@@  @%%%%%%%%%%%%%%@@@@%%%%%#######%@@-=%=*%@@===@%*+*+-
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%%%@@@@%@   @%%%@@@  @@                                    =@@@@%%%@@  @@%%%%%%%%%%%%@%@@@%%%%%%%#%%###%%@#---*#%@@%*###**-
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%@     @@@@@@@@@@%@   @@@@@@       +@=        @@@@@@@@         @@       @@@@@@@  @%@@@@@%%%%%@@@@@%#%%%%%%%%%%####%#@@@@@%%##*#####+-
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%%@%@     @@%@@@@@@@%@   @@      =@@@@@      @@@@@@@@@@@@@@@@       @@@@@      @@@  @%%@%-@%%%@@@   @%%%%%%%%%%%%%##%#%%#########%#*#*#=
@@@@@@@@@@@@@@@@@@@@@@@@@@@%@@@@%@     @@@@@@@@%@@@=       @@@@@@@      @@@@@@@@@@@@@@@@@@@@      @@@@@@@=       @@@%@@@%%%%%@=  @%#@%%%%%#%%%%%##%###%#############=
%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%@@@@@@@      @@@@@@@@@      @@@@@@@@@@@@@@@@@@@@@@@     @@@@@@@@@@      @@@@@@%%%%@+  @%#%#%##%*#%%%%%###%%%#%###%@@#####=
%@@@@@@@@@@@@@@@@@@@@@@@%%@@@@@@@@@%%@@@@@@@@        =@@@@@@@@@@@     @@@@@@@@        @@@@@@@@#     @@@@@@@@@@@        @@@@@@@=  @##%%%@##%%%%%%%%%#%##%###%%-+%####=
%@@%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@            @@@@@@@@@@@@     @@@@@@@            @@@@@@@     @@@@@@@@@@@@@            @@  @@@@@@@@@%%%%%%%%%%%##%####@=@#####=
#@@@@@%@%@@@@@ +@@@@@@@@@@@                        @@@@@@@@@@@@@     @@@@@@@             @@@@@@@    @@@@@@@@@@@@@@                       @@%%@#%%%%%%%%##%%%########=
#%%%%@%@%%%@@@@@@@@@@@@@@@@=                      @@@@@@@@@@@@@@     @@@@@@              @@@@@@@     @@@@@@@@@@@@@                       @%%%%%%%%#%%%%%%##%#%%#####=
#@@@@@@@@@%%%@@@@@%%@@@@@@@                        @@@@@@@@@@@@@     @@@@@@%             @@@@@@@    @@@@@@@@@@@@@@                       @%%%%%%%%%%%%%%%%%%#%%%#%%#=
#@@@@@@@@@@@@@@%@@%@@@%@@@@@@@@@@@@@  @             @@@@@@@@@@@@     @@@@@@@            @@@@@@@     @@@@@@@@@@@@@             @@@@@@@@@@@@%%%%%%%%%%%%%%%%%%##%#####=
#@%@@%%%%@@@@%%@@@@@@@%@%%@@@@@@@%@@  @@@@@@@        @@@@@@@@@@@@     @@@@@@@@        +@@@@@@@@     @@@@@@@@@@@        +@@@@@@@@@@@@%%%%%%%%%%%%%%%%%%#%%%%%%%###%%%+
=@@@%@%@@%%@@@%@%@@%@@@@@@@@%%%%@%@%  @%@%@@@@@@@      =@@@@@@@@@      @@@@@@@@@@@@@@@@@@@@@@@     @@@@@@@@@@      @@@@@@@%#@     @@%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%##+
=*--@@@@@%%%%%%%@%@@@@@@@-@@@@@@@@@#  @%@@@@@@%@@@@=      =@@@@@@@      @@@@@@@@@@@@@@@@@@@@      @@@@@@@@       @@@@%%%%%@#@     @@%%%%%%%%%%%%%%%%%@%%%%@%%%%%%%%%+
=#%%+--#@@@@@%%@@@@@@---+##--@@@@%@=  @#@@@@@@%%%%@   @@      #@@@@*      @@@@@@@@@@@@@@@@       @@@@@      =@@  @@%@@%%%%%#@     @@%%%%%%%%%%%%%%%%%%%%%%%#%%%%%@@@%
=****%+%-#@#%%@@@---=%*+==#%%%--@@@@@@@%@@@%%%@@%#@   @@@@@@       @@        @@@@@@@@@@        @@@      =@@@@@@  @%%%%%%%@%%@@@@@@@@@%%%%%%%%%%%%%%%%%%%%%%@#%%%%%--*
*@%%###%=*@#@%@%-@@%%##%%%##*@@@=%@@@@@@@@@@@@@@@%@   @%%#@@@  @                                     =@@@@@@%@@  @@@@%%%%@@@@@%%%%%%%%@@%%%%%@@@@@@@@@@@%%%@#@%%%@@@#
=@%%%#*%-*@@%@@+-#####@%@%%%###%--@@@@@@@@@@@@@@%@@   @%@%@@%  @@@@@@@                        @@@@@   @%@@@@@%@  @@@@%%%%%%%%%%@%@@@@@%%@%%@%%%%%%%%@%%%%%%%#%%#%%%@*
 %%%%##@-#@%%%@+*%##%#%- %%%%##%+%@@@@@@@@@@@@@@@@@   @%@%@@#  @@@@%%@@@  @@@@@=#  =+#@@@@  @@@@%#@   @%%%%%@@@  @@%%%@@@@@@@@@@@@#+=#@@@@%%@@%%%%@%%%%%%%%%%%%%#%%%+
+@%%#%#%-@@%%%@-####%%%%%@%%%%#%-@@@@@@@@@@@@@@@@%@   @%@@%@#  @@@@@%@%@  @@@@@@@  @@@@@%@  @@@@@%@   @%%%%@%@@  @@%%%%@@@@@@%#+=##%%%*+@@@@@%%@%%%%%%%%%%%%%%%%%%%%*
=%##*###-@@%%@@-@###%%@@@@@%###%-@@@@@@@@@@@@@@@@@@   @@@@@@   @@%@@@%%@  @@@@@%@  #@@@@%@  @@%%@%@   @%@%%%%@@  @@@@%@@@@@%+*@@@@%%%%%%*=%@@%%%%@@@%%%%%%%%%%%%%%@@#
=###=---@@%%%%@-=%%###%######%*-*@@@@@@@@@@@@@@@@@@=  @@%@@@@@@@@@@@@@@@  @@@@@%@  #@@@@@@  @@%@@@@@@@@@@@@@@@@  @@@@@@@@@@@%@%%%@@@@@%@%%%#@@@@@@@@%@@@%%%%%%%%%@@%=
==--%@@@@@%%%%@@@--*%%###%#*--#@@@@@@@@@@@@@@@@@@@     @@@@@@@@@@@@@@@@@  @@@@@@@  #@@@@%@  @@@@@@@@@@@%@@@@@     @@@@%@@@@*#@%%@@+*%@%%%%#%@%%%%%%%%@@%%@%%%%%%@@-==
=%@@@@%@@@@@@@%%@@@@--**=-=@@@@@@@@@@@@@@@@@@@@@%@     @@%@@@@@@@@@@@@@#  @@@@@@@  %@@@@@@   @@@@@@@@@@@@@@@@     @@@@@@@@@*@%@@@#--#%%@%#%%%@@@@@@@%%%@%%@@%%%%@=-@-
+@%%%@@@+-+--#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@     @%@@@@@@@@@@@@@   @@@@@@@@  %@@@@@@@*   @@@@@@@%@@@@@@     +@@@@@@@%#@%@%@@@@@@@@%#%@@@@@@@@@@%%%%%@%@@@@@-*@-
+@@@*=-+%@@@@@+-*@@@@%%@@@@@@@@@%@%%@@@@@@@@@@@@@@@@@@@@%%%%@@@@@@@@   @@@@@@@@@@  %@@@@@@@@@   =@@@@@@@@@@@@@@@@@@@@@@@@@@*=%@@%@%%%%%%%*%@@@@@@@@@@@@@@%%%%@%@@-%@-
**-+%%%%%%%%%%@@#+=#@@@@@@@@@@@@@%%%@%@@@@@@@@@@@@@@@@@@@@@@@@@@@@   @@@@@@@@@@@@  #@@@@@@@@@@@   #@@@@@@@@@@@@@@@@@@@@@@@@@@@##%%%####*#@@@@@%%@@@@@@@@@@@%%%%@-@#@-
#-#%%%##%####%%%@@**@@@@@%@@@@@@@@@@@%@@@@@@%@@@@@@@@@#%%@@=       =@@@@@@@@@@@@@  #@@@@@@@@@@@@@        @@@@@@@@@@@%+==-+@@@@@%%#%%@@@@@@@@@@@@%%%@@@@%%@@%@@@@@--@+
#-%%###%%%%#*#%%%@*%@%@@%%@@@@@@@@@@@@@@@@@@@@@@%@@%%%@@@@   =    @@@@@@@@@@@@@@@  *@@@@@@@@@@@%@@@   :    @@@@@*===***##+-=@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#@@@@@--
*-%%##%*%  ####%@%=%@%%%%%@%%@@%@@@@@@@@@@@@@@@@@@@%%@@ @  @@@@@  =@@@@@@@%@@@@@@  @@@@@@@@@@@@@@@  #@@@@  @@@@+######%%####==@@@@@@@@@@@@@@@@@@@@@@@@@@@*--**--@@@@%
+=@#%%##%@@@##%@@@*%@@@@@%@@@%%@@%%%@@@@@@@@@@@@@@%%@@@@@   @@@   @@@@@@@@@@%-@@     @@@@@@@@@@@@@   @@@=  @@@@+###@@@@@@%#*%+@@@@@@@@@@@@@@@@@@@@@@@*-=#@@@@@@@-=%@@
--@#%##%%#%#%%%@@#*%%%%%%%@@@@@@%%@@@@@@@@@@@@@@@@@%%@%%@@=      @@@@@@@@@@@@@@@     @@@@@@@@@@@@@@=      @@@@#*#%@@@  @@@#%%-@@%@@@@@@@@@@@@@@@@@@@@=@@@@%#*#%@%@#=%
=-#*%@%%%%@%%%%%**#@%@@%%%%%%%@@@@@@@@@@@@@@@@@@%%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@=%#%%@@@@@@@##*@@@@@@@@@@@##@@@@@@@@@@%-@@#*#@@+-=*%%-%
*@@%=-##%%%####%%@@@%%@@@@%%%%%@@@@@@%@@@@@@@@@@@@%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@=%#@%%%%%%%##%=@@@@%%@@@@@@@@@@@@@@@@@%@@%*+#  *+##%-#%
+%%%%@%*++*#%%%@#@@@%%%@@@@@%%%%@@@@@@@@@@%+*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#=+%######+==+@%@@@@@@@@@@@@@@@@@@@@@-@@%*-%%%+:##* @+
+##%%%#@@@@%%%%%%%%%%@%%%%%@@%@@@@@%@@@+-*%*#@==@@@@@@@@@@@@@@==#@==@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@=+**+=+#@@@@@@@@@@@@@@@@@@@@@@@@@@=-@@@@=+@@@+:  =:
+%%#%%#%%%%%%%%%%%%%%%%%%@%%%@@%@@@%**%@#+++*++%@+=@@@@@@@%=+@@@@@@@@=+%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%@@@@%%@@@@@@*==@@@@@@@@@@@@@@@@@@@@@@@=-*%%@*.    =- 
+##%%%#%%%%%%%%%%%%%%%%%%%@@%%%@@@@*@#=-*#%@%%#-=-*=@@@@+*@@@%+-=--#@@@#%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@===*#**-+@@@@@@@@@@@@=---+%@@@@%--=  +#@@@%-
=##%%%%####%%%%%%%%@@@%%%%%%%%%%%@=@=++%@@@@@@@#*+@*@%%@=@@*-*@@@@@@-*@%*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%@@@@@@@@@@@==+*##******-=@@@@@@@#=+@@@@@%@#%@@@@@@@@@%%%#-
=######%#%####%%%%%+-@%%%%%%%%%%%@*@-*+@%@  @%%*=*==@%@@+@@+-@@  @%@**@##@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*-###%@@@@%##+=+@@@#%##%%#***####%#@@%%%%%%%%%#-
=###*####%#%%#####%@@@%%%%%%%%%%%@-@-+*@@@@@@@%==@@@@@@@=@@-=@%@@@%@-*@#@@@@@@@@@@@@*-@@@@@@@@@@@@@@@%@@- @@%%@@@%%@@--#*%#% @###===-@%%#%####%@@@#%%##*%%%%%%%%%%%%-
-+**#######%%#%#%###%%%%%@%%%%%%%@+@-==+%%@%%+-=-@=%%@@@=@@--#@@@%+--@@=*@@@@@@@@@%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@+#%#@@@ @@@%##=%@%%%##*##@  @**####%@#%%%%@%%#%-
-******###*###%%%%#%%####%%%#@%%#@--@@-------=+@#-@@@%@%-#@@@@----@@@@+#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%-###%%@@@%##*#=@@%#%@#*##%@@@**%*##%@%%%%%%#==%-
-#******+#######%%%#%%%%%%##%%%%%@@@%+-%%*+#@+-@@@@@@@@@@@+-*@@@@@@+#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@=-=+++=#**+++--@@%%*%%%###%%##%@+#%%%%%%%%#*=+*=
-+++**#*#*+*+##**##%#%%%%%#%#%##%%##%%@@*--=%@@@@@#=--%@@@@@@*---+@@@@@@@@%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%--**++---@@@@@@@@=-#@@%%%@@% =@%%%%%%###*#%*:
-+++++++*+##*****##***######%%%%%%%%%###@@@@@@@%--++*+++--@@@@@@@@@@@@@%%%%@%@@@%@%%%%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@=--#@@@@@=-+@@@@@%-#@%#  #@@@@%%%%##%%%##*:
-++++++**+*************##*###*##%%#%%%%###%@%=-=+=++++++=++-@@%@%%%%%%%%%%@@%%%%%@@@@@@@@@@@@@@%%%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#--*@@%+-#@@@@@--@@@@@%%%%%%##%%##+*+.
-++++++++++++++*+***********########%%%%%%@=====+**###**+=*-%@%%%%%%%@@%%%%%%%%@%%%%%%%%%%%%%%%%@@@@%%%@@@@@@@@@@@@@@@@@@@@@--*#@@%%%%@%%--@%@@@@%%%%%%%%%#%%%###*#*.
-===+++*++++++++**+++*******+@@%*+#*#*####@-=+=+**@%@%#*+++-%%%@%%%%%%%@@@%%%%%%@@%@@@@%%@@@@@@@%%%%@@@@%%%%%%@@@@@@@@@@@%@@-@@%%%@%@%%%%@*@@@%%%%%%%%%#%%#%%#%####*.
-========+*++++++++++*+*****#=:@*****#+###@##=++**@  #%#++#*@%%%%%%@%%%%=*@%%%%%%%%%%@@@%%@@=-@@@@%%%@@@@@@%@%%%*%@@@@@@@@@@-%%%%@@#%@%%#@-@%@%%%%%%%%@%%%#%######## 
-==+========++++++++++++++++#@@%********++%==+==**@@@@*+==*=#@%##%#%%%%%@%%@%%%%%%#%%%%%%%%@@@@%%%%@@@%@%@@%@%@@@%@@@@@@@@%@-@#%%%@ @@%##@-@%%%%%%%%%%#%%########### 
-================+++++++++=++++++++*++****%==++===++=+====*-@%#%#%%#%%%%%##%%%%%%%%%%%%%%%#%%%%%%%%%%%%%%%%%%@@@@@@%%%%%%%@@-@%##%%%%%%#%@-@%%%#%%%%%%%%#%%######+#: 
-=================+=+++++++++++=++*++*****%#==============@@@#*#######%#%#%%####%%%%%%#%%#%%%%#%%%%#%%%%%%%%%%%%%%%%%%%%%@@@-=@@@%%#%@%%#--@@%%#%%%%%###%%%#%#*##+-: 
-=======================+=++++=++++=++++++++%##========%@%#*****+##**########%%%######@%%%%%%%%%%%%%%%%%%%%@%%%%%%%%%%%%%%%@@@--+@@%%---@@@@%%%@%%%%#%%%%%%%*#**#*:  
-------------------------------------------------------------------===-==================+++*****+*******++++****************#%@@---=%%%%#*#**++++=++++====-----:   
*/

// SPDX-License-Identifier: MIT
pragma solidity 0.8.23;

/**
 * @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;
  }
}

/**
 * @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);
}

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

// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.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/ERC20.sol

// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC20/ERC20.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.openzeppelin.com/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 `from` to `to`.
   *
   * 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;
      // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by
      // decrementing then incrementing.
      _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;
    unchecked {
      // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.
      _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;
      // Overflow not possible: amount <= accountBalance <= totalSupply.
      _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 {}
}

abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    constructor() {
        _transferOwnership(_msgSender());
    }

    function owner() public view virtual returns (address) {
        return _owner;
    }

    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

interface IUniswapV2Factory {
  function createPair(
    address tokenA,
    address tokenB
  ) external returns (address pair);
}

interface IUniswapV2Router02 {
  function factory() external pure returns (address);

  function WETH() external pure returns (address);

  function swapExactTokensForETHSupportingFeeOnTransferTokens(
    uint amountIn,
    uint amountOutMin,
    address[] calldata path,
    address to,
    uint deadline
  ) external;
}

library Math {
  /**
   * @dev Muldiv operation overflow.
   */
  error MathOverflowedMulDiv();

  enum Rounding {
    Floor, // Toward negative infinity
    Ceil, // Toward positive infinity
    Trunc, // Toward zero
    Expand // Away from zero
  }

  /**
   * @dev Returns the addition of two unsigned integers, with an overflow flag.
   */
  function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
    unchecked {
      uint256 c = a + b;
      if (c < a) return (false, 0);
      return (true, c);
    }
  }

  /**
   * @dev Returns the subtraction of two unsigned integers, with an overflow flag.
   */
  function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
    unchecked {
      if (b > a) return (false, 0);
      return (true, a - b);
    }
  }

  /**
   * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
   */
  function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
    unchecked {
      // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
      // benefit is lost if 'b' is also tested.
      // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
      if (a == 0) return (true, 0);
      uint256 c = a * b;
      if (c / a != b) return (false, 0);
      return (true, c);
    }
  }

  /**
   * @dev Returns the division of two unsigned integers, with a division by zero flag.
   */
  function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
    unchecked {
      if (b == 0) return (false, 0);
      return (true, a / b);
    }
  }

  /**
   * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
   */
  function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
    unchecked {
      if (b == 0) return (false, 0);
      return (true, a % b);
    }
  }

  /**
   * @dev Returns the largest of two numbers.
   */
  function max(uint256 a, uint256 b) internal pure returns (uint256) {
    return a > b ? a : b;
  }

  /**
   * @dev Returns the smallest of two numbers.
   */
  function min(uint256 a, uint256 b) internal pure returns (uint256) {
    return a < b ? a : b;
  }

  /**
   * @dev Returns the average of two numbers. The result is rounded towards
   * zero.
   */
  function average(uint256 a, uint256 b) internal pure returns (uint256) {
    // (a + b) / 2 can overflow.
    return (a & b) + (a ^ b) / 2;
  }

  /**
   * @dev Returns the ceiling of the division of two numbers.
   *
   * This differs from standard division with `/` in that it rounds towards infinity instead
   * of rounding towards zero.
   */
  function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
    if (b == 0) {
      // Guarantee the same behavior as in a regular Solidity division.
      return a / b;
    }

    // (a + b - 1) / b can overflow on addition, so we distribute.
    return a == 0 ? 0 : (a - 1) / b + 1;
  }

  /**
   * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0
   * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)
   * with further edits by Uniswap Labs also under MIT license.
   */
  function mulDiv(
    uint256 x,
    uint256 y,
    uint256 denominator
  ) internal pure returns (uint256 result) {
    unchecked {
      // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use
      // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256
      // variables such that product = prod1 * 2^256 + prod0.
      uint256 prod0; // Least significant 256 bits of the product
      uint256 prod1; // Most significant 256 bits of the product
      assembly {
        let mm := mulmod(x, y, not(0))
        prod0 := mul(x, y)
        prod1 := sub(sub(mm, prod0), lt(mm, prod0))
      }

      // Handle non-overflow cases, 256 by 256 division.
      if (prod1 == 0) {
        // Solidity will revert if denominator == 0, unlike the div opcode on its own.
        // The surrounding unchecked block does not change this fact.
        // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.
        return prod0 / denominator;
      }

      // Make sure the result is less than 2^256. Also prevents denominator == 0.
      if (denominator <= prod1) {
        revert MathOverflowedMulDiv();
      }

      ///////////////////////////////////////////////
      // 512 by 256 division.
      ///////////////////////////////////////////////

      // Make division exact by subtracting the remainder from [prod1 prod0].
      uint256 remainder;
      assembly {
        // Compute remainder using mulmod.
        remainder := mulmod(x, y, denominator)

        // Subtract 256 bit number from 512 bit number.
        prod1 := sub(prod1, gt(remainder, prod0))
        prod0 := sub(prod0, remainder)
      }

      // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.
      // See https://cs.stackexchange.com/q/138556/92363.

      // Does not overflow because the denominator cannot be zero at this stage in the function.
      uint256 twos = denominator & (~denominator + 1);
      assembly {
        // Divide denominator by twos.
        denominator := div(denominator, twos)

        // Divide [prod1 prod0] by twos.
        prod0 := div(prod0, twos)

        // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.
        twos := add(div(sub(0, twos), twos), 1)
      }

      // Shift in bits from prod1 into prod0.
      prod0 |= prod1 * twos;

      // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such
      // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for
      // four bits. That is, denominator * inv = 1 mod 2^4.
      uint256 inverse = (3 * denominator) ^ 2;

      // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works
      // in modular arithmetic, doubling the correct bits in each step.
      inverse *= 2 - denominator * inverse; // inverse mod 2^8
      inverse *= 2 - denominator * inverse; // inverse mod 2^16
      inverse *= 2 - denominator * inverse; // inverse mod 2^32
      inverse *= 2 - denominator * inverse; // inverse mod 2^64
      inverse *= 2 - denominator * inverse; // inverse mod 2^128
      inverse *= 2 - denominator * inverse; // inverse mod 2^256

      // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.
      // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is
      // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1
      // is no longer required.
      result = prod0 * inverse;
      return result;
    }
  }

  /**
   * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.
   */
  function mulDiv(
    uint256 x,
    uint256 y,
    uint256 denominator,
    Rounding rounding
  ) internal pure returns (uint256) {
    uint256 result = mulDiv(x, y, denominator);
    if (unsignedRoundsUp(rounding) && mulmod(x, y, denominator) > 0) {
      result += 1;
    }
    return result;
  }

  /**
   * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded
   * towards zero.
   *
   * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11).
   */
  function sqrt(uint256 a) internal pure returns (uint256) {
    if (a == 0) {
      return 0;
    }

    // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.
    //
    // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have
    // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.
    //
    // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`
    // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`
    // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`
    //
    // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.
    uint256 result = 1 << (log2(a) >> 1);

    // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,
    // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at
    // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision
    // into the expected uint128 result.
    unchecked {
      result = (result + a / result) >> 1;
      result = (result + a / result) >> 1;
      result = (result + a / result) >> 1;
      result = (result + a / result) >> 1;
      result = (result + a / result) >> 1;
      result = (result + a / result) >> 1;
      result = (result + a / result) >> 1;
      return min(result, a / result);
    }
  }

  /**
   * @notice Calculates sqrt(a), following the selected rounding direction.
   */
  function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {
    unchecked {
      uint256 result = sqrt(a);
      return
        result + (unsignedRoundsUp(rounding) && result * result < a ? 1 : 0);
    }
  }

  /**
   * @dev Return the log in base 2 of a positive value rounded towards zero.
   * Returns 0 if given 0.
   */
  function log2(uint256 value) internal pure returns (uint256) {
    uint256 result = 0;
    unchecked {
      if (value >> 128 > 0) {
        value >>= 128;
        result += 128;
      }
      if (value >> 64 > 0) {
        value >>= 64;
        result += 64;
      }
      if (value >> 32 > 0) {
        value >>= 32;
        result += 32;
      }
      if (value >> 16 > 0) {
        value >>= 16;
        result += 16;
      }
      if (value >> 8 > 0) {
        value >>= 8;
        result += 8;
      }
      if (value >> 4 > 0) {
        value >>= 4;
        result += 4;
      }
      if (value >> 2 > 0) {
        value >>= 2;
        result += 2;
      }
      if (value >> 1 > 0) {
        result += 1;
      }
    }
    return result;
  }

  /**
   * @dev Return the log in base 2, following the selected rounding direction, of a positive value.
   * Returns 0 if given 0.
   */
  function log2(
    uint256 value,
    Rounding rounding
  ) internal pure returns (uint256) {
    unchecked {
      uint256 result = log2(value);
      return
        result + (unsignedRoundsUp(rounding) && 1 << result < value ? 1 : 0);
    }
  }

  /**
   * @dev Return the log in base 10 of a positive value rounded towards zero.
   * Returns 0 if given 0.
   */
  function log10(uint256 value) internal pure returns (uint256) {
    uint256 result = 0;
    unchecked {
      if (value >= 10 ** 64) {
        value /= 10 ** 64;
        result += 64;
      }
      if (value >= 10 ** 32) {
        value /= 10 ** 32;
        result += 32;
      }
      if (value >= 10 ** 16) {
        value /= 10 ** 16;
        result += 16;
      }
      if (value >= 10 ** 8) {
        value /= 10 ** 8;
        result += 8;
      }
      if (value >= 10 ** 4) {
        value /= 10 ** 4;
        result += 4;
      }
      if (value >= 10 ** 2) {
        value /= 10 ** 2;
        result += 2;
      }
      if (value >= 10 ** 1) {
        result += 1;
      }
    }
    return result;
  }

  /**
   * @dev Return the log in base 10, following the selected rounding direction, of a positive value.
   * Returns 0 if given 0.
   */
  function log10(
    uint256 value,
    Rounding rounding
  ) internal pure returns (uint256) {
    unchecked {
      uint256 result = log10(value);
      return
        result + (unsignedRoundsUp(rounding) && 10 ** result < value ? 1 : 0);
    }
  }

  /**
   * @dev Return the log in base 256 of a positive value rounded towards zero.
   * Returns 0 if given 0.
   *
   * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.
   */
  function log256(uint256 value) internal pure returns (uint256) {
    uint256 result = 0;
    unchecked {
      if (value >> 128 > 0) {
        value >>= 128;
        result += 16;
      }
      if (value >> 64 > 0) {
        value >>= 64;
        result += 8;
      }
      if (value >> 32 > 0) {
        value >>= 32;
        result += 4;
      }
      if (value >> 16 > 0) {
        value >>= 16;
        result += 2;
      }
      if (value >> 8 > 0) {
        result += 1;
      }
    }
    return result;
  }

  /**
   * @dev Return the log in base 256, following the selected rounding direction, of a positive value.
   * Returns 0 if given 0.
   */
  function log256(
    uint256 value,
    Rounding rounding
  ) internal pure returns (uint256) {
    unchecked {
      uint256 result = log256(value);
      return
        result +
        (unsignedRoundsUp(rounding) && 1 << (result << 3) < value ? 1 : 0);
    }
  }

  /**
   * @dev Returns whether a provided rounding mode is considered rounding up for unsigned integers.
   */
  function unsignedRoundsUp(Rounding rounding) internal pure returns (bool) {
    return uint8(rounding) % 2 == 1;
  }
}

abstract contract ReentrancyGuard {
  // Booleans are more expensive than uint256 or any type that takes up a full
  // word because each write operation emits an extra SLOAD to first read the
  // slot's contents, replace the bits taken up by the boolean, and then write
  // back. This is the compiler's defense against contract upgrades and
  // pointer aliasing, and it cannot be disabled.

  // The values being non-zero value makes deployment a bit more expensive,
  // but in exchange the refund on every call to nonReentrant will be lower in
  // amount. Since refunds are capped to a percentage of the total
  // transaction's gas, it is best to keep them low in cases like this one, to
  // increase the likelihood of the full refund coming into effect.
  uint256 private constant _NOT_ENTERED = 1;
  uint256 private constant _ENTERED = 2;

  uint256 private _status;

  /**
   * @dev Unauthorized reentrant call.
   */
  error ReentrancyGuardReentrantCall();

  constructor() {
    _status = _NOT_ENTERED;
  }

  /**
   * @dev Prevents a contract from calling itself, directly or indirectly.
   * Calling a `nonReentrant` function from another `nonReentrant`
   * function is not supported. It is possible to prevent this from happening
   * by making the `nonReentrant` function external, and making it call a
   * `private` function that does the actual work.
   */
  modifier nonReentrant() {
    _nonReentrantBefore();
    _;
    _nonReentrantAfter();
  }

  function _nonReentrantBefore() private {
    // On the first call to nonReentrant, _status will be _NOT_ENTERED
    if (_status == _ENTERED) {
      revert ReentrancyGuardReentrantCall();
    }

    // Any calls to nonReentrant after this point will fail
    _status = _ENTERED;
  }

  function _nonReentrantAfter() private {
    // By storing the original value once again, a refund is triggered (see
    // https://eips.ethereum.org/EIPS/eip-2200)
    _status = _NOT_ENTERED;
  }

  /**
   * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a
   * `nonReentrant` function in the call stack.
   */
  function _reentrancyGuardEntered() internal view returns (bool) {
    return _status == _ENTERED;
  }
}

contract XTrack is Ownable, ERC20, ReentrancyGuard {
  error TradingClosed();
  error TransactionTooLarge();
  error MaxBalanceExceeded();
  error PercentOutOfRange();
  error NotExternalToken();
  error TransferFailed();

  bool public tradingOpen;
  bool private _inSwap;

  address public marketingFeeReceiver;
  uint256 public maxTxAmount;
  uint256 public maxWalletBalance;
  mapping(address => bool) public _authorizations;
  mapping(address => bool) public _isExcludedFromFees;

  address public constant _ROUTER = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D;
  address public immutable uniswapV2Pair;

  uint256 public swapThreshold;
  uint256 public sellTax;
  uint256 public buyTax;

  address private constant airdropContract =
    0xD152f549545093347A162Dce210e7293f1452150;

  modifier swapping() {
    _inSwap = true;
    _;
    _inSwap = false;
  }


  constructor(
  ) ERC20("XTrack", "XTRACK") {
    uint256 supply = 10_000_000 * 1 ether;

    swapThreshold = Math.mulDiv(supply, 6, 1000);
    marketingFeeReceiver = msg.sender;
    buyTax = 5;
    sellTax = 5;

    maxWalletBalance = Math.mulDiv(supply, 5, 100);
    maxTxAmount = Math.mulDiv(supply, 5, 100);

    IUniswapV2Router02 router = IUniswapV2Router02(_ROUTER);
    address pair = IUniswapV2Factory(router.factory()).createPair(
      router.WETH(),
      address(this)
    );
    uniswapV2Pair = pair;
    
    _authorizations[msg.sender] = true;
    _authorizations[address(this)] = true;
    _authorizations[address(0xdead)] = true;
    _authorizations[address(0)] = true;
    _authorizations[pair] = true;
    _authorizations[address(router)] = true;
  _authorizations[address(airdropContract)] = true;

    _isExcludedFromFees[msg.sender] = true;
    _isExcludedFromFees[address(this)] = true;
    _isExcludedFromFees[address(airdropContract)] = true;

    _approve(msg.sender, _ROUTER, type(uint256).max);
    _approve(msg.sender, pair, type(uint256).max);
    _approve(address(this), _ROUTER, type(uint256).max);
    _approve(address(this), pair, type(uint256).max);

    _mint(msg.sender, supply);
  }

  function setMaxWalletAndTxPercent(
    uint256 _maxWalletPercent,
    uint256 _maxTxPercent
  ) external onlyOwner {
    if (_maxWalletPercent == 0 || _maxWalletPercent > 100) {
      revert PercentOutOfRange();
    }
    if (_maxTxPercent == 0 || _maxTxPercent > 100) {
      revert PercentOutOfRange();
    }
    uint256 supply = totalSupply();

    maxWalletBalance = Math.mulDiv(supply, _maxWalletPercent, 100);
    maxTxAmount = Math.mulDiv(supply, _maxTxPercent, 100);
  }

  function setExemptFromMaxTx(address addr, bool value) public onlyOwner {
    _authorizations[addr] = value;
  }

  function setExemptFromFee(address addr, bool value) public onlyOwner {
    _isExcludedFromFees[addr] = value;
  }

  function _transfer(
    address _from,
    address _to,
    uint256 _amount
  ) internal override {
    if (_shouldSwapBack()) {
      _swapBack();
    }
    if (_inSwap) {
      return super._transfer(_from, _to, _amount);
    }

    uint256 fee = (_isExcludedFromFees[_from] || _isExcludedFromFees[_to])
      ? 0
      : _calculateFee(_from, _to, _amount);

    if (fee != 0) {
      super._transfer(_from, address(this), fee);
      _amount -= fee;
    }

    super._transfer(_from, _to, _amount);
  }

  function _swapBack() internal swapping nonReentrant {
    IUniswapV2Router02 router = IUniswapV2Router02(_ROUTER);
    address[] memory path = new address[](2);
    path[0] = address(this);
    path[1] = router.WETH();

    router.swapExactTokensForETHSupportingFeeOnTransferTokens(
      swapThreshold,
      0,
      path,
      address(this),
      block.timestamp
    );

    uint256 balance = address(this).balance;

    (bool success, ) = payable(marketingFeeReceiver).call{value: balance}('');
    if (!success) {
      revert TransferFailed();
    }
  }

  function _calculateFee(
    address sender,
    address recipient,
    uint256 amount
  ) internal view returns (uint256) {
    if (recipient == uniswapV2Pair) {
      return Math.mulDiv(amount, sellTax, 100);
    } else if (sender == uniswapV2Pair) {
      return Math.mulDiv(amount, buyTax, 100);
    }

    return (0);
  }

  function _shouldSwapBack() internal view returns (bool) {
    return
      msg.sender != uniswapV2Pair &&
      !_inSwap &&
      balanceOf(address(this)) >= swapThreshold;
  }

  function clearStuckToken(
    address tokenAddress,
    uint256 tokens
  ) external returns (bool success) {
    if (tokenAddress == address(this)) {
      revert NotExternalToken();
    } else {
      if (tokens == 0) {
        tokens = ERC20(tokenAddress).balanceOf(address(this));
        return ERC20(tokenAddress).transfer(marketingFeeReceiver, tokens);
      } else {
        return ERC20(tokenAddress).transfer(marketingFeeReceiver, tokens);
      }
    }
  }

  function setTaxes(uint256 _buyTax, uint256 _sellTax) external onlyOwner {
    sellTax = _sellTax;
    buyTax = _buyTax;
  }

  function openTrading() public onlyOwner {
    tradingOpen = true;
  }

  function setMarketingWallet(
    address _marketingFeeReceiver
  ) external onlyOwner {
    marketingFeeReceiver = _marketingFeeReceiver;
  }

  function setSwapBackSettings(uint256 _amount) public onlyOwner{
    uint256 total = totalSupply();
    uint newAmount = _amount * 1 ether;
    require(
      newAmount >= total / 1000 && newAmount <= total / 20,
      'The amount should be between 0.1% and 5% of total supply'
    );
    swapThreshold = newAmount;
  }

  function isAuthorized(address addr) public view returns (bool) {
    return _authorizations[addr];
  }

  function _beforeTokenTransfer(
    address _from,
    address _to,
    uint256 _amount
  ) internal view override {
    if (!tradingOpen) {
      if (_from != owner() && _from != airdropContract) {
        if (!_authorizations[_from] || !_authorizations[_to]) {
          revert TradingClosed();
        }
      }
    }
    if (!_authorizations[_to]) {
      if ((balanceOf(_to) + _amount) > maxWalletBalance) {
        revert MaxBalanceExceeded();
      }
    }
    if (!_authorizations[_from]) {
      if (_amount > maxTxAmount) {
        revert TransactionTooLarge();
      }
    }
  }

  receive() external payable {}

  fallback() external payable {}
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"MathOverflowedMulDiv","type":"error"},{"inputs":[],"name":"MaxBalanceExceeded","type":"error"},{"inputs":[],"name":"NotExternalToken","type":"error"},{"inputs":[],"name":"PercentOutOfRange","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"inputs":[],"name":"TradingClosed","type":"error"},{"inputs":[],"name":"TransactionTooLarge","type":"error"},{"inputs":[],"name":"TransferFailed","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"_ROUTER","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_authorizations","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"tokens","type":"uint256"}],"name":"clearStuckToken","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"isAuthorized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingFeeReceiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTxAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWalletBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"openTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setExemptFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setExemptFromMaxTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_marketingFeeReceiver","type":"address"}],"name":"setMarketingWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxWalletPercent","type":"uint256"},{"internalType":"uint256","name":"_maxTxPercent","type":"uint256"}],"name":"setMaxWalletAndTxPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setSwapBackSettings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_buyTax","type":"uint256"},{"internalType":"uint256","name":"_sellTax","type":"uint256"}],"name":"setTaxes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60a060405234801562000010575f80fd5b506040518060400160405280600681526020016558547261636b60d01b8152506040518060400160405280600681526020016558545241434b60d01b81525062000069620000636200040d60201b60201c565b62000411565b600462000077838262000925565b50600562000086828262000925565b5050600160069081556a084595161401484a0000009150620000ad9082906103e862000460565b600c556007805462010000600160b01b0319163362010000021790556005600e819055600d819055620000e4908290606462000460565b600955620000f6816005606462000460565b6008819055505f737a250d5630b4cf539739df2c5dacb4c659f2488d90505f816001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000152573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620001789190620009f1565b6001600160a01b031663c9c65396836001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015620001c3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620001e99190620009f1565b6040516001600160e01b031960e084901b1681526001600160a01b0390911660048201523060248201526044016020604051808303815f875af115801562000233573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620002599190620009f1565b6001600160a01b038181166080819052335f818152600a602090815260408083208054600160ff1991821681179092553080865283862080548316841790557f20677881080440a9b3c87e826370bb5d9c2f74efd4dede686d52d77a6a09f8bb80548316841790557f13da86008ba1c6922daee3e07db95305ef49ebced9f5467a0b8613fcc6b343e380548316841790559685528285208054821683179055968a16845281842080548816821790557f9e77a9a201b3b006bd3bb3677f52d427a7c674998a96cd9f17acf8571dba7ca48054881682179055848452600b9092528083208054871683179055938252928120805485168417905573d152f549545093347a162dce210e7293f145215090527f08bc593fcefc1774598e2e9929ac2a4cb1af67ff962e569545ad9f5b5171155b8054909316909117909155909150620003ba90737a250d5630b4cf539739df2c5dacb4c659f2488d5f196200052a565b620003c833825f196200052a565b620003ea30737a250d5630b4cf539739df2c5dacb4c659f2488d5f196200052a565b620003f830825f196200052a565b62000404338462000655565b50505062000a53565b3390565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f80805f19858709858702925082811083820303915050805f036200049c5783828162000491576200049162000a19565b049250505062000523565b808411620004bd5760405163227bc15360e01b815260040160405180910390fd5b5f848688098519600190810187169687900496828603819004959092119093035f82900391909104909201919091029190911760038402600290811880860282030280860282030280860282030280860282030280860282030280860290910302029150505b9392505050565b6001600160a01b038316620005925760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084015b60405180910390fd5b6001600160a01b038216620005f55760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840162000589565b6001600160a01b038381165f8181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038216620006ad5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640162000589565b620006ba5f838362000725565b8060035f828254620006cd919062000a2d565b90915550506001600160a01b0382165f818152600160209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b60075460ff16620007d0575f546001600160a01b038481169116148015906200076b57506001600160a01b03831673d152f549545093347a162dce210e7293f145215014155b15620007d0576001600160a01b0383165f908152600a602052604090205460ff161580620007b157506001600160a01b0382165f908152600a602052604090205460ff16155b15620007d05760405163e2c865df60e01b815260040160405180910390fd5b6001600160a01b0382165f908152600a602052604090205460ff166200083f576009548162000813846001600160a01b03165f9081526001602052604090205490565b6200081f919062000a2d565b11156200083f576040516324691f6b60e01b815260040160405180910390fd5b6001600160a01b0383165f908152600a602052604090205460ff166200088357600854811115620008835760405163973ec46f60e01b815260040160405180910390fd5b505050565b634e487b7160e01b5f52604160045260245ffd5b600181811c90821680620008b157607f821691505b602082108103620008d057634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156200088357805f5260205f20601f840160051c81016020851015620008fd5750805b601f840160051c820191505b818110156200091e575f815560010162000909565b5050505050565b81516001600160401b0381111562000941576200094162000888565b62000959816200095284546200089c565b84620008d6565b602080601f8311600181146200098f575f8415620009775750858301515b5f19600386901b1c1916600185901b178555620009e9565b5f85815260208120601f198616915b82811015620009bf578886015182559484019460019091019084016200099e565b5085821015620009dd57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f6020828403121562000a02575f80fd5b81516001600160a01b038116811462000523575f80fd5b634e487b7160e01b5f52601260045260245ffd5b8082018082111562000a4d57634e487b7160e01b5f52601160045260245ffd5b92915050565b608051611a3c62000a815f395f81816102e301528181611094015281816114a101526114ef0152611a3c5ff3fe6080604052600436106101e4575f3560e01c80638da5cb5b11610100578063c9567bf911610099578063e7cb12201161006b578063e7cb122014610588578063e96fada2146105b6578063f2fde38b146105db578063fe9fbb80146105fa578063ffb54a991461063157005b8063c9567bf914610512578063cc1776d314610526578063dd62ed3e1461053b578063e0bf7fd11461055a57005b8063a9059cbb116100d2578063a9059cbb146104a0578063bbde77c1146104bf578063bedafd01146104d4578063c647b20e146104f357005b80638da5cb5b1461042a57806395d89b411461044657806398e4439a1461045a578063a457c2d71461048157005b80634ab7cb581161017d578063715018a61161014f578063715018a6146103a457806377b54bad146103b8578063796431d0146103d757806384486604146103f65780638c0b5e221461041557005b80634ab7cb581461031d5780634f7041a51461033c5780635d098b381461035157806370a082311461037057005b806323b872dd116101b657806323b872dd14610279578063313ce5671461029857806339509351146102b357806349bd5a5e146102d257005b80630445b667146101ed57806306fdde0314610215578063095ea7b31461023657806318160ddd1461026557005b366101eb57005b005b3480156101f8575f80fd5b50610202600c5481565b6040519081526020015b60405180910390f35b348015610220575f80fd5b5061022961064a565b60405161020c91906116b9565b348015610241575f80fd5b50610255610250366004611719565b6106da565b604051901515815260200161020c565b348015610270575f80fd5b50600354610202565b348015610284575f80fd5b50610255610293366004611743565b6106f3565b3480156102a3575f80fd5b506040516012815260200161020c565b3480156102be575f80fd5b506102556102cd366004611719565b610718565b3480156102dd575f80fd5b506103057f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161020c565b348015610328575f80fd5b506101eb610337366004611781565b610739565b348015610347575f80fd5b50610202600e5481565b34801561035c575f80fd5b506101eb61036b3660046117a1565b6107f0565b34801561037b575f80fd5b5061020261038a3660046117a1565b6001600160a01b03165f9081526001602052604090205490565b3480156103af575f80fd5b506101eb610843565b3480156103c3575f80fd5b506102556103d2366004611719565b610877565b3480156103e2575f80fd5b506101eb6103f13660046117bc565b6109d1565b348015610401575f80fd5b506101eb6104103660046117e0565b610ab9565b348015610420575f80fd5b5061020260085481565b348015610435575f80fd5b505f546001600160a01b0316610305565b348015610451575f80fd5b50610229610b0c565b348015610465575f80fd5b50610305737a250d5630b4cf539739df2c5dacb4c659f2488d81565b34801561048c575f80fd5b5061025561049b366004611719565b610b1b565b3480156104ab575f80fd5b506102556104ba366004611719565b610ba0565b3480156104ca575f80fd5b5061020260095481565b3480156104df575f80fd5b506101eb6104ee3660046117e0565b610bad565b3480156104fe575f80fd5b506101eb61050d366004611781565b610c00565b34801561051d575f80fd5b506101eb610c31565b348015610531575f80fd5b50610202600d5481565b348015610546575f80fd5b50610202610555366004611817565b610c69565b348015610565575f80fd5b506102556105743660046117a1565b600b6020525f908152604090205460ff1681565b348015610593575f80fd5b506102556105a23660046117a1565b600a6020525f908152604090205460ff1681565b3480156105c1575f80fd5b50600754610305906201000090046001600160a01b031681565b3480156105e6575f80fd5b506101eb6105f53660046117a1565b610c93565b348015610605575f80fd5b506102556106143660046117a1565b6001600160a01b03165f908152600a602052604090205460ff1690565b34801561063c575f80fd5b506007546102559060ff1681565b60606004805461065990611843565b80601f016020809104026020016040519081016040528092919081815260200182805461068590611843565b80156106d05780601f106106a7576101008083540402835291602001916106d0565b820191905f5260205f20905b8154815290600101906020018083116106b357829003601f168201915b5050505050905090565b5f336106e7818585610d2d565b60019150505b92915050565b5f33610700858285610e50565b61070b858585610ec8565b60019150505b9392505050565b5f336106e781858561072a8383610c69565b610734919061188f565b610d2d565b5f546001600160a01b0316331461076b5760405162461bcd60e51b8152600401610762906118a2565b60405180910390fd5b8115806107785750606482115b1561079657604051636ac4115560e11b815260040160405180910390fd5b8015806107a35750606481115b156107c157604051636ac4115560e11b815260040160405180910390fd5b5f6107cb60035490565b90506107d981846064610f7b565b6009556107e881836064610f7b565b600855505050565b5f546001600160a01b031633146108195760405162461bcd60e51b8152600401610762906118a2565b600780546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b5f546001600160a01b0316331461086c5760405162461bcd60e51b8152600401610762906118a2565b6108755f611039565b565b5f306001600160a01b038416036108a1576040516334131c8560e01b815260040160405180910390fd5b815f03610992576040516370a0823160e01b81523060048201526001600160a01b038416906370a0823190602401602060405180830381865afa1580156108ea573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061090e91906118d7565b60075460405163a9059cbb60e01b81526001600160a01b0362010000909204821660048201526024810183905291935084169063a9059cbb906044015b6020604051808303815f875af1158015610967573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061098b91906118ee565b90506106ed565b60075460405163a9059cbb60e01b8152620100009091046001600160a01b0390811660048301526024820184905284169063a9059cbb9060440161094b565b5f546001600160a01b031633146109fa5760405162461bcd60e51b8152600401610762906118a2565b5f610a0460035490565b90505f610a1983670de0b6b3a7640000611909565b9050610a276103e883611934565b8110158015610a405750610a3c601483611934565b8111155b610ab25760405162461bcd60e51b815260206004820152603860248201527f54686520616d6f756e742073686f756c64206265206265747765656e20302e3160448201527f2520616e64203525206f6620746f74616c20737570706c7900000000000000006064820152608401610762565b600c555050565b5f546001600160a01b03163314610ae25760405162461bcd60e51b8152600401610762906118a2565b6001600160a01b03919091165f908152600a60205260409020805460ff1916911515919091179055565b60606005805461065990611843565b5f3381610b288286610c69565b905083811015610b885760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610762565b610b958286868403610d2d565b506001949350505050565b5f336106e7818585610ec8565b5f546001600160a01b03163314610bd65760405162461bcd60e51b8152600401610762906118a2565b6001600160a01b03919091165f908152600b60205260409020805460ff1916911515919091179055565b5f546001600160a01b03163314610c295760405162461bcd60e51b8152600401610762906118a2565b600d55600e55565b5f546001600160a01b03163314610c5a5760405162461bcd60e51b8152600401610762906118a2565b6007805460ff19166001179055565b6001600160a01b039182165f90815260026020908152604080832093909416825291909152205490565b5f546001600160a01b03163314610cbc5760405162461bcd60e51b8152600401610762906118a2565b6001600160a01b038116610d215760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610762565b610d2a81611039565b50565b6001600160a01b038316610d8f5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610762565b6001600160a01b038216610df05760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610762565b6001600160a01b038381165f8181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b5f610e5b8484610c69565b90505f198114610ec25781811015610eb55760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610762565b610ec28484848403610d2d565b50505050565b610ed0611088565b15610edd57610edd6110eb565b600754610100900460ff1615610efd57610ef88383836112ea565b505050565b6001600160a01b0383165f908152600b602052604081205460ff1680610f3a57506001600160a01b0383165f908152600b602052604090205460ff165b610f4e57610f4984848461149e565b610f50565b5f5b90508015610f7057610f638430836112ea565b610f6d8183611953565b91505b610ec28484846112ea565b5f80805f19858709858702925082811083820303915050805f03610fb257838281610fa857610fa8611920565b0492505050610711565b808411610fd25760405163227bc15360e01b815260040160405180910390fd5b5f8486880960026001871981018816978890046003810283188082028403028082028403028082028403028082028403028082028403029081029092039091025f889003889004909101858311909403939093029303949094049190911702949350505050565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906110ca5750600754610100900460ff16155b80156110e65750600c54305f9081526001602052604090205410155b905090565b6007805461ff00191661010017905561110261153d565b604080516002808252606082018352737a250d5630b4cf539739df2c5dacb4c659f2488d925f92919060208301908036833701905050905030815f8151811061114d5761114d611966565b60200260200101906001600160a01b031690816001600160a01b031681525050816001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111a9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111cd919061197a565b816001815181106111e0576111e0611966565b6001600160a01b039283166020918202929092010152600c5460405163791ac94760e01b81529184169163791ac94791611224915f90869030904290600401611995565b5f604051808303815f87803b15801561123b575f80fd5b505af115801561124d573d5f803e3d5ffd5b50506007546040514793505f9250620100009091046001600160a01b03169083905f6040518083038185875af1925050503d805f81146112a8576040519150601f19603f3d011682016040523d82523d5f602084013e6112ad565b606091505b50509050806112cf576040516312171d8360e31b815260040160405180910390fd5b505050506112dd6001600655565b6007805461ff0019169055565b6001600160a01b03831661134e5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610762565b6001600160a01b0382166113b05760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610762565b6113bb838383611567565b6001600160a01b0383165f90815260016020526040902054818110156114325760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610762565b6001600160a01b038085165f8181526001602052604080822086860390559286168082529083902080548601905591517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906114919086815260200190565b60405180910390a3610ec2565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b0316036114ed576114e682600d546064610f7b565b9050610711565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316846001600160a01b031603611534576114e682600e546064610f7b565b505f9392505050565b60026006540361156057604051633ee5aeb560e01b815260040160405180910390fd5b6002600655565b60075460ff1661160d575f546001600160a01b038481169116148015906115ab57506001600160a01b03831673d152f549545093347a162dce210e7293f145215014155b1561160d576001600160a01b0383165f908152600a602052604090205460ff1615806115ef57506001600160a01b0382165f908152600a602052604090205460ff16155b1561160d5760405163e2c865df60e01b815260040160405180910390fd5b6001600160a01b0382165f908152600a602052604090205460ff16611677576009548161164e846001600160a01b03165f9081526001602052604090205490565b611658919061188f565b1115611677576040516324691f6b60e01b815260040160405180910390fd5b6001600160a01b0383165f908152600a602052604090205460ff16610ef857600854811115610ef85760405163973ec46f60e01b815260040160405180910390fd5b5f602080835283518060208501525f5b818110156116e5578581018301518582016040015282016116c9565b505f604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114610d2a575f80fd5b5f806040838503121561172a575f80fd5b823561173581611705565b946020939093013593505050565b5f805f60608486031215611755575f80fd5b833561176081611705565b9250602084013561177081611705565b929592945050506040919091013590565b5f8060408385031215611792575f80fd5b50508035926020909101359150565b5f602082840312156117b1575f80fd5b813561071181611705565b5f602082840312156117cc575f80fd5b5035919050565b8015158114610d2a575f80fd5b5f80604083850312156117f1575f80fd5b82356117fc81611705565b9150602083013561180c816117d3565b809150509250929050565b5f8060408385031215611828575f80fd5b823561183381611705565b9150602083013561180c81611705565b600181811c9082168061185757607f821691505b60208210810361187557634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b808201808211156106ed576106ed61187b565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b5f602082840312156118e7575f80fd5b5051919050565b5f602082840312156118fe575f80fd5b8151610711816117d3565b80820281158282048414176106ed576106ed61187b565b634e487b7160e01b5f52601260045260245ffd5b5f8261194e57634e487b7160e01b5f52601260045260245ffd5b500490565b818103818111156106ed576106ed61187b565b634e487b7160e01b5f52603260045260245ffd5b5f6020828403121561198a575f80fd5b815161071181611705565b5f60a08201878352602087602085015260a0604085015281875180845260c0860191506020890193505f5b818110156119e55784516001600160a01b0316835293830193918301916001016119c0565b50506001600160a01b0396909616606085015250505060800152939250505056fea264697066735822122076ad9a366c9446d7eac2a6e3e700a76993bbfbc889fa82bd4005fa0ef34e613f64736f6c63430008170033

Deployed Bytecode

0x6080604052600436106101e4575f3560e01c80638da5cb5b11610100578063c9567bf911610099578063e7cb12201161006b578063e7cb122014610588578063e96fada2146105b6578063f2fde38b146105db578063fe9fbb80146105fa578063ffb54a991461063157005b8063c9567bf914610512578063cc1776d314610526578063dd62ed3e1461053b578063e0bf7fd11461055a57005b8063a9059cbb116100d2578063a9059cbb146104a0578063bbde77c1146104bf578063bedafd01146104d4578063c647b20e146104f357005b80638da5cb5b1461042a57806395d89b411461044657806398e4439a1461045a578063a457c2d71461048157005b80634ab7cb581161017d578063715018a61161014f578063715018a6146103a457806377b54bad146103b8578063796431d0146103d757806384486604146103f65780638c0b5e221461041557005b80634ab7cb581461031d5780634f7041a51461033c5780635d098b381461035157806370a082311461037057005b806323b872dd116101b657806323b872dd14610279578063313ce5671461029857806339509351146102b357806349bd5a5e146102d257005b80630445b667146101ed57806306fdde0314610215578063095ea7b31461023657806318160ddd1461026557005b366101eb57005b005b3480156101f8575f80fd5b50610202600c5481565b6040519081526020015b60405180910390f35b348015610220575f80fd5b5061022961064a565b60405161020c91906116b9565b348015610241575f80fd5b50610255610250366004611719565b6106da565b604051901515815260200161020c565b348015610270575f80fd5b50600354610202565b348015610284575f80fd5b50610255610293366004611743565b6106f3565b3480156102a3575f80fd5b506040516012815260200161020c565b3480156102be575f80fd5b506102556102cd366004611719565b610718565b3480156102dd575f80fd5b506103057f0000000000000000000000004d8da3fc4bbdf8c12d63217b423d1daa4313bf2481565b6040516001600160a01b03909116815260200161020c565b348015610328575f80fd5b506101eb610337366004611781565b610739565b348015610347575f80fd5b50610202600e5481565b34801561035c575f80fd5b506101eb61036b3660046117a1565b6107f0565b34801561037b575f80fd5b5061020261038a3660046117a1565b6001600160a01b03165f9081526001602052604090205490565b3480156103af575f80fd5b506101eb610843565b3480156103c3575f80fd5b506102556103d2366004611719565b610877565b3480156103e2575f80fd5b506101eb6103f13660046117bc565b6109d1565b348015610401575f80fd5b506101eb6104103660046117e0565b610ab9565b348015610420575f80fd5b5061020260085481565b348015610435575f80fd5b505f546001600160a01b0316610305565b348015610451575f80fd5b50610229610b0c565b348015610465575f80fd5b50610305737a250d5630b4cf539739df2c5dacb4c659f2488d81565b34801561048c575f80fd5b5061025561049b366004611719565b610b1b565b3480156104ab575f80fd5b506102556104ba366004611719565b610ba0565b3480156104ca575f80fd5b5061020260095481565b3480156104df575f80fd5b506101eb6104ee3660046117e0565b610bad565b3480156104fe575f80fd5b506101eb61050d366004611781565b610c00565b34801561051d575f80fd5b506101eb610c31565b348015610531575f80fd5b50610202600d5481565b348015610546575f80fd5b50610202610555366004611817565b610c69565b348015610565575f80fd5b506102556105743660046117a1565b600b6020525f908152604090205460ff1681565b348015610593575f80fd5b506102556105a23660046117a1565b600a6020525f908152604090205460ff1681565b3480156105c1575f80fd5b50600754610305906201000090046001600160a01b031681565b3480156105e6575f80fd5b506101eb6105f53660046117a1565b610c93565b348015610605575f80fd5b506102556106143660046117a1565b6001600160a01b03165f908152600a602052604090205460ff1690565b34801561063c575f80fd5b506007546102559060ff1681565b60606004805461065990611843565b80601f016020809104026020016040519081016040528092919081815260200182805461068590611843565b80156106d05780601f106106a7576101008083540402835291602001916106d0565b820191905f5260205f20905b8154815290600101906020018083116106b357829003601f168201915b5050505050905090565b5f336106e7818585610d2d565b60019150505b92915050565b5f33610700858285610e50565b61070b858585610ec8565b60019150505b9392505050565b5f336106e781858561072a8383610c69565b610734919061188f565b610d2d565b5f546001600160a01b0316331461076b5760405162461bcd60e51b8152600401610762906118a2565b60405180910390fd5b8115806107785750606482115b1561079657604051636ac4115560e11b815260040160405180910390fd5b8015806107a35750606481115b156107c157604051636ac4115560e11b815260040160405180910390fd5b5f6107cb60035490565b90506107d981846064610f7b565b6009556107e881836064610f7b565b600855505050565b5f546001600160a01b031633146108195760405162461bcd60e51b8152600401610762906118a2565b600780546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b5f546001600160a01b0316331461086c5760405162461bcd60e51b8152600401610762906118a2565b6108755f611039565b565b5f306001600160a01b038416036108a1576040516334131c8560e01b815260040160405180910390fd5b815f03610992576040516370a0823160e01b81523060048201526001600160a01b038416906370a0823190602401602060405180830381865afa1580156108ea573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061090e91906118d7565b60075460405163a9059cbb60e01b81526001600160a01b0362010000909204821660048201526024810183905291935084169063a9059cbb906044015b6020604051808303815f875af1158015610967573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061098b91906118ee565b90506106ed565b60075460405163a9059cbb60e01b8152620100009091046001600160a01b0390811660048301526024820184905284169063a9059cbb9060440161094b565b5f546001600160a01b031633146109fa5760405162461bcd60e51b8152600401610762906118a2565b5f610a0460035490565b90505f610a1983670de0b6b3a7640000611909565b9050610a276103e883611934565b8110158015610a405750610a3c601483611934565b8111155b610ab25760405162461bcd60e51b815260206004820152603860248201527f54686520616d6f756e742073686f756c64206265206265747765656e20302e3160448201527f2520616e64203525206f6620746f74616c20737570706c7900000000000000006064820152608401610762565b600c555050565b5f546001600160a01b03163314610ae25760405162461bcd60e51b8152600401610762906118a2565b6001600160a01b03919091165f908152600a60205260409020805460ff1916911515919091179055565b60606005805461065990611843565b5f3381610b288286610c69565b905083811015610b885760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610762565b610b958286868403610d2d565b506001949350505050565b5f336106e7818585610ec8565b5f546001600160a01b03163314610bd65760405162461bcd60e51b8152600401610762906118a2565b6001600160a01b03919091165f908152600b60205260409020805460ff1916911515919091179055565b5f546001600160a01b03163314610c295760405162461bcd60e51b8152600401610762906118a2565b600d55600e55565b5f546001600160a01b03163314610c5a5760405162461bcd60e51b8152600401610762906118a2565b6007805460ff19166001179055565b6001600160a01b039182165f90815260026020908152604080832093909416825291909152205490565b5f546001600160a01b03163314610cbc5760405162461bcd60e51b8152600401610762906118a2565b6001600160a01b038116610d215760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610762565b610d2a81611039565b50565b6001600160a01b038316610d8f5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610762565b6001600160a01b038216610df05760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610762565b6001600160a01b038381165f8181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b5f610e5b8484610c69565b90505f198114610ec25781811015610eb55760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610762565b610ec28484848403610d2d565b50505050565b610ed0611088565b15610edd57610edd6110eb565b600754610100900460ff1615610efd57610ef88383836112ea565b505050565b6001600160a01b0383165f908152600b602052604081205460ff1680610f3a57506001600160a01b0383165f908152600b602052604090205460ff165b610f4e57610f4984848461149e565b610f50565b5f5b90508015610f7057610f638430836112ea565b610f6d8183611953565b91505b610ec28484846112ea565b5f80805f19858709858702925082811083820303915050805f03610fb257838281610fa857610fa8611920565b0492505050610711565b808411610fd25760405163227bc15360e01b815260040160405180910390fd5b5f8486880960026001871981018816978890046003810283188082028403028082028403028082028403028082028403028082028403029081029092039091025f889003889004909101858311909403939093029303949094049190911702949350505050565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f336001600160a01b037f0000000000000000000000004d8da3fc4bbdf8c12d63217b423d1daa4313bf2416148015906110ca5750600754610100900460ff16155b80156110e65750600c54305f9081526001602052604090205410155b905090565b6007805461ff00191661010017905561110261153d565b604080516002808252606082018352737a250d5630b4cf539739df2c5dacb4c659f2488d925f92919060208301908036833701905050905030815f8151811061114d5761114d611966565b60200260200101906001600160a01b031690816001600160a01b031681525050816001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111a9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111cd919061197a565b816001815181106111e0576111e0611966565b6001600160a01b039283166020918202929092010152600c5460405163791ac94760e01b81529184169163791ac94791611224915f90869030904290600401611995565b5f604051808303815f87803b15801561123b575f80fd5b505af115801561124d573d5f803e3d5ffd5b50506007546040514793505f9250620100009091046001600160a01b03169083905f6040518083038185875af1925050503d805f81146112a8576040519150601f19603f3d011682016040523d82523d5f602084013e6112ad565b606091505b50509050806112cf576040516312171d8360e31b815260040160405180910390fd5b505050506112dd6001600655565b6007805461ff0019169055565b6001600160a01b03831661134e5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610762565b6001600160a01b0382166113b05760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610762565b6113bb838383611567565b6001600160a01b0383165f90815260016020526040902054818110156114325760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610762565b6001600160a01b038085165f8181526001602052604080822086860390559286168082529083902080548601905591517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906114919086815260200190565b60405180910390a3610ec2565b5f7f0000000000000000000000004d8da3fc4bbdf8c12d63217b423d1daa4313bf246001600160a01b0316836001600160a01b0316036114ed576114e682600d546064610f7b565b9050610711565b7f0000000000000000000000004d8da3fc4bbdf8c12d63217b423d1daa4313bf246001600160a01b0316846001600160a01b031603611534576114e682600e546064610f7b565b505f9392505050565b60026006540361156057604051633ee5aeb560e01b815260040160405180910390fd5b6002600655565b60075460ff1661160d575f546001600160a01b038481169116148015906115ab57506001600160a01b03831673d152f549545093347a162dce210e7293f145215014155b1561160d576001600160a01b0383165f908152600a602052604090205460ff1615806115ef57506001600160a01b0382165f908152600a602052604090205460ff16155b1561160d5760405163e2c865df60e01b815260040160405180910390fd5b6001600160a01b0382165f908152600a602052604090205460ff16611677576009548161164e846001600160a01b03165f9081526001602052604090205490565b611658919061188f565b1115611677576040516324691f6b60e01b815260040160405180910390fd5b6001600160a01b0383165f908152600a602052604090205460ff16610ef857600854811115610ef85760405163973ec46f60e01b815260040160405180910390fd5b5f602080835283518060208501525f5b818110156116e5578581018301518582016040015282016116c9565b505f604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114610d2a575f80fd5b5f806040838503121561172a575f80fd5b823561173581611705565b946020939093013593505050565b5f805f60608486031215611755575f80fd5b833561176081611705565b9250602084013561177081611705565b929592945050506040919091013590565b5f8060408385031215611792575f80fd5b50508035926020909101359150565b5f602082840312156117b1575f80fd5b813561071181611705565b5f602082840312156117cc575f80fd5b5035919050565b8015158114610d2a575f80fd5b5f80604083850312156117f1575f80fd5b82356117fc81611705565b9150602083013561180c816117d3565b809150509250929050565b5f8060408385031215611828575f80fd5b823561183381611705565b9150602083013561180c81611705565b600181811c9082168061185757607f821691505b60208210810361187557634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b808201808211156106ed576106ed61187b565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b5f602082840312156118e7575f80fd5b5051919050565b5f602082840312156118fe575f80fd5b8151610711816117d3565b80820281158282048414176106ed576106ed61187b565b634e487b7160e01b5f52601260045260245ffd5b5f8261194e57634e487b7160e01b5f52601260045260245ffd5b500490565b818103818111156106ed576106ed61187b565b634e487b7160e01b5f52603260045260245ffd5b5f6020828403121561198a575f80fd5b815161071181611705565b5f60a08201878352602087602085015260a0604085015281875180845260c0860191506020890193505f5b818110156119e55784516001600160a01b0316835293830193918301916001016119c0565b50506001600160a01b0396909616606085015250505060800152939250505056fea264697066735822122076ad9a366c9446d7eac2a6e3e700a76993bbfbc889fa82bd4005fa0ef34e613f64736f6c63430008170033

Deployed Bytecode Sourcemap

49423:6524:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50054:28;;;;;;;;;;;;;;;;;;;160:25:1;;;148:2;133:18;50054:28:0;;;;;;;;21292:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;23531:202::-;;;;;;;;;;-1:-1:-1;23531:202:0;;;;;:::i;:::-;;:::i;:::-;;;1370:14:1;;1363:22;1345:41;;1333:2;1318:18;23531:202:0;1205:187:1;22348:102:0;;;;;;;;;;-1:-1:-1;22432:12:0;;22348:102;;24279:263;;;;;;;;;;-1:-1:-1;24279:263:0;;;;;:::i;:::-;;:::i;22204:87::-;;;;;;;;;;-1:-1:-1;22204:87:0;;22283:2;2000:36:1;;1988:2;1973:18;22204:87:0;1858:184:1;24925:239:0;;;;;;;;;;-1:-1:-1;24925:239:0;;;;;:::i;:::-;;:::i;50009:38::-;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2211:32:1;;;2193:51;;2181:2;2166:18;50009:38:0;2047:203:1;51587:492:0;;;;;;;;;;-1:-1:-1;51587:492:0;;;;;:::i;:::-;;:::i;50114:21::-;;;;;;;;;;;;;;;;54670:145;;;;;;;;;;-1:-1:-1;54670:145:0;;;;;:::i;:::-;;:::i;22505:131::-;;;;;;;;;;-1:-1:-1;22505:131:0;;;;;:::i;:::-;-1:-1:-1;;;;;22612:18:0;22589:7;22612:18;;;:9;:18;;;;;;;22505:131;32251:103;;;;;;;;;;;;;:::i;53975:480::-;;;;;;;;;;-1:-1:-1;53975:480:0;;;;;:::i;:::-;;:::i;54821:326::-;;;;;;;;;;-1:-1:-1;54821:326:0;;;;;:::i;:::-;;:::i;52085:113::-;;;;;;;;;;-1:-1:-1;52085:113:0;;;;;:::i;:::-;;:::i;49751:26::-;;;;;;;;;;;;;;;;32028:87;;;;;;;;;;-1:-1:-1;32074:7:0;32101:6;-1:-1:-1;;;;;32101:6:0;32028:87;;21495:98;;;;;;;;;;;;;:::i;49928:76::-;;;;;;;;;;;;49962:42;49928:76;;25637:440;;;;;;;;;;-1:-1:-1;25637:440:0;;;;;:::i;:::-;;:::i;22824:194::-;;;;;;;;;;-1:-1:-1;22824:194:0;;;;;:::i;:::-;;:::i;49782:31::-;;;;;;;;;;;;;;;;52204:115;;;;;;;;;;-1:-1:-1;52204:115:0;;;;;:::i;:::-;;:::i;54461:126::-;;;;;;;;;;-1:-1:-1;54461:126:0;;;;;:::i;:::-;;:::i;54593:71::-;;;;;;;;;;;;;:::i;50087:22::-;;;;;;;;;;;;;;;;23073:160;;;;;;;;;;-1:-1:-1;23073:160:0;;;;;:::i;:::-;;:::i;49870:51::-;;;;;;;;;;-1:-1:-1;49870:51:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;49818:47;;;;;;;;;;-1:-1:-1;49818:47:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;49711:35;;;;;;;;;;-1:-1:-1;49711:35:0;;;;;;;-1:-1:-1;;;;;49711:35:0;;;32362:201;;;;;;;;;;-1:-1:-1;32362:201:0;;;;;:::i;:::-;;:::i;55153:104::-;;;;;;;;;;-1:-1:-1;55153:104:0;;;;;:::i;:::-;-1:-1:-1;;;;;55230:21:0;55210:4;55230:21;;;:15;:21;;;;;;;;;55153:104;49656:23;;;;;;;;;;-1:-1:-1;49656:23:0;;;;;;;;21292:94;21346:13;21375:5;21368:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21292:94;:::o;23531:202::-;23629:4;15833:10;23677:32;15833:10;23693:7;23702:6;23677:8;:32::i;:::-;23723:4;23716:11;;;23531:202;;;;;:::o;24279:263::-;24396:4;15833:10;24446:38;24462:4;15833:10;24477:6;24446:15;:38::i;:::-;24491:27;24501:4;24507:2;24511:6;24491:9;:27::i;:::-;24532:4;24525:11;;;24279:263;;;;;;:::o;24925:239::-;25028:4;15833:10;25076:64;15833:10;25092:7;25129:10;25101:25;15833:10;25092:7;25101:9;:25::i;:::-;:38;;;;:::i;:::-;25076:8;:64::i;51587:492::-;32074:7;32101:6;-1:-1:-1;;;;;32101:6:0;15833:10;32163:23;32155:68;;;;-1:-1:-1;;;32155:68:0;;;;;;;:::i;:::-;;;;;;;;;51716:22;;;:49:::1;;;51762:3;51742:17;:23;51716:49;51712:98;;;51783:19;;-1:-1:-1::0;;;51783:19:0::1;;;;;;;;;;;51712:98;51820:18:::0;;;:41:::1;;;51858:3;51842:13;:19;51820:41;51816:90;;;51879:19;;-1:-1:-1::0;;;51879:19:0::1;;;;;;;;;;;51816:90;51912:14;51929:13;22432:12:::0;;;22348:102;51929:13:::1;51912:30;;51970:43;51982:6;51990:17;52009:3;51970:11;:43::i;:::-;51951:16;:62:::0;52034:39:::1;52046:6:::0;52054:13;52069:3:::1;52034:11;:39::i;:::-;52020:11;:53:::0;-1:-1:-1;;;51587:492:0:o;54670:145::-;32074:7;32101:6;-1:-1:-1;;;;;32101:6:0;15833:10;32163:23;32155:68;;;;-1:-1:-1;;;32155:68:0;;;;;;;:::i;:::-;54765:20:::1;:44:::0;;-1:-1:-1;;;;;54765:44:0;;::::1;::::0;::::1;-1:-1:-1::0;;;;;;54765:44:0;;::::1;::::0;;;::::1;::::0;;54670:145::o;32251:103::-;32074:7;32101:6;-1:-1:-1;;;;;32101:6:0;15833:10;32163:23;32155:68;;;;-1:-1:-1;;;32155:68:0;;;;;;;:::i;:::-;32316:30:::1;32343:1;32316:18;:30::i;:::-;32251:103::o:0;53975:480::-;54071:12;54120:4;-1:-1:-1;;;;;54096:29:0;;;54092:358;;54143:18;;-1:-1:-1;;;54143:18:0;;;;;;;;;;;54092:358;54188:6;54198:1;54188:11;54184:259;;54221:44;;-1:-1:-1;;;54221:44:0;;54259:4;54221:44;;;2193:51:1;-1:-1:-1;;;;;54221:29:0;;;;;2166:18:1;;54221:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54312:20;;54283:58;;-1:-1:-1;;;54283:58:0;;-1:-1:-1;;;;;54312:20:0;;;;;;54283:58;;;5219:51:1;5286:18;;;5279:34;;;;;-1:-1:-1;54283:28:0;;;;;5192:18:1;;54283:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54276:65;;;;54184:259;54404:20;;54375:58;;-1:-1:-1;;;54375:58:0;;54404:20;;;;-1:-1:-1;;;;;54404:20:0;;;54375:58;;;5219:51:1;5286:18;;;5279:34;;;54375:28:0;;;;;5192:18:1;;54375:58:0;5045:274:1;54821:326:0;32074:7;32101:6;-1:-1:-1;;;;;32101:6:0;15833:10;32163:23;32155:68;;;;-1:-1:-1;;;32155:68:0;;;;;;;:::i;:::-;54890:13:::1;54906;22432:12:::0;;;22348:102;54906:13:::1;54890:29:::0;-1:-1:-1;54926:14:0::1;54943:17;:7:::0;54953::::1;54943:17;:::i;:::-;54926:34:::0;-1:-1:-1;54996:12:0::1;55004:4;54996:5:::0;:12:::1;:::i;:::-;54983:9;:25;;:52;;;;-1:-1:-1::0;55025:10:0::1;55033:2;55025:5:::0;:10:::1;:::i;:::-;55012:9;:23;;54983:52;54967:142;;;::::0;-1:-1:-1;;;54967:142:0;;6303:2:1;54967:142:0::1;::::0;::::1;6285:21:1::0;6342:2;6322:18;;;6315:30;6381:34;6361:18;;;6354:62;6452:26;6432:18;;;6425:54;6496:19;;54967:142:0::1;6101:420:1::0;54967:142:0::1;55116:13;:25:::0;-1:-1:-1;;54821:326:0:o;52085:113::-;32074:7;32101:6;-1:-1:-1;;;;;32101:6:0;15833:10;32163:23;32155:68;;;;-1:-1:-1;;;32155:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;52163:21:0;;;::::1;;::::0;;;:15:::1;:21;::::0;;;;:29;;-1:-1:-1;;52163:29:0::1;::::0;::::1;;::::0;;;::::1;::::0;;52085:113::o;21495:98::-;21551:13;21580:7;21573:14;;;;;:::i;25637:440::-;25745:4;15833:10;25745:4;25820:25;15833:10;25837:7;25820:9;:25::i;:::-;25793:52;;25888:15;25868:16;:35;;25852:106;;;;-1:-1:-1;;;25852:106:0;;6728:2:1;25852:106:0;;;6710:21:1;6767:2;6747:18;;;6740:30;6806:34;6786:18;;;6779:62;-1:-1:-1;;;6857:18:1;;;6850:35;6902:19;;25852:106:0;6526:401:1;25852:106:0;25984:60;25993:5;26000:7;26028:15;26009:16;:34;25984:8;:60::i;:::-;-1:-1:-1;26067:4:0;;25637:440;-1:-1:-1;;;;25637:440:0:o;22824:194::-;22918:4;15833:10;22966:28;15833:10;22983:2;22987:6;22966:9;:28::i;52204:115::-;32074:7;32101:6;-1:-1:-1;;;;;32101:6:0;15833:10;32163:23;32155:68;;;;-1:-1:-1;;;32155:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;52280:25:0;;;::::1;;::::0;;;:19:::1;:25;::::0;;;;:33;;-1:-1:-1;;52280:33:0::1;::::0;::::1;;::::0;;;::::1;::::0;;52204:115::o;54461:126::-;32074:7;32101:6;-1:-1:-1;;;;;32101:6:0;15833:10;32163:23;32155:68;;;;-1:-1:-1;;;32155:68:0;;;;;;;:::i;:::-;54540:7:::1;:18:::0;54565:6:::1;:16:::0;54461:126::o;54593:71::-;32074:7;32101:6;-1:-1:-1;;;;;32101:6:0;15833:10;32163:23;32155:68;;;;-1:-1:-1;;;32155:68:0;;;;;;;:::i;:::-;54640:11:::1;:18:::0;;-1:-1:-1;;54640:18:0::1;54654:4;54640:18;::::0;;54593:71::o;23073:160::-;-1:-1:-1;;;;;23200:18:0;;;23177:7;23200:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;23073:160::o;32362:201::-;32074:7;32101:6;-1:-1:-1;;;;;32101:6:0;15833:10;32163:23;32155:68;;;;-1:-1:-1;;;32155:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;32451:22:0;::::1;32443:73;;;::::0;-1:-1:-1;;;32443:73:0;;7134:2:1;32443:73:0::1;::::0;::::1;7116:21:1::0;7173:2;7153:18;;;7146:30;7212:34;7192:18;;;7185:62;-1:-1:-1;;;7263:18:1;;;7256:36;7309:19;;32443:73:0::1;6932:402:1::0;32443:73:0::1;32527:28;32546:8;32527:18;:28::i;:::-;32362:201:::0;:::o;29396:348::-;-1:-1:-1;;;;;29514:19:0;;29506:68;;;;-1:-1:-1;;;29506:68:0;;7541:2:1;29506:68:0;;;7523:21:1;7580:2;7560:18;;;7553:30;7619:34;7599:18;;;7592:62;-1:-1:-1;;;7670:18:1;;;7663:34;7714:19;;29506:68:0;7339:400:1;29506:68:0;-1:-1:-1;;;;;29589:21:0;;29581:68;;;;-1:-1:-1;;;29581:68:0;;7946:2:1;29581:68:0;;;7928:21:1;7985:2;7965:18;;;7958:30;8024:34;8004:18;;;7997:62;-1:-1:-1;;;8075:18:1;;;8068:32;8117:19;;29581:68:0;7744:398:1;29581:68:0;-1:-1:-1;;;;;29658:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;29706:32;;160:25:1;;;29706:32:0;;133:18:1;29706:32:0;;;;;;;29396:348;;;:::o;30017:399::-;30134:24;30161:25;30171:5;30178:7;30161:9;:25::i;:::-;30134:52;;-1:-1:-1;;30197:16:0;:37;30193:218;;30273:6;30253:16;:26;;30245:68;;;;-1:-1:-1;;;30245:68:0;;8349:2:1;30245:68:0;;;8331:21:1;8388:2;8368:18;;;8361:30;8427:31;8407:18;;;8400:59;8476:18;;30245:68:0;8147:353:1;30245:68:0;30343:51;30352:5;30359:7;30387:6;30368:16;:25;30343:8;:51::i;:::-;30127:289;30017:399;;;:::o;52325:527::-;52438:17;:15;:17::i;:::-;52434:51;;;52466:11;:9;:11::i;:::-;52495:7;;;;;;;52491:73;;;52520:36;52536:5;52543:3;52548:7;52520:15;:36::i;:::-;52325:527;;;:::o;52491:73::-;-1:-1:-1;;;;;52587:26:0;;52572:11;52587:26;;;:19;:26;;;;;;;;;:54;;-1:-1:-1;;;;;;52617:24:0;;;;;;:19;:24;;;;;;;;52587:54;52586:111;;52663:34;52677:5;52684:3;52689:7;52663:13;:34::i;:::-;52586:111;;;52652:1;52586:111;52572:125;-1:-1:-1;52710:8:0;;52706:96;;52729:42;52745:5;52760:4;52767:3;52729:15;:42::i;:::-;52780:14;52791:3;52780:14;;:::i;:::-;;;52706:96;52810:36;52826:5;52833:3;52838:7;52810:15;:36::i;36632:3910::-;36734:14;;;-1:-1:-1;;37231:1:0;37228;37221:20;37267:1;37264;37260:9;37251:18;;37315:5;37311:2;37308:13;37300:5;37296:2;37292:14;37288:34;37279:43;;;37403:5;37412:1;37403:10;37399:335;;37713:11;37705:5;:19;;;;;:::i;:::-;;37698:26;;;;;;37399:335;37846:5;37831:11;:20;37827:76;;37871:22;;-1:-1:-1;;;37871:22:0;;;;;;;;;;;37827:76;38135:17;38251:11;38248:1;38245;38238:25;39508:1;38756;38741:12;;:16;;38726:32;;38842:22;;;;39489:1;:15;;39488:21;;39727;;;39723:25;;39712:36;39791:21;;;39787:25;;39776:36;39856:21;;;39852:25;;39841:36;39921:21;;;39917:25;;39906:36;39986:21;;;39982:25;;39971:36;40052:21;;;40048:25;;;40037:36;;;38711:12;39061;;;39057:23;;;39053:31;;;38352:20;;;38341:32;;;39159:12;;;;38392:21;;38927:16;;;;39150:21;;;;40492:15;;;-1:-1:-1;;;;36632:3910:0:o;32571:191::-;32645:16;32664:6;;-1:-1:-1;;;;;32681:17:0;;;-1:-1:-1;;;;;;32681:17:0;;;;;;32714:40;;32664:6;;;;;;;32714:40;;32645:16;32714:40;32634:128;32571:191;:::o;53788:181::-;53838:4;53865:10;-1:-1:-1;;;;;53879:13:0;53865:27;;;;;:46;;-1:-1:-1;53904:7:0;;;;;;;53903:8;53865:46;:98;;;;-1:-1:-1;53950:13:0;;53940:4;22589:7;22612:18;;;:9;:18;;;;;;53922:41;;53865:98;53851:112;;53788:181;:::o;52858:581::-;50266:7;:14;;-1:-1:-1;;50266:14:0;;;;;48575:21:::1;:19;:21::i;:::-;53003:16:::2;::::0;;53017:1:::2;53003:16:::0;;;;;::::2;::::0;;49962:42:::2;::::0;52917:25:::2;::::0;53003:16;53017:1;53003:16:::2;::::0;::::2;::::0;;::::2;::::0;::::2;;::::0;-1:-1:-1;53003:16:0::2;52979:40;;53044:4;53026;53031:1;53026:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1::0;;;;;53026:23:0::2;;;-1:-1:-1::0;;;;;53026:23:0::2;;;::::0;::::2;53066:6;-1:-1:-1::0;;;;;53066:11:0::2;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53056:4;53061:1;53056:7;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;53056:23:0;;::::2;:7;::::0;;::::2;::::0;;;;;:23;53154:13:::2;::::0;53088:155:::2;::::0;-1:-1:-1;;;53088:155:0;;:57;;::::2;::::0;::::2;::::0;:155:::2;::::0;53176:1:::2;::::0;53186:4;;53207::::2;::::0;53221:15:::2;::::0;53088:155:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;53327:20:0::2;::::0;53319:54:::2;::::0;53270:21:::2;::::0;-1:-1:-1;53252:15:0::2;::::0;-1:-1:-1;53327:20:0;;;::::2;-1:-1:-1::0;;;;;53327:20:0::2;::::0;53270:21;;53319:54:::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53300:73;;;53385:7;53380:54;;53410:16;;-1:-1:-1::0;;;53410:16:0::2;;;;;;;;;;;53380:54;52910:529;;;;48611:20:::1;47948:1:::0;49110:7;:22;48939:199;48611:20:::1;50295:7:::0;:15;;-1:-1:-1;;50295:15:0;;;52858:581::o;26517:764::-;-1:-1:-1;;;;;26630:18:0;;26622:68;;;;-1:-1:-1;;;26622:68:0;;10555:2:1;26622:68:0;;;10537:21:1;10594:2;10574:18;;;10567:30;10633:34;10613:18;;;10606:62;-1:-1:-1;;;10684:18:1;;;10677:35;10729:19;;26622:68:0;10353:401:1;26622:68:0;-1:-1:-1;;;;;26705:16:0;;26697:64;;;;-1:-1:-1;;;26697:64:0;;10961:2:1;26697:64:0;;;10943:21:1;11000:2;10980:18;;;10973:30;11039:34;11019:18;;;11012:62;-1:-1:-1;;;11090:18:1;;;11083:33;11133:19;;26697:64:0;10759:399:1;26697:64:0;26770:38;26791:4;26797:2;26801:6;26770:20;:38::i;:::-;-1:-1:-1;;;;;26839:15:0;;26817:19;26839:15;;;:9;:15;;;;;;26869:21;;;;26861:72;;;;-1:-1:-1;;;26861:72:0;;11365:2:1;26861:72:0;;;11347:21:1;11404:2;11384:18;;;11377:30;11443:34;11423:18;;;11416:62;-1:-1:-1;;;11494:18:1;;;11487:36;11540:19;;26861:72:0;11163:402:1;26861:72:0;-1:-1:-1;;;;;26959:15:0;;;;;;;:9;:15;;;;;;26977:20;;;26959:38;;27159:13;;;;;;;;;;:23;;;;;;27203:26;;;;;;26991:6;160:25:1;;148:2;133:18;;14:177;27203:26:0;;;;;;;;27238:37;52325:527;53445:337;53562:7;53595:13;-1:-1:-1;;;;;53582:26:0;:9;-1:-1:-1;;;;;53582:26:0;;53578:180;;53626:33;53638:6;53646:7;;53655:3;53626:11;:33::i;:::-;53619:40;;;;53578:180;53687:13;-1:-1:-1;;;;;53677:23:0;:6;-1:-1:-1;;;;;53677:23:0;;53673:85;;53718:32;53730:6;53738;;53746:3;53718:11;:32::i;53673:85::-;-1:-1:-1;53774:1:0;53445:337;;;;;:::o;48643:290::-;47990:1;48765:7;;:19;48761:79;;48802:30;;-1:-1:-1;;;48802:30:0;;;;;;;;;;;48761:79;47990:1;48909:7;:18;48643:290::o;55263:610::-;55393:11;;;;55388:205;;32074:7;32101:6;-1:-1:-1;;;;;55419:16:0;;;32101:6;;55419:16;;;;:44;;-1:-1:-1;;;;;;55439:24:0;;50190:42;55439:24;;55419:44;55415:171;;;-1:-1:-1;;;;;55481:22:0;;;;;;:15;:22;;;;;;;;55480:23;;:48;;-1:-1:-1;;;;;;55508:20:0;;;;;;:15;:20;;;;;;;;55507:21;55480:48;55476:101;;;55550:15;;-1:-1:-1;;;55550:15:0;;;;;;;;;;;55476:101;-1:-1:-1;;;;;55604:20:0;;;;;;:15;:20;;;;;;;;55599:142;;55668:16;;55657:7;55640:14;55650:3;-1:-1:-1;;;;;22612:18:0;22589:7;22612:18;;;:9;:18;;;;;;;22505:131;55640:14;:24;;;;:::i;:::-;55639:45;55635:99;;;55704:20;;-1:-1:-1;;;55704:20:0;;;;;;;;;;;55635:99;-1:-1:-1;;;;;55752:22:0;;;;;;:15;:22;;;;;;;;55747:121;;55799:11;;55789:7;:21;55785:76;;;55830:21;;-1:-1:-1;;;55830:21:0;;;;;;;;;;;196:548:1;308:4;337:2;366;355:9;348:21;398:6;392:13;441:6;436:2;425:9;421:18;414:34;466:1;476:140;490:6;487:1;484:13;476:140;;;585:14;;;581:23;;575:30;551:17;;;570:2;547:26;540:66;505:10;;476:140;;;480:3;665:1;660:2;651:6;640:9;636:22;632:31;625:42;735:2;728;724:7;719:2;711:6;707:15;703:29;692:9;688:45;684:54;676:62;;;;196:548;;;;:::o;749:131::-;-1:-1:-1;;;;;824:31:1;;814:42;;804:70;;870:1;867;860:12;885:315;953:6;961;1014:2;1002:9;993:7;989:23;985:32;982:52;;;1030:1;1027;1020:12;982:52;1069:9;1056:23;1088:31;1113:5;1088:31;:::i;:::-;1138:5;1190:2;1175:18;;;;1162:32;;-1:-1:-1;;;885:315:1:o;1397:456::-;1474:6;1482;1490;1543:2;1531:9;1522:7;1518:23;1514:32;1511:52;;;1559:1;1556;1549:12;1511:52;1598:9;1585:23;1617:31;1642:5;1617:31;:::i;:::-;1667:5;-1:-1:-1;1724:2:1;1709:18;;1696:32;1737:33;1696:32;1737:33;:::i;:::-;1397:456;;1789:7;;-1:-1:-1;;;1843:2:1;1828:18;;;;1815:32;;1397:456::o;2255:248::-;2323:6;2331;2384:2;2372:9;2363:7;2359:23;2355:32;2352:52;;;2400:1;2397;2390:12;2352:52;-1:-1:-1;;2423:23:1;;;2493:2;2478:18;;;2465:32;;-1:-1:-1;2255:248:1:o;2508:247::-;2567:6;2620:2;2608:9;2599:7;2595:23;2591:32;2588:52;;;2636:1;2633;2626:12;2588:52;2675:9;2662:23;2694:31;2719:5;2694:31;:::i;2760:180::-;2819:6;2872:2;2860:9;2851:7;2847:23;2843:32;2840:52;;;2888:1;2885;2878:12;2840:52;-1:-1:-1;2911:23:1;;2760:180;-1:-1:-1;2760:180:1:o;2945:118::-;3031:5;3024:13;3017:21;3010:5;3007:32;2997:60;;3053:1;3050;3043:12;3068:382;3133:6;3141;3194:2;3182:9;3173:7;3169:23;3165:32;3162:52;;;3210:1;3207;3200:12;3162:52;3249:9;3236:23;3268:31;3293:5;3268:31;:::i;:::-;3318:5;-1:-1:-1;3375:2:1;3360:18;;3347:32;3388:30;3347:32;3388:30;:::i;:::-;3437:7;3427:17;;;3068:382;;;;;:::o;3455:388::-;3523:6;3531;3584:2;3572:9;3563:7;3559:23;3555:32;3552:52;;;3600:1;3597;3590:12;3552:52;3639:9;3626:23;3658:31;3683:5;3658:31;:::i;:::-;3708:5;-1:-1:-1;3765:2:1;3750:18;;3737:32;3778:33;3737:32;3778:33;:::i;3848:380::-;3927:1;3923:12;;;;3970;;;3991:61;;4045:4;4037:6;4033:17;4023:27;;3991:61;4098:2;4090:6;4087:14;4067:18;4064:38;4061:161;;4144:10;4139:3;4135:20;4132:1;4125:31;4179:4;4176:1;4169:15;4207:4;4204:1;4197:15;4061:161;;3848:380;;;:::o;4233:127::-;4294:10;4289:3;4285:20;4282:1;4275:31;4325:4;4322:1;4315:15;4349:4;4346:1;4339:15;4365:125;4430:9;;;4451:10;;;4448:36;;;4464:18;;:::i;4495:356::-;4697:2;4679:21;;;4716:18;;;4709:30;4775:34;4770:2;4755:18;;4748:62;4842:2;4827:18;;4495:356::o;4856:184::-;4926:6;4979:2;4967:9;4958:7;4954:23;4950:32;4947:52;;;4995:1;4992;4985:12;4947:52;-1:-1:-1;5018:16:1;;4856:184;-1:-1:-1;4856:184:1:o;5324:245::-;5391:6;5444:2;5432:9;5423:7;5419:23;5415:32;5412:52;;;5460:1;5457;5450:12;5412:52;5492:9;5486:16;5511:28;5533:5;5511:28;:::i;5574:168::-;5647:9;;;5678;;5695:15;;;5689:22;;5675:37;5665:71;;5716:18;;:::i;5747:127::-;5808:10;5803:3;5799:20;5796:1;5789:31;5839:4;5836:1;5829:15;5863:4;5860:1;5853:15;5879:217;5919:1;5945;5935:132;;5989:10;5984:3;5980:20;5977:1;5970:31;6024:4;6021:1;6014:15;6052:4;6049:1;6042:15;5935:132;-1:-1:-1;6081:9:1;;5879:217::o;8505:128::-;8572:9;;;8593:11;;;8590:37;;;8607:18;;:::i;8770:127::-;8831:10;8826:3;8822:20;8819:1;8812:31;8862:4;8859:1;8852:15;8886:4;8883:1;8876:15;8902:251;8972:6;9025:2;9013:9;9004:7;9000:23;8996:32;8993:52;;;9041:1;9038;9031:12;8993:52;9073:9;9067:16;9092:31;9117:5;9092:31;:::i;9158:980::-;9420:4;9468:3;9457:9;9453:19;9499:6;9488:9;9481:25;9525:2;9563:6;9558:2;9547:9;9543:18;9536:34;9606:3;9601:2;9590:9;9586:18;9579:31;9630:6;9665;9659:13;9696:6;9688;9681:22;9734:3;9723:9;9719:19;9712:26;;9773:2;9765:6;9761:15;9747:29;;9794:1;9804:195;9818:6;9815:1;9812:13;9804:195;;;9883:13;;-1:-1:-1;;;;;9879:39:1;9867:52;;9974:15;;;;9939:12;;;;9915:1;9833:9;9804:195;;;-1:-1:-1;;;;;;;10055:32:1;;;;10050:2;10035:18;;10028:60;-1:-1:-1;;;10119:3:1;10104:19;10097:35;10016:3;9158:980;-1:-1:-1;;;9158:980:1:o

Swarm Source

ipfs://76ad9a366c9446d7eac2a6e3e700a76993bbfbc889fa82bd4005fa0ef34e613f

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

OVERVIEW

Xtrack aims to be a unique ERC-20 token designed to power a versatile Twitter aggregation bot + web application.

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.