ETH Price: $3,486.19 (+0.96%)

Token

Buytex (BUX)
 

Overview

Max Total Supply

999,999,999.9999 BUX

Holders

516 (0.00%)

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 4 Decimals)

Balance
121,606,629.6447 BUX

Value
$0.00
0xb3dd70991af983cf82d95c46c24979ee98348ffa
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

A cryptocurrency exchange platform with its own token BUX.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
SmartzToken

Compiler Version
v0.4.25+commit.59dbf8f1

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2020-04-07
*/

pragma solidity ^0.4.18;

interface IApprovalRecipient {
    /**
     * @notice Signals that token holder approved spending of tokens and some action should be taken.
     *
     * @param _sender token holder which approved spending of his tokens
     * @param _value amount of tokens approved to be spent
     * @param _extraData any extra data token holder provided to the call
     *
     * @dev warning: implementors should validate sender of this message (it should be the token) and make no further
     *      assumptions unless validated them via ERC20 methods.
     */
    function receiveApproval(address _sender, uint256 _value, bytes _extraData) public;
}

interface IKYCProvider {
    function isKYCPassed(address _address) public view returns (bool);
}

library SafeMath {
  function mul(uint256 a, uint256 b) internal pure returns (uint256) {
    if (a == 0) {
      return 0;
    }
    uint256 c = a * b;
    assert(c / a == b);
    return c;
  }

  function div(uint256 a, uint256 b) internal pure returns (uint256) {
    // assert(b > 0); // Solidity automatically throws when dividing by 0
    uint256 c = a / b;
    // assert(a == b * c + a % b); // There is no case in which this doesn't hold
    return c;
  }

  function sub(uint256 a, uint256 b) internal pure returns (uint256) {
    assert(b <= a);
    return a - b;
  }

  function add(uint256 a, uint256 b) internal pure returns (uint256) {
    uint256 c = a + b;
    assert(c >= a);
    return c;
  }
}

contract ArgumentsChecker {

    /// @dev check which prevents short address attack
    modifier payloadSizeIs(uint size) {
       require(msg.data.length == size + 4 /* function selector */);
       _;
    }

    /// @dev check that address is valid
    modifier validAddress(address addr) {
        require(addr != address(0));
        _;
    }
}

contract multiowned {

	// TYPES

    // struct for the status of a pending operation.
    struct MultiOwnedOperationPendingState {
        // count of confirmations needed
        uint yetNeeded;

        // bitmap of confirmations where owner #ownerIndex's decision corresponds to 2**ownerIndex bit
        uint ownersDone;

        // position of this operation key in m_multiOwnedPendingIndex
        uint index;
    }

	// EVENTS

    event Confirmation(address owner, bytes32 operation);
    event Revoke(address owner, bytes32 operation);
    event FinalConfirmation(address owner, bytes32 operation);

    // some others are in the case of an owner changing.
    event OwnerChanged(address oldOwner, address newOwner);
    event OwnerAdded(address newOwner);
    event OwnerRemoved(address oldOwner);

    // the last one is emitted if the required signatures change
    event RequirementChanged(uint newRequirement);

	// MODIFIERS

    // simple single-sig function modifier.
    modifier onlyowner {
        require(isOwner(msg.sender));
        _;
    }
    // multi-sig function modifier: the operation must have an intrinsic hash in order
    // that later attempts can be realised as the same underlying operation and
    // thus count as confirmations.
    modifier onlymanyowners(bytes32 _operation) {
        if (confirmAndCheck(_operation)) {
            _;
        }
        // Even if required number of confirmations has't been collected yet,
        // we can't throw here - because changes to the state have to be preserved.
        // But, confirmAndCheck itself will throw in case sender is not an owner.
    }

    modifier validNumOwners(uint _numOwners) {
        require(_numOwners > 0 && _numOwners <= c_maxOwners);
        _;
    }

    modifier multiOwnedValidRequirement(uint _required, uint _numOwners) {
        require(_required > 0 && _required <= _numOwners);
        _;
    }

    modifier ownerExists(address _address) {
        require(isOwner(_address));
        _;
    }

    modifier ownerDoesNotExist(address _address) {
        require(!isOwner(_address));
        _;
    }

    modifier multiOwnedOperationIsActive(bytes32 _operation) {
        require(isOperationActive(_operation));
        _;
    }

	// METHODS

    // constructor is given number of sigs required to do protected "onlymanyowners" transactions
    // as well as the selection of addresses capable of confirming them (msg.sender is not added to the owners!).
    function multiowned(address[] _owners, uint _required)
        public
        validNumOwners(_owners.length)
        multiOwnedValidRequirement(_required, _owners.length)
    {
        assert(c_maxOwners <= 255);

        m_numOwners = _owners.length;
        m_multiOwnedRequired = _required;

        for (uint i = 0; i < _owners.length; ++i)
        {
            address owner = _owners[i];
            // invalid and duplicate addresses are not allowed
            require(0 != owner && !isOwner(owner) /* not isOwner yet! */);

            uint currentOwnerIndex = checkOwnerIndex(i + 1 /* first slot is unused */);
            m_owners[currentOwnerIndex] = owner;
            m_ownerIndex[owner] = currentOwnerIndex;
        }

        assertOwnersAreConsistent();
    }

    /// @notice replaces an owner `_from` with another `_to`.
    /// @param _from address of owner to replace
    /// @param _to address of new owner
    // All pending operations will be canceled!
    function changeOwner(address _from, address _to)
        external
        ownerExists(_from)
        ownerDoesNotExist(_to)
        onlymanyowners(keccak256(msg.data))
    {
        assertOwnersAreConsistent();

        clearPending();
        uint ownerIndex = checkOwnerIndex(m_ownerIndex[_from]);
        m_owners[ownerIndex] = _to;
        m_ownerIndex[_from] = 0;
        m_ownerIndex[_to] = ownerIndex;

        assertOwnersAreConsistent();
        OwnerChanged(_from, _to);
    }

    /// @notice adds an owner
    /// @param _owner address of new owner
    // All pending operations will be canceled!
    function addOwner(address _owner)
        external
        ownerDoesNotExist(_owner)
        validNumOwners(m_numOwners + 1)
        onlymanyowners(keccak256(msg.data))
    {
        assertOwnersAreConsistent();

        clearPending();
        m_numOwners++;
        m_owners[m_numOwners] = _owner;
        m_ownerIndex[_owner] = checkOwnerIndex(m_numOwners);

        assertOwnersAreConsistent();
        OwnerAdded(_owner);
    }

    /// @notice removes an owner
    /// @param _owner address of owner to remove
    // All pending operations will be canceled!
    function removeOwner(address _owner)
        external
        ownerExists(_owner)
        validNumOwners(m_numOwners - 1)
        multiOwnedValidRequirement(m_multiOwnedRequired, m_numOwners - 1)
        onlymanyowners(keccak256(msg.data))
    {
        assertOwnersAreConsistent();

        clearPending();
        uint ownerIndex = checkOwnerIndex(m_ownerIndex[_owner]);
        m_owners[ownerIndex] = 0;
        m_ownerIndex[_owner] = 0;
        //make sure m_numOwners is equal to the number of owners and always points to the last owner
        reorganizeOwners();

        assertOwnersAreConsistent();
        OwnerRemoved(_owner);
    }

    /// @notice changes the required number of owner signatures
    /// @param _newRequired new number of signatures required
    // All pending operations will be canceled!
    function changeRequirement(uint _newRequired)
        external
        multiOwnedValidRequirement(_newRequired, m_numOwners)
        onlymanyowners(keccak256(msg.data))
    {
        m_multiOwnedRequired = _newRequired;
        clearPending();
        RequirementChanged(_newRequired);
    }

    /// @notice Gets an owner by 0-indexed position
    /// @param ownerIndex 0-indexed owner position
    function getOwner(uint ownerIndex) public constant returns (address) {
        return m_owners[ownerIndex + 1];
    }

    /// @notice Gets owners
    /// @return memory array of owners
    function getOwners() public constant returns (address[]) {
        address[] memory result = new address[](m_numOwners);
        for (uint i = 0; i < m_numOwners; i++)
            result[i] = getOwner(i);

        return result;
    }

    /// @notice checks if provided address is an owner address
    /// @param _addr address to check
    /// @return true if it's an owner
    function isOwner(address _addr) public constant returns (bool) {
        return m_ownerIndex[_addr] > 0;
    }

    /// @notice Tests ownership of the current caller.
    /// @return true if it's an owner
    // It's advisable to call it by new owner to make sure that the same erroneous address is not copy-pasted to
    // addOwner/changeOwner and to isOwner.
    function amIOwner() external constant onlyowner returns (bool) {
        return true;
    }

    /// @notice Revokes a prior confirmation of the given operation
    /// @param _operation operation value, typically keccak256(msg.data)
    function revoke(bytes32 _operation)
        external
        multiOwnedOperationIsActive(_operation)
        onlyowner
    {
        uint ownerIndexBit = makeOwnerBitmapBit(msg.sender);
        var pending = m_multiOwnedPending[_operation];
        require(pending.ownersDone & ownerIndexBit > 0);

        assertOperationIsConsistent(_operation);

        pending.yetNeeded++;
        pending.ownersDone -= ownerIndexBit;

        assertOperationIsConsistent(_operation);
        Revoke(msg.sender, _operation);
    }

    /// @notice Checks if owner confirmed given operation
    /// @param _operation operation value, typically keccak256(msg.data)
    /// @param _owner an owner address
    function hasConfirmed(bytes32 _operation, address _owner)
        external
        constant
        multiOwnedOperationIsActive(_operation)
        ownerExists(_owner)
        returns (bool)
    {
        return !(m_multiOwnedPending[_operation].ownersDone & makeOwnerBitmapBit(_owner) == 0);
    }

    // INTERNAL METHODS

    function confirmAndCheck(bytes32 _operation)
        private
        onlyowner
        returns (bool)
    {
        if (512 == m_multiOwnedPendingIndex.length)
            // In case m_multiOwnedPendingIndex grows too much we have to shrink it: otherwise at some point
            // we won't be able to do it because of block gas limit.
            // Yes, pending confirmations will be lost. Dont see any security or stability implications.
            // TODO use more graceful approach like compact or removal of clearPending completely
            clearPending();

        var pending = m_multiOwnedPending[_operation];

        // if we're not yet working on this operation, switch over and reset the confirmation status.
        if (! isOperationActive(_operation)) {
            // reset count of confirmations needed.
            pending.yetNeeded = m_multiOwnedRequired;
            // reset which owners have confirmed (none) - set our bitmap to 0.
            pending.ownersDone = 0;
            pending.index = m_multiOwnedPendingIndex.length++;
            m_multiOwnedPendingIndex[pending.index] = _operation;
            assertOperationIsConsistent(_operation);
        }

        // determine the bit to set for this owner.
        uint ownerIndexBit = makeOwnerBitmapBit(msg.sender);
        // make sure we (the message sender) haven't confirmed this operation previously.
        if (pending.ownersDone & ownerIndexBit == 0) {
            // ok - check if count is enough to go ahead.
            assert(pending.yetNeeded > 0);
            if (pending.yetNeeded == 1) {
                // enough confirmations: reset and run interior.
                delete m_multiOwnedPendingIndex[m_multiOwnedPending[_operation].index];
                delete m_multiOwnedPending[_operation];
                FinalConfirmation(msg.sender, _operation);
                return true;
            }
            else
            {
                // not enough: record that this owner in particular confirmed.
                pending.yetNeeded--;
                pending.ownersDone |= ownerIndexBit;
                assertOperationIsConsistent(_operation);
                Confirmation(msg.sender, _operation);
            }
        }
    }

    // Reclaims free slots between valid owners in m_owners.
    // TODO given that its called after each removal, it could be simplified.
    function reorganizeOwners() private {
        uint free = 1;
        while (free < m_numOwners)
        {
            // iterating to the first free slot from the beginning
            while (free < m_numOwners && m_owners[free] != 0) free++;

            // iterating to the first occupied slot from the end
            while (m_numOwners > 1 && m_owners[m_numOwners] == 0) m_numOwners--;

            // swap, if possible, so free slot is located at the end after the swap
            if (free < m_numOwners && m_owners[m_numOwners] != 0 && m_owners[free] == 0)
            {
                // owners between swapped slots should't be renumbered - that saves a lot of gas
                m_owners[free] = m_owners[m_numOwners];
                m_ownerIndex[m_owners[free]] = free;
                m_owners[m_numOwners] = 0;
            }
        }
    }

    function clearPending() private onlyowner {
        uint length = m_multiOwnedPendingIndex.length;
        // TODO block gas limit
        for (uint i = 0; i < length; ++i) {
            if (m_multiOwnedPendingIndex[i] != 0)
                delete m_multiOwnedPending[m_multiOwnedPendingIndex[i]];
        }
        delete m_multiOwnedPendingIndex;
    }

    function checkOwnerIndex(uint ownerIndex) private pure returns (uint) {
        assert(0 != ownerIndex && ownerIndex <= c_maxOwners);
        return ownerIndex;
    }

    function makeOwnerBitmapBit(address owner) private constant returns (uint) {
        uint ownerIndex = checkOwnerIndex(m_ownerIndex[owner]);
        return 2 ** ownerIndex;
    }

    function isOperationActive(bytes32 _operation) private constant returns (bool) {
        return 0 != m_multiOwnedPending[_operation].yetNeeded;
    }


    function assertOwnersAreConsistent() private constant {
        assert(m_numOwners > 0);
        assert(m_numOwners <= c_maxOwners);
        assert(m_owners[0] == 0);
        assert(0 != m_multiOwnedRequired && m_multiOwnedRequired <= m_numOwners);
    }

    function assertOperationIsConsistent(bytes32 _operation) private constant {
        var pending = m_multiOwnedPending[_operation];
        assert(0 != pending.yetNeeded);
        assert(m_multiOwnedPendingIndex[pending.index] == _operation);
        assert(pending.yetNeeded <= m_multiOwnedRequired);
    }


   	// FIELDS

    uint constant c_maxOwners = 250;

    // the number of owners that must confirm the same operation before it is run.
    uint public m_multiOwnedRequired;


    // pointer used to find a free slot in m_owners
    uint public m_numOwners;

    // list of owners (addresses),
    // slot 0 is unused so there are no owner which index is 0.
    // TODO could we save space at the end of the array for the common case of <10 owners? and should we?
    address[256] internal m_owners;

    // index on the list of owners to allow reverse lookup: owner address => index in m_owners
    mapping(address => uint) internal m_ownerIndex;


    // the ongoing operations.
    mapping(bytes32 => MultiOwnedOperationPendingState) internal m_multiOwnedPending;
    bytes32[] internal m_multiOwnedPendingIndex;
}

contract ERC20Basic {
  uint256 public totalSupply;
  function balanceOf(address who) public view returns (uint256);
  function transfer(address to, uint256 value) public returns (bool);
  event Transfer(address indexed from, address indexed to, uint256 value);
}

contract ERC20 is ERC20Basic {
  function allowance(address owner, address spender) public view returns (uint256);
  function transferFrom(address from, address to, uint256 value) public returns (bool);
  function approve(address spender, uint256 value) public returns (bool);
  event Approval(address indexed owner, address indexed spender, uint256 value);
}

contract BasicToken is ERC20Basic {
  using SafeMath for uint256;

  mapping(address => uint256) balances;

  /**
  * @dev transfer token for a specified address
  * @param _to The address to transfer to.
  * @param _value The amount to be transferred.
  */
  function transfer(address _to, uint256 _value) public returns (bool) {
    require(_to != address(0));
    require(_value <= balances[msg.sender]);

    // SafeMath.sub will throw if there is not enough balance.
    balances[msg.sender] = balances[msg.sender].sub(_value);
    balances[_to] = balances[_to].add(_value);
    Transfer(msg.sender, _to, _value);
    return true;
  }

  /**
  * @dev Gets the balance of the specified address.
  * @param _owner The address to query the the balance of.
  * @return An uint256 representing the amount owned by the passed address.
  */
  function balanceOf(address _owner) public view returns (uint256 balance) {
    return balances[_owner];
  }

}

contract BurnableToken is BasicToken {

    event Burn(address indexed from, uint256 amount);

    /**
     * Function to burn msg.sender's tokens.
     *
     * @param _amount amount of tokens to burn
     *
     * @return boolean that indicates if the operation was successful
     */
    function burn(uint256 _amount)
        public
        returns (bool)
    {
        address from = msg.sender;

        require(_amount > 0);
        require(_amount <= balances[from]);

        totalSupply = totalSupply.sub(_amount);
        balances[from] = balances[from].sub(_amount);
        Burn(from, _amount);
        Transfer(from, address(0), _amount);

        return true;
    }
}

contract StandardToken is ERC20, BasicToken {

  mapping (address => mapping (address => uint256)) internal allowed;


  /**
   * @dev Transfer tokens from one address to another
   * @param _from address The address which you want to send tokens from
   * @param _to address The address which you want to transfer to
   * @param _value uint256 the amount of tokens to be transferred
   */
  function transferFrom(address _from, address _to, uint256 _value) public returns (bool) {
    require(_to != address(0));
    require(_value <= balances[_from]);
    require(_value <= allowed[_from][msg.sender]);

    balances[_from] = balances[_from].sub(_value);
    balances[_to] = balances[_to].add(_value);
    allowed[_from][msg.sender] = allowed[_from][msg.sender].sub(_value);
    Transfer(_from, _to, _value);
    return true;
  }

  /**
   * @dev Approve the passed address to spend the specified amount of tokens on behalf of msg.sender.
   *
   * 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
   * @param _spender The address which will spend the funds.
   * @param _value The amount of tokens to be spent.
   */
  function approve(address _spender, uint256 _value) public returns (bool) {
    allowed[msg.sender][_spender] = _value;
    Approval(msg.sender, _spender, _value);
    return true;
  }

  /**
   * @dev Function to check the amount of tokens that an owner allowed to a spender.
   * @param _owner address The address which owns the funds.
   * @param _spender address The address which will spend the funds.
   * @return A uint256 specifying the amount of tokens still available for the spender.
   */
  function allowance(address _owner, address _spender) public view returns (uint256) {
    return allowed[_owner][_spender];
  }

  /**
   * approve should be called when allowed[_spender] == 0. To increment
   * allowed value is better to use this function to avoid 2 calls (and wait until
   * the first transaction is mined)
   * From MonolithDAO Token.sol
   */
  function increaseApproval(address _spender, uint _addedValue) public returns (bool) {
    allowed[msg.sender][_spender] = allowed[msg.sender][_spender].add(_addedValue);
    Approval(msg.sender, _spender, allowed[msg.sender][_spender]);
    return true;
  }

  function decreaseApproval(address _spender, uint _subtractedValue) public returns (bool) {
    uint oldValue = allowed[msg.sender][_spender];
    if (_subtractedValue > oldValue) {
      allowed[msg.sender][_spender] = 0;
    } else {
      allowed[msg.sender][_spender] = oldValue.sub(_subtractedValue);
    }
    Approval(msg.sender, _spender, allowed[msg.sender][_spender]);
    return true;
  }

}

contract TokenWithApproveAndCallMethod is StandardToken {

    /**
     * @notice Approves spending tokens and immediately triggers token recipient logic.
     *
     * @param _spender contract which supports IApprovalRecipient and allowed to receive tokens
     * @param _value amount of tokens approved to be spent
     * @param _extraData any extra data which to be provided to the _spender
     *
     * By invoking this utility function token holder could do two things in one transaction: approve spending his
     * tokens and execute some external contract which spends them on token holder's behalf.
     * It can't be known if _spender's invocation succeed or not.
     * This function will throw if approval failed.
     */
    function approveAndCall(address _spender, uint256 _value, bytes _extraData) public {
        require(approve(_spender, _value));
        IApprovalRecipient(_spender).receiveApproval(msg.sender, _value, _extraData);
    }
}

contract SmartzToken is ArgumentsChecker, multiowned, BurnableToken, StandardToken {

    /// @title Unit of frozen tokens - tokens which can't be spent until certain conditions is met.
    struct FrozenCell {
        /// @notice amount of frozen tokens
        uint amount;

        /// @notice until this unix time the cell is considered frozen
        uint128 thawTS;

        /// @notice is KYC required for a token holder to spend this cell?
        uint128 isKYCRequired;
    }


    // MODIFIERS

    modifier onlySale(address account) {
        require(isSale(account));
        _;
    }

    modifier validUnixTS(uint ts) {
        require(ts >= 1522046326 && ts <= 1800000000);
        _;
    }

    modifier checkTransferInvariant(address from, address to) {
        uint initial = balanceOf(from).add(balanceOf(to));
        _;
        assert(balanceOf(from).add(balanceOf(to)) == initial);
    }

    modifier privilegedAllowed {
        require(m_allowPrivileged);
        _;
    }


    // PUBLIC FUNCTIONS

    /**
     * @notice Constructs token.
     *
     * Initial owners have power over the token contract only during bootstrap phase (early investments and token
     * sales). To be precise, the owners can set KYC provider and sales (which can freeze transfered tokens) during
     * bootstrap phase. After final token sale any control over the token removed by issuing disablePrivileged call.
     */
    function SmartzToken()
        public
        payable
        multiowned(getInitialOwners(), 1)
    {
        if (0 != 9999999999999) {
            totalSupply = 9999999999999;
            balances[msg.sender] = totalSupply;
            Transfer(address(0), msg.sender, totalSupply);
        }

        
totalSupply = totalSupply.add(0);

        
        address(0xfF20387Dd4dbfA3e72AbC7Ee9B03393A941EE36E).transfer(60000000000000000 wei);
        address(0xfF20387Dd4dbfA3e72AbC7Ee9B03393A941EE36E).transfer(240000000000000000 wei);
            
    }

    function getInitialOwners() private pure returns (address[]) {
        address[] memory result = new address[](1);
result[0] = address(0xa1381D5a5d97abf6f8418fA41FAE44b2CA0Be77C);
        return result;
    }

    /**
     * @notice Version of balanceOf() which includes all frozen tokens.
     *
     * @param _owner the address to query the balance of
     *
     * @return an uint256 representing the amount owned by the passed address
     */
    function balanceOf(address _owner) public view returns (uint256) {
        uint256 balance = balances[_owner];

        for (uint cellIndex = 0; cellIndex < frozenBalances[_owner].length; ++cellIndex) {
            balance = balance.add(frozenBalances[_owner][cellIndex].amount);
        }

        return balance;
    }

    /**
     * @notice Version of balanceOf() which includes only currently spendable tokens.
     *
     * @param _owner the address to query the balance of
     *
     * @return an uint256 representing the amount spendable by the passed address
     */
    function availableBalanceOf(address _owner) public view returns (uint256) {
        uint256 balance = balances[_owner];

        for (uint cellIndex = 0; cellIndex < frozenBalances[_owner].length; ++cellIndex) {
            if (isSpendableFrozenCell(_owner, cellIndex))
                balance = balance.add(frozenBalances[_owner][cellIndex].amount);
        }

        return balance;
    }

    /**
     * @notice Standard transfer() overridden to have a chance to thaw sender's tokens.
     *
     * @param _to the address to transfer to
     * @param _value the amount to be transferred
     *
     * @return true iff operation was successfully completed
     */
    function transfer(address _to, uint256 _value)
        public
        payloadSizeIs(2 * 32)
        returns (bool)
    {
        thawSomeTokens(msg.sender, _value);
        return super.transfer(_to, _value);
    }

    /**
     * @notice Standard transferFrom overridden to have a chance to thaw sender's tokens.
     *
     * @param _from address the address which you want to send tokens from
     * @param _to address the address which you want to transfer to
     * @param _value uint256 the amount of tokens to be transferred
     *
     * @return true iff operation was successfully completed
     */
    function transferFrom(address _from, address _to, uint256 _value)
        public
        payloadSizeIs(3 * 32)
        returns (bool)
    {
        thawSomeTokens(_from, _value);
        return super.transferFrom(_from, _to, _value);
    }

    
    /**
     * Function to burn msg.sender's tokens. Overridden to have a chance to thaw sender's tokens.
     *
     * @param _amount amount of tokens to burn
     *
     * @return boolean that indicates if the operation was successful
     */
    function burn(uint256 _amount)
        public
        payloadSizeIs(1 * 32)
        returns (bool)
    {
        thawSomeTokens(msg.sender, _amount);
        return super.burn(_amount);
    }


    // INFORMATIONAL FUNCTIONS (VIEWS)

    /**
     * @notice Number of frozen cells of an account.
     *
     * @param owner account address
     *
     * @return number of frozen cells
     */
    function frozenCellCount(address owner) public view returns (uint) {
        return frozenBalances[owner].length;
    }

    /**
     * @notice Retrieves information about account frozen tokens.
     *
     * @param owner account address
     * @param index index of so-called frozen cell from 0 (inclusive) up to frozenCellCount(owner) exclusive
     *
     * @return amount amount of tokens frozen in this cell
     * @return thawTS unix timestamp at which tokens'll become available
     * @return isKYCRequired it's required to pass KYC to spend tokens iff isKYCRequired is true
     */
    function frozenCell(address owner, uint index) public view returns (uint amount, uint thawTS, bool isKYCRequired) {
        require(index < frozenCellCount(owner));

        amount = frozenBalances[owner][index].amount;
        thawTS = uint(frozenBalances[owner][index].thawTS);
        isKYCRequired = decodeKYCFlag(frozenBalances[owner][index].isKYCRequired);
    }


    // ADMINISTRATIVE FUNCTIONS

    /**
     * @notice Sets current KYC provider of the token.
     *
     * @param KYCProvider address of the IKYCProvider-compatible contract
     *
     * Function is used only during token sale phase, before disablePrivileged() is called.
     */
    function setKYCProvider(address KYCProvider)
        external
        validAddress(KYCProvider)
        privilegedAllowed
        onlymanyowners(keccak256(msg.data))
    {
        m_KYCProvider = IKYCProvider(KYCProvider);
    }

    /**
     * @notice Sets sale status of an account.
     *
     * @param account account address
     * @param isSale is this account has access to frozen* functions
     *
     * Function is used only during token sale phase, before disablePrivileged() is called.
     */
    function setSale(address account, bool isSale)
        external
        validAddress(account)
        privilegedAllowed
        onlymanyowners(keccak256(msg.data))
    {
        m_sales[account] = isSale;
    }


    /**
     * @notice Transfers tokens to a recipient and freezes it.
     *
     * @param _to account to which tokens are sent
     * @param _value amount of tokens to send
     * @param thawTS unix timestamp at which tokens'll become available
     * @param isKYCRequired it's required to pass KYC to spend tokens iff isKYCRequired is true
     *
     * Function is used only during token sale phase and available only to sale accounts.
     */
    function frozenTransfer(address _to, uint256 _value, uint thawTS, bool isKYCRequired)
        external
        validAddress(_to)
        validUnixTS(thawTS)
        payloadSizeIs(4 * 32)
        privilegedAllowed
        onlySale(msg.sender)
        checkTransferInvariant(msg.sender, _to)
        returns (bool)
    {
        require(_value <= balances[msg.sender]);

        balances[msg.sender] = balances[msg.sender].sub(_value);
        addFrozen(_to, _value, thawTS, isKYCRequired);
        Transfer(msg.sender, _to, _value);

        return true;
    }

    /**
     * @notice Transfers frozen tokens back.
     *
     * @param _from account to send tokens from
     * @param _to account to which tokens are sent
     * @param _value amount of tokens to send
     * @param thawTS unix timestamp at which tokens'll become available
     * @param isKYCRequired it's required to pass KYC to spend tokens iff isKYCRequired is true
     *
     * Function is used only during token sale phase to make a refunds and available only to sale accounts.
     * _from account has to explicitly approve spending with the approve() call.
     * thawTS and isKYCRequired parameters are required to withdraw exact "same" tokens (to not affect availability of
     * other tokens of the account).
     */
    function frozenTransferFrom(address _from, address _to, uint256 _value, uint thawTS, bool isKYCRequired)
        external
        validAddress(_to)
        validUnixTS(thawTS)
        payloadSizeIs(5 * 32)
        privilegedAllowed
        //onlySale(msg.sender) too many local variables - compiler fails
        //onlySale(_to)
        checkTransferInvariant(_from, _to)
        returns (bool)
    {
        require(isSale(msg.sender) && isSale(_to));
        require(_value <= allowed[_from][msg.sender]);

        allowed[_from][msg.sender] = allowed[_from][msg.sender].sub(_value);
        subFrozen(_from, _value, thawTS, isKYCRequired);
        balances[_to] = balances[_to].add(_value);
        Transfer(_from, _to, _value);

        return true;
    }

    /// @notice Disables further use of any privileged functions like freezing tokens.
    function disablePrivileged()
        external
        privilegedAllowed
        onlymanyowners(keccak256(msg.data))
    {
        m_allowPrivileged = false;
    }


    // INTERNAL FUNCTIONS

    function isSale(address account) private view returns (bool) {
        return m_sales[account];
    }

    /**
     * @dev Tries to find existent FrozenCell that matches (thawTS, isKYCRequired).
     *
     * @return index in frozenBalances[_owner] which equals to frozenBalances[_owner].length in case cell is not found
     *
     * Because frozen* functions are only for token sales and token sale number is limited, expecting cellIndex
     * to be ~ 1-5 and the following loop to be O(1).
     */
    function findFrozenCell(address owner, uint128 thawTSEncoded, uint128 isKYCRequiredEncoded)
        private
        view
        returns (uint cellIndex)
    {
        for (cellIndex = 0; cellIndex < frozenBalances[owner].length; ++cellIndex) {
            FrozenCell storage checkedCell = frozenBalances[owner][cellIndex];
            if (checkedCell.thawTS == thawTSEncoded && checkedCell.isKYCRequired == isKYCRequiredEncoded)
                break;
        }

        assert(cellIndex <= frozenBalances[owner].length);
    }

    /// @dev Says if the given cell could be spent now
    function isSpendableFrozenCell(address owner, uint cellIndex)
        private
        view
        returns (bool)
    {
        FrozenCell storage cell = frozenBalances[owner][cellIndex];
        if (uint(cell.thawTS) > getTime())
            return false;

        if (0 == cell.amount)   // already spent
            return false;

        if (decodeKYCFlag(cell.isKYCRequired) && !m_KYCProvider.isKYCPassed(owner))
            return false;

        return true;
    }

    /// @dev Internal function to increment or create frozen cell.
    function addFrozen(address _to, uint256 _value, uint thawTS, bool isKYCRequired)
        private
        validAddress(_to)
        validUnixTS(thawTS)
    {
        uint128 thawTSEncoded = uint128(thawTS);
        uint128 isKYCRequiredEncoded = encodeKYCFlag(isKYCRequired);

        uint cellIndex = findFrozenCell(_to, thawTSEncoded, isKYCRequiredEncoded);

        // In case cell is not found - creating new.
        if (cellIndex == frozenBalances[_to].length) {
            frozenBalances[_to].length++;
            targetCell = frozenBalances[_to][cellIndex];
            assert(0 == targetCell.amount);

            targetCell.thawTS = thawTSEncoded;
            targetCell.isKYCRequired = isKYCRequiredEncoded;
        }

        FrozenCell storage targetCell = frozenBalances[_to][cellIndex];
        assert(targetCell.thawTS == thawTSEncoded && targetCell.isKYCRequired == isKYCRequiredEncoded);

        targetCell.amount = targetCell.amount.add(_value);
    }

    /// @dev Internal function to decrement frozen cell.
    function subFrozen(address _from, uint256 _value, uint thawTS, bool isKYCRequired)
        private
        validUnixTS(thawTS)
    {
        uint cellIndex = findFrozenCell(_from, uint128(thawTS), encodeKYCFlag(isKYCRequired));
        require(cellIndex != frozenBalances[_from].length);   // has to be found

        FrozenCell storage cell = frozenBalances[_from][cellIndex];
        require(cell.amount >= _value);

        cell.amount = cell.amount.sub(_value);
    }

    /// @dev Thaws tokens of owner until enough tokens could be spent or no more such tokens found.
    function thawSomeTokens(address owner, uint requiredAmount)
        private
    {
        if (balances[owner] >= requiredAmount)
            return;     // fast path

        // Checking that our goal is reachable before issuing expensive storage modifications.
        require(availableBalanceOf(owner) >= requiredAmount);

        for (uint cellIndex = 0; cellIndex < frozenBalances[owner].length; ++cellIndex) {
            if (isSpendableFrozenCell(owner, cellIndex)) {
                uint amount = frozenBalances[owner][cellIndex].amount;
                frozenBalances[owner][cellIndex].amount = 0;
                balances[owner] = balances[owner].add(amount);
            }
        }

        assert(balances[owner] >= requiredAmount);
    }

    /// @dev to be overridden in tests
    function getTime() internal view returns (uint) {
        return now;
    }

    function encodeKYCFlag(bool isKYCRequired) private pure returns (uint128) {
        return isKYCRequired ? uint128(1) : uint128(0);
    }

    function decodeKYCFlag(uint128 isKYCRequired) private pure returns (bool) {
        return isKYCRequired != uint128(0);
    }


    // FIELDS

    /// @notice current KYC provider of the token
    IKYCProvider public m_KYCProvider;

    /// @notice set of sale accounts which can freeze tokens
    mapping (address => bool) public m_sales;

    /// @notice frozen tokens
    mapping (address => FrozenCell[]) public frozenBalances;

    /// @notice allows privileged functions (token sale phase)
    bool public m_allowPrivileged = true;


    // CONSTANTS

    string public constant name = 'Buytex';
    string public constant symbol = 'BUX';
    uint8 public constant decimals = 4;
}

Contract Security Audit

Contract ABI

[{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_value","type":"uint256"}],"name":"approve","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"account","type":"address"},{"name":"isSale","type":"bool"}],"name":"setSale","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_owner","type":"address"}],"name":"removeOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"m_allowPrivileged","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"availableBalanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_addr","type":"address"}],"name":"isOwner","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"m_numOwners","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_amount","type":"uint256"}],"name":"burn","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"amIOwner","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"},{"name":"thawTS","type":"uint256"},{"name":"isKYCRequired","type":"bool"}],"name":"frozenTransfer","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_subtractedValue","type":"uint256"}],"name":"decreaseApproval","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_owner","type":"address"}],"name":"addOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"owner","type":"address"}],"name":"frozenCellCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"m_multiOwnedRequired","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"},{"name":"","type":"uint256"}],"name":"frozenBalances","outputs":[{"name":"amount","type":"uint256"},{"name":"thawTS","type":"uint128"},{"name":"isKYCRequired","type":"uint128"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getOwners","outputs":[{"name":"","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"m_sales","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_operation","type":"bytes32"}],"name":"revoke","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newRequired","type":"uint256"}],"name":"changeRequirement","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"KYCProvider","type":"address"}],"name":"setKYCProvider","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_operation","type":"bytes32"},{"name":"_owner","type":"address"}],"name":"hasConfirmed","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"ownerIndex","type":"uint256"}],"name":"getOwner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_addedValue","type":"uint256"}],"name":"increaseApproval","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_spender","type":"address"}],"name":"allowance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"m_KYCProvider","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_value","type":"uint256"},{"name":"thawTS","type":"uint256"},{"name":"isKYCRequired","type":"bool"}],"name":"frozenTransferFrom","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"}],"name":"changeOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"owner","type":"address"},{"name":"index","type":"uint256"}],"name":"frozenCell","outputs":[{"name":"amount","type":"uint256"},{"name":"thawTS","type":"uint256"},{"name":"isKYCRequired","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"disablePrivileged","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[],"payable":true,"stateMutability":"payable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"spender","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"owner","type":"address"},{"indexed":false,"name":"operation","type":"bytes32"}],"name":"Confirmation","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"owner","type":"address"},{"indexed":false,"name":"operation","type":"bytes32"}],"name":"Revoke","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"owner","type":"address"},{"indexed":false,"name":"operation","type":"bytes32"}],"name":"FinalConfirmation","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"oldOwner","type":"address"},{"indexed":false,"name":"newOwner","type":"address"}],"name":"OwnerChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"newOwner","type":"address"}],"name":"OwnerAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"oldOwner","type":"address"}],"name":"OwnerRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"newRequirement","type":"uint256"}],"name":"RequirementChanged","type":"event"}]

608060405261010b805460ff191660011790556200002564010000000062000261810204565b60016000806000845160008111801562000040575060fa8111155b15156200004c57600080fd5b848651600082118015620000605750808211155b15156200006c57600080fd5b8751600155600087815595505b87518610156200013b5787868151811015156200009257fe5b90602001906020020151945084600160a060020a0316600014158015620000ca5750620000c885640100000000620002c7810204565b155b1515620000d657600080fd5b620000ed60018701640100000000620002e4810204565b9350846002856101008110620000ff57fe5b018054600160a060020a031916600160a060020a0392831617905585166000908152610102602052604090208490556001959095019462000079565b6200014e64010000000062000304810204565b50505050505050506509184e729fff61010581905533600081815261010660209081526040808320859055805194855251929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a361010554620001cc906000640100000000620020966200035482021704565b6101055560405173ff20387dd4dbfa3e72abc7ee9b03393a941ee36e9060009066d529ae9e8600009082818181858883f1935050505015801562000214573d6000803e3d6000fd5b5060405173ff20387dd4dbfa3e72abc7ee9b03393a941ee36e90600090670354a6ba7a1800009082818181858883f193505050501580156200025a573d6000803e3d6000fd5b506200036b565b6040805160018082528183019092526060918291906020808301908038833901905050905073a1381d5a5d97abf6f8418fa41fae44b2ca0be77c816000815181101515620002ab57fe5b600160a060020a03909216602092830290910190910152905090565b600160a060020a0316600090815261010260205260408120541190565b60008115801590620002f7575060fa8211155b15156200030057fe5b5090565b6001546000106200031157fe5b60015460fa10156200031f57fe5b600254600160a060020a0316156200033357fe5b6000541580159062000349575060015460005411155b15156200035257fe5b565b6000828201838110156200036457fe5b9392505050565b6127c9806200037b6000396000f3006080604052600436106101c15763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166306fdde0381146101c6578063095ea7b3146102505780631019dc5914610288578063173825d9146102b057806318160ddd146102d15780632090b0a8146102f857806323b872dd1461030d57806325d998bb146103375780632f54bf6e14610358578063313ce567146103795780634123cb6b146103a457806342966c68146103b95780634e4ab830146103d15780635ab92022146103e657806366188463146104125780637065cb481461043657806370a08231146104575780637696f0db14610478578063787d64e41461049957806380340314146104ae57806395d89b41146104fa578063a0e67e2b1461050f578063a9059cbb14610574578063b51fdb9a14610598578063b75c7dc6146105b9578063ba51a6df146105d1578063c24366f0146105e9578063c2cf73261461060a578063c41a360a1461062e578063d73dd62314610662578063dd62ed3e14610686578063e2ba6ce8146106ad578063ef18e458146106c2578063f00d4b5d146106f4578063f27a73ca1461071b578063f450cfee1461075f575b600080fd5b3480156101d257600080fd5b506101db610774565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102155781810151838201526020016101fd565b50505050905090810190601f1680156102425780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561025c57600080fd5b50610274600160a060020a03600435166024356107ab565b604080519115158252519081900360200190f35b34801561029457600080fd5b506102ae600160a060020a03600435166024351515610812565b005b3480156102bc57600080fd5b506102ae600160a060020a0360043516610892565b3480156102dd57600080fd5b506102e66109ee565b60408051918252519081900360200190f35b34801561030457600080fd5b506102746109f5565b34801561031957600080fd5b50610274600160a060020a03600435811690602435166044356109ff565b34801561034357600080fd5b506102e6600160a060020a0360043516610a30565b34801561036457600080fd5b50610274600160a060020a0360043516610ada565b34801561038557600080fd5b5061038e610af7565b6040805160ff9092168252519081900360200190f35b3480156103b057600080fd5b506102e6610afc565b3480156103c557600080fd5b50610274600435610b02565b3480156103dd57600080fd5b50610274610b2d565b3480156103f257600080fd5b50610274600160a060020a03600435166024356044356064351515610b4a565b34801561041e57600080fd5b50610274600160a060020a0360043516602435610c9d565b34801561044257600080fd5b506102ae600160a060020a0360043516610d93565b34801561046357600080fd5b506102e6600160a060020a0360043516610ebb565b34801561048457600080fd5b506102e6600160a060020a0360043516610f2c565b3480156104a557600080fd5b506102e6610f48565b3480156104ba57600080fd5b506104d2600160a060020a0360043516602435610f4e565b604080519384526001608060020a039283166020850152911682820152519081900360600190f35b34801561050657600080fd5b506101db610fab565b34801561051b57600080fd5b50610524610fe2565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610560578181015183820152602001610548565b505050509050019250505060405180910390f35b34801561058057600080fd5b50610274600160a060020a0360043516602435611061565b3480156105a457600080fd5b50610274600160a060020a036004351661108e565b3480156105c557600080fd5b506102ae6004356110a4565b3480156105dd57600080fd5b506102ae600435611164565b3480156105f557600080fd5b506102ae600160a060020a03600435166111f5565b34801561061657600080fd5b50610274600435600160a060020a0360243516611278565b34801561063a57600080fd5b506106466004356112cd565b60408051600160a060020a039092168252519081900360200190f35b34801561066e57600080fd5b50610274600160a060020a03600435166024356112f1565b34801561069257600080fd5b506102e6600160a060020a036004358116906024351661138c565b3480156106b957600080fd5b506106466113b8565b3480156106ce57600080fd5b50610274600160a060020a036004358116906024351660443560643560843515156113c8565b34801561070057600080fd5b506102ae600160a060020a03600435811690602435166115a6565b34801561072757600080fd5b5061073f600160a060020a03600435166024356116de565b604080519384526020840192909252151582820152519081900360600190f35b34801561076b57600080fd5b506102ae6117d4565b60408051808201909152600681527f4275797465780000000000000000000000000000000000000000000000000000602082015281565b33600081815261010760209081526040808320600160a060020a038716808552908352818420869055815186815291519394909390927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928290030190a350600192915050565b81600160a060020a038116151561082857600080fd5b61010b5460ff16151561083a57600080fd5b60003660405180838380828437820191505092505050604051809103902061086181611821565b1561088c57600160a060020a038416600090815261010960205260409020805460ff19168415151790555b50505050565b60008161089e81610ada565b15156108a957600080fd5b60018054036000811180156108bf575060fa8111155b15156108ca57600080fd5b60005460018054036000821180156108e25750808211155b15156108ed57600080fd5b60003660405180838380828437820191505092505050604051809103902061091481611821565b156109e5576109216119da565b610929611a25565b600160a060020a0387166000908152610102602052604090205461094c90611ac5565b95506000600287610100811061095e57fe5b01805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a039283161790558716600090815261010260205260408120556109a0611ae3565b6109a86119da565b60408051600160a060020a038916815290517f58619076adf5bb0943d100ef88d52d7c3fd691b19d3a9071b555b651fbf418da9181900360200190a15b50505050505050565b6101055481565b61010b5460ff1681565b6000606036606414610a1057600080fd5b610a1a8584611c84565b610a25858585611dd9565b91505b509392505050565b600160a060020a03811660009081526101066020526040812054815b600160a060020a038416600090815261010a6020526040902054811015610acf57610a778482611f47565b15610ac757600160a060020a038416600090815261010a602052604090208054610ac4919083908110610aa657fe5b6000918252602090912060029091020154839063ffffffff61209616565b91505b600101610a4c565b8192505b5050919050565b600160a060020a0316600090815261010260205260408120541190565b600481565b60015481565b6000602036602414610b1357600080fd5b610b1d3384611c84565b610b26836120a5565b9392505050565b6000610b3833610ada565b1515610b4357600080fd5b5060015b90565b600084600160a060020a0381161515610b6257600080fd5b83635ab895768110158015610b7b5750636b49d2008111155b1515610b8657600080fd5b608036608414610b9557600080fd5b61010b5460ff161515610ba757600080fd5b33610bb1816121a7565b1515610bbc57600080fd5b33896000610be1610bcc83610ebb565b610bd585610ebb565b9063ffffffff61209616565b33600090815261010660205260409020549091508b1115610c0157600080fd5b3360009081526101066020526040902054610c22908c63ffffffff6121c616565b3360009081526101066020526040902055610c3f8c8c8c8c6121d8565b604080518c81529051600160a060020a038e1691339160008051602061277e8339815191529181900360200190a36001975080610c87610c7e84610ebb565b610bd586610ebb565b14610c8e57fe5b50505050505050949350505050565b33600090815261010760209081526040808320600160a060020a038616845290915281205480831115610cf45733600090815261010760209081526040808320600160a060020a0388168452909152812055610d2a565b610d04818463ffffffff6121c616565b33600090815261010760209081526040808320600160a060020a03891684529091529020555b33600081815261010760209081526040808320600160a060020a0389168085529083529281902054815190815290519293927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929181900390910190a3600191505b5092915050565b80610d9d81610ada565b15610da757600080fd5b600154600101600081118015610dbe575060fa8111155b1515610dc957600080fd5b600036604051808383808284378201915050925050506040518091039020610df081611821565b1561088c57610dfd6119da565b610e05611a25565b6001805481019081905584906002906101008110610e1f57fe5b01805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055600154610e5790611ac5565b600160a060020a03851660009081526101026020526040902055610e796119da565b60408051600160a060020a038616815290517f994a936646fe87ffe4f1e469d3d6aa417d6b855598397f323de5b449f765f0c39181900360200190a150505050565b600160a060020a03811660009081526101066020526040812054815b600160a060020a038416600090815261010a6020526040902054811015610acf57600160a060020a038416600090815261010a602052604090208054610f22919083908110610aa657fe5b9150600101610ed7565b600160a060020a0316600090815261010a602052604090205490565b60005481565b61010a60205281600052604060002081815481101515610f6a57fe5b6000918252602090912060029091020180546001909101549092506001608060020a0380821692507001000000000000000000000000000000009091041683565b60408051808201909152600381527f4255580000000000000000000000000000000000000000000000000000000000602082015281565b6060806000600154604051908082528060200260200182016040528015611013578160200160208202803883390190505b509150600090505b60015481101561105b5761102e816112cd565b828281518110151561103c57fe5b600160a060020a0390921660209283029091019091015260010161101b565b50919050565b600060403660441461107257600080fd5b61107c3384611c84565b61108684846123a6565b949350505050565b6101096020526000908152604090205460ff1681565b600080826110b18161247b565b15156110bc57600080fd5b6110c533610ada565b15156110d057600080fd5b6110d933612490565b60008581526101036020526040812060018101549295509350908416116110ff57600080fd5b611108846124bf565b815460019081018355820180548490039055611123846124bf565b604080513381526020810186905281517fc7fb647e59b18047309aa15aad418e5d7ca96d173ad704f1031a2c3d7591734b929181900390910190a150505050565b806001546000821180156111785750808211155b151561118357600080fd5b6000366040518083838082843782019150509250505060405180910390206111aa81611821565b1561088c5760008490556111bc611a25565b6040805185815290517facbdb084c721332ac59f9b8e392196c9eb0e4932862da8eb9beaf0dad4f550da9181900360200190a150505050565b80600160a060020a038116151561120b57600080fd5b61010b5460ff16151561121d57600080fd5b60003660405180838380828437820191505092505050604051809103902061124481611821565b1561127357610108805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0385161790555b505050565b6000826112848161247b565b151561128f57600080fd5b8261129981610ada565b15156112a457600080fd5b6112ad84612490565b600086815261010360205260409020600101541615159250505092915050565b600060026001830161010081106112e057fe5b0154600160a060020a031692915050565b33600090815261010760209081526040808320600160a060020a0386168452909152812054611326908363ffffffff61209616565b33600081815261010760209081526040808320600160a060020a0389168085529083529281902085905580519485525191937f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929081900390910190a350600192915050565b600160a060020a0391821660009081526101076020908152604080832093909416825291909152205490565b61010854600160a060020a031681565b600084600160a060020a03811615156113e057600080fd5b83635ab8957681101580156113f95750636b49d2008111155b151561140457600080fd5b60a03660a41461141357600080fd5b61010b5460ff16151561142557600080fd5b88886000611435610bcc83610ebb565b9050611440336121a7565b801561145057506114508b6121a7565b151561145b57600080fd5b600160a060020a038c166000908152610107602090815260408083203384529091529020548a111561148c57600080fd5b600160a060020a038c166000908152610107602090815260408083203384529091529020546114c1908b63ffffffff6121c616565b600160a060020a038d166000908152610107602090815260408083203384529091529020556114f28c8b8b8b61250d565b600160a060020a038b166000908152610106602052604090205461151c908b63ffffffff61209616565b61010660008d600160a060020a0316600160a060020a03168152602001908152602001600020819055508a600160a060020a03168c600160a060020a031660008051602061277e8339815191528c6040518082815260200191505060405180910390a36001965080611590610c7e84610ebb565b1461159757fe5b50505050505095945050505050565b6000826115b281610ada565b15156115bd57600080fd5b826115c781610ada565b156115d157600080fd5b6000366040518083838082843782019150509250505060405180910390206115f881611821565b156116d6576116056119da565b61160d611a25565b600160a060020a0386166000908152610102602052604090205461163090611ac5565b935084600285610100811061164157fe5b01805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03928316179055868116600090815261010260205260408082208290559187168152208490556116906119da565b60408051600160a060020a0380891682528716602082015281517fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c929181900390910190a15b505050505050565b60008060006116ec85610f2c565b84106116f757600080fd5b600160a060020a038516600090815261010a6020526040902080548590811061171c57fe5b60009182526020808320600290920290910154600160a060020a038816835261010a90915260409091208054919450908590811061175657fe5b6000918252602080832060016002909302019190910154600160a060020a038816835261010a909152604090912080546001608060020a0390921693506117cb91869081106117a157fe5b906000526020600020906002020160010160109054906101000a90046001608060020a03166125d5565b90509250925092565b61010b5460ff1615156117e657600080fd5b60003660405180838380828437820191505092505050604051809103902061180d81611821565b1561181e5761010b805460ff191690555b50565b600080600061182f33610ada565b151561183a57600080fd5b61010454610200141561184f5761184f611a25565b60008481526101036020526040902091506118698461247b565b15156118bc57600080548355600180840191909155610104805491611890919083016126d5565b60028301819055610104805486929081106118a757fe5b6000918252602090912001556118bc846124bf565b6118c533612490565b90508082600101541660001415610ad35781546000106118e157fe5b81546001141561197d57600084815261010360205260409020600201546101048054909190811061190e57fe5b60009182526020808320909101829055858252610103815260408083208381556001810184905560020192909255815133815290810186905281517f367569357efc39b74a025c4ba1d64068b2b574e3b0d081c48d42f7feeca4cd16929181900390910190a160019250610ad3565b815460001901825560018201805482179055611998846124bf565b604080513381526020810186905281517fe1c52dc63b719ade82e8bea94cc41a0d5d28e4aaf536adb5e9cccc9ff8c1aeda929181900390910190a15050919050565b6001546000106119e657fe5b60015460fa10156119f357fe5b600254600160a060020a031615611a0657fe5b60005415801590611a1b575060015460005411155b1515611a2357fe5b565b600080611a3133610ada565b1515611a3c57600080fd5b50506101045460005b81811015611ab457610104805482908110611a5c57fe5b60009182526020909120015415611aac57610103600061010483815481101515611a8257fe5b60009182526020808320909101548352820192909252604001812081815560018101829055600201555b600101611a45565b611ac161010460006126f9565b5050565b60008115801590611ad7575060fa8211155b1515611adf57fe5b5090565b60015b60015481101561181e575b60015481108015611b1957506002816101008110611b0b57fe5b0154600160a060020a031615155b15611b2657600101611af1565b60018054118015611b5057506001546002906101008110611b4357fe5b0154600160a060020a0316155b15611b645760018054600019019055611b26565b60015481108015611b8f57506001546002906101008110611b8157fe5b0154600160a060020a031615155b8015611bb157506002816101008110611ba457fe5b0154600160a060020a0316155b15611c7f576001546002906101008110611bc757fe5b0154600160a060020a03166002826101008110611be057fe5b01805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03929092169190911790558061010260006002836101008110611c2057fe5b0154600160a060020a0316815260208101919091526040016000908120919091556001546002906101008110611c5257fe5b01805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03929092169190911790555b611ae6565b600160a060020a0382166000908152610106602052604081205481908311611cab5761088c565b82611cb585610a30565b1015611cc057600080fd5b600091505b600160a060020a038416600090815261010a6020526040902054821015611db657611cf08483611f47565b15611dab57600160a060020a038416600090815261010a60205260409020805483908110611d1a57fe5b60009182526020808320600290920290910154600160a060020a038716835261010a9091526040822080549193509084908110611d5357fe5b60009182526020808320600290920290910192909255600160a060020a03861681526101069091526040902054611d90908263ffffffff61209616565b600160a060020a038516600090815261010660205260409020555b816001019150611cc5565b600160a060020a0384166000908152610106602052604090205483111561088c57fe5b6000600160a060020a0383161515611df057600080fd5b600160a060020a03841660009081526101066020526040902054821115611e1657600080fd5b600160a060020a038416600090815261010760209081526040808320338452909152902054821115611e4757600080fd5b600160a060020a03841660009081526101066020526040902054611e71908363ffffffff6121c616565b600160a060020a03808616600090815261010660205260408082209390935590851681522054611ea7908363ffffffff61209616565b600160a060020a0380851660009081526101066020908152604080832094909455918716815261010782528281203382529091522054611eed908363ffffffff6121c616565b600160a060020a03808616600081815261010760209081526040808320338452825291829020949094558051868152905192871693919260008051602061277e833981519152929181900390910190a35060019392505050565b600160a060020a038216600090815261010a60205260408120805482919084908110611f6f57fe5b90600052602060002090600202019050611f876125e3565b60018201546001608060020a03161115611fa45760009150610d8c565b80541515611fb55760009150610d8c565b6001810154611fe09070010000000000000000000000000000000090046001608060020a03166125d5565b801561207e575061010854604080517fb35be68c000000000000000000000000000000000000000000000000000000008152600160a060020a0387811660048301529151919092169163b35be68c9160248083019260209291908290030181600087803b15801561205057600080fd5b505af1158015612064573d6000803e3d6000fd5b505050506040513d602081101561207a57600080fd5b5051155b1561208c5760009150610d8c565b5060019392505050565b600082820183811015610b2657fe5b6000338183116120b457600080fd5b600160a060020a038116600090815261010660205260409020548311156120da57600080fd5b610105546120ee908463ffffffff6121c616565b61010555600160a060020a0381166000908152610106602052604090205461211c908463ffffffff6121c616565b600160a060020a03821660008181526101066020908152604091829020939093558051868152905191927fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca592918290030190a2604080518481529051600091600160a060020a0384169160008051602061277e8339815191529181900360200190a350600192915050565b600160a060020a03166000908152610109602052604090205460ff1690565b6000828211156121d257fe5b50900390565b600080808087600160a060020a03811615156121f357600080fd5b86635ab89576811015801561220c5750636b49d2008111155b151561221757600080fd5b879550612223876125e7565b94506122308a87876125fe565b600160a060020a038b16600090815261010a602052604090205490945084141561230457600160a060020a038a16600090815261010a6020526040902080549061227d9060018301612717565b50600160a060020a038a16600090815261010a602052604090208054859081106122a357fe5b600091825260209091206002909102018054909350156122bf57fe5b6001830180546001608060020a0387811670010000000000000000000000000000000002818a166fffffffffffffffffffffffffffffffff1990931692909217161790555b600160a060020a038a16600090815261010a6020526040902080548590811061232957fe5b6000918252602090912060029091020160018101549093506001608060020a03878116911614801561237e575060018301546001608060020a0386811670010000000000000000000000000000000090920416145b151561238657fe5b8254612398908a63ffffffff61209616565b909255505050505050505050565b6000600160a060020a03831615156123bd57600080fd5b33600090815261010660205260409020548211156123da57600080fd5b33600090815261010660205260409020546123fb908363ffffffff6121c616565b336000908152610106602052604080822092909255600160a060020a0385168152205461242e908363ffffffff61209616565b600160a060020a0384166000818152610106602090815260409182902093909355805185815290519192339260008051602061277e8339815191529281900390910190a350600192915050565b60009081526101036020526040902054151590565b600160a060020a0381166000908152610102602052604081205481906124b590611ac5565b60020a9392505050565b600081815261010360205260409020805415156124d857fe5b6002810154610104805484929081106124ed57fe5b6000918252602090912001541461250057fe5b60005481541115611ac157fe5b60008083635ab8957681101580156125295750636b49d2008111155b151561253457600080fd5b6125478786612542876125e7565b6125fe565b600160a060020a038816600090815261010a602052604090205490935083141561257057600080fd5b600160a060020a038716600090815261010a6020526040902080548490811061259557fe5b90600052602060002090600202019150858260000154101515156125b857600080fd5b81546125ca908763ffffffff6121c616565b909155505050505050565b6001608060020a0316151590565b4290565b6000816125f55760006125f8565b60015b92915050565b6000805b600160a060020a038516600090815261010a60205260409020548210156126b257600160a060020a038516600090815261010a6020526040902080548390811061264857fe5b6000918252602090912060029091020160018101549091506001608060020a03858116911614801561269d575060018101546001608060020a0384811670010000000000000000000000000000000090920416145b156126a7576126b2565b816001019150612602565b600160a060020a038516600090815261010a6020526040902054821115610a2857fe5b81548183558181111561127357600083815260209020611273918101908301612743565b508054600082559060005260206000209081019061181e9190612743565b81548183558181111561127357600202816002028360005260206000209182019101611273919061275d565b610b4791905b80821115611adf5760008155600101612749565b610b4791905b80821115611adf57600080825560018201556002016127635600ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa165627a7a72305820fc47b610eb356fc3dc4495b9edd698fb2c73fb1522e3a97895d976d02a3e4bfa0029

Deployed Bytecode

0x6080604052600436106101c15763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166306fdde0381146101c6578063095ea7b3146102505780631019dc5914610288578063173825d9146102b057806318160ddd146102d15780632090b0a8146102f857806323b872dd1461030d57806325d998bb146103375780632f54bf6e14610358578063313ce567146103795780634123cb6b146103a457806342966c68146103b95780634e4ab830146103d15780635ab92022146103e657806366188463146104125780637065cb481461043657806370a08231146104575780637696f0db14610478578063787d64e41461049957806380340314146104ae57806395d89b41146104fa578063a0e67e2b1461050f578063a9059cbb14610574578063b51fdb9a14610598578063b75c7dc6146105b9578063ba51a6df146105d1578063c24366f0146105e9578063c2cf73261461060a578063c41a360a1461062e578063d73dd62314610662578063dd62ed3e14610686578063e2ba6ce8146106ad578063ef18e458146106c2578063f00d4b5d146106f4578063f27a73ca1461071b578063f450cfee1461075f575b600080fd5b3480156101d257600080fd5b506101db610774565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102155781810151838201526020016101fd565b50505050905090810190601f1680156102425780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561025c57600080fd5b50610274600160a060020a03600435166024356107ab565b604080519115158252519081900360200190f35b34801561029457600080fd5b506102ae600160a060020a03600435166024351515610812565b005b3480156102bc57600080fd5b506102ae600160a060020a0360043516610892565b3480156102dd57600080fd5b506102e66109ee565b60408051918252519081900360200190f35b34801561030457600080fd5b506102746109f5565b34801561031957600080fd5b50610274600160a060020a03600435811690602435166044356109ff565b34801561034357600080fd5b506102e6600160a060020a0360043516610a30565b34801561036457600080fd5b50610274600160a060020a0360043516610ada565b34801561038557600080fd5b5061038e610af7565b6040805160ff9092168252519081900360200190f35b3480156103b057600080fd5b506102e6610afc565b3480156103c557600080fd5b50610274600435610b02565b3480156103dd57600080fd5b50610274610b2d565b3480156103f257600080fd5b50610274600160a060020a03600435166024356044356064351515610b4a565b34801561041e57600080fd5b50610274600160a060020a0360043516602435610c9d565b34801561044257600080fd5b506102ae600160a060020a0360043516610d93565b34801561046357600080fd5b506102e6600160a060020a0360043516610ebb565b34801561048457600080fd5b506102e6600160a060020a0360043516610f2c565b3480156104a557600080fd5b506102e6610f48565b3480156104ba57600080fd5b506104d2600160a060020a0360043516602435610f4e565b604080519384526001608060020a039283166020850152911682820152519081900360600190f35b34801561050657600080fd5b506101db610fab565b34801561051b57600080fd5b50610524610fe2565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610560578181015183820152602001610548565b505050509050019250505060405180910390f35b34801561058057600080fd5b50610274600160a060020a0360043516602435611061565b3480156105a457600080fd5b50610274600160a060020a036004351661108e565b3480156105c557600080fd5b506102ae6004356110a4565b3480156105dd57600080fd5b506102ae600435611164565b3480156105f557600080fd5b506102ae600160a060020a03600435166111f5565b34801561061657600080fd5b50610274600435600160a060020a0360243516611278565b34801561063a57600080fd5b506106466004356112cd565b60408051600160a060020a039092168252519081900360200190f35b34801561066e57600080fd5b50610274600160a060020a03600435166024356112f1565b34801561069257600080fd5b506102e6600160a060020a036004358116906024351661138c565b3480156106b957600080fd5b506106466113b8565b3480156106ce57600080fd5b50610274600160a060020a036004358116906024351660443560643560843515156113c8565b34801561070057600080fd5b506102ae600160a060020a03600435811690602435166115a6565b34801561072757600080fd5b5061073f600160a060020a03600435166024356116de565b604080519384526020840192909252151582820152519081900360600190f35b34801561076b57600080fd5b506102ae6117d4565b60408051808201909152600681527f4275797465780000000000000000000000000000000000000000000000000000602082015281565b33600081815261010760209081526040808320600160a060020a038716808552908352818420869055815186815291519394909390927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928290030190a350600192915050565b81600160a060020a038116151561082857600080fd5b61010b5460ff16151561083a57600080fd5b60003660405180838380828437820191505092505050604051809103902061086181611821565b1561088c57600160a060020a038416600090815261010960205260409020805460ff19168415151790555b50505050565b60008161089e81610ada565b15156108a957600080fd5b60018054036000811180156108bf575060fa8111155b15156108ca57600080fd5b60005460018054036000821180156108e25750808211155b15156108ed57600080fd5b60003660405180838380828437820191505092505050604051809103902061091481611821565b156109e5576109216119da565b610929611a25565b600160a060020a0387166000908152610102602052604090205461094c90611ac5565b95506000600287610100811061095e57fe5b01805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a039283161790558716600090815261010260205260408120556109a0611ae3565b6109a86119da565b60408051600160a060020a038916815290517f58619076adf5bb0943d100ef88d52d7c3fd691b19d3a9071b555b651fbf418da9181900360200190a15b50505050505050565b6101055481565b61010b5460ff1681565b6000606036606414610a1057600080fd5b610a1a8584611c84565b610a25858585611dd9565b91505b509392505050565b600160a060020a03811660009081526101066020526040812054815b600160a060020a038416600090815261010a6020526040902054811015610acf57610a778482611f47565b15610ac757600160a060020a038416600090815261010a602052604090208054610ac4919083908110610aa657fe5b6000918252602090912060029091020154839063ffffffff61209616565b91505b600101610a4c565b8192505b5050919050565b600160a060020a0316600090815261010260205260408120541190565b600481565b60015481565b6000602036602414610b1357600080fd5b610b1d3384611c84565b610b26836120a5565b9392505050565b6000610b3833610ada565b1515610b4357600080fd5b5060015b90565b600084600160a060020a0381161515610b6257600080fd5b83635ab895768110158015610b7b5750636b49d2008111155b1515610b8657600080fd5b608036608414610b9557600080fd5b61010b5460ff161515610ba757600080fd5b33610bb1816121a7565b1515610bbc57600080fd5b33896000610be1610bcc83610ebb565b610bd585610ebb565b9063ffffffff61209616565b33600090815261010660205260409020549091508b1115610c0157600080fd5b3360009081526101066020526040902054610c22908c63ffffffff6121c616565b3360009081526101066020526040902055610c3f8c8c8c8c6121d8565b604080518c81529051600160a060020a038e1691339160008051602061277e8339815191529181900360200190a36001975080610c87610c7e84610ebb565b610bd586610ebb565b14610c8e57fe5b50505050505050949350505050565b33600090815261010760209081526040808320600160a060020a038616845290915281205480831115610cf45733600090815261010760209081526040808320600160a060020a0388168452909152812055610d2a565b610d04818463ffffffff6121c616565b33600090815261010760209081526040808320600160a060020a03891684529091529020555b33600081815261010760209081526040808320600160a060020a0389168085529083529281902054815190815290519293927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929181900390910190a3600191505b5092915050565b80610d9d81610ada565b15610da757600080fd5b600154600101600081118015610dbe575060fa8111155b1515610dc957600080fd5b600036604051808383808284378201915050925050506040518091039020610df081611821565b1561088c57610dfd6119da565b610e05611a25565b6001805481019081905584906002906101008110610e1f57fe5b01805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055600154610e5790611ac5565b600160a060020a03851660009081526101026020526040902055610e796119da565b60408051600160a060020a038616815290517f994a936646fe87ffe4f1e469d3d6aa417d6b855598397f323de5b449f765f0c39181900360200190a150505050565b600160a060020a03811660009081526101066020526040812054815b600160a060020a038416600090815261010a6020526040902054811015610acf57600160a060020a038416600090815261010a602052604090208054610f22919083908110610aa657fe5b9150600101610ed7565b600160a060020a0316600090815261010a602052604090205490565b60005481565b61010a60205281600052604060002081815481101515610f6a57fe5b6000918252602090912060029091020180546001909101549092506001608060020a0380821692507001000000000000000000000000000000009091041683565b60408051808201909152600381527f4255580000000000000000000000000000000000000000000000000000000000602082015281565b6060806000600154604051908082528060200260200182016040528015611013578160200160208202803883390190505b509150600090505b60015481101561105b5761102e816112cd565b828281518110151561103c57fe5b600160a060020a0390921660209283029091019091015260010161101b565b50919050565b600060403660441461107257600080fd5b61107c3384611c84565b61108684846123a6565b949350505050565b6101096020526000908152604090205460ff1681565b600080826110b18161247b565b15156110bc57600080fd5b6110c533610ada565b15156110d057600080fd5b6110d933612490565b60008581526101036020526040812060018101549295509350908416116110ff57600080fd5b611108846124bf565b815460019081018355820180548490039055611123846124bf565b604080513381526020810186905281517fc7fb647e59b18047309aa15aad418e5d7ca96d173ad704f1031a2c3d7591734b929181900390910190a150505050565b806001546000821180156111785750808211155b151561118357600080fd5b6000366040518083838082843782019150509250505060405180910390206111aa81611821565b1561088c5760008490556111bc611a25565b6040805185815290517facbdb084c721332ac59f9b8e392196c9eb0e4932862da8eb9beaf0dad4f550da9181900360200190a150505050565b80600160a060020a038116151561120b57600080fd5b61010b5460ff16151561121d57600080fd5b60003660405180838380828437820191505092505050604051809103902061124481611821565b1561127357610108805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0385161790555b505050565b6000826112848161247b565b151561128f57600080fd5b8261129981610ada565b15156112a457600080fd5b6112ad84612490565b600086815261010360205260409020600101541615159250505092915050565b600060026001830161010081106112e057fe5b0154600160a060020a031692915050565b33600090815261010760209081526040808320600160a060020a0386168452909152812054611326908363ffffffff61209616565b33600081815261010760209081526040808320600160a060020a0389168085529083529281902085905580519485525191937f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929081900390910190a350600192915050565b600160a060020a0391821660009081526101076020908152604080832093909416825291909152205490565b61010854600160a060020a031681565b600084600160a060020a03811615156113e057600080fd5b83635ab8957681101580156113f95750636b49d2008111155b151561140457600080fd5b60a03660a41461141357600080fd5b61010b5460ff16151561142557600080fd5b88886000611435610bcc83610ebb565b9050611440336121a7565b801561145057506114508b6121a7565b151561145b57600080fd5b600160a060020a038c166000908152610107602090815260408083203384529091529020548a111561148c57600080fd5b600160a060020a038c166000908152610107602090815260408083203384529091529020546114c1908b63ffffffff6121c616565b600160a060020a038d166000908152610107602090815260408083203384529091529020556114f28c8b8b8b61250d565b600160a060020a038b166000908152610106602052604090205461151c908b63ffffffff61209616565b61010660008d600160a060020a0316600160a060020a03168152602001908152602001600020819055508a600160a060020a03168c600160a060020a031660008051602061277e8339815191528c6040518082815260200191505060405180910390a36001965080611590610c7e84610ebb565b1461159757fe5b50505050505095945050505050565b6000826115b281610ada565b15156115bd57600080fd5b826115c781610ada565b156115d157600080fd5b6000366040518083838082843782019150509250505060405180910390206115f881611821565b156116d6576116056119da565b61160d611a25565b600160a060020a0386166000908152610102602052604090205461163090611ac5565b935084600285610100811061164157fe5b01805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03928316179055868116600090815261010260205260408082208290559187168152208490556116906119da565b60408051600160a060020a0380891682528716602082015281517fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c929181900390910190a15b505050505050565b60008060006116ec85610f2c565b84106116f757600080fd5b600160a060020a038516600090815261010a6020526040902080548590811061171c57fe5b60009182526020808320600290920290910154600160a060020a038816835261010a90915260409091208054919450908590811061175657fe5b6000918252602080832060016002909302019190910154600160a060020a038816835261010a909152604090912080546001608060020a0390921693506117cb91869081106117a157fe5b906000526020600020906002020160010160109054906101000a90046001608060020a03166125d5565b90509250925092565b61010b5460ff1615156117e657600080fd5b60003660405180838380828437820191505092505050604051809103902061180d81611821565b1561181e5761010b805460ff191690555b50565b600080600061182f33610ada565b151561183a57600080fd5b61010454610200141561184f5761184f611a25565b60008481526101036020526040902091506118698461247b565b15156118bc57600080548355600180840191909155610104805491611890919083016126d5565b60028301819055610104805486929081106118a757fe5b6000918252602090912001556118bc846124bf565b6118c533612490565b90508082600101541660001415610ad35781546000106118e157fe5b81546001141561197d57600084815261010360205260409020600201546101048054909190811061190e57fe5b60009182526020808320909101829055858252610103815260408083208381556001810184905560020192909255815133815290810186905281517f367569357efc39b74a025c4ba1d64068b2b574e3b0d081c48d42f7feeca4cd16929181900390910190a160019250610ad3565b815460001901825560018201805482179055611998846124bf565b604080513381526020810186905281517fe1c52dc63b719ade82e8bea94cc41a0d5d28e4aaf536adb5e9cccc9ff8c1aeda929181900390910190a15050919050565b6001546000106119e657fe5b60015460fa10156119f357fe5b600254600160a060020a031615611a0657fe5b60005415801590611a1b575060015460005411155b1515611a2357fe5b565b600080611a3133610ada565b1515611a3c57600080fd5b50506101045460005b81811015611ab457610104805482908110611a5c57fe5b60009182526020909120015415611aac57610103600061010483815481101515611a8257fe5b60009182526020808320909101548352820192909252604001812081815560018101829055600201555b600101611a45565b611ac161010460006126f9565b5050565b60008115801590611ad7575060fa8211155b1515611adf57fe5b5090565b60015b60015481101561181e575b60015481108015611b1957506002816101008110611b0b57fe5b0154600160a060020a031615155b15611b2657600101611af1565b60018054118015611b5057506001546002906101008110611b4357fe5b0154600160a060020a0316155b15611b645760018054600019019055611b26565b60015481108015611b8f57506001546002906101008110611b8157fe5b0154600160a060020a031615155b8015611bb157506002816101008110611ba457fe5b0154600160a060020a0316155b15611c7f576001546002906101008110611bc757fe5b0154600160a060020a03166002826101008110611be057fe5b01805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03929092169190911790558061010260006002836101008110611c2057fe5b0154600160a060020a0316815260208101919091526040016000908120919091556001546002906101008110611c5257fe5b01805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03929092169190911790555b611ae6565b600160a060020a0382166000908152610106602052604081205481908311611cab5761088c565b82611cb585610a30565b1015611cc057600080fd5b600091505b600160a060020a038416600090815261010a6020526040902054821015611db657611cf08483611f47565b15611dab57600160a060020a038416600090815261010a60205260409020805483908110611d1a57fe5b60009182526020808320600290920290910154600160a060020a038716835261010a9091526040822080549193509084908110611d5357fe5b60009182526020808320600290920290910192909255600160a060020a03861681526101069091526040902054611d90908263ffffffff61209616565b600160a060020a038516600090815261010660205260409020555b816001019150611cc5565b600160a060020a0384166000908152610106602052604090205483111561088c57fe5b6000600160a060020a0383161515611df057600080fd5b600160a060020a03841660009081526101066020526040902054821115611e1657600080fd5b600160a060020a038416600090815261010760209081526040808320338452909152902054821115611e4757600080fd5b600160a060020a03841660009081526101066020526040902054611e71908363ffffffff6121c616565b600160a060020a03808616600090815261010660205260408082209390935590851681522054611ea7908363ffffffff61209616565b600160a060020a0380851660009081526101066020908152604080832094909455918716815261010782528281203382529091522054611eed908363ffffffff6121c616565b600160a060020a03808616600081815261010760209081526040808320338452825291829020949094558051868152905192871693919260008051602061277e833981519152929181900390910190a35060019392505050565b600160a060020a038216600090815261010a60205260408120805482919084908110611f6f57fe5b90600052602060002090600202019050611f876125e3565b60018201546001608060020a03161115611fa45760009150610d8c565b80541515611fb55760009150610d8c565b6001810154611fe09070010000000000000000000000000000000090046001608060020a03166125d5565b801561207e575061010854604080517fb35be68c000000000000000000000000000000000000000000000000000000008152600160a060020a0387811660048301529151919092169163b35be68c9160248083019260209291908290030181600087803b15801561205057600080fd5b505af1158015612064573d6000803e3d6000fd5b505050506040513d602081101561207a57600080fd5b5051155b1561208c5760009150610d8c565b5060019392505050565b600082820183811015610b2657fe5b6000338183116120b457600080fd5b600160a060020a038116600090815261010660205260409020548311156120da57600080fd5b610105546120ee908463ffffffff6121c616565b61010555600160a060020a0381166000908152610106602052604090205461211c908463ffffffff6121c616565b600160a060020a03821660008181526101066020908152604091829020939093558051868152905191927fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca592918290030190a2604080518481529051600091600160a060020a0384169160008051602061277e8339815191529181900360200190a350600192915050565b600160a060020a03166000908152610109602052604090205460ff1690565b6000828211156121d257fe5b50900390565b600080808087600160a060020a03811615156121f357600080fd5b86635ab89576811015801561220c5750636b49d2008111155b151561221757600080fd5b879550612223876125e7565b94506122308a87876125fe565b600160a060020a038b16600090815261010a602052604090205490945084141561230457600160a060020a038a16600090815261010a6020526040902080549061227d9060018301612717565b50600160a060020a038a16600090815261010a602052604090208054859081106122a357fe5b600091825260209091206002909102018054909350156122bf57fe5b6001830180546001608060020a0387811670010000000000000000000000000000000002818a166fffffffffffffffffffffffffffffffff1990931692909217161790555b600160a060020a038a16600090815261010a6020526040902080548590811061232957fe5b6000918252602090912060029091020160018101549093506001608060020a03878116911614801561237e575060018301546001608060020a0386811670010000000000000000000000000000000090920416145b151561238657fe5b8254612398908a63ffffffff61209616565b909255505050505050505050565b6000600160a060020a03831615156123bd57600080fd5b33600090815261010660205260409020548211156123da57600080fd5b33600090815261010660205260409020546123fb908363ffffffff6121c616565b336000908152610106602052604080822092909255600160a060020a0385168152205461242e908363ffffffff61209616565b600160a060020a0384166000818152610106602090815260409182902093909355805185815290519192339260008051602061277e8339815191529281900390910190a350600192915050565b60009081526101036020526040902054151590565b600160a060020a0381166000908152610102602052604081205481906124b590611ac5565b60020a9392505050565b600081815261010360205260409020805415156124d857fe5b6002810154610104805484929081106124ed57fe5b6000918252602090912001541461250057fe5b60005481541115611ac157fe5b60008083635ab8957681101580156125295750636b49d2008111155b151561253457600080fd5b6125478786612542876125e7565b6125fe565b600160a060020a038816600090815261010a602052604090205490935083141561257057600080fd5b600160a060020a038716600090815261010a6020526040902080548490811061259557fe5b90600052602060002090600202019150858260000154101515156125b857600080fd5b81546125ca908763ffffffff6121c616565b909155505050505050565b6001608060020a0316151590565b4290565b6000816125f55760006125f8565b60015b92915050565b6000805b600160a060020a038516600090815261010a60205260409020548210156126b257600160a060020a038516600090815261010a6020526040902080548390811061264857fe5b6000918252602090912060029091020160018101549091506001608060020a03858116911614801561269d575060018101546001608060020a0384811670010000000000000000000000000000000090920416145b156126a7576126b2565b816001019150612602565b600160a060020a038516600090815261010a6020526040902054821115610a2857fe5b81548183558181111561127357600083815260209020611273918101908301612743565b508054600082559060005260206000209081019061181e9190612743565b81548183558181111561127357600202816002028360005260206000209182019101611273919061275d565b610b4791905b80821115611adf5760008155600101612749565b610b4791905b80821115611adf57600080825560018201556002016127635600ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa165627a7a72305820fc47b610eb356fc3dc4495b9edd698fb2c73fb1522e3a97895d976d02a3e4bfa0029

Deployed Bytecode Sourcemap

22229:15373:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37475:38;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37475:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;37475:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19673:187;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;19673:187:0;-1:-1:-1;;;;;19673:187:0;;;;;;;;;;;;;;;;;;;;;;;;;29407:217;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;29407:217:0;-1:-1:-1;;;;;29407:217:0;;;;;;;;;;;6686:661;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;6686:661:0;-1:-1:-1;;;;;6686:661:0;;;;;15873:26;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15873:26:0;;;;;;;;;;;;;;;;;;;;37408:36;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37408:36:0;;;;26668:246;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;26668:246:0;-1:-1:-1;;;;;26668:246:0;;;;;;;;;;;;25348:400;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;25348:400:0;-1:-1:-1;;;;;25348:400:0;;;;;8530:112;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;8530:112:0;-1:-1:-1;;;;;8530:112:0;;;;;37564:34;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37564:34:0;;;;;;;;;;;;;;;;;;;;;;;15246:23;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15246:23:0;;;;27180:198;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;27180:198:0;;;;;8904:93;;8:9:-1;5:2;;;30:1;27;20:12;5:2;8904:93:0;;;;30092:576;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;30092:576:0;-1:-1:-1;;;;;30092:576:0;;;;;;;;;;;;;20830:407;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;20830:407:0;-1:-1:-1;;;;;20830:407:0;;;;;;;6098:447;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;6098:447:0;-1:-1:-1;;;;;6098:447:0;;;;;24750:328;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;24750:328:0;-1:-1:-1;;;;;24750:328:0;;;;;27594:121;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;27594:121:0;-1:-1:-1;;;;;27594:121:0;;;;;15150:32;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15150:32:0;;;;37280:55;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;37280:55:0;-1:-1:-1;;;;;37280:55:0;;;;;;;;;;;;;;-1:-1:-1;;;;;37280:55:0;;;;;;;;;;;;;;;;;;;;;;37520:37;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37520:37:0;;;;8140:240;;8:9:-1;5:2;;;30:1;27;20:12;5:2;8140:240:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;8140:240:0;;;;;;;;;;;;;;;;;26038:221;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;26038:221:0;-1:-1:-1;;;;;26038:221:0;;;;;;;37200:40;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;37200:40:0;-1:-1:-1;;;;;37200:40:0;;;;;9148:534;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;9148:534:0;;;;;7532:299;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;7532:299:0;;;;;28880:235;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;28880:235:0;-1:-1:-1;;;;;28880:235:0;;;;;9863:306;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;9863:306:0;;;-1:-1:-1;;;;;9863:306:0;;;;;7944:119;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;7944:119:0;;;;;;;;;-1:-1:-1;;;;;7944:119:0;;;;;;;;;;;;;;20563:261;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;20563:261:0;-1:-1:-1;;;;;20563:261:0;;;;;;;20187:128;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;20187:128:0;-1:-1:-1;;;;;20187:128:0;;;;;;;;;;37096:33;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37096:33:0;;;;31423:779;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;31423:779:0;-1:-1:-1;;;;;31423:779:0;;;;;;;;;;;;;;;;;;5464:502;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;5464:502:0;-1:-1:-1;;;;;5464:502:0;;;;;;;;;;28203:374;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;28203:374:0;-1:-1:-1;;;;;28203:374:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32298:168;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32298:168:0;;;;37475:38;;;;;;;;;;;;;;;;;;;:::o;19673:187::-;19761:10;19740:4;19753:19;;;:7;:19;;;;;;;;-1:-1:-1;;;;;19753:29:0;;;;;;;;;;;:38;;;19798;;;;;;;19740:4;;19753:29;;19761:10;;19798:38;;;;;;;;-1:-1:-1;19850:4:0;19673:187;;;;:::o;29407:217::-;29494:7;-1:-1:-1;;;;;1850:18:0;;;;1842:27;;;;;;23222:17;;;;23214:26;;;;;;;;29564:8;;29554:19;;;;;;;;;;;;;;;;;;;;;;;;;3268:27;3284:10;3268:15;:27::i;:::-;3264:61;;;-1:-1:-1;;;;;29591:16:0;;;;;;:7;:16;;;;;:25;;-1:-1:-1;;29591:25:0;;;;;;;3264:61;23251:1;29407:217;;;:::o;6686:661::-;7012:15;6762:6;3934:17;3942:8;3934:7;:17::i;:::-;3926:26;;;;;;;;6808:1;6794:11;;:15;3660:1;3647:10;:14;:43;;;;;15054:3;3665:10;:25;;3647:43;3639:52;;;;;;;;6847:20;;6883:1;6869:11;;:15;3819:1;3807:9;:13;:40;;;;;3837:10;3824:9;:23;;3807:40;3799:49;;;;;;;;6920:8;;6910:19;;;;;;;;;;;;;;;;;;;;;;;;;3268:27;3284:10;3268:15;:27::i;:::-;3264:61;;;6947:27;:25;:27::i;:::-;6987:14;:12;:14::i;:::-;-1:-1:-1;;;;;7046:20:0;;;;;;:12;:20;;;;;;7030:37;;:15;:37::i;:::-;7012:55;-1:-1:-1;7101:1:0;7078:8;7012:55;7078:20;;;;;;;;:24;;-1:-1:-1;;7078:24:0;-1:-1:-1;;;;;7078:24:0;;;;;;7113:20;;-1:-1:-1;7113:20:0;;;:12;:20;;;;;:24;7250:18;:16;:18::i;:::-;7281:27;:25;:27::i;:::-;7319:20;;;-1:-1:-1;;;;;7319:20:0;;;;;;;;;;;;;;;3264:61;3859:1;3702;;3963;6686:661;;;:::o;15873:26::-;;;;:::o;37408:36::-;;;;;;:::o;26668:246::-;26799:4;26773:6;1674:8;1693;1674:27;1666:60;;;;;;26821:29;26836:5;26843:6;26821:14;:29::i;:::-;26868:38;26887:5;26894:3;26899:6;26868:18;:38::i;:::-;26861:45;;1736:1;26668:246;;;;;;:::o;25348:400::-;-1:-1:-1;;;;;25451:16:0;;25413:7;25451:16;;;:8;:16;;;;;;25413:7;25480:234;-1:-1:-1;;;;;25517:22:0;;;;;;:14;:22;;;;;:29;25505:41;;25480:234;;;25580:40;25602:6;25610:9;25580:21;:40::i;:::-;25576:126;;;-1:-1:-1;;;;;25661:22:0;;;;;;:14;:22;;;;;:33;;25649:53;;25661:22;25684:9;;25661:33;;;;;;;;;;;;;;;;;;;:40;25649:7;;:53;:11;:53;:::i;:::-;25639:63;;25576:126;25548:11;;25480:234;;;25733:7;25726:14;;25348:400;;;;;;:::o;8530:112::-;-1:-1:-1;;;;;8611:19:0;8587:4;8611:19;;;:12;:19;;;;;;:23;;8530:112::o;37564:34::-;37597:1;37564:34;:::o;15246:23::-;;;;:::o;27180:198::-;27276:4;27250:6;1674:8;1693;1674:27;1666:60;;;;;;27298:35;27313:10;27325:7;27298:14;:35::i;:::-;27351:19;27362:7;27351:10;:19::i;:::-;27344:26;27180:198;-1:-1:-1;;;27180:198:0:o;8904:93::-;8961:4;2957:19;2965:10;2957:7;:19::i;:::-;2949:28;;;;;;;;-1:-1:-1;8985:4:0;2988:1;8904:93;:::o;30092:576::-;30407:4;30218:3;-1:-1:-1;;;;;1850:18:0;;;;1842:27;;;;;;30244:6;22907:10;22901:2;:16;;:36;;;;;22927:10;22921:2;:16;;22901:36;22893:45;;;;;;;;30275:6;1674:8;1693;1674:27;1666:60;;;;;;23222:17;;;;23214:26;;;;;;;;30328:10;22808:15;22815:7;22808:6;:15::i;:::-;22800:24;;;;;;;;30372:10;30384:3;23035:12;23050:34;23070:13;23080:2;23070:9;:13::i;:::-;23050:15;23060:4;23050:9;:15::i;:::-;:19;:34;:19;:34;:::i;:::-;30456:10;30447:20;;;;:8;:20;;;;;;23035:49;;-1:-1:-1;30437:30:0;;;30429:39;;;;;;30513:10;30504:20;;;;:8;:20;;;;;;:32;;30529:6;30504:32;:24;:32;:::i;:::-;30490:10;30481:20;;;;:8;:20;;;;;:55;30547:45;30557:3;30562:6;30570;30578:13;30547:9;:45::i;:::-;30603:33;;;;;;;;-1:-1:-1;;;;;30603:33:0;;;30612:10;;-1:-1:-1;;;;;;;;;;;30603:33:0;;;;;;;;30656:4;30649:11;;23152:7;23114:34;23134:13;23144:2;23134:9;:13::i;:::-;23114:15;23124:4;23114:9;:15::i;:34::-;:45;23107:53;;;;22835:1;;;23251;22949;1880;30092:576;;;;;;;:::o;20830:407::-;20950:10;20913:4;20942:19;;;:7;:19;;;;;;;;-1:-1:-1;;;;;20942:29:0;;;;;;;;;;20982:27;;;20978:168;;;21028:10;21052:1;21020:19;;;:7;:19;;;;;;;;-1:-1:-1;;;;;21020:29:0;;;;;;;;;:33;20978:168;;;21108:30;:8;21121:16;21108:30;:12;:30;:::i;:::-;21084:10;21076:19;;;;:7;:19;;;;;;;;-1:-1:-1;;;;;21076:29:0;;;;;;;;;:62;20978:168;21161:10;21183:19;;;;:7;:19;;;;;;;;-1:-1:-1;;;;;21152:61:0;;21183:29;;;;;;;;;;;21152:61;;;;;;;;;21161:10;21152:61;;;;;;;;;;;21227:4;21220:11;;20830:407;;;;;;:::o;6098:447::-;6177:6;4045:17;4053:8;4045:7;:17::i;:::-;4044:18;4036:27;;;;;;6209:11;;6223:1;6209:15;3660:1;3647:10;:14;:43;;;;;15054:3;3665:10;:25;;3647:43;3639:52;;;;;;;;6260:8;;6250:19;;;;;;;;;;;;;;;;;;;;;;;;;3268:27;3284:10;3268:15;:27::i;:::-;3264:61;;;6287:27;:25;:27::i;:::-;6327:14;:12;:14::i;:::-;6352:11;:13;;;;;;;;6400:6;;6376:8;;:21;;;;;;;;:30;;-1:-1:-1;;6376:30:0;-1:-1:-1;;;;;6376:30:0;;;;;;;;;;-1:-1:-1;6456:11:0;6440:28;;:15;:28::i;:::-;-1:-1:-1;;;;;6417:20:0;;;;;;:12;:20;;;;;:51;6481:27;:25;:27::i;:::-;6519:18;;;-1:-1:-1;;;;;6519:18:0;;;;;;;;;;;;;;;3702:1;4074;6098:447;;:::o;24750:328::-;-1:-1:-1;;;;;24844:16:0;;24806:7;24844:16;;;:8;:16;;;;;;24806:7;24873:171;-1:-1:-1;;;;;24910:22:0;;;;;;:14;:22;;;;;:29;24898:41;;24873:171;;;-1:-1:-1;;;;;24991:22:0;;;;;;:14;:22;;;;;:33;;24979:53;;24991:22;25014:9;;24991:33;;;;;24979:53;24969:63;-1:-1:-1;24941:11:0;;24873:171;;27594:121;-1:-1:-1;;;;;27679:21:0;27655:4;27679:21;;;:14;:21;;;;;:28;;27594:121::o;15150:32::-;;;;:::o;37280:55::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;37280:55:0;;;;-1:-1:-1;37280:55:0;;;;;;:::o;37520:37::-;;;;;;;;;;;;;;;;;;;:::o;8140:240::-;8186:9;8208:23;8276:6;8248:11;;8234:26;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;8234:26:0;;8208:52;;8285:1;8276:10;;8271:75;8292:11;;8288:1;:15;8271:75;;;8335:11;8344:1;8335:8;:11::i;:::-;8323:6;8330:1;8323:9;;;;;;;;;;-1:-1:-1;;;;;8323:23:0;;;:9;;;;;;;;;;:23;8305:3;;8271:75;;;-1:-1:-1;8366:6:0;8140:240;-1:-1:-1;8140:240:0:o;26038:221::-;26150:4;26124:6;1674:8;1693;1674:27;1666:60;;;;;;26172:34;26187:10;26199:6;26172:14;:34::i;:::-;26224:27;26239:3;26244:6;26224:14;:27::i;:::-;26217:34;26038:221;-1:-1:-1;;;;26038:221:0:o;37200:40::-;;;;;;;;;;;;;;;:::o;9148:534::-;9286:18;9348:11;9239:10;4167:29;4185:10;4167:17;:29::i;:::-;4159:38;;;;;;;;2957:19;2965:10;2957:7;:19::i;:::-;2949:28;;;;;;;;9307:30;9326:10;9307:18;:30::i;:::-;9362:31;;;;:19;:31;;;;;9412:18;;;;9286:51;;-1:-1:-1;9362:31:0;-1:-1:-1;9412:34:0;;;:38;9404:47;;;;;;9464:39;9492:10;9464:27;:39::i;:::-;9516:19;;;;;;;;9546:18;;:35;;;;;;;9594:39;9622:10;9594:27;:39::i;:::-;9644:30;;;9651:10;9644:30;;;;;;;;;;;;;;;;;;;;;9148:534;;;;:::o;7532:299::-;7632:12;7646:11;;3819:1;3807:9;:13;:40;;;;;3837:10;3824:9;:23;;3807:40;3799:49;;;;;;;;7693:8;;7683:19;;;;;;;;;;;;;;;;;;;;;;;;;3268:27;3284:10;3268:15;:27::i;:::-;3264:61;;;7720:20;:35;;;7766:14;:12;:14::i;:::-;7791:32;;;;;;;;;;;;;;;;;3859:1;7532:299;;;:::o;28880:235::-;28965:11;-1:-1:-1;;;;;1850:18:0;;;;1842:27;;;;;;23222:17;;;;23214:26;;;;;;;;29039:8;;29029:19;;;;;;;;;;;;;;;;;;;;;;;;;3268:27;3284:10;3268:15;:27::i;:::-;3264:61;;;29066:13;:41;;-1:-1:-1;;29066:41:0;-1:-1:-1;;;;;29066:41:0;;;;;3264:61;23251:1;28880:235;;:::o;9863:306::-;10053:4;9994:10;4167:29;4185:10;4167:17;:29::i;:::-;4159:38;;;;;;;;10027:6;3934:17;3942:8;3934:7;:17::i;:::-;3926:26;;;;;;;;10129;10148:6;10129:18;:26::i;:::-;10084:31;;;;:19;:31;;;;;:42;;;:71;:76;10082:79;;-1:-1:-1;4208:1:0;9863:306;;;;;:::o;7944:119::-;8004:7;8031:8;8053:1;8040:14;;8031:24;;;;;;;;;-1:-1:-1;;;;;8031:24:0;;7944:119;-1:-1:-1;;7944:119:0:o;20563:261::-;20694:10;20641:4;20686:19;;;:7;:19;;;;;;;;-1:-1:-1;;;;;20686:29:0;;;;;;;;;;:46;;20720:11;20686:46;:33;:46;:::i;:::-;20662:10;20654:19;;;;:7;:19;;;;;;;;-1:-1:-1;;;;;20654:29:0;;;;;;;;;;;;:78;;;20739:61;;;;;;20654:29;;20739:61;;;;;;;;;;;-1:-1:-1;20814:4:0;20563:261;;;;:::o;20187:128::-;-1:-1:-1;;;;;20284:15:0;;;20261:7;20284:15;;;:7;:15;;;;;;;;:25;;;;;;;;;;;;;20187:128::o;37096:33::-;;;-1:-1:-1;;;;;37096:33:0;;:::o;31423:779::-;31821:4;31568:3;-1:-1:-1;;;;;1850:18:0;;;;1842:27;;;;;;31594:6;22907:10;22901:2;:16;;:36;;;;;22927:10;22921:2;:16;;22901:36;22893:45;;;;;;;;31625:6;1674:8;1693;1674:27;1666:60;;;;;;23222:17;;;;23214:26;;;;;;;;31791:5;31798:3;23035:12;23050:34;23070:13;23080:2;23070:9;:13::i;23050:34::-;23035:49;;31851:18;31858:10;31851:6;:18::i;:::-;:33;;;;;31873:11;31880:3;31873:6;:11::i;:::-;31843:42;;;;;;;;-1:-1:-1;;;;;31914:14:0;;;;;;:7;:14;;;;;;;;31929:10;31914:26;;;;;;;;31904:36;;;31896:45;;;;;;-1:-1:-1;;;;;31983:14:0;;;;;;:7;:14;;;;;;;;31998:10;31983:26;;;;;;;;:38;;32014:6;31983:38;:30;:38;:::i;:::-;-1:-1:-1;;;;;31954:14:0;;;;;;:7;:14;;;;;;;;31969:10;31954:26;;;;;;;:67;32032:47;31962:5;32049:6;32057;32065:13;32032:9;:47::i;:::-;-1:-1:-1;;;;;32106:13:0;;;;;;:8;:13;;;;;;:25;;32124:6;32106:25;:17;:25;:::i;:::-;32090:8;:13;32099:3;-1:-1:-1;;;;;32090:13:0;-1:-1:-1;;;;;32090:13:0;;;;;;;;;;;;:41;;;;32158:3;-1:-1:-1;;;;;32142:28:0;32151:5;-1:-1:-1;;;;;32142:28:0;-1:-1:-1;;;;;;;;;;;32163:6:0;32142:28;;;;;;;;;;;;;;;;;;32190:4;32183:11;;23152:7;23114:34;23134:13;23144:2;23134:9;:13::i;23114:34::-;:45;23107:53;;;;23251:1;;;22949;1880;31423:779;;;;;;;;:::o;5464:502::-;5717:15;5552:5;3934:17;3942:8;3934:7;:17::i;:::-;3926:26;;;;;;;;5586:3;4045:17;4053:8;4045:7;:17::i;:::-;4044:18;4036:27;;;;;;5625:8;;5615:19;;;;;;;;;;;;;;;;;;;;;;;;;3268:27;3284:10;3268:15;:27::i;:::-;3264:61;;;5652:27;:25;:27::i;:::-;5692:14;:12;:14::i;:::-;-1:-1:-1;;;;;5751:19:0;;;;;;:12;:19;;;;;;5735:36;;:15;:36::i;:::-;5717:54;-1:-1:-1;5805:3:0;5782:8;5717:54;5782:20;;;;;;;;:26;;-1:-1:-1;;5782:26:0;-1:-1:-1;;;;;5782:26:0;;;;;;5819:19;;;-1:-1:-1;5819:19:0;;;:12;:19;;;;;;:23;;;5853:17;;;;;;:30;;;5896:27;:25;:27::i;:::-;5934:24;;;-1:-1:-1;;;;;5934:24:0;;;;;;;;;;;;;;;;;;;;;;;;3264:61;4074:1;3963;5464:502;;;;:::o;28203:374::-;28271:11;28284;28297:18;28344:22;28360:5;28344:15;:22::i;:::-;28336:30;;28328:39;;;;;;-1:-1:-1;;;;;28389:21:0;;;;;;:14;:21;;;;;:28;;28411:5;;28389:28;;;;;;;;;;;;;;;;;;;;;:35;-1:-1:-1;;;;;28449:21:0;;;;:14;:21;;;;;;;:28;;28389:35;;-1:-1:-1;28449:21:0;28471:5;;28449:28;;;;;;;;;;;;;;:35;:28;;;;;:35;;;;;-1:-1:-1;;;;;28526:21:0;;;;:14;:21;;;;;;;:28;;-1:-1:-1;;;;;28449:35:0;;;;-1:-1:-1;28512:57:0;;28548:5;;28526:28;;;;;;;;;;;;;;;;:42;;;;;;;;;;-1:-1:-1;;;;;28526:42:0;28512:13;:57::i;:::-;28496:73;;28203:374;;;;;:::o;32298:168::-;23222:17;;;;23214:26;;;;;;;;32406:8;;32396:19;;;;;;;;;;;;;;;;;;;;;;;;;3268:27;3284:10;3268:15;:27::i;:::-;3264:61;;;32433:17;:25;;-1:-1:-1;;32433:25:0;;;3264:61;23251:1;32298:168::o;10204:2288::-;10303:4;10794:11;11479:18;2957:19;2965:10;2957:7;:19::i;:::-;2949:28;;;;;;;;10336:24;:31;10329:3;:38;10325:456;;;10767:14;:12;:14::i;:::-;10808:31;;;;:19;:31;;;;;;-1:-1:-1;10961:29:0;10828:10;10961:17;:29::i;:::-;10959:31;10955:459;;;11080:20;;;11060:40;;11195:18;;;;:22;;;;11248:24;:33;;;;;:24;:33;;;:::i;:::-;11232:13;;;:49;;;11296:24;:39;;11338:10;;11232:49;11296:39;;;;;;;;;;;;;;;:52;11363:39;11391:10;11363:27;:39::i;:::-;11500:30;11519:10;11500:18;:30::i;:::-;11479:51;;11657:13;11636:7;:18;;;:34;11674:1;11636:39;11632:853;;;11758:17;;11778:1;-1:-1:-1;11751:29:0;;;;11799:17;;11820:1;11799:22;11795:679;;;11940:31;;;;:19;:31;;;;;:37;;;11915:24;:63;;:24;;11940:37;11915:63;;;;;;;;;;;;;;;;;11908:70;;;12004:31;;;:19;:31;;;;;;11997:38;;;;;;;;;;;;;;;12054:41;;12072:10;12054:41;;;;;;;;;;;;;;;;;;;;;12121:4;12114:11;;;;11795:679;12272:19;;-1:-1:-1;;12272:19:0;;;;12310:18;;:35;;;;;;12364:39;12392:10;12364:27;:39::i;:::-;12422:36;;;12435:10;12422:36;;;;;;;;;;;;;;;;;;;;;10204:2288;;;;;:::o;14421:259::-;14493:11;;14507:1;-1:-1:-1;14486:23:0;;;;14527:11;;15054:3;-1:-1:-1;14527:26:0;14520:34;;;;14572:8;:11;-1:-1:-1;;;;;14572:11:0;:16;14565:24;;;;14612:20;;14607:25;;;;:64;;;14660:11;;14636:20;;:35;;14607:64;14600:72;;;;;;14421:259::o;13524:362::-;13577:11;13671:6;2957:19;2965:10;2957:7;:19::i;:::-;2949:28;;;;;;;;-1:-1:-1;;13591:24:0;:31;13680:1;13666:171;13687:6;13683:1;:10;13666:171;;;13719:24;:27;;13744:1;;13719:27;;;;;;;;;;;;;;;;:32;13715:110;;13777:19;:48;13797:24;13822:1;13797:27;;;;;;;;;;;;;;;;;;;;;;13777:48;;;;;;;;;;;;13770:55;;;;;;;;;;;;13715:110;13695:3;;13666:171;;;13847:31;13854:24;;13847:31;:::i;:::-;13524:362;;:::o;13894:169::-;13958:4;13982:15;;;;;:44;;;15054:3;14001:10;:25;;13982:44;13975:52;;;;;;-1:-1:-1;14045:10:0;13894:169::o;12641:875::-;12700:1;12712:797;12726:11;;12719:4;:18;12712:797;;;12831:56;12845:11;;12838:4;:18;:41;;;;-1:-1:-1;12860:8:0;12869:4;12860:14;;;;;;;;;-1:-1:-1;;;;;12860:14:0;:19;;12838:41;12831:56;;;12881:6;;12831:56;;;12991:1;12977:11;;:15;:45;;;;-1:-1:-1;13005:11:0;;12996:8;;:21;;;;;;;;;-1:-1:-1;;;;;12996:21:0;:26;12977:45;12970:67;;;13024:11;:13;;-1:-1:-1;;13024:13:0;;;12970:67;;;13150:11;;13143:4;:18;:48;;;;-1:-1:-1;13174:11:0;;13165:8;;:21;;;;;;;;;-1:-1:-1;;;;;13165:21:0;:26;;13143:48;:71;;;;-1:-1:-1;13195:8:0;13204:4;13195:14;;;;;;;;;-1:-1:-1;;;;;13195:14:0;:19;13143:71;13139:359;;;13372:11;;13363:8;;:21;;;;;;;;;-1:-1:-1;;;;;13363:21:0;13346:8;13355:4;13363:21;13346:14;;;;;;;:38;;-1:-1:-1;;13346:38:0;-1:-1:-1;;;;;13346:38:0;;;;;;;;;;13434:4;13403:12;-1:-1:-1;13416:8:0;13434:4;13346:38;13416:14;;;;;;;;-1:-1:-1;;;;;13416:14:0;13403:28;;;;;;;;;;;13416:14;13403:28;;;:35;;;;13416:14;13466:11;13457:8;;13416:14;13457:21;;;;;;;:25;;-1:-1:-1;;13457:25:0;-1:-1:-1;;;;;13457:25:0;;;;;;;;;;13139:359;12712:797;;35843:768;-1:-1:-1;;;;;35940:15:0;;36190:14;35940:15;;;:8;:15;;;;;;36190:14;;35940:33;-1:-1:-1;35936:59:0;;35988:7;;35936:59;36157:14;36128:25;36147:5;36128:18;:25::i;:::-;:43;;36120:52;;;;;;36207:1;36190:18;;36185:365;-1:-1:-1;;;;;36222:21:0;;;;;;:14;:21;;;;;:28;36210:40;;36185:365;;;36284:39;36306:5;36313:9;36284:21;:39::i;:::-;36280:259;;;-1:-1:-1;;;;;36358:21:0;;;;;;:14;:21;;;;;:32;;36380:9;;36358:32;;;;;;;;;;;;;;;;;;;;;:39;-1:-1:-1;;;;;36416:21:0;;;;:14;:21;;;;;;:32;;36358:39;;-1:-1:-1;36416:21:0;36438:9;;36416:32;;;;;;;;;;;;;;;;;;;;;:43;;;;-1:-1:-1;;;;;36496:15:0;;;;:8;:15;;;;;;;:27;;36516:6;36496:27;:19;:27;:::i;:::-;-1:-1:-1;;;;;36478:15:0;;;;;;:8;:15;;;;;:45;36280:259;36252:11;;;;;36185:365;;;-1:-1:-1;;;;;36569:15:0;;;;;;:8;:15;;;;;;:33;-1:-1:-1;36569:33:0;36562:41;;;18589:449;18671:4;-1:-1:-1;;;;;18692:17:0;;;;18684:26;;;;;;-1:-1:-1;;;;;18735:15:0;;;;;;:8;:15;;;;;;18725:25;;;18717:34;;;;;;-1:-1:-1;;;;;18776:14:0;;;;;;:7;:14;;;;;;;;18791:10;18776:26;;;;;;;;18766:36;;;18758:45;;;;;;-1:-1:-1;;;;;18830:15:0;;;;;;:8;:15;;;;;;:27;;18850:6;18830:27;:19;:27;:::i;:::-;-1:-1:-1;;;;;18812:15:0;;;;;;;:8;:15;;;;;;:45;;;;18880:13;;;;;;;:25;;18898:6;18880:25;:17;:25;:::i;:::-;-1:-1:-1;;;;;18864:13:0;;;;;;;:8;:13;;;;;;;;:41;;;;18941:14;;;;;:7;:14;;;;;18956:10;18941:26;;;;;;;:38;;18972:6;18941:38;:30;:38;:::i;:::-;-1:-1:-1;;;;;18912:14:0;;;;;;;:7;:14;;;;;;;;18927:10;18912:26;;;;;;;;:67;;;;18986:28;;;;;;;;;;;18912:14;;-1:-1:-1;;;;;;;;;;;18986:28:0;;;;;;;;;;-1:-1:-1;19028:4:0;18589:449;;;;;:::o;33627:487::-;-1:-1:-1;;;;;33786:21:0;;33738:4;33786:21;;;:14;:21;;;;;:32;;33738:4;;33786:21;33808:9;;33786:32;;;;;;;;;;;;;;;;33760:58;;33853:9;:7;:9::i;:::-;33838:11;;;;-1:-1:-1;;;;;33838:11:0;33833:29;33829:60;;;33884:5;33877:12;;;;33829:60;33911:11;;33906:16;33902:66;;;33963:5;33956:12;;;;33902:66;33999:18;;;;33985:33;;33999:18;;;-1:-1:-1;;;;;33999:18:0;33985:13;:33::i;:::-;:70;;;;-1:-1:-1;34023:13:0;;:32;;;;;;-1:-1:-1;;;;;34023:32:0;;;;;;;;;:13;;;;;:25;;:32;;;;;;;;;;;;;;:13;;:32;;;5:2:-1;;;;30:1;27;20:12;5:2;34023:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;34023:32:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;34023:32:0;34022:33;33985:70;33981:101;;;34077:5;34070:12;;;;33981:101;-1:-1:-1;34102:4:0;;33627:487;-1:-1:-1;;;33627:487:0:o;1391:133::-;1449:7;1477:5;;;1496:6;;;;1489:14;;;17775:404;17840:4;17877:10;17908:11;;;17900:20;;;;;;-1:-1:-1;;;;;17950:14:0;;;;;;:8;:14;;;;;;17939:25;;;17931:34;;;;;;17992:11;;:24;;18008:7;17992:24;:15;:24;:::i;:::-;17978:11;:38;-1:-1:-1;;;;;18044:14:0;;;;;;:8;:14;;;;;;:27;;18063:7;18044:27;:18;:27;:::i;:::-;-1:-1:-1;;;;;18027:14:0;;;;;;:8;:14;;;;;;;;;:44;;;;18082:19;;;;;;;18027:14;;18082:19;;;;;;;;;18112:35;;;;;;;;18135:1;;-1:-1:-1;;;;;18112:35:0;;;-1:-1:-1;;;;;;;;;;;18112:35:0;;;;;;;;-1:-1:-1;18167:4:0;;17775:404;-1:-1:-1;;17775:404:0:o;32505:103::-;-1:-1:-1;;;;;32584:16:0;32560:4;32584:16;;;:7;:16;;;;;;;;;32505:103::o;1272:113::-;1330:7;1353:6;;;;1346:14;;;;-1:-1:-1;1374:5:0;;;1272:113::o;34190:996::-;34360:21;;;;34310:3;-1:-1:-1;;;;;1850:18:0;;;;1842:27;;;;;;34336:6;22907:10;22901:2;:16;;:36;;;;;22927:10;22921:2;:16;;22901:36;22893:45;;;;;;;;34392:6;34360:39;;34441:28;34455:13;34441;:28::i;:::-;34410:59;;34499:56;34514:3;34519:13;34534:20;34499:14;:56::i;:::-;-1:-1:-1;;;;;34639:19:0;;;;;;:14;:19;;;;;:26;34482:73;;-1:-1:-1;34626:39:0;;34622:315;;;-1:-1:-1;;;;;34682:19:0;;;;;;:14;:19;;;;;:28;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;34738:19:0;;;;;;:14;:19;;;;;:30;;34758:9;;34738:30;;;;;;;;;;;;;;;;;;;34795:17;;34738:30;;-1:-1:-1;34790:22:0;34783:30;;;;34830:17;;;:33;;-1:-1:-1;;;;;34878:47:0;;;;;34830:33;;;-1:-1:-1;;34830:33:0;;;;;;;34878:47;;;;34622:315;-1:-1:-1;;;;;34981:19:0;;;;;;:14;:19;;;;;:30;;35001:9;;34981:30;;;;;;;;;;;;;;;;;;;35029:17;;;;34981:30;;-1:-1:-1;;;;;;35029:34:0;;;:17;;:34;:86;;;;-1:-1:-1;35067:24:0;;;;-1:-1:-1;;;;;35067:48:0;;;:24;;;;;:48;35029:86;35022:94;;;;;;35149:17;;:29;;35171:6;35149:29;:21;:29;:::i;:::-;35129:49;;;-1:-1:-1;;;;;;;;;34190:996:0:o;16758:388::-;16821:4;-1:-1:-1;;;;;16842:17:0;;;;16834:26;;;;;;16894:10;16885:20;;;;:8;:20;;;;;;16875:30;;;16867:39;;;;;;17011:10;17002:20;;;;:8;:20;;;;;;:32;;17027:6;17002:32;:24;:32;:::i;:::-;16988:10;16979:20;;;;:8;:20;;;;;;:55;;;;-1:-1:-1;;;;;17057:13:0;;;;;;:25;;17075:6;17057:25;:17;:25;:::i;:::-;-1:-1:-1;;;;;17041:13:0;;;;;;:8;:13;;;;;;;;;:41;;;;17089:33;;;;;;;17041:13;;17098:10;;-1:-1:-1;;;;;;;;;;;17089:33:0;;;;;;;;;-1:-1:-1;17136:4:0;16758:388;;;;:::o;14260:151::-;14333:4;14362:31;;;:19;:31;;;;;:41;14357:46;;;14260:151::o;14071:181::-;-1:-1:-1;;;;;14191:19:0;;14140:4;14191:19;;;:12;:19;;;;;;14140:4;;14175:36;;:15;:36::i;:::-;14229:1;:15;;14071:181;-1:-1:-1;;;14071:181:0:o;14688:311::-;14773:11;14787:31;;;:19;:31;;;;;14841:17;;14836:22;;14829:30;;;;14902:13;;;;14877:24;:39;;14920:10;;14902:13;14877:39;;;;;;;;;;;;;;;;:53;14870:61;;;;14970:20;;14949:17;;:41;;14942:49;;;35252:482;35397:14;35577:23;35373:6;22907:10;22901:2;:16;;:36;;;;;22927:10;22921:2;:16;;22901:36;22893:45;;;;;;;;35414:68;35429:5;35444:6;35453:28;35467:13;35453;:28::i;:::-;35414:14;:68::i;:::-;-1:-1:-1;;;;;35514:21:0;;;;;;:14;:21;;;;;:28;35397:85;;-1:-1:-1;35501:41:0;;;35493:50;;;;;;-1:-1:-1;;;;;35603:21:0;;;;;;:14;:21;;;;;:32;;35625:9;;35603:32;;;;;;;;;;;;;;;;35577:58;;35669:6;35654:4;:11;;;:21;;35646:30;;;;;;;;35703:11;;:23;;35719:6;35703:23;:15;:23;:::i;:::-;35689:37;;;-1:-1:-1;;;;;;35252:482:0:o;36891:127::-;-1:-1:-1;;;;;36983:27:0;;;;36891:127::o;36659:77::-;36725:3;36659:77;:::o;36744:139::-;36809:7;36836:13;:39;;36873:1;36836:39;;;36860:1;36836:39;36829:46;36744:139;-1:-1:-1;;36744:139:0:o;33023:540::-;33164:14;;33196:298;-1:-1:-1;;;;;33228:21:0;;;;;;:14;:21;;;;;:28;33216:40;;33196:298;;;-1:-1:-1;;;;;33319:21:0;;;;;;:14;:21;;;;;:32;;33341:9;;33319:32;;;;;;;;;;;;;;;;;;;33370:18;;;;33319:32;;-1:-1:-1;;;;;;33370:35:0;;;:18;;:35;:88;;;;-1:-1:-1;33409:25:0;;;;-1:-1:-1;;;;;33409:49:0;;;:25;;;;;:49;33370:88;33366:116;;;33477:5;;33366:116;33258:11;;;;;33196:298;;;-1:-1:-1;;;;;33526:21:0;;;;;;:14;:21;;;;;:28;33513:41;;;33506:49;;;22229:15373;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Swarm Source

bzzr://fc47b610eb356fc3dc4495b9edd698fb2c73fb1522e3a97895d976d02a3e4bfa
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.