ETH Price: $3,415.67 (+1.26%)

Token

Lil Brains (BRAINZ)
 

Overview

Max Total Supply

0 BRAINZ

Holders

2,704

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 BRAINZ
0x2a93e999816c9826ade0b51aaa2d83240d8f4596
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

7,777 lil Brains on the blockchain - Aiming to become the leading foundation in #MentalHealth Awareness.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
LilBrains

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 10 of 12: LilBrains.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./ERC721.sol";
import "./Ownable.sol";
import "./Strings.sol";
import "./Counters.sol";

contract LilBrains is ERC721, Ownable {
    using Strings for uint256;
    using Counters for Counters.Counter;
    Counters.Counter private _tokenSupply;
    
    bool public public_sale_running = false;
    bool public private_sale_running = false;

    string private base_uri = "https://lilbrains.com/metadata/";

    mapping (address => uint) public presale_allocation;
    
    constructor () ERC721("Lil Brains", "BRAINZ") {
        _safeMint(0x369434192aE1D4c7B7D33A331eC092d4832763F9, 0);
        _tokenSupply.increment();
    }

    function setBaseURI(string memory new_uri) external onlyOwner {
        base_uri = new_uri;
    }
    
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        return string(abi.encodePacked(base_uri, (tokenId + 1).toString()));
    }   
    
    function privateMint(uint _quantity) external payable {
        require(presale_allocation[msg.sender] >= _quantity, "Not enough presale allocation");
        require(private_sale_running, "Private sale is not running");
        require(_quantity <= 14, "Invalid number of tokens queries for minting");
        require(msg.value == 0.045 ether * _quantity, "Incorrect ETH sent to mint");
        require(_tokenSupply.current() + _quantity <= 7777, "Not enough tokens left to mint");

        for (uint i = 0; i < _quantity; ++i) {
            --presale_allocation[msg.sender];
            _safeMint(msg.sender, _tokenSupply.current());
            _tokenSupply.increment();
        }
    }

    function publicMint(uint _quantity) external payable {
        require(public_sale_running, "Public sale is not running");
        require(_quantity <= 14, "Invalid number of tokens queries for minting");
        require(msg.value == 0.045 ether * _quantity, "Incorrect ETH sent to mint");
        require(_tokenSupply.current() + _quantity <= 7777, "Not enough tokens left to mint");
        
        for (uint i = 0; i < _quantity; ++i) {
            _safeMint(msg.sender, _tokenSupply.current());
            _tokenSupply.increment();
        }
    }

    function whitelist(address [] memory addresses) external onlyOwner {
        for (uint i = 0; i < addresses.length; ++i) {
            presale_allocation[addresses[i]] += 7;
        }
    }
    
    function togglePublicSale() external onlyOwner {
        public_sale_running = !public_sale_running;
    }

    function togglePrivateSale() external onlyOwner {
        private_sale_running = !private_sale_running;
    }
    
    function withdraw() external onlyOwner {
        uint balance = address(this).balance;

        payable(0x67E0D5a40BF8db099980F159955C6fAA2164ff84).transfer(18 * balance / 100); // donations
        payable(0x5862aD03648aa877E37c9Aa1cD6A67324797fEb5).transfer(40 * balance / 100); // team 
        payable(0x49fEc51444243bAd5c8f9c88E055FDF7cCBC9999).transfer(17 * balance / 100); // treasury

        payable(0x9408c666a65F2867A3ef3060766077462f84C717).transfer(125 * balance / 1000);
        payable(0x6B003507d437caF2bF3E1C79e536136513153cD8).transfer(address(this).balance);
    }
}

File 1 of 12: Address.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (utils/Address.sol)

pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
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);
            }
        }
    }
}

File 2 of 12: Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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

File 3 of 12: Counters.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Counters.sol)

pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
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;
    }
}

File 4 of 12: ERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;

import "./IERC165.sol";

/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

File 5 of 12: ERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;

import "./IERC721.sol";
import "./IERC721Receiver.sol";
import "./IERC721Metadata.sol";
import "./Address.sol";
import "./Context.sol";
import "./Strings.sol";
import "./ERC165.sol";

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
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 {
        _setApprovalForAll(_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 Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @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 {}
}

File 6 of 12: IERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

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

File 7 of 12: IERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;

import "./IERC165.sol";

/**
 * @dev Required interface of an ERC721 compliant contract.
 */
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;
}

File 8 of 12: IERC721Metadata.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;

import "./IERC721.sol";

/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
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);
}

File 9 of 12: IERC721Receiver.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
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);
}

File 11 of 12: Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (access/Ownable.sol)

pragma solidity ^0.8.0;

import "./Context.sol";

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
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() {
        _transferOwnership(_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 {
        _transferOwnership(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");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

File 12 of 12: Strings.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (utils/Strings.sol)

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
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);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"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":"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":[{"internalType":"address","name":"","type":"address"}],"name":"presale_allocation","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"privateMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"private_sale_running","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"public_sale_running","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"new_uri","type":"string"}],"name":"setBaseURI","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":"togglePrivateSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"togglePublicSale","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":[{"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":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"whitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526000600860006101000a81548160ff0219169083151502179055506000600860016101000a81548160ff0219169083151502179055506040518060400160405280601f81526020017f68747470733a2f2f6c696c627261696e732e636f6d2f6d657461646174612f00815250600990805190602001906200008792919062000736565b503480156200009557600080fd5b506040518060400160405280600a81526020017f4c696c20427261696e73000000000000000000000000000000000000000000008152506040518060400160405280600681526020017f425241494e5a000000000000000000000000000000000000000000000000000081525081600090805190602001906200011a92919062000736565b5080600190805190602001906200013392919062000736565b505050620001566200014a6200019a60201b60201c565b620001a260201b60201c565b6200017d73369434192ae1d4c7b7d33a331ec092d4832763f960006200026860201b60201c565b6200019460076200028e60201b620018141760201c565b62000c50565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6200028a828260405180602001604052806000815250620002a460201b60201c565b5050565b6001816000016000828254019250508190555050565b620002b683836200031260201b60201c565b620002cb6000848484620004f860201b60201c565b6200030d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000304906200095b565b60405180910390fd5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000385576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200037c906200099f565b60405180910390fd5b6200039681620006b260201b60201c565b15620003d9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003d0906200097d565b60405180910390fd5b620003ed600083836200071e60201b60201c565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546200043f9190620009ee565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000620005268473ffffffffffffffffffffffffffffffffffffffff166200072360201b6200182a1760201c565b15620006a5578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02620005586200019a60201b60201c565b8786866040518563ffffffff1660e01b81526004016200057c949392919062000907565b602060405180830381600087803b1580156200059757600080fd5b505af1925050508015620005cb57506040513d601f19601f82011682018060405250810190620005c89190620007fd565b60015b62000654573d8060008114620005fe576040519150601f19603f3d011682016040523d82523d6000602084013e62000603565b606091505b506000815114156200064c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000643906200095b565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050620006aa565b600190505b949350505050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b505050565b600080823b905060008111915050919050565b828054620007449062000aeb565b90600052602060002090601f016020900481019282620007685760008555620007b4565b82601f106200078357805160ff1916838001178555620007b4565b82800160010185558215620007b4579182015b82811115620007b357825182559160200191906001019062000796565b5b509050620007c39190620007c7565b5090565b5b80821115620007e2576000816000905550600101620007c8565b5090565b600081519050620007f78162000c36565b92915050565b60006020828403121562000816576200081562000b7f565b5b60006200082684828501620007e6565b91505092915050565b6200083a8162000a4b565b82525050565b60006200084d82620009c1565b620008598185620009cc565b93506200086b81856020860162000ab5565b620008768162000b84565b840191505092915050565b600062000890603283620009dd565b91506200089d8262000b95565b604082019050919050565b6000620008b7601c83620009dd565b9150620008c48262000be4565b602082019050919050565b6000620008de602083620009dd565b9150620008eb8262000c0d565b602082019050919050565b620009018162000aab565b82525050565b60006080820190506200091e60008301876200082f565b6200092d60208301866200082f565b6200093c6040830185620008f6565b818103606083015262000950818462000840565b905095945050505050565b60006020820190508181036000830152620009768162000881565b9050919050565b600060208201905081810360008301526200099881620008a8565b9050919050565b60006020820190508181036000830152620009ba81620008cf565b9050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b6000620009fb8262000aab565b915062000a088362000aab565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562000a405762000a3f62000b21565b5b828201905092915050565b600062000a588262000a8b565b9050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b8381101562000ad557808201518184015260208101905062000ab8565b8381111562000ae5576000848401525b50505050565b6000600282049050600182168062000b0457607f821691505b6020821081141562000b1b5762000b1a62000b50565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600080fd5b6000601f19601f8301169050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b62000c418162000a5f565b811462000c4d57600080fd5b50565b613caf8062000c606000396000f3fe6080604052600436106101815760003560e01c80638da5cb5b116100d1578063bd8aa7801161008a578063e222c7f911610064578063e222c7f91461053c578063e6f6ef1e14610553578063e985e9c51461057e578063f2fde38b146105bb57610181565b8063bd8aa780146104bf578063c87b56dd146104e8578063dfe5dd681461052557610181565b80638da5cb5b146103d05780639168e23e146103fb57806395d89b4114610426578063a22cb46514610451578063abfe40a81461047a578063b88d4fde1461049657610181565b80633ccfd60b1161013e57806355f804b31161011857806355f804b3146103165780636352211e1461033f57806370a082311461037c578063715018a6146103b957610181565b80633ccfd60b1461029957806342842e0e146102b0578063479bb06f146102d957610181565b806301ffc9a71461018657806306fdde03146101c3578063081812fc146101ee578063095ea7b31461022b57806323b872dd146102545780632db115441461027d575b600080fd5b34801561019257600080fd5b506101ad60048036038101906101a89190612985565b6105e4565b6040516101ba9190612f0e565b60405180910390f35b3480156101cf57600080fd5b506101d86106c6565b6040516101e59190612f29565b60405180910390f35b3480156101fa57600080fd5b5061021560048036038101906102109190612a28565b610758565b6040516102229190612ea7565b60405180910390f35b34801561023757600080fd5b50610252600480360381019061024d91906128fc565b6107dd565b005b34801561026057600080fd5b5061027b600480360381019061027691906127e6565b6108f5565b005b61029760048036038101906102929190612a28565b610955565b005b3480156102a557600080fd5b506102ae610ad2565b005b3480156102bc57600080fd5b506102d760048036038101906102d291906127e6565b610d7e565b005b3480156102e557600080fd5b5061030060048036038101906102fb9190612779565b610d9e565b60405161030d91906131eb565b60405180910390f35b34801561032257600080fd5b5061033d600480360381019061033891906129df565b610db6565b005b34801561034b57600080fd5b5061036660048036038101906103619190612a28565b610e4c565b6040516103739190612ea7565b60405180910390f35b34801561038857600080fd5b506103a3600480360381019061039e9190612779565b610efe565b6040516103b091906131eb565b60405180910390f35b3480156103c557600080fd5b506103ce610fb6565b005b3480156103dc57600080fd5b506103e561103e565b6040516103f29190612ea7565b60405180910390f35b34801561040757600080fd5b50610410611068565b60405161041d9190612f0e565b60405180910390f35b34801561043257600080fd5b5061043b61107b565b6040516104489190612f29565b60405180910390f35b34801561045d57600080fd5b50610478600480360381019061047391906128bc565b61110d565b005b610494600480360381019061048f9190612a28565b611123565b005b3480156104a257600080fd5b506104bd60048036038101906104b89190612839565b611375565b005b3480156104cb57600080fd5b506104e660048036038101906104e1919061293c565b6113d7565b005b3480156104f457600080fd5b5061050f600480360381019061050a9190612a28565b6114e5565b60405161051c9190612f29565b60405180910390f35b34801561053157600080fd5b5061053a611525565b005b34801561054857600080fd5b506105516115cd565b005b34801561055f57600080fd5b50610568611675565b6040516105759190612f0e565b60405180910390f35b34801561058a57600080fd5b506105a560048036038101906105a091906127a6565b611688565b6040516105b29190612f0e565b60405180910390f35b3480156105c757600080fd5b506105e260048036038101906105dd9190612779565b61171c565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806106af57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806106bf57506106be8261183d565b5b9050919050565b6060600080546106d590613506565b80601f016020809104026020016040519081016040528092919081815260200182805461070190613506565b801561074e5780601f106107235761010080835404028352916020019161074e565b820191906000526020600020905b81548152906001019060200180831161073157829003601f168201915b5050505050905090565b6000610763826118a7565b6107a2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610799906130cb565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006107e882610e4c565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610859576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108509061314b565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610878611913565b73ffffffffffffffffffffffffffffffffffffffff1614806108a757506108a6816108a1611913565b611688565b5b6108e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108dd9061304b565b60405180910390fd5b6108f0838361191b565b505050565b610906610900611913565b826119d4565b610945576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093c9061318b565b60405180910390fd5b610950838383611ab2565b505050565b600860009054906101000a900460ff166109a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099b9061316b565b60405180910390fd5b600e8111156109e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109df90612f4b565b60405180910390fd5b80669fdf42f6e480006109fb9190613398565b3414610a3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a33906131ab565b60405180910390fd5b611e6181610a4a6007611d0e565b610a549190613311565b1115610a95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8c9061312b565b60405180910390fd5b60005b81811015610ace57610ab333610aae6007611d0e565b611d1c565b610abd6007611814565b80610ac790613569565b9050610a98565b5050565b610ada611913565b73ffffffffffffffffffffffffffffffffffffffff16610af861103e565b73ffffffffffffffffffffffffffffffffffffffff1614610b4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b45906130eb565b60405180910390fd5b60004790507367e0d5a40bf8db099980f159955c6faa2164ff8473ffffffffffffffffffffffffffffffffffffffff166108fc6064836012610b909190613398565b610b9a9190613367565b9081150290604051600060405180830381858888f19350505050158015610bc5573d6000803e3d6000fd5b50735862ad03648aa877e37c9aa1cd6a67324797feb573ffffffffffffffffffffffffffffffffffffffff166108fc6064836028610c039190613398565b610c0d9190613367565b9081150290604051600060405180830381858888f19350505050158015610c38573d6000803e3d6000fd5b507349fec51444243bad5c8f9c88e055fdf7ccbc999973ffffffffffffffffffffffffffffffffffffffff166108fc6064836011610c769190613398565b610c809190613367565b9081150290604051600060405180830381858888f19350505050158015610cab573d6000803e3d6000fd5b50739408c666a65f2867a3ef3060766077462f84c71773ffffffffffffffffffffffffffffffffffffffff166108fc6103e883607d610cea9190613398565b610cf49190613367565b9081150290604051600060405180830381858888f19350505050158015610d1f573d6000803e3d6000fd5b50736b003507d437caf2bf3e1c79e536136513153cd873ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610d7a573d6000803e3d6000fd5b5050565b610d9983838360405180602001604052806000815250611375565b505050565b600a6020528060005260406000206000915090505481565b610dbe611913565b73ffffffffffffffffffffffffffffffffffffffff16610ddc61103e565b73ffffffffffffffffffffffffffffffffffffffff1614610e32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e29906130eb565b60405180910390fd5b8060099080519060200190610e489291906124ef565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610ef5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eec9061308b565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610f6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f669061306b565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610fbe611913565b73ffffffffffffffffffffffffffffffffffffffff16610fdc61103e565b73ffffffffffffffffffffffffffffffffffffffff1614611032576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611029906130eb565b60405180910390fd5b61103c6000611d3a565b565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600860019054906101000a900460ff1681565b60606001805461108a90613506565b80601f01602080910402602001604051908101604052809291908181526020018280546110b690613506565b80156111035780601f106110d857610100808354040283529160200191611103565b820191906000526020600020905b8154815290600101906020018083116110e657829003601f168201915b5050505050905090565b61111f611118611913565b8383611e00565b5050565b80600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410156111a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119c906131cb565b60405180910390fd5b600860019054906101000a900460ff166111f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111eb9061300b565b60405180910390fd5b600e811115611238576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122f90612f4b565b60405180910390fd5b80669fdf42f6e4800061124b9190613398565b341461128c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611283906131ab565b60405180910390fd5b611e618161129a6007611d0e565b6112a49190613311565b11156112e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112dc9061312b565b60405180910390fd5b60005b8181101561137157600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815461133c906134dc565b91905081905550611356336113516007611d0e565b611d1c565b6113606007611814565b8061136a90613569565b90506112e8565b5050565b611386611380611913565b836119d4565b6113c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113bc9061318b565b60405180910390fd5b6113d184848484611f6d565b50505050565b6113df611913565b73ffffffffffffffffffffffffffffffffffffffff166113fd61103e565b73ffffffffffffffffffffffffffffffffffffffff1614611453576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144a906130eb565b60405180910390fd5b60005b81518110156114e1576007600a600084848151811061147857611477613670565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546114c99190613311565b92505081905550806114da90613569565b9050611456565b5050565b606060096114fe6001846114f99190613311565b611fc9565b60405160200161150f929190612e83565b6040516020818303038152906040529050919050565b61152d611913565b73ffffffffffffffffffffffffffffffffffffffff1661154b61103e565b73ffffffffffffffffffffffffffffffffffffffff16146115a1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611598906130eb565b60405180910390fd5b600860019054906101000a900460ff1615600860016101000a81548160ff021916908315150217905550565b6115d5611913565b73ffffffffffffffffffffffffffffffffffffffff166115f361103e565b73ffffffffffffffffffffffffffffffffffffffff1614611649576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611640906130eb565b60405180910390fd5b600860009054906101000a900460ff1615600860006101000a81548160ff021916908315150217905550565b600860009054906101000a900460ff1681565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611724611913565b73ffffffffffffffffffffffffffffffffffffffff1661174261103e565b73ffffffffffffffffffffffffffffffffffffffff1614611798576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178f906130eb565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611808576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ff90612f8b565b60405180910390fd5b61181181611d3a565b50565b6001816000016000828254019250508190555050565b600080823b905060008111915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661198e83610e4c565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006119df826118a7565b611a1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a159061302b565b60405180910390fd5b6000611a2983610e4c565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611a9857508373ffffffffffffffffffffffffffffffffffffffff16611a8084610758565b73ffffffffffffffffffffffffffffffffffffffff16145b80611aa95750611aa88185611688565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611ad282610e4c565b73ffffffffffffffffffffffffffffffffffffffff1614611b28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1f9061310b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611b98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8f90612fcb565b60405180910390fd5b611ba383838361212a565b611bae60008261191b565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611bfe91906133f2565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611c559190613311565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600081600001549050919050565b611d3682826040518060200160405280600081525061212f565b5050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611e6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6690612feb565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611f609190612f0e565b60405180910390a3505050565b611f78848484611ab2565b611f848484848461218a565b611fc3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fba90612f6b565b60405180910390fd5b50505050565b60606000821415612011576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612125565b600082905060005b6000821461204357808061202c90613569565b915050600a8261203c9190613367565b9150612019565b60008167ffffffffffffffff81111561205f5761205e61369f565b5b6040519080825280601f01601f1916602001820160405280156120915781602001600182028036833780820191505090505b5090505b6000851461211e576001826120aa91906133f2565b9150600a856120b991906135b2565b60306120c59190613311565b60f81b8183815181106120db576120da613670565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856121179190613367565b9450612095565b8093505050505b919050565b505050565b6121398383612321565b612146600084848461218a565b612185576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161217c90612f6b565b60405180910390fd5b505050565b60006121ab8473ffffffffffffffffffffffffffffffffffffffff1661182a565b15612314578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026121d4611913565b8786866040518563ffffffff1660e01b81526004016121f69493929190612ec2565b602060405180830381600087803b15801561221057600080fd5b505af192505050801561224157506040513d601f19601f8201168201806040525081019061223e91906129b2565b60015b6122c4573d8060008114612271576040519150601f19603f3d011682016040523d82523d6000602084013e612276565b606091505b506000815114156122bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122b390612f6b565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612319565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612391576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612388906130ab565b60405180910390fd5b61239a816118a7565b156123da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123d190612fab565b60405180910390fd5b6123e66000838361212a565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124369190613311565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b8280546124fb90613506565b90600052602060002090601f01602090048101928261251d5760008555612564565b82601f1061253657805160ff1916838001178555612564565b82800160010185558215612564579182015b82811115612563578251825591602001919060010190612548565b5b5090506125719190612575565b5090565b5b8082111561258e576000816000905550600101612576565b5090565b60006125a56125a08461322b565b613206565b905080838252602082019050828560208602820111156125c8576125c76136d3565b5b60005b858110156125f857816125de8882612686565b8452602084019350602083019250506001810190506125cb565b5050509392505050565b600061261561261084613257565b613206565b905082815260208101848484011115612631576126306136d8565b5b61263c84828561349a565b509392505050565b600061265761265284613288565b613206565b905082815260208101848484011115612673576126726136d8565b5b61267e84828561349a565b509392505050565b60008135905061269581613c1d565b92915050565b600082601f8301126126b0576126af6136ce565b5b81356126c0848260208601612592565b91505092915050565b6000813590506126d881613c34565b92915050565b6000813590506126ed81613c4b565b92915050565b60008151905061270281613c4b565b92915050565b600082601f83011261271d5761271c6136ce565b5b813561272d848260208601612602565b91505092915050565b600082601f83011261274b5761274a6136ce565b5b813561275b848260208601612644565b91505092915050565b60008135905061277381613c62565b92915050565b60006020828403121561278f5761278e6136e2565b5b600061279d84828501612686565b91505092915050565b600080604083850312156127bd576127bc6136e2565b5b60006127cb85828601612686565b92505060206127dc85828601612686565b9150509250929050565b6000806000606084860312156127ff576127fe6136e2565b5b600061280d86828701612686565b935050602061281e86828701612686565b925050604061282f86828701612764565b9150509250925092565b60008060008060808587031215612853576128526136e2565b5b600061286187828801612686565b945050602061287287828801612686565b935050604061288387828801612764565b925050606085013567ffffffffffffffff8111156128a4576128a36136dd565b5b6128b087828801612708565b91505092959194509250565b600080604083850312156128d3576128d26136e2565b5b60006128e185828601612686565b92505060206128f2858286016126c9565b9150509250929050565b60008060408385031215612913576129126136e2565b5b600061292185828601612686565b925050602061293285828601612764565b9150509250929050565b600060208284031215612952576129516136e2565b5b600082013567ffffffffffffffff8111156129705761296f6136dd565b5b61297c8482850161269b565b91505092915050565b60006020828403121561299b5761299a6136e2565b5b60006129a9848285016126de565b91505092915050565b6000602082840312156129c8576129c76136e2565b5b60006129d6848285016126f3565b91505092915050565b6000602082840312156129f5576129f46136e2565b5b600082013567ffffffffffffffff811115612a1357612a126136dd565b5b612a1f84828501612736565b91505092915050565b600060208284031215612a3e57612a3d6136e2565b5b6000612a4c84828501612764565b91505092915050565b612a5e81613426565b82525050565b612a6d81613438565b82525050565b6000612a7e826132ce565b612a8881856132e4565b9350612a988185602086016134a9565b612aa1816136e7565b840191505092915050565b6000612ab7826132d9565b612ac181856132f5565b9350612ad18185602086016134a9565b612ada816136e7565b840191505092915050565b6000612af0826132d9565b612afa8185613306565b9350612b0a8185602086016134a9565b80840191505092915050565b60008154612b2381613506565b612b2d8186613306565b94506001821660008114612b485760018114612b5957612b8c565b60ff19831686528186019350612b8c565b612b62856132b9565b60005b83811015612b8457815481890152600182019150602081019050612b65565b838801955050505b50505092915050565b6000612ba2602c836132f5565b9150612bad826136f8565b604082019050919050565b6000612bc56032836132f5565b9150612bd082613747565b604082019050919050565b6000612be86026836132f5565b9150612bf382613796565b604082019050919050565b6000612c0b601c836132f5565b9150612c16826137e5565b602082019050919050565b6000612c2e6024836132f5565b9150612c398261380e565b604082019050919050565b6000612c516019836132f5565b9150612c5c8261385d565b602082019050919050565b6000612c74601b836132f5565b9150612c7f82613886565b602082019050919050565b6000612c97602c836132f5565b9150612ca2826138af565b604082019050919050565b6000612cba6038836132f5565b9150612cc5826138fe565b604082019050919050565b6000612cdd602a836132f5565b9150612ce88261394d565b604082019050919050565b6000612d006029836132f5565b9150612d0b8261399c565b604082019050919050565b6000612d236020836132f5565b9150612d2e826139eb565b602082019050919050565b6000612d46602c836132f5565b9150612d5182613a14565b604082019050919050565b6000612d696020836132f5565b9150612d7482613a63565b602082019050919050565b6000612d8c6029836132f5565b9150612d9782613a8c565b604082019050919050565b6000612daf601e836132f5565b9150612dba82613adb565b602082019050919050565b6000612dd26021836132f5565b9150612ddd82613b04565b604082019050919050565b6000612df5601a836132f5565b9150612e0082613b53565b602082019050919050565b6000612e186031836132f5565b9150612e2382613b7c565b604082019050919050565b6000612e3b601a836132f5565b9150612e4682613bcb565b602082019050919050565b6000612e5e601d836132f5565b9150612e6982613bf4565b602082019050919050565b612e7d81613490565b82525050565b6000612e8f8285612b16565b9150612e9b8284612ae5565b91508190509392505050565b6000602082019050612ebc6000830184612a55565b92915050565b6000608082019050612ed76000830187612a55565b612ee46020830186612a55565b612ef16040830185612e74565b8181036060830152612f038184612a73565b905095945050505050565b6000602082019050612f236000830184612a64565b92915050565b60006020820190508181036000830152612f438184612aac565b905092915050565b60006020820190508181036000830152612f6481612b95565b9050919050565b60006020820190508181036000830152612f8481612bb8565b9050919050565b60006020820190508181036000830152612fa481612bdb565b9050919050565b60006020820190508181036000830152612fc481612bfe565b9050919050565b60006020820190508181036000830152612fe481612c21565b9050919050565b6000602082019050818103600083015261300481612c44565b9050919050565b6000602082019050818103600083015261302481612c67565b9050919050565b6000602082019050818103600083015261304481612c8a565b9050919050565b6000602082019050818103600083015261306481612cad565b9050919050565b6000602082019050818103600083015261308481612cd0565b9050919050565b600060208201905081810360008301526130a481612cf3565b9050919050565b600060208201905081810360008301526130c481612d16565b9050919050565b600060208201905081810360008301526130e481612d39565b9050919050565b6000602082019050818103600083015261310481612d5c565b9050919050565b6000602082019050818103600083015261312481612d7f565b9050919050565b6000602082019050818103600083015261314481612da2565b9050919050565b6000602082019050818103600083015261316481612dc5565b9050919050565b6000602082019050818103600083015261318481612de8565b9050919050565b600060208201905081810360008301526131a481612e0b565b9050919050565b600060208201905081810360008301526131c481612e2e565b9050919050565b600060208201905081810360008301526131e481612e51565b9050919050565b60006020820190506132006000830184612e74565b92915050565b6000613210613221565b905061321c8282613538565b919050565b6000604051905090565b600067ffffffffffffffff8211156132465761324561369f565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156132725761327161369f565b5b61327b826136e7565b9050602081019050919050565b600067ffffffffffffffff8211156132a3576132a261369f565b5b6132ac826136e7565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061331c82613490565b915061332783613490565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561335c5761335b6135e3565b5b828201905092915050565b600061337282613490565b915061337d83613490565b92508261338d5761338c613612565b5b828204905092915050565b60006133a382613490565b91506133ae83613490565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156133e7576133e66135e3565b5b828202905092915050565b60006133fd82613490565b915061340883613490565b92508282101561341b5761341a6135e3565b5b828203905092915050565b600061343182613470565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156134c75780820151818401526020810190506134ac565b838111156134d6576000848401525b50505050565b60006134e782613490565b915060008214156134fb576134fa6135e3565b5b600182039050919050565b6000600282049050600182168061351e57607f821691505b6020821081141561353257613531613641565b5b50919050565b613541826136e7565b810181811067ffffffffffffffff821117156135605761355f61369f565b5b80604052505050565b600061357482613490565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156135a7576135a66135e3565b5b600182019050919050565b60006135bd82613490565b91506135c883613490565b9250826135d8576135d7613612565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f496e76616c6964206e756d626572206f6620746f6b656e73207175657269657360008201527f20666f72206d696e74696e670000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f507269766174652073616c65206973206e6f742072756e6e696e670000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4e6f7420656e6f75676820746f6b656e73206c65667420746f206d696e740000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f5075626c69632073616c65206973206e6f742072756e6e696e67000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f496e636f7272656374204554482073656e7420746f206d696e74000000000000600082015250565b7f4e6f7420656e6f7567682070726573616c6520616c6c6f636174696f6e000000600082015250565b613c2681613426565b8114613c3157600080fd5b50565b613c3d81613438565b8114613c4857600080fd5b50565b613c5481613444565b8114613c5f57600080fd5b50565b613c6b81613490565b8114613c7657600080fd5b5056fea26469706673582212207024aefb3def984748969cc3d3cbcd6842e693e87bd5d22a8ef497f46b38d75a64736f6c63430008070033

Deployed Bytecode

0x6080604052600436106101815760003560e01c80638da5cb5b116100d1578063bd8aa7801161008a578063e222c7f911610064578063e222c7f91461053c578063e6f6ef1e14610553578063e985e9c51461057e578063f2fde38b146105bb57610181565b8063bd8aa780146104bf578063c87b56dd146104e8578063dfe5dd681461052557610181565b80638da5cb5b146103d05780639168e23e146103fb57806395d89b4114610426578063a22cb46514610451578063abfe40a81461047a578063b88d4fde1461049657610181565b80633ccfd60b1161013e57806355f804b31161011857806355f804b3146103165780636352211e1461033f57806370a082311461037c578063715018a6146103b957610181565b80633ccfd60b1461029957806342842e0e146102b0578063479bb06f146102d957610181565b806301ffc9a71461018657806306fdde03146101c3578063081812fc146101ee578063095ea7b31461022b57806323b872dd146102545780632db115441461027d575b600080fd5b34801561019257600080fd5b506101ad60048036038101906101a89190612985565b6105e4565b6040516101ba9190612f0e565b60405180910390f35b3480156101cf57600080fd5b506101d86106c6565b6040516101e59190612f29565b60405180910390f35b3480156101fa57600080fd5b5061021560048036038101906102109190612a28565b610758565b6040516102229190612ea7565b60405180910390f35b34801561023757600080fd5b50610252600480360381019061024d91906128fc565b6107dd565b005b34801561026057600080fd5b5061027b600480360381019061027691906127e6565b6108f5565b005b61029760048036038101906102929190612a28565b610955565b005b3480156102a557600080fd5b506102ae610ad2565b005b3480156102bc57600080fd5b506102d760048036038101906102d291906127e6565b610d7e565b005b3480156102e557600080fd5b5061030060048036038101906102fb9190612779565b610d9e565b60405161030d91906131eb565b60405180910390f35b34801561032257600080fd5b5061033d600480360381019061033891906129df565b610db6565b005b34801561034b57600080fd5b5061036660048036038101906103619190612a28565b610e4c565b6040516103739190612ea7565b60405180910390f35b34801561038857600080fd5b506103a3600480360381019061039e9190612779565b610efe565b6040516103b091906131eb565b60405180910390f35b3480156103c557600080fd5b506103ce610fb6565b005b3480156103dc57600080fd5b506103e561103e565b6040516103f29190612ea7565b60405180910390f35b34801561040757600080fd5b50610410611068565b60405161041d9190612f0e565b60405180910390f35b34801561043257600080fd5b5061043b61107b565b6040516104489190612f29565b60405180910390f35b34801561045d57600080fd5b50610478600480360381019061047391906128bc565b61110d565b005b610494600480360381019061048f9190612a28565b611123565b005b3480156104a257600080fd5b506104bd60048036038101906104b89190612839565b611375565b005b3480156104cb57600080fd5b506104e660048036038101906104e1919061293c565b6113d7565b005b3480156104f457600080fd5b5061050f600480360381019061050a9190612a28565b6114e5565b60405161051c9190612f29565b60405180910390f35b34801561053157600080fd5b5061053a611525565b005b34801561054857600080fd5b506105516115cd565b005b34801561055f57600080fd5b50610568611675565b6040516105759190612f0e565b60405180910390f35b34801561058a57600080fd5b506105a560048036038101906105a091906127a6565b611688565b6040516105b29190612f0e565b60405180910390f35b3480156105c757600080fd5b506105e260048036038101906105dd9190612779565b61171c565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806106af57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806106bf57506106be8261183d565b5b9050919050565b6060600080546106d590613506565b80601f016020809104026020016040519081016040528092919081815260200182805461070190613506565b801561074e5780601f106107235761010080835404028352916020019161074e565b820191906000526020600020905b81548152906001019060200180831161073157829003601f168201915b5050505050905090565b6000610763826118a7565b6107a2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610799906130cb565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006107e882610e4c565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610859576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108509061314b565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610878611913565b73ffffffffffffffffffffffffffffffffffffffff1614806108a757506108a6816108a1611913565b611688565b5b6108e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108dd9061304b565b60405180910390fd5b6108f0838361191b565b505050565b610906610900611913565b826119d4565b610945576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093c9061318b565b60405180910390fd5b610950838383611ab2565b505050565b600860009054906101000a900460ff166109a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099b9061316b565b60405180910390fd5b600e8111156109e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109df90612f4b565b60405180910390fd5b80669fdf42f6e480006109fb9190613398565b3414610a3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a33906131ab565b60405180910390fd5b611e6181610a4a6007611d0e565b610a549190613311565b1115610a95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8c9061312b565b60405180910390fd5b60005b81811015610ace57610ab333610aae6007611d0e565b611d1c565b610abd6007611814565b80610ac790613569565b9050610a98565b5050565b610ada611913565b73ffffffffffffffffffffffffffffffffffffffff16610af861103e565b73ffffffffffffffffffffffffffffffffffffffff1614610b4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b45906130eb565b60405180910390fd5b60004790507367e0d5a40bf8db099980f159955c6faa2164ff8473ffffffffffffffffffffffffffffffffffffffff166108fc6064836012610b909190613398565b610b9a9190613367565b9081150290604051600060405180830381858888f19350505050158015610bc5573d6000803e3d6000fd5b50735862ad03648aa877e37c9aa1cd6a67324797feb573ffffffffffffffffffffffffffffffffffffffff166108fc6064836028610c039190613398565b610c0d9190613367565b9081150290604051600060405180830381858888f19350505050158015610c38573d6000803e3d6000fd5b507349fec51444243bad5c8f9c88e055fdf7ccbc999973ffffffffffffffffffffffffffffffffffffffff166108fc6064836011610c769190613398565b610c809190613367565b9081150290604051600060405180830381858888f19350505050158015610cab573d6000803e3d6000fd5b50739408c666a65f2867a3ef3060766077462f84c71773ffffffffffffffffffffffffffffffffffffffff166108fc6103e883607d610cea9190613398565b610cf49190613367565b9081150290604051600060405180830381858888f19350505050158015610d1f573d6000803e3d6000fd5b50736b003507d437caf2bf3e1c79e536136513153cd873ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610d7a573d6000803e3d6000fd5b5050565b610d9983838360405180602001604052806000815250611375565b505050565b600a6020528060005260406000206000915090505481565b610dbe611913565b73ffffffffffffffffffffffffffffffffffffffff16610ddc61103e565b73ffffffffffffffffffffffffffffffffffffffff1614610e32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e29906130eb565b60405180910390fd5b8060099080519060200190610e489291906124ef565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610ef5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eec9061308b565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610f6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f669061306b565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610fbe611913565b73ffffffffffffffffffffffffffffffffffffffff16610fdc61103e565b73ffffffffffffffffffffffffffffffffffffffff1614611032576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611029906130eb565b60405180910390fd5b61103c6000611d3a565b565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600860019054906101000a900460ff1681565b60606001805461108a90613506565b80601f01602080910402602001604051908101604052809291908181526020018280546110b690613506565b80156111035780601f106110d857610100808354040283529160200191611103565b820191906000526020600020905b8154815290600101906020018083116110e657829003601f168201915b5050505050905090565b61111f611118611913565b8383611e00565b5050565b80600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410156111a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119c906131cb565b60405180910390fd5b600860019054906101000a900460ff166111f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111eb9061300b565b60405180910390fd5b600e811115611238576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122f90612f4b565b60405180910390fd5b80669fdf42f6e4800061124b9190613398565b341461128c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611283906131ab565b60405180910390fd5b611e618161129a6007611d0e565b6112a49190613311565b11156112e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112dc9061312b565b60405180910390fd5b60005b8181101561137157600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815461133c906134dc565b91905081905550611356336113516007611d0e565b611d1c565b6113606007611814565b8061136a90613569565b90506112e8565b5050565b611386611380611913565b836119d4565b6113c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113bc9061318b565b60405180910390fd5b6113d184848484611f6d565b50505050565b6113df611913565b73ffffffffffffffffffffffffffffffffffffffff166113fd61103e565b73ffffffffffffffffffffffffffffffffffffffff1614611453576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144a906130eb565b60405180910390fd5b60005b81518110156114e1576007600a600084848151811061147857611477613670565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546114c99190613311565b92505081905550806114da90613569565b9050611456565b5050565b606060096114fe6001846114f99190613311565b611fc9565b60405160200161150f929190612e83565b6040516020818303038152906040529050919050565b61152d611913565b73ffffffffffffffffffffffffffffffffffffffff1661154b61103e565b73ffffffffffffffffffffffffffffffffffffffff16146115a1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611598906130eb565b60405180910390fd5b600860019054906101000a900460ff1615600860016101000a81548160ff021916908315150217905550565b6115d5611913565b73ffffffffffffffffffffffffffffffffffffffff166115f361103e565b73ffffffffffffffffffffffffffffffffffffffff1614611649576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611640906130eb565b60405180910390fd5b600860009054906101000a900460ff1615600860006101000a81548160ff021916908315150217905550565b600860009054906101000a900460ff1681565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611724611913565b73ffffffffffffffffffffffffffffffffffffffff1661174261103e565b73ffffffffffffffffffffffffffffffffffffffff1614611798576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178f906130eb565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611808576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ff90612f8b565b60405180910390fd5b61181181611d3a565b50565b6001816000016000828254019250508190555050565b600080823b905060008111915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661198e83610e4c565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006119df826118a7565b611a1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a159061302b565b60405180910390fd5b6000611a2983610e4c565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611a9857508373ffffffffffffffffffffffffffffffffffffffff16611a8084610758565b73ffffffffffffffffffffffffffffffffffffffff16145b80611aa95750611aa88185611688565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611ad282610e4c565b73ffffffffffffffffffffffffffffffffffffffff1614611b28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1f9061310b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611b98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8f90612fcb565b60405180910390fd5b611ba383838361212a565b611bae60008261191b565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611bfe91906133f2565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611c559190613311565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600081600001549050919050565b611d3682826040518060200160405280600081525061212f565b5050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611e6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6690612feb565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611f609190612f0e565b60405180910390a3505050565b611f78848484611ab2565b611f848484848461218a565b611fc3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fba90612f6b565b60405180910390fd5b50505050565b60606000821415612011576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612125565b600082905060005b6000821461204357808061202c90613569565b915050600a8261203c9190613367565b9150612019565b60008167ffffffffffffffff81111561205f5761205e61369f565b5b6040519080825280601f01601f1916602001820160405280156120915781602001600182028036833780820191505090505b5090505b6000851461211e576001826120aa91906133f2565b9150600a856120b991906135b2565b60306120c59190613311565b60f81b8183815181106120db576120da613670565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856121179190613367565b9450612095565b8093505050505b919050565b505050565b6121398383612321565b612146600084848461218a565b612185576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161217c90612f6b565b60405180910390fd5b505050565b60006121ab8473ffffffffffffffffffffffffffffffffffffffff1661182a565b15612314578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026121d4611913565b8786866040518563ffffffff1660e01b81526004016121f69493929190612ec2565b602060405180830381600087803b15801561221057600080fd5b505af192505050801561224157506040513d601f19601f8201168201806040525081019061223e91906129b2565b60015b6122c4573d8060008114612271576040519150601f19603f3d011682016040523d82523d6000602084013e612276565b606091505b506000815114156122bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122b390612f6b565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612319565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612391576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612388906130ab565b60405180910390fd5b61239a816118a7565b156123da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123d190612fab565b60405180910390fd5b6123e66000838361212a565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124369190613311565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b8280546124fb90613506565b90600052602060002090601f01602090048101928261251d5760008555612564565b82601f1061253657805160ff1916838001178555612564565b82800160010185558215612564579182015b82811115612563578251825591602001919060010190612548565b5b5090506125719190612575565b5090565b5b8082111561258e576000816000905550600101612576565b5090565b60006125a56125a08461322b565b613206565b905080838252602082019050828560208602820111156125c8576125c76136d3565b5b60005b858110156125f857816125de8882612686565b8452602084019350602083019250506001810190506125cb565b5050509392505050565b600061261561261084613257565b613206565b905082815260208101848484011115612631576126306136d8565b5b61263c84828561349a565b509392505050565b600061265761265284613288565b613206565b905082815260208101848484011115612673576126726136d8565b5b61267e84828561349a565b509392505050565b60008135905061269581613c1d565b92915050565b600082601f8301126126b0576126af6136ce565b5b81356126c0848260208601612592565b91505092915050565b6000813590506126d881613c34565b92915050565b6000813590506126ed81613c4b565b92915050565b60008151905061270281613c4b565b92915050565b600082601f83011261271d5761271c6136ce565b5b813561272d848260208601612602565b91505092915050565b600082601f83011261274b5761274a6136ce565b5b813561275b848260208601612644565b91505092915050565b60008135905061277381613c62565b92915050565b60006020828403121561278f5761278e6136e2565b5b600061279d84828501612686565b91505092915050565b600080604083850312156127bd576127bc6136e2565b5b60006127cb85828601612686565b92505060206127dc85828601612686565b9150509250929050565b6000806000606084860312156127ff576127fe6136e2565b5b600061280d86828701612686565b935050602061281e86828701612686565b925050604061282f86828701612764565b9150509250925092565b60008060008060808587031215612853576128526136e2565b5b600061286187828801612686565b945050602061287287828801612686565b935050604061288387828801612764565b925050606085013567ffffffffffffffff8111156128a4576128a36136dd565b5b6128b087828801612708565b91505092959194509250565b600080604083850312156128d3576128d26136e2565b5b60006128e185828601612686565b92505060206128f2858286016126c9565b9150509250929050565b60008060408385031215612913576129126136e2565b5b600061292185828601612686565b925050602061293285828601612764565b9150509250929050565b600060208284031215612952576129516136e2565b5b600082013567ffffffffffffffff8111156129705761296f6136dd565b5b61297c8482850161269b565b91505092915050565b60006020828403121561299b5761299a6136e2565b5b60006129a9848285016126de565b91505092915050565b6000602082840312156129c8576129c76136e2565b5b60006129d6848285016126f3565b91505092915050565b6000602082840312156129f5576129f46136e2565b5b600082013567ffffffffffffffff811115612a1357612a126136dd565b5b612a1f84828501612736565b91505092915050565b600060208284031215612a3e57612a3d6136e2565b5b6000612a4c84828501612764565b91505092915050565b612a5e81613426565b82525050565b612a6d81613438565b82525050565b6000612a7e826132ce565b612a8881856132e4565b9350612a988185602086016134a9565b612aa1816136e7565b840191505092915050565b6000612ab7826132d9565b612ac181856132f5565b9350612ad18185602086016134a9565b612ada816136e7565b840191505092915050565b6000612af0826132d9565b612afa8185613306565b9350612b0a8185602086016134a9565b80840191505092915050565b60008154612b2381613506565b612b2d8186613306565b94506001821660008114612b485760018114612b5957612b8c565b60ff19831686528186019350612b8c565b612b62856132b9565b60005b83811015612b8457815481890152600182019150602081019050612b65565b838801955050505b50505092915050565b6000612ba2602c836132f5565b9150612bad826136f8565b604082019050919050565b6000612bc56032836132f5565b9150612bd082613747565b604082019050919050565b6000612be86026836132f5565b9150612bf382613796565b604082019050919050565b6000612c0b601c836132f5565b9150612c16826137e5565b602082019050919050565b6000612c2e6024836132f5565b9150612c398261380e565b604082019050919050565b6000612c516019836132f5565b9150612c5c8261385d565b602082019050919050565b6000612c74601b836132f5565b9150612c7f82613886565b602082019050919050565b6000612c97602c836132f5565b9150612ca2826138af565b604082019050919050565b6000612cba6038836132f5565b9150612cc5826138fe565b604082019050919050565b6000612cdd602a836132f5565b9150612ce88261394d565b604082019050919050565b6000612d006029836132f5565b9150612d0b8261399c565b604082019050919050565b6000612d236020836132f5565b9150612d2e826139eb565b602082019050919050565b6000612d46602c836132f5565b9150612d5182613a14565b604082019050919050565b6000612d696020836132f5565b9150612d7482613a63565b602082019050919050565b6000612d8c6029836132f5565b9150612d9782613a8c565b604082019050919050565b6000612daf601e836132f5565b9150612dba82613adb565b602082019050919050565b6000612dd26021836132f5565b9150612ddd82613b04565b604082019050919050565b6000612df5601a836132f5565b9150612e0082613b53565b602082019050919050565b6000612e186031836132f5565b9150612e2382613b7c565b604082019050919050565b6000612e3b601a836132f5565b9150612e4682613bcb565b602082019050919050565b6000612e5e601d836132f5565b9150612e6982613bf4565b602082019050919050565b612e7d81613490565b82525050565b6000612e8f8285612b16565b9150612e9b8284612ae5565b91508190509392505050565b6000602082019050612ebc6000830184612a55565b92915050565b6000608082019050612ed76000830187612a55565b612ee46020830186612a55565b612ef16040830185612e74565b8181036060830152612f038184612a73565b905095945050505050565b6000602082019050612f236000830184612a64565b92915050565b60006020820190508181036000830152612f438184612aac565b905092915050565b60006020820190508181036000830152612f6481612b95565b9050919050565b60006020820190508181036000830152612f8481612bb8565b9050919050565b60006020820190508181036000830152612fa481612bdb565b9050919050565b60006020820190508181036000830152612fc481612bfe565b9050919050565b60006020820190508181036000830152612fe481612c21565b9050919050565b6000602082019050818103600083015261300481612c44565b9050919050565b6000602082019050818103600083015261302481612c67565b9050919050565b6000602082019050818103600083015261304481612c8a565b9050919050565b6000602082019050818103600083015261306481612cad565b9050919050565b6000602082019050818103600083015261308481612cd0565b9050919050565b600060208201905081810360008301526130a481612cf3565b9050919050565b600060208201905081810360008301526130c481612d16565b9050919050565b600060208201905081810360008301526130e481612d39565b9050919050565b6000602082019050818103600083015261310481612d5c565b9050919050565b6000602082019050818103600083015261312481612d7f565b9050919050565b6000602082019050818103600083015261314481612da2565b9050919050565b6000602082019050818103600083015261316481612dc5565b9050919050565b6000602082019050818103600083015261318481612de8565b9050919050565b600060208201905081810360008301526131a481612e0b565b9050919050565b600060208201905081810360008301526131c481612e2e565b9050919050565b600060208201905081810360008301526131e481612e51565b9050919050565b60006020820190506132006000830184612e74565b92915050565b6000613210613221565b905061321c8282613538565b919050565b6000604051905090565b600067ffffffffffffffff8211156132465761324561369f565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156132725761327161369f565b5b61327b826136e7565b9050602081019050919050565b600067ffffffffffffffff8211156132a3576132a261369f565b5b6132ac826136e7565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061331c82613490565b915061332783613490565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561335c5761335b6135e3565b5b828201905092915050565b600061337282613490565b915061337d83613490565b92508261338d5761338c613612565b5b828204905092915050565b60006133a382613490565b91506133ae83613490565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156133e7576133e66135e3565b5b828202905092915050565b60006133fd82613490565b915061340883613490565b92508282101561341b5761341a6135e3565b5b828203905092915050565b600061343182613470565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156134c75780820151818401526020810190506134ac565b838111156134d6576000848401525b50505050565b60006134e782613490565b915060008214156134fb576134fa6135e3565b5b600182039050919050565b6000600282049050600182168061351e57607f821691505b6020821081141561353257613531613641565b5b50919050565b613541826136e7565b810181811067ffffffffffffffff821117156135605761355f61369f565b5b80604052505050565b600061357482613490565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156135a7576135a66135e3565b5b600182019050919050565b60006135bd82613490565b91506135c883613490565b9250826135d8576135d7613612565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f496e76616c6964206e756d626572206f6620746f6b656e73207175657269657360008201527f20666f72206d696e74696e670000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f507269766174652073616c65206973206e6f742072756e6e696e670000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4e6f7420656e6f75676820746f6b656e73206c65667420746f206d696e740000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f5075626c69632073616c65206973206e6f742072756e6e696e67000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f496e636f7272656374204554482073656e7420746f206d696e74000000000000600082015250565b7f4e6f7420656e6f7567682070726573616c6520616c6c6f636174696f6e000000600082015250565b613c2681613426565b8114613c3157600080fd5b50565b613c3d81613438565b8114613c4857600080fd5b50565b613c5481613444565b8114613c5f57600080fd5b50565b613c6b81613490565b8114613c7657600080fd5b5056fea26469706673582212207024aefb3def984748969cc3d3cbcd6842e693e87bd5d22a8ef497f46b38d75a64736f6c63430008070033

Deployed Bytecode Sourcemap

155:3104:9:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1500:300:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2418:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3929:217;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3467:401;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4656:330;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1685:553:9;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2674:583;;;;;;;;;;;;;:::i;:::-;;5052:179:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;477:51:9;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;698:97;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2121:235:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1859:205;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1661:101:10;;;;;;;;;;;;;:::i;:::-;;1029:85;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;364:40:9;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2580:102:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4213:153;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;990:689:9;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5297:320:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2244:189:9;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;805:172;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2555:109;;;;;;;;;;;;;:::i;:::-;;2443:106;;;;;;;;;;;;;:::i;:::-;;319:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4432:162:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1911:198:10;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1500:300:4;1602:4;1652:25;1637:40;;;:11;:40;;;;:104;;;;1708:33;1693:48;;;:11;:48;;;;1637:104;:156;;;;1757:36;1781:11;1757:23;:36::i;:::-;1637:156;1618:175;;1500:300;;;:::o;2418:98::-;2472:13;2504:5;2497:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2418:98;:::o;3929:217::-;4005:7;4032:16;4040:7;4032;:16::i;:::-;4024:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;4115:15;:24;4131:7;4115:24;;;;;;;;;;;;;;;;;;;;;4108:31;;3929:217;;;:::o;3467:401::-;3547:13;3563:23;3578:7;3563:14;:23::i;:::-;3547:39;;3610:5;3604:11;;:2;:11;;;;3596:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;3701:5;3685:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;3710:37;3727:5;3734:12;:10;:12::i;:::-;3710:16;:37::i;:::-;3685:62;3664:165;;;;;;;;;;;;:::i;:::-;;;;;;;;;3840:21;3849:2;3853:7;3840:8;:21::i;:::-;3537:331;3467:401;;:::o;4656:330::-;4845:41;4864:12;:10;:12::i;:::-;4878:7;4845:18;:41::i;:::-;4837:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;4951:28;4961:4;4967:2;4971:7;4951:9;:28::i;:::-;4656:330;;;:::o;1685:553:9:-;1756:19;;;;;;;;;;;1748:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;1837:2;1824:9;:15;;1816:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;1933:9;1919:11;:23;;;;:::i;:::-;1906:9;:36;1898:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;2029:4;2016:9;1991:22;:12;:20;:22::i;:::-;:34;;;;:::i;:::-;:42;;1983:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;2092:6;2087:145;2108:9;2104:1;:13;2087:145;;;2138:45;2148:10;2160:22;:12;:20;:22::i;:::-;2138:9;:45::i;:::-;2197:24;:12;:22;:24::i;:::-;2119:3;;;;:::i;:::-;;;2087:145;;;;1685:553;:::o;2674:583::-;1252:12:10;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2723:12:9::1;2738:21;2723:36;;2778:42;2770:60;;:80;2846:3;2836:7;2831:2;:12;;;;:::i;:::-;:18;;;;:::i;:::-;2770:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;2881:42;2873:60;;:80;2949:3;2939:7;2934:2;:12;;;;:::i;:::-;:18;;;;:::i;:::-;2873:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;2980:42;2972:60;;:80;3048:3;3038:7;3033:2;:12;;;;:::i;:::-;:18;;;;:::i;:::-;2972:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;3083:42;3075:60;;:82;3152:4;3142:7;3136:3;:13;;;;:::i;:::-;:20;;;;:::i;:::-;3075:82;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;3175:42;3167:60;;:83;3228:21;3167:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;2713:544;2674:583::o:0;5052:179:4:-;5185:39;5202:4;5208:2;5212:7;5185:39;;;;;;;;;;;;:16;:39::i;:::-;5052:179;;;:::o;477:51:9:-;;;;;;;;;;;;;;;;;:::o;698:97::-;1252:12:10;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;781:7:9::1;770:8;:18;;;;;;;;;;;;:::i;:::-;;698:97:::0;:::o;2121:235:4:-;2193:7;2212:13;2228:7;:16;2236:7;2228:16;;;;;;;;;;;;;;;;;;;;;2212:32;;2279:1;2262:19;;:5;:19;;;;2254:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2344:5;2337:12;;;2121:235;;;:::o;1859:205::-;1931:7;1975:1;1958:19;;:5;:19;;;;1950:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;2041:9;:16;2051:5;2041:16;;;;;;;;;;;;;;;;2034:23;;1859:205;;;:::o;1661:101:10:-;1252:12;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1725:30:::1;1752:1;1725:18;:30::i;:::-;1661:101::o:0;1029:85::-;1075:7;1101:6;;;;;;;;;;;1094:13;;1029:85;:::o;364:40:9:-;;;;;;;;;;;;;:::o;2580:102:4:-;2636:13;2668:7;2661:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2580:102;:::o;4213:153::-;4307:52;4326:12;:10;:12::i;:::-;4340:8;4350;4307:18;:52::i;:::-;4213:153;;:::o;990:689:9:-;1096:9;1062:18;:30;1081:10;1062:30;;;;;;;;;;;;;;;;:43;;1054:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;1157:20;;;;;;;;;;;1149:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;1240:2;1227:9;:15;;1219:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;1336:9;1322:11;:23;;;;:::i;:::-;1309:9;:36;1301:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;1432:4;1419:9;1394:22;:12;:20;:22::i;:::-;:34;;;;:::i;:::-;:42;;1386:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;1487:6;1482:191;1503:9;1499:1;:13;1482:191;;;1535:18;:30;1554:10;1535:30;;;;;;;;;;;;;;;;1533:32;;;;;:::i;:::-;;;;;;;;1579:45;1589:10;1601:22;:12;:20;:22::i;:::-;1579:9;:45::i;:::-;1638:24;:12;:22;:24::i;:::-;1514:3;;;;:::i;:::-;;;1482:191;;;;990:689;:::o;5297:320:4:-;5466:41;5485:12;:10;:12::i;:::-;5499:7;5466:18;:41::i;:::-;5458:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;5571:39;5585:4;5591:2;5595:7;5604:5;5571:13;:39::i;:::-;5297:320;;;;:::o;2244:189:9:-;1252:12:10;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2326:6:9::1;2321:106;2342:9;:16;2338:1;:20;2321:106;;;2415:1;2379:18;:32;2398:9;2408:1;2398:12;;;;;;;;:::i;:::-;;;;;;;;2379:32;;;;;;;;;;;;;;;;:37;;;;;;;:::i;:::-;;;;;;;;2360:3;;;;:::i;:::-;;;2321:106;;;;2244:189:::0;:::o;805:172::-;878:13;934:8;944:24;955:1;945:7;:11;;;;:::i;:::-;944:22;:24::i;:::-;917:52;;;;;;;;;:::i;:::-;;;;;;;;;;;;;903:67;;805:172;;;:::o;2555:109::-;1252:12:10;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2637:20:9::1;;;;;;;;;;;2636:21;2613:20;;:44;;;;;;;;;;;;;;;;;;2555:109::o:0;2443:106::-;1252:12:10;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2523:19:9::1;;;;;;;;;;;2522:20;2500:19;;:42;;;;;;;;;;;;;;;;;;2443:106::o:0;319:39::-;;;;;;;;;;;;;:::o;4432:162:4:-;4529:4;4552:18;:25;4571:5;4552:25;;;;;;;;;;;;;;;:35;4578:8;4552:35;;;;;;;;;;;;;;;;;;;;;;;;;4545:42;;4432:162;;;;:::o;1911:198:10:-;1252:12;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2019:1:::1;1999:22;;:8;:22;;;;1991:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2074:28;2093:8;2074:18;:28::i;:::-;1911:198:::0;:::o;945:123:2:-;1050:1;1032:7;:14;;;:19;;;;;;;;;;;945:123;:::o;771:377:0:-;831:4;1034:12;1099:7;1087:20;1079:28;;1140:1;1133:4;:8;1126:15;;;771:377;;;:::o;829:155:3:-;914:4;952:25;937:40;;;:11;:40;;;;930:47;;829:155;;;:::o;7089:125:4:-;7154:4;7205:1;7177:30;;:7;:16;7185:7;7177:16;;;;;;;;;;;;;;;;;;;;;:30;;;;7170:37;;7089:125;;;:::o;640:96:1:-;693:7;719:10;712:17;;640:96;:::o;10940:171:4:-;11041:2;11014:15;:24;11030:7;11014:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;11096:7;11092:2;11058:46;;11067:23;11082:7;11067:14;:23::i;:::-;11058:46;;;;;;;;;;;;10940:171;;:::o;7372:344::-;7465:4;7489:16;7497:7;7489;:16::i;:::-;7481:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;7564:13;7580:23;7595:7;7580:14;:23::i;:::-;7564:39;;7632:5;7621:16;;:7;:16;;;:51;;;;7665:7;7641:31;;:20;7653:7;7641:11;:20::i;:::-;:31;;;7621:51;:87;;;;7676:32;7693:5;7700:7;7676:16;:32::i;:::-;7621:87;7613:96;;;7372:344;;;;:::o;10269:560::-;10423:4;10396:31;;:23;10411:7;10396:14;:23::i;:::-;:31;;;10388:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;10505:1;10491:16;;:2;:16;;;;10483:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;10559:39;10580:4;10586:2;10590:7;10559:20;:39::i;:::-;10660:29;10677:1;10681:7;10660:8;:29::i;:::-;10719:1;10700:9;:15;10710:4;10700:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;10747:1;10730:9;:13;10740:2;10730:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;10777:2;10758:7;:16;10766:7;10758:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;10814:7;10810:2;10795:27;;10804:4;10795:27;;;;;;;;;;;;10269:560;;;:::o;827:112:2:-;892:7;918;:14;;;911:21;;827:112;;;:::o;8046:108:4:-;8121:26;8131:2;8135:7;8121:26;;;;;;;;;;;;:9;:26::i;:::-;8046:108;;:::o;2263:187:10:-;2336:16;2355:6;;;;;;;;;;;2336:25;;2380:8;2371:6;;:17;;;;;;;;;;;;;;;;;;2434:8;2403:40;;2424:8;2403:40;;;;;;;;;;;;2326:124;2263:187;:::o;11246:307:4:-;11396:8;11387:17;;:5;:17;;;;11379:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;11482:8;11444:18;:25;11463:5;11444:25;;;;;;;;;;;;;;;:35;11470:8;11444:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;11527:8;11505:41;;11520:5;11505:41;;;11537:8;11505:41;;;;;;:::i;:::-;;;;;;;;11246:307;;;:::o;6479:::-;6630:28;6640:4;6646:2;6650:7;6630:9;:28::i;:::-;6676:48;6699:4;6705:2;6709:7;6718:5;6676:22;:48::i;:::-;6668:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;6479:307;;;;:::o;328:703:11:-;384:13;610:1;601:5;:10;597:51;;;627:10;;;;;;;;;;;;;;;;;;;;;597:51;657:12;672:5;657:20;;687:14;711:75;726:1;718:4;:9;711:75;;743:8;;;;;:::i;:::-;;;;773:2;765:10;;;;;:::i;:::-;;;711:75;;;795:19;827:6;817:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;795:39;;844:150;860:1;851:5;:10;844:150;;887:1;877:11;;;;;:::i;:::-;;;953:2;945:5;:10;;;;:::i;:::-;932:2;:24;;;;:::i;:::-;919:39;;902:6;909;902:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;981:2;972:11;;;;;:::i;:::-;;;844:150;;;1017:6;1003:21;;;;;328:703;;;;:::o;13440:122:4:-;;;;:::o;8375:311::-;8500:18;8506:2;8510:7;8500:5;:18::i;:::-;8549:54;8580:1;8584:2;8588:7;8597:5;8549:22;:54::i;:::-;8528:151;;;;;;;;;;;;:::i;:::-;;;;;;;;;8375:311;;;:::o;12106:778::-;12256:4;12276:15;:2;:13;;;:15::i;:::-;12272:606;;;12327:2;12311:36;;;12348:12;:10;:12::i;:::-;12362:4;12368:7;12377:5;12311:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;12307:519;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12567:1;12550:6;:13;:18;12546:266;;;12592:60;;;;;;;;;;:::i;:::-;;;;;;;;12546:266;12764:6;12758:13;12749:6;12745:2;12741:15;12734:38;12307:519;12443:41;;;12433:51;;;:6;:51;;;;12426:58;;;;;12272:606;12863:4;12856:11;;12106:778;;;;;;;:::o;9008:372::-;9101:1;9087:16;;:2;:16;;;;9079:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;9159:16;9167:7;9159;:16::i;:::-;9158:17;9150:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;9219:45;9248:1;9252:2;9256:7;9219:20;:45::i;:::-;9292:1;9275:9;:13;9285:2;9275:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;9322:2;9303:7;:16;9311:7;9303:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;9365:7;9361:2;9340:33;;9357:1;9340:33;;;;;;;;;;;;9008:372;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:12:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;752:410::-;829:5;854:65;870:48;911:6;870:48;:::i;:::-;854:65;:::i;:::-;845:74;;942:6;935:5;928:21;980:4;973:5;969:16;1018:3;1009:6;1004:3;1000:16;997:25;994:112;;;1025:79;;:::i;:::-;994:112;1115:41;1149:6;1144:3;1139;1115:41;:::i;:::-;835:327;752:410;;;;;:::o;1168:412::-;1246:5;1271:66;1287:49;1329:6;1287:49;:::i;:::-;1271:66;:::i;:::-;1262:75;;1360:6;1353:5;1346:21;1398:4;1391:5;1387:16;1436:3;1427:6;1422:3;1418:16;1415:25;1412:112;;;1443:79;;:::i;:::-;1412:112;1533:41;1567:6;1562:3;1557;1533:41;:::i;:::-;1252:328;1168:412;;;;;:::o;1586:139::-;1632:5;1670:6;1657:20;1648:29;;1686:33;1713:5;1686:33;:::i;:::-;1586:139;;;;:::o;1748:370::-;1819:5;1868:3;1861:4;1853:6;1849:17;1845:27;1835:122;;1876:79;;:::i;:::-;1835:122;1993:6;1980:20;2018:94;2108:3;2100:6;2093:4;2085:6;2081:17;2018:94;:::i;:::-;2009:103;;1825:293;1748:370;;;;:::o;2124:133::-;2167:5;2205:6;2192:20;2183:29;;2221:30;2245:5;2221:30;:::i;:::-;2124:133;;;;:::o;2263:137::-;2308:5;2346:6;2333:20;2324:29;;2362:32;2388:5;2362:32;:::i;:::-;2263:137;;;;:::o;2406:141::-;2462:5;2493:6;2487:13;2478:22;;2509:32;2535:5;2509:32;:::i;:::-;2406:141;;;;:::o;2566:338::-;2621:5;2670:3;2663:4;2655:6;2651:17;2647:27;2637:122;;2678:79;;:::i;:::-;2637:122;2795:6;2782:20;2820:78;2894:3;2886:6;2879:4;2871:6;2867:17;2820:78;:::i;:::-;2811:87;;2627:277;2566:338;;;;:::o;2924:340::-;2980:5;3029:3;3022:4;3014:6;3010:17;3006:27;2996:122;;3037:79;;:::i;:::-;2996:122;3154:6;3141:20;3179:79;3254:3;3246:6;3239:4;3231:6;3227:17;3179:79;:::i;:::-;3170:88;;2986:278;2924:340;;;;:::o;3270:139::-;3316:5;3354:6;3341:20;3332:29;;3370:33;3397:5;3370:33;:::i;:::-;3270:139;;;;:::o;3415:329::-;3474:6;3523:2;3511:9;3502:7;3498:23;3494:32;3491:119;;;3529:79;;:::i;:::-;3491:119;3649:1;3674:53;3719:7;3710:6;3699:9;3695:22;3674:53;:::i;:::-;3664:63;;3620:117;3415:329;;;;:::o;3750:474::-;3818:6;3826;3875:2;3863:9;3854:7;3850:23;3846:32;3843:119;;;3881:79;;:::i;:::-;3843:119;4001:1;4026:53;4071:7;4062:6;4051:9;4047:22;4026:53;:::i;:::-;4016:63;;3972:117;4128:2;4154:53;4199:7;4190:6;4179:9;4175:22;4154:53;:::i;:::-;4144:63;;4099:118;3750:474;;;;;:::o;4230:619::-;4307:6;4315;4323;4372:2;4360:9;4351:7;4347:23;4343:32;4340:119;;;4378:79;;:::i;:::-;4340:119;4498:1;4523:53;4568:7;4559:6;4548:9;4544:22;4523:53;:::i;:::-;4513:63;;4469:117;4625:2;4651:53;4696:7;4687:6;4676:9;4672:22;4651:53;:::i;:::-;4641:63;;4596:118;4753:2;4779:53;4824:7;4815:6;4804:9;4800:22;4779:53;:::i;:::-;4769:63;;4724:118;4230:619;;;;;:::o;4855:943::-;4950:6;4958;4966;4974;5023:3;5011:9;5002:7;4998:23;4994:33;4991:120;;;5030:79;;:::i;:::-;4991:120;5150:1;5175:53;5220:7;5211:6;5200:9;5196:22;5175:53;:::i;:::-;5165:63;;5121:117;5277:2;5303:53;5348:7;5339:6;5328:9;5324:22;5303:53;:::i;:::-;5293:63;;5248:118;5405:2;5431:53;5476:7;5467:6;5456:9;5452:22;5431:53;:::i;:::-;5421:63;;5376:118;5561:2;5550:9;5546:18;5533:32;5592:18;5584:6;5581:30;5578:117;;;5614:79;;:::i;:::-;5578:117;5719:62;5773:7;5764:6;5753:9;5749:22;5719:62;:::i;:::-;5709:72;;5504:287;4855:943;;;;;;;:::o;5804:468::-;5869:6;5877;5926:2;5914:9;5905:7;5901:23;5897:32;5894:119;;;5932:79;;:::i;:::-;5894:119;6052:1;6077:53;6122:7;6113:6;6102:9;6098:22;6077:53;:::i;:::-;6067:63;;6023:117;6179:2;6205:50;6247:7;6238:6;6227:9;6223:22;6205:50;:::i;:::-;6195:60;;6150:115;5804:468;;;;;:::o;6278:474::-;6346:6;6354;6403:2;6391:9;6382:7;6378:23;6374:32;6371:119;;;6409:79;;:::i;:::-;6371:119;6529:1;6554:53;6599:7;6590:6;6579:9;6575:22;6554:53;:::i;:::-;6544:63;;6500:117;6656:2;6682:53;6727:7;6718:6;6707:9;6703:22;6682:53;:::i;:::-;6672:63;;6627:118;6278:474;;;;;:::o;6758:539::-;6842:6;6891:2;6879:9;6870:7;6866:23;6862:32;6859:119;;;6897:79;;:::i;:::-;6859:119;7045:1;7034:9;7030:17;7017:31;7075:18;7067:6;7064:30;7061:117;;;7097:79;;:::i;:::-;7061:117;7202:78;7272:7;7263:6;7252:9;7248:22;7202:78;:::i;:::-;7192:88;;6988:302;6758:539;;;;:::o;7303:327::-;7361:6;7410:2;7398:9;7389:7;7385:23;7381:32;7378:119;;;7416:79;;:::i;:::-;7378:119;7536:1;7561:52;7605:7;7596:6;7585:9;7581:22;7561:52;:::i;:::-;7551:62;;7507:116;7303:327;;;;:::o;7636:349::-;7705:6;7754:2;7742:9;7733:7;7729:23;7725:32;7722:119;;;7760:79;;:::i;:::-;7722:119;7880:1;7905:63;7960:7;7951:6;7940:9;7936:22;7905:63;:::i;:::-;7895:73;;7851:127;7636:349;;;;:::o;7991:509::-;8060:6;8109:2;8097:9;8088:7;8084:23;8080:32;8077:119;;;8115:79;;:::i;:::-;8077:119;8263:1;8252:9;8248:17;8235:31;8293:18;8285:6;8282:30;8279:117;;;8315:79;;:::i;:::-;8279:117;8420:63;8475:7;8466:6;8455:9;8451:22;8420:63;:::i;:::-;8410:73;;8206:287;7991:509;;;;:::o;8506:329::-;8565:6;8614:2;8602:9;8593:7;8589:23;8585:32;8582:119;;;8620:79;;:::i;:::-;8582:119;8740:1;8765:53;8810:7;8801:6;8790:9;8786:22;8765:53;:::i;:::-;8755:63;;8711:117;8506:329;;;;:::o;8841:118::-;8928:24;8946:5;8928:24;:::i;:::-;8923:3;8916:37;8841:118;;:::o;8965:109::-;9046:21;9061:5;9046:21;:::i;:::-;9041:3;9034:34;8965:109;;:::o;9080:360::-;9166:3;9194:38;9226:5;9194:38;:::i;:::-;9248:70;9311:6;9306:3;9248:70;:::i;:::-;9241:77;;9327:52;9372:6;9367:3;9360:4;9353:5;9349:16;9327:52;:::i;:::-;9404:29;9426:6;9404:29;:::i;:::-;9399:3;9395:39;9388:46;;9170:270;9080:360;;;;:::o;9446:364::-;9534:3;9562:39;9595:5;9562:39;:::i;:::-;9617:71;9681:6;9676:3;9617:71;:::i;:::-;9610:78;;9697:52;9742:6;9737:3;9730:4;9723:5;9719:16;9697:52;:::i;:::-;9774:29;9796:6;9774:29;:::i;:::-;9769:3;9765:39;9758:46;;9538:272;9446:364;;;;:::o;9816:377::-;9922:3;9950:39;9983:5;9950:39;:::i;:::-;10005:89;10087:6;10082:3;10005:89;:::i;:::-;9998:96;;10103:52;10148:6;10143:3;10136:4;10129:5;10125:16;10103:52;:::i;:::-;10180:6;10175:3;10171:16;10164:23;;9926:267;9816:377;;;;:::o;10223:845::-;10326:3;10363:5;10357:12;10392:36;10418:9;10392:36;:::i;:::-;10444:89;10526:6;10521:3;10444:89;:::i;:::-;10437:96;;10564:1;10553:9;10549:17;10580:1;10575:137;;;;10726:1;10721:341;;;;10542:520;;10575:137;10659:4;10655:9;10644;10640:25;10635:3;10628:38;10695:6;10690:3;10686:16;10679:23;;10575:137;;10721:341;10788:38;10820:5;10788:38;:::i;:::-;10848:1;10862:154;10876:6;10873:1;10870:13;10862:154;;;10950:7;10944:14;10940:1;10935:3;10931:11;10924:35;11000:1;10991:7;10987:15;10976:26;;10898:4;10895:1;10891:12;10886:17;;10862:154;;;11045:6;11040:3;11036:16;11029:23;;10728:334;;10542:520;;10330:738;;10223:845;;;;:::o;11074:366::-;11216:3;11237:67;11301:2;11296:3;11237:67;:::i;:::-;11230:74;;11313:93;11402:3;11313:93;:::i;:::-;11431:2;11426:3;11422:12;11415:19;;11074:366;;;:::o;11446:::-;11588:3;11609:67;11673:2;11668:3;11609:67;:::i;:::-;11602:74;;11685:93;11774:3;11685:93;:::i;:::-;11803:2;11798:3;11794:12;11787:19;;11446:366;;;:::o;11818:::-;11960:3;11981:67;12045:2;12040:3;11981:67;:::i;:::-;11974:74;;12057:93;12146:3;12057:93;:::i;:::-;12175:2;12170:3;12166:12;12159:19;;11818:366;;;:::o;12190:::-;12332:3;12353:67;12417:2;12412:3;12353:67;:::i;:::-;12346:74;;12429:93;12518:3;12429:93;:::i;:::-;12547:2;12542:3;12538:12;12531:19;;12190:366;;;:::o;12562:::-;12704:3;12725:67;12789:2;12784:3;12725:67;:::i;:::-;12718:74;;12801:93;12890:3;12801:93;:::i;:::-;12919:2;12914:3;12910:12;12903:19;;12562:366;;;:::o;12934:::-;13076:3;13097:67;13161:2;13156:3;13097:67;:::i;:::-;13090:74;;13173:93;13262:3;13173:93;:::i;:::-;13291:2;13286:3;13282:12;13275:19;;12934:366;;;:::o;13306:::-;13448:3;13469:67;13533:2;13528:3;13469:67;:::i;:::-;13462:74;;13545:93;13634:3;13545:93;:::i;:::-;13663:2;13658:3;13654:12;13647:19;;13306:366;;;:::o;13678:::-;13820:3;13841:67;13905:2;13900:3;13841:67;:::i;:::-;13834:74;;13917:93;14006:3;13917:93;:::i;:::-;14035:2;14030:3;14026:12;14019:19;;13678:366;;;:::o;14050:::-;14192:3;14213:67;14277:2;14272:3;14213:67;:::i;:::-;14206:74;;14289:93;14378:3;14289:93;:::i;:::-;14407:2;14402:3;14398:12;14391:19;;14050:366;;;:::o;14422:::-;14564:3;14585:67;14649:2;14644:3;14585:67;:::i;:::-;14578:74;;14661:93;14750:3;14661:93;:::i;:::-;14779:2;14774:3;14770:12;14763:19;;14422:366;;;:::o;14794:::-;14936:3;14957:67;15021:2;15016:3;14957:67;:::i;:::-;14950:74;;15033:93;15122:3;15033:93;:::i;:::-;15151:2;15146:3;15142:12;15135:19;;14794:366;;;:::o;15166:::-;15308:3;15329:67;15393:2;15388:3;15329:67;:::i;:::-;15322:74;;15405:93;15494:3;15405:93;:::i;:::-;15523:2;15518:3;15514:12;15507:19;;15166:366;;;:::o;15538:::-;15680:3;15701:67;15765:2;15760:3;15701:67;:::i;:::-;15694:74;;15777:93;15866:3;15777:93;:::i;:::-;15895:2;15890:3;15886:12;15879:19;;15538:366;;;:::o;15910:::-;16052:3;16073:67;16137:2;16132:3;16073:67;:::i;:::-;16066:74;;16149:93;16238:3;16149:93;:::i;:::-;16267:2;16262:3;16258:12;16251:19;;15910:366;;;:::o;16282:::-;16424:3;16445:67;16509:2;16504:3;16445:67;:::i;:::-;16438:74;;16521:93;16610:3;16521:93;:::i;:::-;16639:2;16634:3;16630:12;16623:19;;16282:366;;;:::o;16654:::-;16796:3;16817:67;16881:2;16876:3;16817:67;:::i;:::-;16810:74;;16893:93;16982:3;16893:93;:::i;:::-;17011:2;17006:3;17002:12;16995:19;;16654:366;;;:::o;17026:::-;17168:3;17189:67;17253:2;17248:3;17189:67;:::i;:::-;17182:74;;17265:93;17354:3;17265:93;:::i;:::-;17383:2;17378:3;17374:12;17367:19;;17026:366;;;:::o;17398:::-;17540:3;17561:67;17625:2;17620:3;17561:67;:::i;:::-;17554:74;;17637:93;17726:3;17637:93;:::i;:::-;17755:2;17750:3;17746:12;17739:19;;17398:366;;;:::o;17770:::-;17912:3;17933:67;17997:2;17992:3;17933:67;:::i;:::-;17926:74;;18009:93;18098:3;18009:93;:::i;:::-;18127:2;18122:3;18118:12;18111:19;;17770:366;;;:::o;18142:::-;18284:3;18305:67;18369:2;18364:3;18305:67;:::i;:::-;18298:74;;18381:93;18470:3;18381:93;:::i;:::-;18499:2;18494:3;18490:12;18483:19;;18142:366;;;:::o;18514:::-;18656:3;18677:67;18741:2;18736:3;18677:67;:::i;:::-;18670:74;;18753:93;18842:3;18753:93;:::i;:::-;18871:2;18866:3;18862:12;18855:19;;18514:366;;;:::o;18886:118::-;18973:24;18991:5;18973:24;:::i;:::-;18968:3;18961:37;18886:118;;:::o;19010:429::-;19187:3;19209:92;19297:3;19288:6;19209:92;:::i;:::-;19202:99;;19318:95;19409:3;19400:6;19318:95;:::i;:::-;19311:102;;19430:3;19423:10;;19010:429;;;;;:::o;19445:222::-;19538:4;19576:2;19565:9;19561:18;19553:26;;19589:71;19657:1;19646:9;19642:17;19633:6;19589:71;:::i;:::-;19445:222;;;;:::o;19673:640::-;19868:4;19906:3;19895:9;19891:19;19883:27;;19920:71;19988:1;19977:9;19973:17;19964:6;19920:71;:::i;:::-;20001:72;20069:2;20058:9;20054:18;20045:6;20001:72;:::i;:::-;20083;20151:2;20140:9;20136:18;20127:6;20083:72;:::i;:::-;20202:9;20196:4;20192:20;20187:2;20176:9;20172:18;20165:48;20230:76;20301:4;20292:6;20230:76;:::i;:::-;20222:84;;19673:640;;;;;;;:::o;20319:210::-;20406:4;20444:2;20433:9;20429:18;20421:26;;20457:65;20519:1;20508:9;20504:17;20495:6;20457:65;:::i;:::-;20319:210;;;;:::o;20535:313::-;20648:4;20686:2;20675:9;20671:18;20663:26;;20735:9;20729:4;20725:20;20721:1;20710:9;20706:17;20699:47;20763:78;20836:4;20827:6;20763:78;:::i;:::-;20755:86;;20535:313;;;;:::o;20854:419::-;21020:4;21058:2;21047:9;21043:18;21035:26;;21107:9;21101:4;21097:20;21093:1;21082:9;21078:17;21071:47;21135:131;21261:4;21135:131;:::i;:::-;21127:139;;20854:419;;;:::o;21279:::-;21445:4;21483:2;21472:9;21468:18;21460:26;;21532:9;21526:4;21522:20;21518:1;21507:9;21503:17;21496:47;21560:131;21686:4;21560:131;:::i;:::-;21552:139;;21279:419;;;:::o;21704:::-;21870:4;21908:2;21897:9;21893:18;21885:26;;21957:9;21951:4;21947:20;21943:1;21932:9;21928:17;21921:47;21985:131;22111:4;21985:131;:::i;:::-;21977:139;;21704:419;;;:::o;22129:::-;22295:4;22333:2;22322:9;22318:18;22310:26;;22382:9;22376:4;22372:20;22368:1;22357:9;22353:17;22346:47;22410:131;22536:4;22410:131;:::i;:::-;22402:139;;22129:419;;;:::o;22554:::-;22720:4;22758:2;22747:9;22743:18;22735:26;;22807:9;22801:4;22797:20;22793:1;22782:9;22778:17;22771:47;22835:131;22961:4;22835:131;:::i;:::-;22827:139;;22554:419;;;:::o;22979:::-;23145:4;23183:2;23172:9;23168:18;23160:26;;23232:9;23226:4;23222:20;23218:1;23207:9;23203:17;23196:47;23260:131;23386:4;23260:131;:::i;:::-;23252:139;;22979:419;;;:::o;23404:::-;23570:4;23608:2;23597:9;23593:18;23585:26;;23657:9;23651:4;23647:20;23643:1;23632:9;23628:17;23621:47;23685:131;23811:4;23685:131;:::i;:::-;23677:139;;23404:419;;;:::o;23829:::-;23995:4;24033:2;24022:9;24018:18;24010:26;;24082:9;24076:4;24072:20;24068:1;24057:9;24053:17;24046:47;24110:131;24236:4;24110:131;:::i;:::-;24102:139;;23829:419;;;:::o;24254:::-;24420:4;24458:2;24447:9;24443:18;24435:26;;24507:9;24501:4;24497:20;24493:1;24482:9;24478:17;24471:47;24535:131;24661:4;24535:131;:::i;:::-;24527:139;;24254:419;;;:::o;24679:::-;24845:4;24883:2;24872:9;24868:18;24860:26;;24932:9;24926:4;24922:20;24918:1;24907:9;24903:17;24896:47;24960:131;25086:4;24960:131;:::i;:::-;24952:139;;24679:419;;;:::o;25104:::-;25270:4;25308:2;25297:9;25293:18;25285:26;;25357:9;25351:4;25347:20;25343:1;25332:9;25328:17;25321:47;25385:131;25511:4;25385:131;:::i;:::-;25377:139;;25104:419;;;:::o;25529:::-;25695:4;25733:2;25722:9;25718:18;25710:26;;25782:9;25776:4;25772:20;25768:1;25757:9;25753:17;25746:47;25810:131;25936:4;25810:131;:::i;:::-;25802:139;;25529:419;;;:::o;25954:::-;26120:4;26158:2;26147:9;26143:18;26135:26;;26207:9;26201:4;26197:20;26193:1;26182:9;26178:17;26171:47;26235:131;26361:4;26235:131;:::i;:::-;26227:139;;25954:419;;;:::o;26379:::-;26545:4;26583:2;26572:9;26568:18;26560:26;;26632:9;26626:4;26622:20;26618:1;26607:9;26603:17;26596:47;26660:131;26786:4;26660:131;:::i;:::-;26652:139;;26379:419;;;:::o;26804:::-;26970:4;27008:2;26997:9;26993:18;26985:26;;27057:9;27051:4;27047:20;27043:1;27032:9;27028:17;27021:47;27085:131;27211:4;27085:131;:::i;:::-;27077:139;;26804:419;;;:::o;27229:::-;27395:4;27433:2;27422:9;27418:18;27410:26;;27482:9;27476:4;27472:20;27468:1;27457:9;27453:17;27446:47;27510:131;27636:4;27510:131;:::i;:::-;27502:139;;27229:419;;;:::o;27654:::-;27820:4;27858:2;27847:9;27843:18;27835:26;;27907:9;27901:4;27897:20;27893:1;27882:9;27878:17;27871:47;27935:131;28061:4;27935:131;:::i;:::-;27927:139;;27654:419;;;:::o;28079:::-;28245:4;28283:2;28272:9;28268:18;28260:26;;28332:9;28326:4;28322:20;28318:1;28307:9;28303:17;28296:47;28360:131;28486:4;28360:131;:::i;:::-;28352:139;;28079:419;;;:::o;28504:::-;28670:4;28708:2;28697:9;28693:18;28685:26;;28757:9;28751:4;28747:20;28743:1;28732:9;28728:17;28721:47;28785:131;28911:4;28785:131;:::i;:::-;28777:139;;28504:419;;;:::o;28929:::-;29095:4;29133:2;29122:9;29118:18;29110:26;;29182:9;29176:4;29172:20;29168:1;29157:9;29153:17;29146:47;29210:131;29336:4;29210:131;:::i;:::-;29202:139;;28929:419;;;:::o;29354:::-;29520:4;29558:2;29547:9;29543:18;29535:26;;29607:9;29601:4;29597:20;29593:1;29582:9;29578:17;29571:47;29635:131;29761:4;29635:131;:::i;:::-;29627:139;;29354:419;;;:::o;29779:222::-;29872:4;29910:2;29899:9;29895:18;29887:26;;29923:71;29991:1;29980:9;29976:17;29967:6;29923:71;:::i;:::-;29779:222;;;;:::o;30007:129::-;30041:6;30068:20;;:::i;:::-;30058:30;;30097:33;30125:4;30117:6;30097:33;:::i;:::-;30007:129;;;:::o;30142:75::-;30175:6;30208:2;30202:9;30192:19;;30142:75;:::o;30223:311::-;30300:4;30390:18;30382:6;30379:30;30376:56;;;30412:18;;:::i;:::-;30376:56;30462:4;30454:6;30450:17;30442:25;;30522:4;30516;30512:15;30504:23;;30223:311;;;:::o;30540:307::-;30601:4;30691:18;30683:6;30680:30;30677:56;;;30713:18;;:::i;:::-;30677:56;30751:29;30773:6;30751:29;:::i;:::-;30743:37;;30835:4;30829;30825:15;30817:23;;30540:307;;;:::o;30853:308::-;30915:4;31005:18;30997:6;30994:30;30991:56;;;31027:18;;:::i;:::-;30991:56;31065:29;31087:6;31065:29;:::i;:::-;31057:37;;31149:4;31143;31139:15;31131:23;;30853:308;;;:::o;31167:141::-;31216:4;31239:3;31231:11;;31262:3;31259:1;31252:14;31296:4;31293:1;31283:18;31275:26;;31167:141;;;:::o;31314:98::-;31365:6;31399:5;31393:12;31383:22;;31314:98;;;:::o;31418:99::-;31470:6;31504:5;31498:12;31488:22;;31418:99;;;:::o;31523:168::-;31606:11;31640:6;31635:3;31628:19;31680:4;31675:3;31671:14;31656:29;;31523:168;;;;:::o;31697:169::-;31781:11;31815:6;31810:3;31803:19;31855:4;31850:3;31846:14;31831:29;;31697:169;;;;:::o;31872:148::-;31974:11;32011:3;31996:18;;31872:148;;;;:::o;32026:305::-;32066:3;32085:20;32103:1;32085:20;:::i;:::-;32080:25;;32119:20;32137:1;32119:20;:::i;:::-;32114:25;;32273:1;32205:66;32201:74;32198:1;32195:81;32192:107;;;32279:18;;:::i;:::-;32192:107;32323:1;32320;32316:9;32309:16;;32026:305;;;;:::o;32337:185::-;32377:1;32394:20;32412:1;32394:20;:::i;:::-;32389:25;;32428:20;32446:1;32428:20;:::i;:::-;32423:25;;32467:1;32457:35;;32472:18;;:::i;:::-;32457:35;32514:1;32511;32507:9;32502:14;;32337:185;;;;:::o;32528:348::-;32568:7;32591:20;32609:1;32591:20;:::i;:::-;32586:25;;32625:20;32643:1;32625:20;:::i;:::-;32620:25;;32813:1;32745:66;32741:74;32738:1;32735:81;32730:1;32723:9;32716:17;32712:105;32709:131;;;32820:18;;:::i;:::-;32709:131;32868:1;32865;32861:9;32850:20;;32528:348;;;;:::o;32882:191::-;32922:4;32942:20;32960:1;32942:20;:::i;:::-;32937:25;;32976:20;32994:1;32976:20;:::i;:::-;32971:25;;33015:1;33012;33009:8;33006:34;;;33020:18;;:::i;:::-;33006:34;33065:1;33062;33058:9;33050:17;;32882:191;;;;:::o;33079:96::-;33116:7;33145:24;33163:5;33145:24;:::i;:::-;33134:35;;33079:96;;;:::o;33181:90::-;33215:7;33258:5;33251:13;33244:21;33233:32;;33181:90;;;:::o;33277:149::-;33313:7;33353:66;33346:5;33342:78;33331:89;;33277:149;;;:::o;33432:126::-;33469:7;33509:42;33502:5;33498:54;33487:65;;33432:126;;;:::o;33564:77::-;33601:7;33630:5;33619:16;;33564:77;;;:::o;33647:154::-;33731:6;33726:3;33721;33708:30;33793:1;33784:6;33779:3;33775:16;33768:27;33647:154;;;:::o;33807:307::-;33875:1;33885:113;33899:6;33896:1;33893:13;33885:113;;;33984:1;33979:3;33975:11;33969:18;33965:1;33960:3;33956:11;33949:39;33921:2;33918:1;33914:10;33909:15;;33885:113;;;34016:6;34013:1;34010:13;34007:101;;;34096:1;34087:6;34082:3;34078:16;34071:27;34007:101;33856:258;33807:307;;;:::o;34120:171::-;34159:3;34182:24;34200:5;34182:24;:::i;:::-;34173:33;;34228:4;34221:5;34218:15;34215:41;;;34236:18;;:::i;:::-;34215:41;34283:1;34276:5;34272:13;34265:20;;34120:171;;;:::o;34297:320::-;34341:6;34378:1;34372:4;34368:12;34358:22;;34425:1;34419:4;34415:12;34446:18;34436:81;;34502:4;34494:6;34490:17;34480:27;;34436:81;34564:2;34556:6;34553:14;34533:18;34530:38;34527:84;;;34583:18;;:::i;:::-;34527:84;34348:269;34297:320;;;:::o;34623:281::-;34706:27;34728:4;34706:27;:::i;:::-;34698:6;34694:40;34836:6;34824:10;34821:22;34800:18;34788:10;34785:34;34782:62;34779:88;;;34847:18;;:::i;:::-;34779:88;34887:10;34883:2;34876:22;34666:238;34623:281;;:::o;34910:233::-;34949:3;34972:24;34990:5;34972:24;:::i;:::-;34963:33;;35018:66;35011:5;35008:77;35005:103;;;35088:18;;:::i;:::-;35005:103;35135:1;35128:5;35124:13;35117:20;;34910:233;;;:::o;35149:176::-;35181:1;35198:20;35216:1;35198:20;:::i;:::-;35193:25;;35232:20;35250:1;35232:20;:::i;:::-;35227:25;;35271:1;35261:35;;35276:18;;:::i;:::-;35261:35;35317:1;35314;35310:9;35305:14;;35149:176;;;;:::o;35331:180::-;35379:77;35376:1;35369:88;35476:4;35473:1;35466:15;35500:4;35497:1;35490:15;35517:180;35565:77;35562:1;35555:88;35662:4;35659:1;35652:15;35686:4;35683:1;35676:15;35703:180;35751:77;35748:1;35741:88;35848:4;35845:1;35838:15;35872:4;35869:1;35862:15;35889:180;35937:77;35934:1;35927:88;36034:4;36031:1;36024:15;36058:4;36055:1;36048:15;36075:180;36123:77;36120:1;36113:88;36220:4;36217:1;36210:15;36244:4;36241:1;36234:15;36261:117;36370:1;36367;36360:12;36384:117;36493:1;36490;36483:12;36507:117;36616:1;36613;36606:12;36630:117;36739:1;36736;36729:12;36753:117;36862:1;36859;36852:12;36876:102;36917:6;36968:2;36964:7;36959:2;36952:5;36948:14;36944:28;36934:38;;36876:102;;;:::o;36984:231::-;37124:34;37120:1;37112:6;37108:14;37101:58;37193:14;37188:2;37180:6;37176:15;37169:39;36984:231;:::o;37221:237::-;37361:34;37357:1;37349:6;37345:14;37338:58;37430:20;37425:2;37417:6;37413:15;37406:45;37221:237;:::o;37464:225::-;37604:34;37600:1;37592:6;37588:14;37581:58;37673:8;37668:2;37660:6;37656:15;37649:33;37464:225;:::o;37695:178::-;37835:30;37831:1;37823:6;37819:14;37812:54;37695:178;:::o;37879:223::-;38019:34;38015:1;38007:6;38003:14;37996:58;38088:6;38083:2;38075:6;38071:15;38064:31;37879:223;:::o;38108:175::-;38248:27;38244:1;38236:6;38232:14;38225:51;38108:175;:::o;38289:177::-;38429:29;38425:1;38417:6;38413:14;38406:53;38289:177;:::o;38472:231::-;38612:34;38608:1;38600:6;38596:14;38589:58;38681:14;38676:2;38668:6;38664:15;38657:39;38472:231;:::o;38709:243::-;38849:34;38845:1;38837:6;38833:14;38826:58;38918:26;38913:2;38905:6;38901:15;38894:51;38709:243;:::o;38958:229::-;39098:34;39094:1;39086:6;39082:14;39075:58;39167:12;39162:2;39154:6;39150:15;39143:37;38958:229;:::o;39193:228::-;39333:34;39329:1;39321:6;39317:14;39310:58;39402:11;39397:2;39389:6;39385:15;39378:36;39193:228;:::o;39427:182::-;39567:34;39563:1;39555:6;39551:14;39544:58;39427:182;:::o;39615:231::-;39755:34;39751:1;39743:6;39739:14;39732:58;39824:14;39819:2;39811:6;39807:15;39800:39;39615:231;:::o;39852:182::-;39992:34;39988:1;39980:6;39976:14;39969:58;39852:182;:::o;40040:228::-;40180:34;40176:1;40168:6;40164:14;40157:58;40249:11;40244:2;40236:6;40232:15;40225:36;40040:228;:::o;40274:180::-;40414:32;40410:1;40402:6;40398:14;40391:56;40274:180;:::o;40460:220::-;40600:34;40596:1;40588:6;40584:14;40577:58;40669:3;40664:2;40656:6;40652:15;40645:28;40460:220;:::o;40686:176::-;40826:28;40822:1;40814:6;40810:14;40803:52;40686:176;:::o;40868:236::-;41008:34;41004:1;40996:6;40992:14;40985:58;41077:19;41072:2;41064:6;41060:15;41053:44;40868:236;:::o;41110:176::-;41250:28;41246:1;41238:6;41234:14;41227:52;41110:176;:::o;41292:179::-;41432:31;41428:1;41420:6;41416:14;41409:55;41292:179;:::o;41477:122::-;41550:24;41568:5;41550:24;:::i;:::-;41543:5;41540:35;41530:63;;41589:1;41586;41579:12;41530:63;41477:122;:::o;41605:116::-;41675:21;41690:5;41675:21;:::i;:::-;41668:5;41665:32;41655:60;;41711:1;41708;41701:12;41655:60;41605:116;:::o;41727:120::-;41799:23;41816:5;41799:23;:::i;:::-;41792:5;41789:34;41779:62;;41837:1;41834;41827:12;41779:62;41727:120;:::o;41853:122::-;41926:24;41944:5;41926:24;:::i;:::-;41919:5;41916:35;41906:63;;41965:1;41962;41955:12;41906:63;41853:122;:::o

Swarm Source

ipfs://7024aefb3def984748969cc3d3cbcd6842e693e87bd5d22a8ef497f46b38d75a
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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