Contract 0xfD000ddCEa75a2E23059881c3589F6425bFf1AbB 3

DEX  
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x00a8e96eb7c2cc64df5af14fadbe8bc8066332ffc2aea537604264804aa47ac1Swap Exact Token...385913792022-05-19 14:50:112 mins ago0xab0aa2ea08b924f5c37f69a530696ac35bf13f33 IN  PaintSwap: Router0 FTM0.0413756349
0x2609891d2e2f0ce84d036e180d205b691c37e7c00e103e3d213bc1102403b6b6Swap Exact Token...385913622022-05-19 14:49:422 mins ago0xbd485523bb960b27c38d3f9ad47f0d3a384e69ce IN  PaintSwap: Router0 FTM0.056187311294
0x120dda6309bdc9ec9c1e92c72b3838cb6c9779778e75080808441cf00fd0ce14Add Liquidity ET...385905742022-05-19 14:35:5116 mins ago0xab0aa2ea08b924f5c37f69a530696ac35bf13f33 IN  PaintSwap: Router6,543 FTM0.054077916384
0x74c3a850f7b0d94e1822acc14de0939c810053f8724057e21955511af2e295daSwap Exact Token...385900312022-05-19 14:25:4526 mins ago0xc877d91a16a5fb483dd96a4a00ede9b240374a25 IN  PaintSwap: Router0 FTM0.040641027335
0x7b73bf27cd9cbac6152c44d2a89d507126644e943a904f98454d810456785ac0Swap Exact ETH F...385896002022-05-19 14:16:4435 mins ago0xc940070116f18fab7a32756938b026d468f3d8a1 IN  PaintSwap: Router154.476468236788073 FTM0.048145104
0x282f671cd807f5f2a790fbbefd5bce5a6b7f6040295ec073bb0d750a3422c27bSwap Exact Token...385890322022-05-19 14:05:2546 mins ago0xe59150cc54b28d55b9b1df175a3bdff10a29d1ba IN  PaintSwap: Router0 FTM0.031467648343
0xfaa687b2f6252f557b7661188de820728085d405e843dabc13ca22dcb8c5c7adSwap Exact Token...385878772022-05-19 13:40:521 hr 11 mins ago0x7d83ce58640e0c0e5613066c27425b32b6bc99e1 IN  PaintSwap: Router0 FTM0.029297029542
0x8d1a6a4e8ef7a2f6408480df828d42cba3b504468392c36761270a0e0324482dRemove Liquidity...385878152022-05-19 13:39:481 hr 12 mins ago0x7d83ce58640e0c0e5613066c27425b32b6bc99e1 IN  PaintSwap: Router0 FTM0.050042082518
0xae893c3ab145979898e29c1aefe146f2363437af2edc8e8fd2c6f9096d7eea1dSwap Exact Token...385877902022-05-19 13:39:201 hr 13 mins ago0xc940070116f18fab7a32756938b026d468f3d8a1 IN  PaintSwap: Router0 FTM0.0179374
0xf9f8a4dcfc510118cb869c9c9f256b20021290e710662378a89afe4ccdea9465Remove Liquidity...385877732022-05-19 13:39:031 hr 13 mins ago0x7d83ce58640e0c0e5613066c27425b32b6bc99e1 IN  PaintSwap: Router0 FTM0.805348450386
0x03331693a668f5d550921a8e63993e28aafa7829675f3e689ec7b50d7cdc63e1Swap Exact ETH F...385876592022-05-19 13:36:521 hr 15 mins ago0x7d83ce58640e0c0e5613066c27425b32b6bc99e1 IN  PaintSwap: Router700 FTM0.030380520224
0x300e0aa6b1efecb5e85a86b25917aabe7a2b52782ca10a159743ef809d01f0b6Remove Liquidity...385875332022-05-19 13:34:391 hr 17 mins ago0x087dabe5511e2519858dc0cd0b1107ca678fa502 IN  PaintSwap: Router0 FTM0.047526685864
0x48b261f609885a35cf7d02cee09ad6843eaad5614a72296f9fcb33960e1ecb2fRemove Liquidity...385875082022-05-19 13:34:161 hr 18 mins ago0x087dabe5511e2519858dc0cd0b1107ca678fa502 IN  PaintSwap: Router0 FTM0.050206432119
0x2490d2a87e6b8d2253fe7061e9a6c736415ff152f7d3313e4067a6e8b13d8f05Swap Exact Token...385861382022-05-19 13:07:341 hr 44 mins ago0x55630c7f6a1cdde2f9e2779dcf694394216c6537 IN  PaintSwap: Router0 FTM0.030527880875
0x4345f66344dd1e5599e04073b68bea69757fd8b7545d610f684c9e518c055ee7Add Liquidity ET...385847012022-05-19 12:42:322 hrs 9 mins ago0x2836545d6e07e9e96a9b622a2e5f4787ec9cc2ae IN  PaintSwap: Router25.263549647210861 FTM0.04943787695
0x872383263fc95f0ac07d487981b8e780a91aee795e91fd5ab787dad028167a5bSwap Exact Token...385846712022-05-19 12:42:012 hrs 10 mins ago0x2836545d6e07e9e96a9b622a2e5f4787ec9cc2ae IN  PaintSwap: Router0 FTM0.044474787031
0x015c620b83edc744060753b7d57a710b8e4045eb7751cd08d7c3cec12a5b176aAdd Liquidity ET...385845502022-05-19 12:40:012 hrs 12 mins ago0x2836545d6e07e9e96a9b622a2e5f4787ec9cc2ae IN  PaintSwap: Router6.308311125874556 FTM0.052765359031
0x9583c3e43846bb299c84427a00659403a6b422346a33935328db7d954fce4f39Swap Exact Token...385842432022-05-19 12:34:292 hrs 17 mins ago0x684bc76e6fa1455d174f33b5e3a840f5f3f70048 IN  PaintSwap: Router0 FTM0.07006156876
0xa6a4f70f0f9f08c42efe0281841382161bde0f2db5c21580812ad7bcd3648665Swap Exact ETH F...385840572022-05-19 12:31:242 hrs 20 mins ago0xb8c95ac7cda1bc5a281db7e8796a1af0af88b6b4 IN  PaintSwap: Router161 FTM0.05810443847
0x6a2041666b0da4321808721c21634b564ba216d0c0f393c736443de61ba10141Swap Exact Token...385834062022-05-19 12:18:282 hrs 33 mins ago0xe59150cc54b28d55b9b1df175a3bdff10a29d1ba IN  PaintSwap: Router0 FTM0.050646554907
0x9965787e65219b418b25b9e2443e8ac42cd3a597ced7945dfe998916a4f98d58Swap Exact Token...385823412022-05-19 11:57:002 hrs 55 mins ago0x129e96e3e0a3dd80f2e8f2d88d24cedd7c3ef689 IN  PaintSwap: Router0 FTM0.051897906644
0x367b04970a6898e5a18e0940ef422f3bd05ae6c1fa4b7a5a95ae9f4737176cf3Swap Exact ETH F...385818332022-05-19 11:46:383 hrs 5 mins ago0x946d17072eac624c3e3fb06108959b7fefbcb8ad IN  PaintSwap: Router28 FTM0.039409077771
0x2e6635f47be6d6778c73819aeaa1dd32145bcd50d8a9c420c548b121cda217abSwap Exact ETH F...385817862022-05-19 11:45:513 hrs 6 mins ago0xa13ab7683126e2d203e8761d43da6bc59c82d542 IN  PaintSwap: Router65 FTM0.03982871772
0x212553c881174d117bf2348cd9828ad2e88157625ac76422dd2b43a9a4f1d7a1Add Liquidity ET...385814842022-05-19 11:39:463 hrs 12 mins ago0x5aa0f3d2f5b1b93e0e1e4ea1682d89fd1eba0feb IN  PaintSwap: Router8,600 FTM0.052014996016
0x0e72e5846cc4f47a35b140d3dcb0e2057843dfb48f96c430aaf955364bdbdbedSwap Exact Token...385811212022-05-19 11:33:123 hrs 19 mins ago0xc1d0d2d505b8122dbfe78e3ba37c7bde1105d2ef IN  PaintSwap: Router0 FTM0.049819771178
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x8b143551ec471eda5490fe9d9193a70a9cf9fc58ed2dfdcde55efc2fd460e0c6385914602022-05-19 14:51:3943 secs ago PaintSwap: Router PaintSwap: Marketplace V20.080089509288409862 FTM
0x8b143551ec471eda5490fe9d9193a70a9cf9fc58ed2dfdcde55efc2fd460e0c6385914602022-05-19 14:51:3943 secs ago PaintSwap: Router Fantom Finance: Wrapped Fantom Token0.800895092884098624 FTM
0x8b143551ec471eda5490fe9d9193a70a9cf9fc58ed2dfdcde55efc2fd460e0c6385914602022-05-19 14:51:3943 secs ago PaintSwap: Library V2 PaintSwap: Router0.880984602172508486 FTM
0x919dc8d981a2444ac4e68c46f1de9e499d4e71349311cd41d0de7f48d8df7261385913872022-05-19 14:50:261 min ago PaintSwap: Router PaintSwap: Marketplace V20.083601327384523092 FTM
0x919dc8d981a2444ac4e68c46f1de9e499d4e71349311cd41d0de7f48d8df7261385913872022-05-19 14:50:261 min ago PaintSwap: Router Fantom Finance: Wrapped Fantom Token0.800893492531762058 FTM
0x919dc8d981a2444ac4e68c46f1de9e499d4e71349311cd41d0de7f48d8df7261385913872022-05-19 14:50:261 min ago PaintSwap: Library V2 PaintSwap: Router0.88449481991628515 FTM
0x00a8e96eb7c2cc64df5af14fadbe8bc8066332ffc2aea537604264804aa47ac1385913792022-05-19 14:50:112 mins ago PaintSwap: Router0xab0aa2ea08b924f5c37f69a530696ac35bf13f331,591.407768854147946418 FTM
0x00a8e96eb7c2cc64df5af14fadbe8bc8066332ffc2aea537604264804aa47ac1385913792022-05-19 14:50:112 mins ago Fantom Finance: Wrapped Fantom Token PaintSwap: Router1,591.407768854147946418 FTM
0x563088a217c558a74037007285df75bcc510a0c48a88e98c1eb2388b1010f320385912802022-05-19 14:48:064 mins ago PaintSwap: Router PaintSwap: Marketplace V20.080442497916110268 FTM
0x563088a217c558a74037007285df75bcc510a0c48a88e98c1eb2388b1010f320385912802022-05-19 14:48:064 mins ago PaintSwap: Router Fantom Finance: Wrapped Fantom Token0.804424979161102683 FTM
0x563088a217c558a74037007285df75bcc510a0c48a88e98c1eb2388b1010f320385912802022-05-19 14:48:064 mins ago PaintSwap: Library V2 PaintSwap: Router0.884867477077212951 FTM
0x3de5da37cdbf4bd02717c3baf9f911753bc40c1808d25fe880c08e79323fdc24385911152022-05-19 14:45:107 mins ago PaintSwap: Router PaintSwap: Marketplace V20.080442336821164295 FTM
0x3de5da37cdbf4bd02717c3baf9f911753bc40c1808d25fe880c08e79323fdc24385911152022-05-19 14:45:107 mins ago PaintSwap: Router Fantom Finance: Wrapped Fantom Token0.804423368211642952 FTM
0x3de5da37cdbf4bd02717c3baf9f911753bc40c1808d25fe880c08e79323fdc24385911152022-05-19 14:45:107 mins ago PaintSwap: Library V2 PaintSwap: Router0.884865705032807247 FTM
0xe616c838c453b7a9f7af71c58463bf53c7b2eb7fd53e880a76ad68b5fbcf84a7385907452022-05-19 14:38:5313 mins ago PaintSwap: Router PaintSwap: Marketplace V20.080442175726701994 FTM
0xe616c838c453b7a9f7af71c58463bf53c7b2eb7fd53e880a76ad68b5fbcf84a7385907452022-05-19 14:38:5313 mins ago PaintSwap: Router Fantom Finance: Wrapped Fantom Token0.804421757267019948 FTM
0xe616c838c453b7a9f7af71c58463bf53c7b2eb7fd53e880a76ad68b5fbcf84a7385907452022-05-19 14:38:5313 mins ago PaintSwap: Library V2 PaintSwap: Router0.884863932993721942 FTM
0x1a81f3a15cd9add7cc12cc04829d8d4237d6be9003093afe27c48730f313ca67385907152022-05-19 14:38:2313 mins ago PaintSwap: Router PaintSwap: Marketplace V20.080442014632723365 FTM
0x1a81f3a15cd9add7cc12cc04829d8d4237d6be9003093afe27c48730f313ca67385907152022-05-19 14:38:2313 mins ago PaintSwap: Router Fantom Finance: Wrapped Fantom Token0.804420146327233653 FTM
0x1a81f3a15cd9add7cc12cc04829d8d4237d6be9003093afe27c48730f313ca67385907152022-05-19 14:38:2313 mins ago PaintSwap: Library V2 PaintSwap: Router0.884862160959957018 FTM
0xd069d3ba1b3dc4e6402fa101735c4296a66dd52f192bb44341694f918d7773bb385906602022-05-19 14:37:1915 mins ago PaintSwap: Router PaintSwap: Marketplace V20.080441853539228404 FTM
0xd069d3ba1b3dc4e6402fa101735c4296a66dd52f192bb44341694f918d7773bb385906602022-05-19 14:37:1915 mins ago PaintSwap: Router Fantom Finance: Wrapped Fantom Token0.804418535392284045 FTM
0xd069d3ba1b3dc4e6402fa101735c4296a66dd52f192bb44341694f918d7773bb385906602022-05-19 14:37:1915 mins ago PaintSwap: Library V2 PaintSwap: Router0.884860388931512449 FTM
0x120dda6309bdc9ec9c1e92c72b3838cb6c9779778e75080808441cf00fd0ce14385905742022-05-19 14:35:5116 mins ago PaintSwap: Router0xab0aa2ea08b924f5c37f69a530696ac35bf13f331 wei
0x120dda6309bdc9ec9c1e92c72b3838cb6c9779778e75080808441cf00fd0ce14385905742022-05-19 14:35:5116 mins ago PaintSwap: Router Fantom Finance: Wrapped Fantom Token6,542.999999999999999999 FTM
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
PaintRouter

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, GNU GPLv3 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at FtmScan.com on 2021-05-23
*/

// SPDX-License-Identifier: GPL-3.0-or-later Or MIT
pragma solidity >=0.8.0 <0.9.0;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @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) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    /**
     * @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 sub(a, b, "SafeMath: subtraction overflow");
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

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

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

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts 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) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts 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) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts 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 mod(a, b, "SafeMath: modulo by zero");
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message 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, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}


/*
 * @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 GSN 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) { // payable
        return msg.sender;
    }

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



/**
 * @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 () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        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 {
        emit OwnershipTransferred(_owner, address(0));
        _owner = 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");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}


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

    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
    function decimals() external view returns (uint8);
    function totalSupply() external view returns (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);

    function approve(address spender, uint value) external returns (bool);
    function transfer(address to, uint value) external returns (bool);
    function transferFrom(address from, address to, uint value) external returns (bool);
}

interface IPancakeFactory {
    event PairCreated(address indexed token0, address indexed token1, address pair, uint);

    function feeTo() external view returns (address);
    function feeToSetter() external view returns (address);

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

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

    function setFeeTo(address) external;
    function setFeeToSetter(address) external;

    function locked() external view returns (bool);
    function setLocked(bool) external;
}

interface IPancakeRouter01 {
    function factory() external view returns (address);
    function WETH() external view 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);
}


interface IPancakeRouter02 is IPancakeRouter01 {
    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;
}


interface IPaintPair {
    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
}

library PaintLibrary {
    using SafeMath for uint;

    // returns sorted token addresses, used to handle return values from pairs sorted in this order
    function sortTokens(address tokenA, address tokenB) internal pure returns (address token0, address token1) {
        require(tokenA != tokenB, 'PaintLibrary: IDENTICAL_ADDRESSES');
        (token0, token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA);
        require(token0 != address(0), 'PaintLibrary: ZERO_ADDRESS');
    }

    // calculates the CREATE2 address for a pair without making any external calls
    function pairFor(address factory, address tokenA, address tokenB) internal pure returns (address pair) {
        (address token0, address token1) = sortTokens(tokenA, tokenB);
        pair = address(uint160(uint(keccak256(abi.encodePacked(
                hex'ff',
                factory,
                keccak256(abi.encodePacked(token0, token1)),
                hex'52178a9131f5551c2e56bf7cbf02aed8be8130e6493915a6b0c7602ac2125e54' // init code hash
            )))));
    }

    // fetches and sorts the reserves for a pair
    function getReserves(address factory, address tokenA, address tokenB) internal view returns (uint reserveA, uint reserveB) {
        (address token0,) = sortTokens(tokenA, tokenB);
        pairFor(factory, tokenA, tokenB);
        (uint reserve0, uint reserve1,) = IPaintPair(pairFor(factory, tokenA, tokenB)).getReserves();
        (reserveA, reserveB) = tokenA == token0 ? (reserve0, reserve1) : (reserve1, reserve0);
    }

    // given some amount of an asset and pair reserves, returns an equivalent amount of the other asset
    function quote(uint amountA, uint reserveA, uint reserveB) internal pure returns (uint amountB) {
        require(amountA > 0, 'PaintLibrary: INSUFFICIENT_AMOUNT');
        require(reserveA > 0 && reserveB > 0, 'PaintLibrary: INSUFFICIENT_LIQUIDITY');
        amountB = amountA.mul(reserveB) / reserveA;
    }

    // given an input amount of an asset and pair reserves, returns the maximum output amount of the other asset
    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) internal pure returns (uint amountOut) {
        require(amountIn > 0, 'PaintLibrary: INSUFFICIENT_INPUT_AMOUNT');
        require(reserveIn > 0 && reserveOut > 0, 'PaintLibrary: INSUFFICIENT_LIQUIDITY');
        uint amountInWithFee = amountIn.mul(997);
        uint numerator = amountInWithFee.mul(reserveOut);
        uint denominator = reserveIn.mul(1000).add(amountInWithFee);
        amountOut = numerator / denominator;
    }

    // given an output amount of an asset and pair reserves, returns a required input amount of the other asset
    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) internal pure returns (uint amountIn) {
        require(amountOut > 0, 'PaintLibrary: INSUFFICIENT_OUTPUT_AMOUNT');
        require(reserveIn > 0 && reserveOut > 0, 'PaintLibrary: INSUFFICIENT_LIQUIDITY');
        uint numerator = reserveIn.mul(amountOut).mul(1000);
        uint denominator = reserveOut.sub(amountOut).mul(997);
        amountIn = (numerator / denominator).add(1);
    }

    // performs chained getAmountOut calculations on any number of pairs
    function getAmountsOut(address factory, uint amountIn, address[] memory path) internal view returns (uint[] memory amounts) {
        require(path.length >= 2, 'PaintLibrary: INVALID_PATH');
        amounts = new uint[](path.length);
        amounts[0] = amountIn;
        for (uint i; i < path.length - 1; i++) {
            (uint reserveIn, uint reserveOut) = getReserves(factory, path[i], path[i + 1]);
            amounts[i + 1] = getAmountOut(amounts[i], reserveIn, reserveOut);
        }
    }

    // performs chained getAmountIn calculations on any number of pairs
    function getAmountsIn(address factory, uint amountOut, address[] memory path) internal view returns (uint[] memory amounts) {
        require(path.length >= 2, 'PaintLibrary: INVALID_PATH');
        amounts = new uint[](path.length);
        amounts[amounts.length - 1] = amountOut;
        for (uint i = path.length - 1; i > 0; i--) {
            (uint reserveIn, uint reserveOut) = getReserves(factory, path[i - 1], path[i]);
            amounts[i - 1] = getAmountIn(amounts[i], reserveIn, reserveOut);
        }
    }
}


// helper methods for interacting with ERC20 tokens and sending ETH that do not consistently return true/false
library TransferHelper {
    function safeApprove(address token, address to, uint value) internal {
        // bytes4(keccak256(bytes('approve(address,uint256)')));
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x095ea7b3, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: APPROVE_FAILED');
    }

    function safeTransfer(address token, address to, uint value) internal {
        // bytes4(keccak256(bytes('transfer(address,uint256)')));
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: TRANSFER_FAILED');
    }

    function safeTransferFrom(address token, address from, address to, uint value) internal {
        // bytes4(keccak256(bytes('transferFrom(address,address,uint256)')));
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: TRANSFER_FROM_FAILED');
    }

    function safeTransferETH(address to, uint value) internal {
        (bool success,) = to.call{value:value}(new bytes(0));
        require(success, 'TransferHelper: ETH_TRANSFER_FAILED');
    }
}










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

    function name() external pure returns (string memory);
    function symbol() external pure returns (string memory);
    function decimals() external pure returns (uint8);
    function totalSupply() external view returns (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);

    function approve(address spender, uint value) external returns (bool);
    function transfer(address to, uint value) external returns (bool);
    function transferFrom(address from, address to, uint value) external returns (bool);

    function DOMAIN_SEPARATOR() external view returns (bytes32);
    function PERMIT_TYPEHASH() external pure returns (bytes32);
    function nonces(address owner) external view returns (uint);

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

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

    function MINIMUM_LIQUIDITY() external pure returns (uint);
    function factory() external view returns (address);
    function token0() external view returns (address);
    function token1() external view returns (address);
    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
    function price0CumulativeLast() external view returns (uint);
    function price1CumulativeLast() external view returns (uint);
    function kLast() external view returns (uint);

    function mint(address to) external returns (uint liquidity);
    function burn(address to) external returns (uint amount0, uint amount1);
    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
    function skim(address to) external;
    function sync() external;

    function initialize(address, address) external;
}

interface IWETH {
    function deposit() external payable;
    function transfer(address to, uint value) external returns (bool);
    function withdraw(uint) external;
}

interface BrushToken {
  function burn(uint256 _amount) external;
}

contract PaintRouter is IPancakeRouter02 {
    using SafeMath for uint;

    address public immutable override factory;
    address public override WETH;

    modifier ensure(uint deadline) {
        require(deadline >= block.timestamp, 'PaintRouter: EXPIRED');
        _;
    }

    constructor(address _factory, address _WETH) {
        factory = _factory;
        WETH = _WETH;
    }

    receive() external payable {
        assert(msg.sender == WETH); // only accept ETH via fallback from the WETH contract
    }

    // **** ADD LIQUIDITY ****
    function _addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin
    ) internal virtual returns (uint amountA, uint amountB) {
        // create the pair if it doesn't exist yet
        if (IPancakeFactory(factory).getPair(tokenA, tokenB) == address(0)) {
            IPancakeFactory(factory).createPair(tokenA, tokenB);
        }
        (uint reserveA, uint reserveB) = PaintLibrary.getReserves(factory, tokenA, tokenB);
        if (reserveA == 0 && reserveB == 0) {
            (amountA, amountB) = (amountADesired, amountBDesired);
        } else {
            uint amountBOptimal = PaintLibrary.quote(amountADesired, reserveA, reserveB);
            if (amountBOptimal <= amountBDesired) {
                require(amountBOptimal >= amountBMin, 'PaintRouter: INSUFFICIENT_B_AMOUNT');
                (amountA, amountB) = (amountADesired, amountBOptimal);
            } else {
                uint amountAOptimal = PaintLibrary.quote(amountBDesired, reserveB, reserveA);
                assert(amountAOptimal <= amountADesired);
                require(amountAOptimal >= amountAMin, 'PaintRouter: INSUFFICIENT_A_AMOUNT');
                (amountA, amountB) = (amountAOptimal, amountBDesired);
            }
        }
    }
    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external virtual override ensure(deadline) returns (uint amountA, uint amountB, uint liquidity) {
        (amountA, amountB) = _addLiquidity(tokenA, tokenB, amountADesired, amountBDesired, amountAMin, amountBMin);
        address pair = PaintLibrary.pairFor(factory, tokenA, tokenB);
        TransferHelper.safeTransferFrom(tokenA, msg.sender, pair, amountA);
        TransferHelper.safeTransferFrom(tokenB, msg.sender, pair, amountB);
        liquidity = IPancakePair(pair).mint(to);
    }
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external virtual override payable ensure(deadline) returns (uint amountToken, uint amountETH, uint liquidity) {
        (amountToken, amountETH) = _addLiquidity(
            token,
            WETH,
            amountTokenDesired,
            msg.value,
            amountTokenMin,
            amountETHMin
        );
        address pair = PaintLibrary.pairFor(factory, token, WETH);
        TransferHelper.safeTransferFrom(token, msg.sender, pair, amountToken);
        IWETH(WETH).deposit{value: amountETH}();
        assert(IWETH(WETH).transfer(pair, amountETH));
        liquidity = IPancakePair(pair).mint(to);
        // refund dust eth, if any
        if (msg.value > amountETH) TransferHelper.safeTransferETH(msg.sender, msg.value - amountETH);
    }

    // **** REMOVE LIQUIDITY ****
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) public virtual override ensure(deadline) returns (uint amountA, uint amountB) {
        address pair = PaintLibrary.pairFor(factory, tokenA, tokenB);
        IPancakePair(pair).transferFrom(msg.sender, pair, liquidity); // send liquidity to pair
        (uint amount0, uint amount1) = IPancakePair(pair).burn(to);
        (address token0,) = PaintLibrary.sortTokens(tokenA, tokenB);
        (amountA, amountB) = tokenA == token0 ? (amount0, amount1) : (amount1, amount0);
        require(amountA >= amountAMin, 'PaintRouter: INSUFFICIENT_A_AMOUNT');
        require(amountB >= amountBMin, 'PaintRouter: INSUFFICIENT_B_AMOUNT');
    }

    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) public virtual override ensure(deadline) returns (uint amountToken, uint amountETH) {
        (amountToken, amountETH) = removeLiquidity(
            token,
            WETH,
            liquidity,
            amountTokenMin,
            amountETHMin,
            address(this),
            deadline
        );
        TransferHelper.safeTransfer(token, to, amountToken);
        IWETH(WETH).withdraw(amountETH);
        TransferHelper.safeTransferETH(to, 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 virtual override returns (uint amountA, uint amountB) {
        address pair = PaintLibrary.pairFor(factory, tokenA, tokenB);
        uint value = approveMax ? type(uint).max : liquidity;
        IPancakePair(pair).permit(msg.sender, address(this), value, deadline, v, r, s);
        (amountA, amountB) = removeLiquidity(tokenA, tokenB, liquidity, amountAMin, amountBMin, to, deadline);
    }
    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external virtual override returns (uint amountToken, uint amountETH) {
        address pair = PaintLibrary.pairFor(factory, token, WETH);
        uint value = approveMax ? type(uint).max : liquidity;
        IPancakePair(pair).permit(msg.sender, address(this), value, deadline, v, r, s);
        (amountToken, amountETH) = removeLiquidityETH(token, liquidity, amountTokenMin, amountETHMin, to, deadline);
    }

    // **** REMOVE LIQUIDITY (supporting fee-on-transfer tokens) ****
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) public virtual override ensure(deadline) returns (uint amountETH) {
        (, amountETH) = removeLiquidity(
            token,
            WETH,
            liquidity,
            amountTokenMin,
            amountETHMin,
            address(this),
            deadline
        );
        TransferHelper.safeTransfer(token, to, IERC20(token).balanceOf(address(this)));
        IWETH(WETH).withdraw(amountETH);
        TransferHelper.safeTransferETH(to, amountETH);
    }
    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external virtual override returns (uint amountETH) {
        address pair = PaintLibrary.pairFor(factory, token, WETH);
        uint value = approveMax ? type(uint).max : liquidity;
        IPancakePair(pair).permit(msg.sender, address(this), value, deadline, v, r, s);
        amountETH = removeLiquidityETHSupportingFeeOnTransferTokens(
            token, liquidity, amountTokenMin, amountETHMin, to, deadline
        );
    }

   // **** SWAP ****
    // requires the initial amount to have already been sent to the first pair
    function _swap(uint[] memory amounts, address[] memory path, address _to) internal virtual {
        for (uint i; i < path.length - 1; i++) {
            (address input, address output) = (path[i], path[i + 1]);
            (address token0,) = PaintLibrary.sortTokens(input, output);
            uint amountOut = amounts[i + 1];
            (uint amount0Out, uint amount1Out) = input == token0 ? (uint(0), amountOut) : (amountOut, uint(0));
            address to = i < path.length - 2 ? PaintLibrary.pairFor(factory, output, path[i + 2]) : _to;
            IPancakePair(PaintLibrary.pairFor(factory, input, output)).swap(
                amount0Out, amount1Out, to, new bytes(0)
            );
        }
    }
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) public virtual override ensure(deadline) returns (uint[] memory amounts) {
        require(!IPancakeFactory(factory).locked(), 'PaintRouter: Permission Denied');
        amounts = PaintLibrary.getAmountsOut(factory, amountIn, path);
        require(amounts[amounts.length - 1] >= amountOutMin, 'PaintRouter: INSUFFICIENT_OUTPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, PaintLibrary.pairFor(factory, path[0], path[1]), amounts[0]
        );
        _swap(amounts, path, to);
    }
    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external virtual override ensure(deadline) returns (uint[] memory amounts) {
        require(!IPancakeFactory(factory).locked(), 'PaintRouter: Permission Denied');
        amounts = PaintLibrary.getAmountsIn(factory, amountOut, path);
        require(amounts[0] <= amountInMax, 'PaintRouter: EXCESSIVE_INPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, PaintLibrary.pairFor(factory, path[0], path[1]), amounts[0]
        );
        _swap(amounts, path, to);
    }
    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
        public
        virtual
        override
        payable
        ensure(deadline)
        returns (uint[] memory amounts)
    {
        require(!IPancakeFactory(factory).locked(), 'PaintRouter: Permission Denied');
        require(path[0] == WETH, 'PaintRouter: INVALID_PATH');
        amounts = PaintLibrary.getAmountsOut(factory, msg.value, path);
        require(amounts[amounts.length - 1] >= amountOutMin, 'PaintRouter: INSUFFICIENT_OUTPUT_AMOUNT');
        IWETH(WETH).deposit{value: amounts[0]}();
        assert(IWETH(WETH).transfer(PaintLibrary.pairFor(factory, path[0], path[1]), amounts[0]));
        _swap(amounts, path, to);
    }
    function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
        external
        virtual
        override
        ensure(deadline)
        returns (uint[] memory amounts)
    {
        require(!IPancakeFactory(factory).locked(), 'PaintRouter: Permission Denied');
        require(path[path.length - 1] == WETH, 'PaintRouter: INVALID_PATH');
        amounts = PaintLibrary.getAmountsIn(factory, amountOut, path);
        require(amounts[0] <= amountInMax, 'PaintRouter: EXCESSIVE_INPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, PaintLibrary.pairFor(factory, path[0], path[1]), amounts[0]
        );
        _swap(amounts, path, address(this));
        IWETH(WETH).withdraw(amounts[amounts.length - 1]);
        TransferHelper.safeTransferETH(to, amounts[amounts.length - 1]);
    }
    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        virtual
        override
        ensure(deadline)
        returns (uint[] memory amounts)
    {
        require(!IPancakeFactory(factory).locked(), 'PaintRouter: Permission Denied');
        require(path[path.length - 1] == WETH, 'PaintRouter: INVALID_PATH');
        amounts = PaintLibrary.getAmountsOut(factory, amountIn, path);
        require(amounts[amounts.length - 1] >= amountOutMin, 'PaintRouter: INSUFFICIENT_OUTPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, PaintLibrary.pairFor(factory, path[0], path[1]), amounts[0]
        );
        _swap(amounts, path, address(this));
        IWETH(WETH).withdraw(amounts[amounts.length - 1]);
        TransferHelper.safeTransferETH(to, amounts[amounts.length - 1]);
    }
    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
        external
        virtual
        override
        payable
        ensure(deadline)
        returns (uint[] memory amounts)
    {
        require(!IPancakeFactory(factory).locked(), 'PaintRouter: Permission Denied');
        require(path[0] == WETH, 'PaintRouter: INVALID_PATH');
        amounts = PaintLibrary.getAmountsIn(factory, amountOut, path);
        require(amounts[0] <= msg.value, 'PaintRouter: EXCESSIVE_INPUT_AMOUNT');
        IWETH(WETH).deposit{value: amounts[0]}();
        assert(IWETH(WETH).transfer(PaintLibrary.pairFor(factory, path[0], path[1]), amounts[0]));
        _swap(amounts, path, to);
        // refund dust eth, if any
        if (msg.value > amounts[0]) TransferHelper.safeTransferETH(msg.sender, msg.value - amounts[0]);
    }

    // **** SWAP (supporting fee-on-transfer tokens) ****
    // requires the initial amount to have already been sent to the first pair
    function _swapSupportingFeeOnTransferTokens(address[] memory path, address _to) internal virtual {
        for (uint i; i < path.length - 1; i++) {
            (address input, address output) = (path[i], path[i + 1]);
            (address token0,) = PaintLibrary.sortTokens(input, output);
            IPancakePair pair = IPancakePair(PaintLibrary.pairFor(factory, input, output));
            uint amountInput;
            uint amountOutput;
            { // scope to avoid stack too deep errors
            (uint reserve0, uint reserve1,) = pair.getReserves();
            (uint reserveInput, uint reserveOutput) = input == token0 ? (reserve0, reserve1) : (reserve1, reserve0);
            amountInput = IERC20(input).balanceOf(address(pair)).sub(reserveInput);
            amountOutput = PaintLibrary.getAmountOut(amountInput, reserveInput, reserveOutput);
            }
            (uint amount0Out, uint amount1Out) = input == token0 ? (uint(0), amountOutput) : (amountOutput, uint(0));
            address to = i < path.length - 2 ? PaintLibrary.pairFor(factory, output, path[i + 2]) : _to;
            pair.swap(amount0Out, amount1Out, to, new bytes(0));
        }
    }
    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external virtual override ensure(deadline) {
        require(!IPancakeFactory(factory).locked(), 'PaintRouter: Permission Denied');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, PaintLibrary.pairFor(factory, path[0], path[1]), amountIn
        );
        uint balanceBefore = IERC20(path[path.length - 1]).balanceOf(to);
        _swapSupportingFeeOnTransferTokens(path, to);
        require(
            IERC20(path[path.length - 1]).balanceOf(to).sub(balanceBefore) >= amountOutMin,
            'PaintRouter: INSUFFICIENT_OUTPUT_AMOUNT'
        );
    }
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    )
        external
        virtual
        override
        payable
        ensure(deadline)
    {
        require(!IPancakeFactory(factory).locked(), 'PaintRouter: Permission Denied');
        require(path[0] == WETH, 'PaintRouter: INVALID_PATH');
        uint amountIn = msg.value;
        IWETH(WETH).deposit{value: amountIn}();
        assert(IWETH(WETH).transfer(PaintLibrary.pairFor(factory, path[0], path[1]), amountIn));
        uint balanceBefore = IERC20(path[path.length - 1]).balanceOf(to);
        _swapSupportingFeeOnTransferTokens(path, to);
        require(
            IERC20(path[path.length - 1]).balanceOf(to).sub(balanceBefore) >= amountOutMin,
            'PaintRouter: INSUFFICIENT_OUTPUT_AMOUNT'
        );
    }
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    )
        external
        virtual
        override
        ensure(deadline)
    {
        require(!IPancakeFactory(factory).locked(), 'PaintRouter: Permission Denied');
        require(path[path.length - 1] == WETH, 'PaintRouter: INVALID_PATH');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, PaintLibrary.pairFor(factory, path[0], path[1]), amountIn
        );
        _swapSupportingFeeOnTransferTokens(path, address(this));
        uint amountOut = IERC20(WETH).balanceOf(address(this));
        require(amountOut >= amountOutMin, 'PaintRouter: INSUFFICIENT_OUTPUT_AMOUNT');
        IWETH(WETH).withdraw(amountOut);
        TransferHelper.safeTransferETH(to, amountOut);
    }    
    // **** LIBRARY FUNCTIONS ****
    function quote(uint amountA, uint reserveA, uint reserveB) public pure virtual override returns (uint amountB) {
        return PaintLibrary.quote(amountA, reserveA, reserveB);
    }

    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut)
        public
        pure
        virtual
        override
        returns (uint amountOut)
    {
        return PaintLibrary.getAmountOut(amountIn, reserveIn, reserveOut);
    }

    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut)
        public
        pure
        virtual
        override
        returns (uint amountIn)
    {
        return PaintLibrary.getAmountIn(amountOut, reserveIn, reserveOut);
    }

    function getAmountsOut(uint amountIn, address[] memory path)
        public
        view
        virtual
        override
        returns (uint[] memory amounts)
    {
        return PaintLibrary.getAmountsOut(factory, amountIn, path);
    }

    function getAmountsIn(uint amountOut, address[] memory path)
        public
        view
        virtual
        override
        returns (uint[] memory amounts)
    {
        return PaintLibrary.getAmountsIn(factory, amountOut, path);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_factory","type":"address"},{"internalType":"address","name":"_WETH","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"WETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"amountADesired","type":"uint256"},{"internalType":"uint256","name":"amountBDesired","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amountTokenDesired","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidityETH","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"reserveIn","type":"uint256"},{"internalType":"uint256","name":"reserveOut","type":"uint256"}],"name":"getAmountIn","outputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"reserveIn","type":"uint256"},{"internalType":"uint256","name":"reserveOut","type":"uint256"}],"name":"getAmountOut","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"getAmountsIn","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"getAmountsOut","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"reserveA","type":"uint256"},{"internalType":"uint256","name":"reserveB","type":"uint256"}],"name":"quote","outputs":[{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidityETH","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidityETHSupportingFeeOnTransferTokens","outputs":[{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityETHWithPermit","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityETHWithPermitSupportingFeeOnTransferTokens","outputs":[{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityWithPermit","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapETHForExactTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactETHForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactETHForTokensSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForETH","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForETHSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokensSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMax","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapTokensForExactETH","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMax","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapTokensForExactTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60a06040523480156200001157600080fd5b5060405162004ae238038062004ae2833981016040819052620000349162000089565b60609190911b6001600160601b031916608052600080546001600160a01b0319166001600160a01b03909216919091179055620000c0565b80516001600160a01b03811681146200008457600080fd5b919050565b600080604083850312156200009c578182fd5b620000a7836200006c565b9150620000b7602084016200006c565b90509250929050565b60805160601c61490e620001d460003960008181610408015281816105d2015281816106f4015281816107e2015281816109ca01528181610a0301528181610af701528181610ba801528181610cdf01528181610e0101528181610eb001528181610fa20152818161108d01528181611316015281816115c0015281816116d901528181611823015281816119a301528181611a5401528181611c5601528181611de301528181612057015281816122190152818161224d015281816123600152818161247f01528181612690015281816127a9015281816128e70152818161324b015281816132a9015281816135e40152818161375b01528181613aec01528181613b9e0152613c24015261490e6000f3fe60806040526004361061014f5760003560e01c80638803dbee116100b6578063c45a01551161006f578063c45a0155146103f6578063d06ca61f1461042a578063ded9382a1461044a578063e8e337001461046a578063f305d719146104a5578063fb3bdb41146104b857600080fd5b80638803dbee1461032b578063ad5c46481461034b578063ad615dec14610383578063af2979eb146103a3578063b6f9de95146103c3578063baa2abde146103d657600080fd5b80634a25d94a116101085780634a25d94a146102785780635b0d5984146102985780635c11d795146102b8578063791ac947146102d85780637ff36ab5146102f857806385f8c2591461030b57600080fd5b806302751cec14610183578063054d50d4146101bd57806318cbafe5146101eb5780631f00ca74146102185780632195995c1461023857806338ed17391461025857600080fd5b3661017e576000546001600160a01b0316331461017c57634e487b7160e01b600052600160045260246000fd5b005b600080fd5b34801561018f57600080fd5b506101a361019e366004614154565b6104cb565b604080519283526020830191909152015b60405180910390f35b3480156101c957600080fd5b506101dd6101d8366004614494565b610598565b6040519081526020016101b4565b3480156101f757600080fd5b5061020b610206366004614423565b6105ad565b6040516101b49190614548565b34801561022457600080fd5b5061020b61023336600461432d565b6109c3565b34801561024457600080fd5b506101a3610253366004614030565b6109f9565b34801561026457600080fd5b5061020b610273366004614423565b610ad2565b34801561028457600080fd5b5061020b610293366004614423565b610cba565b3480156102a457600080fd5b506101dd6102b33660046141b1565b610ea4565b3480156102c457600080fd5b5061017c6102d3366004614423565b610f7f565b3480156102e457600080fd5b5061017c6102f3366004614423565b6112f3565b61020b6103063660046142c8565b61159b565b34801561031757600080fd5b506101dd610326366004614494565b611971565b34801561033757600080fd5b5061020b610346366004614423565b61197e565b34801561035757600080fd5b5060005461036b906001600160a01b031681565b6040516001600160a01b0390911681526020016101b4565b34801561038f57600080fd5b506101dd61039e366004614494565b611af7565b3480156103af57600080fd5b506101dd6103be366004614154565b611b04565b61017c6103d13660046142c8565b611c33565b3480156103e257600080fd5b506101a36103f1366004613fbf565b61202c565b34801561040257600080fd5b5061036b7f000000000000000000000000000000000000000000000000000000000000000081565b34801561043657600080fd5b5061020b61044536600461432d565b612212565b34801561045657600080fd5b506101a36104653660046141b1565b61223f565b34801561047657600080fd5b5061048a6104853660046140d9565b612320565b604080519384526020840192909252908201526060016101b4565b61048a6104b3366004614154565b61242d565b61020b6104c63660046142c8565b61266b565b60008082428110156104f85760405162461bcd60e51b81526004016104ef906146a1565b60405180910390fd5b600054610514908a906001600160a01b03168a8a8a308a61202c565b9093509150610524898685612a93565b600054604051632e1a7d4d60e01b8152600481018490526001600160a01b0390911690632e1a7d4d90602401600060405180830381600087803b15801561056a57600080fd5b505af115801561057e573d6000803e3d6000fd5b5050505061058c8583612bae565b50965096945050505050565b60006105a5848484612c7c565b949350505050565b606081428110156105d05760405162461bcd60e51b81526004016104ef906146a1565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663cf3090126040518163ffffffff1660e01b815260040160206040518083038186803b15801561062957600080fd5b505afa15801561063d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106619190614246565b1561067e5760405162461bcd60e51b81526004016104ef906146cf565b6000546001600160a01b03168686610697600182614811565b8181106106b457634e487b7160e01b600052603260045260246000fd5b90506020020160208101906106c99190613f87565b6001600160a01b0316146106ef5760405162461bcd60e51b81526004016104ef9061459f565b61074d7f000000000000000000000000000000000000000000000000000000000000000089888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250612d5692505050565b915086826001845161075f9190614811565b8151811061077d57634e487b7160e01b600052603260045260246000fd5b602002602001015110156107a35760405162461bcd60e51b81526004016104ef90614618565b6108a0868660008181106107c757634e487b7160e01b600052603260045260246000fd5b90506020020160208101906107dc9190613f87565b336108727f00000000000000000000000000000000000000000000000000000000000000008a8a600081811061082257634e487b7160e01b600052603260045260246000fd5b90506020020160208101906108379190613f87565b8b8b600181811061085857634e487b7160e01b600052603260045260246000fd5b905060200201602081019061086d9190613f87565b612f35565b8560008151811061089357634e487b7160e01b600052603260045260246000fd5b602002602001015161300e565b6108df8287878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525030925061313e915050565b60005482516001600160a01b0390911690632e1a7d4d90849061090490600190614811565b8151811061092257634e487b7160e01b600052603260045260246000fd5b60200260200101516040518263ffffffff1660e01b815260040161094891815260200190565b600060405180830381600087803b15801561096257600080fd5b505af1158015610976573d6000803e3d6000fd5b505050506109b884836001855161098d9190614811565b815181106109ab57634e487b7160e01b600052603260045260246000fd5b6020026020010151612bae565b509695505050505050565b60606109f07f0000000000000000000000000000000000000000000000000000000000000000848461337e565b90505b92915050565b6000806000610a297f00000000000000000000000000000000000000000000000000000000000000008f8f612f35565b9050600087610a38578c610a3c565b6000195b60405163d505accf60e01b81529091506001600160a01b0383169063d505accf90610a77903390309086908f908e908e908e90600401614507565b600060405180830381600087803b158015610a9157600080fd5b505af1158015610aa5573d6000803e3d6000fd5b50505050610ab88f8f8f8f8f8f8f61202c565b809450819550505050509b509b9950505050505050505050565b60608142811015610af55760405162461bcd60e51b81526004016104ef906146a1565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663cf3090126040518163ffffffff1660e01b815260040160206040518083038186803b158015610b4e57600080fd5b505afa158015610b62573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b869190614246565b15610ba35760405162461bcd60e51b81526004016104ef906146cf565b610c017f000000000000000000000000000000000000000000000000000000000000000089888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250612d5692505050565b9150868260018451610c139190614811565b81518110610c3157634e487b7160e01b600052603260045260246000fd5b60200260200101511015610c575760405162461bcd60e51b81526004016104ef90614618565b610c7b868660008181106107c757634e487b7160e01b600052603260045260246000fd5b6109b88287878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525089925061313e915050565b60608142811015610cdd5760405162461bcd60e51b81526004016104ef906146a1565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663cf3090126040518163ffffffff1660e01b815260040160206040518083038186803b158015610d3657600080fd5b505afa158015610d4a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d6e9190614246565b15610d8b5760405162461bcd60e51b81526004016104ef906146cf565b6000546001600160a01b03168686610da4600182614811565b818110610dc157634e487b7160e01b600052603260045260246000fd5b9050602002016020810190610dd69190613f87565b6001600160a01b031614610dfc5760405162461bcd60e51b81526004016104ef9061459f565b610e5a7f00000000000000000000000000000000000000000000000000000000000000008988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061337e92505050565b91508682600081518110610e7e57634e487b7160e01b600052603260045260246000fd5b602002602001015111156107a35760405162461bcd60e51b81526004016104ef90614706565b600080548190610ee0907f0000000000000000000000000000000000000000000000000000000000000000908e906001600160a01b0316612f35565b9050600086610eef578b610ef3565b6000195b60405163d505accf60e01b81529091506001600160a01b0383169063d505accf90610f2e903390309086908e908d908d908d90600401614507565b600060405180830381600087803b158015610f4857600080fd5b505af1158015610f5c573d6000803e3d6000fd5b50505050610f6e8d8d8d8d8d8d611b04565b9d9c50505050505050505050505050565b8042811015610fa05760405162461bcd60e51b81526004016104ef906146a1565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663cf3090126040518163ffffffff1660e01b815260040160206040518083038186803b158015610ff957600080fd5b505afa15801561100d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110319190614246565b1561104e5760405162461bcd60e51b81526004016104ef906146cf565b6111098585600081811061107257634e487b7160e01b600052603260045260246000fd5b90506020020160208101906110879190613f87565b336111037f0000000000000000000000000000000000000000000000000000000000000000898960008181106110cd57634e487b7160e01b600052603260045260246000fd5b90506020020160208101906110e29190613f87565b8a8a600181811061085857634e487b7160e01b600052603260045260246000fd5b8a61300e565b60008585611118600182614811565b81811061113557634e487b7160e01b600052603260045260246000fd5b905060200201602081019061114a9190613f87565b6040516370a0823160e01b81526001600160a01b03868116600483015291909116906370a082319060240160206040518083038186803b15801561118d57600080fd5b505afa1580156111a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111c591906142b0565b9050611205868680806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250889250613553915050565b866112cb828888611217600182614811565b81811061123457634e487b7160e01b600052603260045260246000fd5b90506020020160208101906112499190613f87565b6040516370a0823160e01b81526001600160a01b03898116600483015291909116906370a08231906024015b60206040518083038186803b15801561128d57600080fd5b505afa1580156112a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112c591906142b0565b90613817565b10156112e95760405162461bcd60e51b81526004016104ef90614618565b5050505050505050565b80428110156113145760405162461bcd60e51b81526004016104ef906146a1565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663cf3090126040518163ffffffff1660e01b815260040160206040518083038186803b15801561136d57600080fd5b505afa158015611381573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113a59190614246565b156113c25760405162461bcd60e51b81526004016104ef906146cf565b6000546001600160a01b031685856113db600182614811565b8181106113f857634e487b7160e01b600052603260045260246000fd5b905060200201602081019061140d9190613f87565b6001600160a01b0316146114335760405162461bcd60e51b81526004016104ef9061459f565b6114578585600081811061107257634e487b7160e01b600052603260045260246000fd5b611495858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250613553915050565b600080546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b1580156114d957600080fd5b505afa1580156114ed573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061151191906142b0565b9050868110156115335760405162461bcd60e51b81526004016104ef90614618565b600054604051632e1a7d4d60e01b8152600481018390526001600160a01b0390911690632e1a7d4d90602401600060405180830381600087803b15801561157957600080fd5b505af115801561158d573d6000803e3d6000fd5b505050506112e98482612bae565b606081428110156115be5760405162461bcd60e51b81526004016104ef906146a1565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663cf3090126040518163ffffffff1660e01b815260040160206040518083038186803b15801561161757600080fd5b505afa15801561162b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061164f9190614246565b1561166c5760405162461bcd60e51b81526004016104ef906146cf565b600080546001600160a01b031690879087908161169957634e487b7160e01b600052603260045260246000fd5b90506020020160208101906116ae9190613f87565b6001600160a01b0316146116d45760405162461bcd60e51b81526004016104ef9061459f565b6117327f000000000000000000000000000000000000000000000000000000000000000034888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250612d5692505050565b91508682600184516117449190614811565b8151811061176257634e487b7160e01b600052603260045260246000fd5b602002602001015110156117885760405162461bcd60e51b81526004016104ef90614618565b6000805483516001600160a01b039091169163d0e30db0918591906117bd57634e487b7160e01b600052603260045260246000fd5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b1580156117f057600080fd5b505af1158015611804573d6000803e3d6000fd5b5050600080546001600160a01b0316935063a9059cbb925061186291507f0000000000000000000000000000000000000000000000000000000000000000908a908a90816110cd57634e487b7160e01b600052603260045260246000fd5b8460008151811061188357634e487b7160e01b600052603260045260246000fd5b60200260200101516040518363ffffffff1660e01b81526004016118bc9291906001600160a01b03929092168252602082015260400190565b602060405180830381600087803b1580156118d657600080fd5b505af11580156118ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061190e9190614246565b61192857634e487b7160e01b600052600160045260246000fd5b6119678287878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525089925061313e915050565b5095945050505050565b60006105a5848484613859565b606081428110156119a15760405162461bcd60e51b81526004016104ef906146a1565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663cf3090126040518163ffffffff1660e01b815260040160206040518083038186803b1580156119fa57600080fd5b505afa158015611a0e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a329190614246565b15611a4f5760405162461bcd60e51b81526004016104ef906146cf565b611aad7f00000000000000000000000000000000000000000000000000000000000000008988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061337e92505050565b91508682600081518110611ad157634e487b7160e01b600052603260045260246000fd5b60200260200101511115610c575760405162461bcd60e51b81526004016104ef90614706565b60006105a584848461392e565b60008142811015611b275760405162461bcd60e51b81526004016104ef906146a1565b600054611b439089906001600160a01b0316898989308961202c565b6040516370a0823160e01b8152306004820152909350611bcb9150899086906001600160a01b038316906370a082319060240160206040518083038186803b158015611b8e57600080fd5b505afa158015611ba2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bc691906142b0565b612a93565b600054604051632e1a7d4d60e01b8152600481018490526001600160a01b0390911690632e1a7d4d90602401600060405180830381600087803b158015611c1157600080fd5b505af1158015611c25573d6000803e3d6000fd5b505050506109b88483612bae565b8042811015611c545760405162461bcd60e51b81526004016104ef906146a1565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663cf3090126040518163ffffffff1660e01b815260040160206040518083038186803b158015611cad57600080fd5b505afa158015611cc1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ce59190614246565b15611d025760405162461bcd60e51b81526004016104ef906146cf565b600080546001600160a01b0316908690869081611d2f57634e487b7160e01b600052603260045260246000fd5b9050602002016020810190611d449190613f87565b6001600160a01b031614611d6a5760405162461bcd60e51b81526004016104ef9061459f565b6000805460408051630d0e30db60e41b8152905134936001600160a01b039093169263d0e30db09285926004808301939282900301818588803b158015611db057600080fd5b505af1158015611dc4573d6000803e3d6000fd5b5050600080546001600160a01b0316935063a9059cbb9250611e2291507f0000000000000000000000000000000000000000000000000000000000000000908a908a90816110cd57634e487b7160e01b600052603260045260246000fd5b6040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260248101849052604401602060405180830381600087803b158015611e6a57600080fd5b505af1158015611e7e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ea29190614246565b611ebc57634e487b7160e01b600052600160045260246000fd5b60008686611ecb600182614811565b818110611ee857634e487b7160e01b600052603260045260246000fd5b9050602002016020810190611efd9190613f87565b6040516370a0823160e01b81526001600160a01b03878116600483015291909116906370a082319060240160206040518083038186803b158015611f4057600080fd5b505afa158015611f54573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f7891906142b0565b9050611fb8878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613553915050565b876112cb828989611fca600182614811565b818110611fe757634e487b7160e01b600052603260045260246000fd5b9050602002016020810190611ffc9190613f87565b6040516370a0823160e01b81526001600160a01b038a8116600483015291909116906370a0823190602401611275565b60008082428110156120505760405162461bcd60e51b81526004016104ef906146a1565b600061207d7f00000000000000000000000000000000000000000000000000000000000000008c8c612f35565b6040516323b872dd60e01b81523360048201526001600160a01b03821660248201819052604482018c90529192506323b872dd90606401602060405180830381600087803b1580156120ce57600080fd5b505af11580156120e2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121069190614246565b5060405163226bf2d160e21b81526001600160a01b03878116600483015260009182918416906389afcb44906024016040805180830381600087803b15801561214e57600080fd5b505af1158015612162573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121869190614400565b9150915060006121968e8e6139ca565b509050806001600160a01b03168e6001600160a01b0316146121b95781836121bc565b82825b90975095508a8710156121e15760405162461bcd60e51b81526004016104ef906145d6565b898610156122015760405162461bcd60e51b81526004016104ef9061465f565b505050505097509795505050505050565b60606109f07f00000000000000000000000000000000000000000000000000000000000000008484612d56565b600080548190819061227d907f0000000000000000000000000000000000000000000000000000000000000000908f906001600160a01b0316612f35565b905060008761228c578c612290565b6000195b60405163d505accf60e01b81529091506001600160a01b0383169063d505accf906122cb903390309086908f908e908e908e90600401614507565b600060405180830381600087803b1580156122e557600080fd5b505af11580156122f9573d6000803e3d6000fd5b5050505061230b8e8e8e8e8e8e6104cb565b909f909e509c50505050505050505050505050565b600080600083428110156123465760405162461bcd60e51b81526004016104ef906146a1565b6123548c8c8c8c8c8c613abe565b909450925060006123867f00000000000000000000000000000000000000000000000000000000000000008e8e612f35565b90506123948d33838861300e565b6123a08c33838761300e565b6040516335313c2160e11b81526001600160a01b038881166004830152821690636a62784290602401602060405180830381600087803b1580156123e357600080fd5b505af11580156123f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061241b91906142b0565b92505050985098509895505050505050565b600080600083428110156124535760405162461bcd60e51b81526004016104ef906146a1565b60005461246e908b906001600160a01b03168b348c8c613abe565b60008054929650909450906124af907f0000000000000000000000000000000000000000000000000000000000000000908d906001600160a01b0316612f35565b90506124bd8b33838861300e565b60008054906101000a90046001600160a01b03166001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b15801561250b57600080fd5b505af115801561251f573d6000803e3d6000fd5b505060005460405163a9059cbb60e01b81526001600160a01b038681166004830152602482018a9052909116935063a9059cbb92506044019050602060405180830381600087803b15801561257357600080fd5b505af1158015612587573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125ab9190614246565b6125c557634e487b7160e01b600052600160045260246000fd5b6040516335313c2160e11b81526001600160a01b038881166004830152821690636a62784290602401602060405180830381600087803b15801561260857600080fd5b505af115801561261c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061264091906142b0565b92508334111561265d5761265d336126588634614811565b612bae565b505096509650969350505050565b6060814281101561268e5760405162461bcd60e51b81526004016104ef906146a1565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663cf3090126040518163ffffffff1660e01b815260040160206040518083038186803b1580156126e757600080fd5b505afa1580156126fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061271f9190614246565b1561273c5760405162461bcd60e51b81526004016104ef906146cf565b600080546001600160a01b031690879087908161276957634e487b7160e01b600052603260045260246000fd5b905060200201602081019061277e9190613f87565b6001600160a01b0316146127a45760405162461bcd60e51b81526004016104ef9061459f565b6128027f00000000000000000000000000000000000000000000000000000000000000008888888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061337e92505050565b9150348260008151811061282657634e487b7160e01b600052603260045260246000fd5b6020026020010151111561284c5760405162461bcd60e51b81526004016104ef90614706565b6000805483516001600160a01b039091169163d0e30db09185919061288157634e487b7160e01b600052603260045260246000fd5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b1580156128b457600080fd5b505af11580156128c8573d6000803e3d6000fd5b5050600080546001600160a01b0316935063a9059cbb925061292691507f0000000000000000000000000000000000000000000000000000000000000000908a908a90816110cd57634e487b7160e01b600052603260045260246000fd5b8460008151811061294757634e487b7160e01b600052603260045260246000fd5b60200260200101516040518363ffffffff1660e01b81526004016129809291906001600160a01b03929092168252602082015260400190565b602060405180830381600087803b15801561299a57600080fd5b505af11580156129ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129d29190614246565b6129ec57634e487b7160e01b600052600160045260246000fd5b612a2b8287878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525089925061313e915050565b81600081518110612a4c57634e487b7160e01b600052603260045260246000fd5b6020026020010151341115611967576119673383600081518110612a8057634e487b7160e01b600052603260045260246000fd5b6020026020010151346126589190614811565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b1790529151600092839290871691612aef91906144eb565b6000604051808303816000865af19150503d8060008114612b2c576040519150601f19603f3d011682016040523d82523d6000602084013e612b31565b606091505b5091509150818015612b5b575080511580612b5b575080806020019051810190612b5b9190614246565b612ba75760405162461bcd60e51b815260206004820152601f60248201527f5472616e7366657248656c7065723a205452414e534645525f4641494c45440060448201526064016104ef565b5050505050565b604080516000808252602082019092526001600160a01b038416908390604051612bd891906144eb565b60006040518083038185875af1925050503d8060008114612c15576040519150601f19603f3d011682016040523d82523d6000602084013e612c1a565b606091505b5050905080612c775760405162461bcd60e51b815260206004820152602360248201527f5472616e7366657248656c7065723a204554485f5452414e534645525f46414960448201526213115160ea1b60648201526084016104ef565b505050565b6000808411612cdd5760405162461bcd60e51b815260206004820152602760248201527f5061696e744c6962726172793a20494e53554646494349454e545f494e50555460448201526617d05353d5539560ca1b60648201526084016104ef565b600083118015612ced5750600082115b612d095760405162461bcd60e51b81526004016104ef90614749565b6000612d17856103e5613d0f565b90506000612d258285613d0f565b90506000612d3f83612d39886103e8613d0f565b90613d8e565b9050612d4b81836147d2565b979650505050505050565b6060600282511015612daa5760405162461bcd60e51b815260206004820152601a60248201527f5061696e744c6962726172793a20494e56414c49445f5041544800000000000060448201526064016104ef565b815167ffffffffffffffff811115612dd257634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015612dfb578160200160208202803683370190505b5090508281600081518110612e2057634e487b7160e01b600052603260045260246000fd5b60200260200101818152505060005b60018351612e3d9190614811565b811015612f2d57600080612eac87868581518110612e6b57634e487b7160e01b600052603260045260246000fd5b602002602001015187866001612e8191906147ba565b81518110612e9f57634e487b7160e01b600052603260045260246000fd5b6020026020010151613ded565b91509150612ee2848481518110612ed357634e487b7160e01b600052603260045260246000fd5b60200260200101518383612c7c565b84612eee8560016147ba565b81518110612f0c57634e487b7160e01b600052603260045260246000fd5b60200260200101818152505050508080612f259061486b565b915050612e2f565b509392505050565b6000806000612f4485856139ca565b6040516bffffffffffffffffffffffff19606084811b8216602084015283901b1660348201529193509150869060480160405160208183030381529060405280519060200120604051602001612fec9291906001600160f81b0319815260609290921b6bffffffffffffffffffffffff1916600183015260158201527f52178a9131f5551c2e56bf7cbf02aed8be8130e6493915a6b0c7602ac2125e54603582015260550190565b60408051601f1981840301815291905280516020909101209695505050505050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b179052915160009283929088169161307291906144eb565b6000604051808303816000865af19150503d80600081146130af576040519150601f19603f3d011682016040523d82523d6000602084013e6130b4565b606091505b50915091508180156130de5750805115806130de5750808060200190518101906130de9190614246565b6131365760405162461bcd60e51b8152602060048201526024808201527f5472616e7366657248656c7065723a205452414e534645525f46524f4d5f46416044820152631253115160e21b60648201526084016104ef565b505050505050565b60005b6001835161314f9190614811565b8110156133785760008084838151811061317957634e487b7160e01b600052603260045260246000fd5b60200260200101518584600161318f91906147ba565b815181106131ad57634e487b7160e01b600052603260045260246000fd5b60200260200101519150915060006131c583836139ca565b5090506000876131d68660016147ba565b815181106131f457634e487b7160e01b600052603260045260246000fd5b60200260200101519050600080836001600160a01b0316866001600160a01b03161461322257826000613226565b6000835b91509150600060028a5161323a9190614811565b881061324657886132a2565b6132a27f0000000000000000000000000000000000000000000000000000000000000000878c6132778c60026147ba565b8151811061329557634e487b7160e01b600052603260045260246000fd5b6020026020010151612f35565b90506132cf7f00000000000000000000000000000000000000000000000000000000000000008888612f35565b6001600160a01b031663022c0d9f84848460006040519080825280601f01601f19166020018201604052801561330c576020820181803683370190505b506040518563ffffffff1660e01b815260040161332c949392919061478d565b600060405180830381600087803b15801561334657600080fd5b505af115801561335a573d6000803e3d6000fd5b505050505050505050505080806133709061486b565b915050613141565b50505050565b60606002825110156133d25760405162461bcd60e51b815260206004820152601a60248201527f5061696e744c6962726172793a20494e56414c49445f5041544800000000000060448201526064016104ef565b815167ffffffffffffffff8111156133fa57634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015613423578160200160208202803683370190505b5090508281600183516134369190614811565b8151811061345457634e487b7160e01b600052603260045260246000fd5b6020026020010181815250506000600183516134709190614811565b90505b8015612f2d576000806134d2878661348c600187614811565b815181106134aa57634e487b7160e01b600052603260045260246000fd5b6020026020010151878681518110612e9f57634e487b7160e01b600052603260045260246000fd5b915091506135088484815181106134f957634e487b7160e01b600052603260045260246000fd5b60200260200101518383613859565b84613514600186614811565b8151811061353257634e487b7160e01b600052603260045260246000fd5b6020026020010181815250505050808061354b90614854565b915050613473565b60005b600183516135649190614811565b811015612c775760008084838151811061358e57634e487b7160e01b600052603260045260246000fd5b6020026020010151858460016135a491906147ba565b815181106135c257634e487b7160e01b600052603260045260246000fd5b60200260200101519150915060006135da83836139ca565b509050600061360a7f00000000000000000000000000000000000000000000000000000000000000008585612f35565b9050600080600080846001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561364b57600080fd5b505afa15801561365f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136839190614262565b506001600160701b031691506001600160701b03169150600080876001600160a01b03168a6001600160a01b0316146136bd5782846136c0565b83835b6040516370a0823160e01b81526001600160a01b038a811660048301529294509092506136fb918491908d16906370a0823190602401611275565b9550613708868383612c7c565b945050505050600080856001600160a01b0316886001600160a01b03161461373257826000613736565b6000835b91509150600060028c5161374a9190614811565b8a10613756578a613787565b6137877f0000000000000000000000000000000000000000000000000000000000000000898e6132778e60026147ba565b6040805160008152602081019182905263022c0d9f60e01b9091529091506001600160a01b0387169063022c0d9f906137c9908690869086906024810161478d565b600060405180830381600087803b1580156137e357600080fd5b505af11580156137f7573d6000803e3d6000fd5b50505050505050505050505050808061380f9061486b565b915050613556565b60006109f083836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613ed2565b60008084116138bb5760405162461bcd60e51b815260206004820152602860248201527f5061696e744c6962726172793a20494e53554646494349454e545f4f555450556044820152671517d05353d5539560c21b60648201526084016104ef565b6000831180156138cb5750600082115b6138e75760405162461bcd60e51b81526004016104ef90614749565b60006138ff6103e86138f98688613d0f565b90613d0f565b905060006139136103e56138f98689613817565b90506139246001612d3983856147d2565b9695505050505050565b60008084116139895760405162461bcd60e51b815260206004820152602160248201527f5061696e744c6962726172793a20494e53554646494349454e545f414d4f554e6044820152601560fa1b60648201526084016104ef565b6000831180156139995750600082115b6139b55760405162461bcd60e51b81526004016104ef90614749565b826139c08584613d0f565b6105a591906147d2565b600080826001600160a01b0316846001600160a01b03161415613a395760405162461bcd60e51b815260206004820152602160248201527f5061696e744c6962726172793a204944454e544943414c5f41444452455353456044820152605360f81b60648201526084016104ef565b826001600160a01b0316846001600160a01b031610613a59578284613a5c565b83835b90925090506001600160a01b038216613ab75760405162461bcd60e51b815260206004820152601a60248201527f5061696e744c6962726172793a205a45524f5f4144445245535300000000000060448201526064016104ef565b9250929050565b60405163e6a4390560e01b81526001600160a01b0387811660048301528681166024830152600091829182917f00000000000000000000000000000000000000000000000000000000000000009091169063e6a439059060440160206040518083038186803b158015613b3057600080fd5b505afa158015613b44573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b689190613fa3565b6001600160a01b03161415613c1c576040516364e329cb60e11b81526001600160a01b03898116600483015288811660248301527f0000000000000000000000000000000000000000000000000000000000000000169063c9c6539690604401602060405180830381600087803b158015613be257600080fd5b505af1158015613bf6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c1a9190613fa3565b505b600080613c4a7f00000000000000000000000000000000000000000000000000000000000000008b8b613ded565b91509150816000148015613c5c575080155b15613c6c57879350869250613d02565b6000613c7989848461392e565b9050878111613cad5785811015613ca25760405162461bcd60e51b81526004016104ef9061465f565b889450925082613d00565b6000613cba89848661392e565b905089811115613cda57634e487b7160e01b600052600160045260246000fd5b87811015613cfa5760405162461bcd60e51b81526004016104ef906145d6565b94508793505b505b5050965096945050505050565b600082613d1e575060006109f3565b6000613d2a83856147f2565b905082613d3785836147d2565b146109f05760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b60648201526084016104ef565b600080613d9b83856147ba565b9050838110156109f05760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f77000000000060448201526064016104ef565b6000806000613dfc85856139ca565b509050613e0a868686612f35565b50600080613e19888888612f35565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015613e5157600080fd5b505afa158015613e65573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e899190614262565b506001600160701b031691506001600160701b03169150826001600160a01b0316876001600160a01b031614613ec0578082613ec3565b81815b90999098509650505050505050565b60008184841115613ef65760405162461bcd60e51b81526004016104ef919061458c565b506000613f038486614811565b95945050505050565b8035613f17816148b2565b919050565b60008083601f840112613f2d578081fd5b50813567ffffffffffffffff811115613f44578182fd5b6020830191508360208260051b8501011115613ab757600080fd5b80516001600160701b0381168114613f1757600080fd5b803560ff81168114613f1757600080fd5b600060208284031215613f98578081fd5b81356109f0816148b2565b600060208284031215613fb4578081fd5b81516109f0816148b2565b600080600080600080600060e0888a031215613fd9578283fd5b8735613fe4816148b2565b96506020880135613ff4816148b2565b955060408801359450606088013593506080880135925060a0880135614019816148b2565b8092505060c0880135905092959891949750929550565b60008060008060008060008060008060006101608c8e031215614051578384fd5b8b3561405c816148b2565b9a5060208c013561406c816148b2565b995060408c0135985060608c0135975060808c0135965060a08c0135614091816148b2565b955060c08c0135945060e08c01356140a8816148ca565b93506140b76101008d01613f76565b92506101208c013591506101408c013590509295989b509295989b9093969950565b600080600080600080600080610100898b0312156140f5578384fd5b8835614100816148b2565b97506020890135614110816148b2565b965060408901359550606089013594506080890135935060a0890135925060c089013561413c816148b2565b8092505060e089013590509295985092959890939650565b60008060008060008060c0878903121561416c578182fd5b8635614177816148b2565b9550602087013594506040870135935060608701359250608087013561419c816148b2565b8092505060a087013590509295509295509295565b6000806000806000806000806000806101408b8d0312156141d0578384fd5b8a356141db816148b2565b995060208b0135985060408b0135975060608b0135965060808b0135614200816148b2565b955060a08b0135945060c08b0135614217816148ca565b935061422560e08c01613f76565b92506101008b013591506101208b013590509295989b9194979a5092959850565b600060208284031215614257578081fd5b81516109f0816148ca565b600080600060608486031215614276578081fd5b61427f84613f5f565b925061428d60208501613f5f565b9150604084015163ffffffff811681146142a5578182fd5b809150509250925092565b6000602082840312156142c1578081fd5b5051919050565b6000806000806000608086880312156142df578283fd5b85359450602086013567ffffffffffffffff8111156142fc578384fd5b61430888828901613f1c565b909550935050604086013561431c816148b2565b949793965091946060013592915050565b6000806040838503121561433f578182fd5b8235915060208084013567ffffffffffffffff8082111561435e578384fd5b818601915086601f830112614371578384fd5b8135818111156143835761438361489c565b8060051b604051601f19603f830116810181811085821117156143a8576143a861489c565b604052828152858101935084860182860187018b10156143c6578788fd5b8795505b838610156143ef576143db81613f0c565b8552600195909501949386019386016143ca565b508096505050505050509250929050565b60008060408385031215614412578182fd5b505080516020909101519092909150565b60008060008060008060a0878903121561443b578384fd5b8635955060208701359450604087013567ffffffffffffffff81111561445f578485fd5b61446b89828a01613f1c565b909550935050606087013561447f816148b2565b80925050608087013590509295509295509295565b6000806000606084860312156144a8578081fd5b505081359360208301359350604090920135919050565b600081518084526144d7816020860160208601614828565b601f01601f19169290920160200192915050565b600082516144fd818460208701614828565b9190910192915050565b6001600160a01b0397881681529590961660208601526040850193909352606084019190915260ff16608083015260a082015260c081019190915260e00190565b6020808252825182820181905260009190848201906040850190845b8181101561458057835183529284019291840191600101614564565b50909695505050505050565b6020815260006109f060208301846144bf565b60208082526019908201527f5061696e74526f757465723a20494e56414c49445f5041544800000000000000604082015260600190565b60208082526022908201527f5061696e74526f757465723a20494e53554646494349454e545f415f414d4f55604082015261139560f21b606082015260800190565b60208082526027908201527f5061696e74526f757465723a20494e53554646494349454e545f4f555450555460408201526617d05353d5539560ca1b606082015260800190565b60208082526022908201527f5061696e74526f757465723a20494e53554646494349454e545f425f414d4f55604082015261139560f21b606082015260800190565b60208082526014908201527314185a5b9d149bdd5d195c8e881156141254915160621b604082015260600190565b6020808252601e908201527f5061696e74526f757465723a205065726d697373696f6e2044656e6965640000604082015260600190565b60208082526023908201527f5061696e74526f757465723a204558434553534956455f494e5055545f414d4f60408201526215539560ea1b606082015260800190565b60208082526024908201527f5061696e744c6962726172793a20494e53554646494349454e545f4c495155496040820152634449545960e01b606082015260800190565b84815283602082015260018060a01b038316604082015260806060820152600061392460808301846144bf565b600082198211156147cd576147cd614886565b500190565b6000826147ed57634e487b7160e01b81526012600452602481fd5b500490565b600081600019048311821515161561480c5761480c614886565b500290565b60008282101561482357614823614886565b500390565b60005b8381101561484357818101518382015260200161482b565b838111156133785750506000910152565b60008161486357614863614886565b506000190190565b600060001982141561487f5761487f614886565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146148c757600080fd5b50565b80151581146148c757600080fdfea2646970667358221220931899c77bbb15a8c123b96a81dcc50a78cb748071e8294cfa5cd6d8f310948164736f6c63430008040033000000000000000000000000733a9d1585f2d14c77b49d39bc7d7dd14cda4aa500000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c83

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

000000000000000000000000733a9d1585f2d14c77b49d39bc7d7dd14cda4aa500000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c83

-----Decoded View---------------
Arg [0] : _factory (address): 0x733a9d1585f2d14c77b49d39bc7d7dd14cda4aa5
Arg [1] : _WETH (address): 0x21be370d5312f44cb42ce377bc9b8a0cef1a4c83

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000733a9d1585f2d14c77b49d39bc7d7dd14cda4aa5
Arg [1] : 00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c83


Deployed ByteCode Sourcemap

23685:19081:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24152:4;;-1:-1:-1;;;;;24152:4:0;24138:10;:18;24131:26;;-1:-1:-1;;;24131:26:0;;;;;;;;;23685:19081;;;;;28234:673;;;;;;;;;;-1:-1:-1;28234:673:0;;;;;:::i;:::-;;:::i;:::-;;;;22254:25:1;;;22310:2;22295:18;;22288:34;;;;22227:18;28234:673:0;;;;;;;;41726:258;;;;;;;;;;-1:-1:-1;41726:258:0;;;;;:::i;:::-;;:::i;:::-;;;22044:25:1;;;22032:2;22017:18;41726:258:0;21999:76:1;35680:922:0;;;;;;;;;;-1:-1:-1;35680:922:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;42514:249::-;;;;;;;;;;-1:-1:-1;42514:249:0;;;;;:::i;:::-;;:::i;28913:677::-;;;;;;;;;;-1:-1:-1;28913:677:0;;;;;:::i;:::-;;:::i;32605:702::-;;;;;;;;;;-1:-1:-1;32605:702:0;;;;;:::i;:::-;;:::i;34774:900::-;;;;;;;;;;-1:-1:-1;34774:900:0;;;;;:::i;:::-;;:::i;31050:718::-;;;;;;;;;;-1:-1:-1;31050:718:0;;;;;:::i;:::-;;:::i;38837:794::-;;;;;;;;;;-1:-1:-1;38837:794:0;;;;;:::i;:::-;;:::i;40569:919::-;;;;;;;;;;-1:-1:-1;40569:919:0;;;;;:::i;:::-;;:::i;34001:767::-;;;;;;:::i;:::-;;:::i;41992:257::-;;;;;;;;;;-1:-1:-1;41992:257:0;;;;;:::i;:::-;;:::i;33313:682::-;;;;;;;;;;-1:-1:-1;33313:682:0;;;;;:::i;:::-;;:::i;23813:28::-;;;;;;;;;;-1:-1:-1;23813:28:0;;;;-1:-1:-1;;;;;23813:28:0;;;;;;-1:-1:-1;;;;;12004:32:1;;;11986:51;;11974:2;11959:18;23813:28:0;11941:102:1;41534:184:0;;;;;;;;;;-1:-1:-1;41534:184:0;;;;;:::i;:::-;;:::i;30344:700::-;;;;;;;;;;-1:-1:-1;30344:700:0;;;;;:::i;:::-;;:::i;39637:926::-;;;;;;:::i;:::-;;:::i;27381:845::-;;;;;;;;;;-1:-1:-1;27381:845:0;;;;;:::i;:::-;;:::i;23765:41::-;;;;;;;;;;;;;;;42257:249;;;;;;;;;;-1:-1:-1;42257:249:0;;;;;:::i;:::-;;:::i;29596:669::-;;;;;;;;;;-1:-1:-1;29596:669:0;;;;;:::i;:::-;;:::i;25632:732::-;;;;;;;;;;-1:-1:-1;25632:732:0;;;;;:::i;:::-;;:::i;:::-;;;;22998:25:1;;;23054:2;23039:18;;23032:34;;;;23082:18;;;23075:34;22986:2;22971:18;25632:732:0;22953:162:1;26370:968:0;;;;;;:::i;:::-;;:::i;36608:882::-;;;;;;:::i;:::-;;:::i;28234:673::-;28471:16;28489:14;28452:8;23912:15;23900:8;:27;;23892:60;;;;-1:-1:-1;;;23892:60:0;;;;;;;:::i;:::-;;;;;;;;;28593:4:::1;::::0;28543:196:::1;::::0;28573:5;;-1:-1:-1;;;;;28593:4:0::1;28612:9:::0;28636:14;28665:12;28700:4:::1;28720:8:::0;28543:15:::1;:196::i;:::-;28516:223:::0;;-1:-1:-1;28516:223:0;-1:-1:-1;28750:51:0::1;28778:5:::0;28785:2;28516:223;28750:27:::1;:51::i;:::-;28818:4;::::0;28812:31:::1;::::0;-1:-1:-1;;;28812:31:0;;::::1;::::0;::::1;22044:25:1::0;;;-1:-1:-1;;;;;28818:4:0;;::::1;::::0;28812:20:::1;::::0;22017:18:1;;28812:31:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;28854:45;28885:2;28889:9;28854:30;:45::i;:::-;28234:673:::0;;;;;;;;;;:::o;41726:258::-;41879:14;41918:58;41944:8;41954:9;41965:10;41918:25;:58::i;:::-;41911:65;41726:258;-1:-1:-1;;;;41726:258:0:o;35680:922::-;35894:21;35866:8;23912:15;23900:8;:27;;23892:60;;;;-1:-1:-1;;;23892:60:0;;;;;;;:::i;:::-;35958:7:::1;-1:-1:-1::0;;;;;35942:31:0::1;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35941:34;35933:77;;;;-1:-1:-1::0;;;35933:77:0::1;;;;;;;:::i;:::-;36054:4;::::0;-1:-1:-1;;;;;36054:4:0::1;36029::::0;;36034:15:::1;36054:4:::0;36029;36034:15:::1;:::i;:::-;36029:21;;;;;-1:-1:-1::0;;;36029:21:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;36029:29:0::1;;36021:67;;;;-1:-1:-1::0;;;36021:67:0::1;;;;;;;:::i;:::-;36109:51;36136:7;36145:8;36155:4;;36109:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;36109:26:0::1;::::0;-1:-1:-1;;;36109:51:0:i:1;:::-;36099:61;;36210:12;36179:7;36204:1;36187:7;:14;:18;;;;:::i;:::-;36179:27;;;;;;-1:-1:-1::0;;;36179:27:0::1;;;;;;;;;;;;;;;:43;;36171:95;;;;-1:-1:-1::0;;;36171:95:0::1;;;;;;;:::i;:::-;36277:137;36323:4;;36328:1;36323:7;;;;;-1:-1:-1::0;;;36323:7:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36332:10;36344:47;36365:7;36374:4;;36379:1;36374:7;;;;;-1:-1:-1::0;;;36374:7:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36383:4;;36388:1;36383:7;;;;;-1:-1:-1::0;;;36383:7:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36344:20;:47::i;:::-;36393:7;36401:1;36393:10;;;;;;-1:-1:-1::0;;;36393:10:0::1;;;;;;;;;;;;;;;36277:31;:137::i;:::-;36425:35;36431:7;36440:4;;36425:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;36454:4:0::1;::::0;-1:-1:-1;36425:5:0::1;::::0;-1:-1:-1;;36425:35:0:i:1;:::-;36477:4;::::0;36500:14;;-1:-1:-1;;;;;36477:4:0;;::::1;::::0;36471:20:::1;::::0;36492:7;;36500:18:::1;::::0;36477:4;;36500:18:::1;:::i;:::-;36492:27;;;;;;-1:-1:-1::0;;;36492:27:0::1;;;;;;;;;;;;;;;36471:49;;;;;;;;;;;;;22044:25:1::0;;22032:2;22017:18;;21999:76;36471:49:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;36531:63;36562:2;36566:7;36591:1;36574:7;:14;:18;;;;:::i;:::-;36566:27;;;;;;-1:-1:-1::0;;;36566:27:0::1;;;;;;;;;;;;;;;36531:30;:63::i;:::-;35680:922:::0;;;;;;;;;:::o;42514:249::-;42658:21;42704:51;42730:7;42739:9;42750:4;42704:25;:51::i;:::-;42697:58;;42514:249;;;;;:::o;28913:677::-;29219:12;29233;29258;29273:45;29294:7;29303:6;29311;29273:20;:45::i;:::-;29258:60;;29329:10;29342;:39;;29372:9;29342:39;;;-1:-1:-1;;29342:39:0;29392:78;;-1:-1:-1;;;29392:78:0;;29329:52;;-1:-1:-1;;;;;;29392:25:0;;;;;:78;;29418:10;;29438:4;;29329:52;;29452:8;;29462:1;;29465;;29468;;29392:78;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29502:80;29518:6;29526;29534:9;29545:10;29557;29569:2;29573:8;29502:15;:80::i;:::-;29481:101;;;;;;;;28913:677;;;;;;;;;;;;;;;;:::o;32605:702::-;32827:21;32808:8;23912:15;23900:8;:27;;23892:60;;;;-1:-1:-1;;;23892:60:0;;;;;;;:::i;:::-;32886:7:::1;-1:-1:-1::0;;;;;32870:31:0::1;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32869:34;32861:77;;;;-1:-1:-1::0;;;32861:77:0::1;;;;;;;:::i;:::-;32959:51;32986:7;32995:8;33005:4;;32959:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;32959:26:0::1;::::0;-1:-1:-1;;;32959:51:0:i:1;:::-;32949:61;;33060:12;33029:7;33054:1;33037:7;:14;:18;;;;:::i;:::-;33029:27;;;;;;-1:-1:-1::0;;;33029:27:0::1;;;;;;;;;;;;;;;:43;;33021:95;;;;-1:-1:-1::0;;;33021:95:0::1;;;;;;;:::i;:::-;33127:137;33173:4;;33178:1;33173:7;;;;;-1:-1:-1::0;;;33173:7:0::1;;;;;;;;33127:137;33275:24;33281:7;33290:4;;33275:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;33296:2:0;;-1:-1:-1;33275:5:0::1;::::0;-1:-1:-1;;33275:24:0:i:1;34774:900::-:0;34988:21;34960:8;23912:15;23900:8;:27;;23892:60;;;;-1:-1:-1;;;23892:60:0;;;;;;;:::i;:::-;35052:7:::1;-1:-1:-1::0;;;;;35036:31:0::1;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35035:34;35027:77;;;;-1:-1:-1::0;;;35027:77:0::1;;;;;;;:::i;:::-;35148:4;::::0;-1:-1:-1;;;;;35148:4:0::1;35123::::0;;35128:15:::1;35148:4:::0;35123;35128:15:::1;:::i;:::-;35123:21;;;;;-1:-1:-1::0;;;35123:21:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;35123:29:0::1;;35115:67;;;;-1:-1:-1::0;;;35115:67:0::1;;;;;;;:::i;:::-;35203:51;35229:7;35238:9;35249:4;;35203:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;35203:25:0::1;::::0;-1:-1:-1;;;35203:51:0:i:1;:::-;35193:61;;35287:11;35273:7;35281:1;35273:10;;;;;;-1:-1:-1::0;;;35273:10:0::1;;;;;;;;;;;;;;;:25;;35265:73;;;;-1:-1:-1::0;;;35265:73:0::1;;;;;;;:::i;31050:718::-:0;31368:14;31447:4;;31368:14;;31410:42;;31431:7;;31440:5;;-1:-1:-1;;;;;31447:4:0;31410:20;:42::i;:::-;31395:57;;31463:10;31476;:39;;31506:9;31476:39;;;-1:-1:-1;;31476:39:0;31526:78;;-1:-1:-1;;;31526:78:0;;31463:52;;-1:-1:-1;;;;;;31526:25:0;;;;;:78;;31552:10;;31572:4;;31463:52;;31586:8;;31596:1;;31599;;31602;;31526:78;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31627:133;31689:5;31696:9;31707:14;31723:12;31737:2;31741:8;31627:47;:133::i;:::-;31615:145;31050:718;-1:-1:-1;;;;;;;;;;;;;31050:718:0:o;38837:794::-;39071:8;23912:15;23900:8;:27;;23892:60;;;;-1:-1:-1;;;23892:60:0;;;;;;;:::i;:::-;39117:7:::1;-1:-1:-1::0;;;;;39101:31:0::1;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39100:34;39092:77;;;;-1:-1:-1::0;;;39092:77:0::1;;;;;;;:::i;:::-;39180:135;39226:4;;39231:1;39226:7;;;;;-1:-1:-1::0;;;39226:7:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39235:10;39247:47;39268:7;39277:4;;39282:1;39277:7;;;;;-1:-1:-1::0;;;39277:7:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39286:4;;39291:1;39286:7;;;;;-1:-1:-1::0;;;39286:7:0::1;;;;;;;;39247:47;39296:8;39180:31;:135::i;:::-;39326:18;39354:4:::0;;39359:15:::1;39373:1;39354:4:::0;39359:15:::1;:::i;:::-;39354:21;;;;;-1:-1:-1::0;;;39354:21:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39347:43;::::0;-1:-1:-1;;;39347:43:0;;-1:-1:-1;;;;;12004:32:1;;;39347:43:0::1;::::0;::::1;11986:51:1::0;39347:39:0;;;::::1;::::0;::::1;::::0;11959:18:1;;39347:43:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39326:64;;39401:44;39436:4;;39401:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;39442:2:0;;-1:-1:-1;39401:34:0::1;::::0;-1:-1:-1;;39401:44:0:i:1;:::-;39544:12:::0;39478:62:::1;39526:13:::0;39485:4;;39490:15:::1;39504:1;39485:4:::0;39490:15:::1;:::i;:::-;39485:21;;;;;-1:-1:-1::0;;;39485:21:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39478:43;::::0;-1:-1:-1;;;39478:43:0;;-1:-1:-1;;;;;12004:32:1;;;39478:43:0::1;::::0;::::1;11986:51:1::0;39478:39:0;;;::::1;::::0;::::1;::::0;11959:18:1;;39478:43:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:47:::0;::::1;:62::i;:::-;:78;;39456:167;;;;-1:-1:-1::0;;;39456:167:0::1;;;;;;;:::i;:::-;23963:1;38837:794:::0;;;;;;;:::o;40569:919::-;40836:8;23912:15;23900:8;:27;;23892:60;;;;-1:-1:-1;;;23892:60:0;;;;;;;:::i;:::-;40887:7:::1;-1:-1:-1::0;;;;;40871:31:0::1;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40870:34;40862:77;;;;-1:-1:-1::0;;;40862:77:0::1;;;;;;;:::i;:::-;40983:4;::::0;-1:-1:-1;;;;;40983:4:0::1;40958::::0;;40963:15:::1;40983:4:::0;40958;40963:15:::1;:::i;:::-;40958:21;;;;;-1:-1:-1::0;;;40958:21:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;40958:29:0::1;;40950:67;;;;-1:-1:-1::0;;;40950:67:0::1;;;;;;;:::i;:::-;41028:135;41074:4;;41079:1;41074:7;;;;;-1:-1:-1::0;;;41074:7:0::1;;;;;;;;41028:135;41174:55;41209:4;;41174:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;41223:4:0::1;::::0;-1:-1:-1;41174:34:0::1;::::0;-1:-1:-1;;41174:55:0:i:1;:::-;41240:14;41264:4:::0;;41257:37:::1;::::0;-1:-1:-1;;;41257:37:0;;41288:4:::1;41257:37;::::0;::::1;11986:51:1::0;-1:-1:-1;;;;;41264:4:0;;::::1;::::0;41257:22:::1;::::0;11959:18:1;;41257:37:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41240:54;;41326:12;41313:9;:25;;41305:77;;;;-1:-1:-1::0;;;41305:77:0::1;;;;;;;:::i;:::-;41399:4;::::0;41393:31:::1;::::0;-1:-1:-1;;;41393:31:0;;::::1;::::0;::::1;22044:25:1::0;;;-1:-1:-1;;;;;41399:4:0;;::::1;::::0;41393:20:::1;::::0;22017:18:1;;41393:31:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;41435:45;41466:2;41470:9;41435:30;:45::i;34001:767::-:0;34215:21;34187:8;23912:15;23900:8;:27;;23892:60;;;;-1:-1:-1;;;23892:60:0;;;;;;;:::i;:::-;34279:7:::1;-1:-1:-1::0;;;;;34263:31:0::1;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34262:34;34254:77;;;;-1:-1:-1::0;;;34254:77:0::1;;;;;;;:::i;:::-;34361:4;::::0;;-1:-1:-1;;;;;34361:4:0::1;::::0;34350;;;;:7;::::1;;-1:-1:-1::0;;;34350:7:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;34350:15:0::1;;34342:53;;;;-1:-1:-1::0;;;34342:53:0::1;;;;;;;:::i;:::-;34416:52;34443:7;34452:9;34463:4;;34416:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;34416:26:0::1;::::0;-1:-1:-1;;;34416:52:0:i:1;:::-;34406:62;;34518:12;34487:7;34512:1;34495:7;:14;:18;;;;:::i;:::-;34487:27;;;;;;-1:-1:-1::0;;;34487:27:0::1;;;;;;;;;;;;;;;:43;;34479:95;;;;-1:-1:-1::0;;;34479:95:0::1;;;;;;;:::i;:::-;34591:4;::::0;;34612:10;;-1:-1:-1;;;;;34591:4:0;;::::1;::::0;34585:19:::1;::::0;34612:7;;34591:4;34612:10:::1;;-1:-1:-1::0;;;34612:10:0::1;;;;;;;;;;;;;;;34585:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;34649:4:0::1;::::0;;-1:-1:-1;;;;;34649:4:0::1;::::0;-1:-1:-1;34643:20:0::1;::::0;-1:-1:-1;34664:47:0::1;::::0;-1:-1:-1;34685:7:0::1;::::0;34694:4;;;;:7;::::1;;-1:-1:-1::0;;;34694:7:0::1;;;;;;;;34664:47;34713:7;34721:1;34713:10;;;;;;-1:-1:-1::0;;;34713:10:0::1;;;;;;;;;;;;;;;34643:81;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;13604:32:1;;;;13586:51;;13668:2;13653:18;;13646:34;13574:2;13559:18;;13541:145;34643:81:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34636:89;;-1:-1:-1::0;;;34636:89:0::1;;;;;;;;;34736:24;34742:7;34751:4;;34736:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;34757:2:0;;-1:-1:-1;34736:5:0::1;::::0;-1:-1:-1;;34736:24:0:i:1;:::-;34001:767:::0;;;;;;;;:::o;41992:257::-;42145:13;42183:58;42208:9;42219;42230:10;42183:24;:58::i;33313:682::-;33537:21;33518:8;23912:15;23900:8;:27;;23892:60;;;;-1:-1:-1;;;23892:60:0;;;;;;;:::i;:::-;33596:7:::1;-1:-1:-1::0;;;;;33580:31:0::1;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33579:34;33571:77;;;;-1:-1:-1::0;;;33571:77:0::1;;;;;;;:::i;:::-;33669:51;33695:7;33704:9;33715:4;;33669:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;33669:25:0::1;::::0;-1:-1:-1;;;33669:51:0:i:1;:::-;33659:61;;33753:11;33739:7;33747:1;33739:10;;;;;;-1:-1:-1::0;;;33739:10:0::1;;;;;;;;;;;;;;;:25;;33731:73;;;;-1:-1:-1::0;;;33731:73:0::1;;;;;;;:::i;41534:184::-:0;41631:12;41663:47;41682:7;41691:8;41701;41663:18;:47::i;30344:700::-;30610:14;30591:8;23912:15;23900:8;:27;;23892:60;;;;-1:-1:-1;;;23892:60:0;;;;;;;:::i;:::-;30703:4:::1;::::0;30653:196:::1;::::0;30683:5;;-1:-1:-1;;;;;30703:4:0::1;30722:9:::0;30746:14;30775:12;30810:4:::1;30830:8:::0;30653:15:::1;:196::i;:::-;30899:38;::::0;-1:-1:-1;;;30899:38:0;;30931:4:::1;30899:38;::::0;::::1;11986:51:1::0;30637:212:0;;-1:-1:-1;30860:78:0::1;::::0;-1:-1:-1;30888:5:0;;30895:2;;-1:-1:-1;;;;;30899:23:0;::::1;::::0;::::1;::::0;11959:18:1;;30899:38:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30860:27;:78::i;:::-;30955:4;::::0;30949:31:::1;::::0;-1:-1:-1;;;30949:31:0;;::::1;::::0;::::1;22044:25:1::0;;;-1:-1:-1;;;;;30955:4:0;;::::1;::::0;30949:20:::1;::::0;22017:18:1;;30949:31:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;30991:45;31022:2;31026:9;30991:30;:45::i;39637:926::-:0;39897:8;23912:15;23900:8;:27;;23892:60;;;;-1:-1:-1;;;23892:60:0;;;;;;;:::i;:::-;39948:7:::1;-1:-1:-1::0;;;;;39932:31:0::1;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39931:34;39923:77;;;;-1:-1:-1::0;;;39923:77:0::1;;;;;;;:::i;:::-;40030:4;::::0;;-1:-1:-1;;;;;40030:4:0::1;::::0;40019;;;;:7;::::1;;-1:-1:-1::0;;;40019:7:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;40019:15:0::1;;40011:53;;;;-1:-1:-1::0;;;40011:53:0::1;;;;;;;:::i;:::-;40075:13;40117:4:::0;;40111:38:::1;::::0;;-1:-1:-1;;;40111:38:0;;;;40091:9:::1;::::0;-1:-1:-1;;;;;40117:4:0;;::::1;::::0;40111:19:::1;::::0;40091:9;;40111:38:::1;::::0;;::::1;::::0;40075:13;40111:38;;;;;40091:9;40117:4;40111:38;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;40173:4:0::1;::::0;;-1:-1:-1;;;;;40173:4:0::1;::::0;-1:-1:-1;40167:20:0::1;::::0;-1:-1:-1;40188:47:0::1;::::0;-1:-1:-1;40209:7:0::1;::::0;40218:4;;;;:7;::::1;;-1:-1:-1::0;;;40218:7:0::1;;;;;;;;40188:47;40167:79;::::0;-1:-1:-1;;;;;;40167:79:0::1;::::0;;;;;;-1:-1:-1;;;;;13604:32:1;;;40167:79:0::1;::::0;::::1;13586:51:1::0;13653:18;;;13646:34;;;13559:18;;40167:79:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40160:87;;-1:-1:-1::0;;;40160:87:0::1;;;;;;;;;40258:18;40286:4:::0;;40291:15:::1;40305:1;40286:4:::0;40291:15:::1;:::i;:::-;40286:21;;;;;-1:-1:-1::0;;;40286:21:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40279:43;::::0;-1:-1:-1;;;40279:43:0;;-1:-1:-1;;;;;12004:32:1;;;40279:43:0::1;::::0;::::1;11986:51:1::0;40279:39:0;;;::::1;::::0;::::1;::::0;11959:18:1;;40279:43:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40258:64;;40333:44;40368:4;;40333:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;40374:2:0;;-1:-1:-1;40333:34:0::1;::::0;-1:-1:-1;;40333:44:0:i:1;:::-;40476:12:::0;40410:62:::1;40458:13:::0;40417:4;;40422:15:::1;40436:1;40417:4:::0;40422:15:::1;:::i;:::-;40417:21;;;;;-1:-1:-1::0;;;40417:21:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40410:43;::::0;-1:-1:-1;;;40410:43:0;;-1:-1:-1;;;;;12004:32:1;;;40410:43:0::1;::::0;::::1;11986:51:1::0;40410:39:0;;;::::1;::::0;::::1;::::0;11959:18:1;;40410:43:0::1;11941:102:1::0;27381:845:0;27635:12;27649;27616:8;23912:15;23900:8;:27;;23892:60;;;;-1:-1:-1;;;23892:60:0;;;;;;;:::i;:::-;27674:12:::1;27689:45;27710:7;27719:6;27727;27689:20;:45::i;:::-;27745:60;::::0;-1:-1:-1;;;27745:60:0;;27777:10:::1;27745:60;::::0;::::1;12597:34:1::0;-1:-1:-1;;;;;27745:31:0;::::1;12647:18:1::0;;;12640:43;;;12699:18;;;12692:34;;;27674:60:0;;-1:-1:-1;27745:31:0::1;::::0;12532:18:1;;27745:60:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;27873:27:0::1;::::0;-1:-1:-1;;;27873:27:0;;-1:-1:-1;;;;;12004:32:1;;;27873:27:0::1;::::0;::::1;11986:51:1::0;27843:12:0::1;::::0;;;27873:23;::::1;::::0;::::1;::::0;11959:18:1;;27873:27:0::1;::::0;::::1;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27842:58;;;;27912:14;27931:39;27955:6;27963;27931:23;:39::i;:::-;27911:59;;;28012:6;-1:-1:-1::0;;;;;28002:16:0::1;:6;-1:-1:-1::0;;;;;28002:16:0::1;;:58;;28043:7;28052;28002:58;;;28022:7;28031;28002:58;27981:79:::0;;-1:-1:-1;27981:79:0;-1:-1:-1;28079:21:0;;::::1;;28071:68;;;;-1:-1:-1::0;;;28071:68:0::1;;;;;;;:::i;:::-;28169:10;28158:7;:21;;28150:68;;;;-1:-1:-1::0;;;28150:68:0::1;;;;;;;:::i;:::-;23963:1;;;;27381:845:::0;;;;;;;;;;;:::o;42257:249::-;42401:21;42447:51;42474:7;42483:8;42493:4;42447:26;:51::i;29596:669::-;29885:16;29982:4;;29885:16;;;;29945:42;;29966:7;;29975:5;;-1:-1:-1;;;;;29982:4:0;29945:20;:42::i;:::-;29930:57;;29998:10;30011;:39;;30041:9;30011:39;;;-1:-1:-1;;30011:39:0;30061:78;;-1:-1:-1;;;30061:78:0;;29998:52;;-1:-1:-1;;;;;;30061:25:0;;;;;:78;;30087:10;;30107:4;;29998:52;;30121:8;;30131:1;;30134;;30137;;30061:78;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30177:80;30196:5;30203:9;30214:14;30230:12;30244:2;30248:8;30177:18;:80::i;:::-;30150:107;;;;-1:-1:-1;29596:669:0;-1:-1:-1;;;;;;;;;;;;;29596:669:0:o;25632:732::-;25920:12;25934;25948:14;25901:8;23912:15;23900:8;:27;;23892:60;;;;-1:-1:-1;;;23892:60:0;;;;;;;:::i;:::-;25996:85:::1;26010:6;26018;26026:14;26042;26058:10;26070;25996:13;:85::i;:::-;25975:106:::0;;-1:-1:-1;25975:106:0;-1:-1:-1;26092:12:0::1;26107:45;26128:7;26137:6:::0;26145;26107:20:::1;:45::i;:::-;26092:60;;26163:66;26195:6;26203:10;26215:4;26221:7;26163:31;:66::i;:::-;26240;26272:6;26280:10;26292:4;26298:7;26240:31;:66::i;:::-;26329:27;::::0;-1:-1:-1;;;26329:27:0;;-1:-1:-1;;;;;12004:32:1;;;26329:27:0::1;::::0;::::1;11986:51:1::0;26329:23:0;::::1;::::0;::::1;::::0;11959:18:1;;26329:27:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26317:39;;23963:1;25632:732:::0;;;;;;;;;;;;;:::o;26370:968::-;26623:16;26641:14;26657;26604:8;23912:15;23900:8;:27;;23892:60;;;;-1:-1:-1;;;23892:60:0;;;;;;;:::i;:::-;26759:4:::1;::::0;26711:176:::1;::::0;26739:5;;-1:-1:-1;;;;;26759:4:0::1;26778:18:::0;26811:9:::1;26835:14:::0;26864:12;26711:13:::1;:176::i;:::-;26898:12;26950:4:::0;;26684:203;;-1:-1:-1;26684:203:0;;-1:-1:-1;26898:12:0;26913:42:::1;::::0;26934:7:::1;::::0;26943:5;;-1:-1:-1;;;;;26950:4:0::1;26913:20;:42::i;:::-;26898:57;;26966:69;26998:5;27005:10;27017:4;27023:11;26966:31;:69::i;:::-;27052:4;::::0;::::1;;;;;;-1:-1:-1::0;;;;;27052:4:0::1;-1:-1:-1::0;;;;;27046:19:0::1;;27073:9;27046:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;27109:4:0::1;::::0;27103:37:::1;::::0;-1:-1:-1;;;27103:37:0;;-1:-1:-1;;;;;13604:32:1;;;27103:37:0::1;::::0;::::1;13586:51:1::0;13653:18;;;13646:34;;;27109:4:0;;::::1;::::0;-1:-1:-1;27103:20:0::1;::::0;-1:-1:-1;13559:18:1;;;-1:-1:-1;27103:37:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27096:45;;-1:-1:-1::0;;;27096:45:0::1;;;;;;;;;27164:27;::::0;-1:-1:-1;;;27164:27:0;;-1:-1:-1;;;;;12004:32:1;;;27164:27:0::1;::::0;::::1;11986:51:1::0;27164:23:0;::::1;::::0;::::1;::::0;11959:18:1;;27164:27:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27152:39;;27254:9;27242;:21;27238:92;;;27265:65;27296:10;27308:21;27320:9:::0;27308::::1;:21;:::i;:::-;27265:30;:65::i;:::-;23963:1;26370:968:::0;;;;;;;;;;;:::o;36608:882::-;36821:21;36793:8;23912:15;23900:8;:27;;23892:60;;;;-1:-1:-1;;;23892:60:0;;;;;;;:::i;:::-;36885:7:::1;-1:-1:-1::0;;;;;36869:31:0::1;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36868:34;36860:77;;;;-1:-1:-1::0;;;36860:77:0::1;;;;;;;:::i;:::-;36967:4;::::0;;-1:-1:-1;;;;;36967:4:0::1;::::0;36956;;;;:7;::::1;;-1:-1:-1::0;;;36956:7:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;36956:15:0::1;;36948:53;;;;-1:-1:-1::0;;;36948:53:0::1;;;;;;;:::i;:::-;37022:51;37048:7;37057:9;37068:4;;37022:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;37022:25:0::1;::::0;-1:-1:-1;;;37022:51:0:i:1;:::-;37012:61;;37106:9;37092:7;37100:1;37092:10;;;;;;-1:-1:-1::0;;;37092:10:0::1;;;;;;;;;;;;;;;:23;;37084:71;;;;-1:-1:-1::0;;;37084:71:0::1;;;;;;;:::i;:::-;37172:4;::::0;;37193:10;;-1:-1:-1;;;;;37172:4:0;;::::1;::::0;37166:19:::1;::::0;37193:7;;37172:4;37193:10:::1;;-1:-1:-1::0;;;37193:10:0::1;;;;;;;;;;;;;;;37166:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;37230:4:0::1;::::0;;-1:-1:-1;;;;;37230:4:0::1;::::0;-1:-1:-1;37224:20:0::1;::::0;-1:-1:-1;37245:47:0::1;::::0;-1:-1:-1;37266:7:0::1;::::0;37275:4;;;;:7;::::1;;-1:-1:-1::0;;;37275:7:0::1;;;;;;;;37245:47;37294:7;37302:1;37294:10;;;;;;-1:-1:-1::0;;;37294:10:0::1;;;;;;;;;;;;;;;37224:81;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;13604:32:1;;;;13586:51;;13668:2;13653:18;;13646:34;13574:2;13559:18;;13541:145;37224:81:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37217:89;;-1:-1:-1::0;;;37217:89:0::1;;;;;;;;;37317:24;37323:7;37332:4;;37317:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;37338:2:0;;-1:-1:-1;37317:5:0::1;::::0;-1:-1:-1;;37317:24:0:i:1;:::-;37404:7;37412:1;37404:10;;;;;;-1:-1:-1::0;;;37404:10:0::1;;;;;;;;;;;;;;;37392:9;:22;37388:94;;;37416:66;37447:10;37471:7;37479:1;37471:10;;;;;;-1:-1:-1::0;;;37471:10:0::1;;;;;;;;;;;;;;;37459:9;:22;;;;:::i;19988:361::-:0;20183:45;;;-1:-1:-1;;;;;13604:32:1;;;20183:45:0;;;13586:51:1;13653:18;;;;13646:34;;;20183:45:0;;;;;;;;;;13559:18:1;;;;20183:45:0;;;;;;;-1:-1:-1;;;;;20183:45:0;-1:-1:-1;;;20183:45:0;;;20172:57;;-1:-1:-1;;;;20172:10:0;;;;:57;;20183:45;20172:57;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20136:93;;;;20248:7;:57;;;;-1:-1:-1;20260:11:0;;:16;;:44;;;20291:4;20280:24;;;;;;;;;;;;:::i;:::-;20240:101;;;;-1:-1:-1;;;20240:101:0;;15159:2:1;20240:101:0;;;15141:21:1;15198:2;15178:18;;;15171:30;15237:33;15217:18;;;15210:61;15288:18;;20240:101:0;15131:181:1;20240:101:0;19988:361;;;;;:::o;20767:195::-;20875:12;;;20837;20875;;;;;;;;;-1:-1:-1;;;;;20854:7:0;;;20868:5;;20854:34;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20836:52;;;20907:7;20899:55;;;;-1:-1:-1;;;20899:55:0;;20123:2:1;20899:55:0;;;20105:21:1;20162:2;20142:18;;;20135:30;20201:34;20181:18;;;20174:62;-1:-1:-1;;;20252:18:1;;;20245:33;20295:19;;20899:55:0;20095:225:1;20899:55:0;20767:195;;;:::o;17179:509::-;17272:14;17318:1;17307:8;:12;17299:64;;;;-1:-1:-1;;;17299:64:0;;19366:2:1;17299:64:0;;;19348:21:1;19405:2;19385:18;;;19378:30;19444:34;19424:18;;;19417:62;-1:-1:-1;;;19495:18:1;;;19488:37;19542:19;;17299:64:0;19338:229:1;17299:64:0;17394:1;17382:9;:13;:31;;;;;17412:1;17399:10;:14;17382:31;17374:80;;;;-1:-1:-1;;;17374:80:0;;;;;;;:::i;:::-;17465:20;17488:17;:8;17501:3;17488:12;:17::i;:::-;17465:40;-1:-1:-1;17516:14:0;17533:31;17465:40;17553:10;17533:19;:31::i;:::-;17516:48;-1:-1:-1;17575:16:0;17594:40;17618:15;17594:19;:9;17608:4;17594:13;:19::i;:::-;:23;;:40::i;:::-;17575:59;-1:-1:-1;17657:23:0;17575:59;17657:9;:23;:::i;:::-;17645:35;17179:509;-1:-1:-1;;;;;;;17179:509:0:o;18355:507::-;18456:21;18513:1;18498:4;:11;:16;;18490:55;;;;-1:-1:-1;;;18490:55:0;;16630:2:1;18490:55:0;;;16612:21:1;16669:2;16649:18;;;16642:30;16708:28;16688:18;;;16681:56;16754:18;;18490:55:0;16602:176:1;18490:55:0;18577:4;:11;18566:23;;;;;;-1:-1:-1;;;18566:23:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18566:23:0;;18556:33;;18613:8;18600:7;18608:1;18600:10;;;;;;-1:-1:-1;;;18600:10:0;;;;;;;;;;;;;;:21;;;;;18637:6;18632:223;18663:1;18649:4;:11;:15;;;;:::i;:::-;18645:1;:19;18632:223;;;18687:14;18703:15;18722:42;18734:7;18743:4;18748:1;18743:7;;;;;;-1:-1:-1;;;18743:7:0;;;;;;;;;;;;;;;18752:4;18757:1;18761;18757:5;;;;:::i;:::-;18752:11;;;;;;-1:-1:-1;;;18752:11:0;;;;;;;;;;;;;;;18722;:42::i;:::-;18686:78;;;;18796:47;18809:7;18817:1;18809:10;;;;;;-1:-1:-1;;;18809:10:0;;;;;;;;;;;;;;;18821:9;18832:10;18796:12;:47::i;:::-;18779:7;18787:5;:1;18791;18787:5;:::i;:::-;18779:14;;;;;;-1:-1:-1;;;18779:14:0;;;;;;;;;;;;;;:64;;;;;18632:223;;18666:3;;;;;:::i;:::-;;;;18632:223;;;;18355:507;;;;;:::o;15656:487::-;15745:12;15771:14;15787;15805:26;15816:6;15824;15805:10;:26::i;:::-;15977:32;;-1:-1:-1;;10809:2:1;10805:15;;;10801:24;;15977:32:0;;;10789:37:1;10860:15;;;10856:24;10842:12;;;10835:46;15770:61:0;;-1:-1:-1;15770:61:0;-1:-1:-1;15941:7:0;;10897:12:1;;15977:32:0;;;;;;;;;;;;15967:43;;;;;;15880:251;;;;;;;;-1:-1:-1;;;;;;11558:26:1;;11621:2;11617:15;;;;-1:-1:-1;;11613:53:1;11609:1;11600:11;;11593:74;11692:2;11683:12;;11676:28;11734:66;11729:2;11720:12;;11713:88;11826:2;11817:12;;11548:287;15880:251:0;;;;-1:-1:-1;;15880:251:0;;;;;;;;;15870:262;;15880:251;15870:262;;;;;15656:487;-1:-1:-1;;;;;;15656:487:0:o;20357:402::-;20582:51;;;-1:-1:-1;;;;;12615:15:1;;;20582:51:0;;;12597:34:1;12667:15;;;12647:18;;;12640:43;12699:18;;;;12692:34;;;20582:51:0;;;;;;;;;;12532:18:1;;;;20582:51:0;;;;;;;-1:-1:-1;;;;;20582:51:0;-1:-1:-1;;;20582:51:0;;;20571:63;;-1:-1:-1;;;;20571:10:0;;;;:63;;20582:51;20571:63;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20535:99;;;;20653:7;:57;;;;-1:-1:-1;20665:11:0;;:16;;:44;;;20696:4;20685:24;;;;;;;;;;;;:::i;:::-;20645:106;;;;-1:-1:-1;;;20645:106:0;;20886:2:1;20645:106:0;;;20868:21:1;20925:2;20905:18;;;20898:30;20964:34;20944:18;;;20937:62;-1:-1:-1;;;21015:18:1;;;21008:34;21059:19;;20645:106:0;20858:226:1;20645:106:0;20357:402;;;;;;:::o;31878:721::-;31985:6;31980:612;32011:1;31997:4;:11;:15;;;;:::i;:::-;31993:1;:19;31980:612;;;32035:13;32050:14;32069:4;32074:1;32069:7;;;;;;-1:-1:-1;;;32069:7:0;;;;;;;;;;;;;;;32078:4;32083:1;32087;32083:5;;;;:::i;:::-;32078:11;;;;;;-1:-1:-1;;;32078:11:0;;;;;;;;;;;;;;;32034:56;;;;32106:14;32125:38;32149:5;32156:6;32125:23;:38::i;:::-;-1:-1:-1;32105:58:0;-1:-1:-1;32178:14:0;32195:7;32203:5;:1;32207;32203:5;:::i;:::-;32195:14;;;;;;-1:-1:-1;;;32195:14:0;;;;;;;;;;;;;;;32178:31;;32225:15;32242;32270:6;-1:-1:-1;;;;;32261:15:0;:5;-1:-1:-1;;;;;32261:15:0;;:61;;32303:9;32319:1;32261:61;;;32285:1;32289:9;32261:61;32224:98;;;;32337:10;32368:1;32354:4;:11;:15;;;;:::i;:::-;32350:1;:19;:78;;32425:3;32350:78;;;32372:50;32393:7;32402:6;32410:4;32415:5;:1;32419;32415:5;:::i;:::-;32410:11;;;;;;-1:-1:-1;;;32410:11:0;;;;;;;;;;;;;;;32372:20;:50::i;:::-;32337:91;;32456:44;32477:7;32486:5;32493:6;32456:20;:44::i;:::-;-1:-1:-1;;;;;32443:63:0;;32525:10;32537;32549:2;32563:1;32553:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32553:12:0;;32443:137;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31980:612;;;;;;;32014:3;;;;;:::i;:::-;;;;31980:612;;;;31878:721;;;:::o;18943:528::-;19044:21;19101:1;19086:4;:11;:16;;19078:55;;;;-1:-1:-1;;;19078:55:0;;16630:2:1;19078:55:0;;;16612:21:1;16669:2;16649:18;;;16642:30;16708:28;16688:18;;;16681:56;16754:18;;19078:55:0;16602:176:1;19078:55:0;19165:4;:11;19154:23;;;;;;-1:-1:-1;;;19154:23:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;19154:23:0;;19144:33;;19218:9;19188:7;19213:1;19196:7;:14;:18;;;;:::i;:::-;19188:27;;;;;;-1:-1:-1;;;19188:27:0;;;;;;;;;;;;;;:39;;;;;19243:6;19266:1;19252:4;:11;:15;;;;:::i;:::-;19243:24;;19238:226;19269:5;;19238:226;;19297:14;;19332:42;19344:7;19353:4;19358:5;19362:1;19358;:5;:::i;:::-;19353:11;;;;;;-1:-1:-1;;;19353:11:0;;;;;;;;;;;;;;;19366:4;19371:1;19366:7;;;;;;-1:-1:-1;;;19366:7:0;;;;;;;;19332:42;19296:78;;;;19406:46;19418:7;19426:1;19418:10;;;;;;-1:-1:-1;;;19418:10:0;;;;;;;;;;;;;;;19430:9;19441:10;19406:11;:46::i;:::-;19389:7;19397:5;19401:1;19397;:5;:::i;:::-;19389:14;;;;;;-1:-1:-1;;;19389:14:0;;;;;;;;;;;;;;:63;;;;;19238:226;;19276:3;;;;;:::i;:::-;;;;19238:226;;37637:1194;37750:6;37745:1079;37776:1;37762:4;:11;:15;;;;:::i;:::-;37758:1;:19;37745:1079;;;37800:13;37815:14;37834:4;37839:1;37834:7;;;;;;-1:-1:-1;;;37834:7:0;;;;;;;;;;;;;;;37843:4;37848:1;37852;37848:5;;;;:::i;:::-;37843:11;;;;;;-1:-1:-1;;;37843:11:0;;;;;;;;;;;;;;;37799:56;;;;37871:14;37890:38;37914:5;37921:6;37890:23;:38::i;:::-;37870:58;;;37943:17;37976:44;37997:7;38006:5;38013:6;37976:20;:44::i;:::-;37943:78;;38036:16;38067:17;38155:13;38170;38188:4;-1:-1:-1;;;;;38188:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38154:52;-1:-1:-1;;;;;38154:52:0;;;-1:-1:-1;;;;;38154:52:0;;;38222:17;38241:18;38272:6;-1:-1:-1;;;;;38263:15:0;:5;-1:-1:-1;;;;;38263:15:0;;:61;;38305:8;38315;38263:61;;;38282:8;38292;38263:61;38353:38;;-1:-1:-1;;;38353:38:0;;-1:-1:-1;;;;;12004:32:1;;;38353:38:0;;;11986:51:1;38221:103:0;;-1:-1:-1;38221:103:0;;-1:-1:-1;38353:56:0;;38221:103;;38353:23;;;;;;11959:18:1;;38353:38:0;11941:102:1;38353:56:0;38339:70;;38439:67;38465:11;38478:12;38492:13;38439:25;:67::i;:::-;38424:82;;37745:1079;;;;38537:15;38554;38582:6;-1:-1:-1;;;;;38573:15:0;:5;-1:-1:-1;;;;;38573:15:0;;:67;;38618:12;38637:1;38573:67;;;38597:1;38601:12;38573:67;38536:104;;;;38655:10;38686:1;38672:4;:11;:15;;;;:::i;:::-;38668:1;:19;:78;;38743:3;38668:78;;;38690:50;38711:7;38720:6;38728:4;38733:5;:1;38737;38733:5;:::i;38690:50::-;38799:12;;;38809:1;38799:12;;;;;;;;;-1:-1:-1;;;38761:51:0;;;38655:91;;-1:-1:-1;;;;;;38761:9:0;;;;;:51;;38771:10;;38783;;38655:91;;38761:51;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37745:1079;;;;;;;;;37779:3;;;;;:::i;:::-;;;;37745:1079;;1392:136;1450:7;1477:43;1481:1;1484;1477:43;;;;;;;;;;;;;;;;;:3;:43::i;17809:464::-;17902:13;17948:1;17936:9;:13;17928:66;;;;-1:-1:-1;;;17928:66:0;;17744:2:1;17928:66:0;;;17726:21:1;17783:2;17763:18;;;17756:30;17822:34;17802:18;;;17795:62;-1:-1:-1;;;17873:18:1;;;17866:38;17921:19;;17928:66:0;17716:230:1;17928:66:0;18025:1;18013:9;:13;:31;;;;;18043:1;18030:10;:14;18013:31;18005:80;;;;-1:-1:-1;;;18005:80:0;;;;;;;:::i;:::-;18096:14;18113:34;18142:4;18113:24;:9;18127;18113:13;:24::i;:::-;:28;;:34::i;:::-;18096:51;-1:-1:-1;18158:16:0;18177:34;18207:3;18177:25;:10;18192:9;18177:14;:25::i;:34::-;18158:53;-1:-1:-1;18233:32:0;18263:1;18234:23;18158:53;18234:9;:23;:::i;18233:32::-;18222:43;17809:464;-1:-1:-1;;;;;;17809:464:0:o;16744:313::-;16826:12;16869:1;16859:7;:11;16851:57;;;;-1:-1:-1;;;16851:57:0;;14757:2:1;16851:57:0;;;14739:21:1;14796:2;14776:18;;;14769:30;14835:34;14815:18;;;14808:62;-1:-1:-1;;;14886:18:1;;;14879:31;14927:19;;16851:57:0;14729:223:1;16851:57:0;16938:1;16927:8;:12;:28;;;;;16954:1;16943:8;:12;16927:28;16919:77;;;;-1:-1:-1;;;16919:77:0;;;;;;;:::i;:::-;17041:8;17017:21;:7;17029:8;17017:11;:21::i;:::-;:32;;;;:::i;15223:341::-;15298:14;15314;15359:6;-1:-1:-1;;;;;15349:16:0;:6;-1:-1:-1;;;;;15349:16:0;;;15341:62;;;;-1:-1:-1;;;15341:62:0;;15519:2:1;15341:62:0;;;15501:21:1;15558:2;15538:18;;;15531:30;15597:34;15577:18;;;15570:62;-1:-1:-1;;;15648:18:1;;;15641:31;15689:19;;15341:62:0;15491:223:1;15341:62:0;15442:6;-1:-1:-1;;;;;15433:15:0;:6;-1:-1:-1;;;;;15433:15:0;;:53;;15471:6;15479;15433:53;;;15452:6;15460;15433:53;15414:72;;-1:-1:-1;15414:72:0;-1:-1:-1;;;;;;15505:20:0;;15497:59;;;;-1:-1:-1;;;15497:59:0;;15921:2:1;15497:59:0;;;15903:21:1;15960:2;15940:18;;;15933:30;15999:28;15979:18;;;15972:56;16045:18;;15497:59:0;15893:176:1;15497:59:0;15223:341;;;;;:::o;24260:1366::-;24573:48;;-1:-1:-1;;;24573:48:0;;-1:-1:-1;;;;;12278:15:1;;;24573:48:0;;;12260:34:1;12330:15;;;12310:18;;;12303:43;-1:-1:-1;;;;;;24589:7:0;24573:32;;;;;;12195:18:1;;24573:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;24573:62:0;;24569:146;;;24652:51;;-1:-1:-1;;;24652:51:0;;-1:-1:-1;;;;;12278:15:1;;;24652:51:0;;;12260:34:1;12330:15;;;12310:18;;;12303:43;24668:7:0;24652:35;;;;12195:18:1;;24652:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;24569:146;24726:13;24741;24758:49;24783:7;24792:6;24800;24758:24;:49::i;:::-;24725:82;;;;24822:8;24834:1;24822:13;:30;;;;-1:-1:-1;24839:13:0;;24822:30;24818:801;;;24891:14;;-1:-1:-1;24907:14:0;;-1:-1:-1;24818:801:0;;;24955:19;24977:54;24996:14;25012:8;25022;24977:18;:54::i;:::-;24955:76;;25068:14;25050;:32;25046:562;;25129:10;25111:14;:28;;25103:75;;;;-1:-1:-1;;;25103:75:0;;;;;;;:::i;:::-;25219:14;;-1:-1:-1;25235:14:0;-1:-1:-1;25235:14:0;25046:562;;;25291:19;25313:54;25332:14;25348:8;25358;25313:18;:54::i;:::-;25291:76;;25411:14;25393;:32;;25386:40;;-1:-1:-1;;;25386:40:0;;;;;;;;;25471:10;25453:14;:28;;25445:75;;;;-1:-1:-1;;;25445:75:0;;;;;;;:::i;:::-;25561:14;-1:-1:-1;25577:14:0;;-1:-1:-1;25046:562:0;24818:801;;24260:1366;;;;;;;;;;;:::o;2282:471::-;2340:7;2585:6;2581:47;;-1:-1:-1;2615:1:0;2608:8;;2581:47;2640:9;2652:5;2656:1;2652;:5;:::i;:::-;2640:17;-1:-1:-1;2685:1:0;2676:5;2680:1;2640:17;2676:5;:::i;:::-;:10;2668:56;;;;-1:-1:-1;;;2668:56:0;;18561:2:1;2668:56:0;;;18543:21:1;18600:2;18580:18;;;18573:30;18639:34;18619:18;;;18612:62;-1:-1:-1;;;18690:18:1;;;18683:31;18731:19;;2668:56:0;18533:223:1;928:181:0;986:7;;1018:5;1022:1;1018;:5;:::i;:::-;1006:17;;1047:1;1042;:6;;1034:46;;;;-1:-1:-1;;;1034:46:0;;16985:2:1;1034:46:0;;;16967:21:1;17024:2;17004:18;;;16997:30;17063:29;17043:18;;;17036:57;17110:18;;1034:46:0;16957:177:1;16201:430:0;16294:13;16309;16336:14;16355:26;16366:6;16374;16355:10;:26::i;:::-;16335:46;;;16392:32;16400:7;16409:6;16417;16392:7;:32::i;:::-;;16436:13;16451;16480:32;16488:7;16497:6;16505;16480:7;:32::i;:::-;-1:-1:-1;;;;;16469:56:0;;:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16435:92;-1:-1:-1;;;;;16435:92:0;;;-1:-1:-1;;;;;16435:92:0;;;16571:6;-1:-1:-1;;;;;16561:16:0;:6;-1:-1:-1;;;;;16561:16:0;;:62;;16604:8;16614;16561:62;;;16581:8;16591;16561:62;16538:85;;;;-1:-1:-1;16201:430:0;-1:-1:-1;;;;;;;16201:430:0:o;1831:192::-;1917:7;1953:12;1945:6;;;;1937:29;;;;-1:-1:-1;;;1937:29:0;;;;;;;;:::i;:::-;-1:-1:-1;1977:9:0;1989:5;1993:1;1989;:5;:::i;:::-;1977:17;1831:192;-1:-1:-1;;;;;1831:192:0:o;14:134:1:-;82:20;;111:31;82:20;111:31;:::i;:::-;63:85;;;:::o;153:391::-;216:8;226:6;280:3;273:4;265:6;261:17;257:27;247:2;;303:6;295;288:22;247:2;-1:-1:-1;331:20:1;;374:18;363:30;;360:2;;;413:8;403;396:26;360:2;457:4;449:6;445:17;433:29;;517:3;510:4;500:6;497:1;493:14;485:6;481:27;477:38;474:47;471:2;;;534:1;531;524:12;549:188;628:13;;-1:-1:-1;;;;;670:42:1;;660:53;;650:2;;727:1;724;717:12;742:156;808:20;;868:4;857:16;;847:27;;837:2;;888:1;885;878:12;903:257;962:6;1015:2;1003:9;994:7;990:23;986:32;983:2;;;1036:6;1028;1021:22;983:2;1080:9;1067:23;1099:31;1124:5;1099:31;:::i;1165:261::-;1235:6;1288:2;1276:9;1267:7;1263:23;1259:32;1256:2;;;1309:6;1301;1294:22;1256:2;1346:9;1340:16;1365:31;1390:5;1365:31;:::i;1431:815::-;1544:6;1552;1560;1568;1576;1584;1592;1645:3;1633:9;1624:7;1620:23;1616:33;1613:2;;;1667:6;1659;1652:22;1613:2;1711:9;1698:23;1730:31;1755:5;1730:31;:::i;:::-;1780:5;-1:-1:-1;1837:2:1;1822:18;;1809:32;1850:33;1809:32;1850:33;:::i;:::-;1902:7;-1:-1:-1;1956:2:1;1941:18;;1928:32;;-1:-1:-1;2007:2:1;1992:18;;1979:32;;-1:-1:-1;2058:3:1;2043:19;;2030:33;;-1:-1:-1;2115:3:1;2100:19;;2087:33;2129;2087;2129;:::i;:::-;2181:7;2171:17;;;2235:3;2224:9;2220:19;2207:33;2197:43;;1603:643;;;;;;;;;;:::o;2251:1162::-;2395:6;2403;2411;2419;2427;2435;2443;2451;2459;2467;2475:7;2529:3;2517:9;2508:7;2504:23;2500:33;2497:2;;;2551:6;2543;2536:22;2497:2;2595:9;2582:23;2614:31;2639:5;2614:31;:::i;:::-;2664:5;-1:-1:-1;2721:2:1;2706:18;;2693:32;2734:33;2693:32;2734:33;:::i;:::-;2786:7;-1:-1:-1;2840:2:1;2825:18;;2812:32;;-1:-1:-1;2891:2:1;2876:18;;2863:32;;-1:-1:-1;2942:3:1;2927:19;;2914:33;;-1:-1:-1;2999:3:1;2984:19;;2971:33;3013;2971;3013;:::i;:::-;3065:7;-1:-1:-1;3119:3:1;3104:19;;3091:33;;-1:-1:-1;3176:3:1;3161:19;;3148:33;3190:30;3148:33;3190:30;:::i;:::-;3239:7;-1:-1:-1;3265:37:1;3297:3;3282:19;;3265:37;:::i;:::-;3255:47;;3349:3;3338:9;3334:19;3321:33;3311:43;;3402:3;3391:9;3387:19;3374:33;3363:44;;2487:926;;;;;;;;;;;;;;:::o;3418:884::-;3540:6;3548;3556;3564;3572;3580;3588;3596;3649:3;3637:9;3628:7;3624:23;3620:33;3617:2;;;3671:6;3663;3656:22;3617:2;3715:9;3702:23;3734:31;3759:5;3734:31;:::i;:::-;3784:5;-1:-1:-1;3841:2:1;3826:18;;3813:32;3854:33;3813:32;3854:33;:::i;:::-;3906:7;-1:-1:-1;3960:2:1;3945:18;;3932:32;;-1:-1:-1;4011:2:1;3996:18;;3983:32;;-1:-1:-1;4062:3:1;4047:19;;4034:33;;-1:-1:-1;4114:3:1;4099:19;;4086:33;;-1:-1:-1;4171:3:1;4156:19;;4143:33;4185;4143;4185;:::i;:::-;4237:7;4227:17;;;4291:3;4280:9;4276:19;4263:33;4253:43;;3607:695;;;;;;;;;;;:::o;4307:673::-;4411:6;4419;4427;4435;4443;4451;4504:3;4492:9;4483:7;4479:23;4475:33;4472:2;;;4526:6;4518;4511:22;4472:2;4570:9;4557:23;4589:31;4614:5;4589:31;:::i;:::-;4639:5;-1:-1:-1;4691:2:1;4676:18;;4663:32;;-1:-1:-1;4742:2:1;4727:18;;4714:32;;-1:-1:-1;4793:2:1;4778:18;;4765:32;;-1:-1:-1;4849:3:1;4834:19;;4821:33;4863;4821;4863;:::i;:::-;4915:7;4905:17;;;4969:3;4958:9;4954:19;4941:33;4931:43;;4462:518;;;;;;;;:::o;4985:1018::-;5120:6;5128;5136;5144;5152;5160;5168;5176;5184;5192;5245:3;5233:9;5224:7;5220:23;5216:33;5213:2;;;5267:6;5259;5252:22;5213:2;5311:9;5298:23;5330:31;5355:5;5330:31;:::i;:::-;5380:5;-1:-1:-1;5432:2:1;5417:18;;5404:32;;-1:-1:-1;5483:2:1;5468:18;;5455:32;;-1:-1:-1;5534:2:1;5519:18;;5506:32;;-1:-1:-1;5590:3:1;5575:19;;5562:33;5604;5562;5604;:::i;:::-;5656:7;-1:-1:-1;5710:3:1;5695:19;;5682:33;;-1:-1:-1;5767:3:1;5752:19;;5739:33;5781:30;5739:33;5781:30;:::i;:::-;5830:7;-1:-1:-1;5856:37:1;5888:3;5873:19;;5856:37;:::i;:::-;5846:47;;5940:3;5929:9;5925:19;5912:33;5902:43;;5992:3;5981:9;5977:19;5964:33;5954:43;;5203:800;;;;;;;;;;;;;:::o;6008:255::-;6075:6;6128:2;6116:9;6107:7;6103:23;6099:32;6096:2;;;6149:6;6141;6134:22;6096:2;6186:9;6180:16;6205:28;6227:5;6205:28;:::i;6268:470::-;6355:6;6363;6371;6424:2;6412:9;6403:7;6399:23;6395:32;6392:2;;;6445:6;6437;6430:22;6392:2;6473:40;6503:9;6473:40;:::i;:::-;6463:50;;6532:49;6577:2;6566:9;6562:18;6532:49;:::i;:::-;6522:59;;6624:2;6613:9;6609:18;6603:25;6668:10;6661:5;6657:22;6650:5;6647:33;6637:2;;6699:6;6691;6684:22;6637:2;6727:5;6717:15;;;6382:356;;;;;:::o;6743:194::-;6813:6;6866:2;6854:9;6845:7;6841:23;6837:32;6834:2;;;6887:6;6879;6872:22;6834:2;-1:-1:-1;6915:16:1;;6824:113;-1:-1:-1;6824:113:1:o;6942:729::-;7055:6;7063;7071;7079;7087;7140:3;7128:9;7119:7;7115:23;7111:33;7108:2;;;7162:6;7154;7147:22;7108:2;7203:9;7190:23;7180:33;;7264:2;7253:9;7249:18;7236:32;7291:18;7283:6;7280:30;7277:2;;;7328:6;7320;7313:22;7277:2;7372:70;7434:7;7425:6;7414:9;7410:22;7372:70;:::i;:::-;7461:8;;-1:-1:-1;7346:96:1;-1:-1:-1;;7546:2:1;7531:18;;7518:32;7559:31;7518:32;7559:31;:::i;:::-;7098:573;;;;-1:-1:-1;7098:573:1;;7661:2;7646:18;7633:32;;7098:573;-1:-1:-1;;7098:573:1:o;7676:1245::-;7769:6;7777;7830:2;7818:9;7809:7;7805:23;7801:32;7798:2;;;7851:6;7843;7836:22;7798:2;7892:9;7879:23;7869:33;;7921:2;7974;7963:9;7959:18;7946:32;7997:18;8038:2;8030:6;8027:14;8024:2;;;8059:6;8051;8044:22;8024:2;8102:6;8091:9;8087:22;8077:32;;8147:7;8140:4;8136:2;8132:13;8128:27;8118:2;;8174:6;8166;8159:22;8118:2;8215;8202:16;8237:2;8233;8230:10;8227:2;;;8243:18;;:::i;:::-;8289:2;8286:1;8282:10;8321:2;8315:9;8384:2;8380:7;8375:2;8371;8367:11;8363:25;8355:6;8351:38;8439:6;8427:10;8424:22;8419:2;8407:10;8404:18;8401:46;8398:2;;;8450:18;;:::i;:::-;8486:2;8479:22;8536:18;;;8570:15;;;;-1:-1:-1;8605:11:1;;;8635;;;8631:20;;8628:33;-1:-1:-1;8625:2:1;;;8679:6;8671;8664:22;8625:2;8706:6;8697:15;;8721:169;8735:2;8732:1;8729:9;8721:169;;;8792:23;8811:3;8792:23;:::i;:::-;8780:36;;8753:1;8746:9;;;;;8836:12;;;;8868;;8721:169;;;8725:3;8909:6;8899:16;;;;;;;;7788:1133;;;;;:::o;8926:255::-;9005:6;9013;9066:2;9054:9;9045:7;9041:23;9037:32;9034:2;;;9087:6;9079;9072:22;9034:2;-1:-1:-1;;9115:16:1;;9171:2;9156:18;;;9150:25;9115:16;;9150:25;;-1:-1:-1;9024:157:1:o;9186:798::-;9308:6;9316;9324;9332;9340;9348;9401:3;9389:9;9380:7;9376:23;9372:33;9369:2;;;9423:6;9415;9408:22;9369:2;9464:9;9451:23;9441:33;;9521:2;9510:9;9506:18;9493:32;9483:42;;9576:2;9565:9;9561:18;9548:32;9603:18;9595:6;9592:30;9589:2;;;9640:6;9632;9625:22;9589:2;9684:70;9746:7;9737:6;9726:9;9722:22;9684:70;:::i;:::-;9773:8;;-1:-1:-1;9658:96:1;-1:-1:-1;;9858:2:1;9843:18;;9830:32;9871:31;9830:32;9871:31;:::i;:::-;9921:5;9911:15;;;9973:3;9962:9;9958:19;9945:33;9935:43;;9359:625;;;;;;;;:::o;9989:326::-;10066:6;10074;10082;10135:2;10123:9;10114:7;10110:23;10106:32;10103:2;;;10156:6;10148;10141:22;10103:2;-1:-1:-1;;10184:23:1;;;10254:2;10239:18;;10226:32;;-1:-1:-1;10305:2:1;10290:18;;;10277:32;;10093:222;-1:-1:-1;10093:222:1:o;10320:257::-;10361:3;10399:5;10393:12;10426:6;10421:3;10414:19;10442:63;10498:6;10491:4;10486:3;10482:14;10475:4;10468:5;10464:16;10442:63;:::i;:::-;10559:2;10538:15;-1:-1:-1;;10534:29:1;10525:39;;;;10566:4;10521:50;;10369:208;-1:-1:-1;;10369:208:1:o;10920:274::-;11049:3;11087:6;11081:13;11103:53;11149:6;11144:3;11137:4;11129:6;11125:17;11103:53;:::i;:::-;11172:16;;;;;11057:137;-1:-1:-1;;11057:137:1:o;12737:670::-;-1:-1:-1;;;;;13104:15:1;;;13086:34;;13156:15;;;;13151:2;13136:18;;13129:43;13203:2;13188:18;;13181:34;;;;13246:2;13231:18;;13224:34;;;;13307:4;13295:17;13289:3;13274:19;;13267:46;13066:3;13329:19;;13322:35;13388:3;13373:19;;13366:35;;;;13035:3;13020:19;;13002:405::o;13691:635::-;13862:2;13914:21;;;13984:13;;13887:18;;;14006:22;;;13833:4;;13862:2;14085:15;;;;14059:2;14044:18;;;13833:4;14131:169;14145:6;14142:1;14139:13;14131:169;;;14206:13;;14194:26;;14275:15;;;;14240:12;;;;14167:1;14160:9;14131:169;;;-1:-1:-1;14317:3:1;;13842:484;-1:-1:-1;;;;;;13842:484:1:o;14331:219::-;14480:2;14469:9;14462:21;14443:4;14500:44;14540:2;14529:9;14525:18;14517:6;14500:44;:::i;16074:349::-;16276:2;16258:21;;;16315:2;16295:18;;;16288:30;16354:27;16349:2;16334:18;;16327:55;16414:2;16399:18;;16248:175::o;17139:398::-;17341:2;17323:21;;;17380:2;17360:18;;;17353:30;17419:34;17414:2;17399:18;;17392:62;-1:-1:-1;;;17485:2:1;17470:18;;17463:32;17527:3;17512:19;;17313:224::o;17951:403::-;18153:2;18135:21;;;18192:2;18172:18;;;18165:30;18231:34;18226:2;18211:18;;18204:62;-1:-1:-1;;;18297:2:1;18282:18;;18275:37;18344:3;18329:19;;18125:229::o;18761:398::-;18963:2;18945:21;;;19002:2;18982:18;;;18975:30;19041:34;19036:2;19021:18;;19014:62;-1:-1:-1;;;19107:2:1;19092:18;;19085:32;19149:3;19134:19;;18935:224::o;19572:344::-;19774:2;19756:21;;;19813:2;19793:18;;;19786:30;-1:-1:-1;;;19847:2:1;19832:18;;19825:50;19907:2;19892:18;;19746:170::o;20325:354::-;20527:2;20509:21;;;20566:2;20546:18;;;20539:30;20605:32;20600:2;20585:18;;20578:60;20670:2;20655:18;;20499:180::o;21089:399::-;21291:2;21273:21;;;21330:2;21310:18;;;21303:30;21369:34;21364:2;21349:18;;21342:62;-1:-1:-1;;;21435:2:1;21420:18;;21413:33;21478:3;21463:19;;21263:225::o;21493:400::-;21695:2;21677:21;;;21734:2;21714:18;;;21707:30;21773:34;21768:2;21753:18;;21746:62;-1:-1:-1;;;21839:2:1;21824:18;;21817:34;21883:3;21868:19;;21667:226::o;22333:458::-;22564:6;22553:9;22546:25;22607:6;22602:2;22591:9;22587:18;22580:34;22679:1;22675;22670:3;22666:11;22662:19;22654:6;22650:32;22645:2;22634:9;22630:18;22623:60;22719:3;22714:2;22703:9;22699:18;22692:31;22527:4;22740:45;22780:3;22769:9;22765:19;22757:6;22740:45;:::i;23120:128::-;23160:3;23191:1;23187:6;23184:1;23181:13;23178:2;;;23197:18;;:::i;:::-;-1:-1:-1;23233:9:1;;23168:80::o;23253:217::-;23293:1;23319;23309:2;;-1:-1:-1;;;23344:31:1;;23398:4;23395:1;23388:15;23426:4;23351:1;23416:15;23309:2;-1:-1:-1;23455:9:1;;23299:171::o;23475:168::-;23515:7;23581:1;23577;23573:6;23569:14;23566:1;23563:21;23558:1;23551:9;23544:17;23540:45;23537:2;;;23588:18;;:::i;:::-;-1:-1:-1;23628:9:1;;23527:116::o;23648:125::-;23688:4;23716:1;23713;23710:8;23707:2;;;23721:18;;:::i;:::-;-1:-1:-1;23758:9:1;;23697:76::o;23778:258::-;23850:1;23860:113;23874:6;23871:1;23868:13;23860:113;;;23950:11;;;23944:18;23931:11;;;23924:39;23896:2;23889:10;23860:113;;;23991:6;23988:1;23985:13;23982:2;;;-1:-1:-1;;24026:1:1;24008:16;;24001:27;23831:205::o;24041:136::-;24080:3;24108:5;24098:2;;24117:18;;:::i;:::-;-1:-1:-1;;;24153:18:1;;24088:89::o;24182:135::-;24221:3;-1:-1:-1;;24242:17:1;;24239:2;;;24262:18;;:::i;:::-;-1:-1:-1;24309:1:1;24298:13;;24229:88::o;24322:127::-;24383:10;24378:3;24374:20;24371:1;24364:31;24414:4;24411:1;24404:15;24438:4;24435:1;24428:15;24454:127;24515:10;24510:3;24506:20;24503:1;24496:31;24546:4;24543:1;24536:15;24570:4;24567:1;24560:15;24586:131;-1:-1:-1;;;;;24661:31:1;;24651:42;;24641:2;;24707:1;24704;24697:12;24641:2;24631:86;:::o;24722:118::-;24808:5;24801:13;24794:21;24787:5;24784:32;24774:2;;24830:1;24827;24820:12

Swarm Source

ipfs://931899c77bbb15a8c123b96a81dcc50a78cb748071e8294cfa5cd6d8f3109481
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Validator ID :
0 FTM

Amount Staked
0

Amount Delegated
0

Staking Total
0

Staking Start Epoch
0

Staking Start Time
0

Proof of Importance
0

Origination Score
0

Validation Score
0

Active
0

Online
0

Downtime
0 s
Address Amount claimed Rewards Created On Epoch Created On
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.