Contract 0x9b8e9d523D1D6bC8EB209301c82C7D64D10b219E 1

 
 
Txn Hash
Method
Block
From
To
Value
0x3245966c7c639b7b5b0f64a3f9dfc5b8736e05a4595ae799dce4e54c520817c3Transfer(pending)2022-11-27 2:22:386 days 19 hrs ago0xb2bcf3a1f973aa8b31edc45e5bf16eb860075084 IN 0x9b8e9d523d1d6bc8eb209301c82c7d64d10b219e0 Ether(Pending)(Pending)
0xf5136d10d4cdb8caea8aa94c7da9881d9eca38c43b796e8f58bf55ae62e282bfTransfer(pending)2022-11-27 2:03:146 days 19 hrs ago0x07b12f95bb84f375f82a9a5e8d357c69b995019a IN 0x9b8e9d523d1d6bc8eb209301c82c7d64d10b219e0 Ether(Pending)(Pending)
0x5a9de847ab387e0938d139a9e3d9fb78666919cb78c42c36159661f314792ae2Approve160983982022-12-02 16:44:351 day 5 hrs ago0x4a495f08498802953b011bc786d1bf278c6d274b IN  0x9b8e9d523d1d6bc8eb209301c82c7d64d10b219e0 Ether0.00084503 18.11466143
0x19064c5c8babf09acd2577d2313e63da6cae227bb3f6234a91a8afa7b0586ec0Approve160818702022-11-30 9:20:233 days 12 hrs ago0x77b2682170ae7687826c9dc533cc43a62d99a3a0 IN  0x9b8e9d523d1d6bc8eb209301c82c7d64d10b219e0 Ether0.00027826 10.55446515
0x30d815338e60184527c761ec28f6c16878687693bd566db51942fad3ed1ebb26Approve160818662022-11-30 9:19:353 days 12 hrs ago0x77b2682170ae7687826c9dc533cc43a62d99a3a0 IN  0x9b8e9d523d1d6bc8eb209301c82c7d64d10b219e0 Ether0.00026336 10.80901968
0xe479491853d1235778bab82ef4ae4735d9b11225ccf539de53f3ee1815ad6744Transfer160781272022-11-29 20:47:234 days 1 hr ago0x23ef4c7a1939acc30b9eea13048c1ef86cc781c7 IN  0x9b8e9d523d1d6bc8eb209301c82c7d64d10b219e0 Ether0.0013409 11.00729297
0x023c125bcc9bbaa3a0ce316f7a276634f21270e0a6a9db1c56909d9eeeab4b5fApprove160691622022-11-28 14:44:115 days 7 hrs ago0x19ed067881321e495c0dee757e1cbaffcec32c88 IN  0x9b8e9d523d1d6bc8eb209301c82c7d64d10b219e0 Ether0.0018626 39.92814503
0x4c7122172d0fa1fa65d7e1fd36d7fff7a54aa81c43f680531594c429df1825a8Approve160384442022-11-24 7:47:479 days 14 hrs ago0x49f530ed0569f9ea19600b6102314416d068254d IN  0x9b8e9d523d1d6bc8eb209301c82c7d64d10b219e0 Ether0.00024663 10.12263644
0x920e3483fec673f79d548e7f268e3691435ea3a0cc0f3d7297e7bb34156c2bd5Approve160377722022-11-24 5:32:239 days 16 hrs ago0x9b99aa04b23b16d53ab5b3b971b8bfbfc4f8c2d9 IN  0x9b8e9d523d1d6bc8eb209301c82c7d64d10b219e0 Ether0.00054756 11.7379727
0x79dd2ec7ac25b60a6435a3c6828565518b4d80f32a958354b8c71ae2b7a4503dTransfer160371072022-11-24 3:18:599 days 18 hrs ago0x3203cff7405eb77b1f3a521e1ac52c3427c533dd IN  0x9b8e9d523d1d6bc8eb209301c82c7d64d10b219e0 Ether0.00125489 13.77188146
0x3e093cca7a8e5f8b573a83f2ccf8019819991fbed2c61291a1a93b15513c2d5eApprove160238462022-11-22 6:45:3511 days 15 hrs ago0x08b60aca95b457cbb6ab09ef19a3d5e9183c527b IN  0x9b8e9d523d1d6bc8eb209301c82c7d64d10b219e0 Ether0.0005391 11.55668693
0x9ddcde8f7e9dbe6147b03f9555cee47cf940a6cc90584093d72de5696132fe89Approve159917832022-11-17 19:18:5916 days 2 hrs ago0x19ed067881321e495c0dee757e1cbaffcec32c88 IN  0x9b8e9d523d1d6bc8eb209301c82c7d64d10b219e0 Ether0.00110266 23.63753486
0x552bf7fa2fe30ade4616961825b40c52b5377f68ba7a5eae518b249036e5aa8cApprove159824202022-11-16 11:54:4717 days 9 hrs ago0xe54d66c9f54df388ca30a69086953904c670ca54 IN  0x9b8e9d523d1d6bc8eb209301c82c7d64d10b219e0 Ether0.00054315 11.64349334
0xd3e7a45029bb3aa5a6776fd53f2f4e268fe40628fcd2bdbe419437882aa07f2cApprove159706662022-11-14 20:28:4719 days 1 hr ago0xc9860df807fdf92d37d73375fc1285c55d2b56bd IN  0x9b8e9d523d1d6bc8eb209301c82c7d64d10b219e0 Ether0.00090365 19.37135642
0x94bec74fb50ecf9f3f63c042ed8848a5d536f2a23513bb56e2b27a7e538a9629Approve159550922022-11-12 16:21:1121 days 5 hrs ago0xa195cbe259ac60ed2b38f26a3c3fd5327b9aa7f7 IN  0x9b8e9d523d1d6bc8eb209301c82c7d64d10b219e0 Ether0.00039981 14.94694565
0x94b32009710b10adf666e16832cd27bc6076ae429d60829dd5afc85eb57e0f0eApprove159550902022-11-12 16:20:4721 days 5 hrs ago0xa195cbe259ac60ed2b38f26a3c3fd5327b9aa7f7 IN  0x9b8e9d523d1d6bc8eb209301c82c7d64d10b219e0 Ether0.00066 14.14841457
0x264c2dfa9955623adb071ca374f26b9e9ec678486d5fbff3d6b6278365e2ee72Transfer159542442022-11-12 13:30:4721 days 8 hrs ago0xc7345a264411b67ed8bf0a3f13c2f8fa5c076fdc IN  0x9b8e9d523d1d6bc8eb209301c82c7d64d10b219e0 Ether0.00179837 14.76253167
0x0b00592e2f0cceb975d5daae649d33acf50f003983f088388e8a50769359f71cApprove159501432022-11-11 23:46:2321 days 22 hrs ago0xd892be58cbf8f3a10062f8e8e44decf0fbc1053d IN  0x9b8e9d523d1d6bc8eb209301c82c7d64d10b219e0 Ether0.0008464 18.14418942
0x8c9bbca2961ef541c15facc059da111c895f8ab9fa3cccf48baaa6f38d57197dTransfer159467002022-11-11 12:13:2322 days 9 hrs ago0xc63cd5e3a51339fea85d3b544f73c196e936caa9 IN  0x9b8e9d523d1d6bc8eb209301c82c7d64d10b219e0 Ether0.00195277 16.03
0x727982bb9eb00374902fe4c78b2f2918710504993e0ace07aa596e3ab851a93eApprove159399022022-11-10 13:25:1123 days 8 hrs ago0xae5838a508b6feac36cbb8d65c88d08a61a2c02d IN  0x9b8e9d523d1d6bc8eb209301c82c7d64d10b219e0 Ether0.00185631 39.79326878
0xb8b000d89b07e660066731341faba735212cdc283272c24ac56f2a86a5a51229Approve159231332022-11-08 5:10:2325 days 16 hrs ago0x0afa3ad079bc8e7e4f5dcb74b7c7eadfbda2731f IN  0x9b8e9d523d1d6bc8eb209301c82c7d64d10b219e0 Ether0.00077078 16.52305396
0xd70487b01854281ea041e5211b2dcf4e3bbebb54f253f4c7ffe081ec6fb44f83Transfer159205612022-11-07 20:33:3526 days 1 hr ago0x3203cff7405eb77b1f3a521e1ac52c3427c533dd IN  0x9b8e9d523d1d6bc8eb209301c82c7d64d10b219e0 Ether0.00188043 20.63691273
0xf52f1155dc31f6e05b197f3505f227958909f5cd59d285f1d08feb963c4af7c2Approve159165112022-11-07 6:59:4726 days 14 hrs ago0x98435b90639a7b4f4ff7fd57607ba5fbb73390ff IN  0x9b8e9d523d1d6bc8eb209301c82c7d64d10b219e0 Ether0.00064878 13.90782402
0x7de193cbefefbdd738f72b8487182ef4fa1dea4ad272990bffe34646410682caTransfer159154442022-11-07 3:25:2326 days 18 hrs ago0x360bfcd05a3fd222ee895277c6d6f07d1b98a2d3 IN  0x9b8e9d523d1d6bc8eb209301c82c7d64d10b219e0 Ether0.0013479 11.06475119
0x7772905a065714125738294a7ac0ca3cd73843b70ce727ab061d0805e9ee5352Approve159128632022-11-06 18:47:2327 days 3 hrs ago0x13742949786f3af93c4bf64652fd14048db66a3e IN  0x9b8e9d523d1d6bc8eb209301c82c7d64d10b219e0 Ether0.00067123 14.38898711
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0xfac29057470ae0602df3e6be4da85af430fc36402024d12a3942aa9d2a91c19a158443812022-10-28 5:11:1136 days 16 hrs ago 0x9b8e9d523d1d6bc8eb209301c82c7d64d10b219e 0xdea44a73ce2d4f66979d8e501a5bf12055e2acd60.09507978 Ether
0xfac29057470ae0602df3e6be4da85af430fc36402024d12a3942aa9d2a91c19a158443812022-10-28 5:11:1136 days 16 hrs ago Uniswap V2: Router 2 0x9b8e9d523d1d6bc8eb209301c82c7d64d10b219e0.09507978 Ether
0x6c4165848593a0a2f77078e48dd2cc4683642389a1dfa1224c1c86f8d55adf60154626882022-09-03 2:03:1491 days 19 hrs ago 0x9b8e9d523d1d6bc8eb209301c82c7d64d10b219e 0xdea44a73ce2d4f66979d8e501a5bf12055e2acd60.11267362 Ether
0x6c4165848593a0a2f77078e48dd2cc4683642389a1dfa1224c1c86f8d55adf60154626882022-09-03 2:03:1491 days 19 hrs ago Uniswap V2: Router 2 0x9b8e9d523d1d6bc8eb209301c82c7d64d10b219e0.11267362 Ether
0x21b3d76d246f5c0a6ba358162c251da275aa1b349f8c72e0d882d636c75ba306153265952022-08-12 10:55:52113 days 10 hrs ago 0x9b8e9d523d1d6bc8eb209301c82c7d64d10b219e 0xdea44a73ce2d4f66979d8e501a5bf12055e2acd60.11871662 Ether
0x21b3d76d246f5c0a6ba358162c251da275aa1b349f8c72e0d882d636c75ba306153265952022-08-12 10:55:52113 days 10 hrs ago Uniswap V2: Router 2 0x9b8e9d523d1d6bc8eb209301c82c7d64d10b219e0.11871662 Ether
0x6d64381088bf6dbd66a79623db44f3033d6145194b9b894ce3d5b80faf171fb7152307402022-07-28 11:25:23128 days 10 hrs ago 0x9b8e9d523d1d6bc8eb209301c82c7d64d10b219e 0xdea44a73ce2d4f66979d8e501a5bf12055e2acd60.12055922 Ether
0x6d64381088bf6dbd66a79623db44f3033d6145194b9b894ce3d5b80faf171fb7152307402022-07-28 11:25:23128 days 10 hrs ago Uniswap V2: Router 2 0x9b8e9d523d1d6bc8eb209301c82c7d64d10b219e0.12055922 Ether
0xd8073f43907aec5805f8cb4e0566f3952da1eb58eb4f74751eb815f1c4079e64150763062022-07-04 13:27:16152 days 8 hrs ago 0x9b8e9d523d1d6bc8eb209301c82c7d64d10b219e 0xdea44a73ce2d4f66979d8e501a5bf12055e2acd60.12499105 Ether
0xd8073f43907aec5805f8cb4e0566f3952da1eb58eb4f74751eb815f1c4079e64150763062022-07-04 13:27:16152 days 8 hrs ago Uniswap V2: Router 2 0x9b8e9d523d1d6bc8eb209301c82c7d64d10b219e0.12499105 Ether
0x6abfa75e00b4a66d1dcf8bed810ec159118fd89fdf37c198de17261c9a61d367149716112022-06-16 5:21:52170 days 16 hrs ago 0x9b8e9d523d1d6bc8eb209301c82c7d64d10b219e 0xdea44a73ce2d4f66979d8e501a5bf12055e2acd60.1412647 Ether
0x6abfa75e00b4a66d1dcf8bed810ec159118fd89fdf37c198de17261c9a61d367149716112022-06-16 5:21:52170 days 16 hrs ago Uniswap V2: Router 2 0x9b8e9d523d1d6bc8eb209301c82c7d64d10b219e0.1412647 Ether
0x74e6a84feaace9977f08ae80b927723efd91106d5f3c398daf5972946564b6cc149286182022-06-08 20:12:38178 days 1 hr ago 0x9b8e9d523d1d6bc8eb209301c82c7d64d10b219e 0xdea44a73ce2d4f66979d8e501a5bf12055e2acd60.22096762 Ether
0x74e6a84feaace9977f08ae80b927723efd91106d5f3c398daf5972946564b6cc149286182022-06-08 20:12:38178 days 1 hr ago Uniswap V2: Router 2 0x9b8e9d523d1d6bc8eb209301c82c7d64d10b219e0.22096762 Ether
0x8e6fe3ddd877272beb5adbb13fd36c929c554373309f9d012a8919988df8f792148563082022-05-27 20:54:35190 days 57 mins ago 0x9b8e9d523d1d6bc8eb209301c82c7d64d10b219e 0xdea44a73ce2d4f66979d8e501a5bf12055e2acd60.16346314 Ether
0x8e6fe3ddd877272beb5adbb13fd36c929c554373309f9d012a8919988df8f792148563082022-05-27 20:54:35190 days 57 mins ago Uniswap V2: Router 2 0x9b8e9d523d1d6bc8eb209301c82c7d64d10b219e0.16346314 Ether
0x4749dda9990143ee4c8f88e4bfafb320213721b914aef97f65105b95da17bdb2147884832022-05-16 21:00:44201 days 51 mins ago 0x9b8e9d523d1d6bc8eb209301c82c7d64d10b219e 0xdea44a73ce2d4f66979d8e501a5bf12055e2acd60.13692227 Ether
0x4749dda9990143ee4c8f88e4bfafb320213721b914aef97f65105b95da17bdb2147884832022-05-16 21:00:44201 days 51 mins ago Uniswap V2: Router 2 0x9b8e9d523d1d6bc8eb209301c82c7d64d10b219e0.13692227 Ether
0xeec6158f34acdd5d266cc47ee6d9a1563c2993d1639742e71255b2262af7a8f8147352752022-05-08 9:30:07209 days 12 hrs ago 0x9b8e9d523d1d6bc8eb209301c82c7d64d10b219e 0xdea44a73ce2d4f66979d8e501a5bf12055e2acd60.14189379 Ether
0xeec6158f34acdd5d266cc47ee6d9a1563c2993d1639742e71255b2262af7a8f8147352752022-05-08 9:30:07209 days 12 hrs ago Uniswap V2: Router 2 0x9b8e9d523d1d6bc8eb209301c82c7d64d10b219e0.14189379 Ether
0xbe7e28f6d2c4b946563d200a5c495e79fbbe072de52be1dd8bc1ef412193515f147160972022-05-05 8:05:09212 days 13 hrs ago 0x9b8e9d523d1d6bc8eb209301c82c7d64d10b219e 0xdea44a73ce2d4f66979d8e501a5bf12055e2acd60.14742248 Ether
0xbe7e28f6d2c4b946563d200a5c495e79fbbe072de52be1dd8bc1ef412193515f147160972022-05-05 8:05:09212 days 13 hrs ago Uniswap V2: Router 2 0x9b8e9d523d1d6bc8eb209301c82c7d64d10b219e0.14742248 Ether
0xf0140ba0acdb2ca0d51cf0a2f41952b80e79164cbaeba978b85dfa1a88a1902c146837392022-04-30 5:26:45217 days 16 hrs ago 0x9b8e9d523d1d6bc8eb209301c82c7d64d10b219e 0xdea44a73ce2d4f66979d8e501a5bf12055e2acd60.18308288 Ether
0xf0140ba0acdb2ca0d51cf0a2f41952b80e79164cbaeba978b85dfa1a88a1902c146837392022-04-30 5:26:45217 days 16 hrs ago Uniswap V2: Router 2 0x9b8e9d523d1d6bc8eb209301c82c7d64d10b219e0.18308288 Ether
0xaa8b706555bac6da353477eb0de7ea194faeda36a558b284c0cc03cd1a9e4823146458682022-04-24 6:25:19223 days 15 hrs ago 0x9b8e9d523d1d6bc8eb209301c82c7d64d10b219e 0xdea44a73ce2d4f66979d8e501a5bf12055e2acd60.20652679 Ether
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
THEPLANTDAO

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-01-10
*/

/**
 *Submitted for verification at Etherscan.io on 2021-11-27
*/

/*   
░██████╗██████╗░██████╗░░█████╗░██╗░░░██╗████████╗
██╔════╝██╔══██╗██╔══██╗██╔══██╗██║░░░██║╚══██╔══╝
╚█████╗░██████╔╝██████╔╝██║░░██║██║░░░██║░░░██║░░░
░╚═══██╗██╔═══╝░██╔══██╗██║░░██║██║░░░██║░░░██║░░░
██████╔╝██║░░░░░██║░░██║╚█████╔╝╚██████╔╝░░░██║░░░
╚═════╝░╚═╝░░░░░╚═╝░░╚═╝░╚════╝░░╚═════╝░░░░╚═╝░░░
THEPLANTDAO - https://plantdao.io/
*/

// SPDX-License-Identifier: MIT

pragma solidity 0.8.9;

abstract contract Context {
    function _msgSender() internal view virtual returns (address payable) {
        return payable(msg.sender);
    }

    function _msgData() internal view virtual returns (bytes memory) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

interface IERC20 {
    function totalSupply() external view returns (uint256);

    function balanceOf(address account) external view returns (uint256);

    function transfer(address recipient, uint256 amount)
        external
        returns (bool);

    function allowance(address owner, address spender)
        external
        view
        returns (uint256);

    function approve(address spender, uint256 amount) external returns (bool);

    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );
}

library SafeMath {
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

library Address {
    function isContract(address account) internal view returns (bool) {
        // According to EIP-1052, 0x0 is the value returned for not-yet created accounts
        // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned
        // for accounts without code, i.e. `keccak256('')`
        bytes32 codehash;
        bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
        // solhint-disable-next-line no-inline-assembly
        assembly {
            codehash := extcodehash(account)
        }
        return (codehash != accountHash && codehash != 0x0);
    }

    function sendValue(address payable recipient, uint256 amount) internal {
        require(
            address(this).balance >= amount,
            "Address: insufficient balance"
        );

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (bool success, ) = recipient.call{value: amount}("");
        require(
            success,
            "Address: unable to send value, recipient may have reverted"
        );
    }

    function functionCall(address target, bytes memory data)
        internal
        returns (bytes memory)
    {
        return functionCall(target, data, "Address: low-level call failed");
    }

    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return _functionCallWithValue(target, data, 0, errorMessage);
    }

    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return
            functionCallWithValue(
                target,
                data,
                value,
                "Address: low-level call with value failed"
            );
    }

    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(
            address(this).balance >= value,
            "Address: insufficient balance for call"
        );
        return _functionCallWithValue(target, data, value, errorMessage);
    }

    function _functionCallWithValue(
        address target,
        bytes memory data,
        uint256 weiValue,
        string memory errorMessage
    ) private returns (bytes memory) {
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: weiValue}(
            data
        );
        if (success) {
            return returndata;
        } else {
            if (returndata.length > 0) {
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

contract Ownable is Context {
    address private _owner;
    address private _previousOwner;
    uint256 private _lockTime;

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

    constructor() {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

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

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

    function renounceOwnership() public virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

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

    function getUnlockTime() public view returns (uint256) {
        return _lockTime;
    }

    function getTime() public view returns (uint256) {
        return block.timestamp;
    }
}


interface IUniswapV2Factory {
    event PairCreated(
        address indexed token0,
        address indexed token1,
        address pair,
        uint256
    );

    function feeTo() external view returns (address);

    function feeToSetter() external view returns (address);

    function getPair(address tokenA, address tokenB)
        external
        view
        returns (address pair);

    function allPairs(uint256) external view returns (address pair);

    function allPairsLength() external view returns (uint256);

    function createPair(address tokenA, address tokenB)
        external
        returns (address pair);

    function setFeeTo(address) external;

    function setFeeToSetter(address) external;
}


interface IUniswapV2Pair {
    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );
    event Transfer(address indexed from, address indexed to, uint256 value);

    function name() external pure returns (string memory);

    function symbol() external pure returns (string memory);

    function decimals() external pure returns (uint8);

    function totalSupply() external view returns (uint256);

    function balanceOf(address owner) external view returns (uint256);

    function allowance(address owner, address spender)
        external
        view
        returns (uint256);

    function approve(address spender, uint256 value) external returns (bool);

    function transfer(address to, uint256 value) external returns (bool);

    function transferFrom(
        address from,
        address to,
        uint256 value
    ) external returns (bool);

    function DOMAIN_SEPARATOR() external view returns (bytes32);

    function PERMIT_TYPEHASH() external pure returns (bytes32);

    function nonces(address owner) external view returns (uint256);

    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;

    event Burn(
        address indexed sender,
        uint256 amount0,
        uint256 amount1,
        address indexed to
    );
    event Swap(
        address indexed sender,
        uint256 amount0In,
        uint256 amount1In,
        uint256 amount0Out,
        uint256 amount1Out,
        address indexed to
    );
    event Sync(uint112 reserve0, uint112 reserve1);

    function MINIMUM_LIQUIDITY() external pure returns (uint256);

    function factory() external view returns (address);

    function token0() external view returns (address);

    function token1() external view returns (address);

    function getReserves()
        external
        view
        returns (
            uint112 reserve0,
            uint112 reserve1,
            uint32 blockTimestampLast
        );

    function price0CumulativeLast() external view returns (uint256);

    function price1CumulativeLast() external view returns (uint256);

    function kLast() external view returns (uint256);

    function burn(address to)
        external
        returns (uint256 amount0, uint256 amount1);

    function swap(
        uint256 amount0Out,
        uint256 amount1Out,
        address to,
        bytes calldata data
    ) external;

    function skim(address to) external;

    function sync() external;

    function initialize(address, address) external;
}

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

    function WETH() external pure returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint256 amountADesired,
        uint256 amountBDesired,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    )
        external
        returns (
            uint256 amountA,
            uint256 amountB,
            uint256 liquidity
        );

    function addLiquidityETH(
        address token,
        uint256 amountTokenDesired,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    )
        external
        payable
        returns (
            uint256 amountToken,
            uint256 amountETH,
            uint256 liquidity
        );

    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint256 liquidity,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountA, uint256 amountB);

    function removeLiquidityETH(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountToken, uint256 amountETH);

    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint256 liquidity,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountA, uint256 amountB);

    function removeLiquidityETHWithPermit(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountToken, uint256 amountETH);

    function swapExactTokensForTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapTokensForExactTokens(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapExactETHForTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable returns (uint256[] memory amounts);

    function swapTokensForExactETH(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapExactTokensForETH(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapETHForExactTokens(
        uint256 amountOut,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable returns (uint256[] memory amounts);

    function quote(
        uint256 amountA,
        uint256 reserveA,
        uint256 reserveB
    ) external pure returns (uint256 amountB);

    function getAmountOut(
        uint256 amountIn,
        uint256 reserveIn,
        uint256 reserveOut
    ) external pure returns (uint256 amountOut);

    function getAmountIn(
        uint256 amountOut,
        uint256 reserveIn,
        uint256 reserveOut
    ) external pure returns (uint256 amountIn);

    function getAmountsOut(uint256 amountIn, address[] calldata path)
        external
        view
        returns (uint256[] memory amounts);

    function getAmountsIn(uint256 amountOut, address[] calldata path)
        external
        view
        returns (uint256[] memory amounts);
}

interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountETH);

    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountETH);

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external;

    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable;

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

contract THEPLANTDAO is Context, IERC20, Ownable {
    using SafeMath for uint256;
    using Address for address;

    address payable public marketingAddress = payable(0xdEA44A73ce2d4f66979d8E501A5BF12055E2acd6); // Marketing Address

    address payable public liquidityAddress =
        payable(0x976Fa404A29d96cae5dd6B9f74C44394C9F4087e); // Liquidity Address

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

    mapping(address => bool) private _isExcludedFromFee;

    mapping(address => bool) private _isExcluded;
    address[] private _excluded;

    uint256 private constant MAX = ~uint256(0);
    uint256 private constant _tTotal = 100 * 1e9 * 1e18;
    uint256 private _rTotal = (MAX - (MAX % _tTotal));
    uint256 private _tFeeTotal;

    string private constant _name = "SPROUT";
    string private constant _symbol = "SPROUT";
    uint8 private constant _decimals = 18;

    uint256 private constant BUY = 1;
    uint256 private constant SELL = 2;
    uint256 private constant TRANSFER = 3;
    uint256 private buyOrSellSwitch;

    // these values are pretty much arbitrary since they get overwritten for every txn, but the placeholders make it easier to work with current contract.
    uint256 private _taxFee;
    uint256 private _previousTaxFee = _taxFee;

    uint256 private _liquidityFee;
    uint256 private _previousLiquidityFee = _liquidityFee;

    uint256 public _buyTaxFee = 1;
    uint256 public _buyLiquidityFee = 9;
    uint256 public _buyMarketingFee = 6;

    uint256 public _sellTaxFee = 1;
    uint256 public _sellLiquidityFee = 9;
    uint256 public _sellMarketingFee = 6;

    uint256 public liquidityActiveBlock = 0; // 0 means liquidity is not active yet
    uint256 public tradingActiveBlock = 0; // 0 means trading is not active

    bool public limitsInEffect = true;
    bool public tradingActive = false;
    bool public swapEnabled = false;

    mapping (address => bool) public _isExcludedMaxTransactionAmount;

     // Anti-bot and anti-whale mappings and variables
    mapping(address => uint256) private _holderLastTransferTimestamp; // to hold last Transfers temporarily during launch
    bool public transferDelayEnabled = true;

    uint256 private _liquidityTokensToSwap;
    uint256 private _marketingTokensToSwap;

    bool private gasLimitActive = true;
    uint256 private gasPriceLimit = 602 * 1 gwei;

    // store addresses that a automatic market maker pairs. Any transfer *to* these addresses
    // could be subject to a maximum transfer amount
    mapping (address => bool) public automatedMarketMakerPairs;

    uint256 public minimumTokensBeforeSwap;
    uint256 public maxTransactionAmount;
    uint256 public maxWallet;

    IUniswapV2Router02 public uniswapV2Router;
    address public uniswapV2Pair;

    bool inSwapAndLiquify;
    bool public swapAndLiquifyEnabled = false;

    event RewardLiquidityProviders(uint256 tokenAmount);
    event SwapAndLiquifyEnabledUpdated(bool enabled);
    event SwapAndLiquify(
        uint256 tokensSwapped,
        uint256 ethReceived,
        uint256 tokensIntoLiqudity
    );

    event SwapETHForTokens(uint256 amountIn, address[] path);

    event SwapTokensForETH(uint256 amountIn, address[] path);

    event ExcludedMaxTransactionAmount(address indexed account, bool isExcluded);

    modifier lockTheSwap() {
        inSwapAndLiquify = true;
        _;
        inSwapAndLiquify = false;
    }

    constructor() {
        address newOwner = msg.sender; // update if auto-deploying to a different wallet
        address futureOwner = address(msg.sender); // use if ownership will be transferred after deployment.

        maxTransactionAmount = _tTotal * 3 / 1000; // 0.3% max txn
        minimumTokensBeforeSwap = _tTotal * 5 / 10000; // 0.05%
        maxWallet = _tTotal * 1 / 100; // 1%

        _rOwned[newOwner] = _rTotal;

        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(
            // ROPSTEN or HARDHAT
            0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
        );

        address _uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory())
            .createPair(address(this), _uniswapV2Router.WETH());

        uniswapV2Router = _uniswapV2Router;
        uniswapV2Pair = _uniswapV2Pair;

        marketingAddress = payable(msg.sender); // update to marketing address
        liquidityAddress = payable(address(0xdead)); // update to a liquidity wallet if you don't want to burn LP tokens generated by the contract.

        _setAutomatedMarketMakerPair(_uniswapV2Pair, true);

        _isExcludedFromFee[newOwner] = true;
        _isExcludedFromFee[futureOwner] = true; // pre-exclude future owner wallet
        _isExcludedFromFee[address(this)] = true;
        _isExcludedFromFee[liquidityAddress] = true;

        excludeFromMaxTransaction(newOwner, true);
        excludeFromMaxTransaction(futureOwner, true); // pre-exclude future owner wallet
        excludeFromMaxTransaction(address(this), true);
        excludeFromMaxTransaction(address(_uniswapV2Router), true);
        excludeFromMaxTransaction(address(0xdead), true);

        emit Transfer(address(0), newOwner, _tTotal);
    }

    function name() external pure returns (string memory) {
        return _name;
    }

    function symbol() external pure returns (string memory) {
        return _symbol;
    }

    function decimals() external pure returns (uint8) {
        return _decimals;
    }

    function totalSupply() external pure override returns (uint256) {
        return _tTotal;
    }

    function balanceOf(address account) public view override returns (uint256) {
        if (_isExcluded[account]) return _tOwned[account];
        return tokenFromReflection(_rOwned[account]);
    }

    function transfer(address recipient, uint256 amount)
        external
        override
        returns (bool)
    {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    function allowance(address owner, address spender)
        external
        view
        override
        returns (uint256)
    {
        return _allowances[owner][spender];
    }

    function approve(address spender, uint256 amount)
        public
        override
        returns (bool)
    {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external override returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(
            sender,
            _msgSender(),
            _allowances[sender][_msgSender()].sub(
                amount,
                "ERC20: transfer amount exceeds allowance"
            )
        );
        return true;
    }

    function increaseAllowance(address spender, uint256 addedValue)
        external
        virtual
        returns (bool)
    {
        _approve(
            _msgSender(),
            spender,
            _allowances[_msgSender()][spender].add(addedValue)
        );
        return true;
    }

    function decreaseAllowance(address spender, uint256 subtractedValue)
        external
        virtual
        returns (bool)
    {
        _approve(
            _msgSender(),
            spender,
            _allowances[_msgSender()][spender].sub(
                subtractedValue,
                "ERC20: decreased allowance below zero"
            )
        );
        return true;
    }

    function isExcludedFromReward(address account)
        external
        view
        returns (bool)
    {
        return _isExcluded[account];
    }

    function totalFees() external view returns (uint256) {
        return _tFeeTotal;
    }

    // once enabled, can never be turned off
    function enableTrading() external onlyOwner {
        tradingActive = true;
        swapAndLiquifyEnabled = true;
        tradingActiveBlock = block.number;
    }

    function minimumTokensBeforeSwapAmount() external view returns (uint256) {
        return minimumTokensBeforeSwap;
    }

    function setAutomatedMarketMakerPair(address pair, bool value) public onlyOwner {
        require(pair != uniswapV2Pair, "The pair cannot be removed from automatedMarketMakerPairs");

        _setAutomatedMarketMakerPair(pair, value);
    }

    function _setAutomatedMarketMakerPair(address pair, bool value) private {
        automatedMarketMakerPairs[pair] = value;

        excludeFromMaxTransaction(pair, value);
        if(value){excludeFromReward(pair);}
        if(!value){includeInReward(pair);}
    }

    function setProtectionSettings(bool antiGas) external onlyOwner() {
        gasLimitActive = antiGas;
    }

    function setGasPriceLimit(uint256 gas) external onlyOwner {
        require(gas >= 300);
        gasPriceLimit = gas * 1 gwei;
    }

    // disable Transfer delay
    function disableTransferDelay() external onlyOwner returns (bool){
        transferDelayEnabled = false;
        return true;
    }

    function reflectionFromToken(uint256 tAmount, bool deductTransferFee)
        external
        view
        returns (uint256)
    {
        require(tAmount <= _tTotal, "Amount must be less than supply");
        if (!deductTransferFee) {
            (uint256 rAmount, , , , , ) = _getValues(tAmount);
            return rAmount;
        } else {
            (, uint256 rTransferAmount, , , , ) = _getValues(tAmount);
            return rTransferAmount;
        }
    }

    // for one-time airdrop feature after contract launch
    function airdropToWallets(address[] memory airdropWallets, uint256[] memory amount) external onlyOwner() {
        require(airdropWallets.length == amount.length, "airdropToWallets:: Arrays must be the same length");
        removeAllFee();
        buyOrSellSwitch = TRANSFER;
        for(uint256 i = 0; i < airdropWallets.length; i++){
            address wallet = airdropWallets[i];
            uint256 airdropAmount = amount[i];
            _tokenTransfer(msg.sender, wallet, airdropAmount);
        }
        restoreAllFee();
    }

    // remove limits after token is stable - 30-60 minutes
    function removeLimits() external onlyOwner returns (bool){
        limitsInEffect = false;
        gasLimitActive = false;
        transferDelayEnabled = false;
        return true;
    }

    function tokenFromReflection(uint256 rAmount)
        public
        view
        returns (uint256)
    {
        require(
            rAmount <= _rTotal,
            "Amount must be less than total reflections"
        );
        uint256 currentRate = _getRate();
        return rAmount.div(currentRate);
    }

    function excludeFromReward(address account) public onlyOwner {
        require(!_isExcluded[account], "Account is already excluded");
        require(_excluded.length + 1 <= 50, "Cannot exclude more than 50 accounts.  Include a previously excluded address.");
        if (_rOwned[account] > 0) {
            _tOwned[account] = tokenFromReflection(_rOwned[account]);
        }
        _isExcluded[account] = true;
        _excluded.push(account);
    }

    function excludeFromMaxTransaction(address updAds, bool isEx) public onlyOwner {
        _isExcludedMaxTransactionAmount[updAds] = isEx;
        emit ExcludedMaxTransactionAmount(updAds, isEx);
    }

    function includeInReward(address account) public onlyOwner {
        require(_isExcluded[account], "Account is not excluded");
        for (uint256 i = 0; i < _excluded.length; i++) {
            if (_excluded[i] == account) {
                _excluded[i] = _excluded[_excluded.length - 1];
                _tOwned[account] = 0;
                _isExcluded[account] = false;
                _excluded.pop();
                break;
            }
        }
    }

    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) private {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

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

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) private {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
        require(amount > 0, "Transfer amount must be greater than zero");

        if(!tradingActive){
            require(_isExcludedFromFee[from] || _isExcludedFromFee[to], "Trading is not active yet.");
        }

        if(limitsInEffect){
            if (
                from != owner() &&
                to != owner() &&
                to != address(0) &&
                to != address(0xdead) &&
                !inSwapAndLiquify
            ){

                // only use to prevent sniper buys in the first blocks.
                if (gasLimitActive && automatedMarketMakerPairs[from]) {
                    require(tx.gasprice <= gasPriceLimit, "Gas price exceeds limit.");
                }

                // at launch if the transfer delay is enabled, ensure the block timestamps for purchasers is set -- during launch.
                if (transferDelayEnabled){
                    if (to != owner() && to != address(uniswapV2Router) && to != address(uniswapV2Pair)){
                        require(_holderLastTransferTimestamp[tx.origin] < block.number, "_transfer:: Transfer Delay enabled.  Only one purchase per block allowed.");
                        _holderLastTransferTimestamp[tx.origin] = block.number;
                    }
                }

                //when buy
                if (automatedMarketMakerPairs[from] && !_isExcludedMaxTransactionAmount[to]) {
                    require(amount <= maxTransactionAmount, "Buy transfer amount exceeds the maxTransactionAmount.");
                    require(amount + balanceOf(to) <= maxWallet, "Cannot exceed max wallet");
                }
                //when sell
                else if (automatedMarketMakerPairs[to] && !_isExcludedMaxTransactionAmount[from]) {
                    require(amount <= maxTransactionAmount, "Sell transfer amount exceeds the maxTransactionAmount.");
                }
                else if (!_isExcludedMaxTransactionAmount[to]){
                    require(amount + balanceOf(to) <= maxWallet, "Cannot exceed max wallet");
                }
            }
        }

        uint256 contractTokenBalance = balanceOf(address(this));
        bool overMinimumTokenBalance = contractTokenBalance >=
            minimumTokensBeforeSwap;

        // Sell tokens for ETH
        if (
            !inSwapAndLiquify &&
            swapAndLiquifyEnabled &&
            balanceOf(uniswapV2Pair) > 0 &&
            overMinimumTokenBalance &&
            automatedMarketMakerPairs[to]
        ) {
            swapBack();
        }

        removeAllFee();

        buyOrSellSwitch = TRANSFER;

        // If any account belongs to _isExcludedFromFee account then remove the fee
        if (!_isExcludedFromFee[from] && !_isExcludedFromFee[to]) {
            // Buy
            if (automatedMarketMakerPairs[from]) {
                _taxFee = _buyTaxFee;
                _liquidityFee = _buyLiquidityFee + _buyMarketingFee;
                if(_liquidityFee > 0){
                    buyOrSellSwitch = BUY;
                }
            }
            // Sell
            else if (automatedMarketMakerPairs[to]) {
                _taxFee = _sellTaxFee;
                _liquidityFee = _sellLiquidityFee + _sellMarketingFee;
                if(_liquidityFee > 0){
                    buyOrSellSwitch = SELL;
                }
            }
        }

        _tokenTransfer(from, to, amount);

        restoreAllFee();

    }

    function swapBack() private lockTheSwap {
        uint256 contractBalance = balanceOf(address(this));
        bool success;
        uint256 totalTokensToSwap = _liquidityTokensToSwap + _marketingTokensToSwap;
        if(totalTokensToSwap == 0 || contractBalance == 0) {return;}

        // Halve the amount of liquidity tokens
        uint256 tokensForLiquidity = (contractBalance * _liquidityTokensToSwap / totalTokensToSwap) / 2;
        uint256 amountToSwapForBNB = contractBalance.sub(tokensForLiquidity);

        uint256 initialBNBBalance = address(this).balance;

        swapTokensForBNB(amountToSwapForBNB);

        uint256 bnbBalance = address(this).balance.sub(initialBNBBalance);

        uint256 bnbForMarketing = bnbBalance.mul(_marketingTokensToSwap).div(totalTokensToSwap);

        uint256 bnbForLiquidity = bnbBalance - bnbForMarketing;

        _liquidityTokensToSwap = 0;
        _marketingTokensToSwap = 0;

        if(tokensForLiquidity > 0 && bnbForLiquidity > 0){
            addLiquidity(tokensForLiquidity, bnbForLiquidity);
            emit SwapAndLiquify(amountToSwapForBNB, bnbForLiquidity, tokensForLiquidity);
        }

        (success,) = address(marketingAddress).call{value: address(this).balance}("");

    }

    function swapTokensForBNB(uint256 tokenAmount) private {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();
        _approve(address(this), address(uniswapV2Router), tokenAmount);
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0, // accept any amount of ETH
            path,
            address(this),
            block.timestamp
        );
    }

    function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
        _approve(address(this), address(uniswapV2Router), tokenAmount);
        uniswapV2Router.addLiquidityETH{value: ethAmount}(
            address(this),
            tokenAmount,
            0, // slippage is unavoidable
            0, // slippage is unavoidable
            liquidityAddress,
            block.timestamp
        );
    }

    function _tokenTransfer(
        address sender,
        address recipient,
        uint256 amount
    ) private {

        if (_isExcluded[sender] && !_isExcluded[recipient]) {
            _transferFromExcluded(sender, recipient, amount);
        } else if (!_isExcluded[sender] && _isExcluded[recipient]) {
            _transferToExcluded(sender, recipient, amount);
        } else if (_isExcluded[sender] && _isExcluded[recipient]) {
            _transferBothExcluded(sender, recipient, amount);
        } else {
            _transferStandard(sender, recipient, amount);
        }
    }

    function _transferStandard(
        address sender,
        address recipient,
        uint256 tAmount
    ) private {
        (
            uint256 rAmount,
            uint256 rTransferAmount,
            uint256 rFee,
            uint256 tTransferAmount,
            uint256 tFee,
            uint256 tLiquidity
        ) = _getValues(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);
        _takeLiquidity(tLiquidity);
        _reflectFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    function _transferToExcluded(
        address sender,
        address recipient,
        uint256 tAmount
    ) private {
        (
            uint256 rAmount,
            uint256 rTransferAmount,
            uint256 rFee,
            uint256 tTransferAmount,
            uint256 tFee,
            uint256 tLiquidity
        ) = _getValues(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _tOwned[recipient] = _tOwned[recipient].add(tTransferAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);
        _takeLiquidity(tLiquidity);
        _reflectFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    function _transferFromExcluded(
        address sender,
        address recipient,
        uint256 tAmount
    ) private {
        (
            uint256 rAmount,
            uint256 rTransferAmount,
            uint256 rFee,
            uint256 tTransferAmount,
            uint256 tFee,
            uint256 tLiquidity
        ) = _getValues(tAmount);
        _tOwned[sender] = _tOwned[sender].sub(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);
        _takeLiquidity(tLiquidity);
        _reflectFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    function _transferBothExcluded(
        address sender,
        address recipient,
        uint256 tAmount
    ) private {
        (
            uint256 rAmount,
            uint256 rTransferAmount,
            uint256 rFee,
            uint256 tTransferAmount,
            uint256 tFee,
            uint256 tLiquidity
        ) = _getValues(tAmount);
        _tOwned[sender] = _tOwned[sender].sub(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _tOwned[recipient] = _tOwned[recipient].add(tTransferAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);
        _takeLiquidity(tLiquidity);
        _reflectFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    function _reflectFee(uint256 rFee, uint256 tFee) private {
        _rTotal = _rTotal.sub(rFee);
        _tFeeTotal = _tFeeTotal.add(tFee);
    }

    function _getValues(uint256 tAmount)
        private
        view
        returns (
            uint256,
            uint256,
            uint256,
            uint256,
            uint256,
            uint256
        )
    {
        (
            uint256 tTransferAmount,
            uint256 tFee,
            uint256 tLiquidity
        ) = _getTValues(tAmount);
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee) = _getRValues(
            tAmount,
            tFee,
            tLiquidity,
            _getRate()
        );
        return (
            rAmount,
            rTransferAmount,
            rFee,
            tTransferAmount,
            tFee,
            tLiquidity
        );
    }

    function _getTValues(uint256 tAmount)
        private
        view
        returns (
            uint256,
            uint256,
            uint256
        )
    {
        uint256 tFee = calculateTaxFee(tAmount);
        uint256 tLiquidity = calculateLiquidityFee(tAmount);
        uint256 tTransferAmount = tAmount.sub(tFee).sub(tLiquidity);
        return (tTransferAmount, tFee, tLiquidity);
    }

    function _getRValues(
        uint256 tAmount,
        uint256 tFee,
        uint256 tLiquidity,
        uint256 currentRate
    )
        private
        pure
        returns (
            uint256,
            uint256,
            uint256
        )
    {
        uint256 rAmount = tAmount.mul(currentRate);
        uint256 rFee = tFee.mul(currentRate);
        uint256 rLiquidity = tLiquidity.mul(currentRate);
        uint256 rTransferAmount = rAmount.sub(rFee).sub(rLiquidity);
        return (rAmount, rTransferAmount, rFee);
    }

    function _getRate() private view returns (uint256) {
        (uint256 rSupply, uint256 tSupply) = _getCurrentSupply();
        return rSupply.div(tSupply);
    }

    function _getCurrentSupply() private view returns (uint256, uint256) {
        uint256 rSupply = _rTotal;
        uint256 tSupply = _tTotal;
        for (uint256 i = 0; i < _excluded.length; i++) {
            if (
                _rOwned[_excluded[i]] > rSupply ||
                _tOwned[_excluded[i]] > tSupply
            ) return (_rTotal, _tTotal);
            rSupply = rSupply.sub(_rOwned[_excluded[i]]);
            tSupply = tSupply.sub(_tOwned[_excluded[i]]);
        }
        if (rSupply < _rTotal.div(_tTotal)) return (_rTotal, _tTotal);
        return (rSupply, tSupply);
    }

    function _takeLiquidity(uint256 tLiquidity) private {
        if(buyOrSellSwitch == BUY){
            _liquidityTokensToSwap += tLiquidity * _buyLiquidityFee / _liquidityFee;
            _marketingTokensToSwap += tLiquidity * _buyMarketingFee / _liquidityFee;
        } else if(buyOrSellSwitch == SELL){
            _liquidityTokensToSwap += tLiquidity * _sellLiquidityFee / _liquidityFee;
            _marketingTokensToSwap += tLiquidity * _sellMarketingFee / _liquidityFee;
        }
        uint256 currentRate = _getRate();
        uint256 rLiquidity = tLiquidity.mul(currentRate);
        _rOwned[address(this)] = _rOwned[address(this)].add(rLiquidity);
        if (_isExcluded[address(this)])
            _tOwned[address(this)] = _tOwned[address(this)].add(tLiquidity);
    }

    function calculateTaxFee(uint256 _amount) private view returns (uint256) {
        return _amount.mul(_taxFee).div(10**2);
    }

    function calculateLiquidityFee(uint256 _amount)
        private
        view
        returns (uint256)
    {
        return _amount.mul(_liquidityFee).div(10**2);
    }

    function removeAllFee() private {
        if (_taxFee == 0 && _liquidityFee == 0) return;

        _previousTaxFee = _taxFee;
        _previousLiquidityFee = _liquidityFee;

        _taxFee = 0;
        _liquidityFee = 0;
    }

    function restoreAllFee() private {
        _taxFee = _previousTaxFee;
        _liquidityFee = _previousLiquidityFee;
    }

    function isExcludedFromFee(address account) external view returns (bool) {
        return _isExcludedFromFee[account];
    }

    function excludeFromFee(address account) external onlyOwner {
        _isExcludedFromFee[account] = true;
    }

    function includeInFee(address account) external onlyOwner {
        _isExcludedFromFee[account] = false;
    }

    function setBuyFee(uint256 buyTaxFee, uint256 buyLiquidityFee, uint256 buyMarketingFee)
        external
        onlyOwner
    {
        _buyTaxFee = buyTaxFee;
        _buyLiquidityFee = buyLiquidityFee;
        _buyMarketingFee = buyMarketingFee;
        require(_buyTaxFee + _buyLiquidityFee + _buyMarketingFee <= 20, "Must keep taxes below 20%");
    }

    function setSellFee(uint256 sellTaxFee, uint256 sellLiquidityFee, uint256 sellMarketingFee)
        external
        onlyOwner
    {
        _sellTaxFee = sellTaxFee;
        _sellLiquidityFee = sellLiquidityFee;
        _sellMarketingFee = sellMarketingFee;
        require(_sellTaxFee + _sellLiquidityFee + _sellMarketingFee <= 30, "Must keep taxes below 30%");
    }

    function setMarketingAddress(address _marketingAddress) external onlyOwner {
        marketingAddress = payable(_marketingAddress);
        _isExcludedFromFee[marketingAddress] = true;
    }

    function setLiquidityAddress(address _liquidityAddress) external onlyOwner {
        liquidityAddress = payable(_liquidityAddress);
        _isExcludedFromFee[liquidityAddress] = true;
    }

    function setSwapAndLiquifyEnabled(bool _enabled) public onlyOwner {
        swapAndLiquifyEnabled = _enabled;
        emit SwapAndLiquifyEnabledUpdated(_enabled);
    }

    // useful for buybacks or to reclaim any BNB on the contract in a way that helps holders.
    function buyBackTokens(uint256 bnbAmountInWei) external onlyOwner {
        // generate the uniswap pair path of weth -> eth
        address[] memory path = new address[](2);
        path[0] = uniswapV2Router.WETH();
        path[1] = address(this);

        // make the swap
        uniswapV2Router.swapExactETHForTokensSupportingFeeOnTransferTokens{value: bnbAmountInWei}(
            0, // accept any amount of Ethereum
            path,
            address(0xdead),
            block.timestamp
        );
    }

    // To receive ETH from uniswapV2Router when swapping
    receive() external payable {}

    function transferForeignToken(address _token, address _to)
        external
        onlyOwner
        returns (bool _sent)
    {
        require(_token != address(this), "Can't withdraw native tokens");
        uint256 _contractBalance = IERC20(_token).balanceOf(address(this));
        _sent = IERC20(_token).transfer(_to, _contractBalance);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"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":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludedMaxTransactionAmount","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":false,"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"RewardLiquidityProviders","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiqudity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"SwapAndLiquifyEnabledUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amountIn","type":"uint256"},{"indexed":false,"internalType":"address[]","name":"path","type":"address[]"}],"name":"SwapETHForTokens","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amountIn","type":"uint256"},{"indexed":false,"internalType":"address[]","name":"path","type":"address[]"}],"name":"SwapTokensForETH","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"},{"inputs":[],"name":"_buyLiquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_buyMarketingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_buyTaxFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isExcludedMaxTransactionAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_sellLiquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_sellMarketingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_sellTaxFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"airdropWallets","type":"address[]"},{"internalType":"uint256[]","name":"amount","type":"uint256[]"}],"name":"airdropToWallets","outputs":[],"stateMutability":"nonpayable","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":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"bnbAmountInWei","type":"uint256"}],"name":"buyBackTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","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":[],"name":"disableTransferDelay","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"updAds","type":"address"},{"internalType":"bool","name":"isEx","type":"bool"}],"name":"excludeFromMaxTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getUnlockTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInReward","outputs":[],"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":"account","type":"address"}],"name":"isExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromReward","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"limitsInEffect","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityActiveBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityAddress","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingAddress","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTransactionAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimumTokensBeforeSwap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimumTokensBeforeSwapAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tAmount","type":"uint256"},{"internalType":"bool","name":"deductTransferFee","type":"bool"}],"name":"reflectionFromToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"removeLimits","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"buyTaxFee","type":"uint256"},{"internalType":"uint256","name":"buyLiquidityFee","type":"uint256"},{"internalType":"uint256","name":"buyMarketingFee","type":"uint256"}],"name":"setBuyFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"gas","type":"uint256"}],"name":"setGasPriceLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_liquidityAddress","type":"address"}],"name":"setLiquidityAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_marketingAddress","type":"address"}],"name":"setMarketingAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"antiGas","type":"bool"}],"name":"setProtectionSettings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"sellTaxFee","type":"uint256"},{"internalType":"uint256","name":"sellLiquidityFee","type":"uint256"},{"internalType":"uint256","name":"sellMarketingFee","type":"uint256"}],"name":"setSellFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setSwapAndLiquifyEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapAndLiquifyEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"rAmount","type":"uint256"}],"name":"tokenFromReflection","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"tradingActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingActiveBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transferDelayEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_to","type":"address"}],"name":"transferForeignToken","outputs":[{"internalType":"bool","name":"_sent","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","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"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

6080604052600380546001600160a01b031990811673dea44a73ce2d4f66979d8e501a5bf12055e2acd6179091556004805490911673976fa404a29d96cae5dd6b9f74c44394c9f4087e179055620000676c01431e0fae6d7217caa000000060001962000d93565b620000759060001962000dc0565b600b55600e54600f55601054601155600160128190556009601381905560066014819055601583905560169190915560175560006018819055601955601a805462ffffff191682179055601d805460ff199081168317909155602080549091169091179055648c29ff04006021556027805460ff60a81b19169055348015620000fd57600080fd5b50600080546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35033806103e86200015e6c01431e0fae6d7217caa0000000600362000dda565b6200016a919062000dfc565b6024556127106200018a6c01431e0fae6d7217caa0000000600562000dda565b62000196919062000dfc565b6023556064620001b56c01431e0fae6d7217caa0000000600162000dda565b620001c1919062000dfc565b602555600b546001600160a01b038316600090815260056020908152604080832093909355825163c45a015560e01b81529251737a250d5630b4cf539739df2c5dacb4c659f2488d93849263c45a015592600480840193829003018186803b1580156200022d57600080fd5b505afa15801562000242573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000268919062000e13565b6001600160a01b031663c9c6539630846001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015620002b157600080fd5b505afa158015620002c6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002ec919062000e13565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b1580156200033557600080fd5b505af11580156200034a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000370919062000e13565b602680546001600160a01b038086166001600160a01b0319928316179092556027805492841692821692909217909155600380548216331790556004805490911661dead1790559050620003c6816001620004bc565b6001600160a01b038481166000908152600860205260408082208054600160ff19918216811790925587851684528284208054821683179055308452828420805482168317905560045490941683529120805490921681179091556200042e90859062000513565b6200043b83600162000513565b6200044830600162000513565b6200045582600162000513565b6200046461dead600162000513565b6040516c01431e0fae6d7217caa000000081526001600160a01b038516906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050505062000efb565b6001600160a01b0382166000908152602260205260409020805460ff1916821515179055620004ec828262000513565b8015620004fe57620004fe82620005c1565b806200050f576200050f82620007d9565b5050565b6000546001600160a01b03163314620005625760405162461bcd60e51b815260206004820181905260248201526000805160206200493883398151915260448201526064015b60405180910390fd5b6001600160a01b0382166000818152601b6020908152604091829020805460ff191685151590811790915591519182527f575f9d01836c9206322151b9e9ec3f2b77b87e71176933b9b44d2d732f768d95910160405180910390a25050565b6000546001600160a01b031633146200060c5760405162461bcd60e51b8152602060048201819052602482015260008051602062004938833981519152604482015260640162000559565b6001600160a01b03811660009081526009602052604090205460ff1615620006775760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c756465640000000000604482015260640162000559565b600a546032906200068a90600162000e3e565b1115620007165760405162461bcd60e51b815260206004820152604d60248201527f43616e6e6f74206578636c756465206d6f7265207468616e203530206163636f60448201527f756e74732e2020496e636c75646520612070726576696f75736c79206578636c60648201526c3ab232b21030b2323932b9b99760991b608482015260a40162000559565b6001600160a01b0381166000908152600560205260409020541562000773576001600160a01b0381166000908152600560205260409020546200075990620009c2565b6001600160a01b0382166000908152600660205260409020555b6001600160a01b03166000818152600960205260408120805460ff19166001908117909155600a805491820181559091527fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a80180546001600160a01b0319169091179055565b6000546001600160a01b03163314620008245760405162461bcd60e51b8152602060048201819052602482015260008051602062004938833981519152604482015260640162000559565b6001600160a01b03811660009081526009602052604090205460ff166200088e5760405162461bcd60e51b815260206004820152601760248201527f4163636f756e74206973206e6f74206578636c75646564000000000000000000604482015260640162000559565b60005b600a548110156200050f57816001600160a01b0316600a8281548110620008bc57620008bc62000e59565b6000918252602090912001546001600160a01b03161415620009ad57600a8054620008ea9060019062000dc0565b81548110620008fd57620008fd62000e59565b600091825260209091200154600a80546001600160a01b0390921691839081106200092c576200092c62000e59565b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152600682526040808220829055600990925220805460ff19169055600a80548062000987576200098762000e6f565b600082815260209020810160001990810180546001600160a01b03191690550190555050565b80620009b98162000e85565b91505062000891565b6000600b5482111562000a2b5760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b606482015260840162000559565b600062000a3762000a5a565b905062000a53818462000a8d60201b62001d121790919060201c565b9392505050565b6000808062000a6862000ad7565b9150915062000a86818362000a8d60201b62001d121790919060201c565b9250505090565b600062000a5383836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525062000cc160201b60201c565b600b5460009081906c01431e0fae6d7217caa0000000825b600a5481101562000c6c578260056000600a848154811062000b155762000b1562000e59565b60009182526020808320909101546001600160a01b03168352820192909252604001902054118062000b8457508160066000600a848154811062000b5d5762000b5d62000e59565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b1562000ba5575050600b54936c01431e0fae6d7217caa00000009350915050565b62000bfc60056000600a848154811062000bc35762000bc362000e59565b60009182526020808320909101546001600160a01b03168352828101939093526040909101902054859162001d5462000cfd821b17901c565b925062000c5560066000600a848154811062000c1c5762000c1c62000e59565b60009182526020808320909101546001600160a01b03168352828101939093526040909101902054849162001d5462000cfd821b17901c565b91508062000c638162000e85565b91505062000aef565b5062000c966c01431e0fae6d7217caa0000000600b5462000a8d60201b62001d121790919060201c565b82101562000cb8575050600b54926c01431e0fae6d7217caa000000092509050565b90939092509050565b6000818362000ce55760405162461bcd60e51b815260040162000559919062000ea3565b50600062000cf4848662000dfc565b95945050505050565b600062000a5383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525062000d4760201b60201c565b6000818484111562000d6e5760405162461bcd60e51b815260040162000559919062000ea3565b50600062000cf4848662000dc0565b634e487b7160e01b600052601260045260246000fd5b60008262000da55762000da562000d7d565b500690565b634e487b7160e01b600052601160045260246000fd5b60008282101562000dd55762000dd562000daa565b500390565b600081600019048311821515161562000df75762000df762000daa565b500290565b60008262000e0e5762000e0e62000d7d565b500490565b60006020828403121562000e2657600080fd5b81516001600160a01b038116811462000a5357600080fd5b6000821982111562000e545762000e5462000daa565b500190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b600060001982141562000e9c5762000e9c62000daa565b5060010190565b600060208083528351808285015260005b8181101562000ed25785810183015185820160400152820162000eb4565b8181111562000ee5576000604083870101525b50601f01601f1916929092016040019392505050565b613a2d8062000f0b6000396000f3fe6080604052600436106103bc5760003560e01c8063751039fc116101f2578063bbc0c7421161010d578063dd62ed3e116100a0578063efcc52de1161006f578063efcc52de14610b10578063f2fde38b14610b26578063f8b45b0514610b46578063fc155d1d14610b5c57600080fd5b8063dd62ed3e14610a7f578063e884f26014610ac5578063ea2f0b3714610ada578063ee40166e14610afa57600080fd5b8063c876d0b9116100dc578063c876d0b914610a23578063c8c8ebe414610a3d578063d2d7ad8314610a53578063dc44b6a014610a6957600080fd5b8063bbc0c742146109b8578063c49b9a80146109d7578063c5d24189146109f7578063c860795214610a0d57600080fd5b806395d89b4111610185578063a457c2d711610154578063a457c2d714610928578063a5ece94114610948578063a9059cbb14610968578063b62496f51461098857600080fd5b806395d89b41146103c85780639a7a23d6146108d3578063a0263c89146108f3578063a073d37f1461091357600080fd5b806388f82020116101c157806388f82020146108475780638a8c523c146108805780638da5cb5b14610895578063906e9dd0146108b357600080fd5b8063751039fc146107dc5780637571336a146107f15780638366e79a1461081157806388790a681461083157600080fd5b80633221c93f116102e257806352390c0211610275578063602bc62b11610244578063602bc62b146107725780636ddd17131461078757806370a08231146107a7578063715018a6146107c757600080fd5b806352390c02146106e6578063525fa81f146107065780635342acb414610726578063557ed1ba1461075f57600080fd5b80634549b039116102b15780634549b0391461066b57806349bd5a5e1461068b5780634a62bb65146106ab5780634a74bb02146106c557600080fd5b80633221c93f146105eb5780633685d4191461060b578063395093511461062b578063437823ec1461064b57600080fd5b806318160ddd1161035a57806323b872dd1161032957806323b872dd1461056f57806325519cf21461058f5780632d838119146105af578063313ce567146105cf57600080fd5b806318160ddd146104f95780631d865c3014610519578063200a692d146105395780632307b4411461054f57600080fd5b80630f4432e3116103965780630f4432e31461045857806310d5de531461047c57806313114a9d146104ac5780631694505e146104c157600080fd5b806306fdde03146103c85780630923160214610406578063095ea7b31461042857600080fd5b366103c357005b600080fd5b3480156103d457600080fd5b50604080518082018252600681526514d41493d55560d21b602082015290516103fd91906133e7565b60405180910390f35b34801561041257600080fd5b5061042661042136600461343c565b610b7c565b005b34801561043457600080fd5b5061044861044336600461346d565b610bd2565b60405190151581526020016103fd565b34801561046457600080fd5b5061046e60185481565b6040519081526020016103fd565b34801561048857600080fd5b50610448610497366004613499565b601b6020526000908152604090205460ff1681565b3480156104b857600080fd5b50600c5461046e565b3480156104cd57600080fd5b506026546104e1906001600160a01b031681565b6040516001600160a01b0390911681526020016103fd565b34801561050557600080fd5b506c01431e0fae6d7217caa000000061046e565b34801561052557600080fd5b506104266105343660046134b6565b610be9565b34801561054557600080fd5b5061046e60155481565b34801561055b57600080fd5b5061042661056a3660046135b8565b610c8c565b34801561057b57600080fd5b5061044861058a36600461367a565b610dac565b34801561059b57600080fd5b506104266105aa3660046134b6565b610e15565b3480156105bb57600080fd5b5061046e6105ca36600461343c565b610eb1565b3480156105db57600080fd5b50604051601281526020016103fd565b3480156105f757600080fd5b506004546104e1906001600160a01b031681565b34801561061757600080fd5b50610426610626366004613499565b610f35565b34801561063757600080fd5b5061044861064636600461346d565b6110e8565b34801561065757600080fd5b50610426610666366004613499565b61111e565b34801561067757600080fd5b5061046e6106863660046136c9565b61116c565b34801561069757600080fd5b506027546104e1906001600160a01b031681565b3480156106b757600080fd5b50601a546104489060ff1681565b3480156106d157600080fd5b5060275461044890600160a81b900460ff1681565b3480156106f257600080fd5b50610426610701366004613499565b611204565b34801561071257600080fd5b50610426610721366004613499565b6113f2565b34801561073257600080fd5b50610448610741366004613499565b6001600160a01b031660009081526008602052604090205460ff1690565b34801561076b57600080fd5b504261046e565b34801561077e57600080fd5b5060025461046e565b34801561079357600080fd5b50601a546104489062010000900460ff1681565b3480156107b357600080fd5b5061046e6107c2366004613499565b611456565b3480156107d357600080fd5b506104266114b5565b3480156107e857600080fd5b50610448611529565b3480156107fd57600080fd5b5061042661080c3660046136f9565b611578565b34801561081d57600080fd5b5061044861082c366004613727565b611601565b34801561083d57600080fd5b5061046e60165481565b34801561085357600080fd5b50610448610862366004613499565b6001600160a01b031660009081526009602052604090205460ff1690565b34801561088c57600080fd5b5061042661178d565b3480156108a157600080fd5b506000546001600160a01b03166104e1565b3480156108bf57600080fd5b506104266108ce366004613499565b6117df565b3480156108df57600080fd5b506104266108ee3660046136f9565b611843565b3480156108ff57600080fd5b5061042661090e366004613755565b6118fb565b34801561091f57600080fd5b5060235461046e565b34801561093457600080fd5b5061044861094336600461346d565b611938565b34801561095457600080fd5b506003546104e1906001600160a01b031681565b34801561097457600080fd5b5061044861098336600461346d565b611987565b34801561099457600080fd5b506104486109a3366004613499565b60226020526000908152604090205460ff1681565b3480156109c457600080fd5b50601a5461044890610100900460ff1681565b3480156109e357600080fd5b506104266109f2366004613755565b611994565b348015610a0357600080fd5b5061046e60145481565b348015610a1957600080fd5b5061046e60175481565b348015610a2f57600080fd5b50601d546104489060ff1681565b348015610a4957600080fd5b5061046e60245481565b348015610a5f57600080fd5b5061046e60235481565b348015610a7557600080fd5b5061046e60135481565b348015610a8b57600080fd5b5061046e610a9a366004613727565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205490565b348015610ad157600080fd5b50610448611a16565b348015610ae657600080fd5b50610426610af5366004613499565b611a51565b348015610b0657600080fd5b5061046e60195481565b348015610b1c57600080fd5b5061046e60125481565b348015610b3257600080fd5b50610426610b41366004613499565b611a9c565b348015610b5257600080fd5b5061046e60255481565b348015610b6857600080fd5b50610426610b7736600461343c565b611b86565b6000546001600160a01b03163314610baf5760405162461bcd60e51b8152600401610ba690613772565b60405180910390fd5b61012c811015610bbe57600080fd5b610bcc81633b9aca006137bd565b60215550565b6000610bdf338484611d96565b5060015b92915050565b6000546001600160a01b03163314610c135760405162461bcd60e51b8152600401610ba690613772565b601583905560168290556017819055601e81610c2f84866137dc565b610c3991906137dc565b1115610c875760405162461bcd60e51b815260206004820152601960248201527f4d757374206b6565702074617865732062656c6f7720333025000000000000006044820152606401610ba6565b505050565b6000546001600160a01b03163314610cb65760405162461bcd60e51b8152600401610ba690613772565b8051825114610d215760405162461bcd60e51b815260206004820152603160248201527f61697264726f70546f57616c6c6574733a3a20417272617973206d75737420626044820152700ca40e8d0ca40e6c2daca40d8cadccee8d607b1b6064820152608401610ba6565b610d29611eba565b6003600d5560005b8251811015610d96576000838281518110610d4e57610d4e6137f4565b602002602001015190506000838381518110610d6c57610d6c6137f4565b60200260200101519050610d81338383611ee8565b50508080610d8e9061380a565b915050610d31565b50610da8600f54600e55601154601055565b5050565b6000610db9848484611fe5565b610e0b8433610e06856040518060600160405280602881526020016139ab602891396001600160a01b038a1660009081526007602090815260408083203384529091529020549190612791565b611d96565b5060019392505050565b6000546001600160a01b03163314610e3f5760405162461bcd60e51b8152600401610ba690613772565b60128390556013829055601481815581610e5984866137dc565b610e6391906137dc565b1115610c875760405162461bcd60e51b815260206004820152601960248201527f4d757374206b6565702074617865732062656c6f7720323025000000000000006044820152606401610ba6565b6000600b54821115610f185760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b6064820152608401610ba6565b6000610f226127cb565b9050610f2e8382611d12565b9392505050565b6000546001600160a01b03163314610f5f5760405162461bcd60e51b8152600401610ba690613772565b6001600160a01b03811660009081526009602052604090205460ff16610fc75760405162461bcd60e51b815260206004820152601760248201527f4163636f756e74206973206e6f74206578636c756465640000000000000000006044820152606401610ba6565b60005b600a54811015610da857816001600160a01b0316600a8281548110610ff157610ff16137f4565b6000918252602090912001546001600160a01b031614156110d657600a805461101c90600190613825565b8154811061102c5761102c6137f4565b600091825260209091200154600a80546001600160a01b039092169183908110611058576110586137f4565b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152600682526040808220829055600990925220805460ff19169055600a8054806110b0576110b061383c565b600082815260209020810160001990810180546001600160a01b03191690550190555050565b806110e08161380a565b915050610fca565b3360008181526007602090815260408083206001600160a01b03871684529091528120549091610bdf918590610e0690866127ee565b6000546001600160a01b031633146111485760405162461bcd60e51b8152600401610ba690613772565b6001600160a01b03166000908152600860205260409020805460ff19166001179055565b60006c01431e0fae6d7217caa00000008311156111cb5760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e74206d757374206265206c657373207468616e20737570706c79006044820152606401610ba6565b816111ea5760006111db8461284d565b50939550610be3945050505050565b60006111f58461284d565b50929550610be3945050505050565b6000546001600160a01b0316331461122e5760405162461bcd60e51b8152600401610ba690613772565b6001600160a01b03811660009081526009602052604090205460ff16156112975760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c7564656400000000006044820152606401610ba6565b600a546032906112a89060016137dc565b11156113325760405162461bcd60e51b815260206004820152604d60248201527f43616e6e6f74206578636c756465206d6f7265207468616e203530206163636f60448201527f756e74732e2020496e636c75646520612070726576696f75736c79206578636c60648201526c3ab232b21030b2323932b9b99760991b608482015260a401610ba6565b6001600160a01b0381166000908152600560205260409020541561138c576001600160a01b03811660009081526005602052604090205461137290610eb1565b6001600160a01b0382166000908152600660205260409020555b6001600160a01b03166000818152600960205260408120805460ff19166001908117909155600a805491820181559091527fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a80180546001600160a01b0319169091179055565b6000546001600160a01b0316331461141c5760405162461bcd60e51b8152600401610ba690613772565b600480546001600160a01b039092166001600160a01b0319909216821790556000908152600860205260409020805460ff19166001179055565b6001600160a01b03811660009081526009602052604081205460ff161561149357506001600160a01b031660009081526006602052604090205490565b6001600160a01b038216600090815260056020526040902054610be390610eb1565b6000546001600160a01b031633146114df5760405162461bcd60e51b8152600401610ba690613772565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b600080546001600160a01b031633146115545760405162461bcd60e51b8152600401610ba690613772565b50601a805460ff199081169091556020805482169055601d80549091169055600190565b6000546001600160a01b031633146115a25760405162461bcd60e51b8152600401610ba690613772565b6001600160a01b0382166000818152601b6020908152604091829020805460ff191685151590811790915591519182527f575f9d01836c9206322151b9e9ec3f2b77b87e71176933b9b44d2d732f768d95910160405180910390a25050565b600080546001600160a01b0316331461162c5760405162461bcd60e51b8152600401610ba690613772565b6001600160a01b0383163014156116855760405162461bcd60e51b815260206004820152601c60248201527f43616e2774207769746864726177206e617469766520746f6b656e73000000006044820152606401610ba6565b6040516370a0823160e01b81523060048201526000906001600160a01b038516906370a082319060240160206040518083038186803b1580156116c757600080fd5b505afa1580156116db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116ff9190613852565b60405163a9059cbb60e01b81526001600160a01b038581166004830152602482018390529192509085169063a9059cbb90604401602060405180830381600087803b15801561174d57600080fd5b505af1158015611761573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611785919061386b565b949350505050565b6000546001600160a01b031633146117b75760405162461bcd60e51b8152600401610ba690613772565b601a805461ff0019166101001790556027805460ff60a81b1916600160a81b17905543601955565b6000546001600160a01b031633146118095760405162461bcd60e51b8152600401610ba690613772565b600380546001600160a01b039092166001600160a01b0319909216821790556000908152600860205260409020805460ff19166001179055565b6000546001600160a01b0316331461186d5760405162461bcd60e51b8152600401610ba690613772565b6027546001600160a01b03838116911614156118f15760405162461bcd60e51b815260206004820152603960248201527f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060448201527f6175746f6d617465644d61726b65744d616b65725061697273000000000000006064820152608401610ba6565b610da8828261289c565b6000546001600160a01b031633146119255760405162461bcd60e51b8152600401610ba690613772565b6020805460ff1916911515919091179055565b6000610bdf3384610e06856040518060600160405280602581526020016139d3602591393360009081526007602090815260408083206001600160a01b038d1684529091529020549190612791565b6000610bdf338484611fe5565b6000546001600160a01b031633146119be5760405162461bcd60e51b8152600401610ba690613772565b60278054821515600160a81b0260ff60a81b199091161790556040517f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc15990611a0b90831515815260200190565b60405180910390a150565b600080546001600160a01b03163314611a415760405162461bcd60e51b8152600401610ba690613772565b50601d805460ff19169055600190565b6000546001600160a01b03163314611a7b5760405162461bcd60e51b8152600401610ba690613772565b6001600160a01b03166000908152600860205260409020805460ff19169055565b6000546001600160a01b03163314611ac65760405162461bcd60e51b8152600401610ba690613772565b6001600160a01b038116611b2b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610ba6565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314611bb05760405162461bcd60e51b8152600401610ba690613772565b6040805160028082526060820183526000926020830190803683375050602654604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c464892506004808301926020929190829003018186803b158015611c1557600080fd5b505afa158015611c29573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c4d9190613888565b81600081518110611c6057611c606137f4565b60200260200101906001600160a01b031690816001600160a01b0316815250503081600181518110611c9457611c946137f4565b6001600160a01b03928316602091820292909201015260265460405163b6f9de9560e01b815291169063b6f9de95908490611cdc90600090869061dead9042906004016138e9565b6000604051808303818588803b158015611cf557600080fd5b505af1158015611d09573d6000803e3d6000fd5b50505050505050565b6000610f2e83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506128e7565b6000610f2e83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612791565b6001600160a01b038316611df85760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610ba6565b6001600160a01b038216611e595760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610ba6565b6001600160a01b0383811660008181526007602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b600e54158015611eca5750601054155b15611ed157565b600e8054600f556010805460115560009182905555565b6001600160a01b03831660009081526009602052604090205460ff168015611f2957506001600160a01b03821660009081526009602052604090205460ff16155b15611f3957610c87838383612915565b6001600160a01b03831660009081526009602052604090205460ff16158015611f7a57506001600160a01b03821660009081526009602052604090205460ff165b15611f8a57610c87838383612a3b565b6001600160a01b03831660009081526009602052604090205460ff168015611fca57506001600160a01b03821660009081526009602052604090205460ff165b15611fda57610c87838383612ae4565b610c87838383612b57565b6001600160a01b0383166120495760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610ba6565b6001600160a01b0382166120ab5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610ba6565b6000811161210d5760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b6064820152608401610ba6565b601a54610100900460ff166121a7576001600160a01b03831660009081526008602052604090205460ff168061215b57506001600160a01b03821660009081526008602052604090205460ff165b6121a75760405162461bcd60e51b815260206004820152601a60248201527f54726164696e67206973206e6f7420616374697665207965742e0000000000006044820152606401610ba6565b601a5460ff16156125f4576000546001600160a01b038481169116148015906121de57506000546001600160a01b03838116911614155b80156121f257506001600160a01b03821615155b801561220957506001600160a01b03821661dead14155b801561221f5750602754600160a01b900460ff16155b156125f45760205460ff16801561224e57506001600160a01b03831660009081526022602052604090205460ff165b156122a5576021543a11156122a55760405162461bcd60e51b815260206004820152601860248201527f4761732070726963652065786365656473206c696d69742e00000000000000006044820152606401610ba6565b601d5460ff16156123a4576000546001600160a01b038381169116148015906122dc57506026546001600160a01b03838116911614155b80156122f657506027546001600160a01b03838116911614155b156123a457326000908152601c602052604090205443116123915760405162461bcd60e51b815260206004820152604960248201527f5f7472616e736665723a3a205472616e736665722044656c617920656e61626c60448201527f65642e20204f6e6c79206f6e652070757263686173652070657220626c6f636b6064820152681030b63637bbb2b21760b91b608482015260a401610ba6565b326000908152601c602052604090204390555b6001600160a01b03831660009081526022602052604090205460ff1680156123e557506001600160a01b0382166000908152601b602052604090205460ff16155b156124be5760245481111561245a5760405162461bcd60e51b815260206004820152603560248201527f427579207472616e7366657220616d6f756e742065786365656473207468652060448201527436b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760591b6064820152608401610ba6565b60255461246683611456565b61247090836137dc565b11156124b95760405162461bcd60e51b815260206004820152601860248201527710d85b9b9bdd08195e18d95959081b585e081dd85b1b195d60421b6044820152606401610ba6565b6125f4565b6001600160a01b03821660009081526022602052604090205460ff1680156124ff57506001600160a01b0383166000908152601b602052604090205460ff16155b15612575576024548111156124b95760405162461bcd60e51b815260206004820152603660248201527f53656c6c207472616e7366657220616d6f756e742065786365656473207468656044820152751036b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760511b6064820152608401610ba6565b6001600160a01b0382166000908152601b602052604090205460ff166125f4576025546125a183611456565b6125ab90836137dc565b11156125f45760405162461bcd60e51b815260206004820152601860248201527710d85b9b9bdd08195e18d95959081b585e081dd85b1b195d60421b6044820152606401610ba6565b60006125ff30611456565b60235460275491925082101590600160a01b900460ff1615801561262c5750602754600160a81b900460ff165b801561264d575060275460009061264b906001600160a01b0316611456565b115b80156126565750805b801561267a57506001600160a01b03841660009081526022602052604090205460ff165b1561268757612687612b9b565b61268f611eba565b6003600d556001600160a01b03851660009081526008602052604090205460ff161580156126d657506001600160a01b03841660009081526008602052604090205460ff16155b1561276e576001600160a01b03851660009081526022602052604090205460ff161561272757601254600e5560145460135461271291906137dc565b601081905515612722576001600d555b61276e565b6001600160a01b03841660009081526022602052604090205460ff161561276e57601554600e5560175460165461275e91906137dc565b60108190551561276e576002600d555b612779858585611ee8565b61278a600f54600e55601154601055565b5050505050565b600081848411156127b55760405162461bcd60e51b8152600401610ba691906133e7565b5060006127c28486613825565b95945050505050565b60008060006127d8612d40565b90925090506127e78282611d12565b9250505090565b6000806127fb83856137dc565b905083811015610f2e5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610ba6565b60008060008060008060008060006128648a612eec565b92509250925060008060006128828d868661287d6127cb565b612f2e565b919f909e50909c50959a5093985091965092945050505050565b6001600160a01b0382166000908152602260205260409020805460ff19168215151790556128ca8282611578565b80156128d9576128d982611204565b80610da857610da882610f35565b600081836129085760405162461bcd60e51b8152600401610ba691906133e7565b5060006127c2848661391e565b6000806000806000806129278761284d565b6001600160a01b038f16600090815260066020526040902054959b509399509197509550935091506129599088611d54565b6001600160a01b038a166000908152600660209081526040808320939093556005905220546129889087611d54565b6001600160a01b03808b1660009081526005602052604080822093909355908a16815220546129b790866127ee565b6001600160a01b0389166000908152600560205260409020556129d981612f7e565b6129e384836130e3565b876001600160a01b0316896001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef85604051612a2891815260200190565b60405180910390a3505050505050505050565b600080600080600080612a4d8761284d565b6001600160a01b038f16600090815260056020526040902054959b50939950919750955093509150612a7f9087611d54565b6001600160a01b03808b16600090815260056020908152604080832094909455918b16815260069091522054612ab590846127ee565b6001600160a01b0389166000908152600660209081526040808320939093556005905220546129b790866127ee565b600080600080600080612af68761284d565b6001600160a01b038f16600090815260066020526040902054959b50939950919750955093509150612b289088611d54565b6001600160a01b038a16600090815260066020908152604080832093909355600590522054612a7f9087611d54565b600080600080600080612b698761284d565b6001600160a01b038f16600090815260056020526040902054959b509399509197509550935091506129889087611d54565b6027805460ff60a01b1916600160a01b1790556000612bb930611456565b9050600080601f54601e54612bce91906137dc565b9050801580612bdb575082155b15612be857505050612d31565b6000600282601e5486612bfb91906137bd565b612c05919061391e565b612c0f919061391e565b90506000612c1d8583611d54565b905047612c2982613107565b6000612c354783611d54565b90506000612c5886612c52601f548561327090919063ffffffff16565b90611d12565b90506000612c668284613825565b6000601e819055601f5590508515801590612c815750600081115b15612cd257612c9086826132ef565b60408051868152602081018390529081018790527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a15b6003546040516001600160a01b03909116904790600081818185875af1925050503d8060008114612d1f576040519150601f19603f3d011682016040523d82523d6000602084013e612d24565b606091505b5050505050505050505050505b6027805460ff60a01b19169055565b600b5460009081906c01431e0fae6d7217caa0000000825b600a54811015612ea7578260056000600a8481548110612d7a57612d7a6137f4565b60009182526020808320909101546001600160a01b031683528201929092526040019020541180612de557508160066000600a8481548110612dbe57612dbe6137f4565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b15612e05575050600b54936c01431e0fae6d7217caa00000009350915050565b612e4b60056000600a8481548110612e1f57612e1f6137f4565b60009182526020808320909101546001600160a01b031683528201929092526040019020548490611d54565b9250612e9360066000600a8481548110612e6757612e676137f4565b60009182526020808320909101546001600160a01b031683528201929092526040019020548390611d54565b915080612e9f8161380a565b915050612d58565b50600b54612ec2906c01431e0fae6d7217caa0000000611d12565b821015612ee3575050600b54926c01431e0fae6d7217caa000000092509050565b90939092509050565b600080600080612efb856133af565b90506000612f08866133cb565b90506000612f2082612f1a8986611d54565b90611d54565b979296509094509092505050565b6000808080612f3d8886613270565b90506000612f4b8887613270565b90506000612f598888613270565b90506000612f6b82612f1a8686611d54565b939b939a50919850919650505050505050565b6001600d541415612fef57601054601354612f9990836137bd565b612fa3919061391e565b601e6000828254612fb491906137dc565b9091555050601054601454612fc990836137bd565b612fd3919061391e565b601f6000828254612fe491906137dc565b9091555061305b9050565b6002600d54141561305b5760105460165461300a90836137bd565b613014919061391e565b601e600082825461302591906137dc565b909155505060105460175461303a90836137bd565b613044919061391e565b601f600082825461305591906137dc565b90915550505b60006130656127cb565b905060006130738383613270565b3060009081526005602052604090205490915061309090826127ee565b3060009081526005602090815260408083209390935560099052205460ff1615610c8757306000908152600660205260409020546130ce90846127ee565b30600090815260066020526040902055505050565b600b546130f09083611d54565b600b55600c5461310090826127ee565b600c555050565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061313c5761313c6137f4565b6001600160a01b03928316602091820292909201810191909152602654604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b15801561319057600080fd5b505afa1580156131a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131c89190613888565b816001815181106131db576131db6137f4565b6001600160a01b0392831660209182029290920101526026546132019130911684611d96565b60265460405163791ac94760e01b81526001600160a01b039091169063791ac9479061323a908590600090869030904290600401613940565b600060405180830381600087803b15801561325457600080fd5b505af1158015613268573d6000803e3d6000fd5b505050505050565b60008261327f57506000610be3565b600061328b83856137bd565b905082613298858361391e565b14610f2e5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610ba6565b6026546133079030906001600160a01b031684611d96565b6026546004805460405163f305d71960e01b815230928101929092526024820185905260006044830181905260648301526001600160a01b0390811660848301524260a48301529091169063f305d71990839060c4016060604051808303818588803b15801561337657600080fd5b505af115801561338a573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061278a919061397c565b6000610be36064612c52600e548561327090919063ffffffff16565b6000610be36064612c526010548561327090919063ffffffff16565b600060208083528351808285015260005b81811015613414578581018301518582016040015282016133f8565b81811115613426576000604083870101525b50601f01601f1916929092016040019392505050565b60006020828403121561344e57600080fd5b5035919050565b6001600160a01b038116811461346a57600080fd5b50565b6000806040838503121561348057600080fd5b823561348b81613455565b946020939093013593505050565b6000602082840312156134ab57600080fd5b8135610f2e81613455565b6000806000606084860312156134cb57600080fd5b505081359360208301359350604090920135919050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715613521576135216134e2565b604052919050565b600067ffffffffffffffff821115613543576135436134e2565b5060051b60200190565b600082601f83011261355e57600080fd5b8135602061357361356e83613529565b6134f8565b82815260059290921b8401810191818101908684111561359257600080fd5b8286015b848110156135ad5780358352918301918301613596565b509695505050505050565b600080604083850312156135cb57600080fd5b823567ffffffffffffffff808211156135e357600080fd5b818501915085601f8301126135f757600080fd5b8135602061360761356e83613529565b82815260059290921b8401810191818101908984111561362657600080fd5b948201945b8386101561364d57853561363e81613455565b8252948201949082019061362b565b9650508601359250508082111561366357600080fd5b506136708582860161354d565b9150509250929050565b60008060006060848603121561368f57600080fd5b833561369a81613455565b925060208401356136aa81613455565b929592945050506040919091013590565b801515811461346a57600080fd5b600080604083850312156136dc57600080fd5b8235915060208301356136ee816136bb565b809150509250929050565b6000806040838503121561370c57600080fd5b823561371781613455565b915060208301356136ee816136bb565b6000806040838503121561373a57600080fd5b823561374581613455565b915060208301356136ee81613455565b60006020828403121561376757600080fd5b8135610f2e816136bb565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b60008160001904831182151516156137d7576137d76137a7565b500290565b600082198211156137ef576137ef6137a7565b500190565b634e487b7160e01b600052603260045260246000fd5b600060001982141561381e5761381e6137a7565b5060010190565b600082821015613837576138376137a7565b500390565b634e487b7160e01b600052603160045260246000fd5b60006020828403121561386457600080fd5b5051919050565b60006020828403121561387d57600080fd5b8151610f2e816136bb565b60006020828403121561389a57600080fd5b8151610f2e81613455565b600081518084526020808501945080840160005b838110156138de5781516001600160a01b0316875295820195908201906001016138b9565b509495945050505050565b84815260806020820152600061390260808301866138a5565b6001600160a01b03949094166040830152506060015292915050565b60008261393b57634e487b7160e01b600052601260045260246000fd5b500490565b85815284602082015260a06040820152600061395f60a08301866138a5565b6001600160a01b0394909416606083015250608001529392505050565b60008060006060848603121561399157600080fd5b835192506020840151915060408401519050925092509256fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212208dc05b349e823ebe0bb7f9a411311b3951dc65cdd13d65152dc21f4f8e2aff7364736f6c634300080900334f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572

Deployed ByteCode Sourcemap

17538:28972:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22951:85;;;;;;;;;;-1:-1:-1;23023:5:0;;;;;;;;;;;-1:-1:-1;;;23023:5:0;;;;22951:85;;;;23023:5;22951:85;:::i;:::-;;;;;;;;26581:135;;;;;;;;;;-1:-1:-1;26581:135:0;;;;;:::i;:::-;;:::i;:::-;;23948:193;;;;;;;;;;-1:-1:-1;23948:193:0;;;;;:::i;:::-;;:::i;:::-;;;1422:14:1;;1415:22;1397:41;;1385:2;1370:18;23948:193:0;1257:187:1;19323:39:0;;;;;;;;;;;;;;;;;;;1595:25:1;;;1583:2;1568:18;19323:39:0;1449:177:1;19607:64:0;;;;;;;;;;-1:-1:-1;19607:64:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;25487:89;;;;;;;;;;-1:-1:-1;25558:10:0;;25487:89;;20429:41;;;;;;;;;;-1:-1:-1;20429:41:0;;;;-1:-1:-1;;;;;20429:41:0;;;;;;-1:-1:-1;;;;;2074:32:1;;;2056:51;;2044:2;2029:18;20429:41:0;1883:230:1;23234:97:0;;;;;;;;;;-1:-1:-1;18323:16:0;23234:97;;44460:377;;;;;;;;;;-1:-1:-1;44460:377:0;;;;;:::i;:::-;;:::i;19198:30::-;;;;;;;;;;;;;;;;27445:545;;;;;;;;;;-1:-1:-1;27445:545:0;;;;;:::i;:::-;;:::i;24149:448::-;;;;;;;;;;-1:-1:-1;24149:448:0;;;;;:::i;:::-;;:::i;44088:364::-;;;;;;;;;;-1:-1:-1;44088:364:0;;;;;:::i;:::-;;:::i;28258:322::-;;;;;;;;;;-1:-1:-1;28258:322:0;;;;;:::i;:::-;;:::i;23141:85::-;;;;;;;;;;-1:-1:-1;23141:85:0;;18568:2;5529:36:1;;5517:2;5502:18;23141:85:0;5387:184:1;17784:102:0;;;;;;;;;;-1:-1:-1;17784:102:0;;;;-1:-1:-1;;;;;17784:102:0;;;29265:471;;;;;;;;;;-1:-1:-1;29265:471:0;;;;;:::i;:::-;;:::i;24605:302::-;;;;;;;;;;-1:-1:-1;24605:302:0;;;;;:::i;:::-;;:::i;43847:113::-;;;;;;;;;;-1:-1:-1;43847:113:0;;;;;:::i;:::-;;:::i;26897:481::-;;;;;;;;;;-1:-1:-1;26897:481:0;;;;;:::i;:::-;;:::i;20477:28::-;;;;;;;;;;-1:-1:-1;20477:28:0;;;;-1:-1:-1;;;;;20477:28:0;;;19487:33;;;;;;;;;;-1:-1:-1;19487:33:0;;;;;;;;20542:41;;;;;;;;;;-1:-1:-1;20542:41:0;;;;-1:-1:-1;;;20542:41:0;;;;;;28588:459;;;;;;;;;;-1:-1:-1;28588:459:0;;;;;:::i;:::-;;:::i;45046:193::-;;;;;;;;;;-1:-1:-1;45046:193:0;;;;;:::i;:::-;;:::i;43713:126::-;;;;;;;;;;-1:-1:-1;43713:126:0;;;;;:::i;:::-;-1:-1:-1;;;;;43804:27:0;43780:4;43804:27;;;:18;:27;;;;;;;;;43713:126;8240:90;;;;;;;;;;-1:-1:-1;8307:15:0;8240:90;;8142;;;;;;;;;;-1:-1:-1;8215:9:0;;8142:90;;19567:31;;;;;;;;;;-1:-1:-1;19567:31:0;;;;;;;;;;;23339:198;;;;;;;;;;-1:-1:-1;23339:198:0;;;;;:::i;:::-;;:::i;7697:148::-;;;;;;;;;;;;;:::i;28058:192::-;;;;;;;;;;;;;:::i;29055:202::-;;;;;;;;;;-1:-1:-1;29055:202:0;;;;;:::i;:::-;;:::i;46151:356::-;;;;;;;;;;-1:-1:-1;46151:356:0;;;;;:::i;:::-;;:::i;19235:36::-;;;;;;;;;;;;;;;;25325:154;;;;;;;;;;-1:-1:-1;25325:154:0;;;;;:::i;:::-;-1:-1:-1;;;;;25451:20:0;25422:4;25451:20;;;:11;:20;;;;;;;;;25325:154;25630:166;;;;;;;;;;;;;:::i;7483:79::-;;;;;;;;;;-1:-1:-1;7521:7:0;7548:6;-1:-1:-1;;;;;7548:6:0;7483:79;;44845:193;;;;;;;;;;-1:-1:-1;44845:193:0;;;;;:::i;:::-;;:::i;25934:244::-;;;;;;;;;;-1:-1:-1;25934:244:0;;;;;:::i;:::-;;:::i;26464:109::-;;;;;;;;;;-1:-1:-1;26464:109:0;;;;;:::i;:::-;;:::i;25804:122::-;;;;;;;;;;-1:-1:-1;25895:23:0;;25804:122;;24915:402;;;;;;;;;;-1:-1:-1;24915:402:0;;;;;:::i;:::-;;:::i;17661:93::-;;;;;;;;;;-1:-1:-1;17661:93:0;;;;-1:-1:-1;;;;;17661:93:0;;;23545:201;;;;;;;;;;-1:-1:-1;23545:201:0;;;;;:::i;:::-;;:::i;20242:58::-;;;;;;;;;;-1:-1:-1;20242:58:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;19527:33;;;;;;;;;;-1:-1:-1;19527:33:0;;;;;;;;;;;45247:171;;;;;;;;;;-1:-1:-1;45247:171:0;;;;;:::i;:::-;;:::i;19154:35::-;;;;;;;;;;;;;;;;19278:36;;;;;;;;;;;;;;;;19859:39;;;;;;;;;;-1:-1:-1;19859:39:0;;;;;;;;20354:35;;;;;;;;;;;;;;;;20309:38;;;;;;;;;;;;;;;;19112:35;;;;;;;;;;;;;;;;23754:186;;;;;;;;;;-1:-1:-1;23754:186:0;;;;;:::i;:::-;-1:-1:-1;;;;;23905:18:0;;;23873:7;23905:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;23754:186;26755:134;;;;;;;;;;;;;:::i;43968:112::-;;;;;;;;;;-1:-1:-1;43968:112:0;;;;;:::i;:::-;;:::i;19408:37::-;;;;;;;;;;;;;;;;19076:29;;;;;;;;;;;;;;;;7853:281;;;;;;;;;;-1:-1:-1;7853:281:0;;;;;:::i;:::-;;:::i;20396:24::-;;;;;;;;;;;;;;;;45521:527;;;;;;;;;;-1:-1:-1;45521:527:0;;;;;:::i;:::-;;:::i;26581:135::-;7610:6;;-1:-1:-1;;;;;7610:6:0;1222:10;7610:22;7602:67;;;;-1:-1:-1;;;7602:67:0;;;;;;;:::i;:::-;;;;;;;;;26665:3:::1;26658;:10;;26650:19;;;::::0;::::1;;26696:12;:3:::0;26702:6:::1;26696:12;:::i;:::-;26680:13;:28:::0;-1:-1:-1;26581:135:0:o;23948:193::-;24050:4;24072:39;1222:10;24095:7;24104:6;24072:8;:39::i;:::-;-1:-1:-1;24129:4:0;23948:193;;;;;:::o;44460:377::-;7610:6;;-1:-1:-1;;;;;7610:6:0;1222:10;7610:22;7602:67;;;;-1:-1:-1;;;7602:67:0;;;;;;;:::i;:::-;44605:11:::1;:24:::0;;;44640:17:::1;:36:::0;;;44687:17:::1;:36:::0;;;44797:2:::1;44707:16:::0;44742:31:::1;44660:16:::0;44619:10;44742:31:::1;:::i;:::-;:51;;;;:::i;:::-;:57;;44734:95;;;::::0;-1:-1:-1;;;44734:95:0;;8472:2:1;44734:95:0::1;::::0;::::1;8454:21:1::0;8511:2;8491:18;;;8484:30;8550:27;8530:18;;;8523:55;8595:18;;44734:95:0::1;8270:349:1::0;44734:95:0::1;44460:377:::0;;;:::o;27445:545::-;7610:6;;-1:-1:-1;;;;;7610:6:0;1222:10;7610:22;7602:67;;;;-1:-1:-1;;;7602:67:0;;;;;;;:::i;:::-;27594:6:::1;:13;27569:14;:21;:38;27561:100;;;::::0;-1:-1:-1;;;27561:100:0;;8826:2:1;27561:100:0::1;::::0;::::1;8808:21:1::0;8865:2;8845:18;;;8838:30;8904:34;8884:18;;;8877:62;-1:-1:-1;;;8955:18:1;;;8948:47;9012:19;;27561:100:0::1;8624:413:1::0;27561:100:0::1;27672:14;:12;:14::i;:::-;18694:1;27697:15;:26:::0;27738:9:::1;27734:223;27757:14;:21;27753:1;:25;27734:223;;;27799:14;27816;27831:1;27816:17;;;;;;;;:::i;:::-;;;;;;;27799:34;;27848:21;27872:6;27879:1;27872:9;;;;;;;;:::i;:::-;;;;;;;27848:33;;27896:49;27911:10;27923:6;27931:13;27896:14;:49::i;:::-;27784:173;;27780:3;;;;;:::i;:::-;;;;27734:223;;;;27967:15;43634::::0;;43624:7;:25;43676:21;;43660:13;:37;43580:125;27967:15:::1;27445:545:::0;;:::o;24149:448::-;24283:4;24300:36;24310:6;24318:9;24329:6;24300:9;:36::i;:::-;24347:220;24370:6;1222:10;24418:138;24474:6;24418:138;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;24418:19:0;;;;;;:11;:19;;;;;;;;1222:10;24418:33;;;;;;;;;;:37;:138::i;:::-;24347:8;:220::i;:::-;-1:-1:-1;24585:4:0;24149:448;;;;;:::o;44088:364::-;7610:6;;-1:-1:-1;;;;;7610:6:0;1222:10;7610:22;7602:67;;;;-1:-1:-1;;;7602:67:0;;;;;;;:::i;:::-;44229:10:::1;:22:::0;;;44262:16:::1;:34:::0;;;44307:16:::1;:34:::0;;;44326:15;44360:29:::1;44281:15:::0;44242:9;44360:29:::1;:::i;:::-;:48;;;;:::i;:::-;:54;;44352:92;;;::::0;-1:-1:-1;;;44352:92:0;;9516:2:1;44352:92:0::1;::::0;::::1;9498:21:1::0;9555:2;9535:18;;;9528:30;9594:27;9574:18;;;9567:55;9639:18;;44352:92:0::1;9314:349:1::0;28258:322:0;28352:7;28410;;28399;:18;;28377:110;;;;-1:-1:-1;;;28377:110:0;;9870:2:1;28377:110:0;;;9852:21:1;9909:2;9889:18;;;9882:30;9948:34;9928:18;;;9921:62;-1:-1:-1;;;9999:18:1;;;9992:40;10049:19;;28377:110:0;9668:406:1;28377:110:0;28498:19;28520:10;:8;:10::i;:::-;28498:32;-1:-1:-1;28548:24:0;:7;28498:32;28548:11;:24::i;:::-;28541:31;28258:322;-1:-1:-1;;;28258:322:0:o;29265:471::-;7610:6;;-1:-1:-1;;;;;7610:6:0;1222:10;7610:22;7602:67;;;;-1:-1:-1;;;7602:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;29343:20:0;::::1;;::::0;;;:11:::1;:20;::::0;;;;;::::1;;29335:56;;;::::0;-1:-1:-1;;;29335:56:0;;10281:2:1;29335:56:0::1;::::0;::::1;10263:21:1::0;10320:2;10300:18;;;10293:30;10359:25;10339:18;;;10332:53;10402:18;;29335:56:0::1;10079:347:1::0;29335:56:0::1;29407:9;29402:327;29426:9;:16:::0;29422:20;::::1;29402:327;;;29484:7;-1:-1:-1::0;;;;;29468:23:0::1;:9;29478:1;29468:12;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;29468:12:0::1;:23;29464:254;;;29527:9;29537:16:::0;;:20:::1;::::0;29556:1:::1;::::0;29537:20:::1;:::i;:::-;29527:31;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;29512:9:::1;:12:::0;;-1:-1:-1;;;;;29527:31:0;;::::1;::::0;29522:1;;29512:12;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;;::::1;:46:::0;;-1:-1:-1;;;;;;29512:46:0::1;-1:-1:-1::0;;;;;29512:46:0;;::::1;;::::0;;29577:16;;::::1;::::0;;:7:::1;:16:::0;;;;;;:20;;;29616:11:::1;:20:::0;;;;:28;;-1:-1:-1;;29616:28:0::1;::::0;;29663:9:::1;:15:::0;;;::::1;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;-1:-1:-1;;29663:15:0;;;;;-1:-1:-1;;;;;;29663:15:0::1;::::0;;;;;27445:545;;:::o;29464:254::-:1;29444:3:::0;::::1;::::0;::::1;:::i;:::-;;;;29402:327;;24605:302:::0;1222:10;24722:4;24816:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;24816:34:0;;;;;;;;;;24722:4;;24744:133;;24794:7;;24816:50;;24855:10;24816:38;:50::i;43847:113::-;7610:6;;-1:-1:-1;;;;;7610:6:0;1222:10;7610:22;7602:67;;;;-1:-1:-1;;;7602:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;43918:27:0::1;;::::0;;;:18:::1;:27;::::0;;;;:34;;-1:-1:-1;;43918:34:0::1;43948:4;43918:34;::::0;;43847:113::o;26897:481::-;27017:7;18323:16;27050:7;:18;;27042:62;;;;-1:-1:-1;;;27042:62:0;;10895:2:1;27042:62:0;;;10877:21:1;10934:2;10914:18;;;10907:30;10973:33;10953:18;;;10946:61;11024:18;;27042:62:0;10693:355:1;27042:62:0;27120:17;27115:256;;27155:15;27184:19;27195:7;27184:10;:19::i;:::-;-1:-1:-1;27154:49:0;;-1:-1:-1;27218:14:0;;-1:-1:-1;;;;;27218:14:0;27115:256;27268:23;27303:19;27314:7;27303:10;:19::i;:::-;-1:-1:-1;27265:57:0;;-1:-1:-1;27337:22:0;;-1:-1:-1;;;;;27337:22:0;28588:459;7610:6;;-1:-1:-1;;;;;7610:6:0;1222:10;7610:22;7602:67;;;;-1:-1:-1;;;7602:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;28669:20:0;::::1;;::::0;;;:11:::1;:20;::::0;;;;;::::1;;28668:21;28660:61;;;::::0;-1:-1:-1;;;28660:61:0;;11255:2:1;28660:61:0::1;::::0;::::1;11237:21:1::0;11294:2;11274:18;;;11267:30;11333:29;11313:18;;;11306:57;11380:18;;28660:61:0::1;11053:351:1::0;28660:61:0::1;28740:9;:16:::0;28764:2:::1;::::0;28740:20:::1;::::0;28759:1:::1;28740:20;:::i;:::-;:26;;28732:116;;;::::0;-1:-1:-1;;;28732:116:0;;11611:2:1;28732:116:0::1;::::0;::::1;11593:21:1::0;11650:2;11630:18;;;11623:30;11689:34;11669:18;;;11662:62;11760:34;11740:18;;;11733:62;-1:-1:-1;;;11811:19:1;;;11804:44;11865:19;;28732:116:0::1;11409:481:1::0;28732:116:0::1;-1:-1:-1::0;;;;;28863:16:0;::::1;28882:1;28863:16:::0;;;:7:::1;:16;::::0;;;;;:20;28859:109:::1;;-1:-1:-1::0;;;;;28939:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;;28919:37:::1;::::0;:19:::1;:37::i;:::-;-1:-1:-1::0;;;;;28900:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;:56;28859:109:::1;-1:-1:-1::0;;;;;28978:20:0::1;;::::0;;;:11:::1;:20;::::0;;;;:27;;-1:-1:-1;;28978:27:0::1;29001:4;28978:27:::0;;::::1;::::0;;;29016:9:::1;:23:::0;;;;::::1;::::0;;;;;;::::1;::::0;;-1:-1:-1;;;;;;29016:23:0::1;::::0;;::::1;::::0;;28588:459::o;45046:193::-;7610:6;;-1:-1:-1;;;;;7610:6:0;1222:10;7610:22;7602:67;;;;-1:-1:-1;;;7602:67:0;;;;;;;:::i;:::-;45132:16:::1;:45:::0;;-1:-1:-1;;;;;45132:45:0;;::::1;-1:-1:-1::0;;;;;;45132:45:0;;::::1;::::0;::::1;::::0;;:16:::1;45188:36:::0;;;:18:::1;:36;::::0;;;;:43;;-1:-1:-1;;45188:43:0::1;45132:45:::0;45188:43:::1;::::0;;45046:193::o;23339:198::-;-1:-1:-1;;;;;23429:20:0;;23405:7;23429:20;;;:11;:20;;;;;;;;23425:49;;;-1:-1:-1;;;;;;23458:16:0;;;;;:7;:16;;;;;;;23339:198::o;23425:49::-;-1:-1:-1;;;;;23512:16:0;;;;;;:7;:16;;;;;;23492:37;;:19;:37::i;7697:148::-;7610:6;;-1:-1:-1;;;;;7610:6:0;1222:10;7610:22;7602:67;;;;-1:-1:-1;;;7602:67:0;;;;;;;:::i;:::-;7804:1:::1;7788:6:::0;;7767:40:::1;::::0;-1:-1:-1;;;;;7788:6:0;;::::1;::::0;7767:40:::1;::::0;7804:1;;7767:40:::1;7835:1;7818:19:::0;;-1:-1:-1;;;;;;7818:19:0::1;::::0;;7697:148::o;28058:192::-;28110:4;7610:6;;-1:-1:-1;;;;;7610:6:0;1222:10;7610:22;7602:67;;;;-1:-1:-1;;;7602:67:0;;;;;;;:::i;:::-;-1:-1:-1;28126:14:0::1;:22:::0;;-1:-1:-1;;28126:22:0;;::::1;::::0;;;28159:14:::1;:22:::0;;;::::1;::::0;;28192:20:::1;:28:::0;;;;::::1;::::0;;28126:22;28058:192;:::o;29055:202::-;7610:6;;-1:-1:-1;;;;;7610:6:0;1222:10;7610:22;7602:67;;;;-1:-1:-1;;;7602:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;29145:39:0;::::1;;::::0;;;:31:::1;:39;::::0;;;;;;;;:46;;-1:-1:-1;;29145:46:0::1;::::0;::::1;;::::0;;::::1;::::0;;;29207:42;;1397:41:1;;;29207:42:0::1;::::0;1370:18:1;29207:42:0::1;;;;;;;29055:202:::0;;:::o;46151:356::-;46265:10;7610:6;;-1:-1:-1;;;;;7610:6:0;1222:10;7610:22;7602:67;;;;-1:-1:-1;;;7602:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;46301:23:0;::::1;46319:4;46301:23;;46293:64;;;::::0;-1:-1:-1;;;46293:64:0;;12097:2:1;46293:64:0::1;::::0;::::1;12079:21:1::0;12136:2;12116:18;;;12109:30;12175;12155:18;;;12148:58;12223:18;;46293:64:0::1;11895:352:1::0;46293:64:0::1;46395:39;::::0;-1:-1:-1;;;46395:39:0;;46428:4:::1;46395:39;::::0;::::1;2056:51:1::0;46368:24:0::1;::::0;-1:-1:-1;;;;;46395:24:0;::::1;::::0;::::1;::::0;2029:18:1;;46395:39:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46453:46;::::0;-1:-1:-1;;;46453:46:0;;-1:-1:-1;;;;;12633:32:1;;;46453:46:0::1;::::0;::::1;12615:51:1::0;12682:18;;;12675:34;;;46368:66:0;;-1:-1:-1;46453:23:0;;::::1;::::0;::::1;::::0;12588:18:1;;46453:46:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46445:54:::0;46151:356;-1:-1:-1;;;;46151:356:0:o;25630:166::-;7610:6;;-1:-1:-1;;;;;7610:6:0;1222:10;7610:22;7602:67;;;;-1:-1:-1;;;7602:67:0;;;;;;;:::i;:::-;25685:13:::1;:20:::0;;-1:-1:-1;;25685:20:0::1;;;::::0;;25716:21:::1;:28:::0;;-1:-1:-1;;;;25716:28:0::1;-1:-1:-1::0;;;25716:28:0::1;::::0;;25776:12:::1;25755:18;:33:::0;25630:166::o;44845:193::-;7610:6;;-1:-1:-1;;;;;7610:6:0;1222:10;7610:22;7602:67;;;;-1:-1:-1;;;7602:67:0;;;;;;;:::i;:::-;44931:16:::1;:45:::0;;-1:-1:-1;;;;;44931:45:0;;::::1;-1:-1:-1::0;;;;;;44931:45:0;;::::1;::::0;::::1;::::0;;:16:::1;44987:36:::0;;;:18:::1;:36;::::0;;;;:43;;-1:-1:-1;;44987:43:0::1;44931:45:::0;44987:43:::1;::::0;;44845:193::o;25934:244::-;7610:6;;-1:-1:-1;;;;;7610:6:0;1222:10;7610:22;7602:67;;;;-1:-1:-1;;;7602:67:0;;;;;;;:::i;:::-;26041:13:::1;::::0;-1:-1:-1;;;;;26033:21:0;;::::1;26041:13:::0;::::1;26033:21;;26025:91;;;::::0;-1:-1:-1;;;26025:91:0;;13172:2:1;26025:91:0::1;::::0;::::1;13154:21:1::0;13211:2;13191:18;;;13184:30;13250:34;13230:18;;;13223:62;13321:27;13301:18;;;13294:55;13366:19;;26025:91:0::1;12970:421:1::0;26025:91:0::1;26129:41;26158:4;26164:5;26129:28;:41::i;26464:109::-:0;7610:6;;-1:-1:-1;;;;;7610:6:0;1222:10;7610:22;7602:67;;;;-1:-1:-1;;;7602:67:0;;;;;;;:::i;:::-;26541:14:::1;:24:::0;;-1:-1:-1;;26541:24:0::1;::::0;::::1;;::::0;;;::::1;::::0;;26464:109::o;24915:402::-;25037:4;25059:228;1222:10;25109:7;25131:145;25188:15;25131:145;;;;;;;;;;;;;;;;;1222:10;25131:25;;;;:11;:25;;;;;;;;-1:-1:-1;;;;;25131:34:0;;;;;;;;;;;;:38;:145::i;23545:201::-;23652:4;23674:42;1222:10;23698:9;23709:6;23674:9;:42::i;45247:171::-;7610:6;;-1:-1:-1;;;;;7610:6:0;1222:10;7610:22;7602:67;;;;-1:-1:-1;;;7602:67:0;;;;;;;:::i;:::-;45324:21:::1;:32:::0;;;::::1;;-1:-1:-1::0;;;45324:32:0::1;-1:-1:-1::0;;;;45324:32:0;;::::1;;::::0;;45372:38:::1;::::0;::::1;::::0;::::1;::::0;45348:8;1422:14:1;1415:22;1397:41;;1385:2;1370:18;;1257:187;45372:38:0::1;;;;;;;;45247:171:::0;:::o;26755:134::-;26815:4;7610:6;;-1:-1:-1;;;;;7610:6:0;1222:10;7610:22;7602:67;;;;-1:-1:-1;;;7602:67:0;;;;;;;:::i;:::-;-1:-1:-1;26831:20:0::1;:28:::0;;-1:-1:-1;;26831:28:0::1;::::0;;;26755:134;:::o;43968:112::-;7610:6;;-1:-1:-1;;;;;7610:6:0;1222:10;7610:22;7602:67;;;;-1:-1:-1;;;7602:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;44037:27:0::1;44067:5;44037:27:::0;;;:18:::1;:27;::::0;;;;:35;;-1:-1:-1;;44037:35:0::1;::::0;;43968:112::o;7853:281::-;7610:6;;-1:-1:-1;;;;;7610:6:0;1222:10;7610:22;7602:67;;;;-1:-1:-1;;;7602:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;7956:22:0;::::1;7934:110;;;::::0;-1:-1:-1;;;7934:110:0;;13598:2:1;7934:110:0::1;::::0;::::1;13580:21:1::0;13637:2;13617:18;;;13610:30;13676:34;13656:18;;;13649:62;-1:-1:-1;;;13727:18:1;;;13720:36;13773:19;;7934:110:0::1;13396:402:1::0;7934:110:0::1;8081:6;::::0;;8060:38:::1;::::0;-1:-1:-1;;;;;8060:38:0;;::::1;::::0;8081:6;::::1;::::0;8060:38:::1;::::0;::::1;8109:6;:17:::0;;-1:-1:-1;;;;;;8109:17:0::1;-1:-1:-1::0;;;;;8109:17:0;;;::::1;::::0;;;::::1;::::0;;7853:281::o;45521:527::-;7610:6;;-1:-1:-1;;;;;7610:6:0;1222:10;7610:22;7602:67;;;;-1:-1:-1;;;7602:67:0;;;;;;;:::i;:::-;45680:16:::1;::::0;;45694:1:::1;45680:16:::0;;;;;::::1;::::0;;45656:21:::1;::::0;45680:16:::1;::::0;::::1;::::0;;::::1;::::0;::::1;-1:-1:-1::0;;45717:15:0::1;::::0;:22:::1;::::0;;-1:-1:-1;;;45717:22:0;;;;45656:40;;-1:-1:-1;;;;;;45717:15:0;;::::1;::::0;:20:::1;::::0;-1:-1:-1;45717:22:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;:15;:22;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45707:4;45712:1;45707:7;;;;;;;;:::i;:::-;;;;;;:32;-1:-1:-1::0;;;;;45707:32:0::1;;;-1:-1:-1::0;;;;;45707:32:0::1;;;::::0;::::1;45768:4;45750;45755:1;45750:7;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;45750:23:0;;::::1;:7;::::0;;::::1;::::0;;;;;:23;45812:15:::1;::::0;:228:::1;::::0;-1:-1:-1;;;45812:228:0;;:15;::::1;::::0;:66:::1;::::0;45886:14;;45812:228:::1;::::0;:15:::1;::::0;45965:4;;45992:6:::1;::::0;46014:15:::1;::::0;45812:228:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;45587:461;45521:527:::0;:::o;3140:132::-;3198:7;3225:39;3229:1;3232;3225:39;;;;;;;;;;;;;;;;;:3;:39::i;2504:136::-;2562:7;2589:43;2593:1;2596;2589:43;;;;;;;;;;;;;;;;;:3;:43::i;29744:371::-;-1:-1:-1;;;;;29871:19:0;;29863:68;;;;-1:-1:-1;;;29863:68:0;;15242:2:1;29863:68:0;;;15224:21:1;15281:2;15261:18;;;15254:30;15320:34;15300:18;;;15293:62;-1:-1:-1;;;15371:18:1;;;15364:34;15415:19;;29863:68:0;15040:400:1;29863:68:0;-1:-1:-1;;;;;29950:21:0;;29942:68;;;;-1:-1:-1;;;29942:68:0;;15647:2:1;29942:68:0;;;15629:21:1;15686:2;15666:18;;;15659:30;15725:34;15705:18;;;15698:62;-1:-1:-1;;;15776:18:1;;;15769:32;15818:19;;29942:68:0;15445:398:1;29942:68:0;-1:-1:-1;;;;;30023:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;30075:32;;1595:25:1;;;30075:32:0;;1568:18:1;30075:32:0;;;;;;;29744:371;;;:::o;43337:235::-;43384:7;;:12;:34;;;;-1:-1:-1;43400:13:0;;:18;43384:34;43380:47;;;43337:235::o;43380:47::-;43457:7;;;43439:15;:25;43499:13;;;43475:21;:37;-1:-1:-1;43525:11:0;;;;43547:17;43337:235::o;36133:604::-;-1:-1:-1;;;;;36267:19:0;;;;;;:11;:19;;;;;;;;:46;;;;-1:-1:-1;;;;;;36291:22:0;;;;;;:11;:22;;;;;;;;36290:23;36267:46;36263:467;;;36330:48;36352:6;36360:9;36371:6;36330:21;:48::i;36263:467::-;-1:-1:-1;;;;;36401:19:0;;;;;;:11;:19;;;;;;;;36400:20;:46;;;;-1:-1:-1;;;;;;36424:22:0;;;;;;:11;:22;;;;;;;;36400:46;36396:334;;;36463:46;36483:6;36491:9;36502:6;36463:19;:46::i;36396:334::-;-1:-1:-1;;;;;36531:19:0;;;;;;:11;:19;;;;;;;;:45;;;;-1:-1:-1;;;;;;36554:22:0;;;;;;:11;:22;;;;;;;;36531:45;36527:203;;;36593:48;36615:6;36623:9;36634:6;36593:21;:48::i;36527:203::-;36674:44;36692:6;36700:9;36711:6;36674:17;:44::i;30123:3780::-;-1:-1:-1;;;;;30245:18:0;;30237:68;;;;-1:-1:-1;;;30237:68:0;;16050:2:1;30237:68:0;;;16032:21:1;16089:2;16069:18;;;16062:30;16128:34;16108:18;;;16101:62;-1:-1:-1;;;16179:18:1;;;16172:35;16224:19;;30237:68:0;15848:401:1;30237:68:0;-1:-1:-1;;;;;30324:16:0;;30316:64;;;;-1:-1:-1;;;30316:64:0;;16456:2:1;30316:64:0;;;16438:21:1;16495:2;16475:18;;;16468:30;16534:34;16514:18;;;16507:62;-1:-1:-1;;;16585:18:1;;;16578:33;16628:19;;30316:64:0;16254:399:1;30316:64:0;30408:1;30399:6;:10;30391:64;;;;-1:-1:-1;;;30391:64:0;;16860:2:1;30391:64:0;;;16842:21:1;16899:2;16879:18;;;16872:30;16938:34;16918:18;;;16911:62;-1:-1:-1;;;16989:18:1;;;16982:39;17038:19;;30391:64:0;16658:405:1;30391:64:0;30472:13;;;;;;;30468:134;;-1:-1:-1;;;;;30509:24:0;;;;;;:18;:24;;;;;;;;;:50;;-1:-1:-1;;;;;;30537:22:0;;;;;;:18;:22;;;;;;;;30509:50;30501:89;;;;-1:-1:-1;;;30501:89:0;;17270:2:1;30501:89:0;;;17252:21:1;17309:2;17289:18;;;17282:30;17348:28;17328:18;;;17321:56;17394:18;;30501:89:0;17068:350:1;30501:89:0;30617:14;;;;30614:1901;;;7521:7;7548:6;-1:-1:-1;;;;;30669:15:0;;;7548:6;;30669:15;;;;:49;;-1:-1:-1;7521:7:0;7548:6;-1:-1:-1;;;;;30705:13:0;;;7548:6;;30705:13;;30669:49;:86;;;;-1:-1:-1;;;;;;30739:16:0;;;;30669:86;:128;;;;-1:-1:-1;;;;;;30776:21:0;;30790:6;30776:21;;30669:128;:166;;;;-1:-1:-1;30819:16:0;;-1:-1:-1;;;30819:16:0;;;;30818:17;30669:166;30647:1857;;;30948:14;;;;:49;;;;-1:-1:-1;;;;;;30966:31:0;;;;;;:25;:31;;;;;;;;30948:49;30944:163;;;31045:13;;31030:11;:28;;31022:65;;;;-1:-1:-1;;;31022:65:0;;17625:2:1;31022:65:0;;;17607:21:1;17664:2;17644:18;;;17637:30;17703:26;17683:18;;;17676:54;17747:18;;31022:65:0;17423:348:1;31022:65:0;31263:20;;;;31259:423;;;7521:7;7548:6;-1:-1:-1;;;;;31311:13:0;;;7548:6;;31311:13;;;;:47;;-1:-1:-1;31342:15:0;;-1:-1:-1;;;;;31328:30:0;;;31342:15;;31328:30;;31311:47;:79;;;;-1:-1:-1;31376:13:0;;-1:-1:-1;;;;;31362:28:0;;;31376:13;;31362:28;;31311:79;31307:356;;;31455:9;31426:39;;;;:28;:39;;;;;;31468:12;-1:-1:-1;31418:140:0;;;;-1:-1:-1;;;31418:140:0;;17978:2:1;31418:140:0;;;17960:21:1;18017:2;17997:18;;;17990:30;18056:34;18036:18;;;18029:62;18127:34;18107:18;;;18100:62;-1:-1:-1;;;18178:19:1;;;18171:40;18228:19;;31418:140:0;17776:477:1;31418:140:0;31614:9;31585:39;;;;:28;:39;;;;;31627:12;31585:54;;31307:356;-1:-1:-1;;;;;31734:31:0;;;;;;:25;:31;;;;;;;;:71;;;;-1:-1:-1;;;;;;31770:35:0;;;;;;:31;:35;;;;;;;;31769:36;31734:71;31730:759;;;31848:20;;31838:6;:30;;31830:96;;;;-1:-1:-1;;;31830:96:0;;18460:2:1;31830:96:0;;;18442:21:1;18499:2;18479:18;;;18472:30;18538:34;18518:18;;;18511:62;-1:-1:-1;;;18589:18:1;;;18582:51;18650:19;;31830:96:0;18258:417:1;31830:96:0;31983:9;;31966:13;31976:2;31966:9;:13::i;:::-;31957:22;;:6;:22;:::i;:::-;:35;;31949:72;;;;-1:-1:-1;;;31949:72:0;;18882:2:1;31949:72:0;;;18864:21:1;18921:2;18901:18;;;18894:30;-1:-1:-1;;;18940:18:1;;;18933:54;19004:18;;31949:72:0;18680:348:1;31949:72:0;31730:759;;;-1:-1:-1;;;;;32097:29:0;;;;;;:25;:29;;;;;;;;:71;;;;-1:-1:-1;;;;;;32131:37:0;;;;;;:31;:37;;;;;;;;32130:38;32097:71;32093:396;;;32211:20;;32201:6;:30;;32193:97;;;;-1:-1:-1;;;32193:97:0;;19235:2:1;32193:97:0;;;19217:21:1;19274:2;19254:18;;;19247:30;19313:34;19293:18;;;19286:62;-1:-1:-1;;;19364:18:1;;;19357:52;19426:19;;32193:97:0;19033:418:1;32093:396:0;-1:-1:-1;;;;;32338:35:0;;;;;;:31;:35;;;;;;;;32333:156;;32431:9;;32414:13;32424:2;32414:9;:13::i;:::-;32405:22;;:6;:22;:::i;:::-;:35;;32397:72;;;;-1:-1:-1;;;32397:72:0;;18882:2:1;32397:72:0;;;18864:21:1;18921:2;18901:18;;;18894:30;-1:-1:-1;;;18940:18:1;;;18933:54;19004:18;;32397:72:0;18680:348:1;32397:72:0;32527:28;32558:24;32576:4;32558:9;:24::i;:::-;32661:23;;32748:16;;32527:55;;-1:-1:-1;32624:60:0;;;;-1:-1:-1;;;32748:16:0;;;;32747:17;:55;;;;-1:-1:-1;32781:21:0;;-1:-1:-1;;;32781:21:0;;;;32747:55;:100;;;;-1:-1:-1;32829:13:0;;32846:1;;32819:24;;-1:-1:-1;;;;;32829:13:0;32819:9;:24::i;:::-;:28;32747:100;:140;;;;;32864:23;32747:140;:186;;;;-1:-1:-1;;;;;;32904:29:0;;;;;;:25;:29;;;;;;;;32747:186;32729:253;;;32960:10;:8;:10::i;:::-;32994:14;:12;:14::i;:::-;18694:1;33021:15;:26;-1:-1:-1;;;;;33150:24:0;;;;;;:18;:24;;;;;;;;33149:25;:52;;;;-1:-1:-1;;;;;;33179:22:0;;;;;;:18;:22;;;;;;;;33178:23;33149:52;33145:676;;;-1:-1:-1;;;;;33242:31:0;;;;;;:25;:31;;;;;;;;33238:572;;;33304:10;;33294:7;:20;33368:16;;33349;;:35;;33368:16;33349:35;:::i;:::-;33333:13;:51;;;33406:17;33403:85;;18610:1;33447:15;:21;33403:85;33238:572;;;-1:-1:-1;;;;;33547:29:0;;;;;;:25;:29;;;;;;;;33543:267;;;33607:11;;33597:7;:21;33673:17;;33653;;:37;;33673:17;33653:37;:::i;:::-;33637:13;:53;;;33712:17;33709:86;;18650:1;33753:15;:22;33709:86;33833:32;33848:4;33854:2;33858:6;33833:14;:32::i;:::-;33878:15;43634;;43624:7;:25;43676:21;;43660:13;:37;43580:125;33878:15;30226:3677;;30123:3780;;;:::o;2648:226::-;2768:7;2804:12;2796:6;;;;2788:29;;;;-1:-1:-1;;;2788:29:0;;;;;;;;:::i;:::-;-1:-1:-1;2828:9:0;2840:5;2844:1;2840;:5;:::i;:::-;2828:17;2648:226;-1:-1:-1;;;;;2648:226:0:o;41430:164::-;41472:7;41493:15;41510;41529:19;:17;:19::i;:::-;41492:56;;-1:-1:-1;41492:56:0;-1:-1:-1;41566:20:0;41492:56;;41566:11;:20::i;:::-;41559:27;;;;41430:164;:::o;2315:181::-;2373:7;;2405:5;2409:1;2405;:5;:::i;:::-;2393:17;;2434:1;2429;:6;;2421:46;;;;-1:-1:-1;;;2421:46:0;;19658:2:1;2421:46:0;;;19640:21:1;19697:2;19677:18;;;19670:30;19736:29;19716:18;;;19709:57;19783:18;;2421:46:0;19456:351:1;39698:742:0;39798:7;39820;39842;39864;39886;39908;39958:23;39996:12;40023:18;40055:20;40067:7;40055:11;:20::i;:::-;39943:132;;;;;;40087:15;40104:23;40129:12;40145:113;40171:7;40193:4;40212:10;40237;:8;:10::i;:::-;40145:11;:113::i;:::-;40086:172;;;;-1:-1:-1;40086:172:0;;-1:-1:-1;40362:15:0;;-1:-1:-1;40392:4:0;;-1:-1:-1;40411:10:0;;-1:-1:-1;39698:742:0;;-1:-1:-1;;;;;39698:742:0:o;26186:270::-;-1:-1:-1;;;;;26269:31:0;;;;;;:25;:31;;;;;:39;;-1:-1:-1;;26269:39:0;;;;;;;26321:38;26269:31;:39;26321:25;:38::i;:::-;26373:5;26370:35;;;26380:23;26398:4;26380:17;:23::i;:::-;26419:5;26415:34;;26426:21;26442:4;26426:15;:21::i;3280:312::-;3400:7;3435:12;3428:5;3420:28;;;;-1:-1:-1;;;3420:28:0;;;;;;;;:::i;:::-;-1:-1:-1;3459:9:0;3471:5;3475:1;3471;:5;:::i;38084:686::-;38235:15;38265:23;38303:12;38330:23;38368:12;38395:18;38427:19;38438:7;38427:10;:19::i;:::-;-1:-1:-1;;;;;38475:15:0;;;;;;:7;:15;;;;;;38220:226;;-1:-1:-1;38220:226:0;;-1:-1:-1;38220:226:0;;-1:-1:-1;38220:226:0;-1:-1:-1;38220:226:0;-1:-1:-1;38220:226:0;-1:-1:-1;38475:28:0;;38495:7;38475:19;:28::i;:::-;-1:-1:-1;;;;;38457:15:0;;;;;;:7;:15;;;;;;;;:46;;;;38532:7;:15;;;;:28;;38552:7;38532:19;:28::i;:::-;-1:-1:-1;;;;;38514:15:0;;;;;;;:7;:15;;;;;;:46;;;;38592:18;;;;;;;:39;;38615:15;38592:22;:39::i;:::-;-1:-1:-1;;;;;38571:18:0;;;;;;:7;:18;;;;;:60;38642:26;38657:10;38642:14;:26::i;:::-;38679:23;38691:4;38697;38679:11;:23::i;:::-;38735:9;-1:-1:-1;;;;;38718:44:0;38727:6;-1:-1:-1;;;;;38718:44:0;;38746:15;38718:44;;;;1595:25:1;;1583:2;1568:18;;1449:177;38718:44:0;;;;;;;;38209:561;;;;;;38084:686;;;:::o;37378:698::-;37527:15;37557:23;37595:12;37622:23;37660:12;37687:18;37719:19;37730:7;37719:10;:19::i;:::-;-1:-1:-1;;;;;37767:15:0;;;;;;:7;:15;;;;;;37512:226;;-1:-1:-1;37512:226:0;;-1:-1:-1;37512:226:0;;-1:-1:-1;37512:226:0;-1:-1:-1;37512:226:0;-1:-1:-1;37512:226:0;-1:-1:-1;37767:28:0;;37512:226;37767:19;:28::i;:::-;-1:-1:-1;;;;;37749:15:0;;;;;;;:7;:15;;;;;;;;:46;;;;37827:18;;;;;:7;:18;;;;;:39;;37850:15;37827:22;:39::i;:::-;-1:-1:-1;;;;;37806:18:0;;;;;;:7;:18;;;;;;;;:60;;;;37898:7;:18;;;;:39;;37921:15;37898:22;:39::i;38778:757::-;38929:15;38959:23;38997:12;39024:23;39062:12;39089:18;39121:19;39132:7;39121:10;:19::i;:::-;-1:-1:-1;;;;;39169:15:0;;;;;;:7;:15;;;;;;38914:226;;-1:-1:-1;38914:226:0;;-1:-1:-1;38914:226:0;;-1:-1:-1;38914:226:0;-1:-1:-1;38914:226:0;-1:-1:-1;38914:226:0;-1:-1:-1;39169:28:0;;39189:7;39169:19;:28::i;:::-;-1:-1:-1;;;;;39151:15:0;;;;;;:7;:15;;;;;;;;:46;;;;39226:7;:15;;;;:28;;39246:7;39226:19;:28::i;36745:625::-;36892:15;36922:23;36960:12;36987:23;37025:12;37052:18;37084:19;37095:7;37084:10;:19::i;:::-;-1:-1:-1;;;;;37132:15:0;;;;;;:7;:15;;;;;;36877:226;;-1:-1:-1;36877:226:0;;-1:-1:-1;36877:226:0;;-1:-1:-1;36877:226:0;-1:-1:-1;36877:226:0;-1:-1:-1;36877:226:0;-1:-1:-1;37132:28:0;;36877:226;37132:19;:28::i;33911:1276::-;21089:16;:23;;-1:-1:-1;;;;21089:23:0;-1:-1:-1;;;21089:23:0;;;;33988:24:::1;34006:4;33988:9;:24::i;:::-;33962:50;;34023:12;34046:25:::0;34099:22:::1;;34074;;:47;;;;:::i;:::-;34046:75:::0;-1:-1:-1;34135:22:0;;;:46:::1;;-1:-1:-1::0;34161:20:0;;34135:46:::1;34132:60;;;34184:7;;;;;34132:60;34253:26;34347:1;34326:17;34301:22;;34283:15;:40;;;;:::i;:::-;:60;;;;:::i;:::-;34282:66;;;;:::i;:::-;34253:95:::0;-1:-1:-1;34359:26:0::1;34388:39;:15:::0;34253:95;34388:19:::1;:39::i;:::-;34359:68:::0;-1:-1:-1;34468:21:0::1;34502:36;34359:68:::0;34502:16:::1;:36::i;:::-;34551:18;34572:44;:21;34598:17:::0;34572:25:::1;:44::i;:::-;34551:65;;34629:23;34655:61;34698:17;34655:38;34670:22;;34655:10;:14;;:38;;;;:::i;:::-;:42:::0;::::1;:61::i;:::-;34629:87:::0;-1:-1:-1;34729:23:0::1;34755:28;34629:87:::0;34755:10;:28:::1;:::i;:::-;34821:1;34796:22;:26:::0;;;34833:22:::1;:26:::0;34729:54;-1:-1:-1;34875:22:0;;;;;:45:::1;;;34919:1;34901:15;:19;34875:45;34872:216;;;34936:49;34949:18;34969:15;34936:12;:49::i;:::-;35005:71;::::0;;20236:25:1;;;20292:2;20277:18;;20270:34;;;20320:18;;;20313:34;;;35005:71:0::1;::::0;20224:2:1;20209:18;35005:71:0::1;;;;;;;34872:216;35121:16;::::0;35113:64:::1;::::0;-1:-1:-1;;;;;35121:16:0;;::::1;::::0;35151:21:::1;::::0;35113:64:::1;::::0;;;35151:21;35121:16;35113:64:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;;;;;;;;21123:1:0::1;21135:16:::0;:24;;-1:-1:-1;;;;21135:24:0;;;33911:1276::o;41602:605::-;41700:7;;41653;;;;18323:16;41653:7;41754:338;41778:9;:16;41774:20;;41754:338;;;41862:7;41838;:21;41846:9;41856:1;41846:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;41846:12:0;41838:21;;;;;;;;;;;;;:31;;:83;;;41914:7;41890;:21;41898:9;41908:1;41898:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;41898:12:0;41890:21;;;;;;;;;;;;;:31;41838:83;41816:146;;;-1:-1:-1;;41945:7:0;;;18323:16;;-1:-1:-1;41602:605:0;-1:-1:-1;;41602:605:0:o;41816:146::-;41987:34;41999:7;:21;42007:9;42017:1;42007:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;42007:12:0;41999:21;;;;;;;;;;;;;41987:7;;:11;:34::i;:::-;41977:44;;42046:34;42058:7;:21;42066:9;42076:1;42066:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;42066:12:0;42058:21;;;;;;;;;;;;;42046:7;;:11;:34::i;:::-;42036:44;-1:-1:-1;41796:3:0;;;;:::i;:::-;;;;41754:338;;;-1:-1:-1;42116:7:0;;:20;;18323:16;42116:11;:20::i;:::-;42106:7;:30;42102:61;;;-1:-1:-1;;42146:7:0;;;18323:16;;-1:-1:-1;41602:605:0;-1:-1:-1;41602:605:0:o;42102:61::-;42182:7;;42191;;-1:-1:-1;41602:605:0;-1:-1:-1;41602:605:0:o;40448:412::-;40549:7;40571;40593;40628:12;40643:24;40659:7;40643:15;:24::i;:::-;40628:39;;40678:18;40699:30;40721:7;40699:21;:30::i;:::-;40678:51;-1:-1:-1;40740:23:0;40766:33;40678:51;40766:17;:7;40778:4;40766:11;:17::i;:::-;:21;;:33::i;:::-;40740:59;40835:4;;-1:-1:-1;40841:10:0;;-1:-1:-1;40448:412:0;;-1:-1:-1;;;40448:412:0:o;40868:554::-;41067:7;;;;41164:24;:7;41176:11;41164;:24::i;:::-;41146:42;-1:-1:-1;41199:12:0;41214:21;:4;41223:11;41214:8;:21::i;:::-;41199:36;-1:-1:-1;41246:18:0;41267:27;:10;41282:11;41267:14;:27::i;:::-;41246:48;-1:-1:-1;41305:23:0;41331:33;41246:48;41331:17;:7;41343:4;41331:11;:17::i;:33::-;41383:7;;;;-1:-1:-1;41409:4:0;;-1:-1:-1;40868:554:0;;-1:-1:-1;;;;;;;40868:554:0:o;42215:794::-;18610:1;42281:15;;:22;42278:429;;;42377:13;;42358:16;;42345:29;;:10;:29;:::i;:::-;:45;;;;:::i;:::-;42319:22;;:71;;;;;;;:::i;:::-;;;;-1:-1:-1;;42463:13:0;;42444:16;;42431:29;;:10;:29;:::i;:::-;:45;;;;:::i;:::-;42405:22;;:71;;;;;;;:::i;:::-;;;;-1:-1:-1;42278:429:0;;-1:-1:-1;42278:429:0;;18650:1;42497:15;;:23;42494:213;;;42595:13;;42575:17;;42562:30;;:10;:30;:::i;:::-;:46;;;;:::i;:::-;42536:22;;:72;;;;;;;:::i;:::-;;;;-1:-1:-1;;42682:13:0;;42662:17;;42649:30;;:10;:30;:::i;:::-;:46;;;;:::i;:::-;42623:22;;:72;;;;;;;:::i;:::-;;;;-1:-1:-1;;42494:213:0;42717:19;42739:10;:8;:10::i;:::-;42717:32;-1:-1:-1;42760:18:0;42781:27;:10;42717:32;42781:14;:27::i;:::-;42860:4;42844:22;;;;:7;:22;;;;;;42760:48;;-1:-1:-1;42844:38:0;;42760:48;42844:26;:38::i;:::-;42835:4;42819:22;;;;:7;:22;;;;;;;;:63;;;;42897:11;:26;;;;;;42893:108;;;42979:4;42963:22;;;;:7;:22;;;;;;:38;;42990:10;42963:26;:38::i;:::-;42954:4;42938:22;;;;:7;:22;;;;;:63;42267:742;;42215:794;:::o;39543:147::-;39621:7;;:17;;39633:4;39621:11;:17::i;:::-;39611:7;:27;39662:10;;:20;;39677:4;39662:14;:20::i;:::-;39649:10;:33;-1:-1:-1;;39543:147:0:o;35195:499::-;35285:16;;;35299:1;35285:16;;;;;;;;35261:21;;35285:16;;;;;;;;;;-1:-1:-1;35285:16:0;35261:40;;35330:4;35312;35317:1;35312:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;35312:23:0;;;:7;;;;;;;;;;:23;;;;35356:15;;:22;;;-1:-1:-1;;;35356:22:0;;;;:15;;;;;:20;;:22;;;;;35312:7;;35356:22;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35346:4;35351:1;35346:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;35346:32:0;;;:7;;;;;;;;;:32;35421:15;;35389:62;;35406:4;;35421:15;35439:11;35389:8;:62::i;:::-;35462:15;;:224;;-1:-1:-1;;;35462:224:0;;-1:-1:-1;;;;;35462:15:0;;;;:66;;:224;;35543:11;;35462:15;;35613:4;;35640;;35660:15;;35462:224;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35250:444;35195:499;:::o;2882:250::-;2940:7;2964:6;2960:47;;-1:-1:-1;2994:1:0;2987:8;;2960:47;3019:9;3031:5;3035:1;3031;:5;:::i;:::-;3019:17;-1:-1:-1;3064:1:0;3055:5;3059:1;3019:17;3055:5;:::i;:::-;:10;3047:56;;;;-1:-1:-1;;;3047:56:0;;21357:2:1;3047:56:0;;;21339:21:1;21396:2;21376:18;;;21369:30;21435:34;21415:18;;;21408:62;-1:-1:-1;;;21486:18:1;;;21479:31;21527:19;;3047:56:0;21155:397:1;35702:423:0;35815:15;;35783:62;;35800:4;;-1:-1:-1;;;;;35815:15:0;35833:11;35783:8;:62::i;:::-;35856:15;;36060:16;;;35856:261;;-1:-1:-1;;;35856:261:0;;35928:4;35856:261;;;21906:34:1;;;;21956:18;;;21949:34;;;35856:15:0;21999:18:1;;;21992:34;;;22042:18;;;22035:34;-1:-1:-1;;;;;36060:16:0;;;22085:19:1;;;22078:44;36091:15:0;22138:19:1;;;22131:35;35856:15:0;;;;:31;;35895:9;;21840:19:1;;35856:261:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;43017:130::-;43081:7;43108:31;43133:5;43108:20;43120:7;;43108;:11;;:20;;;;:::i;43155:174::-;43252:7;43284:37;43315:5;43284:26;43296:13;;43284:7;:11;;:26;;;;:::i;14:597:1:-;126:4;155:2;184;173:9;166:21;216:6;210:13;259:6;254:2;243:9;239:18;232:34;284:1;294:140;308:6;305:1;302:13;294:140;;;403:14;;;399:23;;393:30;369:17;;;388:2;365:26;358:66;323:10;;294:140;;;452:6;449:1;446:13;443:91;;;522:1;517:2;508:6;497:9;493:22;489:31;482:42;443:91;-1:-1:-1;595:2:1;574:15;-1:-1:-1;;570:29:1;555:45;;;;602:2;551:54;;14:597;-1:-1:-1;;;14:597:1:o;616:180::-;675:6;728:2;716:9;707:7;703:23;699:32;696:52;;;744:1;741;734:12;696:52;-1:-1:-1;767:23:1;;616:180;-1:-1:-1;616:180:1:o;801:131::-;-1:-1:-1;;;;;876:31:1;;866:42;;856:70;;922:1;919;912:12;856:70;801:131;:::o;937:315::-;1005:6;1013;1066:2;1054:9;1045:7;1041:23;1037:32;1034:52;;;1082:1;1079;1072:12;1034:52;1121:9;1108:23;1140:31;1165:5;1140:31;:::i;:::-;1190:5;1242:2;1227:18;;;;1214:32;;-1:-1:-1;;;937:315:1:o;1631:247::-;1690:6;1743:2;1731:9;1722:7;1718:23;1714:32;1711:52;;;1759:1;1756;1749:12;1711:52;1798:9;1785:23;1817:31;1842:5;1817:31;:::i;2118:316::-;2195:6;2203;2211;2264:2;2252:9;2243:7;2239:23;2235:32;2232:52;;;2280:1;2277;2270:12;2232:52;-1:-1:-1;;2303:23:1;;;2373:2;2358:18;;2345:32;;-1:-1:-1;2424:2:1;2409:18;;;2396:32;;2118:316;-1:-1:-1;2118:316:1:o;2439:127::-;2500:10;2495:3;2491:20;2488:1;2481:31;2531:4;2528:1;2521:15;2555:4;2552:1;2545:15;2571:275;2642:2;2636:9;2707:2;2688:13;;-1:-1:-1;;2684:27:1;2672:40;;2742:18;2727:34;;2763:22;;;2724:62;2721:88;;;2789:18;;:::i;:::-;2825:2;2818:22;2571:275;;-1:-1:-1;2571:275:1:o;2851:183::-;2911:4;2944:18;2936:6;2933:30;2930:56;;;2966:18;;:::i;:::-;-1:-1:-1;3011:1:1;3007:14;3023:4;3003:25;;2851:183::o;3039:662::-;3093:5;3146:3;3139:4;3131:6;3127:17;3123:27;3113:55;;3164:1;3161;3154:12;3113:55;3200:6;3187:20;3226:4;3250:60;3266:43;3306:2;3266:43;:::i;:::-;3250:60;:::i;:::-;3344:15;;;3430:1;3426:10;;;;3414:23;;3410:32;;;3375:12;;;;3454:15;;;3451:35;;;3482:1;3479;3472:12;3451:35;3518:2;3510:6;3506:15;3530:142;3546:6;3541:3;3538:15;3530:142;;;3612:17;;3600:30;;3650:12;;;;3563;;3530:142;;;-1:-1:-1;3690:5:1;3039:662;-1:-1:-1;;;;;;3039:662:1:o;3706:1215::-;3824:6;3832;3885:2;3873:9;3864:7;3860:23;3856:32;3853:52;;;3901:1;3898;3891:12;3853:52;3941:9;3928:23;3970:18;4011:2;4003:6;4000:14;3997:34;;;4027:1;4024;4017:12;3997:34;4065:6;4054:9;4050:22;4040:32;;4110:7;4103:4;4099:2;4095:13;4091:27;4081:55;;4132:1;4129;4122:12;4081:55;4168:2;4155:16;4190:4;4214:60;4230:43;4270:2;4230:43;:::i;4214:60::-;4308:15;;;4390:1;4386:10;;;;4378:19;;4374:28;;;4339:12;;;;4414:19;;;4411:39;;;4446:1;4443;4436:12;4411:39;4470:11;;;;4490:217;4506:6;4501:3;4498:15;4490:217;;;4586:3;4573:17;4603:31;4628:5;4603:31;:::i;:::-;4647:18;;4523:12;;;;4685;;;;4490:217;;;4726:5;-1:-1:-1;;4769:18:1;;4756:32;;-1:-1:-1;;4800:16:1;;;4797:36;;;4829:1;4826;4819:12;4797:36;;4852:63;4907:7;4896:8;4885:9;4881:24;4852:63;:::i;:::-;4842:73;;;3706:1215;;;;;:::o;4926:456::-;5003:6;5011;5019;5072:2;5060:9;5051:7;5047:23;5043:32;5040:52;;;5088:1;5085;5078:12;5040:52;5127:9;5114:23;5146:31;5171:5;5146:31;:::i;:::-;5196:5;-1:-1:-1;5253:2:1;5238:18;;5225:32;5266:33;5225:32;5266:33;:::i;:::-;4926:456;;5318:7;;-1:-1:-1;;;5372:2:1;5357:18;;;;5344:32;;4926:456::o;5800:118::-;5886:5;5879:13;5872:21;5865:5;5862:32;5852:60;;5908:1;5905;5898:12;5923:309;5988:6;5996;6049:2;6037:9;6028:7;6024:23;6020:32;6017:52;;;6065:1;6062;6055:12;6017:52;6101:9;6088:23;6078:33;;6161:2;6150:9;6146:18;6133:32;6174:28;6196:5;6174:28;:::i;:::-;6221:5;6211:15;;;5923:309;;;;;:::o;6445:382::-;6510:6;6518;6571:2;6559:9;6550:7;6546:23;6542:32;6539:52;;;6587:1;6584;6577:12;6539:52;6626:9;6613:23;6645:31;6670:5;6645:31;:::i;:::-;6695:5;-1:-1:-1;6752:2:1;6737:18;;6724:32;6765:30;6724:32;6765:30;:::i;6832:388::-;6900:6;6908;6961:2;6949:9;6940:7;6936:23;6932:32;6929:52;;;6977:1;6974;6967:12;6929:52;7016:9;7003:23;7035:31;7060:5;7035:31;:::i;:::-;7085:5;-1:-1:-1;7142:2:1;7127:18;;7114:32;7155:33;7114:32;7155:33;:::i;7225:241::-;7281:6;7334:2;7322:9;7313:7;7309:23;7305:32;7302:52;;;7350:1;7347;7340:12;7302:52;7389:9;7376:23;7408:28;7430:5;7408:28;:::i;7471:356::-;7673:2;7655:21;;;7692:18;;;7685:30;7751:34;7746:2;7731:18;;7724:62;7818:2;7803:18;;7471:356::o;7832:127::-;7893:10;7888:3;7884:20;7881:1;7874:31;7924:4;7921:1;7914:15;7948:4;7945:1;7938:15;7964:168;8004:7;8070:1;8066;8062:6;8058:14;8055:1;8052:21;8047:1;8040:9;8033:17;8029:45;8026:71;;;8077:18;;:::i;:::-;-1:-1:-1;8117:9:1;;7964:168::o;8137:128::-;8177:3;8208:1;8204:6;8201:1;8198:13;8195:39;;;8214:18;;:::i;:::-;-1:-1:-1;8250:9:1;;8137:128::o;9042:127::-;9103:10;9098:3;9094:20;9091:1;9084:31;9134:4;9131:1;9124:15;9158:4;9155:1;9148:15;9174:135;9213:3;-1:-1:-1;;9234:17:1;;9231:43;;;9254:18;;:::i;:::-;-1:-1:-1;9301:1:1;9290:13;;9174:135::o;10431:125::-;10471:4;10499:1;10496;10493:8;10490:34;;;10504:18;;:::i;:::-;-1:-1:-1;10541:9:1;;10431:125::o;10561:127::-;10622:10;10617:3;10613:20;10610:1;10603:31;10653:4;10650:1;10643:15;10677:4;10674:1;10667:15;12252:184;12322:6;12375:2;12363:9;12354:7;12350:23;12346:32;12343:52;;;12391:1;12388;12381:12;12343:52;-1:-1:-1;12414:16:1;;12252:184;-1:-1:-1;12252:184:1:o;12720:245::-;12787:6;12840:2;12828:9;12819:7;12815:23;12811:32;12808:52;;;12856:1;12853;12846:12;12808:52;12888:9;12882:16;12907:28;12929:5;12907:28;:::i;13803:251::-;13873:6;13926:2;13914:9;13905:7;13901:23;13897:32;13894:52;;;13942:1;13939;13932:12;13894:52;13974:9;13968:16;13993:31;14018:5;13993:31;:::i;14059:461::-;14112:3;14150:5;14144:12;14177:6;14172:3;14165:19;14203:4;14232:2;14227:3;14223:12;14216:19;;14269:2;14262:5;14258:14;14290:1;14300:195;14314:6;14311:1;14308:13;14300:195;;;14379:13;;-1:-1:-1;;;;;14375:39:1;14363:52;;14435:12;;;;14470:15;;;;14411:1;14329:9;14300:195;;;-1:-1:-1;14511:3:1;;14059:461;-1:-1:-1;;;;;14059:461:1:o;14525:510::-;14796:6;14785:9;14778:25;14839:3;14834:2;14823:9;14819:18;14812:31;14759:4;14860:57;14912:3;14901:9;14897:19;14889:6;14860:57;:::i;:::-;-1:-1:-1;;;;;14953:32:1;;;;14948:2;14933:18;;14926:60;-1:-1:-1;15017:2:1;15002:18;14995:34;14852:65;14525:510;-1:-1:-1;;14525:510:1:o;19812:217::-;19852:1;19878;19868:132;;19922:10;19917:3;19913:20;19910:1;19903:31;19957:4;19954:1;19947:15;19985:4;19982:1;19975:15;19868:132;-1:-1:-1;20014:9:1;;19812:217::o;20568:582::-;20867:6;20856:9;20849:25;20910:6;20905:2;20894:9;20890:18;20883:34;20953:3;20948:2;20937:9;20933:18;20926:31;20830:4;20974:57;21026:3;21015:9;21011:19;21003:6;20974:57;:::i;:::-;-1:-1:-1;;;;;21067:32:1;;;;21062:2;21047:18;;21040:60;-1:-1:-1;21131:3:1;21116:19;21109:35;20966:65;20568:582;-1:-1:-1;;;20568:582:1:o;22177:306::-;22265:6;22273;22281;22334:2;22322:9;22313:7;22309:23;22305:32;22302:52;;;22350:1;22347;22340:12;22302:52;22379:9;22373:16;22363:26;;22429:2;22418:9;22414:18;22408:25;22398:35;;22473:2;22462:9;22458:18;22452:25;22442:35;;22177:306;;;;;:::o

Swarm Source

ipfs://8dc05b349e823ebe0bb7f9a411311b3951dc65cdd13d65152dc21f4f8e2aff73
Block Transaction Difficulty Gas Used Reward
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.

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.