ETH Price: $3,232.45 (-3.67%)

Token

Spookle (Spookle)
 

Overview

Max Total Supply

0 Spookle

Holders

225

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 Spookle
0xbfcE231A2BcC016b6fB23FDc934ef5530B2A115e
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
Spookle

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-12-08
*/

// File: @openzeppelin/contracts/utils/Counters.sol


// OpenZeppelin Contracts v4.4.0 (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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/cryptography/MerkleProof.sol


// OpenZeppelin Contracts v4.4.0 (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Trees proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merklee tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            bytes32 proofElement = proof[i];
            if (computedHash <= proofElement) {
                // Hash(current computed hash + current element of the proof)
                computedHash = keccak256(abi.encodePacked(computedHash, proofElement));
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = keccak256(abi.encodePacked(proofElement, computedHash));
            }
        }
        return computedHash;
    }
}

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Strings.sol


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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Context.sol


// 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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol


// OpenZeppelin Contracts v4.4.0 (access/Ownable.sol)

pragma solidity ^0.8.0;


/**
 * @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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Address.sol


// 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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/IERC721Receiver.sol


// 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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/introspection/IERC165.sol


// 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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/introspection/ERC165.sol


// OpenZeppelin Contracts v4.4.0 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;


/**
 * @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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/IERC721.sol


// OpenZeppelin Contracts v4.4.0 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;


/**
 * @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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/extensions/IERC721Metadata.sol


// OpenZeppelin Contracts v4.4.0 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;


/**
 * @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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/ERC721.sol


// OpenZeppelin Contracts v4.4.0 (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;








/**
 * @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: Spookle.sol


pragma solidity ^0.8.0;





contract Spookle is ERC721, Ownable {

    using Counters for Counters.Counter;
    Counters.Counter private _tokenIds;

    // Constants
    bool public enforceWhitelist = true;
    string metadataBaseURI = "https://spookles.app/metadata/";
    bytes32 public merkleRootWhitelist = 0x7ccfef91b45785b1b368558f3a867e914b0789fde1220e9a4d8c5809a8376277;
    bytes32 public merkleRootFreeMint = 0xb456d3aedc78bd37368777a5ff7dfd1f42927e32cafba7a58ebd75320633cc3d;
    mapping(address => bool) hasAddressMinted;
    uint256 mintPrice = 0.09 * 10**18;

    constructor() ERC721("Spookle", "Spookle") {}


    // Base ERC721 Overrides
    function _baseURI() internal view override returns (string memory) {
        return metadataBaseURI;
    }

    function tokenURI(uint256 tokenId) public view override(ERC721) returns (string memory) {
        return super.tokenURI(tokenId);
    }

    function setNewMerkleRootWhitelist(bytes32 newMerkleRoot) external onlyOwner {
        merkleRootWhitelist = newMerkleRoot;
    }

    function switchEnforceWhitelist() external onlyOwner {
        enforceWhitelist = !enforceWhitelist;
    }

    function setNewMetadataBaseURI(string memory _newMetadataURI) external onlyOwner {
        metadataBaseURI = _newMetadataURI;
    }

    function remainingToMint() external view returns (uint256) {
        return (300 - _tokenIds.current());
    }

    function setNewMerkleRootFreeMint(bytes32 newMerkleRoot) external onlyOwner {
        merkleRootFreeMint = newMerkleRoot;
    }

    function setNewMintPrice(uint256 newMintPriceInWei) external onlyOwner {
        mintPrice = newMintPriceInWei;
    }

    function hasAlreadyMinted(address queryAddress) external view returns (bool) {
        return hasAddressMinted[queryAddress];
    }

    function checkIfIsWhitelisted(bytes32[] calldata _merkleProof) internal view returns (bool) {
      bytes32 leaf = keccak256(abi.encodePacked(msg.sender));
      require(MerkleProof.verify(_merkleProof, merkleRootWhitelist, leaf), "Invalid Merkle Proof: address not whitelisted");
      return true;
    }

    function checkIfIsFreeMintEligible(bytes32[] calldata _merkleProof) internal view returns (bool) {
      bytes32 leaf = keccak256(abi.encodePacked(msg.sender));
      require(MerkleProof.verify(_merkleProof, merkleRootFreeMint, leaf), "Invalid Merkle Proof: address not eligible for free minting");
      return true;
    }

    // Mint functions
    function paidMint(bytes32[] calldata _merkleProof) payable external {
        require(_tokenIds.current() <= 300, "All tokens have been minted");
        require(msg.value >= mintPrice, "You haven't sent enough ETH to mint");
        require(hasAddressMinted[msg.sender] == false, "This address has already minted");
        if(enforceWhitelist) checkIfIsWhitelisted(_merkleProof);
        _tokenIds.increment();
        uint256 newItemId = _tokenIds.current();
        _safeMint(msg.sender, newItemId, "");
        hasAddressMinted[msg.sender] = true;        
    }

    function freeMint(bytes32[] calldata _merkleProofWhitelist, bytes32[] calldata _merkleProofFreeMint) external {
        require(_tokenIds.current() <= 300, "All tokens have been minted");
        require(hasAddressMinted[msg.sender] == false, "This address has already minted");
         if(enforceWhitelist) checkIfIsWhitelisted(_merkleProofWhitelist);
        checkIfIsFreeMintEligible(_merkleProofFreeMint);
        _tokenIds.increment();
        uint256 newItemId = _tokenIds.current();
        _safeMint(msg.sender, newItemId, "");    
        hasAddressMinted[msg.sender] = true;    
    }

    function withdrawRevenue(address payable destinationWallet) payable external onlyOwner {
        (bool sent, bytes memory data) = destinationWallet.call{value: address(this).balance}("");
        require(sent, "Failed to send Ether");
    }


}

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":[],"name":"enforceWhitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_merkleProofWhitelist","type":"bytes32[]"},{"internalType":"bytes32[]","name":"_merkleProofFreeMint","type":"bytes32[]"}],"name":"freeMint","outputs":[],"stateMutability":"nonpayable","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":"queryAddress","type":"address"}],"name":"hasAlreadyMinted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"merkleRootFreeMint","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRootWhitelist","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"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":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"paidMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"remainingToMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"newMerkleRoot","type":"bytes32"}],"name":"setNewMerkleRootFreeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"newMerkleRoot","type":"bytes32"}],"name":"setNewMerkleRootWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newMetadataURI","type":"string"}],"name":"setNewMetadataBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMintPriceInWei","type":"uint256"}],"name":"setNewMintPrice","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":"switchEnforceWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","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 payable","name":"destinationWallet","type":"address"}],"name":"withdrawRevenue","outputs":[],"stateMutability":"payable","type":"function"}]

60806040526001600860006101000a81548160ff0219169083151502179055506040518060400160405280601e81526020017f68747470733a2f2f73706f6f6b6c65732e6170702f6d657461646174612f0000815250600990805190602001906200006c92919062000269565b507f7ccfef91b45785b1b368558f3a867e914b0789fde1220e9a4d8c5809a837627760001b600a557fb456d3aedc78bd37368777a5ff7dfd1f42927e32cafba7a58ebd75320633cc3d60001b600b5567013fbe85edc90000600d55348015620000d457600080fd5b506040518060400160405280600781526020017f53706f6f6b6c65000000000000000000000000000000000000000000000000008152506040518060400160405280600781526020017f53706f6f6b6c650000000000000000000000000000000000000000000000000081525081600090805190602001906200015992919062000269565b5080600190805190602001906200017292919062000269565b50505062000195620001896200019b60201b60201c565b620001a360201b60201c565b6200037e565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620002779062000319565b90600052602060002090601f0160209004810192826200029b5760008555620002e7565b82601f10620002b657805160ff1916838001178555620002e7565b82800160010185558215620002e7579182015b82811115620002e6578251825591602001919060010190620002c9565b5b509050620002f69190620002fa565b5090565b5b8082111562000315576000816000905550600101620002fb565b5090565b600060028204905060018216806200033257607f821691505b602082108114156200034957620003486200034f565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b613f76806200038e6000396000f3fe6080604052600436106101c15760003560e01c8063715018a6116100f7578063b095721011610095578063c87b56dd11610064578063c87b56dd146105f9578063e985e9c514610636578063f2fde38b14610673578063fa6e85831461069c576101c1565b8063b095721014610565578063b88d4fde14610590578063bedc25f8146105b9578063bfa0e6de146105d0576101c1565b80638f97ae8a116100d15780638f97ae8a146104bf57806395d89b41146104e85780639dfcc3f614610513578063a22cb4651461053c576101c1565b8063715018a6146104525780638da5cb5b146104695780638e1f9cfe14610494576101c1565b806323b872dd1161016457806342842e0e1161013e57806342842e0e146103935780635e420f4c146103bc5780636352211e146103d857806370a0823114610415576101c1565b806323b872dd146103045780632db9b8471461032d5780633194ccf914610356576101c1565b8063081812fc116101a0578063081812fc1461024a578063095ea7b314610287578063195f2f14146102b05780631f7af569146102db576101c1565b8062295117146101c657806301ffc9a7146101e257806306fdde031461021f575b600080fd5b6101e060048036038101906101db9190612bfc565b6106c7565b005b3480156101ee57600080fd5b5061020960048036038101906102049190612cdf565b61089d565b6040516102169190613763565b60405180910390f35b34801561022b57600080fd5b5061023461097f565b6040516102419190613799565b60405180910390f35b34801561025657600080fd5b50610271600480360381019061026c9190612d72565b610a11565b60405161027e91906136fc565b60405180910390f35b34801561029357600080fd5b506102ae60048036038101906102a99190612bc0565b610a96565b005b3480156102bc57600080fd5b506102c5610bae565b6040516102d2919061377e565b60405180910390f35b3480156102e757600080fd5b5061030260048036038101906102fd9190612d31565b610bb4565b005b34801561031057600080fd5b5061032b60048036038101906103269190612aba565b610c4a565b005b34801561033957600080fd5b50610354600480360381019061034f9190612cb6565b610caa565b005b34801561036257600080fd5b5061037d60048036038101906103789190612a2c565b610d30565b60405161038a9190613763565b60405180910390f35b34801561039f57600080fd5b506103ba60048036038101906103b59190612aba565b610d86565b005b6103d660048036038101906103d19190612a55565b610da6565b005b3480156103e457600080fd5b506103ff60048036038101906103fa9190612d72565b610ed5565b60405161040c91906136fc565b60405180910390f35b34801561042157600080fd5b5061043c60048036038101906104379190612a2c565b610f87565b6040516104499190613a7b565b60405180910390f35b34801561045e57600080fd5b5061046761103f565b005b34801561047557600080fd5b5061047e6110c7565b60405161048b91906136fc565b60405180910390f35b3480156104a057600080fd5b506104a96110f1565b6040516104b6919061377e565b60405180910390f35b3480156104cb57600080fd5b506104e660048036038101906104e19190612c41565b6110f7565b005b3480156104f457600080fd5b506104fd611295565b60405161050a9190613799565b60405180910390f35b34801561051f57600080fd5b5061053a60048036038101906105359190612cb6565b611327565b005b34801561054857600080fd5b50610563600480360381019061055e9190612b84565b6113ad565b005b34801561057157600080fd5b5061057a6113c3565b6040516105879190613763565b60405180910390f35b34801561059c57600080fd5b506105b760048036038101906105b29190612b09565b6113d6565b005b3480156105c557600080fd5b506105ce611438565b005b3480156105dc57600080fd5b506105f760048036038101906105f29190612d72565b6114e0565b005b34801561060557600080fd5b50610620600480360381019061061b9190612d72565b611566565b60405161062d9190613799565b60405180910390f35b34801561064257600080fd5b5061065d60048036038101906106589190612a7e565b611578565b60405161066a9190613763565b60405180910390f35b34801561067f57600080fd5b5061069a60048036038101906106959190612a2c565b61160c565b005b3480156106a857600080fd5b506106b1611704565b6040516106be9190613a7b565b60405180910390f35b61012c6106d46007611722565b1115610715576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070c90613a3b565b60405180910390fd5b600d5434101561075a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107519061397b565b60405180910390fd5b60001515600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515146107ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107e490613a5b565b60405180910390fd5b600860009054906101000a900460ff161561080e5761080c8282611730565b505b61081860076117f4565b60006108246007611722565b905061084033826040518060200160405280600081525061180a565b6001600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061096857507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610978575061097782611865565b5b9050919050565b60606000805461098e90613d02565b80601f01602080910402602001604051908101604052809291908181526020018280546109ba90613d02565b8015610a075780601f106109dc57610100808354040283529160200191610a07565b820191906000526020600020905b8154815290600101906020018083116109ea57829003601f168201915b5050505050905090565b6000610a1c826118cf565b610a5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a529061393b565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610aa182610ed5565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b09906139db565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b3161193b565b73ffffffffffffffffffffffffffffffffffffffff161480610b605750610b5f81610b5a61193b565b611578565b5b610b9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b96906138bb565b60405180910390fd5b610ba98383611943565b505050565b600b5481565b610bbc61193b565b73ffffffffffffffffffffffffffffffffffffffff16610bda6110c7565b73ffffffffffffffffffffffffffffffffffffffff1614610c30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c279061395b565b60405180910390fd5b8060099080519060200190610c469291906127dc565b5050565b610c5b610c5561193b565b826119fc565b610c9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c91906139fb565b60405180910390fd5b610ca5838383611ada565b505050565b610cb261193b565b73ffffffffffffffffffffffffffffffffffffffff16610cd06110c7565b73ffffffffffffffffffffffffffffffffffffffff1614610d26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1d9061395b565b60405180910390fd5b80600a8190555050565b6000600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b610da1838383604051806020016040528060008152506113d6565b505050565b610dae61193b565b73ffffffffffffffffffffffffffffffffffffffff16610dcc6110c7565b73ffffffffffffffffffffffffffffffffffffffff1614610e22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e199061395b565b60405180910390fd5b6000808273ffffffffffffffffffffffffffffffffffffffff1647604051610e49906136e7565b60006040518083038185875af1925050503d8060008114610e86576040519150601f19603f3d011682016040523d82523d6000602084013e610e8b565b606091505b509150915081610ed0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec79061383b565b60405180910390fd5b505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610f7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f75906138fb565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610ff8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fef906138db565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61104761193b565b73ffffffffffffffffffffffffffffffffffffffff166110656110c7565b73ffffffffffffffffffffffffffffffffffffffff16146110bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b29061395b565b60405180910390fd5b6110c56000611d36565b565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600a5481565b61012c6111046007611722565b1115611145576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113c90613a3b565b60405180910390fd5b60001515600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515146111d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111cf90613a5b565b60405180910390fd5b600860009054906101000a900460ff16156111f9576111f78484611730565b505b6112038282611dfc565b5061120e60076117f4565b600061121a6007611722565b905061123633826040518060200160405280600081525061180a565b6001600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050505050565b6060600180546112a490613d02565b80601f01602080910402602001604051908101604052809291908181526020018280546112d090613d02565b801561131d5780601f106112f25761010080835404028352916020019161131d565b820191906000526020600020905b81548152906001019060200180831161130057829003601f168201915b5050505050905090565b61132f61193b565b73ffffffffffffffffffffffffffffffffffffffff1661134d6110c7565b73ffffffffffffffffffffffffffffffffffffffff16146113a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139a9061395b565b60405180910390fd5b80600b8190555050565b6113bf6113b861193b565b8383611ec0565b5050565b600860009054906101000a900460ff1681565b6113e76113e161193b565b836119fc565b611426576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141d906139fb565b60405180910390fd5b6114328484848461202d565b50505050565b61144061193b565b73ffffffffffffffffffffffffffffffffffffffff1661145e6110c7565b73ffffffffffffffffffffffffffffffffffffffff16146114b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ab9061395b565b60405180910390fd5b600860009054906101000a900460ff1615600860006101000a81548160ff021916908315150217905550565b6114e861193b565b73ffffffffffffffffffffffffffffffffffffffff166115066110c7565b73ffffffffffffffffffffffffffffffffffffffff161461155c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115539061395b565b60405180910390fd5b80600d8190555050565b606061157182612089565b9050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61161461193b565b73ffffffffffffffffffffffffffffffffffffffff166116326110c7565b73ffffffffffffffffffffffffffffffffffffffff1614611688576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167f9061395b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156116f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ef906137fb565b60405180910390fd5b61170181611d36565b50565b60006117106007611722565b61012c61171d9190613bfc565b905090565b600081600001549050919050565b60008033604051602001611744919061367c565b6040516020818303038152906040528051906020012090506117aa848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600a5483612130565b6117e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e090613a1b565b60405180910390fd5b600191505092915050565b6001816000016000828254019250508190555050565b6118148383612147565b6118216000848484612315565b611860576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611857906137db565b60405180910390fd5b505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166119b683610ed5565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611a07826118cf565b611a46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3d9061389b565b60405180910390fd5b6000611a5183610ed5565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611ac057508373ffffffffffffffffffffffffffffffffffffffff16611aa884610a11565b73ffffffffffffffffffffffffffffffffffffffff16145b80611ad15750611ad08185611578565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611afa82610ed5565b73ffffffffffffffffffffffffffffffffffffffff1614611b50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b479061399b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611bc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb79061385b565b60405180910390fd5b611bcb8383836124ac565b611bd6600082611943565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611c269190613bfc565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611c7d9190613b75565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008033604051602001611e10919061367c565b604051602081830303815290604052805190602001209050611e76848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600b5483612130565b611eb5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eac906137bb565b60405180910390fd5b600191505092915050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611f2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f269061387b565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516120209190613763565b60405180910390a3505050565b612038848484611ada565b61204484848484612315565b612083576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161207a906137db565b60405180910390fd5b50505050565b6060612094826118cf565b6120d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ca906139bb565b60405180910390fd5b60006120dd6124b1565b905060008151116120fd5760405180602001604052806000815250612128565b8061210784612543565b6040516020016121189291906136c3565b6040516020818303038152906040525b915050919050565b60008261213d85846126f0565b1490509392505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156121b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121ae9061391b565b60405180910390fd5b6121c0816118cf565b15612200576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121f79061381b565b60405180910390fd5b61220c600083836124ac565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461225c9190613b75565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b60006123368473ffffffffffffffffffffffffffffffffffffffff166127c9565b1561249f578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261235f61193b565b8786866040518563ffffffff1660e01b81526004016123819493929190613717565b602060405180830381600087803b15801561239b57600080fd5b505af19250505080156123cc57506040513d601f19601f820116820180604052508101906123c99190612d08565b60015b61244f573d80600081146123fc576040519150601f19603f3d011682016040523d82523d6000602084013e612401565b606091505b50600081511415612447576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161243e906137db565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506124a4565b600190505b949350505050565b505050565b6060600980546124c090613d02565b80601f01602080910402602001604051908101604052809291908181526020018280546124ec90613d02565b80156125395780601f1061250e57610100808354040283529160200191612539565b820191906000526020600020905b81548152906001019060200180831161251c57829003601f168201915b5050505050905090565b6060600082141561258b576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506126eb565b600082905060005b600082146125bd5780806125a690613d34565b915050600a826125b69190613bcb565b9150612593565b60008167ffffffffffffffff8111156125ff577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156126315781602001600182028036833780820191505090505b5090505b600085146126e45760018261264a9190613bfc565b9150600a856126599190613dab565b60306126659190613b75565b60f81b8183815181106126a1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856126dd9190613bcb565b9450612635565b8093505050505b919050565b60008082905060005b84518110156127be57600085828151811061273d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151905080831161277e578281604051602001612761929190613697565b6040516020818303038152906040528051906020012092506127aa565b8083604051602001612791929190613697565b6040516020818303038152906040528051906020012092505b5080806127b690613d34565b9150506126f9565b508091505092915050565b600080823b905060008111915050919050565b8280546127e890613d02565b90600052602060002090601f01602090048101928261280a5760008555612851565b82601f1061282357805160ff1916838001178555612851565b82800160010185558215612851579182015b82811115612850578251825591602001919060010190612835565b5b50905061285e9190612862565b5090565b5b8082111561287b576000816000905550600101612863565b5090565b600061289261288d84613ac7565b613a96565b9050828152602081018484840111156128aa57600080fd5b6128b5848285613cc0565b509392505050565b60006128d06128cb84613af7565b613a96565b9050828152602081018484840111156128e857600080fd5b6128f3848285613cc0565b509392505050565b60008135905061290a81613eb6565b92915050565b60008135905061291f81613ecd565b92915050565b60008083601f84011261293757600080fd5b8235905067ffffffffffffffff81111561295057600080fd5b60208301915083602082028301111561296857600080fd5b9250929050565b60008135905061297e81613ee4565b92915050565b60008135905061299381613efb565b92915050565b6000813590506129a881613f12565b92915050565b6000815190506129bd81613f12565b92915050565b600082601f8301126129d457600080fd5b81356129e484826020860161287f565b91505092915050565b600082601f8301126129fe57600080fd5b8135612a0e8482602086016128bd565b91505092915050565b600081359050612a2681613f29565b92915050565b600060208284031215612a3e57600080fd5b6000612a4c848285016128fb565b91505092915050565b600060208284031215612a6757600080fd5b6000612a7584828501612910565b91505092915050565b60008060408385031215612a9157600080fd5b6000612a9f858286016128fb565b9250506020612ab0858286016128fb565b9150509250929050565b600080600060608486031215612acf57600080fd5b6000612add868287016128fb565b9350506020612aee868287016128fb565b9250506040612aff86828701612a17565b9150509250925092565b60008060008060808587031215612b1f57600080fd5b6000612b2d878288016128fb565b9450506020612b3e878288016128fb565b9350506040612b4f87828801612a17565b925050606085013567ffffffffffffffff811115612b6c57600080fd5b612b78878288016129c3565b91505092959194509250565b60008060408385031215612b9757600080fd5b6000612ba5858286016128fb565b9250506020612bb68582860161296f565b9150509250929050565b60008060408385031215612bd357600080fd5b6000612be1858286016128fb565b9250506020612bf285828601612a17565b9150509250929050565b60008060208385031215612c0f57600080fd5b600083013567ffffffffffffffff811115612c2957600080fd5b612c3585828601612925565b92509250509250929050565b60008060008060408587031215612c5757600080fd5b600085013567ffffffffffffffff811115612c7157600080fd5b612c7d87828801612925565b9450945050602085013567ffffffffffffffff811115612c9c57600080fd5b612ca887828801612925565b925092505092959194509250565b600060208284031215612cc857600080fd5b6000612cd684828501612984565b91505092915050565b600060208284031215612cf157600080fd5b6000612cff84828501612999565b91505092915050565b600060208284031215612d1a57600080fd5b6000612d28848285016129ae565b91505092915050565b600060208284031215612d4357600080fd5b600082013567ffffffffffffffff811115612d5d57600080fd5b612d69848285016129ed565b91505092915050565b600060208284031215612d8457600080fd5b6000612d9284828501612a17565b91505092915050565b612da481613c30565b82525050565b612dbb612db682613c30565b613d7d565b82525050565b612dca81613c54565b82525050565b612dd981613c60565b82525050565b612df0612deb82613c60565b613d8f565b82525050565b6000612e0182613b27565b612e0b8185613b3d565b9350612e1b818560208601613ccf565b612e2481613e98565b840191505092915050565b6000612e3a82613b32565b612e448185613b59565b9350612e54818560208601613ccf565b612e5d81613e98565b840191505092915050565b6000612e7382613b32565b612e7d8185613b6a565b9350612e8d818560208601613ccf565b80840191505092915050565b6000612ea6603b83613b59565b91507f496e76616c6964204d65726b6c652050726f6f663a2061646472657373206e6f60008301527f7420656c696769626c6520666f722066726565206d696e74696e6700000000006020830152604082019050919050565b6000612f0c603283613b59565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b6000612f72602683613b59565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612fd8601c83613b59565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000613018601483613b59565b91507f4661696c656420746f2073656e642045746865720000000000000000000000006000830152602082019050919050565b6000613058602483613b59565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006130be601983613b59565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b60006130fe602c83613b59565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613164603883613b59565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b60006131ca602a83613b59565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000613230602983613b59565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613296602083613b59565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b60006132d6602c83613b59565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b600061333c602083613b59565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b600061337c602383613b59565b91507f596f7520686176656e27742073656e7420656e6f7567682045544820746f206d60008301527f696e7400000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006133e2602983613b59565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613448602f83613b59565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b60006134ae602183613b59565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613514600083613b4e565b9150600082019050919050565b600061352e603183613b59565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000613594602d83613b59565b91507f496e76616c6964204d65726b6c652050726f6f663a2061646472657373206e6f60008301527f742077686974656c6973746564000000000000000000000000000000000000006020830152604082019050919050565b60006135fa601b83613b59565b91507f416c6c20746f6b656e732068617665206265656e206d696e74656400000000006000830152602082019050919050565b600061363a601f83613b59565b91507f5468697320616464726573732068617320616c7265616479206d696e746564006000830152602082019050919050565b61367681613cb6565b82525050565b60006136888284612daa565b60148201915081905092915050565b60006136a38285612ddf565b6020820191506136b38284612ddf565b6020820191508190509392505050565b60006136cf8285612e68565b91506136db8284612e68565b91508190509392505050565b60006136f282613507565b9150819050919050565b60006020820190506137116000830184612d9b565b92915050565b600060808201905061372c6000830187612d9b565b6137396020830186612d9b565b613746604083018561366d565b81810360608301526137588184612df6565b905095945050505050565b60006020820190506137786000830184612dc1565b92915050565b60006020820190506137936000830184612dd0565b92915050565b600060208201905081810360008301526137b38184612e2f565b905092915050565b600060208201905081810360008301526137d481612e99565b9050919050565b600060208201905081810360008301526137f481612eff565b9050919050565b6000602082019050818103600083015261381481612f65565b9050919050565b6000602082019050818103600083015261383481612fcb565b9050919050565b600060208201905081810360008301526138548161300b565b9050919050565b600060208201905081810360008301526138748161304b565b9050919050565b60006020820190508181036000830152613894816130b1565b9050919050565b600060208201905081810360008301526138b4816130f1565b9050919050565b600060208201905081810360008301526138d481613157565b9050919050565b600060208201905081810360008301526138f4816131bd565b9050919050565b6000602082019050818103600083015261391481613223565b9050919050565b6000602082019050818103600083015261393481613289565b9050919050565b60006020820190508181036000830152613954816132c9565b9050919050565b600060208201905081810360008301526139748161332f565b9050919050565b600060208201905081810360008301526139948161336f565b9050919050565b600060208201905081810360008301526139b4816133d5565b9050919050565b600060208201905081810360008301526139d48161343b565b9050919050565b600060208201905081810360008301526139f4816134a1565b9050919050565b60006020820190508181036000830152613a1481613521565b9050919050565b60006020820190508181036000830152613a3481613587565b9050919050565b60006020820190508181036000830152613a54816135ed565b9050919050565b60006020820190508181036000830152613a748161362d565b9050919050565b6000602082019050613a90600083018461366d565b92915050565b6000604051905081810181811067ffffffffffffffff82111715613abd57613abc613e69565b5b8060405250919050565b600067ffffffffffffffff821115613ae257613ae1613e69565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115613b1257613b11613e69565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613b8082613cb6565b9150613b8b83613cb6565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613bc057613bbf613ddc565b5b828201905092915050565b6000613bd682613cb6565b9150613be183613cb6565b925082613bf157613bf0613e0b565b5b828204905092915050565b6000613c0782613cb6565b9150613c1283613cb6565b925082821015613c2557613c24613ddc565b5b828203905092915050565b6000613c3b82613c96565b9050919050565b6000613c4d82613c96565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613ced578082015181840152602081019050613cd2565b83811115613cfc576000848401525b50505050565b60006002820490506001821680613d1a57607f821691505b60208210811415613d2e57613d2d613e3a565b5b50919050565b6000613d3f82613cb6565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613d7257613d71613ddc565b5b600182019050919050565b6000613d8882613d99565b9050919050565b6000819050919050565b6000613da482613ea9565b9050919050565b6000613db682613cb6565b9150613dc183613cb6565b925082613dd157613dd0613e0b565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b613ebf81613c30565b8114613eca57600080fd5b50565b613ed681613c42565b8114613ee157600080fd5b50565b613eed81613c54565b8114613ef857600080fd5b50565b613f0481613c60565b8114613f0f57600080fd5b50565b613f1b81613c6a565b8114613f2657600080fd5b50565b613f3281613cb6565b8114613f3d57600080fd5b5056fea26469706673582212203d78676d9fda46150c7757239fa74c4f1787021d86e0db6fffcd143b4b06a24c64736f6c63430008000033

Deployed Bytecode

0x6080604052600436106101c15760003560e01c8063715018a6116100f7578063b095721011610095578063c87b56dd11610064578063c87b56dd146105f9578063e985e9c514610636578063f2fde38b14610673578063fa6e85831461069c576101c1565b8063b095721014610565578063b88d4fde14610590578063bedc25f8146105b9578063bfa0e6de146105d0576101c1565b80638f97ae8a116100d15780638f97ae8a146104bf57806395d89b41146104e85780639dfcc3f614610513578063a22cb4651461053c576101c1565b8063715018a6146104525780638da5cb5b146104695780638e1f9cfe14610494576101c1565b806323b872dd1161016457806342842e0e1161013e57806342842e0e146103935780635e420f4c146103bc5780636352211e146103d857806370a0823114610415576101c1565b806323b872dd146103045780632db9b8471461032d5780633194ccf914610356576101c1565b8063081812fc116101a0578063081812fc1461024a578063095ea7b314610287578063195f2f14146102b05780631f7af569146102db576101c1565b8062295117146101c657806301ffc9a7146101e257806306fdde031461021f575b600080fd5b6101e060048036038101906101db9190612bfc565b6106c7565b005b3480156101ee57600080fd5b5061020960048036038101906102049190612cdf565b61089d565b6040516102169190613763565b60405180910390f35b34801561022b57600080fd5b5061023461097f565b6040516102419190613799565b60405180910390f35b34801561025657600080fd5b50610271600480360381019061026c9190612d72565b610a11565b60405161027e91906136fc565b60405180910390f35b34801561029357600080fd5b506102ae60048036038101906102a99190612bc0565b610a96565b005b3480156102bc57600080fd5b506102c5610bae565b6040516102d2919061377e565b60405180910390f35b3480156102e757600080fd5b5061030260048036038101906102fd9190612d31565b610bb4565b005b34801561031057600080fd5b5061032b60048036038101906103269190612aba565b610c4a565b005b34801561033957600080fd5b50610354600480360381019061034f9190612cb6565b610caa565b005b34801561036257600080fd5b5061037d60048036038101906103789190612a2c565b610d30565b60405161038a9190613763565b60405180910390f35b34801561039f57600080fd5b506103ba60048036038101906103b59190612aba565b610d86565b005b6103d660048036038101906103d19190612a55565b610da6565b005b3480156103e457600080fd5b506103ff60048036038101906103fa9190612d72565b610ed5565b60405161040c91906136fc565b60405180910390f35b34801561042157600080fd5b5061043c60048036038101906104379190612a2c565b610f87565b6040516104499190613a7b565b60405180910390f35b34801561045e57600080fd5b5061046761103f565b005b34801561047557600080fd5b5061047e6110c7565b60405161048b91906136fc565b60405180910390f35b3480156104a057600080fd5b506104a96110f1565b6040516104b6919061377e565b60405180910390f35b3480156104cb57600080fd5b506104e660048036038101906104e19190612c41565b6110f7565b005b3480156104f457600080fd5b506104fd611295565b60405161050a9190613799565b60405180910390f35b34801561051f57600080fd5b5061053a60048036038101906105359190612cb6565b611327565b005b34801561054857600080fd5b50610563600480360381019061055e9190612b84565b6113ad565b005b34801561057157600080fd5b5061057a6113c3565b6040516105879190613763565b60405180910390f35b34801561059c57600080fd5b506105b760048036038101906105b29190612b09565b6113d6565b005b3480156105c557600080fd5b506105ce611438565b005b3480156105dc57600080fd5b506105f760048036038101906105f29190612d72565b6114e0565b005b34801561060557600080fd5b50610620600480360381019061061b9190612d72565b611566565b60405161062d9190613799565b60405180910390f35b34801561064257600080fd5b5061065d60048036038101906106589190612a7e565b611578565b60405161066a9190613763565b60405180910390f35b34801561067f57600080fd5b5061069a60048036038101906106959190612a2c565b61160c565b005b3480156106a857600080fd5b506106b1611704565b6040516106be9190613a7b565b60405180910390f35b61012c6106d46007611722565b1115610715576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070c90613a3b565b60405180910390fd5b600d5434101561075a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107519061397b565b60405180910390fd5b60001515600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515146107ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107e490613a5b565b60405180910390fd5b600860009054906101000a900460ff161561080e5761080c8282611730565b505b61081860076117f4565b60006108246007611722565b905061084033826040518060200160405280600081525061180a565b6001600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061096857507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610978575061097782611865565b5b9050919050565b60606000805461098e90613d02565b80601f01602080910402602001604051908101604052809291908181526020018280546109ba90613d02565b8015610a075780601f106109dc57610100808354040283529160200191610a07565b820191906000526020600020905b8154815290600101906020018083116109ea57829003601f168201915b5050505050905090565b6000610a1c826118cf565b610a5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a529061393b565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610aa182610ed5565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b09906139db565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b3161193b565b73ffffffffffffffffffffffffffffffffffffffff161480610b605750610b5f81610b5a61193b565b611578565b5b610b9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b96906138bb565b60405180910390fd5b610ba98383611943565b505050565b600b5481565b610bbc61193b565b73ffffffffffffffffffffffffffffffffffffffff16610bda6110c7565b73ffffffffffffffffffffffffffffffffffffffff1614610c30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c279061395b565b60405180910390fd5b8060099080519060200190610c469291906127dc565b5050565b610c5b610c5561193b565b826119fc565b610c9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c91906139fb565b60405180910390fd5b610ca5838383611ada565b505050565b610cb261193b565b73ffffffffffffffffffffffffffffffffffffffff16610cd06110c7565b73ffffffffffffffffffffffffffffffffffffffff1614610d26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1d9061395b565b60405180910390fd5b80600a8190555050565b6000600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b610da1838383604051806020016040528060008152506113d6565b505050565b610dae61193b565b73ffffffffffffffffffffffffffffffffffffffff16610dcc6110c7565b73ffffffffffffffffffffffffffffffffffffffff1614610e22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e199061395b565b60405180910390fd5b6000808273ffffffffffffffffffffffffffffffffffffffff1647604051610e49906136e7565b60006040518083038185875af1925050503d8060008114610e86576040519150601f19603f3d011682016040523d82523d6000602084013e610e8b565b606091505b509150915081610ed0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec79061383b565b60405180910390fd5b505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610f7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f75906138fb565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610ff8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fef906138db565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61104761193b565b73ffffffffffffffffffffffffffffffffffffffff166110656110c7565b73ffffffffffffffffffffffffffffffffffffffff16146110bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b29061395b565b60405180910390fd5b6110c56000611d36565b565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600a5481565b61012c6111046007611722565b1115611145576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113c90613a3b565b60405180910390fd5b60001515600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515146111d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111cf90613a5b565b60405180910390fd5b600860009054906101000a900460ff16156111f9576111f78484611730565b505b6112038282611dfc565b5061120e60076117f4565b600061121a6007611722565b905061123633826040518060200160405280600081525061180a565b6001600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050505050565b6060600180546112a490613d02565b80601f01602080910402602001604051908101604052809291908181526020018280546112d090613d02565b801561131d5780601f106112f25761010080835404028352916020019161131d565b820191906000526020600020905b81548152906001019060200180831161130057829003601f168201915b5050505050905090565b61132f61193b565b73ffffffffffffffffffffffffffffffffffffffff1661134d6110c7565b73ffffffffffffffffffffffffffffffffffffffff16146113a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139a9061395b565b60405180910390fd5b80600b8190555050565b6113bf6113b861193b565b8383611ec0565b5050565b600860009054906101000a900460ff1681565b6113e76113e161193b565b836119fc565b611426576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141d906139fb565b60405180910390fd5b6114328484848461202d565b50505050565b61144061193b565b73ffffffffffffffffffffffffffffffffffffffff1661145e6110c7565b73ffffffffffffffffffffffffffffffffffffffff16146114b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ab9061395b565b60405180910390fd5b600860009054906101000a900460ff1615600860006101000a81548160ff021916908315150217905550565b6114e861193b565b73ffffffffffffffffffffffffffffffffffffffff166115066110c7565b73ffffffffffffffffffffffffffffffffffffffff161461155c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115539061395b565b60405180910390fd5b80600d8190555050565b606061157182612089565b9050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61161461193b565b73ffffffffffffffffffffffffffffffffffffffff166116326110c7565b73ffffffffffffffffffffffffffffffffffffffff1614611688576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167f9061395b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156116f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ef906137fb565b60405180910390fd5b61170181611d36565b50565b60006117106007611722565b61012c61171d9190613bfc565b905090565b600081600001549050919050565b60008033604051602001611744919061367c565b6040516020818303038152906040528051906020012090506117aa848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600a5483612130565b6117e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e090613a1b565b60405180910390fd5b600191505092915050565b6001816000016000828254019250508190555050565b6118148383612147565b6118216000848484612315565b611860576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611857906137db565b60405180910390fd5b505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166119b683610ed5565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611a07826118cf565b611a46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3d9061389b565b60405180910390fd5b6000611a5183610ed5565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611ac057508373ffffffffffffffffffffffffffffffffffffffff16611aa884610a11565b73ffffffffffffffffffffffffffffffffffffffff16145b80611ad15750611ad08185611578565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611afa82610ed5565b73ffffffffffffffffffffffffffffffffffffffff1614611b50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b479061399b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611bc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb79061385b565b60405180910390fd5b611bcb8383836124ac565b611bd6600082611943565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611c269190613bfc565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611c7d9190613b75565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008033604051602001611e10919061367c565b604051602081830303815290604052805190602001209050611e76848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600b5483612130565b611eb5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eac906137bb565b60405180910390fd5b600191505092915050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611f2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f269061387b565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516120209190613763565b60405180910390a3505050565b612038848484611ada565b61204484848484612315565b612083576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161207a906137db565b60405180910390fd5b50505050565b6060612094826118cf565b6120d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ca906139bb565b60405180910390fd5b60006120dd6124b1565b905060008151116120fd5760405180602001604052806000815250612128565b8061210784612543565b6040516020016121189291906136c3565b6040516020818303038152906040525b915050919050565b60008261213d85846126f0565b1490509392505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156121b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121ae9061391b565b60405180910390fd5b6121c0816118cf565b15612200576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121f79061381b565b60405180910390fd5b61220c600083836124ac565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461225c9190613b75565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b60006123368473ffffffffffffffffffffffffffffffffffffffff166127c9565b1561249f578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261235f61193b565b8786866040518563ffffffff1660e01b81526004016123819493929190613717565b602060405180830381600087803b15801561239b57600080fd5b505af19250505080156123cc57506040513d601f19601f820116820180604052508101906123c99190612d08565b60015b61244f573d80600081146123fc576040519150601f19603f3d011682016040523d82523d6000602084013e612401565b606091505b50600081511415612447576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161243e906137db565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506124a4565b600190505b949350505050565b505050565b6060600980546124c090613d02565b80601f01602080910402602001604051908101604052809291908181526020018280546124ec90613d02565b80156125395780601f1061250e57610100808354040283529160200191612539565b820191906000526020600020905b81548152906001019060200180831161251c57829003601f168201915b5050505050905090565b6060600082141561258b576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506126eb565b600082905060005b600082146125bd5780806125a690613d34565b915050600a826125b69190613bcb565b9150612593565b60008167ffffffffffffffff8111156125ff577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156126315781602001600182028036833780820191505090505b5090505b600085146126e45760018261264a9190613bfc565b9150600a856126599190613dab565b60306126659190613b75565b60f81b8183815181106126a1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856126dd9190613bcb565b9450612635565b8093505050505b919050565b60008082905060005b84518110156127be57600085828151811061273d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151905080831161277e578281604051602001612761929190613697565b6040516020818303038152906040528051906020012092506127aa565b8083604051602001612791929190613697565b6040516020818303038152906040528051906020012092505b5080806127b690613d34565b9150506126f9565b508091505092915050565b600080823b905060008111915050919050565b8280546127e890613d02565b90600052602060002090601f01602090048101928261280a5760008555612851565b82601f1061282357805160ff1916838001178555612851565b82800160010185558215612851579182015b82811115612850578251825591602001919060010190612835565b5b50905061285e9190612862565b5090565b5b8082111561287b576000816000905550600101612863565b5090565b600061289261288d84613ac7565b613a96565b9050828152602081018484840111156128aa57600080fd5b6128b5848285613cc0565b509392505050565b60006128d06128cb84613af7565b613a96565b9050828152602081018484840111156128e857600080fd5b6128f3848285613cc0565b509392505050565b60008135905061290a81613eb6565b92915050565b60008135905061291f81613ecd565b92915050565b60008083601f84011261293757600080fd5b8235905067ffffffffffffffff81111561295057600080fd5b60208301915083602082028301111561296857600080fd5b9250929050565b60008135905061297e81613ee4565b92915050565b60008135905061299381613efb565b92915050565b6000813590506129a881613f12565b92915050565b6000815190506129bd81613f12565b92915050565b600082601f8301126129d457600080fd5b81356129e484826020860161287f565b91505092915050565b600082601f8301126129fe57600080fd5b8135612a0e8482602086016128bd565b91505092915050565b600081359050612a2681613f29565b92915050565b600060208284031215612a3e57600080fd5b6000612a4c848285016128fb565b91505092915050565b600060208284031215612a6757600080fd5b6000612a7584828501612910565b91505092915050565b60008060408385031215612a9157600080fd5b6000612a9f858286016128fb565b9250506020612ab0858286016128fb565b9150509250929050565b600080600060608486031215612acf57600080fd5b6000612add868287016128fb565b9350506020612aee868287016128fb565b9250506040612aff86828701612a17565b9150509250925092565b60008060008060808587031215612b1f57600080fd5b6000612b2d878288016128fb565b9450506020612b3e878288016128fb565b9350506040612b4f87828801612a17565b925050606085013567ffffffffffffffff811115612b6c57600080fd5b612b78878288016129c3565b91505092959194509250565b60008060408385031215612b9757600080fd5b6000612ba5858286016128fb565b9250506020612bb68582860161296f565b9150509250929050565b60008060408385031215612bd357600080fd5b6000612be1858286016128fb565b9250506020612bf285828601612a17565b9150509250929050565b60008060208385031215612c0f57600080fd5b600083013567ffffffffffffffff811115612c2957600080fd5b612c3585828601612925565b92509250509250929050565b60008060008060408587031215612c5757600080fd5b600085013567ffffffffffffffff811115612c7157600080fd5b612c7d87828801612925565b9450945050602085013567ffffffffffffffff811115612c9c57600080fd5b612ca887828801612925565b925092505092959194509250565b600060208284031215612cc857600080fd5b6000612cd684828501612984565b91505092915050565b600060208284031215612cf157600080fd5b6000612cff84828501612999565b91505092915050565b600060208284031215612d1a57600080fd5b6000612d28848285016129ae565b91505092915050565b600060208284031215612d4357600080fd5b600082013567ffffffffffffffff811115612d5d57600080fd5b612d69848285016129ed565b91505092915050565b600060208284031215612d8457600080fd5b6000612d9284828501612a17565b91505092915050565b612da481613c30565b82525050565b612dbb612db682613c30565b613d7d565b82525050565b612dca81613c54565b82525050565b612dd981613c60565b82525050565b612df0612deb82613c60565b613d8f565b82525050565b6000612e0182613b27565b612e0b8185613b3d565b9350612e1b818560208601613ccf565b612e2481613e98565b840191505092915050565b6000612e3a82613b32565b612e448185613b59565b9350612e54818560208601613ccf565b612e5d81613e98565b840191505092915050565b6000612e7382613b32565b612e7d8185613b6a565b9350612e8d818560208601613ccf565b80840191505092915050565b6000612ea6603b83613b59565b91507f496e76616c6964204d65726b6c652050726f6f663a2061646472657373206e6f60008301527f7420656c696769626c6520666f722066726565206d696e74696e6700000000006020830152604082019050919050565b6000612f0c603283613b59565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b6000612f72602683613b59565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612fd8601c83613b59565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000613018601483613b59565b91507f4661696c656420746f2073656e642045746865720000000000000000000000006000830152602082019050919050565b6000613058602483613b59565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006130be601983613b59565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b60006130fe602c83613b59565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613164603883613b59565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b60006131ca602a83613b59565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000613230602983613b59565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613296602083613b59565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b60006132d6602c83613b59565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b600061333c602083613b59565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b600061337c602383613b59565b91507f596f7520686176656e27742073656e7420656e6f7567682045544820746f206d60008301527f696e7400000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006133e2602983613b59565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613448602f83613b59565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b60006134ae602183613b59565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613514600083613b4e565b9150600082019050919050565b600061352e603183613b59565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000613594602d83613b59565b91507f496e76616c6964204d65726b6c652050726f6f663a2061646472657373206e6f60008301527f742077686974656c6973746564000000000000000000000000000000000000006020830152604082019050919050565b60006135fa601b83613b59565b91507f416c6c20746f6b656e732068617665206265656e206d696e74656400000000006000830152602082019050919050565b600061363a601f83613b59565b91507f5468697320616464726573732068617320616c7265616479206d696e746564006000830152602082019050919050565b61367681613cb6565b82525050565b60006136888284612daa565b60148201915081905092915050565b60006136a38285612ddf565b6020820191506136b38284612ddf565b6020820191508190509392505050565b60006136cf8285612e68565b91506136db8284612e68565b91508190509392505050565b60006136f282613507565b9150819050919050565b60006020820190506137116000830184612d9b565b92915050565b600060808201905061372c6000830187612d9b565b6137396020830186612d9b565b613746604083018561366d565b81810360608301526137588184612df6565b905095945050505050565b60006020820190506137786000830184612dc1565b92915050565b60006020820190506137936000830184612dd0565b92915050565b600060208201905081810360008301526137b38184612e2f565b905092915050565b600060208201905081810360008301526137d481612e99565b9050919050565b600060208201905081810360008301526137f481612eff565b9050919050565b6000602082019050818103600083015261381481612f65565b9050919050565b6000602082019050818103600083015261383481612fcb565b9050919050565b600060208201905081810360008301526138548161300b565b9050919050565b600060208201905081810360008301526138748161304b565b9050919050565b60006020820190508181036000830152613894816130b1565b9050919050565b600060208201905081810360008301526138b4816130f1565b9050919050565b600060208201905081810360008301526138d481613157565b9050919050565b600060208201905081810360008301526138f4816131bd565b9050919050565b6000602082019050818103600083015261391481613223565b9050919050565b6000602082019050818103600083015261393481613289565b9050919050565b60006020820190508181036000830152613954816132c9565b9050919050565b600060208201905081810360008301526139748161332f565b9050919050565b600060208201905081810360008301526139948161336f565b9050919050565b600060208201905081810360008301526139b4816133d5565b9050919050565b600060208201905081810360008301526139d48161343b565b9050919050565b600060208201905081810360008301526139f4816134a1565b9050919050565b60006020820190508181036000830152613a1481613521565b9050919050565b60006020820190508181036000830152613a3481613587565b9050919050565b60006020820190508181036000830152613a54816135ed565b9050919050565b60006020820190508181036000830152613a748161362d565b9050919050565b6000602082019050613a90600083018461366d565b92915050565b6000604051905081810181811067ffffffffffffffff82111715613abd57613abc613e69565b5b8060405250919050565b600067ffffffffffffffff821115613ae257613ae1613e69565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115613b1257613b11613e69565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613b8082613cb6565b9150613b8b83613cb6565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613bc057613bbf613ddc565b5b828201905092915050565b6000613bd682613cb6565b9150613be183613cb6565b925082613bf157613bf0613e0b565b5b828204905092915050565b6000613c0782613cb6565b9150613c1283613cb6565b925082821015613c2557613c24613ddc565b5b828203905092915050565b6000613c3b82613c96565b9050919050565b6000613c4d82613c96565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613ced578082015181840152602081019050613cd2565b83811115613cfc576000848401525b50505050565b60006002820490506001821680613d1a57607f821691505b60208210811415613d2e57613d2d613e3a565b5b50919050565b6000613d3f82613cb6565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613d7257613d71613ddc565b5b600182019050919050565b6000613d8882613d99565b9050919050565b6000819050919050565b6000613da482613ea9565b9050919050565b6000613db682613cb6565b9150613dc183613cb6565b925082613dd157613dd0613e0b565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b613ebf81613c30565b8114613eca57600080fd5b50565b613ed681613c42565b8114613ee157600080fd5b50565b613eed81613c54565b8114613ef857600080fd5b50565b613f0481613c60565b8114613f0f57600080fd5b50565b613f1b81613c6a565b8114613f2657600080fd5b50565b613f3281613cb6565b8114613f3d57600080fd5b5056fea26469706673582212203d78676d9fda46150c7757239fa74c4f1787021d86e0db6fffcd143b4b06a24c64736f6c63430008000033

Deployed Bytecode Sourcemap

40459:3950:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42964:575;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27958:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28903:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30462:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29985:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40823:102;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41623:133;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31212:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41368:131;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42148:133;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31622:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44159:243;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28597:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28327:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8575:103;;;;;;;;;;;;;:::i;:::-;;7924:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40713:103;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43547:604;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29072:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41884:129;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30755:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40607:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31878:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41507:108;;;;;;;;;;;;;:::i;:::-;;42021:119;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41223:137;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30981:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8833:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41764:112;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42964:575;43074:3;43051:19;:9;:17;:19::i;:::-;:26;;43043:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;43141:9;;43128;:22;;43120:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;43241:5;43209:37;;:16;:28;43226:10;43209:28;;;;;;;;;;;;;;;;;;;;;;;;;:37;;;43201:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;43296:16;;;;;;;;;;;43293:55;;;43314:34;43335:12;;43314:20;:34::i;:::-;;43293:55;43359:21;:9;:19;:21::i;:::-;43391:17;43411:19;:9;:17;:19::i;:::-;43391:39;;43441:36;43451:10;43463:9;43441:36;;;;;;;;;;;;:9;:36::i;:::-;43519:4;43488:16;:28;43505:10;43488:28;;;;;;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;;42964:575;;;:::o;27958:305::-;28060:4;28112:25;28097:40;;;:11;:40;;;;:105;;;;28169:33;28154:48;;;:11;:48;;;;28097:105;:158;;;;28219:36;28243:11;28219:23;:36::i;:::-;28097:158;28077:178;;27958:305;;;:::o;28903:100::-;28957:13;28990:5;28983:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28903:100;:::o;30462:221::-;30538:7;30566:16;30574:7;30566;:16::i;:::-;30558:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;30651:15;:24;30667:7;30651:24;;;;;;;;;;;;;;;;;;;;;30644:31;;30462:221;;;:::o;29985:411::-;30066:13;30082:23;30097:7;30082:14;:23::i;:::-;30066:39;;30130:5;30124:11;;:2;:11;;;;30116:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;30224:5;30208:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;30233:37;30250:5;30257:12;:10;:12::i;:::-;30233:16;:37::i;:::-;30208:62;30186:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;30367:21;30376:2;30380:7;30367:8;:21::i;:::-;29985:411;;;:::o;40823:102::-;;;;:::o;41623:133::-;8155:12;:10;:12::i;:::-;8144:23;;:7;:5;:7::i;:::-;:23;;;8136:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41733:15:::1;41715;:33;;;;;;;;;;;;:::i;:::-;;41623:133:::0;:::o;31212:339::-;31407:41;31426:12;:10;:12::i;:::-;31440:7;31407:18;:41::i;:::-;31399:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;31515:28;31525:4;31531:2;31535:7;31515:9;:28::i;:::-;31212:339;;;:::o;41368:131::-;8155:12;:10;:12::i;:::-;8144:23;;:7;:5;:7::i;:::-;:23;;;8136:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41478:13:::1;41456:19;:35;;;;41368:131:::0;:::o;42148:133::-;42219:4;42243:16;:30;42260:12;42243:30;;;;;;;;;;;;;;;;;;;;;;;;;42236:37;;42148:133;;;:::o;31622:185::-;31760:39;31777:4;31783:2;31787:7;31760:39;;;;;;;;;;;;:16;:39::i;:::-;31622:185;;;:::o;44159:243::-;8155:12;:10;:12::i;:::-;8144:23;;:7;:5;:7::i;:::-;:23;;;8136:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44258:9:::1;44269:17:::0;44290::::1;:22;;44320:21;44290:56;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44257:89;;;;44365:4;44357:37;;;;;;;;;;;;:::i;:::-;;;;;;;;;8215:1;;44159:243:::0;:::o;28597:239::-;28669:7;28689:13;28705:7;:16;28713:7;28705:16;;;;;;;;;;;;;;;;;;;;;28689:32;;28757:1;28740:19;;:5;:19;;;;28732:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;28823:5;28816:12;;;28597:239;;;:::o;28327:208::-;28399:7;28444:1;28427:19;;:5;:19;;;;28419:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;28511:9;:16;28521:5;28511:16;;;;;;;;;;;;;;;;28504:23;;28327:208;;;:::o;8575:103::-;8155:12;:10;:12::i;:::-;8144:23;;:7;:5;:7::i;:::-;:23;;;8136:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;8640:30:::1;8667:1;8640:18;:30::i;:::-;8575:103::o:0;7924:87::-;7970:7;7997:6;;;;;;;;;;;7990:13;;7924:87;:::o;40713:103::-;;;;:::o;43547:604::-;43699:3;43676:19;:9;:17;:19::i;:::-;:26;;43668:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;43785:5;43753:37;;:16;:28;43770:10;43753:28;;;;;;;;;;;;;;;;;;;;;;;;;:37;;;43745:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;43841:16;;;;;;;;;;;43838:64;;;43859:43;43880:21;;43859:20;:43::i;:::-;;43838:64;43913:47;43939:20;;43913:25;:47::i;:::-;;43971:21;:9;:19;:21::i;:::-;44003:17;44023:19;:9;:17;:19::i;:::-;44003:39;;44053:36;44063:10;44075:9;44053:36;;;;;;;;;;;;:9;:36::i;:::-;44135:4;44104:16;:28;44121:10;44104:28;;;;;;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;;43547:604;;;;;:::o;29072:104::-;29128:13;29161:7;29154:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29072:104;:::o;41884:129::-;8155:12;:10;:12::i;:::-;8144:23;;:7;:5;:7::i;:::-;:23;;;8136:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41992:13:::1;41971:18;:34;;;;41884:129:::0;:::o;30755:155::-;30850:52;30869:12;:10;:12::i;:::-;30883:8;30893;30850:18;:52::i;:::-;30755:155;;:::o;40607:35::-;;;;;;;;;;;;;:::o;31878:328::-;32053:41;32072:12;:10;:12::i;:::-;32086:7;32053:18;:41::i;:::-;32045:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;32159:39;32173:4;32179:2;32183:7;32192:5;32159:13;:39::i;:::-;31878:328;;;;:::o;41507:108::-;8155:12;:10;:12::i;:::-;8144:23;;:7;:5;:7::i;:::-;:23;;;8136:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41591:16:::1;;;;;;;;;;;41590:17;41571:16;;:36;;;;;;;;;;;;;;;;;;41507:108::o:0;42021:119::-;8155:12;:10;:12::i;:::-;8144:23;;:7;:5;:7::i;:::-;:23;;;8136:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42115:17:::1;42103:9;:29;;;;42021:119:::0;:::o;41223:137::-;41296:13;41329:23;41344:7;41329:14;:23::i;:::-;41322:30;;41223:137;;;:::o;30981:164::-;31078:4;31102:18;:25;31121:5;31102:25;;;;;;;;;;;;;;;:35;31128:8;31102:35;;;;;;;;;;;;;;;;;;;;;;;;;31095:42;;30981:164;;;;:::o;8833:201::-;8155:12;:10;:12::i;:::-;8144:23;;:7;:5;:7::i;:::-;:23;;;8136:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;8942:1:::1;8922:22;;:8;:22;;;;8914:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;8998:28;9017:8;8998:18;:28::i;:::-;8833:201:::0;:::o;41764:112::-;41814:7;41848:19;:9;:17;:19::i;:::-;41842:3;:25;;;;:::i;:::-;41834:34;;41764:112;:::o;872:114::-;937:7;964;:14;;;957:21;;872:114;;;:::o;42289:309::-;42375:4;42390:12;42432:10;42415:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;42405:39;;;;;;42390:54;;42461:59;42480:12;;42461:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42494:19;;42515:4;42461:18;:59::i;:::-;42453:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;42586:4;42579:11;;;42289:309;;;;:::o;994:127::-;1101:1;1083:7;:14;;;:19;;;;;;;;;;;994:127;:::o;35037:321::-;35167:18;35173:2;35177:7;35167:5;:18::i;:::-;35218:54;35249:1;35253:2;35257:7;35266:5;35218:22;:54::i;:::-;35196:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;35037:321;;;:::o;20568:157::-;20653:4;20692:25;20677:40;;;:11;:40;;;;20670:47;;20568:157;;;:::o;33716:127::-;33781:4;33833:1;33805:30;;:7;:16;33813:7;33805:16;;;;;;;;;;;;;;;;;;;;;:30;;;;33798:37;;33716:127;;;:::o;6595:98::-;6648:7;6675:10;6668:17;;6595:98;:::o;37698:174::-;37800:2;37773:15;:24;37789:7;37773:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;37856:7;37852:2;37818:46;;37827:23;37842:7;37827:14;:23::i;:::-;37818:46;;;;;;;;;;;;37698:174;;:::o;34010:348::-;34103:4;34128:16;34136:7;34128;:16::i;:::-;34120:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;34204:13;34220:23;34235:7;34220:14;:23::i;:::-;34204:39;;34273:5;34262:16;;:7;:16;;;:51;;;;34306:7;34282:31;;:20;34294:7;34282:11;:20::i;:::-;:31;;;34262:51;:87;;;;34317:32;34334:5;34341:7;34317:16;:32::i;:::-;34262:87;34254:96;;;34010:348;;;;:::o;37002:578::-;37161:4;37134:31;;:23;37149:7;37134:14;:23::i;:::-;:31;;;37126:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;37244:1;37230:16;;:2;:16;;;;37222:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;37300:39;37321:4;37327:2;37331:7;37300:20;:39::i;:::-;37404:29;37421:1;37425:7;37404:8;:29::i;:::-;37465:1;37446:9;:15;37456:4;37446:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;37494:1;37477:9;:13;37487:2;37477:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;37525:2;37506:7;:16;37514:7;37506:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;37564:7;37560:2;37545:27;;37554:4;37545:27;;;;;;;;;;;;37002:578;;;:::o;9194:191::-;9268:16;9287:6;;;;;;;;;;;9268:25;;9313:8;9304:6;;:17;;;;;;;;;;;;;;;;;;9368:8;9337:40;;9358:8;9337:40;;;;;;;;;;;;9194:191;;:::o;42606:327::-;42697:4;42712:12;42754:10;42737:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;42727:39;;;;;;42712:54;;42783:58;42802:12;;42783:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42816:18;;42836:4;42783:18;:58::i;:::-;42775:130;;;;;;;;;;;;:::i;:::-;;;;;;;;;42921:4;42914:11;;;42606:327;;;;:::o;38014:315::-;38169:8;38160:17;;:5;:17;;;;38152:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;38256:8;38218:18;:25;38237:5;38218:25;;;;;;;;;;;;;;;:35;38244:8;38218:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;38302:8;38280:41;;38295:5;38280:41;;;38312:8;38280:41;;;;;;:::i;:::-;;;;;;;;38014:315;;;:::o;33088:::-;33245:28;33255:4;33261:2;33265:7;33245:9;:28::i;:::-;33292:48;33315:4;33321:2;33325:7;33334:5;33292:22;:48::i;:::-;33284:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;33088:315;;;;:::o;29247:334::-;29320:13;29354:16;29362:7;29354;:16::i;:::-;29346:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;29435:21;29459:10;:8;:10::i;:::-;29435:34;;29511:1;29493:7;29487:21;:25;:86;;;;;;;;;;;;;;;;;29539:7;29548:18;:7;:16;:18::i;:::-;29522:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;29487:86;29480:93;;;29247:334;;;:::o;2426:190::-;2551:4;2604;2575:25;2588:5;2595:4;2575:12;:25::i;:::-;:33;2568:40;;2426:190;;;;;:::o;35694:382::-;35788:1;35774:16;;:2;:16;;;;35766:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;35847:16;35855:7;35847;:16::i;:::-;35846:17;35838:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;35909:45;35938:1;35942:2;35946:7;35909:20;:45::i;:::-;35984:1;35967:9;:13;35977:2;35967:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;36015:2;35996:7;:16;36004:7;35996:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;36060:7;36056:2;36035:33;;36052:1;36035:33;;;;;;;;;;;;35694:382;;:::o;38894:799::-;39049:4;39070:15;:2;:13;;;:15::i;:::-;39066:620;;;39122:2;39106:36;;;39143:12;:10;:12::i;:::-;39157:4;39163:7;39172:5;39106:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;39102:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39365:1;39348:6;:13;:18;39344:272;;;39391:60;;;;;;;;;;:::i;:::-;;;;;;;;39344:272;39566:6;39560:13;39551:6;39547:2;39543:15;39536:38;39102:529;39239:41;;;39229:51;;;:6;:51;;;;39222:58;;;;;39066:620;39670:4;39663:11;;38894:799;;;;;;;:::o;40265:126::-;;;;:::o;41107:108::-;41159:13;41192:15;41185:22;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41107:108;:::o;4104:723::-;4160:13;4390:1;4381:5;:10;4377:53;;;4408:10;;;;;;;;;;;;;;;;;;;;;4377:53;4440:12;4455:5;4440:20;;4471:14;4496:78;4511:1;4503:4;:9;4496:78;;4529:8;;;;;:::i;:::-;;;;4560:2;4552:10;;;;;:::i;:::-;;;4496:78;;;4584:19;4616:6;4606:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4584:39;;4634:154;4650:1;4641:5;:10;4634:154;;4678:1;4668:11;;;;;:::i;:::-;;;4745:2;4737:5;:10;;;;:::i;:::-;4724:2;:24;;;;:::i;:::-;4711:39;;4694:6;4701;4694:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;4774:2;4765:11;;;;;:::i;:::-;;;4634:154;;;4812:6;4798:21;;;;;4104:723;;;;:::o;2978:701::-;3061:7;3081:20;3104:4;3081:27;;3124:9;3119:523;3143:5;:12;3139:1;:16;3119:523;;;3177:20;3200:5;3206:1;3200:8;;;;;;;;;;;;;;;;;;;;;;3177:31;;3243:12;3227;:28;3223:408;;3397:12;3411;3380:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;3370:55;;;;;;3355:70;;3223:408;;;3587:12;3601;3570:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;3560:55;;;;;;3545:70;;3223:408;3119:523;3157:3;;;;;:::i;:::-;;;;3119:523;;;;3659:12;3652:19;;;2978:701;;;;:::o;10265:387::-;10325:4;10533:12;10600:7;10588:20;10580:28;;10643:1;10636:4;:8;10629:15;;;10265:387;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:342:1:-;;109:64;124:48;165:6;124:48;:::i;:::-;109:64;:::i;:::-;100:73;;196:6;189:5;182:21;234:4;227:5;223:16;272:3;263:6;258:3;254:16;251:25;248:2;;;289:1;286;279:12;248:2;302:41;336:6;331:3;326;302:41;:::i;:::-;90:259;;;;;;:::o;355:344::-;;458:65;473:49;515:6;473:49;:::i;:::-;458:65;:::i;:::-;449:74;;546:6;539:5;532:21;584:4;577:5;573:16;622:3;613:6;608:3;604:16;601:25;598:2;;;639:1;636;629:12;598:2;652:41;686:6;681:3;676;652:41;:::i;:::-;439:260;;;;;;:::o;705:139::-;;789:6;776:20;767:29;;805:33;832:5;805:33;:::i;:::-;757:87;;;;:::o;850:155::-;;942:6;929:20;920:29;;958:41;993:5;958:41;:::i;:::-;910:95;;;;:::o;1028:367::-;;;1161:3;1154:4;1146:6;1142:17;1138:27;1128:2;;1179:1;1176;1169:12;1128:2;1215:6;1202:20;1192:30;;1245:18;1237:6;1234:30;1231:2;;;1277:1;1274;1267:12;1231:2;1314:4;1306:6;1302:17;1290:29;;1368:3;1360:4;1352:6;1348:17;1338:8;1334:32;1331:41;1328:2;;;1385:1;1382;1375:12;1328:2;1118:277;;;;;:::o;1401:133::-;;1482:6;1469:20;1460:29;;1498:30;1522:5;1498:30;:::i;:::-;1450:84;;;;:::o;1540:139::-;;1624:6;1611:20;1602:29;;1640:33;1667:5;1640:33;:::i;:::-;1592:87;;;;:::o;1685:137::-;;1768:6;1755:20;1746:29;;1784:32;1810:5;1784:32;:::i;:::-;1736:86;;;;:::o;1828:141::-;;1915:6;1909:13;1900:22;;1931:32;1957:5;1931:32;:::i;:::-;1890:79;;;;:::o;1988:271::-;;2092:3;2085:4;2077:6;2073:17;2069:27;2059:2;;2110:1;2107;2100:12;2059:2;2150:6;2137:20;2175:78;2249:3;2241:6;2234:4;2226:6;2222:17;2175:78;:::i;:::-;2166:87;;2049:210;;;;;:::o;2279:273::-;;2384:3;2377:4;2369:6;2365:17;2361:27;2351:2;;2402:1;2399;2392:12;2351:2;2442:6;2429:20;2467:79;2542:3;2534:6;2527:4;2519:6;2515:17;2467:79;:::i;:::-;2458:88;;2341:211;;;;;:::o;2558:139::-;;2642:6;2629:20;2620:29;;2658:33;2685:5;2658:33;:::i;:::-;2610:87;;;;:::o;2703:262::-;;2811:2;2799:9;2790:7;2786:23;2782:32;2779:2;;;2827:1;2824;2817:12;2779:2;2870:1;2895:53;2940:7;2931:6;2920:9;2916:22;2895:53;:::i;:::-;2885:63;;2841:117;2769:196;;;;:::o;2971:278::-;;3087:2;3075:9;3066:7;3062:23;3058:32;3055:2;;;3103:1;3100;3093:12;3055:2;3146:1;3171:61;3224:7;3215:6;3204:9;3200:22;3171:61;:::i;:::-;3161:71;;3117:125;3045:204;;;;:::o;3255:407::-;;;3380:2;3368:9;3359:7;3355:23;3351:32;3348:2;;;3396:1;3393;3386:12;3348:2;3439:1;3464:53;3509:7;3500:6;3489:9;3485:22;3464:53;:::i;:::-;3454:63;;3410:117;3566:2;3592:53;3637:7;3628:6;3617:9;3613:22;3592:53;:::i;:::-;3582:63;;3537:118;3338:324;;;;;:::o;3668:552::-;;;;3810:2;3798:9;3789:7;3785:23;3781:32;3778:2;;;3826:1;3823;3816:12;3778:2;3869:1;3894:53;3939:7;3930:6;3919:9;3915:22;3894:53;:::i;:::-;3884:63;;3840:117;3996:2;4022:53;4067:7;4058:6;4047:9;4043:22;4022:53;:::i;:::-;4012:63;;3967:118;4124:2;4150:53;4195:7;4186:6;4175:9;4171:22;4150:53;:::i;:::-;4140:63;;4095:118;3768:452;;;;;:::o;4226:809::-;;;;;4394:3;4382:9;4373:7;4369:23;4365:33;4362:2;;;4411:1;4408;4401:12;4362:2;4454:1;4479:53;4524:7;4515:6;4504:9;4500:22;4479:53;:::i;:::-;4469:63;;4425:117;4581:2;4607:53;4652:7;4643:6;4632:9;4628:22;4607:53;:::i;:::-;4597:63;;4552:118;4709:2;4735:53;4780:7;4771:6;4760:9;4756:22;4735:53;:::i;:::-;4725:63;;4680:118;4865:2;4854:9;4850:18;4837:32;4896:18;4888:6;4885:30;4882:2;;;4928:1;4925;4918:12;4882:2;4956:62;5010:7;5001:6;4990:9;4986:22;4956:62;:::i;:::-;4946:72;;4808:220;4352:683;;;;;;;:::o;5041:401::-;;;5163:2;5151:9;5142:7;5138:23;5134:32;5131:2;;;5179:1;5176;5169:12;5131:2;5222:1;5247:53;5292:7;5283:6;5272:9;5268:22;5247:53;:::i;:::-;5237:63;;5193:117;5349:2;5375:50;5417:7;5408:6;5397:9;5393:22;5375:50;:::i;:::-;5365:60;;5320:115;5121:321;;;;;:::o;5448:407::-;;;5573:2;5561:9;5552:7;5548:23;5544:32;5541:2;;;5589:1;5586;5579:12;5541:2;5632:1;5657:53;5702:7;5693:6;5682:9;5678:22;5657:53;:::i;:::-;5647:63;;5603:117;5759:2;5785:53;5830:7;5821:6;5810:9;5806:22;5785:53;:::i;:::-;5775:63;;5730:118;5531:324;;;;;:::o;5861:425::-;;;6004:2;5992:9;5983:7;5979:23;5975:32;5972:2;;;6020:1;6017;6010:12;5972:2;6091:1;6080:9;6076:17;6063:31;6121:18;6113:6;6110:30;6107:2;;;6153:1;6150;6143:12;6107:2;6189:80;6261:7;6252:6;6241:9;6237:22;6189:80;:::i;:::-;6171:98;;;;6034:245;5962:324;;;;;:::o;6292:733::-;;;;;6487:2;6475:9;6466:7;6462:23;6458:32;6455:2;;;6503:1;6500;6493:12;6455:2;6574:1;6563:9;6559:17;6546:31;6604:18;6596:6;6593:30;6590:2;;;6636:1;6633;6626:12;6590:2;6672:80;6744:7;6735:6;6724:9;6720:22;6672:80;:::i;:::-;6654:98;;;;6517:245;6829:2;6818:9;6814:18;6801:32;6860:18;6852:6;6849:30;6846:2;;;6892:1;6889;6882:12;6846:2;6928:80;7000:7;6991:6;6980:9;6976:22;6928:80;:::i;:::-;6910:98;;;;6772:246;6445:580;;;;;;;:::o;7031:262::-;;7139:2;7127:9;7118:7;7114:23;7110:32;7107:2;;;7155:1;7152;7145:12;7107:2;7198:1;7223:53;7268:7;7259:6;7248:9;7244:22;7223:53;:::i;:::-;7213:63;;7169:117;7097:196;;;;:::o;7299:260::-;;7406:2;7394:9;7385:7;7381:23;7377:32;7374:2;;;7422:1;7419;7412:12;7374:2;7465:1;7490:52;7534:7;7525:6;7514:9;7510:22;7490:52;:::i;:::-;7480:62;;7436:116;7364:195;;;;:::o;7565:282::-;;7683:2;7671:9;7662:7;7658:23;7654:32;7651:2;;;7699:1;7696;7689:12;7651:2;7742:1;7767:63;7822:7;7813:6;7802:9;7798:22;7767:63;:::i;:::-;7757:73;;7713:127;7641:206;;;;:::o;7853:375::-;;7971:2;7959:9;7950:7;7946:23;7942:32;7939:2;;;7987:1;7984;7977:12;7939:2;8058:1;8047:9;8043:17;8030:31;8088:18;8080:6;8077:30;8074:2;;;8120:1;8117;8110:12;8074:2;8148:63;8203:7;8194:6;8183:9;8179:22;8148:63;:::i;:::-;8138:73;;8001:220;7929:299;;;;:::o;8234:262::-;;8342:2;8330:9;8321:7;8317:23;8313:32;8310:2;;;8358:1;8355;8348:12;8310:2;8401:1;8426:53;8471:7;8462:6;8451:9;8447:22;8426:53;:::i;:::-;8416:63;;8372:117;8300:196;;;;:::o;8502:118::-;8589:24;8607:5;8589:24;:::i;:::-;8584:3;8577:37;8567:53;;:::o;8626:157::-;8731:45;8751:24;8769:5;8751:24;:::i;:::-;8731:45;:::i;:::-;8726:3;8719:58;8709:74;;:::o;8789:109::-;8870:21;8885:5;8870:21;:::i;:::-;8865:3;8858:34;8848:50;;:::o;8904:118::-;8991:24;9009:5;8991:24;:::i;:::-;8986:3;8979:37;8969:53;;:::o;9028:157::-;9133:45;9153:24;9171:5;9153:24;:::i;:::-;9133:45;:::i;:::-;9128:3;9121:58;9111:74;;:::o;9191:360::-;;9305:38;9337:5;9305:38;:::i;:::-;9359:70;9422:6;9417:3;9359:70;:::i;:::-;9352:77;;9438:52;9483:6;9478:3;9471:4;9464:5;9460:16;9438:52;:::i;:::-;9515:29;9537:6;9515:29;:::i;:::-;9510:3;9506:39;9499:46;;9281:270;;;;;:::o;9557:364::-;;9673:39;9706:5;9673:39;:::i;:::-;9728:71;9792:6;9787:3;9728:71;:::i;:::-;9721:78;;9808:52;9853:6;9848:3;9841:4;9834:5;9830:16;9808:52;:::i;:::-;9885:29;9907:6;9885:29;:::i;:::-;9880:3;9876:39;9869:46;;9649:272;;;;;:::o;9927:377::-;;10061:39;10094:5;10061:39;:::i;:::-;10116:89;10198:6;10193:3;10116:89;:::i;:::-;10109:96;;10214:52;10259:6;10254:3;10247:4;10240:5;10236:16;10214:52;:::i;:::-;10291:6;10286:3;10282:16;10275:23;;10037:267;;;;;:::o;10310:391::-;;10473:67;10537:2;10532:3;10473:67;:::i;:::-;10466:74;;10570:34;10566:1;10561:3;10557:11;10550:55;10636:29;10631:2;10626:3;10622:12;10615:51;10692:2;10687:3;10683:12;10676:19;;10456:245;;;:::o;10707:382::-;;10870:67;10934:2;10929:3;10870:67;:::i;:::-;10863:74;;10967:34;10963:1;10958:3;10954:11;10947:55;11033:20;11028:2;11023:3;11019:12;11012:42;11080:2;11075:3;11071:12;11064:19;;10853:236;;;:::o;11095:370::-;;11258:67;11322:2;11317:3;11258:67;:::i;:::-;11251:74;;11355:34;11351:1;11346:3;11342:11;11335:55;11421:8;11416:2;11411:3;11407:12;11400:30;11456:2;11451:3;11447:12;11440:19;;11241:224;;;:::o;11471:326::-;;11634:67;11698:2;11693:3;11634:67;:::i;:::-;11627:74;;11731:30;11727:1;11722:3;11718:11;11711:51;11788:2;11783:3;11779:12;11772:19;;11617:180;;;:::o;11803:318::-;;11966:67;12030:2;12025:3;11966:67;:::i;:::-;11959:74;;12063:22;12059:1;12054:3;12050:11;12043:43;12112:2;12107:3;12103:12;12096:19;;11949:172;;;:::o;12127:368::-;;12290:67;12354:2;12349:3;12290:67;:::i;:::-;12283:74;;12387:34;12383:1;12378:3;12374:11;12367:55;12453:6;12448:2;12443:3;12439:12;12432:28;12486:2;12481:3;12477:12;12470:19;;12273:222;;;:::o;12501:323::-;;12664:67;12728:2;12723:3;12664:67;:::i;:::-;12657:74;;12761:27;12757:1;12752:3;12748:11;12741:48;12815:2;12810:3;12806:12;12799:19;;12647:177;;;:::o;12830:376::-;;12993:67;13057:2;13052:3;12993:67;:::i;:::-;12986:74;;13090:34;13086:1;13081:3;13077:11;13070:55;13156:14;13151:2;13146:3;13142:12;13135:36;13197:2;13192:3;13188:12;13181:19;;12976:230;;;:::o;13212:388::-;;13375:67;13439:2;13434:3;13375:67;:::i;:::-;13368:74;;13472:34;13468:1;13463:3;13459:11;13452:55;13538:26;13533:2;13528:3;13524:12;13517:48;13591:2;13586:3;13582:12;13575:19;;13358:242;;;:::o;13606:374::-;;13769:67;13833:2;13828:3;13769:67;:::i;:::-;13762:74;;13866:34;13862:1;13857:3;13853:11;13846:55;13932:12;13927:2;13922:3;13918:12;13911:34;13971:2;13966:3;13962:12;13955:19;;13752:228;;;:::o;13986:373::-;;14149:67;14213:2;14208:3;14149:67;:::i;:::-;14142:74;;14246:34;14242:1;14237:3;14233:11;14226:55;14312:11;14307:2;14302:3;14298:12;14291:33;14350:2;14345:3;14341:12;14334:19;;14132:227;;;:::o;14365:330::-;;14528:67;14592:2;14587:3;14528:67;:::i;:::-;14521:74;;14625:34;14621:1;14616:3;14612:11;14605:55;14686:2;14681:3;14677:12;14670:19;;14511:184;;;:::o;14701:376::-;;14864:67;14928:2;14923:3;14864:67;:::i;:::-;14857:74;;14961:34;14957:1;14952:3;14948:11;14941:55;15027:14;15022:2;15017:3;15013:12;15006:36;15068:2;15063:3;15059:12;15052:19;;14847:230;;;:::o;15083:330::-;;15246:67;15310:2;15305:3;15246:67;:::i;:::-;15239:74;;15343:34;15339:1;15334:3;15330:11;15323:55;15404:2;15399:3;15395:12;15388:19;;15229:184;;;:::o;15419:367::-;;15582:67;15646:2;15641:3;15582:67;:::i;:::-;15575:74;;15679:34;15675:1;15670:3;15666:11;15659:55;15745:5;15740:2;15735:3;15731:12;15724:27;15777:2;15772:3;15768:12;15761:19;;15565:221;;;:::o;15792:373::-;;15955:67;16019:2;16014:3;15955:67;:::i;:::-;15948:74;;16052:34;16048:1;16043:3;16039:11;16032:55;16118:11;16113:2;16108:3;16104:12;16097:33;16156:2;16151:3;16147:12;16140:19;;15938:227;;;:::o;16171:379::-;;16334:67;16398:2;16393:3;16334:67;:::i;:::-;16327:74;;16431:34;16427:1;16422:3;16418:11;16411:55;16497:17;16492:2;16487:3;16483:12;16476:39;16541:2;16536:3;16532:12;16525:19;;16317:233;;;:::o;16556:365::-;;16719:67;16783:2;16778:3;16719:67;:::i;:::-;16712:74;;16816:34;16812:1;16807:3;16803:11;16796:55;16882:3;16877:2;16872:3;16868:12;16861:25;16912:2;16907:3;16903:12;16896:19;;16702:219;;;:::o;16927:297::-;;17107:83;17188:1;17183:3;17107:83;:::i;:::-;17100:90;;17216:1;17211:3;17207:11;17200:18;;17090:134;;;:::o;17230:381::-;;17393:67;17457:2;17452:3;17393:67;:::i;:::-;17386:74;;17490:34;17486:1;17481:3;17477:11;17470:55;17556:19;17551:2;17546:3;17542:12;17535:41;17602:2;17597:3;17593:12;17586:19;;17376:235;;;:::o;17617:377::-;;17780:67;17844:2;17839:3;17780:67;:::i;:::-;17773:74;;17877:34;17873:1;17868:3;17864:11;17857:55;17943:15;17938:2;17933:3;17929:12;17922:37;17985:2;17980:3;17976:12;17969:19;;17763:231;;;:::o;18000:325::-;;18163:67;18227:2;18222:3;18163:67;:::i;:::-;18156:74;;18260:29;18256:1;18251:3;18247:11;18240:50;18316:2;18311:3;18307:12;18300:19;;18146:179;;;:::o;18331:329::-;;18494:67;18558:2;18553:3;18494:67;:::i;:::-;18487:74;;18591:33;18587:1;18582:3;18578:11;18571:54;18651:2;18646:3;18642:12;18635:19;;18477:183;;;:::o;18666:118::-;18753:24;18771:5;18753:24;:::i;:::-;18748:3;18741:37;18731:53;;:::o;18790:256::-;;18917:75;18988:3;18979:6;18917:75;:::i;:::-;19017:2;19012:3;19008:12;19001:19;;19037:3;19030:10;;18906:140;;;;:::o;19052:397::-;;19207:75;19278:3;19269:6;19207:75;:::i;:::-;19307:2;19302:3;19298:12;19291:19;;19320:75;19391:3;19382:6;19320:75;:::i;:::-;19420:2;19415:3;19411:12;19404:19;;19440:3;19433:10;;19196:253;;;;;:::o;19455:435::-;;19657:95;19748:3;19739:6;19657:95;:::i;:::-;19650:102;;19769:95;19860:3;19851:6;19769:95;:::i;:::-;19762:102;;19881:3;19874:10;;19639:251;;;;;:::o;19896:379::-;;20102:147;20245:3;20102:147;:::i;:::-;20095:154;;20266:3;20259:10;;20084:191;;;:::o;20281:222::-;;20412:2;20401:9;20397:18;20389:26;;20425:71;20493:1;20482:9;20478:17;20469:6;20425:71;:::i;:::-;20379:124;;;;:::o;20509:640::-;;20742:3;20731:9;20727:19;20719:27;;20756:71;20824:1;20813:9;20809:17;20800:6;20756:71;:::i;:::-;20837:72;20905:2;20894:9;20890:18;20881:6;20837:72;:::i;:::-;20919;20987:2;20976:9;20972:18;20963:6;20919:72;:::i;:::-;21038:9;21032:4;21028:20;21023:2;21012:9;21008:18;21001:48;21066:76;21137:4;21128:6;21066:76;:::i;:::-;21058:84;;20709:440;;;;;;;:::o;21155:210::-;;21280:2;21269:9;21265:18;21257:26;;21293:65;21355:1;21344:9;21340:17;21331:6;21293:65;:::i;:::-;21247:118;;;;:::o;21371:222::-;;21502:2;21491:9;21487:18;21479:26;;21515:71;21583:1;21572:9;21568:17;21559:6;21515:71;:::i;:::-;21469:124;;;;:::o;21599:313::-;;21750:2;21739:9;21735:18;21727:26;;21799:9;21793:4;21789:20;21785:1;21774:9;21770:17;21763:47;21827:78;21900:4;21891:6;21827:78;:::i;:::-;21819:86;;21717:195;;;;:::o;21918:419::-;;22122:2;22111:9;22107:18;22099:26;;22171:9;22165:4;22161:20;22157:1;22146:9;22142:17;22135:47;22199:131;22325:4;22199:131;:::i;:::-;22191:139;;22089:248;;;:::o;22343:419::-;;22547:2;22536:9;22532:18;22524:26;;22596:9;22590:4;22586:20;22582:1;22571:9;22567:17;22560:47;22624:131;22750:4;22624:131;:::i;:::-;22616:139;;22514:248;;;:::o;22768:419::-;;22972:2;22961:9;22957:18;22949:26;;23021:9;23015:4;23011:20;23007:1;22996:9;22992:17;22985:47;23049:131;23175:4;23049:131;:::i;:::-;23041:139;;22939:248;;;:::o;23193:419::-;;23397:2;23386:9;23382:18;23374:26;;23446:9;23440:4;23436:20;23432:1;23421:9;23417:17;23410:47;23474:131;23600:4;23474:131;:::i;:::-;23466:139;;23364:248;;;:::o;23618:419::-;;23822:2;23811:9;23807:18;23799:26;;23871:9;23865:4;23861:20;23857:1;23846:9;23842:17;23835:47;23899:131;24025:4;23899:131;:::i;:::-;23891:139;;23789:248;;;:::o;24043:419::-;;24247:2;24236:9;24232:18;24224:26;;24296:9;24290:4;24286:20;24282:1;24271:9;24267:17;24260:47;24324:131;24450:4;24324:131;:::i;:::-;24316:139;;24214:248;;;:::o;24468:419::-;;24672:2;24661:9;24657:18;24649:26;;24721:9;24715:4;24711:20;24707:1;24696:9;24692:17;24685:47;24749:131;24875:4;24749:131;:::i;:::-;24741:139;;24639:248;;;:::o;24893:419::-;;25097:2;25086:9;25082:18;25074:26;;25146:9;25140:4;25136:20;25132:1;25121:9;25117:17;25110:47;25174:131;25300:4;25174:131;:::i;:::-;25166:139;;25064:248;;;:::o;25318:419::-;;25522:2;25511:9;25507:18;25499:26;;25571:9;25565:4;25561:20;25557:1;25546:9;25542:17;25535:47;25599:131;25725:4;25599:131;:::i;:::-;25591:139;;25489:248;;;:::o;25743:419::-;;25947:2;25936:9;25932:18;25924:26;;25996:9;25990:4;25986:20;25982:1;25971:9;25967:17;25960:47;26024:131;26150:4;26024:131;:::i;:::-;26016:139;;25914:248;;;:::o;26168:419::-;;26372:2;26361:9;26357:18;26349:26;;26421:9;26415:4;26411:20;26407:1;26396:9;26392:17;26385:47;26449:131;26575:4;26449:131;:::i;:::-;26441:139;;26339:248;;;:::o;26593:419::-;;26797:2;26786:9;26782:18;26774:26;;26846:9;26840:4;26836:20;26832:1;26821:9;26817:17;26810:47;26874:131;27000:4;26874:131;:::i;:::-;26866:139;;26764:248;;;:::o;27018:419::-;;27222:2;27211:9;27207:18;27199:26;;27271:9;27265:4;27261:20;27257:1;27246:9;27242:17;27235:47;27299:131;27425:4;27299:131;:::i;:::-;27291:139;;27189:248;;;:::o;27443:419::-;;27647:2;27636:9;27632:18;27624:26;;27696:9;27690:4;27686:20;27682:1;27671:9;27667:17;27660:47;27724:131;27850:4;27724:131;:::i;:::-;27716:139;;27614:248;;;:::o;27868:419::-;;28072:2;28061:9;28057:18;28049:26;;28121:9;28115:4;28111:20;28107:1;28096:9;28092:17;28085:47;28149:131;28275:4;28149:131;:::i;:::-;28141:139;;28039:248;;;:::o;28293:419::-;;28497:2;28486:9;28482:18;28474:26;;28546:9;28540:4;28536:20;28532:1;28521:9;28517:17;28510:47;28574:131;28700:4;28574:131;:::i;:::-;28566:139;;28464:248;;;:::o;28718:419::-;;28922:2;28911:9;28907:18;28899:26;;28971:9;28965:4;28961:20;28957:1;28946:9;28942:17;28935:47;28999:131;29125:4;28999:131;:::i;:::-;28991:139;;28889:248;;;:::o;29143:419::-;;29347:2;29336:9;29332:18;29324:26;;29396:9;29390:4;29386:20;29382:1;29371:9;29367:17;29360:47;29424:131;29550:4;29424:131;:::i;:::-;29416:139;;29314:248;;;:::o;29568:419::-;;29772:2;29761:9;29757:18;29749:26;;29821:9;29815:4;29811:20;29807:1;29796:9;29792:17;29785:47;29849:131;29975:4;29849:131;:::i;:::-;29841:139;;29739:248;;;:::o;29993:419::-;;30197:2;30186:9;30182:18;30174:26;;30246:9;30240:4;30236:20;30232:1;30221:9;30217:17;30210:47;30274:131;30400:4;30274:131;:::i;:::-;30266:139;;30164:248;;;:::o;30418:419::-;;30622:2;30611:9;30607:18;30599:26;;30671:9;30665:4;30661:20;30657:1;30646:9;30642:17;30635:47;30699:131;30825:4;30699:131;:::i;:::-;30691:139;;30589:248;;;:::o;30843:419::-;;31047:2;31036:9;31032:18;31024:26;;31096:9;31090:4;31086:20;31082:1;31071:9;31067:17;31060:47;31124:131;31250:4;31124:131;:::i;:::-;31116:139;;31014:248;;;:::o;31268:222::-;;31399:2;31388:9;31384:18;31376:26;;31412:71;31480:1;31469:9;31465:17;31456:6;31412:71;:::i;:::-;31366:124;;;;:::o;31496:283::-;;31562:2;31556:9;31546:19;;31604:4;31596:6;31592:17;31711:6;31699:10;31696:22;31675:18;31663:10;31660:34;31657:62;31654:2;;;31722:18;;:::i;:::-;31654:2;31762:10;31758:2;31751:22;31536:243;;;;:::o;31785:331::-;;31936:18;31928:6;31925:30;31922:2;;;31958:18;;:::i;:::-;31922:2;32043:4;32039:9;32032:4;32024:6;32020:17;32016:33;32008:41;;32104:4;32098;32094:15;32086:23;;31851:265;;;:::o;32122:332::-;;32274:18;32266:6;32263:30;32260:2;;;32296:18;;:::i;:::-;32260:2;32381:4;32377:9;32370:4;32362:6;32358:17;32354:33;32346:41;;32442:4;32436;32432:15;32424:23;;32189:265;;;:::o;32460:98::-;;32545:5;32539:12;32529:22;;32518:40;;;:::o;32564:99::-;;32650:5;32644:12;32634:22;;32623:40;;;:::o;32669:168::-;;32786:6;32781:3;32774:19;32826:4;32821:3;32817:14;32802:29;;32764:73;;;;:::o;32843:147::-;;32981:3;32966:18;;32956:34;;;;:::o;32996:169::-;;33114:6;33109:3;33102:19;33154:4;33149:3;33145:14;33130:29;;33092:73;;;;:::o;33171:148::-;;33310:3;33295:18;;33285:34;;;;:::o;33325:305::-;;33384:20;33402:1;33384:20;:::i;:::-;33379:25;;33418:20;33436:1;33418:20;:::i;:::-;33413:25;;33572:1;33504:66;33500:74;33497:1;33494:81;33491:2;;;33578:18;;:::i;:::-;33491:2;33622:1;33619;33615:9;33608:16;;33369:261;;;;:::o;33636:185::-;;33693:20;33711:1;33693:20;:::i;:::-;33688:25;;33727:20;33745:1;33727:20;:::i;:::-;33722:25;;33766:1;33756:2;;33771:18;;:::i;:::-;33756:2;33813:1;33810;33806:9;33801:14;;33678:143;;;;:::o;33827:191::-;;33887:20;33905:1;33887:20;:::i;:::-;33882:25;;33921:20;33939:1;33921:20;:::i;:::-;33916:25;;33960:1;33957;33954:8;33951:2;;;33965:18;;:::i;:::-;33951:2;34010:1;34007;34003:9;33995:17;;33872:146;;;;:::o;34024:96::-;;34090:24;34108:5;34090:24;:::i;:::-;34079:35;;34069:51;;;:::o;34126:104::-;;34200:24;34218:5;34200:24;:::i;:::-;34189:35;;34179:51;;;:::o;34236:90::-;;34313:5;34306:13;34299:21;34288:32;;34278:48;;;:::o;34332:77::-;;34398:5;34387:16;;34377:32;;;:::o;34415:149::-;;34491:66;34484:5;34480:78;34469:89;;34459:105;;;:::o;34570:126::-;;34647:42;34640:5;34636:54;34625:65;;34615:81;;;:::o;34702:77::-;;34768:5;34757:16;;34747:32;;;:::o;34785:154::-;34869:6;34864:3;34859;34846:30;34931:1;34922:6;34917:3;34913:16;34906:27;34836:103;;;:::o;34945:307::-;35013:1;35023:113;35037:6;35034:1;35031:13;35023:113;;;35122:1;35117:3;35113:11;35107:18;35103:1;35098:3;35094:11;35087:39;35059:2;35056:1;35052:10;35047:15;;35023:113;;;35154:6;35151:1;35148:13;35145:2;;;35234:1;35225:6;35220:3;35216:16;35209:27;35145:2;34994:258;;;;:::o;35258:320::-;;35339:1;35333:4;35329:12;35319:22;;35386:1;35380:4;35376:12;35407:18;35397:2;;35463:4;35455:6;35451:17;35441:27;;35397:2;35525;35517:6;35514:14;35494:18;35491:38;35488:2;;;35544:18;;:::i;:::-;35488:2;35309:269;;;;:::o;35584:233::-;;35646:24;35664:5;35646:24;:::i;:::-;35637:33;;35692:66;35685:5;35682:77;35679:2;;;35762:18;;:::i;:::-;35679:2;35809:1;35802:5;35798:13;35791:20;;35627:190;;;:::o;35823:100::-;;35891:26;35911:5;35891:26;:::i;:::-;35880:37;;35870:53;;;:::o;35929:79::-;;35997:5;35986:16;;35976:32;;;:::o;36014:94::-;;36082:20;36096:5;36082:20;:::i;:::-;36071:31;;36061:47;;;:::o;36114:176::-;;36163:20;36181:1;36163:20;:::i;:::-;36158:25;;36197:20;36215:1;36197:20;:::i;:::-;36192:25;;36236:1;36226:2;;36241:18;;:::i;:::-;36226:2;36282:1;36279;36275:9;36270:14;;36148:142;;;;:::o;36296:180::-;36344:77;36341:1;36334:88;36441:4;36438:1;36431:15;36465:4;36462:1;36455:15;36482:180;36530:77;36527:1;36520:88;36627:4;36624:1;36617:15;36651:4;36648:1;36641:15;36668:180;36716:77;36713:1;36706:88;36813:4;36810:1;36803:15;36837:4;36834:1;36827:15;36854:180;36902:77;36899:1;36892:88;36999:4;36996:1;36989:15;37023:4;37020:1;37013:15;37040:102;;37132:2;37128:7;37123:2;37116:5;37112:14;37108:28;37098:38;;37088:54;;;:::o;37148:94::-;;37229:5;37225:2;37221:14;37200:35;;37190:52;;;:::o;37248:122::-;37321:24;37339:5;37321:24;:::i;:::-;37314:5;37311:35;37301:2;;37360:1;37357;37350:12;37301:2;37291:79;:::o;37376:138::-;37457:32;37483:5;37457:32;:::i;:::-;37450:5;37447:43;37437:2;;37504:1;37501;37494:12;37437:2;37427:87;:::o;37520:116::-;37590:21;37605:5;37590:21;:::i;:::-;37583:5;37580:32;37570:2;;37626:1;37623;37616:12;37570:2;37560:76;:::o;37642:122::-;37715:24;37733:5;37715:24;:::i;:::-;37708:5;37705:35;37695:2;;37754:1;37751;37744:12;37695:2;37685:79;:::o;37770:120::-;37842:23;37859:5;37842:23;:::i;:::-;37835:5;37832:34;37822:2;;37880:1;37877;37870:12;37822:2;37812:78;:::o;37896:122::-;37969:24;37987:5;37969:24;:::i;:::-;37962:5;37959:35;37949:2;;38008:1;38005;37998:12;37949:2;37939:79;:::o

Swarm Source

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