Contract 0x2e7e287b53a880ddbce12e0cbc40779c476cab1e 2

Txn Hash Method
Block
From
To
Value [Txn Fee]
0x8485103e26fcb6250c7d7ed35921dd0eb6a322e0a82a6432e165d44d79f8860bDistribute Box59013342022-12-07 3:50:051 hr 59 mins ago0x55dc352c9247ea5168687a26e219933f8ba7a493 IN  0x2e7e287b53a880ddbce12e0cbc40779c476cab1e0 CRO0.73854442809 4,860.571703702
0x6fd3d89983d7a0eefdfe5ece2f4e9e57b0f03f6e2fea2bb858c06827b01b3d47Request Box With...59013332022-12-07 3:49:591 hr 59 mins ago0x2c9b17c98fab09b412f7edab37624f346b7de35e IN  0x2e7e287b53a880ddbce12e0cbc40779c476cab1e1 CRO0.750013449368 4,862.071655072
0x9997dae6551567bcbfb9ad80b5916bfe85c36a688772bbce42a492b2a53abfb2Distribute Box59012282022-12-07 3:40:052 hrs 9 mins ago0x55dc352c9247ea5168687a26e219933f8ba7a493 IN  0x2e7e287b53a880ddbce12e0cbc40779c476cab1e0 CRO0.738545176128 4,860.576626755
0x85da598c2eec9066ae6cd287c470d0bc2a28a0c6908426502c3e30c83c031cddRequest Box With...59012262022-12-07 3:39:532 hrs 9 mins ago0x64c7bc60f86146bb05ec8f5922266e6cf50e828b IN  0x2e7e287b53a880ddbce12e0cbc40779c476cab1e1 CRO1.2678279824830
0x6d09d96995c982478531afb47da98083e36700379b00e182e1744e34bf9b082eDistribute Box59012222022-12-07 3:39:312 hrs 9 mins ago0x55dc352c9247ea5168687a26e219933f8ba7a493 IN  0x2e7e287b53a880ddbce12e0cbc40779c476cab1e0 CRO0.738545218241 4,860.576903909
0xccf9f42004f603cba089843044d54b9683ada81d5aeac1378772a70f9d201712Request Box With...59012202022-12-07 3:39:192 hrs 10 mins ago0x64c7bc60f86146bb05ec8f5922266e6cf50e828b IN  0x2e7e287b53a880ddbce12e0cbc40779c476cab1e1 CRO1.2678280550030
0x92707c0f4721d821c900f70c15bad7c0c5193b995290d6e6842496f4406f8aefDistribute Box59012182022-12-07 3:39:082 hrs 10 mins ago0x55dc352c9247ea5168687a26e219933f8ba7a493 IN  0x2e7e287b53a880ddbce12e0cbc40779c476cab1e0 CRO0.738545253594 4,860.57713658
0xd7b34f50486719d648225e5387e3879e5b02381638d9dcfb4bbaa9173320231bRequest Box With...59012152022-12-07 3:38:512 hrs 10 mins ago0x64c7bc60f86146bb05ec8f5922266e6cf50e828b IN  0x2e7e287b53a880ddbce12e0cbc40779c476cab1e1 CRO1.2678281152750
0x04c4e283577ec0a200c6ab7d6a22ef85a101d40ec09fc81766f70b7002e8546bDistribute Box59012102022-12-07 3:38:232 hrs 10 mins ago0x55dc352c9247ea5168687a26e219933f8ba7a493 IN  0x2e7e287b53a880ddbce12e0cbc40779c476cab1e0 CRO0.738603636225 4,860.577503159
0x0c47c293325344b049118a8b754232f67e6788abbd4e44255c6f75413dab2140Request Box With...59012072022-12-07 3:38:062 hrs 11 mins ago0x64c7bc60f86146bb05ec8f5922266e6cf50e828b IN  0x2e7e287b53a880ddbce12e0cbc40779c476cab1e1 CRO1.2678282236540
0xdc1edf6ba1b022960cbcb5e4686bb710d06933472906a5aebfe28dff56fc12bdDistribute Box59012042022-12-07 3:37:482 hrs 11 mins ago0x55dc352c9247ea5168687a26e219933f8ba7a493 IN  0x2e7e287b53a880ddbce12e0cbc40779c476cab1e0 CRO0.738603678415 4,860.577780804
0x0a5c8926217b1f6fc3bf730dc3fa314a78d9526d919c25f1fbfbd76dcfc32c8bRequest Box With...59012022022-12-07 3:37:372 hrs 11 mins ago0x64c7bc60f86146bb05ec8f5922266e6cf50e828b IN  0x2e7e287b53a880ddbce12e0cbc40779c476cab1e1 CRO1.2678282599180
0x30ede929c36582b14a42d86ef4c1bde9d652a7a104485d08ccb08f9cbbf90ff8Distribute Box59011822022-12-07 3:35:442 hrs 13 mins ago0x55dc352c9247ea5168687a26e219933f8ba7a493 IN  0x2e7e287b53a880ddbce12e0cbc40779c476cab1e0 CRO0.738545506069 4,860.578798185
0x8d42e9ff76febb4a723e2c2292215ac52409cf2ac74035c9e0bdf47e778b7a58Request Box With...59011802022-12-07 3:35:322 hrs 13 mins ago0x64c7bc60f86146bb05ec8f5922266e6cf50e828b IN  0x2e7e287b53a880ddbce12e0cbc40779c476cab1e1 CRO1.2678285347590
0x9a4a3975be8ece4a3da7e5c4ee14c9f756f961fa333f05b969261f99cceda72cDistribute Box59011702022-12-07 3:34:332 hrs 14 mins ago0x55dc352c9247ea5168687a26e219933f8ba7a493 IN  0x2e7e287b53a880ddbce12e0cbc40779c476cab1e0 CRO0.738545588354 4,860.579339732
0x79ee30c2fdd0dac8e9777d9000d90548f1e18fdfe211d0bd99095e803dfe42ebRequest Box With...59011682022-12-07 3:34:222 hrs 14 mins ago0x64c7bc60f86146bb05ec8f5922266e6cf50e828b IN  0x2e7e287b53a880ddbce12e0cbc40779c476cab1e1 CRO1.2678286784840
0x6908cb89634ffface0d75bf942487ffbf5fe686f65802ea9d1033d38ac1b391bDistribute Box59011562022-12-07 3:33:132 hrs 16 mins ago0x55dc352c9247ea5168687a26e219933f8ba7a493 IN  0x2e7e287b53a880ddbce12e0cbc40779c476cab1e0 CRO0.738604012226 4,860.579977534
0x5fe580c7a73806eb610646ebec7e4a63359ce22e43caf2698807d93d90ca7244Request Box With...59011542022-12-07 3:33:022 hrs 16 mins ago0x64c7bc60f86146bb05ec8f5922266e6cf50e828b IN  0x2e7e287b53a880ddbce12e0cbc40779c476cab1e1 CRO1.2678288451470
0xb6f852e601f59cef63ab9585d759e22c5e611eb40cd9822b88385bdedb177d2bDistribute Box59011492022-12-07 3:32:332 hrs 16 mins ago0x55dc352c9247ea5168687a26e219933f8ba7a493 IN  0x2e7e287b53a880ddbce12e0cbc40779c476cab1e0 CRO0.738545734616 4,860.580302318
0xd95d3b1b09928d19fc2093982851641b46ad1408c7974b7f068d997a055cfbe0Request Box With...59011462022-12-07 3:32:162 hrs 17 mins ago0x528179645695cc92412b4c863d5b87006ffb64a9 IN  0x2e7e287b53a880ddbce12e0cbc40779c476cab1e1 CRO1.232283527860
0x4fdc6672fcc3f31b32d7e3dba99053a9905accd1e83c858e3883fc04843a9bdeDistribute Box59011342022-12-07 3:31:082 hrs 18 mins ago0x55dc352c9247ea5168687a26e219933f8ba7a493 IN  0x2e7e287b53a880ddbce12e0cbc40779c476cab1e0 CRO0.738604158891 4,860.580942702
0x9d4e0b1dc0a33f8e73c89b9f9fd7e64b8f81f819fded5c30904737ecfe3a7ed7Request Box With...59011332022-12-07 3:31:032 hrs 18 mins ago0x64c7bc60f86146bb05ec8f5922266e6cf50e828b IN  0x2e7e287b53a880ddbce12e0cbc40779c476cab1e1 CRO1.2678290969650
0x2e714f43e78b51bdea5aadcbe52891b5e163263185f7273fb5bae96b0902ef58Distribute Box59011272022-12-07 3:30:292 hrs 18 mins ago0x55dc352c9247ea5168687a26e219933f8ba7a493 IN  0x2e7e287b53a880ddbce12e0cbc40779c476cab1e0 CRO0.7385458881 4,860.581312441
0x1472c926a53c661865ca4a169458b8528546d9337240cb42ff57c94d3995200aRequest Box With...59011252022-12-07 3:30:182 hrs 19 mins ago0x64c7bc60f86146bb05ec8f5922266e6cf50e828b IN  0x2e7e287b53a880ddbce12e0cbc40779c476cab1e1 CRO1.2678292049380
0xe4544332376c3734f3abed3d9d9498cd6c5806af6a5c791a351e0348ee4e4138Distribute Box59011102022-12-07 3:28:532 hrs 20 mins ago0x55dc352c9247ea5168687a26e219933f8ba7a493 IN  0x2e7e287b53a880ddbce12e0cbc40779c476cab1e0 CRO0.738604336132 4,860.582109089
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x226f0a656311e355ac6c831e89b687aa3e715fc0b2c37af4a1fc75aeffff241559009362022-12-07 3:12:272 hrs 36 mins ago 0x2e7e287b53a880ddbce12e0cbc40779c476cab1e0x93fe43db40c997ae784143f060032db16293d93f1 CRO
0x0da9e57b0af49033e1127eaa2e77f07022eb1b75d76800b896f468e27a57d87559007152022-12-07 2:51:382 hrs 57 mins ago 0x2e7e287b53a880ddbce12e0cbc40779c476cab1e0xecf118d749f1a7f9ffeafd0de386e8c7067760b46 CRO
0xab53914cf7b0f3d05f42927b017b0d05331fb700712ae7c8d598de027e18864259006792022-12-07 2:48:153 hrs 1 min ago 0x2e7e287b53a880ddbce12e0cbc40779c476cab1e0xecf118d749f1a7f9ffeafd0de386e8c7067760b46 CRO
0x71adf5ae0e2277b3d86a6ee1ab8aa8d09b67e84093679edcd474a8cd5105ec1e58995672022-12-07 1:03:214 hrs 46 mins ago 0x2e7e287b53a880ddbce12e0cbc40779c476cab1e0x96d9c136198ca569e804fdeb37ee70ac5a0f889130 CRO
0xa6a21d8c41509d11edd3e3063b3d1b8a7da1f9903dd9539966e4f03a77dd7f0958995282022-12-07 0:59:394 hrs 49 mins ago 0x2e7e287b53a880ddbce12e0cbc40779c476cab1e0x96d9c136198ca569e804fdeb37ee70ac5a0f889130 CRO
0x23aa9c50ad9b61c94d1fb813599c76bb1592178036d49ed555c1746b88914b0f58987742022-12-06 23:48:246 hrs ago 0x2e7e287b53a880ddbce12e0cbc40779c476cab1e0x09566313171bc7c594c5bc72d12f2423ead38546150 CRO
0xbfcf328edb2776b61f50385ce2cdbb435c3add69aac37a08d373c4f75f69c29258987422022-12-06 23:45:216 hrs 4 mins ago 0x2e7e287b53a880ddbce12e0cbc40779c476cab1e0x09566313171bc7c594c5bc72d12f2423ead38546175 CRO
0xf0574122c35b3713bd5145822b1cc1fcb5a0c00412cae54f271d8a42730049ac58987152022-12-06 23:42:496 hrs 6 mins ago 0x2e7e287b53a880ddbce12e0cbc40779c476cab1e0x09566313171bc7c594c5bc72d12f2423ead3854625 CRO
0xe16bc656ea92c5d8c73fea070b7a6d7f9448e656d88897cd13578e3f681c634558987042022-12-06 23:41:476 hrs 7 mins ago 0x2e7e287b53a880ddbce12e0cbc40779c476cab1e0x09566313171bc7c594c5bc72d12f2423ead3854625 CRO
0x065cde6d39a9e269f6989d62e547687a0412537a382b593de925eae92f7f098558986832022-12-06 23:39:486 hrs 9 mins ago 0x2e7e287b53a880ddbce12e0cbc40779c476cab1e0x09566313171bc7c594c5bc72d12f2423ead3854625 CRO
0x613e252c027c35938183f9af16210c8a889565b6c89a4686d56cca3d40ef1f8858986582022-12-06 23:37:276 hrs 11 mins ago 0x2e7e287b53a880ddbce12e0cbc40779c476cab1e0x09566313171bc7c594c5bc72d12f2423ead3854625 CRO
0xbc3c79382d9049e0bdd6f95280d9358146e07bdab7e6cf9f1ac613ad89b46d0b58980872022-12-06 22:43:347 hrs 5 mins ago 0x2e7e287b53a880ddbce12e0cbc40779c476cab1e0xa5210613135ac1abfc1480082da7317659600c9630 CRO
0xaa8f20ea50594f8bcfe21e9938e3adf4a62c8f45a8dc870dc5febcb4b3188d6458973042022-12-06 21:29:398 hrs 19 mins ago 0x2e7e287b53a880ddbce12e0cbc40779c476cab1e0x31fb2c6d7498d69a9bd3cc146507a73eecef017225 CRO
0xe001a5216f9816dd64730e725a412a259b9844ace973bbb2a31887e55972d96c58967022022-12-06 20:32:409 hrs 16 mins ago 0x2e7e287b53a880ddbce12e0cbc40779c476cab1e0xecf118d749f1a7f9ffeafd0de386e8c7067760b450 CRO
0xa559cbf33f377e5b7db95b223b73d9fab89c6cc5180bdb20546c8aed51d480ec58932142022-12-06 15:02:5914 hrs 46 mins ago 0x2e7e287b53a880ddbce12e0cbc40779c476cab1e0x776c0524508e427659facacad6a8406e3ecd18dd1 CRO
0x0c18f73dbdf0873f50ea7b10c228d8b848694308e2f918fc2ade946131074ebb58928112022-12-06 14:24:4715 hrs 24 mins ago 0x2e7e287b53a880ddbce12e0cbc40779c476cab1e0x2231403dc54d73860c6cf7702e4917a30e6ad44d30 CRO
0x948e6fe2f2ba8af460d33325eb2bde99c5f0518258379c181ec10701d45c4c0b58927832022-12-06 14:22:0915 hrs 27 mins ago 0x2e7e287b53a880ddbce12e0cbc40779c476cab1e0x2231403dc54d73860c6cf7702e4917a30e6ad44d30 CRO
0x49d93d62b215eabfc59ce52c9e9931664592b762b3c9501a3745b9ef35aaaf3e58905562022-12-06 10:52:2418 hrs 56 mins ago 0x2e7e287b53a880ddbce12e0cbc40779c476cab1e0xfdef3aabd169081cdb46956181e3f1ab8641569750 CRO
0xa6ea65542853afa78c69ce4fe3824d1344350db53ce75cbef1af8310f3f40cf358894482022-12-06 9:08:1020 hrs 41 mins ago 0x2e7e287b53a880ddbce12e0cbc40779c476cab1e0x461d39a123c44934e8e48efebe80f911dafac4ef30 CRO
0x3074361554e7bf04f2328f1a648655d9576dacfcf0b30cf7d7df16fd10f8ff9c58893032022-12-06 8:54:2920 hrs 54 mins ago 0x2e7e287b53a880ddbce12e0cbc40779c476cab1e0x461d39a123c44934e8e48efebe80f911dafac4ef20 CRO
0x1ac325c8acb278be35fcddd73963aeff9b9007b7c0cafe3f4783d8bbc55dfe8158838132022-12-06 0:18:111 day 5 hrs ago 0x2e7e287b53a880ddbce12e0cbc40779c476cab1e0xcb815b80e3c8e565b66ab776314cc56bdc8b5bd130 CRO
0xb9c824ac3c1f4b308ba8f0b180521d0c7a0d27b5676a83a4bd2cf7adf167d5d958827462022-12-05 22:37:411 day 7 hrs ago 0x2e7e287b53a880ddbce12e0cbc40779c476cab1e0xf31231a7e892a38a7c8362026f01145ffb26e5a91 CRO
0xc12614cd9c164006cbb5ebf189a9076d77c2dc04fa0dcef26de920dad1dbdfbf58813242022-12-05 20:23:491 day 9 hrs ago 0x2e7e287b53a880ddbce12e0cbc40779c476cab1e0x87e1fe33899112683429986126a5fd720fab206f20 CRO
0xff308d3569d77da0a818ddae668ef804e376bf946c0f7e1a5f4107eb3090588058782812022-12-05 15:36:561 day 14 hrs ago 0x2e7e287b53a880ddbce12e0cbc40779c476cab1e0xce82ff98c7c84330bfc36263276ab802c9fd702b5 CRO
0xae92424e652a22b8cd41d7136f1d1c0836a529f8fe4cbbc378ac4f2883a4408658770592022-12-05 13:41:391 day 16 hrs ago 0x2e7e287b53a880ddbce12e0cbc40779c476cab1e0x77b4b018cc0090fff9d36dbed0c44c7d8543e8888 CRO
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
PhenixMysteryBox

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, Unlicense license

Contract Source Code (Solidity)

/**
 *Submitted for verification at cronoscan.com on 2022-09-25
*/

// File: @uniswap/v2-periphery/contracts/interfaces/IUniswapV2Router01.sol

pragma solidity >=0.6.2;

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

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountETH);
    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountToken, uint amountETH);
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);
    function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);

    function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
    function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
    function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}

// File: @uniswap/v2-periphery/contracts/interfaces/IUniswapV2Router02.sol

pragma solidity >=0.6.2;


interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountETH);
    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountETH);

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

// File: @openzeppelin/contracts/utils/math/SafeMath.sol


// OpenZeppelin Contracts (last updated v4.6.0) (utils/math/SafeMath.sol)

pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

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

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

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

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

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

// File: @openzeppelin/contracts/token/ERC721/IERC721.sol


// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;


/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);
}

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


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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


// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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

// File: @openzeppelin/contracts/access/Ownable.sol


// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;


/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

// File: contracts/PhenixMysteryBox.sol


pragma solidity ^0.8.9;






contract PhenixMysteryBox is Ownable {
    using SafeMath for uint256;

    uint256 constant FXP_BASE = 100000;

    bool public isEnabled;
    address public tokenERC20Address;
    address public tokenERC721Address;
    address public routerAddress;
    uint256 public tokenERC721Discount;
    uint256 public tokenERC721DiscountMaximum;
    uint256 public boxRequestFee;
    uint256 public maxBoxQuantity;

    mapping(address => bool) public adminMapping;
    mapping(uint256 => Box) public boxes;
    mapping(address => bool) public boxFeeExempt;
    BoxRequest[] public boxRequests;

    enum BoxRequestStatus {
        PENDING,
        DISTRIBUTED,
        FAILED
    }

    struct Box {
        uint256 boxIndex; // The Box Index
        uint256 boxCostETH; // Cost of Box in ETH
        uint256 boxCostERC20; // Cost of Box in ERC20
        bool useETHPrice; // Whether ERC20 Price should be based on ETH Price
        address rewardERC20Address; // ERC20 Token Reward Address
        address rewardERC721Address; // ERC721 Token Reward Address
        uint256 minimumERC20Holdings; // Minimum Token Holdings Required to Acesss
        bool boxEnabled;
    }

    struct BoxCost {
        uint256 ethPrice;
        uint256 erc20Price;
    }

    struct BoxRequest {
        uint256 boxRequestIndex;
        uint256 boxIndex;
        uint256 boxQuantity;
        BoxRequestStatus boxStatus;
        address recipient;
        uint256 rewardERC20Amount;
        uint256 rewardETHAmount;
        uint256[] rewardERC721Tokens;
    }

    constructor(
        address _admin,
        address _tokenERC20Address,
        address _tokenERC721Address
    ) {
        adminMapping[_admin] = true;
        boxFeeExempt[msg.sender] = true;

        tokenERC20Address = _tokenERC20Address;
        tokenERC721Address = _tokenERC721Address;
        boxRequestFee = 1 ether;

        routerAddress = 0x145677FC4d9b8F19B5D56d1820c48e0443049a30;

        tokenERC721Discount = (1 * FXP_BASE) / 100;
        tokenERC721DiscountMaximum = (5 * FXP_BASE) / 100;
        isEnabled = true;
        maxBoxQuantity = 500;

        // Initialize Starting Boxes
        _setBox(
            0,
            0 ether,
            0 ether,
            true,
            _tokenERC20Address,
            _tokenERC721Address,
            0,
            true
        );
        _setBox(
            1,
            20 ether,
            20 ether,
            true,
            _tokenERC20Address,
            _tokenERC721Address,
            0,
            true
        );
        _setBox(
            2,
            50 ether,
            50 ether,
            true,
            _tokenERC20Address,
            _tokenERC721Address,
            0,
            true
        );
        _setBox(
            3,
            100 ether,
            100 ether,
            true,
            _tokenERC20Address,
            _tokenERC721Address,
            0,
            true
        );
    }

    event RequestBox(
        uint256 indexed boxIndex,
        uint256 indexed boxQuantity,
        address indexed recipient
    );

    modifier enabled() {
        require(isEnabled == true, "Boxes are disabled.");
        _;
    }

    modifier isAdmin() {
        require(
            adminMapping[msg.sender] == true || msg.sender == owner(),
            "Not admin."
        );
        _;
    }

    modifier isValidBox(uint256 _boxIndex) {
        require(boxes[_boxIndex].boxEnabled == true, "Box index is invalid.");
        _;
    }

    modifier enoughTokens(uint256 _boxIndex) {
        require(
            IERC20(tokenERC20Address).balanceOf(msg.sender) >=
                boxes[_boxIndex].minimumERC20Holdings,
            "Not Enough Tokens Held."
        );
        _;
    }

    function setEnabledStatus(bool _status) external onlyOwner {
        isEnabled = _status;
    }

    function setUserAdmin(address _user, bool _status) external onlyOwner {
        adminMapping[_user] = _status;
    }

    function setBoxFeeExemptUser(address _address, bool _status)
        external
        onlyOwner
    {
        boxFeeExempt[_address] = _status;
    }

    function setMaxBoxQuantity(uint256 _maxBoxQuantity) external onlyOwner {
        maxBoxQuantity = _maxBoxQuantity;
    }

    function setERC721Discount(uint256 _numerator, uint256 _denominator)
        external
        onlyOwner
    {
        tokenERC721Discount = FXP_BASE.mul(_numerator).div(_denominator);
    }

    function setERC721DiscountMaximum(uint256 _numerator, uint256 _denominator)
        external
        onlyOwner
    {
        tokenERC721DiscountMaximum = FXP_BASE.mul(_numerator).div(_denominator);
    }

    function setERC721Address(address _tokenAddress) external onlyOwner {
        tokenERC721Address = _tokenAddress;
    }

    function setERC20Address(address _tokenAddress) external onlyOwner {
        tokenERC20Address = _tokenAddress;
    }

    function setBoxRequestFee(uint256 _boxRequestFee) external onlyOwner {
        boxRequestFee = _boxRequestFee;
    }

    function setRouterAddress(address _address) external onlyOwner {
        routerAddress = _address;
    }

    function setBox(
        uint256 _boxIndex,
        uint256 _boxCostETH,
        uint256 _boxCostERC20,
        bool _useETHPrice,
        address _rewardERC20Address,
        address _rewardERC721Address,
        uint256 _minimumERC20Holdings,
        bool _boxEnabled
    ) external onlyOwner {
        _setBox(
            _boxIndex,
            _boxCostETH,
            _boxCostERC20,
            _useETHPrice,
            _rewardERC20Address,
            _rewardERC721Address,
            _minimumERC20Holdings,
            _boxEnabled
        );
    }

    function _setBox(
        uint256 _boxIndex,
        uint256 _boxCostETH,
        uint256 _boxCostERC20,
        bool _useETHPrice,
        address _rewardERC20Address,
        address _rewardERC721Address,
        uint256 _minimumERC20Holdings,
        bool _boxEnabled
    ) internal {
        boxes[_boxIndex] = Box(
            _boxIndex,
            _boxCostETH,
            _boxCostERC20,
            _useETHPrice,
            _rewardERC20Address,
            _rewardERC721Address,
            _minimumERC20Holdings,
            _boxEnabled
        );
    }

    function withdrawERC721Tokens(
        address _erc721Address,
        uint256[] memory _tokenIds
    ) external onlyOwner {
        for (uint256 i = 0; i < _tokenIds.length; i++) {
            IERC721(_erc721Address).transferFrom(
                address(this),
                msg.sender,
                _tokenIds[i]
            );
        }
    }

    function withdrawERC20Token(address _tokenAddress, uint256 _amount)
        external
        onlyOwner
    {
        require(
            IERC20(_tokenAddress).balanceOf(address(this)) >= _amount,
            "Not enough tokens to withdraw."
        );

        IERC20(_tokenAddress).transfer(msg.sender, _amount);
    }

    function withdrawETH(uint256 _amount) external onlyOwner {
        require(address(this).balance >= _amount, "Not enough ETH to withdraw");
        (bool success, ) = address(msg.sender).call{value: _amount}("");

        require(success, "Failed to withdraw ETH.");
    }

    function boxCostOf(uint256 _boxValue, address _user)
        public
        view
        returns (uint256)
    {
        uint256 userERC721Balance = IERC721(tokenERC721Address).balanceOf(
            _user
        );
        if (userERC721Balance > 0) {
            uint256 discountNumerator = (tokenERC721Discount *
                userERC721Balance) > tokenERC721DiscountMaximum
                ? tokenERC721DiscountMaximum
                : (tokenERC721Discount * userERC721Balance);

            uint256 discountAmount = _boxValue.mul(discountNumerator).div(
                FXP_BASE
            );

            return _boxValue.sub(discountAmount);
        } else {
            return _boxValue;
        }
    }

    function getFeeTokenAmount(uint256 _ethAmount)
        public
        view
        returns (uint256)
    {
        if (_ethAmount > 0) {
            address[] memory path = new address[](2);
            path[0] = IUniswapV2Router02(routerAddress).WETH();
            path[1] = tokenERC20Address;

            uint256[] memory amountsOut = IUniswapV2Router02(routerAddress)
                .getAmountsOut(_ethAmount, path);

            return amountsOut[1];
        } else {
            return 0;
        }
    }

    function getBalance() external view returns (uint256) {
        return address(this).balance;
    }

    function getBoxRequestsCount() external view returns (uint256) {
        return boxRequests.length;
    }

    function getBoxRequests(uint256 _count)
        external
        view
        returns (BoxRequest[] memory)
    {
        uint256 _boxRequestsCount = _count >= boxRequests.length || _count == 0
            ? boxRequests.length
            : _count;

        BoxRequest[] memory _boxRequests = new BoxRequest[](_boxRequestsCount);

        for (uint256 i = _boxRequestsCount; i > 0; i--) {
            _boxRequests[i - 1] = boxRequests[(boxRequests.length - i)];
        }

        return _boxRequests;
    }

    function getBoxes(uint256 _count) external view returns (Box[] memory) {
        Box[] memory _boxes = new Box[](_count);

        for (uint256 i = 0; i < _count; i++) {
            _boxes[i] = boxes[i];
        }

        return _boxes;
    }

    function getBoxPrices(uint256 _count)
        external
        view
        returns (BoxCost[] memory)
    {
        BoxCost[] memory _boxCosts = new BoxCost[](_count);
        for (uint256 i = 0; i < _count; i++) {
            _boxCosts[i] = BoxCost(
                boxes[i].boxCostETH,
                boxes[i].useETHPrice
                    ? getFeeTokenAmount(boxes[i].boxCostERC20)
                    : boxes[i].boxCostERC20
            );
        }
        return _boxCosts;
    }

    function requestBoxAdmin(
        address _recipient,
        uint256 _boxIndex,
        uint256 _boxQuantity
    ) external isAdmin isValidBox(_boxIndex) {
        _requestBox(_recipient, _boxIndex, _boxQuantity);
    }

    function requestBoxWithETH(uint256 _boxIndex, uint256 _boxQuantity)
        external
        payable
        isValidBox(_boxIndex)
        enoughTokens(_boxIndex)
        enabled
    {
        require(_boxQuantity <= maxBoxQuantity, "Max Quantity Exceeded!");
        if (boxFeeExempt[msg.sender] == false) {
            uint256 requestCost = boxCostOf(
                boxes[_boxIndex].boxCostETH,
                msg.sender
            ) * _boxQuantity;
            require(
                msg.value >= requestCost.add(boxRequestFee),
                "Not enough ETH to pay."
            );
        }

        _requestBox(msg.sender, _boxIndex, _boxQuantity);
    }

    function requestBoxWithToken(uint256 _boxIndex, uint256 _boxQuantity)
        external
        payable
        isValidBox(_boxIndex)
        enoughTokens(_boxIndex)
        enabled
    {
        require(_boxQuantity <= maxBoxQuantity, "Max Quantity Exceeded!");
        if (boxFeeExempt[msg.sender] == false) {
            uint256 requestCost = boxes[_boxIndex].useETHPrice
                ? getFeeTokenAmount(
                    boxCostOf(boxes[_boxIndex].boxCostERC20, msg.sender) *
                        _boxQuantity
                )
                : boxCostOf(boxes[_boxIndex].boxCostERC20, msg.sender) *
                    _boxQuantity;

            require(msg.value >= boxRequestFee, "Not enough ETH to pay fee.");
            require(
                IERC20(tokenERC20Address).balanceOf(msg.sender) >= requestCost,
                "Not enough tokens to pay."
            );
            IERC20(tokenERC20Address).transferFrom(
                msg.sender,
                address(this),
                requestCost
            );
        }
        _requestBox(msg.sender, _boxIndex, _boxQuantity);
    }

    function _requestBox(
        address _recipient,
        uint256 _boxIndex,
        uint256 _boxQuantity
    ) internal {
        boxRequests.push(
            BoxRequest(
                boxRequests.length,
                _boxIndex,
                _boxQuantity,
                BoxRequestStatus.PENDING,
                _recipient,
                0,
                0,
                new uint256[](0)
            )
        );
        emit RequestBox(_boxIndex, _boxQuantity, msg.sender);
    }

    function updateBoxRequestStatus(
        uint256 _boxRequestIndex,
        BoxRequestStatus _status
    ) external isAdmin {
        require(
            _boxRequestIndex <= boxRequests.length,
            "Invalid Box request Index."
        );

        boxRequests[_boxRequestIndex].boxStatus = _status;
    }

    function distributeBox(
        uint256 _boxRequestIndex,
        uint256 _rewardETHAmount,
        uint256 _rewardERC20Amount,
        uint256[] memory _rewardERC721Tokens
    ) external isAdmin {
        require(
            _boxRequestIndex <= boxRequests.length &&
                boxRequests[_boxRequestIndex].boxStatus ==
                BoxRequestStatus.PENDING,
            "Box request cannot be distributed."
        );

        if (_rewardETHAmount > 0) {
            (bool sent, ) = address(boxRequests[_boxRequestIndex].recipient)
                .call{value: _rewardETHAmount}("");
            require(sent, "Failed to send ETH reward.");
        }

        if (_rewardERC20Amount > 0) {
            IERC20(
                boxes[boxRequests[_boxRequestIndex].boxIndex].rewardERC20Address
            ).transfer(
                    boxRequests[_boxRequestIndex].recipient,
                    _rewardERC20Amount
                );
        }

        for (uint256 i = 0; i < _rewardERC721Tokens.length; i++) {
            IERC721(
                boxes[boxRequests[_boxRequestIndex].boxIndex]
                    .rewardERC721Address
            ).transferFrom(
                    address(this),
                    boxRequests[_boxRequestIndex].recipient,
                    _rewardERC721Tokens[i]
                );
        }

        boxRequests[_boxRequestIndex] = BoxRequest(
            boxRequests[_boxRequestIndex].boxRequestIndex,
            boxRequests[_boxRequestIndex].boxIndex,
            boxRequests[_boxRequestIndex].boxQuantity,
            BoxRequestStatus.DISTRIBUTED,
            boxRequests[_boxRequestIndex].recipient,
            _rewardERC20Amount,
            _rewardETHAmount,
            _rewardERC721Tokens
        );
    }

    receive() external payable {}
}

Contract ABI

[{"inputs":[{"internalType":"address","name":"_admin","type":"address"},{"internalType":"address","name":"_tokenERC20Address","type":"address"},{"internalType":"address","name":"_tokenERC721Address","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"boxIndex","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"boxQuantity","type":"uint256"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"}],"name":"RequestBox","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"adminMapping","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_boxValue","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"boxCostOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"boxFeeExempt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"boxRequestFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"boxRequests","outputs":[{"internalType":"uint256","name":"boxRequestIndex","type":"uint256"},{"internalType":"uint256","name":"boxIndex","type":"uint256"},{"internalType":"uint256","name":"boxQuantity","type":"uint256"},{"internalType":"enum PhenixMysteryBox.BoxRequestStatus","name":"boxStatus","type":"uint8"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"rewardERC20Amount","type":"uint256"},{"internalType":"uint256","name":"rewardETHAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"boxes","outputs":[{"internalType":"uint256","name":"boxIndex","type":"uint256"},{"internalType":"uint256","name":"boxCostETH","type":"uint256"},{"internalType":"uint256","name":"boxCostERC20","type":"uint256"},{"internalType":"bool","name":"useETHPrice","type":"bool"},{"internalType":"address","name":"rewardERC20Address","type":"address"},{"internalType":"address","name":"rewardERC721Address","type":"address"},{"internalType":"uint256","name":"minimumERC20Holdings","type":"uint256"},{"internalType":"bool","name":"boxEnabled","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_boxRequestIndex","type":"uint256"},{"internalType":"uint256","name":"_rewardETHAmount","type":"uint256"},{"internalType":"uint256","name":"_rewardERC20Amount","type":"uint256"},{"internalType":"uint256[]","name":"_rewardERC721Tokens","type":"uint256[]"}],"name":"distributeBox","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"getBoxPrices","outputs":[{"components":[{"internalType":"uint256","name":"ethPrice","type":"uint256"},{"internalType":"uint256","name":"erc20Price","type":"uint256"}],"internalType":"struct PhenixMysteryBox.BoxCost[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"getBoxRequests","outputs":[{"components":[{"internalType":"uint256","name":"boxRequestIndex","type":"uint256"},{"internalType":"uint256","name":"boxIndex","type":"uint256"},{"internalType":"uint256","name":"boxQuantity","type":"uint256"},{"internalType":"enum PhenixMysteryBox.BoxRequestStatus","name":"boxStatus","type":"uint8"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"rewardERC20Amount","type":"uint256"},{"internalType":"uint256","name":"rewardETHAmount","type":"uint256"},{"internalType":"uint256[]","name":"rewardERC721Tokens","type":"uint256[]"}],"internalType":"struct PhenixMysteryBox.BoxRequest[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBoxRequestsCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"getBoxes","outputs":[{"components":[{"internalType":"uint256","name":"boxIndex","type":"uint256"},{"internalType":"uint256","name":"boxCostETH","type":"uint256"},{"internalType":"uint256","name":"boxCostERC20","type":"uint256"},{"internalType":"bool","name":"useETHPrice","type":"bool"},{"internalType":"address","name":"rewardERC20Address","type":"address"},{"internalType":"address","name":"rewardERC721Address","type":"address"},{"internalType":"uint256","name":"minimumERC20Holdings","type":"uint256"},{"internalType":"bool","name":"boxEnabled","type":"bool"}],"internalType":"struct PhenixMysteryBox.Box[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_ethAmount","type":"uint256"}],"name":"getFeeTokenAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxBoxQuantity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"uint256","name":"_boxIndex","type":"uint256"},{"internalType":"uint256","name":"_boxQuantity","type":"uint256"}],"name":"requestBoxAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_boxIndex","type":"uint256"},{"internalType":"uint256","name":"_boxQuantity","type":"uint256"}],"name":"requestBoxWithETH","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_boxIndex","type":"uint256"},{"internalType":"uint256","name":"_boxQuantity","type":"uint256"}],"name":"requestBoxWithToken","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"routerAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_boxIndex","type":"uint256"},{"internalType":"uint256","name":"_boxCostETH","type":"uint256"},{"internalType":"uint256","name":"_boxCostERC20","type":"uint256"},{"internalType":"bool","name":"_useETHPrice","type":"bool"},{"internalType":"address","name":"_rewardERC20Address","type":"address"},{"internalType":"address","name":"_rewardERC721Address","type":"address"},{"internalType":"uint256","name":"_minimumERC20Holdings","type":"uint256"},{"internalType":"bool","name":"_boxEnabled","type":"bool"}],"name":"setBox","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"bool","name":"_status","type":"bool"}],"name":"setBoxFeeExemptUser","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_boxRequestFee","type":"uint256"}],"name":"setBoxRequestFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"}],"name":"setERC20Address","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"}],"name":"setERC721Address","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_numerator","type":"uint256"},{"internalType":"uint256","name":"_denominator","type":"uint256"}],"name":"setERC721Discount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_numerator","type":"uint256"},{"internalType":"uint256","name":"_denominator","type":"uint256"}],"name":"setERC721DiscountMaximum","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_status","type":"bool"}],"name":"setEnabledStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxBoxQuantity","type":"uint256"}],"name":"setMaxBoxQuantity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"setRouterAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"bool","name":"_status","type":"bool"}],"name":"setUserAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"tokenERC20Address","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenERC721Address","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenERC721Discount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenERC721DiscountMaximum","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_boxRequestIndex","type":"uint256"},{"internalType":"enum PhenixMysteryBox.BoxRequestStatus","name":"_status","type":"uint8"}],"name":"updateBoxRequestStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawERC20Token","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_erc721Address","type":"address"},{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"}],"name":"withdrawERC721Tokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040523480156200001157600080fd5b50604051620036f2380380620036f283398101604081905262000034916200084d565b6200003f33620007e0565b6001600160a01b038084166000908152600860209081526040808320805460ff199081166001908117909255338552600a909352922080549091168217905580548483166001600160a01b03199182161782556002805493851693821693909317909255670de0b6b3a76400006006556003805490921673145677fc4d9b8f19b5d56d1820c48e0443049a3017909155606490620000e290620186a09062000897565b620000ee9190620008c3565b600455606462000103620186a0600562000897565b6200010f9190620008c3565b6005556000805460ff60a01b1916600160a01b1781556101f460075560408051610100808201835283825260208083018581529383018581526001606085018181526001600160a01b038a8116608088019081528a821660a0890190815260c089018b815260e08a019586529a8052600990965296517fec8156718a8372b1db44bb411437d0870f3e3790d4a08526d024ce1b0b668f6b5596517fec8156718a8372b1db44bb411437d0870f3e3790d4a08526d024ce1b0b668f6c5591517fec8156718a8372b1db44bb411437d0870f3e3790d4a08526d024ce1b0b668f6d5590517fec8156718a8372b1db44bb411437d0870f3e3790d4a08526d024ce1b0b668f6e805495516001600160a81b0319909616911515610100600160a81b0319169190911794861690930293909317909155517fec8156718a8372b1db44bb411437d0870f3e3790d4a08526d024ce1b0b668f6f80546001600160a01b031916919093161790915590517fec8156718a8372b1db44bb411437d0870f3e3790d4a08526d024ce1b0b668f7055517fec8156718a8372b1db44bb411437d0870f3e3790d4a08526d024ce1b0b668f71805460ff191691151591909117905560408051610100808201835260018083526801158e460913d000006020808501828152958501918252606085018381526001600160a01b038981166080880190815289821660a08901908152600060c08a0181815260e08b0189815298909152600990955297517f92e85d02570a8092d09a6e3a57665bc3815a2699a4074001bf1ccabf660f5a365597517f92e85d02570a8092d09a6e3a57665bc3815a2699a4074001bf1ccabf660f5a375592517f92e85d02570a8092d09a6e3a57665bc3815a2699a4074001bf1ccabf660f5a3855517f92e85d02570a8092d09a6e3a57665bc3815a2699a4074001bf1ccabf660f5a39805497516001600160a81b0319909816911515610100600160a81b031916919091179683169094029590951790925591517f92e85d02570a8092d09a6e3a57665bc3815a2699a4074001bf1ccabf660f5a3a80546001600160a01b0319169190921617905590517f92e85d02570a8092d09a6e3a57665bc3815a2699a4074001bf1ccabf660f5a3b55517f92e85d02570a8092d09a6e3a57665bc3815a2699a4074001bf1ccabf660f5a3c805460ff191691151591909117905560408051610100808201835260028083526802b5e3af16b188000060208085018281529585019182526001606086018181526001600160a01b038a8116608089019081528a821660a08a01908152600060c08b0181815260e08c01968752989052600990955297517f6cde3cea4b3a3fb2488b2808bae7556f4a405e50f65e1794383bc026131b13c35597517f6cde3cea4b3a3fb2488b2808bae7556f4a405e50f65e1794383bc026131b13c45592517f6cde3cea4b3a3fb2488b2808bae7556f4a405e50f65e1794383bc026131b13c55591517f6cde3cea4b3a3fb2488b2808bae7556f4a405e50f65e1794383bc026131b13c6805496516001600160a81b0319909716911515610100600160a81b031916919091179587169094029490941790925591517f6cde3cea4b3a3fb2488b2808bae7556f4a405e50f65e1794383bc026131b13c780546001600160a01b0319169190941617909255517f6cde3cea4b3a3fb2488b2808bae7556f4a405e50f65e1794383bc026131b13c855517f6cde3cea4b3a3fb2488b2808bae7556f4a405e50f65e1794383bc026131b13c9805460ff1916911515919091179055604080516101008082018352600380835268056bc75e2d6310000060208085018281529585019182526001606086018181526001600160a01b038a8116608089019081528a821660a08a01908152600060c08b0181815260e08c01968752989052600990955297517fc575c31fea594a6eb97c8e9d3f9caee4c16218c6ef37e923234c0fe9014a61e75597517fc575c31fea594a6eb97c8e9d3f9caee4c16218c6ef37e923234c0fe9014a61e85592517fc575c31fea594a6eb97c8e9d3f9caee4c16218c6ef37e923234c0fe9014a61e95591517fc575c31fea594a6eb97c8e9d3f9caee4c16218c6ef37e923234c0fe9014a61ea805496516001600160a81b0319909716911515610100600160a81b031916919091179587169094029490941790925591517fc575c31fea594a6eb97c8e9d3f9caee4c16218c6ef37e923234c0fe9014a61eb80546001600160a01b0319169190941617909255517fc575c31fea594a6eb97c8e9d3f9caee4c16218c6ef37e923234c0fe9014a61ec55517fc575c31fea594a6eb97c8e9d3f9caee4c16218c6ef37e923234c0fe9014a61ed805460ff1916911515919091179055505050620008e6565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b80516001600160a01b03811681146200084857600080fd5b919050565b6000806000606084860312156200086357600080fd5b6200086e8462000830565b92506200087e6020850162000830565b91506200088e6040850162000830565b90509250925092565b8082028115828204841417620008bd57634e487b7160e01b600052601160045260246000fd5b92915050565b600082620008e157634e487b7160e01b600052601260045260246000fd5b500490565b612dfc80620008f66000396000f3fe60806040526004361061024a5760003560e01c80636aa633b611610139578063b50fbeee116100b6578063e966b7ce1161007a578063e966b7ce1461076f578063ed2b77e61461078f578063f14210a6146107bf578063f145e29f146107df578063f2fde38b146107ff578063fba178ba1461081f57600080fd5b8063b50fbeee146106c9578063c49d56f3146106f9578063cf5bc2371461070c578063dc9efc7914610722578063dce265651461074257600080fd5b8063928d81c1116100fd578063928d81c11461063357806397e2a462146106535780639a03d9a3146106735780639c05e53014610693578063b00f90a6146106b357600080fd5b80636aa633b61461056f578063715018a6146105a057806379057cab146105b55780638be24888146105e85780638da5cb5b1461061557600080fd5b80633268cc56116101c75780634604a9621161018b5780634604a962146104375780634ed3faf2146104575780635c86ae711461050f5780635e2ff4d31461052f5780635e4a6e3e1461054f57600080fd5b80633268cc56146103a2578063338cef61146103c257806341bec0d2146103d757806341cb87fc146103f757806344e038201461041757600080fd5b806312065fe01161020e57806312065fe01461030c57806315510fcd1461031f5780631902aab11461033f5780632d3e400a1461035f5780633267f8ab1461037557600080fd5b80630342836e1461025657806305c15b4c1461027857806308d68d4d1461029857806309d1b2d1146102d55780631137ea53146102f957600080fd5b3661025157005b600080fd5b34801561026257600080fd5b5061027661027136600461259f565b61083f565b005b34801561028457600080fd5b506102766102933660046125d6565b610865565b3480156102a457600080fd5b506001546102b8906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156102e157600080fd5b506102eb60065481565b6040519081526020016102cc565b61027661030736600461259f565b610900565b34801561031857600080fd5b50476102eb565b34801561032b57600080fd5b5061027661033a366004612619565b610b4d565b34801561034b57600080fd5b5061027661035a366004612652565b610b80565b34801561036b57600080fd5b506102eb60055481565b34801561038157600080fd5b50610395610390366004612652565b610b8d565b6040516102cc919061266b565b3480156103ae57600080fd5b506003546102b8906001600160a01b031681565b3480156103ce57600080fd5b50600b546102eb565b3480156103e357600080fd5b506102766103f236600461270d565b610cdd565b34801561040357600080fd5b5061027661041236600461270d565b610d07565b34801561042357600080fd5b50610276610432366004612800565b610d31565b34801561044357600080fd5b50610276610452366004612850565b610df2565b34801561046357600080fd5b506104c6610472366004612652565b600960205260009081526040902080546001820154600283015460038401546004850154600586015460069096015494959394929360ff808416946101009094046001600160a01b03908116949316921688565b6040805198895260208901979097529587019490945291151560608601526001600160a01b0390811660808601521660a084015260c0830152151560e0820152610100016102cc565b34801561051b57600080fd5b5061027661052a3660046128aa565b6113a6565b34801561053b57600080fd5b506102eb61054a3660046128d3565b61148b565b34801561055b57600080fd5b5061027661056a3660046128f8565b61156a565b34801561057b57600080fd5b5060005461059090600160a01b900460ff1681565b60405190151581526020016102cc565b3480156105ac57600080fd5b50610276611670565b3480156105c157600080fd5b506105d56105d0366004612652565b611684565b6040516102cc97969594939291906129b5565b3480156105f457600080fd5b50610608610603366004612652565b6116df565b6040516102cc91906129fe565b34801561062157600080fd5b506000546001600160a01b03166102b8565b34801561063f57600080fd5b5061027661064e366004612af2565b6118d2565b34801561065f57600080fd5b506102eb61066e366004612652565b611a03565b34801561067f57600080fd5b5061027661068e36600461270d565b611b93565b34801561069f57600080fd5b506102766106ae36600461259f565b611bbd565b3480156106bf57600080fd5b506102eb60075481565b3480156106d557600080fd5b506105906106e436600461270d565b600a6020526000908152604090205460ff1681565b61027661070736600461259f565b611bdd565b34801561071857600080fd5b506102eb60045481565b34801561072e57600080fd5b5061027661073d366004612652565b611f9e565b34801561074e57600080fd5b5061076261075d366004612652565b611fab565b6040516102cc9190612b1e565b34801561077b57600080fd5b5061027661078a366004612619565b6120b5565b34801561079b57600080fd5b506105906107aa36600461270d565b60086020526000908152604090205460ff1681565b3480156107cb57600080fd5b506102766107da366004612652565b6120e8565b3480156107eb57600080fd5b506102766107fa366004612b60565b6121dc565b34801561080b57600080fd5b5061027661081a36600461270d565b612202565b34801561082b57600080fd5b506002546102b8906001600160a01b031681565b61084761227b565b61085e81610858620186a0856122d5565b906122e8565b6004555050565b3360009081526008602052604090205460ff1615156001148061089257506000546001600160a01b031633145b6108b75760405162461bcd60e51b81526004016108ae90612b7d565b60405180910390fd5b600082815260096020526040902060060154829060ff1615156001146108ef5760405162461bcd60e51b81526004016108ae90612ba1565b6108fa8484846122f4565b50505050565b600082815260096020526040902060060154829060ff1615156001146109385760405162461bcd60e51b81526004016108ae90612ba1565b600083815260096020526040908190206005015460015491516370a0823160e01b815233600482015285926001600160a01b0316906370a0823190602401602060405180830381865afa158015610993573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109b79190612bd0565b10156109ff5760405162461bcd60e51b81526020600482015260176024820152762737ba1022b737bab3b4102a37b5b2b739902432b6321760491b60448201526064016108ae565b600054600160a01b900460ff161515600114610a535760405162461bcd60e51b81526020600482015260136024820152722137bc32b99030b932903234b9b0b13632b21760691b60448201526064016108ae565b600754831115610a9e5760405162461bcd60e51b81526020600482015260166024820152754d6178205175616e746974792045786365656465642160501b60448201526064016108ae565b336000908152600a602052604081205460ff1615159003610b42576000848152600960205260408120600101548490610ad7903361148b565b610ae19190612bff565b9050610af86006548261247890919063ffffffff16565b341015610b405760405162461bcd60e51b81526020600482015260166024820152752737ba1032b737bab3b41022aa24103a37903830bc9760511b60448201526064016108ae565b505b6108fa3385856122f4565b610b5561227b565b6001600160a01b03919091166000908152600a60205260409020805460ff1916911515919091179055565b610b8861227b565b600755565b606060008267ffffffffffffffff811115610baa57610baa61272a565b604051908082528060200260200182016040528015610c1957816020015b604080516101008101825260008082526020808301829052928201819052606082018190526080820181905260a0820181905260c0820181905260e08201528252600019909201910181610bc85790505b50905060005b83811015610cd6576000818152600960209081526040918290208251610100808201855282548252600183015493820193909352600282015493810193909352600381015460ff808216151560608601529290046001600160a01b03908116608085015260048201541660a0840152600581015460c08401526006015416151560e08201528251839083908110610cb857610cb8612c16565b60200260200101819052508080610cce90612c2c565b915050610c1f565b5092915050565b610ce561227b565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b610d0f61227b565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b610d3961227b565b60005b8151811015610ded57826001600160a01b03166323b872dd3033858581518110610d6857610d68612c16565b60209081029190910101516040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401600060405180830381600087803b158015610dc257600080fd5b505af1158015610dd6573d6000803e3d6000fd5b505050508080610de590612c2c565b915050610d3c565b505050565b3360009081526008602052604090205460ff16151560011480610e1f57506000546001600160a01b031633145b610e3b5760405162461bcd60e51b81526004016108ae90612b7d565b600b548411801590610e8757506000600b8581548110610e5d57610e5d612c16565b600091825260209091206003600790920201015460ff166002811115610e8557610e8561297d565b145b610ede5760405162461bcd60e51b815260206004820152602260248201527f426f7820726571756573742063616e6e6f742062652064697374726962757465604482015261321760f11b60648201526084016108ae565b8215610fb2576000600b8581548110610ef957610ef9612c16565b60009182526020822060079190910201600301546040516101009091046001600160a01b03169186919081818185875af1925050503d8060008114610f5a576040519150601f19603f3d011682016040523d82523d6000602084013e610f5f565b606091505b5050905080610fb05760405162461bcd60e51b815260206004820152601a60248201527f4661696c656420746f2073656e6420455448207265776172642e00000000000060448201526064016108ae565b505b81156110b25760096000600b8681548110610fcf57610fcf612c16565b906000526020600020906007020160010154815260200190815260200160002060030160019054906101000a90046001600160a01b03166001600160a01b031663a9059cbb600b868154811061102757611027612c16565b600091825260209091206007909102016003015460405160e083901b6001600160e01b03191681526101009091046001600160a01b03166004820152602481018590526044016020604051808303816000875af115801561108c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110b09190612c45565b505b60005b81518110156111ea5760096000600b87815481106110d5576110d5612c16565b906000526020600020906007020160010154815260200190815260200160002060040160009054906101000a90046001600160a01b03166001600160a01b03166323b872dd30600b888154811061112e5761112e612c16565b906000526020600020906007020160030160019054906101000a90046001600160a01b031685858151811061116557611165612c16565b60209081029190910101516040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401600060405180830381600087803b1580156111bf57600080fd5b505af11580156111d3573d6000803e3d6000fd5b5050505080806111e290612c2c565b9150506110b5565b50604051806101000160405280600b868154811061120a5761120a612c16565b9060005260206000209060070201600001548152602001600b868154811061123457611234612c16565b9060005260206000209060070201600101548152602001600b868154811061125e5761125e612c16565b60009182526020918290206002600790920201015482520160018152602001600b868154811061129057611290612c16565b906000526020600020906007020160030160019054906101000a90046001600160a01b03166001600160a01b0316815260200183815260200184815260200182815250600b85815481106112e6576112e6612c16565b906000526020600020906007020160008201518160000155602082015181600101556040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561133c5761133c61297d565b021790555060808201516003820180546001600160a01b0390921661010002610100600160a81b031990921691909117905560a0820151600482015560c0820151600582015560e0820151805161139d9160068401916020909101906124e0565b50505050505050565b3360009081526008602052604090205460ff161515600114806113d357506000546001600160a01b031633145b6113ef5760405162461bcd60e51b81526004016108ae90612b7d565b600b548211156114415760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420426f78207265717565737420496e6465782e00000000000060448201526064016108ae565b80600b838154811061145557611455612c16565b60009182526020909120600360079092020101805460ff191660018360028111156114825761148261297d565b02179055505050565b6002546040516370a0823160e01b81526001600160a01b03838116600483015260009283929116906370a0823190602401602060405180830381865afa1580156114d9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114fd9190612bd0565b9050801561155f576000600554826004546115189190612bff565b11611530578160045461152b9190612bff565b611534565b6005545b90506000611549620186a061085888856122d5565b90506115558682612484565b9350505050611564565b839150505b92915050565b61157261227b565b61166688888888888888886040805161010080820183528a825260208083019a8b52828401998a52971515606083019081526001600160a01b039788166080840190815296881660a0840190815260c0840196875294151560e0840190815260009c8d52600990995292909a20905181559751600189015595516002880155945160038701805493518516909802610100600160a81b0319911515919091166001600160a81b031990931692909217919091179095559151600484018054919093166001600160a01b0319909116179091559151600582015590516006909101805491151560ff1992909216919091179055565b5050505050505050565b61167861227b565b6116826000612490565b565b600b818154811061169457600080fd5b60009182526020909120600790910201805460018201546002830154600384015460048501546005909501549395509193909260ff83169261010090046001600160a01b0316919087565b600b54606090600090831015806116f4575082155b6116fe5782611702565b600b545b905060008167ffffffffffffffff81111561171f5761171f61272a565b60405190808252806020026020018201604052801561175857816020015b61174561252b565b81526020019060019003908161173d5790505b509050815b80156118ca57600b8054611772908390612c62565b8154811061178257611782612c16565b9060005260206000209060070201604051806101000160405290816000820154815260200160018201548152602001600282015481526020016003820160009054906101000a900460ff1660028111156117de576117de61297d565b60028111156117ef576117ef61297d565b81526020016003820160019054906101000a90046001600160a01b03166001600160a01b03166001600160a01b0316815260200160048201548152602001600582015481526020016006820180548060200260200160405190810160405280929190818152602001828054801561188557602002820191906000526020600020905b815481526020019060010190808311611871575b5050505050815250508260018361189c9190612c62565b815181106118ac576118ac612c16565b602002602001018190525080806118c290612c75565b91505061175d565b509392505050565b6118da61227b565b6040516370a0823160e01b815230600482015281906001600160a01b038416906370a0823190602401602060405180830381865afa158015611920573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119449190612bd0565b10156119925760405162461bcd60e51b815260206004820152601e60248201527f4e6f7420656e6f75676820746f6b656e7320746f2077697468647261772e000060448201526064016108ae565b60405163a9059cbb60e01b8152336004820152602481018290526001600160a01b0383169063a9059cbb906044016020604051808303816000875af11580156119df573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ded9190612c45565b60008115611b8b576040805160028082526060820183526000926020830190803683375050600354604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa158015611a75573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a999190612c8c565b81600081518110611aac57611aac612c16565b6001600160a01b0392831660209182029290920101526001805483519216918391908110611adc57611adc612c16565b6001600160a01b03928316602091820292909201015260035460405163d06ca61f60e01b8152600092919091169063d06ca61f90611b209087908690600401612ca9565b600060405180830381865afa158015611b3d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611b659190810190612d00565b905080600181518110611b7a57611b7a612c16565b602002602001015192505050919050565b506000919050565b611b9b61227b565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b611bc561227b565b611bd681610858620186a0856122d5565b6005555050565b600082815260096020526040902060060154829060ff161515600114611c155760405162461bcd60e51b81526004016108ae90612ba1565b600083815260096020526040908190206005015460015491516370a0823160e01b815233600482015285926001600160a01b0316906370a0823190602401602060405180830381865afa158015611c70573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c949190612bd0565b1015611cdc5760405162461bcd60e51b81526020600482015260176024820152762737ba1022b737bab3b4102a37b5b2b739902432b6321760491b60448201526064016108ae565b600054600160a01b900460ff161515600114611d305760405162461bcd60e51b81526020600482015260136024820152722137bc32b99030b932903234b9b0b13632b21760691b60448201526064016108ae565b600754831115611d7b5760405162461bcd60e51b81526020600482015260166024820152754d6178205175616e746974792045786365656465642160501b60448201526064016108ae565b336000908152600a602052604081205460ff1615159003610b425760008481526009602052604081206003015460ff16611ddc576000858152600960205260409020600201548490611dcd903361148b565b611dd79190612bff565b611e08565b600085815260096020526040902060020154611e08908590611dfe903361148b565b61066e9190612bff565b9050600654341015611e5c5760405162461bcd60e51b815260206004820152601a60248201527f4e6f7420656e6f7567682045544820746f20706179206665652e00000000000060448201526064016108ae565b6001546040516370a0823160e01b815233600482015282916001600160a01b0316906370a0823190602401602060405180830381865afa158015611ea4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ec89190612bd0565b1015611f165760405162461bcd60e51b815260206004820152601960248201527f4e6f7420656e6f75676820746f6b656e7320746f207061792e0000000000000060448201526064016108ae565b6001546040516323b872dd60e01b8152336004820152306024820152604481018390526001600160a01b03909116906323b872dd906064016020604051808303816000875af1158015611f6d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f919190612c45565b50506108fa3385856122f4565b611fa661227b565b600655565b606060008267ffffffffffffffff811115611fc857611fc861272a565b60405190808252806020026020018201604052801561200d57816020015b6040805180820190915260008082526020820152815260200190600190039081611fe65790505b50905060005b83811015610cd6576040805180820182526000838152600960208181529382206001810154845291859052835260030154909182019060ff1661206757600083815260096020526040902060020154612082565b60008381526009602052604090206002015461208290611a03565b81525082828151811061209757612097612c16565b602002602001018190525080806120ad90612c2c565b915050612013565b6120bd61227b565b6001600160a01b03919091166000908152600860205260409020805460ff1916911515919091179055565b6120f061227b565b804710156121405760405162461bcd60e51b815260206004820152601a60248201527f4e6f7420656e6f7567682045544820746f20776974686472617700000000000060448201526064016108ae565b604051600090339083908381818185875af1925050503d8060008114612182576040519150601f19603f3d011682016040523d82523d6000602084013e612187565b606091505b50509050806121d85760405162461bcd60e51b815260206004820152601760248201527f4661696c656420746f207769746864726177204554482e00000000000000000060448201526064016108ae565b5050565b6121e461227b565b60008054911515600160a01b0260ff60a01b19909216919091179055565b61220a61227b565b6001600160a01b03811661226f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016108ae565b61227881612490565b50565b6000546001600160a01b031633146116825760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108ae565b60006122e18284612bff565b9392505050565b60006122e18284612d91565b6040805161010081018252600b80548252602082018590529181018390526060810160008152602001856001600160a01b031681526020016000815260200160008152602001600067ffffffffffffffff8111156123545761235461272a565b60405190808252806020026020018201604052801561237d578160200160208202803683370190505b50905281546001818101845560009384526020938490208351600790930201918255928201518184015560408201516002808301919091556060830151600383018054949593949193909260ff199092169184908111156123e0576123e061297d565b021790555060808201516003820180546001600160a01b0390921661010002610100600160a81b031990921691909117905560a0820151600482015560c0820151600582015560e082015180516124419160068401916020909101906124e0565b5050604051339150829084907fc141efc5224689477b2f8e1ed15f5fbc9997078d32769b5901867444be2e562890600090a4505050565b60006122e18284612db3565b60006122e18284612c62565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b82805482825590600052602060002090810192821561251b579160200282015b8281111561251b578251825591602001919060010190612500565b5061252792915061258a565b5090565b6040518061010001604052806000815260200160008152602001600081526020016000600281111561255f5761255f61297d565b815260200160006001600160a01b031681526020016000815260200160008152602001606081525090565b5b80821115612527576000815560010161258b565b600080604083850312156125b257600080fd5b50508035926020909101359150565b6001600160a01b038116811461227857600080fd5b6000806000606084860312156125eb57600080fd5b83356125f6816125c1565b95602085013595506040909401359392505050565b801515811461227857600080fd5b6000806040838503121561262c57600080fd5b8235612637816125c1565b915060208301356126478161260b565b809150509250929050565b60006020828403121561266457600080fd5b5035919050565b602080825282518282018190526000919060409081850190868401855b8281101561270057815180518552868101518786015285810151868601526060808201511515908601526080808201516001600160a01b039081169187019190915260a0808301519091169086015260c0808201519086015260e0908101511515908501526101009093019290850190600101612688565b5091979650505050505050565b60006020828403121561271f57600080fd5b81356122e1816125c1565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156127695761276961272a565b604052919050565b600067ffffffffffffffff82111561278b5761278b61272a565b5060051b60200190565b600082601f8301126127a657600080fd5b813560206127bb6127b683612771565b612740565b82815260059290921b840181019181810190868411156127da57600080fd5b8286015b848110156127f557803583529183019183016127de565b509695505050505050565b6000806040838503121561281357600080fd5b823561281e816125c1565b9150602083013567ffffffffffffffff81111561283a57600080fd5b61284685828601612795565b9150509250929050565b6000806000806080858703121561286657600080fd5b843593506020850135925060408501359150606085013567ffffffffffffffff81111561289257600080fd5b61289e87828801612795565b91505092959194509250565b600080604083850312156128bd57600080fd5b8235915060208301356003811061264757600080fd5b600080604083850312156128e657600080fd5b823591506020830135612647816125c1565b600080600080600080600080610100898b03121561291557600080fd5b88359750602089013596506040890135955060608901356129358161260b565b94506080890135612945816125c1565b935060a0890135612955816125c1565b925060c0890135915060e089013561296c8161260b565b809150509295985092959890939650565b634e487b7160e01b600052602160045260246000fd5b600381106129b157634e487b7160e01b600052602160045260246000fd5b9052565b878152602081018790526040810186905260e081016129d76060830187612993565b6001600160a01b0394909416608082015260a081019290925260c090910152949350505050565b60006020808301818452808551808352604092508286019150828160051b8701018488016000805b84811015612ae357603f198a85030186528251610100808601825187528a8301518b880152898301518a880152606080840151612a65828a0182612993565b50506080838101516001600160a01b03169088015260a0838101519088015260c0808401519088015260e092830151928701919091528151908190529089019061012086019084905b80821015612ace5783518352928b0192918b019160019190910190612aae565b50509689019694505091870191600101612a26565b50919998505050505050505050565b60008060408385031215612b0557600080fd5b8235612b10816125c1565b946020939093013593505050565b602080825282518282018190526000919060409081850190868401855b8281101561270057815180518552860151868501529284019290850190600101612b3b565b600060208284031215612b7257600080fd5b81356122e18161260b565b6020808252600a90820152692737ba1030b236b4b71760b11b604082015260600190565b6020808252601590820152742137bc1034b73232bc1034b99034b73b30b634b21760591b604082015260600190565b600060208284031215612be257600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b808202811582820484141761156457611564612be9565b634e487b7160e01b600052603260045260246000fd5b600060018201612c3e57612c3e612be9565b5060010190565b600060208284031215612c5757600080fd5b81516122e18161260b565b8181038181111561156457611564612be9565b600081612c8457612c84612be9565b506000190190565b600060208284031215612c9e57600080fd5b81516122e1816125c1565b6000604082018483526020604081850152818551808452606086019150828701935060005b81811015612cf35784516001600160a01b031683529383019391830191600101612cce565b5090979650505050505050565b60006020808385031215612d1357600080fd5b825167ffffffffffffffff811115612d2a57600080fd5b8301601f81018513612d3b57600080fd5b8051612d496127b682612771565b81815260059190911b82018301908381019087831115612d6857600080fd5b928401925b82841015612d8657835182529284019290840190612d6d565b979650505050505050565b600082612dae57634e487b7160e01b600052601260045260246000fd5b500490565b8082018082111561156457611564612be956fea26469706673582212207137f086e2bca59de41333bcdfcd310852310c3efba6b678a86fd576d31c0cba64736f6c6343000811003300000000000000000000000055dc352c9247ea5168687a26e219933f8ba7a49300000000000000000000000057d06bb1e3b60c875cd3a4445a53217f9b44d390000000000000000000000000cf185cb08c62ff969d258fba18f92dabb278a8a9

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

00000000000000000000000055dc352c9247ea5168687a26e219933f8ba7a49300000000000000000000000057d06bb1e3b60c875cd3a4445a53217f9b44d390000000000000000000000000cf185cb08c62ff969d258fba18f92dabb278a8a9

-----Decoded View---------------
Arg [0] : _admin (address): 0x55dc352c9247ea5168687a26e219933f8ba7a493
Arg [1] : _tokenERC20Address (address): 0x57d06bb1e3b60c875cd3a4445a53217f9b44d390
Arg [2] : _tokenERC721Address (address): 0xcf185cb08c62ff969d258fba18f92dabb278a8a9

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 00000000000000000000000055dc352c9247ea5168687a26e219933f8ba7a493
Arg [1] : 00000000000000000000000057d06bb1e3b60c875cd3a4445a53217f9b44d390
Arg [2] : 000000000000000000000000cf185cb08c62ff969d258fba18f92dabb278a8a9


Deployed ByteCode Sourcemap

24461:15111:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28888:194;;;;;;;;;;-1:-1:-1;28888:194:0;;;;;:::i;:::-;;:::i;:::-;;34779:226;;;;;;;;;;-1:-1:-1;34779:226:0;;;;;:::i;:::-;;:::i;24611:32::-;;;;;;;;;;-1:-1:-1;24611:32:0;;;;-1:-1:-1;;;;;24611:32:0;;;;;;-1:-1:-1;;;;;955:32:1;;;937:51;;925:2;910:18;24611:32:0;;;;;;;;24814:28;;;;;;;;;;;;;;;;;;;1145:25:1;;;1133:2;1118:18;24814:28:0;999:177:1;35013:688:0;;;;;;:::i;:::-;;:::i;33253:101::-;;;;;;;;;;-1:-1:-1;33325:21:0;33253:101;;28596:154;;;;;;;;;;-1:-1:-1;28596:154:0;;;;;:::i;:::-;;:::i;28758:122::-;;;;;;;;;;-1:-1:-1;28758:122:0;;;;;:::i;:::-;;:::i;24766:41::-;;;;;;;;;;;;;;;;34008:251;;;;;;;;;;-1:-1:-1;34008:251:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;24690:28::-;;;;;;;;;;-1:-1:-1;24690:28:0;;;;-1:-1:-1;;;;;24690:28:0;;;33362:107;;;;;;;;;;-1:-1:-1;33443:11:0;:18;33362:107;;29435:119;;;;;;;;;;-1:-1:-1;29435:119:0;;;;;:::i;:::-;;:::i;29688:106::-;;;;;;;;;;-1:-1:-1;29688:106:0;;;;;:::i;:::-;;:::i;30978:361::-;;;;;;;;;;-1:-1:-1;30978:361:0;;;;;:::i;:::-;;:::i;37715:1817::-;;;;;;;;;;-1:-1:-1;37715:1817:0;;;;;:::i;:::-;;:::i;24938:36::-;;;;;;;;;;-1:-1:-1;24938:36:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;24938:36:0;;;;;;;;;;;;;;6289:25:1;;;6345:2;6330:18;;6323:34;;;;6373:18;;;6366:34;;;;6443:14;;6436:22;6431:2;6416:18;;6409:50;-1:-1:-1;;;;;6534:15:1;;;6528:3;6513:19;;6506:44;6587:15;6486:3;6566:19;;6559:44;6634:3;6619:19;;6612:35;6691:14;6684:22;6678:3;6663:19;;6656:51;6276:3;6261:19;24938:36:0;5958:755:1;37386:321:0;;;;;;;;;;-1:-1:-1;37386:321:0;;;;;:::i;:::-;;:::i;31970:738::-;;;;;;;;;;-1:-1:-1;31970:738:0;;;;;:::i;:::-;;:::i;29802:577::-;;;;;;;;;;-1:-1:-1;29802:577:0;;;;;:::i;:::-;;:::i;24583:21::-;;;;;;;;;;-1:-1:-1;24583:21:0;;;;-1:-1:-1;;;24583:21:0;;;;;;;;;8493:14:1;;8486:22;8468:41;;8456:2;8441:18;24583:21:0;8328:187:1;23562:103:0;;;;;;;;;;;;;:::i;25032:31::-;;;;;;;;;;-1:-1:-1;25032:31:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;:::i;33477:523::-;;;;;;;;;;-1:-1:-1;33477:523:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;22914:87::-;;;;;;;;;;-1:-1:-1;22960:7:0;22987:6;-1:-1:-1;;;;;22987:6:0;22914:87;;31347:330;;;;;;;;;;-1:-1:-1;31347:330:0;;;;;:::i;:::-;;:::i;32716:529::-;;;;;;;;;;-1:-1:-1;32716:529:0;;;;;:::i;:::-;;:::i;29306:121::-;;;;;;;;;;-1:-1:-1;29306:121:0;;;;;:::i;:::-;;:::i;29090:208::-;;;;;;;;;;-1:-1:-1;29090:208:0;;;;;:::i;:::-;;:::i;24849:29::-;;;;;;;;;;;;;;;;24981:44;;;;;;;;;;-1:-1:-1;24981:44:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;35709:1144;;;;;;:::i;:::-;;:::i;24725:34::-;;;;;;;;;;;;;;;;29562:118;;;;;;;;;;-1:-1:-1;29562:118:0;;;;;:::i;:::-;;:::i;34267:504::-;;;;;;;;;;-1:-1:-1;34267:504:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;28470:118::-;;;;;;;;;;-1:-1:-1;28470:118:0;;;;;:::i;:::-;;:::i;24887:44::-;;;;;;;;;;-1:-1:-1;24887:44:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;31685:277;;;;;;;;;;-1:-1:-1;31685:277:0;;;;;:::i;:::-;;:::i;28365:97::-;;;;;;;;;;-1:-1:-1;28365:97:0;;;;;:::i;:::-;;:::i;23820:201::-;;;;;;;;;;-1:-1:-1;23820:201:0;;;;;:::i;:::-;;:::i;24650:33::-;;;;;;;;;;-1:-1:-1;24650:33:0;;;;-1:-1:-1;;;;;24650:33:0;;;28888:194;22800:13;:11;:13::i;:::-;29032:42:::1;29061:12:::0;29032:24:::1;24568:6;29045:10:::0;29032:12:::1;:24::i;:::-;:28:::0;::::1;:42::i;:::-;29010:19;:64:::0;-1:-1:-1;;28888:194:0:o;34779:226::-;27850:10;27837:24;;;;:12;:24;;;;;;;;:32;;:24;:32;;:57;;-1:-1:-1;22960:7:0;22987:6;-1:-1:-1;;;;;22987:6:0;27873:10;:21;27837:57;27815:117;;;;-1:-1:-1;;;27815:117:0;;;;;;;:::i;:::-;;;;;;;;;28018:16:::1;::::0;;;:5:::1;:16;::::0;;;;:27:::1;;::::0;34927:9;;28018:27:::1;;:35;;:27:::0;:35:::1;28010:69;;;;-1:-1:-1::0;;;28010:69:0::1;;;;;;;:::i;:::-;34949:48:::2;34961:10;34973:9;34984:12;34949:11;:48::i;:::-;27943:1:::1;34779:226:::0;;;:::o;35013:688::-;28018:16;;;;:5;:16;;;;;:27;;;35136:9;;28018:27;;:35;;:27;:35;28010:69;;;;-1:-1:-1;;;28010:69:0;;;;;;;:::i;:::-;28249:16:::1;::::0;;;:5:::1;:16;::::0;;;;;;:37:::1;;::::0;28188:17:::1;::::0;28181:47;;-1:-1:-1;;;28181:47:0;;28217:10:::1;28181:47;::::0;::::1;937:51:1::0;28249:16:0;;-1:-1:-1;;;;;28188:17:0::1;::::0;28181:35:::1;::::0;910:18:1;;28181:47:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:105;;28159:178;;;::::0;-1:-1:-1;;;28159:178:0;;14142:2:1;28159:178:0::1;::::0;::::1;14124:21:1::0;14181:2;14161:18;;;14154:30;-1:-1:-1;;;14200:18:1;;;14193:53;14263:18;;28159:178:0::1;13940:347:1::0;28159:178:0::1;27716:9:::2;::::0;-1:-1:-1;;;27716:9:0;::::2;;;:17;;27729:4;27716:17;27708:49;;;::::0;-1:-1:-1;;;27708:49:0;;14494:2:1;27708:49:0::2;::::0;::::2;14476:21:1::0;14533:2;14513:18;;;14506:30;-1:-1:-1;;;14552:18:1;;;14545:49;14611:18;;27708:49:0::2;14292:343:1::0;27708:49:0::2;35237:14:::3;;35221:12;:30;;35213:65;;;::::0;-1:-1:-1;;;35213:65:0;;14842:2:1;35213:65:0::3;::::0;::::3;14824:21:1::0;14881:2;14861:18;;;14854:30;-1:-1:-1;;;14900:18:1;;;14893:52;14962:18;;35213:65:0::3;14640:346:1::0;35213:65:0::3;35306:10;35293:24;::::0;;;:12:::3;:24;::::0;;;;;::::3;;:33;;::::0;;35289:344:::3;;35343:19;35393:16:::0;;;:5:::3;:16;::::0;;;;:27:::3;;::::0;35467:12;;35365:99:::3;::::0;35439:10:::3;35365:9;:99::i;:::-;:114;;;;:::i;:::-;35343:136;;35533:30;35549:13;;35533:11;:15;;:30;;;;:::i;:::-;35520:9;:43;;35494:127;;;::::0;-1:-1:-1;;;35494:127:0;;15498:2:1;35494:127:0::3;::::0;::::3;15480:21:1::0;15537:2;15517:18;;;15510:30;-1:-1:-1;;;15556:18:1;;;15549:52;15618:18;;35494:127:0::3;15296:346:1::0;35494:127:0::3;35328:305;35289:344;35645:48;35657:10;35669:9;35680:12;35645:11;:48::i;28596:154::-:0;22800:13;:11;:13::i;:::-;-1:-1:-1;;;;;28710:22:0;;;::::1;;::::0;;;:12:::1;:22;::::0;;;;:32;;-1:-1:-1;;28710:32:0::1;::::0;::::1;;::::0;;;::::1;::::0;;28596:154::o;28758:122::-;22800:13;:11;:13::i;:::-;28840:14:::1;:32:::0;28758:122::o;34008:251::-;34065:12;34090:19;34122:6;34112:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34112:17:0;;-1:-1:-1;;34112:17:0;;;;;;;;;;;;34090:39;;34147:9;34142:84;34166:6;34162:1;:10;34142:84;;;34206:8;;;;:5;:8;;;;;;;;;34194:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;34194:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:9;;;;34206:8;;34194:9;;;;;;:::i;:::-;;;;;;:20;;;;34174:3;;;;;:::i;:::-;;;;34142:84;;;-1:-1:-1;34245:6:0;34008:251;-1:-1:-1;;34008:251:0:o;29435:119::-;22800:13;:11;:13::i;:::-;29513:17:::1;:33:::0;;-1:-1:-1;;;;;;29513:33:0::1;-1:-1:-1::0;;;;;29513:33:0;;;::::1;::::0;;;::::1;::::0;;29435:119::o;29688:106::-;22800:13;:11;:13::i;:::-;29762::::1;:24:::0;;-1:-1:-1;;;;;;29762:24:0::1;-1:-1:-1::0;;;;;29762:24:0;;;::::1;::::0;;;::::1;::::0;;29688:106::o;30978:361::-;22800:13;:11;:13::i;:::-;31120:9:::1;31115:217;31139:9;:16;31135:1;:20;31115:217;;;31185:14;-1:-1:-1::0;;;;;31177:36:0::1;;31240:4;31264:10;31293:9;31303:1;31293:12;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;31177:143:::1;::::0;-1:-1:-1;;;;;;31177:143:0::1;::::0;;;;;;-1:-1:-1;;;;;16177:15:1;;;31177:143:0::1;::::0;::::1;16159:34:1::0;16229:15;;;;16209:18;;;16202:43;16261:18;;;16254:34;16094:18;;31177:143:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;31157:3;;;;;:::i;:::-;;;;31115:217;;;;30978:361:::0;;:::o;37715:1817::-;27850:10;27837:24;;;;:12;:24;;;;;;;;:32;;:24;:32;;:57;;-1:-1:-1;22960:7:0;22987:6;-1:-1:-1;;;;;22987:6:0;27873:10;:21;27837:57;27815:117;;;;-1:-1:-1;;;27815:117:0;;;;;;;:::i;:::-;37969:11:::1;:18:::0;37949:38;::::1;::::0;::::1;::::0;:143:::1;;-1:-1:-1::0;38068:24:0::1;38008:11;38020:16;38008:29;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;:39:::1;:29;::::0;;::::1;;:39;::::0;::::1;;:84;::::0;::::1;;;;;;:::i;:::-;;37949:143;37927:227;;;::::0;-1:-1:-1;;;37927:227:0;;16501:2:1;37927:227:0::1;::::0;::::1;16483:21:1::0;16540:2;16520:18;;;16513:30;16579:34;16559:18;;;16552:62;-1:-1:-1;;;16630:18:1;;;16623:32;16672:19;;37927:227:0::1;16299:398:1::0;37927:227:0::1;38171:20:::0;;38167:227:::1;;38209:9;38232:11;38244:16;38232:29;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;::::1;::::0;;;::::1;;:39;;::::0;38224:100:::1;::::0;38232:39:::1;::::0;;::::1;-1:-1:-1::0;;;;;38232:39:0::1;::::0;38303:16;;38224:100;;38232:29;38224:100;38303:16;38232:39;38224:100:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38208:116;;;38347:4;38339:43;;;::::0;-1:-1:-1;;;38339:43:0;;17114:2:1;38339:43:0::1;::::0;::::1;17096:21:1::0;17153:2;17133:18;;;17126:30;17192:28;17172:18;;;17165:56;17238:18;;38339:43:0::1;16912:350:1::0;38339:43:0::1;38193:201;38167:227;38410:22:::0;;38406:290:::1;;38474:5;:45;38480:11;38492:16;38480:29;;;;;;;;:::i;:::-;;;;;;;;;;;:38;;;38474:45;;;;;;;;;;;:64;;;;;;;;;;-1:-1:-1::0;;;;;38474:64:0::1;-1:-1:-1::0;;;;;38449:113:0::1;;38585:11;38597:16;38585:29;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;:39;;::::0;38449:235:::1;::::0;::::1;::::0;;;-1:-1:-1;;;;;;38449:235:0;;;38585:39:::1;::::0;;::::1;-1:-1:-1::0;;;;;38585:39:0::1;38449:235;::::0;::::1;17441:51:1::0;17508:18;;;17501:34;;;17414:18;;38449:235:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;38406:290;38713:9;38708:387;38732:19;:26;38728:1;:30;38708:387;;;38806:5;:45;38812:11;38824:16;38812:29;;;;;;;;:::i;:::-;;;;;;;;;;;:38;;;38806:45;;;;;;;;;;;:87;;;;;;;;;;-1:-1:-1::0;;;;;38806:87:0::1;-1:-1:-1::0;;;;;38780:141:0::1;;38952:4;38980:11;38992:16;38980:29;;;;;;;;:::i;:::-;;;;;;;;;;;:39;;;;;;;;;;-1:-1:-1::0;;;;;38980:39:0::1;39042:19;39062:1;39042:22;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;38780:303:::1;::::0;-1:-1:-1;;;;;;38780:303:0::1;::::0;;;;;;-1:-1:-1;;;;;16177:15:1;;;38780:303:0::1;::::0;::::1;16159:34:1::0;16229:15;;;;16209:18;;;16202:43;16261:18;;;16254:34;16094:18;;38780:303:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;38760:3;;;;;:::i;:::-;;;;38708:387;;;;39139:385;;;;;;;;39164:11;39176:16;39164:29;;;;;;;;:::i;:::-;;;;;;;;;;;:45;;;39139:385;;;;39224:11;39236:16;39224:29;;;;;;;;:::i;:::-;;;;;;;;;;;:38;;;39139:385;;;;39277:11;39289:16;39277:29;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;:41:::1;:29;::::0;;::::1;;:41;::::0;39139:385;;::::1;39333:28;39139:385;;;;39376:11;39388:16;39376:29;;;;;;;;:::i;:::-;;;;;;;;;;;:39;;;;;;;;;;-1:-1:-1::0;;;;;39376:39:0::1;-1:-1:-1::0;;;;;39139:385:0::1;;;;;39430:18;39139:385;;;;39463:16;39139:385;;;;39494:19;39139:385;;::::0;39107:11:::1;39119:16;39107:29;;;;;;;;:::i;:::-;;;;;;;;;;;:417;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;::::0;;-1:-1:-1;39107:417:0::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;39107:417:0;;::::1;;;-1:-1:-1::0;;;;;;39107:417:0;;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;;;;;;;37715:1817:0:o;37386:321::-;27850:10;27837:24;;;;:12;:24;;;;;;;;:32;;:24;:32;;:57;;-1:-1:-1;22960:7:0;22987:6;-1:-1:-1;;;;;22987:6:0;27873:10;:21;27837:57;27815:117;;;;-1:-1:-1;;;27815:117:0;;;;;;;:::i;:::-;37565:11:::1;:18:::0;37545:38;::::1;;37523:114;;;::::0;-1:-1:-1;;;37523:114:0;;17998:2:1;37523:114:0::1;::::0;::::1;17980:21:1::0;18037:2;18017:18;;;18010:30;18076:28;18056:18;;;18049:56;18122:18;;37523:114:0::1;17796:350:1::0;37523:114:0::1;37692:7;37650:11;37662:16;37650:29;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;:39:::1;:29;::::0;;::::1;;:39;:49:::0;;-1:-1:-1;;37650:49:0::1;::::0;;::::1;::::0;::::1;;;;;;:::i;:::-;;;;;;37386:321:::0;;:::o;31970:738::-;32132:18;;32124:68;;-1:-1:-1;;;32124:68:0;;-1:-1:-1;;;;;955:32:1;;;32124:68:0;;;937:51:1;32071:7:0;;;;32132:18;;;32124:37;;910:18:1;;32124:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32096:96;-1:-1:-1;32207:21:0;;32203:498;;32245:25;32334:26;;32313:17;32274:19;;:56;;;;:::i;:::-;32273:87;:194;;32449:17;32427:19;;:39;;;;:::i;:::-;32273:194;;;32380:26;;32273:194;32245:222;-1:-1:-1;32484:22:0;32509:78;24568:6;32509:32;:9;32245:222;32509:13;:32::i;:78::-;32484:103;-1:-1:-1;32611:29:0;:9;32484:103;32611:13;:29::i;:::-;32604:36;;;;;;;32203:498;32680:9;32673:16;;;31970:738;;;;;:::o;29802:577::-;22800:13;:11;:13::i;:::-;30117:254:::1;30139:9;30163:11;30189:13;30217:12;30244:19;30278:20;30313:21;30349:11;30712:250:::0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;30712:250:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30693:16:0;;;:5;:16;;;;;;;:269;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;30693:269:0;;;;;;;-1:-1:-1;;;;;;30693:269:0;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;30693:269:0;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;30693:269:0;;;;;;;;;;30387:583;30117:254:::1;29802:577:::0;;;;;;;;:::o;23562:103::-;22800:13;:11;:13::i;:::-;23627:30:::1;23654:1;23627:18;:30::i;:::-;23562:103::o:0;25032:31::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25032:31:0;;;;;;;;;;;-1:-1:-1;;;;;25032:31:0;;;;:::o;33477:523::-;33642:11;:18;33567:19;;33604:25;;33632:28;;;;:43;;-1:-1:-1;33664:11:0;;33632:43;:99;;33725:6;33632:99;;;33691:11;:18;33632:99;33604:127;;33744:32;33796:17;33779:35;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;33744:70:0;-1:-1:-1;33844:17:0;33827:134;33863:5;;33827:134;;33912:11;33925:18;;:22;;33946:1;;33925:22;:::i;:::-;33912:37;;;;;;;;:::i;:::-;;;;;;;;;;;33890:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;33890:59:0;-1:-1:-1;;;;;33890:59:0;-1:-1:-1;;;;;33890:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:12;33907:1;33903;:5;;;;:::i;:::-;33890:19;;;;;;;;:::i;:::-;;;;;;:59;;;;33870:3;;;;;:::i;:::-;;;;33827:134;;;-1:-1:-1;33980:12:0;33477:523;-1:-1:-1;;;33477:523:0:o;31347:330::-;22800:13;:11;:13::i;:::-;31490:46:::1;::::0;-1:-1:-1;;;31490:46:0;;31530:4:::1;31490:46;::::0;::::1;937:51:1::0;31540:7:0;;-1:-1:-1;;;;;31490:31:0;::::1;::::0;::::1;::::0;910:18:1;;31490:46:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:57;;31468:137;;;::::0;-1:-1:-1;;;31468:137:0;;18627:2:1;31468:137:0::1;::::0;::::1;18609:21:1::0;18666:2;18646:18;;;18639:30;18705:32;18685:18;;;18678:60;18755:18;;31468:137:0::1;18425:354:1::0;31468:137:0::1;31618:51;::::0;-1:-1:-1;;;31618:51:0;;31649:10:::1;31618:51;::::0;::::1;17441::1::0;17508:18;;;17501:34;;;-1:-1:-1;;;;;31618:30:0;::::1;::::0;::::1;::::0;17414:18:1;;31618:51:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;32716:529::-:0;32811:7;32840:14;;32836:402;;32895:16;;;32909:1;32895:16;;;;;;;;32871:21;;32895:16;;;;;;;;-1:-1:-1;;32955:13:0;;32936:40;;;-1:-1:-1;;;32936:40:0;;;;32871;;-1:-1:-1;;;;;;32955:13:0;;;;32936:38;;-1:-1:-1;32936:40:0;;;;;;;;;;;;;;32955:13;32936:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32926:4;32931:1;32926:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;32926:50:0;;;:7;;;;;;;;;:50;33001:17;;;32991:7;;33001:17;;;32991:4;;33001:17;32991:7;;;;;;:::i;:::-;-1:-1:-1;;;;;32991:27:0;;;:7;;;;;;;;;:27;33084:13;;33065:83;;-1:-1:-1;;;33065:83:0;;33035:27;;33084:13;;;;;33065:65;;:83;;33131:10;;33143:4;;33065:83;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;33065:83:0;;;;;;;;;;;;:::i;:::-;33035:113;;33172:10;33183:1;33172:13;;;;;;;;:::i;:::-;;;;;;;33165:20;;;;32716:529;;;:::o;32836:402::-;-1:-1:-1;33225:1:0;;32716:529;-1:-1:-1;32716:529:0:o;29306:121::-;22800:13;:11;:13::i;:::-;29385:18:::1;:34:::0;;-1:-1:-1;;;;;;29385:34:0::1;-1:-1:-1::0;;;;;29385:34:0;;;::::1;::::0;;;::::1;::::0;;29306:121::o;29090:208::-;22800:13;:11;:13::i;:::-;29248:42:::1;29277:12:::0;29248:24:::1;24568:6;29261:10:::0;29248:12:::1;:24::i;:42::-;29219:26;:71:::0;-1:-1:-1;;29090:208:0:o;35709:1144::-;28018:16;;;;:5;:16;;;;;:27;;;35834:9;;28018:27;;:35;;:27;:35;28010:69;;;;-1:-1:-1;;;28010:69:0;;;;;;;:::i;:::-;28249:16:::1;::::0;;;:5:::1;:16;::::0;;;;;;:37:::1;;::::0;28188:17:::1;::::0;28181:47;;-1:-1:-1;;;28181:47:0;;28217:10:::1;28181:47;::::0;::::1;937:51:1::0;28249:16:0;;-1:-1:-1;;;;;28188:17:0::1;::::0;28181:35:::1;::::0;910:18:1;;28181:47:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:105;;28159:178;;;::::0;-1:-1:-1;;;28159:178:0;;14142:2:1;28159:178:0::1;::::0;::::1;14124:21:1::0;14181:2;14161:18;;;14154:30;-1:-1:-1;;;14200:18:1;;;14193:53;14263:18;;28159:178:0::1;13940:347:1::0;28159:178:0::1;27716:9:::2;::::0;-1:-1:-1;;;27716:9:0;::::2;;;:17;;27729:4;27716:17;27708:49;;;::::0;-1:-1:-1;;;27708:49:0;;14494:2:1;27708:49:0::2;::::0;::::2;14476:21:1::0;14533:2;14513:18;;;14506:30;-1:-1:-1;;;14552:18:1;;;14545:49;14611:18;;27708:49:0::2;14292:343:1::0;27708:49:0::2;35935:14:::3;;35919:12;:30;;35911:65;;;::::0;-1:-1:-1;;;35911:65:0;;14842:2:1;35911:65:0::3;::::0;::::3;14824:21:1::0;14881:2;14861:18;;;14854:30;-1:-1:-1;;;14900:18:1;;;14893:52;14962:18;;35911:65:0::3;14640:346:1::0;35911:65:0::3;36004:10;35991:24;::::0;;;:12:::3;:24;::::0;;;;;::::3;;:33;;::::0;;35987:800:::3;;36041:19;36063:16:::0;;;:5:::3;:16;::::0;;;;:28:::3;;::::0;::::3;;:307;;36292:16;::::0;;;:5:::3;:16;::::0;;;;:29:::3;;::::0;36358:12;;36282:52:::3;::::0;36323:10:::3;36282:9;:52::i;:::-;:88;;;;:::i;:::-;36063:307;;;36161:16;::::0;;;:5:::3;:16;::::0;;;;:29:::3;;::::0;36111:151:::3;::::0;36231:12;;36151:52:::3;::::0;36192:10:::3;36151:9;:52::i;:::-;:92;;;;:::i;36111:151::-;36041:329;;36408:13;;36395:9;:26;;36387:65;;;::::0;-1:-1:-1;;;36387:65:0;;20862:2:1;36387:65:0::3;::::0;::::3;20844:21:1::0;20901:2;20881:18;;;20874:30;20940:28;20920:18;;;20913:56;20986:18;;36387:65:0::3;20660:350:1::0;36387:65:0::3;36500:17;::::0;36493:47:::3;::::0;-1:-1:-1;;;36493:47:0;;36529:10:::3;36493:47;::::0;::::3;937:51:1::0;36544:11:0;;-1:-1:-1;;;;;36500:17:0::3;::::0;36493:35:::3;::::0;910:18:1;;36493:47:0::3;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:62;;36467:149;;;::::0;-1:-1:-1;;;36467:149:0;;21217:2:1;36467:149:0::3;::::0;::::3;21199:21:1::0;21256:2;21236:18;;;21229:30;21295:27;21275:18;;;21268:55;21340:18;;36467:149:0::3;21015:349:1::0;36467:149:0::3;36638:17;::::0;36631:144:::3;::::0;-1:-1:-1;;;36631:144:0;;36688:10:::3;36631:144;::::0;::::3;16159:34:1::0;36725:4:0::3;16209:18:1::0;;;16202:43;16261:18;;;16254:34;;;-1:-1:-1;;;;;36638:17:0;;::::3;::::0;36631:38:::3;::::0;16094:18:1;;36631:144:0::3;;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;36026:761;36797:48;36809:10;36821:9;36832:12;36797:11;:48::i;29562:118::-:0;22800:13;:11;:13::i;:::-;29642::::1;:30:::0;29562:118::o;34267:504::-;34355:16;34389:26;34432:6;34418:21;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;34418:21:0;;;;;;;;;;;;;;;;34389:50;;34455:9;34450:287;34474:6;34470:1;:10;34450:287;;;34517:208;;;;;;;;-1:-1:-1;34543:8:0;;;:5;:8;;;;;;;:19;;;;34517:208;;34581:8;;;;;;:20;;;34517:208;;;;;34581:20;;:129;;34689:8;;;;:5;:8;;;;;:21;;;34581:129;;;34643:8;;;;:5;:8;;;;;:21;;;34625:40;;:17;:40::i;:::-;34517:208;;;34502:9;34512:1;34502:12;;;;;;;;:::i;:::-;;;;;;:223;;;;34482:3;;;;;:::i;:::-;;;;34450:287;;28470:118;22800:13;:11;:13::i;:::-;-1:-1:-1;;;;;28551:19:0;;;::::1;;::::0;;;:12:::1;:19;::::0;;;;:29;;-1:-1:-1;;28551:29:0::1;::::0;::::1;;::::0;;;::::1;::::0;;28470:118::o;31685:277::-;22800:13;:11;:13::i;:::-;31786:7:::1;31761:21;:32;;31753:71;;;::::0;-1:-1:-1;;;31753:71:0;;21571:2:1;31753:71:0::1;::::0;::::1;21553:21:1::0;21610:2;21590:18;;;21583:30;21649:28;21629:18;;;21622:56;21695:18;;31753:71:0::1;21369:350:1::0;31753:71:0::1;31854:44;::::0;31836:12:::1;::::0;31862:10:::1;::::0;31886:7;;31836:12;31854:44;31836:12;31854:44;31886:7;31862:10;31854:44:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31835:63;;;31919:7;31911:43;;;::::0;-1:-1:-1;;;31911:43:0;;21926:2:1;31911:43:0::1;::::0;::::1;21908:21:1::0;21965:2;21945:18;;;21938:30;22004:25;21984:18;;;21977:53;22047:18;;31911:43:0::1;21724:347:1::0;31911:43:0::1;31742:220;31685:277:::0;:::o;28365:97::-;22800:13;:11;:13::i;:::-;28435:9:::1;:19:::0;;;::::1;;-1:-1:-1::0;;;28435:19:0::1;-1:-1:-1::0;;;;28435:19:0;;::::1;::::0;;;::::1;::::0;;28365:97::o;23820:201::-;22800:13;:11;:13::i;:::-;-1:-1:-1;;;;;23909:22:0;::::1;23901:73;;;::::0;-1:-1:-1;;;23901:73:0;;22278:2:1;23901:73:0::1;::::0;::::1;22260:21:1::0;22317:2;22297:18;;;22290:30;22356:34;22336:18;;;22329:62;-1:-1:-1;;;22407:18:1;;;22400:36;22453:19;;23901:73:0::1;22076:402:1::0;23901:73:0::1;23985:28;24004:8;23985:18;:28::i;:::-;23820:201:::0;:::o;23079:132::-;22960:7;22987:6;-1:-1:-1;;;;;22987:6:0;21545:10;23143:23;23135:68;;;;-1:-1:-1;;;23135:68:0;;22685:2:1;23135:68:0;;;22667:21:1;;;22704:18;;;22697:30;22763:34;22743:18;;;22736:62;22815:18;;23135:68:0;22483:356:1;8689:98:0;8747:7;8774:5;8778:1;8774;:5;:::i;:::-;8767:12;8689:98;-1:-1:-1;;;8689:98:0:o;9088:::-;9146:7;9173:5;9177:1;9173;:5;:::i;36861:517::-;37028:268;;;;;;;;36997:11;37057:18;;37028:268;;;;;;;;;;;;;;;;;-1:-1:-1;37028:268:0;;;;37196:10;-1:-1:-1;;;;;37028:268:0;;;;;37225:1;37028:268;;;;37245:1;37028:268;;;;37279:1;37265:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37265:16:0;-1:-1:-1;37028:268:0;;36997:310;;;;;;;;-1:-1:-1;36997:310:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;36997:310:0;;;;;;;;;;;;;:::i;:::-;;;;;-1:-1:-1;36997:310:0;;;;;;;;;-1:-1:-1;;;;;36997:310:0;;;;;-1:-1:-1;;;;;;36997:310:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;37323:47:0;;37359:10;;-1:-1:-1;37345:12:0;;37334:9;;37323:47;;;;;36861:517;;;:::o;7951:98::-;8009:7;8036:5;8040:1;8036;:5;:::i;8332:98::-;8390:7;8417:5;8421:1;8417;:5;:::i;24181:191::-;24255:16;24274:6;;-1:-1:-1;;;;;24291:17:0;;;-1:-1:-1;;;;;;24291:17:0;;;;;;24324:40;;24274:6;;;;;;;24324:40;;24255:16;24324:40;24244:128;24181:191;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;14:248:1;82:6;90;143:2;131:9;122:7;118:23;114:32;111:52;;;159:1;156;149:12;111:52;-1:-1:-1;;182:23:1;;;252:2;237:18;;;224:32;;-1:-1:-1;14:248:1:o;267:131::-;-1:-1:-1;;;;;342:31:1;;332:42;;322:70;;388:1;385;378:12;403:383;480:6;488;496;549:2;537:9;528:7;524:23;520:32;517:52;;;565:1;562;555:12;517:52;604:9;591:23;623:31;648:5;623:31;:::i;:::-;673:5;725:2;710:18;;697:32;;-1:-1:-1;776:2:1;761:18;;;748:32;;403:383;-1:-1:-1;;;403:383:1:o;1181:118::-;1267:5;1260:13;1253:21;1246:5;1243:32;1233:60;;1289:1;1286;1279:12;1304:382;1369:6;1377;1430:2;1418:9;1409:7;1405:23;1401:32;1398:52;;;1446:1;1443;1436:12;1398:52;1485:9;1472:23;1504:31;1529:5;1504:31;:::i;:::-;1554:5;-1:-1:-1;1611:2:1;1596:18;;1583:32;1624:30;1583:32;1624:30;:::i;:::-;1673:7;1663:17;;;1304:382;;;;;:::o;1691:180::-;1750:6;1803:2;1791:9;1782:7;1778:23;1774:32;1771:52;;;1819:1;1816;1809:12;1771:52;-1:-1:-1;1842:23:1;;1691:180;-1:-1:-1;1691:180:1:o;1972:1416::-;2185:2;2237:21;;;2307:13;;2210:18;;;2329:22;;;2156:4;;2185:2;2370;;2388:18;;;;2429:15;;;2156:4;2472:890;2486:6;2483:1;2480:13;2472:890;;;2545:13;;2583:9;;2571:22;;2633:11;;;2627:18;2613:12;;;2606:40;2686:11;;;2680:18;2666:12;;;2659:40;2722:4;2780:11;;;2774:18;2767:26;2760:34;2746:12;;;2739:56;2818:4;2861:11;;;2855:18;-1:-1:-1;;;;;2949:21:1;;;2935:12;;;2928:43;;;;2904:3;3042:11;;;3036:18;3032:27;;;3018:12;;;3011:49;3083:4;3127:11;;;3121:18;3107:12;;;3100:40;3163:4;3208:11;;;3202:18;1946:13;1939:21;3265:12;;;1927:34;3307:6;3298:16;;;;3337:15;;;;2508:1;2501:9;2472:890;;;-1:-1:-1;3379:3:1;;1972:1416;-1:-1:-1;;;;;;;1972:1416:1:o;3393:247::-;3452:6;3505:2;3493:9;3484:7;3480:23;3476:32;3473:52;;;3521:1;3518;3511:12;3473:52;3560:9;3547:23;3579:31;3604:5;3579:31;:::i;3645:127::-;3706:10;3701:3;3697:20;3694:1;3687:31;3737:4;3734:1;3727:15;3761:4;3758:1;3751:15;3777:275;3848:2;3842:9;3913:2;3894:13;;-1:-1:-1;;3890:27:1;3878:40;;3948:18;3933:34;;3969:22;;;3930:62;3927:88;;;3995:18;;:::i;:::-;4031:2;4024:22;3777:275;;-1:-1:-1;3777:275:1:o;4057:183::-;4117:4;4150:18;4142:6;4139:30;4136:56;;;4172:18;;:::i;:::-;-1:-1:-1;4217:1:1;4213:14;4229:4;4209:25;;4057:183::o;4245:662::-;4299:5;4352:3;4345:4;4337:6;4333:17;4329:27;4319:55;;4370:1;4367;4360:12;4319:55;4406:6;4393:20;4432:4;4456:60;4472:43;4512:2;4472:43;:::i;:::-;4456:60;:::i;:::-;4550:15;;;4636:1;4632:10;;;;4620:23;;4616:32;;;4581:12;;;;4660:15;;;4657:35;;;4688:1;4685;4678:12;4657:35;4724:2;4716:6;4712:15;4736:142;4752:6;4747:3;4744:15;4736:142;;;4818:17;;4806:30;;4856:12;;;;4769;;4736:142;;;-1:-1:-1;4896:5:1;4245:662;-1:-1:-1;;;;;;4245:662:1:o;4912:483::-;5005:6;5013;5066:2;5054:9;5045:7;5041:23;5037:32;5034:52;;;5082:1;5079;5072:12;5034:52;5121:9;5108:23;5140:31;5165:5;5140:31;:::i;:::-;5190:5;-1:-1:-1;5246:2:1;5231:18;;5218:32;5273:18;5262:30;;5259:50;;;5305:1;5302;5295:12;5259:50;5328:61;5381:7;5372:6;5361:9;5357:22;5328:61;:::i;:::-;5318:71;;;4912:483;;;;;:::o;5400:553::-;5511:6;5519;5527;5535;5588:3;5576:9;5567:7;5563:23;5559:33;5556:53;;;5605:1;5602;5595:12;5556:53;5641:9;5628:23;5618:33;;5698:2;5687:9;5683:18;5670:32;5660:42;;5749:2;5738:9;5734:18;5721:32;5711:42;;5804:2;5793:9;5789:18;5776:32;5831:18;5823:6;5820:30;5817:50;;;5863:1;5860;5853:12;5817:50;5886:61;5939:7;5930:6;5919:9;5915:22;5886:61;:::i;:::-;5876:71;;;5400:553;;;;;;;:::o;6718:345::-;6807:6;6815;6868:2;6856:9;6847:7;6843:23;6839:32;6836:52;;;6884:1;6881;6874:12;6836:52;6920:9;6907:23;6897:33;;6980:2;6969:9;6965:18;6952:32;7013:1;7006:5;7003:12;6993:40;;7029:1;7026;7019:12;7068:315;7136:6;7144;7197:2;7185:9;7176:7;7172:23;7168:32;7165:52;;;7213:1;7210;7203:12;7165:52;7249:9;7236:23;7226:33;;7309:2;7298:9;7294:18;7281:32;7322:31;7347:5;7322:31;:::i;7388:935::-;7504:6;7512;7520;7528;7536;7544;7552;7560;7613:3;7601:9;7592:7;7588:23;7584:33;7581:53;;;7630:1;7627;7620:12;7581:53;7666:9;7653:23;7643:33;;7723:2;7712:9;7708:18;7695:32;7685:42;;7774:2;7763:9;7759:18;7746:32;7736:42;;7828:2;7817:9;7813:18;7800:32;7841:28;7863:5;7841:28;:::i;:::-;7888:5;-1:-1:-1;7945:3:1;7930:19;;7917:33;7959;7917;7959;:::i;:::-;8011:7;-1:-1:-1;8070:3:1;8055:19;;8042:33;8084;8042;8084;:::i;:::-;8136:7;-1:-1:-1;8190:3:1;8175:19;;8162:33;;-1:-1:-1;8247:3:1;8232:19;;8219:33;8261:30;8219:33;8261:30;:::i;:::-;8310:7;8300:17;;;7388:935;;;;;;;;;;;:::o;8520:127::-;8581:10;8576:3;8572:20;8569:1;8562:31;8612:4;8609:1;8602:15;8636:4;8633:1;8626:15;8652:244;8740:1;8733:5;8730:12;8720:143;;8785:10;8780:3;8776:20;8773:1;8766:31;8820:4;8817:1;8810:15;8848:4;8845:1;8838:15;8720:143;8872:18;;8652:244::o;8901:678::-;9235:25;;;9291:2;9276:18;;9269:34;;;9334:2;9319:18;;9312:34;;;9222:3;9207:19;;9355:60;9411:2;9396:18;;9388:6;9355:60;:::i;:::-;-1:-1:-1;;;;;9452:32:1;;;;9446:3;9431:19;;9424:61;9472:3;9501:19;;9494:35;;;;9560:3;9545:19;;;9538:35;8901:678;;-1:-1:-1;;;;8901:678:1:o;9584:2114::-;9782:4;9811:2;9851;9840:9;9836:18;9881:2;9870:9;9863:21;9904:6;9939;9933:13;9970:6;9962;9955:22;9996:2;9986:12;;10029:2;10018:9;10014:18;10007:25;;10091:2;10081:6;10078:1;10074:14;10063:9;10059:30;10055:39;10129:2;10121:6;10117:15;10150:1;10171;10181:1488;10197:6;10192:3;10189:15;10181:1488;;;10294:2;10290:7;10278:9;10270:6;10266:22;10262:36;10257:3;10250:49;10328:6;10322:13;10358:6;10403:2;10395:6;10391:15;10440:2;10434:9;10426:6;10419:25;10495:2;10491;10487:11;10481:18;10476:2;10468:6;10464:15;10457:43;10551:2;10547;10543:11;10537:18;10532:2;10524:6;10520:15;10513:43;10579:4;10630:2;10626;10622:11;10616:18;10647:63;10706:2;10698:6;10694:15;10680:12;10647:63;:::i;:::-;-1:-1:-1;;10733:4:1;10784:11;;;10778:18;-1:-1:-1;;;;;10774:44:1;10757:15;;;10750:69;10806:3;10889:11;;;10883:18;10866:15;;;10859:43;10925:4;10972:11;;;10966:18;10949:15;;;10942:43;11008:4;11053:11;;;11047:18;11085:15;;;11078:27;;;;11166:21;;11200:24;;;;11291:23;;;;11258:3;11246:16;;;11338:1;;11352:209;11368:8;11363:3;11360:17;11352:209;;;11445:15;;11431:30;;11530:17;;;;11487:14;;;;11396:1;11387:11;;;;;11352:209;;;-1:-1:-1;;11647:12:1;;;;11584:5;-1:-1:-1;;11612:15:1;;;;10223:1;10214:11;10181:1488;;;-1:-1:-1;11686:6:1;;9584:2114;-1:-1:-1;;;;;;;;;9584:2114:1:o;11703:315::-;11771:6;11779;11832:2;11820:9;11811:7;11807:23;11803:32;11800:52;;;11848:1;11845;11838:12;11800:52;11887:9;11874:23;11906:31;11931:5;11906:31;:::i;:::-;11956:5;12008:2;11993:18;;;;11980:32;;-1:-1:-1;;;11703:315:1:o;12023:788::-;12244:2;12296:21;;;12366:13;;12269:18;;;12388:22;;;12215:4;;12244:2;12429;;12447:18;;;;12488:15;;;12215:4;12531:254;12545:6;12542:1;12539:13;12531:254;;;12604:13;;12642:9;;12630:22;;12692:11;;12686:18;12672:12;;;12665:40;12725:12;;;;12760:15;;;;12567:1;12560:9;12531:254;;12816:241;12872:6;12925:2;12913:9;12904:7;12900:23;12896:32;12893:52;;;12941:1;12938;12931:12;12893:52;12980:9;12967:23;12999:28;13021:5;12999:28;:::i;13062:334::-;13264:2;13246:21;;;13303:2;13283:18;;;13276:30;-1:-1:-1;;;13337:2:1;13322:18;;13315:40;13387:2;13372:18;;13062:334::o;13401:345::-;13603:2;13585:21;;;13642:2;13622:18;;;13615:30;-1:-1:-1;;;13676:2:1;13661:18;;13654:51;13737:2;13722:18;;13401:345::o;13751:184::-;13821:6;13874:2;13862:9;13853:7;13849:23;13845:32;13842:52;;;13890:1;13887;13880:12;13842:52;-1:-1:-1;13913:16:1;;13751:184;-1:-1:-1;13751:184:1:o;14991:127::-;15052:10;15047:3;15043:20;15040:1;15033:31;15083:4;15080:1;15073:15;15107:4;15104:1;15097:15;15123:168;15196:9;;;15227;;15244:15;;;15238:22;;15224:37;15214:71;;15265:18;;:::i;15647:127::-;15708:10;15703:3;15699:20;15696:1;15689:31;15739:4;15736:1;15729:15;15763:4;15760:1;15753:15;15779:135;15818:3;15839:17;;;15836:43;;15859:18;;:::i;:::-;-1:-1:-1;15906:1:1;15895:13;;15779:135::o;17546:245::-;17613:6;17666:2;17654:9;17645:7;17641:23;17637:32;17634:52;;;17682:1;17679;17672:12;17634:52;17714:9;17708:16;17733:28;17755:5;17733:28;:::i;18151:128::-;18218:9;;;18239:11;;;18236:37;;;18253:18;;:::i;18284:136::-;18323:3;18351:5;18341:39;;18360:18;;:::i;:::-;-1:-1:-1;;;18396:18:1;;18284:136::o;18784:251::-;18854:6;18907:2;18895:9;18886:7;18882:23;18878:32;18875:52;;;18923:1;18920;18913:12;18875:52;18955:9;18949:16;18974:31;18999:5;18974:31;:::i;19040:729::-;19210:4;19258:2;19247:9;19243:18;19288:6;19277:9;19270:25;19314:2;19352;19347;19336:9;19332:18;19325:30;19375:6;19410;19404:13;19441:6;19433;19426:22;19479:2;19468:9;19464:18;19457:25;;19517:2;19509:6;19505:15;19491:29;;19538:1;19548:195;19562:6;19559:1;19556:13;19548:195;;;19627:13;;-1:-1:-1;;;;;19623:39:1;19611:52;;19718:15;;;;19683:12;;;;19659:1;19577:9;19548:195;;;-1:-1:-1;19760:3:1;;19040:729;-1:-1:-1;;;;;;;19040:729:1:o;19774:881::-;19869:6;19900:2;19943;19931:9;19922:7;19918:23;19914:32;19911:52;;;19959:1;19956;19949:12;19911:52;19992:9;19986:16;20025:18;20017:6;20014:30;20011:50;;;20057:1;20054;20047:12;20011:50;20080:22;;20133:4;20125:13;;20121:27;-1:-1:-1;20111:55:1;;20162:1;20159;20152:12;20111:55;20191:2;20185:9;20214:60;20230:43;20270:2;20230:43;:::i;20214:60::-;20308:15;;;20390:1;20386:10;;;;20378:19;;20374:28;;;20339:12;;;;20414:19;;;20411:39;;;20446:1;20443;20436:12;20411:39;20470:11;;;;20490:135;20506:6;20501:3;20498:15;20490:135;;;20572:10;;20560:23;;20523:12;;;;20603;;;;20490:135;;;20644:5;19774:881;-1:-1:-1;;;;;;;19774:881:1:o;22844:217::-;22884:1;22910;22900:132;;22954:10;22949:3;22945:20;22942:1;22935:31;22989:4;22986:1;22979:15;23017:4;23014:1;23007:15;22900:132;-1:-1:-1;23046:9:1;;22844:217::o;23066:125::-;23131:9;;;23152:10;;;23149:36;;;23165:18;;:::i

Swarm Source

ipfs://7137f086e2bca59de41333bcdfcd310852310c3efba6b678a86fd576d31c0cba
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.