ETH Price: $3,459.07 (-1.80%)
Gas: 2 Gwei

Token

Cowboy.Finance (MILK)
 

Overview

Max Total Supply

7,423,512.293701909141109225 MILK

Holders

290

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
1,585.80151535 MILK

Value
$0.00
0xb449ed45be255623fefada2bc15a56c121fba78e
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Milk

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 777 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0 <0.7.0;


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

        return c;
    }

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

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

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

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

        return c;
    }

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

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

        return c;
    }

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

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

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

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

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

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

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

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

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

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


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

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


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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () internal {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(_owner == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

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

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


interface IStableV2 {
    // Stable balances management
    function update() external;
    // Management functions callable only be Milker
    function shareMilk(address taker) external returns (uint256);
    function bandits(uint256 amount) external returns (uint256, uint256, uint256);
    // Contract getters
    function milker() external view returns (address);
    function token() external view returns (address);
    function startTime() external view returns (uint256);
    function stakerTokens(address staker) external view returns (uint256);
    function stakerCorrection(address staker) external view returns (uint256);
    function tokenSupply() external view returns (uint256);
    function milkSupply() external view returns (uint256);
    // MILK production related getters
    function level() external view returns (uint256);
    function levelProgress() external view returns (uint256);
    function production() external view returns (uint256);
    function produced() external view returns (uint256);
    function distributed() external view returns (uint256);
    function pending() external view returns (uint256);
    function pendingTo(address account) external view returns (uint256);
}

interface IMilker is IERC20 {
    // Token management accessed only from StableV2 contracts
    function produceMilk(uint256 amount) external returns (uint256);
    function takeMilk(address account) external returns (uint256);
    // Primary MILK tokenomics events
    function bandits(uint256 percent) external returns (uint256, uint256, uint256);
    function sheriffsVaultCommission() external returns (uint256);
    function sheriffsPotDistribution() external returns (uint256);
    // Getters
    function startTime() external view returns (uint256);
    function isWhitelisted(address account) external view returns (bool);
    function vaultOf(address account) external view returns (uint256);
    function period() external view returns (uint256);
    function periodProgress() external view returns (uint256);
    function periodLength() external view returns (uint256);
    function production() external view returns (uint256);
    function producedTotal() external view returns (uint256);
    function distributedTotal() external view returns (uint256);
    function pendingTotal() external view returns (uint256);
    function pendingTo(address account) external view returns (uint256);
}

// solium-disable security/no-block-members

contract StableV2 is Ownable, IStableV2 {
    using SafeMath for uint256;

    // Stable contains info related to each staker.
    struct Staker {
        uint256 amount;      // amount of tokens currently staked to the Stable
        uint256 correction;  // value needed for correct calculation staker's share
        uint256 banditsCorrection;
        uint256 distributed; // amount of distributed MILK tokens
    }

    // Default deflationarity parameters.
    uint256 private constant REDUCING_INTERVAL = 7 days; // 7 days is time between reductions
    uint256 private constant REDUCING_FACTOR = 10;       // production is reduced by 10%

    // MILK token contract.
    IMilker private _milker;

    // ERC20 token contract staking to the Stable.
    IERC20 private _token;

    // Stakers info by token holders.
    mapping(address => Staker) private _stakers;

    // Common variables configuring of the Stable.
    uint256 private _startTime;

    // Common variables describing current state of the Stable.
    uint256 private _banditsCorrection = 1e18;
    uint256 private _tokensPerShare;
    uint256 private _distributed;
    uint256 private _production;
    uint256 private _produced;
    uint256 private _lastUpdateTime;


    // Events.
    event Initialized(uint256 startTime, uint256 initialProduction);
    event Bandits(
        uint256 indexed percent,
        uint256 totalAmount,
        uint256 arrestedAmount,
        uint256 burntAmount
    );
    event Staked(address indexed staker, uint256 amount);
    event Claimed(address indexed staker, uint256 amount);


    modifier onlyMilker() {
        require(address(_milker) == _msgSender(), "StableV2: caller is not the Milker contract");
        _;
    }


    constructor(address milker, address token) public {
        require(address(milker) != address(0), "StableV2: Milker contract address cannot be empty");
        require(address(token) != address(0), "StableV2: ERC20 token contract address cannot be empty");
        _milker = IMilker(milker);
        _token = IERC20(token);
        transferOwnership(Ownable(milker).owner());
    }

    function initialize(uint256 startTime, uint256 initialProductionPerDay) external onlyOwner {
        require(produced() == 0, "StableV2: already started");
        _startTime = startTime;
        _production = 7 * initialProductionPerDay;
        _lastUpdateTime = _startTime;
        emit Initialized(_startTime, _production);
    }

    function stake(uint256 amount) external {
        address staker = msg.sender;
        require(!_milker.isWhitelisted(staker), "StableV2: whitelisted MILK holders cannot stake tokens");

        // Recalculate stable shares
        update();

        // Transfer pending tokens (if any) to the staker
        _shareMilk(staker);

        if (amount > 0) {
            // Transfer staking tokens to the StableV2 contract
            bool ok = _token.transferFrom(staker, address(this), amount);
            require(ok, "StableV2: unable to transfer stake");
            // Register staking tokens
            _stakers[staker].amount = _stakers[staker].amount.add(amount);
        }

        // Adjust correction (staker's reward debt)
        uint256 correction = _stakers[staker].amount.mul(_tokensPerShare).div(1e12);
        _stakers[staker].correction = correction.mul(1e18).div(_banditsCorrection);
        _stakers[staker].banditsCorrection = _banditsCorrection;

        // Emit event to the logs so can be effectively used later
        emit Staked(staker, amount);
    }

    function claim(uint256 amount) external {
        address staker = msg.sender;
        require(!_milker.isWhitelisted(staker), "StableV2: whitelisted MILK holders cannot claim tokens");

        // Recalculate stable shares
        update();

        // Transfer pending tokens (if any) to the staker
        _shareMilk(staker);

        if (amount > 0) {
            // Unregister claimed tokens
            _stakers[staker].amount = _stakers[staker].amount.sub(amount);
            // Transfer requested tokens from the StableV2 contract
            bool ok = _token.transfer(staker, amount);
            require(ok, "StableV2: unable to transfer stake");
        }

        // Adjust correction (staker's reward debt)
        uint256 correction = _stakers[staker].amount.mul(_tokensPerShare).div(1e12);
        _stakers[staker].correction = correction.mul(1e18).div(_banditsCorrection);
        _stakers[staker].banditsCorrection = _banditsCorrection;

        // Emit event to the logs so can be effectively used later
        emit Claimed(staker, amount);
    }

    ////////////////////////////////////////////////////////////////
    // Updating stable state
    ////////////////////////////////////////////////////////////////

    // Updates stable's accumulative data until most recent block.
    function update() public override {
        if (block.timestamp <= _lastUpdateTime) {
            return;
        }
        uint256 productionNew = production();
        uint256 producedNew = produced();
        if (producedNew <= _produced) {
            _lastUpdateTime = block.timestamp;
            return;
        }
        uint256 supply = tokenSupply();
        if (supply == 0) {
            (_production, _produced) = (productionNew, producedNew);
            _lastUpdateTime = block.timestamp;
            return;
        }
        // Produce MILK tokens to this contract
        uint256 producedTotal = producedNew.sub(_produced);
        uint256 producedToStable = _milker.produceMilk(producedTotal);
        // Update stable share price
        _tokensPerShare = _tokensPerShare.add(producedToStable.mul(1e12).div(supply));
        // Update stable state
        _production = productionNew;
        _produced = producedNew;
        _lastUpdateTime = block.timestamp;
    }

    ////////////////////////////////////////////////////////////////
    // Management functions callable only be Milker
    ////////////////////////////////////////////////////////////////

    function shareMilk(address taker) public override onlyMilker returns (uint256) {
        return _shareMilk(taker);
    }

    function bandits(uint256 percent) external override onlyMilker returns (
        uint256 banditsAmount,
        uint256 arrestedAmount,
        uint256 burntAmount
    ) {
        // Recalculate stable shares
        update();

        // Ensure pending amount and total tokens staked are not zero
        uint256 pendingAmount = milkSupply();
        if (pendingAmount == 0) {
            return (0, 0, 0);
        }

        // Calculate bandits amounts
        banditsAmount = pendingAmount.mul(percent).div(100);
        burntAmount = banditsAmount.div(10);
        arrestedAmount = banditsAmount.sub(burntAmount);

        // Transfer arrested MILK to the Sheriff's Vault
        _safeTransferMilk(address(_milker), arrestedAmount);

        // Decrease pending of each staker
        _banditsCorrection = _banditsCorrection.sub(_banditsCorrection.mul(percent).div(100));
        _tokensPerShare = _tokensPerShare.sub(_tokensPerShare.mul(percent).div(100));

        // Emit event to the logs so can be effectively used later
        emit Bandits(percent, banditsAmount, arrestedAmount, burntAmount);
    }

    ////////////////////////////////////////////////////////////////
    // Contract getters
    ////////////////////////////////////////////////////////////////

    function milker() public view override returns (address) {
        return address(_milker);
    }

    function token() public view override returns (address) {
        return address(_token);
    }

    function startTime() public view override returns (uint256) {
        return _startTime;
    }

    function stakerTokens(address staker) public view override returns (uint256) {
        return _stakers[staker].amount;
    }

    function stakerCorrection(address staker) public view override returns (uint256) {
        return _stakers[staker].correction;
    }

    function tokenSupply() public view override returns (uint256) {
        return _token.balanceOf(address(this));
    }

    function milkSupply() public view override returns (uint256) {
        return _milker.balanceOf(address(this));
    }

    ////////////////////////////////////////////////////////////////
    // MILK production related getters
    ////////////////////////////////////////////////////////////////

    function level() public view override returns (uint256) {
        if (_startTime == 0 || _startTime >= block.timestamp) {
            return 0;
        }
        return (block.timestamp - _startTime) / REDUCING_INTERVAL;
    }

    function levelProgress() public view override returns (uint256) {
        if (_startTime == 0 || _startTime >= block.timestamp) {
            return 0;
        }
        uint256 d = block.timestamp - (_startTime + level() * REDUCING_INTERVAL);
        return d * 10**18 / REDUCING_INTERVAL;
    }

    function production() public view override returns(uint256) {
        if (_startTime == 0 || _startTime >= block.timestamp) {
            return 0;
        }
        uint256 prod = _production;
        uint256 lvlA = (_lastUpdateTime - _startTime) / REDUCING_INTERVAL;
        uint256 lvlB = (block.timestamp - _startTime) / REDUCING_INTERVAL;
        for (; lvlA < lvlB; lvlA++) {
            prod -= prod / REDUCING_FACTOR;
        }
        return prod;
    }

    function produced() public view override returns(uint256) {
        if (_startTime == 0 || _startTime >= block.timestamp) {
            return 0;
        }
        uint256 lvlA = (_lastUpdateTime - _startTime) / REDUCING_INTERVAL;
        uint256 lvlB = (block.timestamp - _startTime) / REDUCING_INTERVAL;
        if (lvlA == lvlB) {
            return _produced + (block.timestamp - _lastUpdateTime) * _production / REDUCING_INTERVAL;
        }
        uint256 amount = 0;
        uint256 prod = _production;
        // Count end of first level
        amount += ((_startTime + (lvlA+1) * REDUCING_INTERVAL) - _lastUpdateTime) * prod / REDUCING_INTERVAL;
        prod -= prod / REDUCING_FACTOR;
        for (lvlA++; lvlA < lvlB; lvlA++) {
            // Count full level
            amount += prod;
            prod -= prod / REDUCING_FACTOR;
        }
        // Count start of current level
        amount += (block.timestamp - (_startTime + lvlB * REDUCING_INTERVAL)) * prod / REDUCING_INTERVAL;
        return _produced + amount;
    }

    function distributed() public view override returns(uint256) {
        return _distributed;
    }

    function pending() public view override returns(uint256) {
        uint256 p = produced();
        if (p <= _distributed) {
            return 0;
        }
        return p.sub(_distributed);
    }

    function pendingTo(address account) public view override returns (uint256) {
        uint256 added = produced().sub(_produced);
        uint256 supply = tokenSupply();
        uint256 tokensPerShare = _tokensPerShare;
        if (added > 0 && supply > 0) {
            tokensPerShare = tokensPerShare.add(added.sub(added.div(20)).mul(1e12).div(supply));
        }
        uint256 tokens = _stakers[account].amount.mul(tokensPerShare).div(1e12);
        uint256 correction = _stakers[account].correction.mul(_banditsCorrection).div(1e18);
        if (_banditsCorrection != _stakers[account].banditsCorrection) {
            correction = correction.mul(_stakers[account].banditsCorrection).div(_banditsCorrection);
        }
        if (tokens <= correction) {
            return 0;
        }
        return tokens.sub(correction);
    }

    ////////////////////////////////////////////////////////////////
    // Internal functions
    ////////////////////////////////////////////////////////////////

    function _shareMilk(address taker) private returns (uint256 tokens) {

        // Calculate pending tokens
        Staker storage s = _stakers[taker];
        uint256 pendingAmount = s.amount.mul(_tokensPerShare).div(1e12);
        uint256 correction = s.correction.mul(_banditsCorrection).div(1e18);
        if (_banditsCorrection != s.banditsCorrection) {
            correction = correction.mul(s.banditsCorrection).div(_banditsCorrection);
            s.banditsCorrection = _banditsCorrection;
        }
        if (pendingAmount > correction) {
            uint256 balance = _milker.balanceOf(address(this));
            pendingAmount = pendingAmount.sub(correction);
            tokens = pendingAmount > balance ? balance : pendingAmount;
            // Unregister sharing tokens
            s.correction = correction.add(tokens).mul(1e18).div(_banditsCorrection);
            s.banditsCorrection = _banditsCorrection;
            _distributed = _distributed.add(tokens);
            // Transfer MILK tokens from the StableV2 contract to the taker
            _safeTransferMilk(taker, tokens);
        }

        return tokens;
    }

    function _safeTransferMilk(address to, uint256 amount) private {
        uint256 balance = _milker.balanceOf(address(this));
        uint256 tokens = amount > balance ? balance : amount;
        if (tokens > 0) {
            bool ok = _milker.transfer(to, tokens);
            require(ok, "StableV2: unable to transfer MILK");
        }
    }

    ////////////////////////////////////////////////////////////////
    // [TESTS] Test functions to check internal state
    // TODO: Remove it since only for tests !!!
    ////////////////////////////////////////////////////////////////

    function testProduction() public view returns (uint256) {
        return _production;
    }

    function testProduced() public view returns (uint256) {
        return _produced;
    }

    function testTokensPerShare() public view returns (uint256) {
        return _tokensPerShare;
    }

    function testLastUpdateTime() public view returns (uint256) {
        return _lastUpdateTime;
    }
}

contract Milk is Ownable, IMilker {
    using SafeMath for uint256;

    // Stable related info needed for proper shares calculation.
    struct StableInfo {
        IStableV2 stable;
    }

    // Token details.
    string public constant name = "Cowboy.Finance";
    string public constant symbol = "MILK";
    uint256 public constant decimals = 18;

    // Token supply limitations.
    uint256 private constant MAX_UINT256 = ~uint256(0);
    uint256 private constant MAX_SUPPLY = 7_000_000 * 10**decimals;
    uint256 private constant TOTAL_UNITS = MAX_UINT256 - (MAX_UINT256 % MAX_SUPPLY);

    // Period length is a time of events recharging.
    uint256 private constant PERIOD_LENGTH = 6 hours;

    // Hardcoded address to collect 5% developers team share.
    address private constant _devs = 0xFFCF83437a1Eb718933f39ebE75aD96335BC1BE4;

    // Address of controller contract from which base refase functions can be called.
    address private _controller;

    // Token holders balances "in hand", balances in vaults, and spending allowances.
    mapping(address => uint256) private _balances; // in units
    mapping(address => uint256) private _vaults;   // in units
    mapping(address => mapping (address => uint256)) private _allowances; // in tokens

    // Whitelisted addresses.
    mapping(address => bool) private _whitelist;

    // Registered stables.
    StableInfo[] private _stables;
    mapping(address => uint256) _stablesLookup;

    // Time of start token life.
    uint256 private _startTime;

    // Token supplies.
    uint256 private _supplyInBalances;      // in units
    uint256 private _supplyInSheriffsVault; // in units
    uint256 private _supplyInSheriffsPot;   // in tokens
    uint256 private _totalSupply;           // in tokens

    // Values needed to convert between units and tokens (divided to several parts).
    uint256 private _unitsPerTokenInBalances = TOTAL_UNITS.div(MAX_SUPPLY);
    uint256 private _unitsPerTokenInSheriffsVault = TOTAL_UNITS.div(MAX_SUPPLY);

    // Contract configuration events.
    event ControllerSetUp(address indexed controller);
    event StableCreated(address stable, address milker, address token, uint256 id);

    // ERC20 token related events.
    event Mint(address indexed recipient, uint256 amount);
    event Burn(address indexed stable, uint256 amount);
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);

    // Tokenomics mechanics events.
    event Bandits(
        uint256 indexed percent,
        uint256 totalAmount,
        uint256 arrestedAmount,
        uint256 burntAmount
    );
    event SheriffsVaultCommission(uint256 amount);
    event SheriffsPotDistribution(uint256 amount);

    // Sheriff's Vault staking/unstaking events.
    event SheriffsVaultDeposit(address indexed account, uint256 amount);
    event SheriffsVaultWithdraw(address indexed account, uint256 amount);


    modifier validRecipient(address account) {
        require(account != address(0x0), "Milk: unable to send tokens to zero address");
        _;
    }

    modifier onlyController() {
        require(_controller == _msgSender(), "Milk: caller is not the controller");
        _;
    }

    modifier onlyStable() {
        require(_stablesLookup[_msgSender()] > 0, "Milk: caller is not the StableV2");
        _;
    }


    constructor() public {
        _whitelist[_devs] = true;
        _startTime = block.timestamp;
    }

    ////////////////////////////////////////////////////////////////
    // [Administration] Contract admin managing
    ////////////////////////////////////////////////////////////////

    function setController(address controller) external onlyOwner {
        _controller = controller;
        emit ControllerSetUp(controller);
    }

    function createStable(address token) external onlyOwner returns (address stable) {

        // Deploy StableV2 contract
        bytes32 salt = keccak256(abi.encodePacked(address(this), token));
        stable = address(new StableV2{salt: salt}(address(this), token));
        require(stable != address(0), "Milk: unable to create deploy StableV2 contract");

        // Register created Stable
        _stables.push(StableInfo({stable: IStableV2(stable)}));
        _stablesLookup[stable] = _stables.length;
        _whitelist[stable] = true;

        // Also set token as whitelist
        if (!_whitelist[token]) {
            uint256 amount = _balances[token].div(_unitsPerTokenInBalances);
            _supplyInBalances = _supplyInBalances.sub(_balances[token]);
            _balances[token] = amount;
            _whitelist[token] = true;
        }

        emit StableCreated(stable, address(this), token, _stables.length - 1);
    }

    ////////////////////////////////////////////////////////////////
    // [Event] Bandits are coming!
    ////////////////////////////////////////////////////////////////

    function bandits(uint256 percent) external override onlyController returns (
        uint256 banditsAmount,
        uint256 arrestedAmount,
        uint256 burntAmount
    ) {
        require(percent > 0 && percent < 100, "Milker: invalid bandits percent");
        uint256 supply = _supplyInBalances.div(_unitsPerTokenInBalances);

        // Calculate bandits amounts
        banditsAmount = supply.mul(percent).div(100);
        burntAmount = banditsAmount.div(10);
        arrestedAmount = banditsAmount.sub(burntAmount);

        // Burn necessary amount of MILK tokens in each stable
        uint256 banditsPending;
        uint256 arrestedPending;
        uint256 burntPending;
        for ((uint256 i, uint256 c) = (0, _stables.length); i < c; i++) {
            (uint256 b, uint256 a, uint256 x) = _stables[i].stable.bandits(percent);
            // Calculate bandits pending amounts
            banditsPending = banditsPending.add(b);
            arrestedPending = arrestedPending.add(a);
            burntPending = burntPending.add(x);
            // Burn MILK from the Stable contract
            _burn(address(_stables[i].stable), x);
        }

        // Update supplies
        uint256 supplyNew = supply.sub(banditsAmount);
        if (supply > 0 && supplyNew > 0) {
            _unitsPerTokenInBalances = supply.mul(_unitsPerTokenInBalances).div(supplyNew);
            _supplyInBalances = supplyNew.mul(_unitsPerTokenInBalances);
            _supplyInSheriffsPot = _supplyInSheriffsPot.add(arrestedAmount).add(arrestedPending);
            _totalSupply = _totalSupply.sub(burntAmount);
        }

        // Calculate final bandits amounts
        banditsAmount = banditsAmount.add(banditsPending);
        arrestedAmount = arrestedAmount.add(arrestedPending);
        burntAmount = burntAmount.add(burntPending);

        emit Bandits(percent, banditsAmount, arrestedAmount, burntAmount);
    }

    ////////////////////////////////////////////////////////////////
    // [Event] Sheriff's Vault commission
    ////////////////////////////////////////////////////////////////

    function sheriffsVaultCommission() external override onlyController returns (uint256) {

        // Calculate comission in both units and tokens
        uint256 vunits = _supplyInSheriffsVault.div(100);
        uint256 tokens = vunits.div(_unitsPerTokenInSheriffsVault);

        // Update supplies
        uint256 supply = _supplyInSheriffsVault.div(_unitsPerTokenInSheriffsVault);
        uint256 supplyNew = supply.sub(supply.div(100));
        if (supply > 0 && supplyNew > 0) {
            _unitsPerTokenInSheriffsVault = supply.mul(_unitsPerTokenInSheriffsVault).div(supplyNew);
            _supplyInSheriffsVault = supplyNew.mul(_unitsPerTokenInSheriffsVault);
            _supplyInSheriffsPot = _supplyInSheriffsPot.add(tokens);
        } else {
            tokens = 0;
        }

        emit SheriffsVaultCommission(tokens);
        return tokens;
    }

    ////////////////////////////////////////////////////////////////
    // [Event] Sheriff's Pot distribution
    ////////////////////////////////////////////////////////////////

    function sheriffsPotDistribution() external override onlyController returns (uint256 amount) {
        uint256 tokens = _supplyInSheriffsPot;
        if (tokens == 0 || _supplyInBalances == 0) {
            return 0;
        }

        // Update supplies
        uint256 supply = _supplyInBalances.div(_unitsPerTokenInBalances);
        uint256 supplyNew = supply.add(tokens);
        _unitsPerTokenInBalances = supply.mul(_unitsPerTokenInBalances).div(supplyNew);
        _supplyInBalances = supplyNew.mul(_unitsPerTokenInBalances);
        _supplyInSheriffsPot = 0;

        emit SheriffsPotDistribution(tokens);
        return tokens;
    }

    ////////////////////////////////////////////////////////////////
    // Sheriff's Vault
    ////////////////////////////////////////////////////////////////

    function putToSheriffsVault(uint256 amount) external {
        address account = msg.sender;
        require(!_whitelist[account], "Milk: whitelisted holders cannot use Sheriff's Vault");

        // Take pending MILK
        takeMilk(account);

        // Calculate amount in units
        uint256 unitsInBalances = amount.mul(_unitsPerTokenInBalances);
        uint256 unitsInSheriffsVault = amount.mul(_unitsPerTokenInSheriffsVault);

        // Update balances and vaults records
        _balances[account] = _balances[account].sub(unitsInBalances);
        _vaults[account] = _vaults[account].add(unitsInSheriffsVault);

        // Update supplies
        _supplyInBalances = _supplyInBalances.sub(unitsInBalances);
        _supplyInSheriffsVault = _supplyInSheriffsVault.add(unitsInSheriffsVault);

        emit SheriffsVaultDeposit(account, amount);
    }

    function takeFromSheriffsVault(uint256 amount) external {
        address account = msg.sender;
        require(!_whitelist[account], "Milk: whitelisted holders cannot use Sheriff's Vault");

        // Take pending MILK
        takeMilk(account);

        // Calculate amount in units
        uint256 unitsInBalances = amount.mul(_unitsPerTokenInBalances);
        uint256 unitsInSheriffsVault = amount.mul(_unitsPerTokenInSheriffsVault);

        // Update balances and vaults records
        _balances[account] = _balances[account].add(unitsInBalances);
        _vaults[account] = _vaults[account].sub(unitsInSheriffsVault);

        // Update supplies
        _supplyInBalances = _supplyInBalances.add(unitsInBalances);
        _supplyInSheriffsVault = _supplyInSheriffsVault.sub(unitsInSheriffsVault);

        emit SheriffsVaultWithdraw(account, amount);
    }

    ////////////////////////////////////////////////////////////////
    // [Token] Minting/burning token
    ////////////////////////////////////////////////////////////////

    function mint(address recipient, uint256 amount) external validRecipient(recipient) onlyOwner returns (bool) {
        if (isWhitelisted(recipient)) {
            _balances[recipient] = _balances[recipient].add(amount);
        } else {
            uint256 units = amount.mul(_unitsPerTokenInBalances);
            _balances[recipient] = _balances[recipient].add(units);
            _supplyInBalances = _supplyInBalances.add(units);
        }
        _totalSupply = _totalSupply.add(amount);
        emit Mint(recipient, amount);
        emit Transfer(address(0), recipient, amount);
        return true;
    }

    function takeMilk(address account) public override returns (uint256) {
        uint256 tokens;
        for ((uint256 i, uint256 c) = (0, _stables.length); i < c; i++) {
            _stables[i].stable.update();
            uint256 transferred = _stables[i].stable.shareMilk(account);
            tokens = tokens.add(transferred);
        }
        return tokens;
    }

    ////////////////////////////////////////////////////////////////
    // [Token] Issuing/transferring earned tokens
    ////////////////////////////////////////////////////////////////

    function produceMilk(uint256 amount) public override onlyStable returns (uint256) {
        // Substruct 5% from each amount to transfer to the developers team
        uint256 devsFee = amount.div(20);      //  5%
        uint256 stabled = amount.sub(devsFee); // 95%
        // Produce (mint) MILK tokens
        _balances[msg.sender] = _balances[msg.sender].add(stabled);
        _balances[_devs] = _balances[_devs].add(devsFee);
        _totalSupply = _totalSupply.add(amount);
        // emit Mint(msg.sender, amount);
        emit Transfer(address(0), msg.sender, stabled);
        emit Transfer(address(0), _devs, devsFee);
        return stabled;
    }

    ////////////////////////////////////////////////////////////////
    // [Token] Transferring token
    ////////////////////////////////////////////////////////////////

    function transfer(address to, uint256 value) public override validRecipient(to) returns (bool) {
        (address from, bool fromWT, bool toWT) = (msg.sender, isWhitelisted(msg.sender), isWhitelisted(to));
        uint256 unitsFrom = fromWT ? value : value.mul(_unitsPerTokenInBalances);
        uint256 unitsTo = toWT ? value : value.mul(_unitsPerTokenInBalances);
        if (!fromWT && _balances[from] < unitsFrom) {
            takeMilk(from);
        }
        if (fromWT && toWT) {
            _balances[from] = _balances[from].sub(unitsFrom);
            _balances[to] = _balances[to].add(unitsTo);
        } else if (fromWT) {
            _balances[from] = _balances[from].sub(unitsFrom);
            _balances[to] = _balances[to].add(unitsTo);
            _supplyInBalances = _supplyInBalances.add(unitsTo);
        } else if (toWT) {
            _balances[from] = _balances[from].sub(unitsFrom);
            _balances[to] = _balances[to].add(unitsTo);
            _supplyInBalances = _supplyInBalances.sub(unitsFrom);
        } else {
            _balances[from] = _balances[from].sub(unitsFrom);
            _balances[to] = _balances[to].add(unitsTo);
        }
        emit Transfer(from, to, value);
        return true;
    }

    function transferFrom(address from, address to, uint256 value) public override validRecipient(to) returns (bool) {
        (bool fromWT, bool toWT) = (isWhitelisted(msg.sender), isWhitelisted(to));
        uint256 unitsFrom = fromWT ? value : value.mul(_unitsPerTokenInBalances);
        uint256 unitsTo = toWT ? value : value.mul(_unitsPerTokenInBalances);
        _allowances[from][msg.sender] = _allowances[from][msg.sender].sub(value);
        if (!fromWT && _balances[from] < unitsFrom) {
            takeMilk(from);
        }
        if (fromWT && toWT) {
            _balances[from] = _balances[from].sub(unitsFrom);
            _balances[to] = _balances[to].add(unitsTo);
        } else if (fromWT) {
            _balances[from] = _balances[from].sub(unitsFrom);
            _balances[to] = _balances[to].add(unitsTo);
            _supplyInBalances = _supplyInBalances.add(unitsTo);
        } else if (toWT) {
            _balances[from] = _balances[from].sub(unitsFrom);
            _balances[to] = _balances[to].add(unitsTo);
            _supplyInBalances = _supplyInBalances.sub(unitsFrom);
        } else {
            _balances[from] = _balances[from].sub(unitsFrom);
            _balances[to] = _balances[to].add(unitsTo);
        }
        emit Transfer(from, to, value);
        return true;
    }

    function approve(address spender, uint256 value) public override returns (bool) {
        _allowances[msg.sender][spender] = value;
        emit Approval(msg.sender, spender, value);
        return true;
    }

    function increaseAllowance(address spender, uint256 addedValue) public returns (bool) {
        _allowances[msg.sender][spender] = _allowances[msg.sender][spender].add(addedValue);
        emit Approval(msg.sender, spender, _allowances[msg.sender][spender]);
        return true;
    }

    function decreaseAllowance(address spender, uint256 subtractedValue) public returns (bool) {
        uint256 oldValue = _allowances[msg.sender][spender];
        if (subtractedValue >= oldValue) {
            _allowances[msg.sender][spender] = 0;
        } else {
            _allowances[msg.sender][spender] = oldValue.sub(subtractedValue);
        }
        emit Approval(msg.sender, spender, _allowances[msg.sender][spender]);
        return true;
    }

    ////////////////////////////////////////////////////////////////
    // Common getters
    ////////////////////////////////////////////////////////////////

    function startTime() public view override returns (uint256) {
        return _startTime;
    }

    function isWhitelisted(address account) public view override returns (bool) {
        return _whitelist[account];
    }

    function stable(uint256 index) public view returns (address) {
        return index < _stables.length ? address(_stables[index].stable) : address(0);
    }

    function stables() public view returns (address[] memory) {
        address[] memory addresses = new address[](_stables.length);
        for ((uint256 i, uint256 c) = (0, _stables.length); i < c; i++) {
            addresses[i] = address(_stables[i].stable);
        }
        return addresses;
    }

    function stableCount() public view returns (uint256) {
        return _stables.length;
    }

    function balanceOf(address account) public view override returns (uint256) {
        // For whitelisted addresses don't calculate pending tokens
        if (isWhitelisted(account)) {
            return _balances[account];
        }
        // Summarize pending MILK from all stables
        uint256 pendingAmount;
        for ((uint256 i, uint256 c) = (0, _stables.length); i < c; i++) {
            pendingAmount = pendingAmount.add(_stables[i].stable.pendingTo(account));
        }
        // Final balance is actually summ of acked and pending MILK
        return _balances[account].div(_unitsPerTokenInBalances).add(pendingAmount);
    }

    function vaultOf(address account) public view override returns (uint256) {
        return _vaults[account].div(_unitsPerTokenInSheriffsVault);
    }

    function allowance(address owner, address spender) public view override returns (uint256) {
        return _allowances[owner][spender];
    }

    function totalSupply() public view override returns (uint256) {
        return _totalSupply;
    }

    function holdersSupply() public view returns (uint256) {
        return _supplyInBalances.div(_unitsPerTokenInBalances);
    }

    function sheriffsPotSupply() public view returns (uint256) {
        return _supplyInSheriffsPot;
    }

    function sheriffsVaultSupply() public view returns (uint256) {
        return _supplyInSheriffsVault.div(_unitsPerTokenInSheriffsVault);
    }

    ////////////////////////////////////////////////////////////////
    // Token lifetime related getters
    ////////////////////////////////////////////////////////////////

    function period() public view override returns (uint256) {
        return block.timestamp.sub(_startTime).div(PERIOD_LENGTH);
    }

    function periodProgress() public view override returns (uint256) {
        uint256 durationFromPeriodStart = block.timestamp
            .sub(_startTime.add(period().mul(PERIOD_LENGTH)));
        return durationFromPeriodStart.mul(10**18).div(PERIOD_LENGTH);
    }

    function periodLength() public view override returns (uint256) {
        return PERIOD_LENGTH;
    }

    ////////////////////////////////////////////////////////////////
    // Token production related getters
    ////////////////////////////////////////////////////////////////

    function production() public view override returns(uint256) {
        uint256 amount;
        for ((uint256 i, uint256 c) = (0, _stables.length); i < c; i++) {
            amount = amount.add(_stables[i].stable.production());
        }
        return amount;
    }

    function producedTotal() public view override returns(uint256) {
        uint256 amount;
        for ((uint256 i, uint256 c) = (0, _stables.length); i < c; i++) {
            amount = amount.add(_stables[i].stable.produced());
        }
        return amount;
    }

    function distributedTotal() public view override returns(uint256) {
        uint256 amount;
        for ((uint256 i, uint256 c) = (0, _stables.length); i < c; i++) {
            amount = amount.add(_stables[i].stable.distributed());
        }
        return amount;
    }

    function pendingTotal() public view override returns(uint256) {
        uint256 amount;
        for ((uint256 i, uint256 c) = (0, _stables.length); i < c; i++) {
            amount = amount.add(_stables[i].stable.pending());
        }
        return amount;
    }

    function pendingTo(address account) public view override returns(uint256) {
        uint256 amount;
        for ((uint256 i, uint256 c) = (0, _stables.length); i < c; i++) {
            amount = amount.add(_stables[i].stable.pendingTo(account));
        }
        return amount;
    }

    function unitsPerToken() public view returns (uint256) {
        return _unitsPerTokenInBalances;
    }

    ////////////////////////////////////////////////////////////////
    // Internal functions
    ////////////////////////////////////////////////////////////////

    function _burn(address burner, uint256 amount) private {
        _balances[burner] = _balances[burner].sub(amount);
        _totalSupply = _totalSupply.sub(amount);
        emit Transfer(burner, address(0), amount);
        // emit Burn(burner, amount);
    }
}

// solium-enable security/no-block-members

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"percent","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"arrestedAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"burntAmount","type":"uint256"}],"name":"Bandits","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"stable","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"controller","type":"address"}],"name":"ControllerSetUp","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"SheriffsPotDistribution","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"SheriffsVaultCommission","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"SheriffsVaultDeposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"SheriffsVaultWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"stable","type":"address"},{"indexed":false,"internalType":"address","name":"milker","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"}],"name":"StableCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"percent","type":"uint256"}],"name":"bandits","outputs":[{"internalType":"uint256","name":"banditsAmount","type":"uint256"},{"internalType":"uint256","name":"arrestedAmount","type":"uint256"},{"internalType":"uint256","name":"burntAmount","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"createStable","outputs":[{"internalType":"address","name":"stable","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"distributedTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"holdersSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"pendingTo","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"period","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodProgress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"produceMilk","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"producedTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"production","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"putToSheriffsVault","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"controller","type":"address"}],"name":"setController","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sheriffsPotDistribution","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sheriffsPotSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sheriffsVaultCommission","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sheriffsVaultSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"stable","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stableCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stables","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"takeFromSheriffsVault","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"takeMilk","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unitsPerToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"vaultOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

6080604052620000326a05ca4ec2a79a7f67000000806000195b06600019036200010960201b62002a941790919060201c565b600d556200004f6a05ca4ec2a79a7f670000008060001962000019565b600e553480156200005f57600080fd5b5060006200006c6200015a565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35073ffcf83437a1eb718933f39ebe75ad96335bc1be460005260056020527fabd433d087b32297e61a6cb70cf23a231ccf223f8cab3165cd9c1ec51ee0b473805460ff191660011790554260085562000205565b60006200015383836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506200015e60201b60201c565b9392505050565b3390565b60008183620001ee5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015620001b257818101518382015260200162000198565b50505050905090810190601f168015620001e05780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581620001fb57fe5b0495945050505050565b614c1580620002156000396000f3fe60806040523480156200001157600080fd5b5060043610620003285760003560e01c8063758b689811620001ad578063a457c2d711620000f9578063c9f9619c11620000a5578063dd62ed3e116200007b578063dd62ed3e146200080e578063ef78d4fd146200083f578063f2fde38b14620008495762000328565b8063c9f9619c14620007da578063d2ca211514620007fa578063dcbdac3014620008045762000328565b8063acf9778f11620000db578063acf9778f14620007a6578063b928df4b14620007b0578063bd75bab514620007ba5762000328565b8063a457c2d71462000748578063a9059cbb14620007775762000328565b806392eefe9b116200015957806396cbfa4d116200013b57806396cbfa4d146200072a578063a17f9f391462000734578063a2f96a13146200073e5762000328565b806392eefe9b14620006f757806395d89b4114620007205762000328565b80637e37c312116200018f5780637e37c31214620006875780638da5cb5b14620006915780638f142907146200069b5762000328565b8063758b6898146200065457806378e97925146200067d5762000328565b806336a1b5a011620002795780635018d7a9116200022557806368ff7d0b11620001fb57806368ff7d0b146200061557806370a08231146200061f578063715018a614620006485762000328565b80635018d7a9146200058e578063521c863314620005ae5780635b76c71214620005d75762000328565b80633af32abf116200025b5780633af32abf14620004fa57806340c10f19146200052357806348a7b29314620005525762000328565b806336a1b5a014620004c15780633950935114620004cb5762000328565b806309b1f2d111620002d95780631ffe54b211620002bb5780631ffe54b2146200045557806323b872dd146200047e578063313ce56714620004b75762000328565b806309b1f2d1146200044157806318160ddd146200044b5762000328565b806306fdde03116200030f57806306fdde0314620003535780630709df4514620003d5578063095ea7b314620003fe5762000328565b806303d3d3ca146200032d57806305e88b691462000349575b600080fd5b6200033762000872565b60408051918252519081900360200190f35b6200033762000893565b6200035d6200094f565b6040805160208082528351818301528351919283929083019185019080838360005b83811015620003995781810151838201526020016200037f565b50505050905090810190601f168015620003c75780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6200033760048036036020811015620003ed57600080fd5b50356001600160a01b031662000988565b6200042d600480360360408110156200041657600080fd5b506001600160a01b038135169060200135620009ba565b604080519115158252519081900360200190f35b6200033762000a21565b6200033762000a27565b62000337600480360360208110156200046d57600080fd5b50356001600160a01b031662000a2d565b6200042d600480360360608110156200049657600080fd5b506001600160a01b0381358116916020810135909116906040013562000abe565b6200033762000e5a565b6200033762000e5f565b6200042d60048036036040811015620004e357600080fd5b506001600160a01b03813516906020013562000edd565b6200042d600480360360208110156200051257600080fd5b50356001600160a01b031662000f72565b6200042d600480360360408110156200053b57600080fd5b506001600160a01b03813516906020013562000f90565b62000572600480360360208110156200056a57600080fd5b5035620011a6565b604080516001600160a01b039092168252519081900360200190f35b6200033760048036036020811015620005a657600080fd5b5035620011e4565b6200033760048036036020811015620005c657600080fd5b50356001600160a01b0316620013db565b620005f760048036036020811015620005ef57600080fd5b503562001514565b60408051938452602084019290925282820152519081900360600190f35b620003376200186a565b62000337600480360360208110156200063757600080fd5b50356001600160a01b0316620019cf565b6200065262001a6b565b005b62000572600480360360208110156200066c57600080fd5b50356001600160a01b031662001b22565b6200033762001deb565b6200033762001df1565b6200057262001e49565b620006a562001e58565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015620006e3578181015183820152602001620006c9565b505050509050019250505060405180910390f35b62000652600480360360208110156200070f57600080fd5b50356001600160a01b031662001f0f565b6200035d62001fc6565b6200033762001fe6565b6200033762001fec565b620003376200206a565b6200042d600480360360408110156200076057600080fd5b506001600160a01b03813516906020013562002184565b6200042d600480360360408110156200078f57600080fd5b506001600160a01b03813516906020013562002271565b62000337620025bd565b62000337620025d8565b6200065260048036036020811015620007d257600080fd5b503562002656565b6200065260048036036020811015620007f257600080fd5b5035620027c2565b620003376200292e565b6200033762002934565b62000337600480360360408110156200082657600080fd5b506001600160a01b03813581169160200135166200293a565b6200033762002965565b62000652600480360360208110156200086157600080fd5b50356001600160a01b031662002985565b60006200088d600d5460095462002a9490919063ffffffff16565b90505b90565b600654600090819081905b8082101562000947576200093960068381548110620008b957fe5b60009182526020918290200154604080516305e88b6960e01b815290516001600160a01b03909216926305e88b6992600480840193829003018186803b1580156200090357600080fd5b505afa15801562000918573d6000803e3d6000fd5b505050506040513d60208110156200092f57600080fd5b5051849062002ad8565b92506001909101906200089e565b509091505090565b6040518060400160405280600e81526020017f436f77626f792e46696e616e636500000000000000000000000000000000000081525081565b600e546001600160a01b0382166000908152600360205260408120549091620009b2919062002a94565b90505b919050565b3360008181526004602090815260408083206001600160a01b038716808552908352818420869055815186815291519394909390927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928290030190a35060015b92915050565b600b5490565b600c5490565b600654600090819081905b8082101562000ab55762000aa76006838154811062000a5357fe5b6000918252602091829020015460408051630fff2a5960e11b81526001600160a01b038a8116600483015291519190921692631ffe54b29260248082019391829003018186803b1580156200090357600080fd5b925060019091019062000a38565b50909392505050565b6000826001600160a01b03811662000b085760405162461bcd60e51b815260040180806020018281038252602b81526020018062004b0f602b913960400191505060405180910390fd5b60008062000b163362000f72565b62000b218762000f72565b9150915060008262000b4357600d5462000b3d90879062002b33565b62000b45565b855b905060008262000b6557600d5462000b5f90889062002b33565b62000b67565b865b6001600160a01b038a16600090815260046020908152604080832033845290915290205490915062000b9a908862002b91565b6001600160a01b038a1660009081526004602090815260408083203384529091529020558315801562000be457506001600160a01b03891660009081526002602052604090205482115b1562000bf75762000bf589620013db565b505b83801562000c025750825b1562000c7d576001600160a01b03891660009081526002602052604090205462000c2d908362002b91565b6001600160a01b03808b1660009081526002602052604080822093909355908a168152205462000c5e908262002ad8565b6001600160a01b03891660009081526002602052604090205562000e00565b831562000d0b576001600160a01b03891660009081526002602052604090205462000ca9908362002b91565b6001600160a01b03808b1660009081526002602052604080822093909355908a168152205462000cda908262002ad8565b6001600160a01b03891660009081526002602052604090205560095462000d02908262002ad8565b60095562000e00565b821562000d90576001600160a01b03891660009081526002602052604090205462000d37908362002b91565b6001600160a01b03808b1660009081526002602052604080822093909355908a168152205462000d68908262002ad8565b6001600160a01b03891660009081526002602052604090205560095462000d02908362002b91565b6001600160a01b03891660009081526002602052604090205462000db5908362002b91565b6001600160a01b03808b1660009081526002602052604080822093909355908a168152205462000de6908262002ad8565b6001600160a01b0389166000908152600260205260409020555b876001600160a01b0316896001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef896040518082815260200191505060405180910390a350600198975050505050505050565b601281565b600654600090819081905b80821015620009475762000ecf6006838154811062000e8557fe5b600091825260209182902001546040805163e20ccec360e01b815290516001600160a01b039092169263e20ccec392600480840193829003018186803b1580156200090357600080fd5b925060019091019062000e6a565b3360009081526004602090815260408083206001600160a01b038616845290915281205462000f0d908362002ad8565b3360008181526004602090815260408083206001600160a01b0389168085529083529281902085905580519485525191937f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929081900390910190a350600192915050565b6001600160a01b031660009081526005602052604090205460ff1690565b6000826001600160a01b03811662000fda5760405162461bcd60e51b815260040180806020018281038252602b81526020018062004b0f602b913960400191505060405180910390fd5b62000fe462002bd5565b6000546001600160a01b0390811691161462001047576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b620010528462000f72565b156200109c576001600160a01b0384166000908152600260205260409020546200107d908462002ad8565b6001600160a01b0385166000908152600260205260409020556200110a565b6000620010b5600d548562002b3390919063ffffffff16565b6001600160a01b038616600090815260026020526040902054909150620010dd908262002ad8565b6001600160a01b03861660009081526002602052604090205560095462001105908262002ad8565b600955505b600c5462001119908462002ad8565b600c556040805184815290516001600160a01b038616917f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d4121396885919081900360200190a26040805184815290516001600160a01b038616916000917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35060019392505050565b6006546000908210620011bb576000620009b2565b60068281548110620011c957fe5b6000918252602090912001546001600160a01b031692915050565b60008060076000620011f562002bd5565b6001600160a01b03166001600160a01b03168152602001908152602001600020541162001269576040805162461bcd60e51b815260206004820181905260248201527f4d696c6b3a2063616c6c6572206973206e6f742074686520537461626c655632604482015290519081900360640190fd5b60006200127883601462002a94565b9050600062001288848362002b91565b33600090815260026020526040902054909150620012a7908262002ad8565b3360009081526002602052604081209190915573ffcf83437a1eb718933f39ebe75ad96335bc1be490527f6b8f4fef7556cac5e814d6d800ed6a3aa582f70557367aff7d5019a2f15d34bb54620012ff908362002ad8565b73ffcf83437a1eb718933f39ebe75ad96335bc1be460005260026020527f6b8f4fef7556cac5e814d6d800ed6a3aa582f70557367aff7d5019a2f15d34bb55600c546200134d908562002ad8565b600c5560408051828152905133916000917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a360408051838152905173ffcf83437a1eb718933f39ebe75ad96335bc1be4916000917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a39392505050565b600654600090819081905b8082101562000ab55760068281548110620013fd57fe5b60009182526020822001546040805163a2e6204560e01b815290516001600160a01b039092169263a2e620459260048084019382900301818387803b1580156200144657600080fd5b505af11580156200145b573d6000803e3d6000fd5b505050506000600683815481106200146f57fe5b600091825260208083209091015460408051632b57434760e01b81526001600160a01b038b8116600483015291519190921693632b57434793602480850194919392918390030190829087803b158015620014c957600080fd5b505af1158015620014de573d6000803e3d6000fd5b505050506040513d6020811015620014f557600080fd5b5051905062001505848262002ad8565b935050600190910190620013e6565b60008060006200152362002bd5565b6001546001600160a01b03908116911614620015715760405162461bcd60e51b815260040180806020018281038252602281526020018062004bbe6022913960400191505060405180910390fd5b600084118015620015825750606484105b620015d4576040805162461bcd60e51b815260206004820152601f60248201527f4d696c6b65723a20696e76616c69642062616e646974732070657263656e7400604482015290519081900360640190fd5b6000620015ef600d5460095462002a9490919063ffffffff16565b90506200160a606462001603838862002b33565b9062002a94565b93506200161984600a62002a94565b915062001627848362002b91565b6006549093506000908190819081905b8082101562001763576000806000600685815481106200165357fe5b9060005260206000200160000160009054906101000a90046001600160a01b03166001600160a01b0316635b76c7128e6040518263ffffffff1660e01b815260040180828152602001915050606060405180830381600087803b158015620016ba57600080fd5b505af1158015620016cf573d6000803e3d6000fd5b505050506040513d6060811015620016e657600080fd5b5080516020820151604090920151909450909250905062001708888462002ad8565b975062001716878362002ad8565b965062001724868262002ad8565b955062001754600686815481106200173857fe5b6000918252602090912001546001600160a01b03168262002bd9565b50506001909201915062001637565b506000905062001774858962002b91565b9050600085118015620017875750600081115b15620017f157620017a98162001603600d548862002b3390919063ffffffff16565b600d819055620017bb90829062002b33565b600955600b54620017db908490620017d4908a62002ad8565b9062002ad8565b600b55600c54620017ed908762002b91565b600c555b620017fd888562002ad8565b97506200180b878462002ad8565b965062001819868362002ad8565b604080518a8152602081018a905280820183905290519197508a917f976232a004b12cdbd7c3ce7d454fe1e8265752d8b7573d031e20184cfa1a07c69181900360600190a250505050509193909250565b60006200187662002bd5565b6001546001600160a01b03908116911614620018c45760405162461bcd60e51b815260040180806020018281038252602281526020018062004bbe6022913960400191505060405180910390fd5b600a54600090620018d790606462002a94565b90506000620018f2600e548362002a9490919063ffffffff16565b905060006200190f600e54600a5462002a9490919063ffffffff16565b905060006200192c6200192483606462002a94565b839062002b91565b90506000821180156200193f5750600081115b156200198e57620019618162001603600e548562002b3390919063ffffffff16565b600e8190556200197390829062002b33565b600a55600b5462001985908462002ad8565b600b5562001993565b600092505b6040805184815290517f0c329f79ebcef45d12a32d1cd45cb01d499f469c0311673efd480d2e9f543ef49181900360200190a150909250505090565b6000620019dc8262000f72565b1562001a0257506001600160a01b038116600090815260026020526040902054620009b5565b60065460009081905b8082101562001a345762001a266006838154811062000a5357fe5b925060019091019062001a0b565b5050600d546001600160a01b03841660009081526002602052604090205462001a64918391620017d49162002a94565b9392505050565b62001a7562002bd5565b6000546001600160a01b0390811691161462001ad8576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b600062001b2e62002bd5565b6000546001600160a01b0390811691161462001b91576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6000308360405160200180836001600160a01b031660601b8152601401826001600160a01b031660601b81526014019250505060405160208183030381529060405280519060200120905080308460405162001bed9062002d72565b6001600160a01b03928316815291166020820152604080518392819003909101906000f590508015801562001c26573d6000803e3d6000fd5b5091506001600160a01b03821662001c705760405162461bcd60e51b815260040180806020018281038252602f81526020018062004b3a602f913960400191505060405180910390fd5b60408051602080820183526001600160a01b038581168084526006805460018082018355600083815296517ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f90920180546001600160a01b03191692861692909217909155905491855260078452858520919091556005909252838320805460ff191690921790915585168152205460ff1662001d8f57600d546001600160a01b038416600090815260026020526040812054909162001d31919062002a94565b6001600160a01b03851660009081526002602052604090205460095491925062001d5c919062002b91565b6009556001600160a01b0384166000908152600260209081526040808320939093556005905220805460ff191660011790555b600654604080516001600160a01b0380861682523060208301528616818301526000199092016060830152517f4e4c3a9193c344ff05104b6235d880306f159319ad8727ddc36efa04349a7fee9181900360800190a150919050565b60085490565b60008062001e2662001e1e62001e1461546062001e0d62002965565b9062002b33565b6008549062002ad8565b429062002b91565b905062001e436154606200160383670de0b6b3a764000062002b33565b91505090565b6000546001600160a01b031690565b600654606090819067ffffffffffffffff8111801562001e7757600080fd5b5060405190808252806020026020018201604052801562001ea2578160200160208202803683370190505b506006549091506000905b8082101562000947576006828154811062001ec457fe5b60009182526020909120015483516001600160a01b039091169084908490811062001eeb57fe5b6001600160a01b039092166020928302919091019091015260019091019062001ead565b62001f1962002bd5565b6000546001600160a01b0390811691161462001f7c576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600180546001600160a01b0319166001600160a01b0383169081179091556040517f228db8ee4300998d545b80f9c24e8518ceaa382b3705d94b21298afc0065c7bc90600090a250565b604051806040016040528060048152602001634d494c4b60e01b81525081565b60065490565b600654600090819081905b8082101562000947576200205c600683815481106200201257fe5b6000918252602091829020015460408051637c25c81f60e11b815290516001600160a01b039092169263f84b903e92600480840193829003018186803b1580156200090357600080fd5b925060019091019062001ff7565b60006200207662002bd5565b6001546001600160a01b03908116911614620020c45760405162461bcd60e51b815260040180806020018281038252602281526020018062004bbe6022913960400191505060405180910390fd5b600b54801580620020d55750600954155b15620020e657600091505062000890565b600062002101600d5460095462002a9490919063ffffffff16565b9050600062002111828462002ad8565b90506200212f8162001603600d548562002b3390919063ffffffff16565b600d8190556200214190829062002b33565b6009556000600b556040805184815290517fa1e8137d70f98302c6377f6d9457325c5068535cc4bfe7daa3e95a48a4cf0bd89181900360200190a1509091505090565b3360009081526004602090815260408083206001600160a01b0386168452909152812054808310620021da573360009081526004602090815260408083206001600160a01b03881684529091528120556200220b565b620021e6818462002b91565b3360009081526004602090815260408083206001600160a01b03891684529091529020555b3360008181526004602090815260408083206001600160a01b0389168085529083529281902054815190815290519293927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929181900390910190a35060019392505050565b6000826001600160a01b038116620022bb5760405162461bcd60e51b815260040180806020018281038252602b81526020018062004b0f602b913960400191505060405180910390fd5b600080600033620022cc3362000f72565b620022d78962000f72565b925092509250600082620022fb57600d54620022f590889062002b33565b620022fd565b865b90506000826200231d57600d546200231790899062002b33565b6200231f565b875b9050831580156200234757506001600160a01b03851660009081526002602052604090205482115b156200235a576200235885620013db565b505b838015620023655750825b15620023e0576001600160a01b03851660009081526002602052604090205462002390908362002b91565b6001600160a01b0380871660009081526002602052604080822093909355908b1681522054620023c1908262002ad8565b6001600160a01b038a1660009081526002602052604090205562002563565b83156200246e576001600160a01b0385166000908152600260205260409020546200240c908362002b91565b6001600160a01b0380871660009081526002602052604080822093909355908b16815220546200243d908262002ad8565b6001600160a01b038a1660009081526002602052604090205560095462002465908262002ad8565b60095562002563565b8215620024f3576001600160a01b0385166000908152600260205260409020546200249a908362002b91565b6001600160a01b0380871660009081526002602052604080822093909355908b1681522054620024cb908262002ad8565b6001600160a01b038a1660009081526002602052604090205560095462002465908362002b91565b6001600160a01b03851660009081526002602052604090205462002518908362002b91565b6001600160a01b0380871660009081526002602052604080822093909355908b168152205462002549908262002ad8565b6001600160a01b038a166000908152600260205260409020555b886001600160a01b0316856001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8a6040518082815260200191505060405180910390a350600198975050505050505050565b60006200088d600e54600a5462002a9490919063ffffffff16565b600654600090819081905b8082101562000947576200264860068381548110620025fe57fe5b600091825260209182902001546040805163671dd38d60e11b815290516001600160a01b039092169263ce3ba71a92600480840193829003018186803b1580156200090357600080fd5b9250600190910190620025e3565b3360008181526005602052604090205460ff1615620026a75760405162461bcd60e51b815260040180806020018281038252603481526020018062004b8a6034913960400191505060405180910390fd5b620026b281620013db565b506000620026cc600d548462002b3390919063ffffffff16565b90506000620026e7600e548562002b3390919063ffffffff16565b6001600160a01b0384166000908152600260205260409020549091506200270f908362002b91565b6001600160a01b03841660009081526002602090815260408083209390935560039052205462002740908262002ad8565b6001600160a01b03841660009081526003602052604090205560095462002768908362002b91565b600955600a546200277a908262002ad8565b600a556040805185815290516001600160a01b038516917f4260f7ca2c87968cabbdc34199f1d1c370fa71a7b9fc3515f3d2c383f6ddee84919081900360200190a250505050565b3360008181526005602052604090205460ff1615620028135760405162461bcd60e51b815260040180806020018281038252603481526020018062004b8a6034913960400191505060405180910390fd5b6200281e81620013db565b50600062002838600d548462002b3390919063ffffffff16565b9050600062002853600e548562002b3390919063ffffffff16565b6001600160a01b0384166000908152600260205260409020549091506200287b908362002ad8565b6001600160a01b038416600090815260026020908152604080832093909355600390522054620028ac908262002b91565b6001600160a01b038416600090815260036020526040902055600954620028d4908362002ad8565b600955600a54620028e6908262002b91565b600a556040805185815290516001600160a01b038516917f653e5ff55ca48790142c29d106f9894a46f039160ea9f49c1fa78fd3748fdf5a919081900360200190a250505050565b61546090565b600d5490565b6001600160a01b03918216600090815260046020908152604080832093909416825291909152205490565b60006200088d615460620016036008544262002b9190919063ffffffff16565b6200298f62002bd5565b6000546001600160a01b03908116911614620029f2576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001600160a01b03811662002a395760405162461bcd60e51b815260040180806020018281038252602681526020018062004ae96026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b600062001a6483836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525062002c6e565b60008282018381101562001a64576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60008262002b445750600062000a1b565b8282028284828162002b5257fe5b041462001a645760405162461bcd60e51b815260040180806020018281038252602181526020018062004b696021913960400191505060405180910390fd5b600062001a6483836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525062002d15565b3390565b6001600160a01b03821660009081526002602052604090205462002bfe908262002b91565b6001600160a01b038316600090815260026020526040902055600c5462002c26908262002b91565b600c556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b6000818362002cfe5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101562002cc257818101518382015260200162002ca8565b50505050905090810190601f16801562002cf05780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600083858162002d0b57fe5b0495945050505050565b6000818484111562002d6a5760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831562002cc257818101518382015260200162002ca8565b505050900390565b611d688062002d818339019056fe6080604052670de0b6b3a76400006005553480156200001d57600080fd5b5060405162001d6838038062001d68833981810160405260408110156200004357600080fd5b508051602090910151600062000058620001c5565b600080546001600160a01b0319166001600160a01b03831690811782556040519293509160008051602062001d12833981519152908290a3506001600160a01b038216620000d85760405162461bcd60e51b815260040180806020018281038252603181526020018062001ce16031913960400191505060405180910390fd5b6001600160a01b0381166200011f5760405162461bcd60e51b815260040180806020018281038252603681526020018062001d326036913960400191505060405180910390fd5b600180546001600160a01b038085166001600160a01b03199283168117909355600280549185169190921617905560408051638da5cb5b60e01b81529051620001bd9291638da5cb5b916004808301926020929190829003018186803b1580156200018957600080fd5b505afa1580156200019e573d6000803e3d6000fd5b505050506040513d6020811015620001b557600080fd5b5051620001c9565b5050620002c7565b3390565b620001d3620001c5565b6000546001600160a01b0390811691161462000236576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001600160a01b0381166200027d5760405162461bcd60e51b815260040180806020018281038252602681526020018062001cbb6026913960400191505060405180910390fd5b600080546040516001600160a01b038085169392169160008051602062001d1283398151915291a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6119e480620002d76000396000f3fe608060405234801561001057600080fd5b50600436106101b95760003560e01c8063812de113116100f9578063ce3ba71a11610097578063e4a3011611610071578063e4a301161461037b578063f2fde38b1461039e578063f84b903e146103c4578063fc0c546a146103cc576101b9565b8063ce3ba71a14610345578063e20ccec31461034d578063e22a5b2614610355576101b9565b8063a2e62045116100d3578063a2e6204514610310578063a694fc3a14610318578063b5ad304214610335578063c1633d5c1461033d576101b9565b8063812de113146102da5780638da5cb5b146102e25780639058a51c146102ea576101b9565b8063379607f5116101665780636fd5ae15116101405780636fd5ae15146102ba578063715018a6146102c25780637824407f146102ca57806378e97925146102d2576101b9565b8063379607f514610258578063599946a0146102775780635b76c7121461027f576101b9565b80631ffe54b2116101975780631ffe54b2146101e8578063274b781b1461020e5780632b57434714610232576101b9565b806305e66729146101be57806305e88b69146101d857806312b4110f146101e0575b600080fd5b6101c66103d4565b60408051918252519081900360200190f35b6101c66103db565b6101c6610439565b6101c6600480360360208110156101fe57600080fd5b50356001600160a01b031661043f565b6102166105a4565b604080516001600160a01b039092168252519081900360200190f35b6101c66004803603602081101561024857600080fd5b50356001600160a01b03166105b3565b6102756004803603602081101561026e57600080fd5b5035610618565b005b6101c6610892565b61029c6004803603602081101561029557600080fd5b5035610898565b60408051938452602084019290925282820152519081900360600190f35b6101c66109f5565b610275610a2d565b6101c6610aee565b6101c6610b6a565b6101c6610b70565b610216610b76565b6101c66004803603602081101561030057600080fd5b50356001600160a01b0316610b85565b610275610ba0565b6102756004803603602081101561032e57600080fd5b5035610cc8565b6101c6610f52565b6101c6610fa8565b6101c6610ff3565b6101c66110dd565b6101c66004803603602081101561036b57600080fd5b50356001600160a01b0316611111565b6102756004803603604081101561039157600080fd5b508035906020013561112f565b610275600480360360208110156103b457600080fd5b50356001600160a01b0316611245565b6101c661135c565b610216611362565b6009545b90565b6000600454600014806103f057504260045410155b156103fd575060006103d8565b600854600454600a5462093a8090829003819004914203045b8082101561043157600a830490920391600190910190610416565b509091505090565b600a5490565b600080610456600954610450610ff3565b90611371565b90506000610462610aee565b60065490915082158015906104775750600082115b156104b7576104b46104ad836104a764e8d4a510006104a161049a8960146113ba565b8990611371565b906113fc565b906113ba565b8290611455565b90505b6001600160a01b0385166000908152600360205260408120546104e59064e8d4a51000906104a790856113fc565b6005546001600160a01b0388166000908152600360205260408120600101549293509161051f91670de0b6b3a7640000916104a7916113fc565b6001600160a01b03881660009081526003602052604090206002015460055491925014610578576005546001600160a01b03881660009081526003602052604090206002015461057591906104a79084906113fc565b90505b80821161058d5760009550505050505061059f565b6105978282611371565b955050505050505b919050565b6001546001600160a01b031690565b60006105bd6114af565b6001546001600160a01b039081169116146106095760405162461bcd60e51b815260040180806020018281038252602b81526020018061188e602b913960400191505060405180910390fd5b610612826114b3565b92915050565b60015460408051633af32abf60e01b81523360048201819052915191926001600160a01b031691633af32abf91602480820192602092909190829003018186803b15801561066557600080fd5b505afa158015610679573d6000803e3d6000fd5b505050506040513d602081101561068f57600080fd5b5051156106cd5760405162461bcd60e51b81526004018080602001828103825260368152602001806119436036913960400191505060405180910390fd5b6106d5610ba0565b6106de816114b3565b5081156107dc576001600160a01b0381166000908152600360205260409020546107089083611371565b6001600160a01b03808316600081815260036020908152604080832095909555600254855163a9059cbb60e01b8152600481019490945260248401889052945191949093169263a9059cbb926044808201939182900301818787803b15801561077057600080fd5b505af1158015610784573d6000803e3d6000fd5b505050506040513d602081101561079a57600080fd5b50519050806107da5760405162461bcd60e51b81526004018080602001828103825260228152602001806119006022913960400191505060405180910390fd5b505b6006546001600160a01b038216600090815260036020526040812054909161080f9164e8d4a51000916104a791906113fc565b60055490915061082b906104a783670de0b6b3a76400006113fc565b6001600160a01b03831660008181526003602090815260409182902060018101949094556005546002909401939093558051868152905191927fd8138f8a3f377c5259ca548e70e4c2de94f129f5a11036a15b69513cba2b426a92918290030190a2505050565b60085490565b60008060006108a56114af565b6001546001600160a01b039081169116146108f15760405162461bcd60e51b815260040180806020018281038252602b81526020018061188e602b913960400191505060405180910390fd5b6108f9610ba0565b6000610903610fa8565b90508061091b576000806000935093509350506109ee565b61092a60646104a783886113fc565b935061093784600a6113ba565b91506109438483611371565b60015490935061095c906001600160a01b031684611634565b61098261097960646104a7886005546113fc90919063ffffffff16565b60055490611371565b6005556006546109a69061099d906064906104a790896113fc565b60065490611371565b6006556040805185815260208101859052808201849052905186917f976232a004b12cdbd7c3ce7d454fe1e8265752d8b7573d031e20184cfa1a07c6919081900360600190a2505b9193909250565b600060045460001480610a0a57504260045410155b15610a17575060006103d8565b62093a80600454420381610a2757fe5b04905090565b610a356114af565b6000546001600160a01b03908116911614610a97576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a36000805473ffffffffffffffffffffffffffffffffffffffff19169055565b600254604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b158015610b3957600080fd5b505afa158015610b4d573d6000803e3d6000fd5b505050506040513d6020811015610b6357600080fd5b5051905090565b60045490565b60065490565b6000546001600160a01b031690565b6001600160a01b031660009081526003602052604090205490565b600a544211610bae57610cc6565b6000610bb86103db565b90506000610bc4610ff3565b90506009548111610bda57505042600a55610cc6565b6000610be4610aee565b905080610bfb575060095560085542600a55610cc6565b6000610c126009548461137190919063ffffffff16565b60015460408051635018d7a960e01b81526004810184905290519293506000926001600160a01b0390921691635018d7a99160248082019260209290919082900301818787803b158015610c6557600080fd5b505af1158015610c79573d6000803e3d6000fd5b505050506040513d6020811015610c8f57600080fd5b50519050610cb2610ca9846104a78464e8d4a510006113fc565b60065490611455565b60065550505060089190915560095542600a555b565b60015460408051633af32abf60e01b81523360048201819052915191926001600160a01b031691633af32abf91602480820192602092909190829003018186803b158015610d1557600080fd5b505afa158015610d29573d6000803e3d6000fd5b505050506040513d6020811015610d3f57600080fd5b505115610d7d5760405162461bcd60e51b81526004018080602001828103825260368152602001806119796036913960400191505060405180910390fd5b610d85610ba0565b610d8e816114b3565b508115610e9c57600254604080516323b872dd60e01b81526001600160a01b03848116600483015230602483015260448201869052915160009392909216916323b872dd9160648082019260209290919082900301818787803b158015610df457600080fd5b505af1158015610e08573d6000803e3d6000fd5b505050506040513d6020811015610e1e57600080fd5b5051905080610e5e5760405162461bcd60e51b81526004018080602001828103825260228152602001806119006022913960400191505060405180910390fd5b6001600160a01b038216600090815260036020526040902054610e819084611455565b6001600160a01b038316600090815260036020526040902055505b6006546001600160a01b0382166000908152600360205260408120549091610ecf9164e8d4a51000916104a791906113fc565b600554909150610eeb906104a783670de0b6b3a76400006113fc565b6001600160a01b03831660008181526003602090815260409182902060018101949094556005546002909401939093558051868152905191927f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d92918290030190a2505050565b600060045460001480610f6757504260045410155b15610f74575060006103d8565b600062093a80610f826109f5565b02600454014203905062093a8081670de0b6b3a76400000281610fa157fe5b0491505090565b600154604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b158015610b3957600080fd5b60006004546000148061100857504260045410155b15611015575060006103d8565b600062093a80600454600a54038161102957fe5b049050600062093a8060045442038161103e57fe5b0490508082141561106b5762093a80600854600a544203028161105d57fe5b0460095401925050506103d8565b600854600a80546004546001959095019462093a80868102909101919091038302049190810490035b828410156110b15790810190600a81600190950194049003611094565b62093a808162093a80850260045401420302816110ca57fe5b0482019150816009540194505050505090565b6000806110e8610ff3565b905060075481116110fd5760009150506103d8565b60075461110b908290611371565b91505090565b6001600160a01b031660009081526003602052604090206001015490565b6111376114af565b6000546001600160a01b03908116911614611199576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6111a1610ff3565b156111f3576040805162461bcd60e51b815260206004820152601960248201527f537461626c6556323a20616c7265616479207374617274656400000000000000604482015290519081900360640190fd5b6004829055600781026008819055600a83905560408051848152602081019290925280517f997896709b4e932ee42750e2e14ed1f7ab6c60bd911ff567aa2485cf0b20051b9281900390910190a15050565b61124d6114af565b6000546001600160a01b039081169116146112af576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001600160a01b0381166112f45760405162461bcd60e51b81526004018080602001828103825260268152602001806118b96026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a36000805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b60075490565b6002546001600160a01b031690565b60006113b383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611791565b9392505050565b60006113b383836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611828565b60008261140b57506000610612565b8282028284828161141857fe5b04146113b35760405162461bcd60e51b81526004018080602001828103825260218152602001806119226021913960400191505060405180910390fd5b6000828201838110156113b3576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b3390565b6001600160a01b0381166000908152600360205260408120600654815483916114e79164e8d4a51000916104a791906113fc565b90506000611510670de0b6b3a76400006104a760055486600101546113fc90919063ffffffff16565b90508260020154600554146115475761153c6005546104a78560020154846113fc90919063ffffffff16565b600554600285015590505b8082111561162c57600154604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b15801561159a57600080fd5b505afa1580156115ae573d6000803e3d6000fd5b505050506040513d60208110156115c457600080fd5b505190506115d28383611371565b92508083116115e157826115e3565b805b600554909550611603906104a7670de0b6b3a76400006104a1868a611455565b6001850155600554600285015560075461161d9086611455565b60075561162a8686611634565b505b505050919050565b600154604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b15801561167f57600080fd5b505afa158015611693573d6000803e3d6000fd5b505050506040513d60208110156116a957600080fd5b5051905060008183116116bc57826116be565b815b9050801561178b576001546040805163a9059cbb60e01b81526001600160a01b038781166004830152602482018590529151600093929092169163a9059cbb9160448082019260209290919082900301818787803b15801561171f57600080fd5b505af1158015611733573d6000803e3d6000fd5b505050506040513d602081101561174957600080fd5b50519050806117895760405162461bcd60e51b81526004018080602001828103825260218152602001806118df6021913960400191505060405180910390fd5b505b50505050565b600081848411156118205760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156117e55781810151838201526020016117cd565b50505050905090810190601f1680156118125780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600081836118775760405162461bcd60e51b81526020600482018181528351602484015283519092839260449091019190850190808383600083156117e55781810151838201526020016117cd565b50600083858161188357fe5b049594505050505056fe537461626c6556323a2063616c6c6572206973206e6f7420746865204d696c6b657220636f6e74726163744f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373537461626c6556323a20756e61626c6520746f207472616e73666572204d494c4b537461626c6556323a20756e61626c6520746f207472616e73666572207374616b65536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77537461626c6556323a2077686974656c6973746564204d494c4b20686f6c646572732063616e6e6f7420636c61696d20746f6b656e73537461626c6556323a2077686974656c6973746564204d494c4b20686f6c646572732063616e6e6f74207374616b6520746f6b656e73a26469706673582212206adc4592aac4c61b6a7cb18c1dd17111182d432f838c8f11bd2be1eba8d4fc3664736f6c634300060c00334f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373537461626c6556323a204d696c6b657220636f6e747261637420616464726573732063616e6e6f7420626520656d7074798be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0537461626c6556323a20455243323020746f6b656e20636f6e747261637420616464726573732063616e6e6f7420626520656d7074794f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734d696c6b3a20756e61626c6520746f2073656e6420746f6b656e7320746f207a65726f20616464726573734d696c6b3a20756e61626c6520746f20637265617465206465706c6f7920537461626c65563220636f6e7472616374536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774d696c6b3a2077686974656c697374656420686f6c646572732063616e6e6f742075736520536865726966662773205661756c744d696c6b3a2063616c6c6572206973206e6f742074686520636f6e74726f6c6c6572a264697066735822122008f730cfc637e2e90d89159c35308a8c6460e616246cd5189bdac1cf89877e7164736f6c634300060c0033

Deployed Bytecode

0x60806040523480156200001157600080fd5b5060043610620003285760003560e01c8063758b689811620001ad578063a457c2d711620000f9578063c9f9619c11620000a5578063dd62ed3e116200007b578063dd62ed3e146200080e578063ef78d4fd146200083f578063f2fde38b14620008495762000328565b8063c9f9619c14620007da578063d2ca211514620007fa578063dcbdac3014620008045762000328565b8063acf9778f11620000db578063acf9778f14620007a6578063b928df4b14620007b0578063bd75bab514620007ba5762000328565b8063a457c2d71462000748578063a9059cbb14620007775762000328565b806392eefe9b116200015957806396cbfa4d116200013b57806396cbfa4d146200072a578063a17f9f391462000734578063a2f96a13146200073e5762000328565b806392eefe9b14620006f757806395d89b4114620007205762000328565b80637e37c312116200018f5780637e37c31214620006875780638da5cb5b14620006915780638f142907146200069b5762000328565b8063758b6898146200065457806378e97925146200067d5762000328565b806336a1b5a011620002795780635018d7a9116200022557806368ff7d0b11620001fb57806368ff7d0b146200061557806370a08231146200061f578063715018a614620006485762000328565b80635018d7a9146200058e578063521c863314620005ae5780635b76c71214620005d75762000328565b80633af32abf116200025b5780633af32abf14620004fa57806340c10f19146200052357806348a7b29314620005525762000328565b806336a1b5a014620004c15780633950935114620004cb5762000328565b806309b1f2d111620002d95780631ffe54b211620002bb5780631ffe54b2146200045557806323b872dd146200047e578063313ce56714620004b75762000328565b806309b1f2d1146200044157806318160ddd146200044b5762000328565b806306fdde03116200030f57806306fdde0314620003535780630709df4514620003d5578063095ea7b314620003fe5762000328565b806303d3d3ca146200032d57806305e88b691462000349575b600080fd5b6200033762000872565b60408051918252519081900360200190f35b6200033762000893565b6200035d6200094f565b6040805160208082528351818301528351919283929083019185019080838360005b83811015620003995781810151838201526020016200037f565b50505050905090810190601f168015620003c75780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6200033760048036036020811015620003ed57600080fd5b50356001600160a01b031662000988565b6200042d600480360360408110156200041657600080fd5b506001600160a01b038135169060200135620009ba565b604080519115158252519081900360200190f35b6200033762000a21565b6200033762000a27565b62000337600480360360208110156200046d57600080fd5b50356001600160a01b031662000a2d565b6200042d600480360360608110156200049657600080fd5b506001600160a01b0381358116916020810135909116906040013562000abe565b6200033762000e5a565b6200033762000e5f565b6200042d60048036036040811015620004e357600080fd5b506001600160a01b03813516906020013562000edd565b6200042d600480360360208110156200051257600080fd5b50356001600160a01b031662000f72565b6200042d600480360360408110156200053b57600080fd5b506001600160a01b03813516906020013562000f90565b62000572600480360360208110156200056a57600080fd5b5035620011a6565b604080516001600160a01b039092168252519081900360200190f35b6200033760048036036020811015620005a657600080fd5b5035620011e4565b6200033760048036036020811015620005c657600080fd5b50356001600160a01b0316620013db565b620005f760048036036020811015620005ef57600080fd5b503562001514565b60408051938452602084019290925282820152519081900360600190f35b620003376200186a565b62000337600480360360208110156200063757600080fd5b50356001600160a01b0316620019cf565b6200065262001a6b565b005b62000572600480360360208110156200066c57600080fd5b50356001600160a01b031662001b22565b6200033762001deb565b6200033762001df1565b6200057262001e49565b620006a562001e58565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015620006e3578181015183820152602001620006c9565b505050509050019250505060405180910390f35b62000652600480360360208110156200070f57600080fd5b50356001600160a01b031662001f0f565b6200035d62001fc6565b6200033762001fe6565b6200033762001fec565b620003376200206a565b6200042d600480360360408110156200076057600080fd5b506001600160a01b03813516906020013562002184565b6200042d600480360360408110156200078f57600080fd5b506001600160a01b03813516906020013562002271565b62000337620025bd565b62000337620025d8565b6200065260048036036020811015620007d257600080fd5b503562002656565b6200065260048036036020811015620007f257600080fd5b5035620027c2565b620003376200292e565b6200033762002934565b62000337600480360360408110156200082657600080fd5b506001600160a01b03813581169160200135166200293a565b6200033762002965565b62000652600480360360208110156200086157600080fd5b50356001600160a01b031662002985565b60006200088d600d5460095462002a9490919063ffffffff16565b90505b90565b600654600090819081905b8082101562000947576200093960068381548110620008b957fe5b60009182526020918290200154604080516305e88b6960e01b815290516001600160a01b03909216926305e88b6992600480840193829003018186803b1580156200090357600080fd5b505afa15801562000918573d6000803e3d6000fd5b505050506040513d60208110156200092f57600080fd5b5051849062002ad8565b92506001909101906200089e565b509091505090565b6040518060400160405280600e81526020017f436f77626f792e46696e616e636500000000000000000000000000000000000081525081565b600e546001600160a01b0382166000908152600360205260408120549091620009b2919062002a94565b90505b919050565b3360008181526004602090815260408083206001600160a01b038716808552908352818420869055815186815291519394909390927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928290030190a35060015b92915050565b600b5490565b600c5490565b600654600090819081905b8082101562000ab55762000aa76006838154811062000a5357fe5b6000918252602091829020015460408051630fff2a5960e11b81526001600160a01b038a8116600483015291519190921692631ffe54b29260248082019391829003018186803b1580156200090357600080fd5b925060019091019062000a38565b50909392505050565b6000826001600160a01b03811662000b085760405162461bcd60e51b815260040180806020018281038252602b81526020018062004b0f602b913960400191505060405180910390fd5b60008062000b163362000f72565b62000b218762000f72565b9150915060008262000b4357600d5462000b3d90879062002b33565b62000b45565b855b905060008262000b6557600d5462000b5f90889062002b33565b62000b67565b865b6001600160a01b038a16600090815260046020908152604080832033845290915290205490915062000b9a908862002b91565b6001600160a01b038a1660009081526004602090815260408083203384529091529020558315801562000be457506001600160a01b03891660009081526002602052604090205482115b1562000bf75762000bf589620013db565b505b83801562000c025750825b1562000c7d576001600160a01b03891660009081526002602052604090205462000c2d908362002b91565b6001600160a01b03808b1660009081526002602052604080822093909355908a168152205462000c5e908262002ad8565b6001600160a01b03891660009081526002602052604090205562000e00565b831562000d0b576001600160a01b03891660009081526002602052604090205462000ca9908362002b91565b6001600160a01b03808b1660009081526002602052604080822093909355908a168152205462000cda908262002ad8565b6001600160a01b03891660009081526002602052604090205560095462000d02908262002ad8565b60095562000e00565b821562000d90576001600160a01b03891660009081526002602052604090205462000d37908362002b91565b6001600160a01b03808b1660009081526002602052604080822093909355908a168152205462000d68908262002ad8565b6001600160a01b03891660009081526002602052604090205560095462000d02908362002b91565b6001600160a01b03891660009081526002602052604090205462000db5908362002b91565b6001600160a01b03808b1660009081526002602052604080822093909355908a168152205462000de6908262002ad8565b6001600160a01b0389166000908152600260205260409020555b876001600160a01b0316896001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef896040518082815260200191505060405180910390a350600198975050505050505050565b601281565b600654600090819081905b80821015620009475762000ecf6006838154811062000e8557fe5b600091825260209182902001546040805163e20ccec360e01b815290516001600160a01b039092169263e20ccec392600480840193829003018186803b1580156200090357600080fd5b925060019091019062000e6a565b3360009081526004602090815260408083206001600160a01b038616845290915281205462000f0d908362002ad8565b3360008181526004602090815260408083206001600160a01b0389168085529083529281902085905580519485525191937f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929081900390910190a350600192915050565b6001600160a01b031660009081526005602052604090205460ff1690565b6000826001600160a01b03811662000fda5760405162461bcd60e51b815260040180806020018281038252602b81526020018062004b0f602b913960400191505060405180910390fd5b62000fe462002bd5565b6000546001600160a01b0390811691161462001047576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b620010528462000f72565b156200109c576001600160a01b0384166000908152600260205260409020546200107d908462002ad8565b6001600160a01b0385166000908152600260205260409020556200110a565b6000620010b5600d548562002b3390919063ffffffff16565b6001600160a01b038616600090815260026020526040902054909150620010dd908262002ad8565b6001600160a01b03861660009081526002602052604090205560095462001105908262002ad8565b600955505b600c5462001119908462002ad8565b600c556040805184815290516001600160a01b038616917f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d4121396885919081900360200190a26040805184815290516001600160a01b038616916000917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35060019392505050565b6006546000908210620011bb576000620009b2565b60068281548110620011c957fe5b6000918252602090912001546001600160a01b031692915050565b60008060076000620011f562002bd5565b6001600160a01b03166001600160a01b03168152602001908152602001600020541162001269576040805162461bcd60e51b815260206004820181905260248201527f4d696c6b3a2063616c6c6572206973206e6f742074686520537461626c655632604482015290519081900360640190fd5b60006200127883601462002a94565b9050600062001288848362002b91565b33600090815260026020526040902054909150620012a7908262002ad8565b3360009081526002602052604081209190915573ffcf83437a1eb718933f39ebe75ad96335bc1be490527f6b8f4fef7556cac5e814d6d800ed6a3aa582f70557367aff7d5019a2f15d34bb54620012ff908362002ad8565b73ffcf83437a1eb718933f39ebe75ad96335bc1be460005260026020527f6b8f4fef7556cac5e814d6d800ed6a3aa582f70557367aff7d5019a2f15d34bb55600c546200134d908562002ad8565b600c5560408051828152905133916000917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a360408051838152905173ffcf83437a1eb718933f39ebe75ad96335bc1be4916000917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a39392505050565b600654600090819081905b8082101562000ab55760068281548110620013fd57fe5b60009182526020822001546040805163a2e6204560e01b815290516001600160a01b039092169263a2e620459260048084019382900301818387803b1580156200144657600080fd5b505af11580156200145b573d6000803e3d6000fd5b505050506000600683815481106200146f57fe5b600091825260208083209091015460408051632b57434760e01b81526001600160a01b038b8116600483015291519190921693632b57434793602480850194919392918390030190829087803b158015620014c957600080fd5b505af1158015620014de573d6000803e3d6000fd5b505050506040513d6020811015620014f557600080fd5b5051905062001505848262002ad8565b935050600190910190620013e6565b60008060006200152362002bd5565b6001546001600160a01b03908116911614620015715760405162461bcd60e51b815260040180806020018281038252602281526020018062004bbe6022913960400191505060405180910390fd5b600084118015620015825750606484105b620015d4576040805162461bcd60e51b815260206004820152601f60248201527f4d696c6b65723a20696e76616c69642062616e646974732070657263656e7400604482015290519081900360640190fd5b6000620015ef600d5460095462002a9490919063ffffffff16565b90506200160a606462001603838862002b33565b9062002a94565b93506200161984600a62002a94565b915062001627848362002b91565b6006549093506000908190819081905b8082101562001763576000806000600685815481106200165357fe5b9060005260206000200160000160009054906101000a90046001600160a01b03166001600160a01b0316635b76c7128e6040518263ffffffff1660e01b815260040180828152602001915050606060405180830381600087803b158015620016ba57600080fd5b505af1158015620016cf573d6000803e3d6000fd5b505050506040513d6060811015620016e657600080fd5b5080516020820151604090920151909450909250905062001708888462002ad8565b975062001716878362002ad8565b965062001724868262002ad8565b955062001754600686815481106200173857fe5b6000918252602090912001546001600160a01b03168262002bd9565b50506001909201915062001637565b506000905062001774858962002b91565b9050600085118015620017875750600081115b15620017f157620017a98162001603600d548862002b3390919063ffffffff16565b600d819055620017bb90829062002b33565b600955600b54620017db908490620017d4908a62002ad8565b9062002ad8565b600b55600c54620017ed908762002b91565b600c555b620017fd888562002ad8565b97506200180b878462002ad8565b965062001819868362002ad8565b604080518a8152602081018a905280820183905290519197508a917f976232a004b12cdbd7c3ce7d454fe1e8265752d8b7573d031e20184cfa1a07c69181900360600190a250505050509193909250565b60006200187662002bd5565b6001546001600160a01b03908116911614620018c45760405162461bcd60e51b815260040180806020018281038252602281526020018062004bbe6022913960400191505060405180910390fd5b600a54600090620018d790606462002a94565b90506000620018f2600e548362002a9490919063ffffffff16565b905060006200190f600e54600a5462002a9490919063ffffffff16565b905060006200192c6200192483606462002a94565b839062002b91565b90506000821180156200193f5750600081115b156200198e57620019618162001603600e548562002b3390919063ffffffff16565b600e8190556200197390829062002b33565b600a55600b5462001985908462002ad8565b600b5562001993565b600092505b6040805184815290517f0c329f79ebcef45d12a32d1cd45cb01d499f469c0311673efd480d2e9f543ef49181900360200190a150909250505090565b6000620019dc8262000f72565b1562001a0257506001600160a01b038116600090815260026020526040902054620009b5565b60065460009081905b8082101562001a345762001a266006838154811062000a5357fe5b925060019091019062001a0b565b5050600d546001600160a01b03841660009081526002602052604090205462001a64918391620017d49162002a94565b9392505050565b62001a7562002bd5565b6000546001600160a01b0390811691161462001ad8576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b600062001b2e62002bd5565b6000546001600160a01b0390811691161462001b91576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6000308360405160200180836001600160a01b031660601b8152601401826001600160a01b031660601b81526014019250505060405160208183030381529060405280519060200120905080308460405162001bed9062002d72565b6001600160a01b03928316815291166020820152604080518392819003909101906000f590508015801562001c26573d6000803e3d6000fd5b5091506001600160a01b03821662001c705760405162461bcd60e51b815260040180806020018281038252602f81526020018062004b3a602f913960400191505060405180910390fd5b60408051602080820183526001600160a01b038581168084526006805460018082018355600083815296517ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f90920180546001600160a01b03191692861692909217909155905491855260078452858520919091556005909252838320805460ff191690921790915585168152205460ff1662001d8f57600d546001600160a01b038416600090815260026020526040812054909162001d31919062002a94565b6001600160a01b03851660009081526002602052604090205460095491925062001d5c919062002b91565b6009556001600160a01b0384166000908152600260209081526040808320939093556005905220805460ff191660011790555b600654604080516001600160a01b0380861682523060208301528616818301526000199092016060830152517f4e4c3a9193c344ff05104b6235d880306f159319ad8727ddc36efa04349a7fee9181900360800190a150919050565b60085490565b60008062001e2662001e1e62001e1461546062001e0d62002965565b9062002b33565b6008549062002ad8565b429062002b91565b905062001e436154606200160383670de0b6b3a764000062002b33565b91505090565b6000546001600160a01b031690565b600654606090819067ffffffffffffffff8111801562001e7757600080fd5b5060405190808252806020026020018201604052801562001ea2578160200160208202803683370190505b506006549091506000905b8082101562000947576006828154811062001ec457fe5b60009182526020909120015483516001600160a01b039091169084908490811062001eeb57fe5b6001600160a01b039092166020928302919091019091015260019091019062001ead565b62001f1962002bd5565b6000546001600160a01b0390811691161462001f7c576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600180546001600160a01b0319166001600160a01b0383169081179091556040517f228db8ee4300998d545b80f9c24e8518ceaa382b3705d94b21298afc0065c7bc90600090a250565b604051806040016040528060048152602001634d494c4b60e01b81525081565b60065490565b600654600090819081905b8082101562000947576200205c600683815481106200201257fe5b6000918252602091829020015460408051637c25c81f60e11b815290516001600160a01b039092169263f84b903e92600480840193829003018186803b1580156200090357600080fd5b925060019091019062001ff7565b60006200207662002bd5565b6001546001600160a01b03908116911614620020c45760405162461bcd60e51b815260040180806020018281038252602281526020018062004bbe6022913960400191505060405180910390fd5b600b54801580620020d55750600954155b15620020e657600091505062000890565b600062002101600d5460095462002a9490919063ffffffff16565b9050600062002111828462002ad8565b90506200212f8162001603600d548562002b3390919063ffffffff16565b600d8190556200214190829062002b33565b6009556000600b556040805184815290517fa1e8137d70f98302c6377f6d9457325c5068535cc4bfe7daa3e95a48a4cf0bd89181900360200190a1509091505090565b3360009081526004602090815260408083206001600160a01b0386168452909152812054808310620021da573360009081526004602090815260408083206001600160a01b03881684529091528120556200220b565b620021e6818462002b91565b3360009081526004602090815260408083206001600160a01b03891684529091529020555b3360008181526004602090815260408083206001600160a01b0389168085529083529281902054815190815290519293927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929181900390910190a35060019392505050565b6000826001600160a01b038116620022bb5760405162461bcd60e51b815260040180806020018281038252602b81526020018062004b0f602b913960400191505060405180910390fd5b600080600033620022cc3362000f72565b620022d78962000f72565b925092509250600082620022fb57600d54620022f590889062002b33565b620022fd565b865b90506000826200231d57600d546200231790899062002b33565b6200231f565b875b9050831580156200234757506001600160a01b03851660009081526002602052604090205482115b156200235a576200235885620013db565b505b838015620023655750825b15620023e0576001600160a01b03851660009081526002602052604090205462002390908362002b91565b6001600160a01b0380871660009081526002602052604080822093909355908b1681522054620023c1908262002ad8565b6001600160a01b038a1660009081526002602052604090205562002563565b83156200246e576001600160a01b0385166000908152600260205260409020546200240c908362002b91565b6001600160a01b0380871660009081526002602052604080822093909355908b16815220546200243d908262002ad8565b6001600160a01b038a1660009081526002602052604090205560095462002465908262002ad8565b60095562002563565b8215620024f3576001600160a01b0385166000908152600260205260409020546200249a908362002b91565b6001600160a01b0380871660009081526002602052604080822093909355908b1681522054620024cb908262002ad8565b6001600160a01b038a1660009081526002602052604090205560095462002465908362002b91565b6001600160a01b03851660009081526002602052604090205462002518908362002b91565b6001600160a01b0380871660009081526002602052604080822093909355908b168152205462002549908262002ad8565b6001600160a01b038a166000908152600260205260409020555b886001600160a01b0316856001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8a6040518082815260200191505060405180910390a350600198975050505050505050565b60006200088d600e54600a5462002a9490919063ffffffff16565b600654600090819081905b8082101562000947576200264860068381548110620025fe57fe5b600091825260209182902001546040805163671dd38d60e11b815290516001600160a01b039092169263ce3ba71a92600480840193829003018186803b1580156200090357600080fd5b9250600190910190620025e3565b3360008181526005602052604090205460ff1615620026a75760405162461bcd60e51b815260040180806020018281038252603481526020018062004b8a6034913960400191505060405180910390fd5b620026b281620013db565b506000620026cc600d548462002b3390919063ffffffff16565b90506000620026e7600e548562002b3390919063ffffffff16565b6001600160a01b0384166000908152600260205260409020549091506200270f908362002b91565b6001600160a01b03841660009081526002602090815260408083209390935560039052205462002740908262002ad8565b6001600160a01b03841660009081526003602052604090205560095462002768908362002b91565b600955600a546200277a908262002ad8565b600a556040805185815290516001600160a01b038516917f4260f7ca2c87968cabbdc34199f1d1c370fa71a7b9fc3515f3d2c383f6ddee84919081900360200190a250505050565b3360008181526005602052604090205460ff1615620028135760405162461bcd60e51b815260040180806020018281038252603481526020018062004b8a6034913960400191505060405180910390fd5b6200281e81620013db565b50600062002838600d548462002b3390919063ffffffff16565b9050600062002853600e548562002b3390919063ffffffff16565b6001600160a01b0384166000908152600260205260409020549091506200287b908362002ad8565b6001600160a01b038416600090815260026020908152604080832093909355600390522054620028ac908262002b91565b6001600160a01b038416600090815260036020526040902055600954620028d4908362002ad8565b600955600a54620028e6908262002b91565b600a556040805185815290516001600160a01b038516917f653e5ff55ca48790142c29d106f9894a46f039160ea9f49c1fa78fd3748fdf5a919081900360200190a250505050565b61546090565b600d5490565b6001600160a01b03918216600090815260046020908152604080832093909416825291909152205490565b60006200088d615460620016036008544262002b9190919063ffffffff16565b6200298f62002bd5565b6000546001600160a01b03908116911614620029f2576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001600160a01b03811662002a395760405162461bcd60e51b815260040180806020018281038252602681526020018062004ae96026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b600062001a6483836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525062002c6e565b60008282018381101562001a64576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60008262002b445750600062000a1b565b8282028284828162002b5257fe5b041462001a645760405162461bcd60e51b815260040180806020018281038252602181526020018062004b696021913960400191505060405180910390fd5b600062001a6483836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525062002d15565b3390565b6001600160a01b03821660009081526002602052604090205462002bfe908262002b91565b6001600160a01b038316600090815260026020526040902055600c5462002c26908262002b91565b600c556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b6000818362002cfe5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101562002cc257818101518382015260200162002ca8565b50505050905090810190601f16801562002cf05780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600083858162002d0b57fe5b0495945050505050565b6000818484111562002d6a5760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831562002cc257818101518382015260200162002ca8565b505050900390565b611d688062002d818339019056fe6080604052670de0b6b3a76400006005553480156200001d57600080fd5b5060405162001d6838038062001d68833981810160405260408110156200004357600080fd5b508051602090910151600062000058620001c5565b600080546001600160a01b0319166001600160a01b03831690811782556040519293509160008051602062001d12833981519152908290a3506001600160a01b038216620000d85760405162461bcd60e51b815260040180806020018281038252603181526020018062001ce16031913960400191505060405180910390fd5b6001600160a01b0381166200011f5760405162461bcd60e51b815260040180806020018281038252603681526020018062001d326036913960400191505060405180910390fd5b600180546001600160a01b038085166001600160a01b03199283168117909355600280549185169190921617905560408051638da5cb5b60e01b81529051620001bd9291638da5cb5b916004808301926020929190829003018186803b1580156200018957600080fd5b505afa1580156200019e573d6000803e3d6000fd5b505050506040513d6020811015620001b557600080fd5b5051620001c9565b5050620002c7565b3390565b620001d3620001c5565b6000546001600160a01b0390811691161462000236576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001600160a01b0381166200027d5760405162461bcd60e51b815260040180806020018281038252602681526020018062001cbb6026913960400191505060405180910390fd5b600080546040516001600160a01b038085169392169160008051602062001d1283398151915291a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6119e480620002d76000396000f3fe608060405234801561001057600080fd5b50600436106101b95760003560e01c8063812de113116100f9578063ce3ba71a11610097578063e4a3011611610071578063e4a301161461037b578063f2fde38b1461039e578063f84b903e146103c4578063fc0c546a146103cc576101b9565b8063ce3ba71a14610345578063e20ccec31461034d578063e22a5b2614610355576101b9565b8063a2e62045116100d3578063a2e6204514610310578063a694fc3a14610318578063b5ad304214610335578063c1633d5c1461033d576101b9565b8063812de113146102da5780638da5cb5b146102e25780639058a51c146102ea576101b9565b8063379607f5116101665780636fd5ae15116101405780636fd5ae15146102ba578063715018a6146102c25780637824407f146102ca57806378e97925146102d2576101b9565b8063379607f514610258578063599946a0146102775780635b76c7121461027f576101b9565b80631ffe54b2116101975780631ffe54b2146101e8578063274b781b1461020e5780632b57434714610232576101b9565b806305e66729146101be57806305e88b69146101d857806312b4110f146101e0575b600080fd5b6101c66103d4565b60408051918252519081900360200190f35b6101c66103db565b6101c6610439565b6101c6600480360360208110156101fe57600080fd5b50356001600160a01b031661043f565b6102166105a4565b604080516001600160a01b039092168252519081900360200190f35b6101c66004803603602081101561024857600080fd5b50356001600160a01b03166105b3565b6102756004803603602081101561026e57600080fd5b5035610618565b005b6101c6610892565b61029c6004803603602081101561029557600080fd5b5035610898565b60408051938452602084019290925282820152519081900360600190f35b6101c66109f5565b610275610a2d565b6101c6610aee565b6101c6610b6a565b6101c6610b70565b610216610b76565b6101c66004803603602081101561030057600080fd5b50356001600160a01b0316610b85565b610275610ba0565b6102756004803603602081101561032e57600080fd5b5035610cc8565b6101c6610f52565b6101c6610fa8565b6101c6610ff3565b6101c66110dd565b6101c66004803603602081101561036b57600080fd5b50356001600160a01b0316611111565b6102756004803603604081101561039157600080fd5b508035906020013561112f565b610275600480360360208110156103b457600080fd5b50356001600160a01b0316611245565b6101c661135c565b610216611362565b6009545b90565b6000600454600014806103f057504260045410155b156103fd575060006103d8565b600854600454600a5462093a8090829003819004914203045b8082101561043157600a830490920391600190910190610416565b509091505090565b600a5490565b600080610456600954610450610ff3565b90611371565b90506000610462610aee565b60065490915082158015906104775750600082115b156104b7576104b46104ad836104a764e8d4a510006104a161049a8960146113ba565b8990611371565b906113fc565b906113ba565b8290611455565b90505b6001600160a01b0385166000908152600360205260408120546104e59064e8d4a51000906104a790856113fc565b6005546001600160a01b0388166000908152600360205260408120600101549293509161051f91670de0b6b3a7640000916104a7916113fc565b6001600160a01b03881660009081526003602052604090206002015460055491925014610578576005546001600160a01b03881660009081526003602052604090206002015461057591906104a79084906113fc565b90505b80821161058d5760009550505050505061059f565b6105978282611371565b955050505050505b919050565b6001546001600160a01b031690565b60006105bd6114af565b6001546001600160a01b039081169116146106095760405162461bcd60e51b815260040180806020018281038252602b81526020018061188e602b913960400191505060405180910390fd5b610612826114b3565b92915050565b60015460408051633af32abf60e01b81523360048201819052915191926001600160a01b031691633af32abf91602480820192602092909190829003018186803b15801561066557600080fd5b505afa158015610679573d6000803e3d6000fd5b505050506040513d602081101561068f57600080fd5b5051156106cd5760405162461bcd60e51b81526004018080602001828103825260368152602001806119436036913960400191505060405180910390fd5b6106d5610ba0565b6106de816114b3565b5081156107dc576001600160a01b0381166000908152600360205260409020546107089083611371565b6001600160a01b03808316600081815260036020908152604080832095909555600254855163a9059cbb60e01b8152600481019490945260248401889052945191949093169263a9059cbb926044808201939182900301818787803b15801561077057600080fd5b505af1158015610784573d6000803e3d6000fd5b505050506040513d602081101561079a57600080fd5b50519050806107da5760405162461bcd60e51b81526004018080602001828103825260228152602001806119006022913960400191505060405180910390fd5b505b6006546001600160a01b038216600090815260036020526040812054909161080f9164e8d4a51000916104a791906113fc565b60055490915061082b906104a783670de0b6b3a76400006113fc565b6001600160a01b03831660008181526003602090815260409182902060018101949094556005546002909401939093558051868152905191927fd8138f8a3f377c5259ca548e70e4c2de94f129f5a11036a15b69513cba2b426a92918290030190a2505050565b60085490565b60008060006108a56114af565b6001546001600160a01b039081169116146108f15760405162461bcd60e51b815260040180806020018281038252602b81526020018061188e602b913960400191505060405180910390fd5b6108f9610ba0565b6000610903610fa8565b90508061091b576000806000935093509350506109ee565b61092a60646104a783886113fc565b935061093784600a6113ba565b91506109438483611371565b60015490935061095c906001600160a01b031684611634565b61098261097960646104a7886005546113fc90919063ffffffff16565b60055490611371565b6005556006546109a69061099d906064906104a790896113fc565b60065490611371565b6006556040805185815260208101859052808201849052905186917f976232a004b12cdbd7c3ce7d454fe1e8265752d8b7573d031e20184cfa1a07c6919081900360600190a2505b9193909250565b600060045460001480610a0a57504260045410155b15610a17575060006103d8565b62093a80600454420381610a2757fe5b04905090565b610a356114af565b6000546001600160a01b03908116911614610a97576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a36000805473ffffffffffffffffffffffffffffffffffffffff19169055565b600254604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b158015610b3957600080fd5b505afa158015610b4d573d6000803e3d6000fd5b505050506040513d6020811015610b6357600080fd5b5051905090565b60045490565b60065490565b6000546001600160a01b031690565b6001600160a01b031660009081526003602052604090205490565b600a544211610bae57610cc6565b6000610bb86103db565b90506000610bc4610ff3565b90506009548111610bda57505042600a55610cc6565b6000610be4610aee565b905080610bfb575060095560085542600a55610cc6565b6000610c126009548461137190919063ffffffff16565b60015460408051635018d7a960e01b81526004810184905290519293506000926001600160a01b0390921691635018d7a99160248082019260209290919082900301818787803b158015610c6557600080fd5b505af1158015610c79573d6000803e3d6000fd5b505050506040513d6020811015610c8f57600080fd5b50519050610cb2610ca9846104a78464e8d4a510006113fc565b60065490611455565b60065550505060089190915560095542600a555b565b60015460408051633af32abf60e01b81523360048201819052915191926001600160a01b031691633af32abf91602480820192602092909190829003018186803b158015610d1557600080fd5b505afa158015610d29573d6000803e3d6000fd5b505050506040513d6020811015610d3f57600080fd5b505115610d7d5760405162461bcd60e51b81526004018080602001828103825260368152602001806119796036913960400191505060405180910390fd5b610d85610ba0565b610d8e816114b3565b508115610e9c57600254604080516323b872dd60e01b81526001600160a01b03848116600483015230602483015260448201869052915160009392909216916323b872dd9160648082019260209290919082900301818787803b158015610df457600080fd5b505af1158015610e08573d6000803e3d6000fd5b505050506040513d6020811015610e1e57600080fd5b5051905080610e5e5760405162461bcd60e51b81526004018080602001828103825260228152602001806119006022913960400191505060405180910390fd5b6001600160a01b038216600090815260036020526040902054610e819084611455565b6001600160a01b038316600090815260036020526040902055505b6006546001600160a01b0382166000908152600360205260408120549091610ecf9164e8d4a51000916104a791906113fc565b600554909150610eeb906104a783670de0b6b3a76400006113fc565b6001600160a01b03831660008181526003602090815260409182902060018101949094556005546002909401939093558051868152905191927f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d92918290030190a2505050565b600060045460001480610f6757504260045410155b15610f74575060006103d8565b600062093a80610f826109f5565b02600454014203905062093a8081670de0b6b3a76400000281610fa157fe5b0491505090565b600154604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b158015610b3957600080fd5b60006004546000148061100857504260045410155b15611015575060006103d8565b600062093a80600454600a54038161102957fe5b049050600062093a8060045442038161103e57fe5b0490508082141561106b5762093a80600854600a544203028161105d57fe5b0460095401925050506103d8565b600854600a80546004546001959095019462093a80868102909101919091038302049190810490035b828410156110b15790810190600a81600190950194049003611094565b62093a808162093a80850260045401420302816110ca57fe5b0482019150816009540194505050505090565b6000806110e8610ff3565b905060075481116110fd5760009150506103d8565b60075461110b908290611371565b91505090565b6001600160a01b031660009081526003602052604090206001015490565b6111376114af565b6000546001600160a01b03908116911614611199576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6111a1610ff3565b156111f3576040805162461bcd60e51b815260206004820152601960248201527f537461626c6556323a20616c7265616479207374617274656400000000000000604482015290519081900360640190fd5b6004829055600781026008819055600a83905560408051848152602081019290925280517f997896709b4e932ee42750e2e14ed1f7ab6c60bd911ff567aa2485cf0b20051b9281900390910190a15050565b61124d6114af565b6000546001600160a01b039081169116146112af576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001600160a01b0381166112f45760405162461bcd60e51b81526004018080602001828103825260268152602001806118b96026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a36000805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b60075490565b6002546001600160a01b031690565b60006113b383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611791565b9392505050565b60006113b383836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611828565b60008261140b57506000610612565b8282028284828161141857fe5b04146113b35760405162461bcd60e51b81526004018080602001828103825260218152602001806119226021913960400191505060405180910390fd5b6000828201838110156113b3576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b3390565b6001600160a01b0381166000908152600360205260408120600654815483916114e79164e8d4a51000916104a791906113fc565b90506000611510670de0b6b3a76400006104a760055486600101546113fc90919063ffffffff16565b90508260020154600554146115475761153c6005546104a78560020154846113fc90919063ffffffff16565b600554600285015590505b8082111561162c57600154604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b15801561159a57600080fd5b505afa1580156115ae573d6000803e3d6000fd5b505050506040513d60208110156115c457600080fd5b505190506115d28383611371565b92508083116115e157826115e3565b805b600554909550611603906104a7670de0b6b3a76400006104a1868a611455565b6001850155600554600285015560075461161d9086611455565b60075561162a8686611634565b505b505050919050565b600154604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b15801561167f57600080fd5b505afa158015611693573d6000803e3d6000fd5b505050506040513d60208110156116a957600080fd5b5051905060008183116116bc57826116be565b815b9050801561178b576001546040805163a9059cbb60e01b81526001600160a01b038781166004830152602482018590529151600093929092169163a9059cbb9160448082019260209290919082900301818787803b15801561171f57600080fd5b505af1158015611733573d6000803e3d6000fd5b505050506040513d602081101561174957600080fd5b50519050806117895760405162461bcd60e51b81526004018080602001828103825260218152602001806118df6021913960400191505060405180910390fd5b505b50505050565b600081848411156118205760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156117e55781810151838201526020016117cd565b50505050905090810190601f1680156118125780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600081836118775760405162461bcd60e51b81526020600482018181528351602484015283519092839260449091019190850190808383600083156117e55781810151838201526020016117cd565b50600083858161188357fe5b049594505050505056fe537461626c6556323a2063616c6c6572206973206e6f7420746865204d696c6b657220636f6e74726163744f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373537461626c6556323a20756e61626c6520746f207472616e73666572204d494c4b537461626c6556323a20756e61626c6520746f207472616e73666572207374616b65536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77537461626c6556323a2077686974656c6973746564204d494c4b20686f6c646572732063616e6e6f7420636c61696d20746f6b656e73537461626c6556323a2077686974656c6973746564204d494c4b20686f6c646572732063616e6e6f74207374616b6520746f6b656e73a26469706673582212206adc4592aac4c61b6a7cb18c1dd17111182d432f838c8f11bd2be1eba8d4fc3664736f6c634300060c00334f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373537461626c6556323a204d696c6b657220636f6e747261637420616464726573732063616e6e6f7420626520656d7074798be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0537461626c6556323a20455243323020746f6b656e20636f6e747261637420616464726573732063616e6e6f7420626520656d7074794f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734d696c6b3a20756e61626c6520746f2073656e6420746f6b656e7320746f207a65726f20616464726573734d696c6b3a20756e61626c6520746f20637265617465206465706c6f7920537461626c65563220636f6e7472616374536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774d696c6b3a2077686974656c697374656420686f6c646572732063616e6e6f742075736520536865726966662773205661756c744d696c6b3a2063616c6c6572206973206e6f742074686520636f6e74726f6c6c6572a264697066735822122008f730cfc637e2e90d89159c35308a8c6460e616246cd5189bdac1cf89877e7164736f6c634300060c0033

Deployed Bytecode Sourcemap

28011:22120:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46873:128;;;:::i;:::-;;;;;;;;;;;;;;;;48165:270;;;:::i;28237:46::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46456:150;;;;;;;;;;;;;;;;-1:-1:-1;46456:150:0;-1:-1:-1;;;;;46456:150:0;;:::i;43825:213::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;43825:213:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;47009:105;;;:::i;46765:100::-;;;:::i;49284:290::-;;;;;;;;;;;;;;;;-1:-1:-1;49284:290:0;-1:-1:-1;;;;;49284:290:0;;:::i;42479:1338::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;42479:1338:0;;;;;;;;;;;;;;;;;:::i;28335:37::-;;;:::i;49007:269::-;;;:::i;44046:289::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;44046:289:0;;;;;;;;:::i;45085:121::-;;;;;;;;;;;;;;;;-1:-1:-1;45085:121:0;-1:-1:-1;;;;;45085:121:0;;:::i;39146:622::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;39146:622:0;;;;;;;;:::i;45214:157::-;;;;;;;;;;;;;;;;-1:-1:-1;45214:157:0;;:::i;:::-;;;;-1:-1:-1;;;;;45214:157:0;;;;;;;;;;;;;;40352:671;;;;;;;;;;;;;;;;-1:-1:-1;40352:671:0;;:::i;39776:375::-;;;;;;;;;;;;;;;;-1:-1:-1;39776:375:0;-1:-1:-1;;;;;39776:375:0;;:::i;33126:1956::-;;;;;;;;;;;;;;;;-1:-1:-1;33126:1956:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;35275:882;;;:::i;45795:653::-;;;;;;;;;;;;;;;;-1:-1:-1;45795:653:0;-1:-1:-1;;;;;45795:653:0;;:::i;10636:148::-;;;:::i;:::-;;31980:960;;;;;;;;;;;;;;;;-1:-1:-1;31980:960:0;-1:-1:-1;;;;;31980:960:0;;:::i;44981:96::-;;;:::i;47596:268::-;;;:::i;9994:79::-;;;:::i;45379:306::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31824:148;;;;;;;;;;;;;;;;-1:-1:-1;31824:148:0;-1:-1:-1;;;;;31824:148:0;;:::i;28290:38::-;;;:::i;45693:94::-;;;:::i;48722:277::-;;;:::i;36350:658::-;;;:::i;44343:465::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;44343:465:0;;;;;;;;:::i;41208:1263::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;41208:1263:0;;;;;;;;:::i;47122:144::-;;;:::i;48443:271::-;;;:::i;37182:882::-;;;;;;;;;;;;;;;;-1:-1:-1;37182:882:0;;:::i;38072:886::-;;;;;;;;;;;;;;;;-1:-1:-1;38072:886:0;;:::i;47872:102::-;;;:::i;49582:105::-;;;:::i;46614:143::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;46614:143:0;;;;;;;;;;:::i;47455:133::-;;;:::i;10939:244::-;;;;;;;;;;;;;;;;-1:-1:-1;10939:244:0;-1:-1:-1;;;;;10939:244:0;;:::i;46873:128::-;46919:7;46946:47;46968:24;;46946:17;;:21;;:47;;;;:::i;:::-;46939:54;;46873:128;;:::o;48165:270::-;48295:8;:15;48216:7;;;;;;48261:143;48317:1;48313;:5;48261:143;;;48349:43;48360:8;48369:1;48360:11;;;;;;;;;;;;;;;;;;:18;:31;;;-1:-1:-1;;;48360:31:0;;;;-1:-1:-1;;;;;48360:18:0;;;;:29;;:31;;;;;;;;;;:18;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48360:31:0;48349:6;;:10;:43::i;:::-;48340:52;-1:-1:-1;48320:3:0;;;;;48261:143;;;-1:-1:-1;48421:6:0;;-1:-1:-1;;48165:270:0;:::o;28237:46::-;;;;;;;;;;;;;;;;;;;:::o;46456:150::-;46568:29;;-1:-1:-1;;;;;46547:16:0;;46520:7;46547:16;;;:7;:16;;;;;;46520:7;;46547:51;;:16;:20;:51::i;:::-;46540:58;;46456:150;;;;:::o;43825:213::-;43928:10;43899:4;43916:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;43916:32:0;;;;;;;;;;;:40;;;43972:36;;;;;;;43899:4;;43916:32;;43928:10;;43972:36;;;;;;;;-1:-1:-1;44026:4:0;43825:213;;;;;:::o;47009:105::-;47086:20;;47009:105;:::o;46765:100::-;46845:12;;46765:100;:::o;49284:290::-;49428:8;:15;49349:7;;;;;;49394:149;49450:1;49446;:5;49394:149;;;49482:49;49493:8;49502:1;49493:11;;;;;;;;;;;;;;;;;;:18;:37;;;-1:-1:-1;;;49493:37:0;;-1:-1:-1;;;;;49493:37:0;;;;;;;;;:18;;;;;:28;;:37;;;;;;;;;;;:18;:37;;;;;;;;;;49482:49;49473:58;-1:-1:-1;49453:3:0;;;;;49394:149;;;-1:-1:-1;49560:6:0;;49284:290;-1:-1:-1;;;49284:290:0:o;42479:1338::-;42586:4;42573:2;-1:-1:-1;;;;;31144:23:0;;31136:79;;;;-1:-1:-1;;;31136:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42604:11:::1;42617:9:::0;42631:25:::1;42645:10;42631:13;:25::i;:::-;42658:17;42672:2;42658:13;:17::i;:::-;42603:73;;;;42687:17;42707:6;:52;;42734:24;::::0;42724:35:::1;::::0;:5;;:9:::1;:35::i;:::-;42707:52;;;42716:5;42707:52;42687:72;;42770:15;42788:4;:50;;42813:24;::::0;42803:35:::1;::::0;:5;;:9:::1;:35::i;:::-;42788:50;;;42795:5;42788:50;-1:-1:-1::0;;;;;42881:17:0;::::1;;::::0;;;:11:::1;:17;::::0;;;;;;;42899:10:::1;42881:29:::0;;;;;;;;42770:68;;-1:-1:-1;42881:40:0::1;::::0;42915:5;42881:33:::1;:40::i;:::-;-1:-1:-1::0;;;;;42849:17:0;::::1;;::::0;;;:11:::1;:17;::::0;;;;;;;42867:10:::1;42849:29:::0;;;;;;;:72;42936:7;::::1;:38:::0;::::1;;;-1:-1:-1::0;;;;;;42947:15:0;::::1;;::::0;;;:9:::1;:15;::::0;;;;;:27;-1:-1:-1;42936:38:0::1;42932:85;;;42991:14;43000:4;42991:8;:14::i;:::-;;42932:85;43031:6;:14;;;;;43041:4;43031:14;43027:720;;;-1:-1:-1::0;;;;;43080:15:0;::::1;;::::0;;;:9:::1;:15;::::0;;;;;:30:::1;::::0;43100:9;43080:19:::1;:30::i;:::-;-1:-1:-1::0;;;;;43062:15:0;;::::1;;::::0;;;:9:::1;:15;::::0;;;;;:48;;;;43141:13;;::::1;::::0;;;;:26:::1;::::0;43159:7;43141:17:::1;:26::i;:::-;-1:-1:-1::0;;;;;43125:13:0;::::1;;::::0;;;:9:::1;:13;::::0;;;;:42;43027:720:::1;;;43189:6;43185:562;;;-1:-1:-1::0;;;;;43230:15:0;::::1;;::::0;;;:9:::1;:15;::::0;;;;;:30:::1;::::0;43250:9;43230:19:::1;:30::i;:::-;-1:-1:-1::0;;;;;43212:15:0;;::::1;;::::0;;;:9:::1;:15;::::0;;;;;:48;;;;43291:13;;::::1;::::0;;;;:26:::1;::::0;43309:7;43291:17:::1;:26::i;:::-;-1:-1:-1::0;;;;;43275:13:0;::::1;;::::0;;;:9:::1;:13;::::0;;;;:42;43352:17:::1;::::0;:30:::1;::::0;43374:7;43352:21:::1;:30::i;:::-;43332:17;:50:::0;43185:562:::1;;;43404:4;43400:347;;;-1:-1:-1::0;;;;;43443:15:0;::::1;;::::0;;;:9:::1;:15;::::0;;;;;:30:::1;::::0;43463:9;43443:19:::1;:30::i;:::-;-1:-1:-1::0;;;;;43425:15:0;;::::1;;::::0;;;:9:::1;:15;::::0;;;;;:48;;;;43504:13;;::::1;::::0;;;;:26:::1;::::0;43522:7;43504:17:::1;:26::i;:::-;-1:-1:-1::0;;;;;43488:13:0;::::1;;::::0;;;:9:::1;:13;::::0;;;;:42;43565:17:::1;::::0;:32:::1;::::0;43587:9;43565:21:::1;:32::i;43400:347::-;-1:-1:-1::0;;;;;43648:15:0;::::1;;::::0;;;:9:::1;:15;::::0;;;;;:30:::1;::::0;43668:9;43648:19:::1;:30::i;:::-;-1:-1:-1::0;;;;;43630:15:0;;::::1;;::::0;;;:9:::1;:15;::::0;;;;;:48;;;;43709:13;;::::1;::::0;;;;:26:::1;::::0;43727:7;43709:17:::1;:26::i;:::-;-1:-1:-1::0;;;;;43693:13:0;::::1;;::::0;;;:9:::1;:13;::::0;;;;:42;43400:347:::1;43777:2;-1:-1:-1::0;;;;;43762:25:0::1;43771:4;-1:-1:-1::0;;;;;43762:25:0::1;;43781:5;43762:25;;;;;;;;;;;;;;;;;;-1:-1:-1::0;43805:4:0::1;::::0;42479:1338;-1:-1:-1;;;;;;;;42479:1338:0:o;28335:37::-;28370:2;28335:37;:::o;49007:269::-;49139:8;:15;49060:7;;;;;;49105:140;49161:1;49157;:5;49105:140;;;49193:40;49204:8;49213:1;49204:11;;;;;;;;;;;;;;;;;;:18;:28;;;-1:-1:-1;;;49204:28:0;;;;-1:-1:-1;;;;;49204:18:0;;;;:26;;:28;;;;;;;;;;:18;:28;;;;;;;;;;49193:40;49184:49;-1:-1:-1;49164:3:0;;;;;49105:140;;44046:289;44190:10;44126:4;44178:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;44178:32:0;;;;;;;;;;:48;;44215:10;44178:36;:48::i;:::-;44155:10;44143:23;;;;:11;:23;;;;;;;;-1:-1:-1;;;;;44143:32:0;;;;;;;;;;;;:83;;;44242:63;;;;;;44143:32;;44242:63;;;;;;;;;;;-1:-1:-1;44323:4:0;44046:289;;;;:::o;45085:121::-;-1:-1:-1;;;;;45179:19:0;45155:4;45179:19;;;:10;:19;;;;;;;;;45085:121::o;39146:622::-;39249:4;39219:9;-1:-1:-1;;;;;31144:23:0;;31136:79;;;;-1:-1:-1;;;31136:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10216:12:::1;:10;:12::i;:::-;10206:6;::::0;-1:-1:-1;;;;;10206:6:0;;::::1;:22:::0;::::1;;10198:67;;;::::0;;-1:-1:-1;;;10198:67:0;;::::1;;::::0;::::1;::::0;;;;;;;::::1;::::0;;;;;;;;;;;;;::::1;;39270:24:::2;39284:9;39270:13;:24::i;:::-;39266:329;;;-1:-1:-1::0;;;;;39334:20:0;::::2;;::::0;;;:9:::2;:20;::::0;;;;;:32:::2;::::0;39359:6;39334:24:::2;:32::i;:::-;-1:-1:-1::0;;;;;39311:20:0;::::2;;::::0;;;:9:::2;:20;::::0;;;;:55;39266:329:::2;;;39399:13;39415:36;39426:24;;39415:6;:10;;:36;;;;:::i;:::-;-1:-1:-1::0;;;;;39489:20:0;::::2;;::::0;;;:9:::2;:20;::::0;;;;;39399:52;;-1:-1:-1;39489:31:0::2;::::0;39399:52;39489:24:::2;:31::i;:::-;-1:-1:-1::0;;;;;39466:20:0;::::2;;::::0;;;:9:::2;:20;::::0;;;;:54;39555:17:::2;::::0;:28:::2;::::0;39577:5;39555:21:::2;:28::i;:::-;39535:17;:48:::0;-1:-1:-1;39266:329:0::2;39620:12;::::0;:24:::2;::::0;39637:6;39620:16:::2;:24::i;:::-;39605:12;:39:::0;39660:23:::2;::::0;;;;;;;-1:-1:-1;;;;;39660:23:0;::::2;::::0;::::2;::::0;;;;;::::2;::::0;;::::2;39699:39;::::0;;;;;;;-1:-1:-1;;;;;39699:39:0;::::2;::::0;39716:1:::2;::::0;39699:39:::2;::::0;;;;::::2;::::0;;::::2;-1:-1:-1::0;39756:4:0::2;::::0;39146:622;-1:-1:-1;;;39146:622:0:o;45214:157::-;45301:8;:15;45266:7;;45293:23;;:70;;45361:1;45293:70;;;45327:8;45336:5;45327:15;;;;;;;;;;;;;;;;;:22;-1:-1:-1;;;;;45327:22:0;;45214:157;-1:-1:-1;;45214:157:0:o;40352:671::-;40425:7;31454:1;31423:14;:28;31438:12;:10;:12::i;:::-;-1:-1:-1;;;;;31423:28:0;-1:-1:-1;;;;;31423:28:0;;;;;;;;;;;;;:32;31415:77;;;;;-1:-1:-1;;;31415:77:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40522:15:::1;40540:14;:6:::0;40551:2:::1;40540:10;:14::i;:::-;40522:32:::0;-1:-1:-1;40577:15:0::1;40595:19;:6:::0;40522:32;40595:10:::1;:19::i;:::-;40705:10;40695:21;::::0;;;:9:::1;:21;::::0;;;;;40577:37;;-1:-1:-1;40695:34:0::1;::::0;40577:37;40695:25:::1;:34::i;:::-;40681:10;40671:21;::::0;;;:9:::1;:21;::::0;;;;:58;;;;28836:42:::1;40759:16:::0;;;;:29:::1;::::0;40780:7;40759:20:::1;:29::i;:::-;28836:42;40740:16;::::0;:9:::1;:16;::::0;;:48;40814:12:::1;::::0;:24:::1;::::0;40831:6;40814:16:::1;:24::i;:::-;40799:12;:39:::0;40897:41:::1;::::0;;;;;;;40918:10:::1;::::0;40914:1:::1;::::0;40897:41:::1;::::0;;;;::::1;::::0;;::::1;40954:36;::::0;;;;;;;28836:42:::1;::::0;40971:1:::1;::::0;40954:36:::1;::::0;;;;::::1;::::0;;::::1;41008:7:::0;40352:671;-1:-1:-1;;;40352:671:0:o;39776:375::-;39915:8;:15;39836:7;;;;;;39881:239;39937:1;39933;:5;39881:239;;;39960:8;39969:1;39960:11;;;;;;;;;;;;;;;;:18;:27;;;-1:-1:-1;;;39960:27:0;;;;-1:-1:-1;;;;;39960:18:0;;;;:25;;:27;;;;;;;;;;:11;:18;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40002:19;40024:8;40033:1;40024:11;;;;;;;;;;;;;;;;;;;:18;:37;;;-1:-1:-1;;;40024:37:0;;-1:-1:-1;;;;;40024:37:0;;;;;;;;;:18;;;;;:28;;:37;;;;;:11;;:37;;;;;;;;;:18;:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40024:37:0;;-1:-1:-1;40085:23:0;:6;40024:37;40085:10;:23::i;:::-;40076:32;-1:-1:-1;;39940:3:0;;;;;39881:239;;33126:1956;33212:21;33244:22;33277:19;31303:12;:10;:12::i;:::-;31288:11;;-1:-1:-1;;;;;31288:11:0;;;:27;;;31280:74;;;;-1:-1:-1;;;31280:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33333:1:::1;33323:7;:11;:28;;;;;33348:3;33338:7;:13;33323:28;33315:72;;;::::0;;-1:-1:-1;;;33315:72:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;33398:14;33415:47;33437:24;;33415:17;;:21;;:47;;;;:::i;:::-;33398:64:::0;-1:-1:-1;33529:28:0::1;33553:3;33529:19;33398:64:::0;33540:7;33529:10:::1;:19::i;:::-;:23:::0;::::1;:28::i;:::-;33513:44:::0;-1:-1:-1;33582:21:0::1;33513:44:::0;33600:2:::1;33582:17;:21::i;:::-;33568:35:::0;-1:-1:-1;33631:30:0::1;:13:::0;33568:35;33631:17:::1;:30::i;:::-;33870:8;:15:::0;33614:47;;-1:-1:-1;33738:22:0::1;::::0;;;;;;;33836:472:::1;33892:1;33888;:5;33836:472;;;33916:9;33927::::0;33938::::1;33951:8;33960:1;33951:11;;;;;;;;;;;;;;;:18;;;;;;;;;;-1:-1:-1::0;;;;;33951:18:0::1;-1:-1:-1::0;;;;;33951:26:0::1;;33978:7;33951:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;33951:35:0;;::::1;::::0;::::1;::::0;;;;;;;;-1:-1:-1;33951:35:0;;-1:-1:-1;33951:35:0;-1:-1:-1;34068:21:0::1;:14:::0;33951:35;34068:18:::1;:21::i;:::-;34051:38:::0;-1:-1:-1;34122:22:0::1;:15:::0;34142:1;34122:19:::1;:22::i;:::-;34104:40:::0;-1:-1:-1;34174:19:0::1;:12:::0;34191:1;34174:16:::1;:19::i;:::-;34159:34;;34259:37;34273:8;34282:1;34273:11;;;;;;;;;::::0;;;::::1;::::0;;;::::1;:18:::0;-1:-1:-1;;;;;34273:18:0::1;34294:1:::0;34259:5:::1;:37::i;:::-;-1:-1:-1::0;;33895:3:0::1;::::0;;::::1;::::0;-1:-1:-1;33836:472:0::1;;;-1:-1:-1::0;34348:17:0::1;::::0;-1:-1:-1;34368:25:0::1;:6:::0;34379:13;34368:10:::1;:25::i;:::-;34348:45;;34417:1;34408:6;:10;:27;;;;;34434:1;34422:9;:13;34408:27;34404:370;;;34479:51;34520:9;34479:36;34490:24;;34479:6;:10;;:36;;;;:::i;:51::-;34452:24;:78:::0;;;34565:39:::1;::::0;:9;;:13:::1;:39::i;:::-;34545:17;:59:::0;34642:20:::1;::::0;:61:::1;::::0;34687:15;;34642:40:::1;::::0;34667:14;34642:24:::1;:40::i;:::-;:44:::0;::::1;:61::i;:::-;34619:20;:84:::0;34733:12:::1;::::0;:29:::1;::::0;34750:11;34733:16:::1;:29::i;:::-;34718:12;:44:::0;34404:370:::1;34846:33;:13:::0;34864:14;34846:17:::1;:33::i;:::-;34830:49:::0;-1:-1:-1;34907:35:0::1;:14:::0;34926:15;34907:18:::1;:35::i;:::-;34890:52:::0;-1:-1:-1;34967:29:0::1;:11:::0;34983:12;34967:15:::1;:29::i;:::-;35014:60;::::0;;;;;::::1;::::0;::::1;::::0;;;;;;;;;;;34953:43;;-1:-1:-1;35022:7:0;;35014:60:::1;::::0;;;;;;;::::1;31365:1;;;;;33126:1956:::0;;;;;:::o;35275:882::-;35352:7;31303:12;:10;:12::i;:::-;31288:11;;-1:-1:-1;;;;;31288:11:0;;;:27;;;31280:74;;;;-1:-1:-1;;;31280:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35448:22:::1;::::0;35431:14:::1;::::0;35448:31:::1;::::0;35475:3:::1;35448:26;:31::i;:::-;35431:48;;35490:14;35507:41;35518:29;;35507:6;:10;;:41;;;;:::i;:::-;35490:58;;35589:14;35606:57;35633:29;;35606:22;;:26;;:57;;;;:::i;:::-;35589:74:::0;-1:-1:-1;35674:17:0::1;35694:27;35705:15;35589:74:::0;35716:3:::1;35705:10;:15::i;:::-;35694:6:::0;;:10:::1;:27::i;:::-;35674:47;;35745:1;35736:6;:10;:27;;;;;35762:1;35750:9;:13;35736:27;35732:345;;;35812:56;35858:9;35812:41;35823:29;;35812:6;:10;;:41;;;;:::i;:56::-;35780:29;:88:::0;;;35908:44:::1;::::0;:9;;:13:::1;:44::i;:::-;35883:22;:69:::0;35990:20:::1;::::0;:32:::1;::::0;36015:6;35990:24:::1;:32::i;:::-;35967:20;:55:::0;35732:345:::1;;;36064:1;36055:10;;35732:345;36094:31;::::0;;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;-1:-1:-1::0;36143:6:0;;-1:-1:-1;;;35275:882:0;:::o;45795:653::-;45861:7;45954:22;45968:7;45954:13;:22::i;:::-;45950:80;;;-1:-1:-1;;;;;;46000:18:0;;;;;;:9;:18;;;;;;45993:25;;45950:80;46158:8;:15;46092:21;;;;46124:163;46180:1;46176;:5;46124:163;;;46219:56;46237:8;46246:1;46237:11;;;;;;;46219:56;46203:72;-1:-1:-1;46183:3:0;;;;;46124:163;;;-1:-1:-1;;46396:24:0;;-1:-1:-1;;;;;46373:18:0;;;;;;:9;:18;;;;;;:67;;46426:13;;46373:48;;:22;:48::i;:67::-;46366:74;45795:653;-1:-1:-1;;;45795:653:0:o;10636:148::-;10216:12;:10;:12::i;:::-;10206:6;;-1:-1:-1;;;;;10206:6:0;;;:22;;;10198:67;;;;;-1:-1:-1;;;10198:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10743:1:::1;10727:6:::0;;10706:40:::1;::::0;-1:-1:-1;;;;;10727:6:0;;::::1;::::0;10706:40:::1;::::0;10743:1;;10706:40:::1;10774:1;10757:19:::0;;-1:-1:-1;;;;;;10757:19:0::1;::::0;;10636:148::o;31980:960::-;32045:14;10216:12;:10;:12::i;:::-;10206:6;;-1:-1:-1;;;;;10206:6:0;;;:22;;;10198:67;;;;;-1:-1:-1;;;10198:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32111:12:::1;32161:4;32168:5;32136:38;;;;;;-1:-1:-1::0;;;;;32136:38:0::1;;;;;;;;-1:-1:-1::0;;;;;32136:38:0::1;;;;;;;;;;;;;;;;;;;;;;;32126:49;;;;;;32111:64;;32222:4;32236;32243:5;32203:46;;;;;:::i;:::-;-1:-1:-1::0;;;;;32203:46:0;;::::1;::::0;;;::::1;;::::0;::::1;::::0;;;;;;;;;;;;;-1:-1:-1;32203:46:0::1;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;32186:64:0;-1:-1:-1;;;;;;32269:20:0;::::1;32261:80;;;;-1:-1:-1::0;;;32261:80:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32404:39;::::0;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;;;32404:39:0;;::::1;::::0;;;32390:8:::1;:54:::0;;::::1;::::0;;::::1;::::0;;-1:-1:-1;32390:54:0;;;;;;;;::::1;::::0;;-1:-1:-1;;;;;;32390:54:0::1;::::0;;::::1;::::0;;;::::1;::::0;;;32480:15;;32455:22;;;:14:::1;:22:::0;;;;;:40;;;;32506:10:::1;:18:::0;;;;;;:25;;-1:-1:-1;;32506:25:0::1;::::0;;::::1;::::0;;;32589:17;::::1;::::0;;;;32506:25:::1;32589:17;32584:267;;32661:24;::::0;-1:-1:-1;;;;;32640:16:0;::::1;32623:14;32640:16:::0;;;:9:::1;:16;::::0;;;;;32623:14;;32640:46:::1;::::0;:16;:20:::1;:46::i;:::-;-1:-1:-1::0;;;;;32743:16:0;::::1;;::::0;;;:9:::1;:16;::::0;;;;;32721:17:::1;::::0;32623:63;;-1:-1:-1;32721:39:0::1;::::0;:17;:21:::1;:39::i;:::-;32701:17;:59:::0;-1:-1:-1;;;;;32775:16:0;::::1;;::::0;;;:9:::1;:16;::::0;;;;;;;:25;;;;32815:10:::1;:17:::0;;;:24;;-1:-1:-1;;32815:24:0::1;32835:4;32815:24;::::0;;32584:267:::1;32912:8;:15:::0;32868:64:::1;::::0;;-1:-1:-1;;;;;32868:64:0;;::::1;::::0;;32898:4:::1;32868:64;::::0;::::1;::::0;;::::1;::::0;;;;-1:-1:-1;;32912:19:0;;;32868:64;;;;;::::1;::::0;;;;;;;::::1;10276:1;31980:960:::0;;;:::o;44981:96::-;45059:10;;44981:96;:::o;47596:268::-;47652:7;47672:31;47706:78;47740:43;47755:27;28724:7;47755:8;:6;:8::i;:::-;:12;;:27::i;:::-;47740:10;;;:14;:43::i;:::-;47706:15;;:33;:78::i;:::-;47672:112;-1:-1:-1;47802:54:0;28724:7;47802:35;47672:112;47830:6;47802:27;:35::i;:54::-;47795:61;;;47596:268;:::o;9994:79::-;10032:7;10059:6;-1:-1:-1;;;;;10059:6:0;9994:79;:::o;45379:306::-;45491:8;:15;45419:16;;;;45477:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45477:30:0;-1:-1:-1;45552:8:0;:15;45448:59;;-1:-1:-1;45524:9:0;;45518:133;45574:1;45570;:5;45518:133;;;45620:8;45629:1;45620:11;;;;;;;;;;;;;;;;;:18;45597:12;;-1:-1:-1;;;;;45620:18:0;;;;45597:9;;45607:1;;45597:12;;;;;;-1:-1:-1;;;;;45597:42:0;;;:12;;;;;;;;;;;:42;45577:3;;;;;45518:133;;31824:148;10216:12;:10;:12::i;:::-;10206:6;;-1:-1:-1;;;;;10206:6:0;;;:22;;;10198:67;;;;;-1:-1:-1;;;10198:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31897:11:::1;:24:::0;;-1:-1:-1;;;;;;31897:24:0::1;-1:-1:-1::0;;;;;31897:24:0;::::1;::::0;;::::1;::::0;;;31937:27:::1;::::0;::::1;::::0;-1:-1:-1;;31937:27:0::1;31824:148:::0;:::o;28290:38::-;;;;;;;;;;;;;;-1:-1:-1;;;28290:38:0;;;;:::o;45693:94::-;45764:8;:15;45693:94;:::o;48722:277::-;48858:8;:15;48779:7;;;;;;48824:144;48880:1;48876;:5;48824:144;;;48912:44;48923:8;48932:1;48923:11;;;;;;;;;;;;;;;;;;:18;:32;;;-1:-1:-1;;;48923:32:0;;;;-1:-1:-1;;;;;48923:18:0;;;;:30;;:32;;;;;;;;;;:18;:32;;;;;;;;;;48912:44;48903:53;-1:-1:-1;48883:3:0;;;;;48824:144;;36350:658;36427:14;31303:12;:10;:12::i;:::-;31288:11;;-1:-1:-1;;;;;31288:11:0;;;:27;;;31280:74;;;;-1:-1:-1;;;31280:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36471:20:::1;::::0;36506:11;;;:37:::1;;-1:-1:-1::0;36521:17:0::1;::::0;:22;36506:37:::1;36502:78;;;36567:1;36560:8;;;;;36502:78;36620:14;36637:47;36659:24;;36637:17;;:21;;:47;;;;:::i;:::-;36620:64:::0;-1:-1:-1;36695:17:0::1;36715:18;36620:64:::0;36726:6;36715:10:::1;:18::i;:::-;36695:38;;36771:51;36812:9;36771:36;36782:24;;36771:6;:10;;:36;;;;:::i;:51::-;36744:24;:78:::0;;;36853:39:::1;::::0;:9;;:13:::1;:39::i;:::-;36833:17;:59:::0;36926:1:::1;36903:20;:24:::0;36945:31:::1;::::0;;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;-1:-1:-1::0;36994:6:0;;-1:-1:-1;;36350:658:0;:::o;44343:465::-;44476:10;44428:4;44464:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;44464:32:0;;;;;;;;;;44511:27;;;44507:193;;44567:10;44590:1;44555:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;44555:32:0;;;;;;;;;:36;44507:193;;;44659:29;:8;44672:15;44659:12;:29::i;:::-;44636:10;44624:23;;;;:11;:23;;;;;;;;-1:-1:-1;;;;;44624:32:0;;;;;;;;;:64;44507:193;44724:10;44745:23;;;;:11;:23;;;;;;;;-1:-1:-1;;;;;44715:63:0;;44745:32;;;;;;;;;;;44715:63;;;;;;;;;44724:10;44715:63;;;;;;;;;;;-1:-1:-1;44796:4:0;;44343:465;-1:-1:-1;;;44343:465:0:o;41208:1263::-;41297:4;41284:2;-1:-1:-1;;;;;31144:23:0;;31136:79;;;;-1:-1:-1;;;31136:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41315:12:::1;41329:11:::0;41342:9:::1;41356:10;41368:25;41382:10;41368:13;:25::i;:::-;41395:17;41409:2;41395:13;:17::i;:::-;41314:99;;;;;;41424:17;41444:6;:52;;41471:24;::::0;41461:35:::1;::::0;:5;;:9:::1;:35::i;:::-;41444:52;;;41453:5;41444:52;41424:72;;41507:15;41525:4;:50;;41550:24;::::0;41540:35:::1;::::0;:5;;:9:::1;:35::i;:::-;41525:50;;;41532:5;41525:50;41507:68;;41591:6;41590:7;:38;;;;-1:-1:-1::0;;;;;;41601:15:0;::::1;;::::0;;;:9:::1;:15;::::0;;;;;:27;-1:-1:-1;41590:38:0::1;41586:85;;;41645:14;41654:4;41645:8;:14::i;:::-;;41586:85;41685:6;:14;;;;;41695:4;41685:14;41681:720;;;-1:-1:-1::0;;;;;41734:15:0;::::1;;::::0;;;:9:::1;:15;::::0;;;;;:30:::1;::::0;41754:9;41734:19:::1;:30::i;:::-;-1:-1:-1::0;;;;;41716:15:0;;::::1;;::::0;;;:9:::1;:15;::::0;;;;;:48;;;;41795:13;;::::1;::::0;;;;:26:::1;::::0;41813:7;41795:17:::1;:26::i;:::-;-1:-1:-1::0;;;;;41779:13:0;::::1;;::::0;;;:9:::1;:13;::::0;;;;:42;41681:720:::1;;;41843:6;41839:562;;;-1:-1:-1::0;;;;;41884:15:0;::::1;;::::0;;;:9:::1;:15;::::0;;;;;:30:::1;::::0;41904:9;41884:19:::1;:30::i;:::-;-1:-1:-1::0;;;;;41866:15:0;;::::1;;::::0;;;:9:::1;:15;::::0;;;;;:48;;;;41945:13;;::::1;::::0;;;;:26:::1;::::0;41963:7;41945:17:::1;:26::i;:::-;-1:-1:-1::0;;;;;41929:13:0;::::1;;::::0;;;:9:::1;:13;::::0;;;;:42;42006:17:::1;::::0;:30:::1;::::0;42028:7;42006:21:::1;:30::i;:::-;41986:17;:50:::0;41839:562:::1;;;42058:4;42054:347;;;-1:-1:-1::0;;;;;42097:15:0;::::1;;::::0;;;:9:::1;:15;::::0;;;;;:30:::1;::::0;42117:9;42097:19:::1;:30::i;:::-;-1:-1:-1::0;;;;;42079:15:0;;::::1;;::::0;;;:9:::1;:15;::::0;;;;;:48;;;;42158:13;;::::1;::::0;;;;:26:::1;::::0;42176:7;42158:17:::1;:26::i;:::-;-1:-1:-1::0;;;;;42142:13:0;::::1;;::::0;;;:9:::1;:13;::::0;;;;:42;42219:17:::1;::::0;:32:::1;::::0;42241:9;42219:21:::1;:32::i;42054:347::-;-1:-1:-1::0;;;;;42302:15:0;::::1;;::::0;;;:9:::1;:15;::::0;;;;;:30:::1;::::0;42322:9;42302:19:::1;:30::i;:::-;-1:-1:-1::0;;;;;42284:15:0;;::::1;;::::0;;;:9:::1;:15;::::0;;;;;:48;;;;42363:13;;::::1;::::0;;;;:26:::1;::::0;42381:7;42363:17:::1;:26::i;:::-;-1:-1:-1::0;;;;;42347:13:0;::::1;;::::0;;;:9:::1;:13;::::0;;;;:42;42054:347:::1;42431:2;-1:-1:-1::0;;;;;42416:25:0::1;42425:4;-1:-1:-1::0;;;;;42416:25:0::1;;42435:5;42416:25;;;;;;;;;;;;;;;;;;-1:-1:-1::0;42459:4:0::1;::::0;41208:1263;-1:-1:-1;;;;;;;;41208:1263:0:o;47122:144::-;47174:7;47201:57;47228:29;;47201:22;;:26;;:57;;;;:::i;48443:271::-;48576:8;:15;48497:7;;;;;;48542:141;48598:1;48594;:5;48542:141;;;48630:41;48641:8;48650:1;48641:11;;;;;;;;;;;;;;;;;;:18;:29;;;-1:-1:-1;;;48641:29:0;;;;-1:-1:-1;;;;;48641:18:0;;;;:27;;:29;;;;;;;;;;:18;:29;;;;;;;;;;48630:41;48621:50;-1:-1:-1;48601:3:0;;;;;48542:141;;37182:882;37264:10;37246:15;37294:19;;;:10;:19;;;;;;;;37293:20;37285:85;;;;-1:-1:-1;;;37285:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37413:17;37422:7;37413:8;:17::i;:::-;;37481:23;37507:36;37518:24;;37507:6;:10;;:36;;;;:::i;:::-;37481:62;;37554:28;37585:41;37596:29;;37585:6;:10;;:41;;;;:::i;:::-;-1:-1:-1;;;;;37707:18:0;;;;;;:9;:18;;;;;;37554:72;;-1:-1:-1;37707:39:0;;37730:15;37707:22;:39::i;:::-;-1:-1:-1;;;;;37686:18:0;;;;;;:9;:18;;;;;;;;:60;;;;37776:7;:16;;;;:42;;37797:20;37776;:42::i;:::-;-1:-1:-1;;;;;37757:16:0;;;;;;:7;:16;;;;;:61;37879:17;;:38;;37901:15;37879:21;:38::i;:::-;37859:17;:58;37953:22;;:48;;37980:20;37953:26;:48::i;:::-;37928:22;:73;38019:37;;;;;;;;-1:-1:-1;;;;;38019:37:0;;;;;;;;;;;;;37182:882;;;;:::o;38072:886::-;38157:10;38139:15;38187:19;;;:10;:19;;;;;;;;38186:20;38178:85;;;;-1:-1:-1;;;38178:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38306:17;38315:7;38306:8;:17::i;:::-;;38374:23;38400:36;38411:24;;38400:6;:10;;:36;;;;:::i;:::-;38374:62;;38447:28;38478:41;38489:29;;38478:6;:10;;:41;;;;:::i;:::-;-1:-1:-1;;;;;38600:18:0;;;;;;:9;:18;;;;;;38447:72;;-1:-1:-1;38600:39:0;;38623:15;38600:22;:39::i;:::-;-1:-1:-1;;;;;38579:18:0;;;;;;:9;:18;;;;;;;;:60;;;;38669:7;:16;;;;:42;;38690:20;38669;:42::i;:::-;-1:-1:-1;;;;;38650:16:0;;;;;;:7;:16;;;;;:61;38772:17;;:38;;38794:15;38772:21;:38::i;:::-;38752:17;:58;38846:22;;:48;;38873:20;38846:26;:48::i;:::-;38821:22;:73;38912:38;;;;;;;;-1:-1:-1;;;;;38912:38:0;;;;;;;;;;;;;38072:886;;;;:::o;47872:102::-;28724:7;47872:102;:::o;49582:105::-;49655:24;;49582:105;:::o;46614:143::-;-1:-1:-1;;;;;46722:18:0;;;46695:7;46722:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;46614:143::o;47455:133::-;47503:7;47530:50;28724:7;47530:31;47550:10;;47530:15;:19;;:31;;;;:::i;10939:244::-;10216:12;:10;:12::i;:::-;10206:6;;-1:-1:-1;;;;;10206:6:0;;;:22;;;10198:67;;;;;-1:-1:-1;;;10198:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;11028:22:0;::::1;11020:73;;;;-1:-1:-1::0;;;11020:73:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11130:6;::::0;;11109:38:::1;::::0;-1:-1:-1;;;;;11109:38:0;;::::1;::::0;11130:6;::::1;::::0;11109:38:::1;::::0;::::1;11158:6;:17:::0;;-1:-1:-1;;;;;;11158:17:0::1;-1:-1:-1::0;;;;;11158:17:0;;;::::1;::::0;;;::::1;::::0;;10939:244::o;3213:132::-;3271:7;3298:39;3302:1;3305;3298:39;;;;;;;;;;;;;;;;;:3;:39::i;912:181::-;970:7;1002:5;;;1026:6;;;;1018:46;;;;;-1:-1:-1;;;1018:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;2266:471;2324:7;2569:6;2565:47;;-1:-1:-1;2599:1:0;2592:8;;2565:47;2636:5;;;2640:1;2636;:5;:1;2660:5;;;;;:10;2652:56;;;;-1:-1:-1;;;2652:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1376:136;1434:7;1461:43;1465:1;1468;1461:43;;;;;;;;;;;;;;;;;:3;:43::i;8630:106::-;8718:10;8630:106;:::o;49864:264::-;-1:-1:-1;;;;;49950:17:0;;;;;;:9;:17;;;;;;:29;;49972:6;49950:21;:29::i;:::-;-1:-1:-1;;;;;49930:17:0;;;;;;:9;:17;;;;;:49;50005:12;;:24;;50022:6;50005:16;:24::i;:::-;49990:12;:39;50045:36;;;;;;;;50070:1;;-1:-1:-1;;;;;50045:36:0;;;;;;;;;;;;49864:264;;:::o;3841:278::-;3927:7;3962:12;3955:5;3947:28;;;;-1:-1:-1;;;3947:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3986:9;4002:1;3998;:5;;;;;;;3841:278;-1:-1:-1;;;;;3841:278:0:o;1815:192::-;1901:7;1937:12;1929:6;;;;1921:29;;;;-1:-1:-1;;;1921:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1973:5:0;;;1815:192::o;-1:-1:-1:-;;;;;;;;:::o

Swarm Source

ipfs://08f730cfc637e2e90d89159c35308a8c6460e616246cd5189bdac1cf89877e71
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.