false
true
0

Contract Address Details

0x9cc9131268c36Fb45882620313a2574407eB4B98

Contract Name
pDexPStableSwapFactory
Creator
0xe51f92–80b1d4 at 0x9ec0e8–3a4658
Balance
0 PLS ( )
Tokens
Fetching tokens...
Transactions
1 Transactions
Transfers
0 Transfers
Gas Used
0
Last Balance Update
25983050
Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
Contract name:
pDexPStableSwapFactory




Optimization enabled
true
Compiler version
v0.8.10+commit.fc410830




Optimization runs
1000000
EVM Version
istanbul




Verified at
2025-04-23T16:10:32.621473Z

Constructor Arguments

0x000000000000000000000000f5ca9362d2c54decf0f928dd823a4aad19d86d5b000000000000000000000000cd31d98782dd1fc438563a7814de4785744623f6000000000000000000000000978dc1aa9a280abb3c1584d23321dba48723dea1

Arg [0] (address) : 0xf5ca9362d2c54decf0f928dd823a4aad19d86d5b
Arg [1] (address) : 0xcd31d98782dd1fc438563a7814de4785744623f6
Arg [2] (address) : 0x978dc1aa9a280abb3c1584d23321dba48723dea1

              

contracts/PStable/pDexPStableSwapFactory.sol

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.10;

import "@openzeppelin/contracts/access/Ownable.sol";
import "../interfaces/IpDexStableSwap.sol";
import "../interfaces/PStable/IpUSD.sol";
import "../interfaces/IpDexStableSwapDeployer.sol";
import "../interfaces/IpDexStableSwapLPFactory.sol";

contract pDexPStableSwapFactory is Ownable {
    struct StableSwapPairInfo {
        address swapContract;
        address token0;
        address token1;
        address LPContract;
    }
    struct StableSwapThreePoolPairInfo {
        address swapContract;
        address token0;
        address token1;
        address token2;
        address LPContract;
    }

    mapping(address => mapping(address => mapping(address => StableSwapThreePoolPairInfo))) public stableSwapPairInfo;
    // Query three pool pair infomation by two tokens.
    mapping(address => mapping(address => StableSwapThreePoolPairInfo)) threePoolInfo;
    mapping(uint256 => address) public swapPairContract;

    IpDexStableSwapLPFactory public immutable LPFactory;
    IpDexStableSwapDeployer public immutable SwapTwoPoolDeployer;
    IpDexStableSwapDeployer public immutable SwapThreePoolDeployer;

    address constant ZEROADDRESS = address(0);

    uint256 public pairLength;

    event NewStableSwapPair(address indexed swapContract, address tokenA, address tokenB, address tokenC, address LP);

    /**
     * @notice constructor
     * _LPFactory: LP factory
     * _SwapTwoPoolDeployer: Swap two pool deployer
     * _SwapThreePoolDeployer: Swap three pool deployer
     */
    constructor(
        IpDexStableSwapLPFactory _LPFactory,
        IpDexStableSwapDeployer _SwapTwoPoolDeployer,
        IpDexStableSwapDeployer _SwapThreePoolDeployer
    ) {
        LPFactory = _LPFactory;
        SwapTwoPoolDeployer = _SwapTwoPoolDeployer;
        SwapThreePoolDeployer = _SwapThreePoolDeployer;
    }

    // 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, "IDENTICAL_ADDRESSES");
        (token0, token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA);
    }

    function sortTokens(
        address tokenA,
        address tokenB,
        address tokenC
    )
        internal
        pure
        returns (
            address,
            address,
            address
        )
    {
        require(tokenA != tokenB && tokenA != tokenC && tokenB != tokenC, "IDENTICAL_ADDRESSES");
        address tmp;
        if (tokenA > tokenB) {
            tmp = tokenA;
            tokenA = tokenB;
            tokenB = tmp;
        }
        if (tokenB > tokenC) {
            tmp = tokenB;
            tokenB = tokenC;
            tokenC = tmp;
            if (tokenA > tokenB) {
                tmp = tokenA;
                tokenA = tokenB;
                tokenB = tmp;
            }
        }
        return (tokenA, tokenB, tokenC);
    }

    /**
     * @notice createSwapPair
     * @param _tokenA: Addresses of ERC20 conracts .
     * @param _tokenB: Addresses of ERC20 conracts .
     * @param _A: Amplification coefficient multiplied by n * (n - 1)
     * @param _fee: Fee to charge for exchanges
     * @param _admin_fee: Admin fee
     */
    function createSwapPair(
        address _tokenA,
        address _tokenB,
        uint256 _A,
        uint256 _fee,
        uint256 _admin_fee
    ) external onlyOwner {
        require(_tokenA != ZEROADDRESS && _tokenB != ZEROADDRESS && _tokenA != _tokenB, "Illegal token");
        (address t0, address t1) = sortTokens(_tokenA, _tokenB);
        address LP = LPFactory.createSwapLP(t0, t1, ZEROADDRESS, address(this));
        address swapContract = SwapTwoPoolDeployer.createSwapPair(t0, t1, _A, _fee, _admin_fee, msg.sender, LP);
        IpUSD(LP).setMinter(swapContract);
        addPairInfoInternal(swapContract, t0, t1, ZEROADDRESS, LP);
    }

    /**
     * @notice createThreePoolPair
     * @param _tokenA: Addresses of ERC20 conracts .
     * @param _tokenB: Addresses of ERC20 conracts .
     * @param _tokenC: Addresses of ERC20 conracts .
     * @param _A: Amplification coefficient multiplied by n * (n - 1)
     * @param _fee: Fee to charge for exchanges
     * @param _admin_fee: Admin fee
     */
    function createThreePoolPair(
        address _tokenA,
        address _tokenB,
        address _tokenC,
        uint256 _A,
        uint256 _fee,
        uint256 _admin_fee
    ) external onlyOwner {
        require(
            _tokenA != ZEROADDRESS &&
                _tokenB != ZEROADDRESS &&
                _tokenC != ZEROADDRESS &&
                _tokenA != _tokenB &&
                _tokenA != _tokenC &&
                _tokenB != _tokenC,
            "Illegal token"
        );
        (address t0, address t1, address t2) = sortTokens(_tokenA, _tokenB, _tokenC);
        address LP = LPFactory.createSwapLP(t0, t1, t2, address(this));
        address swapContract = SwapThreePoolDeployer.createSwapPair(t0, t1, t2, _A, _fee, _admin_fee, msg.sender, LP);
        IpUSD(LP).setMinter(swapContract);
        addPairInfoInternal(swapContract, t0, t1, t2, LP);
    }

    function addPairInfoInternal(
        address _swapContract,
        address _t0,
        address _t1,
        address _t2,
        address _LP
    ) internal {
        StableSwapThreePoolPairInfo storage info = stableSwapPairInfo[_t0][_t1][_t2];
        info.swapContract = _swapContract;
        info.token0 = _t0;
        info.token1 = _t1;
        info.token2 = _t2;
        info.LPContract = _LP;
        swapPairContract[pairLength] = _swapContract;
        pairLength += 1;
        if (_t2 != ZEROADDRESS) {
            addThreePoolPairInfo(_t0, _t1, _t2, info);
        }

        emit NewStableSwapPair(_swapContract, _t0, _t1, _t2, _LP);
    }

    function addThreePoolPairInfo(
        address _t0,
        address _t1,
        address _t2,
        StableSwapThreePoolPairInfo memory info
    ) internal {
        threePoolInfo[_t0][_t1] = info;
        threePoolInfo[_t0][_t2] = info;
        threePoolInfo[_t1][_t2] = info;
    }

    function addPairInfo(address _swapContract) external onlyOwner {
        IpDexStableSwap swap = IpDexStableSwap(_swapContract);
        uint256 N_COINS = swap.N_COINS();
        if (N_COINS == 2) {
            addPairInfoInternal(_swapContract, swap.coins(0), swap.coins(1), ZEROADDRESS, swap.token());
        } else if (N_COINS == 3) {
            addPairInfoInternal(_swapContract, swap.coins(0), swap.coins(1), swap.coins(2), swap.token());
        }
    }

    function getPairInfo(address _tokenA, address _tokenB) external view returns (StableSwapPairInfo memory info) {
        (address t0, address t1) = sortTokens(_tokenA, _tokenB);
        StableSwapThreePoolPairInfo memory pairInfo = stableSwapPairInfo[t0][t1][ZEROADDRESS];
        info.swapContract = pairInfo.swapContract;
        info.token0 = pairInfo.token0;
        info.token1 = pairInfo.token1;
        info.LPContract = pairInfo.LPContract;
    }

    function getThreePoolPairInfo(address _tokenA, address _tokenB)
        external
        view
        returns (StableSwapThreePoolPairInfo memory info)
    {
        (address t0, address t1) = sortTokens(_tokenA, _tokenB);
        info = threePoolInfo[t0][t1];
    }
}
        

@openzeppelin/contracts/access/Ownable.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)

pragma solidity ^0.8.0;

import "../utils/Context.sol";

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

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

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

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

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

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

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

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

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

@openzeppelin/contracts/utils/Context.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.4) (utils/Context.sol)

pragma solidity ^0.8.0;

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

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

    function _contextSuffixLength() internal view virtual returns (uint256) {
        return 0;
    }
}
          

contracts/interfaces/IpDexStableSwap.sol

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.10;

interface IpDexStableSwap {
    function token() external view returns (address);

    function balances(uint256 i) external view returns (uint256);

    function N_COINS() external view returns (uint256);

    function RATES(uint256 i) external view returns (uint256);

    function coins(uint256 i) external view returns (address);

    function PRECISION_MUL(uint256 i) external view returns (uint256);

    function fee() external view returns (uint256);

    function admin_fee() external view returns (uint256);

    function A() external view returns (uint256);

    function get_D_mem(uint256[2] memory _balances, uint256 amp) external view returns (uint256);

    function get_y(uint256 i, uint256 j, uint256 x, uint256[2] memory xp_) external view returns (uint256);

    function calc_withdraw_one_coin(uint256 _token_amount, uint256 i) external view returns (uint256);
}
          

contracts/interfaces/IpDexStableSwapDeployer.sol

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.10;

interface IpDexStableSwapDeployer {
    function createSwapPair(
        address _tokenA,
        address _tokenB,
        uint256 _A,
        uint256 _fee,
        uint256 _admin_fee,
        address _admin,
        address _LP
    ) external returns (address);

    function createSwapPair(
        address _tokenA,
        address _tokenB,
        address _tokenC,
        uint256 _A,
        uint256 _fee,
        uint256 _admin_fee,
        address _admin,
        address _LP
    ) external returns (address);
}
          

contracts/interfaces/IpDexStableSwapLPFactory.sol

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.10;

interface IpDexStableSwapLPFactory {
    function createSwapLP(
        address _tokenA,
        address _tokenB,
        address _tokenC,
        address _minter
    ) external returns (address);
}
          

contracts/interfaces/PStable/IpUSD.sol

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.10;

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

    function mint(address _to, uint256 _amount) external;

    function burnFrom(address _to, uint256 _amount) external;

    function setMinter(address _newMinter) external;
}
          

Compiler Settings

{"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"],"":["ast"]}},"optimizer":{"runs":1000000,"enabled":true},"metadata":{"bytecodeHash":"none"},"libraries":{},"evmVersion":"istanbul"}
              

Contract ABI

[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"address","name":"_LPFactory","internalType":"contract IpDexStableSwapLPFactory"},{"type":"address","name":"_SwapTwoPoolDeployer","internalType":"contract IpDexStableSwapDeployer"},{"type":"address","name":"_SwapThreePoolDeployer","internalType":"contract IpDexStableSwapDeployer"}]},{"type":"event","name":"NewStableSwapPair","inputs":[{"type":"address","name":"swapContract","internalType":"address","indexed":true},{"type":"address","name":"tokenA","internalType":"address","indexed":false},{"type":"address","name":"tokenB","internalType":"address","indexed":false},{"type":"address","name":"tokenC","internalType":"address","indexed":false},{"type":"address","name":"LP","internalType":"address","indexed":false}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"type":"address","name":"previousOwner","internalType":"address","indexed":true},{"type":"address","name":"newOwner","internalType":"address","indexed":true}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IpDexStableSwapLPFactory"}],"name":"LPFactory","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IpDexStableSwapDeployer"}],"name":"SwapThreePoolDeployer","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IpDexStableSwapDeployer"}],"name":"SwapTwoPoolDeployer","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"addPairInfo","inputs":[{"type":"address","name":"_swapContract","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"createSwapPair","inputs":[{"type":"address","name":"_tokenA","internalType":"address"},{"type":"address","name":"_tokenB","internalType":"address"},{"type":"uint256","name":"_A","internalType":"uint256"},{"type":"uint256","name":"_fee","internalType":"uint256"},{"type":"uint256","name":"_admin_fee","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"createThreePoolPair","inputs":[{"type":"address","name":"_tokenA","internalType":"address"},{"type":"address","name":"_tokenB","internalType":"address"},{"type":"address","name":"_tokenC","internalType":"address"},{"type":"uint256","name":"_A","internalType":"uint256"},{"type":"uint256","name":"_fee","internalType":"uint256"},{"type":"uint256","name":"_admin_fee","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"tuple","name":"info","internalType":"struct pDexPStableSwapFactory.StableSwapPairInfo","components":[{"type":"address","name":"swapContract","internalType":"address"},{"type":"address","name":"token0","internalType":"address"},{"type":"address","name":"token1","internalType":"address"},{"type":"address","name":"LPContract","internalType":"address"}]}],"name":"getPairInfo","inputs":[{"type":"address","name":"_tokenA","internalType":"address"},{"type":"address","name":"_tokenB","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"tuple","name":"info","internalType":"struct pDexPStableSwapFactory.StableSwapThreePoolPairInfo","components":[{"type":"address","name":"swapContract","internalType":"address"},{"type":"address","name":"token0","internalType":"address"},{"type":"address","name":"token1","internalType":"address"},{"type":"address","name":"token2","internalType":"address"},{"type":"address","name":"LPContract","internalType":"address"}]}],"name":"getThreePoolPairInfo","inputs":[{"type":"address","name":"_tokenA","internalType":"address"},{"type":"address","name":"_tokenB","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"pairLength","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"renounceOwnership","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"swapContract","internalType":"address"},{"type":"address","name":"token0","internalType":"address"},{"type":"address","name":"token1","internalType":"address"},{"type":"address","name":"token2","internalType":"address"},{"type":"address","name":"LPContract","internalType":"address"}],"name":"stableSwapPairInfo","inputs":[{"type":"address","name":"","internalType":"address"},{"type":"address","name":"","internalType":"address"},{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"swapPairContract","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"newOwner","internalType":"address"}]}]
              

Contract Creation Code

Verify & Publish
0x60e06040523480156200001157600080fd5b5060405162002005380380620020058339810160408190526200003491620000c6565b6200003f336200005d565b6001600160a01b0392831660805290821660a0521660c0526200011a565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0381168114620000c357600080fd5b50565b600080600060608486031215620000dc57600080fd5b8351620000e981620000ad565b6020850151909350620000fc81620000ad565b60408501519092506200010f81620000ad565b809150509250925092565b60805160a05160c051611ea0620001656000396000818161014501526107890152600081816102ce0152610fc401526000818160f40152818161069e0152610edf0152611ea06000f3fe608060405234801561001057600080fd5b50600436106100ea5760003560e01c8063715018a61161008c578063b3c0e84611610066578063b3c0e84614610385578063ec69a02414610398578063f2fde38b146103ab578063fcc9136c146103be57600080fd5b8063715018a6146102f05780638da5cb5b146102f8578063923093cb1461031657600080fd5b8063400f7a1e116100c8578063400f7a1e1461021b5780634205381b1461027e578063636e66a01461029357806368fae3f3146102c957600080fd5b806314c77a6d146100ef57806321420c4b1461014057806338802f1a14610167575b600080fd5b6101167f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b6101167f000000000000000000000000000000000000000000000000000000000000000081565b6101d4610175366004611ca7565b60016020818152600094855260408086208252938552838520905290835291208054918101546002820154600383015460049093015473ffffffffffffffffffffffffffffffffffffffff948516949283169391831692918216911685565b6040805173ffffffffffffffffffffffffffffffffffffffff968716815294861660208601529285169284019290925283166060830152909116608082015260a001610137565b61022e610229366004611cf2565b6103d5565b6040516101379190815173ffffffffffffffffffffffffffffffffffffffff9081168252602080840151821690830152604080840151821690830152606092830151169181019190915260800190565b61029161028c366004611d2b565b6104b2565b005b6101166102a1366004611d90565b60036020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b6101167f000000000000000000000000000000000000000000000000000000000000000081565b610291610896565b60005473ffffffffffffffffffffffffffffffffffffffff16610116565b610329610324366004611cf2565b6108aa565b6040516101379190815173ffffffffffffffffffffffffffffffffffffffff9081168252602080840151821690830152604080840151821690830152606080840151821690830152608092830151169181019190915260a00190565b610291610393366004611da9565b610961565b6102916103a6366004611dcd565b610d90565b6102916103b9366004611da9565b6110cf565b6103c760045481565b604051908152602001610137565b604080516080810182526000808252602082018190529181018290526060810182905290806104048585611186565b73ffffffffffffffffffffffffffffffffffffffff91821660009081526001602081815260408084209486168452938152838320838052815291839020835160a08101855281548616808252928201548616818501908152600283015487168287019081526003840154881660608085019190915260049094015488166080909301928352938a52518616938901939093529051841692870192909252519091169084015250909392505050565b6104ba611267565b73ffffffffffffffffffffffffffffffffffffffff8616158015906104f4575073ffffffffffffffffffffffffffffffffffffffff851615155b8015610515575073ffffffffffffffffffffffffffffffffffffffff841615155b801561054d57508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614155b801561058557508373ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614155b80156105bd57508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b610628576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f496c6c6567616c20746f6b656e0000000000000000000000000000000000000060448201526064015b60405180910390fd5b60008060006106388989896112e8565b6040517fb240221a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff80851660048301528084166024830152808316604483015230606483015293965091945092506000917f0000000000000000000000000000000000000000000000000000000000000000169063b240221a906084016020604051808303816000875af11580156106e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061070b9190611e1e565b6040517f4cedbfc700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff868116600483015285811660248301528481166044830152606482018a90526084820189905260a482018890523360c483015280831660e48301529192506000917f00000000000000000000000000000000000000000000000000000000000000001690634cedbfc790610104016020604051808303816000875af11580156107d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107f79190611e1e565b6040517ffca3b5aa00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff80831660048301529192509083169063fca3b5aa90602401600060405180830381600087803b15801561086457600080fd5b505af1158015610878573d6000803e3d6000fd5b50505050610889818686868661149c565b5050505050505050505050565b61089e611267565b6108a86000611c10565b565b6040805160a081018252600080825260208201819052918101829052606081018290526080810182905290806108e08585611186565b73ffffffffffffffffffffffffffffffffffffffff9182166000908152600260208181526040808420948616845293815291839020835160a081018552815486168152600182015486169381019390935290810154841692820192909252600382015483166060820152600490910154909116608082015295945050505050565b610969611267565b600081905060008173ffffffffffffffffffffffffffffffffffffffff1663293577506040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109df9190611e3b565b90508060021415610b89576040517fc661065700000000000000000000000000000000000000000000000000000000815260006004820152610b8490849073ffffffffffffffffffffffffffffffffffffffff85169063c661065790602401602060405180830381865afa158015610a5b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a7f9190611e1e565b6040517fc66106570000000000000000000000000000000000000000000000000000000081526001600482015273ffffffffffffffffffffffffffffffffffffffff86169063c661065790602401602060405180830381865afa158015610aea573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b0e9190611e1e565b60008673ffffffffffffffffffffffffffffffffffffffff1663fc0c546a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b5b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b7f9190611e1e565b61149c565b505050565b8060031415610b84576040517fc661065700000000000000000000000000000000000000000000000000000000815260006004820152610b8490849073ffffffffffffffffffffffffffffffffffffffff85169063c661065790602401602060405180830381865afa158015610c03573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c279190611e1e565b6040517fc66106570000000000000000000000000000000000000000000000000000000081526001600482015273ffffffffffffffffffffffffffffffffffffffff86169063c661065790602401602060405180830381865afa158015610c92573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cb69190611e1e565b6040517fc66106570000000000000000000000000000000000000000000000000000000081526002600482015273ffffffffffffffffffffffffffffffffffffffff87169063c661065790602401602060405180830381865afa158015610d21573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d459190611e1e565b8673ffffffffffffffffffffffffffffffffffffffff1663fc0c546a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b5b573d6000803e3d6000fd5b610d98611267565b73ffffffffffffffffffffffffffffffffffffffff851615801590610dd2575073ffffffffffffffffffffffffffffffffffffffff841615155b8015610e0a57508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b610e70576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f496c6c6567616c20746f6b656e00000000000000000000000000000000000000604482015260640161061f565b600080610e7d8787611186565b6040517fb240221a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff838116600483015282811660248301526000604483018190523060648401529395509193507f00000000000000000000000000000000000000000000000000000000000000009091169063b240221a906084016020604051808303816000875af1158015610f2a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f4e9190611e1e565b6040517f9013148d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff858116600483015284811660248301526044820189905260648201889052608482018790523360a483015280831660c48301529192506000917f00000000000000000000000000000000000000000000000000000000000000001690639013148d9060e4016020604051808303816000875af115801561100d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110319190611e1e565b6040517ffca3b5aa00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff80831660048301529192509083169063fca3b5aa90602401600060405180830381600087803b15801561109e57600080fd5b505af11580156110b2573d6000803e3d6000fd5b505050506110c481858560008661149c565b505050505050505050565b6110d7611267565b73ffffffffffffffffffffffffffffffffffffffff811661117a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161061f565b61118381611c10565b50565b6000808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561121f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4944454e544943414c5f41444452455353455300000000000000000000000000604482015260640161061f565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161061125957828461125c565b83835b909590945092505050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146108a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161061f565b60008060008473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161415801561135557508373ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614155b801561138d57508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b6113f3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4944454e544943414c5f41444452455353455300000000000000000000000000604482015260640161061f565b60008573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff16111561142f5750939493845b8473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16111561148f57509293928373ffffffffffffffffffffffffffffffffffffffff808716908816111561148f5750939493845b5094959394509192915050565b73ffffffffffffffffffffffffffffffffffffffff808516600081815260016020818152604080842089871680865290835281852089881680875290845282862080548e8a167fffffffffffffffffffffffff00000000000000000000000000000000000000009182168117835582880180548316909a179099556002820180548216909417909355600380820180548516909317909255600480820180549a8c169a85169a909a179099558854875293529084208054909116909417909355835492939092909190611570908490611e54565b909155505073ffffffffffffffffffffffffffffffffffffffff831615611ba3576040805160a081018252825473ffffffffffffffffffffffffffffffffffffffff9081168252600184015481166020830152600284015481169282019290925260038301548216606082015260048301549091166080820152611ba39086908690869080600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060608201518160030160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060808201518160040160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555090505080600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060608201518160030160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060808201518160040160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555090505080600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060608201518160030160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060808201518160040160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555090505050505050565b6040805173ffffffffffffffffffffffffffffffffffffffff878116825286811660208301528581168284015284811660608301529151918816917f48dc7a1b156fe3e70ed5ed0afcb307661905edf536f15bb5786e327ea19335329181900360800190a2505050505050565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b73ffffffffffffffffffffffffffffffffffffffff8116811461118357600080fd5b600080600060608486031215611cbc57600080fd5b8335611cc781611c85565b92506020840135611cd781611c85565b91506040840135611ce781611c85565b809150509250925092565b60008060408385031215611d0557600080fd5b8235611d1081611c85565b91506020830135611d2081611c85565b809150509250929050565b60008060008060008060c08789031215611d4457600080fd5b8635611d4f81611c85565b95506020870135611d5f81611c85565b94506040870135611d6f81611c85565b959894975094956060810135955060808101359460a0909101359350915050565b600060208284031215611da257600080fd5b5035919050565b600060208284031215611dbb57600080fd5b8135611dc681611c85565b9392505050565b600080600080600060a08688031215611de557600080fd5b8535611df081611c85565b94506020860135611e0081611c85565b94979496505050506040830135926060810135926080909101359150565b600060208284031215611e3057600080fd5b8151611dc681611c85565b600060208284031215611e4d57600080fd5b5051919050565b60008219821115611e8e577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b50019056fea164736f6c634300080a000a000000000000000000000000f5ca9362d2c54decf0f928dd823a4aad19d86d5b000000000000000000000000cd31d98782dd1fc438563a7814de4785744623f6000000000000000000000000978dc1aa9a280abb3c1584d23321dba48723dea1

Deployed ByteCode

0x608060405234801561001057600080fd5b50600436106100ea5760003560e01c8063715018a61161008c578063b3c0e84611610066578063b3c0e84614610385578063ec69a02414610398578063f2fde38b146103ab578063fcc9136c146103be57600080fd5b8063715018a6146102f05780638da5cb5b146102f8578063923093cb1461031657600080fd5b8063400f7a1e116100c8578063400f7a1e1461021b5780634205381b1461027e578063636e66a01461029357806368fae3f3146102c957600080fd5b806314c77a6d146100ef57806321420c4b1461014057806338802f1a14610167575b600080fd5b6101167f000000000000000000000000f5ca9362d2c54decf0f928dd823a4aad19d86d5b81565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b6101167f000000000000000000000000978dc1aa9a280abb3c1584d23321dba48723dea181565b6101d4610175366004611ca7565b60016020818152600094855260408086208252938552838520905290835291208054918101546002820154600383015460049093015473ffffffffffffffffffffffffffffffffffffffff948516949283169391831692918216911685565b6040805173ffffffffffffffffffffffffffffffffffffffff968716815294861660208601529285169284019290925283166060830152909116608082015260a001610137565b61022e610229366004611cf2565b6103d5565b6040516101379190815173ffffffffffffffffffffffffffffffffffffffff9081168252602080840151821690830152604080840151821690830152606092830151169181019190915260800190565b61029161028c366004611d2b565b6104b2565b005b6101166102a1366004611d90565b60036020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b6101167f000000000000000000000000cd31d98782dd1fc438563a7814de4785744623f681565b610291610896565b60005473ffffffffffffffffffffffffffffffffffffffff16610116565b610329610324366004611cf2565b6108aa565b6040516101379190815173ffffffffffffffffffffffffffffffffffffffff9081168252602080840151821690830152604080840151821690830152606080840151821690830152608092830151169181019190915260a00190565b610291610393366004611da9565b610961565b6102916103a6366004611dcd565b610d90565b6102916103b9366004611da9565b6110cf565b6103c760045481565b604051908152602001610137565b604080516080810182526000808252602082018190529181018290526060810182905290806104048585611186565b73ffffffffffffffffffffffffffffffffffffffff91821660009081526001602081815260408084209486168452938152838320838052815291839020835160a08101855281548616808252928201548616818501908152600283015487168287019081526003840154881660608085019190915260049094015488166080909301928352938a52518616938901939093529051841692870192909252519091169084015250909392505050565b6104ba611267565b73ffffffffffffffffffffffffffffffffffffffff8616158015906104f4575073ffffffffffffffffffffffffffffffffffffffff851615155b8015610515575073ffffffffffffffffffffffffffffffffffffffff841615155b801561054d57508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614155b801561058557508373ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614155b80156105bd57508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b610628576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f496c6c6567616c20746f6b656e0000000000000000000000000000000000000060448201526064015b60405180910390fd5b60008060006106388989896112e8565b6040517fb240221a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff80851660048301528084166024830152808316604483015230606483015293965091945092506000917f000000000000000000000000f5ca9362d2c54decf0f928dd823a4aad19d86d5b169063b240221a906084016020604051808303816000875af11580156106e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061070b9190611e1e565b6040517f4cedbfc700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff868116600483015285811660248301528481166044830152606482018a90526084820189905260a482018890523360c483015280831660e48301529192506000917f000000000000000000000000978dc1aa9a280abb3c1584d23321dba48723dea11690634cedbfc790610104016020604051808303816000875af11580156107d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107f79190611e1e565b6040517ffca3b5aa00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff80831660048301529192509083169063fca3b5aa90602401600060405180830381600087803b15801561086457600080fd5b505af1158015610878573d6000803e3d6000fd5b50505050610889818686868661149c565b5050505050505050505050565b61089e611267565b6108a86000611c10565b565b6040805160a081018252600080825260208201819052918101829052606081018290526080810182905290806108e08585611186565b73ffffffffffffffffffffffffffffffffffffffff9182166000908152600260208181526040808420948616845293815291839020835160a081018552815486168152600182015486169381019390935290810154841692820192909252600382015483166060820152600490910154909116608082015295945050505050565b610969611267565b600081905060008173ffffffffffffffffffffffffffffffffffffffff1663293577506040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109df9190611e3b565b90508060021415610b89576040517fc661065700000000000000000000000000000000000000000000000000000000815260006004820152610b8490849073ffffffffffffffffffffffffffffffffffffffff85169063c661065790602401602060405180830381865afa158015610a5b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a7f9190611e1e565b6040517fc66106570000000000000000000000000000000000000000000000000000000081526001600482015273ffffffffffffffffffffffffffffffffffffffff86169063c661065790602401602060405180830381865afa158015610aea573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b0e9190611e1e565b60008673ffffffffffffffffffffffffffffffffffffffff1663fc0c546a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b5b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b7f9190611e1e565b61149c565b505050565b8060031415610b84576040517fc661065700000000000000000000000000000000000000000000000000000000815260006004820152610b8490849073ffffffffffffffffffffffffffffffffffffffff85169063c661065790602401602060405180830381865afa158015610c03573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c279190611e1e565b6040517fc66106570000000000000000000000000000000000000000000000000000000081526001600482015273ffffffffffffffffffffffffffffffffffffffff86169063c661065790602401602060405180830381865afa158015610c92573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cb69190611e1e565b6040517fc66106570000000000000000000000000000000000000000000000000000000081526002600482015273ffffffffffffffffffffffffffffffffffffffff87169063c661065790602401602060405180830381865afa158015610d21573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d459190611e1e565b8673ffffffffffffffffffffffffffffffffffffffff1663fc0c546a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b5b573d6000803e3d6000fd5b610d98611267565b73ffffffffffffffffffffffffffffffffffffffff851615801590610dd2575073ffffffffffffffffffffffffffffffffffffffff841615155b8015610e0a57508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b610e70576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f496c6c6567616c20746f6b656e00000000000000000000000000000000000000604482015260640161061f565b600080610e7d8787611186565b6040517fb240221a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff838116600483015282811660248301526000604483018190523060648401529395509193507f000000000000000000000000f5ca9362d2c54decf0f928dd823a4aad19d86d5b9091169063b240221a906084016020604051808303816000875af1158015610f2a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f4e9190611e1e565b6040517f9013148d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff858116600483015284811660248301526044820189905260648201889052608482018790523360a483015280831660c48301529192506000917f000000000000000000000000cd31d98782dd1fc438563a7814de4785744623f61690639013148d9060e4016020604051808303816000875af115801561100d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110319190611e1e565b6040517ffca3b5aa00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff80831660048301529192509083169063fca3b5aa90602401600060405180830381600087803b15801561109e57600080fd5b505af11580156110b2573d6000803e3d6000fd5b505050506110c481858560008661149c565b505050505050505050565b6110d7611267565b73ffffffffffffffffffffffffffffffffffffffff811661117a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161061f565b61118381611c10565b50565b6000808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561121f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4944454e544943414c5f41444452455353455300000000000000000000000000604482015260640161061f565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161061125957828461125c565b83835b909590945092505050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146108a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161061f565b60008060008473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161415801561135557508373ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614155b801561138d57508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b6113f3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4944454e544943414c5f41444452455353455300000000000000000000000000604482015260640161061f565b60008573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff16111561142f5750939493845b8473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16111561148f57509293928373ffffffffffffffffffffffffffffffffffffffff808716908816111561148f5750939493845b5094959394509192915050565b73ffffffffffffffffffffffffffffffffffffffff808516600081815260016020818152604080842089871680865290835281852089881680875290845282862080548e8a167fffffffffffffffffffffffff00000000000000000000000000000000000000009182168117835582880180548316909a179099556002820180548216909417909355600380820180548516909317909255600480820180549a8c169a85169a909a179099558854875293529084208054909116909417909355835492939092909190611570908490611e54565b909155505073ffffffffffffffffffffffffffffffffffffffff831615611ba3576040805160a081018252825473ffffffffffffffffffffffffffffffffffffffff9081168252600184015481166020830152600284015481169282019290925260038301548216606082015260048301549091166080820152611ba39086908690869080600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060608201518160030160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060808201518160040160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555090505080600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060608201518160030160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060808201518160040160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555090505080600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060608201518160030160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060808201518160040160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555090505050505050565b6040805173ffffffffffffffffffffffffffffffffffffffff878116825286811660208301528581168284015284811660608301529151918816917f48dc7a1b156fe3e70ed5ed0afcb307661905edf536f15bb5786e327ea19335329181900360800190a2505050505050565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b73ffffffffffffffffffffffffffffffffffffffff8116811461118357600080fd5b600080600060608486031215611cbc57600080fd5b8335611cc781611c85565b92506020840135611cd781611c85565b91506040840135611ce781611c85565b809150509250925092565b60008060408385031215611d0557600080fd5b8235611d1081611c85565b91506020830135611d2081611c85565b809150509250929050565b60008060008060008060c08789031215611d4457600080fd5b8635611d4f81611c85565b95506020870135611d5f81611c85565b94506040870135611d6f81611c85565b959894975094956060810135955060808101359460a0909101359350915050565b600060208284031215611da257600080fd5b5035919050565b600060208284031215611dbb57600080fd5b8135611dc681611c85565b9392505050565b600080600080600060a08688031215611de557600080fd5b8535611df081611c85565b94506020860135611e0081611c85565b94979496505050506040830135926060810135926080909101359150565b600060208284031215611e3057600080fd5b8151611dc681611c85565b600060208284031215611e4d57600080fd5b5051919050565b60008219821115611e8e577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b50019056fea164736f6c634300080a000a