ETH Price: $2,231.77 (+2.34%)
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Add Liquidity110876482020-10-19 16:51:431594 days ago1603126303IN
0x706060B2...6502b9C2b
0 ETH0.0106485725
Post110846952020-10-19 5:56:191595 days ago1603086979IN
0x706060B2...6502b9C2b
0.051 ETH0.0032477922
Onboard110846792020-10-19 5:52:441595 days ago1603086764IN
0x706060B2...6502b9C2b
0 ETH0.0023760718
Authorize Pool110816322020-10-18 18:43:431595 days ago1603046623IN
0x706060B2...6502b9C2b
0 ETH0.0029220417
Authorize Pool110816272020-10-18 18:42:021595 days ago1603046522IN
0x706060B2...6502b9C2b
0 ETH0.0006372816
Authorize Pool110816252020-10-18 18:41:451595 days ago1603046505IN
0x706060B2...6502b9C2b
0 ETH0.0029220417
Onboard110816182020-10-18 18:40:151595 days ago1603046415IN
0x706060B2...6502b9C2b
0 ETH0.0022440617
Add Liquidity110816012020-10-18 18:36:261595 days ago1603046186IN
0x706060B2...6502b9C2b
0 ETH0.008633221
Authorize Pool110815902020-10-18 18:34:041595 days ago1603046044IN
0x706060B2...6502b9C2b
0 ETH0.0029220417
Onboard110815692020-10-18 18:30:131595 days ago1603045813IN
0x706060B2...6502b9C2b
0 ETH0.0019882517
Add Liquidity110695622020-10-16 22:07:571597 days ago1602886077IN
0x706060B2...6502b9C2b
0 ETH0.010654725
Add Liquidity110695532020-10-16 22:05:401597 days ago1602885940IN
0x706060B2...6502b9C2b
0 ETH0.0105397225
Sell Dai110695002020-10-16 21:55:171597 days ago1602885317IN
0x706060B2...6502b9C2b
0 ETH0.0029335525
Sell Dai110694962020-10-16 21:53:531597 days ago1602885233IN
0x706060B2...6502b9C2b
0 ETH0.0029444225
Sell Dai110694742020-10-16 21:50:381597 days ago1602885038IN
0x706060B2...6502b9C2b
0 ETH0.0029280525
Sell Dai110694492020-10-16 21:45:011597 days ago1602884701IN
0x706060B2...6502b9C2b
0 ETH0.002936325
Sell Dai110694472020-10-16 21:43:581597 days ago1602884638IN
0x706060B2...6502b9C2b
0 ETH0.0029385725
Sell Dai110694442020-10-16 21:43:061597 days ago1602884586IN
0x706060B2...6502b9C2b
0 ETH0.0022296619
Authorize Pool110679112020-10-16 16:06:401597 days ago1602864400IN
0x706060B2...6502b9C2b
0 ETH0.0144383484
Authorize Pool110679072020-10-16 16:05:291597 days ago1602864329IN
0x706060B2...6502b9C2b
0 ETH0.0127194974
Add Liquidity110678752020-10-16 15:56:441597 days ago1602863804IN
0x706060B2...6502b9C2b
0 ETH0.0347535280
Add Liquidity110678722020-10-16 15:55:011597 days ago1602863701IN
0x706060B2...6502b9C2b
0 ETH0.034717680
Add Liquidity110678682020-10-16 15:54:121597 days ago1602863652IN
0x706060B2...6502b9C2b
0 ETH0.029183770
Authorize Pool110678632020-10-16 15:52:281597 days ago1602863548IN
0x706060B2...6502b9C2b
0 ETH0.0027889470
Authorize Pool110678632020-10-16 15:52:281597 days ago1602863548IN
0x706060B2...6502b9C2b
0 ETH0.0027889470
View all transactions

Latest 3 internal transactions

Advanced mode:
Parent Transaction Hash Block
From
To
110846952020-10-19 5:56:191595 days ago1603086979
0x706060B2...6502b9C2b
0.051 ETH
110677442020-10-16 15:24:251597 days ago1602861865
0x706060B2...6502b9C2b
0.14 ETH
110675532020-10-16 14:45:111597 days ago1602859511
0x706060B2...6502b9C2b
0.5 ETH
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
YieldProxy

Compiler Version
v0.6.10+commit.00c0fcaf

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, GNU GPLv3 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2020-10-16
*/

// File: contracts/interfaces/IDelegable.sol

pragma solidity ^0.6.10;


interface IDelegable {
    function addDelegate(address) external;
    function addDelegateBySignature(address, address, uint, uint8, bytes32, bytes32) external;
}

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


pragma solidity ^0.6.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

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

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

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

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

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

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

// File: contracts/interfaces/IVat.sol

pragma solidity ^0.6.10;


/// @dev Interface to interact with the vat contract from MakerDAO
/// Taken from https://github.com/makerdao/developerguides/blob/master/devtools/working-with-dsproxy/working-with-dsproxy.md
interface IVat {
    // function can(address, address) external view returns (uint);
    function hope(address) external;
    function nope(address) external;
    function live() external view returns (uint);
    function ilks(bytes32) external view returns (uint, uint, uint, uint, uint);
    function urns(bytes32, address) external view returns (uint, uint);
    function gem(bytes32, address) external view returns (uint);
    // function dai(address) external view returns (uint);
    function frob(bytes32, address, address, address, int, int) external;
    function fork(bytes32, address, address, int, int) external;
    function move(address, address, uint) external;
    function flux(bytes32, address, address, uint) external;
}

// File: contracts/interfaces/IWeth.sol

pragma solidity ^0.6.10;


interface IWeth {
    function deposit() external payable;
    function withdraw(uint) external;
    function approve(address, uint) external returns (bool) ;
    function transfer(address, uint) external returns (bool);
    function transferFrom(address, address, uint) external returns (bool);
}

// File: contracts/interfaces/IGemJoin.sol

pragma solidity ^0.6.10;


/// @dev Interface to interact with the `Join.sol` contract from MakerDAO using ERC20
interface IGemJoin {
    function rely(address usr) external;
    function deny(address usr) external;
    function cage() external;
    function join(address usr, uint WAD) external;
    function exit(address usr, uint WAD) external;
}

// File: contracts/interfaces/IDaiJoin.sol

pragma solidity ^0.6.10;


/// @dev Interface to interact with the `Join.sol` contract from MakerDAO using Dai
interface IDaiJoin {
    function rely(address usr) external;
    function deny(address usr) external;
    function cage() external;
    function join(address usr, uint WAD) external;
    function exit(address usr, uint WAD) external;
}

// File: contracts/interfaces/IPot.sol

pragma solidity ^0.6.10;


/// @dev interface for the pot contract from MakerDao
/// Taken from https://github.com/makerdao/developerguides/blob/master/dai/dsr-integration-guide/dsr.sol
interface IPot {
    function chi() external view returns (uint256);
    function pie(address) external view returns (uint256); // Not a function, but a public variable.
    function rho() external returns (uint256);
    function drip() external returns (uint256);
    function join(uint256) external;
    function exit(uint256) external;
}

// File: contracts/interfaces/IChai.sol

pragma solidity ^0.6.10;


/// @dev interface for the chai contract
/// Taken from https://github.com/makerdao/developerguides/blob/master/dai/dsr-integration-guide/dsr.sol
interface IChai {
    function balanceOf(address account) external view returns (uint256);
    function transfer(address dst, uint wad) external returns (bool);
    function move(address src, address dst, uint wad) external returns (bool);
    function transferFrom(address src, address dst, uint wad) external returns (bool);
    function approve(address usr, uint wad) external returns (bool);
    function dai(address usr) external returns (uint wad);
    function join(address dst, uint wad) external;
    function exit(address src, uint wad) external;
    function draw(address src, uint wad) external;
    function permit(address holder, address spender, uint256 nonce, uint256 expiry, bool allowed, uint8 v, bytes32 r, bytes32 s) external;
    function nonces(address account) external view returns (uint256);
}

// File: contracts/interfaces/ITreasury.sol

pragma solidity ^0.6.10;








interface ITreasury {
    function debt() external view returns(uint256);
    function savings() external view returns(uint256);
    function pushDai(address user, uint256 dai) external;
    function pullDai(address user, uint256 dai) external;
    function pushChai(address user, uint256 chai) external;
    function pullChai(address user, uint256 chai) external;
    function pushWeth(address to, uint256 weth) external;
    function pullWeth(address to, uint256 weth) external;
    function shutdown() external;
    function live() external view returns(bool);

    function vat() external view returns (IVat);
    function weth() external view returns (IWeth);
    function dai() external view returns (IERC20);
    function daiJoin() external view returns (IDaiJoin);
    function wethJoin() external view returns (IGemJoin);
    function pot() external view returns (IPot);
    function chai() external view returns (IChai);
}

// File: contracts/interfaces/IERC2612.sol

// Code adapted from https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2237/
pragma solidity ^0.6.0;

/**
 * @dev Interface of the ERC2612 standard as defined in the EIP.
 *
 * Adds the {permit} method, which can be used to change one's
 * {IERC20-allowance} without having to send a transaction, by signing a
 * message. This allows users to spend tokens without having to hold Ether.
 *
 * See https://eips.ethereum.org/EIPS/eip-2612.
 */
interface IERC2612 {
    /**
     * @dev Sets `amount` as the allowance of `spender` over `owner`'s tokens,
     * given `owner`'s signed approval.
     *
     * IMPORTANT: The same issues {IERC20-approve} has related to transaction
     * ordering also apply here.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     * - `deadline` must be a timestamp in the future.
     * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`
     * over the EIP712-formatted function arguments.
     * - the signature must use ``owner``'s current nonce (see {nonces}).
     *
     * For more information on the signature format, see the
     * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP
     * section].
     */
    function permit(address owner, address spender, uint256 amount, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external;

    /**
     * @dev Returns the current ERC2612 nonce for `owner`. This value must be
     * included whenever a signature is generated for {permit}.
     *
     * Every successful call to {permit} increases ``owner``'s nonce by one. This
     * prevents a signature from being used multiple times.
     */
    function nonces(address owner) external view returns (uint256);
}

// File: contracts/interfaces/IFYDai.sol

pragma solidity ^0.6.10;



interface IFYDai is IERC20, IERC2612 {
    function isMature() external view returns(bool);
    function maturity() external view returns(uint);
    function chi0() external view returns(uint);
    function rate0() external view returns(uint);
    function chiGrowth() external view returns(uint);
    function rateGrowth() external view returns(uint);
    function mature() external;
    function unlocked() external view returns (uint);
    function mint(address, uint) external;
    function burn(address, uint) external;
    function flashMint(uint, bytes calldata) external;
    function redeem(address, address, uint256) external returns (uint256);
    // function transfer(address, uint) external returns (bool);
    // function transferFrom(address, address, uint) external returns (bool);
    // function approve(address, uint) external returns (bool);
}

// File: contracts/interfaces/IController.sol

pragma solidity ^0.6.10;





interface IController is IDelegable {
    function treasury() external view returns (ITreasury);
    function series(uint256) external view returns (IFYDai);
    function seriesIterator(uint256) external view returns (uint256);
    function totalSeries() external view returns (uint256);
    function containsSeries(uint256) external view returns (bool);
    function posted(bytes32, address) external view returns (uint256);
    function debtFYDai(bytes32, uint256, address) external view returns (uint256);
    function debtDai(bytes32, uint256, address) external view returns (uint256);
    function totalDebtDai(bytes32, address) external view returns (uint256);
    function isCollateralized(bytes32, address) external view returns (bool);
    function inDai(bytes32, uint256, uint256) external view returns (uint256);
    function inFYDai(bytes32, uint256, uint256) external view returns (uint256);
    function erase(bytes32, address) external returns (uint256, uint256);
    function shutdown() external;
    function post(bytes32, address, address, uint256) external;
    function withdraw(bytes32, address, address, uint256) external;
    function borrow(bytes32, uint256, address, address, uint256) external;
    function repayFYDai(bytes32, uint256, address, address, uint256) external returns (uint256);
    function repayDai(bytes32, uint256, address, address, uint256) external returns (uint256);
}

// File: contracts/interfaces/IDai.sol

pragma solidity ^0.6.10;


interface IDai is IERC20 {
    function nonces(address user) external view returns (uint256);
    function permit(address holder, address spender, uint256 nonce, uint256 expiry,
                    bool allowed, uint8 v, bytes32 r, bytes32 s) external;
}

// File: contracts/interfaces/IPool.sol

pragma solidity ^0.6.10;





interface IPool is IDelegable, IERC20, IERC2612 {
    function dai() external view returns(IERC20);
    function fyDai() external view returns(IFYDai);
    function getDaiReserves() external view returns(uint128);
    function getFYDaiReserves() external view returns(uint128);
    function sellDai(address from, address to, uint128 daiIn) external returns(uint128);
    function buyDai(address from, address to, uint128 daiOut) external returns(uint128);
    function sellFYDai(address from, address to, uint128 fyDaiIn) external returns(uint128);
    function buyFYDai(address from, address to, uint128 fyDaiOut) external returns(uint128);
    function sellDaiPreview(uint128 daiIn) external view returns(uint128);
    function buyDaiPreview(uint128 daiOut) external view returns(uint128);
    function sellFYDaiPreview(uint128 fyDaiIn) external view returns(uint128);
    function buyFYDaiPreview(uint128 fyDaiOut) external view returns(uint128);
    function mint(address from, address to, uint256 daiOffered) external returns (uint256);
    function burn(address from, address to, uint256 tokensBurned) external returns (uint256, uint256);
}

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


pragma solidity ^0.6.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;
    }
}

// File: contracts/helpers/DecimalMath.sol

pragma solidity ^0.6.10;



/// @dev Implements simple fixed point math mul and div operations for 27 decimals.
contract DecimalMath {
    using SafeMath for uint256;

    uint256 constant public UNIT = 1e27;

    /// @dev Multiplies x and y, assuming they are both fixed point with 27 digits.
    function muld(uint256 x, uint256 y) internal pure returns (uint256) {
        return x.mul(y).div(UNIT);
    }

    /// @dev Divides x between y, assuming they are both fixed point with 27 digits.
    function divd(uint256 x, uint256 y) internal pure returns (uint256) {
        return x.mul(UNIT).div(y);
    }

    /// @dev Multiplies x and y, rounding up to the closest representable number.
    /// Assumes x and y are both fixed point with `decimals` digits.
    function muldrup(uint256 x, uint256 y) internal pure returns (uint256)
    {
        uint256 z = x.mul(y);
        return z.mod(UNIT) == 0 ? z.div(UNIT) : z.div(UNIT).add(1);
    }

    /// @dev Divides x between y, rounding up to the closest representable number.
    /// Assumes x and y are both fixed point with `decimals` digits.
    function divdrup(uint256 x, uint256 y) internal pure returns (uint256)
    {
        uint256 z = x.mul(UNIT);
        return z.mod(y) == 0 ? z.div(y) : z.div(y).add(1);
    }
}

// File: contracts/peripheral/YieldProxy.sol

pragma solidity ^0.6.10;













library SafeCast {
    /// @dev Safe casting from uint256 to uint128
    function toUint128(uint256 x) internal pure returns(uint128) {
        require(
            x <= type(uint128).max,
            "YieldProxy: Cast overflow"
        );
        return uint128(x);
    }

    /// @dev Safe casting from uint256 to int256
    function toInt256(uint256 x) internal pure returns(int256) {
        require(
            x <= uint256(type(int256).max),
            "YieldProxy: Cast overflow"
        );
        return int256(x);
    }
}

contract YieldProxy is DecimalMath {
    using SafeCast for uint256;

    IVat public vat;
    IWeth public weth;
    IDai public dai;
    IGemJoin public wethJoin;
    IDaiJoin public daiJoin;
    IChai public chai;
    IController public controller;
    ITreasury public treasury;

    IPool[] public pools;
    mapping (address => bool) public poolsMap;

    bytes32 public constant CHAI = "CHAI";
    bytes32 public constant WETH = "ETH-A";
    bool constant public MTY = true;
    bool constant public YTM = false;


    constructor(address controller_, IPool[] memory _pools) public {
        controller = IController(controller_);
        treasury = controller.treasury();

        weth = treasury.weth();
        dai = IDai(address(treasury.dai()));
        chai = treasury.chai();
        daiJoin = treasury.daiJoin();
        wethJoin = treasury.wethJoin();
        vat = treasury.vat();

        // for repaying debt
        dai.approve(address(treasury), uint(-1));

        // for posting to the controller
        chai.approve(address(treasury), uint(-1));
        weth.approve(address(treasury), uint(-1));

        // for converting DAI to CHAI
        dai.approve(address(chai), uint(-1));

        vat.hope(address(daiJoin));
        vat.hope(address(wethJoin));

        dai.approve(address(daiJoin), uint(-1));
        weth.approve(address(wethJoin), uint(-1));
        weth.approve(address(treasury), uint(-1));

        // allow all the pools to pull FYDai/dai from us for LPing
        for (uint i = 0 ; i < _pools.length; i++) {
            dai.approve(address(_pools[i]), uint(-1));
            _pools[i].fyDai().approve(address(_pools[i]), uint(-1));
            poolsMap[address(_pools[i])]= true;
        }

        pools = _pools;
    }

    /// @dev Unpack r, s and v from a `bytes` signature
    function unpack(bytes memory signature) private pure returns (bytes32 r, bytes32 s, uint8 v) {
        assembly {
            r := mload(add(signature, 0x20))
            s := mload(add(signature, 0x40))
            v := byte(0, mload(add(signature, 0x60)))
        }
    }

    /// @dev Performs the initial onboarding of the user. It `permit`'s DAI to be used by the proxy, and adds the proxy as a delegate in the controller
    function onboard(address from, bytes memory daiSignature, bytes memory controllerSig) external {
        bytes32 r;
        bytes32 s;
        uint8 v;

        (r, s, v) = unpack(daiSignature);
        dai.permit(from, address(this), dai.nonces(from), uint(-1), true, v, r, s);

        (r, s, v) = unpack(controllerSig);
        controller.addDelegateBySignature(from, address(this), uint(-1), v, r, s);
    }

    /// @dev Given a pool and 3 signatures, it `permit`'s dai and fyDai for that pool and adds it as a delegate
    function authorizePool(IPool pool, address from, bytes memory daiSig, bytes memory fyDaiSig, bytes memory poolSig) public {
        onlyKnownPool(pool);
        bytes32 r;
        bytes32 s;
        uint8 v;

        (r, s, v) = unpack(daiSig);
        dai.permit(from, address(pool), dai.nonces(from), uint(-1), true, v, r, s);

        (r, s, v) = unpack(fyDaiSig);
        pool.fyDai().permit(from, address(this), uint(-1), uint(-1), v, r, s);

        (r, s, v) = unpack(poolSig);
        pool.addDelegateBySignature(from, address(this), uint(-1), v, r, s);
    }

    /// @dev The WETH9 contract will send ether to YieldProxy on `weth.withdraw` using this function.
    receive() external payable { }

    /// @dev Users use `post` in YieldProxy to post ETH to the Controller (amount = msg.value), which will be converted to Weth here.
    /// @param to Yield Vault to deposit collateral in.
    function post(address to)
        public payable {
        weth.deposit{ value: msg.value }();
        controller.post(WETH, address(this), to, msg.value);
    }

    /// @dev Users wishing to withdraw their Weth as ETH from the Controller should use this function.
    /// Users must have called `controller.addDelegate(yieldProxy.address)` to authorize YieldProxy to act in their behalf.
    /// @param to Wallet to send Eth to.
    /// @param amount Amount of weth to move.
    function withdraw(address payable to, uint256 amount)
        public {
        controller.withdraw(WETH, msg.sender, address(this), amount);
        weth.withdraw(amount);
        to.transfer(amount);
    }

    /// @dev Mints liquidity with provided Dai by borrowing fyDai with some of the Dai.
    /// Caller must have approved the proxy using`controller.addDelegate(yieldProxy)`
    /// Caller must have approved the dai transfer with `dai.approve(daiUsed)`
    /// @param daiUsed amount of Dai to use to mint liquidity. 
    /// @param maxFYDai maximum amount of fyDai to be borrowed to mint liquidity. 
    /// @return The amount of liquidity tokens minted.  
    function addLiquidity(IPool pool, uint256 daiUsed, uint256 maxFYDai) external returns (uint256) {
        onlyKnownPool(pool);
        IFYDai fyDai = pool.fyDai();
        require(fyDai.isMature() != true, "YieldProxy: Only before maturity");
        require(dai.transferFrom(msg.sender, address(this), daiUsed), "YieldProxy: Transfer Failed");

        // calculate needed fyDai
        uint256 daiReserves = dai.balanceOf(address(pool));
        uint256 fyDaiReserves = fyDai.balanceOf(address(pool));
        uint256 daiToAdd = daiUsed.mul(daiReserves).div(fyDaiReserves.add(daiReserves));
        uint256 daiToConvert = daiUsed.sub(daiToAdd);
        require(
            daiToConvert <= maxFYDai,
            "YieldProxy: maxFYDai exceeded"
        ); // 1 Dai == 1 fyDai

        // convert dai to chai and borrow needed fyDai
        chai.join(address(this), daiToConvert);
        // look at the balance of chai in dai to avoid rounding issues
        uint256 toBorrow = chai.dai(address(this));
        controller.post(CHAI, address(this), msg.sender, chai.balanceOf(address(this)));
        controller.borrow(CHAI, fyDai.maturity(), msg.sender, address(this), toBorrow);
        
        // mint liquidity tokens
        return pool.mint(address(this), msg.sender, daiToAdd);
    }

    /// @dev Burns tokens and sells Dai proceedings for fyDai. Pays as much debt as possible, then sells back any remaining fyDai for Dai. Then returns all Dai, and if there is no debt in the Controller, all posted Chai.
    /// Caller must have approved the proxy using`controller.addDelegate(yieldProxy)` and `pool.addDelegate(yieldProxy)`
    /// Caller must have approved the liquidity burn with `pool.approve(poolTokens)`
    /// @param poolTokens amount of pool tokens to burn. 
    /// @param minimumDaiPrice minimum fyDai/Dai price to be accepted when internally selling Dai.
    /// @param minimumFYDaiPrice minimum Dai/fyDai price to be accepted when internally selling fyDai.
    function removeLiquidityEarlyDaiPool(IPool pool, uint256 poolTokens, uint256 minimumDaiPrice, uint256 minimumFYDaiPrice) external {
        onlyKnownPool(pool);
        IFYDai fyDai = pool.fyDai();
        uint256 maturity = fyDai.maturity();
        (uint256 daiObtained, uint256 fyDaiObtained) = pool.burn(msg.sender, address(this), poolTokens);

        // Exchange Dai for fyDai to pay as much debt as possible
        uint256 fyDaiBought = pool.sellDai(address(this), address(this), daiObtained.toUint128());
        require(
            fyDaiBought >= muld(daiObtained, minimumDaiPrice),
            "YieldProxy: minimumDaiPrice not reached"
        );
        fyDaiObtained = fyDaiObtained.add(fyDaiBought);
        
        uint256 fyDaiUsed;
        if (fyDaiObtained > 0 && controller.debtFYDai(CHAI, maturity, msg.sender) > 0) {
            fyDaiUsed = controller.repayFYDai(CHAI, maturity, address(this), msg.sender, fyDaiObtained);
        }
        uint256 fyDaiRemaining = fyDaiObtained.sub(fyDaiUsed);

        if (fyDaiRemaining > 0) {// There is fyDai left, so exchange it for Dai to withdraw only Dai and Chai
            require(
                pool.sellFYDai(address(this), address(this), uint128(fyDaiRemaining)) >= muld(fyDaiRemaining, minimumFYDaiPrice),
                "YieldProxy: minimumFYDaiPrice not reached"
            );
        }
        withdrawAssets(fyDai);
    }

    /// @dev Burns tokens and repays debt with proceedings. Sells any excess fyDai for Dai, then returns all Dai, and if there is no debt in the Controller, all posted Chai.
    /// Caller must have approved the proxy using`controller.addDelegate(yieldProxy)` and `pool.addDelegate(yieldProxy)`
    /// Caller must have approved the liquidity burn with `pool.approve(poolTokens)`
    /// @param poolTokens amount of pool tokens to burn. 
    /// @param minimumFYDaiPrice minimum Dai/fyDai price to be accepted when internally selling fyDai.
    function removeLiquidityEarlyDaiFixed(IPool pool, uint256 poolTokens, uint256 minimumFYDaiPrice) external {
        onlyKnownPool(pool);
        IFYDai fyDai = pool.fyDai();
        uint256 maturity = fyDai.maturity();
        (uint256 daiObtained, uint256 fyDaiObtained) = pool.burn(msg.sender, address(this), poolTokens);

        uint256 fyDaiUsed;
        if (fyDaiObtained > 0 && controller.debtFYDai(CHAI, maturity, msg.sender) > 0) {
            fyDaiUsed = controller.repayFYDai(CHAI, maturity, address(this), msg.sender, fyDaiObtained);
        }

        uint256 fyDaiRemaining = fyDaiObtained.sub(fyDaiUsed);
        if (fyDaiRemaining == 0) { // We used all the fyDai, so probably there is debt left, so pay with Dai
            if (daiObtained > 0 && controller.debtFYDai(CHAI, maturity, msg.sender) > 0) {
                controller.repayDai(CHAI, maturity, address(this), msg.sender, daiObtained);
            }
        } else { // Exchange remaining fyDai for Dai to withdraw only Dai and Chai
            require(
                pool.sellFYDai(address(this), address(this), uint128(fyDaiRemaining)) >= muld(fyDaiRemaining, minimumFYDaiPrice),
                "YieldProxy: minimumFYDaiPrice not reached"
            );
        }
        withdrawAssets(fyDai);
    }

    /// @dev Burns tokens and repays fyDai debt after Maturity. 
    /// Caller must have approved the proxy using`controller.addDelegate(yieldProxy)`
    /// Caller must have approved the liquidity burn with `pool.approve(poolTokens)`
    /// @param poolTokens amount of pool tokens to burn.
    function removeLiquidityMature(IPool pool, uint256 poolTokens) external {
        onlyKnownPool(pool);
        IFYDai fyDai = pool.fyDai();
        uint256 maturity = fyDai.maturity();
        (uint256 daiObtained, uint256 fyDaiObtained) = pool.burn(msg.sender, address(this), poolTokens);
        if (fyDaiObtained > 0) {
            daiObtained = daiObtained.add(fyDai.redeem(address(this), address(this), fyDaiObtained));
        }
        
        // Repay debt
        if (daiObtained > 0 && controller.debtFYDai(CHAI, maturity, msg.sender) > 0) {
            controller.repayDai(CHAI, maturity, address(this), msg.sender, daiObtained);
        }
        withdrawAssets(fyDai);
    }

    /// @dev Return to caller all posted chai if there is no debt, converted to dai, plus any dai remaining in the contract.
    function withdrawAssets(IFYDai fyDai) internal {
        if (controller.debtFYDai(CHAI, fyDai.maturity(), msg.sender) == 0) {
            controller.withdraw(CHAI, msg.sender, address(this), controller.posted(CHAI, msg.sender));
            chai.exit(address(this), chai.balanceOf(address(this)));
        }
        require(dai.transfer(msg.sender, dai.balanceOf(address(this))), "YieldProxy: Dai Transfer Failed");
    }

    /// @dev Borrow fyDai from Controller and sell it immediately for Dai, for a maximum fyDai debt.
    /// Must have approved the operator with `controller.addDelegate(yieldProxy.address)`.
    /// @param collateral Valid collateral type.
    /// @param maturity Maturity of an added series
    /// @param to Wallet to send the resulting Dai to.
    /// @param maximumFYDai Maximum amount of FYDai to borrow.
    /// @param daiToBorrow Exact amount of Dai that should be obtained.
    function borrowDaiForMaximumFYDai(
        IPool pool,
        bytes32 collateral,
        uint256 maturity,
        address to,
        uint256 maximumFYDai,
        uint256 daiToBorrow
    )
        public
        returns (uint256)
    {
        onlyKnownPool(pool);
        uint256 fyDaiToBorrow = pool.buyDaiPreview(daiToBorrow.toUint128());
        require (fyDaiToBorrow <= maximumFYDai, "YieldProxy: Too much fyDai required");

        // The collateral for this borrow needs to have been posted beforehand
        controller.borrow(collateral, maturity, msg.sender, address(this), fyDaiToBorrow);
        pool.buyDai(address(this), to, daiToBorrow.toUint128());

        return fyDaiToBorrow;
    }

    /// @dev Borrow fyDai from Controller and sell it immediately for Dai, if a minimum amount of Dai can be obtained such.
    /// Must have approved the operator with `controller.addDelegate(yieldProxy.address)`.
    /// @param collateral Valid collateral type.
    /// @param maturity Maturity of an added series
    /// @param to Wallet to sent the resulting Dai to.
    /// @param fyDaiToBorrow Amount of fyDai to borrow.
    /// @param minimumDaiToBorrow Minimum amount of Dai that should be borrowed.
    function borrowMinimumDaiForFYDai(
        IPool pool,
        bytes32 collateral,
        uint256 maturity,
        address to,
        uint256 fyDaiToBorrow,
        uint256 minimumDaiToBorrow
    )
        public
        returns (uint256)
    {
        onlyKnownPool(pool);
        // The collateral for this borrow needs to have been posted beforehand
        controller.borrow(collateral, maturity, msg.sender, address(this), fyDaiToBorrow);
        uint256 boughtDai = pool.sellFYDai(address(this), to, fyDaiToBorrow.toUint128());
        require (boughtDai >= minimumDaiToBorrow, "YieldProxy: Not enough Dai obtained");

        return boughtDai;
    }

    /// @dev Repay an amount of fyDai debt in Controller using Dai exchanged for fyDai at pool rates, up to a maximum amount of Dai spent.
    /// Must have approved the operator with `pool.addDelegate(yieldProxy.address)`.
    /// If `fyDaiRepayment` exceeds the existing debt, only the necessary fyDai will be used.
    /// @param collateral Valid collateral type.
    /// @param maturity Maturity of an added series
    /// @param to Yield Vault to repay fyDai debt for.
    /// @param fyDaiRepayment Amount of fyDai debt to repay.
    /// @param maximumRepaymentInDai Maximum amount of Dai that should be spent on the repayment.
    function repayFYDaiDebtForMaximumDai(
        IPool pool,
        bytes32 collateral,
        uint256 maturity,
        address to,
        uint256 fyDaiRepayment,
        uint256 maximumRepaymentInDai
    )
        public
        returns (uint256)
    {
        onlyKnownPool(pool);
        uint256 fyDaiDebt = controller.debtFYDai(collateral, maturity, to);
        uint256 fyDaiToUse = fyDaiDebt < fyDaiRepayment ? fyDaiDebt : fyDaiRepayment; // Use no more fyDai than debt
        uint256 repaymentInDai = pool.buyFYDai(msg.sender, address(this), fyDaiToUse.toUint128());
        require (repaymentInDai <= maximumRepaymentInDai, "YieldProxy: Too much Dai required");
        controller.repayFYDai(collateral, maturity, address(this), to, fyDaiToUse);

        return repaymentInDai;
    }

    /// @dev Repay an amount of fyDai debt in Controller using a given amount of Dai exchanged for fyDai at pool rates, with a minimum of fyDai debt required to be paid.
    /// Must have approved the operator with `pool.addDelegate(yieldProxy.address)`.
    /// If `repaymentInDai` exceeds the existing debt, only the necessary Dai will be used.
    /// @param collateral Valid collateral type.
    /// @param maturity Maturity of an added series
    /// @param to Yield Vault to repay fyDai debt for.
    /// @param minimumFYDaiRepayment Minimum amount of fyDai debt to repay.
    /// @param repaymentInDai Exact amount of Dai that should be spent on the repayment.
    function repayMinimumFYDaiDebtForDai(
        IPool pool,
        bytes32 collateral,
        uint256 maturity,
        address to,
        uint256 minimumFYDaiRepayment,
        uint256 repaymentInDai
    )
        public
        returns (uint256)
    {
        onlyKnownPool(pool);
        uint256 fyDaiRepayment = pool.sellDaiPreview(repaymentInDai.toUint128());
        uint256 fyDaiDebt = controller.debtFYDai(collateral, maturity, to);
        if(fyDaiRepayment <= fyDaiDebt) { // Sell no more Dai than needed to cancel all the debt
            pool.sellDai(msg.sender, address(this), repaymentInDai.toUint128());
        } else { // If we have too much Dai, then don't sell it all and buy the exact amount of fyDai needed instead.
            pool.buyFYDai(msg.sender, address(this), fyDaiDebt.toUint128());
            fyDaiRepayment = fyDaiDebt;
        }
        require (fyDaiRepayment >= minimumFYDaiRepayment, "YieldProxy: Not enough fyDai debt repaid");
        controller.repayFYDai(collateral, maturity, address(this), to, fyDaiRepayment);

        return fyDaiRepayment;
    }

    /// @dev Sell Dai for fyDai
    /// @param to Wallet receiving the fyDai being bought
    /// @param daiIn Amount of dai being sold
    /// @param minFYDaiOut Minimum amount of fyDai being bought
    function sellDai(IPool pool, address to, uint128 daiIn, uint128 minFYDaiOut)
        external
        returns(uint256)
    {
        onlyKnownPool(pool);
        uint256 fyDaiOut = pool.sellDai(msg.sender, to, daiIn);
        require(
            fyDaiOut >= minFYDaiOut,
            "YieldProxy: Limit not reached"
        );
        return fyDaiOut;
    }

    /// @dev Buy Dai for fyDai
    /// @param to Wallet receiving the dai being bought
    /// @param daiOut Amount of dai being bought
    /// @param maxFYDaiIn Maximum amount of fyDai being sold
    function buyDai(IPool pool, address to, uint128 daiOut, uint128 maxFYDaiIn)
        public
        returns(uint256)
    {
        onlyKnownPool(pool);
        uint256 fyDaiIn = pool.buyDai(msg.sender, to, daiOut);
        require(
            maxFYDaiIn >= fyDaiIn,
            "YieldProxy: Limit exceeded"
        );
        return fyDaiIn;
    }

    /// @dev Buy Dai for fyDai and permits infinite fyDai to the pool
    /// @param to Wallet receiving the dai being bought
    /// @param daiOut Amount of dai being bought
    /// @param maxFYDaiIn Maximum amount of fyDai being sold
    /// @param signature The `permit` call's signature
    function buyDaiWithSignature(IPool pool, address to, uint128 daiOut, uint128 maxFYDaiIn, bytes memory signature)
        external
        returns(uint256)
    {
        onlyKnownPool(pool);
        (bytes32 r, bytes32 s, uint8 v) = unpack(signature);
        pool.fyDai().permit(msg.sender, address(pool), uint(-1), uint(-1), v, r, s);

        return buyDai(pool, to, daiOut, maxFYDaiIn);
    }

    /// @dev Sell fyDai for Dai
    /// @param to Wallet receiving the dai being bought
    /// @param fyDaiIn Amount of fyDai being sold
    /// @param minDaiOut Minimum amount of dai being bought
    function sellFYDai(IPool pool, address to, uint128 fyDaiIn, uint128 minDaiOut)
        public
        returns(uint256)
    {
        onlyKnownPool(pool);
        uint256 daiOut = pool.sellFYDai(msg.sender, to, fyDaiIn);
        require(
            daiOut >= minDaiOut,
            "YieldProxy: Limit not reached"
        );
        return daiOut;
    }

    /// @dev Sell fyDai for Dai and permits infinite Dai to the pool
    /// @param to Wallet receiving the dai being bought
    /// @param fyDaiIn Amount of fyDai being sold
    /// @param minDaiOut Minimum amount of dai being bought
    /// @param signature The `permit` call's signature
    function sellFYDaiWithSignature(IPool pool, address to, uint128 fyDaiIn, uint128 minDaiOut, bytes memory signature)
        external
        returns(uint256)
    {
        onlyKnownPool(pool);
        (bytes32 r, bytes32 s, uint8 v) = unpack(signature);
        pool.fyDai().permit(msg.sender, address(pool), uint(-1), uint(-1), v, r, s);

        return sellFYDai(pool, to, fyDaiIn, minDaiOut);
    }

    /// @dev Buy fyDai for dai
    /// @param to Wallet receiving the fyDai being bought
    /// @param fyDaiOut Amount of fyDai being bought
    /// @param maxDaiIn Maximum amount of dai being sold
    function buyFYDai(IPool pool, address to, uint128 fyDaiOut, uint128 maxDaiIn)
        external
        returns(uint256)
    {
        onlyKnownPool(pool);
        uint256 daiIn = pool.buyFYDai(msg.sender, to, fyDaiOut);
        require(
            maxDaiIn >= daiIn,
            "YieldProxy: Limit exceeded"
        );
        return daiIn;
    }

    /// @dev Burns Dai from caller to repay debt in a Yield Vault.
    /// User debt is decreased for the given collateral and fyDai series, in Yield vault `to`.
    /// The amount of debt repaid changes according to series maturity and MakerDAO rate and chi, depending on collateral type.
    /// `A signature is provided as a parameter to this function, so that `dai.approve()` doesn't need to be called.
    /// @param collateral Valid collateral type.
    /// @param maturity Maturity of an added series
    /// @param to Yield vault to repay debt for.
    /// @param daiAmount Amount of Dai to use for debt repayment.
    /// @param signature The `permit` call's signature
    function repayDaiWithSignature(bytes32 collateral, uint256 maturity, address to, uint256 daiAmount, bytes memory signature)
        external
        returns(uint256)
    {
        (bytes32 r, bytes32 s, uint8 v) = unpack(signature);
        dai.permit(msg.sender, address(treasury), dai.nonces(msg.sender), uint(-1), true, v, r, s);
        controller.repayDai(collateral, maturity, msg.sender, to, daiAmount);
    }

    function onlyKnownPool(IPool pool) private view {
        require(poolsMap[address(pool)], "YieldProxy: Unknown pool");
    }
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"address","name":"controller_","type":"address"},{"internalType":"contract IPool[]","name":"_pools","type":"address[]"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"CHAI","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MTY","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"UNIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WETH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"YTM","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IPool","name":"pool","type":"address"},{"internalType":"uint256","name":"daiUsed","type":"uint256"},{"internalType":"uint256","name":"maxFYDai","type":"uint256"}],"name":"addLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IPool","name":"pool","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"bytes","name":"daiSig","type":"bytes"},{"internalType":"bytes","name":"fyDaiSig","type":"bytes"},{"internalType":"bytes","name":"poolSig","type":"bytes"}],"name":"authorizePool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IPool","name":"pool","type":"address"},{"internalType":"bytes32","name":"collateral","type":"bytes32"},{"internalType":"uint256","name":"maturity","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"maximumFYDai","type":"uint256"},{"internalType":"uint256","name":"daiToBorrow","type":"uint256"}],"name":"borrowDaiForMaximumFYDai","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IPool","name":"pool","type":"address"},{"internalType":"bytes32","name":"collateral","type":"bytes32"},{"internalType":"uint256","name":"maturity","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"fyDaiToBorrow","type":"uint256"},{"internalType":"uint256","name":"minimumDaiToBorrow","type":"uint256"}],"name":"borrowMinimumDaiForFYDai","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IPool","name":"pool","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint128","name":"daiOut","type":"uint128"},{"internalType":"uint128","name":"maxFYDaiIn","type":"uint128"}],"name":"buyDai","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IPool","name":"pool","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint128","name":"daiOut","type":"uint128"},{"internalType":"uint128","name":"maxFYDaiIn","type":"uint128"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"buyDaiWithSignature","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IPool","name":"pool","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint128","name":"fyDaiOut","type":"uint128"},{"internalType":"uint128","name":"maxDaiIn","type":"uint128"}],"name":"buyFYDai","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"chai","outputs":[{"internalType":"contract IChai","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"controller","outputs":[{"internalType":"contract IController","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dai","outputs":[{"internalType":"contract IDai","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"daiJoin","outputs":[{"internalType":"contract IDaiJoin","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"bytes","name":"daiSignature","type":"bytes"},{"internalType":"bytes","name":"controllerSig","type":"bytes"}],"name":"onboard","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"pools","outputs":[{"internalType":"contract IPool","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"poolsMap","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"post","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"contract IPool","name":"pool","type":"address"},{"internalType":"uint256","name":"poolTokens","type":"uint256"},{"internalType":"uint256","name":"minimumFYDaiPrice","type":"uint256"}],"name":"removeLiquidityEarlyDaiFixed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IPool","name":"pool","type":"address"},{"internalType":"uint256","name":"poolTokens","type":"uint256"},{"internalType":"uint256","name":"minimumDaiPrice","type":"uint256"},{"internalType":"uint256","name":"minimumFYDaiPrice","type":"uint256"}],"name":"removeLiquidityEarlyDaiPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IPool","name":"pool","type":"address"},{"internalType":"uint256","name":"poolTokens","type":"uint256"}],"name":"removeLiquidityMature","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"collateral","type":"bytes32"},{"internalType":"uint256","name":"maturity","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"daiAmount","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"repayDaiWithSignature","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IPool","name":"pool","type":"address"},{"internalType":"bytes32","name":"collateral","type":"bytes32"},{"internalType":"uint256","name":"maturity","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"fyDaiRepayment","type":"uint256"},{"internalType":"uint256","name":"maximumRepaymentInDai","type":"uint256"}],"name":"repayFYDaiDebtForMaximumDai","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IPool","name":"pool","type":"address"},{"internalType":"bytes32","name":"collateral","type":"bytes32"},{"internalType":"uint256","name":"maturity","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"minimumFYDaiRepayment","type":"uint256"},{"internalType":"uint256","name":"repaymentInDai","type":"uint256"}],"name":"repayMinimumFYDaiDebtForDai","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IPool","name":"pool","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint128","name":"daiIn","type":"uint128"},{"internalType":"uint128","name":"minFYDaiOut","type":"uint128"}],"name":"sellDai","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IPool","name":"pool","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint128","name":"fyDaiIn","type":"uint128"},{"internalType":"uint128","name":"minDaiOut","type":"uint128"}],"name":"sellFYDai","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IPool","name":"pool","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint128","name":"fyDaiIn","type":"uint128"},{"internalType":"uint128","name":"minDaiOut","type":"uint128"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"sellFYDaiWithSignature","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasury","outputs":[{"internalType":"contract ITreasury","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vat","outputs":[{"internalType":"contract IVat","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"weth","outputs":[{"internalType":"contract IWeth","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wethJoin","outputs":[{"internalType":"contract IGemJoin","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040523480156200001157600080fd5b5060405162004e6c38038062004e6c833981810160405260408110156200003757600080fd5b8151602083018051604051929492938301929190846401000000008211156200005f57600080fd5b9083019060208201858111156200007557600080fd5b82518660208202830111640100000000821117156200009357600080fd5b82525081516020918201928201910280838360005b83811015620000c2578181015183820152602001620000a8565b50505050919091016040818152600680546001600160a01b0319166001600160a01b038a811691909117918290556361d027b360e01b84529151911695506361d027b3945060048083019450602093509091829003018186803b1580156200012957600080fd5b505afa1580156200013e573d6000803e3d6000fd5b505050506040513d60208110156200015557600080fd5b5051600780546001600160a01b0319166001600160a01b03928316179081905560408051633fc8cef360e01b815290519190921691633fc8cef3916004808301926020929190829003018186803b158015620001b057600080fd5b505afa158015620001c5573d6000803e3d6000fd5b505050506040513d6020811015620001dc57600080fd5b5051600180546001600160a01b0319166001600160a01b039283161790556007546040805163f4b9fa7560e01b81529051919092169163f4b9fa75916004808301926020929190829003018186803b1580156200023857600080fd5b505afa1580156200024d573d6000803e3d6000fd5b505050506040513d60208110156200026457600080fd5b5051600280546001600160a01b0319166001600160a01b0392831617905560075460408051635b4e822b60e11b81529051919092169163b69d0456916004808301926020929190829003018186803b158015620002c057600080fd5b505afa158015620002d5573d6000803e3d6000fd5b505050506040513d6020811015620002ec57600080fd5b5051600580546001600160a01b0319166001600160a01b0392831617905560075460408051633045916f60e21b81529051919092169163c11645bc916004808301926020929190829003018186803b1580156200034857600080fd5b505afa1580156200035d573d6000803e3d6000fd5b505050506040513d60208110156200037457600080fd5b5051600480546001600160a01b0319166001600160a01b0392831617815560075460408051632dbacef360e01b815290519190931692632dbacef39281810192602092909190829003018186803b158015620003cf57600080fd5b505afa158015620003e4573d6000803e3d6000fd5b505050506040513d6020811015620003fb57600080fd5b5051600380546001600160a01b0319166001600160a01b03928316179055600754604080516336569e7760e01b8152905191909216916336569e77916004808301926020929190829003018186803b1580156200045757600080fd5b505afa1580156200046c573d6000803e3d6000fd5b505050506040513d60208110156200048357600080fd5b5051600080546001600160a01b0319166001600160a01b039283161781556002546007546040805163095ea7b360e01b81529185166004830152600019602483015251919093169263095ea7b39260448083019360209390929083900390910190829087803b158015620004f657600080fd5b505af11580156200050b573d6000803e3d6000fd5b505050506040513d60208110156200052257600080fd5b50506005546007546040805163095ea7b360e01b81526001600160a01b03928316600482015260001960248201529051919092169163095ea7b39160448083019260209291908290030181600087803b1580156200057f57600080fd5b505af115801562000594573d6000803e3d6000fd5b505050506040513d6020811015620005ab57600080fd5b50506001546007546040805163095ea7b360e01b81526001600160a01b03928316600482015260001960248201529051919092169163095ea7b39160448083019260209291908290030181600087803b1580156200060857600080fd5b505af11580156200061d573d6000803e3d6000fd5b505050506040513d60208110156200063457600080fd5b50506002546005546040805163095ea7b360e01b81526001600160a01b03928316600482015260001960248201529051919092169163095ea7b39160448083019260209291908290030181600087803b1580156200069157600080fd5b505af1158015620006a6573d6000803e3d6000fd5b505050506040513d6020811015620006bd57600080fd5b50506000805460048054604080516328ec8bf160e21b81526001600160a01b03928316938101939093525192169263a3b22fc49260248084019382900301818387803b1580156200070d57600080fd5b505af115801562000722573d6000803e3d6000fd5b505060008054600354604080516328ec8bf160e21b81526001600160a01b039283166004820152905191909216945063a3b22fc493506024808301939282900301818387803b1580156200077557600080fd5b505af11580156200078a573d6000803e3d6000fd5b5050600254600480546040805163095ea7b360e01b81526001600160a01b03928316938101939093526000196024840152519216935063095ea7b392506044808201926020929091908290030181600087803b158015620007ea57600080fd5b505af1158015620007ff573d6000803e3d6000fd5b505050506040513d60208110156200081657600080fd5b50506001546003546040805163095ea7b360e01b81526001600160a01b03928316600482015260001960248201529051919092169163095ea7b39160448083019260209291908290030181600087803b1580156200087357600080fd5b505af115801562000888573d6000803e3d6000fd5b505050506040513d60208110156200089f57600080fd5b50506001546007546040805163095ea7b360e01b81526001600160a01b03928316600482015260001960248201529051919092169163095ea7b39160448083019260209291908290030181600087803b158015620008fc57600080fd5b505af115801562000911573d6000803e3d6000fd5b505050506040513d60208110156200092857600080fd5b50600090505b815181101562000b605760025482516001600160a01b039091169063095ea7b3908490849081106200095c57fe5b60200260200101516000196040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015620009b757600080fd5b505af1158015620009cc573d6000803e3d6000fd5b505050506040513d6020811015620009e357600080fd5b50508151829082908110620009f457fe5b60200260200101516001600160a01b031663284f44446040518163ffffffff1660e01b815260040160206040518083038186803b15801562000a3557600080fd5b505afa15801562000a4a573d6000803e3d6000fd5b505050506040513d602081101562000a6157600080fd5b505182516001600160a01b039091169063095ea7b39084908490811062000a8457fe5b60200260200101516000196040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801562000adf57600080fd5b505af115801562000af4573d6000803e3d6000fd5b505050506040513d602081101562000b0b57600080fd5b5050815160019060099060009085908590811062000b2557fe5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff19169115159190911790556001016200092e565b50805162000b7690600890602084019062000b7f565b50505062000c13565b82805482825590600052602060002090810192821562000bd7579160200282015b8281111562000bd757825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019062000ba0565b5062000be592915062000be9565b5090565b62000c1091905b8082111562000be55780546001600160a01b031916815560010162000bf0565b90565b6142498062000c236000396000f3fe6080604052600436106101fd5760003560e01c80639d8e21771161010d578063c11645bc116100a0578063d43bb0591161006f578063d43bb05914610c60578063d6dd8a8914610cb5578063f3fef3a314610d09578063f4b9fa7514610d42578063f77c479114610d5757610204565b8063c11645bc14610b8d578063c43a860814610ba2578063c452963314610bb7578063cc53d7bf14610c0c57610204565b8063ae70747c116100dc578063ae70747c14610ad6578063b69d045614610b2a578063b6dbf9ce14610b3f578063b8fde75014610b5457610204565b80639d8e217714610a5c578063a536362714610a71578063ac4afa3814610a97578063ad5c464814610ac157610204565b8063572d9c4f116101905780636f7952251161015f5780636f795225146106f457806374191001146108c85780637e3d4cfa1461091d5780638ba1d1c91461094657806390c140db1461097957610204565b8063572d9c4f1461056857806361d027b3146105a75780636c223e95146105bc5780636d9d1d981461061157610204565b806336569e77116101cc57806336569e77146104ba57806336b4f5bd146104cf5780633fc8cef31461051457806355776b771461052957610204565b8063081129a61461020957806329d7d663146103515780632dbacef31461043557806330b4b0751461046657610204565b3661020457005b600080fd5b34801561021557600080fd5b5061034f6004803603606081101561022c57600080fd5b6001600160a01b038235169190810190604081016020820135600160201b81111561025657600080fd5b82018360208201111561026857600080fd5b803590602001918460018302840111600160201b8311171561028957600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b8111156102db57600080fd5b8201836020820111156102ed57600080fd5b803590602001918460018302840111600160201b8311171561030e57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610d6c945050505050565b005b34801561035d57600080fd5b50610423600480360360a081101561037457600080fd5b8135916020810135916001600160a01b036040830135169160608101359181019060a081016080820135600160201b8111156103af57600080fd5b8201836020820111156103c157600080fd5b803590602001918460018302840111600160201b831117156103e257600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610f3c945050505050565b60408051918252519081900360200190f35b34801561044157600080fd5b5061044a611112565b604080516001600160a01b039092168252519081900360200190f35b34801561047257600080fd5b506104236004803603608081101561048957600080fd5b506001600160a01b0381358116916020810135909116906001600160801b0360408201358116916060013516611121565b3480156104c657600080fd5b5061044a611225565b3480156104db57600080fd5b5061034f600480360360808110156104f257600080fd5b506001600160a01b038135169060208101359060408101359060600135611234565b34801561052057600080fd5b5061044a6116f7565b34801561053557600080fd5b506104236004803603606081101561054c57600080fd5b506001600160a01b038135169060208101359060400135611706565b34801561057457600080fd5b5061034f6004803603606081101561058b57600080fd5b506001600160a01b038135169060208101359060400135611e2d565b3480156105b357600080fd5b5061044a61231e565b3480156105c857600080fd5b50610423600480360360c08110156105df57600080fd5b506001600160a01b03813581169160208101359160408201359160608101359091169060808101359060a0013561232d565b34801561061d57600080fd5b50610423600480360360a081101561063457600080fd5b6001600160a01b0382358116926020810135909116916001600160801b03604083013581169260608101359091169181019060a081016080820135600160201b81111561068057600080fd5b82018360208201111561069257600080fd5b803590602001918460018302840111600160201b831117156106b357600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506124b3945050505050565b34801561070057600080fd5b5061034f600480360360a081101561071757600080fd5b6001600160a01b038235811692602081013590911691810190606081016040820135600160201b81111561074a57600080fd5b82018360208201111561075c57600080fd5b803590602001918460018302840111600160201b8311171561077d57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b8111156107cf57600080fd5b8201836020820111156107e157600080fd5b803590602001918460018302840111600160201b8311171561080257600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b81111561085457600080fd5b82018360208201111561086657600080fd5b803590602001918460018302840111600160201b8311171561088757600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506125df945050505050565b3480156108d457600080fd5b50610423600480360360c08110156108eb57600080fd5b506001600160a01b03813581169160208101359160408201359160608101359091169060808101359060a001356128c1565b34801561092957600080fd5b50610932612ad2565b604080519115158252519081900360200190f35b34801561095257600080fd5b506109326004803603602081101561096957600080fd5b50356001600160a01b0316612ad7565b34801561098557600080fd5b50610423600480360360a081101561099c57600080fd5b6001600160a01b0382358116926020810135909116916001600160801b03604083013581169260608101359091169181019060a081016080820135600160201b8111156109e857600080fd5b8201836020820111156109fa57600080fd5b803590602001918460018302840111600160201b83111715610a1b57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550612aec945050505050565b348015610a6857600080fd5b50610423612c0b565b61034f60048036036020811015610a8757600080fd5b50356001600160a01b0316612c1b565b348015610aa357600080fd5b5061044a60048036036020811015610aba57600080fd5b5035612d05565b348015610acd57600080fd5b50610423612d2c565b348015610ae257600080fd5b5061042360048036036080811015610af957600080fd5b506001600160a01b0381358116916020810135909116906001600160801b0360408201358116916060013516612d38565b348015610b3657600080fd5b5061044a612e33565b348015610b4b57600080fd5b50610423612e42565b348015610b6057600080fd5b5061034f60048036036040811015610b7757600080fd5b506001600160a01b038135169060200135612e4d565b348015610b9957600080fd5b5061044a6131a5565b348015610bae57600080fd5b506109326131b4565b348015610bc357600080fd5b50610423600480360360c0811015610bda57600080fd5b506001600160a01b03813581169160208101359160408201359160608101359091169060808101359060a001356131b9565b348015610c1857600080fd5b5061042360048036036080811015610c2f57600080fd5b506001600160a01b0381358116916020810135909116906001600160801b0360408201358116916060013516613528565b348015610c6c57600080fd5b50610423600480360360c0811015610c8357600080fd5b506001600160a01b03813581169160208101359160408201359160608101359091169060808101359060a00135613594565b348015610cc157600080fd5b5061042360048036036080811015610cd857600080fd5b506001600160a01b0381358116916020810135909116906001600160801b03604082013581169160600135166137d4565b348015610d1557600080fd5b5061034f60048036036040811015610d2c57600080fd5b506001600160a01b038135169060200135613840565b348015610d4e57600080fd5b5061044a61395f565b348015610d6357600080fd5b5061044a61396e565b6000806000610d7a8561397d565b60025460408051623f675f60e91b81526001600160a01b038c8116600483015291519598509396509194501691638fcbaf0c91899130918591637ecebe0091602480820192602092909190829003018186803b158015610dd957600080fd5b505afa158015610ded573d6000803e3d6000fd5b505050506040513d6020811015610e0357600080fd5b5051604080516001600160e01b031960e087901b1681526001600160a01b039485166004820152929093166024830152604482015260001960648201526001608482015260ff851660a482015260c4810187905260e48101869052905161010480830192600092919082900301818387803b158015610e8157600080fd5b505af1158015610e95573d6000803e3d6000fd5b50505050610ea28461397d565b60065460408051631a28ff0560e01b81526001600160a01b038c81166004830152306024830152600019604483015260ff851660648301526084820187905260a4820186905291519598509396509194501691631a28ff059160c48082019260009290919082900301818387803b158015610f1c57600080fd5b505af1158015610f30573d6000803e3d6000fd5b50505050505050505050565b600080600080610f4b8561397d565b60025460075460408051623f675f60e91b8152336004820181905291519699509497509295506001600160a01b0391821694638fcbaf0c9491909216918591637ecebe00916024808301926020929190829003018186803b158015610faf57600080fd5b505afa158015610fc3573d6000803e3d6000fd5b505050506040513d6020811015610fd957600080fd5b5051604080516001600160e01b031960e087901b1681526001600160a01b039485166004820152929093166024830152604482015260001960648201526001608482015260ff851660a482015260c4810187905260e48101869052905161010480830192600092919082900301818387803b15801561105757600080fd5b505af115801561106b573d6000803e3d6000fd5b5050600654604080516325d3cd1760e01b8152600481018e9052602481018d90523360448201526001600160a01b038c81166064830152608482018c905291519190921693506325d3cd17925060a48083019260209291908290030181600087803b1580156110d957600080fd5b505af11580156110ed573d6000803e3d6000fd5b505050506040513d602081101561110357600080fd5b50939998505050505050505050565b6003546001600160a01b031681565b600061112c85613998565b60408051631d50f8e760e21b81523360048201526001600160a01b0386811660248301526001600160801b03861660448301529151600092881691637543e39c91606480830192602092919082900301818787803b15801561118d57600080fd5b505af11580156111a1573d6000803e3d6000fd5b505050506040513d60208110156111b757600080fd5b50516001600160801b039081169150831681111561121c576040805162461bcd60e51b815260206004820152601a60248201527f5969656c6450726f78793a204c696d6974206578636565646564000000000000604482015290519081900360640190fd5b95945050505050565b6000546001600160a01b031681565b61123d84613998565b6000846001600160a01b031663284f44446040518163ffffffff1660e01b815260040160206040518083038186803b15801561127857600080fd5b505afa15801561128c573d6000803e3d6000fd5b505050506040513d60208110156112a257600080fd5b50516040805163204f83f960e01b815290519192506000916001600160a01b0384169163204f83f9916004808301926020929190829003018186803b1580156112ea57600080fd5b505afa1580156112fe573d6000803e3d6000fd5b505050506040513d602081101561131457600080fd5b505160408051633dae446f60e21b815233600482015230602482015260448101889052815192935060009283926001600160a01b038b169263f6b911bc926064808301939282900301818787803b15801561136e57600080fd5b505af1158015611382573d6000803e3d6000fd5b505050506040513d604081101561139857600080fd5b508051602090910151909250905060006001600160a01b03891663b26be92230806113c287613a08565b604080516001600160e01b031960e087901b1681526001600160a01b0394851660048201529290931660248301526001600160801b03166044820152905160648083019260209291908290030181600087803b15801561142157600080fd5b505af1158015611435573d6000803e3d6000fd5b505050506040513d602081101561144b57600080fd5b50516001600160801b031690506114628388613a6a565b8110156114a05760405162461bcd60e51b81526004018080602001828103825260278152602001806141146027913960400191505060405180910390fd5b6114b0828263ffffffff613a9516565b91506000808311801561154b5750600654604080516324c94bb560e21b8152634348414960e01b60048201526024810188905233604482015290516000926001600160a01b0316916393252ed4916064808301926020929190829003018186803b15801561151d57600080fd5b505afa158015611531573d6000803e3d6000fd5b505050506040513d602081101561154757600080fd5b5051115b156115ed576006546040805163b93dd41d60e01b8152634348414960e01b6004820152602481018890523060448201523360648201526084810186905290516001600160a01b039092169163b93dd41d9160a4808201926020929091908290030181600087803b1580156115be57600080fd5b505af11580156115d2573d6000803e3d6000fd5b505050506040513d60208110156115e857600080fd5b505190505b60006115ff848363ffffffff613aef16565b905080156116e1576116118189613a6a565b604080516360561e0560e01b8152306004820181905260248201526001600160801b038416604482015290516001600160a01b038e16916360561e059160648083019260209291908290030181600087803b15801561166f57600080fd5b505af1158015611683573d6000803e3d6000fd5b505050506040513d602081101561169957600080fd5b50516001600160801b031610156116e15760405162461bcd60e51b815260040180806020018281038252602981526020018061417f6029913960400191505060405180910390fd5b6116ea87613b31565b5050505050505050505050565b6001546001600160a01b031681565b600061171184613998565b6000846001600160a01b031663284f44446040518163ffffffff1660e01b815260040160206040518083038186803b15801561174c57600080fd5b505afa158015611760573d6000803e3d6000fd5b505050506040513d602081101561177657600080fd5b50516040805163ae4e7fdf60e01b815290519192506001600160a01b0383169163ae4e7fdf91600480820192602092909190829003018186803b1580156117bc57600080fd5b505afa1580156117d0573d6000803e3d6000fd5b505050506040513d60208110156117e657600080fd5b505115156001141561183f576040805162461bcd60e51b815260206004820181905260248201527f5969656c6450726f78793a204f6e6c79206265666f7265206d61747572697479604482015290519081900360640190fd5b600254604080516323b872dd60e01b81523360048201523060248201526044810187905290516001600160a01b03909216916323b872dd916064808201926020929091908290030181600087803b15801561189957600080fd5b505af11580156118ad573d6000803e3d6000fd5b505050506040513d60208110156118c357600080fd5b5051611916576040805162461bcd60e51b815260206004820152601b60248201527f5969656c6450726f78793a205472616e73666572204661696c65640000000000604482015290519081900360640190fd5b600254604080516370a0823160e01b81526001600160a01b038881166004830152915160009392909216916370a0823191602480820192602092909190829003018186803b15801561196757600080fd5b505afa15801561197b573d6000803e3d6000fd5b505050506040513d602081101561199157600080fd5b5051604080516370a0823160e01b81526001600160a01b0389811660048301529151929350600092918516916370a0823191602480820192602092909190829003018186803b1580156119e357600080fd5b505afa1580156119f7573d6000803e3d6000fd5b505050506040513d6020811015611a0d57600080fd5b505190506000611a42611a26838563ffffffff613a9516565b611a36898663ffffffff613f7c16565b9063ffffffff613fd516565b90506000611a56888363ffffffff613aef16565b905086811115611aad576040805162461bcd60e51b815260206004820152601d60248201527f5969656c6450726f78793a206d61784659446169206578636565646564000000604482015290519081900360640190fd5b60055460408051633b4da69f60e01b81523060048201526024810184905290516001600160a01b0390921691633b4da69f9160448082019260009290919082900301818387803b158015611b0057600080fd5b505af1158015611b14573d6000803e3d6000fd5b505060055460408051633612d9a360e11b81523060048201529051600094506001600160a01b039092169250636c25b34691602480830192602092919082900301818787803b158015611b6657600080fd5b505af1158015611b7a573d6000803e3d6000fd5b505050506040513d6020811015611b9057600080fd5b5051600654600554604080516370a0823160e01b8152306004820181905291519495506001600160a01b039384169463adb9e54e94634348414960e01b9433939116916370a0823191602480820192602092909190829003018186803b158015611bf957600080fd5b505afa158015611c0d573d6000803e3d6000fd5b505050506040513d6020811015611c2357600080fd5b5051604080516001600160e01b031960e088901b16815260048101959095526001600160a01b039384166024860152919092166044840152606483019190915251608480830192600092919082900301818387803b158015611c8457600080fd5b505af1158015611c98573d6000803e3d6000fd5b50505050600660009054906101000a90046001600160a01b03166001600160a01b031663801d325f634348414960e01b886001600160a01b031663204f83f96040518163ffffffff1660e01b815260040160206040518083038186803b158015611d0157600080fd5b505afa158015611d15573d6000803e3d6000fd5b505050506040513d6020811015611d2b57600080fd5b5051604080516001600160e01b031960e086901b16815260048101939093526024830191909152336044830152306064830152608482018590525160a480830192600092919082900301818387803b158015611d8657600080fd5b505af1158015611d9a573d6000803e3d6000fd5b505060408051636361ddf360e11b81523060048201523360248201526044810187905290516001600160a01b038e16935063c6c3bbe6925060648083019260209291908290030181600087803b158015611df357600080fd5b505af1158015611e07573d6000803e3d6000fd5b505050506040513d6020811015611e1d57600080fd5b50519a9950505050505050505050565b611e3683613998565b6000836001600160a01b031663284f44446040518163ffffffff1660e01b815260040160206040518083038186803b158015611e7157600080fd5b505afa158015611e85573d6000803e3d6000fd5b505050506040513d6020811015611e9b57600080fd5b50516040805163204f83f960e01b815290519192506000916001600160a01b0384169163204f83f9916004808301926020929190829003018186803b158015611ee357600080fd5b505afa158015611ef7573d6000803e3d6000fd5b505050506040513d6020811015611f0d57600080fd5b505160408051633dae446f60e21b815233600482015230602482015260448101879052815192935060009283926001600160a01b038a169263f6b911bc926064808301939282900301818787803b158015611f6757600080fd5b505af1158015611f7b573d6000803e3d6000fd5b505050506040513d6040811015611f9157600080fd5b5080516020909101519092509050600081158015906120385750600654604080516324c94bb560e21b8152634348414960e01b60048201526024810187905233604482015290516000926001600160a01b0316916393252ed4916064808301926020929190829003018186803b15801561200a57600080fd5b505afa15801561201e573d6000803e3d6000fd5b505050506040513d602081101561203457600080fd5b5051115b156120da576006546040805163b93dd41d60e01b8152634348414960e01b6004820152602481018790523060448201523360648201526084810185905290516001600160a01b039092169163b93dd41d9160a4808201926020929091908290030181600087803b1580156120ab57600080fd5b505af11580156120bf573d6000803e3d6000fd5b505050506040513d60208110156120d557600080fd5b505190505b60006120ec838363ffffffff613aef16565b9050806122305760008411801561218b5750600654604080516324c94bb560e21b8152634348414960e01b60048201526024810188905233604482015290516000926001600160a01b0316916393252ed4916064808301926020929190829003018186803b15801561215d57600080fd5b505afa158015612171573d6000803e3d6000fd5b505050506040513d602081101561218757600080fd5b5051115b1561222b57600654604080516325d3cd1760e01b8152634348414960e01b6004820152602481018890523060448201523360648201526084810187905290516001600160a01b03909216916325d3cd179160a4808201926020929091908290030181600087803b1580156121fe57600080fd5b505af1158015612212573d6000803e3d6000fd5b505050506040513d602081101561222857600080fd5b50505b61230a565b61223a8188613a6a565b604080516360561e0560e01b8152306004820181905260248201526001600160801b038416604482015290516001600160a01b038c16916360561e059160648083019260209291908290030181600087803b15801561229857600080fd5b505af11580156122ac573d6000803e3d6000fd5b505050506040513d60208110156122c257600080fd5b50516001600160801b0316101561230a5760405162461bcd60e51b815260040180806020018281038252602981526020018061417f6029913960400191505060405180910390fd5b61231386613b31565b505050505050505050565b6007546001600160a01b031681565b600061233887613998565b6006546040805163801d325f60e01b815260048101899052602481018890523360448201523060648201526084810186905290516001600160a01b039092169163801d325f9160a48082019260009290919082900301818387803b15801561239f57600080fd5b505af11580156123b3573d6000803e3d6000fd5b505050506000876001600160a01b03166360561e0530876123d388613a08565b604080516001600160e01b031960e087901b1681526001600160a01b0394851660048201529290931660248301526001600160801b03166044820152905160648083019260209291908290030181600087803b15801561243257600080fd5b505af1158015612446573d6000803e3d6000fd5b505050506040513d602081101561245c57600080fd5b50516001600160801b03169050828110156124a85760405162461bcd60e51b815260040180806020018281038252602381526020018061415c6023913960400191505060405180910390fd5b979650505050505050565b60006124be86613998565b60008060006124cc8561397d565b925092509250886001600160a01b031663284f44446040518163ffffffff1660e01b815260040160206040518083038186803b15801561250b57600080fd5b505afa15801561251f573d6000803e3d6000fd5b505050506040513d602081101561253557600080fd5b50516040805163d505accf60e01b81523360048201526001600160a01b038c8116602483015260001960448301819052606483015260ff8516608483015260a4820187905260c482018690529151919092169163d505accf9160e480830192600092919082900301818387803b1580156125ae57600080fd5b505af11580156125c2573d6000803e3d6000fd5b505050506125d289898989613528565b9998505050505050505050565b6125e885613998565b60008060006125f68661397d565b60025460408051623f675f60e91b81526001600160a01b038d8116600483015291519598509396509194501691638fcbaf0c918a918c918591637ecebe0091602480820192602092909190829003018186803b15801561265557600080fd5b505afa158015612669573d6000803e3d6000fd5b505050506040513d602081101561267f57600080fd5b5051604080516001600160e01b031960e087901b1681526001600160a01b039485166004820152929093166024830152604482015260001960648201526001608482015260ff851660a482015260c4810187905260e48101869052905161010480830192600092919082900301818387803b1580156126fd57600080fd5b505af1158015612711573d6000803e3d6000fd5b5050505061271e8561397d565b809350819450829550505050876001600160a01b031663284f44446040518163ffffffff1660e01b815260040160206040518083038186803b15801561276357600080fd5b505afa158015612777573d6000803e3d6000fd5b505050506040513d602081101561278d57600080fd5b50516040805163d505accf60e01b81526001600160a01b038a8116600483015230602483015260001960448301819052606483015260ff8516608483015260a4820187905260c482018690529151919092169163d505accf9160e480830192600092919082900301818387803b15801561280657600080fd5b505af115801561281a573d6000803e3d6000fd5b505050506128278461397d565b60408051631a28ff0560e01b81526001600160a01b038c81166004830152306024830152600019604483015260ff841660648301526084820186905260a4820185905291519497509295509093508a1691631a28ff059160c48082019260009290919082900301818387803b15801561289f57600080fd5b505af11580156128b3573d6000803e3d6000fd5b505050505050505050505050565b60006128cc87613998565b6000876001600160a01b0316634e20e9526128e685613a08565b6040518263ffffffff1660e01b815260040180826001600160801b03166001600160801b0316815260200191505060206040518083038186803b15801561292c57600080fd5b505afa158015612940573d6000803e3d6000fd5b505050506040513d602081101561295657600080fd5b50516001600160801b03169050838111156129a25760405162461bcd60e51b81526004018080602001828103825260238152602001806141a86023913960400191505060405180910390fd5b6006546040805163801d325f60e01b8152600481018a9052602481018990523360448201523060648201526084810184905290516001600160a01b039092169163801d325f9160a48082019260009290919082900301818387803b158015612a0957600080fd5b505af1158015612a1d573d6000803e3d6000fd5b50505050876001600160a01b031663cc5783d33087612a3b87613a08565b604080516001600160e01b031960e087901b1681526001600160a01b0394851660048201529290931660248301526001600160801b03166044820152905160648083019260209291908290030181600087803b158015612a9a57600080fd5b505af1158015612aae573d6000803e3d6000fd5b505050506040513d6020811015612ac457600080fd5b509098975050505050505050565b600181565b60096020526000908152604090205460ff1681565b6000612af786613998565b6000806000612b058561397d565b925092509250886001600160a01b031663284f44446040518163ffffffff1660e01b815260040160206040518083038186803b158015612b4457600080fd5b505afa158015612b58573d6000803e3d6000fd5b505050506040513d6020811015612b6e57600080fd5b50516040805163d505accf60e01b81523360048201526001600160a01b038c8116602483015260001960448301819052606483015260ff8516608483015260a4820187905260c482018690529151919092169163d505accf9160e480830192600092919082900301818387803b158015612be757600080fd5b505af1158015612bfb573d6000803e3d6000fd5b505050506125d2898989896137d4565b6b033b2e3c9fd0803ce800000081565b600160009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b158015612c6b57600080fd5b505af1158015612c7f573d6000803e3d6000fd5b5050600654604080516356dcf2a760e11b8152644554482d4160d81b60048201523060248201526001600160a01b038781166044830152346064830152915191909216945063adb9e54e93506084808301935060009282900301818387803b158015612cea57600080fd5b505af1158015612cfe573d6000803e3d6000fd5b5050505050565b60088181548110612d1257fe5b6000918252602090912001546001600160a01b0316905081565b644554482d4160d81b81565b6000612d4385613998565b60408051635935f49160e11b81523360048201526001600160a01b0386811660248301526001600160801b0386166044830152915160009288169163b26be92291606480830192602092919082900301818787803b158015612da457600080fd5b505af1158015612db8573d6000803e3d6000fd5b505050506040513d6020811015612dce57600080fd5b50516001600160801b039081169150831681101561121c576040805162461bcd60e51b815260206004820152601d60248201527f5969656c6450726f78793a204c696d6974206e6f742072656163686564000000604482015290519081900360640190fd5b6005546001600160a01b031681565b634348414960e01b81565b612e5682613998565b6000826001600160a01b031663284f44446040518163ffffffff1660e01b815260040160206040518083038186803b158015612e9157600080fd5b505afa158015612ea5573d6000803e3d6000fd5b505050506040513d6020811015612ebb57600080fd5b50516040805163204f83f960e01b815290519192506000916001600160a01b0384169163204f83f9916004808301926020929190829003018186803b158015612f0357600080fd5b505afa158015612f17573d6000803e3d6000fd5b505050506040513d6020811015612f2d57600080fd5b505160408051633dae446f60e21b815233600482015230602482015260448101869052815192935060009283926001600160a01b0389169263f6b911bc926064808301939282900301818787803b158015612f8757600080fd5b505af1158015612f9b573d6000803e3d6000fd5b505050506040513d6040811015612fb157600080fd5b5080516020909101519092509050801561305c5760408051630e6dfcd560e01b815230600482018190526024820152604481018390529051613059916001600160a01b03871691630e6dfcd5916064808201926020929091908290030181600087803b15801561302057600080fd5b505af1158015613034573d6000803e3d6000fd5b505050506040513d602081101561304a57600080fd5b5051839063ffffffff613a9516565b91505b6000821180156130f45750600654604080516324c94bb560e21b8152634348414960e01b60048201526024810186905233604482015290516000926001600160a01b0316916393252ed4916064808301926020929190829003018186803b1580156130c657600080fd5b505afa1580156130da573d6000803e3d6000fd5b505050506040513d60208110156130f057600080fd5b5051115b1561319457600654604080516325d3cd1760e01b8152634348414960e01b6004820152602481018690523060448201523360648201526084810185905290516001600160a01b03909216916325d3cd179160a4808201926020929091908290030181600087803b15801561316757600080fd5b505af115801561317b573d6000803e3d6000fd5b505050506040513d602081101561319157600080fd5b50505b61319d84613b31565b505050505050565b6004546001600160a01b031681565b600081565b60006131c487613998565b6000876001600160a01b03166385561a346131de85613a08565b6040518263ffffffff1660e01b815260040180826001600160801b03166001600160801b0316815260200191505060206040518083038186803b15801561322457600080fd5b505afa158015613238573d6000803e3d6000fd5b505050506040513d602081101561324e57600080fd5b5051600654604080516324c94bb560e21b8152600481018b9052602481018a90526001600160a01b03898116604483015291516001600160801b03909416945060009391909216916393252ed4916064808301926020929190829003018186803b1580156132bb57600080fd5b505afa1580156132cf573d6000803e3d6000fd5b505050506040513d60208110156132e557600080fd5b5051905080821161339b57886001600160a01b031663b26be922333061330a88613a08565b604080516001600160e01b031960e087901b1681526001600160a01b0394851660048201529290931660248301526001600160801b03166044820152905160648083019260209291908290030181600087803b15801561336957600080fd5b505af115801561337d573d6000803e3d6000fd5b505050506040513d602081101561339357600080fd5b506134469050565b886001600160a01b0316637543e39c33306133b585613a08565b604080516001600160e01b031960e087901b1681526001600160a01b0394851660048201529290931660248301526001600160801b03166044820152905160648083019260209291908290030181600087803b15801561341457600080fd5b505af1158015613428573d6000803e3d6000fd5b505050506040513d602081101561343e57600080fd5b509091508190505b848210156134855760405162461bcd60e51b81526004018080602001828103825260288152602001806141ec6028913960400191505060405180910390fd5b6006546040805163b93dd41d60e01b8152600481018b9052602481018a90523060448201526001600160a01b038981166064830152608482018690529151919092169163b93dd41d9160a48083019260209291908290030181600087803b1580156134ef57600080fd5b505af1158015613503573d6000803e3d6000fd5b505050506040513d602081101561351957600080fd5b50919998505050505050505050565b600061353385613998565b6040805163cc5783d360e01b81523360048201526001600160a01b0386811660248301526001600160801b0386166044830152915160009288169163cc5783d391606480830192602092919082900301818787803b15801561118d57600080fd5b600061359f87613998565b600654604080516324c94bb560e21b815260048101899052602481018890526001600160a01b038781166044830152915160009392909216916393252ed491606480820192602092909190829003018186803b1580156135fe57600080fd5b505afa158015613612573d6000803e3d6000fd5b505050506040513d602081101561362857600080fd5b50519050600084821061363b578461363d565b815b90506000896001600160a01b0316637543e39c333061365b86613a08565b604080516001600160e01b031960e087901b1681526001600160a01b0394851660048201529290931660248301526001600160801b03166044820152905160648083019260209291908290030181600087803b1580156136ba57600080fd5b505af11580156136ce573d6000803e3d6000fd5b505050506040513d60208110156136e457600080fd5b50516001600160801b03169050848111156137305760405162461bcd60e51b81526004018080602001828103825260218152602001806141cb6021913960400191505060405180910390fd5b6006546040805163b93dd41d60e01b8152600481018c9052602481018b90523060448201526001600160a01b038a81166064830152608482018690529151919092169163b93dd41d9160a48083019260209291908290030181600087803b15801561379a57600080fd5b505af11580156137ae573d6000803e3d6000fd5b505050506040513d60208110156137c457600080fd5b50909a9950505050505050505050565b60006137df85613998565b604080516360561e0560e01b81523360048201526001600160a01b0386811660248301526001600160801b038616604483015291516000928816916360561e0591606480830192602092919082900301818787803b158015612da457600080fd5b6006546040805163470660bb60e11b8152644554482d4160d81b60048201523360248201523060448201526064810184905290516001600160a01b0390921691638e0cc1769160848082019260009290919082900301818387803b1580156138a757600080fd5b505af11580156138bb573d6000803e3d6000fd5b505060015460408051632e1a7d4d60e01b81526004810186905290516001600160a01b039092169350632e1a7d4d925060248082019260009290919082900301818387803b15801561390c57600080fd5b505af1158015613920573d6000803e3d6000fd5b50506040516001600160a01b038516925083156108fc02915083906000818181858888f1935050505015801561395a573d6000803e3d6000fd5b505050565b6002546001600160a01b031681565b6006546001600160a01b031681565b60208101516040820151606090920151909260009190911a90565b6001600160a01b03811660009081526009602052604090205460ff16613a05576040805162461bcd60e51b815260206004820152601860248201527f5969656c6450726f78793a20556e6b6e6f776e20706f6f6c0000000000000000604482015290519081900360640190fd5b50565b60006001600160801b03821115613a66576040805162461bcd60e51b815260206004820152601960248201527f5969656c6450726f78793a2043617374206f766572666c6f7700000000000000604482015290519081900360640190fd5b5090565b6000613a8c6b033b2e3c9fd0803ce8000000611a36858563ffffffff613f7c16565b90505b92915050565b600082820183811015613a8c576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6000613a8c83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250614017565b600660009054906101000a90046001600160a01b03166001600160a01b03166393252ed4634348414960e01b836001600160a01b031663204f83f96040518163ffffffff1660e01b815260040160206040518083038186803b158015613b9657600080fd5b505afa158015613baa573d6000803e3d6000fd5b505050506040513d6020811015613bc057600080fd5b5051604080516001600160e01b031960e086901b16815260048101939093526024830191909152336044830152516064808301926020929190829003018186803b158015613c0d57600080fd5b505afa158015613c21573d6000803e3d6000fd5b505050506040513d6020811015613c3757600080fd5b5051613e30576006546040805163dd62f42360e01b8152634348414960e01b60048201819052336024830181905292516001600160a01b0390941693638e0cc1769391923091869163dd62f423916044808301926020929190829003018186803b158015613ca457600080fd5b505afa158015613cb8573d6000803e3d6000fd5b505050506040513d6020811015613cce57600080fd5b5051604080516001600160e01b031960e088901b16815260048101959095526001600160a01b039384166024860152919092166044840152606483019190915251608480830192600092919082900301818387803b158015613d2f57600080fd5b505af1158015613d43573d6000803e3d6000fd5b5050600554604080516370a0823160e01b8152306004820181905291516001600160a01b03909316945063ef693bed9350909184916370a08231916024808301926020929190829003018186803b158015613d9d57600080fd5b505afa158015613db1573d6000803e3d6000fd5b505050506040513d6020811015613dc757600080fd5b5051604080516001600160e01b031960e086901b1681526001600160a01b039093166004840152602483019190915251604480830192600092919082900301818387803b158015613e1757600080fd5b505af1158015613e2b573d6000803e3d6000fd5b505050505b600254604080516370a0823160e01b815230600482015290516001600160a01b039092169163a9059cbb91339184916370a08231916024808301926020929190829003018186803b158015613e8457600080fd5b505afa158015613e98573d6000803e3d6000fd5b505050506040513d6020811015613eae57600080fd5b5051604080516001600160e01b031960e086901b1681526001600160a01b03909316600484015260248301919091525160448083019260209291908290030181600087803b158015613eff57600080fd5b505af1158015613f13573d6000803e3d6000fd5b505050506040513d6020811015613f2957600080fd5b5051613a05576040805162461bcd60e51b815260206004820152601f60248201527f5969656c6450726f78793a20446169205472616e73666572204661696c656400604482015290519081900360640190fd5b600082613f8b57506000613a8f565b82820282848281613f9857fe5b0414613a8c5760405162461bcd60e51b815260040180806020018281038252602181526020018061413b6021913960400191505060405180910390fd5b6000613a8c83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506140ae565b600081848411156140a65760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561406b578181015183820152602001614053565b50505050905090810190601f1680156140985780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600081836140fd5760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561406b578181015183820152602001614053565b50600083858161410957fe5b049594505050505056fe5969656c6450726f78793a206d696e696d756d4461695072696365206e6f742072656163686564536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775969656c6450726f78793a204e6f7420656e6f75676820446169206f627461696e65645969656c6450726f78793a206d696e696d756d46594461695072696365206e6f7420726561636865645969656c6450726f78793a20546f6f206d7563682066794461692072657175697265645969656c6450726f78793a20546f6f206d756368204461692072657175697265645969656c6450726f78793a204e6f7420656e6f756768206679446169206465627420726570616964a2646970667358221220836018745716d2415740ebd60fcb800fe69f1fc1c77160eca3eb8126134b87b364736f6c634300060a0033000000000000000000000000b94199866fe06b535d019c11247d3f921460b91a000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000060000000000000000000000006feb7b2a023c9bc3cccdf7c5b5a7b929b9a65e04000000000000000000000000f7db19e0373937a13e4b12287b1c121dfb2d9bf8000000000000000000000000b39221e6790ae8360b7e8c1c7221900fad9397f9000000000000000000000000250f8d88173e0d9b692a9742f54e87e01a9fa54e0000000000000000000000008ecc94a91b5cf03927f5eb8c60abbdf48f82b0b30000000000000000000000005591f644b377ed784e558d4be1bba78f5a26bdcd

Deployed Bytecode

0x6080604052600436106101fd5760003560e01c80639d8e21771161010d578063c11645bc116100a0578063d43bb0591161006f578063d43bb05914610c60578063d6dd8a8914610cb5578063f3fef3a314610d09578063f4b9fa7514610d42578063f77c479114610d5757610204565b8063c11645bc14610b8d578063c43a860814610ba2578063c452963314610bb7578063cc53d7bf14610c0c57610204565b8063ae70747c116100dc578063ae70747c14610ad6578063b69d045614610b2a578063b6dbf9ce14610b3f578063b8fde75014610b5457610204565b80639d8e217714610a5c578063a536362714610a71578063ac4afa3814610a97578063ad5c464814610ac157610204565b8063572d9c4f116101905780636f7952251161015f5780636f795225146106f457806374191001146108c85780637e3d4cfa1461091d5780638ba1d1c91461094657806390c140db1461097957610204565b8063572d9c4f1461056857806361d027b3146105a75780636c223e95146105bc5780636d9d1d981461061157610204565b806336569e77116101cc57806336569e77146104ba57806336b4f5bd146104cf5780633fc8cef31461051457806355776b771461052957610204565b8063081129a61461020957806329d7d663146103515780632dbacef31461043557806330b4b0751461046657610204565b3661020457005b600080fd5b34801561021557600080fd5b5061034f6004803603606081101561022c57600080fd5b6001600160a01b038235169190810190604081016020820135600160201b81111561025657600080fd5b82018360208201111561026857600080fd5b803590602001918460018302840111600160201b8311171561028957600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b8111156102db57600080fd5b8201836020820111156102ed57600080fd5b803590602001918460018302840111600160201b8311171561030e57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610d6c945050505050565b005b34801561035d57600080fd5b50610423600480360360a081101561037457600080fd5b8135916020810135916001600160a01b036040830135169160608101359181019060a081016080820135600160201b8111156103af57600080fd5b8201836020820111156103c157600080fd5b803590602001918460018302840111600160201b831117156103e257600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610f3c945050505050565b60408051918252519081900360200190f35b34801561044157600080fd5b5061044a611112565b604080516001600160a01b039092168252519081900360200190f35b34801561047257600080fd5b506104236004803603608081101561048957600080fd5b506001600160a01b0381358116916020810135909116906001600160801b0360408201358116916060013516611121565b3480156104c657600080fd5b5061044a611225565b3480156104db57600080fd5b5061034f600480360360808110156104f257600080fd5b506001600160a01b038135169060208101359060408101359060600135611234565b34801561052057600080fd5b5061044a6116f7565b34801561053557600080fd5b506104236004803603606081101561054c57600080fd5b506001600160a01b038135169060208101359060400135611706565b34801561057457600080fd5b5061034f6004803603606081101561058b57600080fd5b506001600160a01b038135169060208101359060400135611e2d565b3480156105b357600080fd5b5061044a61231e565b3480156105c857600080fd5b50610423600480360360c08110156105df57600080fd5b506001600160a01b03813581169160208101359160408201359160608101359091169060808101359060a0013561232d565b34801561061d57600080fd5b50610423600480360360a081101561063457600080fd5b6001600160a01b0382358116926020810135909116916001600160801b03604083013581169260608101359091169181019060a081016080820135600160201b81111561068057600080fd5b82018360208201111561069257600080fd5b803590602001918460018302840111600160201b831117156106b357600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506124b3945050505050565b34801561070057600080fd5b5061034f600480360360a081101561071757600080fd5b6001600160a01b038235811692602081013590911691810190606081016040820135600160201b81111561074a57600080fd5b82018360208201111561075c57600080fd5b803590602001918460018302840111600160201b8311171561077d57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b8111156107cf57600080fd5b8201836020820111156107e157600080fd5b803590602001918460018302840111600160201b8311171561080257600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b81111561085457600080fd5b82018360208201111561086657600080fd5b803590602001918460018302840111600160201b8311171561088757600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506125df945050505050565b3480156108d457600080fd5b50610423600480360360c08110156108eb57600080fd5b506001600160a01b03813581169160208101359160408201359160608101359091169060808101359060a001356128c1565b34801561092957600080fd5b50610932612ad2565b604080519115158252519081900360200190f35b34801561095257600080fd5b506109326004803603602081101561096957600080fd5b50356001600160a01b0316612ad7565b34801561098557600080fd5b50610423600480360360a081101561099c57600080fd5b6001600160a01b0382358116926020810135909116916001600160801b03604083013581169260608101359091169181019060a081016080820135600160201b8111156109e857600080fd5b8201836020820111156109fa57600080fd5b803590602001918460018302840111600160201b83111715610a1b57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550612aec945050505050565b348015610a6857600080fd5b50610423612c0b565b61034f60048036036020811015610a8757600080fd5b50356001600160a01b0316612c1b565b348015610aa357600080fd5b5061044a60048036036020811015610aba57600080fd5b5035612d05565b348015610acd57600080fd5b50610423612d2c565b348015610ae257600080fd5b5061042360048036036080811015610af957600080fd5b506001600160a01b0381358116916020810135909116906001600160801b0360408201358116916060013516612d38565b348015610b3657600080fd5b5061044a612e33565b348015610b4b57600080fd5b50610423612e42565b348015610b6057600080fd5b5061034f60048036036040811015610b7757600080fd5b506001600160a01b038135169060200135612e4d565b348015610b9957600080fd5b5061044a6131a5565b348015610bae57600080fd5b506109326131b4565b348015610bc357600080fd5b50610423600480360360c0811015610bda57600080fd5b506001600160a01b03813581169160208101359160408201359160608101359091169060808101359060a001356131b9565b348015610c1857600080fd5b5061042360048036036080811015610c2f57600080fd5b506001600160a01b0381358116916020810135909116906001600160801b0360408201358116916060013516613528565b348015610c6c57600080fd5b50610423600480360360c0811015610c8357600080fd5b506001600160a01b03813581169160208101359160408201359160608101359091169060808101359060a00135613594565b348015610cc157600080fd5b5061042360048036036080811015610cd857600080fd5b506001600160a01b0381358116916020810135909116906001600160801b03604082013581169160600135166137d4565b348015610d1557600080fd5b5061034f60048036036040811015610d2c57600080fd5b506001600160a01b038135169060200135613840565b348015610d4e57600080fd5b5061044a61395f565b348015610d6357600080fd5b5061044a61396e565b6000806000610d7a8561397d565b60025460408051623f675f60e91b81526001600160a01b038c8116600483015291519598509396509194501691638fcbaf0c91899130918591637ecebe0091602480820192602092909190829003018186803b158015610dd957600080fd5b505afa158015610ded573d6000803e3d6000fd5b505050506040513d6020811015610e0357600080fd5b5051604080516001600160e01b031960e087901b1681526001600160a01b039485166004820152929093166024830152604482015260001960648201526001608482015260ff851660a482015260c4810187905260e48101869052905161010480830192600092919082900301818387803b158015610e8157600080fd5b505af1158015610e95573d6000803e3d6000fd5b50505050610ea28461397d565b60065460408051631a28ff0560e01b81526001600160a01b038c81166004830152306024830152600019604483015260ff851660648301526084820187905260a4820186905291519598509396509194501691631a28ff059160c48082019260009290919082900301818387803b158015610f1c57600080fd5b505af1158015610f30573d6000803e3d6000fd5b50505050505050505050565b600080600080610f4b8561397d565b60025460075460408051623f675f60e91b8152336004820181905291519699509497509295506001600160a01b0391821694638fcbaf0c9491909216918591637ecebe00916024808301926020929190829003018186803b158015610faf57600080fd5b505afa158015610fc3573d6000803e3d6000fd5b505050506040513d6020811015610fd957600080fd5b5051604080516001600160e01b031960e087901b1681526001600160a01b039485166004820152929093166024830152604482015260001960648201526001608482015260ff851660a482015260c4810187905260e48101869052905161010480830192600092919082900301818387803b15801561105757600080fd5b505af115801561106b573d6000803e3d6000fd5b5050600654604080516325d3cd1760e01b8152600481018e9052602481018d90523360448201526001600160a01b038c81166064830152608482018c905291519190921693506325d3cd17925060a48083019260209291908290030181600087803b1580156110d957600080fd5b505af11580156110ed573d6000803e3d6000fd5b505050506040513d602081101561110357600080fd5b50939998505050505050505050565b6003546001600160a01b031681565b600061112c85613998565b60408051631d50f8e760e21b81523360048201526001600160a01b0386811660248301526001600160801b03861660448301529151600092881691637543e39c91606480830192602092919082900301818787803b15801561118d57600080fd5b505af11580156111a1573d6000803e3d6000fd5b505050506040513d60208110156111b757600080fd5b50516001600160801b039081169150831681111561121c576040805162461bcd60e51b815260206004820152601a60248201527f5969656c6450726f78793a204c696d6974206578636565646564000000000000604482015290519081900360640190fd5b95945050505050565b6000546001600160a01b031681565b61123d84613998565b6000846001600160a01b031663284f44446040518163ffffffff1660e01b815260040160206040518083038186803b15801561127857600080fd5b505afa15801561128c573d6000803e3d6000fd5b505050506040513d60208110156112a257600080fd5b50516040805163204f83f960e01b815290519192506000916001600160a01b0384169163204f83f9916004808301926020929190829003018186803b1580156112ea57600080fd5b505afa1580156112fe573d6000803e3d6000fd5b505050506040513d602081101561131457600080fd5b505160408051633dae446f60e21b815233600482015230602482015260448101889052815192935060009283926001600160a01b038b169263f6b911bc926064808301939282900301818787803b15801561136e57600080fd5b505af1158015611382573d6000803e3d6000fd5b505050506040513d604081101561139857600080fd5b508051602090910151909250905060006001600160a01b03891663b26be92230806113c287613a08565b604080516001600160e01b031960e087901b1681526001600160a01b0394851660048201529290931660248301526001600160801b03166044820152905160648083019260209291908290030181600087803b15801561142157600080fd5b505af1158015611435573d6000803e3d6000fd5b505050506040513d602081101561144b57600080fd5b50516001600160801b031690506114628388613a6a565b8110156114a05760405162461bcd60e51b81526004018080602001828103825260278152602001806141146027913960400191505060405180910390fd5b6114b0828263ffffffff613a9516565b91506000808311801561154b5750600654604080516324c94bb560e21b8152634348414960e01b60048201526024810188905233604482015290516000926001600160a01b0316916393252ed4916064808301926020929190829003018186803b15801561151d57600080fd5b505afa158015611531573d6000803e3d6000fd5b505050506040513d602081101561154757600080fd5b5051115b156115ed576006546040805163b93dd41d60e01b8152634348414960e01b6004820152602481018890523060448201523360648201526084810186905290516001600160a01b039092169163b93dd41d9160a4808201926020929091908290030181600087803b1580156115be57600080fd5b505af11580156115d2573d6000803e3d6000fd5b505050506040513d60208110156115e857600080fd5b505190505b60006115ff848363ffffffff613aef16565b905080156116e1576116118189613a6a565b604080516360561e0560e01b8152306004820181905260248201526001600160801b038416604482015290516001600160a01b038e16916360561e059160648083019260209291908290030181600087803b15801561166f57600080fd5b505af1158015611683573d6000803e3d6000fd5b505050506040513d602081101561169957600080fd5b50516001600160801b031610156116e15760405162461bcd60e51b815260040180806020018281038252602981526020018061417f6029913960400191505060405180910390fd5b6116ea87613b31565b5050505050505050505050565b6001546001600160a01b031681565b600061171184613998565b6000846001600160a01b031663284f44446040518163ffffffff1660e01b815260040160206040518083038186803b15801561174c57600080fd5b505afa158015611760573d6000803e3d6000fd5b505050506040513d602081101561177657600080fd5b50516040805163ae4e7fdf60e01b815290519192506001600160a01b0383169163ae4e7fdf91600480820192602092909190829003018186803b1580156117bc57600080fd5b505afa1580156117d0573d6000803e3d6000fd5b505050506040513d60208110156117e657600080fd5b505115156001141561183f576040805162461bcd60e51b815260206004820181905260248201527f5969656c6450726f78793a204f6e6c79206265666f7265206d61747572697479604482015290519081900360640190fd5b600254604080516323b872dd60e01b81523360048201523060248201526044810187905290516001600160a01b03909216916323b872dd916064808201926020929091908290030181600087803b15801561189957600080fd5b505af11580156118ad573d6000803e3d6000fd5b505050506040513d60208110156118c357600080fd5b5051611916576040805162461bcd60e51b815260206004820152601b60248201527f5969656c6450726f78793a205472616e73666572204661696c65640000000000604482015290519081900360640190fd5b600254604080516370a0823160e01b81526001600160a01b038881166004830152915160009392909216916370a0823191602480820192602092909190829003018186803b15801561196757600080fd5b505afa15801561197b573d6000803e3d6000fd5b505050506040513d602081101561199157600080fd5b5051604080516370a0823160e01b81526001600160a01b0389811660048301529151929350600092918516916370a0823191602480820192602092909190829003018186803b1580156119e357600080fd5b505afa1580156119f7573d6000803e3d6000fd5b505050506040513d6020811015611a0d57600080fd5b505190506000611a42611a26838563ffffffff613a9516565b611a36898663ffffffff613f7c16565b9063ffffffff613fd516565b90506000611a56888363ffffffff613aef16565b905086811115611aad576040805162461bcd60e51b815260206004820152601d60248201527f5969656c6450726f78793a206d61784659446169206578636565646564000000604482015290519081900360640190fd5b60055460408051633b4da69f60e01b81523060048201526024810184905290516001600160a01b0390921691633b4da69f9160448082019260009290919082900301818387803b158015611b0057600080fd5b505af1158015611b14573d6000803e3d6000fd5b505060055460408051633612d9a360e11b81523060048201529051600094506001600160a01b039092169250636c25b34691602480830192602092919082900301818787803b158015611b6657600080fd5b505af1158015611b7a573d6000803e3d6000fd5b505050506040513d6020811015611b9057600080fd5b5051600654600554604080516370a0823160e01b8152306004820181905291519495506001600160a01b039384169463adb9e54e94634348414960e01b9433939116916370a0823191602480820192602092909190829003018186803b158015611bf957600080fd5b505afa158015611c0d573d6000803e3d6000fd5b505050506040513d6020811015611c2357600080fd5b5051604080516001600160e01b031960e088901b16815260048101959095526001600160a01b039384166024860152919092166044840152606483019190915251608480830192600092919082900301818387803b158015611c8457600080fd5b505af1158015611c98573d6000803e3d6000fd5b50505050600660009054906101000a90046001600160a01b03166001600160a01b031663801d325f634348414960e01b886001600160a01b031663204f83f96040518163ffffffff1660e01b815260040160206040518083038186803b158015611d0157600080fd5b505afa158015611d15573d6000803e3d6000fd5b505050506040513d6020811015611d2b57600080fd5b5051604080516001600160e01b031960e086901b16815260048101939093526024830191909152336044830152306064830152608482018590525160a480830192600092919082900301818387803b158015611d8657600080fd5b505af1158015611d9a573d6000803e3d6000fd5b505060408051636361ddf360e11b81523060048201523360248201526044810187905290516001600160a01b038e16935063c6c3bbe6925060648083019260209291908290030181600087803b158015611df357600080fd5b505af1158015611e07573d6000803e3d6000fd5b505050506040513d6020811015611e1d57600080fd5b50519a9950505050505050505050565b611e3683613998565b6000836001600160a01b031663284f44446040518163ffffffff1660e01b815260040160206040518083038186803b158015611e7157600080fd5b505afa158015611e85573d6000803e3d6000fd5b505050506040513d6020811015611e9b57600080fd5b50516040805163204f83f960e01b815290519192506000916001600160a01b0384169163204f83f9916004808301926020929190829003018186803b158015611ee357600080fd5b505afa158015611ef7573d6000803e3d6000fd5b505050506040513d6020811015611f0d57600080fd5b505160408051633dae446f60e21b815233600482015230602482015260448101879052815192935060009283926001600160a01b038a169263f6b911bc926064808301939282900301818787803b158015611f6757600080fd5b505af1158015611f7b573d6000803e3d6000fd5b505050506040513d6040811015611f9157600080fd5b5080516020909101519092509050600081158015906120385750600654604080516324c94bb560e21b8152634348414960e01b60048201526024810187905233604482015290516000926001600160a01b0316916393252ed4916064808301926020929190829003018186803b15801561200a57600080fd5b505afa15801561201e573d6000803e3d6000fd5b505050506040513d602081101561203457600080fd5b5051115b156120da576006546040805163b93dd41d60e01b8152634348414960e01b6004820152602481018790523060448201523360648201526084810185905290516001600160a01b039092169163b93dd41d9160a4808201926020929091908290030181600087803b1580156120ab57600080fd5b505af11580156120bf573d6000803e3d6000fd5b505050506040513d60208110156120d557600080fd5b505190505b60006120ec838363ffffffff613aef16565b9050806122305760008411801561218b5750600654604080516324c94bb560e21b8152634348414960e01b60048201526024810188905233604482015290516000926001600160a01b0316916393252ed4916064808301926020929190829003018186803b15801561215d57600080fd5b505afa158015612171573d6000803e3d6000fd5b505050506040513d602081101561218757600080fd5b5051115b1561222b57600654604080516325d3cd1760e01b8152634348414960e01b6004820152602481018890523060448201523360648201526084810187905290516001600160a01b03909216916325d3cd179160a4808201926020929091908290030181600087803b1580156121fe57600080fd5b505af1158015612212573d6000803e3d6000fd5b505050506040513d602081101561222857600080fd5b50505b61230a565b61223a8188613a6a565b604080516360561e0560e01b8152306004820181905260248201526001600160801b038416604482015290516001600160a01b038c16916360561e059160648083019260209291908290030181600087803b15801561229857600080fd5b505af11580156122ac573d6000803e3d6000fd5b505050506040513d60208110156122c257600080fd5b50516001600160801b0316101561230a5760405162461bcd60e51b815260040180806020018281038252602981526020018061417f6029913960400191505060405180910390fd5b61231386613b31565b505050505050505050565b6007546001600160a01b031681565b600061233887613998565b6006546040805163801d325f60e01b815260048101899052602481018890523360448201523060648201526084810186905290516001600160a01b039092169163801d325f9160a48082019260009290919082900301818387803b15801561239f57600080fd5b505af11580156123b3573d6000803e3d6000fd5b505050506000876001600160a01b03166360561e0530876123d388613a08565b604080516001600160e01b031960e087901b1681526001600160a01b0394851660048201529290931660248301526001600160801b03166044820152905160648083019260209291908290030181600087803b15801561243257600080fd5b505af1158015612446573d6000803e3d6000fd5b505050506040513d602081101561245c57600080fd5b50516001600160801b03169050828110156124a85760405162461bcd60e51b815260040180806020018281038252602381526020018061415c6023913960400191505060405180910390fd5b979650505050505050565b60006124be86613998565b60008060006124cc8561397d565b925092509250886001600160a01b031663284f44446040518163ffffffff1660e01b815260040160206040518083038186803b15801561250b57600080fd5b505afa15801561251f573d6000803e3d6000fd5b505050506040513d602081101561253557600080fd5b50516040805163d505accf60e01b81523360048201526001600160a01b038c8116602483015260001960448301819052606483015260ff8516608483015260a4820187905260c482018690529151919092169163d505accf9160e480830192600092919082900301818387803b1580156125ae57600080fd5b505af11580156125c2573d6000803e3d6000fd5b505050506125d289898989613528565b9998505050505050505050565b6125e885613998565b60008060006125f68661397d565b60025460408051623f675f60e91b81526001600160a01b038d8116600483015291519598509396509194501691638fcbaf0c918a918c918591637ecebe0091602480820192602092909190829003018186803b15801561265557600080fd5b505afa158015612669573d6000803e3d6000fd5b505050506040513d602081101561267f57600080fd5b5051604080516001600160e01b031960e087901b1681526001600160a01b039485166004820152929093166024830152604482015260001960648201526001608482015260ff851660a482015260c4810187905260e48101869052905161010480830192600092919082900301818387803b1580156126fd57600080fd5b505af1158015612711573d6000803e3d6000fd5b5050505061271e8561397d565b809350819450829550505050876001600160a01b031663284f44446040518163ffffffff1660e01b815260040160206040518083038186803b15801561276357600080fd5b505afa158015612777573d6000803e3d6000fd5b505050506040513d602081101561278d57600080fd5b50516040805163d505accf60e01b81526001600160a01b038a8116600483015230602483015260001960448301819052606483015260ff8516608483015260a4820187905260c482018690529151919092169163d505accf9160e480830192600092919082900301818387803b15801561280657600080fd5b505af115801561281a573d6000803e3d6000fd5b505050506128278461397d565b60408051631a28ff0560e01b81526001600160a01b038c81166004830152306024830152600019604483015260ff841660648301526084820186905260a4820185905291519497509295509093508a1691631a28ff059160c48082019260009290919082900301818387803b15801561289f57600080fd5b505af11580156128b3573d6000803e3d6000fd5b505050505050505050505050565b60006128cc87613998565b6000876001600160a01b0316634e20e9526128e685613a08565b6040518263ffffffff1660e01b815260040180826001600160801b03166001600160801b0316815260200191505060206040518083038186803b15801561292c57600080fd5b505afa158015612940573d6000803e3d6000fd5b505050506040513d602081101561295657600080fd5b50516001600160801b03169050838111156129a25760405162461bcd60e51b81526004018080602001828103825260238152602001806141a86023913960400191505060405180910390fd5b6006546040805163801d325f60e01b8152600481018a9052602481018990523360448201523060648201526084810184905290516001600160a01b039092169163801d325f9160a48082019260009290919082900301818387803b158015612a0957600080fd5b505af1158015612a1d573d6000803e3d6000fd5b50505050876001600160a01b031663cc5783d33087612a3b87613a08565b604080516001600160e01b031960e087901b1681526001600160a01b0394851660048201529290931660248301526001600160801b03166044820152905160648083019260209291908290030181600087803b158015612a9a57600080fd5b505af1158015612aae573d6000803e3d6000fd5b505050506040513d6020811015612ac457600080fd5b509098975050505050505050565b600181565b60096020526000908152604090205460ff1681565b6000612af786613998565b6000806000612b058561397d565b925092509250886001600160a01b031663284f44446040518163ffffffff1660e01b815260040160206040518083038186803b158015612b4457600080fd5b505afa158015612b58573d6000803e3d6000fd5b505050506040513d6020811015612b6e57600080fd5b50516040805163d505accf60e01b81523360048201526001600160a01b038c8116602483015260001960448301819052606483015260ff8516608483015260a4820187905260c482018690529151919092169163d505accf9160e480830192600092919082900301818387803b158015612be757600080fd5b505af1158015612bfb573d6000803e3d6000fd5b505050506125d2898989896137d4565b6b033b2e3c9fd0803ce800000081565b600160009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b158015612c6b57600080fd5b505af1158015612c7f573d6000803e3d6000fd5b5050600654604080516356dcf2a760e11b8152644554482d4160d81b60048201523060248201526001600160a01b038781166044830152346064830152915191909216945063adb9e54e93506084808301935060009282900301818387803b158015612cea57600080fd5b505af1158015612cfe573d6000803e3d6000fd5b5050505050565b60088181548110612d1257fe5b6000918252602090912001546001600160a01b0316905081565b644554482d4160d81b81565b6000612d4385613998565b60408051635935f49160e11b81523360048201526001600160a01b0386811660248301526001600160801b0386166044830152915160009288169163b26be92291606480830192602092919082900301818787803b158015612da457600080fd5b505af1158015612db8573d6000803e3d6000fd5b505050506040513d6020811015612dce57600080fd5b50516001600160801b039081169150831681101561121c576040805162461bcd60e51b815260206004820152601d60248201527f5969656c6450726f78793a204c696d6974206e6f742072656163686564000000604482015290519081900360640190fd5b6005546001600160a01b031681565b634348414960e01b81565b612e5682613998565b6000826001600160a01b031663284f44446040518163ffffffff1660e01b815260040160206040518083038186803b158015612e9157600080fd5b505afa158015612ea5573d6000803e3d6000fd5b505050506040513d6020811015612ebb57600080fd5b50516040805163204f83f960e01b815290519192506000916001600160a01b0384169163204f83f9916004808301926020929190829003018186803b158015612f0357600080fd5b505afa158015612f17573d6000803e3d6000fd5b505050506040513d6020811015612f2d57600080fd5b505160408051633dae446f60e21b815233600482015230602482015260448101869052815192935060009283926001600160a01b0389169263f6b911bc926064808301939282900301818787803b158015612f8757600080fd5b505af1158015612f9b573d6000803e3d6000fd5b505050506040513d6040811015612fb157600080fd5b5080516020909101519092509050801561305c5760408051630e6dfcd560e01b815230600482018190526024820152604481018390529051613059916001600160a01b03871691630e6dfcd5916064808201926020929091908290030181600087803b15801561302057600080fd5b505af1158015613034573d6000803e3d6000fd5b505050506040513d602081101561304a57600080fd5b5051839063ffffffff613a9516565b91505b6000821180156130f45750600654604080516324c94bb560e21b8152634348414960e01b60048201526024810186905233604482015290516000926001600160a01b0316916393252ed4916064808301926020929190829003018186803b1580156130c657600080fd5b505afa1580156130da573d6000803e3d6000fd5b505050506040513d60208110156130f057600080fd5b5051115b1561319457600654604080516325d3cd1760e01b8152634348414960e01b6004820152602481018690523060448201523360648201526084810185905290516001600160a01b03909216916325d3cd179160a4808201926020929091908290030181600087803b15801561316757600080fd5b505af115801561317b573d6000803e3d6000fd5b505050506040513d602081101561319157600080fd5b50505b61319d84613b31565b505050505050565b6004546001600160a01b031681565b600081565b60006131c487613998565b6000876001600160a01b03166385561a346131de85613a08565b6040518263ffffffff1660e01b815260040180826001600160801b03166001600160801b0316815260200191505060206040518083038186803b15801561322457600080fd5b505afa158015613238573d6000803e3d6000fd5b505050506040513d602081101561324e57600080fd5b5051600654604080516324c94bb560e21b8152600481018b9052602481018a90526001600160a01b03898116604483015291516001600160801b03909416945060009391909216916393252ed4916064808301926020929190829003018186803b1580156132bb57600080fd5b505afa1580156132cf573d6000803e3d6000fd5b505050506040513d60208110156132e557600080fd5b5051905080821161339b57886001600160a01b031663b26be922333061330a88613a08565b604080516001600160e01b031960e087901b1681526001600160a01b0394851660048201529290931660248301526001600160801b03166044820152905160648083019260209291908290030181600087803b15801561336957600080fd5b505af115801561337d573d6000803e3d6000fd5b505050506040513d602081101561339357600080fd5b506134469050565b886001600160a01b0316637543e39c33306133b585613a08565b604080516001600160e01b031960e087901b1681526001600160a01b0394851660048201529290931660248301526001600160801b03166044820152905160648083019260209291908290030181600087803b15801561341457600080fd5b505af1158015613428573d6000803e3d6000fd5b505050506040513d602081101561343e57600080fd5b509091508190505b848210156134855760405162461bcd60e51b81526004018080602001828103825260288152602001806141ec6028913960400191505060405180910390fd5b6006546040805163b93dd41d60e01b8152600481018b9052602481018a90523060448201526001600160a01b038981166064830152608482018690529151919092169163b93dd41d9160a48083019260209291908290030181600087803b1580156134ef57600080fd5b505af1158015613503573d6000803e3d6000fd5b505050506040513d602081101561351957600080fd5b50919998505050505050505050565b600061353385613998565b6040805163cc5783d360e01b81523360048201526001600160a01b0386811660248301526001600160801b0386166044830152915160009288169163cc5783d391606480830192602092919082900301818787803b15801561118d57600080fd5b600061359f87613998565b600654604080516324c94bb560e21b815260048101899052602481018890526001600160a01b038781166044830152915160009392909216916393252ed491606480820192602092909190829003018186803b1580156135fe57600080fd5b505afa158015613612573d6000803e3d6000fd5b505050506040513d602081101561362857600080fd5b50519050600084821061363b578461363d565b815b90506000896001600160a01b0316637543e39c333061365b86613a08565b604080516001600160e01b031960e087901b1681526001600160a01b0394851660048201529290931660248301526001600160801b03166044820152905160648083019260209291908290030181600087803b1580156136ba57600080fd5b505af11580156136ce573d6000803e3d6000fd5b505050506040513d60208110156136e457600080fd5b50516001600160801b03169050848111156137305760405162461bcd60e51b81526004018080602001828103825260218152602001806141cb6021913960400191505060405180910390fd5b6006546040805163b93dd41d60e01b8152600481018c9052602481018b90523060448201526001600160a01b038a81166064830152608482018690529151919092169163b93dd41d9160a48083019260209291908290030181600087803b15801561379a57600080fd5b505af11580156137ae573d6000803e3d6000fd5b505050506040513d60208110156137c457600080fd5b50909a9950505050505050505050565b60006137df85613998565b604080516360561e0560e01b81523360048201526001600160a01b0386811660248301526001600160801b038616604483015291516000928816916360561e0591606480830192602092919082900301818787803b158015612da457600080fd5b6006546040805163470660bb60e11b8152644554482d4160d81b60048201523360248201523060448201526064810184905290516001600160a01b0390921691638e0cc1769160848082019260009290919082900301818387803b1580156138a757600080fd5b505af11580156138bb573d6000803e3d6000fd5b505060015460408051632e1a7d4d60e01b81526004810186905290516001600160a01b039092169350632e1a7d4d925060248082019260009290919082900301818387803b15801561390c57600080fd5b505af1158015613920573d6000803e3d6000fd5b50506040516001600160a01b038516925083156108fc02915083906000818181858888f1935050505015801561395a573d6000803e3d6000fd5b505050565b6002546001600160a01b031681565b6006546001600160a01b031681565b60208101516040820151606090920151909260009190911a90565b6001600160a01b03811660009081526009602052604090205460ff16613a05576040805162461bcd60e51b815260206004820152601860248201527f5969656c6450726f78793a20556e6b6e6f776e20706f6f6c0000000000000000604482015290519081900360640190fd5b50565b60006001600160801b03821115613a66576040805162461bcd60e51b815260206004820152601960248201527f5969656c6450726f78793a2043617374206f766572666c6f7700000000000000604482015290519081900360640190fd5b5090565b6000613a8c6b033b2e3c9fd0803ce8000000611a36858563ffffffff613f7c16565b90505b92915050565b600082820183811015613a8c576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6000613a8c83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250614017565b600660009054906101000a90046001600160a01b03166001600160a01b03166393252ed4634348414960e01b836001600160a01b031663204f83f96040518163ffffffff1660e01b815260040160206040518083038186803b158015613b9657600080fd5b505afa158015613baa573d6000803e3d6000fd5b505050506040513d6020811015613bc057600080fd5b5051604080516001600160e01b031960e086901b16815260048101939093526024830191909152336044830152516064808301926020929190829003018186803b158015613c0d57600080fd5b505afa158015613c21573d6000803e3d6000fd5b505050506040513d6020811015613c3757600080fd5b5051613e30576006546040805163dd62f42360e01b8152634348414960e01b60048201819052336024830181905292516001600160a01b0390941693638e0cc1769391923091869163dd62f423916044808301926020929190829003018186803b158015613ca457600080fd5b505afa158015613cb8573d6000803e3d6000fd5b505050506040513d6020811015613cce57600080fd5b5051604080516001600160e01b031960e088901b16815260048101959095526001600160a01b039384166024860152919092166044840152606483019190915251608480830192600092919082900301818387803b158015613d2f57600080fd5b505af1158015613d43573d6000803e3d6000fd5b5050600554604080516370a0823160e01b8152306004820181905291516001600160a01b03909316945063ef693bed9350909184916370a08231916024808301926020929190829003018186803b158015613d9d57600080fd5b505afa158015613db1573d6000803e3d6000fd5b505050506040513d6020811015613dc757600080fd5b5051604080516001600160e01b031960e086901b1681526001600160a01b039093166004840152602483019190915251604480830192600092919082900301818387803b158015613e1757600080fd5b505af1158015613e2b573d6000803e3d6000fd5b505050505b600254604080516370a0823160e01b815230600482015290516001600160a01b039092169163a9059cbb91339184916370a08231916024808301926020929190829003018186803b158015613e8457600080fd5b505afa158015613e98573d6000803e3d6000fd5b505050506040513d6020811015613eae57600080fd5b5051604080516001600160e01b031960e086901b1681526001600160a01b03909316600484015260248301919091525160448083019260209291908290030181600087803b158015613eff57600080fd5b505af1158015613f13573d6000803e3d6000fd5b505050506040513d6020811015613f2957600080fd5b5051613a05576040805162461bcd60e51b815260206004820152601f60248201527f5969656c6450726f78793a20446169205472616e73666572204661696c656400604482015290519081900360640190fd5b600082613f8b57506000613a8f565b82820282848281613f9857fe5b0414613a8c5760405162461bcd60e51b815260040180806020018281038252602181526020018061413b6021913960400191505060405180910390fd5b6000613a8c83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506140ae565b600081848411156140a65760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561406b578181015183820152602001614053565b50505050905090810190601f1680156140985780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600081836140fd5760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561406b578181015183820152602001614053565b50600083858161410957fe5b049594505050505056fe5969656c6450726f78793a206d696e696d756d4461695072696365206e6f742072656163686564536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775969656c6450726f78793a204e6f7420656e6f75676820446169206f627461696e65645969656c6450726f78793a206d696e696d756d46594461695072696365206e6f7420726561636865645969656c6450726f78793a20546f6f206d7563682066794461692072657175697265645969656c6450726f78793a20546f6f206d756368204461692072657175697265645969656c6450726f78793a204e6f7420656e6f756768206679446169206465627420726570616964a2646970667358221220836018745716d2415740ebd60fcb800fe69f1fc1c77160eca3eb8126134b87b364736f6c634300060a0033

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

000000000000000000000000b94199866fe06b535d019c11247d3f921460b91a000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000060000000000000000000000006feb7b2a023c9bc3cccdf7c5b5a7b929b9a65e04000000000000000000000000f7db19e0373937a13e4b12287b1c121dfb2d9bf8000000000000000000000000b39221e6790ae8360b7e8c1c7221900fad9397f9000000000000000000000000250f8d88173e0d9b692a9742f54e87e01a9fa54e0000000000000000000000008ecc94a91b5cf03927f5eb8c60abbdf48f82b0b30000000000000000000000005591f644b377ed784e558d4be1bba78f5a26bdcd

-----Decoded View---------------
Arg [0] : controller_ (address): 0xB94199866Fe06B535d019C11247D3f921460b91A
Arg [1] : _pools (address[]): 0x6feb7B2a023C9Bc3ccCdF7c5B5a7b929B9a65E04,0xF7dB19E0373937A13e4b12287B1C121Dfb2d9BF8,0xb39221E6790Ae8360B7E8C1c7221900fad9397f9,0x250f8d88173E0D9b692A9742f54e87E01A9FA54E,0x8EcC94a91b5CF03927f5eb8c60ABbDf48F82b0b3,0x5591f644B377eD784e558D4BE1bbA78f5a26bdCd

-----Encoded View---------------
9 Constructor Arguments found :
Arg [0] : 000000000000000000000000b94199866fe06b535d019c11247d3f921460b91a
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [3] : 0000000000000000000000006feb7b2a023c9bc3cccdf7c5b5a7b929b9a65e04
Arg [4] : 000000000000000000000000f7db19e0373937a13e4b12287b1c121dfb2d9bf8
Arg [5] : 000000000000000000000000b39221e6790ae8360b7e8c1c7221900fad9397f9
Arg [6] : 000000000000000000000000250f8d88173e0d9b692a9742f54e87e01a9fa54e
Arg [7] : 0000000000000000000000008ecc94a91b5cf03927f5eb8c60abbdf48f82b0b3
Arg [8] : 0000000000000000000000005591f644b377ed784e558d4be1bba78f5a26bdcd


Deployed Bytecode Sourcemap

21322:22489:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23649:421;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;23649:421:0;;;;;;;;;;;;;;;-1:-1:-1;;;23649:421:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;23649:421:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23649:421:0;;;;;;;;-1:-1:-1;23649:421:0;;-1:-1:-1;;;;;23649:421:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;23649:421:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23649:421:0;;-1:-1:-1;23649:421:0;;-1:-1:-1;;;;;23649:421:0:i;:::-;;43250:423;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;43250:423:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;43250:423:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;43250:423:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43250:423:0;;-1:-1:-1;43250:423:0;;-1:-1:-1;;;;;43250:423:0:i;:::-;;;;;;;;;;;;;;;;21467:24;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;21467:24:0;;;;;;;;;;;;;;42197:358;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;42197:358:0;;;;;;;;;;;;;-1:-1:-1;;;;;42197:358:0;;;;;;;;;;;;:::i;21399:15::-;;;;;;;;;;;;;:::i;28303:1428::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;28303:1428:0;;;;;;;;;;;;;;;;;;:::i;21421:17::-;;;;;;;;;;;;;:::i;26286:1316::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;26286:1316:0;;;;;;;;;;;;;:::i;30285:1305::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;30285:1305:0;;;;;;;;;;;;;:::i;21588:25::-;;;;;;;;;;;;;:::i;34905:677::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;34905:677:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;40295:404::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;40295:404:0;;;;;;;;;;;;;-1:-1:-1;;;;;40295:404:0;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;40295:404:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;40295:404:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40295:404:0;;-1:-1:-1;40295:404:0;;-1:-1:-1;;;;;40295:404:0:i;24191:581::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;24191:581:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;24191:581:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;24191:581:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24191:581:0;;;;;;;;-1:-1:-1;24191:581:0;;-1:-1:-1;;;;;24191:581:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;24191:581:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24191:581:0;;;;;;;;-1:-1:-1;24191:581:0;;-1:-1:-1;;;;;24191:581:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;24191:581:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24191:581:0;;-1:-1:-1;24191:581:0;;-1:-1:-1;;;;;24191:581:0:i;33656:726::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;33656:726:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;21788:31::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;21649:41;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21649:41:0;-1:-1:-1;;;;;21649:41:0;;:::i;41576:410::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;41576:410:0;;;;;;;;;;;;;-1:-1:-1;;;;;41576:410:0;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;41576:410:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;41576:410:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41576:410:0;;-1:-1:-1;41576:410:0;;-1:-1:-1;;;;;41576:410:0:i;19528:35::-;;;;;;;;;;;;;:::i;25113:165::-;;;;;;;;;;;;;;;;-1:-1:-1;25113:165:0;-1:-1:-1;;;;;25113:165:0;;:::i;21622:20::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21622:20:0;;:::i;21743:38::-;;;;;;;;;;;;;:::i;39056:368::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;39056:368:0;;;;;;;;;;;;;-1:-1:-1;;;;;39056:368:0;;;;;;;;;;;;:::i;21528:17::-;;;;;;;;;;;;;:::i;21699:37::-;;;;;;;;;;;;;:::i;31895:702::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;31895:702:0;;;;;;;;:::i;21498:23::-;;;;;;;;;;;;;:::i;21826:32::-;;;;;;;;;;;;;:::i;37727:1117::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;37727:1117:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;39633:358::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;39633:358:0;;;;;;;;;;;;;-1:-1:-1;;;;;39633:358:0;;;;;;;;;;;;:::i;36231:812::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;36231:812:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;40909:364::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;40909:364:0;;;;;;;;;;;;;-1:-1:-1;;;;;40909:364:0;;;;;;;;;;;;:::i;25604:211::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;25604:211:0;;;;;;;;:::i;21445:15::-;;;;;;;;;;;;;:::i;21552:29::-;;;;;;;;;;;;;:::i;23649:421::-;23755:9;23775;23795:7;23827:20;23834:12;23827:6;:20::i;:::-;23858:3;;23890:16;;;-1:-1:-1;;;23890:16:0;;-1:-1:-1;;;;;23890:16:0;;;;;;;;;23815:32;;-1:-1:-1;23815:32:0;;-1:-1:-1;23815:32:0;;-1:-1:-1;23858:3:0;;:10;;23869:4;;23883;;23858:3;;23890:10;;:16;;;;;;;;;;;;;;;23858:3;23890:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23890:16:0;23858:74;;;-1:-1:-1;;;;;;23858:74:0;;;;;;;-1:-1:-1;;;;;23858:74:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;23858:74:0;;;;23918:4;23858:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;23858:74:0;;;;;;;-1:-1:-1;23858:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23957:21;23964:13;23957:6;:21::i;:::-;23989:10;;:73;;;-1:-1:-1;;;23989:73:0;;-1:-1:-1;;;;;23989:73:0;;;;;;;24037:4;23989:73;;;;-1:-1:-1;;23989:73:0;;;;;;;;;;;;;;;;;;;;;;;;;23945:33;;-1:-1:-1;23945:33:0;;-1:-1:-1;23945:33:0;;-1:-1:-1;23989:10:0;;:33;;:73;;;;;:10;;:73;;;;;;;;:10;;:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23649:421;;;;;;:::o;43250:423::-;43409:7;43435:9;43446;43457:7;43468:17;43475:9;43468:6;:17::i;:::-;43496:3;;43527:8;;43538:22;;;-1:-1:-1;;;43538:22:0;;43507:10;43538:22;;;;;;;;43434:51;;-1:-1:-1;43434:51:0;;-1:-1:-1;43434:51:0;;-1:-1:-1;;;;;;43496:3:0;;;;:10;;43527:8;;;;;43496:3;;43538:10;;:22;;;;;;;;;;;;;;43496:3;43538:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43538:22:0;43496:90;;;-1:-1:-1;;;;;;43496:90:0;;;;;;;-1:-1:-1;;;;;43496:90:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;43496:90:0;;;;43572:4;43496:90;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;43496:90:0;;;;;;;-1:-1:-1;43496:90:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;43597:10:0;;:68;;;-1:-1:-1;;;43597:68:0;;;;;;;;;;;;;;43639:10;43597:68;;;;-1:-1:-1;;;;;43597:68:0;;;;;;;;;;;;;;;:10;;;;;-1:-1:-1;43597:19:0;;-1:-1:-1;43597:68:0;;;;;;;;;;;;;;:10;;:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43250:423:0;;;-1:-1:-1;;;;;;;;;43250:423:0:o;21467:24::-;;;-1:-1:-1;;;;;21467:24:0;;:::o;42197:358::-;42310:7;42335:19;42349:4;42335:13;:19::i;:::-;42381:39;;;-1:-1:-1;;;42381:39:0;;42395:10;42381:39;;;;-1:-1:-1;;;;;42381:39:0;;;;;;;-1:-1:-1;;;;;42381:39:0;;;;;;;;42365:13;;42381;;;;;:39;;;;;;;;;;;;;;42365:13;42381;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42381:39:0;-1:-1:-1;;;;;42365:55:0;;;;-1:-1:-1;42453:17:0;;;-1:-1:-1;42453:17:0;42431:93;;;;;-1:-1:-1;;;42431:93:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;42542:5;42197:358;-1:-1:-1;;;;;42197:358:0:o;21399:15::-;;;-1:-1:-1;;;;;21399:15:0;;:::o;28303:1428::-;28444:19;28458:4;28444:13;:19::i;:::-;28474:12;28489:4;-1:-1:-1;;;;;28489:10:0;;:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28489:12:0;28531:16;;;-1:-1:-1;;;28531:16:0;;;;28489:12;;-1:-1:-1;28512:16:0;;-1:-1:-1;;;;;28531:14:0;;;;;:16;;;;;28489:12;;28531:16;;;;;;;:14;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28531:16:0;28605:48;;;-1:-1:-1;;;28605:48:0;;28615:10;28605:48;;;;28635:4;28605:48;;;;;;;;;;;;28531:16;;-1:-1:-1;28559:19:0;;;;-1:-1:-1;;;;;28605:9:0;;;;;:48;;;;;;;;;;;28559:19;28605:9;:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28605:48:0;;;;;;;;;-1:-1:-1;28605:48:0;-1:-1:-1;28733:19:0;-1:-1:-1;;;;;28755:12:0;;;28776:4;;28798:23;28605:48;28798:21;:23::i;:::-;28755:67;;;-1:-1:-1;;;;;;28755:67:0;;;;;;;-1:-1:-1;;;;;28755:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;28755:67:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28755:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28755:67:0;-1:-1:-1;;;;;28733:89:0;;-1:-1:-1;28870:34:0;28875:11;28888:15;28870:4;:34::i;:::-;28855:11;:49;;28833:138;;;;-1:-1:-1;;;28833:138:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28998:30;:13;29016:11;28998:30;:17;:30;:::i;:::-;28982:46;;29049:17;29097:1;29081:13;:17;:73;;;;-1:-1:-1;29102:10:0;;:48;;;-1:-1:-1;;;29102:48:0;;-1:-1:-1;;;29102:48:0;;;;;;;;;;29139:10;29102:48;;;;;;29153:1;;-1:-1:-1;;;;;29102:10:0;;:20;;:48;;;;;;;;;;;;;;:10;:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29102:48:0;:52;29081:73;29077:197;;;29183:10;;:79;;;-1:-1:-1;;;29183:79:0;;-1:-1:-1;;;29183:79:0;;;;;;;;;;29229:4;29183:79;;;;29236:10;29183:79;;;;;;;;;;;;-1:-1:-1;;;;;29183:10:0;;;;:21;;:79;;;;;;;;;;;;;;;:10;;:79;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29183:79:0;;-1:-1:-1;29077:197:0;29284:22;29309:28;:13;29327:9;29309:28;:17;:28;:::i;:::-;29284:53;-1:-1:-1;29354:18:0;;29350:342;;29564:39;29569:14;29585:17;29564:4;:39::i;:::-;29491:69;;;-1:-1:-1;;;29491:69:0;;29514:4;29491:69;;;;;;;;;;-1:-1:-1;;;;;29491:69:0;;;;;;;;-1:-1:-1;;;;;29491:14:0;;;;;:69;;;;;;;;;;;;;;-1:-1:-1;29491:14:0;:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29491:69:0;-1:-1:-1;;;;;29491:112:0;;;29465:215;;;;-1:-1:-1;;;29465:215:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29702:21;29717:5;29702:14;:21::i;:::-;28303:1428;;;;;;;;;;;:::o;21421:17::-;;;-1:-1:-1;;;;;21421:17:0;;:::o;26286:1316::-;26373:7;26393:19;26407:4;26393:13;:19::i;:::-;26423:12;26438:4;-1:-1:-1;;;;;26438:10:0;;:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26438:12:0;26469:16;;;-1:-1:-1;;;26469:16:0;;;;26438:12;;-1:-1:-1;;;;;;26469:14:0;;;;;:16;;;;;26438:12;;26469:16;;;;;;;;:14;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26469:16:0;:24;;26489:4;26469:24;;26461:69;;;;;-1:-1:-1;;;26461:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26549:3;;:52;;;-1:-1:-1;;;26549:52:0;;26566:10;26549:52;;;;26586:4;26549:52;;;;;;;;;;;;-1:-1:-1;;;;;26549:3:0;;;;:16;;:52;;;;;;;;;;;;;;;:3;;:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26549:52:0;26541:92;;;;;-1:-1:-1;;;26541:92:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;26703:3;;:28;;;-1:-1:-1;;;26703:28:0;;-1:-1:-1;;;;;26703:28:0;;;;;;;;;26681:19;;26703:3;;;;;:13;;:28;;;;;;;;;;;;;;;:3;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26703:28:0;26766:30;;;-1:-1:-1;;;26766:30:0;;-1:-1:-1;;;;;26766:30:0;;;;;;;;;26703:28;;-1:-1:-1;26742:21:0;;26766:15;;;;;;:30;;;;;26703:28;;26766:30;;;;;;;;:15;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26766:30:0;;-1:-1:-1;26807:16:0;26826:60;26855:30;26766;26873:11;26855:30;:17;:30;:::i;:::-;26826:24;:7;26838:11;26826:24;:11;:24;:::i;:::-;:28;:60;:28;:60;:::i;:::-;26807:79;-1:-1:-1;26897:20:0;26920:21;:7;26807:79;26920:21;:11;:21;:::i;:::-;26897:44;;26990:8;26974:12;:24;;26952:103;;;;;-1:-1:-1;;;26952:103:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;27144:4;;:38;;;-1:-1:-1;;;27144:38:0;;27162:4;27144:38;;;;;;;;;;;;-1:-1:-1;;;;;27144:4:0;;;;:9;;:38;;;;;:4;;:38;;;;;;;;:4;;:38;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;27284:4:0;;:23;;;-1:-1:-1;;;27284:23:0;;27301:4;27284:23;;;;;;27265:16;;-1:-1:-1;;;;;;27284:4:0;;;;-1:-1:-1;27284:8:0;;:23;;;;;;;;;;;;;;27265:16;27284:4;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27284:23:0;27318:10;;27367:4;;:29;;;-1:-1:-1;;;27367:29:0;;27348:4;27367:29;;;;;;;;27284:23;;-1:-1:-1;;;;;;27318:10:0;;;;:15;;-1:-1:-1;;;27334:4:0;27355:10;;27367:4;;;:14;;:29;;;;;27284:23;;27367:29;;;;;;;;:4;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27367:29:0;27318:79;;;-1:-1:-1;;;;;;27318:79:0;;;;;;;;;;;;;;-1:-1:-1;;;;;27318:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;27318:79:0;;;;;;;-1:-1:-1;27318:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27408:10;;;;;;;;;-1:-1:-1;;;;;27408:10:0;-1:-1:-1;;;;;27408:17:0;;-1:-1:-1;;;27432:5:0;-1:-1:-1;;;;;27432:14:0;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27432:16:0;27408:78;;;-1:-1:-1;;;;;;27408:78:0;;;;;;;;;;;;;;;;;;;;;27450:10;27408:78;;;;27470:4;27408:78;;;;;;;;;;;;;;;;-1:-1:-1;;27408:78:0;;;;;;;-1:-1:-1;27408:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;27548:46:0;;;-1:-1:-1;;;27548:46:0;;27566:4;27548:46;;;;27573:10;27548:46;;;;;;;;;;;;-1:-1:-1;;;;;27548:9:0;;;-1:-1:-1;27548:9:0;;-1:-1:-1;27548:46:0;;;;;;;;;;;;;;-1:-1:-1;27548:9:0;:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27548:46:0;;26286:1316;-1:-1:-1;;;;;;;;;;26286:1316:0:o;30285:1305::-;30402:19;30416:4;30402:13;:19::i;:::-;30432:12;30447:4;-1:-1:-1;;;;;30447:10:0;;:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30447:12:0;30489:16;;;-1:-1:-1;;;30489:16:0;;;;30447:12;;-1:-1:-1;30470:16:0;;-1:-1:-1;;;;;30489:14:0;;;;;:16;;;;;30447:12;;30489:16;;;;;;;:14;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30489:16:0;30563:48;;;-1:-1:-1;;;30563:48:0;;30573:10;30563:48;;;;30593:4;30563:48;;;;;;;;;;;;30489:16;;-1:-1:-1;30517:19:0;;;;-1:-1:-1;;;;;30563:9:0;;;;;:48;;;;;;;;;;;30517:19;30563:9;:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30563:48:0;;;;;;;;;-1:-1:-1;30563:48:0;-1:-1:-1;30624:17:0;30656;;;;;:73;;-1:-1:-1;30677:10:0;;:48;;;-1:-1:-1;;;30677:48:0;;-1:-1:-1;;;30677:48:0;;;;;;;;;;30714:10;30677:48;;;;;;30728:1;;-1:-1:-1;;;;;30677:10:0;;:20;;:48;;;;;;;;;;;;;;:10;:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30677:48:0;:52;30656:73;30652:197;;;30758:10;;:79;;;-1:-1:-1;;;30758:79:0;;-1:-1:-1;;;30758:79:0;;;;;;;;;;30804:4;30758:79;;;;30811:10;30758:79;;;;;;;;;;;;-1:-1:-1;;;;;30758:10:0;;;;:21;;:79;;;;;;;;;;;;;;;:10;;:79;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30758:79:0;;-1:-1:-1;30652:197:0;30861:22;30886:28;:13;30904:9;30886:28;:17;:28;:::i;:::-;30861:53;-1:-1:-1;30929:19:0;30925:626;;31057:1;31043:11;:15;:71;;;;-1:-1:-1;31062:10:0;;:48;;;-1:-1:-1;;;31062:48:0;;-1:-1:-1;;;31062:48:0;;;;;;;;;;31099:10;31062:48;;;;;;31113:1;;-1:-1:-1;;;;;31062:10:0;;:20;;:48;;;;;;;;;;;;;;:10;:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31062:48:0;:52;31043:71;31039:187;;;31135:10;;:75;;;-1:-1:-1;;;31135:75:0;;-1:-1:-1;;;31135:75:0;;;;;;;;;;31179:4;31135:75;;;;31186:10;31135:75;;;;;;;;;;;;-1:-1:-1;;;;;31135:10:0;;;;:19;;:75;;;;;;;;;;;;;;;:10;;:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;31039:187:0;30925:626;;;31423:39;31428:14;31444:17;31423:4;:39::i;:::-;31350:69;;;-1:-1:-1;;;31350:69:0;;31373:4;31350:69;;;;;;;;;;-1:-1:-1;;;;;31350:69:0;;;;;;;;-1:-1:-1;;;;;31350:14:0;;;;;:69;;;;;;;;;;;;;;-1:-1:-1;31350:14:0;:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31350:69:0;-1:-1:-1;;;;;31350:112:0;;;31324:215;;;;-1:-1:-1;;;31324:215:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31561:21;31576:5;31561:14;:21::i;:::-;30285:1305;;;;;;;;;:::o;21588:25::-;;;-1:-1:-1;;;;;21588:25:0;;:::o;34905:677::-;35147:7;35172:19;35186:4;35172:13;:19::i;:::-;35282:10;;:81;;;-1:-1:-1;;;35282:81:0;;;;;;;;;;;;;;35322:10;35282:81;;;;35342:4;35282:81;;;;;;;;;;;;-1:-1:-1;;;;;35282:10:0;;;;:17;;:81;;;;;:10;;:81;;;;;;;;:10;;:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35374:17;35394:4;-1:-1:-1;;;;;35394:14:0;;35417:4;35424:2;35428:25;:13;:23;:25::i;:::-;35394:60;;;-1:-1:-1;;;;;;35394:60:0;;;;;;;-1:-1:-1;;;;;35394:60:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;35394:60:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35394:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35394:60:0;-1:-1:-1;;;;;35374:80:0;;-1:-1:-1;35474:31:0;;;;35465:80;;;;-1:-1:-1;;;35465:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35565:9;34905:677;-1:-1:-1;;;;;;;34905:677:0:o;40295:404::-;40443:7;40468:19;40482:4;40468:13;:19::i;:::-;40499:9;40510;40521:7;40532:17;40539:9;40532:6;:17::i;:::-;40498:51;;;;;;40560:4;-1:-1:-1;;;;;40560:10:0;;:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40560:12:0;:75;;;-1:-1:-1;;;40560:75:0;;40580:10;40560:75;;;;-1:-1:-1;;;;;40560:75:0;;;;;;;-1:-1:-1;;40560:75:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:19;;;;;;;:75;;;;;-1:-1:-1;;40560:75:0;;;;;;;-1:-1:-1;40560:19:0;:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40655:36;40662:4;40668:2;40672:6;40680:10;40655:6;:36::i;:::-;40648:43;40295:404;-1:-1:-1;;;;;;;;;40295:404:0:o;24191:581::-;24324:19;24338:4;24324:13;:19::i;:::-;24354:9;24374;24394:7;24426:14;24433:6;24426;:14::i;:::-;24451:3;;24483:16;;;-1:-1:-1;;;24483:16:0;;-1:-1:-1;;;;;24483:16:0;;;;;;;;;24414:26;;-1:-1:-1;24414:26:0;;-1:-1:-1;24414:26:0;;-1:-1:-1;24451:3:0;;:10;;24462:4;;24476;;24451:3;;24483:10;;:16;;;;;;;;;;;;;;;24451:3;24483:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24483:16:0;24451:74;;;-1:-1:-1;;;;;;24451:74:0;;;;;;;-1:-1:-1;;;;;24451:74:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;24451:74:0;;;;24511:4;24451:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;24451:74:0;;;;;;;-1:-1:-1;24451:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24550:16;24557:8;24550:6;:16::i;:::-;24538:28;;;;;;;;;;;;24577:4;-1:-1:-1;;;;;24577:10:0;;:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24577:12:0;:69;;;-1:-1:-1;;;24577:69:0;;-1:-1:-1;;;;;24577:69:0;;;;;;;24611:4;24577:69;;;;-1:-1:-1;;24577:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:19;;;;;;;:69;;;;;-1:-1:-1;;24577:69:0;;;;;;;-1:-1:-1;24577:19:0;:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24671:15;24678:7;24671:6;:15::i;:::-;24697:67;;;-1:-1:-1;;;24697:67:0;;-1:-1:-1;;;;;24697:67:0;;;;;;;24739:4;24697:67;;;;-1:-1:-1;;24697:67:0;;;;;;;;;;;;;;;;;;;;;;;;;24659:27;;-1:-1:-1;24659:27:0;;-1:-1:-1;24659:27:0;;-1:-1:-1;24697:27:0;;;;;:67;;;;;-1:-1:-1;;24697:67:0;;;;;;;;-1:-1:-1;24697:27:0;:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24191:581;;;;;;;;:::o;33656:726::-;33890:7;33915:19;33929:4;33915:13;:19::i;:::-;33945:21;33969:4;-1:-1:-1;;;;;33969:18:0;;33988:23;:11;:21;:23::i;:::-;33969:43;;;;;;;;;;;;;-1:-1:-1;;;;;33969:43:0;-1:-1:-1;;;;;33969:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33969:43:0;-1:-1:-1;;;;;33945:67:0;;-1:-1:-1;34032:29:0;;;;34023:78;;;;-1:-1:-1;;;34023:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34194:10;;:81;;;-1:-1:-1;;;34194:81:0;;;;;;;;;;;;;;34234:10;34194:81;;;;34254:4;34194:81;;;;;;;;;;;;-1:-1:-1;;;;;34194:10:0;;;;:17;;:81;;;;;:10;;:81;;;;;;;;:10;;:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34286:4;-1:-1:-1;;;;;34286:11:0;;34306:4;34313:2;34317:23;:11;:21;:23::i;:::-;34286:55;;;-1:-1:-1;;;;;;34286:55:0;;;;;;;-1:-1:-1;;;;;34286:55:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;34286:55:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34286:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34361:13:0;;33656:726;-1:-1:-1;;;;;;;;33656:726:0:o;21788:31::-;21815:4;21788:31;:::o;21649:41::-;;;;;;;;;;;;;;;:::o;41576:410::-;41727:7;41752:19;41766:4;41752:13;:19::i;:::-;41783:9;41794;41805:7;41816:17;41823:9;41816:6;:17::i;:::-;41782:51;;;;;;41844:4;-1:-1:-1;;;;;41844:10:0;;:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41844:12:0;:75;;;-1:-1:-1;;;41844:75:0;;41864:10;41844:75;;;;-1:-1:-1;;;;;41844:75:0;;;;;;;-1:-1:-1;;41844:75:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:19;;;;;;;:75;;;;;-1:-1:-1;;41844:75:0;;;;;;;-1:-1:-1;41844:19:0;:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41939:39;41949:4;41955:2;41959:7;41968:9;41939;:39::i;19528:35::-;19559:4;19528:35;:::o;25113:165::-;25174:4;;;;;;;;;-1:-1:-1;;;;;25174:4:0;-1:-1:-1;;;;;25174:12:0;;25195:9;25174:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;25219:10:0;;:51;;;-1:-1:-1;;;25219:51:0;;-1:-1:-1;;;25219:51:0;;;;25249:4;25219:51;;;;-1:-1:-1;;;;;25219:51:0;;;;;;;25260:9;25219:51;;;;;;:10;;;;;-1:-1:-1;25219:15:0;;-1:-1:-1;25219:51:0;;;;;-1:-1:-1;25219:10:0;;:51;;;;;:10;;:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25113:165;:::o;21622:20::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;21622:20:0;;-1:-1:-1;21622:20:0;:::o;21743:38::-;-1:-1:-1;;;21743:38:0;:::o;39056:368::-;39168:7;39193:19;39207:4;39193:13;:19::i;:::-;39242:35;;;-1:-1:-1;;;39242:35:0;;39255:10;39242:35;;;;-1:-1:-1;;;;;39242:35:0;;;;;;;-1:-1:-1;;;;;39242:35:0;;;;;;;;39223:16;;39242:12;;;;;:35;;;;;;;;;;;;;;39223:16;39242:12;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39242:35:0;-1:-1:-1;;;;;39223:54:0;;;;-1:-1:-1;39310:23:0;;;;;39288:102;;;;;-1:-1:-1;;;39288:102:0;;;;;;;;;;;;;;;;;;;;;;;;;;;21528:17;;;-1:-1:-1;;;;;21528:17:0;;:::o;21699:37::-;-1:-1:-1;;;21699:37:0;:::o;31895:702::-;31978:19;31992:4;31978:13;:19::i;:::-;32008:12;32023:4;-1:-1:-1;;;;;32023:10:0;;:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32023:12:0;32065:16;;;-1:-1:-1;;;32065:16:0;;;;32023:12;;-1:-1:-1;32046:16:0;;-1:-1:-1;;;;;32065:14:0;;;;;:16;;;;;32023:12;;32065:16;;;;;;;:14;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32065:16:0;32139:48;;;-1:-1:-1;;;32139:48:0;;32149:10;32139:48;;;;32169:4;32139:48;;;;;;;;;;;;32065:16;;-1:-1:-1;32093:19:0;;;;-1:-1:-1;;;;;32139:9:0;;;;;:48;;;;;;;;;;;32093:19;32139:9;:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32139:48:0;;;;;;;;;-1:-1:-1;32139:48:0;-1:-1:-1;32202:17:0;;32198:138;;32266:57;;;-1:-1:-1;;;32266:57:0;;32287:4;32266:57;;;;;;;;;;;;;;;;;;32250:74;;-1:-1:-1;;;;;32266:12:0;;;;;:57;;;;;;;;;;;;;;;-1:-1:-1;32266:12:0;:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32266:57:0;32250:11;;:74;:15;:74;:::i;:::-;32236:88;;32198:138;32397:1;32383:11;:15;:71;;;;-1:-1:-1;32402:10:0;;:48;;;-1:-1:-1;;;32402:48:0;;-1:-1:-1;;;32402:48:0;;;;;;;;;;32439:10;32402:48;;;;;;32453:1;;-1:-1:-1;;;;;32402:10:0;;:20;;:48;;;;;;;;;;;;;;:10;:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32402:48:0;:52;32383:71;32379:179;;;32471:10;;:75;;;-1:-1:-1;;;32471:75:0;;-1:-1:-1;;;32471:75:0;;;;;;;;;;32515:4;32471:75;;;;32522:10;32471:75;;;;;;;;;;;;-1:-1:-1;;;;;32471:10:0;;;;:19;;:75;;;;;;;;;;;;;;;:10;;:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;32379:179:0;32568:21;32583:5;32568:14;:21::i;:::-;31895:702;;;;;;:::o;21498:23::-;;;-1:-1:-1;;;;;21498:23:0;;:::o;21826:32::-;21853:5;21826:32;:::o;37727:1117::-;37976:7;38001:19;38015:4;38001:13;:19::i;:::-;38031:22;38056:4;-1:-1:-1;;;;;38056:19:0;;38076:26;:14;:24;:26::i;:::-;38056:47;;;;;;;;;;;;;-1:-1:-1;;;;;38056:47:0;-1:-1:-1;;;;;38056:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38056:47:0;38134:10;;:46;;;-1:-1:-1;;;38134:46:0;;;;;;;;;;;;;;-1:-1:-1;;;;;38134:46:0;;;;;;;;;-1:-1:-1;;;;;38031:72:0;;;;-1:-1:-1;38114:17:0;;38134:10;;;;;:20;;:46;;;;;38056:47;;38134:46;;;;;;;:10;:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38134:46:0;;-1:-1:-1;38194:27:0;;;38191:419;;38293:4;-1:-1:-1;;;;;38293:12:0;;38306:10;38326:4;38333:26;:14;:24;:26::i;:::-;38293:67;;;-1:-1:-1;;;;;;38293:67:0;;;;;;;-1:-1:-1;;;;;38293:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;38293:67:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38293:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38191:419:0;;-1:-1:-1;38191:419:0;;38494:4;-1:-1:-1;;;;;38494:13:0;;38508:10;38528:4;38535:21;:9;:19;:21::i;:::-;38494:63;;;-1:-1:-1;;;;;;38494:63:0;;;;;;;-1:-1:-1;;;;;38494:63:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;38494:63:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38494:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38589:9:0;;-1:-1:-1;38589:9:0;;-1:-1:-1;38191:419:0;38647:21;38629:14;:39;;38620:93;;;;-1:-1:-1;;;38620:93:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38724:10;;:78;;;-1:-1:-1;;;38724:78:0;;;;;;;;;;;;;;38776:4;38724:78;;;;-1:-1:-1;;;;;38724:78:0;;;;;;;;;;;;;;;:10;;;;;:21;;:78;;;;;;;;;;;;;;:10;;:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38822:14:0;;37727:1117;-1:-1:-1;;;;;;;;;37727:1117:0:o;39633:358::-;39742:7;39767:19;39781:4;39767:13;:19::i;:::-;39815:35;;;-1:-1:-1;;;39815:35:0;;39827:10;39815:35;;;;-1:-1:-1;;;;;39815:35:0;;;;;;;-1:-1:-1;;;;;39815:35:0;;;;;;;;39797:15;;39815:11;;;;;:35;;;;;;;;;;;;;;39797:15;39815:11;:35;;;;;;;;;;36231:812;36480:7;36505:19;36519:4;36505:13;:19::i;:::-;36555:10;;:46;;;-1:-1:-1;;;36555:46:0;;;;;;;;;;;;;;-1:-1:-1;;;;;36555:46:0;;;;;;;;;36535:17;;36555:10;;;;;:20;;:46;;;;;;;;;;;;;;;:10;:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36555:46:0;;-1:-1:-1;36612:18:0;36633:26;;;:55;;36674:14;36633:55;;;36662:9;36633:55;36612:76;;36730:22;36755:4;-1:-1:-1;;;;;36755:13:0;;36769:10;36789:4;36796:22;:10;:20;:22::i;:::-;36755:64;;;-1:-1:-1;;;;;;36755:64:0;;;;;;;-1:-1:-1;;;;;36755:64:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;36755:64:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36755:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36755:64:0;-1:-1:-1;;;;;36730:89:0;;-1:-1:-1;36839:39:0;;;;36830:86;;;;-1:-1:-1;;;36830:86:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36927:10;;:74;;;-1:-1:-1;;;36927:74:0;;;;;;;;;;;;;;36979:4;36927:74;;;;-1:-1:-1;;;;;36927:74:0;;;;;;;;;;;;;;;:10;;;;;:21;;:74;;;;;;;;;;;;;;:10;;:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37021:14:0;;36231:812;-1:-1:-1;;;;;;;;;;36231:812:0:o;40909:364::-;41021:7;41046:19;41060:4;41046:13;:19::i;:::-;41093:39;;;-1:-1:-1;;;41093:39:0;;41108:10;41093:39;;;;-1:-1:-1;;;;;41093:39:0;;;;;;;-1:-1:-1;;;;;41093:39:0;;;;;;;;41076:14;;41093;;;;;:39;;;;;;;;;;;;;;41076:14;41093;:39;;;;;;;;;;25604:211;25685:10;;:60;;;-1:-1:-1;;;25685:60:0;;-1:-1:-1;;;25685:60:0;;;;25711:10;25685:60;;;;25731:4;25685:60;;;;;;;;;;;;-1:-1:-1;;;;;25685:10:0;;;;:19;;:60;;;;;:10;;:60;;;;;;;;:10;;:60;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;25756:4:0;;:21;;;-1:-1:-1;;;25756:21:0;;;;;;;;;;-1:-1:-1;;;;;25756:4:0;;;;-1:-1:-1;25756:13:0;;-1:-1:-1;25756:21:0;;;;;:4;;:21;;;;;;;;:4;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;25788:19:0;;-1:-1:-1;;;;;25788:11:0;;;-1:-1:-1;25788:19:0;;;;;-1:-1:-1;25800:6:0;;25788:19;;;;25800:6;25788:11;:19;;;;;;;;;;;;;;;;;;;;;25604:211;;:::o;21445:15::-;;;-1:-1:-1;;;;;21445:15:0;;:::o;21552:29::-;;;-1:-1:-1;;;;;21552:29:0;;:::o;23209:279::-;23363:4;23348:20;;23342:27;23409:4;23394:20;;23388:27;23463:4;23448:20;;;23442:27;23342;;23271:9;23434:36;;;;;23322:159::o;43681:127::-;-1:-1:-1;;;;;43748:23:0;;;;;;:8;:23;;;;;;;;43740:60;;;;;-1:-1:-1;;;43740:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;43681:127;:::o;20842:205::-;20894:7;-1:-1:-1;;;;;20936:22:0;;;20914:97;;;;;-1:-1:-1;;;20914:97:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21037:1:0;20842:205::o;19657:112::-;19716:7;19743:18;19559:4;19743:8;:1;19749;19743:8;:5;:8;:::i;:18::-;19736:25;;19657:112;;;;;:::o;14842:181::-;14900:7;14932:5;;;14956:6;;;;14948:46;;;;;-1:-1:-1;;;14948:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;15306:136;15364:7;15391:43;15395:1;15398;15391:43;;;;;;;;;;;;;;;;;:3;:43::i;32731:427::-;32793:10;;;;;;;;;-1:-1:-1;;;;;32793:10:0;-1:-1:-1;;;;;32793:20:0;;-1:-1:-1;;;32820:5:0;-1:-1:-1;;;;;32820:14:0;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32820:16:0;32793:56;;;-1:-1:-1;;;;;;32793:56:0;;;;;;;;;;;;;;;;;;;;;32838:10;32793:56;;;;;;;;;;32820:16;;32793:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32793:56:0;32789:253;;32871:10;;32924:35;;;-1:-1:-1;;;32924:35:0;;-1:-1:-1;;;32924:35:0;;;;;;32897:10;32924:35;;;;;;;;-1:-1:-1;;;;;32871:10:0;;;;:19;;32891:4;;32917;;32871:10;;32924:17;;:35;;;;;;;;;;;;;;32871:10;32924:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32924:35:0;32871:89;;;-1:-1:-1;;;;;;32871:89:0;;;;;;;;;;;;;;-1:-1:-1;;;;;32871:89:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;32871:89:0;;;;;;;-1:-1:-1;32871:89:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;32975:4:0;;33000:29;;;-1:-1:-1;;;33000:29:0;;32993:4;33000:29;;;;;;;;-1:-1:-1;;;;;32975:4:0;;;;-1:-1:-1;32975:9:0;;-1:-1:-1;32993:4:0;;32975;;33000:14;;:29;;;;;;;;;;;;;;32975:4;33000:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33000:29:0;32975:55;;;-1:-1:-1;;;;;;32975:55:0;;;;;;;-1:-1:-1;;;;;32975:55:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;32975:55:0;;;;;;;-1:-1:-1;32975:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32789:253;33060:3;;33085:28;;;-1:-1:-1;;;33085:28:0;;33107:4;33085:28;;;;;;-1:-1:-1;;;;;33060:3:0;;;;:12;;33073:10;;33060:3;;33085:13;;:28;;;;;;;;;;;;;;33060:3;33085:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33085:28:0;33060:54;;;-1:-1:-1;;;;;;33060:54:0;;;;;;;-1:-1:-1;;;;;33060:54:0;;;;;;;;;;;;;;;;;;;;33085:28;;33060:54;;;;;;;-1:-1:-1;33060:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33060:54:0;33052:98;;;;;-1:-1:-1;;;33052:98:0;;;;;;;;;;;;;;;;;;;;;;;;;;;16196:471;16254:7;16499:6;16495:47;;-1:-1:-1;16529:1:0;16522:8;;16495:47;16566:5;;;16570:1;16566;:5;:1;16590:5;;;;;:10;16582:56;;;;-1:-1:-1;;;16582:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17143:132;17201:7;17228:39;17232:1;17235;17228:39;;;;;;;;;;;;;;;;;:3;:39::i;15745:192::-;15831:7;15867:12;15859:6;;;;15851:29;;;;-1:-1:-1;;;15851:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;15903:5:0;;;15745:192::o;17771:278::-;17857:7;17892:12;17885:5;17877:28;;;;-1:-1:-1;;;17877:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17916:9;17932:1;17928;:5;;;;;;;17771:278;-1:-1:-1;;;;;17771:278:0:o

Swarm Source

ipfs://836018745716d2415740ebd60fcb800fe69f1fc1c77160eca3eb8126134b87b3

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

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

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