ETH Price: $3,086.43 (+0.22%)
Gas: 13 Gwei

Token

Artsy Monke (ArtsyMonke)
 

Overview

Max Total Supply

10,000 ArtsyMonke

Holders

1,273

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 ArtsyMonke
0x5e8053f3b43ee366640d75cafc0572f442b93fcb
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Each NFT is generated using a cloud computing AI using the traits of the OG Monke and then generated using 20 different themes. No two are alike. 10,000 completely unique Art NFTs.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
ArtsyMonke

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

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

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

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;


library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}

library Counters {
    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 {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}

abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

library Address {
    /**
     * @dev Returns true if `account` is 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.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

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);
}

abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

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

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;
}

interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
}

library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @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) {
        return a + b;
    }

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

    /**
     * @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) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

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

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

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

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

    // Mapping owner address to token count
    mapping(address => uint256) private _balances;

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

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

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return
            interfaceId == type(IERC721).interfaceId ||
            interfaceId == type(IERC721Metadata).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        string memory baseURI = _baseURI();
        return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
    }

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overriden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

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

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        require(operator != _msgSender(), "ERC721: approve to caller");

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_msgSender(), operator, approved);
    }

    /**
     * @dev See {IERC721-isApprovedForAll}.
     */
    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);

        _balances[to] += 1;
        _owners[tokenId] = to;

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

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

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

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId);

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), 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.
     *
     * @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
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

abstract contract Ownable is Context {
    address private _owner;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _setOwner(_msgSender());
    }

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

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

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

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

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

contract ArtsyMonke is ERC721, Ownable
{
    using Counters for Counters.Counter;
    using SafeMath for uint256;

    uint256 public price = .01 ether;
    uint256 public maxSupply = 10000;
    uint256 private maxMint = 50;

    string private customBaseURI;
    string private baseExtension;

    bool public mintOpen = false;

    Counters.Counter private _tokenSupply;

    constructor(string memory _customBaseURI) ERC721("Artsy Monke", "ArtsyMonke")  {
        customBaseURI = _customBaseURI;
    }

    function totalSupply() public view returns (uint256) {
        return _tokenSupply.current();
    }

    function mintBulk(uint256 numberOfMints, address mintAddress) public payable onlyOwner{
        uint256 supply = _tokenSupply.current();
       for(uint256 i = 1; i <= numberOfMints; i++){
            _safeMint(mintAddress, supply + i);
            _tokenSupply.increment();
        }
    }

    function mint(uint256 numberOfMints) external payable {
        uint256 supply = _tokenSupply.current();
        require(mintOpen, "Sale Needs To Be Active");
        require(numberOfMints > 0 && numberOfMints <= maxMint, "Invalid purchase amount");
        require(supply.add(numberOfMints) <= maxSupply, "Payment exceeds total supply");

       for(uint256 i = 1; i <= numberOfMints; i++){
            _safeMint(msg.sender, supply + i);
            _tokenSupply.increment();
        }
    }

    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
        string memory currentBaseURI = _baseURI();
        return bytes(currentBaseURI).length > 0
            ? string(abi.encodePacked(currentBaseURI, Strings.toString(tokenId), baseExtension))
            : "";
    }

    function toggleSale() public onlyOwner {
        mintOpen = !mintOpen;
    }

    function _baseURI() internal view virtual override returns (string memory) {
        return customBaseURI;
    }

    function setBaseURI(string calldata _newBaseURI) external onlyOwner {
        customBaseURI = _newBaseURI;
    }

    function setMaxMint(uint256 _maxMint) external onlyOwner {
        maxMint = _maxMint;
    }

    function withdraw() public onlyOwner {
        uint256 balance = address(this).balance;
        payable(msg.sender).transfer(balance);
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_customBaseURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfMints","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfMints","type":"uint256"},{"internalType":"address","name":"mintAddress","type":"address"}],"name":"mintBulk","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxMint","type":"uint256"}],"name":"setMaxMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggleSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052662386f26fc1000060075561271060085560326009556000600c60006101000a81548160ff0219169083151502179055503480156200004257600080fd5b5060405162003b3938038062003b39833981810160405281019062000068919062000338565b6040518060400160405280600b81526020017f4172747379204d6f6e6b650000000000000000000000000000000000000000008152506040518060400160405280600a81526020017f41727473794d6f6e6b65000000000000000000000000000000000000000000008152508160009080519060200190620000ec92919062000216565b5080600190805190602001906200010592919062000216565b505050620001286200011c6200014860201b60201c565b6200015060201b60201c565b80600a90805190602001906200014092919062000216565b5050620004ed565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620002249062000412565b90600052602060002090601f01602090048101928262000248576000855562000294565b82601f106200026357805160ff191683800117855562000294565b8280016001018555821562000294579182015b828111156200029357825182559160200191906001019062000276565b5b509050620002a39190620002a7565b5090565b5b80821115620002c2576000816000905550600101620002a8565b5090565b6000620002dd620002d784620003a6565b6200037d565b905082815260208101848484011115620002f657600080fd5b62000303848285620003dc565b509392505050565b600082601f8301126200031d57600080fd5b81516200032f848260208601620002c6565b91505092915050565b6000602082840312156200034b57600080fd5b600082015167ffffffffffffffff8111156200036657600080fd5b62000374848285016200030b565b91505092915050565b6000620003896200039c565b905062000397828262000448565b919050565b6000604051905090565b600067ffffffffffffffff821115620003c457620003c3620004ad565b5b620003cf82620004dc565b9050602081019050919050565b60005b83811015620003fc578082015181840152602081019050620003df565b838111156200040c576000848401525b50505050565b600060028204905060018216806200042b57607f821691505b602082108114156200044257620004416200047e565b5b50919050565b6200045382620004dc565b810181811067ffffffffffffffff82111715620004755762000474620004ad565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b61363c80620004fd6000396000f3fe6080604052600436106101815760003560e01c8063715018a6116100d1578063a0712d681161008a578063c87b56dd11610064578063c87b56dd14610518578063d5abeb0114610555578063e985e9c514610580578063f2fde38b146105bd57610181565b8063a0712d68146104aa578063a22cb465146104c6578063b88d4fde146104ef57610181565b8063715018a6146103df57806371e7e4fb146103f65780637d8966e4146104125780638da5cb5b1461042957806395d89b4114610454578063a035b1fe1461047f57610181565b806324bbd0491161013e578063547520fe11610118578063547520fe1461031357806355f804b31461033c5780636352211e1461036557806370a08231146103a257610181565b806324bbd049146102a85780633ccfd60b146102d357806342842e0e146102ea57610181565b806301ffc9a71461018657806306fdde03146101c3578063081812fc146101ee578063095ea7b31461022b57806318160ddd1461025457806323b872dd1461027f575b600080fd5b34801561019257600080fd5b506101ad60048036038101906101a891906124da565b6105e6565b6040516101ba9190612a56565b60405180910390f35b3480156101cf57600080fd5b506101d86106c8565b6040516101e59190612a71565b60405180910390f35b3480156101fa57600080fd5b5061021560048036038101906102109190612571565b61075a565b60405161022291906129ef565b60405180910390f35b34801561023757600080fd5b50610252600480360381019061024d919061249e565b6107df565b005b34801561026057600080fd5b506102696108f7565b6040516102769190612cf3565b60405180910390f35b34801561028b57600080fd5b506102a660048036038101906102a19190612398565b610908565b005b3480156102b457600080fd5b506102bd610968565b6040516102ca9190612a56565b60405180910390f35b3480156102df57600080fd5b506102e861097b565b005b3480156102f657600080fd5b50610311600480360381019061030c9190612398565b610a46565b005b34801561031f57600080fd5b5061033a60048036038101906103359190612571565b610a66565b005b34801561034857600080fd5b50610363600480360381019061035e919061252c565b610aec565b005b34801561037157600080fd5b5061038c60048036038101906103879190612571565b610b7e565b60405161039991906129ef565b60405180910390f35b3480156103ae57600080fd5b506103c960048036038101906103c49190612333565b610c30565b6040516103d69190612cf3565b60405180910390f35b3480156103eb57600080fd5b506103f4610ce8565b005b610410600480360381019061040b919061259a565b610d70565b005b34801561041e57600080fd5b50610427610e40565b005b34801561043557600080fd5b5061043e610ee8565b60405161044b91906129ef565b60405180910390f35b34801561046057600080fd5b50610469610f12565b6040516104769190612a71565b60405180910390f35b34801561048b57600080fd5b50610494610fa4565b6040516104a19190612cf3565b60405180910390f35b6104c460048036038101906104bf9190612571565b610faa565b005b3480156104d257600080fd5b506104ed60048036038101906104e89190612462565b6110f4565b005b3480156104fb57600080fd5b50610516600480360381019061051191906123e7565b611275565b005b34801561052457600080fd5b5061053f600480360381019061053a9190612571565b6112d7565b60405161054c9190612a71565b60405180910390f35b34801561056157600080fd5b5061056a611381565b6040516105779190612cf3565b60405180910390f35b34801561058c57600080fd5b506105a760048036038101906105a2919061235c565b611387565b6040516105b49190612a56565b60405180910390f35b3480156105c957600080fd5b506105e460048036038101906105df9190612333565b61141b565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806106b157507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806106c157506106c082611513565b5b9050919050565b6060600080546106d790612f2d565b80601f016020809104026020016040519081016040528092919081815260200182805461070390612f2d565b80156107505780601f1061072557610100808354040283529160200191610750565b820191906000526020600020905b81548152906001019060200180831161073357829003601f168201915b5050505050905090565b60006107658261157d565b6107a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079b90612c13565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006107ea82610b7e565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561085b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085290612c93565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661087a6115e9565b73ffffffffffffffffffffffffffffffffffffffff1614806108a957506108a8816108a36115e9565b611387565b5b6108e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108df90612b93565b60405180910390fd5b6108f283836115f1565b505050565b6000610903600d6116aa565b905090565b6109196109136115e9565b826116b8565b610958576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094f90612cb3565b60405180910390fd5b610963838383611796565b505050565b600c60009054906101000a900460ff1681565b6109836115e9565b73ffffffffffffffffffffffffffffffffffffffff166109a1610ee8565b73ffffffffffffffffffffffffffffffffffffffff16146109f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109ee90612c33565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610a42573d6000803e3d6000fd5b5050565b610a6183838360405180602001604052806000815250611275565b505050565b610a6e6115e9565b73ffffffffffffffffffffffffffffffffffffffff16610a8c610ee8565b73ffffffffffffffffffffffffffffffffffffffff1614610ae2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ad990612c33565b60405180910390fd5b8060098190555050565b610af46115e9565b73ffffffffffffffffffffffffffffffffffffffff16610b12610ee8565b73ffffffffffffffffffffffffffffffffffffffff1614610b68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5f90612c33565b60405180910390fd5b8181600a9190610b79929190612175565b505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610c27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1e90612bd3565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610ca1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9890612bb3565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610cf06115e9565b73ffffffffffffffffffffffffffffffffffffffff16610d0e610ee8565b73ffffffffffffffffffffffffffffffffffffffff1614610d64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5b90612c33565b60405180910390fd5b610d6e60006119f2565b565b610d786115e9565b73ffffffffffffffffffffffffffffffffffffffff16610d96610ee8565b73ffffffffffffffffffffffffffffffffffffffff1614610dec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de390612c33565b60405180910390fd5b6000610df8600d6116aa565b90506000600190505b838111610e3a57610e1d838284610e189190612dbc565b611ab8565b610e27600d611ad6565b8080610e3290612f90565b915050610e01565b50505050565b610e486115e9565b73ffffffffffffffffffffffffffffffffffffffff16610e66610ee8565b73ffffffffffffffffffffffffffffffffffffffff1614610ebc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb390612c33565b60405180910390fd5b600c60009054906101000a900460ff1615600c60006101000a81548160ff021916908315150217905550565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610f2190612f2d565b80601f0160208091040260200160405190810160405280929190818152602001828054610f4d90612f2d565b8015610f9a5780601f10610f6f57610100808354040283529160200191610f9a565b820191906000526020600020905b815481529060010190602001808311610f7d57829003601f168201915b5050505050905090565b60075481565b6000610fb6600d6116aa565b9050600c60009054906101000a900460ff16611007576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ffe90612af3565b60405180910390fd5b60008211801561101957506009548211155b611058576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104f90612cd3565b60405180910390fd5b60085461106e8383611aec90919063ffffffff16565b11156110af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a690612b53565b60405180910390fd5b6000600190505b8281116110ef576110d23382846110cd9190612dbc565b611ab8565b6110dc600d611ad6565b80806110e790612f90565b9150506110b6565b505050565b6110fc6115e9565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561116a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116190612b33565b60405180910390fd5b80600560006111776115e9565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166112246115e9565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516112699190612a56565b60405180910390a35050565b6112866112806115e9565b836116b8565b6112c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112bc90612cb3565b60405180910390fd5b6112d184848484611b02565b50505050565b60606112e28261157d565b611321576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131890612c73565b60405180910390fd5b600061132b611b5e565b9050600081511161134b5760405180602001604052806000815250611379565b8061135584611bf0565b600b604051602001611369939291906129be565b6040516020818303038152906040525b915050919050565b60085481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6114236115e9565b73ffffffffffffffffffffffffffffffffffffffff16611441610ee8565b73ffffffffffffffffffffffffffffffffffffffff1614611497576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148e90612c33565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611507576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114fe90612ab3565b60405180910390fd5b611510816119f2565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661166483610b7e565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b60006116c38261157d565b611702576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f990612b73565b60405180910390fd5b600061170d83610b7e565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061177c57508373ffffffffffffffffffffffffffffffffffffffff166117648461075a565b73ffffffffffffffffffffffffffffffffffffffff16145b8061178d575061178c8185611387565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166117b682610b7e565b73ffffffffffffffffffffffffffffffffffffffff161461180c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180390612c53565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561187c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187390612b13565b60405180910390fd5b611887838383611d9d565b6118926000826115f1565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546118e29190612e43565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546119399190612dbc565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611ad2828260405180602001604052806000815250611da2565b5050565b6001816000016000828254019250508190555050565b60008183611afa9190612dbc565b905092915050565b611b0d848484611796565b611b1984848484611dfd565b611b58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4f90612a93565b60405180910390fd5b50505050565b6060600a8054611b6d90612f2d565b80601f0160208091040260200160405190810160405280929190818152602001828054611b9990612f2d565b8015611be65780601f10611bbb57610100808354040283529160200191611be6565b820191906000526020600020905b815481529060010190602001808311611bc957829003601f168201915b5050505050905090565b60606000821415611c38576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611d98565b600082905060005b60008214611c6a578080611c5390612f90565b915050600a82611c639190612e12565b9150611c40565b60008167ffffffffffffffff811115611cac577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611cde5781602001600182028036833780820191505090505b5090505b60008514611d9157600182611cf79190612e43565b9150600a85611d069190612fd9565b6030611d129190612dbc565b60f81b818381518110611d4e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611d8a9190612e12565b9450611ce2565b8093505050505b919050565b505050565b611dac8383611f94565b611db96000848484611dfd565b611df8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611def90612a93565b60405180910390fd5b505050565b6000611e1e8473ffffffffffffffffffffffffffffffffffffffff16612162565b15611f87578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611e476115e9565b8786866040518563ffffffff1660e01b8152600401611e699493929190612a0a565b602060405180830381600087803b158015611e8357600080fd5b505af1925050508015611eb457506040513d601f19601f82011682018060405250810190611eb19190612503565b60015b611f37573d8060008114611ee4576040519150601f19603f3d011682016040523d82523d6000602084013e611ee9565b606091505b50600081511415611f2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2690612a93565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611f8c565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612004576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ffb90612bf3565b60405180910390fd5b61200d8161157d565b1561204d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204490612ad3565b60405180910390fd5b61205960008383611d9d565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120a99190612dbc565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b82805461218190612f2d565b90600052602060002090601f0160209004810192826121a357600085556121ea565b82601f106121bc57803560ff19168380011785556121ea565b828001600101855582156121ea579182015b828111156121e95782358255916020019190600101906121ce565b5b5090506121f791906121fb565b5090565b5b808211156122145760008160009055506001016121fc565b5090565b600061222b61222684612d33565b612d0e565b90508281526020810184848401111561224357600080fd5b61224e848285612eeb565b509392505050565b600081359050612265816135aa565b92915050565b60008135905061227a816135c1565b92915050565b60008135905061228f816135d8565b92915050565b6000815190506122a4816135d8565b92915050565b600082601f8301126122bb57600080fd5b81356122cb848260208601612218565b91505092915050565b60008083601f8401126122e657600080fd5b8235905067ffffffffffffffff8111156122ff57600080fd5b60208301915083600182028301111561231757600080fd5b9250929050565b60008135905061232d816135ef565b92915050565b60006020828403121561234557600080fd5b600061235384828501612256565b91505092915050565b6000806040838503121561236f57600080fd5b600061237d85828601612256565b925050602061238e85828601612256565b9150509250929050565b6000806000606084860312156123ad57600080fd5b60006123bb86828701612256565b93505060206123cc86828701612256565b92505060406123dd8682870161231e565b9150509250925092565b600080600080608085870312156123fd57600080fd5b600061240b87828801612256565b945050602061241c87828801612256565b935050604061242d8782880161231e565b925050606085013567ffffffffffffffff81111561244a57600080fd5b612456878288016122aa565b91505092959194509250565b6000806040838503121561247557600080fd5b600061248385828601612256565b92505060206124948582860161226b565b9150509250929050565b600080604083850312156124b157600080fd5b60006124bf85828601612256565b92505060206124d08582860161231e565b9150509250929050565b6000602082840312156124ec57600080fd5b60006124fa84828501612280565b91505092915050565b60006020828403121561251557600080fd5b600061252384828501612295565b91505092915050565b6000806020838503121561253f57600080fd5b600083013567ffffffffffffffff81111561255957600080fd5b612565858286016122d4565b92509250509250929050565b60006020828403121561258357600080fd5b60006125918482850161231e565b91505092915050565b600080604083850312156125ad57600080fd5b60006125bb8582860161231e565b92505060206125cc85828601612256565b9150509250929050565b6125df81612e77565b82525050565b6125ee81612e89565b82525050565b60006125ff82612d79565b6126098185612d8f565b9350612619818560208601612efa565b612622816130c6565b840191505092915050565b600061263882612d84565b6126428185612da0565b9350612652818560208601612efa565b61265b816130c6565b840191505092915050565b600061267182612d84565b61267b8185612db1565b935061268b818560208601612efa565b80840191505092915050565b600081546126a481612f2d565b6126ae8186612db1565b945060018216600081146126c957600181146126da5761270d565b60ff1983168652818601935061270d565b6126e385612d64565b60005b83811015612705578154818901526001820191506020810190506126e6565b838801955050505b50505092915050565b6000612723603283612da0565b915061272e826130d7565b604082019050919050565b6000612746602683612da0565b915061275182613126565b604082019050919050565b6000612769601c83612da0565b915061277482613175565b602082019050919050565b600061278c601783612da0565b91506127978261319e565b602082019050919050565b60006127af602483612da0565b91506127ba826131c7565b604082019050919050565b60006127d2601983612da0565b91506127dd82613216565b602082019050919050565b60006127f5601c83612da0565b91506128008261323f565b602082019050919050565b6000612818602c83612da0565b915061282382613268565b604082019050919050565b600061283b603883612da0565b9150612846826132b7565b604082019050919050565b600061285e602a83612da0565b915061286982613306565b604082019050919050565b6000612881602983612da0565b915061288c82613355565b604082019050919050565b60006128a4602083612da0565b91506128af826133a4565b602082019050919050565b60006128c7602c83612da0565b91506128d2826133cd565b604082019050919050565b60006128ea602083612da0565b91506128f58261341c565b602082019050919050565b600061290d602983612da0565b915061291882613445565b604082019050919050565b6000612930602f83612da0565b915061293b82613494565b604082019050919050565b6000612953602183612da0565b915061295e826134e3565b604082019050919050565b6000612976603183612da0565b915061298182613532565b604082019050919050565b6000612999601783612da0565b91506129a482613581565b602082019050919050565b6129b881612ee1565b82525050565b60006129ca8286612666565b91506129d68285612666565b91506129e28284612697565b9150819050949350505050565b6000602082019050612a0460008301846125d6565b92915050565b6000608082019050612a1f60008301876125d6565b612a2c60208301866125d6565b612a3960408301856129af565b8181036060830152612a4b81846125f4565b905095945050505050565b6000602082019050612a6b60008301846125e5565b92915050565b60006020820190508181036000830152612a8b818461262d565b905092915050565b60006020820190508181036000830152612aac81612716565b9050919050565b60006020820190508181036000830152612acc81612739565b9050919050565b60006020820190508181036000830152612aec8161275c565b9050919050565b60006020820190508181036000830152612b0c8161277f565b9050919050565b60006020820190508181036000830152612b2c816127a2565b9050919050565b60006020820190508181036000830152612b4c816127c5565b9050919050565b60006020820190508181036000830152612b6c816127e8565b9050919050565b60006020820190508181036000830152612b8c8161280b565b9050919050565b60006020820190508181036000830152612bac8161282e565b9050919050565b60006020820190508181036000830152612bcc81612851565b9050919050565b60006020820190508181036000830152612bec81612874565b9050919050565b60006020820190508181036000830152612c0c81612897565b9050919050565b60006020820190508181036000830152612c2c816128ba565b9050919050565b60006020820190508181036000830152612c4c816128dd565b9050919050565b60006020820190508181036000830152612c6c81612900565b9050919050565b60006020820190508181036000830152612c8c81612923565b9050919050565b60006020820190508181036000830152612cac81612946565b9050919050565b60006020820190508181036000830152612ccc81612969565b9050919050565b60006020820190508181036000830152612cec8161298c565b9050919050565b6000602082019050612d0860008301846129af565b92915050565b6000612d18612d29565b9050612d248282612f5f565b919050565b6000604051905090565b600067ffffffffffffffff821115612d4e57612d4d613097565b5b612d57826130c6565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000612dc782612ee1565b9150612dd283612ee1565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612e0757612e0661300a565b5b828201905092915050565b6000612e1d82612ee1565b9150612e2883612ee1565b925082612e3857612e37613039565b5b828204905092915050565b6000612e4e82612ee1565b9150612e5983612ee1565b925082821015612e6c57612e6b61300a565b5b828203905092915050565b6000612e8282612ec1565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015612f18578082015181840152602081019050612efd565b83811115612f27576000848401525b50505050565b60006002820490506001821680612f4557607f821691505b60208210811415612f5957612f58613068565b5b50919050565b612f68826130c6565b810181811067ffffffffffffffff82111715612f8757612f86613097565b5b80604052505050565b6000612f9b82612ee1565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612fce57612fcd61300a565b5b600182019050919050565b6000612fe482612ee1565b9150612fef83612ee1565b925082612fff57612ffe613039565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f53616c65204e6565647320546f20426520416374697665000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f5061796d656e74206578636565647320746f74616c20737570706c7900000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f496e76616c696420707572636861736520616d6f756e74000000000000000000600082015250565b6135b381612e77565b81146135be57600080fd5b50565b6135ca81612e89565b81146135d557600080fd5b50565b6135e181612e95565b81146135ec57600080fd5b50565b6135f881612ee1565b811461360357600080fd5b5056fea2646970667358221220f9742d6efc552047dd41af48df13278d53dba6375df83bed958528eac702b3eb64736f6c6343000804003300000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106101815760003560e01c8063715018a6116100d1578063a0712d681161008a578063c87b56dd11610064578063c87b56dd14610518578063d5abeb0114610555578063e985e9c514610580578063f2fde38b146105bd57610181565b8063a0712d68146104aa578063a22cb465146104c6578063b88d4fde146104ef57610181565b8063715018a6146103df57806371e7e4fb146103f65780637d8966e4146104125780638da5cb5b1461042957806395d89b4114610454578063a035b1fe1461047f57610181565b806324bbd0491161013e578063547520fe11610118578063547520fe1461031357806355f804b31461033c5780636352211e1461036557806370a08231146103a257610181565b806324bbd049146102a85780633ccfd60b146102d357806342842e0e146102ea57610181565b806301ffc9a71461018657806306fdde03146101c3578063081812fc146101ee578063095ea7b31461022b57806318160ddd1461025457806323b872dd1461027f575b600080fd5b34801561019257600080fd5b506101ad60048036038101906101a891906124da565b6105e6565b6040516101ba9190612a56565b60405180910390f35b3480156101cf57600080fd5b506101d86106c8565b6040516101e59190612a71565b60405180910390f35b3480156101fa57600080fd5b5061021560048036038101906102109190612571565b61075a565b60405161022291906129ef565b60405180910390f35b34801561023757600080fd5b50610252600480360381019061024d919061249e565b6107df565b005b34801561026057600080fd5b506102696108f7565b6040516102769190612cf3565b60405180910390f35b34801561028b57600080fd5b506102a660048036038101906102a19190612398565b610908565b005b3480156102b457600080fd5b506102bd610968565b6040516102ca9190612a56565b60405180910390f35b3480156102df57600080fd5b506102e861097b565b005b3480156102f657600080fd5b50610311600480360381019061030c9190612398565b610a46565b005b34801561031f57600080fd5b5061033a60048036038101906103359190612571565b610a66565b005b34801561034857600080fd5b50610363600480360381019061035e919061252c565b610aec565b005b34801561037157600080fd5b5061038c60048036038101906103879190612571565b610b7e565b60405161039991906129ef565b60405180910390f35b3480156103ae57600080fd5b506103c960048036038101906103c49190612333565b610c30565b6040516103d69190612cf3565b60405180910390f35b3480156103eb57600080fd5b506103f4610ce8565b005b610410600480360381019061040b919061259a565b610d70565b005b34801561041e57600080fd5b50610427610e40565b005b34801561043557600080fd5b5061043e610ee8565b60405161044b91906129ef565b60405180910390f35b34801561046057600080fd5b50610469610f12565b6040516104769190612a71565b60405180910390f35b34801561048b57600080fd5b50610494610fa4565b6040516104a19190612cf3565b60405180910390f35b6104c460048036038101906104bf9190612571565b610faa565b005b3480156104d257600080fd5b506104ed60048036038101906104e89190612462565b6110f4565b005b3480156104fb57600080fd5b50610516600480360381019061051191906123e7565b611275565b005b34801561052457600080fd5b5061053f600480360381019061053a9190612571565b6112d7565b60405161054c9190612a71565b60405180910390f35b34801561056157600080fd5b5061056a611381565b6040516105779190612cf3565b60405180910390f35b34801561058c57600080fd5b506105a760048036038101906105a2919061235c565b611387565b6040516105b49190612a56565b60405180910390f35b3480156105c957600080fd5b506105e460048036038101906105df9190612333565b61141b565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806106b157507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806106c157506106c082611513565b5b9050919050565b6060600080546106d790612f2d565b80601f016020809104026020016040519081016040528092919081815260200182805461070390612f2d565b80156107505780601f1061072557610100808354040283529160200191610750565b820191906000526020600020905b81548152906001019060200180831161073357829003601f168201915b5050505050905090565b60006107658261157d565b6107a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079b90612c13565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006107ea82610b7e565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561085b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085290612c93565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661087a6115e9565b73ffffffffffffffffffffffffffffffffffffffff1614806108a957506108a8816108a36115e9565b611387565b5b6108e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108df90612b93565b60405180910390fd5b6108f283836115f1565b505050565b6000610903600d6116aa565b905090565b6109196109136115e9565b826116b8565b610958576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094f90612cb3565b60405180910390fd5b610963838383611796565b505050565b600c60009054906101000a900460ff1681565b6109836115e9565b73ffffffffffffffffffffffffffffffffffffffff166109a1610ee8565b73ffffffffffffffffffffffffffffffffffffffff16146109f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109ee90612c33565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610a42573d6000803e3d6000fd5b5050565b610a6183838360405180602001604052806000815250611275565b505050565b610a6e6115e9565b73ffffffffffffffffffffffffffffffffffffffff16610a8c610ee8565b73ffffffffffffffffffffffffffffffffffffffff1614610ae2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ad990612c33565b60405180910390fd5b8060098190555050565b610af46115e9565b73ffffffffffffffffffffffffffffffffffffffff16610b12610ee8565b73ffffffffffffffffffffffffffffffffffffffff1614610b68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5f90612c33565b60405180910390fd5b8181600a9190610b79929190612175565b505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610c27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1e90612bd3565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610ca1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9890612bb3565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610cf06115e9565b73ffffffffffffffffffffffffffffffffffffffff16610d0e610ee8565b73ffffffffffffffffffffffffffffffffffffffff1614610d64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5b90612c33565b60405180910390fd5b610d6e60006119f2565b565b610d786115e9565b73ffffffffffffffffffffffffffffffffffffffff16610d96610ee8565b73ffffffffffffffffffffffffffffffffffffffff1614610dec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de390612c33565b60405180910390fd5b6000610df8600d6116aa565b90506000600190505b838111610e3a57610e1d838284610e189190612dbc565b611ab8565b610e27600d611ad6565b8080610e3290612f90565b915050610e01565b50505050565b610e486115e9565b73ffffffffffffffffffffffffffffffffffffffff16610e66610ee8565b73ffffffffffffffffffffffffffffffffffffffff1614610ebc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb390612c33565b60405180910390fd5b600c60009054906101000a900460ff1615600c60006101000a81548160ff021916908315150217905550565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610f2190612f2d565b80601f0160208091040260200160405190810160405280929190818152602001828054610f4d90612f2d565b8015610f9a5780601f10610f6f57610100808354040283529160200191610f9a565b820191906000526020600020905b815481529060010190602001808311610f7d57829003601f168201915b5050505050905090565b60075481565b6000610fb6600d6116aa565b9050600c60009054906101000a900460ff16611007576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ffe90612af3565b60405180910390fd5b60008211801561101957506009548211155b611058576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104f90612cd3565b60405180910390fd5b60085461106e8383611aec90919063ffffffff16565b11156110af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a690612b53565b60405180910390fd5b6000600190505b8281116110ef576110d23382846110cd9190612dbc565b611ab8565b6110dc600d611ad6565b80806110e790612f90565b9150506110b6565b505050565b6110fc6115e9565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561116a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116190612b33565b60405180910390fd5b80600560006111776115e9565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166112246115e9565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516112699190612a56565b60405180910390a35050565b6112866112806115e9565b836116b8565b6112c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112bc90612cb3565b60405180910390fd5b6112d184848484611b02565b50505050565b60606112e28261157d565b611321576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131890612c73565b60405180910390fd5b600061132b611b5e565b9050600081511161134b5760405180602001604052806000815250611379565b8061135584611bf0565b600b604051602001611369939291906129be565b6040516020818303038152906040525b915050919050565b60085481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6114236115e9565b73ffffffffffffffffffffffffffffffffffffffff16611441610ee8565b73ffffffffffffffffffffffffffffffffffffffff1614611497576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148e90612c33565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611507576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114fe90612ab3565b60405180910390fd5b611510816119f2565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661166483610b7e565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b60006116c38261157d565b611702576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f990612b73565b60405180910390fd5b600061170d83610b7e565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061177c57508373ffffffffffffffffffffffffffffffffffffffff166117648461075a565b73ffffffffffffffffffffffffffffffffffffffff16145b8061178d575061178c8185611387565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166117b682610b7e565b73ffffffffffffffffffffffffffffffffffffffff161461180c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180390612c53565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561187c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187390612b13565b60405180910390fd5b611887838383611d9d565b6118926000826115f1565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546118e29190612e43565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546119399190612dbc565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611ad2828260405180602001604052806000815250611da2565b5050565b6001816000016000828254019250508190555050565b60008183611afa9190612dbc565b905092915050565b611b0d848484611796565b611b1984848484611dfd565b611b58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4f90612a93565b60405180910390fd5b50505050565b6060600a8054611b6d90612f2d565b80601f0160208091040260200160405190810160405280929190818152602001828054611b9990612f2d565b8015611be65780601f10611bbb57610100808354040283529160200191611be6565b820191906000526020600020905b815481529060010190602001808311611bc957829003601f168201915b5050505050905090565b60606000821415611c38576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611d98565b600082905060005b60008214611c6a578080611c5390612f90565b915050600a82611c639190612e12565b9150611c40565b60008167ffffffffffffffff811115611cac577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611cde5781602001600182028036833780820191505090505b5090505b60008514611d9157600182611cf79190612e43565b9150600a85611d069190612fd9565b6030611d129190612dbc565b60f81b818381518110611d4e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611d8a9190612e12565b9450611ce2565b8093505050505b919050565b505050565b611dac8383611f94565b611db96000848484611dfd565b611df8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611def90612a93565b60405180910390fd5b505050565b6000611e1e8473ffffffffffffffffffffffffffffffffffffffff16612162565b15611f87578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611e476115e9565b8786866040518563ffffffff1660e01b8152600401611e699493929190612a0a565b602060405180830381600087803b158015611e8357600080fd5b505af1925050508015611eb457506040513d601f19601f82011682018060405250810190611eb19190612503565b60015b611f37573d8060008114611ee4576040519150601f19603f3d011682016040523d82523d6000602084013e611ee9565b606091505b50600081511415611f2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2690612a93565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611f8c565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612004576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ffb90612bf3565b60405180910390fd5b61200d8161157d565b1561204d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204490612ad3565b60405180910390fd5b61205960008383611d9d565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120a99190612dbc565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b82805461218190612f2d565b90600052602060002090601f0160209004810192826121a357600085556121ea565b82601f106121bc57803560ff19168380011785556121ea565b828001600101855582156121ea579182015b828111156121e95782358255916020019190600101906121ce565b5b5090506121f791906121fb565b5090565b5b808211156122145760008160009055506001016121fc565b5090565b600061222b61222684612d33565b612d0e565b90508281526020810184848401111561224357600080fd5b61224e848285612eeb565b509392505050565b600081359050612265816135aa565b92915050565b60008135905061227a816135c1565b92915050565b60008135905061228f816135d8565b92915050565b6000815190506122a4816135d8565b92915050565b600082601f8301126122bb57600080fd5b81356122cb848260208601612218565b91505092915050565b60008083601f8401126122e657600080fd5b8235905067ffffffffffffffff8111156122ff57600080fd5b60208301915083600182028301111561231757600080fd5b9250929050565b60008135905061232d816135ef565b92915050565b60006020828403121561234557600080fd5b600061235384828501612256565b91505092915050565b6000806040838503121561236f57600080fd5b600061237d85828601612256565b925050602061238e85828601612256565b9150509250929050565b6000806000606084860312156123ad57600080fd5b60006123bb86828701612256565b93505060206123cc86828701612256565b92505060406123dd8682870161231e565b9150509250925092565b600080600080608085870312156123fd57600080fd5b600061240b87828801612256565b945050602061241c87828801612256565b935050604061242d8782880161231e565b925050606085013567ffffffffffffffff81111561244a57600080fd5b612456878288016122aa565b91505092959194509250565b6000806040838503121561247557600080fd5b600061248385828601612256565b92505060206124948582860161226b565b9150509250929050565b600080604083850312156124b157600080fd5b60006124bf85828601612256565b92505060206124d08582860161231e565b9150509250929050565b6000602082840312156124ec57600080fd5b60006124fa84828501612280565b91505092915050565b60006020828403121561251557600080fd5b600061252384828501612295565b91505092915050565b6000806020838503121561253f57600080fd5b600083013567ffffffffffffffff81111561255957600080fd5b612565858286016122d4565b92509250509250929050565b60006020828403121561258357600080fd5b60006125918482850161231e565b91505092915050565b600080604083850312156125ad57600080fd5b60006125bb8582860161231e565b92505060206125cc85828601612256565b9150509250929050565b6125df81612e77565b82525050565b6125ee81612e89565b82525050565b60006125ff82612d79565b6126098185612d8f565b9350612619818560208601612efa565b612622816130c6565b840191505092915050565b600061263882612d84565b6126428185612da0565b9350612652818560208601612efa565b61265b816130c6565b840191505092915050565b600061267182612d84565b61267b8185612db1565b935061268b818560208601612efa565b80840191505092915050565b600081546126a481612f2d565b6126ae8186612db1565b945060018216600081146126c957600181146126da5761270d565b60ff1983168652818601935061270d565b6126e385612d64565b60005b83811015612705578154818901526001820191506020810190506126e6565b838801955050505b50505092915050565b6000612723603283612da0565b915061272e826130d7565b604082019050919050565b6000612746602683612da0565b915061275182613126565b604082019050919050565b6000612769601c83612da0565b915061277482613175565b602082019050919050565b600061278c601783612da0565b91506127978261319e565b602082019050919050565b60006127af602483612da0565b91506127ba826131c7565b604082019050919050565b60006127d2601983612da0565b91506127dd82613216565b602082019050919050565b60006127f5601c83612da0565b91506128008261323f565b602082019050919050565b6000612818602c83612da0565b915061282382613268565b604082019050919050565b600061283b603883612da0565b9150612846826132b7565b604082019050919050565b600061285e602a83612da0565b915061286982613306565b604082019050919050565b6000612881602983612da0565b915061288c82613355565b604082019050919050565b60006128a4602083612da0565b91506128af826133a4565b602082019050919050565b60006128c7602c83612da0565b91506128d2826133cd565b604082019050919050565b60006128ea602083612da0565b91506128f58261341c565b602082019050919050565b600061290d602983612da0565b915061291882613445565b604082019050919050565b6000612930602f83612da0565b915061293b82613494565b604082019050919050565b6000612953602183612da0565b915061295e826134e3565b604082019050919050565b6000612976603183612da0565b915061298182613532565b604082019050919050565b6000612999601783612da0565b91506129a482613581565b602082019050919050565b6129b881612ee1565b82525050565b60006129ca8286612666565b91506129d68285612666565b91506129e28284612697565b9150819050949350505050565b6000602082019050612a0460008301846125d6565b92915050565b6000608082019050612a1f60008301876125d6565b612a2c60208301866125d6565b612a3960408301856129af565b8181036060830152612a4b81846125f4565b905095945050505050565b6000602082019050612a6b60008301846125e5565b92915050565b60006020820190508181036000830152612a8b818461262d565b905092915050565b60006020820190508181036000830152612aac81612716565b9050919050565b60006020820190508181036000830152612acc81612739565b9050919050565b60006020820190508181036000830152612aec8161275c565b9050919050565b60006020820190508181036000830152612b0c8161277f565b9050919050565b60006020820190508181036000830152612b2c816127a2565b9050919050565b60006020820190508181036000830152612b4c816127c5565b9050919050565b60006020820190508181036000830152612b6c816127e8565b9050919050565b60006020820190508181036000830152612b8c8161280b565b9050919050565b60006020820190508181036000830152612bac8161282e565b9050919050565b60006020820190508181036000830152612bcc81612851565b9050919050565b60006020820190508181036000830152612bec81612874565b9050919050565b60006020820190508181036000830152612c0c81612897565b9050919050565b60006020820190508181036000830152612c2c816128ba565b9050919050565b60006020820190508181036000830152612c4c816128dd565b9050919050565b60006020820190508181036000830152612c6c81612900565b9050919050565b60006020820190508181036000830152612c8c81612923565b9050919050565b60006020820190508181036000830152612cac81612946565b9050919050565b60006020820190508181036000830152612ccc81612969565b9050919050565b60006020820190508181036000830152612cec8161298c565b9050919050565b6000602082019050612d0860008301846129af565b92915050565b6000612d18612d29565b9050612d248282612f5f565b919050565b6000604051905090565b600067ffffffffffffffff821115612d4e57612d4d613097565b5b612d57826130c6565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000612dc782612ee1565b9150612dd283612ee1565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612e0757612e0661300a565b5b828201905092915050565b6000612e1d82612ee1565b9150612e2883612ee1565b925082612e3857612e37613039565b5b828204905092915050565b6000612e4e82612ee1565b9150612e5983612ee1565b925082821015612e6c57612e6b61300a565b5b828203905092915050565b6000612e8282612ec1565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015612f18578082015181840152602081019050612efd565b83811115612f27576000848401525b50505050565b60006002820490506001821680612f4557607f821691505b60208210811415612f5957612f58613068565b5b50919050565b612f68826130c6565b810181811067ffffffffffffffff82111715612f8757612f86613097565b5b80604052505050565b6000612f9b82612ee1565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612fce57612fcd61300a565b5b600182019050919050565b6000612fe482612ee1565b9150612fef83612ee1565b925082612fff57612ffe613039565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f53616c65204e6565647320546f20426520416374697665000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f5061796d656e74206578636565647320746f74616c20737570706c7900000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f496e76616c696420707572636861736520616d6f756e74000000000000000000600082015250565b6135b381612e77565b81146135be57600080fd5b50565b6135ca81612e89565b81146135d557600080fd5b50565b6135e181612e95565b81146135ec57600080fd5b50565b6135f881612ee1565b811461360357600080fd5b5056fea2646970667358221220f9742d6efc552047dd41af48df13278d53dba6375df83bed958528eac702b3eb64736f6c63430008040033

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

00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _customBaseURI (string):

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

39123:2442:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25317:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26262:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27821:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27344:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39653:101;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28711:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39434:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41417:143;;;;;;;;;;;;;:::i;:::-;;29121:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41315:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41193:114;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25956:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25686:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38494:94;;;;;;;;;;;;;:::i;:::-;;39762:296;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40985:78;;;;;;;;;;;;;:::i;:::-;;37843:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26431:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39247:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40066:502;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28114:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29377:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40576:401;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39286:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28480:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38743:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25317:305;25419:4;25471:25;25456:40;;;:11;:40;;;;:105;;;;25528:33;25513:48;;;:11;:48;;;;25456:105;:158;;;;25578:36;25602:11;25578:23;:36::i;:::-;25456:158;25436:178;;25317:305;;;:::o;26262:100::-;26316:13;26349:5;26342:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26262:100;:::o;27821:221::-;27897:7;27925:16;27933:7;27925;:16::i;:::-;27917:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;28010:15;:24;28026:7;28010:24;;;;;;;;;;;;;;;;;;;;;28003:31;;27821:221;;;:::o;27344:411::-;27425:13;27441:23;27456:7;27441:14;:23::i;:::-;27425:39;;27489:5;27483:11;;:2;:11;;;;27475:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;27583:5;27567:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;27592:37;27609:5;27616:12;:10;:12::i;:::-;27592:16;:37::i;:::-;27567:62;27545:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;27726:21;27735:2;27739:7;27726:8;:21::i;:::-;27344:411;;;:::o;39653:101::-;39697:7;39724:22;:12;:20;:22::i;:::-;39717:29;;39653:101;:::o;28711:339::-;28906:41;28925:12;:10;:12::i;:::-;28939:7;28906:18;:41::i;:::-;28898:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;29014:28;29024:4;29030:2;29034:7;29014:9;:28::i;:::-;28711:339;;;:::o;39434:28::-;;;;;;;;;;;;;:::o;41417:143::-;38074:12;:10;:12::i;:::-;38063:23;;:7;:5;:7::i;:::-;:23;;;38055:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41465:15:::1;41483:21;41465:39;;41523:10;41515:28;;:37;41544:7;41515:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;38134:1;41417:143::o:0;29121:185::-;29259:39;29276:4;29282:2;29286:7;29259:39;;;;;;;;;;;;:16;:39::i;:::-;29121:185;;;:::o;41315:94::-;38074:12;:10;:12::i;:::-;38063:23;;:7;:5;:7::i;:::-;:23;;;38055:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41393:8:::1;41383:7;:18;;;;41315:94:::0;:::o;41193:114::-;38074:12;:10;:12::i;:::-;38063:23;;:7;:5;:7::i;:::-;:23;;;38055:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41288:11:::1;;41272:13;:27;;;;;;;:::i;:::-;;41193:114:::0;;:::o;25956:239::-;26028:7;26048:13;26064:7;:16;26072:7;26064:16;;;;;;;;;;;;;;;;;;;;;26048:32;;26116:1;26099:19;;:5;:19;;;;26091:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26182:5;26175:12;;;25956:239;;;:::o;25686:208::-;25758:7;25803:1;25786:19;;:5;:19;;;;25778:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;25870:9;:16;25880:5;25870:16;;;;;;;;;;;;;;;;25863:23;;25686:208;;;:::o;38494:94::-;38074:12;:10;:12::i;:::-;38063:23;;:7;:5;:7::i;:::-;:23;;;38055:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;38559:21:::1;38577:1;38559:9;:21::i;:::-;38494:94::o:0;39762:296::-;38074:12;:10;:12::i;:::-;38063:23;;:7;:5;:7::i;:::-;:23;;;38055:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39859:14:::1;39876:22;:12;:20;:22::i;:::-;39859:39;;39912:9;39924:1;39912:13;;39908:143;39932:13;39927:1;:18;39908:143;;39966:34;39976:11;39998:1;39989:6;:10;;;;:::i;:::-;39966:9;:34::i;:::-;40015:24;:12;:22;:24::i;:::-;39947:3;;;;;:::i;:::-;;;;39908:143;;;;38134:1;39762:296:::0;;:::o;40985:78::-;38074:12;:10;:12::i;:::-;38063:23;;:7;:5;:7::i;:::-;:23;;;38055:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41047:8:::1;;;;;;;;;;;41046:9;41035:8;;:20;;;;;;;;;;;;;;;;;;40985:78::o:0;37843:87::-;37889:7;37916:6;;;;;;;;;;;37909:13;;37843:87;:::o;26431:104::-;26487:13;26520:7;26513:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26431:104;:::o;39247:32::-;;;;:::o;40066:502::-;40131:14;40148:22;:12;:20;:22::i;:::-;40131:39;;40189:8;;;;;;;;;;;40181:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;40260:1;40244:13;:17;:45;;;;;40282:7;;40265:13;:24;;40244:45;40236:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;40365:9;;40336:25;40347:13;40336:6;:10;;:25;;;;:::i;:::-;:38;;40328:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;40423:9;40435:1;40423:13;;40419:142;40443:13;40438:1;:18;40419:142;;40477:33;40487:10;40508:1;40499:6;:10;;;;:::i;:::-;40477:9;:33::i;:::-;40525:24;:12;:22;:24::i;:::-;40458:3;;;;;:::i;:::-;;;;40419:142;;;;40066:502;;:::o;28114:295::-;28229:12;:10;:12::i;:::-;28217:24;;:8;:24;;;;28209:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;28329:8;28284:18;:32;28303:12;:10;:12::i;:::-;28284:32;;;;;;;;;;;;;;;:42;28317:8;28284:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;28382:8;28353:48;;28368:12;:10;:12::i;:::-;28353:48;;;28392:8;28353:48;;;;;;:::i;:::-;;;;;;;;28114:295;;:::o;29377:328::-;29552:41;29571:12;:10;:12::i;:::-;29585:7;29552:18;:41::i;:::-;29544:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;29658:39;29672:4;29678:2;29682:7;29691:5;29658:13;:39::i;:::-;29377:328;;;;:::o;40576:401::-;40649:13;40683:16;40691:7;40683;:16::i;:::-;40675:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;40762:28;40793:10;:8;:10::i;:::-;40762:41;;40852:1;40827:14;40821:28;:32;:148;;;;;;;;;;;;;;;;;40893:14;40909:25;40926:7;40909:16;:25::i;:::-;40936:13;40876:74;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;40821:148;40814:155;;;40576:401;;;:::o;39286:32::-;;;;:::o;28480:164::-;28577:4;28601:18;:25;28620:5;28601:25;;;;;;;;;;;;;;;:35;28627:8;28601:35;;;;;;;;;;;;;;;;;;;;;;;;;28594:42;;28480:164;;;;:::o;38743:192::-;38074:12;:10;:12::i;:::-;38063:23;;:7;:5;:7::i;:::-;:23;;;38055:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;38852:1:::1;38832:22;;:8;:22;;;;38824:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;38908:19;38918:8;38908:9;:19::i;:::-;38743:192:::0;:::o;12544:157::-;12629:4;12668:25;12653:40;;;:11;:40;;;;12646:47;;12544:157;;;:::o;31215:127::-;31280:4;31332:1;31304:30;;:7;:16;31312:7;31304:16;;;;;;;;;;;;;;;;;;;;;:30;;;;31297:37;;31215:127;;;:::o;3117:98::-;3170:7;3197:10;3190:17;;3117:98;:::o;35197:174::-;35299:2;35272:15;:24;35288:7;35272:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;35355:7;35351:2;35317:46;;35326:23;35341:7;35326:14;:23::i;:::-;35317:46;;;;;;;;;;;;35197:174;;:::o;2491:114::-;2556:7;2583;:14;;;2576:21;;2491:114;;;:::o;31509:348::-;31602:4;31627:16;31635:7;31627;:16::i;:::-;31619:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;31703:13;31719:23;31734:7;31719:14;:23::i;:::-;31703:39;;31772:5;31761:16;;:7;:16;;;:51;;;;31805:7;31781:31;;:20;31793:7;31781:11;:20::i;:::-;:31;;;31761:51;:87;;;;31816:32;31833:5;31840:7;31816:16;:32::i;:::-;31761:87;31753:96;;;31509:348;;;;:::o;34501:578::-;34660:4;34633:31;;:23;34648:7;34633:14;:23::i;:::-;:31;;;34625:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;34743:1;34729:16;;:2;:16;;;;34721:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;34799:39;34820:4;34826:2;34830:7;34799:20;:39::i;:::-;34903:29;34920:1;34924:7;34903:8;:29::i;:::-;34964:1;34945:9;:15;34955:4;34945:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;34993:1;34976:9;:13;34986:2;34976:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;35024:2;35005:7;:16;35013:7;35005:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;35063:7;35059:2;35044:27;;35053:4;35044:27;;;;;;;;;;;;34501:578;;;:::o;38943:173::-;38999:16;39018:6;;;;;;;;;;;38999:25;;39044:8;39035:6;;:17;;;;;;;;;;;;;;;;;;39099:8;39068:40;;39089:8;39068:40;;;;;;;;;;;;38943:173;;:::o;32199:110::-;32275:26;32285:2;32289:7;32275:26;;;;;;;;;;;;:9;:26::i;:::-;32199:110;;:::o;2613:127::-;2720:1;2702:7;:14;;;:19;;;;;;;;;;;2613:127;:::o;20177:98::-;20235:7;20266:1;20262;:5;;;;:::i;:::-;20255:12;;20177:98;;;;:::o;30587:315::-;30744:28;30754:4;30760:2;30764:7;30744:9;:28::i;:::-;30791:48;30814:4;30820:2;30824:7;30833:5;30791:22;:48::i;:::-;30783:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;30587:315;;;;:::o;41071:114::-;41131:13;41164;41157:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41071:114;:::o;321:723::-;377:13;607:1;598:5;:10;594:53;;;625:10;;;;;;;;;;;;;;;;;;;;;594:53;657:12;672:5;657:20;;688:14;713:78;728:1;720:4;:9;713:78;;746:8;;;;;:::i;:::-;;;;777:2;769:10;;;;;:::i;:::-;;;713:78;;;801:19;833:6;823:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;801:39;;851:154;867:1;858:5;:10;851:154;;895:1;885:11;;;;;:::i;:::-;;;962:2;954:5;:10;;;;:::i;:::-;941:2;:24;;;;:::i;:::-;928:39;;911:6;918;911:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;991:2;982:11;;;;;:::i;:::-;;;851:154;;;1029:6;1015:21;;;;;321:723;;;;:::o;37307:126::-;;;;:::o;32536:321::-;32666:18;32672:2;32676:7;32666:5;:18::i;:::-;32717:54;32748:1;32752:2;32756:7;32765:5;32717:22;:54::i;:::-;32695:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;32536:321;;;:::o;35936:799::-;36091:4;36112:15;:2;:13;;;:15::i;:::-;36108:620;;;36164:2;36148:36;;;36185:12;:10;:12::i;:::-;36199:4;36205:7;36214:5;36148:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;36144:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36407:1;36390:6;:13;:18;36386:272;;;36433:60;;;;;;;;;;:::i;:::-;;;;;;;;36386:272;36608:6;36602:13;36593:6;36589:2;36585:15;36578:38;36144:529;36281:41;;;36271:51;;;:6;:51;;;;36264:58;;;;;36108:620;36712:4;36705:11;;35936:799;;;;;;;:::o;33193:382::-;33287:1;33273:16;;:2;:16;;;;33265:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;33346:16;33354:7;33346;:16::i;:::-;33345:17;33337:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;33408:45;33437:1;33441:2;33445:7;33408:20;:45::i;:::-;33483:1;33466:9;:13;33476:2;33466:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;33514:2;33495:7;:16;33503:7;33495:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;33559:7;33555:2;33534:33;;33551:1;33534:33;;;;;;;;;;;;33193:382;;:::o;3941:387::-;4001:4;4209:12;4276:7;4264:20;4256:28;;4319:1;4312:4;:8;4305:15;;;3941:387;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:343:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:2;;;290:1;287;280:12;249:2;303:41;337:6;332:3;327;303:41;:::i;:::-;90:260;;;;;;:::o;356:139::-;402:5;440:6;427:20;418:29;;456:33;483:5;456:33;:::i;:::-;408:87;;;;:::o;501:133::-;544:5;582:6;569:20;560:29;;598:30;622:5;598:30;:::i;:::-;550:84;;;;:::o;640:137::-;685:5;723:6;710:20;701:29;;739:32;765:5;739:32;:::i;:::-;691:86;;;;:::o;783:141::-;839:5;870:6;864:13;855:22;;886:32;912:5;886:32;:::i;:::-;845:79;;;;:::o;943:271::-;998:5;1047:3;1040:4;1032:6;1028:17;1024:27;1014:2;;1065:1;1062;1055:12;1014:2;1105:6;1092:20;1130:78;1204:3;1196:6;1189:4;1181:6;1177:17;1130:78;:::i;:::-;1121:87;;1004:210;;;;;:::o;1234:352::-;1292:8;1302:6;1352:3;1345:4;1337:6;1333:17;1329:27;1319:2;;1370:1;1367;1360:12;1319:2;1406:6;1393:20;1383:30;;1436:18;1428:6;1425:30;1422:2;;;1468:1;1465;1458:12;1422:2;1505:4;1497:6;1493:17;1481:29;;1559:3;1551:4;1543:6;1539:17;1529:8;1525:32;1522:41;1519:2;;;1576:1;1573;1566:12;1519:2;1309:277;;;;;:::o;1592:139::-;1638:5;1676:6;1663:20;1654:29;;1692:33;1719:5;1692:33;:::i;:::-;1644:87;;;;:::o;1737:262::-;1796:6;1845:2;1833:9;1824:7;1820:23;1816:32;1813:2;;;1861:1;1858;1851:12;1813:2;1904:1;1929:53;1974:7;1965:6;1954:9;1950:22;1929:53;:::i;:::-;1919:63;;1875:117;1803:196;;;;:::o;2005:407::-;2073:6;2081;2130:2;2118:9;2109:7;2105:23;2101:32;2098:2;;;2146:1;2143;2136:12;2098:2;2189:1;2214:53;2259:7;2250:6;2239:9;2235:22;2214:53;:::i;:::-;2204:63;;2160:117;2316:2;2342:53;2387:7;2378:6;2367:9;2363:22;2342:53;:::i;:::-;2332:63;;2287:118;2088:324;;;;;:::o;2418:552::-;2495:6;2503;2511;2560:2;2548:9;2539:7;2535:23;2531:32;2528:2;;;2576:1;2573;2566:12;2528:2;2619:1;2644:53;2689:7;2680:6;2669:9;2665:22;2644:53;:::i;:::-;2634:63;;2590:117;2746:2;2772:53;2817:7;2808:6;2797:9;2793:22;2772:53;:::i;:::-;2762:63;;2717:118;2874:2;2900:53;2945:7;2936:6;2925:9;2921:22;2900:53;:::i;:::-;2890:63;;2845:118;2518:452;;;;;:::o;2976:809::-;3071:6;3079;3087;3095;3144:3;3132:9;3123:7;3119:23;3115:33;3112:2;;;3161:1;3158;3151:12;3112:2;3204:1;3229:53;3274:7;3265:6;3254:9;3250:22;3229:53;:::i;:::-;3219:63;;3175:117;3331:2;3357:53;3402:7;3393:6;3382:9;3378:22;3357:53;:::i;:::-;3347:63;;3302:118;3459:2;3485:53;3530:7;3521:6;3510:9;3506:22;3485:53;:::i;:::-;3475:63;;3430:118;3615:2;3604:9;3600:18;3587:32;3646:18;3638:6;3635:30;3632:2;;;3678:1;3675;3668:12;3632:2;3706:62;3760:7;3751:6;3740:9;3736:22;3706:62;:::i;:::-;3696:72;;3558:220;3102:683;;;;;;;:::o;3791:401::-;3856:6;3864;3913:2;3901:9;3892:7;3888:23;3884:32;3881:2;;;3929:1;3926;3919:12;3881:2;3972:1;3997:53;4042:7;4033:6;4022:9;4018:22;3997:53;:::i;:::-;3987:63;;3943:117;4099:2;4125:50;4167:7;4158:6;4147:9;4143:22;4125:50;:::i;:::-;4115:60;;4070:115;3871:321;;;;;:::o;4198:407::-;4266:6;4274;4323:2;4311:9;4302:7;4298:23;4294:32;4291:2;;;4339:1;4336;4329:12;4291:2;4382:1;4407:53;4452:7;4443:6;4432:9;4428:22;4407:53;:::i;:::-;4397:63;;4353:117;4509:2;4535:53;4580:7;4571:6;4560:9;4556:22;4535:53;:::i;:::-;4525:63;;4480:118;4281:324;;;;;:::o;4611:260::-;4669:6;4718:2;4706:9;4697:7;4693:23;4689:32;4686:2;;;4734:1;4731;4724:12;4686:2;4777:1;4802:52;4846:7;4837:6;4826:9;4822:22;4802:52;:::i;:::-;4792:62;;4748:116;4676:195;;;;:::o;4877:282::-;4946:6;4995:2;4983:9;4974:7;4970:23;4966:32;4963:2;;;5011:1;5008;5001:12;4963:2;5054:1;5079:63;5134:7;5125:6;5114:9;5110:22;5079:63;:::i;:::-;5069:73;;5025:127;4953:206;;;;:::o;5165:395::-;5236:6;5244;5293:2;5281:9;5272:7;5268:23;5264:32;5261:2;;;5309:1;5306;5299:12;5261:2;5380:1;5369:9;5365:17;5352:31;5410:18;5402:6;5399:30;5396:2;;;5442:1;5439;5432:12;5396:2;5478:65;5535:7;5526:6;5515:9;5511:22;5478:65;:::i;:::-;5460:83;;;;5323:230;5251:309;;;;;:::o;5566:262::-;5625:6;5674:2;5662:9;5653:7;5649:23;5645:32;5642:2;;;5690:1;5687;5680:12;5642:2;5733:1;5758:53;5803:7;5794:6;5783:9;5779:22;5758:53;:::i;:::-;5748:63;;5704:117;5632:196;;;;:::o;5834:407::-;5902:6;5910;5959:2;5947:9;5938:7;5934:23;5930:32;5927:2;;;5975:1;5972;5965:12;5927:2;6018:1;6043:53;6088:7;6079:6;6068:9;6064:22;6043:53;:::i;:::-;6033:63;;5989:117;6145:2;6171:53;6216:7;6207:6;6196:9;6192:22;6171:53;:::i;:::-;6161:63;;6116:118;5917:324;;;;;:::o;6247:118::-;6334:24;6352:5;6334:24;:::i;:::-;6329:3;6322:37;6312:53;;:::o;6371:109::-;6452:21;6467:5;6452:21;:::i;:::-;6447:3;6440:34;6430:50;;:::o;6486:360::-;6572:3;6600:38;6632:5;6600:38;:::i;:::-;6654:70;6717:6;6712:3;6654:70;:::i;:::-;6647:77;;6733:52;6778:6;6773:3;6766:4;6759:5;6755:16;6733:52;:::i;:::-;6810:29;6832:6;6810:29;:::i;:::-;6805:3;6801:39;6794:46;;6576:270;;;;;:::o;6852:364::-;6940:3;6968:39;7001:5;6968:39;:::i;:::-;7023:71;7087:6;7082:3;7023:71;:::i;:::-;7016:78;;7103:52;7148:6;7143:3;7136:4;7129:5;7125:16;7103:52;:::i;:::-;7180:29;7202:6;7180:29;:::i;:::-;7175:3;7171:39;7164:46;;6944:272;;;;;:::o;7222:377::-;7328:3;7356:39;7389:5;7356:39;:::i;:::-;7411:89;7493:6;7488:3;7411:89;:::i;:::-;7404:96;;7509:52;7554:6;7549:3;7542:4;7535:5;7531:16;7509:52;:::i;:::-;7586:6;7581:3;7577:16;7570:23;;7332:267;;;;;:::o;7629:845::-;7732:3;7769:5;7763:12;7798:36;7824:9;7798:36;:::i;:::-;7850:89;7932:6;7927:3;7850:89;:::i;:::-;7843:96;;7970:1;7959:9;7955:17;7986:1;7981:137;;;;8132:1;8127:341;;;;7948:520;;7981:137;8065:4;8061:9;8050;8046:25;8041:3;8034:38;8101:6;8096:3;8092:16;8085:23;;7981:137;;8127:341;8194:38;8226:5;8194:38;:::i;:::-;8254:1;8268:154;8282:6;8279:1;8276:13;8268:154;;;8356:7;8350:14;8346:1;8341:3;8337:11;8330:35;8406:1;8397:7;8393:15;8382:26;;8304:4;8301:1;8297:12;8292:17;;8268:154;;;8451:6;8446:3;8442:16;8435:23;;8134:334;;7948:520;;7736:738;;;;;;:::o;8480:366::-;8622:3;8643:67;8707:2;8702:3;8643:67;:::i;:::-;8636:74;;8719:93;8808:3;8719:93;:::i;:::-;8837:2;8832:3;8828:12;8821:19;;8626:220;;;:::o;8852:366::-;8994:3;9015:67;9079:2;9074:3;9015:67;:::i;:::-;9008:74;;9091:93;9180:3;9091:93;:::i;:::-;9209:2;9204:3;9200:12;9193:19;;8998:220;;;:::o;9224:366::-;9366:3;9387:67;9451:2;9446:3;9387:67;:::i;:::-;9380:74;;9463:93;9552:3;9463:93;:::i;:::-;9581:2;9576:3;9572:12;9565:19;;9370:220;;;:::o;9596:366::-;9738:3;9759:67;9823:2;9818:3;9759:67;:::i;:::-;9752:74;;9835:93;9924:3;9835:93;:::i;:::-;9953:2;9948:3;9944:12;9937:19;;9742:220;;;:::o;9968:366::-;10110:3;10131:67;10195:2;10190:3;10131:67;:::i;:::-;10124:74;;10207:93;10296:3;10207:93;:::i;:::-;10325:2;10320:3;10316:12;10309:19;;10114:220;;;:::o;10340:366::-;10482:3;10503:67;10567:2;10562:3;10503:67;:::i;:::-;10496:74;;10579:93;10668:3;10579:93;:::i;:::-;10697:2;10692:3;10688:12;10681:19;;10486:220;;;:::o;10712:366::-;10854:3;10875:67;10939:2;10934:3;10875:67;:::i;:::-;10868:74;;10951:93;11040:3;10951:93;:::i;:::-;11069:2;11064:3;11060:12;11053:19;;10858:220;;;:::o;11084:366::-;11226:3;11247:67;11311:2;11306:3;11247:67;:::i;:::-;11240:74;;11323:93;11412:3;11323:93;:::i;:::-;11441:2;11436:3;11432:12;11425:19;;11230:220;;;:::o;11456:366::-;11598:3;11619:67;11683:2;11678:3;11619:67;:::i;:::-;11612:74;;11695:93;11784:3;11695:93;:::i;:::-;11813:2;11808:3;11804:12;11797:19;;11602:220;;;:::o;11828:366::-;11970:3;11991:67;12055:2;12050:3;11991:67;:::i;:::-;11984:74;;12067:93;12156:3;12067:93;:::i;:::-;12185:2;12180:3;12176:12;12169:19;;11974:220;;;:::o;12200:366::-;12342:3;12363:67;12427:2;12422:3;12363:67;:::i;:::-;12356:74;;12439:93;12528:3;12439:93;:::i;:::-;12557:2;12552:3;12548:12;12541:19;;12346:220;;;:::o;12572:366::-;12714:3;12735:67;12799:2;12794:3;12735:67;:::i;:::-;12728:74;;12811:93;12900:3;12811:93;:::i;:::-;12929:2;12924:3;12920:12;12913:19;;12718:220;;;:::o;12944:366::-;13086:3;13107:67;13171:2;13166:3;13107:67;:::i;:::-;13100:74;;13183:93;13272:3;13183:93;:::i;:::-;13301:2;13296:3;13292:12;13285:19;;13090:220;;;:::o;13316:366::-;13458:3;13479:67;13543:2;13538:3;13479:67;:::i;:::-;13472:74;;13555:93;13644:3;13555:93;:::i;:::-;13673:2;13668:3;13664:12;13657:19;;13462:220;;;:::o;13688:366::-;13830:3;13851:67;13915:2;13910:3;13851:67;:::i;:::-;13844:74;;13927:93;14016:3;13927:93;:::i;:::-;14045:2;14040:3;14036:12;14029:19;;13834:220;;;:::o;14060:366::-;14202:3;14223:67;14287:2;14282:3;14223:67;:::i;:::-;14216:74;;14299:93;14388:3;14299:93;:::i;:::-;14417:2;14412:3;14408:12;14401:19;;14206:220;;;:::o;14432:366::-;14574:3;14595:67;14659:2;14654:3;14595:67;:::i;:::-;14588:74;;14671:93;14760:3;14671:93;:::i;:::-;14789:2;14784:3;14780:12;14773:19;;14578:220;;;:::o;14804:366::-;14946:3;14967:67;15031:2;15026:3;14967:67;:::i;:::-;14960:74;;15043:93;15132:3;15043:93;:::i;:::-;15161:2;15156:3;15152:12;15145:19;;14950:220;;;:::o;15176:366::-;15318:3;15339:67;15403:2;15398:3;15339:67;:::i;:::-;15332:74;;15415:93;15504:3;15415:93;:::i;:::-;15533:2;15528:3;15524:12;15517:19;;15322:220;;;:::o;15548:118::-;15635:24;15653:5;15635:24;:::i;:::-;15630:3;15623:37;15613:53;;:::o;15672:589::-;15897:3;15919:95;16010:3;16001:6;15919:95;:::i;:::-;15912:102;;16031:95;16122:3;16113:6;16031:95;:::i;:::-;16024:102;;16143:92;16231:3;16222:6;16143:92;:::i;:::-;16136:99;;16252:3;16245:10;;15901:360;;;;;;:::o;16267:222::-;16360:4;16398:2;16387:9;16383:18;16375:26;;16411:71;16479:1;16468:9;16464:17;16455:6;16411:71;:::i;:::-;16365:124;;;;:::o;16495:640::-;16690:4;16728:3;16717:9;16713:19;16705:27;;16742:71;16810:1;16799:9;16795:17;16786:6;16742:71;:::i;:::-;16823:72;16891:2;16880:9;16876:18;16867:6;16823:72;:::i;:::-;16905;16973:2;16962:9;16958:18;16949:6;16905:72;:::i;:::-;17024:9;17018:4;17014:20;17009:2;16998:9;16994:18;16987:48;17052:76;17123:4;17114:6;17052:76;:::i;:::-;17044:84;;16695:440;;;;;;;:::o;17141:210::-;17228:4;17266:2;17255:9;17251:18;17243:26;;17279:65;17341:1;17330:9;17326:17;17317:6;17279:65;:::i;:::-;17233:118;;;;:::o;17357:313::-;17470:4;17508:2;17497:9;17493:18;17485:26;;17557:9;17551:4;17547:20;17543:1;17532:9;17528:17;17521:47;17585:78;17658:4;17649:6;17585:78;:::i;:::-;17577:86;;17475:195;;;;:::o;17676:419::-;17842:4;17880:2;17869:9;17865:18;17857:26;;17929:9;17923:4;17919:20;17915:1;17904:9;17900:17;17893:47;17957:131;18083:4;17957:131;:::i;:::-;17949:139;;17847:248;;;:::o;18101:419::-;18267:4;18305:2;18294:9;18290:18;18282:26;;18354:9;18348:4;18344:20;18340:1;18329:9;18325:17;18318:47;18382:131;18508:4;18382:131;:::i;:::-;18374:139;;18272:248;;;:::o;18526:419::-;18692:4;18730:2;18719:9;18715:18;18707:26;;18779:9;18773:4;18769:20;18765:1;18754:9;18750:17;18743:47;18807:131;18933:4;18807:131;:::i;:::-;18799:139;;18697:248;;;:::o;18951:419::-;19117:4;19155:2;19144:9;19140:18;19132:26;;19204:9;19198:4;19194:20;19190:1;19179:9;19175:17;19168:47;19232:131;19358:4;19232:131;:::i;:::-;19224:139;;19122:248;;;:::o;19376:419::-;19542:4;19580:2;19569:9;19565:18;19557:26;;19629:9;19623:4;19619:20;19615:1;19604:9;19600:17;19593:47;19657:131;19783:4;19657:131;:::i;:::-;19649:139;;19547:248;;;:::o;19801:419::-;19967:4;20005:2;19994:9;19990:18;19982:26;;20054:9;20048:4;20044:20;20040:1;20029:9;20025:17;20018:47;20082:131;20208:4;20082:131;:::i;:::-;20074:139;;19972:248;;;:::o;20226:419::-;20392:4;20430:2;20419:9;20415:18;20407:26;;20479:9;20473:4;20469:20;20465:1;20454:9;20450:17;20443:47;20507:131;20633:4;20507:131;:::i;:::-;20499:139;;20397:248;;;:::o;20651:419::-;20817:4;20855:2;20844:9;20840:18;20832:26;;20904:9;20898:4;20894:20;20890:1;20879:9;20875:17;20868:47;20932:131;21058:4;20932:131;:::i;:::-;20924:139;;20822:248;;;:::o;21076:419::-;21242:4;21280:2;21269:9;21265:18;21257:26;;21329:9;21323:4;21319:20;21315:1;21304:9;21300:17;21293:47;21357:131;21483:4;21357:131;:::i;:::-;21349:139;;21247:248;;;:::o;21501:419::-;21667:4;21705:2;21694:9;21690:18;21682:26;;21754:9;21748:4;21744:20;21740:1;21729:9;21725:17;21718:47;21782:131;21908:4;21782:131;:::i;:::-;21774:139;;21672:248;;;:::o;21926:419::-;22092:4;22130:2;22119:9;22115:18;22107:26;;22179:9;22173:4;22169:20;22165:1;22154:9;22150:17;22143:47;22207:131;22333:4;22207:131;:::i;:::-;22199:139;;22097:248;;;:::o;22351:419::-;22517:4;22555:2;22544:9;22540:18;22532:26;;22604:9;22598:4;22594:20;22590:1;22579:9;22575:17;22568:47;22632:131;22758:4;22632:131;:::i;:::-;22624:139;;22522:248;;;:::o;22776:419::-;22942:4;22980:2;22969:9;22965:18;22957:26;;23029:9;23023:4;23019:20;23015:1;23004:9;23000:17;22993:47;23057:131;23183:4;23057:131;:::i;:::-;23049:139;;22947:248;;;:::o;23201:419::-;23367:4;23405:2;23394:9;23390:18;23382:26;;23454:9;23448:4;23444:20;23440:1;23429:9;23425:17;23418:47;23482:131;23608:4;23482:131;:::i;:::-;23474:139;;23372:248;;;:::o;23626:419::-;23792:4;23830:2;23819:9;23815:18;23807:26;;23879:9;23873:4;23869:20;23865:1;23854:9;23850:17;23843:47;23907:131;24033:4;23907:131;:::i;:::-;23899:139;;23797:248;;;:::o;24051:419::-;24217:4;24255:2;24244:9;24240:18;24232:26;;24304:9;24298:4;24294:20;24290:1;24279:9;24275:17;24268:47;24332:131;24458:4;24332:131;:::i;:::-;24324:139;;24222:248;;;:::o;24476:419::-;24642:4;24680:2;24669:9;24665:18;24657:26;;24729:9;24723:4;24719:20;24715:1;24704:9;24700:17;24693:47;24757:131;24883:4;24757:131;:::i;:::-;24749:139;;24647:248;;;:::o;24901:419::-;25067:4;25105:2;25094:9;25090:18;25082:26;;25154:9;25148:4;25144:20;25140:1;25129:9;25125:17;25118:47;25182:131;25308:4;25182:131;:::i;:::-;25174:139;;25072:248;;;:::o;25326:419::-;25492:4;25530:2;25519:9;25515:18;25507:26;;25579:9;25573:4;25569:20;25565:1;25554:9;25550:17;25543:47;25607:131;25733:4;25607:131;:::i;:::-;25599:139;;25497:248;;;:::o;25751:222::-;25844:4;25882:2;25871:9;25867:18;25859:26;;25895:71;25963:1;25952:9;25948:17;25939:6;25895:71;:::i;:::-;25849:124;;;;:::o;25979:129::-;26013:6;26040:20;;:::i;:::-;26030:30;;26069:33;26097:4;26089:6;26069:33;:::i;:::-;26020:88;;;:::o;26114:75::-;26147:6;26180:2;26174:9;26164:19;;26154:35;:::o;26195:307::-;26256:4;26346:18;26338:6;26335:30;26332:2;;;26368:18;;:::i;:::-;26332:2;26406:29;26428:6;26406:29;:::i;:::-;26398:37;;26490:4;26484;26480:15;26472:23;;26261:241;;;:::o;26508:141::-;26557:4;26580:3;26572:11;;26603:3;26600:1;26593:14;26637:4;26634:1;26624:18;26616:26;;26562:87;;;:::o;26655:98::-;26706:6;26740:5;26734:12;26724:22;;26713:40;;;:::o;26759:99::-;26811:6;26845:5;26839:12;26829:22;;26818:40;;;:::o;26864:168::-;26947:11;26981:6;26976:3;26969:19;27021:4;27016:3;27012:14;26997:29;;26959:73;;;;:::o;27038:169::-;27122:11;27156:6;27151:3;27144:19;27196:4;27191:3;27187:14;27172:29;;27134:73;;;;:::o;27213:148::-;27315:11;27352:3;27337:18;;27327:34;;;;:::o;27367:305::-;27407:3;27426:20;27444:1;27426:20;:::i;:::-;27421:25;;27460:20;27478:1;27460:20;:::i;:::-;27455:25;;27614:1;27546:66;27542:74;27539:1;27536:81;27533:2;;;27620:18;;:::i;:::-;27533:2;27664:1;27661;27657:9;27650:16;;27411:261;;;;:::o;27678:185::-;27718:1;27735:20;27753:1;27735:20;:::i;:::-;27730:25;;27769:20;27787:1;27769:20;:::i;:::-;27764:25;;27808:1;27798:2;;27813:18;;:::i;:::-;27798:2;27855:1;27852;27848:9;27843:14;;27720:143;;;;:::o;27869:191::-;27909:4;27929:20;27947:1;27929:20;:::i;:::-;27924:25;;27963:20;27981:1;27963:20;:::i;:::-;27958:25;;28002:1;27999;27996:8;27993:2;;;28007:18;;:::i;:::-;27993:2;28052:1;28049;28045:9;28037:17;;27914:146;;;;:::o;28066:96::-;28103:7;28132:24;28150:5;28132:24;:::i;:::-;28121:35;;28111:51;;;:::o;28168:90::-;28202:7;28245:5;28238:13;28231:21;28220:32;;28210:48;;;:::o;28264:149::-;28300:7;28340:66;28333:5;28329:78;28318:89;;28308:105;;;:::o;28419:126::-;28456:7;28496:42;28489:5;28485:54;28474:65;;28464:81;;;:::o;28551:77::-;28588:7;28617:5;28606:16;;28596:32;;;:::o;28634:154::-;28718:6;28713:3;28708;28695:30;28780:1;28771:6;28766:3;28762:16;28755:27;28685:103;;;:::o;28794:307::-;28862:1;28872:113;28886:6;28883:1;28880:13;28872:113;;;28971:1;28966:3;28962:11;28956:18;28952:1;28947:3;28943:11;28936:39;28908:2;28905:1;28901:10;28896:15;;28872:113;;;29003:6;29000:1;28997:13;28994:2;;;29083:1;29074:6;29069:3;29065:16;29058:27;28994:2;28843:258;;;;:::o;29107:320::-;29151:6;29188:1;29182:4;29178:12;29168:22;;29235:1;29229:4;29225:12;29256:18;29246:2;;29312:4;29304:6;29300:17;29290:27;;29246:2;29374;29366:6;29363:14;29343:18;29340:38;29337:2;;;29393:18;;:::i;:::-;29337:2;29158:269;;;;:::o;29433:281::-;29516:27;29538:4;29516:27;:::i;:::-;29508:6;29504:40;29646:6;29634:10;29631:22;29610:18;29598:10;29595:34;29592:62;29589:2;;;29657:18;;:::i;:::-;29589:2;29697:10;29693:2;29686:22;29476:238;;;:::o;29720:233::-;29759:3;29782:24;29800:5;29782:24;:::i;:::-;29773:33;;29828:66;29821:5;29818:77;29815:2;;;29898:18;;:::i;:::-;29815:2;29945:1;29938:5;29934:13;29927:20;;29763:190;;;:::o;29959:176::-;29991:1;30008:20;30026:1;30008:20;:::i;:::-;30003:25;;30042:20;30060:1;30042:20;:::i;:::-;30037:25;;30081:1;30071:2;;30086:18;;:::i;:::-;30071:2;30127:1;30124;30120:9;30115:14;;29993:142;;;;:::o;30141:180::-;30189:77;30186:1;30179:88;30286:4;30283:1;30276:15;30310:4;30307:1;30300:15;30327:180;30375:77;30372:1;30365:88;30472:4;30469:1;30462:15;30496:4;30493:1;30486:15;30513:180;30561:77;30558:1;30551:88;30658:4;30655:1;30648:15;30682:4;30679:1;30672:15;30699:180;30747:77;30744:1;30737:88;30844:4;30841:1;30834:15;30868:4;30865:1;30858:15;30885:102;30926:6;30977:2;30973:7;30968:2;30961:5;30957:14;30953:28;30943:38;;30933:54;;;:::o;30993:237::-;31133:34;31129:1;31121:6;31117:14;31110:58;31202:20;31197:2;31189:6;31185:15;31178:45;31099:131;:::o;31236:225::-;31376:34;31372:1;31364:6;31360:14;31353:58;31445:8;31440:2;31432:6;31428:15;31421:33;31342:119;:::o;31467:178::-;31607:30;31603:1;31595:6;31591:14;31584:54;31573:72;:::o;31651:173::-;31791:25;31787:1;31779:6;31775:14;31768:49;31757:67;:::o;31830:223::-;31970:34;31966:1;31958:6;31954:14;31947:58;32039:6;32034:2;32026:6;32022:15;32015:31;31936:117;:::o;32059:175::-;32199:27;32195:1;32187:6;32183:14;32176:51;32165:69;:::o;32240:178::-;32380:30;32376:1;32368:6;32364:14;32357:54;32346:72;:::o;32424:231::-;32564:34;32560:1;32552:6;32548:14;32541:58;32633:14;32628:2;32620:6;32616:15;32609:39;32530:125;:::o;32661:243::-;32801:34;32797:1;32789:6;32785:14;32778:58;32870:26;32865:2;32857:6;32853:15;32846:51;32767:137;:::o;32910:229::-;33050:34;33046:1;33038:6;33034:14;33027:58;33119:12;33114:2;33106:6;33102:15;33095:37;33016:123;:::o;33145:228::-;33285:34;33281:1;33273:6;33269:14;33262:58;33354:11;33349:2;33341:6;33337:15;33330:36;33251:122;:::o;33379:182::-;33519:34;33515:1;33507:6;33503:14;33496:58;33485:76;:::o;33567:231::-;33707:34;33703:1;33695:6;33691:14;33684:58;33776:14;33771:2;33763:6;33759:15;33752:39;33673:125;:::o;33804:182::-;33944:34;33940:1;33932:6;33928:14;33921:58;33910:76;:::o;33992:228::-;34132:34;34128:1;34120:6;34116:14;34109:58;34201:11;34196:2;34188:6;34184:15;34177:36;34098:122;:::o;34226:234::-;34366:34;34362:1;34354:6;34350:14;34343:58;34435:17;34430:2;34422:6;34418:15;34411:42;34332:128;:::o;34466:220::-;34606:34;34602:1;34594:6;34590:14;34583:58;34675:3;34670:2;34662:6;34658:15;34651:28;34572:114;:::o;34692:236::-;34832:34;34828:1;34820:6;34816:14;34809:58;34901:19;34896:2;34888:6;34884:15;34877:44;34798:130;:::o;34934:173::-;35074:25;35070:1;35062:6;35058:14;35051:49;35040:67;:::o;35113:122::-;35186:24;35204:5;35186:24;:::i;:::-;35179:5;35176:35;35166:2;;35225:1;35222;35215:12;35166:2;35156:79;:::o;35241:116::-;35311:21;35326:5;35311:21;:::i;:::-;35304:5;35301:32;35291:2;;35347:1;35344;35337:12;35291:2;35281:76;:::o;35363:120::-;35435:23;35452:5;35435:23;:::i;:::-;35428:5;35425:34;35415:2;;35473:1;35470;35463:12;35415:2;35405:78;:::o;35489:122::-;35562:24;35580:5;35562:24;:::i;:::-;35555:5;35552:35;35542:2;;35601:1;35598;35591:12;35542:2;35532:79;:::o

Swarm Source

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