ETH Price: $2,818.92 (+7.40%)
 

Overview

Max Total Supply

22,041,007.594573207 VokenTB

Holders

379

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Balance
18,435.5589 VokenTB

Value
$0.00
0x7b8145a3b2a3ddcc56aec4d9acc1538cbb220a6d
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
VokenTB

Compiler Version
v0.7.5+commit.eb77ed08

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, GNU GPLv3 license

Contract Source Code (Solidity Multiple files format)

File 10 of 10: VokenTB.sol
// SPDX-License-Identifier: MIT
pragma solidity =0.7.5;

// Voken TeraByte Main Contract for vnCHAIN (vision.network)
//
// More info:
//   https://voken.io
//
// Contact us:
//   [email protected]


import "LibSafeMath.sol";
import "LibIERC20.sol";
import "LibIVesting.sol";
import "LibAuthVoken.sol";
import "LibBurning.sol";


/**
 * @title VokenTB Main Contract for vnCHAIN
 */
contract VokenTB is IERC20, IVesting, AuthVoken, Burning {
    using SafeMath for uint256;

    struct Account {
        uint256 balance;

        uint160 voken;
        address payable referrer;

        IVesting[] vestingContracts;
        mapping (address => bool) hasVesting;

        mapping (address => uint256) allowances;
    }

    string private _name = "Voken TeraByte";
    string private _symbol = "VokenTB";
    uint8 private constant _decimals = 9;
    uint256 private constant _cap = 210_000_000e9;
    uint256 private _totalSupply;
    uint256 private _vokenCounter;
    bool private _changeVokenAddressAllowed;

    mapping (address => Account) private _accounts;
    mapping (uint160 => address payable) private _voken2address;

    event Mint(address indexed account, uint256 amount);
    event Burn(address indexed account, uint256 amount);
    event Donate(address indexed account, uint256 amount);
    event VokenAddressSet(address indexed account, uint160 voken);
    event ReferrerSet(address indexed account, address indexed referrerAccount);


    /**
     * @dev Donate
     */
    receive()
        external
        payable
    {
        if (msg.value > 0) {
            emit Donate(msg.sender, msg.value);
        }
    }

    /**
     * @dev Sets the full name of VOKEN.
     *
     * Can only be called by the current owner.
     */
    function setName(
        string calldata value
    )
        external
        onlyAgent
    {
        _name = value;
    }

    /**
     * @dev Sets the symbol of VOKEN.
     *
     * Can only be called by the current owner.
     */
    function setSymbol(
        string calldata value
    )
        external
        onlyAgent
    {
        _symbol = value;
    }

    /**
     * @dev Set change Voken address is allowed or not.
     */
    function setChangeVokenAddressAllowed(bool value)
        external
        onlyAgent
    {
        _changeVokenAddressAllowed = value;
    }

    /**
     * @dev Set Voken address by `voken`.
     */
    function setVokenAddress(uint160 voken)
        external
        returns (bool)
    {
        require(balanceOf(msg.sender) > 0, "Set Voken Address: balance is zero");
        require(voken > 0, "Set Voken Address: is zero address");

        if (_accounts[msg.sender].voken > 0) {
            require(_changeVokenAddressAllowed, "Change Voken Address: is not allowed");
            delete _voken2address[voken];
        }

        else {
            _vokenCounter = _vokenCounter.add(1);
        }

        _voken2address[voken] = msg.sender;
        _accounts[msg.sender].voken = voken;

        emit VokenAddressSet(msg.sender, voken);
        return true;
    }

    /**
     * @dev Set referrer.
     */
    function setReferrer(
        uint160 referrerVoken
    )
        external
        returns (bool)
    {
        address payable referrer_ = _voken2address[referrerVoken];

        require(referrer_ != address(0), "Set referrer: does not exist");
        require(_accounts[msg.sender].referrer == address(0), "Set referrer: was already exist");

        _accounts[msg.sender].referrer = referrer_;
        emit ReferrerSet(msg.sender, referrer_);
        return true;
    }

    /**
     * @dev Returns the full name of VOKEN.
     */
    function name()
        public
        view
        override
        returns (string memory)
    {
        return _name;
    }

    /**
     * @dev Returns the symbol of VOKEN.
     */
    function symbol()
        public
        view
        override
        returns (string memory)
    {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     */
    function decimals()
        public
        pure
        override
        returns (uint8)
    {
        return _decimals;
    }

    /**
     * @dev Returns the cap on VOKEN's total supply.
     */
    function cap()
        public
        pure
        returns (uint256)
    {
        return _cap;
    }

    /**
     * @dev Returns the amount of VOKEN in existence.
     */
    function totalSupply()
        public
        view
        override
        returns (uint256)
    {
        return _totalSupply;
    }

    /**
     * @dev Returns the amount of VOKEN owned by `account`.
     */
    function balanceOf(
        address account
    )
        public
        view
        override
        returns (uint256)
    {
        return _accounts[account].balance;
    }

    /**
     * @dev Returns the vesting contracts' addresses on `account`.
     */
    function vestingContracts(
        address account
    )
        public
        view
        returns (IVesting[] memory contracts)
    {
        contracts = _accounts[account].vestingContracts;
    }

    /**
     * @dev Returns `true` if change Voken address is allowed.
     */
    function isChangeVokenAddressAllowed()
        public
        view
        returns (bool)
    {
        return _changeVokenAddressAllowed;
    }

    /**
     * @dev Returns Voken address of `account`.
     */
    function address2voken(
        address account
    )
        public
        view
        returns (uint160)
    {
        return _accounts[account].voken;
    }

    /**
     * @dev Returns address of `voken`.
     */
    function voken2address(
        uint160 voken
    )
        public
        view
        returns (address payable)
    {
        return _voken2address[voken];
    }

    /**
     * @dev Returns amount of Voken address.
     */
    function vokenCounter()
        public
        view
        returns (uint256)
    {
        return _vokenCounter;
    }

    /**
     * @dev Returns the referrer of an `account`.
     */
    function referrer(
        address account
    )
        public
        view
        returns (address payable)
    {
        return _accounts[account].referrer;
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 value)
        public
        override
        onlyNotPaused
        returns (bool)
    {
        _approve(msg.sender, spender, value);
        return true;
    }

    /**
     * @dev Returns the remaining number of VOKEN that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}.
     * This is zero by default.
     */
    function allowance(
        address owner,
        address spender
    )
        public
        override
        view
        returns (uint256)
    {
        return _accounts[owner].allowances[spender];
    }

    /**
     * @dev Returns the vesting amount of VOKEN by `account`.
     */
    function vestingOf(
        address account
    )
        public
        override
        view
        returns (uint256 reserved)
    {
        for (uint256 i = 0; i < _accounts[account].vestingContracts.length; i++) {
            if (
                _accounts[account].vestingContracts[i] != IVesting(0)
                &&
                isContract(address(_accounts[account].vestingContracts[i]))
            ) {
                try _accounts[account].vestingContracts[i].vestingOf(account) returns (uint256 value) {
                    reserved = reserved.add(value);
                }
    
                catch {
                    //
                }
            }
        }
    }

    /**
     * @dev Returns the available amount of VOKEN by `account` and a certain `amount`.
     */
    function availableOf(
        address account
    )
        public
        view
        returns (uint256)
    {
        return balanceOf(account).sub(vestingOf(account));
    }

    /**
     * @dev Destroys `amount` VOKEN from the caller.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     */
    function burn(
        uint256 amount
    )
        public
        returns (bool)
    {
        require(amount > 0, "Burn: amount is zero");

        uint256 balance = balanceOf(msg.sender);
        require(balance > 0, "Burn: balance is zero");

        if (balance >= amount) {
            _burn(msg.sender, amount);
        }
        
        else {
            _burn(msg.sender, balance);
        }

        return true;
    }

    /**
     * @dev Creates `amount` VOKEN and assigns them to `account`.
     *
     * Can only be called by a minter.
     */
    function mint(
        address account,
        uint256 amount
    )
        public
        onlyNotPaused
        onlyMinter
        returns (bool)
    {
        require(amount > 0, "Mint: amount is zero");

        _mint(account, amount);
        return true;
    }

    /**
     * @dev Creates `amount` VOKEN and assigns them to `account` with an `vestingContract`
     *
     * Can only be called by a minter.
     */
    function mintWithVesting(
        address account,
        uint256 amount,
        address vestingContract
    )
        public
        onlyNotPaused
        onlyMinter
        returns (bool)
    {
        require(amount > 0, "Mint: amount is zero");
        require(vestingContract != address(this), "Mint, vesting address is the token address");

        _mintWithVesting(account, amount, vestingContract);
        return true;
    }

    /**
     * @dev Moves `amount` VOKEN from the caller's account to `recipient`.
     *
     * Auto handle {WhitelistSignUp} when `amount` is a specific value.
     * Auto handle {Burn} when `recipient` is `address(0)`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(
        address recipient,
        uint256 amount
    )
        public
        override
        onlyNotPaused
        returns (bool)
    {
        require(amount > 0, "Transfer: amount is zero");

        // Burn
        if (recipient == address(0)) {
            uint256 balance = balanceOf(msg.sender);
            require(balance > 0, "Transfer: balance is zero");

            if (amount <= balance) {
                _burn(msg.sender, amount);
            }

            else {
                _burn(msg.sender, balance);
            }
        }

        // Transfer
        else {
            uint256 available = availableOf(msg.sender);
            require(available > 0, "Transfer: available balance is zero");
            require(amount <= available, "Transfer: insufficient available balance");
            
            _transfer(msg.sender, recipient, amount);
        }

        return true;
    }

    /**
     * @dev Moves `amount` VOKEN from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Auto handle {Burn} when `recipient` is `address(0)`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     * Emits an {Approval} event indicating the updated allowance.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    )
        public
        override
        onlyNotPaused
        returns (bool)
    {
        require(amount > 0, "TransferFrom: amount is zero");

        // Burn
        if (recipient == address(0)) {
            uint256 balance = balanceOf(sender);
            require(balance > 0, "Transfer: balance is zero");

            if (amount <= balance) {
                _burn(sender, amount);
            }

            else {
                _burn(sender, balance);
            }
        }

        // Normal transfer
        else {
            uint256 available = availableOf(sender);
            require(available > 0, "TransferFrom: available balance is zero");
            require(amount <= available, "TransferFrom: insufficient available balance");
            
            _transfer(sender, recipient, amount);
            _approve(sender, msg.sender, _accounts[sender].allowances[msg.sender].sub(amount, "TransferFrom: amount exceeds allowance"));
        }

        return true;
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner`s VOKEN.
     *
     * Emits an {Approval} event.
     */
    function _approve(
        address owner,
        address spender,
        uint256 value
    )
        private
    {
        require(owner != address(0), "Approve: from the zero address");
        require(spender != address(0), "Approve: to the zero address");

        _accounts[owner].allowances[spender] = value;
        emit Approval(owner, spender, value);
    }

    /**
     * @dev Destroys `amount` VOKEN from `account`, reducing the total supply.
     *
     * Emits a {Burn} event.
     * Emits a {Transfer} event with `to` set to the zero address.
     */
    function _burn(
        address account,
        uint256 amount
    )
        private
    {
        _accounts[account].balance = _accounts[account].balance.sub(amount, "Burn: insufficient balance");
        _totalSupply = _totalSupply.sub(amount, "Burn: amount exceeds total supply");
        emit Burn(account, amount);
        emit Transfer(account, address(0), amount);
    }

    /**
     * @dev Creates `amount` VOKEN and assigns them to `account`, increasing the total supply.
     *
     * Emits a {Mint} event.
     * Emits a {Transfer} event with `from` set to the zero address.
     */
    function _mint(
        address account,
        uint256 amount
    )
        private
    {
        uint256 total = _totalSupply.add(amount);

        require(total <= _cap, "Mint: total supply cap exceeded");
        require(account != address(0), "Mint: to the zero address");

        _totalSupply = total;
        _accounts[account].balance = _accounts[account].balance.add(amount);
        emit Mint(account, amount);
        emit Transfer(address(0), account, amount);
    }

    /**
     * @dev Creates `amount` VOKEN and assigns them to `account` with an `vestingContract`, increasing the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     */
    function _mintWithVesting(
        address account,
        uint256 amount,
        address vestingContract
    )
        private
    {
        uint256 total = _totalSupply.add(amount);

        require(total <= _cap, "Mint: total supply cap exceeded");
        require(account != address(0), "Mint: to the zero address");

        _totalSupply = total;
        _accounts[account].balance = _accounts[account].balance.add(amount);

        if (!_accounts[account].hasVesting[vestingContract]) {
            _accounts[account].vestingContracts.push(IVesting(vestingContract));
            _accounts[account].hasVesting[vestingContract] = true;
        }

        emit Mint(account, amount);
        emit Transfer(address(0), account, amount);
    }

    /**
     * @dev Moves `amount` VOKEN from `sender` to `recipient`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address sender,
        address recipient,
        uint256 amount
    )
        private
    {
        if (!isBank(sender) && !isBank(recipient)) {
            uint16 permille = burningPermille();

            if (permille > 0) {
                uint256 amountBurn = amount.mul(permille).div(1_000);
                uint256 amountTransfer = amount.sub(amountBurn);
    
                _accounts[sender].balance = _accounts[sender].balance.sub(amountTransfer, "Transfer: insufficient balance");
                _accounts[recipient].balance = _accounts[recipient].balance.add(amountTransfer);
                emit Transfer(sender, recipient, amountTransfer);
    
                _burn(sender, amountBurn);
                
                return;
            }
        }

        _accounts[sender].balance = _accounts[sender].balance.sub(amount, "Transfer: insufficient balance");
        _accounts[recipient].balance = _accounts[recipient].balance.add(amount);
        emit Transfer(sender, recipient, amount);
    }

    /**
     * @dev Returns true if the `account` is a contract.
     */
    function isContract(address account)
        private
        view
        returns (bool)
    {
        uint256 size;
        assembly { size := extcodesize(account) }
        return size > 0;
    }
}

File 1 of 10: LibAuthPause.sol
// SPDX-License-Identifier: MIT
pragma solidity =0.7.5;

import "LibBaseAuth.sol";


/**
 * @dev Auth pause.
 */
contract AuthPause is BaseAuth {
    using Roles for Roles.Role;

    bool private _paused = false;

    event PausedON();
    event PausedOFF();


    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     */
    modifier onlyNotPaused() {
        require(!_paused, "Paused");
        _;
    }

    /**
     * @return Returns true if the contract is paused, false otherwise.
     */
    function isPaused()
        public
        view
        returns (bool)
    {
        return _paused;
    }

    /**
     * @dev Sets paused state.
     *
     * Can only be called by the current owner.
     */
    function setPaused(bool value)
        external
        onlyAgent
    {
        _paused = value;

        if (_paused) {
            emit PausedON();
        } else {
            emit PausedOFF();
        }
    }
}

File 2 of 10: LibAuthProxy.sol
// SPDX-License-Identifier: MIT
pragma solidity =0.7.5;

import "LibBaseAuth.sol";


/**
 * @dev Auth proxy.
 */
contract AuthProxy is BaseAuth {
    using Roles for Roles.Role;

    Roles.Role private _proxies;
    
    event ProxyAdded(address indexed account);
    event ProxyRemoved(address indexed account);


    /**
     * @dev Throws if called by account which is not a proxy.
     */
    modifier onlyProxy() {
        require(isProxy(msg.sender), "ProxyRole: caller does not have the Proxy role");
        _;
    }

    /**
     * @dev Returns true if the `account` has the Proxy role.
     */
    function isProxy(address account)
        public
        view
        returns (bool)
    {
        return _proxies.has(account);
    }

    /**
     * @dev Give an `account` access to the Proxy role.
     *
     * Can only be called by the current owner.
     */
    function addProxy(address account)
        public
        onlyAgent
    {
        _proxies.add(account);
        emit ProxyAdded(account);
    }

    /**
     * @dev Remove an `account` access from the Proxy role.
     *
     * Can only be called by the current owner.
     */
    function removeProxy(address account)
        public
        onlyAgent
    {
        _proxies.remove(account);
        emit ProxyRemoved(account);
    }
}

File 3 of 10: LibAuthVoken.sol
// SPDX-License-Identifier: MIT
pragma solidity =0.7.5;

import "LibBaseAuth.sol";
import "LibAuthPause.sol";
import "LibAuthProxy.sol";


contract AuthVoken is BaseAuth, AuthPause, AuthProxy {
    using Roles for Roles.Role;

    Roles.Role private _banks;
    Roles.Role private _minters;

    event BankAdded(address indexed account);
    event BankRemoved(address indexed account);
    event MinterAdded(address indexed account);
    event MinterRemoved(address indexed account);


    /**
     * @dev Throws if called by account which is not a minter.
     */
    modifier onlyMinter()
    {
        require(isMinter(msg.sender), "MinterRole: caller does not have the Minter role");
        _;
    }

    /**
     * @dev Returns true if the `account` has the Bank role.
     */
    function isBank(address account)
        public
        view
        returns (bool)
    {
        return _banks.has(account);
    }

    /**
     * @dev Give an `account` access to the Bank role.
     *
     * Can only be called by the current owner.
     */
    function addBank(address account)
        public
        onlyAgent
    {
        _banks.add(account);
        emit BankAdded(account);
    }

    /**
     * @dev Remove an `account` access from the Bank role.
     *
     * Can only be called by the current owner.
     */
    function removeBank(address account)
        public
        onlyAgent
    {
        _banks.remove(account);
        emit BankRemoved(account);
    }

    /**
     * @dev Returns true if the `account` has the Minter role
     */
    function isMinter(address account)
        public
        view
        returns (bool)
    {
        return _minters.has(account);
    }

    /**
     * @dev Give an `account` access to the Minter role.
     *
     * Can only be called by the current owner.
     */
    function addMinter(address account)
        public
        onlyAgent
    {
        _minters.add(account);
        emit MinterAdded(account);
    }

    /**
     * @dev Remove an `account` access from the Minter role.
     *
     * Can only be called by the current owner.
     */
    function removeMinter(address account)
        public
        onlyAgent
    {
        _minters.remove(account);
        emit MinterRemoved(account);
    }
}

File 4 of 10: LibBaseAuth.sol
// SPDX-License-Identifier: MIT
pragma solidity =0.7.5;

import "LibRoles.sol";
import "LibIERC20.sol";


/**
 * @dev Base auth.
 */
contract BaseAuth {
    using Roles for Roles.Role;

    Roles.Role private _agents;

    event AgentAdded(address indexed account);
    event AgentRemoved(address indexed account);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor ()
    {
        _agents.add(msg.sender);
        emit AgentAdded(msg.sender);
    }

    /**
     * @dev Throws if called by account which is not an agent.
     */
    modifier onlyAgent() {
        require(isAgent(msg.sender), "AgentRole: caller does not have the Agent role");
        _;
    }

    /**
     * @dev Rescue compatible ERC20 Token
     *
     * Can only be called by an agent.
     */
    function rescueToken(
        address tokenAddr,
        address recipient,
        uint256 amount
    )
        external
        onlyAgent
    {
        IERC20 _token = IERC20(tokenAddr);
        require(recipient != address(0), "Rescue: recipient is the zero address");
        uint256 balance = _token.balanceOf(address(this));

        require(balance >= amount, "Rescue: amount exceeds balance");
        _token.transfer(recipient, amount);
    }

    /**
     * @dev Withdraw Ether
     *
     * Can only be called by an agent.
     */
    function withdrawEther(
        address payable recipient,
        uint256 amount
    )
        external
        onlyAgent
    {
        require(recipient != address(0), "Withdraw: recipient is the zero address");
        uint256 balance = address(this).balance;
        require(balance >= amount, "Withdraw: amount exceeds balance");
        recipient.transfer(amount);
    }

    /**
     * @dev Returns true if the `account` has the Agent role.
     */
    function isAgent(address account)
        public
        view
        returns (bool)
    {
        return _agents.has(account);
    }

    /**
     * @dev Give an `account` access to the Agent role.
     *
     * Can only be called by an agent.
     */
    function addAgent(address account)
        public
        onlyAgent
    {
        _agents.add(account);
        emit AgentAdded(account);
    }

    /**
     * @dev Remove an `account` access from the Agent role.
     *
     * Can only be called by an agent.
     */
    function removeAgent(address account)
        public
        onlyAgent
    {
        _agents.remove(account);
        emit AgentRemoved(account);
    }
}


File 5 of 10: LibBurning.sol
// SPDX-License-Identifier: MIT
pragma solidity =0.7.5;


import "LibSafeMath.sol";
import "LibBaseAuth.sol";


/**
 * @dev Burning.
 */
contract Burning is BaseAuth {
    using SafeMath for uint256;

    uint16 private _burningPermilleMin;
    uint16 private _burningPermilleMax;
    uint16 private _burningPermilleMod;

    constructor () {
        _burningPermilleMin = 10;
        _burningPermilleMax = 30;
        _burningPermilleMod = 21;
    }

    /**
     * @dev Sets the burning border from `min` and `max`.
     */
    function setBurningBorder(
        uint16 min,
        uint16 max
    )
        external
        onlyAgent
    {
        require(min <= 1000, "Set burning border: min exceeds 100.0%");
        require(max <= 1000, "Set burning border: max exceeds 100.0%");
        require(min <= max, 'Set burning border: min exceeds max');

        _burningPermilleMin = min;
        _burningPermilleMax = max;
        _burningPermilleMod = _burningPermilleMax - _burningPermilleMin + 1;
    }

    /**
     * @dev Returns the min/max value of burning permille.
     */
    function burningPermilleBorder()
        public
        view
        returns (uint16 min, uint16 max)
    {
        min = _burningPermilleMin;
        max = _burningPermilleMax;
    }

    /**
     * @dev Returns {value} of burning permille.
     */
    function burningPermille()
        public
        view
        returns (uint16)
    {
        if (_burningPermilleMax == 0)
            return 0;

        if (_burningPermilleMin == _burningPermilleMax)
            return _burningPermilleMin;

        return uint16(uint256(keccak256(abi.encode(blockhash(block.number - 1)))).mod(_burningPermilleMod).add(_burningPermilleMin));
    }
}

File 6 of 10: LibIERC20.sol
// SPDX-License-Identifier: MIT
pragma solidity =0.7.5;


/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
    function decimals() external view returns (uint8);
    function totalSupply() external view returns (uint256);
    function allowance(address owner, address spender) external view returns (uint256);
    function balanceOf(address account) external view returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
    function transfer(address recipient, uint256 amount) external returns (bool);
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

    event Approval(address indexed owner, address indexed spender, uint256 value);
    event Transfer(address indexed from, address indexed to, uint256 value);
}

File 7 of 10: LibIVesting.sol
// SPDX-License-Identifier: MIT
pragma solidity =0.7.5;


/**
 * @dev Interface of an vesting contract.
 */
interface IVesting {
    function vestingOf(address account) external view returns (uint256);
}

File 8 of 10: LibRoles.sol
// SPDX-License-Identifier: MIT
pragma solidity =0.7.5;


/**
 * @dev Library for managing addresses assigned to a Role.
 */
library Roles {
    struct Role
    {
        mapping (address => bool) bearer;
    }

    /**
     * @dev Give an account access to this role.
     */
    function add(
        Role storage role,
        address account
    )
        internal
    {
        require(!has(role, account), "Roles: account already has role");
        role.bearer[account] = true;
    }

    /**
     * @dev Remove an account's access to this role.
     */
    function remove(
        Role storage role,
        address account
    )
        internal
    {
        require(has(role, account), "Roles: account does not have role");
        role.bearer[account] = false;
    }

    /**
     * @dev Check if an account has this role.
     *
     * @return bool
     */
    function has(
        Role storage role,
        address account
    )
        internal
        view
        returns (bool)
    {
        require(account != address(0), "Roles: account is the zero address");
        return role.bearer[account];
    }
}

File 9 of 10: LibSafeMath.sol
// SPDX-License-Identifier: MIT
pragma solidity =0.7.5;


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

        return c;
    }

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

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

        return c;
    }

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

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

        return c;
    }

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

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

        return c;
    }

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

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

Contract Security Audit

Contract ABI

[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"AgentAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"AgentRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"BankAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"BankRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Donate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"MinterAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"MinterRemoved","type":"event"},{"anonymous":false,"inputs":[],"name":"PausedOFF","type":"event"},{"anonymous":false,"inputs":[],"name":"PausedON","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"ProxyAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"ProxyRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"referrerAccount","type":"address"}],"name":"ReferrerSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint160","name":"voken","type":"uint160"}],"name":"VokenAddressSet","type":"event"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addAgent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addBank","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addProxy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"address2voken","outputs":[{"internalType":"uint160","name":"","type":"uint160"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"availableOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"burningPermille","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burningPermilleBorder","outputs":[{"internalType":"uint16","name":"min","type":"uint16"},{"internalType":"uint16","name":"max","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isAgent","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isBank","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isChangeVokenAddressAllowed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isProxy","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"vestingContract","type":"address"}],"name":"mintWithVesting","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"referrer","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"removeAgent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"removeBank","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"removeMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"removeProxy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddr","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"rescueToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"min","type":"uint16"},{"internalType":"uint16","name":"max","type":"uint16"}],"name":"setBurningBorder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"setChangeVokenAddressAllowed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"value","type":"string"}],"name":"setName","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint160","name":"referrerVoken","type":"uint160"}],"name":"setReferrer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"value","type":"string"}],"name":"setSymbol","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint160","name":"voken","type":"uint160"}],"name":"setVokenAddress","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"vestingContracts","outputs":[{"internalType":"contract IVesting[]","name":"contracts","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"vestingOf","outputs":[{"internalType":"uint256","name":"reserved","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint160","name":"voken","type":"uint160"}],"name":"voken2address","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vokenCounter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawEther","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

6001805460ff1916905560c0604052600e60808190526d566f6b656e20546572614279746560901b60a09081526200003b9160069190620001dd565b50604080518082019091526007808252662b37b5b2b72a2160c91b60209092019182526200006a9181620001dd565b503480156200007857600080fd5b5062000094336000620000f060201b620025c11790919060201c565b60405133907ff68e73cec97f2d70aa641fb26e87a4383686e2efacb648f2165aeb02ac562ec590600090a260058054600a61ffff199091161763ffff00001916621e00001761ffff60201b191664150000000017905562000289565b620000fc828262000174565b156200014f576040805162461bcd60e51b815260206004820152601f60248201527f526f6c65733a206163636f756e7420616c72656164792068617320726f6c6500604482015290519081900360640190fd5b6001600160a01b0316600090815260209190915260409020805460ff19166001179055565b60006001600160a01b038216620001bd5760405162461bcd60e51b81526004018080602001828103825260228152602001806200383a6022913960400191505060405180910390fd5b506001600160a01b03166000908152602091909152604090205460ff1690565b828054600181600116156101000203166002900490600052602060002090601f01602090048101928262000215576000855562000260565b82601f106200023057805160ff191683800117855562000260565b8280016001018555821562000260579182015b828111156200026057825182559160200191906001019062000243565b506200026e92915062000272565b5090565b5b808211156200026e576000815560010162000273565b6135a180620002996000396000f3fe6080604052600436106102765760003560e01c80637dceaed31161014f578063a9059cbb116100c1578063c47f00271161007a578063c47f002714610b0f578063d546da9014610b8c578063dd62ed3e14610bbf578063e5711e8b14610bfa578063ec676a4914610c3d578063ecbc509514610c70576102ba565b8063a9059cbb146109ab578063aa271e1a146109e4578063b187bd2614610a17578063b84c824614610a2c578063be116c3b14610aa9578063c47cfca114610adc576102ba565b806395d89b411161011357806395d89b411461088d5780639649650c146108a257806397a6278e146108d5578063983b2d56146109085780639fec3c5b1461093b578063a68e4d4414610975576102ba565b80637dceaed3146107b357806384e79842146107df5780638cf304b714610812578063915be5cb14610827578063947223971461085a576102ba565b8063313ce567116101e857806342966c68116101ac57806342966c681461068b5780634567d36a146106b5578063522f6815146106e8578063533b134d1461072157806370a082311461074d5780637950537d14610780576102ba565b8063313ce5671461057a578063355274ea146105a557806337915874146105ba5780633ccda4f71461063d57806340c10f1914610652576102ba565b80631ffbb0641161023a5780631ffbb0641461043857806323b11d8d1461046b57806323b872dd1461049e57806329710388146104e15780632cf003c2146105145780633092afd514610547576102ba565b806306fdde03146102bf578063095ea7b31461034957806316c38b3c1461039657806318160ddd146103c257806318e7d8db146103e9576102ba565b366102ba5734156102b85760408051348152905133917f0553260a2e46b0577270d8992db02d30856ca880144c72d6e9503760946aef13919081900360200190a25b005b600080fd5b3480156102cb57600080fd5b506102d4610cb3565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561030e5781810151838201526020016102f6565b50505050905090810190601f16801561033b5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561035557600080fd5b506103826004803603604081101561036c57600080fd5b506001600160a01b038135169060200135610d4a565b604080519115158252519081900360200190f35b3480156103a257600080fd5b506102b8600480360360208110156103b957600080fd5b50351515610da3565b3480156103ce57600080fd5b506103d7610e5a565b60408051918252519081900360200190f35b3480156103f557600080fd5b5061041c6004803603602081101561040c57600080fd5b50356001600160a01b0316610e60565b604080516001600160a01b039092168252519081900360200190f35b34801561044457600080fd5b506103826004803603602081101561045b57600080fd5b50356001600160a01b0316610e81565b34801561047757600080fd5b506102b86004803603602081101561048e57600080fd5b50356001600160a01b0316610e8d565b3480156104aa57600080fd5b50610382600480360360608110156104c157600080fd5b506001600160a01b03813581169160208101359091169060400135610f13565b3480156104ed57600080fd5b506103826004803603602081101561050457600080fd5b50356001600160a01b0316611135565b34801561052057600080fd5b5061041c6004803603602081101561053757600080fd5b50356001600160a01b0316611142565b34801561055357600080fd5b506102b86004803603602081101561056a57600080fd5b50356001600160a01b0316611163565b34801561058657600080fd5b5061058f6111e9565b6040805160ff9092168252519081900360200190f35b3480156105b157600080fd5b506103d76111ee565b3480156105c657600080fd5b506105ed600480360360208110156105dd57600080fd5b50356001600160a01b03166111fa565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610629578181015183820152602001610611565b505050509050019250505060405180910390f35b34801561064957600080fd5b50610382611273565b34801561065e57600080fd5b506103826004803603604081101561067557600080fd5b506001600160a01b03813516906020013561127c565b34801561069757600080fd5b50610382600480360360208110156106ae57600080fd5b503561135a565b3480156106c157600080fd5b50610382600480360360208110156106d857600080fd5b50356001600160a01b0316611421565b3480156106f457600080fd5b506102b86004803603604081101561070b57600080fd5b506001600160a01b03813516906020013561155e565b34801561072d57600080fd5b50610736611679565b6040805161ffff9092168252519081900360200190f35b34801561075957600080fd5b506103d76004803603602081101561077057600080fd5b50356001600160a01b031661170e565b34801561078c57600080fd5b5061041c600480360360208110156107a357600080fd5b50356001600160a01b0316611729565b3480156107bf57600080fd5b506102b8600480360360208110156107d657600080fd5b50351515611747565b3480156107eb57600080fd5b506102b86004803603602081101561080257600080fd5b50356001600160a01b031661179e565b34801561081e57600080fd5b506103d7611824565b34801561083357600080fd5b506103826004803603602081101561084a57600080fd5b50356001600160a01b031661182a565b34801561086657600080fd5b506102b86004803603602081101561087d57600080fd5b50356001600160a01b03166119db565b34801561089957600080fd5b506102d4611a61565b3480156108ae57600080fd5b506102b8600480360360208110156108c557600080fd5b50356001600160a01b0316611ac2565b3480156108e157600080fd5b506102b8600480360360208110156108f857600080fd5b50356001600160a01b0316611b48565b34801561091457600080fd5b506102b86004803603602081101561092b57600080fd5b50356001600160a01b0316611bce565b34801561094757600080fd5b50610950611c54565b604051808361ffff1681526020018261ffff1681526020019250505060405180910390f35b34801561098157600080fd5b506102b86004803603604081101561099857600080fd5b5061ffff81358116916020013516611c69565b3480156109b757600080fd5b50610382600480360360408110156109ce57600080fd5b506001600160a01b038135169060200135611dd4565b3480156109f057600080fd5b5061038260048036036020811015610a0757600080fd5b50356001600160a01b0316611f9f565b348015610a2357600080fd5b50610382611fac565b348015610a3857600080fd5b506102b860048036036020811015610a4f57600080fd5b810190602081018135640100000000811115610a6a57600080fd5b820183602082011115610a7c57600080fd5b80359060200191846001830284011164010000000083111715610a9e57600080fd5b509092509050611fb5565b348015610ab557600080fd5b506102b860048036036020811015610acc57600080fd5b50356001600160a01b031661200a565b348015610ae857600080fd5b506103d760048036036020811015610aff57600080fd5b50356001600160a01b0316612090565b348015610b1b57600080fd5b506102b860048036036020811015610b3257600080fd5b810190602081018135640100000000811115610b4d57600080fd5b820183602082011115610b5f57600080fd5b80359060200191846001830284011164010000000083111715610b8157600080fd5b50909250905061220b565b348015610b9857600080fd5b506103d760048036036020811015610baf57600080fd5b50356001600160a01b031661225b565b348015610bcb57600080fd5b506103d760048036036040811015610be257600080fd5b506001600160a01b0381358116916020013516612278565b348015610c0657600080fd5b506102b860048036036060811015610c1d57600080fd5b506001600160a01b038135811691602081013590911690604001356122a7565b348015610c4957600080fd5b5061038260048036036020811015610c6057600080fd5b50356001600160a01b031661248d565b348015610c7c57600080fd5b5061038260048036036060811015610c9357600080fd5b506001600160a01b0381358116916020810135916040909101351661249a565b60068054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610d3f5780601f10610d1457610100808354040283529160200191610d3f565b820191906000526020600020905b815481529060010190602001808311610d2257829003601f168201915b505050505090505b90565b60015460009060ff1615610d8e576040805162461bcd60e51b815260206004820152600660248201526514185d5cd95960d21b604482015290519081900360640190fd5b610d99338484612642565b5060015b92915050565b610dac33610e81565b610de75760405162461bcd60e51b815260040180806020018281038252602e815260200180613336602e913960400191505060405180910390fd5b6001805460ff1916821515179081905560ff1615610e2d576040517f280482618db6ed39eea4ee1c697fa752b8b32da9e3592f8c981791f19637edee90600090a1610e57565b6040517f882a71d19655cb72d0d6afea987b3341dd9987d8bd32c4dc4cbc484f0c29ac9390600090a15b50565b60085490565b6001600160a01b039081166000908152600b60205260409020600101541690565b6000610d9d818361275e565b610e9633610e81565b610ed15760405162461bcd60e51b815260040180806020018281038252602e815260200180613336602e913960400191505060405180910390fd5b610edc6002826125c1565b6040516001600160a01b038216907f919e434c309b1e05df9dba7a1e2827e10cf511d2eb5330b6fffadf34f0632d0690600090a250565b60015460009060ff1615610f57576040805162461bcd60e51b815260206004820152600660248201526514185d5cd95960d21b604482015290519081900360640190fd5b60008211610fac576040805162461bcd60e51b815260206004820152601c60248201527f5472616e7366657246726f6d3a20616d6f756e74206973207a65726f00000000604482015290519081900360640190fd5b6001600160a01b03831661103e576000610fc58561170e565b905060008111611018576040805162461bcd60e51b81526020600482015260196024820152785472616e736665723a2062616c616e6365206973207a65726f60381b604482015290519081900360640190fd5b80831161102e5761102985846127c5565b611038565b61103885826127c5565b5061112b565b60006110498561225b565b90506000811161108a5760405162461bcd60e51b81526004018080602001828103825260278152602001806135456027913960400191505060405180910390fd5b808311156110c95760405162461bcd60e51b815260040180806020018281038252602c81526020018061341f602c913960400191505060405180910390fd5b6110d48585856128e8565b61112985336111248660405180606001604052806026815260200161351f602691396001600160a01b038b166000908152600b602090815260408083203384526005019091529020549190612b04565b612642565b505b5060019392505050565b6000610d9d60028361275e565b6001600160a01b039081166000908152600b60205260409020600201541690565b61116c33610e81565b6111a75760405162461bcd60e51b815260040180806020018281038252602e815260200180613336602e913960400191505060405180910390fd5b6111b2600482612b9b565b6040516001600160a01b038216907fe94479a9f7e1952cc78f2d6baab678adc1b772d936c6583def489e524cb6669290600090a250565b600990565b6702ea11e32ad5000090565b6001600160a01b0381166000908152600b602090815260409182902060030180548351818402810184019094528084526060939283018282801561126757602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611249575b50505050509050919050565b600a5460ff1690565b60015460009060ff16156112c0576040805162461bcd60e51b815260206004820152600660248201526514185d5cd95960d21b604482015290519081900360640190fd5b6112c933611f9f565b6113045760405162461bcd60e51b81526004018080602001828103825260308152602001806133646030913960400191505060405180910390fd5b60008211611350576040805162461bcd60e51b81526020600482015260146024820152734d696e743a20616d6f756e74206973207a65726f60601b604482015290519081900360640190fd5b610d998383612c02565b60008082116113a7576040805162461bcd60e51b81526020600482015260146024820152734275726e3a20616d6f756e74206973207a65726f60601b604482015290519081900360640190fd5b60006113b23361170e565b905060008111611401576040805162461bcd60e51b81526020600482015260156024820152744275726e3a2062616c616e6365206973207a65726f60581b604482015290519081900360640190fd5b8281106114175761141233846127c5565b610d99565b610d9933826127c5565b6001600160a01b038082166000908152600c602052604081205490911680611490576040805162461bcd60e51b815260206004820152601c60248201527f5365742072656665727265723a20646f6573206e6f7420657869737400000000604482015290519081900360640190fd5b336000908152600b60205260409020600201546001600160a01b0316156114fe576040805162461bcd60e51b815260206004820152601f60248201527f5365742072656665727265723a2077617320616c726561647920657869737400604482015290519081900360640190fd5b336000818152600b602052604080822060020180546001600160a01b0319166001600160a01b03861690811790915590519092917f5f7165288eef601591cf549e15ff19ef9060b7f71b9c115be946fa1fe7ebf68a91a350600192915050565b61156733610e81565b6115a25760405162461bcd60e51b815260040180806020018281038252602e815260200180613336602e913960400191505060405180910390fd5b6001600160a01b0382166115e75760405162461bcd60e51b81526004018080602001828103825260278152602001806133b56027913960400191505060405180910390fd5b478181101561163d576040805162461bcd60e51b815260206004820181905260248201527f57697468647261773a20616d6f756e7420657863656564732062616c616e6365604482015290519081900360640190fd5b6040516001600160a01b0384169083156108fc029084906000818181858888f19350505050158015611673573d6000803e3d6000fd5b50505050565b60055460009062010000900461ffff1661169557506000610d47565b60055461ffff808216620100009092041614156116b9575060055461ffff16610d47565b6005546040805160001943014060208083019190915282518083038201815291830190925280519101206117099161ffff8082169261170392909164010000000090910416612d76565b90612dbf565b905090565b6001600160a01b03166000908152600b602052604090205490565b6001600160a01b039081166000908152600c60205260409020541690565b61175033610e81565b61178b5760405162461bcd60e51b815260040180806020018281038252602e815260200180613336602e913960400191505060405180910390fd5b600a805460ff1916911515919091179055565b6117a733610e81565b6117e25760405162461bcd60e51b815260040180806020018281038252602e815260200180613336602e913960400191505060405180910390fd5b6117ed6000826125c1565b6040516001600160a01b038216907ff68e73cec97f2d70aa641fb26e87a4383686e2efacb648f2165aeb02ac562ec590600090a250565b60095490565b6000806118363361170e565b116118725760405162461bcd60e51b81526004018080602001828103825260228152602001806134b56022913960400191505060405180910390fd5b6000826001600160a01b0316116118ba5760405162461bcd60e51b81526004018080602001828103825260228152602001806132586022913960400191505060405180910390fd5b336000908152600b60205260409020600101546001600160a01b03161561194757600a5460ff1661191c5760405162461bcd60e51b815260040180806020018281038252602481526020018061346b6024913960400191505060405180910390fd5b6001600160a01b0382166000908152600c6020526040902080546001600160a01b0319169055611959565b600954611955906001612dbf565b6009555b6001600160a01b0382166000818152600c602090815260408083208054336001600160a01b03199182168117909255818552600b8452938290206001018054909416851790935580519384525191927f0142d50ce25bf4af583f14e4919ea33ce9061a1c3198f644ce8d83954ced4e0a929081900390910190a2506001919050565b6119e433610e81565b611a1f5760405162461bcd60e51b815260040180806020018281038252602e815260200180613336602e913960400191505060405180910390fd5b611a2a6003826125c1565b6040516001600160a01b038216907f709bbc75e8831f324862b8e9f7f52f652d46c4ad81f244c9e7d0c6b51de9249290600090a250565b60078054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610d3f5780601f10610d1457610100808354040283529160200191610d3f565b611acb33610e81565b611b065760405162461bcd60e51b815260040180806020018281038252602e815260200180613336602e913960400191505060405180910390fd5b611b11600382612b9b565b6040516001600160a01b038216907f6c6b75303e41e95dbe82479ed0a94ba1d8a0d5eea16a922bb68e5daeedb1886790600090a250565b611b5133610e81565b611b8c5760405162461bcd60e51b815260040180806020018281038252602e815260200180613336602e913960400191505060405180910390fd5b611b97600082612b9b565b6040516001600160a01b038216907fed9c8ad8d5a0a66898ea49d2956929c93ae2e8bd50281b2ed897c5d1a6737e0b90600090a250565b611bd733610e81565b611c125760405162461bcd60e51b815260040180806020018281038252602e815260200180613336602e913960400191505060405180910390fd5b611c1d6004826125c1565b6040516001600160a01b038216907f6ae172837ea30b801fbfcdd4108aa1d5bf8ff775444fd70256b44e6bf3dfc3f690600090a250565b60055461ffff80821692620100009092041690565b611c7233610e81565b611cad5760405162461bcd60e51b815260040180806020018281038252602e815260200180613336602e913960400191505060405180910390fd5b6103e88261ffff161115611cf25760405162461bcd60e51b81526004018080602001828103825260268152602001806132a46026913960400191505060405180910390fd5b6103e88161ffff161115611d375760405162461bcd60e51b815260040180806020018281038252602681526020018061348f6026913960400191505060405180910390fd5b8061ffff168261ffff161115611d7e5760405162461bcd60e51b81526004018080602001828103825260238152602001806132f26023913960400191505060405180910390fd5b6005805461ffff9283166201000090810263ffff00001995851661ffff199093169290921794909416178083169381048316939093036001019091166401000000000265ffff0000000019909216919091179055565b60015460009060ff1615611e18576040805162461bcd60e51b815260206004820152600660248201526514185d5cd95960d21b604482015290519081900360640190fd5b60008211611e6d576040805162461bcd60e51b815260206004820152601860248201527f5472616e736665723a20616d6f756e74206973207a65726f0000000000000000604482015290519081900360640190fd5b6001600160a01b038316611eff576000611e863361170e565b905060008111611ed9576040805162461bcd60e51b81526020600482015260196024820152785472616e736665723a2062616c616e6365206973207a65726f60381b604482015290519081900360640190fd5b808311611eef57611eea33846127c5565b611ef9565b611ef933826127c5565b50610d99565b6000611f0a3361225b565b905060008111611f4b5760405162461bcd60e51b81526004018080602001828103825260238152602001806134fc6023913960400191505060405180910390fd5b80831115611f8a5760405162461bcd60e51b81526004018080602001828103825260288152602001806132ca6028913960400191505060405180910390fd5b611f953385856128e8565b5050600192915050565b6000610d9d60048361275e565b60015460ff1690565b611fbe33610e81565b611ff95760405162461bcd60e51b815260040180806020018281038252602e815260200180613336602e913960400191505060405180910390fd5b612005600783836131b6565b505050565b61201333610e81565b61204e5760405162461bcd60e51b815260040180806020018281038252602e815260200180613336602e913960400191505060405180910390fd5b612059600282612b9b565b6040516001600160a01b038216907fc19ec636c33767d631869f17e127e7bc2d0237fbd3720cac3cbd73c1360c72f590600090a250565b6000805b6001600160a01b0383166000908152600b6020526040902060030154811015612205576001600160a01b0383166000908152600b602052604081206003018054839081106120de57fe5b6000918252602090912001546001600160a01b03161480159061214257506001600160a01b0383166000908152600b60205260409020600301805461214291908390811061212857fe5b6000918252602090912001546001600160a01b0316612e19565b156121fd576001600160a01b0383166000908152600b6020526040902060030180548290811061216e57fe5b600091825260209182902001546040805163c47cfca160e01b81526001600160a01b0387811660048301529151919092169263c47cfca19260248082019391829003018186803b1580156121c157600080fd5b505afa9250505080156121e657506040513d60208110156121e157600080fd5b505160015b6121ef576121fd565b6121f98382612dbf565b9250505b600101612094565b50919050565b61221433610e81565b61224f5760405162461bcd60e51b815260040180806020018281038252602e815260200180613336602e913960400191505060405180910390fd5b612005600683836131b6565b6000610d9d61226983612090565b6122728461170e565b90612e1f565b6001600160a01b039182166000908152600b602090815260408083209390941682526005909201909152205490565b6122b033610e81565b6122eb5760405162461bcd60e51b815260040180806020018281038252602e815260200180613336602e913960400191505060405180910390fd5b826001600160a01b0383166123315760405162461bcd60e51b81526004018080602001828103825260258152602001806134d76025913960400191505060405180910390fd5b6000816001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561238057600080fd5b505afa158015612394573d6000803e3d6000fd5b505050506040513d60208110156123aa57600080fd5b5051905082811015612403576040805162461bcd60e51b815260206004820152601e60248201527f5265736375653a20616d6f756e7420657863656564732062616c616e63650000604482015290519081900360640190fd5b816001600160a01b031663a9059cbb85856040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561245a57600080fd5b505af115801561246e573d6000803e3d6000fd5b505050506040513d602081101561248457600080fd5b50505050505050565b6000610d9d60038361275e565b60015460009060ff16156124de576040805162461bcd60e51b815260206004820152600660248201526514185d5cd95960d21b604482015290519081900360640190fd5b6124e733611f9f565b6125225760405162461bcd60e51b81526004018080602001828103825260308152602001806133646030913960400191505060405180910390fd5b6000831161256e576040805162461bcd60e51b81526020600482015260146024820152734d696e743a20616d6f756e74206973207a65726f60601b604482015290519081900360640190fd5b6001600160a01b0382163014156125b65760405162461bcd60e51b815260040180806020018281038252602a81526020018061327a602a913960400191505060405180910390fd5b61112b848484612e61565b6125cb828261275e565b1561261d576040805162461bcd60e51b815260206004820152601f60248201527f526f6c65733a206163636f756e7420616c72656164792068617320726f6c6500604482015290519081900360640190fd5b6001600160a01b0316600090815260209190915260409020805460ff19166001179055565b6001600160a01b03831661269d576040805162461bcd60e51b815260206004820152601e60248201527f417070726f76653a2066726f6d20746865207a65726f20616464726573730000604482015290519081900360640190fd5b6001600160a01b0382166126f8576040805162461bcd60e51b815260206004820152601c60248201527f417070726f76653a20746f20746865207a65726f206164647265737300000000604482015290519081900360640190fd5b6001600160a01b038084166000818152600b602090815260408083209487168084526005909501825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b60006001600160a01b0382166127a55760405162461bcd60e51b81526004018080602001828103825260228152602001806133fd6022913960400191505060405180910390fd5b506001600160a01b03166000908152602091909152604090205460ff1690565b604080518082018252601a81527f4275726e3a20696e73756666696369656e742062616c616e63650000000000006020808301919091526001600160a01b0385166000908152600b9091529190912054612820918390612b04565b600b6000846001600160a01b03166001600160a01b031681526020019081526020016000206000018190555061287381604051806060016040528060218152602001613315602191396008549190612b04565b6008556040805182815290516001600160a01b038416917fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca5919081900360200190a26040805182815290516000916001600160a01b0385169160008051602061344b8339815191529181900360200190a35050565b6128f18361248d565b15801561290457506129028261248d565b155b15612a30576000612913611679565b905061ffff811615612a2e57600061293b6103e86129358561ffff8616613054565b906130ad565b905060006129498483612e1f565b604080518082018252601e81527f5472616e736665723a20696e73756666696369656e742062616c616e636500006020808301919091526001600160a01b038a166000908152600b90915291909120549192506129a891908390612b04565b6001600160a01b038088166000908152600b602052604080822093909355908716815220546129d79082612dbf565b6001600160a01b038087166000818152600b602090815260409182902094909455805185815290519193928a169260008051602061344b83398151915292918290030190a3612a2686836127c5565b505050612005565b505b604080518082018252601e81527f5472616e736665723a20696e73756666696369656e742062616c616e636500006020808301919091526001600160a01b0386166000908152600b9091529190912054612a8b918390612b04565b6001600160a01b038085166000908152600b60205260408082209390935590841681522054612aba9082612dbf565b6001600160a01b038084166000818152600b6020908152604091829020949094558051858152905191939287169260008051602061344b83398151915292918290030190a3505050565b60008184841115612b935760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612b58578181015183820152602001612b40565b50505050905090810190601f168015612b855780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b612ba5828261275e565b612be05760405162461bcd60e51b81526004018080602001828103825260218152602001806133946021913960400191505060405180910390fd5b6001600160a01b0316600090815260209190915260409020805460ff19169055565b600854600090612c129083612dbf565b90506702ea11e32ad50000811115612c71576040805162461bcd60e51b815260206004820152601f60248201527f4d696e743a20746f74616c20737570706c792063617020657863656564656400604482015290519081900360640190fd5b6001600160a01b038316612cc8576040805162461bcd60e51b81526020600482015260196024820152784d696e743a20746f20746865207a65726f206164647265737360381b604482015290519081900360640190fd5b60088190556001600160a01b0383166000908152600b6020526040902054612cf09083612dbf565b6001600160a01b0384166000818152600b6020908152604091829020939093558051858152905191927f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d412139688592918290030190a26040805183815290516001600160a01b0385169160009160008051602061344b8339815191529181900360200190a3505050565b6000612db883836040518060400160405280601881526020017f536166654d6174683a206d6f64756c6f206279207a65726f00000000000000008152506130ef565b9392505050565b600082820183811015612db8576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b3b151590565b6000612db883836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612b04565b600854600090612e719084612dbf565b90506702ea11e32ad50000811115612ed0576040805162461bcd60e51b815260206004820152601f60248201527f4d696e743a20746f74616c20737570706c792063617020657863656564656400604482015290519081900360640190fd5b6001600160a01b038416612f27576040805162461bcd60e51b81526020600482015260196024820152784d696e743a20746f20746865207a65726f206164647265737360381b604482015290519081900360640190fd5b60088190556001600160a01b0384166000908152600b6020526040902054612f4f9084612dbf565b6001600160a01b038086166000908152600b602090815260408083209485559286168252600490930190925290205460ff16612fe0576001600160a01b038481166000908152600b60209081526040808320600381018054600180820183559186528486200180546001600160a01b03191696891696871790559484526004019091529020805460ff191690911790555b6040805184815290516001600160a01b038616917f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d4121396885919081900360200190a26040805184815290516001600160a01b0386169160009160008051602061344b8339815191529181900360200190a350505050565b60008261306357506000610d9d565b8282028284828161307057fe5b0414612db85760405162461bcd60e51b81526004018080602001828103825260218152602001806133dc6021913960400191505060405180910390fd5b6000612db883836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613151565b6000818361313e5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315612b58578181015183820152602001612b40565b5082848161314857fe5b06949350505050565b600081836131a05760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315612b58578181015183820152602001612b40565b5060008385816131ac57fe5b0495945050505050565b828054600181600116156101000203166002900490600052602060002090601f0160209004810192826131ec5760008555613232565b82601f106132055782800160ff19823516178555613232565b82800160010185558215613232579182015b82811115613232578235825591602001919060010190613217565b5061323e929150613242565b5090565b5b8082111561323e576000815560010161324356fe53657420566f6b656e20416464726573733a206973207a65726f20616464726573734d696e742c2076657374696e6720616464726573732069732074686520746f6b656e2061646472657373536574206275726e696e6720626f726465723a206d696e2065786365656473203130302e30255472616e736665723a20696e73756666696369656e7420617661696c61626c652062616c616e6365536574206275726e696e6720626f726465723a206d696e2065786365656473206d61784275726e3a20616d6f756e74206578636565647320746f74616c20737570706c794167656e74526f6c653a2063616c6c657220646f6573206e6f74206861766520746865204167656e7420726f6c654d696e746572526f6c653a2063616c6c657220646f6573206e6f74206861766520746865204d696e74657220726f6c65526f6c65733a206163636f756e7420646f6573206e6f74206861766520726f6c6557697468647261773a20726563697069656e7420697320746865207a65726f2061646472657373536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77526f6c65733a206163636f756e7420697320746865207a65726f20616464726573735472616e7366657246726f6d3a20696e73756666696369656e7420617661696c61626c652062616c616e6365ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef4368616e676520566f6b656e20416464726573733a206973206e6f7420616c6c6f776564536574206275726e696e6720626f726465723a206d61782065786365656473203130302e302553657420566f6b656e20416464726573733a2062616c616e6365206973207a65726f5265736375653a20726563697069656e7420697320746865207a65726f20616464726573735472616e736665723a20617661696c61626c652062616c616e6365206973207a65726f5472616e7366657246726f6d3a20616d6f756e74206578636565647320616c6c6f77616e63655472616e7366657246726f6d3a20617661696c61626c652062616c616e6365206973207a65726fa26469706673582212204436dbb8aec6345ba0b9bee099512de0f4759be920bcea227c30c02da0f969a864736f6c63430007050033526f6c65733a206163636f756e7420697320746865207a65726f2061646472657373

Deployed Bytecode

0x6080604052600436106102765760003560e01c80637dceaed31161014f578063a9059cbb116100c1578063c47f00271161007a578063c47f002714610b0f578063d546da9014610b8c578063dd62ed3e14610bbf578063e5711e8b14610bfa578063ec676a4914610c3d578063ecbc509514610c70576102ba565b8063a9059cbb146109ab578063aa271e1a146109e4578063b187bd2614610a17578063b84c824614610a2c578063be116c3b14610aa9578063c47cfca114610adc576102ba565b806395d89b411161011357806395d89b411461088d5780639649650c146108a257806397a6278e146108d5578063983b2d56146109085780639fec3c5b1461093b578063a68e4d4414610975576102ba565b80637dceaed3146107b357806384e79842146107df5780638cf304b714610812578063915be5cb14610827578063947223971461085a576102ba565b8063313ce567116101e857806342966c68116101ac57806342966c681461068b5780634567d36a146106b5578063522f6815146106e8578063533b134d1461072157806370a082311461074d5780637950537d14610780576102ba565b8063313ce5671461057a578063355274ea146105a557806337915874146105ba5780633ccda4f71461063d57806340c10f1914610652576102ba565b80631ffbb0641161023a5780631ffbb0641461043857806323b11d8d1461046b57806323b872dd1461049e57806329710388146104e15780632cf003c2146105145780633092afd514610547576102ba565b806306fdde03146102bf578063095ea7b31461034957806316c38b3c1461039657806318160ddd146103c257806318e7d8db146103e9576102ba565b366102ba5734156102b85760408051348152905133917f0553260a2e46b0577270d8992db02d30856ca880144c72d6e9503760946aef13919081900360200190a25b005b600080fd5b3480156102cb57600080fd5b506102d4610cb3565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561030e5781810151838201526020016102f6565b50505050905090810190601f16801561033b5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561035557600080fd5b506103826004803603604081101561036c57600080fd5b506001600160a01b038135169060200135610d4a565b604080519115158252519081900360200190f35b3480156103a257600080fd5b506102b8600480360360208110156103b957600080fd5b50351515610da3565b3480156103ce57600080fd5b506103d7610e5a565b60408051918252519081900360200190f35b3480156103f557600080fd5b5061041c6004803603602081101561040c57600080fd5b50356001600160a01b0316610e60565b604080516001600160a01b039092168252519081900360200190f35b34801561044457600080fd5b506103826004803603602081101561045b57600080fd5b50356001600160a01b0316610e81565b34801561047757600080fd5b506102b86004803603602081101561048e57600080fd5b50356001600160a01b0316610e8d565b3480156104aa57600080fd5b50610382600480360360608110156104c157600080fd5b506001600160a01b03813581169160208101359091169060400135610f13565b3480156104ed57600080fd5b506103826004803603602081101561050457600080fd5b50356001600160a01b0316611135565b34801561052057600080fd5b5061041c6004803603602081101561053757600080fd5b50356001600160a01b0316611142565b34801561055357600080fd5b506102b86004803603602081101561056a57600080fd5b50356001600160a01b0316611163565b34801561058657600080fd5b5061058f6111e9565b6040805160ff9092168252519081900360200190f35b3480156105b157600080fd5b506103d76111ee565b3480156105c657600080fd5b506105ed600480360360208110156105dd57600080fd5b50356001600160a01b03166111fa565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610629578181015183820152602001610611565b505050509050019250505060405180910390f35b34801561064957600080fd5b50610382611273565b34801561065e57600080fd5b506103826004803603604081101561067557600080fd5b506001600160a01b03813516906020013561127c565b34801561069757600080fd5b50610382600480360360208110156106ae57600080fd5b503561135a565b3480156106c157600080fd5b50610382600480360360208110156106d857600080fd5b50356001600160a01b0316611421565b3480156106f457600080fd5b506102b86004803603604081101561070b57600080fd5b506001600160a01b03813516906020013561155e565b34801561072d57600080fd5b50610736611679565b6040805161ffff9092168252519081900360200190f35b34801561075957600080fd5b506103d76004803603602081101561077057600080fd5b50356001600160a01b031661170e565b34801561078c57600080fd5b5061041c600480360360208110156107a357600080fd5b50356001600160a01b0316611729565b3480156107bf57600080fd5b506102b8600480360360208110156107d657600080fd5b50351515611747565b3480156107eb57600080fd5b506102b86004803603602081101561080257600080fd5b50356001600160a01b031661179e565b34801561081e57600080fd5b506103d7611824565b34801561083357600080fd5b506103826004803603602081101561084a57600080fd5b50356001600160a01b031661182a565b34801561086657600080fd5b506102b86004803603602081101561087d57600080fd5b50356001600160a01b03166119db565b34801561089957600080fd5b506102d4611a61565b3480156108ae57600080fd5b506102b8600480360360208110156108c557600080fd5b50356001600160a01b0316611ac2565b3480156108e157600080fd5b506102b8600480360360208110156108f857600080fd5b50356001600160a01b0316611b48565b34801561091457600080fd5b506102b86004803603602081101561092b57600080fd5b50356001600160a01b0316611bce565b34801561094757600080fd5b50610950611c54565b604051808361ffff1681526020018261ffff1681526020019250505060405180910390f35b34801561098157600080fd5b506102b86004803603604081101561099857600080fd5b5061ffff81358116916020013516611c69565b3480156109b757600080fd5b50610382600480360360408110156109ce57600080fd5b506001600160a01b038135169060200135611dd4565b3480156109f057600080fd5b5061038260048036036020811015610a0757600080fd5b50356001600160a01b0316611f9f565b348015610a2357600080fd5b50610382611fac565b348015610a3857600080fd5b506102b860048036036020811015610a4f57600080fd5b810190602081018135640100000000811115610a6a57600080fd5b820183602082011115610a7c57600080fd5b80359060200191846001830284011164010000000083111715610a9e57600080fd5b509092509050611fb5565b348015610ab557600080fd5b506102b860048036036020811015610acc57600080fd5b50356001600160a01b031661200a565b348015610ae857600080fd5b506103d760048036036020811015610aff57600080fd5b50356001600160a01b0316612090565b348015610b1b57600080fd5b506102b860048036036020811015610b3257600080fd5b810190602081018135640100000000811115610b4d57600080fd5b820183602082011115610b5f57600080fd5b80359060200191846001830284011164010000000083111715610b8157600080fd5b50909250905061220b565b348015610b9857600080fd5b506103d760048036036020811015610baf57600080fd5b50356001600160a01b031661225b565b348015610bcb57600080fd5b506103d760048036036040811015610be257600080fd5b506001600160a01b0381358116916020013516612278565b348015610c0657600080fd5b506102b860048036036060811015610c1d57600080fd5b506001600160a01b038135811691602081013590911690604001356122a7565b348015610c4957600080fd5b5061038260048036036020811015610c6057600080fd5b50356001600160a01b031661248d565b348015610c7c57600080fd5b5061038260048036036060811015610c9357600080fd5b506001600160a01b0381358116916020810135916040909101351661249a565b60068054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610d3f5780601f10610d1457610100808354040283529160200191610d3f565b820191906000526020600020905b815481529060010190602001808311610d2257829003601f168201915b505050505090505b90565b60015460009060ff1615610d8e576040805162461bcd60e51b815260206004820152600660248201526514185d5cd95960d21b604482015290519081900360640190fd5b610d99338484612642565b5060015b92915050565b610dac33610e81565b610de75760405162461bcd60e51b815260040180806020018281038252602e815260200180613336602e913960400191505060405180910390fd5b6001805460ff1916821515179081905560ff1615610e2d576040517f280482618db6ed39eea4ee1c697fa752b8b32da9e3592f8c981791f19637edee90600090a1610e57565b6040517f882a71d19655cb72d0d6afea987b3341dd9987d8bd32c4dc4cbc484f0c29ac9390600090a15b50565b60085490565b6001600160a01b039081166000908152600b60205260409020600101541690565b6000610d9d818361275e565b610e9633610e81565b610ed15760405162461bcd60e51b815260040180806020018281038252602e815260200180613336602e913960400191505060405180910390fd5b610edc6002826125c1565b6040516001600160a01b038216907f919e434c309b1e05df9dba7a1e2827e10cf511d2eb5330b6fffadf34f0632d0690600090a250565b60015460009060ff1615610f57576040805162461bcd60e51b815260206004820152600660248201526514185d5cd95960d21b604482015290519081900360640190fd5b60008211610fac576040805162461bcd60e51b815260206004820152601c60248201527f5472616e7366657246726f6d3a20616d6f756e74206973207a65726f00000000604482015290519081900360640190fd5b6001600160a01b03831661103e576000610fc58561170e565b905060008111611018576040805162461bcd60e51b81526020600482015260196024820152785472616e736665723a2062616c616e6365206973207a65726f60381b604482015290519081900360640190fd5b80831161102e5761102985846127c5565b611038565b61103885826127c5565b5061112b565b60006110498561225b565b90506000811161108a5760405162461bcd60e51b81526004018080602001828103825260278152602001806135456027913960400191505060405180910390fd5b808311156110c95760405162461bcd60e51b815260040180806020018281038252602c81526020018061341f602c913960400191505060405180910390fd5b6110d48585856128e8565b61112985336111248660405180606001604052806026815260200161351f602691396001600160a01b038b166000908152600b602090815260408083203384526005019091529020549190612b04565b612642565b505b5060019392505050565b6000610d9d60028361275e565b6001600160a01b039081166000908152600b60205260409020600201541690565b61116c33610e81565b6111a75760405162461bcd60e51b815260040180806020018281038252602e815260200180613336602e913960400191505060405180910390fd5b6111b2600482612b9b565b6040516001600160a01b038216907fe94479a9f7e1952cc78f2d6baab678adc1b772d936c6583def489e524cb6669290600090a250565b600990565b6702ea11e32ad5000090565b6001600160a01b0381166000908152600b602090815260409182902060030180548351818402810184019094528084526060939283018282801561126757602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611249575b50505050509050919050565b600a5460ff1690565b60015460009060ff16156112c0576040805162461bcd60e51b815260206004820152600660248201526514185d5cd95960d21b604482015290519081900360640190fd5b6112c933611f9f565b6113045760405162461bcd60e51b81526004018080602001828103825260308152602001806133646030913960400191505060405180910390fd5b60008211611350576040805162461bcd60e51b81526020600482015260146024820152734d696e743a20616d6f756e74206973207a65726f60601b604482015290519081900360640190fd5b610d998383612c02565b60008082116113a7576040805162461bcd60e51b81526020600482015260146024820152734275726e3a20616d6f756e74206973207a65726f60601b604482015290519081900360640190fd5b60006113b23361170e565b905060008111611401576040805162461bcd60e51b81526020600482015260156024820152744275726e3a2062616c616e6365206973207a65726f60581b604482015290519081900360640190fd5b8281106114175761141233846127c5565b610d99565b610d9933826127c5565b6001600160a01b038082166000908152600c602052604081205490911680611490576040805162461bcd60e51b815260206004820152601c60248201527f5365742072656665727265723a20646f6573206e6f7420657869737400000000604482015290519081900360640190fd5b336000908152600b60205260409020600201546001600160a01b0316156114fe576040805162461bcd60e51b815260206004820152601f60248201527f5365742072656665727265723a2077617320616c726561647920657869737400604482015290519081900360640190fd5b336000818152600b602052604080822060020180546001600160a01b0319166001600160a01b03861690811790915590519092917f5f7165288eef601591cf549e15ff19ef9060b7f71b9c115be946fa1fe7ebf68a91a350600192915050565b61156733610e81565b6115a25760405162461bcd60e51b815260040180806020018281038252602e815260200180613336602e913960400191505060405180910390fd5b6001600160a01b0382166115e75760405162461bcd60e51b81526004018080602001828103825260278152602001806133b56027913960400191505060405180910390fd5b478181101561163d576040805162461bcd60e51b815260206004820181905260248201527f57697468647261773a20616d6f756e7420657863656564732062616c616e6365604482015290519081900360640190fd5b6040516001600160a01b0384169083156108fc029084906000818181858888f19350505050158015611673573d6000803e3d6000fd5b50505050565b60055460009062010000900461ffff1661169557506000610d47565b60055461ffff808216620100009092041614156116b9575060055461ffff16610d47565b6005546040805160001943014060208083019190915282518083038201815291830190925280519101206117099161ffff8082169261170392909164010000000090910416612d76565b90612dbf565b905090565b6001600160a01b03166000908152600b602052604090205490565b6001600160a01b039081166000908152600c60205260409020541690565b61175033610e81565b61178b5760405162461bcd60e51b815260040180806020018281038252602e815260200180613336602e913960400191505060405180910390fd5b600a805460ff1916911515919091179055565b6117a733610e81565b6117e25760405162461bcd60e51b815260040180806020018281038252602e815260200180613336602e913960400191505060405180910390fd5b6117ed6000826125c1565b6040516001600160a01b038216907ff68e73cec97f2d70aa641fb26e87a4383686e2efacb648f2165aeb02ac562ec590600090a250565b60095490565b6000806118363361170e565b116118725760405162461bcd60e51b81526004018080602001828103825260228152602001806134b56022913960400191505060405180910390fd5b6000826001600160a01b0316116118ba5760405162461bcd60e51b81526004018080602001828103825260228152602001806132586022913960400191505060405180910390fd5b336000908152600b60205260409020600101546001600160a01b03161561194757600a5460ff1661191c5760405162461bcd60e51b815260040180806020018281038252602481526020018061346b6024913960400191505060405180910390fd5b6001600160a01b0382166000908152600c6020526040902080546001600160a01b0319169055611959565b600954611955906001612dbf565b6009555b6001600160a01b0382166000818152600c602090815260408083208054336001600160a01b03199182168117909255818552600b8452938290206001018054909416851790935580519384525191927f0142d50ce25bf4af583f14e4919ea33ce9061a1c3198f644ce8d83954ced4e0a929081900390910190a2506001919050565b6119e433610e81565b611a1f5760405162461bcd60e51b815260040180806020018281038252602e815260200180613336602e913960400191505060405180910390fd5b611a2a6003826125c1565b6040516001600160a01b038216907f709bbc75e8831f324862b8e9f7f52f652d46c4ad81f244c9e7d0c6b51de9249290600090a250565b60078054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610d3f5780601f10610d1457610100808354040283529160200191610d3f565b611acb33610e81565b611b065760405162461bcd60e51b815260040180806020018281038252602e815260200180613336602e913960400191505060405180910390fd5b611b11600382612b9b565b6040516001600160a01b038216907f6c6b75303e41e95dbe82479ed0a94ba1d8a0d5eea16a922bb68e5daeedb1886790600090a250565b611b5133610e81565b611b8c5760405162461bcd60e51b815260040180806020018281038252602e815260200180613336602e913960400191505060405180910390fd5b611b97600082612b9b565b6040516001600160a01b038216907fed9c8ad8d5a0a66898ea49d2956929c93ae2e8bd50281b2ed897c5d1a6737e0b90600090a250565b611bd733610e81565b611c125760405162461bcd60e51b815260040180806020018281038252602e815260200180613336602e913960400191505060405180910390fd5b611c1d6004826125c1565b6040516001600160a01b038216907f6ae172837ea30b801fbfcdd4108aa1d5bf8ff775444fd70256b44e6bf3dfc3f690600090a250565b60055461ffff80821692620100009092041690565b611c7233610e81565b611cad5760405162461bcd60e51b815260040180806020018281038252602e815260200180613336602e913960400191505060405180910390fd5b6103e88261ffff161115611cf25760405162461bcd60e51b81526004018080602001828103825260268152602001806132a46026913960400191505060405180910390fd5b6103e88161ffff161115611d375760405162461bcd60e51b815260040180806020018281038252602681526020018061348f6026913960400191505060405180910390fd5b8061ffff168261ffff161115611d7e5760405162461bcd60e51b81526004018080602001828103825260238152602001806132f26023913960400191505060405180910390fd5b6005805461ffff9283166201000090810263ffff00001995851661ffff199093169290921794909416178083169381048316939093036001019091166401000000000265ffff0000000019909216919091179055565b60015460009060ff1615611e18576040805162461bcd60e51b815260206004820152600660248201526514185d5cd95960d21b604482015290519081900360640190fd5b60008211611e6d576040805162461bcd60e51b815260206004820152601860248201527f5472616e736665723a20616d6f756e74206973207a65726f0000000000000000604482015290519081900360640190fd5b6001600160a01b038316611eff576000611e863361170e565b905060008111611ed9576040805162461bcd60e51b81526020600482015260196024820152785472616e736665723a2062616c616e6365206973207a65726f60381b604482015290519081900360640190fd5b808311611eef57611eea33846127c5565b611ef9565b611ef933826127c5565b50610d99565b6000611f0a3361225b565b905060008111611f4b5760405162461bcd60e51b81526004018080602001828103825260238152602001806134fc6023913960400191505060405180910390fd5b80831115611f8a5760405162461bcd60e51b81526004018080602001828103825260288152602001806132ca6028913960400191505060405180910390fd5b611f953385856128e8565b5050600192915050565b6000610d9d60048361275e565b60015460ff1690565b611fbe33610e81565b611ff95760405162461bcd60e51b815260040180806020018281038252602e815260200180613336602e913960400191505060405180910390fd5b612005600783836131b6565b505050565b61201333610e81565b61204e5760405162461bcd60e51b815260040180806020018281038252602e815260200180613336602e913960400191505060405180910390fd5b612059600282612b9b565b6040516001600160a01b038216907fc19ec636c33767d631869f17e127e7bc2d0237fbd3720cac3cbd73c1360c72f590600090a250565b6000805b6001600160a01b0383166000908152600b6020526040902060030154811015612205576001600160a01b0383166000908152600b602052604081206003018054839081106120de57fe5b6000918252602090912001546001600160a01b03161480159061214257506001600160a01b0383166000908152600b60205260409020600301805461214291908390811061212857fe5b6000918252602090912001546001600160a01b0316612e19565b156121fd576001600160a01b0383166000908152600b6020526040902060030180548290811061216e57fe5b600091825260209182902001546040805163c47cfca160e01b81526001600160a01b0387811660048301529151919092169263c47cfca19260248082019391829003018186803b1580156121c157600080fd5b505afa9250505080156121e657506040513d60208110156121e157600080fd5b505160015b6121ef576121fd565b6121f98382612dbf565b9250505b600101612094565b50919050565b61221433610e81565b61224f5760405162461bcd60e51b815260040180806020018281038252602e815260200180613336602e913960400191505060405180910390fd5b612005600683836131b6565b6000610d9d61226983612090565b6122728461170e565b90612e1f565b6001600160a01b039182166000908152600b602090815260408083209390941682526005909201909152205490565b6122b033610e81565b6122eb5760405162461bcd60e51b815260040180806020018281038252602e815260200180613336602e913960400191505060405180910390fd5b826001600160a01b0383166123315760405162461bcd60e51b81526004018080602001828103825260258152602001806134d76025913960400191505060405180910390fd5b6000816001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561238057600080fd5b505afa158015612394573d6000803e3d6000fd5b505050506040513d60208110156123aa57600080fd5b5051905082811015612403576040805162461bcd60e51b815260206004820152601e60248201527f5265736375653a20616d6f756e7420657863656564732062616c616e63650000604482015290519081900360640190fd5b816001600160a01b031663a9059cbb85856040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561245a57600080fd5b505af115801561246e573d6000803e3d6000fd5b505050506040513d602081101561248457600080fd5b50505050505050565b6000610d9d60038361275e565b60015460009060ff16156124de576040805162461bcd60e51b815260206004820152600660248201526514185d5cd95960d21b604482015290519081900360640190fd5b6124e733611f9f565b6125225760405162461bcd60e51b81526004018080602001828103825260308152602001806133646030913960400191505060405180910390fd5b6000831161256e576040805162461bcd60e51b81526020600482015260146024820152734d696e743a20616d6f756e74206973207a65726f60601b604482015290519081900360640190fd5b6001600160a01b0382163014156125b65760405162461bcd60e51b815260040180806020018281038252602a81526020018061327a602a913960400191505060405180910390fd5b61112b848484612e61565b6125cb828261275e565b1561261d576040805162461bcd60e51b815260206004820152601f60248201527f526f6c65733a206163636f756e7420616c72656164792068617320726f6c6500604482015290519081900360640190fd5b6001600160a01b0316600090815260209190915260409020805460ff19166001179055565b6001600160a01b03831661269d576040805162461bcd60e51b815260206004820152601e60248201527f417070726f76653a2066726f6d20746865207a65726f20616464726573730000604482015290519081900360640190fd5b6001600160a01b0382166126f8576040805162461bcd60e51b815260206004820152601c60248201527f417070726f76653a20746f20746865207a65726f206164647265737300000000604482015290519081900360640190fd5b6001600160a01b038084166000818152600b602090815260408083209487168084526005909501825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b60006001600160a01b0382166127a55760405162461bcd60e51b81526004018080602001828103825260228152602001806133fd6022913960400191505060405180910390fd5b506001600160a01b03166000908152602091909152604090205460ff1690565b604080518082018252601a81527f4275726e3a20696e73756666696369656e742062616c616e63650000000000006020808301919091526001600160a01b0385166000908152600b9091529190912054612820918390612b04565b600b6000846001600160a01b03166001600160a01b031681526020019081526020016000206000018190555061287381604051806060016040528060218152602001613315602191396008549190612b04565b6008556040805182815290516001600160a01b038416917fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca5919081900360200190a26040805182815290516000916001600160a01b0385169160008051602061344b8339815191529181900360200190a35050565b6128f18361248d565b15801561290457506129028261248d565b155b15612a30576000612913611679565b905061ffff811615612a2e57600061293b6103e86129358561ffff8616613054565b906130ad565b905060006129498483612e1f565b604080518082018252601e81527f5472616e736665723a20696e73756666696369656e742062616c616e636500006020808301919091526001600160a01b038a166000908152600b90915291909120549192506129a891908390612b04565b6001600160a01b038088166000908152600b602052604080822093909355908716815220546129d79082612dbf565b6001600160a01b038087166000818152600b602090815260409182902094909455805185815290519193928a169260008051602061344b83398151915292918290030190a3612a2686836127c5565b505050612005565b505b604080518082018252601e81527f5472616e736665723a20696e73756666696369656e742062616c616e636500006020808301919091526001600160a01b0386166000908152600b9091529190912054612a8b918390612b04565b6001600160a01b038085166000908152600b60205260408082209390935590841681522054612aba9082612dbf565b6001600160a01b038084166000818152600b6020908152604091829020949094558051858152905191939287169260008051602061344b83398151915292918290030190a3505050565b60008184841115612b935760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612b58578181015183820152602001612b40565b50505050905090810190601f168015612b855780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b612ba5828261275e565b612be05760405162461bcd60e51b81526004018080602001828103825260218152602001806133946021913960400191505060405180910390fd5b6001600160a01b0316600090815260209190915260409020805460ff19169055565b600854600090612c129083612dbf565b90506702ea11e32ad50000811115612c71576040805162461bcd60e51b815260206004820152601f60248201527f4d696e743a20746f74616c20737570706c792063617020657863656564656400604482015290519081900360640190fd5b6001600160a01b038316612cc8576040805162461bcd60e51b81526020600482015260196024820152784d696e743a20746f20746865207a65726f206164647265737360381b604482015290519081900360640190fd5b60088190556001600160a01b0383166000908152600b6020526040902054612cf09083612dbf565b6001600160a01b0384166000818152600b6020908152604091829020939093558051858152905191927f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d412139688592918290030190a26040805183815290516001600160a01b0385169160009160008051602061344b8339815191529181900360200190a3505050565b6000612db883836040518060400160405280601881526020017f536166654d6174683a206d6f64756c6f206279207a65726f00000000000000008152506130ef565b9392505050565b600082820183811015612db8576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b3b151590565b6000612db883836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612b04565b600854600090612e719084612dbf565b90506702ea11e32ad50000811115612ed0576040805162461bcd60e51b815260206004820152601f60248201527f4d696e743a20746f74616c20737570706c792063617020657863656564656400604482015290519081900360640190fd5b6001600160a01b038416612f27576040805162461bcd60e51b81526020600482015260196024820152784d696e743a20746f20746865207a65726f206164647265737360381b604482015290519081900360640190fd5b60088190556001600160a01b0384166000908152600b6020526040902054612f4f9084612dbf565b6001600160a01b038086166000908152600b602090815260408083209485559286168252600490930190925290205460ff16612fe0576001600160a01b038481166000908152600b60209081526040808320600381018054600180820183559186528486200180546001600160a01b03191696891696871790559484526004019091529020805460ff191690911790555b6040805184815290516001600160a01b038616917f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d4121396885919081900360200190a26040805184815290516001600160a01b0386169160009160008051602061344b8339815191529181900360200190a350505050565b60008261306357506000610d9d565b8282028284828161307057fe5b0414612db85760405162461bcd60e51b81526004018080602001828103825260218152602001806133dc6021913960400191505060405180910390fd5b6000612db883836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613151565b6000818361313e5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315612b58578181015183820152602001612b40565b5082848161314857fe5b06949350505050565b600081836131a05760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315612b58578181015183820152602001612b40565b5060008385816131ac57fe5b0495945050505050565b828054600181600116156101000203166002900490600052602060002090601f0160209004810192826131ec5760008555613232565b82601f106132055782800160ff19823516178555613232565b82800160010185558215613232579182015b82811115613232578235825591602001919060010190613217565b5061323e929150613242565b5090565b5b8082111561323e576000815560010161324356fe53657420566f6b656e20416464726573733a206973207a65726f20616464726573734d696e742c2076657374696e6720616464726573732069732074686520746f6b656e2061646472657373536574206275726e696e6720626f726465723a206d696e2065786365656473203130302e30255472616e736665723a20696e73756666696369656e7420617661696c61626c652062616c616e6365536574206275726e696e6720626f726465723a206d696e2065786365656473206d61784275726e3a20616d6f756e74206578636565647320746f74616c20737570706c794167656e74526f6c653a2063616c6c657220646f6573206e6f74206861766520746865204167656e7420726f6c654d696e746572526f6c653a2063616c6c657220646f6573206e6f74206861766520746865204d696e74657220726f6c65526f6c65733a206163636f756e7420646f6573206e6f74206861766520726f6c6557697468647261773a20726563697069656e7420697320746865207a65726f2061646472657373536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77526f6c65733a206163636f756e7420697320746865207a65726f20616464726573735472616e7366657246726f6d3a20696e73756666696369656e7420617661696c61626c652062616c616e6365ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef4368616e676520566f6b656e20416464726573733a206973206e6f7420616c6c6f776564536574206275726e696e6720626f726465723a206d61782065786365656473203130302e302553657420566f6b656e20416464726573733a2062616c616e6365206973207a65726f5265736375653a20726563697069656e7420697320746865207a65726f20616464726573735472616e736665723a20617661696c61626c652062616c616e6365206973207a65726f5472616e7366657246726f6d3a20616d6f756e74206578636565647320616c6c6f77616e63655472616e7366657246726f6d3a20617661696c61626c652062616c616e6365206973207a65726fa26469706673582212204436dbb8aec6345ba0b9bee099512de0f4759be920bcea227c30c02da0f969a864736f6c63430007050033

Deployed Bytecode Sourcemap

403:16999:9:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1614:9;:13;1610:80;;1649:29;;;1668:9;1649:29;;;;1656:10;;1649:29;;;;;;;;;;1610:80;403:16999;;;;;3801:133;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6765:212;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;6765:212:9;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;798:223:0;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;798:223:0;;;;:::i;4647:141:9:-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;5675:168;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5675:168:9;-1:-1:-1;;;;;5675:168:9;;:::i;:::-;;;;-1:-1:-1;;;;;5675:168:9;;;;;;;;;;;;;;1917:139:3;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1917:139:3;-1:-1:-1;;;;;1917:139:3;;:::i;917:150:1:-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;917:150:1;-1:-1:-1;;;;;917:150:1;;:::i;11927:1130:9:-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;11927:1130:9;;;;;;;;;;;;;;;;;:::i;637:140:1:-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;637:140:1;-1:-1:-1;;;;;637:140:1;;:::i;6355:174:9:-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6355:174:9;-1:-1:-1;;;;;6355:174:9;;:::i;2206:160:2:-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2206:160:2;-1:-1:-1;;;;;2206:160:2;;:::i;4246:133:9:-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;4459:107;;;;;;;;;;;;;:::i;5153:207::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5153:207:9;-1:-1:-1;;;;;5153:207:9;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5450:150;;;;;;;;;;;;;:::i;9245:279::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;9245:279:9;;;;;;;;:::i;8654:450::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8654:450:9;;:::i;3244:486::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3244:486:9;-1:-1:-1;;;;;3244:486:9;;:::i;1441:387:3:-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;1441:387:3;;;;;;;;:::i;1401:395:4:-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;4875:184:9;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4875:184:9;-1:-1:-1;;;;;4875:184:9;;:::i;5910:171::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5910:171:9;-1:-1:-1;;;;;5910:171:9;;:::i;2291:145::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2291:145:9;;;;:::i;2187:149:3:-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2187:149:3;-1:-1:-1;;;;;2187:149:3;;:::i;6153:125:9:-;;;;;;;;;;;;;:::i;2505:686::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2505:686:9;-1:-1:-1;;;;;2505:686:9;;:::i;1095:146:2:-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1095:146:2;-1:-1:-1;;;;;1095:146:2;;:::i;4002:137:9:-;;;;;;;;;;;;;:::i;1384:154:2:-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1384:154:2;-1:-1:-1;;;;;1384:154:2;;:::i;2471:157:3:-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2471:157:3;-1:-1:-1;;;;;2471:157:3;;:::i;1909:152:2:-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1909:152:2;-1:-1:-1;;;;;1909:152:2;;:::i;1135:190:4:-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;557:492;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;557:492:4;;;;;;;;;;;:::i;10510:963:9:-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;10510:963:9;;;;;;;;:::i;1627:141:2:-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1627:141:2;-1:-1:-1;;;;;1627:141:2;;:::i;571:112:0:-;;;;;;;;;;;;;:::i;2074:134:9:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2074:134:9;;-1:-1:-1;2074:134:9;-1:-1:-1;2074:134:9;:::i;1211:158:1:-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1211:158:1;-1:-1:-1;;;;;1211:158:1;;:::i;7487:713:9:-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7487:713:9;-1:-1:-1;;;;;7487:713:9;;:::i;1822:130::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1822:130:9;;-1:-1:-1;1822:130:9;-1:-1:-1;1822:130:9;:::i;8314:184::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8314:184:9;-1:-1:-1;;;;;8314:184:9;;:::i;7180:218::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;7180:218:9;;;;;;;;;;:::i;874:465:3:-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;874:465:3;;;;;;;;;;;;;;;;;:::i;819:137:2:-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;819:137:2;-1:-1:-1;;;;;819:137:2;;:::i;9690:450:9:-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;9690:450:9;;;;;;;;;;;;;;;;;:::i;3801:133::-;3921:5;3914:12;;;;;;;;-1:-1:-1;;3914:12:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3883:13;;3914:12;;3921:5;;3914:12;;3921:5;3914:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3801:133;;:::o;6765:212::-;434:7:0;;6889:4:9;;434:7:0;;433:8;425:27;;;;;-1:-1:-1;;;425:27:0;;;;;;;;;;;;-1:-1:-1;;;425:27:0;;;;;;;;;;;;;;;6911:36:9::1;6920:10;6932:7;6941:5;6911:8;:36::i;:::-;-1:-1:-1::0;6965:4:9::1;463:1:0;6765:212:9::0;;;;:::o;798:223:0:-;667:19:3;675:10;667:7;:19::i;:::-;659:78;;;;-1:-1:-1;;;659:78:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;882:7:0::1;:15:::0;;-1:-1:-1;;882:15:0::1;::::0;::::1;;;::::0;;;;::::1;914:7;910:104;;;943:10;::::0;::::1;::::0;;;::::1;910:104;;;991:11;::::0;::::1;::::0;;;::::1;910:104;798:223:::0;:::o;4647:141:9:-;4768:12;;4647:141;:::o;5675:168::-;-1:-1:-1;;;;;5811:18:9;;;5779:7;5811:18;;;:9;:18;;;;;:24;;;;;5675:168::o;1917:139:3:-;1999:4;2028:20;1999:4;2040:7;2028:11;:20::i;917:150:1:-;667:19:3;675:10;667:7;:19::i;:::-;659:78;;;;-1:-1:-1;;;659:78:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1003:21:1::1;:8;1016:7:::0;1003:12:::1;:21::i;:::-;1040:19;::::0;-1:-1:-1;;;;;1040:19:1;::::1;::::0;::::1;::::0;;;::::1;917:150:::0;:::o;11927:1130:9:-;434:7:0;;12109:4:9;;434:7:0;;433:8;425:27;;;;;-1:-1:-1;;;425:27:0;;;;;;;;;;;;-1:-1:-1;;;425:27:0;;;;;;;;;;;;;;;12148:1:9::1;12139:6;:10;12131:51;;;::::0;;-1:-1:-1;;;12131:51:9;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;12216:23:9;::::1;12212:814;;12256:15;12274:17;12284:6;12274:9;:17::i;:::-;12256:35;;12324:1;12314:7;:11;12306:49;;;::::0;;-1:-1:-1;;;12306:49:9;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;12306:49:9;;;;;;;;;;;;;::::1;;12386:7;12376:6;:17;12372:157;;12414:21;12420:6;12428;12414:5;:21::i;:::-;12372:157;;;12491:22;12497:6;12505:7;12491:5;:22::i;:::-;12212:814;;;;12600:17;12620:19;12632:6;12620:11;:19::i;:::-;12600:39;;12674:1;12662:9;:13;12654:65;;;;-1:-1:-1::0;;;12654:65:9::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12752:9;12742:6;:19;;12734:76;;;;-1:-1:-1::0;;;12734:76:9::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12839:36;12849:6;12857:9;12868:6;12839:9;:36::i;:::-;12890:124;12899:6;12907:10;12919:94;12964:6;12919:94;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;12919:17:9;::::1;;::::0;;;:9:::1;:17;::::0;;;;;;;12948:10:::1;12919:40:::0;;:28:::1;;:40:::0;;;;;;;:94;:44:::1;:94::i;:::-;12890:8;:124::i;:::-;12212:814;;-1:-1:-1::0;13045:4:9::1;11927:1130:::0;;;;;:::o;637:140:1:-;719:4;748:21;:8;761:7;748:12;:21::i;6355:174:9:-;-1:-1:-1;;;;;6494:18:9;;;6454:15;6494:18;;;:9;:18;;;;;:27;;;;;6355:174::o;2206:160:2:-;667:19:3;675:10;667:7;:19::i;:::-;659:78;;;;-1:-1:-1;;;659:78:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2296:24:2::1;:8;2312:7:::0;2296:15:::1;:24::i;:::-;2336:22;::::0;-1:-1:-1;;;;;2336:22:2;::::1;::::0;::::1;::::0;;;::::1;2206:160:::0;:::o;4246:133:9:-;881:1;4246:133;:::o;4459:107::-;921:13;4459:107;:::o;5153:207::-;-1:-1:-1;;;;;5317:18:9;;;;;;:9;:18;;;;;;;;;:35;;5305:47;;;;;;;;;;;;;;;;;5260:27;;5305:47;;;5317:35;5305:47;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;5305:47:9;;;;;;;;;;;;;;;;;;;;;;;5153:207;;;:::o;5450:150::-;5566:26;;;;5450:150;:::o;9245:279::-;434:7:0;;9394:4:9;;434:7:0;;433:8;425:27;;;;;-1:-1:-1;;;425:27:0;;;;;;;;;;;;-1:-1:-1;;;425:27:0;;;;;;;;;;;;;;;638:20:2::1;647:10;638:8;:20::i;:::-;630:81;;;;-1:-1:-1::0;;;630:81:2::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9433:1:9::2;9424:6;:10;9416:43;;;::::0;;-1:-1:-1;;;9416:43:9;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;9416:43:9;;;;;;;;;;;;;::::2;;9472:22;9478:7;9487:6;9472:5;:22::i;8654:450::-:0;8734:4;8773:1;8764:6;:10;8756:43;;;;;-1:-1:-1;;;8756:43:9;;;;;;;;;;;;-1:-1:-1;;;8756:43:9;;;;;;;;;;;;;;;8812:15;8830:21;8840:10;8830:9;:21::i;:::-;8812:39;;8880:1;8870:7;:11;8862:45;;;;;-1:-1:-1;;;8862:45:9;;;;;;;;;;;;-1:-1:-1;;;8862:45:9;;;;;;;;;;;;;;;8935:6;8924:7;:17;8920:153;;8958:25;8964:10;8976:6;8958:5;:25::i;:::-;8920:153;;;9035:26;9041:10;9053:7;9035:5;:26::i;3244:486::-;-1:-1:-1;;;;;3390:29:9;;;3340:4;3390:29;;;:14;:29;;;;;;3340:4;;3390:29;3440:23;3432:64;;;;;-1:-1:-1;;;3432:64:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;3525:10;3557:1;3515:21;;;:9;:21;;;;;:30;;;-1:-1:-1;;;;;3515:30:9;:44;3507:88;;;;;-1:-1:-1;;;3507:88:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;3618:10;3608:21;;;;:9;:21;;;;;;:30;;:42;;-1:-1:-1;;;;;;3608:42:9;-1:-1:-1;;;;;3608:42:9;;;;;;;;3666:34;;3608:42;;3618:10;3666:34;;;-1:-1:-1;3718:4:9;;3244:486;-1:-1:-1;;3244:486:9:o;1441:387:3:-;667:19;675:10;667:7;:19::i;:::-;659:78;;;;-1:-1:-1;;;659:78:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1593:23:3;::::1;1585:75;;;;-1:-1:-1::0;;;1585:75:3::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1689:21;1729:17:::0;;::::1;;1721:62;;;::::0;;-1:-1:-1;;;1721:62:3;;::::1;;::::0;::::1;::::0;;;;;;;::::1;::::0;;;;;;;;;;;;;::::1;;1794:26;::::0;-1:-1:-1;;;;;1794:18:3;::::1;::::0;:26;::::1;;;::::0;1813:6;;1794:26:::1;::::0;;;1813:6;1794:18;:26;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;748:1;1441:387:::0;;:::o;1401:395:4:-;1504:19;;1476:6;;1504:19;;;;;1500:51;;-1:-1:-1;1550:1:4;1543:8;;1500:51;1591:19;;;1568;;;1591;;;;;1568:42;1564:87;;;-1:-1:-1;1632:19:4;;;;1625:26;;1564:87;1767:19;;1696:39;;;-1:-1:-1;;1717:12:4;:16;1707:27;1696:39;;;;;;;;;;;;;;;;;;;;;;;1686:50;;;;;1678:109;;1767:19;;;;;1678:84;;1686:50;;1742:19;;;;;1678:63;:84::i;:::-;:88;;:109::i;:::-;1664:124;;1401:395;:::o;4875:184:9:-;-1:-1:-1;;;;;5025:18:9;4993:7;5025:18;;;:9;:18;;;;;:26;;4875:184::o;5910:171::-;-1:-1:-1;;;;;6052:21:9;;;6012:15;6052:21;;;:14;:21;;;;;;;;5910:171::o;2291:145::-;667:19:3;675:10;667:7;:19::i;:::-;659:78;;;;-1:-1:-1;;;659:78:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2394:26:9::1;:34:::0;;-1:-1:-1;;2394:34:9::1;::::0;::::1;;::::0;;;::::1;::::0;;2291:145::o;2187:149:3:-;667:19;675:10;667:7;:19::i;:::-;659:78;;;;-1:-1:-1;;;659:78:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2273:20:::1;:7;2285::::0;2273:11:::1;:20::i;:::-;2309:19;::::0;-1:-1:-1;;;;;2309:19:3;::::1;::::0;::::1;::::0;;;::::1;2187:149:::0;:::o;6153:125:9:-;6257:13;;6153:125;:::o;2505:686::-;2581:4;2635:1;2611:21;2621:10;2611:9;:21::i;:::-;:25;2603:72;;;;-1:-1:-1;;;2603:72:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2702:1;2694:5;-1:-1:-1;;;;;2694:9:9;;2686:56;;;;-1:-1:-1;;;2686:56:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2769:10;2789:1;2759:21;;;:9;:21;;;;;:27;;;-1:-1:-1;;;;;2759:27:9;:31;2755:262;;2815:26;;;;2807:75;;;;-1:-1:-1;;;2807:75:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2904:21:9;;;;;;:14;:21;;;;;2897:28;;-1:-1:-1;;;;;;2897:28:9;;;2755:262;;;2985:13;;:20;;3003:1;2985:17;:20::i;:::-;2969:13;:36;2755:262;-1:-1:-1;;;;;3029:21:9;;;;;;:14;:21;;;;;;;;:34;;3053:10;-1:-1:-1;;;;;;3029:34:9;;;;;;;;3074:21;;;:9;:21;;;;;;-1:-1:-1;3074:27:9;:35;;;;;;;;;;3127:34;;;;;;3053:10;;3127:34;;;;;;;;;;;-1:-1:-1;3179:4:9;2505:686;;;:::o;1095:146:2:-;667:19:3;675:10;667:7;:19::i;:::-;659:78;;;;-1:-1:-1;;;659:78:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1180:19:2::1;:6;1191:7:::0;1180:10:::1;:19::i;:::-;1215:18;::::0;-1:-1:-1;;;;;1215:18:2;::::1;::::0;::::1;::::0;;;::::1;1095:146:::0;:::o;4002:137:9:-;4124:7;4117:14;;;;;;;;-1:-1:-1;;4117:14:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4086:13;;4117:14;;4124:7;;4117:14;;4124:7;4117:14;;;;;;;;;;;;;;;;;;;;;;;;1384:154:2;667:19:3;675:10;667:7;:19::i;:::-;659:78;;;;-1:-1:-1;;;659:78:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1472:22:2::1;:6;1486:7:::0;1472:13:::1;:22::i;:::-;1510:20;::::0;-1:-1:-1;;;;;1510:20:2;::::1;::::0;::::1;::::0;;;::::1;1384:154:::0;:::o;2471:157:3:-;667:19;675:10;667:7;:19::i;:::-;659:78;;;;-1:-1:-1;;;659:78:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2560:23:::1;:7;2575::::0;2560:14:::1;:23::i;:::-;2599:21;::::0;-1:-1:-1;;;;;2599:21:3;::::1;::::0;::::1;::::0;;;::::1;2471:157:::0;:::o;1909:152:2:-;667:19:3;675:10;667:7;:19::i;:::-;659:78;;;;-1:-1:-1;;;659:78:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1996:21:2::1;:8;2009:7:::0;1996:12:::1;:21::i;:::-;2033:20;::::0;-1:-1:-1;;;;;2033:20:2;::::1;::::0;::::1;::::0;;;::::1;1909:152:::0;:::o;1135:190:4:-;1262:19;;;;;;;1298;;;;;;1135:190::o;557:492::-;667:19:3;675:10;667:7;:19::i;:::-;659:78;;;;-1:-1:-1;;;659:78:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;700:4:4::1;693:3;:11;;;;685:62;;;;-1:-1:-1::0;;;685:62:4::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;773:4;766:3;:11;;;;758:62;;;;-1:-1:-1::0;;;758:62:4::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;846:3;839:10;;:3;:10;;;;831:58;;;;-1:-1:-1::0;;;831:58:4::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;902:19;:25:::0;;::::1;938::::0;;::::1;::::0;;;::::1;-1:-1:-1::0;;902:25:4;;::::1;-1:-1:-1::0;;902:25:4;;::::1;::::0;;;::::1;938::::0;;;::::1;;1018:19:::0;;::::1;996::::0;;::::1;::::0;::::1;:41:::0;;;::::1;902:25:::0;996:45:::1;974:67:::0;;::::1;::::0;::::1;-1:-1:-1::0;;974:67:4;;::::1;::::0;;;::::1;::::0;;557:492::o;10510:963:9:-;434:7:0;;10663:4:9;;434:7:0;;433:8;425:27;;;;;-1:-1:-1;;;425:27:0;;;;;;;;;;;;-1:-1:-1;;;425:27:0;;;;;;;;;;;;;;;10702:1:9::1;10693:6;:10;10685:47;;;::::0;;-1:-1:-1;;;10685:47:9;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;10766:23:9;::::1;10762:680;;10806:15;10824:21;10834:10;10824:9;:21::i;:::-;10806:39;;10878:1;10868:7;:11;10860:49;;;::::0;;-1:-1:-1;;;10860:49:9;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;10860:49:9;;;;;;;;;;;;;::::1;;10940:7;10930:6;:17;10926:165;;10968:25;10974:10;10986:6;10968:5;:25::i;:::-;10926:165;;;11049:26;11055:10;11067:7;11049:5;:26::i;:::-;10762:680;;;;11155:17;11175:23;11187:10;11175:11;:23::i;:::-;11155:43;;11233:1;11221:9;:13;11213:61;;;;-1:-1:-1::0;;;11213:61:9::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11307:9;11297:6;:19;;11289:72;;;;-1:-1:-1::0;;;11289:72:9::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11390:40;11400:10;11412:9;11423:6;11390:9;:40::i;:::-;10762:680;-1:-1:-1::0;11461:4:9::1;10510:963:::0;;;;:::o;1627:141:2:-;1710:4;1739:21;:8;1752:7;1739:12;:21::i;571:112:0:-;668:7;;;;571:112;:::o;2074:134:9:-;667:19:3;675:10;667:7;:19::i;:::-;659:78;;;;-1:-1:-1;;;659:78:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2185:15:9::1;:7;2195:5:::0;;2185:15:::1;:::i;:::-;;2074:134:::0;;:::o;1211:158:1:-;667:19:3;675:10;667:7;:19::i;:::-;659:78;;;;-1:-1:-1;;;659:78:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1300:24:1::1;:8;1316:7:::0;1300:15:::1;:24::i;:::-;1340:21;::::0;-1:-1:-1;;;;;1340:21:1;::::1;::::0;::::1;::::0;;;::::1;1211:158:::0;:::o;7487:713:9:-;7605:16;;7639:554;-1:-1:-1;;;;;7663:18:9;;;;;;:9;:18;;;;;:35;;:42;7659:46;;7639:554;;;-1:-1:-1;;;;;7749:18:9;;7800:1;7749:18;;;:9;:18;;;;;:35;;:38;;7785:1;;7749:38;;;;;;;;;;;;;;;;-1:-1:-1;;;;;7749:38:9;:53;;;;:150;;-1:-1:-1;;;;;;7859:18:9;;;;;;:9;:18;;;;;:35;;:38;;7840:59;;7859:35;7895:1;;7859:38;;;;;;;;;;;;;;;;-1:-1:-1;;;;;7859:38:9;7840:10;:59::i;:::-;7727:455;;;-1:-1:-1;;;;;7938:18:9;;;;;;:9;:18;;;;;:35;;:38;;7974:1;;7938:38;;;;;;;;;;;;;;;;;:57;;;-1:-1:-1;;;7938:57:9;;-1:-1:-1;;;;;7938:57:9;;;;;;;;;:38;;;;;:48;;:57;;;;;;;;;;;:38;:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7938:57:9;;;7934:233;;;;;8054:19;:8;8067:5;8054:12;:19::i;:::-;8043:30;;7996:97;7934:233;7707:3;;7639:554;;;;7487:713;;;:::o;1822:130::-;667:19:3;675:10;667:7;:19::i;:::-;659:78;;;;-1:-1:-1;;;659:78:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1931:13:9::1;:5;1939::::0;;1931:13:::1;:::i;8314:184::-:0;8416:7;8448:42;8471:18;8481:7;8471:9;:18::i;:::-;8448;8458:7;8448:9;:18::i;:::-;:22;;:42::i;7180:218::-;-1:-1:-1;;;;;7354:16:9;;;7322:7;7354:16;;;:9;:16;;;;;;;;:36;;;;;;:27;;;;:36;;;;;;7180:218::o;874:465:3:-;667:19;675:10;667:7;:19::i;:::-;659:78;;;;-1:-1:-1;;;659:78:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1059:9;-1:-1:-1;;;;;1088:23:3;::::1;1080:73;;;;-1:-1:-1::0;;;1080:73:3::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1164:15;1182:6;-1:-1:-1::0;;;;;1182:16:3::1;;1207:4;1182:31;;;;;;;;;;;;;-1:-1:-1::0;;;;;1182:31:3::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;1182:31:3;;-1:-1:-1;1234:17:3;;::::1;;1226:60;;;::::0;;-1:-1:-1;;;1226:60:3;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;1297:6;-1:-1:-1::0;;;;;1297:15:3::1;;1313:9;1324:6;1297:34;;;;;;;;;;;;;-1:-1:-1::0;;;;;1297:34:3::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;;;;;;874:465:3:o;819:137:2:-;900:4;929:19;:6;940:7;929:10;:19::i;9690:450:9:-;434:7:0;;9884:4:9;;434:7:0;;433:8;425:27;;;;;-1:-1:-1;;;425:27:0;;;;;;;;;;;;-1:-1:-1;;;425:27:0;;;;;;;;;;;;;;;638:20:2::1;647:10;638:8;:20::i;:::-;630:81;;;;-1:-1:-1::0;;;630:81:2::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9923:1:9::2;9914:6;:10;9906:43;;;::::0;;-1:-1:-1;;;9906:43:9;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;9906:43:9;;;;;;;;;;;;;::::2;;-1:-1:-1::0;;;;;9968:32:9;::::2;9995:4;9968:32;;9960:87;;;;-1:-1:-1::0;;;9960:87:9::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10060:50;10077:7;10086:6;10094:15;10060:16;:50::i;297:217:7:-:0;414:18;418:4;424:7;414:3;:18::i;:::-;413:19;405:63;;;;;-1:-1:-1;;;405:63:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;479:20:7;:11;:20;;;;;;;;;;;:27;;-1:-1:-1;;479:27:7;502:4;479:27;;;297:217::o;13208:379:9:-;-1:-1:-1;;;;;13348:19:9;;13340:62;;;;;-1:-1:-1;;;13340:62:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;13421:21:9;;13413:62;;;;;-1:-1:-1;;;13413:62:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;13488:16:9;;;;;;;:9;:16;;;;;;;;:36;;;;;;:27;;;;:36;;;;;;:44;;;13548:31;;;;;;;;;;;;;;;;;13208:379;;;:::o;919:260:7:-;1043:4;-1:-1:-1;;;;;1073:21:7;;1065:68;;;;-1:-1:-1;;;1065:68:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;1151:20:7;:11;:20;;;;;;;;;;;;;;;919:260::o;13799:388:9:-;13934:68;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;13934:18:9;;-1:-1:-1;13934:18:9;;;:9;:18;;;;;;;:26;:68;;13965:6;;13934:30;:68::i;:::-;13905:9;:18;13915:7;-1:-1:-1;;;;;13905:18:9;-1:-1:-1;;;;;13905:18:9;;;;;;;;;;;;:26;;:97;;;;14028:61;14045:6;14028:61;;;;;;;;;;;;;;;;;:12;;;:61;:16;:61::i;:::-;14013:12;:76;14105:21;;;;;;;;-1:-1:-1;;;;;14105:21:9;;;;;;;;;;;;;14142:37;;;;;;;;14168:1;;-1:-1:-1;;;;;14142:37:9;;;-1:-1:-1;;;;;;;;;;;14142:37:9;;;;;;;;13799:388;;:::o;16039:1071::-;16181:14;16188:6;16181;:14::i;:::-;16180:15;:37;;;;;16200:17;16207:9;16200:6;:17::i;:::-;16199:18;16180:37;16176:682;;;16234:15;16252:17;:15;:17::i;:::-;16234:35;-1:-1:-1;16290:12:9;;;;16286:561;;16323:18;16344:31;16369:5;16344:20;:6;:20;;;:10;:20::i;:::-;:24;;:31::i;:::-;16323:52;-1:-1:-1;16394:22:9;16419;:6;16323:52;16419:10;:22::i;:::-;16494:79;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16494:17:9;;-1:-1:-1;16494:17:9;;;:9;:17;;;;;;;:25;16394:47;;-1:-1:-1;16494:79:9;;:25;16394:47;;16494:29;:79::i;:::-;-1:-1:-1;;;;;16466:17:9;;;;;;;:9;:17;;;;;;:107;;;;16623:20;;;;;;:28;:48;;16656:14;16623:32;:48::i;:::-;-1:-1:-1;;;;;16592:20:9;;;;;;;:9;:20;;;;;;;;;:79;;;;16695:43;;;;;;;16592:20;;16695:43;;;;-1:-1:-1;;;;;;;;;;;16695:43:9;;;;;;;;16763:25;16769:6;16777:10;16763:5;:25::i;:::-;16825:7;;;;;16286:561;16176:682;;16898:71;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16898:17:9;;-1:-1:-1;16898:17:9;;;:9;:17;;;;;;;:25;:71;;16928:6;;16898:29;:71::i;:::-;-1:-1:-1;;;;;16870:17:9;;;;;;;:9;:17;;;;;;:99;;;;17011:20;;;;;;:28;:40;;17044:6;17011:32;:40::i;:::-;-1:-1:-1;;;;;16980:20:9;;;;;;;:9;:20;;;;;;;;;:71;;;;17067:35;;;;;;;16980:20;;17067:35;;;;-1:-1:-1;;;;;;;;;;;17067:35:9;;;;;;;;16039:1071;;;:::o;1919:258:8:-;2066:7;2107:12;2099:6;;;;2091:29;;;;-1:-1:-1;;;2091:29:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;2143:5:8;;;1919:258::o;594:222:7:-;713:18;717:4;723:7;713:3;:18::i;:::-;705:64;;;;-1:-1:-1;;;705:64:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;780:20:7;803:5;780:20;;;;;;;;;;;:28;;-1:-1:-1;;780:28:7;;;594:222::o;14417:495:9:-;14539:12;;14523:13;;14539:24;;14556:6;14539:16;:24::i;:::-;14523:40;;921:13;14584:5;:13;;14576:57;;;;;-1:-1:-1;;;14576:57:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;14652:21:9;;14644:59;;;;;-1:-1:-1;;;14644:59:9;;;;;;;;;;;;-1:-1:-1;;;14644:59:9;;;;;;;;;;;;;;;14716:12;:20;;;-1:-1:-1;;;;;14776:18:9;;;;;;:9;:18;;;;;:26;:38;;14807:6;14776:30;:38::i;:::-;-1:-1:-1;;;;;14747:18:9;;;;;;:9;:18;;;;;;;;;:67;;;;14830:21;;;;;;;14747:18;;14830:21;;;;;;;;;14867:37;;;;;;;;-1:-1:-1;;;;;14867:37:9;;;14884:1;;-1:-1:-1;;;;;;;;;;;14867:37:9;;;;;;;;14417:495;;;:::o;4934:187:8:-;5044:7;5076:37;5080:1;5083;5076:37;;;;;;;;;;;;;;;;;:3;:37::i;:::-;5069:44;4934:187;-1:-1:-1;;;4934:187:8:o;902:238::-;1012:7;1049:5;;;1073:6;;;;1065:46;;;;;-1:-1:-1;;;1065:46:8;;;;;;;;;;;;;;;;;;;;;;;;;;;17194:205:9;17344:20;17383:8;;;17194:205::o;1423:193:8:-;1533:7;1565:43;1569:1;1572;1565:43;;;;;;;;;;;;;;;;;:3;:43::i;15138:769:9:-;15305:12;;15289:13;;15305:24;;15322:6;15305:16;:24::i;:::-;15289:40;;921:13;15350:5;:13;;15342:57;;;;;-1:-1:-1;;;15342:57:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;15418:21:9;;15410:59;;;;;-1:-1:-1;;;15410:59:9;;;;;;;;;;;;-1:-1:-1;;;15410:59:9;;;;;;;;;;;;;;;15482:12;:20;;;-1:-1:-1;;;;;15542:18:9;;;;;;:9;:18;;;;;:26;:38;;15573:6;15542:30;:38::i;:::-;-1:-1:-1;;;;;15513:18:9;;;;;;;:9;:18;;;;;;;;:67;;;15598:46;;;;;:29;;;;:46;;;;;;;;15593:215;;-1:-1:-1;;;;;15661:18:9;;;;;;;:9;:18;;;;;;;;:35;;;:67;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;15661:67:9;;;;;;;;;15743:46;;;:29;;:46;;;;;:53;;-1:-1:-1;;15743:53:9;;;;;;15593:215;15825:21;;;;;;;;-1:-1:-1;;;;;15825:21:9;;;;;;;;;;;;;15862:37;;;;;;;;-1:-1:-1;;;;;15862:37:9;;;15879:1;;-1:-1:-1;;;;;;;;;;;15862:37:9;;;;;;;;15138:769;;;;:::o;2436:528:8:-;2546:7;2796:6;2792:47;;-1:-1:-1;2826:1:8;2819:8;;2792:47;2863:5;;;2867:1;2863;:5;:1;2887:5;;;;;:10;2879:56;;;;-1:-1:-1;;;2879:56:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3440:189;3550:7;3582:39;3586:1;3589;3582:39;;;;;;;;;;;;;;;;;:3;:39::i;5606:232::-;5753:7;5794:12;5786:6;5778:29;;;;-1:-1:-1;;;5778:29:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5829:1;5825;:5;;;;;;;5606:232;-1:-1:-1;;;;5606:232:8:o;4125:344::-;4272:7;4312:12;4305:5;4297:28;;;;-1:-1:-1;;;4297:28:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4336:9;4352:1;4348;:5;;;;;;;4125:344;-1:-1:-1;;;;;4125:344:8:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;

Swarm Source

ipfs://4436dbb8aec6345ba0b9bee099512de0f4759be920bcea227c30c02da0f969a8
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.