ETH Price: $2,600.66 (-4.51%)
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Boost For138613182021-12-23 12:08:181146 days ago1640261298IN
0x8ff42FD8...3f2fE311d
0 ETH0.0494306455.20410902
Repay For138602182021-12-23 8:04:331146 days ago1640246673IN
0x8ff42FD8...3f2fE311d
0 ETH0.0661463164.35562428
Boost For138600062021-12-23 7:12:351146 days ago1640243555IN
0x8ff42FD8...3f2fE311d
0 ETH0.060301869.9692412
Boost For138592012021-12-23 4:04:041147 days ago1640232244IN
0x8ff42FD8...3f2fE311d
0 ETH0.0712852371.7122865
Boost For138586532021-12-23 2:00:231147 days ago1640224823IN
0x8ff42FD8...3f2fE311d
0 ETH0.1099475198.90568054
Boost For138584162021-12-23 1:05:031147 days ago1640221503IN
0x8ff42FD8...3f2fE311d
0 ETH0.0842509693.81126777
Boost For138583032021-12-23 0:40:181147 days ago1640220018IN
0x8ff42FD8...3f2fE311d
0 ETH0.1033991674.88991692
Boost For138578622021-12-22 23:12:051147 days ago1640214725IN
0x8ff42FD8...3f2fE311d
0 ETH0.08038017100.03256982
Repay For138557052021-12-22 15:04:061147 days ago1640185446IN
0x8ff42FD8...3f2fE311d
0 ETH0.066346265.09686609
Boost For138543432021-12-22 10:03:551147 days ago1640167435IN
0x8ff42FD8...3f2fE311d
0 ETH0.0502761463.10644549
Boost For138543432021-12-22 10:03:551147 days ago1640167435IN
0x8ff42FD8...3f2fE311d
0 ETH0.0496730663.48644549
Boost For138543432021-12-22 10:03:551147 days ago1640167435IN
0x8ff42FD8...3f2fE311d
0 ETH0.0497856263.48644549
Boost For138540202021-12-22 8:48:331147 days ago1640162913IN
0x8ff42FD8...3f2fE311d
0 ETH0.0435511149.26674777
Boost For138540062021-12-22 8:44:431147 days ago1640162683IN
0x8ff42FD8...3f2fE311d
0 ETH0.0451071741.53002415
Boost For138540052021-12-22 8:44:331147 days ago1640162673IN
0x8ff42FD8...3f2fE311d
0 ETH0.0580595241.12793845
Boost For138539402021-12-22 8:32:281147 days ago1640161948IN
0x8ff42FD8...3f2fE311d
0 ETH0.0332671641.8163999
Boost For138536092021-12-22 7:24:271147 days ago1640157867IN
0x8ff42FD8...3f2fE311d
0 ETH0.0349971744.50409129
Boost For138535322021-12-22 7:08:181147 days ago1640156898IN
0x8ff42FD8...3f2fE311d
0 ETH0.0524024366.44127909
Boost For138535262021-12-22 7:04:381147 days ago1640156678IN
0x8ff42FD8...3f2fE311d
0 ETH0.0403369551.68111144
Boost For138535262021-12-22 7:04:381147 days ago1640156678IN
0x8ff42FD8...3f2fE311d
0 ETH0.0404413951.68111144
Boost For138535262021-12-22 7:04:381147 days ago1640156678IN
0x8ff42FD8...3f2fE311d
0 ETH0.0407969151.68111144
Boost For138535252021-12-22 7:04:241147 days ago1640156664IN
0x8ff42FD8...3f2fE311d
0 ETH0.0780118798.67388776
Repay For138505862021-12-21 20:04:131148 days ago1640117053IN
0x8ff42FD8...3f2fE311d
0 ETH0.0649188.22386419
Repay For138505482021-12-21 19:56:331148 days ago1640116593IN
0x8ff42FD8...3f2fE311d
0 ETH0.0964476991.64094688
Repay For138502832021-12-21 18:56:301148 days ago1640112990IN
0x8ff42FD8...3f2fE311d
0 ETH0.0502911247.04704552
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
MCDMonitorV2

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-09-14
*/

pragma solidity ^0.6.0; 
pragma experimental ABIEncoderV2;

 abstract contract Manager {
    function last(address) virtual public returns (uint);
    function cdpCan(address, uint, address) virtual public view returns (uint);
    function ilks(uint) virtual public view returns (bytes32);
    function owns(uint) virtual public view returns (address);
    function urns(uint) virtual public view returns (address);
    function vat() virtual public view returns (address);
    function open(bytes32, address) virtual public returns (uint);
    function give(uint, address) virtual public;
    function cdpAllow(uint, address, uint) virtual public;
    function urnAllow(address, uint) virtual public;
    function frob(uint, int, int) virtual public;
    function flux(uint, address, uint) virtual public;
    function move(uint, address, uint) virtual public;
    function exit(address, uint, address, uint) virtual public;
    function quit(uint, address) virtual public;
    function enter(address, uint) virtual public;
    function shift(uint, uint) virtual public;
}  abstract contract Vat {

    struct Urn {
        uint256 ink;   // Locked Collateral  [wad]
        uint256 art;   // Normalised Debt    [wad]
    }

    struct Ilk {
        uint256 Art;   // Total Normalised Debt     [wad]
        uint256 rate;  // Accumulated Rates         [ray]
        uint256 spot;  // Price with Safety Margin  [ray]
        uint256 line;  // Debt Ceiling              [rad]
        uint256 dust;  // Urn Debt Floor            [rad]
    }

    mapping (bytes32 => mapping (address => Urn )) public urns;
    mapping (bytes32 => Ilk)                       public ilks;
    mapping (bytes32 => mapping (address => uint)) public gem;  // [wad]

    function can(address, address) virtual public view returns (uint);
    function dai(address) virtual public view returns (uint);
    function frob(bytes32, address, address, address, int, int) virtual public;
    function hope(address) virtual public;
    function move(address, address, uint) virtual public;
    function fork(bytes32, address, address, int, int) virtual public;
}  abstract contract PipInterface {
    function read() public virtual returns (bytes32);
}  abstract contract Spotter {
    struct Ilk {
        PipInterface pip;
        uint256 mat;
    }

    mapping (bytes32 => Ilk) public ilks;

    uint256 public par;

}  contract DSMath {
    function add(uint256 x, uint256 y) internal pure returns (uint256 z) {
        require((z = x + y) >= x);
    }

    function sub(uint256 x, uint256 y) internal pure returns (uint256 z) {
        require((z = x - y) <= x);
    }

    function mul(uint256 x, uint256 y) internal pure returns (uint256 z) {
        require(y == 0 || (z = x * y) / y == x);
    }

    function div(uint256 x, uint256 y) internal pure returns (uint256 z) {
        return x / y;
    }

    function min(uint256 x, uint256 y) internal pure returns (uint256 z) {
        return x <= y ? x : y;
    }

    function max(uint256 x, uint256 y) internal pure returns (uint256 z) {
        return x >= y ? x : y;
    }

    function imin(int256 x, int256 y) internal pure returns (int256 z) {
        return x <= y ? x : y;
    }

    function imax(int256 x, int256 y) internal pure returns (int256 z) {
        return x >= y ? x : y;
    }

    uint256 constant WAD = 10**18;
    uint256 constant RAY = 10**27;

    function wmul(uint256 x, uint256 y) internal pure returns (uint256 z) {
        z = add(mul(x, y), WAD / 2) / WAD;
    }

    function rmul(uint256 x, uint256 y) internal pure returns (uint256 z) {
        z = add(mul(x, y), RAY / 2) / RAY;
    }

    function wdiv(uint256 x, uint256 y) internal pure returns (uint256 z) {
        z = add(mul(x, WAD), y / 2) / y;
    }

    function rdiv(uint256 x, uint256 y) internal pure returns (uint256 z) {
        z = add(mul(x, RAY), y / 2) / y;
    }

    // This famous algorithm is called "exponentiation by squaring"
    // and calculates x^n with x as fixed-point and n as regular unsigned.
    //
    // It's O(log n), instead of O(n) for naive repeated multiplication.
    //
    // These facts are why it works:
    //
    //  If n is even, then x^n = (x^2)^(n/2).
    //  If n is odd,  then x^n = x * x^(n-1),
    //   and applying the equation for even x gives
    //    x^n = x * (x^2)^((n-1) / 2).
    //
    //  Also, EVM division is flooring and
    //    floor[(n-1) / 2] = floor[n / 2].
    //
    function rpow(uint256 x, uint256 n) internal pure returns (uint256 z) {
        z = n % 2 != 0 ? x : RAY;

        for (n /= 2; n != 0; n /= 2) {
            x = rmul(x, x);

            if (n % 2 != 0) {
                z = rmul(z, x);
            }
        }
    }
}  interface ERC20 {
    function totalSupply() external view returns (uint256 supply);

    function balanceOf(address _owner) external view returns (uint256 balance);

    function transfer(address _to, uint256 _value) external returns (bool success);

    function transferFrom(address _from, address _to, uint256 _value)
        external
        returns (bool success);

    function approve(address _spender, uint256 _value) external returns (bool success);

    function allowance(address _owner, address _spender) external view returns (uint256 remaining);

    function decimals() external view returns (uint256 digits);

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

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

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

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

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

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

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

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

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{ value: weiValue }(data);
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}  library SafeMath {
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

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

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

        return c;
    }

    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // 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;
    }

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

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

        return c;
    }

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

    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}  library SafeERC20 {
    using SafeMath for uint256;
    using Address for address;

    function safeTransfer(ERC20 token, address to, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(ERC20 token, address from, address to, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IERC20-approve}, and its usage is discouraged.
     */
    function safeApprove(ERC20 token, address spender, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, 0));
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(ERC20 token, address spender, uint256 value) internal {
        uint256 newAllowance = token.allowance(address(this), spender).add(value);
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(ERC20 token, address spender, uint256 value) internal {
        uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero");
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function _callOptionalReturn(ERC20 token, bytes memory data) private {

        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) { // Return data is optional
            // solhint-disable-next-line max-line-length
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}  contract AdminAuth {

    using SafeERC20 for ERC20;

    address public owner;
    address public admin;

    modifier onlyOwner() {
        require(owner == msg.sender);
        _;
    }

    modifier onlyAdmin() {
        require(admin == msg.sender);
        _;
    }

    constructor() public {
        owner = 0xBc841B0dE0b93205e912CFBBd1D0c160A1ec6F00;
        admin = 0x25eFA336886C74eA8E282ac466BdCd0199f85BB9;
    }

    /// @notice Admin is set by owner first time, after that admin is super role and has permission to change owner
    /// @param _admin Address of multisig that becomes admin
    function setAdminByOwner(address _admin) public {
        require(msg.sender == owner);
        require(admin == address(0));

        admin = _admin;
    }

    /// @notice Admin is able to set new admin
    /// @param _admin Address of multisig that becomes new admin
    function setAdminByAdmin(address _admin) public {
        require(msg.sender == admin);

        admin = _admin;
    }

    /// @notice Admin is able to change owner
    /// @param _owner Address of new owner
    function setOwnerByAdmin(address _owner) public {
        require(msg.sender == admin);

        owner = _owner;
    }

    /// @notice Destroy the contract
    function kill() public onlyOwner {
        selfdestruct(payable(owner));
    }

    /// @notice  withdraw stuck funds
    function withdrawStuckFunds(address _token, uint _amount) public onlyOwner {
        if (_token == 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE) {
            payable(owner).transfer(_amount);
        } else {
            ERC20(_token).safeTransfer(owner, _amount);
        }
    }
}  contract DefisaverLogger {
    event LogEvent(
        address indexed contractAddress,
        address indexed caller,
        string indexed logName,
        bytes data
    );

    // solhint-disable-next-line func-name-mixedcase
    function Log(address _contract, address _caller, string memory _logName, bytes memory _data)
        public
    {
        emit LogEvent(_contract, _caller, _logName, _data);
    }
}  contract BotRegistry is AdminAuth {

    mapping (address => bool) public botList;

    constructor() public {
        botList[0x776B4a13093e30B05781F97F6A4565B6aa8BE330] = true;

        botList[0xAED662abcC4FA3314985E67Ea993CAD064a7F5cF] = true;
        botList[0xa5d330F6619d6bF892A5B87D80272e1607b3e34D] = true;
        botList[0x5feB4DeE5150B589a7f567EA7CADa2759794A90A] = true;
        botList[0x7ca06417c1d6f480d3bB195B80692F95A6B66158] = true;
    }

    function setBot(address _botAddr, bool _state) public onlyOwner {
        botList[_botAddr] = _state;
    }

}  

contract DFSExchangeData {

    // first is empty to keep the legacy order in place
    enum ExchangeType { _, OASIS, KYBER, UNISWAP, ZEROX }

    enum ActionType { SELL, BUY }

    struct OffchainData {
        address wrapper;
        address exchangeAddr;
        address allowanceTarget;
        uint256 price;
        uint256 protocolFee;
        bytes callData;
    }

    struct ExchangeData {
        address srcAddr;
        address destAddr;
        uint256 srcAmount;
        uint256 destAmount;
        uint256 minPrice;
        uint256 dfsFeeDivider; // service fee divider
        address user; // user to check special fee
        address wrapper;
        bytes wrapperData;
        OffchainData offchainData;
    }

    function packExchangeData(ExchangeData memory _exData) public pure returns(bytes memory) {
        return abi.encode(_exData);
    }

    function unpackExchangeData(bytes memory _data) public pure returns(ExchangeData memory _exData) {
        _exData = abi.decode(_data, (ExchangeData));
    }
}  /// @title Implements enum Method
abstract contract StaticV2 {

    enum Method { Boost, Repay }

    struct CdpHolder {
        uint128 minRatio;
        uint128 maxRatio;
        uint128 optimalRatioBoost;
        uint128 optimalRatioRepay;
        address owner;
        uint cdpId;
        bool boostEnabled;
        bool nextPriceEnabled;
    }

    struct SubPosition {
        uint arrPos;
        bool subscribed;
    }
}    



abstract contract ISubscriptionsV2 is StaticV2 {

    function getOwner(uint _cdpId) external view virtual returns(address);
    function getSubscribedInfo(uint _cdpId) public view virtual returns(bool, uint128, uint128, uint128, uint128, address, uint coll, uint debt);
    function getCdpHolder(uint _cdpId) public view virtual returns (bool subscribed, CdpHolder memory);
}  abstract contract DSProxyInterface {

    /// Truffle wont compile if this isn't commented
    // function execute(bytes memory _code, bytes memory _data)
    //     public virtual
    //     payable
    //     returns (address, bytes32);

    function execute(address _target, bytes memory _data) public virtual payable returns (bytes32);

    function setCache(address _cacheAddr) public virtual payable returns (bool);

    function owner() public virtual returns (address);
}  /// @title Implements logic for calling MCDSaverProxy always from same contract
contract MCDMonitorProxyV2 is AdminAuth {

    uint public CHANGE_PERIOD;
    uint public MIN_CHANGE_PERIOD = 6 * 1 hours;
    address public monitor;
    address public newMonitor;
    address public lastMonitor;
    uint public changeRequestedTimestamp;

    event MonitorChangeInitiated(address oldMonitor, address newMonitor);
    event MonitorChangeCanceled();
    event MonitorChangeFinished(address monitor);
    event MonitorChangeReverted(address monitor);

    modifier onlyMonitor() {
        require (msg.sender == monitor);
        _;
    }

    constructor(uint _changePeriod) public {
        CHANGE_PERIOD = _changePeriod * 1 hours;
    }

    /// @notice Only monitor contract is able to call execute on users proxy
    /// @param _owner Address of cdp owner (users DSProxy address)
    /// @param _saverProxy Address of MCDSaverProxy
    /// @param _data Data to send to MCDSaverProxy
    function callExecute(address _owner, address _saverProxy, bytes memory _data) public payable onlyMonitor {
        // execute reverts if calling specific method fails
        DSProxyInterface(_owner).execute{value: msg.value}(_saverProxy, _data);

        // return if anything left
        if (address(this).balance > 0) {
            msg.sender.transfer(address(this).balance);
        }
    }

    /// @notice Allowed users are able to set Monitor contract without any waiting period first time
    /// @param _monitor Address of Monitor contract
    function setMonitor(address _monitor) public onlyOwner {
        require(monitor == address(0));
        monitor = _monitor;
    }

    /// @notice Allowed users are able to start procedure for changing monitor
    /// @dev after CHANGE_PERIOD needs to call confirmNewMonitor to actually make a change
    /// @param _newMonitor address of new monitor
    function changeMonitor(address _newMonitor) public onlyOwner {
        require(changeRequestedTimestamp == 0);

        changeRequestedTimestamp = now;
        lastMonitor = monitor;
        newMonitor = _newMonitor;

        emit MonitorChangeInitiated(lastMonitor, newMonitor);
    }

    /// @notice At any point allowed users are able to cancel monitor change
    function cancelMonitorChange() public onlyOwner {
        require(changeRequestedTimestamp > 0);

        changeRequestedTimestamp = 0;
        newMonitor = address(0);

        emit MonitorChangeCanceled();
    }

    /// @notice Anyone is able to confirm new monitor after CHANGE_PERIOD if process is started
    function confirmNewMonitor() public onlyOwner {
        require((changeRequestedTimestamp + CHANGE_PERIOD) < now);
        require(changeRequestedTimestamp != 0);
        require(newMonitor != address(0));

        monitor = newMonitor;
        newMonitor = address(0);
        changeRequestedTimestamp = 0;

        emit MonitorChangeFinished(monitor);
    }

    /// @notice Its possible to revert monitor to last used monitor
    function revertMonitor() public onlyOwner {
        require(lastMonitor != address(0));

        monitor = lastMonitor;

        emit MonitorChangeReverted(monitor);
    }

    function setChangePeriod(uint _periodInHours) public onlyOwner {
        require(_periodInHours * 1 hours > MIN_CHANGE_PERIOD);

        CHANGE_PERIOD = _periodInHours * 1 hours;
    }

}    















/// @title Implements logic that allows bots to call Boost and Repay
contract MCDMonitorV2 is DSMath, AdminAuth, StaticV2 {
    uint256 public MAX_GAS_PRICE = 800 gwei; // 800 gwei

    uint256 public REPAY_GAS_COST = 1_000_000;
    uint256 public BOOST_GAS_COST = 1_000_000;

    bytes4 public REPAY_SELECTOR = 0xf360ce20; // repayWithLoan(...)
    bytes4 public BOOST_SELECTOR = 0x8ec2ae25; // boostWithLoan(...)

    MCDMonitorProxyV2 public monitorProxyContract = MCDMonitorProxyV2(0x1816A86C4DA59395522a42b871bf11A4E96A1C7a);
    ISubscriptionsV2 public subscriptionsContract = ISubscriptionsV2(0xC45d4f6B6bf41b6EdAA58B01c4298B8d9078269a);
    address public mcdSaverTakerAddress;

    address public constant BOT_REGISTRY_ADDRESS = 0x637726f8b08a7ABE3aE3aCaB01A80E2d8ddeF77B;
    address public constant PROXY_PERMISSION_ADDR = 0x5a4f877CA808Cca3cB7c2A194F80Ab8588FAE26B;

    Manager public manager = Manager(0x5ef30b9986345249bc32d8928B7ee64DE9435E39);
    Vat public vat = Vat(0x35D1b3F3D7966A1DFe207aa4514C12a259A0492B);
    Spotter public spotter = Spotter(0x65C79fcB50Ca1594B025960e539eD7A9a6D434A3);

    DefisaverLogger public constant logger =
        DefisaverLogger(0x5c55B921f590a89C1Ebe84dF170E655a82b62126);

    modifier onlyApproved() {
        require(BotRegistry(BOT_REGISTRY_ADDRESS).botList(msg.sender), "Not auth bot");
        _;
    }

    constructor(
        address _newMcdSaverTakerAddress
    ) public {
        mcdSaverTakerAddress = _newMcdSaverTakerAddress;
    }

    /// @notice Bots call this method to repay for user when conditions are met
    /// @dev If the contract ownes gas token it will try and use it for gas price reduction
    function repayFor(
        DFSExchangeData.ExchangeData memory _exchangeData,
        uint256 _cdpId,
        uint256 _nextPrice,
        address _joinAddr
    ) public payable onlyApproved {
        bool isAllowed;
        uint256 ratioBefore;
        string memory errReason;

        (isAllowed, ratioBefore, errReason) = checkPreconditions(
            Method.Repay,
            _cdpId,
            _nextPrice
        );
        require(isAllowed, errReason);

        uint256 gasCost = calcGasCost(REPAY_GAS_COST);

        address usersProxy = subscriptionsContract.getOwner(_cdpId);

        monitorProxyContract.callExecute{value: msg.value}(
            usersProxy,
            mcdSaverTakerAddress,
            abi.encodeWithSelector(REPAY_SELECTOR, _exchangeData, _cdpId, gasCost, _joinAddr, 0)
        );

        bool isGoodRatio;
        uint256 ratioAfter;

        (isGoodRatio, ratioAfter, errReason) = ratioGoodAfter(
            Method.Repay,
            _cdpId,
            _nextPrice,
            ratioBefore
        );
        require(isGoodRatio, errReason);

        returnEth();

        logger.Log(
            address(this),
            usersProxy,
            "AutomaticMCDRepay",
            abi.encode(ratioBefore, ratioAfter)
        );
    }

    /// @notice Bots call this method to boost for user when conditions are met
    /// @dev If the contract ownes gas token it will try and use it for gas price reduction
    function boostFor(
        DFSExchangeData.ExchangeData memory _exchangeData,
        uint256 _cdpId,
        uint256 _nextPrice,
        address _joinAddr
    ) public payable onlyApproved {
        bool isAllowed;
        uint256 ratioBefore;
        string memory errReason;

        (isAllowed, ratioBefore, errReason) = checkPreconditions(
            Method.Boost,
            _cdpId,
            _nextPrice
        );
        require(isAllowed, errReason);

        uint256 gasCost = calcGasCost(BOOST_GAS_COST);

        address usersProxy = subscriptionsContract.getOwner(_cdpId);

        monitorProxyContract.callExecute{value: msg.value}(
            usersProxy,
            mcdSaverTakerAddress,
            abi.encodeWithSelector(BOOST_SELECTOR, _exchangeData, _cdpId, gasCost, _joinAddr, 0)
        );

        bool isGoodRatio;
        uint256 ratioAfter;

        (isGoodRatio, ratioAfter, errReason) = ratioGoodAfter(
            Method.Boost,
            _cdpId,
            _nextPrice,
            ratioBefore
        );
        require(isGoodRatio, errReason);

        returnEth();

        logger.Log(
            address(this),
            usersProxy,
            "AutomaticMCDBoost",
            abi.encode(ratioBefore, ratioAfter)
        );
    }

    /******************* INTERNAL METHODS ********************************/
    function returnEth() internal {
        // return if some eth left
        if (address(this).balance > 0) {
            msg.sender.transfer(address(this).balance);
        }
    }

    /******************* STATIC METHODS ********************************/

    /// @notice Returns an address that owns the CDP
    /// @param _cdpId Id of the CDP
    function getOwner(uint256 _cdpId) public view returns (address) {
        return manager.owns(_cdpId);
    }

    /// @notice Gets CDP info (collateral, debt)
    /// @param _cdpId Id of the CDP
    /// @param _ilk Ilk of the CDP
    function getCdpInfo(uint256 _cdpId, bytes32 _ilk) public view returns (uint256, uint256) {
        address urn = manager.urns(_cdpId);

        (uint256 collateral, uint256 debt) = vat.urns(_ilk, urn);
        (, uint256 rate, , , ) = vat.ilks(_ilk);

        return (collateral, rmul(debt, rate));
    }

    /// @notice Gets a price of the asset
    /// @param _ilk Ilk of the CDP
    function getPrice(bytes32 _ilk) public view returns (uint256) {
        (, uint256 mat) = spotter.ilks(_ilk);
        (, , uint256 spot, , ) = vat.ilks(_ilk);

        return rmul(rmul(spot, spotter.par()), mat);
    }

    /// @notice Gets CDP ratio
    /// @param _cdpId Id of the CDP
    /// @param _nextPrice Next price for user
    function getRatio(uint256 _cdpId, uint256 _nextPrice) public view returns (uint256) {
        bytes32 ilk = manager.ilks(_cdpId);
        uint256 price = (_nextPrice == 0) ? getPrice(ilk) : _nextPrice;

        (uint256 collateral, uint256 debt) = getCdpInfo(_cdpId, ilk);

        if (debt == 0) return 0;

        return rdiv(wmul(collateral, price), debt) / (10**18);
    }

    /// @notice Checks if Boost/Repay could be triggered for the CDP
    /// @dev Called by MCDMonitor to enforce the min/max check
    function checkPreconditions(
        Method _method,
        uint256 _cdpId,
        uint256 _nextPrice
    )
        public
        view
        returns (
            bool,
            uint256,
            string memory
        )
    {

        (bool subscribed, CdpHolder memory holder) = subscriptionsContract.getCdpHolder(_cdpId);

        // check if cdp is subscribed
        if (!subscribed) return (false, 0, "Cdp not sub");

        // check if using next price is allowed
        if (_nextPrice > 0 && !holder.nextPriceEnabled)
            return (false, 0, "Next price send but not enabled");

        // check if boost and boost allowed
        if (_method == Method.Boost && !holder.boostEnabled)
            return (false, 0, "Boost not enabled");

        // check if owner is still owner
        if (getOwner(_cdpId) != holder.owner) return (false, 0, "EOA not subbed owner");

        uint256 currRatio = getRatio(_cdpId, _nextPrice);

        if (_method == Method.Repay) {
            if (currRatio > holder.minRatio) return (false, 0, "Ratio is bigger than min");
        } else if (_method == Method.Boost) {
            if (currRatio < holder.maxRatio) return (false, 0, "Ratio is less than max");
        }

        return (true, currRatio, "");
    }

    /// @dev After the Boost/Repay check if the ratio doesn't trigger another call
    function ratioGoodAfter(
        Method _method,
        uint256 _cdpId,
        uint256 _nextPrice,
        uint256 _beforeRatio
    )
        public
        view
        returns (
            bool,
            uint256,
            string memory
        )
    {

        (, CdpHolder memory holder) = subscriptionsContract.getCdpHolder(_cdpId);
        uint256 currRatio = getRatio(_cdpId, _nextPrice);

        if (_method == Method.Repay) {
            if (currRatio >= holder.maxRatio)
                return (false, currRatio, "Repay increased ratio over max");
            if (currRatio <= _beforeRatio) return (false, currRatio, "Repay made ratio worse");
        } else if (_method == Method.Boost) {
            if (currRatio <= holder.minRatio)
                return (false, currRatio, "Boost lowered ratio over min");
            if (currRatio >= _beforeRatio) return (false, currRatio, "Boost didn't lower ratio");
        }

        return (true, currRatio, "");
    }

    /// @notice Calculates gas cost (in Eth) of tx
    /// @dev Gas price is limited to MAX_GAS_PRICE to prevent attack of draining user CDP
    /// @param _gasAmount Amount of gas used for the tx
    function calcGasCost(uint256 _gasAmount) public view returns (uint256) {
        uint256 gasPrice = tx.gasprice <= MAX_GAS_PRICE ? tx.gasprice : MAX_GAS_PRICE;

        return mul(gasPrice, _gasAmount);
    }

    /******************* OWNER ONLY OPERATIONS ********************************/

    /// @notice Allows owner to change gas cost for boost operation, but only up to 3 millions
    /// @param _gasCost New gas cost for boost method
    function changeBoostGasCost(uint256 _gasCost) public onlyOwner {
        require(_gasCost < 3_000_000, "Boost gas cost over limit");

        BOOST_GAS_COST = _gasCost;
    }

    /// @notice Allows owner to change gas cost for repay operation, but only up to 3 millions
    /// @param _gasCost New gas cost for repay method
    function changeRepayGasCost(uint256 _gasCost) public onlyOwner {
        require(_gasCost < 3_000_000, "Repay gas cost over limit");

        REPAY_GAS_COST = _gasCost;
    }

    /// @notice Allows owner to change max gas price
    /// @param _maxGasPrice New max gas price
    function changeMaxGasPrice(uint256 _maxGasPrice) public onlyOwner {
        require(_maxGasPrice < 2000 gwei, "Max gas price over the limit");

        MAX_GAS_PRICE = _maxGasPrice;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_newMcdSaverTakerAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"BOOST_GAS_COST","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BOOST_SELECTOR","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BOT_REGISTRY_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_GAS_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PROXY_PERMISSION_ADDR","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REPAY_GAS_COST","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REPAY_SELECTOR","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"srcAddr","type":"address"},{"internalType":"address","name":"destAddr","type":"address"},{"internalType":"uint256","name":"srcAmount","type":"uint256"},{"internalType":"uint256","name":"destAmount","type":"uint256"},{"internalType":"uint256","name":"minPrice","type":"uint256"},{"internalType":"uint256","name":"dfsFeeDivider","type":"uint256"},{"internalType":"address","name":"user","type":"address"},{"internalType":"address","name":"wrapper","type":"address"},{"internalType":"bytes","name":"wrapperData","type":"bytes"},{"components":[{"internalType":"address","name":"wrapper","type":"address"},{"internalType":"address","name":"exchangeAddr","type":"address"},{"internalType":"address","name":"allowanceTarget","type":"address"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"protocolFee","type":"uint256"},{"internalType":"bytes","name":"callData","type":"bytes"}],"internalType":"struct DFSExchangeData.OffchainData","name":"offchainData","type":"tuple"}],"internalType":"struct DFSExchangeData.ExchangeData","name":"_exchangeData","type":"tuple"},{"internalType":"uint256","name":"_cdpId","type":"uint256"},{"internalType":"uint256","name":"_nextPrice","type":"uint256"},{"internalType":"address","name":"_joinAddr","type":"address"}],"name":"boostFor","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_gasAmount","type":"uint256"}],"name":"calcGasCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_gasCost","type":"uint256"}],"name":"changeBoostGasCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxGasPrice","type":"uint256"}],"name":"changeMaxGasPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_gasCost","type":"uint256"}],"name":"changeRepayGasCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum StaticV2.Method","name":"_method","type":"uint8"},{"internalType":"uint256","name":"_cdpId","type":"uint256"},{"internalType":"uint256","name":"_nextPrice","type":"uint256"}],"name":"checkPreconditions","outputs":[{"internalType":"bool","name":"","type":"bool"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cdpId","type":"uint256"},{"internalType":"bytes32","name":"_ilk","type":"bytes32"}],"name":"getCdpInfo","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cdpId","type":"uint256"}],"name":"getOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_ilk","type":"bytes32"}],"name":"getPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cdpId","type":"uint256"},{"internalType":"uint256","name":"_nextPrice","type":"uint256"}],"name":"getRatio","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"kill","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"logger","outputs":[{"internalType":"contract DefisaverLogger","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"manager","outputs":[{"internalType":"contract Manager","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mcdSaverTakerAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"monitorProxyContract","outputs":[{"internalType":"contract MCDMonitorProxyV2","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum StaticV2.Method","name":"_method","type":"uint8"},{"internalType":"uint256","name":"_cdpId","type":"uint256"},{"internalType":"uint256","name":"_nextPrice","type":"uint256"},{"internalType":"uint256","name":"_beforeRatio","type":"uint256"}],"name":"ratioGoodAfter","outputs":[{"internalType":"bool","name":"","type":"bool"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"srcAddr","type":"address"},{"internalType":"address","name":"destAddr","type":"address"},{"internalType":"uint256","name":"srcAmount","type":"uint256"},{"internalType":"uint256","name":"destAmount","type":"uint256"},{"internalType":"uint256","name":"minPrice","type":"uint256"},{"internalType":"uint256","name":"dfsFeeDivider","type":"uint256"},{"internalType":"address","name":"user","type":"address"},{"internalType":"address","name":"wrapper","type":"address"},{"internalType":"bytes","name":"wrapperData","type":"bytes"},{"components":[{"internalType":"address","name":"wrapper","type":"address"},{"internalType":"address","name":"exchangeAddr","type":"address"},{"internalType":"address","name":"allowanceTarget","type":"address"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"protocolFee","type":"uint256"},{"internalType":"bytes","name":"callData","type":"bytes"}],"internalType":"struct DFSExchangeData.OffchainData","name":"offchainData","type":"tuple"}],"internalType":"struct DFSExchangeData.ExchangeData","name":"_exchangeData","type":"tuple"},{"internalType":"uint256","name":"_cdpId","type":"uint256"},{"internalType":"uint256","name":"_nextPrice","type":"uint256"},{"internalType":"address","name":"_joinAddr","type":"address"}],"name":"repayFor","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_admin","type":"address"}],"name":"setAdminByAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_admin","type":"address"}],"name":"setAdminByOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"setOwnerByAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"spotter","outputs":[{"internalType":"contract Spotter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"subscriptionsContract","outputs":[{"internalType":"contract ISubscriptionsV2","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vat","outputs":[{"internalType":"contract Vat","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawStuckFunds","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405264ba43b74000600255620f424060038190556004556005805463f360ce2063ffffffff199091161763ffffffff60201b1916678ec2ae250000000017600160401b600160e01b0319167b1816a86c4da59395522a42b871bf11a4e96a1c7a00000000000000001790556006805473c45d4f6b6bf41b6edaa58b01c4298b8d9078269a6001600160a01b03199182161790915560088054735ef30b9986345249bc32d8928b7ee64de9435e39908316179055600980547335d1b3f3d7966a1dfe207aa4514c12a259a0492b908316179055600a80547365c79fcb50ca1594b025960e539ed7a9a6d434a392169190911790553480156200010257600080fd5b50604051620028333803806200283383398101604081905262000125916200018c565b600080546001600160a01b031990811673bc841b0de0b93205e912cfbbd1d0c160a1ec6f00179091556001805482167325efa336886c74ea8e282ac466bdcd0199f85bb9179055600780546001600160a01b039390931692909116919091179055620001bc565b6000602082840312156200019e578081fd5b81516001600160a01b0381168114620001b5578182fd5b9392505050565b61266780620001cc6000396000f3fe6080604052600436106101ee5760003560e01c80635ea2a6091161010d578063b6d5a156116100a0578063cff700011161006f578063cff700011461050e578063deca5f881461052e578063e3bbb4f11461054e578063f24ccbfe14610563578063f851a44014610578576101ee565b8063b6d5a15614610496578063c41a360a146104ab578063c42498ea146104cb578063cf66a6bc146104f9576101ee565b8063a564056c116100dc578063a564056c1461042e578063a7304bf714610441578063a8c9032314610461578063b2f9e47f14610481576101ee565b80635ea2a609146103dc5780637016722c146103f157806379521f02146104045780638da5cb5b14610419576101ee565b80633816377e11610185578063481c6a7511610154578063481c6a75146103705780634d3f199e14610385578063526d6461146103a557806358346f4b146103ba576101ee565b80633816377e146102fb5780633a1283221461031b57806341c0e1b51461033b57806342e7c83014610350576101ee565b80632e77468d116101c15780632e77468d1461028f57806331d98b3f146102b157806336569e77146102d157806336fc603f146102e6576101ee565b8063065b80bf146101f357806318bf60e11461022b5780631e48907b1461024d5780632a56f6021461026f575b600080fd5b3480156101ff57600080fd5b5061021361020e366004611f25565b61058d565b604051610222939291906122fe565b60405180910390f35b34801561023757600080fd5b50610240610882565b604051610222919061231f565b34801561025957600080fd5b5061026d610268366004611d7a565b610888565b005b34801561027b57600080fd5b5061024061028a366004611ec8565b6108c1565b34801561029b57600080fd5b506102a46108eb565b60405161022291906121f2565b3480156102bd57600080fd5b506102406102cc366004611ec8565b6108fa565b3480156102dd57600080fd5b506102a4610aa9565b3480156102f257600080fd5b50610240610ab8565b34801561030757600080fd5b5061026d610316366004611ec8565b610abe565b34801561032757600080fd5b5061026d610336366004611db2565b610b08565b34801561034757600080fd5b5061026d610ba1565b34801561035c57600080fd5b5061021361036b366004611f58565b610bc6565b34801561037c57600080fd5b506102a4610dfa565b34801561039157600080fd5b5061026d6103a0366004611ec8565b610e09565b3480156103b157600080fd5b506102a4610e47565b3480156103c657600080fd5b506103cf610e5f565b604051610222919061233f565b3480156103e857600080fd5b506102a4610e68565b61026d6103ff366004611f91565b610e83565b34801561041057600080fd5b506102a46111b5565b34801561042557600080fd5b506102a46111c4565b61026d61043c366004611f91565b6111d3565b34801561044d57600080fd5b5061026d61045c366004611d7a565b6114c6565b34801561046d57600080fd5b5061026d61047c366004611ec8565b6114ff565b34801561048d57600080fd5b506103cf61153d565b3480156104a257600080fd5b506102a461154e565b3480156104b757600080fd5b506102a46104c6366004611ec8565b611566565b3480156104d757600080fd5b506104eb6104e63660046120be565b6115ed565b6040516102229291906125a9565b34801561050557600080fd5b506102a46117a2565b34801561051a57600080fd5b506102406105293660046120be565b6117b1565b34801561053a57600080fd5b5061026d610549366004611d7a565b6118a7565b34801561055a57600080fd5b506102406118d4565b34801561056f57600080fd5b506102a46118da565b34801561058457600080fd5b506102a46118f2565b6000806060600061059c611be9565b600654604051631da1542f60e01b81526001600160a01b0390911690631da1542f906105cc908a9060040161231f565b6101206040518083038186803b1580156105e557600080fd5b505afa1580156105f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061061d9190611df9565b915091508161065a576000806040518060400160405280600b81526020016a21b238103737ba1039bab160a91b8152509450945094505050610879565b60008611801561066c57508060e00151155b156106b7576000806040518060400160405280601f81526020017f4e6578742070726963652073656e6420627574206e6f7420656e61626c6564008152509450945094505050610879565b60008860018111156106c557fe5b1480156106d457508060c00151155b156107135760008060405180604001604052806011815260200170109bdbdcdd081b9bdd08195b98589b1959607a1b8152509450945094505050610879565b80608001516001600160a01b031661072a88611566565b6001600160a01b031614610775576000806040518060400160405280601481526020017322a7a0903737ba1039bab13132b21037bbb732b960611b8152509450945094505050610879565b600061078188886117b1565b9050600189600181111561079157fe5b14156107f55781516001600160801b03168111156107f0576000806040518060400160405280601881526020017f526174696f20697320626967676572207468616e206d696e0000000000000000815250955095509550505050610879565b61085e565b600089600181111561080357fe5b141561085e5781602001516001600160801b031681101561085e57600080604051806040016040528060168152602001750a4c2e8d2de40d2e640d8cae6e640e8d0c2dc40dac2f60531b815250955095509550505050610879565b60408051602081019091526000815260019650909450925050505b93509350939050565b60045481565b6001546001600160a01b0316331461089f57600080fd5b600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000806002543a11156108d6576002546108d8565b3a5b90506108e48184611901565b9392505050565b600a546001600160a01b031681565b600a54604051636cb1c69b60e11b815260009182916001600160a01b039091169063d9638d369061092f90869060040161231f565b604080518083038186803b15801561094657600080fd5b505afa15801561095a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061097e9190611ef8565b600954604051636cb1c69b60e11b8152919350600092506001600160a01b03169063d9638d36906109b390879060040161231f565b60a06040518083038186803b1580156109cb57600080fd5b505afa1580156109df573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a039190612102565b505092505050610aa1610a9b82600a60009054906101000a90046001600160a01b03166001600160a01b031663495d32cb6040518163ffffffff1660e01b815260040160206040518083038186803b158015610a5e57600080fd5b505afa158015610a72573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a969190611ee0565b611925565b83611925565b949350505050565b6009546001600160a01b031681565b60035481565b6000546001600160a01b03163314610ad557600080fd5b6501d1a94a20008110610b035760405162461bcd60e51b8152600401610afa906123d5565b60405180910390fd5b600255565b6000546001600160a01b03163314610b1f57600080fd5b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0383161415610b8357600080546040516001600160a01b039091169183156108fc02918491818181858888f19350505050158015610b7d573d6000803e3d6000fd5b50610b9d565b600054610b9d906001600160a01b03848116911683611966565b5050565b6000546001600160a01b03163314610bb857600080fd5b6000546001600160a01b0316ff5b6000806060610bd3611be9565b600654604051631da1542f60e01b81526001600160a01b0390911690631da1542f90610c03908a9060040161231f565b6101206040518083038186803b158015610c1c57600080fd5b505afa158015610c30573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c549190611df9565b9150506000610c6388886117b1565b90506001896001811115610c7357fe5b1415610d1e5781602001516001600160801b03168110610cd3576000816040518060400160405280601e81526020017f526570617920696e6372656173656420726174696f206f766572206d617800008152509450945094505050610df0565b858111610d1957600081604051806040016040528060168152602001755265706179206d61646520726174696f20776f72736560501b8152509450945094505050610df0565b610dd6565b6000896001811115610d2c57fe5b1415610dd65781516001600160801b03168111610d89576000816040518060400160405280601c81526020017f426f6f7374206c6f776572656420726174696f206f766572206d696e000000008152509450945094505050610df0565b858110610dd6576000816040518060400160405280601881526020017f426f6f7374206469646e2774206c6f77657220726174696f00000000000000008152509450945094505050610df0565b604080516020810190915260008152600195509093509150505b9450945094915050565b6008546001600160a01b031681565b6000546001600160a01b03163314610e2057600080fd5b622dc6c08110610e425760405162461bcd60e51b8152600401610afa90612367565b600355565b73637726f8b08a7abe3ae3acab01a80e2d8ddef77b81565b60055460e01b81565b6005546801000000000000000090046001600160a01b031681565b6040516320eb73ed60e11b815273637726f8b08a7abe3ae3acab01a80e2d8ddef77b906341d6e7da90610eba9033906004016121f2565b60206040518083038186803b158015610ed257600080fd5b505afa158015610ee6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f0a9190611ddd565b610f265760405162461bcd60e51b8152600401610afa90612443565b6000806060610f376001878761058d565b919450925090508083610f5d5760405162461bcd60e51b8152600401610afa9190612354565b506000610f6b6003546108c1565b60065460405163620d1b0560e11b81529192506000916001600160a01b039091169063c41a360a90610fa1908b9060040161231f565b60206040518083038186803b158015610fb957600080fd5b505afa158015610fcd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ff19190611d96565b9050600560089054906101000a90046001600160a01b03166001600160a01b0316638a0e833f3483600760009054906101000a90046001600160a01b0316600560009054906101000a900460e01b8e8e898e60006040516024016110599594939291906124b3565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199485161790525160e087901b90921682526110a0939291600401612206565b6000604051808303818588803b1580156110b957600080fd5b505af11580156110cd573d6000803e3d6000fd5b50505050506000806110e260018b8b89610bc6565b9650909250905084826111085760405162461bcd60e51b8152600401610afa9190612354565b506111116119c1565b735c55b921f590a89c1ebe84df170e655a82b621266001600160a01b031663d061ce50308589856040516020016111499291906125a9565b6040516020818303038152906040526040518463ffffffff1660e01b81526004016111769392919061223b565b600060405180830381600087803b15801561119057600080fd5b505af11580156111a4573d6000803e3d6000fd5b505050505050505050505050505050565b6006546001600160a01b031681565b6000546001600160a01b031681565b6040516320eb73ed60e11b815273637726f8b08a7abe3ae3acab01a80e2d8ddef77b906341d6e7da9061120a9033906004016121f2565b60206040518083038186803b15801561122257600080fd5b505afa158015611236573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061125a9190611ddd565b6112765760405162461bcd60e51b8152600401610afa90612443565b60008060606112876000878761058d565b9194509250905080836112ad5760405162461bcd60e51b8152600401610afa9190612354565b5060006112bb6004546108c1565b60065460405163620d1b0560e11b81529192506000916001600160a01b039091169063c41a360a906112f1908b9060040161231f565b60206040518083038186803b15801561130957600080fd5b505afa15801561131d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113419190611d96565b9050600560089054906101000a90046001600160a01b03166001600160a01b0316638a0e833f3483600760009054906101000a90046001600160a01b0316600560049054906101000a900460e01b8e8e898e60006040516024016113a99594939291906124b3565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199485161790525160e087901b90921682526113f0939291600401612206565b6000604051808303818588803b15801561140957600080fd5b505af115801561141d573d6000803e3d6000fd5b505050505060008061143260008b8b89610bc6565b9650909250905084826114585760405162461bcd60e51b8152600401610afa9190612354565b506114616119c1565b735c55b921f590a89c1ebe84df170e655a82b621266001600160a01b031663d061ce50308589856040516020016114999291906125a9565b6040516020818303038152906040526040518463ffffffff1660e01b815260040161117693929190612290565b6001546001600160a01b031633146114dd57600080fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b0316331461151657600080fd5b622dc6c081106115385760405162461bcd60e51b8152600401610afa9061239e565b600455565b600554640100000000900460e01b81565b735a4f877ca808cca3cb7c2a194f80ab8588fae26b81565b60085460405163040b0d8960e51b81526000916001600160a01b031690638161b1209061159790859060040161231f565b60206040518083038186803b1580156115af57600080fd5b505afa1580156115c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115e79190611d96565b92915050565b600854604051632726b07360e01b8152600091829182916001600160a01b031690632726b0739061162290889060040161231f565b60206040518083038186803b15801561163a57600080fd5b505afa15801561164e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116729190611d96565b6009546040516309092f9760e21b815291925060009182916001600160a01b031690632424be5c906116aa9089908790600401612328565b604080518083038186803b1580156116c157600080fd5b505afa1580156116d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116f991906120df565b600954604051636cb1c69b60e11b81529294509092506000916001600160a01b039091169063d9638d3690611732908a9060040161231f565b60a06040518083038186803b15801561174a57600080fd5b505afa15801561175e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117829190612102565b505050915050826117938383611925565b95509550505050509250929050565b6007546001600160a01b031681565b600854604051632c2cb9fd60e01b815260009182916001600160a01b0390911690632c2cb9fd906117e690879060040161231f565b60206040518083038186803b1580156117fe57600080fd5b505afa158015611812573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118369190611ee0565b905060008315611846578361184f565b61184f826108fa565b905060008061185e87856115ed565b9150915080600014156118785760009450505050506115e7565b670de0b6b3a764000061189461188e84866119f7565b83611a1f565b8161189b57fe5b04979650505050505050565b6000546001600160a01b031633146118be57600080fd5b6001546001600160a01b0316156114dd57600080fd5b60025481565b735c55b921f590a89c1ebe84df170e655a82b6212681565b6001546001600160a01b031681565b600081158061191c5750508082028282828161191957fe5b04145b6115e757600080fd5b60006b033b2e3c9fd0803ce80000006119576119418585611901565b60026b033b2e3c9fd0803ce80000005b04611a43565b8161195e57fe5b049392505050565b6119bc8363a9059cbb60e01b84846040516024016119859291906122e5565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611a53565b505050565b47156119f55760405133904780156108fc02916000818181858888f193505050501580156119f3573d6000803e3d6000fd5b505b565b6000670de0b6b3a7640000611957611a0f8585611901565b6002670de0b6b3a7640000611951565b600081611957611a3b856b033b2e3c9fd0803ce8000000611901565b600285611951565b808201828110156115e757600080fd5b6060611aa8826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611ae29092919063ffffffff16565b8051909150156119bc5780806020019051810190611ac69190611ddd565b6119bc5760405162461bcd60e51b8152600401610afa90612469565b6060610aa184846000856060611af785611bb0565b611b135760405162461bcd60e51b8152600401610afa9061240c565b60006060866001600160a01b03168587604051611b3091906121d6565b60006040518083038185875af1925050503d8060008114611b6d576040519150601f19603f3d011682016040523d82523d6000602084013e611b72565b606091505b50915091508115611b86579150610aa19050565b805115611b965780518082602001fd5b8360405162461bcd60e51b8152600401610afa9190612354565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590610aa1575050151592915050565b6040805161010081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081019190915290565b80356115e78161260e565b80516115e78161260e565b805180151581146115e757600080fd5b600082601f830112611c63578081fd5b813567ffffffffffffffff811115611c79578182fd5b611c8c601f8201601f19166020016125b7565b9150808252836020828501011115611ca357600080fd5b8060208401602084013760009082016020015292915050565b8035600281106115e757600080fd5b600060c08284031215611cdc578081fd5b611ce660c06125b7565b90508135611cf38161260e565b81526020820135611d038161260e565b60208201526040820135611d168161260e565b80604083015250606082013560608201526080820135608082015260a082013567ffffffffffffffff811115611d4b57600080fd5b611d5784828501611c53565b60a08301525092915050565b80516001600160801b03811681146115e757600080fd5b600060208284031215611d8b578081fd5b81356108e48161260e565b600060208284031215611da7578081fd5b81516108e48161260e565b60008060408385031215611dc4578081fd5b8235611dcf8161260e565b946020939093013593505050565b600060208284031215611dee578081fd5b81516108e481612623565b600080828403610120811215611e0d578283fd5b8351611e1881612623565b9250610100601f198201811315611e2d578283fd5b611e36816125b7565b9150611e458660208701611d63565b8252611e548660408701611d63565b6020830152611e668660608701611d63565b6040830152611e788660808701611d63565b6060830152611e8a8660a08701611c38565b608083015260c085015160a0830152611ea68660e08701611c43565b60c0830152611eb786828701611c43565b60e083015250809150509250929050565b600060208284031215611ed9578081fd5b5035919050565b600060208284031215611ef1578081fd5b5051919050565b60008060408385031215611f0a578182fd5b8251611f158161260e565b6020939093015192949293505050565b600080600060608486031215611f39578081fd5b611f438585611cbc565b95602085013595506040909401359392505050565b60008060008060808587031215611f6d578182fd5b611f778686611cbc565b966020860135965060408601359560600135945092505050565b60008060008060808587031215611fa6578182fd5b843567ffffffffffffffff80821115611fbd578384fd5b818701915061014080838a031215611fd3578485fd5b611fdc816125b7565b9050611fe88984611c2d565b8152611ff78960208501611c2d565b602082015260408301356040820152606083013560608201526080830135608082015260a083013560a08201526120318960c08501611c2d565b60c08201526120438960e08501611c2d565b60e0820152610100808401358381111561205b578687fd5b6120678b828701611c53565b8284015250506101208084013583811115612080578687fd5b61208c8b828701611ccb565b82840152505080965050505060208501359250604085013591506120b38660608701611c2d565b905092959194509250565b600080604083850312156120d0578182fd5b50508035926020909101359150565b600080604083850312156120f1578182fd5b505080516020909101519092909150565b600080600080600060a08688031215612119578283fd5b5050835160208501516040860151606087015160809097015192989197509594509092509050565b6001600160a01b03169052565b600081518084526121668160208601602086016125de565b601f01601f19169290920160200192915050565b60ff169052565b600060018060a01b0380835116845280602084015116602085015280604084015116604085015250606082015160608401526080820151608084015260a082015160c060a0850152610aa160c085018261214e565b600082516121e88184602087016125de565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b038481168252831660208201526060604082018190526000906122329083018461214e565b95945050505050565b6001600160a01b03848116825283166020820152608060408201819052601190820152704175746f6d617469634d4344526570617960781b60a082015260c0606082018190526000906122329083018461214e565b6001600160a01b0384811682528316602082015260806040820181905260119082015270105d5d1bdb585d1a58d350d1109bdbdcdd607a1b60a082015260c0606082018190526000906122329083018461214e565b6001600160a01b03929092168252602082015260400190565b6000841515825283602083015260606040830152612232606083018461214e565b90815260200190565b9182526001600160a01b0316602082015260400190565b6001600160e01b031991909116815260200190565b6000602082526108e4602083018461214e565b60208082526019908201527f52657061792067617320636f7374206f766572206c696d697400000000000000604082015260600190565b60208082526019908201527f426f6f73742067617320636f7374206f766572206c696d697400000000000000604082015260600190565b6020808252601c908201527f4d617820676173207072696365206f76657220746865206c696d697400000000604082015260600190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252600c908201526b139bdd08185d5d1a08189bdd60a21b604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b600060a082526124c760a083018851612141565b60208701516124d960c0840182612141565b50604087015160e08301526060870151610100818185015260808901519150610120828186015260a08a01519250610140838187015260c08b01519350612524610160870185612141565b60e08b01519350612539610180870185612141565b828b01519350806101a0870152506125556101e086018461214e565b908a0151858203609f19016101c087015290925090506125758282612181565b925050508560208301528460408301526125926060830185612141565b61259f608083018461217a565b9695505050505050565b918252602082015260400190565b60405181810167ffffffffffffffff811182821017156125d657600080fd5b604052919050565b60005b838110156125f95781810151838201526020016125e1565b83811115612608576000848401525b50505050565b6001600160a01b03811681146119f357600080fd5b80151581146119f357600080fdfea2646970667358221220c999350d2e1b9943e8873ae08df2b1aad0834b75188488780fa9030bffc4854764736f6c634300060c00330000000000000000000000006b90059be44103b997b755f5d389dab6211fb7da

Deployed Bytecode

0x6080604052600436106101ee5760003560e01c80635ea2a6091161010d578063b6d5a156116100a0578063cff700011161006f578063cff700011461050e578063deca5f881461052e578063e3bbb4f11461054e578063f24ccbfe14610563578063f851a44014610578576101ee565b8063b6d5a15614610496578063c41a360a146104ab578063c42498ea146104cb578063cf66a6bc146104f9576101ee565b8063a564056c116100dc578063a564056c1461042e578063a7304bf714610441578063a8c9032314610461578063b2f9e47f14610481576101ee565b80635ea2a609146103dc5780637016722c146103f157806379521f02146104045780638da5cb5b14610419576101ee565b80633816377e11610185578063481c6a7511610154578063481c6a75146103705780634d3f199e14610385578063526d6461146103a557806358346f4b146103ba576101ee565b80633816377e146102fb5780633a1283221461031b57806341c0e1b51461033b57806342e7c83014610350576101ee565b80632e77468d116101c15780632e77468d1461028f57806331d98b3f146102b157806336569e77146102d157806336fc603f146102e6576101ee565b8063065b80bf146101f357806318bf60e11461022b5780631e48907b1461024d5780632a56f6021461026f575b600080fd5b3480156101ff57600080fd5b5061021361020e366004611f25565b61058d565b604051610222939291906122fe565b60405180910390f35b34801561023757600080fd5b50610240610882565b604051610222919061231f565b34801561025957600080fd5b5061026d610268366004611d7a565b610888565b005b34801561027b57600080fd5b5061024061028a366004611ec8565b6108c1565b34801561029b57600080fd5b506102a46108eb565b60405161022291906121f2565b3480156102bd57600080fd5b506102406102cc366004611ec8565b6108fa565b3480156102dd57600080fd5b506102a4610aa9565b3480156102f257600080fd5b50610240610ab8565b34801561030757600080fd5b5061026d610316366004611ec8565b610abe565b34801561032757600080fd5b5061026d610336366004611db2565b610b08565b34801561034757600080fd5b5061026d610ba1565b34801561035c57600080fd5b5061021361036b366004611f58565b610bc6565b34801561037c57600080fd5b506102a4610dfa565b34801561039157600080fd5b5061026d6103a0366004611ec8565b610e09565b3480156103b157600080fd5b506102a4610e47565b3480156103c657600080fd5b506103cf610e5f565b604051610222919061233f565b3480156103e857600080fd5b506102a4610e68565b61026d6103ff366004611f91565b610e83565b34801561041057600080fd5b506102a46111b5565b34801561042557600080fd5b506102a46111c4565b61026d61043c366004611f91565b6111d3565b34801561044d57600080fd5b5061026d61045c366004611d7a565b6114c6565b34801561046d57600080fd5b5061026d61047c366004611ec8565b6114ff565b34801561048d57600080fd5b506103cf61153d565b3480156104a257600080fd5b506102a461154e565b3480156104b757600080fd5b506102a46104c6366004611ec8565b611566565b3480156104d757600080fd5b506104eb6104e63660046120be565b6115ed565b6040516102229291906125a9565b34801561050557600080fd5b506102a46117a2565b34801561051a57600080fd5b506102406105293660046120be565b6117b1565b34801561053a57600080fd5b5061026d610549366004611d7a565b6118a7565b34801561055a57600080fd5b506102406118d4565b34801561056f57600080fd5b506102a46118da565b34801561058457600080fd5b506102a46118f2565b6000806060600061059c611be9565b600654604051631da1542f60e01b81526001600160a01b0390911690631da1542f906105cc908a9060040161231f565b6101206040518083038186803b1580156105e557600080fd5b505afa1580156105f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061061d9190611df9565b915091508161065a576000806040518060400160405280600b81526020016a21b238103737ba1039bab160a91b8152509450945094505050610879565b60008611801561066c57508060e00151155b156106b7576000806040518060400160405280601f81526020017f4e6578742070726963652073656e6420627574206e6f7420656e61626c6564008152509450945094505050610879565b60008860018111156106c557fe5b1480156106d457508060c00151155b156107135760008060405180604001604052806011815260200170109bdbdcdd081b9bdd08195b98589b1959607a1b8152509450945094505050610879565b80608001516001600160a01b031661072a88611566565b6001600160a01b031614610775576000806040518060400160405280601481526020017322a7a0903737ba1039bab13132b21037bbb732b960611b8152509450945094505050610879565b600061078188886117b1565b9050600189600181111561079157fe5b14156107f55781516001600160801b03168111156107f0576000806040518060400160405280601881526020017f526174696f20697320626967676572207468616e206d696e0000000000000000815250955095509550505050610879565b61085e565b600089600181111561080357fe5b141561085e5781602001516001600160801b031681101561085e57600080604051806040016040528060168152602001750a4c2e8d2de40d2e640d8cae6e640e8d0c2dc40dac2f60531b815250955095509550505050610879565b60408051602081019091526000815260019650909450925050505b93509350939050565b60045481565b6001546001600160a01b0316331461089f57600080fd5b600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000806002543a11156108d6576002546108d8565b3a5b90506108e48184611901565b9392505050565b600a546001600160a01b031681565b600a54604051636cb1c69b60e11b815260009182916001600160a01b039091169063d9638d369061092f90869060040161231f565b604080518083038186803b15801561094657600080fd5b505afa15801561095a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061097e9190611ef8565b600954604051636cb1c69b60e11b8152919350600092506001600160a01b03169063d9638d36906109b390879060040161231f565b60a06040518083038186803b1580156109cb57600080fd5b505afa1580156109df573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a039190612102565b505092505050610aa1610a9b82600a60009054906101000a90046001600160a01b03166001600160a01b031663495d32cb6040518163ffffffff1660e01b815260040160206040518083038186803b158015610a5e57600080fd5b505afa158015610a72573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a969190611ee0565b611925565b83611925565b949350505050565b6009546001600160a01b031681565b60035481565b6000546001600160a01b03163314610ad557600080fd5b6501d1a94a20008110610b035760405162461bcd60e51b8152600401610afa906123d5565b60405180910390fd5b600255565b6000546001600160a01b03163314610b1f57600080fd5b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0383161415610b8357600080546040516001600160a01b039091169183156108fc02918491818181858888f19350505050158015610b7d573d6000803e3d6000fd5b50610b9d565b600054610b9d906001600160a01b03848116911683611966565b5050565b6000546001600160a01b03163314610bb857600080fd5b6000546001600160a01b0316ff5b6000806060610bd3611be9565b600654604051631da1542f60e01b81526001600160a01b0390911690631da1542f90610c03908a9060040161231f565b6101206040518083038186803b158015610c1c57600080fd5b505afa158015610c30573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c549190611df9565b9150506000610c6388886117b1565b90506001896001811115610c7357fe5b1415610d1e5781602001516001600160801b03168110610cd3576000816040518060400160405280601e81526020017f526570617920696e6372656173656420726174696f206f766572206d617800008152509450945094505050610df0565b858111610d1957600081604051806040016040528060168152602001755265706179206d61646520726174696f20776f72736560501b8152509450945094505050610df0565b610dd6565b6000896001811115610d2c57fe5b1415610dd65781516001600160801b03168111610d89576000816040518060400160405280601c81526020017f426f6f7374206c6f776572656420726174696f206f766572206d696e000000008152509450945094505050610df0565b858110610dd6576000816040518060400160405280601881526020017f426f6f7374206469646e2774206c6f77657220726174696f00000000000000008152509450945094505050610df0565b604080516020810190915260008152600195509093509150505b9450945094915050565b6008546001600160a01b031681565b6000546001600160a01b03163314610e2057600080fd5b622dc6c08110610e425760405162461bcd60e51b8152600401610afa90612367565b600355565b73637726f8b08a7abe3ae3acab01a80e2d8ddef77b81565b60055460e01b81565b6005546801000000000000000090046001600160a01b031681565b6040516320eb73ed60e11b815273637726f8b08a7abe3ae3acab01a80e2d8ddef77b906341d6e7da90610eba9033906004016121f2565b60206040518083038186803b158015610ed257600080fd5b505afa158015610ee6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f0a9190611ddd565b610f265760405162461bcd60e51b8152600401610afa90612443565b6000806060610f376001878761058d565b919450925090508083610f5d5760405162461bcd60e51b8152600401610afa9190612354565b506000610f6b6003546108c1565b60065460405163620d1b0560e11b81529192506000916001600160a01b039091169063c41a360a90610fa1908b9060040161231f565b60206040518083038186803b158015610fb957600080fd5b505afa158015610fcd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ff19190611d96565b9050600560089054906101000a90046001600160a01b03166001600160a01b0316638a0e833f3483600760009054906101000a90046001600160a01b0316600560009054906101000a900460e01b8e8e898e60006040516024016110599594939291906124b3565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199485161790525160e087901b90921682526110a0939291600401612206565b6000604051808303818588803b1580156110b957600080fd5b505af11580156110cd573d6000803e3d6000fd5b50505050506000806110e260018b8b89610bc6565b9650909250905084826111085760405162461bcd60e51b8152600401610afa9190612354565b506111116119c1565b735c55b921f590a89c1ebe84df170e655a82b621266001600160a01b031663d061ce50308589856040516020016111499291906125a9565b6040516020818303038152906040526040518463ffffffff1660e01b81526004016111769392919061223b565b600060405180830381600087803b15801561119057600080fd5b505af11580156111a4573d6000803e3d6000fd5b505050505050505050505050505050565b6006546001600160a01b031681565b6000546001600160a01b031681565b6040516320eb73ed60e11b815273637726f8b08a7abe3ae3acab01a80e2d8ddef77b906341d6e7da9061120a9033906004016121f2565b60206040518083038186803b15801561122257600080fd5b505afa158015611236573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061125a9190611ddd565b6112765760405162461bcd60e51b8152600401610afa90612443565b60008060606112876000878761058d565b9194509250905080836112ad5760405162461bcd60e51b8152600401610afa9190612354565b5060006112bb6004546108c1565b60065460405163620d1b0560e11b81529192506000916001600160a01b039091169063c41a360a906112f1908b9060040161231f565b60206040518083038186803b15801561130957600080fd5b505afa15801561131d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113419190611d96565b9050600560089054906101000a90046001600160a01b03166001600160a01b0316638a0e833f3483600760009054906101000a90046001600160a01b0316600560049054906101000a900460e01b8e8e898e60006040516024016113a99594939291906124b3565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199485161790525160e087901b90921682526113f0939291600401612206565b6000604051808303818588803b15801561140957600080fd5b505af115801561141d573d6000803e3d6000fd5b505050505060008061143260008b8b89610bc6565b9650909250905084826114585760405162461bcd60e51b8152600401610afa9190612354565b506114616119c1565b735c55b921f590a89c1ebe84df170e655a82b621266001600160a01b031663d061ce50308589856040516020016114999291906125a9565b6040516020818303038152906040526040518463ffffffff1660e01b815260040161117693929190612290565b6001546001600160a01b031633146114dd57600080fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b0316331461151657600080fd5b622dc6c081106115385760405162461bcd60e51b8152600401610afa9061239e565b600455565b600554640100000000900460e01b81565b735a4f877ca808cca3cb7c2a194f80ab8588fae26b81565b60085460405163040b0d8960e51b81526000916001600160a01b031690638161b1209061159790859060040161231f565b60206040518083038186803b1580156115af57600080fd5b505afa1580156115c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115e79190611d96565b92915050565b600854604051632726b07360e01b8152600091829182916001600160a01b031690632726b0739061162290889060040161231f565b60206040518083038186803b15801561163a57600080fd5b505afa15801561164e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116729190611d96565b6009546040516309092f9760e21b815291925060009182916001600160a01b031690632424be5c906116aa9089908790600401612328565b604080518083038186803b1580156116c157600080fd5b505afa1580156116d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116f991906120df565b600954604051636cb1c69b60e11b81529294509092506000916001600160a01b039091169063d9638d3690611732908a9060040161231f565b60a06040518083038186803b15801561174a57600080fd5b505afa15801561175e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117829190612102565b505050915050826117938383611925565b95509550505050509250929050565b6007546001600160a01b031681565b600854604051632c2cb9fd60e01b815260009182916001600160a01b0390911690632c2cb9fd906117e690879060040161231f565b60206040518083038186803b1580156117fe57600080fd5b505afa158015611812573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118369190611ee0565b905060008315611846578361184f565b61184f826108fa565b905060008061185e87856115ed565b9150915080600014156118785760009450505050506115e7565b670de0b6b3a764000061189461188e84866119f7565b83611a1f565b8161189b57fe5b04979650505050505050565b6000546001600160a01b031633146118be57600080fd5b6001546001600160a01b0316156114dd57600080fd5b60025481565b735c55b921f590a89c1ebe84df170e655a82b6212681565b6001546001600160a01b031681565b600081158061191c5750508082028282828161191957fe5b04145b6115e757600080fd5b60006b033b2e3c9fd0803ce80000006119576119418585611901565b60026b033b2e3c9fd0803ce80000005b04611a43565b8161195e57fe5b049392505050565b6119bc8363a9059cbb60e01b84846040516024016119859291906122e5565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611a53565b505050565b47156119f55760405133904780156108fc02916000818181858888f193505050501580156119f3573d6000803e3d6000fd5b505b565b6000670de0b6b3a7640000611957611a0f8585611901565b6002670de0b6b3a7640000611951565b600081611957611a3b856b033b2e3c9fd0803ce8000000611901565b600285611951565b808201828110156115e757600080fd5b6060611aa8826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611ae29092919063ffffffff16565b8051909150156119bc5780806020019051810190611ac69190611ddd565b6119bc5760405162461bcd60e51b8152600401610afa90612469565b6060610aa184846000856060611af785611bb0565b611b135760405162461bcd60e51b8152600401610afa9061240c565b60006060866001600160a01b03168587604051611b3091906121d6565b60006040518083038185875af1925050503d8060008114611b6d576040519150601f19603f3d011682016040523d82523d6000602084013e611b72565b606091505b50915091508115611b86579150610aa19050565b805115611b965780518082602001fd5b8360405162461bcd60e51b8152600401610afa9190612354565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590610aa1575050151592915050565b6040805161010081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081019190915290565b80356115e78161260e565b80516115e78161260e565b805180151581146115e757600080fd5b600082601f830112611c63578081fd5b813567ffffffffffffffff811115611c79578182fd5b611c8c601f8201601f19166020016125b7565b9150808252836020828501011115611ca357600080fd5b8060208401602084013760009082016020015292915050565b8035600281106115e757600080fd5b600060c08284031215611cdc578081fd5b611ce660c06125b7565b90508135611cf38161260e565b81526020820135611d038161260e565b60208201526040820135611d168161260e565b80604083015250606082013560608201526080820135608082015260a082013567ffffffffffffffff811115611d4b57600080fd5b611d5784828501611c53565b60a08301525092915050565b80516001600160801b03811681146115e757600080fd5b600060208284031215611d8b578081fd5b81356108e48161260e565b600060208284031215611da7578081fd5b81516108e48161260e565b60008060408385031215611dc4578081fd5b8235611dcf8161260e565b946020939093013593505050565b600060208284031215611dee578081fd5b81516108e481612623565b600080828403610120811215611e0d578283fd5b8351611e1881612623565b9250610100601f198201811315611e2d578283fd5b611e36816125b7565b9150611e458660208701611d63565b8252611e548660408701611d63565b6020830152611e668660608701611d63565b6040830152611e788660808701611d63565b6060830152611e8a8660a08701611c38565b608083015260c085015160a0830152611ea68660e08701611c43565b60c0830152611eb786828701611c43565b60e083015250809150509250929050565b600060208284031215611ed9578081fd5b5035919050565b600060208284031215611ef1578081fd5b5051919050565b60008060408385031215611f0a578182fd5b8251611f158161260e565b6020939093015192949293505050565b600080600060608486031215611f39578081fd5b611f438585611cbc565b95602085013595506040909401359392505050565b60008060008060808587031215611f6d578182fd5b611f778686611cbc565b966020860135965060408601359560600135945092505050565b60008060008060808587031215611fa6578182fd5b843567ffffffffffffffff80821115611fbd578384fd5b818701915061014080838a031215611fd3578485fd5b611fdc816125b7565b9050611fe88984611c2d565b8152611ff78960208501611c2d565b602082015260408301356040820152606083013560608201526080830135608082015260a083013560a08201526120318960c08501611c2d565b60c08201526120438960e08501611c2d565b60e0820152610100808401358381111561205b578687fd5b6120678b828701611c53565b8284015250506101208084013583811115612080578687fd5b61208c8b828701611ccb565b82840152505080965050505060208501359250604085013591506120b38660608701611c2d565b905092959194509250565b600080604083850312156120d0578182fd5b50508035926020909101359150565b600080604083850312156120f1578182fd5b505080516020909101519092909150565b600080600080600060a08688031215612119578283fd5b5050835160208501516040860151606087015160809097015192989197509594509092509050565b6001600160a01b03169052565b600081518084526121668160208601602086016125de565b601f01601f19169290920160200192915050565b60ff169052565b600060018060a01b0380835116845280602084015116602085015280604084015116604085015250606082015160608401526080820151608084015260a082015160c060a0850152610aa160c085018261214e565b600082516121e88184602087016125de565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b038481168252831660208201526060604082018190526000906122329083018461214e565b95945050505050565b6001600160a01b03848116825283166020820152608060408201819052601190820152704175746f6d617469634d4344526570617960781b60a082015260c0606082018190526000906122329083018461214e565b6001600160a01b0384811682528316602082015260806040820181905260119082015270105d5d1bdb585d1a58d350d1109bdbdcdd607a1b60a082015260c0606082018190526000906122329083018461214e565b6001600160a01b03929092168252602082015260400190565b6000841515825283602083015260606040830152612232606083018461214e565b90815260200190565b9182526001600160a01b0316602082015260400190565b6001600160e01b031991909116815260200190565b6000602082526108e4602083018461214e565b60208082526019908201527f52657061792067617320636f7374206f766572206c696d697400000000000000604082015260600190565b60208082526019908201527f426f6f73742067617320636f7374206f766572206c696d697400000000000000604082015260600190565b6020808252601c908201527f4d617820676173207072696365206f76657220746865206c696d697400000000604082015260600190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252600c908201526b139bdd08185d5d1a08189bdd60a21b604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b600060a082526124c760a083018851612141565b60208701516124d960c0840182612141565b50604087015160e08301526060870151610100818185015260808901519150610120828186015260a08a01519250610140838187015260c08b01519350612524610160870185612141565b60e08b01519350612539610180870185612141565b828b01519350806101a0870152506125556101e086018461214e565b908a0151858203609f19016101c087015290925090506125758282612181565b925050508560208301528460408301526125926060830185612141565b61259f608083018461217a565b9695505050505050565b918252602082015260400190565b60405181810167ffffffffffffffff811182821017156125d657600080fd5b604052919050565b60005b838110156125f95781810151838201526020016125e1565b83811115612608576000848401525b50505050565b6001600160a01b03811681146119f357600080fd5b80151581146119f357600080fdfea2646970667358221220c999350d2e1b9943e8873ae08df2b1aad0834b75188488780fa9030bffc4854764736f6c634300060c0033

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

0000000000000000000000006b90059be44103b997b755f5d389dab6211fb7da

-----Decoded View---------------
Arg [0] : _newMcdSaverTakerAddress (address): 0x6B90059bE44103b997B755F5D389dAB6211Fb7Da

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000006b90059be44103b997b755f5d389dab6211fb7da


Deployed Bytecode Sourcemap

21073:10320:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27496:1313;;;;;;;;;;-1:-1:-1;27496:1313:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;21241:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;13471:122::-;;;;;;;;;;-1:-1:-1;13471:122:0;;;;;:::i;:::-;;:::i;:::-;;30120:212;;;;;;;;;;-1:-1:-1;30120:212:0;;;;;:::i;:::-;;:::i;22057:76::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;26622:223::-;;;;;;;;;;-1:-1:-1;26622:223:0;;;;;:::i;:::-;;:::i;21986:64::-;;;;;;;;;;;;;:::i;21193:41::-;;;;;;;;;;;;;:::i;31199:191::-;;;;;;;;;;-1:-1:-1;31199:191:0;;;;;:::i;:::-;;:::i;13766:285::-;;;;;;;;;;-1:-1:-1;13766:285:0;;;;;:::i;:::-;;:::i;13639:80::-;;;;;;;;;;;;;:::i;28901:1011::-;;;;;;;;;;-1:-1:-1;28901:1011:0;;;;;:::i;:::-;;:::i;21903:76::-;;;;;;;;;;;;;:::i;30912:178::-;;;;;;;;;;-1:-1:-1;30912:178:0;;;;;:::i;:::-;;:::i;21708:89::-;;;;;;;;;;;;;:::i;21291:41::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;21433:109::-;;;;;;;;;;;;;:::i;22718:1319::-;;;;;;:::i;:::-;;:::i;21549:108::-;;;;;;;;;;;;;:::i;12397:20::-;;;;;;;;;;;;;:::i;24219:1319::-;;;;;;:::i;:::-;;:::i;13250:122::-;;;;;;;;;;-1:-1:-1;13250:122:0;;;;;:::i;:::-;;:::i;30575:178::-;;;;;;;;;;-1:-1:-1;30575:178:0;;;;;:::i;:::-;;:::i;21361:41::-;;;;;;;;;;;;;:::i;21804:90::-;;;;;;;;;;;;;:::i;25983:110::-;;;;;;;;;;-1:-1:-1;25983:110:0;;;;;:::i;:::-;;:::i;26224:311::-;;;;;;;;;;-1:-1:-1;26224:311:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;21664:35::-;;;;;;;;;;;;;:::i;26969:385::-;;;;;;;;;;-1:-1:-1;26969:385:0;;;;;:::i;:::-;;:::i;12967:161::-;;;;;;;;;;-1:-1:-1;12967:161:0;;;;;:::i;:::-;;:::i;21133:39::-;;;;;;;;;;;;;:::i;22142:109::-;;;;;;;;;;;;;:::i;12424:20::-;;;;;;;;;;;;;:::i;27496:1313::-;27672:4;27691:7;27713:13;27757:15;27774:23;;:::i;:::-;27801:21;;:42;;-1:-1:-1;;;27801:42:0;;-1:-1:-1;;;;;27801:21:0;;;;:34;;:42;;27836:6;;27801:42;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27756:87;;;;27900:10;27895:49;;27920:5;27927:1;27912:32;;;;;;;;;;;;;-1:-1:-1;;;27912:32:0;;;;;;;;;;;;;27895:49;28023:1;28010:10;:14;:42;;;;;28029:6;:23;;;28028:24;28010:42;28006:113;;;28075:5;28082:1;28067:52;;;;;;;;;;;;;;;;;;;;;;;;;;;28006:113;28192:12;28181:7;:23;;;;;;;;;:47;;;;;28209:6;:19;;;28208:20;28181:47;28177:104;;;28251:5;28258:1;28243:38;;;;;;;;;;;;;-1:-1:-1;;;28243:38:0;;;;;;;;;;;;;28177:104;28360:6;:12;;;-1:-1:-1;;;;;28340:32:0;:16;28349:6;28340:8;:16::i;:::-;-1:-1:-1;;;;;28340:32:0;;28336:79;;28382:5;28389:1;28374:41;;;;;;;;;;;;;-1:-1:-1;;;28374:41:0;;;;;;;;;;;;;28336:79;28428:17;28448:28;28457:6;28465:10;28448:8;:28::i;:::-;28428:48;-1:-1:-1;28504:12:0;28493:7;:23;;;;;;;;;28489:272;;;28549:15;;-1:-1:-1;;;;;28537:27:0;;;28533:78;;;28574:5;28581:1;28566:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;28533:78;28489:272;;;28644:12;28633:7;:23;;;;;;;;;28629:132;;;28689:6;:15;;;-1:-1:-1;;;;;28677:27:0;:9;:27;28673:76;;;28714:5;28721:1;28706:43;;;;;;;;;;;;;-1:-1:-1;;;28706:43:0;;;;;;;;;;;;;;28673:76;28773:28;;;;;;;;;-1:-1:-1;28773:28:0;;28781:4;;-1:-1:-1;28787:9:0;;-1:-1:-1;28773:28:0;-1:-1:-1;;;27496:1313:0;;;;;;;;:::o;21241:41::-;;;;:::o;13471:122::-;13552:5;;-1:-1:-1;;;;;13552:5:0;13538:10;:19;13530:28;;;;;;13571:5;:14;;-1:-1:-1;;;;;;13571:14:0;-1:-1:-1;;;;;13571:14:0;;;;;;;;;;13471:122::o;30120:212::-;30182:7;30202:16;30236:13;;30221:11;:28;;:58;;30266:13;;30221:58;;;30252:11;30221:58;30202:77;;30299:25;30303:8;30313:10;30299:3;:25::i;:::-;30292:32;30120:212;-1:-1:-1;;;30120:212:0:o;22057:76::-;;;-1:-1:-1;;;;;22057:76:0;;:::o;26622:223::-;26713:7;;:18;;-1:-1:-1;;;26713:18:0;;26675:7;;;;-1:-1:-1;;;;;26713:7:0;;;;:12;;:18;;26726:4;;26713:18;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26767:3;;:14;;-1:-1:-1;;;26767:14:0;;26695:36;;-1:-1:-1;26747:12:0;;-1:-1:-1;;;;;;26767:3:0;;:8;;:14;;26776:4;;26767:14;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26742:39;;;;;;26801:36;26806:25;26811:4;26817:7;;;;;;;;;-1:-1:-1;;;;;26817:7:0;-1:-1:-1;;;;;26817:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26806:4;:25::i;:::-;26833:3;26801:4;:36::i;:::-;26794:43;26622:223;-1:-1:-1;;;;26622:223:0:o;21986:64::-;;;-1:-1:-1;;;;;21986:64:0;;:::o;21193:41::-;;;;:::o;31199:191::-;12493:5;;-1:-1:-1;;;;;12493:5:0;12502:10;12493:19;12485:28;;;;;;31299:9:::1;31284:12;:24;31276:65;;;;-1:-1:-1::0;;;31276:65:0::1;;;;;;;:::i;:::-;;;;;;;;;31354:13;:28:::0;31199:191::o;13766:285::-;12493:5;;-1:-1:-1;;;;;12493:5:0;12502:10;12493:19;12485:28;;;;;;13866:42:::1;-1:-1:-1::0;;;;;13856:52:0;::::1;;13852:192;;;13933:5;::::0;;13925:32:::1;::::0;-1:-1:-1;;;;;13933:5:0;;::::1;::::0;13925:32;::::1;;;::::0;13949:7;;13925:32;13933:5;13925:32;13949:7;13933:5;13925:32;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;13852:192;;;14017:5;::::0;13990:42:::1;::::0;-1:-1:-1;;;;;13990:26:0;;::::1;::::0;14017:5:::1;14024:7:::0;13990:26:::1;:42::i;:::-;13766:285:::0;;:::o;13639:80::-;12493:5;;-1:-1:-1;;;;;12493:5:0;12502:10;12493:19;12485:28;;;;;;13704:5:::1;::::0;-1:-1:-1;;;;;13704:5:0::1;13683:28;28901:1011:::0;29104:4;29123:7;29145:13;29191:23;;:::i;:::-;29218:21;;:42;;-1:-1:-1;;;29218:42:0;;-1:-1:-1;;;;;29218:21:0;;;;:34;;:42;;29253:6;;29218:42;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29188:72;;;29271:17;29291:28;29300:6;29308:10;29291:8;:28::i;:::-;29271:48;-1:-1:-1;29347:12:0;29336:7;:23;;;;;;;;;29332:532;;;29393:6;:15;;;-1:-1:-1;;;;;29380:28:0;:9;:28;29376:110;;29435:5;29442:9;29427:59;;;;;;;;;;;;;;;;;;;;;;;;;;;29376:110;29518:12;29505:9;:25;29501:82;;29540:5;29547:9;29532:51;;;;;;;;;;;;;-1:-1:-1;;;29532:51:0;;;;;;;;;;;;;29501:82;29332:532;;;29616:12;29605:7;:23;;;;;;;;;29601:263;;;29662:15;;-1:-1:-1;;;;;29649:28:0;;;29645:108;;29704:5;29711:9;29696:57;;;;;;;;;;;;;;;;;;;;;;;;;;;29645:108;29785:12;29772:9;:25;29768:84;;29807:5;29814:9;29799:53;;;;;;;;;;;;;;;;;;;;;;;;;;;29768:84;29876:28;;;;;;;;;-1:-1:-1;29876:28:0;;29884:4;;-1:-1:-1;29890:9:0;;-1:-1:-1;29876:28:0;-1:-1:-1;;28901:1011:0;;;;;;;;;:::o;21903:76::-;;;-1:-1:-1;;;;;21903:76:0;;:::o;30912:178::-;12493:5;;-1:-1:-1;;;;;12493:5:0;12502:10;12493:19;12485:28;;;;;;31005:9:::1;30994:8;:20;30986:58;;;;-1:-1:-1::0;;;30986:58:0::1;;;;;;;:::i;:::-;31057:14;:25:::0;30912:178::o;21708:89::-;21755:42;21708:89;:::o;21291:41::-;;;;;;:::o;21433:109::-;;;;;;-1:-1:-1;;;;;21433:109:0;;:::o;22718:1319::-;22303:53;;-1:-1:-1;;;22303:53:0;;21755:42;;22303:41;;:53;;22345:10;;22303:53;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22295:78;;;;-1:-1:-1;;;22295:78:0;;;;;;;:::i;:::-;22924:14:::1;22949:19:::0;22979:23:::1;23053:102;23086:12;23113:6;23134:10;23053:18;:102::i;:::-;23015:140:::0;;-1:-1:-1;23015:140:0;-1:-1:-1;23015:140:0;-1:-1:-1;23015:140:0;;23166:29:::1;;;;-1:-1:-1::0;;;23166:29:0::1;;;;;;;;:::i;:::-;;23208:15;23226:27;23238:14;;23226:11;:27::i;:::-;23287:21;::::0;:38:::1;::::0;-1:-1:-1;;;23287:38:0;;23208:45;;-1:-1:-1;23266:18:0::1;::::0;-1:-1:-1;;;;;23287:21:0;;::::1;::::0;:30:::1;::::0;:38:::1;::::0;23318:6;;23287:38:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23266:59;;23338:20;;;;;;;;;-1:-1:-1::0;;;;;23338:20:0::1;-1:-1:-1::0;;;;;23338:32:0::1;;23378:9;23403:10;23428:20;;;;;;;;;-1:-1:-1::0;;;;;23428:20:0::1;23486:14;;;;;;;;;;;23502:13;23517:6;23525:7;23534:9;23545:1;23463:84;;;;;;;;;;;;:::i;:::-;;::::0;;-1:-1:-1;;23463:84:0;;::::1;::::0;;;;;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;23463:84:0::1;-1:-1:-1::0;;;;;;23463:84:0;;::::1;;::::0;;23338:220;::::1;::::0;;;;;;;;::::1;::::0;;;::::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;23571:16;23598:18:::0;23668:124:::1;23697:12;23724:6;23745:10;23770:11;23668:14;:124::i;:::-;23629:163:::0;-1:-1:-1;23629:163:0;;-1:-1:-1;23629:163:0;-1:-1:-1;23629:163:0;;23803:31:::1;;;;-1:-1:-1::0;;;23803:31:0::1;;;;;;;;:::i;:::-;;23847:11;:9;:11::i;:::-;22208:42;-1:-1:-1::0;;;;;23871:10:0::1;;23904:4;23924:10;23994:11;24007:10;23983:35;;;;;;;;;:::i;:::-;;;;;;;;;;;;;23871:158;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;22384:1;;;;;;;22718:1319:::0;;;;:::o;21549:108::-;;;-1:-1:-1;;;;;21549:108:0;;:::o;12397:20::-;;;-1:-1:-1;;;;;12397:20:0;;:::o;24219:1319::-;22303:53;;-1:-1:-1;;;22303:53:0;;21755:42;;22303:41;;:53;;22345:10;;22303:53;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22295:78;;;;-1:-1:-1;;;22295:78:0;;;;;;;:::i;:::-;24425:14:::1;24450:19:::0;24480:23:::1;24554:102;24587:12;24614:6;24635:10;24554:18;:102::i;:::-;24516:140:::0;;-1:-1:-1;24516:140:0;-1:-1:-1;24516:140:0;-1:-1:-1;24516:140:0;;24667:29:::1;;;;-1:-1:-1::0;;;24667:29:0::1;;;;;;;;:::i;:::-;;24709:15;24727:27;24739:14;;24727:11;:27::i;:::-;24788:21;::::0;:38:::1;::::0;-1:-1:-1;;;24788:38:0;;24709:45;;-1:-1:-1;24767:18:0::1;::::0;-1:-1:-1;;;;;24788:21:0;;::::1;::::0;:30:::1;::::0;:38:::1;::::0;24819:6;;24788:38:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24767:59;;24839:20;;;;;;;;;-1:-1:-1::0;;;;;24839:20:0::1;-1:-1:-1::0;;;;;24839:32:0::1;;24879:9;24904:10;24929:20;;;;;;;;;-1:-1:-1::0;;;;;24929:20:0::1;24987:14;;;;;;;;;;;25003:13;25018:6;25026:7;25035:9;25046:1;24964:84;;;;;;;;;;;;:::i;:::-;;::::0;;-1:-1:-1;;24964:84:0;;::::1;::::0;;;;;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;24964:84:0::1;-1:-1:-1::0;;;;;;24964:84:0;;::::1;;::::0;;24839:220;::::1;::::0;;;;;;;;::::1;::::0;;;::::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;25072:16;25099:18:::0;25169:124:::1;25198:12;25225:6;25246:10;25271:11;25169:14;:124::i;:::-;25130:163:::0;-1:-1:-1;25130:163:0;;-1:-1:-1;25130:163:0;-1:-1:-1;25130:163:0;;25304:31:::1;;;;-1:-1:-1::0;;;25304:31:0::1;;;;;;;;:::i;:::-;;25348:11;:9;:11::i;:::-;22208:42;-1:-1:-1::0;;;;;25372:10:0::1;;25405:4;25425:10;25495:11;25508:10;25484:35;;;;;;;;;:::i;:::-;;;;;;;;;;;;;25372:158;;;;;;;;;;;;;;;;;:::i;13250:122::-:0;13331:5;;-1:-1:-1;;;;;13331:5:0;13317:10;:19;13309:28;;;;;;13350:5;:14;;-1:-1:-1;;;;;;13350:14:0;-1:-1:-1;;;;;13350:14:0;;;;;;;;;;13250:122::o;30575:178::-;12493:5;;-1:-1:-1;;;;;12493:5:0;12502:10;12493:19;12485:28;;;;;;30668:9:::1;30657:8;:20;30649:58;;;;-1:-1:-1::0;;;30649:58:0::1;;;;;;;:::i;:::-;30720:14;:25:::0;30575:178::o;21361:41::-;;;;;;;;;:::o;21804:90::-;21852:42;21804:90;:::o;25983:110::-;26065:7;;:20;;-1:-1:-1;;;26065:20:0;;26038:7;;-1:-1:-1;;;;;26065:7:0;;:12;;:20;;26078:6;;26065:20;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26058:27;25983:110;-1:-1:-1;;25983:110:0:o;26224:311::-;26338:7;;:20;;-1:-1:-1;;;26338:20:0;;26295:7;;;;;;-1:-1:-1;;;;;26338:7:0;;:12;;:20;;26351:6;;26338:20;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26408:3;;:19;;-1:-1:-1;;;26408:19:0;;26324:34;;-1:-1:-1;26372:18:0;;;;-1:-1:-1;;;;;26408:3:0;;:8;;:19;;26417:4;;26324:34;;26408:19;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26463:3;;:14;;-1:-1:-1;;;26463:14:0;;26371:56;;-1:-1:-1;26371:56:0;;-1:-1:-1;26441:12:0;;-1:-1:-1;;;;;26463:3:0;;;;:8;;:14;;26472:4;;26463:14;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26438:39;;;;;;26498:10;26510:16;26515:4;26521;26510;:16::i;:::-;26490:37;;;;;;;;26224:311;;;;;:::o;21664:35::-;;;-1:-1:-1;;;;;21664:35:0;;:::o;26969:385::-;27078:7;;:20;;-1:-1:-1;;;27078:20:0;;27044:7;;;;-1:-1:-1;;;;;27078:7:0;;;;:12;;:20;;27091:6;;27078:20;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27064:34;-1:-1:-1;27109:13:0;27126:15;;27125:46;;27161:10;27125:46;;;27145:13;27154:3;27145:8;:13::i;:::-;27109:62;;27185:18;27205:12;27221:23;27232:6;27240:3;27221:10;:23::i;:::-;27184:60;;;;27261:4;27269:1;27261:9;27257:23;;;27279:1;27272:8;;;;;;;;27257:23;27339:6;27300:35;27305:23;27310:10;27322:5;27305:4;:23::i;:::-;27330:4;27300;:35::i;:::-;:46;;;;;;;26969:385;-1:-1:-1;;;;;;;26969:385:0:o;12967:161::-;13048:5;;-1:-1:-1;;;;;13048:5:0;13034:10;:19;13026:28;;;;;;13073:5;;-1:-1:-1;;;;;13073:5:0;:19;13065:28;;;;;21133:39;;;;:::o;22142:109::-;22208:42;22142:109;:::o;12424:20::-;;;-1:-1:-1;;;;;12424:20:0;;:::o;2713:127::-;2771:9;2801:6;;;:30;;-1:-1:-1;;2816:5:0;;;2830:1;2825;2816:5;2825:1;2811:15;;;;;:20;2801:30;2793:39;;;;;3624:122;3683:9;3479:6;3709:23;3713:9;3717:1;3720;3713:3;:9::i;:::-;3730:1;3479:6;3724:7;;3709:3;:23::i;:::-;:29;;;;;;;3624:122;-1:-1:-1;;;3624:122:0:o;10442:176::-;10524:86;10544:5;10574:23;;;10599:2;10603:5;10551:58;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;10551:58:0;;;;;;;;;;;;;;-1:-1:-1;;;;;10551:58:0;-1:-1:-1;;;;;;10551:58:0;;;;;;;;;;10524:19;:86::i;:::-;10442:176;;;:::o;25623:184::-;25704:21;:25;25700:100;;25746:42;;:10;;25766:21;25746:42;;;;;;;;;25766:21;25746:10;:42;;;;;;;;;;;;;;;;;;;;;25700:100;25623:184::o;3494:122::-;3553:9;3443:6;3579:23;3583:9;3587:1;3590;3583:3;:9::i;:::-;3600:1;3443:6;3594:7;;3882:120;3941:9;3993:1;3967:23;3971:11;3975:1;3479:6;3971:3;:11::i;:::-;3988:1;3984;:5;;2471:113;2564:5;;;2559:16;;;;2551:25;;;;;11911:419;11993:23;12019:69;12047:4;12019:69;;;;;;;;;;;;;;;;;12027:5;-1:-1:-1;;;;;12019:27:0;;;:69;;;;;:::i;:::-;12103:17;;11993:95;;-1:-1:-1;12103:21:0;12099:224;;12245:10;12234:30;;;;;;;;;;;;:::i;:::-;12226:85;;;;-1:-1:-1;;;12226:85:0;;;;;;;:::i;6833:196::-;6936:12;6968:53;6991:6;6999:4;7005:1;7008:12;7725;7758:18;7769:6;7758:10;:18::i;:::-;7750:60;;;;-1:-1:-1;;;7750:60:0;;;;;;;:::i;:::-;7884:12;7898:23;7925:6;-1:-1:-1;;;;;7925:11:0;7945:8;7956:4;7925:36;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7883:78;;;;7976:7;7972:595;;;8007:10;-1:-1:-1;8000:17:0;;-1:-1:-1;8000:17:0;7972:595;8121:17;;:21;8117:439;;8384:10;8378:17;8445:15;8432:10;8428:2;8424:19;8417:44;8332:148;8527:12;8520:20;;-1:-1:-1;;;8520:20:0;;;;;;;;:::i;5620:619::-;5680:4;6148:20;;5991:66;6188:23;;;;;;:42;;-1:-1:-1;;6215:15:0;;;5620:619;-1:-1:-1;;5620:619:0:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;5:130::-;72:20;;97:33;72:20;97:33;:::i;142:134::-;220:13;;238:33;220:13;238:33;:::i;283:128::-;358:13;;35402;;35395:21;39211:32;;39201:2;;39257:1;;39247:12;697:440;;798:3;791:4;783:6;779:17;775:27;765:2;;-1:-1;;806:12;765:2;853:6;840:20;34139:18;34131:6;34128:30;34125:2;;;-1:-1;;34161:12;34125:2;875:64;34234:9;34215:17;;-1:-1;;34211:33;34302:4;34292:15;875:64;:::i;:::-;866:73;;959:6;952:5;945:21;1063:3;34302:4;1054:6;987;1045:16;;1042:25;1039:2;;;1080:1;;1070:12;1039:2;38577:6;34302:4;987:6;983:17;34302:4;1021:5;1017:16;38554:30;38633:1;38615:16;;;34302:4;38615:16;38608:27;1021:5;758:379;-1:-1;;758:379::o;1326:152::-;1404:20;;39641:1;39631:12;;39621:2;;39657:1;;39647:12;5003:1179;;5122:4;5110:9;5105:3;5101:19;5097:30;5094:2;;;-1:-1;;5130:12;5094:2;5158:20;5122:4;5158:20;:::i;:::-;5149:29;;85:6;72:20;97:33;124:5;97:33;:::i;:::-;5238:75;;5382:2;5436:22;;72:20;97:33;72:20;97:33;:::i;:::-;5382:2;5397:16;;5390:75;5537:2;5591:22;;72:20;97:33;72:20;97:33;:::i;:::-;5570:49;5537:2;5556:5;5552:16;5545:75;;5682:2;5740:9;5736:22;6397:20;5682:2;5701:5;5697:16;5690:75;5833:3;5892:9;5888:22;6397:20;5833:3;5853:5;5849:16;5842:75;6010:3;5999:9;5995:19;5982:33;6035:18;6027:6;6024:30;6021:2;;;-1:-1;;6057:12;6021:2;6102:58;6156:3;6147:6;6136:9;6132:22;6102:58;:::i;:::-;6010:3;6088:5;6084:16;6077:84;;5088:1094;;;;:::o;6189:134::-;6267:13;;-1:-1;;;;;35838:46;;39732:35;;39722:2;;39781:1;;39771:12;6608:241;;6712:2;6700:9;6691:7;6687:23;6683:32;6680:2;;;-1:-1;;6718:12;6680:2;85:6;72:20;97:33;124:5;97:33;:::i;6856:263::-;;6971:2;6959:9;6950:7;6946:23;6942:32;6939:2;;;-1:-1;;6977:12;6939:2;226:6;220:13;238:33;265:5;238:33;:::i;7126:366::-;;;7247:2;7235:9;7226:7;7222:23;7218:32;7215:2;;;-1:-1;;7253:12;7215:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;7305:63;7405:2;7444:22;;;;6397:20;;-1:-1;;;7209:283::o;7499:257::-;;7611:2;7599:9;7590:7;7586:23;7582:32;7579:2;;;-1:-1;;7617:12;7579:2;364:6;358:13;376:30;400:5;376:30;:::i;7763:448::-;;;7907:9;7898:7;7894:23;7919:3;7894:23;7890:33;7887:2;;;-1:-1;;7926:12;7887:2;364:6;358:13;376:30;400:5;376:30;:::i;:::-;7978:71;-1:-1;1644:6;-1:-1;;1623:19;;1619:32;-1:-1;1616:2;;;-1:-1;;1654:12;1616:2;1682:22;1644:6;1682:22;:::i;:::-;1673:31;;1790:60;1846:3;8086:2;8167:9;8163:22;1790:60;:::i;:::-;1772:16;1765:86;1949:60;2005:3;1981:22;8167:9;1981:22;1949:60;:::i;:::-;8086:2;1935:5;1931:16;1924:86;2117:60;2173:3;2149:22;8167:9;2149:22;2117:60;:::i;:::-;1981:22;2103:5;2099:16;2092:86;2285:60;2341:3;2317:22;8167:9;2317:22;2285:60;:::i;:::-;2149:22;2271:5;2267:16;2260:86;2442:60;2498:3;2474:22;8167:9;2474:22;2442:60;:::i;:::-;2317:22;2428:5;2424:16;2417:86;2631:22;8167:9;2631:22;6545:13;2474:22;2585:5;2581:16;2574:86;2763:57;2816:3;2792:22;8167:9;2792:22;2763:57;:::i;:::-;2631:22;2749:5;2745:16;2738:83;2928:57;2981:3;1644:6;8167:9;2957:22;2928:57;:::i;:::-;2792:22;2914:5;2910:16;2903:83;;8094:101;;;;7881:330;;;;;:::o;8218:241::-;;8322:2;8310:9;8301:7;8297:23;8293:32;8290:2;;;-1:-1;;8328:12;8290:2;-1:-1;485:20;;8284:175;-1:-1;8284:175::o;8466:263::-;;8581:2;8569:9;8560:7;8556:23;8552:32;8549:2;;;-1:-1;;8587:12;8549:2;-1:-1;633:13;;8543:186;-1:-1;8543:186::o;8736:439::-;;;8888:2;8876:9;8867:7;8863:23;8859:32;8856:2;;;-1:-1;;8894:12;8856:2;1249:6;1243:13;1261:53;1308:5;1261:53;:::i;:::-;9077:2;9127:22;;;;6545:13;8946:94;;6545:13;;-1:-1;;;8850:325::o;9182:513::-;;;;9331:2;9319:9;9310:7;9306:23;9302:32;9299:2;;;-1:-1;;9337:12;9299:2;9399:64;9455:7;9431:22;9399:64;:::i;:::-;9389:74;9500:2;9539:22;;6397:20;;-1:-1;9608:2;9647:22;;;6397:20;;9293:402;-1:-1;;;9293:402::o;9702:639::-;;;;;9868:3;9856:9;9847:7;9843:23;9839:33;9836:2;;;-1:-1;;9875:12;9836:2;9937:64;9993:7;9969:22;9937:64;:::i;:::-;9927:74;10038:2;10077:22;;6397:20;;-1:-1;10146:2;10185:22;;6397:20;;10254:2;10293:22;6397:20;;-1:-1;9830:511;-1:-1;;;9830:511::o;10348:763::-;;;;;10533:3;10521:9;10512:7;10508:23;10504:33;10501:2;;;-1:-1;;10540:12;10501:2;10598:17;10585:31;10636:18;;10628:6;10625:30;10622:2;;;-1:-1;;10658:12;10622:2;10754:6;10743:9;10739:22;;;3175:6;;3163:9;3158:3;3154:19;3150:32;3147:2;;;-1:-1;;3185:12;3147:2;3213:22;3175:6;3213:22;:::i;:::-;3204:31;;3320:49;3365:3;3341:22;3320:49;:::i;:::-;3302:16;3295:75;3468:49;3513:3;3435:2;3493:9;3489:22;3468:49;:::i;:::-;3435:2;3454:5;3450:16;3443:75;3584:2;3642:9;3638:22;6397:20;3584:2;3603:5;3599:16;3592:75;3734:2;3792:9;3788:22;6397:20;3734:2;3753:5;3749:16;3742:75;10533:3;3941:9;3937:22;6397:20;10533:3;3902:5;3898:16;3891:75;4036:3;4095:9;4091:22;6397:20;4036:3;4056:5;4052:16;4045:75;4215:49;4260:3;4181;4240:9;4236:22;4215:49;:::i;:::-;4181:3;4201:5;4197:16;4190:75;4363:49;4408:3;4329;4388:9;4384:22;4363:49;:::i;:::-;4329:3;4349:5;4345:16;4338:75;4509:3;;4498:9;4494:19;4481:33;10636:18;4526:6;4523:30;4520:2;;;-1:-1;;4556:12;4520:2;4603:58;4657:3;4648:6;4637:9;4633:22;4603:58;:::i;:::-;4509:3;4587:5;4583:18;4576:86;;;4759:3;;4748:9;4744:19;4731:33;10636:18;4776:6;4773:30;4770:2;;;-1:-1;;4806:12;4770:2;4853:79;4928:3;4919:6;4908:9;4904:22;4853:79;:::i;:::-;4759:3;4837:5;4833:18;4826:107;;;10678:93;;;;;;3435:2;10851:9;10847:22;6397:20;10816:63;;3584:2;10959:9;10955:22;6397:20;10924:63;;11042:53;11087:7;3734:2;11067:9;11063:22;11042:53;:::i;:::-;11032:63;;10495:616;;;;;;;:::o;11636:366::-;;;11757:2;11745:9;11736:7;11732:23;11728:32;11725:2;;;-1:-1;;11763:12;11725:2;-1:-1;;6397:20;;;11915:2;11954:22;;;485:20;;-1:-1;11719:283::o;12382:399::-;;;12514:2;12502:9;12493:7;12489:23;12485:32;12482:2;;;-1:-1;;12520:12;12482:2;-1:-1;;6545:13;;12683:2;12733:22;;;6545:13;;;;;-1:-1;12476:305::o;12788:809::-;;;;;;12971:3;12959:9;12950:7;12946:23;12942:33;12939:2;;;-1:-1;;12978:12;12939:2;-1:-1;;6545:13;;13141:2;13191:22;;6545:13;13260:2;13310:22;;6545:13;13379:2;13429:22;;6545:13;13498:3;13549:22;;;6545:13;;;;;-1:-1;6545:13;;-1:-1;6545:13;;-1:-1;12933:664;-1:-1;12933:664::o;13753:103::-;-1:-1;;;;;35958:54;13814:37;;13808:48::o;14331:323::-;;14463:5;34411:12;34686:6;34681:3;34674:19;14546:52;14591:6;34723:4;34718:3;34714:14;34723:4;14572:5;14568:16;14546:52;:::i;:::-;34234:9;38994:14;-1:-1;;38990:28;14610:39;;;;34723:4;14610:39;;14411:243;-1:-1;;14411:243::o;16404:138::-;36174:4;36163:16;16481:56;;16475:67::o;21762:1219::-;;34139:18;;35969:42;;;;21988:16;21982:23;35958:54;13821:3;13814:37;35969:42;22161:4;22154:5;22150:16;22144:23;35958:54;22161:4;22225:3;22221:14;13814:37;35969:42;22326:4;22319:5;22315:16;22309:23;35958:54;22326:4;22390:3;22386:14;13814:37;;22481:4;22474:5;22470:16;22464:23;22481:4;22545:3;22541:14;14165:37;22642:4;22635:5;22631:16;22625:23;22642:4;22706:3;22702:14;14165:37;22800:4;22793:5;22789:16;22783:23;21913:4;22800;22830:3;22826:14;22819:38;22872:71;21913:4;21908:3;21904:14;22924:12;22872:71;:::i;23218:271::-;;15171:5;34411:12;15282:52;15327:6;15322:3;15315:4;15308:5;15304:16;15282:52;:::i;:::-;15346:16;;;;;23352:137;-1:-1;;23352:137::o;23496:222::-;-1:-1;;;;;35958:54;;;;13814:37;;23623:2;23608:18;;23594:124::o;23970:528::-;-1:-1;;;;;35958:54;;;13814:37;;35958:54;;24335:2;24320:18;;13814:37;24171:2;24372;24357:18;;24350:48;;;23970:528;;24412:76;;24156:18;;24474:6;24412:76;:::i;:::-;24404:84;24142:356;-1:-1;;;;;24142:356::o;24505:834::-;-1:-1;;;;;35958:54;;;13814:37;;35958:54;;24972:2;24957:18;;13814:37;24807:3;25009:2;24994:18;;24987:48;;;18133:2;24792:19;;;34674;-1:-1;;;35969:42;34714:14;;18149:40;18208:12;25213:2;25198:18;;25191:48;;;24505:834;;25253:76;;18208:12;;25315:6;25253:76;:::i;25346:834::-;-1:-1;;;;;35958:54;;;13814:37;;35958:54;;25813:2;25798:18;;13814:37;25648:3;25850:2;25835:18;;25828:48;;;18459:2;25633:19;;;34674;-1:-1;;;35969:42;34714:14;;18475:40;18534:12;26054:2;26039:18;;26032:48;;;25346:834;;26094:76;;18534:12;;26156:6;26094:76;:::i;26187:333::-;-1:-1;;;;;35958:54;;;;13814:37;;26506:2;26491:18;;14165:37;26342:2;26327:18;;26313:207::o;26527:520::-;;14075:5;35402:13;35395:21;14055:3;14048:34;14195:5;26882:2;26871:9;26867:18;14165:37;26724:2;26919;26908:9;26904:18;26897:48;26959:78;26724:2;26713:9;26709:18;27023:6;26959:78;:::i;27054:222::-;14165:37;;;27181:2;27166:18;;27152:124::o;27283:333::-;14165:37;;;-1:-1;;;;;35958:54;27602:2;27587:18;;13814:37;27438:2;27423:18;;27409:207::o;27623:218::-;-1:-1;;;;;;35568:78;;;;14283:36;;27748:2;27733:18;;27719:122::o;29454:310::-;;29601:2;29622:17;29615:47;29676:78;29601:2;29590:9;29586:18;29740:6;29676:78;:::i;29771:416::-;29971:2;29985:47;;;17128:2;29956:18;;;34674:19;17164:27;34714:14;;;17144:48;17211:12;;;29942:245::o;30194:416::-;30394:2;30408:47;;;17462:2;30379:18;;;34674:19;17498:27;34714:14;;;17478:48;17545:12;;;30365:245::o;30617:416::-;30817:2;30831:47;;;17796:2;30802:18;;;34674:19;17832:30;34714:14;;;17812:51;17882:12;;;30788:245::o;31040:416::-;31240:2;31254:47;;;18785:2;31225:18;;;34674:19;18821:31;34714:14;;;18801:52;18872:12;;;31211:245::o;31463:416::-;31663:2;31677:47;;;19123:2;31648:18;;;34674:19;-1:-1;;;34714:14;;;19139:35;19193:12;;;31634:245::o;31886:416::-;32086:2;32100:47;;;19444:2;32071:18;;;34674:19;19480:34;34714:14;;;19460:55;-1:-1;;;19535:12;;;19528:34;19581:12;;;32057:245::o;32309:848::-;;32614:3;32636:17;32629:47;19949:63;32614:3;32603:9;32599:19;19926:16;19920:23;19949:63;:::i;:::-;20095:4;20088:5;20084:16;20078:23;20107:63;20155:14;32603:9;20155:14;20141:12;20107:63;:::i;:::-;;20254:4;20247:5;20243:16;20237:23;20314:14;32603:9;20314:14;14165:37;20414:4;20407:5;20403:16;20397:23;20474:14;20397:23;20474:14;32603:9;20474:14;14165:37;20572:4;20565:5;20561:16;20555:23;;;20632:14;20555:23;20632:14;32603:9;20632:14;14165:37;32614:3;20728:5;20724:16;20718:23;;;19849:6;20718:23;19849:6;32603:9;20795:14;14165:37;20155:14;20882:5;20878:16;20872:23;20852:43;;20901:63;20949:14;32603:9;20949:14;20935:12;20901:63;:::i;:::-;20314:14;21039:5;21035:16;21029:23;21009:43;;21058:63;21106:14;32603:9;21106:14;21092:12;21058:63;:::i;:::-;20474:14;21200:5;21196:18;21190:25;21170:45;;19849:6;21235:16;32603:9;21235:16;21228:40;;21283:71;19840:16;32603:9;19840:16;21335:12;21283:71;:::i;:::-;21436:18;;;21430:25;21493:14;;;-1:-1;;21493:14;21475:16;;;21468:40;21275:79;;-1:-1;21430:25;-1:-1;21523:113;21275:79;21430:25;21523:113;:::i;:::-;32682:126;;;;14195:5;20095:4;32876:9;32872:18;14165:37;14195:5;20254:4;32959:9;32955:18;14165:37;32985:72;20414:4;33042:9;33038:18;33029:6;32985:72;:::i;:::-;33068:79;20572:4;33131:9;33127:19;33118:6;33068:79;:::i;:::-;32585:572;;;;;;;;:::o;33393:333::-;14165:37;;;33712:2;33697:18;;14165:37;33548:2;33533:18;;33519:207::o;33733:256::-;33795:2;33789:9;33821:17;;;33896:18;33881:34;;33917:22;;;33878:62;33875:2;;;33953:1;;33943:12;33875:2;33795;33962:22;33773:216;;-1:-1;33773:216::o;38650:268::-;38715:1;38722:101;38736:6;38733:1;38730:13;38722:101;;;38803:11;;;38797:18;38784:11;;;38777:39;38758:2;38751:10;38722:101;;;38838:6;38835:1;38832:13;38829:2;;;38715:1;38894:6;38889:3;38885:16;38878:27;38829:2;;38699:219;;;:::o;39031:117::-;-1:-1;;;;;35958:54;;39090:35;;39080:2;;39139:1;;39129:12;39155:111;39236:5;35402:13;35395:21;39214:5;39211:32;39201:2;;39257:1;;39247:12

Swarm Source

ipfs://c999350d2e1b9943e8873ae08df2b1aad0834b75188488780fa9030bffc48547

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  ]

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.