ETH Price: $3,056.96 (+2.57%)
Gas: 1 Gwei

Token

Banana Task Force Ape (BTFA)
 

Overview

Max Total Supply

10,000 BTFA

Holders

1,494

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
voltedinu.eth
Balance
1 BTFA
0x4da0dffc3f4545aab6564245058aca42abdaf193
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Banana Task Force Ape is a collection of 10,000 Task Force Apes with over 150 unique traits— hiding out in The Jungle. Being a BTFA member includes having exclusive access to live events, and more.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
BananaTaskForceApeNft

Compiler Version
v0.5.7+commit.6da8b019

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-06-07
*/

// File: contracts/Flattened-NFTMatcha-v0.5.7.sol

/**

MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMWWWWWWWWWWWWWWWMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMWWNXXKKKKKKKXXXXKKKKKKXXNWWMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMWNXKKKKXXNWWWWMMWWWWMWWWWNXXXKKKXNWMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMWNXKKKXNWMMMMMMMMMNOdxKWMMMMMMMMWNXKKKXNWMMMMMMMMMMMMMM
MMMMMMMMMMMMMWXKKKNWMMMMMMMMMMMMNx:;;l0WMMMMMMMMMMMWNK0KXWMMMMMMMMMMMM
MMMMMMMMMMMWXKKXWMMMMMMMMMMMMMMXd:;;;;cOWMMMMMMMMMMMMMWXKKXWMMMMMMMMMM
MMMMMMMMMWNKKXWMMMMMMMMMMMMMMWKo;;col:;:kNMMMMMMMMMMMMMMWX0KNWMMMMMMMM
MMMMMMMMWX0XWMMMMMMMMMMMMMMMWOl;;oKWXkc;:dXMMMMMMMMMMMMMMMWX0XWMMMMMMM
MMMMMMMNKKNWMMMMMMMMMMMMMMMNkc;:dXMMMWOc;;oKWMMMMMMMMMMMMMMWNKKNMMMMMM
MMMMMMNKKNMMMMMMMMMMMMMMMMNx:;:xNMMMMMW0l;;l0WMMMMMMMWMMMMMMMNKKNMMMMM
MMMMMNKKNMMMMMMMMMMMMMMMMXd:;ckNMMMMMMMMKo:;cOWMMMMXkxkXWMMMMMNKKNMMMM
MMMMWK0NMMMMMMMMMMMMMMMWKo;;l0WMMMMMMMMMMXx:;:xNMMW0lccxXMMMMMMN0KWMMM
MMMMX0XWMMMMMMWWMMMMMMWOl;;oKWMMMMMMMMMMMMNkc;:dXMMNklcoKMMMMMMMX0XMMM
MMMWKKNMMWK0OkkkkkkKWNkc;:dXMMMMMMMMMMMMMMMWOl;;oKWMXdcxNMMMMMMMNKKWMM
MMMN0XWMMWNXX0OdlccdKOc;:xNMMMWXKKXNWNNNNWWMW0o;;l0WNkdKWMMMMMMMWX0NMM
MMMX0XMMMMMMMMMN0dlcdOxoONMMMMW0xdddddodxk0KNWXd:;l0Kx0WMMMMMMMMMX0XMM
MMMX0NMMMMMMMMMMWXxlcoOXWMMMMWKkolclodkKNNNNWWMNxcxOkKWMMMMMMMMMMX0XMM
MMMX0XMMMMMMMMMMMMNklclkNMMWXklccodxdodKWMMMMMMMNKOkKWMMMMMMMMMMMX0XMM
MMMN0XWMMMMMMMMMMMMNOoclxXN0occcdKX0xlco0WMMMMMMNOOXMMMMMMMMMMMMMX0NMM
MMMWKKWMMMMMMMMMMMMMW0dccoxocccdKWMWNklclONMMMMXOONMMMMMMMMMMMMMWKKWMM
MMMMX0XMMMMMMMMMMMMMMWKdcccccco0WMMMMNOoclkNWWKk0NMMMMMMMMMMMMMMX0XWMM
MMMMWKKNMMMMMMMMMMMMMMMXxlcccckNMMMMMMW0oclxK0kKWMMMMMMMMMMMMMMNKKWMMM
MMMMMN0KWMMMMMMMMMMMMMMMNklccoKWMMMMMMMWKdlcoxKWMMMMMMMMMMMMMMWK0NMMMM
MMMMMMN0KWMMMMMMMMMMMMMMMNOod0KXWMMMMMMNK0xoxXWMMMMMMMMMMMMMMWK0NMMMMM
MMMMMMMN0KNMMMMMMMMMMMMMMMWXKkll0WMMMMXdcoOKNMMMMMMMMMMMMMMMNK0NMMMMMM
MMMMMMMMNK0XWMMMMMMMMMMMMMMMNd:;cOWMWKo:;c0WMMMMMMMMMMMMMMWX0KNMMMMMMM
MMMMMMMMMWXKKNWMMMMMMMMMMMMMMXd:;cx0kl;;l0WMMMMMMMMMMMMMWNKKXWMMMMMMMM
MMMMMMMMMMMWX0KNWMMMMMMMMMMMMMNkc;;::;:oKWMMMMMMMMMMMMWNK0XWMMMMMMMMMM
MMMMMMMMMMMMMNXKKXNWMMMMMMMMMMMWOc;;;:dXMMMMMMMMMMMWNXKKXWMMMMMMMMMMMM
MMMMMMMMMMMMMMMWNKKKXNWMMMMMMMMMW0l:ckNMMMMMMMMMWNXKKKNWMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMWNXKKKXXNWWWMMMMX0KWMMMWWWNXXKKKXNWMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMWWNXXKKKKKXXXXXXXXXXKKKKXXNWWMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMWWNNNNNNNNNNNNWWWMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM


---------------------- [ WPSmartContracts.com ] ----------------------

                       [ Blockchain Made Easy ]


    |
    |  ERC-721 NFT Marketplace
    |
    |----------------------------
    |
    |  Flavors
    |
    |  >  Matcha: Fully featured ERC-721 Token, with Buy, 
    |     Sell and Auction NFT Marketplace
    |


*/

pragma solidity ^0.5.7;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

/**
 * @dev Required interface of an ERC721 compliant contract.
 */
contract IERC721 is IERC165 {
    event Transfer(
        address indexed from,
        address indexed to,
        uint256 indexed tokenId
    );
    event Approval(
        address indexed owner,
        address indexed approved,
        uint256 indexed tokenId
    );
    event ApprovalForAll(
        address indexed owner,
        address indexed operator,
        bool approved
    );

    /**
     * @dev Returns the number of NFTs in `owner`'s account.
     */
    function balanceOf(address owner) public view returns (uint256 balance);

    /**
     * @dev Returns the owner of the NFT specified by `tokenId`.
     */
    function ownerOf(uint256 tokenId) public view returns (address owner);

    /**
     * @dev Transfers a specific NFT (`tokenId`) from one account (`from`) to
     * another (`to`).
     *
     *
     *
     * Requirements:
     * - `from`, `to` cannot be zero.
     * - `tokenId` must be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this
     * NFT by either {approve} or {setApproveForAll}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public;

    /**
     * @dev Transfers a specific NFT (`tokenId`) from one account (`from`) to
     * another (`to`).
     *
     * Requirements:
     * - If the caller is not `from`, it must be approved to move this NFT by
     * either {approve} or {setApproveForAll}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public;

    function approve(address to, uint256 tokenId) public;

    function getApproved(uint256 tokenId)
        public
        view
        returns (address operator);

    function setApprovalForAll(address operator, bool _approved) public;

    function isApprovedForAll(address owner, address operator)
        public
        view
        returns (bool);

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory data
    ) public;
}

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
contract IERC721Receiver {
    /**
     * @notice Handle the receipt of an NFT
     * @dev The ERC721 smart contract calls this function on the recipient
     * after a {IERC721-safeTransfer}. This function MUST return the function selector,
     * otherwise the caller will revert the transaction. The selector to be
     * returned can be obtained as `this.onERC721Received.selector`. This
     * function MAY throw to revert and reject the transfer.
     * Note: the ERC721 contract address is always the message sender.
     * @param operator The address which called `safeTransferFrom` function
     * @param from The address which previously owned the token
     * @param tokenId The NFT identifier which is being transferred
     * @param data Additional data with no specified format
     * @return bytes4 `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes memory data
    ) public returns (bytes4);
}

/**
 * @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) {
        require(b <= a, "SafeMath: subtraction overflow");
        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-solidity/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) {
        // Solidity only automatically asserts when dividing by 0
        require(b > 0, "SafeMath: division by zero");
        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) {
        require(b != 0, "SafeMath: modulo by zero");
        return a % b;
    }
}

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * This test is non-exhaustive, and there may be false-negatives: during the
     * execution of a contract's constructor, its address will be reported as
     * not containing a contract.
     *
     * IMPORTANT: It is unsafe to assume that an address for which this
     * function returns false is an externally-owned account (EOA) and not a
     * contract.
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies in extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        // According to EIP-1052, 0x0 is the value returned for not-yet created accounts
        // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned
        // for accounts without code, i.e. `keccak256('')`
        bytes32 codehash;
        bytes32 accountHash =
            0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
        // solhint-disable-next-line no-inline-assembly
        assembly {
            codehash := extcodehash(account)
        }
        return (codehash != 0x0 && codehash != accountHash);
    }

    /**
     * @dev Converts an `address` into `address payable`. Note that this is
     * simply a type cast: the actual underlying value is not changed.
     */
    function toPayable(address account)
        internal
        pure
        returns (address payable)
    {
        return address(uint160(account));
    }
}

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented or decremented by one. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 * Since it is not possible to overflow a 256 bit integer with increments of one, `increment` can skip the {SafeMath}
 * overflow check, thereby saving gas. This does assume however correct usage, in that the underlying `_value` is never
 * directly accessed.
 */
library Counters {
    using SafeMath for uint256;

    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        counter._value += 1;
    }

    function decrement(Counter storage counter) internal {
        counter._value = counter._value.sub(1);
    }
}

/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts may inherit from this and call {_registerInterface} to declare
 * their support of an interface.
 */
contract ERC165 is IERC165 {
    /*
     * bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7
     */
    bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7;

    /**
     * @dev Mapping of interface ids to whether or not it's supported.
     */
    mapping(bytes4 => bool) private _supportedInterfaces;

    constructor() internal {
        // Derived contracts need only register support for their own interfaces,
        // we register support for ERC165 itself here
        _registerInterface(_INTERFACE_ID_ERC165);
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     *
     * Time complexity O(1), guaranteed to always use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId)
        external
        view
        returns (bool)
    {
        return _supportedInterfaces[interfaceId];
    }

    /**
     * @dev Registers the contract as an implementer of the interface defined by
     * `interfaceId`. Support of the actual ERC165 interface is automatic and
     * registering its interface id is not required.
     *
     * See {IERC165-supportsInterface}.
     *
     * Requirements:
     *
     * - `interfaceId` cannot be the ERC165 invalid interface (`0xffffffff`).
     */
    function _registerInterface(bytes4 interfaceId) internal {
        require(interfaceId != 0xffffffff, "ERC165: invalid interface id");
        _supportedInterfaces[interfaceId] = true;
    }
}

/**
 * @title ERC721 Non-Fungible Token Standard basic implementation
 * @dev see https://eips.ethereum.org/EIPS/eip-721
 */
contract ERC721 is ERC165, IERC721 {
    using SafeMath for uint256;
    using Address for address;
    using Counters for Counters.Counter;

    // Equals to `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`
    // which can be also obtained as `IERC721Receiver(0).onERC721Received.selector`
    bytes4 private constant _ERC721_RECEIVED = 0x150b7a02;

    // Mapping from token ID to owner
    mapping(uint256 => address) private _tokenOwner;

    // Mapping from token ID to approved address
    mapping(uint256 => address) private _tokenApprovals;

    // Mapping from owner to number of owned token
    mapping(address => Counters.Counter) private _ownedTokensCount;

    // Mapping from owner to operator approvals
    mapping(address => mapping(address => bool)) private _operatorApprovals;

    /*
     *     bytes4(keccak256('balanceOf(address)')) == 0x70a08231
     *     bytes4(keccak256('ownerOf(uint256)')) == 0x6352211e
     *     bytes4(keccak256('approve(address,uint256)')) == 0x095ea7b3
     *     bytes4(keccak256('getApproved(uint256)')) == 0x081812fc
     *     bytes4(keccak256('setApprovalForAll(address,bool)')) == 0xa22cb465
     *     bytes4(keccak256('isApprovedForAll(address,address)')) == 0xe985e9c5
     *     bytes4(keccak256('transferFrom(address,address,uint256)')) == 0x23b872dd
     *     bytes4(keccak256('safeTransferFrom(address,address,uint256)')) == 0x42842e0e
     *     bytes4(keccak256('safeTransferFrom(address,address,uint256,bytes)')) == 0xb88d4fde
     *
     *     => 0x70a08231 ^ 0x6352211e ^ 0x095ea7b3 ^ 0x081812fc ^
     *        0xa22cb465 ^ 0xe985e9c ^ 0x23b872dd ^ 0x42842e0e ^ 0xb88d4fde == 0x80ac58cd
     */
    bytes4 private constant _INTERFACE_ID_ERC721 = 0x80ac58cd;

    constructor() public {
        // register the supported interfaces to conform to ERC721 via ERC165
        _registerInterface(_INTERFACE_ID_ERC721);
    }

    /**
     * @dev Gets the balance of the specified address.
     * @param owner address to query the balance of
     * @return uint256 representing the amount owned by the passed address
     */
    function balanceOf(address owner) public view returns (uint256) {
        require(
            owner != address(0),
            "ERC721: balance query for the zero address"
        );

        return _ownedTokensCount[owner].current();
    }

    /**
     * @dev Gets the owner of the specified token ID.
     * @param tokenId uint256 ID of the token to query the owner of
     * @return address currently marked as the owner of the given token ID
     */
    function ownerOf(uint256 tokenId) public view returns (address) {
        address owner = _tokenOwner[tokenId];
        require(
            owner != address(0),
            "ERC721: owner query for nonexistent token"
        );

        return owner;
    }

    /**
     * @dev Approves another address to transfer the given token ID
     * The zero address indicates there is no approved address.
     * There can only be one approved address per token at a given time.
     * Can only be called by the token owner or an approved operator.
     * @param to address to be approved for the given token ID
     * @param tokenId uint256 ID of the token to be approved
     */
    function approve(address to, uint256 tokenId) public {
        address owner = ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(
            msg.sender == owner || isApprovedForAll(owner, msg.sender),
            "ERC721: approve caller is not owner nor approved for all"
        );

        _tokenApprovals[tokenId] = to;
        emit Approval(owner, to, tokenId);
    }

    /**
     * @dev Gets the approved address for a token ID, or zero if no address set
     * Reverts if the token ID does not exist.
     * @param tokenId uint256 ID of the token to query the approval of
     * @return address currently approved for the given token ID
     */
    function getApproved(uint256 tokenId) public view returns (address) {
        require(
            _exists(tokenId),
            "ERC721: approved query for nonexistent token"
        );

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev Sets or unsets the approval of a given operator
     * An operator is allowed to transfer all tokens of the sender on their behalf.
     * @param to operator address to set the approval
     * @param approved representing the status of the approval to be set
     */
    function setApprovalForAll(address to, bool approved) public {
        require(to != msg.sender, "ERC721: approve to caller");

        _operatorApprovals[msg.sender][to] = approved;
        emit ApprovalForAll(msg.sender, to, approved);
    }

    /**
     * @dev Tells whether an operator is approved by a given owner.
     * @param owner owner address which you want to query the approval of
     * @param operator operator address which you want to query the approval of
     * @return bool whether the given operator is approved by the given owner
     */
    function isApprovedForAll(address owner, address operator)
        public
        view
        returns (bool)
    {
        return _operatorApprovals[owner][operator];
    }

    /**
     * @dev Transfers the ownership of a given token ID to another address.
     * Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     * Requires the msg.sender to be the owner, approved, or operator.
     * @param from current owner of the token
     * @param to address to receive the ownership of the given token ID
     * @param tokenId uint256 ID of the token to be transferred
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public {
        //solhint-disable-next-line max-line-length
        require(
            _isApprovedOrOwner(msg.sender, tokenId),
            "ERC721: transfer caller is not owner nor approved"
        );

        _transferFrom(from, to, tokenId);
    }

    /**
     * @dev Safely transfers the ownership of a given token ID to another address
     * If the target address is a contract, it must implement {IERC721Receiver-onERC721Received},
     * which is called upon a safe transfer, and return the magic value
     * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; otherwise,
     * the transfer is reverted.
     * Requires the msg.sender to be the owner, approved, or operator
     * @param from current owner of the token
     * @param to address to receive the ownership of the given token ID
     * @param tokenId uint256 ID of the token to be transferred
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public {
        safeTransferFrom(from, to, tokenId, "");
    }

    /**
     * @dev Safely transfers the ownership of a given token ID to another address
     * If the target address is a contract, it must implement {IERC721Receiver-onERC721Received},
     * which is called upon a safe transfer, and return the magic value
     * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; otherwise,
     * the transfer is reverted.
     * Requires the msg.sender to be the owner, approved, or operator
     * @param from current owner of the token
     * @param to address to receive the ownership of the given token ID
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes data to send along with a safe transfer check
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public {
        transferFrom(from, to, tokenId);
        require(
            _checkOnERC721Received(from, to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Returns whether the specified token exists.
     * @param tokenId uint256 ID of the token to query the existence of
     * @return bool whether the token exists
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        address owner = _tokenOwner[tokenId];
        return owner != address(0);
    }

    /**
     * @dev Returns whether the given spender can transfer a given token ID.
     * @param spender address of the spender to query
     * @param tokenId uint256 ID of the token to be transferred
     * @return bool whether the msg.sender is approved for the given token ID,
     * is an operator of the owner, or is the owner of the token
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId)
        internal
        view
        returns (bool)
    {
        require(
            _exists(tokenId),
            "ERC721: operator query for nonexistent token"
        );
        address owner = ownerOf(tokenId);
        return (spender == owner ||
            getApproved(tokenId) == spender ||
            isApprovedForAll(owner, spender));
    }

    /**
     * @dev Internal function to mint a new token.
     * Reverts if the given token ID already exists.
     * @param to The address that will own the minted token
     * @param tokenId uint256 ID of the token to be minted
     */
    function _mint(address to, uint256 tokenId) internal {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _tokenOwner[tokenId] = to;
        _ownedTokensCount[to].increment();

        emit Transfer(address(0), to, tokenId);
    }

    /**
     * @dev Internal function to transfer ownership of a given token ID to another address.
     * As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     * @param from current owner of the token
     * @param to address to receive the ownership of the given token ID
     * @param tokenId uint256 ID of the token to be transferred
     */
    function _transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) internal {
        require(
            ownerOf(tokenId) == from,
            "ERC721: transfer of token that is not own"
        );
        require(to != address(0), "ERC721: transfer to the zero address");

        _clearApproval(tokenId);

        _ownedTokensCount[from].decrement();
        _ownedTokensCount[to].increment();

        _tokenOwner[tokenId] = to;

        emit Transfer(from, to, tokenId);
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * This function is deprecated.
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal returns (bool) {
        if (!to.isContract()) {
            return true;
        }

        bytes4 retval =
            IERC721Receiver(to).onERC721Received(
                msg.sender,
                from,
                tokenId,
                _data
            );
        return (retval == _ERC721_RECEIVED);
    }

    /**
     * @dev Private function to clear current approval of a given token ID.
     * @param tokenId uint256 ID of the token to be transferred
     */
    function _clearApproval(uint256 tokenId) private {
        if (_tokenApprovals[tokenId] != address(0)) {
            _tokenApprovals[tokenId] = address(0);
        }
    }
}

/**
 * @title Roles
 * @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];
    }
}

contract MinterRole {
    using Roles for Roles.Role;

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

    Roles.Role private _minters;

    constructor() internal {
        _addMinter(msg.sender);
    }

    modifier onlyMinter() {
        require(
            isMinter(msg.sender),
            "MinterRole: caller does not have the Minter role"
        );
        _;
    }

    function isMinter(address account) public view returns (bool) {
        return _minters.has(account);
    }

    function addMinter(address account) public onlyMinter {
        _addMinter(account);
    }

    function renounceMinter() public {
        _removeMinter(msg.sender);
    }

    function _addMinter(address account) internal {
        _minters.add(account);
        emit MinterAdded(account);
    }

    function _removeMinter(address account) internal {
        _minters.remove(account);
        emit MinterRemoved(account);
    }
}

/**
 * @title ERC721Mintable
 * @dev ERC721 minting logic.
 */
contract ERC721Mintable is ERC721, MinterRole {

    bool public anyoneCanMint;
    
    /**
     * @dev Options to activate or deactivate mint ability
     */

    function _setMintableOption(bool _anyoneCanMint) internal {
        anyoneCanMint = _anyoneCanMint;
    }

    /**
     * @dev Function to mint tokens.
     * @param to The address that will receive the minted tokens.
     * @param tokenId The token id to mint.
     * @return A boolean that indicates if the operation was successful.
     */
    function mint(address to, uint256 tokenId)
        public
        onlyMinter
        returns (bool)
    {
        _mint(to, tokenId);
        return true;
    }

    function canIMint() public view returns (bool) {
        return anyoneCanMint || isMinter(msg.sender);
    }

    /**
     * Open modifier to anyone can mint possibility
     */
    modifier onlyMinter() {
        string memory mensaje;
        require(
            canIMint(),
            "MinterRole: caller does not have the Minter role"
        );
        _;
    }

}

/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
contract IERC721Enumerable is IERC721 {
    function totalSupply() public view returns (uint256);
    function tokenOfOwnerByIndex(address owner, uint256 index) public view returns (uint256 tokenId);
    function tokenByIndex(uint256 index) public view returns (uint256);
}

/**
 * @title ERC-721 Non-Fungible Token with optional enumeration extension logic
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
contract ERC721Enumerable is ERC165, ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => uint256[]) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

    /*
     *     bytes4(keccak256('totalSupply()')) == 0x18160ddd
     *     bytes4(keccak256('tokenOfOwnerByIndex(address,uint256)')) == 0x2f745c59
     *     bytes4(keccak256('tokenByIndex(uint256)')) == 0x4f6ccce7
     *
     *     => 0x18160ddd ^ 0x2f745c59 ^ 0x4f6ccce7 == 0x780e9d63
     */
    bytes4 private constant _INTERFACE_ID_ERC721_ENUMERABLE = 0x780e9d63;

    /**
     * @dev Constructor function.
     */
    constructor () public {
        // register the supported interface to conform to ERC721Enumerable via ERC165
        _registerInterface(_INTERFACE_ID_ERC721_ENUMERABLE);
    }

    /**
     * @dev Gets the token ID at a given index of the tokens list of the requested owner.
     * @param owner address owning the tokens list to be accessed
     * @param index uint256 representing the index to be accessed of the requested tokens list
     * @return uint256 token ID at the given index of the tokens list owned by the requested address
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view returns (uint256) {
        require(index < balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

    /**
     * @dev Gets the total amount of tokens stored by the contract.
     * @return uint256 representing the total amount of tokens
     */
    function totalSupply() public view returns (uint256) {
        return _allTokens.length;
    }

    /**
     * @dev Gets the token ID at a given index of all the tokens in this contract
     * Reverts if the index is greater or equal to the total number of tokens.
     * @param index uint256 representing the index to be accessed of the tokens list
     * @return uint256 token ID at the given index of the tokens list
     */
    function tokenByIndex(uint256 index) public view returns (uint256) {
        require(index < totalSupply(), "ERC721Enumerable: global index out of bounds");
        return _allTokens[index];
    }

    /**
     * @dev Internal function to transfer ownership of a given token ID to another address.
     * As opposed to transferFrom, this imposes no restrictions on msg.sender.
     * @param from current owner of the token
     * @param to address to receive the ownership of the given token ID
     * @param tokenId uint256 ID of the token to be transferred
     */
    function _transferFrom(address from, address to, uint256 tokenId) internal {
        super._transferFrom(from, to, tokenId);

        _removeTokenFromOwnerEnumeration(from, tokenId);

        _addTokenToOwnerEnumeration(to, tokenId);
    }

    /**
     * @dev Internal function to mint a new token.
     * Reverts if the given token ID already exists.
     * @param to address the beneficiary that will own the minted token
     * @param tokenId uint256 ID of the token to be minted
     */
    function _mint(address to, uint256 tokenId) internal {
        super._mint(to, tokenId);

        _addTokenToOwnerEnumeration(to, tokenId);

        _addTokenToAllTokensEnumeration(tokenId);
    }

    /**
     * @dev Gets the list of token IDs of the requested owner.
     * @param owner address owning the tokens
     * @return uint256[] List of token IDs owned by the requested address
     */
    function _tokensOfOwner(address owner) internal view returns (uint256[] storage) {
        return _ownedTokens[owner];
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        _ownedTokensIndex[tokenId] = _ownedTokens[to].length;
        _ownedTokens[to].push(tokenId);
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _ownedTokens[from].length.sub(1);
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        _ownedTokens[from].length--;

        // Note that _ownedTokensIndex[tokenId] hasn't been cleared: it still points to the old slot (now occupied by
        // lastTokenId, or just over the end of the array if the token was the last one).
    }

}

/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
contract IERC721Metadata is IERC721 {
    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
    function tokenURI(uint256 tokenId) external view returns (string memory);
}

contract ERC721Metadata is ERC165, ERC721, IERC721Metadata {
    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Whether to display the real token URI
    bool public opened;

    // Optional mapping for token URIs
    mapping(uint256 => string) private _tokenURIs;

    /*
     *     bytes4(keccak256('name()')) == 0x06fdde03
     *     bytes4(keccak256('symbol()')) == 0x95d89b41
     *     bytes4(keccak256('tokenURI(uint256)')) == 0xc87b56dd
     *
     *     => 0x06fdde03 ^ 0x95d89b41 ^ 0xc87b56dd == 0x5b5e139f
     */
    bytes4 private constant _INTERFACE_ID_ERC721_METADATA = 0x5b5e139f;

    /**
     * @dev Constructor function
     */
    constructor (string memory name, string memory symbol) public {
        _name = name;
        _symbol = symbol;

        // register the supported interfaces to conform to ERC721 via ERC165
        _registerInterface(_INTERFACE_ID_ERC721_METADATA);
    }

    /**
     * @dev Gets the token name.
     * @return string representing the token name
     */
    function name() external view returns (string memory) {
        return _name;
    }

    /**
     * @dev Gets the token symbol.
     * @return string representing the token symbol
     */
    function symbol() external view returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns an URI for a given token ID.
     * Throws if the token ID does not exist. May return an empty string.
     * @param tokenId uint256 ID of the token to query
     */
    function tokenURI(uint256 tokenId) external view returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
        if (opened) {
            return _tokenURIs[tokenId];
        } else {
            return "https://nftstorage.link/ipfs/bafkreibtcne3eh64i2qggvmwded2o3hn42xch34fwed5awxkkmd7a6vu24";
        }
    }

    /**
     * @dev Internal function to set the token URI for a given token.
     * Reverts if the token ID does not exist.
     * @param tokenId uint256 ID of the token to set its URI
     * @param uri string URI to assign
     */
    function _setTokenURI(uint256 tokenId, string memory uri) internal {
        require(_exists(tokenId), "ERC721Metadata: URI set of nonexistent token");
        _tokenURIs[tokenId] = uri;
    }
}

/**
 * @title ERC721MetadataMintable
 * @dev ERC721 minting logic with metadata.
 */
contract ERC721MetadataMintable is ERC721, ERC721Metadata, MinterRole {
    /**
     * @dev Function to mint tokens.
     * @param to The address that will receive the minted tokens.
     * @param tokenId The token id to mint.
     * @param tokenURI The token URI of the minted token.
     * @return A boolean that indicates if the operation was successful.
     */
    function mintWithTokenURI(address to, uint256 tokenId, string memory tokenURI) public onlyMinter returns (bool) {
        return _mintWithTokenURI(to, tokenId, tokenURI);
    }

    function _mintWithTokenURI(address to, uint256 tokenId, string memory tokenURI) internal returns (bool) {
        _mint(to, tokenId);
        _setTokenURI(tokenId, tokenURI);
        return true;
    } 
}

/**
 * @title ERC721
 * Full ERC-721 Token with automint function
 */

contract ERC721Full is ERC721, ERC721Enumerable, ERC721Metadata, ERC721Mintable, ERC721MetadataMintable {

    uint256 autoTokenId;
    constructor (string memory name, string memory symbol, bool _anyoneCanMint) public 
        ERC721Mintable() 
        ERC721Metadata(name, symbol) {
        // solhint-disable-previous-line no-empty-blocks

        _setMintableOption(_anyoneCanMint);

    }

    function exists(uint256 tokenId) public view returns (bool) {
        return _exists(tokenId);
    }

    function tokensOfOwner(address owner) public view returns (uint256[] memory) {
        return _tokensOfOwner(owner);
    }

    function setTokenURI(uint256 tokenId, string memory uri) public {
        _setTokenURI(tokenId, uri);
    }

    /**
     * @dev Function to mint tokens with automatic ID
     * @param to The address that will receive the minted tokens.
     * @return A boolean that indicates if the operation was successful.
     */
    function autoMint(string memory tokenURI, address to) public onlyMinter returns (uint256) {
        do {
            autoTokenId++;
        } while(_exists(autoTokenId));
        _mint(to, autoTokenId);
        _setTokenURI(autoTokenId, tokenURI);
        return autoTokenId;
    }

    /**
     * @dev Function to transfer tokens
     * @param to The address that will receive the minted tokens.
     * @param tokenId the token ID
     */
    function transfer(
        address to,
        uint256 tokenId
    ) public {
        _transferFrom(msg.sender, to, tokenId);
    }

}

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be aplied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 */
contract ReentrancyGuard {
    // counter to allow mutex lock with only one SSTORE operation
    uint256 private _guardCounter;

    constructor () internal {
        // The counter starts at one to prevent changing it from zero to a non-zero
        // value, which is a more expensive operation.
        _guardCounter = 1;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and make it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        _guardCounter += 1;
        uint256 localCounter = _guardCounter;
        _;
        require(localCounter == _guardCounter, "ReentrancyGuard: reentrant call");
    }
}

/**
 * @title ERC721Matcha
 * ERC-721 Marketplace
 */

contract BananaTaskForceApeNft is ERC721Full, ReentrancyGuard {

    using SafeMath for uint256;

    using Address for address payable;

    // admin address, the owner of the marketplace
    address payable admin;

    address public contract_owner;

    // commission rate is a value from 0 to 100
    uint256 commissionRate;

    // last price sold or auctioned
    mapping(uint256 => uint256) public soldFor;
    
    // Mapping from token ID to sell price in Ether or to bid price, depending if it is an auction or not
    mapping(uint256 => uint256) public sellBidPrice;

    // Mapping payment address for tokenId 
    mapping(uint256 => address payable) private _wallets;

    event Sale(uint256 indexed tokenId, address indexed from, address indexed to, uint256 value);
    event Commission(uint256 indexed tokenId, address indexed to, uint256 value, uint256 rate, uint256 total);

    /*

    index   _isAuction  _sellBidPrice   Meaning
    0       true        0               Item 0 is on auction and no bids so far
    1       true        10              Item 1 is on auction and the last bid is for 10 Ethers
    2       false       0               Item 2 is not on auction nor for sell
    3       false       10              Item 3 is on sale for 10 Ethers

    */

    // Auction data
    struct Auction {

        // Parameters of the auction. Times are either
        // absolute unix timestamps (seconds since 1970-01-01)
        // or time periods in seconds.
        address payable beneficiary;
        uint auctionEnd;

        // Current state of the auction.
        address payable highestBidder;
        uint highestBid;

        // Set to true at the end, disallows any change
        bool open;

        // minimum reserve price in wei
        uint256 reserve;

    }

    // mapping auctions for each tokenId
    mapping(uint256 => Auction) public auctions;

    // Events that will be fired on changes.
    event Refund(address bidder, uint amount);
    event HighestBidIncreased(address indexed bidder, uint amount, uint256 tokenId);
    event AuctionEnded(address winner, uint amount);

    event LimitSell(address indexed from, address indexed to, uint256 amount);
    event LimitBuy(address indexed from, address indexed to, uint256 amount);
    event MarketSell(address indexed from, address indexed to, uint256 amount);
    event MarketBuy(address indexed from, address indexed to, uint256 amount);


    constructor() public 
        ERC721Full("Banana Task Force Ape", "BTFA", false) {
        admin = 0x024cd9a40a7f780d9F3582496A5f3c00bb22c3C6;
        contract_owner = msg.sender;
        commissionRate = 15;

        onlyWhitelist = true;
        whitelistLimit = 10;
        buyLimit = 5;
        reserveLimit = 500;

        cost = 99 * 10 ** 15;
        total = 10000;
        remaining = 10000;
    }

    function canSell(uint256 tokenId) public view returns (bool) {
        return (ownerOf(tokenId)==msg.sender && !auctions[tokenId].open);
    }

    // Sell option for a fixed price
    function sell(uint256 tokenId, uint256 price, address payable wallet) public {

        // onlyOwner
        require(ownerOf(tokenId)==msg.sender, "ERC721Matcha: Only owner can sell this item");

        // cannot set a price if auction is activated
        require(!auctions[tokenId].open, "ERC721Matcha: Cannot sell an item which has an active auction");

        // set sell price for index
        sellBidPrice[tokenId] = price;

        // If price is zero, means not for sale
        if (price>0) {

            // approve the Index to the current contract
            approve(address(this), tokenId);
            
            // set wallet payment
            _wallets[tokenId] = wallet;
            
        }

    }

    // simple function to return the price of a tokenId
    // returns: sell price, bid price, sold price, only one can be non zero
    function getPrice(uint256 tokenId) public view returns (uint256, uint256, uint256) {
        if (sellBidPrice[tokenId]>0) return (sellBidPrice[tokenId], 0, 0);
        if (auctions[tokenId].highestBid>0) return (0, auctions[tokenId].highestBid, 0);
        return (0, 0, soldFor[tokenId]);
    }

    function canBuy(uint256 tokenId) public view returns (uint256) {
        if (!auctions[tokenId].open && sellBidPrice[tokenId]>0 && sellBidPrice[tokenId]>0 && getApproved(tokenId) == address(this)) {
            return sellBidPrice[tokenId];
        } else {
            return 0;
        }
    }

    // Buy option
    function buy(uint256 tokenId) public payable nonReentrant {

        // is on sale
        require(!auctions[tokenId].open && sellBidPrice[tokenId]>0, "ERC721Matcha: The collectible is not for sale");

        // transfer funds
        require(msg.value >= sellBidPrice[tokenId], "ERC721Matcha: Not enough funds");

        // transfer ownership
        address owner = ownerOf(tokenId);

        require(msg.sender!=owner, "ERC721Matcha: The seller cannot buy his own collectible");

        // we need to call a transferFrom from this contract, which is the one with permission to sell the NFT
        callOptionalReturn(this, abi.encodeWithSelector(this.transferFrom.selector, owner, msg.sender, tokenId));

        // calculate amounts
        uint256 amount4admin = msg.value.mul(commissionRate).div(100);
        uint256 amount4owner = msg.value.sub(amount4admin);

        // to owner
        (bool success, ) = _wallets[tokenId].call.value(amount4owner)("");
        require(success, "Transfer failed.");

        // to admin
        (bool success2, ) = admin.call.value(amount4admin)("");
        require(success2, "Transfer failed.");

        // close the sell
        sellBidPrice[tokenId] = 0;
        _wallets[tokenId] = address(0);

        soldFor[tokenId] = msg.value;

        emit Sale(tokenId, owner, msg.sender, msg.value);
        emit Commission(tokenId, owner, msg.value, commissionRate, amount4admin);

    }

    function canAuction(uint256 tokenId) public view returns (bool) {
        return (ownerOf(tokenId)==msg.sender && !auctions[tokenId].open && sellBidPrice[tokenId]==0);
    }

    // Instantiate an auction contract for a tokenId
    function createAuction(uint256 tokenId, uint _closingTime, address payable _beneficiary, uint256 _reservePrice) public {

        require(sellBidPrice[tokenId]==0, "ERC721Matcha: The selected NFT is open for sale, cannot be auctioned");
        require(!auctions[tokenId].open, "ERC721Matcha: The selected NFT already has an auction");
        require(ownerOf(tokenId)==msg.sender, "ERC721Matcha: Only owner can auction this item");

        auctions[tokenId].beneficiary = _beneficiary;
        auctions[tokenId].auctionEnd = _closingTime;
        auctions[tokenId].reserve = _reservePrice;
        auctions[tokenId].open = true;

        // approve the Index to the current contract
        approve(address(this), tokenId);

    }

    function canBid(uint256 tokenId) public view returns (bool) {
        if (!msg.sender.isContract() &&
            auctions[tokenId].open &&
            now <= auctions[tokenId].auctionEnd &&
            msg.sender != ownerOf(tokenId) &&
            getApproved(tokenId) == address(this)
        ) {
            return true;
        } else {
            return false;
        }
    }

    /// Bid on the auction with the value sent
    /// together with this transaction.
    /// The value will only be refunded if the
    /// auction is not won.
    function bid(uint256 tokenId) public payable nonReentrant {
        // No arguments are necessary, all
        // information is already part of
        // the transaction. The keyword payable
        // is required for the function to
        // be able to receive Ether.

        // Contracts cannot bid, because they can block the auction with a reentrant attack
        require(!msg.sender.isContract(), "No script kiddies");

        // auction has to be opened
        require(auctions[tokenId].open, "No opened auction found");

        // approve was lost
        require(getApproved(tokenId) == address(this), "Cannot complete the auction");

        // Revert the call if the bidding
        // period is over.
        require(
            now <= auctions[tokenId].auctionEnd,
            "Auction already ended."
        );

        // If the bid is not higher, send the
        // money back.
        require(
            msg.value > auctions[tokenId].highestBid,
            "There already is a higher bid."
        );

        address owner = ownerOf(tokenId);
        require(msg.sender!=owner, "ERC721Matcha: The owner cannot bid his own collectible");

        // return the funds to the previous bidder, if there is one
        if (auctions[tokenId].highestBid>0) {
            (bool success, ) = auctions[tokenId].highestBidder.call.value(auctions[tokenId].highestBid)("");
            require(success, "Transfer failed.");
            emit Refund(auctions[tokenId].highestBidder, auctions[tokenId].highestBid);
        }

        // now store the bid data
        auctions[tokenId].highestBidder = msg.sender;
        auctions[tokenId].highestBid = msg.value;
        emit HighestBidIncreased(msg.sender, msg.value, tokenId);

    }

    // anyone can execute withdraw if auction is opened and 
    // the bid time expired and the reserve was not met
    // or
    // the auction is openen but the contract is unable to transfer
    function canWithdraw(uint256 tokenId) public view returns (bool) {
        if (auctions[tokenId].open && 
            (
                (
                    now >= auctions[tokenId].auctionEnd &&
                    auctions[tokenId].highestBid > 0 &&
                    auctions[tokenId].highestBid<auctions[tokenId].reserve
                ) || 
                getApproved(tokenId) != address(this)
            )
        ) {
            return true;
        } else {
            return false;
        }
    }

    /// Withdraw a bid when the auction is not finalized
    function withdraw(uint256 tokenId) public nonReentrant returns (bool) {

        require(canWithdraw(tokenId), "Conditions to withdraw are not met");

        // transfer funds to highest bidder always
        if (auctions[tokenId].highestBid > 0) {
            (bool success, ) = auctions[tokenId].highestBidder.call.value(auctions[tokenId].highestBid)("");
            require(success, "Transfer failed.");
        }

        // finalize the auction
        delete auctions[tokenId];

    }

    function canFinalize(uint256 tokenId) public view returns (bool) {
        if (auctions[tokenId].open && 
            now >= auctions[tokenId].auctionEnd &&
            (
                auctions[tokenId].highestBid>=auctions[tokenId].reserve || 
                auctions[tokenId].highestBid==0
            )
        ) {
            return true;
        } else {
            return false;
        }
    }

    // implement the auctionFinalize including the NFT transfer logic
    function auctionFinalize(uint256 tokenId) public nonReentrant {

        require(canFinalize(tokenId), "Cannot finalize");

        if (auctions[tokenId].highestBid>0) {

            // transfer the ownership of token to the highest bidder
            address payable highestBidder = auctions[tokenId].highestBidder;

            // calculate payment amounts
            uint256 amount4admin = auctions[tokenId].highestBid.mul(commissionRate).div(100);
            uint256 amount4owner = auctions[tokenId].highestBid.sub(amount4admin);

            // to owner
            (bool success, ) = auctions[tokenId].beneficiary.call.value(amount4owner)("");
            require(success, "Transfer failed.");

            // to admin
            (bool success2, ) = admin.call.value(amount4admin)("");
            require(success2, "Transfer failed.");

            emit Sale(tokenId, auctions[tokenId].beneficiary, highestBidder, auctions[tokenId].highestBid);
            emit Commission(tokenId, auctions[tokenId].beneficiary, auctions[tokenId].highestBid, commissionRate, amount4admin);

            // transfer ownership
            address owner = ownerOf(tokenId);

            // we need to call a transferFrom from this contract, which is the one with permission to sell the NFT
            // transfer the NFT to the auction's highest bidder
            callOptionalReturn(this, abi.encodeWithSelector(this.transferFrom.selector, owner, highestBidder, tokenId));

            soldFor[tokenId] = auctions[tokenId].highestBid;

        }

        emit AuctionEnded(auctions[tokenId].highestBidder, auctions[tokenId].highestBid);

        // finalize the auction
        delete auctions[tokenId];

    }

    // Bid query functions
    function highestBidder(uint256 tokenId) public view returns (address payable) {
        return auctions[tokenId].highestBidder;
    }

    function highestBid(uint256 tokenId) public view returns (uint256) {
        return auctions[tokenId].highestBid;
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function callOptionalReturn(IERC721 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves.

        // A Solidity high level call has three parts:
        //  1. The target address is checked to verify it contains contract code
        //  2. The call itself is made, and success asserted
        //  3. The return value is decoded, which in turn checks the size of the returned data.
        // solhint-disable-next-line max-line-length
        require(address(token).isContract(), "SafeERC721: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = address(token).call(data);
        require(success, "SafeERC721: low-level call failed");

        if (returndata.length > 0) { // Return data is optional
            // solhint-disable-next-line max-line-length
            require(abi.decode(returndata, (bool)), "SafeERC721: ERC20 operation did not succeed");
        }
    }

    // Blindbox Sales

    bool public enabled;
    uint256 public reserved;
    uint256 public reserveLimit;
    bool public onlyWhitelist;
    uint256 public whitelistLimit;
    uint256 public buyLimit;

    uint256 public totalCreated;
    mapping(address => uint256[]) private ownerBoxes;
    mapping(address => bool) public whitelist;

    uint private nonce = 0;

    uint256 cost;
    uint256 total;
    uint256 remaining;

    struct Blindbox {
        uint256 id;
        address purchaser;
        uint256 tokenID;
    }

    modifier onlyOwner() {
        require(msg.sender == contract_owner, "can only be called by the contract owner");
        _;
    }

    modifier isEnabled() {
        require(enabled, "Contract is currently disabled");
        _;
    }

    function status() public view returns (bool canPurchase, uint256 boxCost, uint256 boxRemaining, uint256 hasPurchased, uint256 purchaseLimit) {
        canPurchase = enabled && ((onlyWhitelist == false && ownerBoxes[msg.sender].length < buyLimit) || (whitelist[msg.sender] && ownerBoxes[msg.sender].length < whitelistLimit));
        boxCost = cost;
        boxRemaining = remaining;
        hasPurchased = ownerBoxes[msg.sender].length;
        purchaseLimit = whitelistLimit;
    }

    function purchaseBlindbox() public payable isEnabled {
        require (remaining > 0, "No more blindboxes available");
        require((onlyWhitelist == false && ownerBoxes[msg.sender].length < buyLimit) || (whitelist[msg.sender] && ownerBoxes[msg.sender].length < whitelistLimit), "You are not on the whitelist");
        require (msg.value == cost, "Incorrect BNB value.");

        admin.transfer(cost);

        mint(msg.sender);
    }


    // Private methods

    function mint(address who) private {
        uint256 request = requestRandomWords();
        uint256 roll = request.mod(total).add(1);

        while (exists(roll)) {
            roll++;

            if (roll > total) {
                roll = 1;
            }
        }

        string memory uri = string(abi.encodePacked("https://nftstorage.link/ipfs/bafybeic2hzyfaxo7gvezfnllsgxusjpb6rj6s77vru34yhbnghdjkxv3xe/", uint2str(roll), ".json"));
        remaining--;
        require(_mintWithTokenURI(who, roll, uri), "Minting error");
        ownerBoxes[who].push(roll);
    }

    function uint2str(uint _i) internal pure returns (string memory _uintAsString) {
        if (_i == 0) {
            return "0";
        }
        uint j = _i;
        uint len;
        while (j != 0) {
            len++;
            j /= 10;
        }
        bytes memory bstr = new bytes(len);
        uint k = len - 1;
        while (_i != 0) {
            bstr[k--] = byte(uint8(48 + _i % 10));
            _i /= 10;
        }
        return string(bstr);
    }

    function requestRandomWords() private returns (uint256) {
        nonce += 1;
        return uint(keccak256(abi.encodePacked(nonce, msg.sender, blockhash(block.number - 1))));
    }


    // Admin Only

    // update contract fields
    function updateAdmin(address payable _admin, uint256 _commissionRate, bool _anyoneCanMint) public onlyOwner {
        admin=_admin;
        commissionRate=_commissionRate;
        anyoneCanMint=_anyoneCanMint;
    }

    function changeOwner(address who) external onlyOwner {
        contract_owner = who;
    } 

    function openBoxes() external onlyOwner {
        opened = true;
    } 

    function setPrice(uint256 price) external onlyOwner {
        cost = price;
    }

    function setEnabled(bool canPurchase) external onlyOwner {
        enabled = canPurchase;
    }

    function enableWhitelist(bool on) external onlyOwner {
        onlyWhitelist = on;
    }

    function setWhitelist(address who, bool whitelisted) external onlyOwner {
        whitelist[who] = whitelisted;
    }

    function setWhitelisted(address[] calldata who, bool whitelisted) external onlyOwner {
        for (uint256 i = 0; i < who.length; i++) {
            whitelist[who[i]] = whitelisted;
        }
    }

    function setBuyLimits(uint256 white, uint256 normal) external onlyOwner {
        whitelistLimit = white;
        buyLimit = normal;
    }

    function reserveNfts(address who, uint256 amount) external onlyOwner {
        require(reserved + amount <= reserveLimit, "NFTS have already been reserved");

        for (uint256 i = 0; i < amount; i++) {
            mint(who);
        }

        reserved += amount;
    }

}

Contract Security Audit

Contract ABI

[{"constant":true,"inputs":[{"name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"on","type":"bool"}],"name":"enableWhitelist","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"to","type":"address"},{"name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"white","type":"uint256"},{"name":"normal","type":"uint256"}],"name":"setBuyLimits","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"tokenId","type":"uint256"},{"name":"uri","type":"string"}],"name":"setTokenURI","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"sellBidPrice","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"tokenId","type":"uint256"}],"name":"canAuction","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"status","outputs":[{"name":"canPurchase","type":"bool"},{"name":"boxCost","type":"uint256"},{"name":"boxRemaining","type":"uint256"},{"name":"hasPurchased","type":"uint256"},{"name":"purchaseLimit","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"reserveLimit","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"enabled","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"from","type":"address"},{"name":"to","type":"address"},{"name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_admin","type":"address"},{"name":"_commissionRate","type":"uint256"},{"name":"_anyoneCanMint","type":"bool"}],"name":"updateAdmin","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"tokenId","type":"uint256"}],"name":"withdraw","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"owner","type":"address"},{"name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"whitelistLimit","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"canPurchase","type":"bool"}],"name":"setEnabled","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"contract_owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"tokenId","type":"uint256"}],"name":"canBuy","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"to","type":"address"},{"name":"tokenId","type":"uint256"}],"name":"mint","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"from","type":"address"},{"name":"to","type":"address"},{"name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"tokenId","type":"uint256"}],"name":"highestBidder","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"who","type":"address"},{"name":"amount","type":"uint256"}],"name":"reserveNfts","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"tokenId","type":"uint256"}],"name":"bid","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"name":"tokenId","type":"uint256"}],"name":"exists","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"to","type":"address"},{"name":"tokenId","type":"uint256"},{"name":"tokenURI","type":"string"}],"name":"mintWithTokenURI","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"who","type":"address"},{"name":"whitelisted","type":"bool"}],"name":"setWhitelist","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"auctions","outputs":[{"name":"beneficiary","type":"address"},{"name":"auctionEnd","type":"uint256"},{"name":"highestBidder","type":"address"},{"name":"highestBid","type":"uint256"},{"name":"open","type":"bool"},{"name":"reserve","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"buyLimit","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"opened","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"tokenURI","type":"string"},{"name":"to","type":"address"}],"name":"autoMint","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"openBoxes","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalCreated","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"name":"","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"tokenId","type":"uint256"}],"name":"canBid","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"purchaseBlindbox","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"price","type":"uint256"}],"name":"setPrice","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"account","type":"address"}],"name":"addMinter","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"renounceMinter","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"whitelist","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"to","type":"address"},{"name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"soldFor","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"who","type":"address"}],"name":"changeOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"onlyWhitelist","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"to","type":"address"},{"name":"tokenId","type":"uint256"}],"name":"transfer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"account","type":"address"}],"name":"isMinter","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"anyoneCanMint","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"tokenId","type":"uint256"}],"name":"highestBid","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"tokenId","type":"uint256"},{"name":"_closingTime","type":"uint256"},{"name":"_beneficiary","type":"address"},{"name":"_reservePrice","type":"uint256"}],"name":"createAuction","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"tokenId","type":"uint256"}],"name":"canSell","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"from","type":"address"},{"name":"to","type":"address"},{"name":"tokenId","type":"uint256"},{"name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"tokenId","type":"uint256"},{"name":"price","type":"uint256"},{"name":"wallet","type":"address"}],"name":"sell","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"tokenId","type":"uint256"}],"name":"buy","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"tokenId","type":"uint256"}],"name":"auctionFinalize","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"tokenId","type":"uint256"}],"name":"canFinalize","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"tokenId","type":"uint256"}],"name":"getPrice","outputs":[{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"owner","type":"address"},{"name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"canIMint","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"who","type":"address[]"},{"name":"whitelisted","type":"bool"}],"name":"setWhitelisted","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"tokenId","type":"uint256"}],"name":"canWithdraw","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"reserved","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"tokenId","type":"uint256"},{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Sale","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"tokenId","type":"uint256"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"},{"indexed":false,"name":"rate","type":"uint256"},{"indexed":false,"name":"total","type":"uint256"}],"name":"Commission","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"bidder","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"Refund","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"bidder","type":"address"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"tokenId","type":"uint256"}],"name":"HighestBidIncreased","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"winner","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"AuctionEnded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"LimitSell","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"LimitBuy","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"MarketSell","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"MarketBuy","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"account","type":"address"}],"name":"MinterAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"account","type":"address"}],"name":"MinterRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":true,"name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"approved","type":"address"},{"indexed":true,"name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"operator","type":"address"},{"indexed":false,"name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"}]

608060405260006021553480156200001657600080fd5b506040518060400160405280601581526020017f42616e616e61205461736b20466f7263652041706500000000000000000000008152506040518060400160405280600481526020017f4254464100000000000000000000000000000000000000000000000000000000815250600082826200009f6301ffc9a760e01b620001b460201b60201c565b620000b76380ac58cd60e01b620001b460201b60201c565b620000cf63780e9d6360e01b620001b460201b60201c565b8151620000e49060099060208501906200040f565b508051620000fa90600a9060208401906200040f565b5062000113635b5e139f60e01b620001b460201b60201c565b505062000126336200028360201b60201c565b6200013781620002d560201b60201c565b505060016010819055601180546001600160a01b031990811673024cd9a40a7f780d9f3582496a5f3c00bb22c3c6179091556012805490911633179055600f601355601b805460ff1916909117905550600a601c556005601d556101f4601a5567015fb7f9b8c380006022556127106023819055602455620004b4565b7fffffffff0000000000000000000000000000000000000000000000000000000080821614156200024657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f4552433136353a20696e76616c696420696e7465726661636520696400000000604482015290519081900360640190fd5b7fffffffff00000000000000000000000000000000000000000000000000000000166000908152602081905260409020805460ff19166001179055565b6200029e81600d620002e860201b620046fd1790919060201c565b6040516001600160a01b038216907f6ae172837ea30b801fbfcdd4108aa1d5bf8ff775444fd70256b44e6bf3dfc3f690600090a250565b600e805460ff1916911515919091179055565b620002fa82826200038c60201b60201c565b156200036757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f526f6c65733a206163636f756e7420616c72656164792068617320726f6c6500604482015290519081900360640190fd5b6001600160a01b0316600090815260209190915260409020805460ff19166001179055565b60006001600160a01b038216620003ef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180620053fa6022913960400191505060405180910390fd5b506001600160a01b03166000908152602091909152604090205460ff1690565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200045257805160ff191683800117855562000482565b8280016001018555821562000482579182015b828111156200048257825182559160200191906001019062000465565b506200049092915062000494565b5090565b620004b191905b808211156200049057600081556001016200049b565b90565b614f3680620004c46000396000f3fe6080604052600436106103ef5760003560e01c80636352211e11610208578063aa271e1a11610118578063d96a094a116100ab578063e985e9c51161007a578063e985e9c5146111fe578063ee1b59e414611239578063f3c4b7041461124e578063fbe85f06146112cb578063fe60d12c146112f5576103ef565b8063d96a094a14611145578063dc16bd4314611162578063e4e2bfe41461118c578063e7572230146111b6576103ef565b8063b2ecfad4116100e7578063b2ecfad414610fe1578063b88d4fde1461100b578063c87b56dd146110dc578063d04c698314611106576103ef565b8063aa271e1a14610f2a578063b13fbe9614610f5d578063b14c63c514610f72578063b1cb48ef14610f9c576103ef565b806395d89b411161019b578063a22cb4651161016a578063a22cb46514610e44578063a36b146214610e7f578063a6f9dae114610ea9578063a88e099614610edc578063a9059cbb14610ef1576103ef565b806395d89b4114610db4578063983b2d5614610dc95780639865027514610dfc5780639b19251a14610e11576103ef565b80638462151c116101d75780638462151c14610cd557806389f4c0b114610d585780638a05aa4f14610d8257806391b7f5ed14610d8a576103ef565b80636352211e14610c4e57806370a0823114610c7857806377b5683a14610cab578063844e0acd14610cc0576103ef565b8063302150e511610303578063454a2ab31161029657806353d6fd591161026557806353d6fd5914610abf578063571a26a014610afa578063589210d914610b685780635f88eade14610b7d57806361a09c9714610b92576103ef565b8063454a2ab3146109885780634f558e79146109a55780634f6ccce7146109cf57806350bb4e7f146109f9576103ef565b806340c10f19116102d257806340c10f19146108a957806342842e0e146108e2578063451df52e146109255780634538170a1461094f576103ef565b8063302150e514610829578063328d8f721461083e578063384f58eb1461086a5780633ca88a2f1461087f576103ef565b806318160ddd11610386578063238dafe011610355578063238dafe01461072d57806323b872dd14610742578063263f5877146107855780632e1a7d4d146107c65780632f745c59146107f0576103ef565b806318160ddd146106975780631ac70f6f146106ac578063200d2ed2146106d657806321e7345e14610718576103ef565b8063095ea7b3116103c2578063095ea7b31461053a5780630da2c5f014610573578063162094c4146105a3578063172b099d1461065b576103ef565b806301ffc9a7146103f4578063040b65831461043c57806306fdde031461046a578063081812fc146104f4575b600080fd5b34801561040057600080fd5b506104286004803603602081101561041757600080fd5b50356001600160e01b03191661130a565b604080519115158252519081900360200190f35b34801561044857600080fd5b506104686004803603602081101561045f57600080fd5b5035151561132d565b005b34801561047657600080fd5b5061047f61138c565b6040805160208082528351818301528351919283929083019185019080838360005b838110156104b95781810151838201526020016104a1565b50505050905090810190601f1680156104e65780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561050057600080fd5b5061051e6004803603602081101561051757600080fd5b5035611423565b604080516001600160a01b039092168252519081900360200190f35b34801561054657600080fd5b506104686004803603604081101561055d57600080fd5b506001600160a01b038135169060200135611488565b34801561057f57600080fd5b506104686004803603604081101561059657600080fd5b508035906020013561159f565b3480156105af57600080fd5b50610468600480360360408110156105c657600080fd5b81359190810190604081016020820135600160201b8111156105e757600080fd5b8201836020820111156105f957600080fd5b803590602001918460018302840111600160201b8311171561061a57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506115f6945050505050565b34801561066757600080fd5b506106856004803603602081101561067e57600080fd5b5035611604565b60408051918252519081900360200190f35b3480156106a357600080fd5b50610685611616565b3480156106b857600080fd5b50610428600480360360208110156106cf57600080fd5b503561161c565b3480156106e257600080fd5b506106eb61166e565b60408051951515865260208601949094528484019290925260608401526080830152519081900360a00190f35b34801561072457600080fd5b50610685611707565b34801561073957600080fd5b5061042861170d565b34801561074e57600080fd5b506104686004803603606081101561076557600080fd5b506001600160a01b03813581169160208101359091169060400135611716565b34801561079157600080fd5b50610468600480360360608110156107a857600080fd5b506001600160a01b038135169060208101359060400135151561176e565b3480156107d257600080fd5b50610428600480360360208110156107e957600080fd5b50356117f1565b3480156107fc57600080fd5b506106856004803603604081101561081357600080fd5b506001600160a01b0381351690602001356119a8565b34801561083557600080fd5b50610685611a2a565b34801561084a57600080fd5b506104686004803603602081101561086157600080fd5b50351515611a30565b34801561087657600080fd5b5061051e611a8f565b34801561088b57600080fd5b50610685600480360360208110156108a257600080fd5b5035611a9e565b3480156108b557600080fd5b50610428600480360360408110156108cc57600080fd5b506001600160a01b038135169060200135611b24565b3480156108ee57600080fd5b506104686004803603606081101561090557600080fd5b506001600160a01b03813581169160208101359091169060400135611b82565b34801561093157600080fd5b5061051e6004803603602081101561094857600080fd5b5035611b9d565b34801561095b57600080fd5b506104686004803603604081101561097257600080fd5b506001600160a01b038135169060200135611bbb565b6104686004803603602081101561099e57600080fd5b5035611c8e565b3480156109b157600080fd5b50610428600480360360208110156109c857600080fd5b50356120d1565b3480156109db57600080fd5b50610685600480360360208110156109f257600080fd5b50356120dc565b348015610a0557600080fd5b5061042860048036036060811015610a1c57600080fd5b6001600160a01b0382351691602081013591810190606081016040820135600160201b811115610a4b57600080fd5b820183602082011115610a5d57600080fd5b803590602001918460018302840111600160201b83111715610a7e57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550612145945050505050565b348015610acb57600080fd5b5061046860048036036040811015610ae257600080fd5b506001600160a01b03813516906020013515156121a3565b348015610b0657600080fd5b50610b2460048036036020811015610b1d57600080fd5b5035612219565b604080516001600160a01b0397881681526020810196909652939095168484015260608401919091521515608083015260a082019290925290519081900360c00190f35b348015610b7457600080fd5b50610685612260565b348015610b8957600080fd5b50610428612266565b348015610b9e57600080fd5b5061068560048036036040811015610bb557600080fd5b810190602081018135600160201b811115610bcf57600080fd5b820183602082011115610be157600080fd5b803590602001918460018302840111600160201b83111715610c0257600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550505090356001600160a01b0316915061226f9050565b348015610c5a57600080fd5b5061051e60048036036020811015610c7157600080fd5b50356122f4565b348015610c8457600080fd5b5061068560048036036020811015610c9b57600080fd5b50356001600160a01b031661234b565b348015610cb757600080fd5b506104686123b6565b348015610ccc57600080fd5b50610685612411565b348015610ce157600080fd5b50610d0860048036036020811015610cf857600080fd5b50356001600160a01b0316612417565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610d44578181015183820152602001610d2c565b505050509050019250505060405180910390f35b348015610d6457600080fd5b5061042860048036036020811015610d7b57600080fd5b5035612478565b61046861250d565b348015610d9657600080fd5b5061046860048036036020811015610dad57600080fd5b503561270d565b348015610dc057600080fd5b5061047f61275e565b348015610dd557600080fd5b5061046860048036036020811015610dec57600080fd5b50356001600160a01b03166127bf565b348015610e0857600080fd5b50610468612810565b348015610e1d57600080fd5b5061042860048036036020811015610e3457600080fd5b50356001600160a01b0316612819565b348015610e5057600080fd5b5061046860048036036040811015610e6757600080fd5b506001600160a01b038135169060200135151561282d565b348015610e8b57600080fd5b5061068560048036036020811015610ea257600080fd5b50356128fc565b348015610eb557600080fd5b5061046860048036036020811015610ecc57600080fd5b50356001600160a01b031661290e565b348015610ee857600080fd5b5061042861297c565b348015610efd57600080fd5b5061046860048036036040811015610f1457600080fd5b506001600160a01b038135169060200135612985565b348015610f3657600080fd5b5061042860048036036020811015610f4d57600080fd5b50356001600160a01b0316612990565b348015610f6957600080fd5b506104286129a3565b348015610f7e57600080fd5b5061068560048036036020811015610f9557600080fd5b50356129ac565b348015610fa857600080fd5b5061046860048036036080811015610fbf57600080fd5b508035906020810135906001600160a01b0360408201351690606001356129c1565b348015610fed57600080fd5b506104286004803603602081101561100457600080fd5b5035612b0b565b34801561101757600080fd5b506104686004803603608081101561102e57600080fd5b6001600160a01b03823581169260208101359091169160408201359190810190608081016060820135600160201b81111561106857600080fd5b82018360208201111561107a57600080fd5b803590602001918460018302840111600160201b8311171561109b57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550612b42945050505050565b3480156110e857600080fd5b5061047f600480360360208110156110ff57600080fd5b5035612b97565b34801561111257600080fd5b506104686004803603606081101561112957600080fd5b50803590602081013590604001356001600160a01b0316612caa565b6104686004803603602081101561115b57600080fd5b5035612d9f565b34801561116e57600080fd5b506104686004803603602081101561118557600080fd5b50356131d0565b34801561119857600080fd5b50610428600480360360208110156111af57600080fd5b503561364c565b3480156111c257600080fd5b506111e0600480360360208110156111d957600080fd5b50356136c4565b60408051938452602084019290925282820152519081900360600190f35b34801561120a57600080fd5b506104286004803603604081101561122157600080fd5b506001600160a01b0381358116916020013516613743565b34801561124557600080fd5b50610428613771565b34801561125a57600080fd5b506104686004803603604081101561127157600080fd5b810190602081018135600160201b81111561128b57600080fd5b82018360208201111561129d57600080fd5b803590602001918460208302840111600160201b831117156112be57600080fd5b919350915035151561378e565b3480156112d757600080fd5b50610428600480360360208110156112ee57600080fd5b503561382f565b34801561130157600080fd5b506106856138c4565b6001600160e01b0319811660009081526020819052604090205460ff165b919050565b6012546001600160a01b0316331461137957604051600160e51b62461bcd028152600401808060200182810382526028815260200180614aec6028913960400191505060405180910390fd5b601b805460ff1916911515919091179055565b60098054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156114185780601f106113ed57610100808354040283529160200191611418565b820191906000526020600020905b8154815290600101906020018083116113fb57829003601f168201915b505050505090505b90565b600061142e826138ca565b61146c57604051600160e51b62461bcd02815260040180806020018281038252602c815260200180614c32602c913960400191505060405180910390fd5b506000908152600260205260409020546001600160a01b031690565b6000611493826122f4565b9050806001600160a01b0316836001600160a01b031614156114e957604051600160e51b62461bcd028152600401808060200182810382526021815260200180614d486021913960400191505060405180910390fd5b336001600160a01b038216148061150557506115058133613743565b61154357604051600160e51b62461bcd028152600401808060200182810382526038815260200180614b146038913960400191505060405180910390fd5b60008281526002602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6012546001600160a01b031633146115eb57604051600160e51b62461bcd028152600401808060200182810382526028815260200180614aec6028913960400191505060405180910390fd5b601c91909155601d55565b61160082826138e7565b5050565b60156020526000908152604090205481565b60075490565b600033611628836122f4565b6001600160a01b0316148015611650575060008281526017602052604090206004015460ff16155b80156116685750600082815260156020526040902054155b92915050565b601854600090819081908190819060ff1680156116dd5750601b5460ff161580156116a95750601d54336000908152601f6020526040902054105b806116dd575033600090815260208052604090205460ff1680156116dd5750601c54336000908152601f6020526040902054105b602254602454336000908152601f6020526040902054601c54939992985090965094509092509050565b601a5481565b60185460ff1681565b611720338261394d565b61175e57604051600160e51b62461bcd028152600401808060200182810382526031815260200180614d966031913960400191505060405180910390fd5b6117698383836139f4565b505050565b6012546001600160a01b031633146117ba57604051600160e51b62461bcd028152600401808060200182810382526028815260200180614aec6028913960400191505060405180910390fd5b601180546001600160a01b0319166001600160a01b039490941693909317909255601355600e805460ff1916911515919091179055565b60108054600101908190556000906118088361382f565b61184657604051600160e51b62461bcd028152600401808060200182810382526022815260200180614e5b6022913960400191505060405180910390fd5b6000838152601760205260409020600301541561191457600083815260176020526040808220600281015460039091015491516001600160a01b0390911691908381818185875af1925050503d80600081146118be576040519150601f19603f3d011682016040523d82523d6000602084013e6118c3565b606091505b50509050806119125760408051600160e51b62461bcd0281526020600482015260106024820152600160811b6f2a3930b739b332b9103330b4b632b21702604482015290519081900360640190fd5b505b600083815260176020526040812080546001600160a01b031990811682556001820183905560028201805490911690556003810182905560048101805460ff191690556005015560105481146119a25760408051600160e51b62461bcd02815260206004820152601f6024820152600080516020614936833981519152604482015290519081900360640190fd5b50919050565b60006119b38361234b565b82106119f357604051600160e51b62461bcd02815260040180806020018281038252602b815260200180614984602b913960400191505060405180910390fd5b6001600160a01b0383166000908152600560205260409020805483908110611a1757fe5b9060005260206000200154905092915050565b601c5481565b6012546001600160a01b03163314611a7c57604051600160e51b62461bcd028152600401808060200182810382526028815260200180614aec6028913960400191505060405180910390fd5b6018805460ff1916911515919091179055565b6012546001600160a01b031681565b60008181526017602052604081206004015460ff16158015611acd575060008281526015602052604090205415155b8015611ae6575060008281526015602052604090205415155b8015611b02575030611af783611423565b6001600160a01b0316145b15611b1c5750600081815260156020526040902054611328565b506000611328565b60006060611b30613771565b611b6e57604051600160e51b62461bcd028152600401808060200182810382526030815260200180614bc06030913960400191505060405180910390fd5b611b788484613a13565b5060019392505050565b61176983838360405180602001604052806000815250612b42565b6000908152601760205260409020600201546001600160a01b031690565b6012546001600160a01b03163314611c0757604051600160e51b62461bcd028152600401808060200182810382526028815260200180614aec6028913960400191505060405180910390fd5b601a5481601954011115611c655760408051600160e51b62461bcd02815260206004820152601f60248201527f4e465453206861766520616c7265616479206265656e20726573657276656400604482015290519081900360640190fd5b60005b81811015611c8157611c7983613a30565b600101611c68565b5060198054909101905550565b6010805460010190819055611ca233613bba565b15611cf75760408051600160e51b62461bcd02815260206004820152601160248201527f4e6f20736372697074206b696464696573000000000000000000000000000000604482015290519081900360640190fd5b60008281526017602052604090206004015460ff16611d605760408051600160e51b62461bcd02815260206004820152601760248201527f4e6f206f70656e65642061756374696f6e20666f756e64000000000000000000604482015290519081900360640190fd5b30611d6a83611423565b6001600160a01b031614611dc85760408051600160e51b62461bcd02815260206004820152601b60248201527f43616e6e6f7420636f6d706c657465207468652061756374696f6e0000000000604482015290519081900360640190fd5b600082815260176020526040902060010154421115611e315760408051600160e51b62461bcd02815260206004820152601660248201527f41756374696f6e20616c726561647920656e6465642e00000000000000000000604482015290519081900360640190fd5b6000828152601760205260409020600301543411611e995760408051600160e51b62461bcd02815260206004820152601e60248201527f546865726520616c7265616479206973206120686967686572206269642e0000604482015290519081900360640190fd5b6000611ea4836122f4565b9050336001600160a01b0382161415611ef157604051600160e51b62461bcd028152600401808060200182810382526036815260200180614ed56036913960400191505060405180910390fd5b6000838152601760205260409020600301541561201f57600083815260176020526040808220600281015460039091015491516001600160a01b0390911691908381818185875af1925050503d8060008114611f69576040519150601f19603f3d011682016040523d82523d6000602084013e611f6e565b606091505b5050905080611fbd5760408051600160e51b62461bcd0281526020600482015260106024820152600160811b6f2a3930b739b332b9103330b4b632b21702604482015290519081900360640190fd5b600084815260176020908152604091829020600281015460039091015483516001600160a01b0390921682529181019190915281517fbb28353e4598c3b9199101a66e0989549b659a59a54d2c27fbb183f1932c8e6d929181900390910190a1505b6000838152601760209081526040918290206002810180546001600160a01b031916339081179091553460039092018290558351918252918101869052825191927fdafc4a123c6bb3b49dd38a0cba299808581a0126a37248a5f1102d5e5fa0633792918290030190a25060105481146116005760408051600160e51b62461bcd02815260206004820152601f6024820152600080516020614936833981519152604482015290519081900360640190fd5b6000611668826138ca565b60006120e6611616565b821061212657604051600160e51b62461bcd02815260040180806020018281038252602c815260200180614dc7602c913960400191505060405180910390fd5b6007828154811061213357fe5b90600052602060002001549050919050565b60006060612151613771565b61218f57604051600160e51b62461bcd028152600401808060200182810382526030815260200180614bc06030913960400191505060405180910390fd5b61219a858585613bf1565b95945050505050565b6012546001600160a01b031633146121ef57604051600160e51b62461bcd028152600401808060200182810382526028815260200180614aec6028913960400191505060405180910390fd5b6001600160a01b039190911660009081526020805260409020805460ff1916911515919091179055565b6017602052600090815260409020805460018201546002830154600384015460048501546005909501546001600160a01b0394851695939490921692909160ff9091169086565b601d5481565b600b5460ff1681565b6000606061227b613771565b6122b957604051600160e51b62461bcd028152600401808060200182810382526030815260200180614bc06030913960400191505060405180910390fd5b600f8054600101908190556122cd906138ca565b6122b9576122dd83600f54613a13565b6122e9600f54856138e7565b5050600f5492915050565b6000818152600160205260408120546001600160a01b03168061166857604051600160e51b62461bcd028152600401808060200182810382526029815260200180614b766029913960400191505060405180910390fd5b60006001600160a01b03821661239557604051600160e51b62461bcd02815260040180806020018281038252602a815260200180614b4c602a913960400191505060405180910390fd5b6001600160a01b038216600090815260036020526040902061166890613c07565b6012546001600160a01b0316331461240257604051600160e51b62461bcd028152600401808060200182810382526028815260200180614aec6028913960400191505060405180910390fd5b600b805460ff19166001179055565b601e5481565b606061242282613c0b565b80548060200260200160405190810160405280929190818152602001828054801561246c57602002820191906000526020600020905b815481526020019060010190808311612458575b50505050509050919050565b600061248333613bba565b1580156124a1575060008281526017602052604090206004015460ff165b80156124be57506000828152601760205260409020600101544211155b80156124e457506124ce826122f4565b6001600160a01b0316336001600160a01b031614155b80156125005750306124f583611423565b6001600160a01b0316145b15611b1c57506001611328565b60185460ff166125675760408051600160e51b62461bcd02815260206004820152601e60248201527f436f6e74726163742069732063757272656e746c792064697361626c65640000604482015290519081900360640190fd5b6000602454116125c15760408051600160e51b62461bcd02815260206004820152601c60248201527f4e6f206d6f726520626c696e64626f78657320617661696c61626c6500000000604482015290519081900360640190fd5b601b5460ff161580156125e45750601d54336000908152601f6020526040902054105b80612618575033600090815260208052604090205460ff1680156126185750601c54336000908152601f6020526040902054105b61266c5760408051600160e51b62461bcd02815260206004820152601c60248201527f596f7520617265206e6f74206f6e207468652077686974656c69737400000000604482015290519081900360640190fd5b60225434146126c55760408051600160e51b62461bcd02815260206004820152601460248201527f496e636f727265637420424e422076616c75652e000000000000000000000000604482015290519081900360640190fd5b6011546022546040516001600160a01b039092169181156108fc0291906000818181858888f19350505050158015612701573d6000803e3d6000fd5b5061270b33613a30565b565b6012546001600160a01b0316331461275957604051600160e51b62461bcd028152600401808060200182810382526028815260200180614aec6028913960400191505060405180910390fd5b602255565b600a8054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156114185780601f106113ed57610100808354040283529160200191611418565b60606127c9613771565b61280757604051600160e51b62461bcd028152600401808060200182810382526030815260200180614bc06030913960400191505060405180910390fd5b61160082613c25565b61270b33613c6d565b602080526000908152604090205460ff1681565b6001600160a01b03821633141561288e5760408051600160e51b62461bcd02815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015290519081900360640190fd5b3360008181526004602090815260408083206001600160a01b03871680855290835292819020805460ff1916861515908117909155815190815290519293927f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31929181900390910190a35050565b60146020526000908152604090205481565b6012546001600160a01b0316331461295a57604051600160e51b62461bcd028152600401808060200182810382526028815260200180614aec6028913960400191505060405180910390fd5b601280546001600160a01b0319166001600160a01b0392909216919091179055565b601b5460ff1681565b6116003383836139f4565b6000611668600d8363ffffffff613cb516565b600e5460ff1681565b60009081526017602052604090206003015490565b60008481526015602052604090205415612a0f57604051600160e51b62461bcd028152600401808060200182810382526044815260200180614d046044913960600191505060405180910390fd5b60008481526017602052604090206004015460ff1615612a6357604051600160e51b62461bcd0281526004018080602001828103825260358152602001806149016035913960400191505060405180910390fd5b33612a6d856122f4565b6001600160a01b031614612ab557604051600160e51b62461bcd02815260040180806020018281038252602e815260200180614956602e913960400191505060405180910390fd5b600084815260176020526040902080546001600160a01b0319166001600160a01b0384161781556001808201859055600582018390556004909101805460ff19169091179055612b053085611488565b50505050565b600033612b17836122f4565b6001600160a01b031614801561166857505060009081526017602052604090206004015460ff161590565b612b4d848484611716565b612b5984848484613d1f565b612b0557604051600160e51b62461bcd0281526004018080602001828103825260328152602001806149af6032913960400191505060405180910390fd5b6060612ba2826138ca565b612be057604051600160e51b62461bcd02815260040180806020018281038252602f815260200180614cd5602f913960400191505060405180910390fd5b600b5460ff1615612c8a576000828152600c602090815260409182902080548351601f600260001961010060018616150201909316929092049182018490048402810184019094528084529091830182828015612c7e5780601f10612c5357610100808354040283529160200191612c7e565b820191906000526020600020905b815481529060010190602001808311612c6157829003601f168201915b50505050509050611328565b604051806080016040528060588152602001614e7d605891399050611328565b33612cb4846122f4565b6001600160a01b031614612cfc57604051600160e51b62461bcd02815260040180806020018281038252602b8152602001806149e1602b913960400191505060405180910390fd5b60008381526017602052604090206004015460ff1615612d5057604051600160e51b62461bcd02815260040180806020018281038252603d815260200180614e1e603d913960400191505060405180910390fd5b6000838152601560205260409020829055811561176957612d713084611488565b600083815260166020526040902080546001600160a01b0383166001600160a01b0319909116179055505050565b601080546001019081905560008281526017602052604090206004015460ff16158015612dd9575060008281526015602052604090205415155b612e1757604051600160e51b62461bcd02815260040180806020018281038252602d815260200180614d69602d913960400191505060405180910390fd5b600082815260156020526040902054341015612e7d5760408051600160e51b62461bcd02815260206004820152601e60248201527f4552433732314d61746368613a204e6f7420656e6f7567682066756e64730000604482015290519081900360640190fd5b6000612e88836122f4565b9050336001600160a01b0382161415612ed557604051600160e51b62461bcd028152600401808060200182810382526037815260200180614a896037913960400191505060405180910390fd5b604080516001600160a01b038316602482015233604482015260648082018690528251808303909101815260849091019091526020810180516001600160e01b0316600160e01b6323b872dd02179052612f30903090613e58565b6000612f586064612f4c6013543461400390919063ffffffff16565b9063ffffffff61406616565b90506000612f6c348363ffffffff6140d316565b60008681526016602052604080822054905192935090916001600160a01b039091169083908381818185875af1925050503d8060008114612fc9576040519150601f19603f3d011682016040523d82523d6000602084013e612fce565b606091505b505090508061301d5760408051600160e51b62461bcd0281526020600482015260106024820152600160811b6f2a3930b739b332b9103330b4b632b21702604482015290519081900360640190fd5b6011546040516000916001600160a01b03169085908381818185875af1925050503d806000811461306a576040519150601f19603f3d011682016040523d82523d6000602084013e61306f565b606091505b50509050806130be5760408051600160e51b62461bcd0281526020600482015260106024820152600160811b6f2a3930b739b332b9103330b4b632b21702604482015290519081900360640190fd5b60008781526015602090815260408083208390556016825280832080546001600160a01b0319169055601482529182902034908190558251908152915133926001600160a01b038916928b927f88863d5e20f64464b554931394e2e4b6f09c10015147215bf26b3ba5070acebe9281900390910190a4601354604080513481526020810192909252818101869052516001600160a01b0387169189917fef7a63d352d8b0f42e35d7f8bd277ba75ba2ff721a50eaad4c62f1ee6561d5eb9181900360600190a3505050505060105481146116005760408051600160e51b62461bcd02815260206004820152601f6024820152600080516020614936833981519152604482015290519081900360640190fd5b60108054600101908190556131e48261364c565b6132385760408051600160e51b62461bcd02815260206004820152600f60248201527f43616e6e6f742066696e616c697a650000000000000000000000000000000000604482015290519081900360640190fd5b6000828152601760205260409020600301541561355e57600082815260176020526040812060028101546013546003909201546001600160a01b03909116929161328f91606491612f4c919063ffffffff61400316565b600085815260176020526040812060030154919250906132b5908363ffffffff6140d316565b60008681526017602052604080822054905192935090916001600160a01b039091169083908381818185875af1925050503d8060008114613312576040519150601f19603f3d011682016040523d82523d6000602084013e613317565b606091505b50509050806133665760408051600160e51b62461bcd0281526020600482015260106024820152600160811b6f2a3930b739b332b9103330b4b632b21702604482015290519081900360640190fd5b6011546040516000916001600160a01b03169085908381818185875af1925050503d80600081146133b3576040519150601f19603f3d011682016040523d82523d6000602084013e6133b8565b606091505b50509050806134075760408051600160e51b62461bcd0281526020600482015260106024820152600160811b6f2a3930b739b332b9103330b4b632b21702604482015290519081900360640190fd5b6000878152601760209081526040918290208054600390910154835190815292516001600160a01b03808a16949216928b927f88863d5e20f64464b554931394e2e4b6f09c10015147215bf26b3ba5070acebe929081900390910190a4600087815260176020908152604091829020805460039091015460135484519182529281019290925281830187905291516001600160a01b039092169189917fef7a63d352d8b0f42e35d7f8bd277ba75ba2ff721a50eaad4c62f1ee6561d5eb919081900360600190a360006134d9886122f4565b604080516001600160a01b0380841660248301528916604482015260648082018c90528251808303909101815260849091019091526020810180516001600160e01b0316600160e01b6323b872dd02179052909150613539903090613e58565b5050506000858152601760209081526040808320600301546014909252909120555050505b600082815260176020908152604091829020600281015460039091015483516001600160a01b0390921682529181019190915281517fdaec4582d5d9595688c8c98545fdd1c696d41c6aeaeb636737e84ed2f5c00eda929181900390910190a1600082815260176020526040812080546001600160a01b031990811682556001820183905560028201805490911690556003810182905560048101805460ff191690556005015560105481146116005760408051600160e51b62461bcd02815260206004820152601f6024820152600080516020614936833981519152604482015290519081900360640190fd5b60008181526017602052604081206004015460ff16801561367e57506000828152601760205260409020600101544210155b80156125005750600082815260176020526040902060058101546003909101541015806125005750600082815260176020526040902060030154611b1c57506001611328565b60008181526015602052604081205481908190156136f557505050600081815260156020526040812054908061373c565b60008481526017602052604090206003015415613727575050506000818152601760205260408120600301548161373c565b50505060008181526014602052604081205481905b9193909250565b6001600160a01b03918216600090815260046020908152604080832093909416825291909152205460ff1690565b600e5460009060ff1680613789575061378933612990565b905090565b6012546001600160a01b031633146137da57604051600160e51b62461bcd028152600401808060200182810382526028815260200180614aec6028913960400191505060405180910390fd5b60005b82811015612b055781602060008686858181106137f657fe5b602090810292909201356001600160a01b0316835250810191909152604001600020805460ff19169115159190911790556001016137dd565b60008181526017602052604081206004015460ff1680156125005750600082815260176020526040902060010154421080159061387c575060008281526017602052604090206003015415155b801561389e575060008281526017602052604090206005810154600390910154105b806125005750306138ae83611423565b6001600160a01b031614611b1c57506001611328565b60195481565b6000908152600160205260409020546001600160a01b0316151590565b6138f0826138ca565b61392e57604051600160e51b62461bcd02815260040180806020018281038252602c815260200180614c5e602c913960400191505060405180910390fd5b6000828152600c60209081526040909120825161176992840190614848565b6000613958826138ca565b61399657604051600160e51b62461bcd02815260040180806020018281038252602c815260200180614ac0602c913960400191505060405180910390fd5b60006139a1836122f4565b9050806001600160a01b0316846001600160a01b031614806139dc5750836001600160a01b03166139d184611423565b6001600160a01b0316145b806139ec57506139ec8185613743565b949350505050565b6139ff838383614133565b613a09838261427d565b6117698282614372565b613a1d82826143b0565b613a278282614372565b611600816144e7565b6000613a3a61452b565b90506000613a646001613a586023548561457490919063ffffffff16565b9063ffffffff6145dc16565b90505b613a70816120d1565b15613a8e57602354600190910190811115613a89575060015b613a67565b6060613a9982614639565b604051602001806059614a0c823960590182805190602001908083835b60208310613ad55780518252601f199092019160209182019101613ab6565b5181516000196020949094036101000a8401908116901991909116179052600160d91b64173539b7b7029390910192835260408051601a1981860301815260059094019052602480549091019055509250613b3591508590508383613bf1565b613b895760408051600160e51b62461bcd02815260206004820152600d60248201527f4d696e74696e67206572726f7200000000000000000000000000000000000000604482015290519081900360640190fd5b506001600160a01b039092166000908152601f60209081526040822080546001810182559083529120019190915550565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081158015906139ec5750141592915050565b6000613bfd8484613a13565b611b7883836138e7565b5490565b6001600160a01b0316600090815260056020526040902090565b613c36600d8263ffffffff6146fd16565b6040516001600160a01b038216907f6ae172837ea30b801fbfcdd4108aa1d5bf8ff775444fd70256b44e6bf3dfc3f690600090a250565b613c7e600d8263ffffffff61478116565b6040516001600160a01b038216907fe94479a9f7e1952cc78f2d6baab678adc1b772d936c6583def489e524cb6669290600090a250565b60006001600160a01b038216613cff57604051600160e51b62461bcd028152600401808060200182810382526022815260200180614c8a6022913960400191505060405180910390fd5b506001600160a01b03166000908152602091909152604090205460ff1690565b6000613d33846001600160a01b0316613bba565b613d3f575060016139ec565b604051600160e11b630a85bd0102815233600482018181526001600160a01b03888116602485015260448401879052608060648501908152865160848601528651600095928a169463150b7a029490938c938b938b939260a4019060208501908083838e5b83811015613dbc578181015183820152602001613da4565b50505050905090810190601f168015613de95780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b158015613e0b57600080fd5b505af1158015613e1f573d6000803e3d6000fd5b505050506040513d6020811015613e3557600080fd5b50516001600160e01b031916600160e11b630a85bd010214915050949350505050565b613e6a826001600160a01b0316613bba565b613ebe5760408051600160e51b62461bcd02815260206004820181905260248201527f536166654552433732313a2063616c6c20746f206e6f6e2d636f6e7472616374604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b60208310613efc5780518252601f199092019160209182019101613edd565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613f5e576040519150601f19603f3d011682016040523d82523d6000602084013e613f63565b606091505b509150915081613fa757604051600160e51b62461bcd028152600401808060200182810382526021815260200180614b9f6021913960400191505060405180910390fd5b805115612b0557808060200190516020811015613fc357600080fd5b5051612b0557604051600160e51b62461bcd02815260040180806020018281038252602b815260200180614df3602b913960400191505060405180910390fd5b60008261401257506000611668565b8282028284828161401f57fe5b041461405f57604051600160e51b62461bcd028152600401808060200182810382526021815260200180614c116021913960400191505060405180910390fd5b9392505050565b60008082116140bf5760408051600160e51b62461bcd02815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b60008284816140ca57fe5b04949350505050565b60008282111561412d5760408051600160e51b62461bcd02815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b826001600160a01b0316614146826122f4565b6001600160a01b03161461418e57604051600160e51b62461bcd028152600401808060200182810382526029815260200180614cac6029913960400191505060405180910390fd5b6001600160a01b0382166141d657604051600160e51b62461bcd028152600401808060200182810382526024815260200180614a656024913960400191505060405180910390fd5b6141df816147eb565b6001600160a01b038316600090815260036020526040902061420090614828565b6001600160a01b03821660009081526003602052604090206142219061483f565b60008181526001602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6001600160a01b0382166000908152600560205260408120546142a790600163ffffffff6140d316565b600083815260066020526040902054909150808214614342576001600160a01b03841660009081526005602052604081208054849081106142e457fe5b906000526020600020015490508060056000876001600160a01b03166001600160a01b03168152602001908152602001600020838154811061432257fe5b600091825260208083209091019290925591825260069052604090208190555b6001600160a01b038416600090815260056020526040902080549061436b9060001983016148c6565b5050505050565b6001600160a01b0390911660009081526005602081815260408084208054868652600684529185208290559282526001810183559183529091200155565b6001600160a01b03821661440e5760408051600160e51b62461bcd02815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015290519081900360640190fd5b614417816138ca565b1561446c5760408051600160e51b62461bcd02815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015290519081900360640190fd5b600081815260016020908152604080832080546001600160a01b0319166001600160a01b0387169081179091558352600390915290206144ab9061483f565b60405181906001600160a01b038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600780546000838152600860205260408120829055600182018355919091527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6880155565b6021805460010190819055604080516020808201939093523360601b81830152600019430140605480830191909152825180830390910181526074909101909152805191012090565b6000816145cb5760408051600160e51b62461bcd02815260206004820152601860248201527f536166654d6174683a206d6f64756c6f206279207a65726f0000000000000000604482015290519081900360640190fd5b8183816145d457fe5b069392505050565b60008282018381101561405f5760408051600160e51b62461bcd02815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60608161466157506040805180820190915260018152600160fc1b6003026020820152611328565b8160005b811561467957600101600a82049150614665565b6060816040519080825280601f01601f1916602001820160405280156146a6576020820181803883390190505b50905060001982015b85156146f457600a860660300160f81b828280600190039350815181106146d257fe5b60200101906001600160f81b031916908160001a905350600a860495506146af565b50949350505050565b6147078282613cb5565b1561475c5760408051600160e51b62461bcd02815260206004820152601f60248201527f526f6c65733a206163636f756e7420616c72656164792068617320726f6c6500604482015290519081900360640190fd5b6001600160a01b0316600090815260209190915260409020805460ff19166001179055565b61478b8282613cb5565b6147c957604051600160e51b62461bcd028152600401808060200182810382526021815260200180614bf06021913960400191505060405180910390fd5b6001600160a01b0316600090815260209190915260409020805460ff19169055565b6000818152600260205260409020546001600160a01b03161561482557600081815260026020526040902080546001600160a01b03191690555b50565b805461483b90600163ffffffff6140d316565b9055565b80546001019055565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061488957805160ff19168380011785556148b6565b828001600101855582156148b6579182015b828111156148b657825182559160200191906001019061489b565b506148c29291506148e6565b5090565b815481835581811115611769576000838152602090206117699181019083015b61142091905b808211156148c257600081556001016148ec56fe4552433732314d61746368613a205468652073656c6563746564204e465420616c72656164792068617320616e2061756374696f6e5265656e7472616e637947756172643a207265656e7472616e742063616c6c004552433732314d61746368613a204f6e6c79206f776e65722063616e2061756374696f6e2074686973206974656d455243373231456e756d657261626c653a206f776e657220696e646578206f7574206f6620626f756e64734552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724552433732314d61746368613a204f6e6c79206f776e65722063616e2073656c6c2074686973206974656d68747470733a2f2f6e667473746f726167652e6c696e6b2f697066732f626166796265696332687a796661786f376776657a666e6c6c73677875736a706236726a3673373776727533347968626e6768646a6b78763378652f4552433732313a207472616e7366657220746f20746865207a65726f20616464726573734552433732314d61746368613a205468652073656c6c65722063616e6e6f742062757920686973206f776e20636f6c6c65637469626c654552433732313a206f70657261746f7220717565727920666f72206e6f6e6578697374656e7420746f6b656e63616e206f6e6c792062652063616c6c65642062792074686520636f6e7472616374206f776e65724552433732313a20617070726f76652063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f76656420666f7220616c6c4552433732313a2062616c616e636520717565727920666f7220746865207a65726f20616464726573734552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656e536166654552433732313a206c6f772d6c6576656c2063616c6c206661696c65644d696e746572526f6c653a2063616c6c657220646f6573206e6f74206861766520746865204d696e74657220726f6c65526f6c65733a206163636f756e7420646f6573206e6f74206861766520726f6c65536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774552433732313a20617070726f76656420717565727920666f72206e6f6e6578697374656e7420746f6b656e4552433732314d657461646174613a2055524920736574206f66206e6f6e6578697374656e7420746f6b656e526f6c65733a206163636f756e7420697320746865207a65726f20616464726573734552433732313a207472616e73666572206f6620746f6b656e2074686174206973206e6f74206f776e4552433732314d657461646174613a2055524920717565727920666f72206e6f6e6578697374656e7420746f6b656e4552433732314d61746368613a205468652073656c6563746564204e4654206973206f70656e20666f722073616c652c2063616e6e6f742062652061756374696f6e65644552433732313a20617070726f76616c20746f2063757272656e74206f776e65724552433732314d61746368613a2054686520636f6c6c65637469626c65206973206e6f7420666f722073616c654552433732313a207472616e736665722063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f766564455243373231456e756d657261626c653a20676c6f62616c20696e646578206f7574206f6620626f756e6473536166654552433732313a204552433230206f7065726174696f6e20646964206e6f7420737563636565644552433732314d61746368613a2043616e6e6f742073656c6c20616e206974656d2077686963682068617320616e206163746976652061756374696f6e436f6e646974696f6e7320746f20776974686472617720617265206e6f74206d657468747470733a2f2f6e667473746f726167652e6c696e6b2f697066732f6261666b7265696274636e6533656836346932716767766d77646564326f33686e3432786368333466776564356177786b6b6d64376136767532344552433732314d61746368613a20546865206f776e65722063616e6e6f742062696420686973206f776e20636f6c6c65637469626c65a165627a7a723058203d364534221b5b893b9868292201f66cb1478458392236054f8f4c2a8683e49f0029526f6c65733a206163636f756e7420697320746865207a65726f2061646472657373

Deployed Bytecode

0x6080604052600436106103ef5760003560e01c80636352211e11610208578063aa271e1a11610118578063d96a094a116100ab578063e985e9c51161007a578063e985e9c5146111fe578063ee1b59e414611239578063f3c4b7041461124e578063fbe85f06146112cb578063fe60d12c146112f5576103ef565b8063d96a094a14611145578063dc16bd4314611162578063e4e2bfe41461118c578063e7572230146111b6576103ef565b8063b2ecfad4116100e7578063b2ecfad414610fe1578063b88d4fde1461100b578063c87b56dd146110dc578063d04c698314611106576103ef565b8063aa271e1a14610f2a578063b13fbe9614610f5d578063b14c63c514610f72578063b1cb48ef14610f9c576103ef565b806395d89b411161019b578063a22cb4651161016a578063a22cb46514610e44578063a36b146214610e7f578063a6f9dae114610ea9578063a88e099614610edc578063a9059cbb14610ef1576103ef565b806395d89b4114610db4578063983b2d5614610dc95780639865027514610dfc5780639b19251a14610e11576103ef565b80638462151c116101d75780638462151c14610cd557806389f4c0b114610d585780638a05aa4f14610d8257806391b7f5ed14610d8a576103ef565b80636352211e14610c4e57806370a0823114610c7857806377b5683a14610cab578063844e0acd14610cc0576103ef565b8063302150e511610303578063454a2ab31161029657806353d6fd591161026557806353d6fd5914610abf578063571a26a014610afa578063589210d914610b685780635f88eade14610b7d57806361a09c9714610b92576103ef565b8063454a2ab3146109885780634f558e79146109a55780634f6ccce7146109cf57806350bb4e7f146109f9576103ef565b806340c10f19116102d257806340c10f19146108a957806342842e0e146108e2578063451df52e146109255780634538170a1461094f576103ef565b8063302150e514610829578063328d8f721461083e578063384f58eb1461086a5780633ca88a2f1461087f576103ef565b806318160ddd11610386578063238dafe011610355578063238dafe01461072d57806323b872dd14610742578063263f5877146107855780632e1a7d4d146107c65780632f745c59146107f0576103ef565b806318160ddd146106975780631ac70f6f146106ac578063200d2ed2146106d657806321e7345e14610718576103ef565b8063095ea7b3116103c2578063095ea7b31461053a5780630da2c5f014610573578063162094c4146105a3578063172b099d1461065b576103ef565b806301ffc9a7146103f4578063040b65831461043c57806306fdde031461046a578063081812fc146104f4575b600080fd5b34801561040057600080fd5b506104286004803603602081101561041757600080fd5b50356001600160e01b03191661130a565b604080519115158252519081900360200190f35b34801561044857600080fd5b506104686004803603602081101561045f57600080fd5b5035151561132d565b005b34801561047657600080fd5b5061047f61138c565b6040805160208082528351818301528351919283929083019185019080838360005b838110156104b95781810151838201526020016104a1565b50505050905090810190601f1680156104e65780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561050057600080fd5b5061051e6004803603602081101561051757600080fd5b5035611423565b604080516001600160a01b039092168252519081900360200190f35b34801561054657600080fd5b506104686004803603604081101561055d57600080fd5b506001600160a01b038135169060200135611488565b34801561057f57600080fd5b506104686004803603604081101561059657600080fd5b508035906020013561159f565b3480156105af57600080fd5b50610468600480360360408110156105c657600080fd5b81359190810190604081016020820135600160201b8111156105e757600080fd5b8201836020820111156105f957600080fd5b803590602001918460018302840111600160201b8311171561061a57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506115f6945050505050565b34801561066757600080fd5b506106856004803603602081101561067e57600080fd5b5035611604565b60408051918252519081900360200190f35b3480156106a357600080fd5b50610685611616565b3480156106b857600080fd5b50610428600480360360208110156106cf57600080fd5b503561161c565b3480156106e257600080fd5b506106eb61166e565b60408051951515865260208601949094528484019290925260608401526080830152519081900360a00190f35b34801561072457600080fd5b50610685611707565b34801561073957600080fd5b5061042861170d565b34801561074e57600080fd5b506104686004803603606081101561076557600080fd5b506001600160a01b03813581169160208101359091169060400135611716565b34801561079157600080fd5b50610468600480360360608110156107a857600080fd5b506001600160a01b038135169060208101359060400135151561176e565b3480156107d257600080fd5b50610428600480360360208110156107e957600080fd5b50356117f1565b3480156107fc57600080fd5b506106856004803603604081101561081357600080fd5b506001600160a01b0381351690602001356119a8565b34801561083557600080fd5b50610685611a2a565b34801561084a57600080fd5b506104686004803603602081101561086157600080fd5b50351515611a30565b34801561087657600080fd5b5061051e611a8f565b34801561088b57600080fd5b50610685600480360360208110156108a257600080fd5b5035611a9e565b3480156108b557600080fd5b50610428600480360360408110156108cc57600080fd5b506001600160a01b038135169060200135611b24565b3480156108ee57600080fd5b506104686004803603606081101561090557600080fd5b506001600160a01b03813581169160208101359091169060400135611b82565b34801561093157600080fd5b5061051e6004803603602081101561094857600080fd5b5035611b9d565b34801561095b57600080fd5b506104686004803603604081101561097257600080fd5b506001600160a01b038135169060200135611bbb565b6104686004803603602081101561099e57600080fd5b5035611c8e565b3480156109b157600080fd5b50610428600480360360208110156109c857600080fd5b50356120d1565b3480156109db57600080fd5b50610685600480360360208110156109f257600080fd5b50356120dc565b348015610a0557600080fd5b5061042860048036036060811015610a1c57600080fd5b6001600160a01b0382351691602081013591810190606081016040820135600160201b811115610a4b57600080fd5b820183602082011115610a5d57600080fd5b803590602001918460018302840111600160201b83111715610a7e57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550612145945050505050565b348015610acb57600080fd5b5061046860048036036040811015610ae257600080fd5b506001600160a01b03813516906020013515156121a3565b348015610b0657600080fd5b50610b2460048036036020811015610b1d57600080fd5b5035612219565b604080516001600160a01b0397881681526020810196909652939095168484015260608401919091521515608083015260a082019290925290519081900360c00190f35b348015610b7457600080fd5b50610685612260565b348015610b8957600080fd5b50610428612266565b348015610b9e57600080fd5b5061068560048036036040811015610bb557600080fd5b810190602081018135600160201b811115610bcf57600080fd5b820183602082011115610be157600080fd5b803590602001918460018302840111600160201b83111715610c0257600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550505090356001600160a01b0316915061226f9050565b348015610c5a57600080fd5b5061051e60048036036020811015610c7157600080fd5b50356122f4565b348015610c8457600080fd5b5061068560048036036020811015610c9b57600080fd5b50356001600160a01b031661234b565b348015610cb757600080fd5b506104686123b6565b348015610ccc57600080fd5b50610685612411565b348015610ce157600080fd5b50610d0860048036036020811015610cf857600080fd5b50356001600160a01b0316612417565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610d44578181015183820152602001610d2c565b505050509050019250505060405180910390f35b348015610d6457600080fd5b5061042860048036036020811015610d7b57600080fd5b5035612478565b61046861250d565b348015610d9657600080fd5b5061046860048036036020811015610dad57600080fd5b503561270d565b348015610dc057600080fd5b5061047f61275e565b348015610dd557600080fd5b5061046860048036036020811015610dec57600080fd5b50356001600160a01b03166127bf565b348015610e0857600080fd5b50610468612810565b348015610e1d57600080fd5b5061042860048036036020811015610e3457600080fd5b50356001600160a01b0316612819565b348015610e5057600080fd5b5061046860048036036040811015610e6757600080fd5b506001600160a01b038135169060200135151561282d565b348015610e8b57600080fd5b5061068560048036036020811015610ea257600080fd5b50356128fc565b348015610eb557600080fd5b5061046860048036036020811015610ecc57600080fd5b50356001600160a01b031661290e565b348015610ee857600080fd5b5061042861297c565b348015610efd57600080fd5b5061046860048036036040811015610f1457600080fd5b506001600160a01b038135169060200135612985565b348015610f3657600080fd5b5061042860048036036020811015610f4d57600080fd5b50356001600160a01b0316612990565b348015610f6957600080fd5b506104286129a3565b348015610f7e57600080fd5b5061068560048036036020811015610f9557600080fd5b50356129ac565b348015610fa857600080fd5b5061046860048036036080811015610fbf57600080fd5b508035906020810135906001600160a01b0360408201351690606001356129c1565b348015610fed57600080fd5b506104286004803603602081101561100457600080fd5b5035612b0b565b34801561101757600080fd5b506104686004803603608081101561102e57600080fd5b6001600160a01b03823581169260208101359091169160408201359190810190608081016060820135600160201b81111561106857600080fd5b82018360208201111561107a57600080fd5b803590602001918460018302840111600160201b8311171561109b57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550612b42945050505050565b3480156110e857600080fd5b5061047f600480360360208110156110ff57600080fd5b5035612b97565b34801561111257600080fd5b506104686004803603606081101561112957600080fd5b50803590602081013590604001356001600160a01b0316612caa565b6104686004803603602081101561115b57600080fd5b5035612d9f565b34801561116e57600080fd5b506104686004803603602081101561118557600080fd5b50356131d0565b34801561119857600080fd5b50610428600480360360208110156111af57600080fd5b503561364c565b3480156111c257600080fd5b506111e0600480360360208110156111d957600080fd5b50356136c4565b60408051938452602084019290925282820152519081900360600190f35b34801561120a57600080fd5b506104286004803603604081101561122157600080fd5b506001600160a01b0381358116916020013516613743565b34801561124557600080fd5b50610428613771565b34801561125a57600080fd5b506104686004803603604081101561127157600080fd5b810190602081018135600160201b81111561128b57600080fd5b82018360208201111561129d57600080fd5b803590602001918460208302840111600160201b831117156112be57600080fd5b919350915035151561378e565b3480156112d757600080fd5b50610428600480360360208110156112ee57600080fd5b503561382f565b34801561130157600080fd5b506106856138c4565b6001600160e01b0319811660009081526020819052604090205460ff165b919050565b6012546001600160a01b0316331461137957604051600160e51b62461bcd028152600401808060200182810382526028815260200180614aec6028913960400191505060405180910390fd5b601b805460ff1916911515919091179055565b60098054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156114185780601f106113ed57610100808354040283529160200191611418565b820191906000526020600020905b8154815290600101906020018083116113fb57829003601f168201915b505050505090505b90565b600061142e826138ca565b61146c57604051600160e51b62461bcd02815260040180806020018281038252602c815260200180614c32602c913960400191505060405180910390fd5b506000908152600260205260409020546001600160a01b031690565b6000611493826122f4565b9050806001600160a01b0316836001600160a01b031614156114e957604051600160e51b62461bcd028152600401808060200182810382526021815260200180614d486021913960400191505060405180910390fd5b336001600160a01b038216148061150557506115058133613743565b61154357604051600160e51b62461bcd028152600401808060200182810382526038815260200180614b146038913960400191505060405180910390fd5b60008281526002602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6012546001600160a01b031633146115eb57604051600160e51b62461bcd028152600401808060200182810382526028815260200180614aec6028913960400191505060405180910390fd5b601c91909155601d55565b61160082826138e7565b5050565b60156020526000908152604090205481565b60075490565b600033611628836122f4565b6001600160a01b0316148015611650575060008281526017602052604090206004015460ff16155b80156116685750600082815260156020526040902054155b92915050565b601854600090819081908190819060ff1680156116dd5750601b5460ff161580156116a95750601d54336000908152601f6020526040902054105b806116dd575033600090815260208052604090205460ff1680156116dd5750601c54336000908152601f6020526040902054105b602254602454336000908152601f6020526040902054601c54939992985090965094509092509050565b601a5481565b60185460ff1681565b611720338261394d565b61175e57604051600160e51b62461bcd028152600401808060200182810382526031815260200180614d966031913960400191505060405180910390fd5b6117698383836139f4565b505050565b6012546001600160a01b031633146117ba57604051600160e51b62461bcd028152600401808060200182810382526028815260200180614aec6028913960400191505060405180910390fd5b601180546001600160a01b0319166001600160a01b039490941693909317909255601355600e805460ff1916911515919091179055565b60108054600101908190556000906118088361382f565b61184657604051600160e51b62461bcd028152600401808060200182810382526022815260200180614e5b6022913960400191505060405180910390fd5b6000838152601760205260409020600301541561191457600083815260176020526040808220600281015460039091015491516001600160a01b0390911691908381818185875af1925050503d80600081146118be576040519150601f19603f3d011682016040523d82523d6000602084013e6118c3565b606091505b50509050806119125760408051600160e51b62461bcd0281526020600482015260106024820152600160811b6f2a3930b739b332b9103330b4b632b21702604482015290519081900360640190fd5b505b600083815260176020526040812080546001600160a01b031990811682556001820183905560028201805490911690556003810182905560048101805460ff191690556005015560105481146119a25760408051600160e51b62461bcd02815260206004820152601f6024820152600080516020614936833981519152604482015290519081900360640190fd5b50919050565b60006119b38361234b565b82106119f357604051600160e51b62461bcd02815260040180806020018281038252602b815260200180614984602b913960400191505060405180910390fd5b6001600160a01b0383166000908152600560205260409020805483908110611a1757fe5b9060005260206000200154905092915050565b601c5481565b6012546001600160a01b03163314611a7c57604051600160e51b62461bcd028152600401808060200182810382526028815260200180614aec6028913960400191505060405180910390fd5b6018805460ff1916911515919091179055565b6012546001600160a01b031681565b60008181526017602052604081206004015460ff16158015611acd575060008281526015602052604090205415155b8015611ae6575060008281526015602052604090205415155b8015611b02575030611af783611423565b6001600160a01b0316145b15611b1c5750600081815260156020526040902054611328565b506000611328565b60006060611b30613771565b611b6e57604051600160e51b62461bcd028152600401808060200182810382526030815260200180614bc06030913960400191505060405180910390fd5b611b788484613a13565b5060019392505050565b61176983838360405180602001604052806000815250612b42565b6000908152601760205260409020600201546001600160a01b031690565b6012546001600160a01b03163314611c0757604051600160e51b62461bcd028152600401808060200182810382526028815260200180614aec6028913960400191505060405180910390fd5b601a5481601954011115611c655760408051600160e51b62461bcd02815260206004820152601f60248201527f4e465453206861766520616c7265616479206265656e20726573657276656400604482015290519081900360640190fd5b60005b81811015611c8157611c7983613a30565b600101611c68565b5060198054909101905550565b6010805460010190819055611ca233613bba565b15611cf75760408051600160e51b62461bcd02815260206004820152601160248201527f4e6f20736372697074206b696464696573000000000000000000000000000000604482015290519081900360640190fd5b60008281526017602052604090206004015460ff16611d605760408051600160e51b62461bcd02815260206004820152601760248201527f4e6f206f70656e65642061756374696f6e20666f756e64000000000000000000604482015290519081900360640190fd5b30611d6a83611423565b6001600160a01b031614611dc85760408051600160e51b62461bcd02815260206004820152601b60248201527f43616e6e6f7420636f6d706c657465207468652061756374696f6e0000000000604482015290519081900360640190fd5b600082815260176020526040902060010154421115611e315760408051600160e51b62461bcd02815260206004820152601660248201527f41756374696f6e20616c726561647920656e6465642e00000000000000000000604482015290519081900360640190fd5b6000828152601760205260409020600301543411611e995760408051600160e51b62461bcd02815260206004820152601e60248201527f546865726520616c7265616479206973206120686967686572206269642e0000604482015290519081900360640190fd5b6000611ea4836122f4565b9050336001600160a01b0382161415611ef157604051600160e51b62461bcd028152600401808060200182810382526036815260200180614ed56036913960400191505060405180910390fd5b6000838152601760205260409020600301541561201f57600083815260176020526040808220600281015460039091015491516001600160a01b0390911691908381818185875af1925050503d8060008114611f69576040519150601f19603f3d011682016040523d82523d6000602084013e611f6e565b606091505b5050905080611fbd5760408051600160e51b62461bcd0281526020600482015260106024820152600160811b6f2a3930b739b332b9103330b4b632b21702604482015290519081900360640190fd5b600084815260176020908152604091829020600281015460039091015483516001600160a01b0390921682529181019190915281517fbb28353e4598c3b9199101a66e0989549b659a59a54d2c27fbb183f1932c8e6d929181900390910190a1505b6000838152601760209081526040918290206002810180546001600160a01b031916339081179091553460039092018290558351918252918101869052825191927fdafc4a123c6bb3b49dd38a0cba299808581a0126a37248a5f1102d5e5fa0633792918290030190a25060105481146116005760408051600160e51b62461bcd02815260206004820152601f6024820152600080516020614936833981519152604482015290519081900360640190fd5b6000611668826138ca565b60006120e6611616565b821061212657604051600160e51b62461bcd02815260040180806020018281038252602c815260200180614dc7602c913960400191505060405180910390fd5b6007828154811061213357fe5b90600052602060002001549050919050565b60006060612151613771565b61218f57604051600160e51b62461bcd028152600401808060200182810382526030815260200180614bc06030913960400191505060405180910390fd5b61219a858585613bf1565b95945050505050565b6012546001600160a01b031633146121ef57604051600160e51b62461bcd028152600401808060200182810382526028815260200180614aec6028913960400191505060405180910390fd5b6001600160a01b039190911660009081526020805260409020805460ff1916911515919091179055565b6017602052600090815260409020805460018201546002830154600384015460048501546005909501546001600160a01b0394851695939490921692909160ff9091169086565b601d5481565b600b5460ff1681565b6000606061227b613771565b6122b957604051600160e51b62461bcd028152600401808060200182810382526030815260200180614bc06030913960400191505060405180910390fd5b600f8054600101908190556122cd906138ca565b6122b9576122dd83600f54613a13565b6122e9600f54856138e7565b5050600f5492915050565b6000818152600160205260408120546001600160a01b03168061166857604051600160e51b62461bcd028152600401808060200182810382526029815260200180614b766029913960400191505060405180910390fd5b60006001600160a01b03821661239557604051600160e51b62461bcd02815260040180806020018281038252602a815260200180614b4c602a913960400191505060405180910390fd5b6001600160a01b038216600090815260036020526040902061166890613c07565b6012546001600160a01b0316331461240257604051600160e51b62461bcd028152600401808060200182810382526028815260200180614aec6028913960400191505060405180910390fd5b600b805460ff19166001179055565b601e5481565b606061242282613c0b565b80548060200260200160405190810160405280929190818152602001828054801561246c57602002820191906000526020600020905b815481526020019060010190808311612458575b50505050509050919050565b600061248333613bba565b1580156124a1575060008281526017602052604090206004015460ff165b80156124be57506000828152601760205260409020600101544211155b80156124e457506124ce826122f4565b6001600160a01b0316336001600160a01b031614155b80156125005750306124f583611423565b6001600160a01b0316145b15611b1c57506001611328565b60185460ff166125675760408051600160e51b62461bcd02815260206004820152601e60248201527f436f6e74726163742069732063757272656e746c792064697361626c65640000604482015290519081900360640190fd5b6000602454116125c15760408051600160e51b62461bcd02815260206004820152601c60248201527f4e6f206d6f726520626c696e64626f78657320617661696c61626c6500000000604482015290519081900360640190fd5b601b5460ff161580156125e45750601d54336000908152601f6020526040902054105b80612618575033600090815260208052604090205460ff1680156126185750601c54336000908152601f6020526040902054105b61266c5760408051600160e51b62461bcd02815260206004820152601c60248201527f596f7520617265206e6f74206f6e207468652077686974656c69737400000000604482015290519081900360640190fd5b60225434146126c55760408051600160e51b62461bcd02815260206004820152601460248201527f496e636f727265637420424e422076616c75652e000000000000000000000000604482015290519081900360640190fd5b6011546022546040516001600160a01b039092169181156108fc0291906000818181858888f19350505050158015612701573d6000803e3d6000fd5b5061270b33613a30565b565b6012546001600160a01b0316331461275957604051600160e51b62461bcd028152600401808060200182810382526028815260200180614aec6028913960400191505060405180910390fd5b602255565b600a8054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156114185780601f106113ed57610100808354040283529160200191611418565b60606127c9613771565b61280757604051600160e51b62461bcd028152600401808060200182810382526030815260200180614bc06030913960400191505060405180910390fd5b61160082613c25565b61270b33613c6d565b602080526000908152604090205460ff1681565b6001600160a01b03821633141561288e5760408051600160e51b62461bcd02815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015290519081900360640190fd5b3360008181526004602090815260408083206001600160a01b03871680855290835292819020805460ff1916861515908117909155815190815290519293927f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31929181900390910190a35050565b60146020526000908152604090205481565b6012546001600160a01b0316331461295a57604051600160e51b62461bcd028152600401808060200182810382526028815260200180614aec6028913960400191505060405180910390fd5b601280546001600160a01b0319166001600160a01b0392909216919091179055565b601b5460ff1681565b6116003383836139f4565b6000611668600d8363ffffffff613cb516565b600e5460ff1681565b60009081526017602052604090206003015490565b60008481526015602052604090205415612a0f57604051600160e51b62461bcd028152600401808060200182810382526044815260200180614d046044913960600191505060405180910390fd5b60008481526017602052604090206004015460ff1615612a6357604051600160e51b62461bcd0281526004018080602001828103825260358152602001806149016035913960400191505060405180910390fd5b33612a6d856122f4565b6001600160a01b031614612ab557604051600160e51b62461bcd02815260040180806020018281038252602e815260200180614956602e913960400191505060405180910390fd5b600084815260176020526040902080546001600160a01b0319166001600160a01b0384161781556001808201859055600582018390556004909101805460ff19169091179055612b053085611488565b50505050565b600033612b17836122f4565b6001600160a01b031614801561166857505060009081526017602052604090206004015460ff161590565b612b4d848484611716565b612b5984848484613d1f565b612b0557604051600160e51b62461bcd0281526004018080602001828103825260328152602001806149af6032913960400191505060405180910390fd5b6060612ba2826138ca565b612be057604051600160e51b62461bcd02815260040180806020018281038252602f815260200180614cd5602f913960400191505060405180910390fd5b600b5460ff1615612c8a576000828152600c602090815260409182902080548351601f600260001961010060018616150201909316929092049182018490048402810184019094528084529091830182828015612c7e5780601f10612c5357610100808354040283529160200191612c7e565b820191906000526020600020905b815481529060010190602001808311612c6157829003601f168201915b50505050509050611328565b604051806080016040528060588152602001614e7d605891399050611328565b33612cb4846122f4565b6001600160a01b031614612cfc57604051600160e51b62461bcd02815260040180806020018281038252602b8152602001806149e1602b913960400191505060405180910390fd5b60008381526017602052604090206004015460ff1615612d5057604051600160e51b62461bcd02815260040180806020018281038252603d815260200180614e1e603d913960400191505060405180910390fd5b6000838152601560205260409020829055811561176957612d713084611488565b600083815260166020526040902080546001600160a01b0383166001600160a01b0319909116179055505050565b601080546001019081905560008281526017602052604090206004015460ff16158015612dd9575060008281526015602052604090205415155b612e1757604051600160e51b62461bcd02815260040180806020018281038252602d815260200180614d69602d913960400191505060405180910390fd5b600082815260156020526040902054341015612e7d5760408051600160e51b62461bcd02815260206004820152601e60248201527f4552433732314d61746368613a204e6f7420656e6f7567682066756e64730000604482015290519081900360640190fd5b6000612e88836122f4565b9050336001600160a01b0382161415612ed557604051600160e51b62461bcd028152600401808060200182810382526037815260200180614a896037913960400191505060405180910390fd5b604080516001600160a01b038316602482015233604482015260648082018690528251808303909101815260849091019091526020810180516001600160e01b0316600160e01b6323b872dd02179052612f30903090613e58565b6000612f586064612f4c6013543461400390919063ffffffff16565b9063ffffffff61406616565b90506000612f6c348363ffffffff6140d316565b60008681526016602052604080822054905192935090916001600160a01b039091169083908381818185875af1925050503d8060008114612fc9576040519150601f19603f3d011682016040523d82523d6000602084013e612fce565b606091505b505090508061301d5760408051600160e51b62461bcd0281526020600482015260106024820152600160811b6f2a3930b739b332b9103330b4b632b21702604482015290519081900360640190fd5b6011546040516000916001600160a01b03169085908381818185875af1925050503d806000811461306a576040519150601f19603f3d011682016040523d82523d6000602084013e61306f565b606091505b50509050806130be5760408051600160e51b62461bcd0281526020600482015260106024820152600160811b6f2a3930b739b332b9103330b4b632b21702604482015290519081900360640190fd5b60008781526015602090815260408083208390556016825280832080546001600160a01b0319169055601482529182902034908190558251908152915133926001600160a01b038916928b927f88863d5e20f64464b554931394e2e4b6f09c10015147215bf26b3ba5070acebe9281900390910190a4601354604080513481526020810192909252818101869052516001600160a01b0387169189917fef7a63d352d8b0f42e35d7f8bd277ba75ba2ff721a50eaad4c62f1ee6561d5eb9181900360600190a3505050505060105481146116005760408051600160e51b62461bcd02815260206004820152601f6024820152600080516020614936833981519152604482015290519081900360640190fd5b60108054600101908190556131e48261364c565b6132385760408051600160e51b62461bcd02815260206004820152600f60248201527f43616e6e6f742066696e616c697a650000000000000000000000000000000000604482015290519081900360640190fd5b6000828152601760205260409020600301541561355e57600082815260176020526040812060028101546013546003909201546001600160a01b03909116929161328f91606491612f4c919063ffffffff61400316565b600085815260176020526040812060030154919250906132b5908363ffffffff6140d316565b60008681526017602052604080822054905192935090916001600160a01b039091169083908381818185875af1925050503d8060008114613312576040519150601f19603f3d011682016040523d82523d6000602084013e613317565b606091505b50509050806133665760408051600160e51b62461bcd0281526020600482015260106024820152600160811b6f2a3930b739b332b9103330b4b632b21702604482015290519081900360640190fd5b6011546040516000916001600160a01b03169085908381818185875af1925050503d80600081146133b3576040519150601f19603f3d011682016040523d82523d6000602084013e6133b8565b606091505b50509050806134075760408051600160e51b62461bcd0281526020600482015260106024820152600160811b6f2a3930b739b332b9103330b4b632b21702604482015290519081900360640190fd5b6000878152601760209081526040918290208054600390910154835190815292516001600160a01b03808a16949216928b927f88863d5e20f64464b554931394e2e4b6f09c10015147215bf26b3ba5070acebe929081900390910190a4600087815260176020908152604091829020805460039091015460135484519182529281019290925281830187905291516001600160a01b039092169189917fef7a63d352d8b0f42e35d7f8bd277ba75ba2ff721a50eaad4c62f1ee6561d5eb919081900360600190a360006134d9886122f4565b604080516001600160a01b0380841660248301528916604482015260648082018c90528251808303909101815260849091019091526020810180516001600160e01b0316600160e01b6323b872dd02179052909150613539903090613e58565b5050506000858152601760209081526040808320600301546014909252909120555050505b600082815260176020908152604091829020600281015460039091015483516001600160a01b0390921682529181019190915281517fdaec4582d5d9595688c8c98545fdd1c696d41c6aeaeb636737e84ed2f5c00eda929181900390910190a1600082815260176020526040812080546001600160a01b031990811682556001820183905560028201805490911690556003810182905560048101805460ff191690556005015560105481146116005760408051600160e51b62461bcd02815260206004820152601f6024820152600080516020614936833981519152604482015290519081900360640190fd5b60008181526017602052604081206004015460ff16801561367e57506000828152601760205260409020600101544210155b80156125005750600082815260176020526040902060058101546003909101541015806125005750600082815260176020526040902060030154611b1c57506001611328565b60008181526015602052604081205481908190156136f557505050600081815260156020526040812054908061373c565b60008481526017602052604090206003015415613727575050506000818152601760205260408120600301548161373c565b50505060008181526014602052604081205481905b9193909250565b6001600160a01b03918216600090815260046020908152604080832093909416825291909152205460ff1690565b600e5460009060ff1680613789575061378933612990565b905090565b6012546001600160a01b031633146137da57604051600160e51b62461bcd028152600401808060200182810382526028815260200180614aec6028913960400191505060405180910390fd5b60005b82811015612b055781602060008686858181106137f657fe5b602090810292909201356001600160a01b0316835250810191909152604001600020805460ff19169115159190911790556001016137dd565b60008181526017602052604081206004015460ff1680156125005750600082815260176020526040902060010154421080159061387c575060008281526017602052604090206003015415155b801561389e575060008281526017602052604090206005810154600390910154105b806125005750306138ae83611423565b6001600160a01b031614611b1c57506001611328565b60195481565b6000908152600160205260409020546001600160a01b0316151590565b6138f0826138ca565b61392e57604051600160e51b62461bcd02815260040180806020018281038252602c815260200180614c5e602c913960400191505060405180910390fd5b6000828152600c60209081526040909120825161176992840190614848565b6000613958826138ca565b61399657604051600160e51b62461bcd02815260040180806020018281038252602c815260200180614ac0602c913960400191505060405180910390fd5b60006139a1836122f4565b9050806001600160a01b0316846001600160a01b031614806139dc5750836001600160a01b03166139d184611423565b6001600160a01b0316145b806139ec57506139ec8185613743565b949350505050565b6139ff838383614133565b613a09838261427d565b6117698282614372565b613a1d82826143b0565b613a278282614372565b611600816144e7565b6000613a3a61452b565b90506000613a646001613a586023548561457490919063ffffffff16565b9063ffffffff6145dc16565b90505b613a70816120d1565b15613a8e57602354600190910190811115613a89575060015b613a67565b6060613a9982614639565b604051602001806059614a0c823960590182805190602001908083835b60208310613ad55780518252601f199092019160209182019101613ab6565b5181516000196020949094036101000a8401908116901991909116179052600160d91b64173539b7b7029390910192835260408051601a1981860301815260059094019052602480549091019055509250613b3591508590508383613bf1565b613b895760408051600160e51b62461bcd02815260206004820152600d60248201527f4d696e74696e67206572726f7200000000000000000000000000000000000000604482015290519081900360640190fd5b506001600160a01b039092166000908152601f60209081526040822080546001810182559083529120019190915550565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081158015906139ec5750141592915050565b6000613bfd8484613a13565b611b7883836138e7565b5490565b6001600160a01b0316600090815260056020526040902090565b613c36600d8263ffffffff6146fd16565b6040516001600160a01b038216907f6ae172837ea30b801fbfcdd4108aa1d5bf8ff775444fd70256b44e6bf3dfc3f690600090a250565b613c7e600d8263ffffffff61478116565b6040516001600160a01b038216907fe94479a9f7e1952cc78f2d6baab678adc1b772d936c6583def489e524cb6669290600090a250565b60006001600160a01b038216613cff57604051600160e51b62461bcd028152600401808060200182810382526022815260200180614c8a6022913960400191505060405180910390fd5b506001600160a01b03166000908152602091909152604090205460ff1690565b6000613d33846001600160a01b0316613bba565b613d3f575060016139ec565b604051600160e11b630a85bd0102815233600482018181526001600160a01b03888116602485015260448401879052608060648501908152865160848601528651600095928a169463150b7a029490938c938b938b939260a4019060208501908083838e5b83811015613dbc578181015183820152602001613da4565b50505050905090810190601f168015613de95780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b158015613e0b57600080fd5b505af1158015613e1f573d6000803e3d6000fd5b505050506040513d6020811015613e3557600080fd5b50516001600160e01b031916600160e11b630a85bd010214915050949350505050565b613e6a826001600160a01b0316613bba565b613ebe5760408051600160e51b62461bcd02815260206004820181905260248201527f536166654552433732313a2063616c6c20746f206e6f6e2d636f6e7472616374604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b60208310613efc5780518252601f199092019160209182019101613edd565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613f5e576040519150601f19603f3d011682016040523d82523d6000602084013e613f63565b606091505b509150915081613fa757604051600160e51b62461bcd028152600401808060200182810382526021815260200180614b9f6021913960400191505060405180910390fd5b805115612b0557808060200190516020811015613fc357600080fd5b5051612b0557604051600160e51b62461bcd02815260040180806020018281038252602b815260200180614df3602b913960400191505060405180910390fd5b60008261401257506000611668565b8282028284828161401f57fe5b041461405f57604051600160e51b62461bcd028152600401808060200182810382526021815260200180614c116021913960400191505060405180910390fd5b9392505050565b60008082116140bf5760408051600160e51b62461bcd02815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b60008284816140ca57fe5b04949350505050565b60008282111561412d5760408051600160e51b62461bcd02815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b826001600160a01b0316614146826122f4565b6001600160a01b03161461418e57604051600160e51b62461bcd028152600401808060200182810382526029815260200180614cac6029913960400191505060405180910390fd5b6001600160a01b0382166141d657604051600160e51b62461bcd028152600401808060200182810382526024815260200180614a656024913960400191505060405180910390fd5b6141df816147eb565b6001600160a01b038316600090815260036020526040902061420090614828565b6001600160a01b03821660009081526003602052604090206142219061483f565b60008181526001602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6001600160a01b0382166000908152600560205260408120546142a790600163ffffffff6140d316565b600083815260066020526040902054909150808214614342576001600160a01b03841660009081526005602052604081208054849081106142e457fe5b906000526020600020015490508060056000876001600160a01b03166001600160a01b03168152602001908152602001600020838154811061432257fe5b600091825260208083209091019290925591825260069052604090208190555b6001600160a01b038416600090815260056020526040902080549061436b9060001983016148c6565b5050505050565b6001600160a01b0390911660009081526005602081815260408084208054868652600684529185208290559282526001810183559183529091200155565b6001600160a01b03821661440e5760408051600160e51b62461bcd02815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015290519081900360640190fd5b614417816138ca565b1561446c5760408051600160e51b62461bcd02815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015290519081900360640190fd5b600081815260016020908152604080832080546001600160a01b0319166001600160a01b0387169081179091558352600390915290206144ab9061483f565b60405181906001600160a01b038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600780546000838152600860205260408120829055600182018355919091527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6880155565b6021805460010190819055604080516020808201939093523360601b81830152600019430140605480830191909152825180830390910181526074909101909152805191012090565b6000816145cb5760408051600160e51b62461bcd02815260206004820152601860248201527f536166654d6174683a206d6f64756c6f206279207a65726f0000000000000000604482015290519081900360640190fd5b8183816145d457fe5b069392505050565b60008282018381101561405f5760408051600160e51b62461bcd02815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60608161466157506040805180820190915260018152600160fc1b6003026020820152611328565b8160005b811561467957600101600a82049150614665565b6060816040519080825280601f01601f1916602001820160405280156146a6576020820181803883390190505b50905060001982015b85156146f457600a860660300160f81b828280600190039350815181106146d257fe5b60200101906001600160f81b031916908160001a905350600a860495506146af565b50949350505050565b6147078282613cb5565b1561475c5760408051600160e51b62461bcd02815260206004820152601f60248201527f526f6c65733a206163636f756e7420616c72656164792068617320726f6c6500604482015290519081900360640190fd5b6001600160a01b0316600090815260209190915260409020805460ff19166001179055565b61478b8282613cb5565b6147c957604051600160e51b62461bcd028152600401808060200182810382526021815260200180614bf06021913960400191505060405180910390fd5b6001600160a01b0316600090815260209190915260409020805460ff19169055565b6000818152600260205260409020546001600160a01b03161561482557600081815260026020526040902080546001600160a01b03191690555b50565b805461483b90600163ffffffff6140d316565b9055565b80546001019055565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061488957805160ff19168380011785556148b6565b828001600101855582156148b6579182015b828111156148b657825182559160200191906001019061489b565b506148c29291506148e6565b5090565b815481835581811115611769576000838152602090206117699181019083015b61142091905b808211156148c257600081556001016148ec56fe4552433732314d61746368613a205468652073656c6563746564204e465420616c72656164792068617320616e2061756374696f6e5265656e7472616e637947756172643a207265656e7472616e742063616c6c004552433732314d61746368613a204f6e6c79206f776e65722063616e2061756374696f6e2074686973206974656d455243373231456e756d657261626c653a206f776e657220696e646578206f7574206f6620626f756e64734552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724552433732314d61746368613a204f6e6c79206f776e65722063616e2073656c6c2074686973206974656d68747470733a2f2f6e667473746f726167652e6c696e6b2f697066732f626166796265696332687a796661786f376776657a666e6c6c73677875736a706236726a3673373776727533347968626e6768646a6b78763378652f4552433732313a207472616e7366657220746f20746865207a65726f20616464726573734552433732314d61746368613a205468652073656c6c65722063616e6e6f742062757920686973206f776e20636f6c6c65637469626c654552433732313a206f70657261746f7220717565727920666f72206e6f6e6578697374656e7420746f6b656e63616e206f6e6c792062652063616c6c65642062792074686520636f6e7472616374206f776e65724552433732313a20617070726f76652063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f76656420666f7220616c6c4552433732313a2062616c616e636520717565727920666f7220746865207a65726f20616464726573734552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656e536166654552433732313a206c6f772d6c6576656c2063616c6c206661696c65644d696e746572526f6c653a2063616c6c657220646f6573206e6f74206861766520746865204d696e74657220726f6c65526f6c65733a206163636f756e7420646f6573206e6f74206861766520726f6c65536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774552433732313a20617070726f76656420717565727920666f72206e6f6e6578697374656e7420746f6b656e4552433732314d657461646174613a2055524920736574206f66206e6f6e6578697374656e7420746f6b656e526f6c65733a206163636f756e7420697320746865207a65726f20616464726573734552433732313a207472616e73666572206f6620746f6b656e2074686174206973206e6f74206f776e4552433732314d657461646174613a2055524920717565727920666f72206e6f6e6578697374656e7420746f6b656e4552433732314d61746368613a205468652073656c6563746564204e4654206973206f70656e20666f722073616c652c2063616e6e6f742062652061756374696f6e65644552433732313a20617070726f76616c20746f2063757272656e74206f776e65724552433732314d61746368613a2054686520636f6c6c65637469626c65206973206e6f7420666f722073616c654552433732313a207472616e736665722063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f766564455243373231456e756d657261626c653a20676c6f62616c20696e646578206f7574206f6620626f756e6473536166654552433732313a204552433230206f7065726174696f6e20646964206e6f7420737563636565644552433732314d61746368613a2043616e6e6f742073656c6c20616e206974656d2077686963682068617320616e206163746976652061756374696f6e436f6e646974696f6e7320746f20776974686472617720617265206e6f74206d657468747470733a2f2f6e667473746f726167652e6c696e6b2f697066732f6261666b7265696274636e6533656836346932716767766d77646564326f33686e3432786368333466776564356177786b6b6d64376136767532344552433732314d61746368613a20546865206f776e65722063616e6e6f742062696420686973206f776e20636f6c6c65637469626c65a165627a7a723058203d364534221b5b893b9868292201f66cb1478458392236054f8f4c2a8683e49f0029

Deployed Bytecode Sourcemap

45110:19453:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14778:167;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14778:167:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;14778:167:0;-1:-1:-1;;;;;;14778:167:0;;:::i;:::-;;;;;;;;;;;;;;;;;;63693:90;;8:9:-1;5:2;;;30:1;27;20:12;5:2;63693:90:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;63693:90:0;;;;:::i;:::-;;39727:85;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39727:85:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;39727:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19740:241;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19740:241:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;19740:241:0;;:::i;:::-;;;;-1:-1:-1;;;;;19740:241:0;;;;;;;;;;;;;;19012:435;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19012:435:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;19012:435:0;;;;;;;;:::i;64128:141::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;64128:141:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;64128:141:0;;;;;;;:::i;42640:109::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42640:109:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;42640:109:0;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;42640:109:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;42640:109:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;42640:109:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;42640:109:0;;-1:-1:-1;42640:109:0;;-1:-1:-1;;;;;42640:109:0:i;45657:47::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;45657:47:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;45657:47:0;;:::i;:::-;;;;;;;;;;;;;;;;33536:96;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33536:96:0;;;:::i;51242:175::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;51242:175:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;51242:175:0;;:::i;60774:488::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;60774:488:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60047:27;;8:9:-1;5:2;;;30:1;27;20:12;5:2;60047:27:0;;;:::i;59991:19::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;59991:19:0;;;:::i;21486:361::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21486:361:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;21486:361:0;;;;;;;;;;;;;;;;;:::i;63088:219::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;63088:219:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;63088:219:0;;;;;;;;;;;;;;;:::i;55398:505::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;55398:505:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;55398:505:0;;:::i;33145:232::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33145:232:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;33145:232:0;;;;;;;;:::i;60113:29::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;60113:29:0;;;:::i;63588:97::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;63588:97:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;63588:97:0;;;;:::i;45340:29::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;45340:29:0;;;:::i;49436:301::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;49436:301:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;49436:301:0;;:::i;30493:167::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30493:167:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;30493:167:0;;;;;;;;:::i;22509:168::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22509:168:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;22509:168:0;;;;;;;;;;;;;;;;;:::i;58185:135::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;58185:135:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;58185:135:0;;:::i;64277:281::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;64277:281:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;64277:281:0;;;;;;;;:::i;52800:1797::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;52800:1797:0;;:::i;42398:102::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42398:102:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;42398:102:0;;:::i;33978:199::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33978:199:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;33978:199:0;;:::i;41512:178::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41512:178:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;41512:178:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;41512:178:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;41512:178:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;41512:178:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;41512:178:0;;-1:-1:-1;41512:178:0;;-1:-1:-1;;;;;41512:178:0:i;63791:119::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;63791:119:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;63791:119:0;;;;;;;;;;:::i;47012:43::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;47012:43:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;47012:43:0;;:::i;:::-;;;;-1:-1:-1;;;;;47012:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60149:23;;8:9:-1;5:2;;;30:1;27;20:12;5:2;60149:23:0;;;:::i;38842:18::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38842:18:0;;;:::i;42971:288::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42971:288:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;42971:288:0;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;42971:288:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;42971:288:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;42971:288:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;42971:288:0;;-1:-1:-1;;;42971:288:0;;-1:-1:-1;;;;;42971:288:0;;-1:-1:-1;42971:288:0;;-1:-1:-1;42971:288:0:i;18316:265::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18316:265:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;18316:265:0;;:::i;17842:248::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17842:248:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;17842:248:0;-1:-1:-1;;;;;17842:248:0;;:::i;63416:72::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;63416:72:0;;;:::i;60181:27::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;60181:27:0;;;:::i;42508:124::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42508:124:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;42508:124:0;-1:-1:-1;;;;;42508:124:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;42508:124:0;;;;;;;;;;;;;;;;;52233:393;;8:9:-1;5:2;;;30:1;27;20:12;5:2;52233:393:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;52233:393:0;;:::i;61270:448::-;;;:::i;63497:83::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;63497:83:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;63497:83:0;;:::i;39927:89::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39927:89:0;;;:::i;29444:92::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29444:92:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29444:92:0;-1:-1:-1;;;;;29444:92:0;;:::i;29544:77::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29544:77:0;;;:::i;60270:41::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;60270:41:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;60270:41:0;-1:-1:-1;;;;;60270:41:0;;:::i;20282:248::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20282:248:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;20282:248:0;;;;;;;;;;:::i;45495:42::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;45495:42:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;45495:42:0;;:::i;63315:92::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;63315:92:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;63315:92:0;-1:-1:-1;;;;;63315:92:0;;:::i;60081:25::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;60081:25:0;;;:::i;43429:136::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43429:136:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;43429:136:0;;;;;;;;:::i;29327:109::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29327:109:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29327:109:0;-1:-1:-1;;;;;29327:109:0;;:::i;30018:25::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30018:25:0;;;:::i;58328:121::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;58328:121:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;58328:121:0;;:::i;51479:746::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;51479:746:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;51479:746:0;;;;;;;;-1:-1:-1;;;;;51479:746:0;;;;;;;;;;:::i;48051:144::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;48051:144:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;48051:144:0;;:::i;23412:348::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23412:348:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;23412:348:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;23412:348:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;23412:348:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;23412:348:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;23412:348:0;;-1:-1:-1;23412:348:0;;-1:-1:-1;;;;;23412:348:0:i;40223:373::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40223:373:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;40223:373:0;;:::i;48241:746::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;48241:746:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;48241:746:0;;;;;;;;;;;-1:-1:-1;;;;;48241:746:0;;:::i;49764:1470::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;49764:1470:0;;:::i;56406:1743::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;56406:1743:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;56406:1743:0;;:::i;55911:416::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;55911:416:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;55911:416:0;;:::i;49129:299::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;49129:299:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;49129:299:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;20860:179;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20860:179:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;20860:179:0;;;;;;;;;;:::i;30668:110::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30668:110:0;;;:::i;63918:202::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;63918:202:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;63918:202:0;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;63918:202:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;63918:202:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;63918:202:0;;-1:-1:-1;63918:202:0;-1:-1:-1;63918:202:0;;;;:::i;54804:528::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;54804:528:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;54804:528:0;;:::i;60017:23::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;60017:23:0;;;:::i;14778:167::-;-1:-1:-1;;;;;;14904:33:0;;14875:4;14904:33;;;;;;;;;;;;;14778:167;;;;:::o;63693:90::-;60577:14;;-1:-1:-1;;;;;60577:14:0;60563:10;:28;60555:81;;;;-1:-1:-1;;;;;60555:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63757:13;:18;;-1:-1:-1;;63757:18:0;;;;;;;;;;63693:90::o;39727:85::-;39799:5;39792:12;;;;;;;;-1:-1:-1;;39792:12:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39766:13;;39792:12;;39799:5;;39792:12;;39799:5;39792:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39727:85;;:::o;19740:241::-;19799:7;19841:16;19849:7;19841;:16::i;:::-;19819:110;;;;-1:-1:-1;;;;;19819:110:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;19949:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;19949:24:0;;19740:241::o;19012:435::-;19076:13;19092:16;19100:7;19092;:16::i;:::-;19076:32;;19133:5;-1:-1:-1;;;;;19127:11:0;:2;-1:-1:-1;;;;;19127:11:0;;;19119:57;;;;-1:-1:-1;;;;;19119:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19211:10;-1:-1:-1;;;;;19211:19:0;;;;:58;;;19234:35;19251:5;19258:10;19234:16;:35::i;:::-;19189:164;;;;-1:-1:-1;;;;;19189:164:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19366:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;19366:29:0;-1:-1:-1;;;;;19366:29:0;;;;;;;;;19411:28;;19366:24;;19411:28;;;;;;;19012:435;;;:::o;64128:141::-;60577:14;;-1:-1:-1;;;;;60577:14:0;60563:10;:28;60555:81;;;;-1:-1:-1;;;;;60555:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64211:14;:22;;;;64244:8;:17;64128:141::o;42640:109::-;42715:26;42728:7;42737:3;42715:12;:26::i;:::-;42640:109;;:::o;45657:47::-;;;;;;;;;;;;;:::o;33536:96::-;33607:10;:17;33536:96;:::o;51242:175::-;51300:4;51343:10;51325:16;51333:7;51325;:16::i;:::-;-1:-1:-1;;;;;51325:28:0;;:55;;;;-1:-1:-1;51358:17:0;;;;:8;:17;;;;;:22;;;;;51357:23;51325:55;:83;;;;-1:-1:-1;51384:21:0;;;;:12;:21;;;;;;:24;51325:83;51317:92;51242:175;-1:-1:-1;;51242:175:0:o;60774:488::-;60940:7;;60813:16;;;;;;;;;;60940:7;;:158;;;;-1:-1:-1;60953:13:0;;;;:22;;;:66;;-1:-1:-1;61011:8:0;;60990:10;60979:22;;;;:10;:22;;;;;:29;:40;60953:66;60952:145;;;-1:-1:-1;61035:10:0;61025:21;;;;:9;:21;;;;;;;;:71;;;;-1:-1:-1;61082:14:0;;61061:10;61050:22;;;;:10;:22;;;;;:29;:46;61025:71;61119:4;;61149:9;;61195:10;61184:22;;;;:10;:22;;;;;:29;61240:14;;60926:172;;61119:4;;-1:-1:-1;61149:9:0;;-1:-1:-1;61184:29:0;-1:-1:-1;61240:14:0;;-1:-1:-1;60774:488:0;-1:-1:-1;60774:488:0:o;60047:27::-;;;;:::o;59991:19::-;;;;;;:::o;21486:361::-;21678:39;21697:10;21709:7;21678:18;:39::i;:::-;21656:138;;;;-1:-1:-1;;;;;21656:138:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21807:32;21821:4;21827:2;21831:7;21807:13;:32::i;:::-;21486:361;;;:::o;63088:219::-;60577:14;;-1:-1:-1;;;;;60577:14:0;60563:10;:28;60555:81;;;;-1:-1:-1;;;;;60555:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63207:5;:12;;-1:-1:-1;;;;;;63207:12:0;-1:-1:-1;;;;;63207:12:0;;;;;;;;;;;63230:14;:30;63271:13;:28;;-1:-1:-1;;63271:28:0;;;;;;;;;;63088:219::o;55398:505::-;44874:13;:18;;44891:1;44874:18;;;;;55462:4;;55489:20;55501:7;55489:11;:20::i;:::-;55481:67;;;;-1:-1:-1;;;;;55481:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55648:1;55617:17;;;:8;:17;;;;;:28;;;:32;55613:211;;55667:12;55685:17;;;:8;:17;;;;;;:31;;;;55728:28;;;;;55685:76;;-1:-1:-1;;;;;55685:31:0;;;;55728:28;55667:12;55685:76;55667:12;55685:76;55728:28;55685:31;:76;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;55666:95:0;;;55784:7;55776:36;;;;;-1:-1:-1;;;;;55776:36:0;;;;;;;;;;;;-1:-1:-1;;;;;55776:36:0;;;;;;;;;;;;;;;55613:211;;55876:17;;;;:8;:17;;;;;55869:24;;-1:-1:-1;;;;;;55869:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;55869:24:0;;;;;;44986:13;;44970:29;;44962:73;;;;;-1:-1:-1;;;;;44962:73:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;44962:73:0;;;;;;;;;;;;;;;55398:505;;;;:::o;33145:232::-;33225:7;33261:16;33271:5;33261:9;:16::i;:::-;33253:5;:24;33245:80;;;;-1:-1:-1;;;;;33245:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;33343:19:0;;;;;;:12;:19;;;;;:26;;33363:5;;33343:26;;;;;;;;;;;;;;33336:33;;33145:232;;;;:::o;60113:29::-;;;;:::o;63588:97::-;60577:14;;-1:-1:-1;;;;;60577:14:0;60563:10;:28;60555:81;;;;-1:-1:-1;;;;;60555:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63656:7;:21;;-1:-1:-1;;63656:21:0;;;;;;;;;;63588:97::o;45340:29::-;;;-1:-1:-1;;;;;45340:29:0;;:::o;49436:301::-;49490:7;49515:17;;;:8;:17;;;;;:22;;;;;49514:23;:50;;;;-1:-1:-1;49563:1:0;49541:21;;;:12;:21;;;;;;:23;;49514:50;:77;;;;-1:-1:-1;49590:1:0;49568:21;;;:12;:21;;;;;;:23;;49514:77;:118;;;;-1:-1:-1;49627:4:0;49595:20;49607:7;49595:11;:20::i;:::-;-1:-1:-1;;;;;49595:37:0;;49514:118;49510:220;;;-1:-1:-1;49656:21:0;;;;:12;:21;;;;;;49649:28;;49510:220;-1:-1:-1;49717:1:0;49710:8;;30493:167;30590:4;30890:21;30944:10;:8;:10::i;:::-;30922:108;;;;-1:-1:-1;;;;;30922:108:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30612:18;30618:2;30622:7;30612:5;:18::i;:::-;-1:-1:-1;30648:4:0;;30493:167;-1:-1:-1;;;30493:167:0:o;22509:168::-;22630:39;22647:4;22653:2;22657:7;22630:39;;;;;;;;;;;;:16;:39::i;58185:135::-;58246:15;58281:17;;;:8;:17;;;;;:31;;;-1:-1:-1;;;;;58281:31:0;;58185:135::o;64277:281::-;60577:14;;-1:-1:-1;;;;;60577:14:0;60563:10;:28;60555:81;;;;-1:-1:-1;;;;;60555:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64386:12;;64376:6;64365:8;;:17;:33;;64357:77;;;;;-1:-1:-1;;;;;64357:77:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;64452:9;64447:73;64471:6;64467:1;:10;64447:73;;;64499:9;64504:3;64499:4;:9::i;:::-;64479:3;;64447:73;;;-1:-1:-1;64532:8:0;:18;;;;;;;-1:-1:-1;64277:281:0:o;52800:1797::-;44874:13;:18;;44891:1;44874:18;;;;;53191:23;:10;:21;:23::i;:::-;53190:24;53182:54;;;;;-1:-1:-1;;;;;53182:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;53294:17;;;;:8;:17;;;;;:22;;;;;53286:58;;;;;-1:-1:-1;;;;;53286:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;53426:4;53394:20;53406:7;53394:11;:20::i;:::-;-1:-1:-1;;;;;53394:37:0;;53386:77;;;;;-1:-1:-1;;;;;53386:77:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;53576:17;;;;:8;:17;;;;;:28;;;53569:3;:35;;53547:107;;;;;-1:-1:-1;;;;;53547:107:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;53772:17;;;;:8;:17;;;;;:28;;;53760:9;:40;53738:120;;;;;-1:-1:-1;;;;;53738:120:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;53871:13;53887:16;53895:7;53887;:16::i;:::-;53871:32;-1:-1:-1;53922:10:0;-1:-1:-1;;;;;53922:17:0;;;;53914:84;;;;-1:-1:-1;;;;;53914:84:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54113:1;54084:17;;;:8;:17;;;;;:28;;;:30;54080:298;;54132:12;54150:17;;;:8;:17;;;;;;:31;;;;54193:28;;;;;54150:76;;-1:-1:-1;;;;;54150:31:0;;;;54193:28;54132:12;54150:76;54132:12;54150:76;54193:28;54150:31;:76;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;54131:95:0;;;54249:7;54241:36;;;;;-1:-1:-1;;;;;54241:36:0;;;;;;;;;;;;-1:-1:-1;;;;;54241:36:0;;;;;;;;;;;;;;;54304:17;;;;:8;:17;;;;;;;;;:31;;;;54337:28;;;;;54297:69;;-1:-1:-1;;;;;54304:31:0;;;54297:69;;;;;;;;;;;;;;;;;;;;;;54080:298;;54425:17;;;;:8;:17;;;;;;;;;:31;;;:44;;-1:-1:-1;;;;;;54425:44:0;54459:10;54425:44;;;;;;54511:9;54480:28;;;;:40;;;54536:51;;;;;;;;;;;;;54459:10;;54536:51;;;;;;;;;44950:1;44986:13;;44970:12;:29;44962:73;;;;;-1:-1:-1;;;;;44962:73:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;44962:73:0;;;;;;;;;;;;;;42398:102;42452:4;42476:16;42484:7;42476;:16::i;33978:199::-;34036:7;34072:13;:11;:13::i;:::-;34064:5;:21;34056:78;;;;-1:-1:-1;;;;;34056:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34152:10;34163:5;34152:17;;;;;;;;;;;;;;;;34145:24;;33978:199;;;:::o;41512:178::-;41618:4;30890:21;30944:10;:8;:10::i;:::-;30922:108;;;;-1:-1:-1;;;;;30922:108:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41642:40;41660:2;41664:7;41673:8;41642:17;:40::i;:::-;41635:47;41512:178;-1:-1:-1;;;;;41512:178:0:o;63791:119::-;60577:14;;-1:-1:-1;;;;;60577:14:0;60563:10;:28;60555:81;;;;-1:-1:-1;;;;;60555:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;63874:14:0;;;;;;;;:9;:14;;;;;:28;;-1:-1:-1;;63874:28:0;;;;;;;;;;63791:119::o;47012:43::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;47012:43:0;;;;;;;;;;;;;;;;;;:::o;60149:23::-;;;;:::o;38842:18::-;;;;;;:::o;42971:288::-;43052:7;30890:21;30944:10;:8;:10::i;:::-;30922:108;;;;-1:-1:-1;;;;;30922:108:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43090:11;:13;;;;;;;;43122:20;;:7;:20::i;:::-;43072:72;;43154:22;43160:2;43164:11;;43154:5;:22::i;:::-;43187:35;43200:11;;43213:8;43187:12;:35::i;:::-;-1:-1:-1;;43240:11:0;;;42971:288;-1:-1:-1;;42971:288:0:o;18316:265::-;18371:7;18407:20;;;:11;:20;;;;;;-1:-1:-1;;;;;18407:20:0;18460:19;18438:110;;;;-1:-1:-1;;;;;18438:110:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17842:248;17897:7;-1:-1:-1;;;;;17939:19:0;;17917:111;;;;-1:-1:-1;;;;;17917:111:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;18048:24:0;;;;;;:17;:24;;;;;:34;;:32;:34::i;63416:72::-;60577:14;;-1:-1:-1;;;;;60577:14:0;60563:10;:28;60555:81;;;;-1:-1:-1;;;;;60555:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63467:6;:13;;-1:-1:-1;;63467:13:0;63476:4;63467:13;;;63416:72::o;60181:27::-;;;;:::o;42508:124::-;42567:16;42603:21;42618:5;42603:14;:21::i;:::-;42596:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42508:124;;;:::o;52233:393::-;52287:4;52309:23;:10;:21;:23::i;:::-;52308:24;:63;;;;-1:-1:-1;52349:17:0;;;;:8;:17;;;;;:22;;;;;52308:63;:115;;;;-1:-1:-1;52395:17:0;;;;:8;:17;;;;;:28;;;52388:3;:35;;52308:115;:162;;;;;52454:16;52462:7;52454;:16::i;:::-;-1:-1:-1;;;;;52440:30:0;:10;-1:-1:-1;;;;;52440:30:0;;;52308:162;:216;;;;-1:-1:-1;52519:4:0;52487:20;52499:7;52487:11;:20::i;:::-;-1:-1:-1;;;;;52487:37:0;;52308:216;52304:315;;;-1:-1:-1;52558:4:0;52551:11;;61270:448;60704:7;;;;60696:50;;;;;-1:-1:-1;;;;;60696:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;61355:1;61343:9;;:13;61334:55;;;;;-1:-1:-1;;;;;61334:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;61409:13;;;;:22;;;:66;;-1:-1:-1;61467:8:0;;61446:10;61435:22;;;;:10;:22;;;;;:29;:40;61409:66;61408:145;;;-1:-1:-1;61491:10:0;61481:21;;;;:9;:21;;;;;;;;:71;;;;-1:-1:-1;61538:14:0;;61517:10;61506:22;;;;:10;:22;;;;;:29;:46;61481:71;61400:186;;;;;-1:-1:-1;;;;;61400:186:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;61619:4;;61606:9;:17;61597:51;;;;;-1:-1:-1;;;;;61597:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;61661:5;;61676:4;;61661:20;;-1:-1:-1;;;;;61661:5:0;;;;:20;;;;;61676:4;61661:5;:20;:5;:20;61676:4;61661:5;:20;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;61661:20:0;61694:16;61699:10;61694:4;:16::i;:::-;61270:448::o;63497:83::-;60577:14;;-1:-1:-1;;;;;60577:14:0;60563:10;:28;60555:81;;;;-1:-1:-1;;;;;60555:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63560:4;:12;63497:83::o;39927:89::-;40001:7;39994:14;;;;;;;;-1:-1:-1;;39994:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39968:13;;39994:14;;40001:7;;39994:14;;40001:7;39994:14;;;;;;;;;;;;;;;;;;;;;;;;29444:92;30890:21;30944:10;:8;:10::i;:::-;30922:108;;;;-1:-1:-1;;;;;30922:108:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29509:19;29520:7;29509:10;:19::i;29544:77::-;29588:25;29602:10;29588:13;:25::i;60270:41::-;;;;;;;;;;;;;;;:::o;20282:248::-;-1:-1:-1;;;;;20362:16:0;;20368:10;20362:16;;20354:54;;;;;-1:-1:-1;;;;;20354:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;20440:10;20421:30;;;;:18;:30;;;;;;;;-1:-1:-1;;;;;20421:34:0;;;;;;;;;;;;:45;;-1:-1:-1;;20421:45:0;;;;;;;;;;20482:40;;;;;;;20421:34;;20440:10;20482:40;;;;;;;;;;;20282:248;;:::o;45495:42::-;;;;;;;;;;;;;:::o;63315:92::-;60577:14;;-1:-1:-1;;;;;60577:14:0;60563:10;:28;60555:81;;;;-1:-1:-1;;;;;60555:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63379:14;:20;;-1:-1:-1;;;;;;63379:20:0;-1:-1:-1;;;;;63379:20:0;;;;;;;;;;63315:92::o;60081:25::-;;;;;;:::o;43429:136::-;43519:38;43533:10;43545:2;43549:7;43519:13;:38::i;29327:109::-;29383:4;29407:21;:8;29420:7;29407:21;:12;:21;:::i;30018:25::-;;;;;;:::o;58328:121::-;58386:7;58413:17;;;:8;:17;;;;;:28;;;;58328:121::o;51479:746::-;51619:21;;;;:12;:21;;;;;;:24;51611:105;;;;-1:-1:-1;;;;;51611:105:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51736:17;;;;:8;:17;;;;;:22;;;;;51735:23;51727:89;;;;-1:-1:-1;;;;;51727:89:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51853:10;51835:16;51843:7;51835;:16::i;:::-;-1:-1:-1;;;;;51835:28:0;;51827:87;;;;-1:-1:-1;;;;;51827:87:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51927:17;;;;:8;:17;;;;;:44;;-1:-1:-1;;;;;;51927:44:0;-1:-1:-1;;;;;51927:44:0;;;;;-1:-1:-1;51982:28:0;;;:43;;;52036:25;;;:41;;;52088:22;;;;:29;;-1:-1:-1;;52088:29:0;;;;;;52184:31;52200:4;51927:17;52184:7;:31::i;:::-;51479:746;;;;:::o;48051:144::-;48106:4;48149:10;48131:16;48139:7;48131;:16::i;:::-;-1:-1:-1;;;;;48131:28:0;;:55;;;;-1:-1:-1;;48164:17:0;;;;:8;:17;;;;;:22;;;;;48163:23;;48051:144::o;23412:348::-;23562:31;23575:4;23581:2;23585:7;23562:12;:31::i;:::-;23626:48;23649:4;23655:2;23659:7;23668:5;23626:22;:48::i;:::-;23604:148;;;;-1:-1:-1;;;;;23604:148:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40223:373;40281:13;40315:16;40323:7;40315;:16::i;:::-;40307:76;;;;-1:-1:-1;;;;;40307:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40398:6;;;;40394:195;;;40428:19;;;;:10;:19;;;;;;;;;40421:26;;;;;;-1:-1:-1;;40421:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40428:19;;40421:26;;40428:19;40421:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40394:195;40480:97;;;;;;;;;;;;;;;;;;;;;48241:746;48379:10;48361:16;48369:7;48361;:16::i;:::-;-1:-1:-1;;;;;48361:28:0;;48353:84;;;;-1:-1:-1;;;;;48353:84:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48514:17;;;;:8;:17;;;;;:22;;;;;48513:23;48505:97;;;;-1:-1:-1;;;;;48505:97:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48652:21;;;;:12;:21;;;;;:29;;;48747:7;;48743:235;;48831:31;48847:4;48854:7;48831;:31::i;:::-;48926:17;;;;:8;:17;;;;;:26;;-1:-1:-1;;;;;48926:26:0;;-1:-1:-1;;;;;;48926:26:0;;;;;;48241:746;;;:::o;49764:1470::-;44874:13;:18;;44891:1;44874:18;;;;;:13;49867:17;;;:8;:17;;;;;:22;;;;;49866:23;:50;;;;-1:-1:-1;49915:1:0;49893:21;;;:12;:21;;;;;;:23;;49866:50;49858:108;;;;-1:-1:-1;;;;;49858:108:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50027:21;;;;:12;:21;;;;;;50014:9;:34;;50006:77;;;;;-1:-1:-1;;;;;50006:77:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;50127:13;50143:16;50151:7;50143;:16::i;:::-;50127:32;-1:-1:-1;50180:10:0;-1:-1:-1;;;;;50180:17:0;;;;50172:85;;;;-1:-1:-1;;;;;50172:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50407:78;;;-1:-1:-1;;;;;50407:78:0;;;;;;50465:10;50407:78;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;50407:78:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;;;179:29;160:49;;50382:104:0;;50401:4;;50382:18;:104::i;:::-;50529:20;50552:38;50586:3;50552:29;50566:14;;50552:9;:13;;:29;;;;:::i;:::-;:33;:38;:33;:38;:::i;:::-;50529:61;-1:-1:-1;50601:20:0;50624:27;:9;50529:61;50624:27;:13;:27;:::i;:::-;50686:12;50704:17;;;:8;:17;;;;;;;:46;;50601:50;;-1:-1:-1;50686:12:0;;-1:-1:-1;;;;;50704:17:0;;;;50601:50;;50686:12;50704:46;50686:12;50704:46;50601:50;50704:17;:46;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;50685:65:0;;;50769:7;50761:36;;;;;-1:-1:-1;;;;;50761:36:0;;;;;;;;;;;;-1:-1:-1;;;;;50761:36:0;;;;;;;;;;;;;;;50851:5;;:34;;50832:13;;-1:-1:-1;;;;;50851:5:0;;50868:12;;50832:13;50851:34;50832:13;50851:34;50868:12;50851:5;:34;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;50831:54:0;;;50904:8;50896:37;;;;;-1:-1:-1;;;;;50896:37:0;;;;;;;;;;;;-1:-1:-1;;;;;50896:37:0;;;;;;;;;;;;;;;50997:1;50973:21;;;:12;:21;;;;;;;;:25;;;51009:8;:17;;;;;:30;;-1:-1:-1;;;;;;51009:30:0;;;51052:7;:16;;;;;;51071:9;51052:28;;;;51098:43;;;;;;;51119:10;;-1:-1:-1;;;;;51098:43:0;;;50986:7;;51098:43;;;;;;;;;;51195:14;;51157:67;;;51184:9;51157:67;;;;;;;;;;;;;;;;-1:-1:-1;;;;;51157:67:0;;;51168:7;;51157:67;;;;;;;;;44950:1;;;;;44986:13;;44970:12;:29;44962:73;;;;;-1:-1:-1;;;;;44962:73:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;44962:73:0;;;;;;;;;;;;;;56406:1743;44874:13;:18;;44891:1;44874:18;;;;;56489:20;56501:7;56489:11;:20::i;:::-;56481:48;;;;;-1:-1:-1;;;;;56481:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;56575:1;56546:17;;;:8;:17;;;;;:28;;;:30;56542:1435;;56665:29;56697:17;;;:8;:17;;;;;:31;;;;56843:14;;56810:28;;;;;-1:-1:-1;;;;;56697:31:0;;;;56665:29;56810:57;;56863:3;;56810:48;;:28;:48;:32;:48;:::i;:57::-;56882:20;56905:17;;;:8;:17;;;;;:28;;;56787:80;;-1:-1:-1;56882:20:0;56905:46;;56787:80;56905:46;:32;:46;:::i;:::-;56994:12;57012:17;;;:8;:17;;;;;;:29;:58;;56882:69;;-1:-1:-1;56994:12:0;;-1:-1:-1;;;;;57012:29:0;;;;56882:69;;56994:12;57012:58;56994:12;57012:58;56882:69;57012:29;:58;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;56993:77:0;;;57093:7;57085:36;;;;;-1:-1:-1;;;;;57085:36:0;;;;;;;;;;;;-1:-1:-1;;;;;57085:36:0;;;;;;;;;;;;;;;57183:5;;:34;;57164:13;;-1:-1:-1;;;;;57183:5:0;;57200:12;;57164:13;57183:34;57164:13;57183:34;57200:12;57183:5;:34;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;57163:54:0;;;57240:8;57232:37;;;;;-1:-1:-1;;;;;57232:37:0;;;;;;;;;;;;-1:-1:-1;;;;;57232:37:0;;;;;;;;;;;;;;;57305:17;;;;:8;:17;;;;;;;;;:29;;57351:28;;;;;57291:89;;;;;;;-1:-1:-1;;;;;57291:89:0;;;;57305:29;;;57314:7;;57291:89;;;;;;;;;;;57420:17;;;;:8;:17;;;;;;;;;:29;;57451:28;;;;;57481:14;;57400:110;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;57420:29:0;;;;57429:7;;57400:110;;;;;;;;;;57562:13;57578:16;57586:7;57578;:16::i;:::-;57817:81;;;-1:-1:-1;;;;;57817:81:0;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;57817:81:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;;;179:29;160:49;;57562:32:0;;-1:-1:-1;57792:107:0;;57811:4;;57792:18;:107::i;:::-;-1:-1:-1;;;57935:17:0;;;;:8;:17;;;;;;;;:28;;;57916:7;:16;;;;;;:47;-1:-1:-1;;;56542:1435:0;58007:17;;;;:8;:17;;;;;;;;;:31;;;;58040:28;;;;;57994:75;;-1:-1:-1;;;;;58007:31:0;;;57994:75;;;;;;;;;;;;;;;;;;;;;;58122:17;;;;:8;:17;;;;;58115:24;;-1:-1:-1;;;;;;58115:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;58115:24:0;;;;;;44986:13;;44970:29;;44962:73;;;;;-1:-1:-1;;;;;44962:73:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;44962:73:0;;;;;;;;;;;;;;55911:416;55970:4;55991:17;;;:8;:17;;;;;:22;;;;;:75;;;;-1:-1:-1;56038:17:0;;;;:8;:17;;;;;:28;;;56031:3;:35;;55991:75;:234;;;;-1:-1:-1;56132:17:0;;;;:8;:17;;;;;:25;;;;56102:28;;;;;:55;;;:108;;-1:-1:-1;56179:17:0;;;;:8;:17;;;;;:28;;;55987:333;;-1:-1:-1;56259:4:0;56252:11;;49129:299;49185:7;49227:21;;;:12;:21;;;;;;49185:7;;;;49227:23;49223:65;;-1:-1:-1;;;49260:21:0;;;;:12;:21;;;;;;;;49252:36;;49223:65;49332:1;49303:17;;;:8;:17;;;;;:28;;;:30;49299:79;;-1:-1:-1;;;49343:1:0;49346:17;;;:8;:17;;;;;:28;;;49343:1;49335:43;;49299:79;-1:-1:-1;;;49397:1:0;49403:16;;;:7;:16;;;;;;49397:1;;49129:299;;;;;;:::o;20860:179::-;-1:-1:-1;;;;;20996:25:0;;;20967:4;20996:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;20860:179::o;30668:110::-;30733:13;;30709:4;;30733:13;;;:37;;;30750:20;30759:10;30750:8;:20::i;:::-;30726:44;;30668:110;:::o;63918:202::-;60577:14;;-1:-1:-1;;;;;60577:14:0;60563:10;:28;60555:81;;;;-1:-1:-1;;;;;60555:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64019:9;64014:99;64034:14;;;64014:99;;;64090:11;64070:9;:17;64080:3;;64084:1;64080:6;;;;;;;;;;;;;;;;-1:-1:-1;;;;;64080:6:0;64070:17;;-1:-1:-1;64070:17:0;;;;;;;;-1:-1:-1;64070:17:0;:31;;-1:-1:-1;;64070:31:0;;;;;;;;;;-1:-1:-1;64050:3:0;64014:99;;54804:528;54863:4;54884:17;;;:8;:17;;;;;:22;;;;;:346;;;;-1:-1:-1;54973:17:0;;;;:8;:17;;;;;:28;;;54966:3;:35;;;;:92;;-1:-1:-1;55057:1:0;55026:17;;;:8;:17;;;;;:28;;;:32;;54966:92;:171;;;;-1:-1:-1;55112:17:0;;;;:8;:17;;;;;:25;;;;55083:28;;;;;:54;54966:171;54943:272;;;-1:-1:-1;55210:4:0;55178:20;55190:7;55178:11;:20::i;:::-;-1:-1:-1;;;;;55178:37:0;;54880:445;;-1:-1:-1;55264:4:0;55257:11;;60017:23;;;;:::o;23962:155::-;24019:4;24052:20;;;:11;:20;;;;;;-1:-1:-1;;;;;24052:20:0;24090:19;;;23962:155::o;40843:195::-;40929:16;40937:7;40929;:16::i;:::-;40921:73;;;;-1:-1:-1;;;;;40921:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41005:19;;;;:10;:19;;;;;;;;:25;;;;;;;;:::i;24487:428::-;24599:4;24643:16;24651:7;24643;:16::i;:::-;24621:110;;;;-1:-1:-1;;;;;24621:110:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24742:13;24758:16;24766:7;24758;:16::i;:::-;24742:32;;24804:5;-1:-1:-1;;;;;24793:16:0;:7;-1:-1:-1;;;;;24793:16:0;;:64;;;;24850:7;-1:-1:-1;;;;;24826:31:0;:20;24838:7;24826:11;:20::i;:::-;-1:-1:-1;;;;;24826:31:0;;24793:64;:113;;;;24874:32;24891:5;24898:7;24874:16;:32::i;:::-;24785:122;24487:428;-1:-1:-1;;;;24487:428:0:o;34561:245::-;34647:38;34667:4;34673:2;34677:7;34647:19;:38::i;:::-;34698:47;34731:4;34737:7;34698:32;:47::i;:::-;34758:40;34786:2;34790:7;34758:27;:40::i;35071:202::-;35135:24;35147:2;35151:7;35135:11;:24::i;:::-;35172:40;35200:2;35204:7;35172:27;:40::i;:::-;35225;35257:7;35225:31;:40::i;61754:590::-;61800:15;61818:20;:18;:20::i;:::-;61800:38;;61849:12;61864:25;61887:1;61864:18;61876:5;;61864:7;:11;;:18;;;;:::i;:::-;:22;:25;:22;:25;:::i;:::-;61849:40;;61902:131;61909:12;61916:4;61909:6;:12::i;:::-;61902:131;;;61972:5;;61938:6;;;;;61965:12;;61961:61;;;-1:-1:-1;62005:1:0;61961:61;61902:131;;;62045:17;62182:14;62191:4;62182:8;:14::i;:::-;62072:134;;;;;;;;;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;-1:-1;;263:2;259:12;;;;254:3;250:22;246:30;;340:21;;;311:9;;295:26;;;;377:20;365:33;;-1:-1;;;;;62072:134:0;;;;;;;;;;-1:-1:-1;;26:21;;;22:32;6:49;;62072:134:0;;;;;;62218:9;:11;;;;;;;-1:-1:-1;62072:134:0;-1:-1:-1;62248:33:0;;-1:-1:-1;62266:3:0;;-1:-1:-1;62271:4:0;62072:134;62248:17;:33::i;:::-;62240:59;;;;;-1:-1:-1;;;;;62240:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;62310:15:0;;;;;;;:10;:15;;;;;;;27:10:-1;;39:1;23:18;;45:23;;62310:26:0;;;;;;;;;;-1:-1:-1;61754:590:0:o;11333:845::-;11393:4;12078:20;;11908:66;12127:15;;;;;:42;;-1:-1:-1;12146:23:0;;;12119:51;-1:-1:-1;;11333:845:0:o;41698:205::-;41796:4;41813:18;41819:2;41823:7;41813:5;:18::i;:::-;41842:31;41855:7;41864:8;41842:12;:31::i;13548:114::-;13640:14;;13548:114::o;35485:126::-;-1:-1:-1;;;;;35584:19:0;35547:17;35584:19;;;:12;:19;;;;;;35485:126::o;29629:122::-;29686:21;:8;29699:7;29686:21;:12;:21;:::i;:::-;29723:20;;-1:-1:-1;;;;;29723:20:0;;;;;;;;29629:122;:::o;29759:130::-;29819:24;:8;29835:7;29819:24;:15;:24;:::i;:::-;29859:22;;-1:-1:-1;;;;;29859:22:0;;;;;;;;29759:130;:::o;28634:235::-;28733:4;-1:-1:-1;;;;;28763:21:0;;28755:68;;;;-1:-1:-1;;;;;28755:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;28841:20:0;:11;:20;;;;;;;;;;;;;;;28634:235::o;27021:481::-;27177:4;27199:15;:2;-1:-1:-1;;;;;27199:13:0;;:15::i;:::-;27194:60;;-1:-1:-1;27238:4:0;27231:11;;27194:60;27295:153;;-1:-1:-1;;;;;27295:153:0;;27350:10;27295:153;;;;;;-1:-1:-1;;;;;27295:153:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;27266:13;;27295:36;;;;;;27350:10;;27379:4;;27402:7;;27428:5;;27295:153;;;;;;;;;;;27266:13;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;27295:153:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27295:153:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;27295:153:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;27295:153:0;-1:-1:-1;;;;;;27467:26:0;-1:-1:-1;;;;;27467:26:0;;-1:-1:-1;;27021:481:0;;;;;;:::o;58840:1118::-;59445:27;59453:5;-1:-1:-1;;;;;59445:25:0;;:27::i;:::-;59437:72;;;;;-1:-1:-1;;;;;59437:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59583:12;59597:23;59632:5;-1:-1:-1;;;;;59624:19:0;59644:4;59624:25;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;59624:25:0;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;59582:67:0;;;;59668:7;59660:53;;;;-1:-1:-1;;;;;59660:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59730:17;;:21;59726:225;;59872:10;59861:30;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;59861:30:0;59853:86;;;;-1:-1:-1;;;;;59853:86:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8899:470;8957:7;9201:6;9197:47;;-1:-1:-1;9231:1:0;9224:8;;9197:47;9268:5;;;9272:1;9268;:5;:1;9292:5;;;;;:10;9284:56;;;;-1:-1:-1;;;;;9284:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9360:1;8899:470;-1:-1:-1;;;8899:470:0:o;9837:333::-;9895:7;9994:1;9990;:5;9982:44;;;;;-1:-1:-1;;;;;9982:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;10037:9;10053:1;10049;:5;;;;;;;9837:333;-1:-1:-1;;;;9837:333:0:o;8464:184::-;8522:7;8555:1;8550;:6;;8542:49;;;;;-1:-1:-1;;;;;8542:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8614:5:0;;;8464:184::o;25889:530::-;26051:4;-1:-1:-1;;;;;26031:24:0;:16;26039:7;26031;:16::i;:::-;-1:-1:-1;;;;;26031:24:0;;26009:115;;;;-1:-1:-1;;;;;26009:115:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;26143:16:0;;26135:65;;;;-1:-1:-1;;;;;26135:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26213:23;26228:7;26213:14;:23::i;:::-;-1:-1:-1;;;;;26249:23:0;;;;;;:17;:23;;;;;:35;;:33;:35::i;:::-;-1:-1:-1;;;;;26295:21:0;;;;;;:17;:21;;;;;:33;;:31;:33::i;:::-;26341:20;;;;:11;:20;;;;;;:25;;-1:-1:-1;;;;;;26341:25:0;-1:-1:-1;;;;;26341:25:0;;;;;;;;;26384:27;;26341:20;;26384:27;;;;;;;25889:530;;;:::o;37090:1148::-;-1:-1:-1;;;;;37381:18:0;;37356:22;37381:18;;;:12;:18;;;;;:25;:32;;37411:1;37381:32;:29;:32;:::i;:::-;37424:18;37445:26;;;:17;:26;;;;;;37356:57;;-1:-1:-1;37578:28:0;;;37574:328;;-1:-1:-1;;;;;37645:18:0;;37623:19;37645:18;;;:12;:18;;;;;:34;;37664:14;;37645:34;;;;;;;;;;;;;;37623:56;;37729:11;37696:12;:18;37709:4;-1:-1:-1;;;;;37696:18:0;-1:-1:-1;;;;;37696:18:0;;;;;;;;;;;;37715:10;37696:30;;;;;;;;;;;;;;;;;;;:44;;;;37813:30;;;:17;:30;;;;;:43;;;37574:328;-1:-1:-1;;;;;37991:18:0;;;;;;:12;:18;;;;;:27;;;;;-1:-1:-1;;37991:27:0;;;:::i;:::-;;37090:1148;;;;:::o;35912:186::-;-1:-1:-1;;;;;36026:16:0;;;;;;;:12;:16;;;;;;;;:23;;35997:26;;;:17;:26;;;;;:52;;;36060:16;;;39:1:-1;23:18;;45:23;;36060:30:0;;;;;;;;35912:186::o;25168:335::-;-1:-1:-1;;;;;25240:16:0;;25232:61;;;;;-1:-1:-1;;;;;25232:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25313:16;25321:7;25313;:16::i;:::-;25312:17;25304:58;;;;;-1:-1:-1;;;;;25304:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;25375:20;;;;:11;:20;;;;;;;;:25;;-1:-1:-1;;;;;;25375:25:0;-1:-1:-1;;;;;25375:25:0;;;;;;;;25411:21;;:17;:21;;;;;:33;;:31;:33::i;:::-;25462;;25487:7;;-1:-1:-1;;;;;25462:33:0;;;25479:1;;25462:33;;25479:1;;25462:33;25168:335;;:::o;36299:164::-;36403:10;:17;;36376:24;;;;:15;:24;;;;;:44;;;39:1:-1;23:18;;45:23;;36431:24:0;;;;;;;36299:164::o;62842:184::-;62909:5;:10;;62918:1;62909:10;;;;;62952:64;;;;;;;;;;;62976:10;62952:64;;;;;;-1:-1:-1;;62998:12:0;:16;62988:27;62952:64;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;62952:64:0;;;;;;;62942:75;;;;;62842:184;:::o;10627:152::-;10685:7;10713:6;10705:43;;;;;-1:-1:-1;;;;;10705:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;10770:1;10766;:5;;;;;;;10627:152;-1:-1:-1;;;10627:152:0:o;8008:181::-;8066:7;8098:5;;;8122:6;;;;8114:46;;;;;-1:-1:-1;;;;;8114:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;62352:482;62402:27;62446:7;62442:50;;-1:-1:-1;62470:10:0;;;;;;;;;;;;-1:-1:-1;;;;;62470:10:0;;;;;;62442:50;62511:2;62502:6;62543:69;62550:6;;62543:69;;62573:5;;62598:2;62593:7;;;;62543:69;;;62622:17;62652:3;62642:14;;;;;;;;;;;;;;;;;;;;;;;;;21:6:-1;;104:10;62642:14:0;87:34:-1;135:17;;-1:-1;62642:14:0;-1:-1:-1;62622:34:0;-1:-1:-1;;;62676:7:0;;62694:103;62701:7;;62694:103;;62758:2;62753;:7;62748:2;:12;62737:25;;62725:4;62730:3;;;;;;;62725:9;;;;;;;;;;;:37;-1:-1:-1;;;;;62725:37:0;;;;;;;;-1:-1:-1;62783:2:0;62777:8;;;;62694:103;;;-1:-1:-1;62821:4:0;62352:482;-1:-1:-1;;;;62352:482:0:o;28098:178::-;28176:18;28180:4;28186:7;28176:3;:18::i;:::-;28175:19;28167:63;;;;;-1:-1:-1;;;;;28167:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;28241:20:0;:11;:20;;;;;;;;;;;:27;;-1:-1:-1;;28241:27:0;28264:4;28241:27;;;28098:178::o;28356:183::-;28436:18;28440:4;28446:7;28436:3;:18::i;:::-;28428:64;;;;-1:-1:-1;;;;;28428:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;28503:20:0;28526:5;28503:20;;;;;;;;;;;:28;;-1:-1:-1;;28503:28:0;;;28356:183::o;27670:175::-;27770:1;27734:24;;;:15;:24;;;;;;-1:-1:-1;;;;;27734:24:0;:38;27730:108;;27824:1;27789:24;;;:15;:24;;;;;:37;;-1:-1:-1;;;;;;27789:37:0;;;27730:108;27670:175;:::o;13769:110::-;13850:14;;:21;;13869:1;13850:21;:18;:21;:::i;:::-;13833:38;;13769:110::o;13670:91::-;13734:19;;13752:1;13734:19;;;13670:91::o;45110:19453::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45110:19453:0;;;-1:-1:-1;45110:19453:0;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Swarm Source

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