ETH Price: $2,974.21 (+3.81%)
Gas: 1 Gwei

Token

CosaMonstra (CM)
 

Overview

Max Total Supply

1,322 CM

Holders

364

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
2 CM
0xaD015f00D380da858c76D736Ff0F266608dB0D98
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:
CosaMonstra

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT
// File: @openzeppelin/contracts/utils/Strings.sol
// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/cryptography/MerkleProof.sol


// OpenZeppelin Contracts (last updated v4.6.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.
 *
 * WARNING: You should avoid using leaf values that are 64 bytes long prior to
 * hashing, or use a hash function other than keccak256 for hashing leaves.
 * This is because the concatenation of a sorted pair of internal nodes in
 * the merkle tree could be reinterpreted as a leaf value.
 */
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 Merkle 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 = _efficientHash(computedHash, proofElement);
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = _efficientHash(proofElement, computedHash);
            }
        }
        return computedHash;
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

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


// OpenZeppelin Contracts v4.4.1 (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: @openzeppelin/contracts/utils/Context.sol


// OpenZeppelin Contracts v4.4.1 (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: @openzeppelin/contracts/access/Ownable.sol


// OpenZeppelin Contracts v4.4.1 (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: @openzeppelin/contracts/utils/Address.sol


// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @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
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 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: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol


// OpenZeppelin Contracts v4.4.1 (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: @openzeppelin/contracts/utils/introspection/IERC165.sol


// OpenZeppelin Contracts v4.4.1 (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: @openzeppelin/contracts/utils/introspection/ERC165.sol


// OpenZeppelin Contracts v4.4.1 (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: @openzeppelin/contracts/token/ERC721/IERC721.sol


// OpenZeppelin Contracts v4.4.1 (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: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol


// OpenZeppelin Contracts v4.4.1 (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/chiru-labs/ERC721A/blob/main/contracts/ERC721A.sol


// Creator: Chiru Labs

pragma solidity ^0.8.4;








error ApprovalCallerNotOwnerNorApproved();
error ApprovalQueryForNonexistentToken();
error ApproveToCaller();
error ApprovalToCurrentOwner();
error BalanceQueryForZeroAddress();
error MintToZeroAddress();
error MintZeroQuantity();
error OwnerQueryForNonexistentToken();
error TransferCallerNotOwnerNorApproved();
error TransferFromIncorrectOwner();
error TransferToNonERC721ReceiverImplementer();
error TransferToZeroAddress();
error URIQueryForNonexistentToken();

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..).
 *
 * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 *
 * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721A is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Compiler will pack this into a single 256bit word.
    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Keeps track of the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
    }

    // Compiler will pack this into a single 256bit word.
    struct AddressData {
        // Realistically, 2**64-1 is more than enough.
        uint64 balance;
        // Keeps track of mint count with minimal overhead for tokenomics.
        uint64 numberMinted;
        // Keeps track of burn count with minimal overhead for tokenomics.
        uint64 numberBurned;
        // For miscellaneous variable(s) pertaining to the address
        // (e.g. number of whitelist mint slots used).
        // If there are multiple variables, please pack them into a uint64.
        uint64 aux;
    }

    // The tokenId of the next token to be minted.
    uint256 internal _currentIndex;

    // The number of tokens burned.
    uint256 internal _burnCounter;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned. See _ownershipOf implementation for details.
    mapping(uint256 => TokenOwnership) internal _ownerships;

    // Mapping owner address to address data
    mapping(address => AddressData) private _addressData;

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

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
        _currentIndex = _startTokenId();
    }

    /**
     * To change the starting tokenId, please override this function.
     */
    function _startTokenId() internal view virtual returns (uint256) {
        return 0;
    }

    /**
     * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens.
     */
    function totalSupply() public view returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than _currentIndex - _startTokenId() times
        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }

    /**
     * Returns the total amount of tokens minted in the contract.
     */
    function _totalMinted() internal view returns (uint256) {
        // Counter underflow is impossible as _currentIndex does not decrement,
        // and it is initialized to _startTokenId()
        unchecked {
            return _currentIndex - _startTokenId();
        }
    }

    /**
     * @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 override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return uint256(_addressData[owner].balance);
    }

    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner) internal view returns (uint256) {
        return uint256(_addressData[owner].numberMinted);
    }

    /**
     * Returns the number of tokens burned by or on behalf of `owner`.
     */
    function _numberBurned(address owner) internal view returns (uint256) {
        return uint256(_addressData[owner].numberBurned);
    }

    /**
     * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     */
    function _getAux(address owner) internal view returns (uint64) {
        return _addressData[owner].aux;
    }

    /**
     * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     * If there are multiple variables, please pack them into a uint64.
     */
    function _setAux(address owner, uint64 aux) internal {
        _addressData[owner].aux = aux;
    }

    /**
     * Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around in the collection over time.
     */
    function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
        uint256 curr = tokenId;

        unchecked {
            if (_startTokenId() <= curr && curr < _currentIndex) {
                TokenOwnership memory ownership = _ownerships[curr];
                if (!ownership.burned) {
                    if (ownership.addr != address(0)) {
                        return ownership;
                    }
                    // Invariant:
                    // There will always be an ownership that has an address and is not burned
                    // before an ownership that does not have an address and is not burned.
                    // Hence, curr will not underflow.
                    while (true) {
                        curr--;
                        ownership = _ownerships[curr];
                        if (ownership.addr != address(0)) {
                            return ownership;
                        }
                    }
                }
            }
        }
        revert OwnerQueryForNonexistentToken();
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view override returns (address) {
        return _ownershipOf(tokenId).addr;
    }

    /**
     * @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) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

        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 override {
        address owner = ERC721A.ownerOf(tokenId);
        if (to == owner) revert ApprovalToCurrentOwner();

        if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) {
            revert ApprovalCallerNotOwnerNorApproved();
        }

        _approve(to, tokenId, owner);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        if (operator == _msgSender()) revert ApproveToCaller();

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

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

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        _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 {
        _transfer(from, to, tokenId);
        if (to.isContract() && !_checkContractOnERC721Received(from, to, tokenId, _data)) {
            revert TransferToNonERC721ReceiverImplementer();
        }
    }

    /**
     * @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`),
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        return _startTokenId() <= tokenId && tokenId < _currentIndex &&
            !_ownerships[tokenId].burned;
    }

    function _safeMint(address to, uint256 quantity) internal {
        _safeMint(to, quantity, '');
    }

    /**
     * @dev Safely mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        _mint(to, quantity, _data, true);
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _mint(
        address to,
        uint256 quantity,
        bytes memory _data,
        bool safe
    ) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            _addressData[to].balance += uint64(quantity);
            _addressData[to].numberMinted += uint64(quantity);

            _ownerships[startTokenId].addr = to;
            _ownerships[startTokenId].startTimestamp = uint64(block.timestamp);

            uint256 updatedIndex = startTokenId;
            uint256 end = updatedIndex + quantity;

            if (safe && to.isContract()) {
                do {
                    emit Transfer(address(0), to, updatedIndex);
                    if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (updatedIndex != end);
                // Reentrancy protection
                if (_currentIndex != startTokenId) revert();
            } else {
                do {
                    emit Transfer(address(0), to, updatedIndex++);
                } while (updatedIndex != end);
            }
            _currentIndex = updatedIndex;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * 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
    ) private {
        TokenOwnership memory prevOwnership = _ownershipOf(tokenId);

        if (prevOwnership.addr != from) revert TransferFromIncorrectOwner();

        bool isApprovedOrOwner = (_msgSender() == from ||
            isApprovedForAll(from, _msgSender()) ||
            getApproved(tokenId) == _msgSender());

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            _addressData[from].balance -= 1;
            _addressData[to].balance += 1;

            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = to;
            currSlot.startTimestamp = uint64(block.timestamp);

            // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(from, to, tokenId);
        _afterTokenTransfers(from, to, tokenId, 1);
    }

    /**
     * @dev This is equivalent to _burn(tokenId, false)
     */
    function _burn(uint256 tokenId) internal virtual {
        _burn(tokenId, false);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId, bool approvalCheck) internal virtual {
        TokenOwnership memory prevOwnership = _ownershipOf(tokenId);

        address from = prevOwnership.addr;

        if (approvalCheck) {
            bool isApprovedOrOwner = (_msgSender() == from ||
                isApprovedForAll(from, _msgSender()) ||
                getApproved(tokenId) == _msgSender());

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

        _beforeTokenTransfers(from, address(0), tokenId, 1);

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            AddressData storage addressData = _addressData[from];
            addressData.balance -= 1;
            addressData.numberBurned += 1;

            // Keep track of who burned the token, and the timestamp of burning.
            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = from;
            currSlot.startTimestamp = uint64(block.timestamp);
            currSlot.burned = true;

            // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(from, address(0), tokenId);
        _afterTokenTransfers(from, address(0), tokenId, 1);

        // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times.
        unchecked {
            _burnCounter++;
        }
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(
        address to,
        uint256 tokenId,
        address owner
    ) private {
        _tokenApprovals[tokenId] = to;
        emit Approval(owner, to, tokenId);
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target 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 _checkContractOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
            return retval == IERC721Receiver(to).onERC721Received.selector;
        } catch (bytes memory reason) {
            if (reason.length == 0) {
                revert TransferToNonERC721ReceiverImplementer();
            } else {
                assembly {
                    revert(add(32, reason), mload(reason))
                }
            }
        }
    }

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
     * And also called before burning one token.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * 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, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes
     * minting.
     * And also called after one token has been burned.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been
     * transferred to `to`.
     * - When `from` is zero, `tokenId` has been minted for `to`.
     * - When `to` is zero, `tokenId` has been burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}
}

// File: contracts/city.sol


// File: @openzeppelin/contracts/utils/Strings.sol
/*

 ▄████▄   ▒█████    ██████  ▄▄▄       ███▄ ▄███▓ ▒█████   ███▄    █   ██████ ▄▄▄█████▓ ██▀███   ▄▄▄      
▒██▀ ▀█  ▒██▒  ██▒▒██    ▒ ▒████▄    ▓██▒▀█▀ ██▒▒██▒  ██▒ ██ ▀█   █ ▒██    ▒ ▓  ██▒ ▓▒▓██ ▒ ██▒▒████▄    
▒▓█    ▄ ▒██░  ██▒░ ▓██▄   ▒██  ▀█▄  ▓██    ▓██░▒██░  ██▒▓██  ▀█ ██▒░ ▓██▄   ▒ ▓██░ ▒░▓██ ░▄█ ▒▒██  ▀█▄  
▒▓▓▄ ▄██▒▒██   ██░  ▒   ██▒░██▄▄▄▄██ ▒██    ▒██ ▒██   ██░▓██▒  ▐▌██▒  ▒   ██▒░ ▓██▓ ░ ▒██▀▀█▄  ░██▄▄▄▄██ 
▒ ▓███▀ ░░ ████▓▒░▒██████▒▒ ▓█   ▓██▒▒██▒   ░██▒░ ████▓▒░▒██░   ▓██░▒██████▒▒  ▒██▒ ░ ░██▓ ▒██▒ ▓█   ▓██▒
░ ░▒ ▒  ░░ ▒░▒░▒░ ▒ ▒▓▒ ▒ ░ ▒▒   ▓▒█░░ ▒░   ░  ░░ ▒░▒░▒░ ░ ▒░   ▒ ▒ ▒ ▒▓▒ ▒ ░  ▒ ░░   ░ ▒▓ ░▒▓░ ▒▒   ▓▒█░
  ░  ▒     ░ ▒ ▒░ ░ ░▒  ░ ░  ▒   ▒▒ ░░  ░      ░  ░ ▒ ▒░ ░ ░░   ░ ▒░░ ░▒  ░ ░    ░      ░▒ ░ ▒░  ▒   ▒▒ ░
░        ░ ░ ░ ▒  ░  ░  ░    ░   ▒   ░      ░   ░ ░ ░ ▒     ░   ░ ░ ░  ░  ░    ░        ░░   ░   ░   ▒   
░ ░          ░ ░        ░        ░  ░       ░       ░ ░           ░       ░              ░           ░  ░
░                                                                                                        

*/

pragma solidity >=0.8.9 <0.9.0;




contract CosaMonstra is Ownable, ERC721A {
    
    uint public tokenPrice = 0.18 ether;
    uint public collectionSize = 10000;
    uint public totalMinted = 0;
    // developer reserve
    uint public constant devReserve = 300; 
    uint public walletLimit = 2;
    string public baseURI;
    uint public maxPerTransaction = 500;  
    
    uint public salesStatus = 0; // 0 Not Started, 1 WL, 2 public

    // allow list claim mapping
    mapping(address => uint) private inkedClaimed;

    // wl proof
    bytes32 private wlProof = 0xf90e183b280962456fda7f7930e5642efde880ae4c74a63230921e80fac6947a; 

    // treasury wallets
    address private gc = 0x9cEF3fA94B0bA1B03DE8d6bE6412196651d3fEc0;
    address private yt = 0xe535903F6CD3F789a72b274f8Bc89b3cE0108b0a;
    address private el = 0x7f5b1146d1271B39477e4131978381210F422F8d;
    address private com = 0x439fCAe2ac5020c64a14DA26D1277F4C0BD53dE9;

    constructor() ERC721A("CosaMonstra", "CM"){
        

        // mint first to company
        _safeMint(0x439fCAe2ac5020c64a14DA26D1277F4C0BD53dE9,1);
        totalMinted +=1;
    }


    // buy cities
   function buy(uint _count) public payable{
        // check public sales status 
        require(salesStatus == 2, "Wait for public sale to open");
        // check token count
        require(_count > 0, "Mint at least one token");
        // check transaction limit
        require(_count <= walletLimit, "Max per sale limit reached");
        // check token supply
        require(totalMinted + devReserve + _count <= collectionSize, "Sold Out");
        // check wallet limit
        require(inkedClaimed[msg.sender] + _count < walletLimit, "Max per wallet limit reached");
        // check eth amount
        require(msg.value >= tokenPrice * _count, "Ether value sent is not correct");
        // mint
        _safeMint(msg.sender, _count);
        // update claimed supply
        totalMinted += _count;
        // update wallet claim
        inkedClaimed[msg.sender] += _count;
    }

    // buy premint
    function buyPreMint(bytes32[] calldata _merkelProof, uint _count) public payable {
        // check wl mint
        require(salesStatus == 1, "Wait for allowlist sale to open");
        // check wl wallet limit
        require(inkedClaimed[msg.sender] + _count < walletLimit, "Max per wallet limit reached try public sale");
        // sender hex
        bytes32 senderHex = keccak256(abi.encodePacked(msg.sender)); 
        // check wl 
        require(MerkleProof.verify(_merkelProof, wlProof, senderHex), "This wallet is not on allowlist try public sale");
        // check token count
        require(_count > 0, "Mint at least one token");
        // check transaction limit
        require(_count <= walletLimit, "Max per sale limit reached");
        // check token supply
        require(totalMinted + devReserve + _count <= collectionSize, "Sold Out");
        // check eth amount
        require(msg.value >= tokenPrice * _count, "Ether value sent is not correct");
        // mint
        _safeMint(msg.sender, _count);
        // update claimed supply
        totalMinted += _count;
        // update wl claim
        inkedClaimed[msg.sender] += _count;
    }


    // gift 1 city to multiple wallets 
    function sendGifts(address[] memory _wallets) public onlyOwner{
        require(_wallets.length > 0, "Mint at least one token");
        require(_wallets.length <= maxPerTransaction, "Max per transaction limit reached");
        require(totalMinted +  _wallets.length  <= collectionSize, "not enough tokens left");
        for(uint i = 0; i < _wallets.length; i++)
            _safeMint(_wallets[i], 1);
        totalMinted += 1;
    }
    
    // gift cities to one wallet
    function sendGiftsToWallet(address  wallet, uint count) public onlyOwner{
        require(count > 0, "mint at least one token");
        require(count <= maxPerTransaction, "Max per transaction limit reached");
        require(totalMinted +  count  <= collectionSize, "not enough tokens left");
        _safeMint(wallet, count);
        totalMinted += count;
    }  
    
    //burn cities
    function burn(uint tokenId) public {
        require(_msgSender() == ownerOf(tokenId), "Caller is not owner nor approved");
        _burn(tokenId);
        totalMinted -=1;
    }

    // get sales status 
    // 0 Not Started
    // 1 WL
    // 2 Public
    function getSalesStatus () public view returns(uint){
        return salesStatus;
    }

    // set sales status
    function setSaleStatus(uint tempStatus) external onlyOwner {
        salesStatus = tempStatus;
    }

    // set sales status with wallet limit
    function setSaleStatusWLimit(uint tempStatus, uint tempLimit) external onlyOwner {
        salesStatus = tempStatus;
        walletLimit = tempLimit;
    }

    // set price
    function setPrice(uint price) external onlyOwner {
        tokenPrice = price;
    }

    // get price
    function getPrice() public view returns(uint){
        return tokenPrice;
    }
    
    // set per wallet token limit
    function setWaletLimit(uint _limit) external onlyOwner{
        walletLimit = _limit;
    }

    // get per wallet token limit
    function getWaletLimit() public view returns(uint){
        return walletLimit;
    }


    // set per transaction token limit
    function setTransactionLimit(uint _limit) external onlyOwner{
        maxPerTransaction = _limit;
    }

    // get per transaction token limit
    function getTransactionLimit() public view returns(uint){
        return maxPerTransaction;
    }

    // set WL proof
    function setWlProof(bytes32 proof) external onlyOwner{
        wlProof = proof;
    }

    // set collection supply
    function setCollectionSize(uint supply) external onlyOwner {
        collectionSize = supply;
    }

    // get collection supply
    function getCollectionSize() public view returns(uint){
        return collectionSize;
    }

    // set base URI
    function setBaseUri(string memory _uri) external onlyOwner {
        baseURI = _uri;
    }

    // get claims
    function getClaims(address wallet) public view returns(uint){
        return inkedClaimed[wallet];
    }

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

    
    function setGCWallet(address adrs) external onlyOwner{
        gc = adrs;
    }

    function setYTWallet(address adrs) external onlyOwner{
        yt = adrs;
    }

    function setELWallet(address adrs) external onlyOwner{
        el = adrs;
    }

    function setCOMWallet(address adrs) external onlyOwner{
        com = adrs;
    }

    // take out
    function withdraw() external onlyOwner {
               uint _pay = address(this).balance/4;
        payable(gc).transfer(_pay); 
        payable(yt).transfer(_pay); 
        payable(el).transfer(_pay); 
        payable(com).transfer(address(this).balance); 
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721A) returns (bool) {
        return super.supportsInterface(interfaceId);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"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":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"buy","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_merkelProof","type":"bytes32[]"},{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"buyPreMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"collectionSize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"devReserve","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"getClaims","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCollectionSize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSalesStatus","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTransactionLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getWaletLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"maxPerTransaction","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"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":[],"name":"salesStatus","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_wallets","type":"address[]"}],"name":"sendGifts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"},{"internalType":"uint256","name":"count","type":"uint256"}],"name":"sendGiftsToWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"setBaseUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"adrs","type":"address"}],"name":"setCOMWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"supply","type":"uint256"}],"name":"setCollectionSize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"adrs","type":"address"}],"name":"setELWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"adrs","type":"address"}],"name":"setGCWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tempStatus","type":"uint256"}],"name":"setSaleStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tempStatus","type":"uint256"},{"internalType":"uint256","name":"tempLimit","type":"uint256"}],"name":"setSaleStatusWLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_limit","type":"uint256"}],"name":"setTransactionLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_limit","type":"uint256"}],"name":"setWaletLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"proof","type":"bytes32"}],"name":"setWlProof","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"adrs","type":"address"}],"name":"setYTWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"walletLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405267027f7d0bdb920000600955612710600a556000600b556002600c556101f4600e556000600f557ff90e183b280962456fda7f7930e5642efde880ae4c74a63230921e80fac6947a60001b601155739cef3fa94b0ba1b03de8d6be6412196651d3fec0601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073e535903f6cd3f789a72b274f8bc89b3ce0108b0a601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550737f5b1146d1271b39477e4131978381210f422f8d601460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073439fcae2ac5020c64a14da26d1277f4c0bd53de9601560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550348015620001b357600080fd5b506040518060400160405280600b81526020017f436f73614d6f6e737472610000000000000000000000000000000000000000008152506040518060400160405280600281526020017f434d0000000000000000000000000000000000000000000000000000000000008152506200024062000234620002d360201b60201c565b620002db60201b60201c565b81600390805190602001906200025892919062000982565b5080600490805190602001906200027192919062000982565b50620002826200039f60201b60201c565b6001819055505050620002b173439fcae2ac5020c64a14da26d1277f4c0bd53de96001620003a460201b60201c565b6001600b6000828254620002c6919062000a6b565b9250508190555062000d0f565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600090565b620003c6828260405180602001604052806000815250620003ca60201b60201c565b5050565b620003df8383836001620003e460201b60201c565b505050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141562000453576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008414156200048f576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620004a46000868387620007e160201b60201c565b83600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846005600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426005600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000819050600085820190508380156200067c57506200067b8773ffffffffffffffffffffffffffffffffffffffff16620007e760201b620028071760201c565b5b156200074f575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4620006fa60008884806001019550886200080a60201b60201c565b62000731576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80821415620006835782600154146200074957600080fd5b620007bc565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082141562000750575b816001819055505050620007da60008683876200097c60201b60201c565b5050505050565b50505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0262000838620002d360201b60201c565b8786866040518563ffffffff1660e01b81526004016200085c949392919062000bc2565b602060405180830381600087803b1580156200087757600080fd5b505af1925050508015620008ab57506040513d601f19601f82011682018060405250810190620008a8919062000c78565b60015b62000929573d8060008114620008de576040519150601f19603f3d011682016040523d82523d6000602084013e620008e3565b606091505b5060008151141562000921576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b50505050565b828054620009909062000cd9565b90600052602060002090601f016020900481019282620009b4576000855562000a00565b82601f10620009cf57805160ff191683800117855562000a00565b8280016001018555821562000a00579182015b82811115620009ff578251825591602001919060010190620009e2565b5b50905062000a0f919062000a13565b5090565b5b8082111562000a2e57600081600090555060010162000a14565b5090565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000a788262000a32565b915062000a858362000a32565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562000abd5762000abc62000a3c565b5b828201905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000af58262000ac8565b9050919050565b62000b078162000ae8565b82525050565b62000b188162000a32565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b8381101562000b5a57808201518184015260208101905062000b3d565b8381111562000b6a576000848401525b50505050565b6000601f19601f8301169050919050565b600062000b8e8262000b1e565b62000b9a818562000b29565b935062000bac81856020860162000b3a565b62000bb78162000b70565b840191505092915050565b600060808201905062000bd9600083018762000afc565b62000be8602083018662000afc565b62000bf7604083018562000b0d565b818103606083015262000c0b818462000b81565b905095945050505050565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b62000c528162000c1b565b811462000c5e57600080fd5b50565b60008151905062000c728162000c47565b92915050565b60006020828403121562000c915762000c9062000c16565b5b600062000ca18482850162000c61565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000cf257607f821691505b6020821081141562000d095762000d0862000caa565b5b50919050565b6153d28062000d1f6000396000f3fe6080604052600436106102ae5760003560e01c806384c870db11610175578063c3743cff116100dc578063d96a094a11610095578063f29f15af1161006f578063f29f15af14610a56578063f2fde38b14610a7f578063fa75494d14610aa8578063fcd2a42714610ad1576102ae565b8063d96a094a146109d4578063da47f767146109f0578063e985e9c514610a19576102ae565b8063c3743cff146108b2578063c819c79c146108dd578063c87b56dd14610906578063d0d46a0b14610943578063d1e8decf14610980578063d1f919ed146109ab576102ae565b806398d5fdca1161012e57806398d5fdca146107b8578063a0bcfc7f146107e3578063a22cb4651461080c578063a2309ff814610835578063aca8ffe714610860578063b88d4fde14610889576102ae565b806384c870db146106bc578063875c85e4146106e55780638b2c92ab1461070e5780638da5cb5b1461073957806391b7f5ed1461076457806395d89b411461078d576102ae565b806345c0f533116102195780636c0360eb116101d25780636c0360eb146105be57806370a08231146105e9578063715018a6146106265780637155c1ea1461063d5780637c8255db146106685780637ff9b59614610691576102ae565b806345c0f533146104bd5780634b980d67146104e85780635b7f8869146105135780636352211e1461053c578063644a4efc1461057957806364bfa54614610595576102ae565b80632daea42a1161026b5780632daea42a146103d557806337d2047b146103fe5780633c8463a1146104295780633ccfd60b1461045457806342842e0e1461046b57806342966c6814610494576102ae565b806301ffc9a7146102b357806306fdde03146102f0578063081812fc1461031b578063095ea7b31461035857806318160ddd1461038157806323b872dd146103ac575b600080fd5b3480156102bf57600080fd5b506102da60048036038101906102d59190613fdd565b610afc565b6040516102e79190614025565b60405180910390f35b3480156102fc57600080fd5b50610305610b0e565b60405161031291906140d9565b60405180910390f35b34801561032757600080fd5b50610342600480360381019061033d9190614131565b610ba0565b60405161034f919061419f565b60405180910390f35b34801561036457600080fd5b5061037f600480360381019061037a91906141e6565b610c1c565b005b34801561038d57600080fd5b50610396610d27565b6040516103a39190614235565b60405180910390f35b3480156103b857600080fd5b506103d360048036038101906103ce9190614250565b610d3e565b005b3480156103e157600080fd5b506103fc60048036038101906103f79190614131565b610d4e565b005b34801561040a57600080fd5b50610413610dd4565b6040516104209190614235565b60405180910390f35b34801561043557600080fd5b5061043e610dda565b60405161044b9190614235565b60405180910390f35b34801561046057600080fd5b50610469610de0565b005b34801561047757600080fd5b50610492600480360381019061048d9190614250565b611014565b005b3480156104a057600080fd5b506104bb60048036038101906104b69190614131565b611034565b005b3480156104c957600080fd5b506104d26110d7565b6040516104df9190614235565b60405180910390f35b3480156104f457600080fd5b506104fd6110dd565b60405161050a9190614235565b60405180910390f35b34801561051f57600080fd5b5061053a600480360381019061053591906142d9565b6110e3565b005b34801561054857600080fd5b50610563600480360381019061055e9190614131565b611169565b604051610570919061419f565b60405180910390f35b610593600480360381019061058e919061436b565b61117f565b005b3480156105a157600080fd5b506105bc60048036038101906105b79190614131565b6114c0565b005b3480156105ca57600080fd5b506105d3611546565b6040516105e091906140d9565b60405180910390f35b3480156105f557600080fd5b50610610600480360381019061060b91906143cb565b6115d4565b60405161061d9190614235565b60405180910390f35b34801561063257600080fd5b5061063b6116a4565b005b34801561064957600080fd5b5061065261172c565b60405161065f9190614235565b60405180910390f35b34801561067457600080fd5b5061068f600480360381019061068a9190614536565b611736565b005b34801561069d57600080fd5b506106a66118f1565b6040516106b39190614235565b60405180910390f35b3480156106c857600080fd5b506106e360048036038101906106de919061457f565b6118f7565b005b3480156106f157600080fd5b5061070c600480360381019061070791906143cb565b611985565b005b34801561071a57600080fd5b50610723611a45565b6040516107309190614235565b60405180910390f35b34801561074557600080fd5b5061074e611a4f565b60405161075b919061419f565b60405180910390f35b34801561077057600080fd5b5061078b60048036038101906107869190614131565b611a78565b005b34801561079957600080fd5b506107a2611afe565b6040516107af91906140d9565b60405180910390f35b3480156107c457600080fd5b506107cd611b90565b6040516107da9190614235565b60405180910390f35b3480156107ef57600080fd5b5061080a60048036038101906108059190614674565b611b9a565b005b34801561081857600080fd5b50610833600480360381019061082e91906146e9565b611c30565b005b34801561084157600080fd5b5061084a611da8565b6040516108579190614235565b60405180910390f35b34801561086c57600080fd5b5061088760048036038101906108829190614131565b611dae565b005b34801561089557600080fd5b506108b060048036038101906108ab91906147ca565b611e34565b005b3480156108be57600080fd5b506108c7611eb0565b6040516108d49190614235565b60405180910390f35b3480156108e957600080fd5b5061090460048036038101906108ff91906143cb565b611eba565b005b34801561091257600080fd5b5061092d60048036038101906109289190614131565b611f7a565b60405161093a91906140d9565b60405180910390f35b34801561094f57600080fd5b5061096a600480360381019061096591906143cb565b612019565b6040516109779190614235565b60405180910390f35b34801561098c57600080fd5b50610995612062565b6040516109a29190614235565b60405180910390f35b3480156109b757600080fd5b506109d260048036038101906109cd91906141e6565b61206c565b005b6109ee60048036038101906109e99190614131565b6121e9565b005b3480156109fc57600080fd5b50610a176004803603810190610a1291906143cb565b61246f565b005b348015610a2557600080fd5b50610a406004803603810190610a3b919061484d565b61252f565b604051610a4d9190614025565b60405180910390f35b348015610a6257600080fd5b50610a7d6004803603810190610a789190614131565b6125c3565b005b348015610a8b57600080fd5b50610aa66004803603810190610aa191906143cb565b612649565b005b348015610ab457600080fd5b50610acf6004803603810190610aca91906143cb565b612741565b005b348015610add57600080fd5b50610ae6612801565b604051610af39190614235565b60405180910390f35b6000610b078261282a565b9050919050565b606060038054610b1d906148bc565b80601f0160208091040260200160405190810160405280929190818152602001828054610b49906148bc565b8015610b965780601f10610b6b57610100808354040283529160200191610b96565b820191906000526020600020905b815481529060010190602001808311610b7957829003601f168201915b5050505050905090565b6000610bab8261290c565b610be1576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c2782611169565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c8f576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610cae61295a565b73ffffffffffffffffffffffffffffffffffffffff1614158015610ce05750610cde81610cd961295a565b61252f565b155b15610d17576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d22838383612962565b505050565b6000610d31612a14565b6002546001540303905090565b610d49838383612a19565b505050565b610d5661295a565b73ffffffffffffffffffffffffffffffffffffffff16610d74611a4f565b73ffffffffffffffffffffffffffffffffffffffff1614610dca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc19061493a565b60405180910390fd5b80600c8190555050565b600f5481565b600c5481565b610de861295a565b73ffffffffffffffffffffffffffffffffffffffff16610e06611a4f565b73ffffffffffffffffffffffffffffffffffffffff1614610e5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e539061493a565b60405180910390fd5b6000600447610e6b91906149b8565b9050601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610ed5573d6000803e3d6000fd5b50601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610f3e573d6000803e3d6000fd5b50601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610fa7573d6000803e3d6000fd5b50601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015611010573d6000803e3d6000fd5b5050565b61102f83838360405180602001604052806000815250611e34565b505050565b61103d81611169565b73ffffffffffffffffffffffffffffffffffffffff1661105b61295a565b73ffffffffffffffffffffffffffffffffffffffff16146110b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a890614a35565b60405180910390fd5b6110ba81612ecf565b6001600b60008282546110cd9190614a55565b9250508190555050565b600a5481565b600e5481565b6110eb61295a565b73ffffffffffffffffffffffffffffffffffffffff16611109611a4f565b73ffffffffffffffffffffffffffffffffffffffff161461115f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111569061493a565b60405180910390fd5b8060118190555050565b600061117482612edd565b600001519050919050565b6001600f54146111c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111bb90614ad5565b60405180910390fd5b600c5481601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546112129190614af5565b10611252576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124990614bbd565b60405180910390fd5b6000336040516020016112659190614c25565b6040516020818303038152906040528051906020012090506112cb848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050506011548361316c565b61130a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130190614cb2565b60405180910390fd5b6000821161134d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134490614d1e565b60405180910390fd5b600c54821115611392576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138990614d8a565b60405180910390fd5b600a548261012c600b546113a69190614af5565b6113b09190614af5565b11156113f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e890614df6565b60405180910390fd5b816009546113ff9190614e16565b341015611441576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143890614ebc565b60405180910390fd5b61144b3383613183565b81600b600082825461145d9190614af5565b9250508190555081601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546114b39190614af5565b9250508190555050505050565b6114c861295a565b73ffffffffffffffffffffffffffffffffffffffff166114e6611a4f565b73ffffffffffffffffffffffffffffffffffffffff161461153c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115339061493a565b60405180910390fd5b80600e8190555050565b600d8054611553906148bc565b80601f016020809104026020016040519081016040528092919081815260200182805461157f906148bc565b80156115cc5780601f106115a1576101008083540402835291602001916115cc565b820191906000526020600020905b8154815290600101906020018083116115af57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561163c576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b6116ac61295a565b73ffffffffffffffffffffffffffffffffffffffff166116ca611a4f565b73ffffffffffffffffffffffffffffffffffffffff1614611720576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117179061493a565b60405180910390fd5b61172a60006131a1565b565b6000600a54905090565b61173e61295a565b73ffffffffffffffffffffffffffffffffffffffff1661175c611a4f565b73ffffffffffffffffffffffffffffffffffffffff16146117b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a99061493a565b60405180910390fd5b60008151116117f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ed90614d1e565b60405180910390fd5b600e548151111561183c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183390614f4e565b60405180910390fd5b600a548151600b5461184e9190614af5565b111561188f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188690614fba565b60405180910390fd5b60005b81518110156118d3576118c08282815181106118b1576118b0614fda565b5b60200260200101516001613183565b80806118cb90615009565b915050611892565b506001600b60008282546118e79190614af5565b9250508190555050565b60095481565b6118ff61295a565b73ffffffffffffffffffffffffffffffffffffffff1661191d611a4f565b73ffffffffffffffffffffffffffffffffffffffff1614611973576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196a9061493a565b60405180910390fd5b81600f8190555080600c819055505050565b61198d61295a565b73ffffffffffffffffffffffffffffffffffffffff166119ab611a4f565b73ffffffffffffffffffffffffffffffffffffffff1614611a01576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f89061493a565b60405180910390fd5b80601460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600f54905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611a8061295a565b73ffffffffffffffffffffffffffffffffffffffff16611a9e611a4f565b73ffffffffffffffffffffffffffffffffffffffff1614611af4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aeb9061493a565b60405180910390fd5b8060098190555050565b606060048054611b0d906148bc565b80601f0160208091040260200160405190810160405280929190818152602001828054611b39906148bc565b8015611b865780601f10611b5b57610100808354040283529160200191611b86565b820191906000526020600020905b815481529060010190602001808311611b6957829003601f168201915b5050505050905090565b6000600954905090565b611ba261295a565b73ffffffffffffffffffffffffffffffffffffffff16611bc0611a4f565b73ffffffffffffffffffffffffffffffffffffffff1614611c16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0d9061493a565b60405180910390fd5b80600d9080519060200190611c2c929190613e8b565b5050565b611c3861295a565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611c9d576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060086000611caa61295a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611d5761295a565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611d9c9190614025565b60405180910390a35050565b600b5481565b611db661295a565b73ffffffffffffffffffffffffffffffffffffffff16611dd4611a4f565b73ffffffffffffffffffffffffffffffffffffffff1614611e2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e219061493a565b60405180910390fd5b80600a8190555050565b611e3f848484612a19565b611e5e8373ffffffffffffffffffffffffffffffffffffffff16612807565b8015611e735750611e7184848484613265565b155b15611eaa576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6000600e54905090565b611ec261295a565b73ffffffffffffffffffffffffffffffffffffffff16611ee0611a4f565b73ffffffffffffffffffffffffffffffffffffffff1614611f36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2d9061493a565b60405180910390fd5b80601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6060611f858261290c565b611fbb576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611fc56133c5565b9050600081511415611fe65760405180602001604052806000815250612011565b80611ff084613457565b60405160200161200192919061508e565b6040516020818303038152906040525b915050919050565b6000601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600c54905090565b61207461295a565b73ffffffffffffffffffffffffffffffffffffffff16612092611a4f565b73ffffffffffffffffffffffffffffffffffffffff16146120e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120df9061493a565b60405180910390fd5b6000811161212b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612122906150fe565b60405180910390fd5b600e54811115612170576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216790614f4e565b60405180910390fd5b600a5481600b546121819190614af5565b11156121c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121b990614fba565b60405180910390fd5b6121cc8282613183565b80600b60008282546121de9190614af5565b925050819055505050565b6002600f541461222e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122259061516a565b60405180910390fd5b60008111612271576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226890614d1e565b60405180910390fd5b600c548111156122b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122ad90614d8a565b60405180910390fd5b600a548161012c600b546122ca9190614af5565b6122d49190614af5565b1115612315576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161230c90614df6565b60405180910390fd5b600c5481601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546123639190614af5565b106123a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161239a906151d6565b60405180910390fd5b806009546123b19190614e16565b3410156123f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ea90614ebc565b60405180910390fd5b6123fd3382613183565b80600b600082825461240f9190614af5565b9250508190555080601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124659190614af5565b9250508190555050565b61247761295a565b73ffffffffffffffffffffffffffffffffffffffff16612495611a4f565b73ffffffffffffffffffffffffffffffffffffffff16146124eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124e29061493a565b60405180910390fd5b80601560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6125cb61295a565b73ffffffffffffffffffffffffffffffffffffffff166125e9611a4f565b73ffffffffffffffffffffffffffffffffffffffff161461263f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126369061493a565b60405180910390fd5b80600f8190555050565b61265161295a565b73ffffffffffffffffffffffffffffffffffffffff1661266f611a4f565b73ffffffffffffffffffffffffffffffffffffffff16146126c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126bc9061493a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612735576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161272c90615268565b60405180910390fd5b61273e816131a1565b50565b61274961295a565b73ffffffffffffffffffffffffffffffffffffffff16612767611a4f565b73ffffffffffffffffffffffffffffffffffffffff16146127bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127b49061493a565b60405180910390fd5b80601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61012c81565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806128f557507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806129055750612904826135b8565b5b9050919050565b600081612917612a14565b11158015612926575060015482105b8015612953575060056000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826007600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b6000612a2482612edd565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612a8f576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16612ab061295a565b73ffffffffffffffffffffffffffffffffffffffff161480612adf5750612ade85612ad961295a565b61252f565b5b80612b245750612aed61295a565b73ffffffffffffffffffffffffffffffffffffffff16612b0c84610ba0565b73ffffffffffffffffffffffffffffffffffffffff16145b905080612b5d576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612bc4576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612bd18585856001613622565b612bdd60008487612962565b6001600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600560008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600560008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612e5d576001548214612e5c57878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612ec88585856001613628565b5050505050565b612eda81600061362e565b50565b612ee5613f11565b600082905080612ef3612a14565b11158015612f02575060015481105b15613135576000600560008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161313357600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614613017578092505050613167565b5b60011561313257818060019003925050600560008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461312d578092505050613167565b613018565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000826131798584613a1e565b1490509392505050565b61319d828260405180602001604052806000815250613a93565b5050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261328b61295a565b8786866040518563ffffffff1660e01b81526004016132ad94939291906152dd565b602060405180830381600087803b1580156132c757600080fd5b505af19250505080156132f857506040513d601f19601f820116820180604052508101906132f5919061533e565b60015b613372573d8060008114613328576040519150601f19603f3d011682016040523d82523d6000602084013e61332d565b606091505b5060008151141561336a576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600d80546133d4906148bc565b80601f0160208091040260200160405190810160405280929190818152602001828054613400906148bc565b801561344d5780601f106134225761010080835404028352916020019161344d565b820191906000526020600020905b81548152906001019060200180831161343057829003601f168201915b5050505050905090565b6060600082141561349f576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506135b3565b600082905060005b600082146134d15780806134ba90615009565b915050600a826134ca91906149b8565b91506134a7565b60008167ffffffffffffffff8111156134ed576134ec6143f8565b5b6040519080825280601f01601f19166020018201604052801561351f5781602001600182028036833780820191505090505b5090505b600085146135ac576001826135389190614a55565b9150600a85613547919061536b565b60306135539190614af5565b60f81b81838151811061356957613568614fda565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856135a591906149b8565b9450613523565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b50505050565b50505050565b600061363983612edd565b9050600081600001519050821561371a5760008173ffffffffffffffffffffffffffffffffffffffff1661366b61295a565b73ffffffffffffffffffffffffffffffffffffffff16148061369a57506136998261369461295a565b61252f565b5b806136df57506136a861295a565b73ffffffffffffffffffffffffffffffffffffffff166136c786610ba0565b73ffffffffffffffffffffffffffffffffffffffff16145b905080613718576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b613728816000866001613622565b61373460008583612962565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060018160000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060018160000160108282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600560008781526020019081526020016000209050828160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600181600001601c6101000a81548160ff02191690831515021790555060006001870190506000600560008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561399857600154821461399757848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555085602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b5050505083600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613a06816000866001613628565b60026000815480929190600101919050555050505050565b60008082905060005b8451811015613a88576000858281518110613a4557613a44614fda565b5b60200260200101519050808311613a6757613a608382613aa5565b9250613a74565b613a718184613aa5565b92505b508080613a8090615009565b915050613a27565b508091505092915050565b613aa08383836001613abc565b505050565b600082600052816020526040600020905092915050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415613b2a576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000841415613b65576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613b726000868387613622565b83600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846005600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426005600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060008582019050838015613d3c5750613d3b8773ffffffffffffffffffffffffffffffffffffffff16612807565b5b15613e02575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613db16000888480600101955088613265565b613de7576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80821415613d42578260015414613dfd57600080fd5b613e6e565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821415613e03575b816001819055505050613e846000868387613628565b5050505050565b828054613e97906148bc565b90600052602060002090601f016020900481019282613eb95760008555613f00565b82601f10613ed257805160ff1916838001178555613f00565b82800160010185558215613f00579182015b82811115613eff578251825591602001919060010190613ee4565b5b509050613f0d9190613f54565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b80821115613f6d576000816000905550600101613f55565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613fba81613f85565b8114613fc557600080fd5b50565b600081359050613fd781613fb1565b92915050565b600060208284031215613ff357613ff2613f7b565b5b600061400184828501613fc8565b91505092915050565b60008115159050919050565b61401f8161400a565b82525050565b600060208201905061403a6000830184614016565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561407a57808201518184015260208101905061405f565b83811115614089576000848401525b50505050565b6000601f19601f8301169050919050565b60006140ab82614040565b6140b5818561404b565b93506140c581856020860161405c565b6140ce8161408f565b840191505092915050565b600060208201905081810360008301526140f381846140a0565b905092915050565b6000819050919050565b61410e816140fb565b811461411957600080fd5b50565b60008135905061412b81614105565b92915050565b60006020828403121561414757614146613f7b565b5b60006141558482850161411c565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006141898261415e565b9050919050565b6141998161417e565b82525050565b60006020820190506141b46000830184614190565b92915050565b6141c38161417e565b81146141ce57600080fd5b50565b6000813590506141e0816141ba565b92915050565b600080604083850312156141fd576141fc613f7b565b5b600061420b858286016141d1565b925050602061421c8582860161411c565b9150509250929050565b61422f816140fb565b82525050565b600060208201905061424a6000830184614226565b92915050565b60008060006060848603121561426957614268613f7b565b5b6000614277868287016141d1565b9350506020614288868287016141d1565b92505060406142998682870161411c565b9150509250925092565b6000819050919050565b6142b6816142a3565b81146142c157600080fd5b50565b6000813590506142d3816142ad565b92915050565b6000602082840312156142ef576142ee613f7b565b5b60006142fd848285016142c4565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261432b5761432a614306565b5b8235905067ffffffffffffffff8111156143485761434761430b565b5b60208301915083602082028301111561436457614363614310565b5b9250929050565b60008060006040848603121561438457614383613f7b565b5b600084013567ffffffffffffffff8111156143a2576143a1613f80565b5b6143ae86828701614315565b935093505060206143c18682870161411c565b9150509250925092565b6000602082840312156143e1576143e0613f7b565b5b60006143ef848285016141d1565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6144308261408f565b810181811067ffffffffffffffff8211171561444f5761444e6143f8565b5b80604052505050565b6000614462613f71565b905061446e8282614427565b919050565b600067ffffffffffffffff82111561448e5761448d6143f8565b5b602082029050602081019050919050565b60006144b26144ad84614473565b614458565b905080838252602082019050602084028301858111156144d5576144d4614310565b5b835b818110156144fe57806144ea88826141d1565b8452602084019350506020810190506144d7565b5050509392505050565b600082601f83011261451d5761451c614306565b5b813561452d84826020860161449f565b91505092915050565b60006020828403121561454c5761454b613f7b565b5b600082013567ffffffffffffffff81111561456a57614569613f80565b5b61457684828501614508565b91505092915050565b6000806040838503121561459657614595613f7b565b5b60006145a48582860161411c565b92505060206145b58582860161411c565b9150509250929050565b600080fd5b600067ffffffffffffffff8211156145df576145de6143f8565b5b6145e88261408f565b9050602081019050919050565b82818337600083830152505050565b6000614617614612846145c4565b614458565b905082815260208101848484011115614633576146326145bf565b5b61463e8482856145f5565b509392505050565b600082601f83011261465b5761465a614306565b5b813561466b848260208601614604565b91505092915050565b60006020828403121561468a57614689613f7b565b5b600082013567ffffffffffffffff8111156146a8576146a7613f80565b5b6146b484828501614646565b91505092915050565b6146c68161400a565b81146146d157600080fd5b50565b6000813590506146e3816146bd565b92915050565b60008060408385031215614700576146ff613f7b565b5b600061470e858286016141d1565b925050602061471f858286016146d4565b9150509250929050565b600067ffffffffffffffff821115614744576147436143f8565b5b61474d8261408f565b9050602081019050919050565b600061476d61476884614729565b614458565b905082815260208101848484011115614789576147886145bf565b5b6147948482856145f5565b509392505050565b600082601f8301126147b1576147b0614306565b5b81356147c184826020860161475a565b91505092915050565b600080600080608085870312156147e4576147e3613f7b565b5b60006147f2878288016141d1565b9450506020614803878288016141d1565b93505060406148148782880161411c565b925050606085013567ffffffffffffffff81111561483557614834613f80565b5b6148418782880161479c565b91505092959194509250565b6000806040838503121561486457614863613f7b565b5b6000614872858286016141d1565b9250506020614883858286016141d1565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806148d457607f821691505b602082108114156148e8576148e761488d565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061492460208361404b565b915061492f826148ee565b602082019050919050565b6000602082019050818103600083015261495381614917565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006149c3826140fb565b91506149ce836140fb565b9250826149de576149dd61495a565b5b828204905092915050565b7f43616c6c6572206973206e6f74206f776e6572206e6f7220617070726f766564600082015250565b6000614a1f60208361404b565b9150614a2a826149e9565b602082019050919050565b60006020820190508181036000830152614a4e81614a12565b9050919050565b6000614a60826140fb565b9150614a6b836140fb565b925082821015614a7e57614a7d614989565b5b828203905092915050565b7f5761697420666f7220616c6c6f776c6973742073616c6520746f206f70656e00600082015250565b6000614abf601f8361404b565b9150614aca82614a89565b602082019050919050565b60006020820190508181036000830152614aee81614ab2565b9050919050565b6000614b00826140fb565b9150614b0b836140fb565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614b4057614b3f614989565b5b828201905092915050565b7f4d6178207065722077616c6c6574206c696d697420726561636865642074727960008201527f207075626c69632073616c650000000000000000000000000000000000000000602082015250565b6000614ba7602c8361404b565b9150614bb282614b4b565b604082019050919050565b60006020820190508181036000830152614bd681614b9a565b9050919050565b60008160601b9050919050565b6000614bf582614bdd565b9050919050565b6000614c0782614bea565b9050919050565b614c1f614c1a8261417e565b614bfc565b82525050565b6000614c318284614c0e565b60148201915081905092915050565b7f546869732077616c6c6574206973206e6f74206f6e20616c6c6f776c6973742060008201527f747279207075626c69632073616c650000000000000000000000000000000000602082015250565b6000614c9c602f8361404b565b9150614ca782614c40565b604082019050919050565b60006020820190508181036000830152614ccb81614c8f565b9050919050565b7f4d696e74206174206c65617374206f6e6520746f6b656e000000000000000000600082015250565b6000614d0860178361404b565b9150614d1382614cd2565b602082019050919050565b60006020820190508181036000830152614d3781614cfb565b9050919050565b7f4d6178207065722073616c65206c696d69742072656163686564000000000000600082015250565b6000614d74601a8361404b565b9150614d7f82614d3e565b602082019050919050565b60006020820190508181036000830152614da381614d67565b9050919050565b7f536f6c64204f7574000000000000000000000000000000000000000000000000600082015250565b6000614de060088361404b565b9150614deb82614daa565b602082019050919050565b60006020820190508181036000830152614e0f81614dd3565b9050919050565b6000614e21826140fb565b9150614e2c836140fb565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614e6557614e64614989565b5b828202905092915050565b7f45746865722076616c75652073656e74206973206e6f7420636f727265637400600082015250565b6000614ea6601f8361404b565b9150614eb182614e70565b602082019050919050565b60006020820190508181036000830152614ed581614e99565b9050919050565b7f4d617820706572207472616e73616374696f6e206c696d69742072656163686560008201527f6400000000000000000000000000000000000000000000000000000000000000602082015250565b6000614f3860218361404b565b9150614f4382614edc565b604082019050919050565b60006020820190508181036000830152614f6781614f2b565b9050919050565b7f6e6f7420656e6f75676820746f6b656e73206c65667400000000000000000000600082015250565b6000614fa460168361404b565b9150614faf82614f6e565b602082019050919050565b60006020820190508181036000830152614fd381614f97565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000615014826140fb565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561504757615046614989565b5b600182019050919050565b600081905092915050565b600061506882614040565b6150728185615052565b935061508281856020860161405c565b80840191505092915050565b600061509a828561505d565b91506150a6828461505d565b91508190509392505050565b7f6d696e74206174206c65617374206f6e6520746f6b656e000000000000000000600082015250565b60006150e860178361404b565b91506150f3826150b2565b602082019050919050565b60006020820190508181036000830152615117816150db565b9050919050565b7f5761697420666f72207075626c69632073616c6520746f206f70656e00000000600082015250565b6000615154601c8361404b565b915061515f8261511e565b602082019050919050565b6000602082019050818103600083015261518381615147565b9050919050565b7f4d6178207065722077616c6c6574206c696d6974207265616368656400000000600082015250565b60006151c0601c8361404b565b91506151cb8261518a565b602082019050919050565b600060208201905081810360008301526151ef816151b3565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061525260268361404b565b915061525d826151f6565b604082019050919050565b6000602082019050818103600083015261528181615245565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006152af82615288565b6152b98185615293565b93506152c981856020860161405c565b6152d28161408f565b840191505092915050565b60006080820190506152f26000830187614190565b6152ff6020830186614190565b61530c6040830185614226565b818103606083015261531e81846152a4565b905095945050505050565b60008151905061533881613fb1565b92915050565b60006020828403121561535457615353613f7b565b5b600061536284828501615329565b91505092915050565b6000615376826140fb565b9150615381836140fb565b9250826153915761539061495a565b5b82820690509291505056fea26469706673582212203e6c60ef4acc7041e0db85ca995a47cd6d318e695b28d9ede7d8d744f307700b64736f6c63430008090033

Deployed Bytecode

0x6080604052600436106102ae5760003560e01c806384c870db11610175578063c3743cff116100dc578063d96a094a11610095578063f29f15af1161006f578063f29f15af14610a56578063f2fde38b14610a7f578063fa75494d14610aa8578063fcd2a42714610ad1576102ae565b8063d96a094a146109d4578063da47f767146109f0578063e985e9c514610a19576102ae565b8063c3743cff146108b2578063c819c79c146108dd578063c87b56dd14610906578063d0d46a0b14610943578063d1e8decf14610980578063d1f919ed146109ab576102ae565b806398d5fdca1161012e57806398d5fdca146107b8578063a0bcfc7f146107e3578063a22cb4651461080c578063a2309ff814610835578063aca8ffe714610860578063b88d4fde14610889576102ae565b806384c870db146106bc578063875c85e4146106e55780638b2c92ab1461070e5780638da5cb5b1461073957806391b7f5ed1461076457806395d89b411461078d576102ae565b806345c0f533116102195780636c0360eb116101d25780636c0360eb146105be57806370a08231146105e9578063715018a6146106265780637155c1ea1461063d5780637c8255db146106685780637ff9b59614610691576102ae565b806345c0f533146104bd5780634b980d67146104e85780635b7f8869146105135780636352211e1461053c578063644a4efc1461057957806364bfa54614610595576102ae565b80632daea42a1161026b5780632daea42a146103d557806337d2047b146103fe5780633c8463a1146104295780633ccfd60b1461045457806342842e0e1461046b57806342966c6814610494576102ae565b806301ffc9a7146102b357806306fdde03146102f0578063081812fc1461031b578063095ea7b31461035857806318160ddd1461038157806323b872dd146103ac575b600080fd5b3480156102bf57600080fd5b506102da60048036038101906102d59190613fdd565b610afc565b6040516102e79190614025565b60405180910390f35b3480156102fc57600080fd5b50610305610b0e565b60405161031291906140d9565b60405180910390f35b34801561032757600080fd5b50610342600480360381019061033d9190614131565b610ba0565b60405161034f919061419f565b60405180910390f35b34801561036457600080fd5b5061037f600480360381019061037a91906141e6565b610c1c565b005b34801561038d57600080fd5b50610396610d27565b6040516103a39190614235565b60405180910390f35b3480156103b857600080fd5b506103d360048036038101906103ce9190614250565b610d3e565b005b3480156103e157600080fd5b506103fc60048036038101906103f79190614131565b610d4e565b005b34801561040a57600080fd5b50610413610dd4565b6040516104209190614235565b60405180910390f35b34801561043557600080fd5b5061043e610dda565b60405161044b9190614235565b60405180910390f35b34801561046057600080fd5b50610469610de0565b005b34801561047757600080fd5b50610492600480360381019061048d9190614250565b611014565b005b3480156104a057600080fd5b506104bb60048036038101906104b69190614131565b611034565b005b3480156104c957600080fd5b506104d26110d7565b6040516104df9190614235565b60405180910390f35b3480156104f457600080fd5b506104fd6110dd565b60405161050a9190614235565b60405180910390f35b34801561051f57600080fd5b5061053a600480360381019061053591906142d9565b6110e3565b005b34801561054857600080fd5b50610563600480360381019061055e9190614131565b611169565b604051610570919061419f565b60405180910390f35b610593600480360381019061058e919061436b565b61117f565b005b3480156105a157600080fd5b506105bc60048036038101906105b79190614131565b6114c0565b005b3480156105ca57600080fd5b506105d3611546565b6040516105e091906140d9565b60405180910390f35b3480156105f557600080fd5b50610610600480360381019061060b91906143cb565b6115d4565b60405161061d9190614235565b60405180910390f35b34801561063257600080fd5b5061063b6116a4565b005b34801561064957600080fd5b5061065261172c565b60405161065f9190614235565b60405180910390f35b34801561067457600080fd5b5061068f600480360381019061068a9190614536565b611736565b005b34801561069d57600080fd5b506106a66118f1565b6040516106b39190614235565b60405180910390f35b3480156106c857600080fd5b506106e360048036038101906106de919061457f565b6118f7565b005b3480156106f157600080fd5b5061070c600480360381019061070791906143cb565b611985565b005b34801561071a57600080fd5b50610723611a45565b6040516107309190614235565b60405180910390f35b34801561074557600080fd5b5061074e611a4f565b60405161075b919061419f565b60405180910390f35b34801561077057600080fd5b5061078b60048036038101906107869190614131565b611a78565b005b34801561079957600080fd5b506107a2611afe565b6040516107af91906140d9565b60405180910390f35b3480156107c457600080fd5b506107cd611b90565b6040516107da9190614235565b60405180910390f35b3480156107ef57600080fd5b5061080a60048036038101906108059190614674565b611b9a565b005b34801561081857600080fd5b50610833600480360381019061082e91906146e9565b611c30565b005b34801561084157600080fd5b5061084a611da8565b6040516108579190614235565b60405180910390f35b34801561086c57600080fd5b5061088760048036038101906108829190614131565b611dae565b005b34801561089557600080fd5b506108b060048036038101906108ab91906147ca565b611e34565b005b3480156108be57600080fd5b506108c7611eb0565b6040516108d49190614235565b60405180910390f35b3480156108e957600080fd5b5061090460048036038101906108ff91906143cb565b611eba565b005b34801561091257600080fd5b5061092d60048036038101906109289190614131565b611f7a565b60405161093a91906140d9565b60405180910390f35b34801561094f57600080fd5b5061096a600480360381019061096591906143cb565b612019565b6040516109779190614235565b60405180910390f35b34801561098c57600080fd5b50610995612062565b6040516109a29190614235565b60405180910390f35b3480156109b757600080fd5b506109d260048036038101906109cd91906141e6565b61206c565b005b6109ee60048036038101906109e99190614131565b6121e9565b005b3480156109fc57600080fd5b50610a176004803603810190610a1291906143cb565b61246f565b005b348015610a2557600080fd5b50610a406004803603810190610a3b919061484d565b61252f565b604051610a4d9190614025565b60405180910390f35b348015610a6257600080fd5b50610a7d6004803603810190610a789190614131565b6125c3565b005b348015610a8b57600080fd5b50610aa66004803603810190610aa191906143cb565b612649565b005b348015610ab457600080fd5b50610acf6004803603810190610aca91906143cb565b612741565b005b348015610add57600080fd5b50610ae6612801565b604051610af39190614235565b60405180910390f35b6000610b078261282a565b9050919050565b606060038054610b1d906148bc565b80601f0160208091040260200160405190810160405280929190818152602001828054610b49906148bc565b8015610b965780601f10610b6b57610100808354040283529160200191610b96565b820191906000526020600020905b815481529060010190602001808311610b7957829003601f168201915b5050505050905090565b6000610bab8261290c565b610be1576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c2782611169565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c8f576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610cae61295a565b73ffffffffffffffffffffffffffffffffffffffff1614158015610ce05750610cde81610cd961295a565b61252f565b155b15610d17576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d22838383612962565b505050565b6000610d31612a14565b6002546001540303905090565b610d49838383612a19565b505050565b610d5661295a565b73ffffffffffffffffffffffffffffffffffffffff16610d74611a4f565b73ffffffffffffffffffffffffffffffffffffffff1614610dca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc19061493a565b60405180910390fd5b80600c8190555050565b600f5481565b600c5481565b610de861295a565b73ffffffffffffffffffffffffffffffffffffffff16610e06611a4f565b73ffffffffffffffffffffffffffffffffffffffff1614610e5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e539061493a565b60405180910390fd5b6000600447610e6b91906149b8565b9050601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610ed5573d6000803e3d6000fd5b50601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610f3e573d6000803e3d6000fd5b50601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610fa7573d6000803e3d6000fd5b50601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015611010573d6000803e3d6000fd5b5050565b61102f83838360405180602001604052806000815250611e34565b505050565b61103d81611169565b73ffffffffffffffffffffffffffffffffffffffff1661105b61295a565b73ffffffffffffffffffffffffffffffffffffffff16146110b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a890614a35565b60405180910390fd5b6110ba81612ecf565b6001600b60008282546110cd9190614a55565b9250508190555050565b600a5481565b600e5481565b6110eb61295a565b73ffffffffffffffffffffffffffffffffffffffff16611109611a4f565b73ffffffffffffffffffffffffffffffffffffffff161461115f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111569061493a565b60405180910390fd5b8060118190555050565b600061117482612edd565b600001519050919050565b6001600f54146111c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111bb90614ad5565b60405180910390fd5b600c5481601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546112129190614af5565b10611252576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124990614bbd565b60405180910390fd5b6000336040516020016112659190614c25565b6040516020818303038152906040528051906020012090506112cb848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050506011548361316c565b61130a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130190614cb2565b60405180910390fd5b6000821161134d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134490614d1e565b60405180910390fd5b600c54821115611392576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138990614d8a565b60405180910390fd5b600a548261012c600b546113a69190614af5565b6113b09190614af5565b11156113f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e890614df6565b60405180910390fd5b816009546113ff9190614e16565b341015611441576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143890614ebc565b60405180910390fd5b61144b3383613183565b81600b600082825461145d9190614af5565b9250508190555081601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546114b39190614af5565b9250508190555050505050565b6114c861295a565b73ffffffffffffffffffffffffffffffffffffffff166114e6611a4f565b73ffffffffffffffffffffffffffffffffffffffff161461153c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115339061493a565b60405180910390fd5b80600e8190555050565b600d8054611553906148bc565b80601f016020809104026020016040519081016040528092919081815260200182805461157f906148bc565b80156115cc5780601f106115a1576101008083540402835291602001916115cc565b820191906000526020600020905b8154815290600101906020018083116115af57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561163c576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b6116ac61295a565b73ffffffffffffffffffffffffffffffffffffffff166116ca611a4f565b73ffffffffffffffffffffffffffffffffffffffff1614611720576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117179061493a565b60405180910390fd5b61172a60006131a1565b565b6000600a54905090565b61173e61295a565b73ffffffffffffffffffffffffffffffffffffffff1661175c611a4f565b73ffffffffffffffffffffffffffffffffffffffff16146117b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a99061493a565b60405180910390fd5b60008151116117f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ed90614d1e565b60405180910390fd5b600e548151111561183c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183390614f4e565b60405180910390fd5b600a548151600b5461184e9190614af5565b111561188f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188690614fba565b60405180910390fd5b60005b81518110156118d3576118c08282815181106118b1576118b0614fda565b5b60200260200101516001613183565b80806118cb90615009565b915050611892565b506001600b60008282546118e79190614af5565b9250508190555050565b60095481565b6118ff61295a565b73ffffffffffffffffffffffffffffffffffffffff1661191d611a4f565b73ffffffffffffffffffffffffffffffffffffffff1614611973576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196a9061493a565b60405180910390fd5b81600f8190555080600c819055505050565b61198d61295a565b73ffffffffffffffffffffffffffffffffffffffff166119ab611a4f565b73ffffffffffffffffffffffffffffffffffffffff1614611a01576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f89061493a565b60405180910390fd5b80601460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600f54905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611a8061295a565b73ffffffffffffffffffffffffffffffffffffffff16611a9e611a4f565b73ffffffffffffffffffffffffffffffffffffffff1614611af4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aeb9061493a565b60405180910390fd5b8060098190555050565b606060048054611b0d906148bc565b80601f0160208091040260200160405190810160405280929190818152602001828054611b39906148bc565b8015611b865780601f10611b5b57610100808354040283529160200191611b86565b820191906000526020600020905b815481529060010190602001808311611b6957829003601f168201915b5050505050905090565b6000600954905090565b611ba261295a565b73ffffffffffffffffffffffffffffffffffffffff16611bc0611a4f565b73ffffffffffffffffffffffffffffffffffffffff1614611c16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0d9061493a565b60405180910390fd5b80600d9080519060200190611c2c929190613e8b565b5050565b611c3861295a565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611c9d576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060086000611caa61295a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611d5761295a565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611d9c9190614025565b60405180910390a35050565b600b5481565b611db661295a565b73ffffffffffffffffffffffffffffffffffffffff16611dd4611a4f565b73ffffffffffffffffffffffffffffffffffffffff1614611e2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e219061493a565b60405180910390fd5b80600a8190555050565b611e3f848484612a19565b611e5e8373ffffffffffffffffffffffffffffffffffffffff16612807565b8015611e735750611e7184848484613265565b155b15611eaa576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6000600e54905090565b611ec261295a565b73ffffffffffffffffffffffffffffffffffffffff16611ee0611a4f565b73ffffffffffffffffffffffffffffffffffffffff1614611f36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2d9061493a565b60405180910390fd5b80601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6060611f858261290c565b611fbb576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611fc56133c5565b9050600081511415611fe65760405180602001604052806000815250612011565b80611ff084613457565b60405160200161200192919061508e565b6040516020818303038152906040525b915050919050565b6000601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600c54905090565b61207461295a565b73ffffffffffffffffffffffffffffffffffffffff16612092611a4f565b73ffffffffffffffffffffffffffffffffffffffff16146120e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120df9061493a565b60405180910390fd5b6000811161212b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612122906150fe565b60405180910390fd5b600e54811115612170576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216790614f4e565b60405180910390fd5b600a5481600b546121819190614af5565b11156121c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121b990614fba565b60405180910390fd5b6121cc8282613183565b80600b60008282546121de9190614af5565b925050819055505050565b6002600f541461222e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122259061516a565b60405180910390fd5b60008111612271576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226890614d1e565b60405180910390fd5b600c548111156122b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122ad90614d8a565b60405180910390fd5b600a548161012c600b546122ca9190614af5565b6122d49190614af5565b1115612315576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161230c90614df6565b60405180910390fd5b600c5481601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546123639190614af5565b106123a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161239a906151d6565b60405180910390fd5b806009546123b19190614e16565b3410156123f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ea90614ebc565b60405180910390fd5b6123fd3382613183565b80600b600082825461240f9190614af5565b9250508190555080601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124659190614af5565b9250508190555050565b61247761295a565b73ffffffffffffffffffffffffffffffffffffffff16612495611a4f565b73ffffffffffffffffffffffffffffffffffffffff16146124eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124e29061493a565b60405180910390fd5b80601560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6125cb61295a565b73ffffffffffffffffffffffffffffffffffffffff166125e9611a4f565b73ffffffffffffffffffffffffffffffffffffffff161461263f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126369061493a565b60405180910390fd5b80600f8190555050565b61265161295a565b73ffffffffffffffffffffffffffffffffffffffff1661266f611a4f565b73ffffffffffffffffffffffffffffffffffffffff16146126c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126bc9061493a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612735576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161272c90615268565b60405180910390fd5b61273e816131a1565b50565b61274961295a565b73ffffffffffffffffffffffffffffffffffffffff16612767611a4f565b73ffffffffffffffffffffffffffffffffffffffff16146127bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127b49061493a565b60405180910390fd5b80601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61012c81565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806128f557507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806129055750612904826135b8565b5b9050919050565b600081612917612a14565b11158015612926575060015482105b8015612953575060056000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826007600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b6000612a2482612edd565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612a8f576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16612ab061295a565b73ffffffffffffffffffffffffffffffffffffffff161480612adf5750612ade85612ad961295a565b61252f565b5b80612b245750612aed61295a565b73ffffffffffffffffffffffffffffffffffffffff16612b0c84610ba0565b73ffffffffffffffffffffffffffffffffffffffff16145b905080612b5d576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612bc4576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612bd18585856001613622565b612bdd60008487612962565b6001600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600560008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600560008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612e5d576001548214612e5c57878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612ec88585856001613628565b5050505050565b612eda81600061362e565b50565b612ee5613f11565b600082905080612ef3612a14565b11158015612f02575060015481105b15613135576000600560008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161313357600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614613017578092505050613167565b5b60011561313257818060019003925050600560008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461312d578092505050613167565b613018565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000826131798584613a1e565b1490509392505050565b61319d828260405180602001604052806000815250613a93565b5050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261328b61295a565b8786866040518563ffffffff1660e01b81526004016132ad94939291906152dd565b602060405180830381600087803b1580156132c757600080fd5b505af19250505080156132f857506040513d601f19601f820116820180604052508101906132f5919061533e565b60015b613372573d8060008114613328576040519150601f19603f3d011682016040523d82523d6000602084013e61332d565b606091505b5060008151141561336a576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600d80546133d4906148bc565b80601f0160208091040260200160405190810160405280929190818152602001828054613400906148bc565b801561344d5780601f106134225761010080835404028352916020019161344d565b820191906000526020600020905b81548152906001019060200180831161343057829003601f168201915b5050505050905090565b6060600082141561349f576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506135b3565b600082905060005b600082146134d15780806134ba90615009565b915050600a826134ca91906149b8565b91506134a7565b60008167ffffffffffffffff8111156134ed576134ec6143f8565b5b6040519080825280601f01601f19166020018201604052801561351f5781602001600182028036833780820191505090505b5090505b600085146135ac576001826135389190614a55565b9150600a85613547919061536b565b60306135539190614af5565b60f81b81838151811061356957613568614fda565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856135a591906149b8565b9450613523565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b50505050565b50505050565b600061363983612edd565b9050600081600001519050821561371a5760008173ffffffffffffffffffffffffffffffffffffffff1661366b61295a565b73ffffffffffffffffffffffffffffffffffffffff16148061369a57506136998261369461295a565b61252f565b5b806136df57506136a861295a565b73ffffffffffffffffffffffffffffffffffffffff166136c786610ba0565b73ffffffffffffffffffffffffffffffffffffffff16145b905080613718576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b613728816000866001613622565b61373460008583612962565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060018160000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060018160000160108282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600560008781526020019081526020016000209050828160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600181600001601c6101000a81548160ff02191690831515021790555060006001870190506000600560008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561399857600154821461399757848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555085602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b5050505083600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613a06816000866001613628565b60026000815480929190600101919050555050505050565b60008082905060005b8451811015613a88576000858281518110613a4557613a44614fda565b5b60200260200101519050808311613a6757613a608382613aa5565b9250613a74565b613a718184613aa5565b92505b508080613a8090615009565b915050613a27565b508091505092915050565b613aa08383836001613abc565b505050565b600082600052816020526040600020905092915050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415613b2a576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000841415613b65576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613b726000868387613622565b83600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846005600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426005600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060008582019050838015613d3c5750613d3b8773ffffffffffffffffffffffffffffffffffffffff16612807565b5b15613e02575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613db16000888480600101955088613265565b613de7576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80821415613d42578260015414613dfd57600080fd5b613e6e565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821415613e03575b816001819055505050613e846000868387613628565b5050505050565b828054613e97906148bc565b90600052602060002090601f016020900481019282613eb95760008555613f00565b82601f10613ed257805160ff1916838001178555613f00565b82800160010185558215613f00579182015b82811115613eff578251825591602001919060010190613ee4565b5b509050613f0d9190613f54565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b80821115613f6d576000816000905550600101613f55565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613fba81613f85565b8114613fc557600080fd5b50565b600081359050613fd781613fb1565b92915050565b600060208284031215613ff357613ff2613f7b565b5b600061400184828501613fc8565b91505092915050565b60008115159050919050565b61401f8161400a565b82525050565b600060208201905061403a6000830184614016565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561407a57808201518184015260208101905061405f565b83811115614089576000848401525b50505050565b6000601f19601f8301169050919050565b60006140ab82614040565b6140b5818561404b565b93506140c581856020860161405c565b6140ce8161408f565b840191505092915050565b600060208201905081810360008301526140f381846140a0565b905092915050565b6000819050919050565b61410e816140fb565b811461411957600080fd5b50565b60008135905061412b81614105565b92915050565b60006020828403121561414757614146613f7b565b5b60006141558482850161411c565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006141898261415e565b9050919050565b6141998161417e565b82525050565b60006020820190506141b46000830184614190565b92915050565b6141c38161417e565b81146141ce57600080fd5b50565b6000813590506141e0816141ba565b92915050565b600080604083850312156141fd576141fc613f7b565b5b600061420b858286016141d1565b925050602061421c8582860161411c565b9150509250929050565b61422f816140fb565b82525050565b600060208201905061424a6000830184614226565b92915050565b60008060006060848603121561426957614268613f7b565b5b6000614277868287016141d1565b9350506020614288868287016141d1565b92505060406142998682870161411c565b9150509250925092565b6000819050919050565b6142b6816142a3565b81146142c157600080fd5b50565b6000813590506142d3816142ad565b92915050565b6000602082840312156142ef576142ee613f7b565b5b60006142fd848285016142c4565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261432b5761432a614306565b5b8235905067ffffffffffffffff8111156143485761434761430b565b5b60208301915083602082028301111561436457614363614310565b5b9250929050565b60008060006040848603121561438457614383613f7b565b5b600084013567ffffffffffffffff8111156143a2576143a1613f80565b5b6143ae86828701614315565b935093505060206143c18682870161411c565b9150509250925092565b6000602082840312156143e1576143e0613f7b565b5b60006143ef848285016141d1565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6144308261408f565b810181811067ffffffffffffffff8211171561444f5761444e6143f8565b5b80604052505050565b6000614462613f71565b905061446e8282614427565b919050565b600067ffffffffffffffff82111561448e5761448d6143f8565b5b602082029050602081019050919050565b60006144b26144ad84614473565b614458565b905080838252602082019050602084028301858111156144d5576144d4614310565b5b835b818110156144fe57806144ea88826141d1565b8452602084019350506020810190506144d7565b5050509392505050565b600082601f83011261451d5761451c614306565b5b813561452d84826020860161449f565b91505092915050565b60006020828403121561454c5761454b613f7b565b5b600082013567ffffffffffffffff81111561456a57614569613f80565b5b61457684828501614508565b91505092915050565b6000806040838503121561459657614595613f7b565b5b60006145a48582860161411c565b92505060206145b58582860161411c565b9150509250929050565b600080fd5b600067ffffffffffffffff8211156145df576145de6143f8565b5b6145e88261408f565b9050602081019050919050565b82818337600083830152505050565b6000614617614612846145c4565b614458565b905082815260208101848484011115614633576146326145bf565b5b61463e8482856145f5565b509392505050565b600082601f83011261465b5761465a614306565b5b813561466b848260208601614604565b91505092915050565b60006020828403121561468a57614689613f7b565b5b600082013567ffffffffffffffff8111156146a8576146a7613f80565b5b6146b484828501614646565b91505092915050565b6146c68161400a565b81146146d157600080fd5b50565b6000813590506146e3816146bd565b92915050565b60008060408385031215614700576146ff613f7b565b5b600061470e858286016141d1565b925050602061471f858286016146d4565b9150509250929050565b600067ffffffffffffffff821115614744576147436143f8565b5b61474d8261408f565b9050602081019050919050565b600061476d61476884614729565b614458565b905082815260208101848484011115614789576147886145bf565b5b6147948482856145f5565b509392505050565b600082601f8301126147b1576147b0614306565b5b81356147c184826020860161475a565b91505092915050565b600080600080608085870312156147e4576147e3613f7b565b5b60006147f2878288016141d1565b9450506020614803878288016141d1565b93505060406148148782880161411c565b925050606085013567ffffffffffffffff81111561483557614834613f80565b5b6148418782880161479c565b91505092959194509250565b6000806040838503121561486457614863613f7b565b5b6000614872858286016141d1565b9250506020614883858286016141d1565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806148d457607f821691505b602082108114156148e8576148e761488d565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061492460208361404b565b915061492f826148ee565b602082019050919050565b6000602082019050818103600083015261495381614917565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006149c3826140fb565b91506149ce836140fb565b9250826149de576149dd61495a565b5b828204905092915050565b7f43616c6c6572206973206e6f74206f776e6572206e6f7220617070726f766564600082015250565b6000614a1f60208361404b565b9150614a2a826149e9565b602082019050919050565b60006020820190508181036000830152614a4e81614a12565b9050919050565b6000614a60826140fb565b9150614a6b836140fb565b925082821015614a7e57614a7d614989565b5b828203905092915050565b7f5761697420666f7220616c6c6f776c6973742073616c6520746f206f70656e00600082015250565b6000614abf601f8361404b565b9150614aca82614a89565b602082019050919050565b60006020820190508181036000830152614aee81614ab2565b9050919050565b6000614b00826140fb565b9150614b0b836140fb565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614b4057614b3f614989565b5b828201905092915050565b7f4d6178207065722077616c6c6574206c696d697420726561636865642074727960008201527f207075626c69632073616c650000000000000000000000000000000000000000602082015250565b6000614ba7602c8361404b565b9150614bb282614b4b565b604082019050919050565b60006020820190508181036000830152614bd681614b9a565b9050919050565b60008160601b9050919050565b6000614bf582614bdd565b9050919050565b6000614c0782614bea565b9050919050565b614c1f614c1a8261417e565b614bfc565b82525050565b6000614c318284614c0e565b60148201915081905092915050565b7f546869732077616c6c6574206973206e6f74206f6e20616c6c6f776c6973742060008201527f747279207075626c69632073616c650000000000000000000000000000000000602082015250565b6000614c9c602f8361404b565b9150614ca782614c40565b604082019050919050565b60006020820190508181036000830152614ccb81614c8f565b9050919050565b7f4d696e74206174206c65617374206f6e6520746f6b656e000000000000000000600082015250565b6000614d0860178361404b565b9150614d1382614cd2565b602082019050919050565b60006020820190508181036000830152614d3781614cfb565b9050919050565b7f4d6178207065722073616c65206c696d69742072656163686564000000000000600082015250565b6000614d74601a8361404b565b9150614d7f82614d3e565b602082019050919050565b60006020820190508181036000830152614da381614d67565b9050919050565b7f536f6c64204f7574000000000000000000000000000000000000000000000000600082015250565b6000614de060088361404b565b9150614deb82614daa565b602082019050919050565b60006020820190508181036000830152614e0f81614dd3565b9050919050565b6000614e21826140fb565b9150614e2c836140fb565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614e6557614e64614989565b5b828202905092915050565b7f45746865722076616c75652073656e74206973206e6f7420636f727265637400600082015250565b6000614ea6601f8361404b565b9150614eb182614e70565b602082019050919050565b60006020820190508181036000830152614ed581614e99565b9050919050565b7f4d617820706572207472616e73616374696f6e206c696d69742072656163686560008201527f6400000000000000000000000000000000000000000000000000000000000000602082015250565b6000614f3860218361404b565b9150614f4382614edc565b604082019050919050565b60006020820190508181036000830152614f6781614f2b565b9050919050565b7f6e6f7420656e6f75676820746f6b656e73206c65667400000000000000000000600082015250565b6000614fa460168361404b565b9150614faf82614f6e565b602082019050919050565b60006020820190508181036000830152614fd381614f97565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000615014826140fb565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561504757615046614989565b5b600182019050919050565b600081905092915050565b600061506882614040565b6150728185615052565b935061508281856020860161405c565b80840191505092915050565b600061509a828561505d565b91506150a6828461505d565b91508190509392505050565b7f6d696e74206174206c65617374206f6e6520746f6b656e000000000000000000600082015250565b60006150e860178361404b565b91506150f3826150b2565b602082019050919050565b60006020820190508181036000830152615117816150db565b9050919050565b7f5761697420666f72207075626c69632073616c6520746f206f70656e00000000600082015250565b6000615154601c8361404b565b915061515f8261511e565b602082019050919050565b6000602082019050818103600083015261518381615147565b9050919050565b7f4d6178207065722077616c6c6574206c696d6974207265616368656400000000600082015250565b60006151c0601c8361404b565b91506151cb8261518a565b602082019050919050565b600060208201905081810360008301526151ef816151b3565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061525260268361404b565b915061525d826151f6565b604082019050919050565b6000602082019050818103600083015261528181615245565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006152af82615288565b6152b98185615293565b93506152c981856020860161405c565b6152d28161408f565b840191505092915050565b60006080820190506152f26000830187614190565b6152ff6020830186614190565b61530c6040830185614226565b818103606083015261531e81846152a4565b905095945050505050565b60008151905061533881613fb1565b92915050565b60006020828403121561535457615353613f7b565b5b600061536284828501615329565b91505092915050565b6000615376826140fb565b9150615381836140fb565b9250826153915761539061495a565b5b82820690509291505056fea26469706673582212203e6c60ef4acc7041e0db85ca995a47cd6d318e695b28d9ede7d8d744f307700b64736f6c63430008090033

Deployed Bytecode Sourcemap

49819:7371:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57025:162;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32948:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34451:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34014:371;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29084:303;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35316:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55012:93;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50173:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50061;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56683:270;;;;;;;;;;;;;:::i;:::-;;35557:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54045:182;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49915:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50123:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55566:87;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32756:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51909:1194;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55285:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50095:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30204:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7553:103;;;;;;;;;;;;;:::i;:::-;;55830:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53154:442;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49873:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54588:158;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56486:81;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54313:89;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6902:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54772:86;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33117:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54884:81;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55953:92;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34727:287;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49956:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55691:101;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35813:369;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55438:99;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56397:81;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33292:318;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56072:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55148:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53642:370;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50972:909;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56575:83;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35085:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54435:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7811:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56308:81;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50016:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57025:162;57119:4;57143:36;57167:11;57143:23;:36::i;:::-;57136:43;;57025:162;;;:::o;32948:100::-;33002:13;33035:5;33028:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32948:100;:::o;34451:204::-;34519:7;34544:16;34552:7;34544;:16::i;:::-;34539:64;;34569:34;;;;;;;;;;;;;;34539:64;34623:15;:24;34639:7;34623:24;;;;;;;;;;;;;;;;;;;;;34616:31;;34451:204;;;:::o;34014:371::-;34087:13;34103:24;34119:7;34103:15;:24::i;:::-;34087:40;;34148:5;34142:11;;:2;:11;;;34138:48;;;34162:24;;;;;;;;;;;;;;34138:48;34219:5;34203:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;34229:37;34246:5;34253:12;:10;:12::i;:::-;34229:16;:37::i;:::-;34228:38;34203:63;34199:138;;;34290:35;;;;;;;;;;;;;;34199:138;34349:28;34358:2;34362:7;34371:5;34349:8;:28::i;:::-;34076:309;34014:371;;:::o;29084:303::-;29128:7;29353:15;:13;:15::i;:::-;29338:12;;29322:13;;:28;:46;29315:53;;29084:303;:::o;35316:170::-;35450:28;35460:4;35466:2;35470:7;35450:9;:28::i;:::-;35316:170;;;:::o;55012:93::-;7133:12;:10;:12::i;:::-;7122:23;;:7;:5;:7::i;:::-;:23;;;7114:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55091:6:::1;55077:11;:20;;;;55012:93:::0;:::o;50173:27::-;;;;:::o;50061:::-;;;;:::o;56683:270::-;7133:12;:10;:12::i;:::-;7122:23;;:7;:5;:7::i;:::-;:23;;;7114:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56740:9:::1;56774:1;56752:21;:23;;;;:::i;:::-;56740:35;;56794:2;;;;;;;;;;;56786:20;;:26;56807:4;56786:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;56832:2;;;;;;;;;;;56824:20;;:26;56845:4;56824:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;56870:2;;;;;;;;;;;56862:20;;:26;56883:4;56862:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;56908:3;;;;;;;;;;;56900:21;;:44;56922:21;56900:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;56722:231;56683:270::o:0;35557:185::-;35695:39;35712:4;35718:2;35722:7;35695:39;;;;;;;;;;;;:16;:39::i;:::-;35557:185;;;:::o;54045:182::-;54115:16;54123:7;54115;:16::i;:::-;54099:32;;:12;:10;:12::i;:::-;:32;;;54091:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;54179:14;54185:7;54179:5;:14::i;:::-;54218:1;54204:11;;:15;;;;;;;:::i;:::-;;;;;;;;54045:182;:::o;49915:34::-;;;;:::o;50123:35::-;;;;:::o;55566:87::-;7133:12;:10;:12::i;:::-;7122:23;;:7;:5;:7::i;:::-;:23;;;7114:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55640:5:::1;55630:7;:15;;;;55566:87:::0;:::o;32756:125::-;32820:7;32847:21;32860:7;32847:12;:21::i;:::-;:26;;;32840:33;;32756:125;;;:::o;51909:1194::-;52050:1;52035:11;;:16;52027:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;52176:11;;52167:6;52140:12;:24;52153:10;52140:24;;;;;;;;;;;;;;;;:33;;;;:::i;:::-;:47;52132:104;;;;;;;;;;;;:::i;:::-;;;;;;;;;52270:17;52317:10;52300:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;52290:39;;;;;;52270:59;;52371:52;52390:12;;52371:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52404:7;;52413:9;52371:18;:52::i;:::-;52363:112;;;;;;;;;;;;:::i;:::-;;;;;;;;;52533:1;52524:6;:10;52516:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;52627:11;;52617:6;:21;;52609:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;52756:14;;52746:6;50050:3;52719:11;;:24;;;;:::i;:::-;:33;;;;:::i;:::-;:51;;52711:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;52857:6;52844:10;;:19;;;;:::i;:::-;52831:9;:32;;52823:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;52927:29;52937:10;52949:6;52927:9;:29::i;:::-;53016:6;53001:11;;:21;;;;;;;:::i;:::-;;;;;;;;53089:6;53061:12;:24;53074:10;53061:24;;;;;;;;;;;;;;;;:34;;;;;;;:::i;:::-;;;;;;;;51990:1113;51909:1194;;;:::o;55285:105::-;7133:12;:10;:12::i;:::-;7122:23;;:7;:5;:7::i;:::-;:23;;;7114:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55376:6:::1;55356:17;:26;;;;55285:105:::0;:::o;50095:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;30204:206::-;30268:7;30309:1;30292:19;;:5;:19;;;30288:60;;;30320:28;;;;;;;;;;;;;;30288:60;30374:12;:19;30387:5;30374:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;30366:36;;30359:43;;30204:206;;;:::o;7553:103::-;7133:12;:10;:12::i;:::-;7122:23;;:7;:5;:7::i;:::-;:23;;;7114:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;7618:30:::1;7645:1;7618:18;:30::i;:::-;7553:103::o:0;55830:94::-;55879:4;55902:14;;55895:21;;55830:94;:::o;53154:442::-;7133:12;:10;:12::i;:::-;7122:23;;:7;:5;:7::i;:::-;:23;;;7114:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53253:1:::1;53235:8;:15;:19;53227:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;53320:17;;53301:8;:15;:36;;53293:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;53429:14;;53409:8;:15;53394:11;;:30;;;;:::i;:::-;:49;;53386:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;53485:6;53481:80;53501:8;:15;53497:1;:19;53481:80;;;53536:25;53546:8;53555:1;53546:11;;;;;;;;:::i;:::-;;;;;;;;53559:1;53536:9;:25::i;:::-;53518:3;;;;;:::i;:::-;;;;53481:80;;;;53587:1;53572:11;;:16;;;;;;;:::i;:::-;;;;;;;;53154:442:::0;:::o;49873:35::-;;;;:::o;54588:158::-;7133:12;:10;:12::i;:::-;7122:23;;:7;:5;:7::i;:::-;:23;;;7114:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54694:10:::1;54680:11;:24;;;;54729:9;54715:11;:23;;;;54588:158:::0;;:::o;56486:81::-;7133:12;:10;:12::i;:::-;7122:23;;:7;:5;:7::i;:::-;:23;;;7114:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56555:4:::1;56550:2;;:9;;;;;;;;;;;;;;;;;;56486:81:::0;:::o;54313:89::-;54360:4;54383:11;;54376:18;;54313:89;:::o;6902:87::-;6948:7;6975:6;;;;;;;;;;;6968:13;;6902:87;:::o;54772:86::-;7133:12;:10;:12::i;:::-;7122:23;;:7;:5;:7::i;:::-;:23;;;7114:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54845:5:::1;54832:10;:18;;;;54772:86:::0;:::o;33117:104::-;33173:13;33206:7;33199:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33117:104;:::o;54884:81::-;54924:4;54947:10;;54940:17;;54884:81;:::o;55953:92::-;7133:12;:10;:12::i;:::-;7122:23;;:7;:5;:7::i;:::-;:23;;;7114:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56033:4:::1;56023:7;:14;;;;;;;;;;;;:::i;:::-;;55953:92:::0;:::o;34727:287::-;34838:12;:10;:12::i;:::-;34826:24;;:8;:24;;;34822:54;;;34859:17;;;;;;;;;;;;;;34822:54;34934:8;34889:18;:32;34908:12;:10;:12::i;:::-;34889:32;;;;;;;;;;;;;;;:42;34922:8;34889:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;34987:8;34958:48;;34973:12;:10;:12::i;:::-;34958:48;;;34997:8;34958:48;;;;;;:::i;:::-;;;;;;;;34727:287;;:::o;49956:27::-;;;;:::o;55691:101::-;7133:12;:10;:12::i;:::-;7122:23;;:7;:5;:7::i;:::-;:23;;;7114:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55778:6:::1;55761:14;:23;;;;55691:101:::0;:::o;35813:369::-;35980:28;35990:4;35996:2;36000:7;35980:9;:28::i;:::-;36023:15;:2;:13;;;:15::i;:::-;:76;;;;;36043:56;36074:4;36080:2;36084:7;36093:5;36043:30;:56::i;:::-;36042:57;36023:76;36019:156;;;36123:40;;;;;;;;;;;;;;36019:156;35813:369;;;;:::o;55438:99::-;55489:4;55512:17;;55505:24;;55438:99;:::o;56397:81::-;7133:12;:10;:12::i;:::-;7122:23;;:7;:5;:7::i;:::-;:23;;;7114:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56466:4:::1;56461:2;;:9;;;;;;;;;;;;;;;;;;56397:81:::0;:::o;33292:318::-;33365:13;33396:16;33404:7;33396;:16::i;:::-;33391:59;;33421:29;;;;;;;;;;;;;;33391:59;33463:21;33487:10;:8;:10::i;:::-;33463:34;;33540:1;33521:7;33515:21;:26;;:87;;;;;;;;;;;;;;;;;33568:7;33577:18;:7;:16;:18::i;:::-;33551:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;33515:87;33508:94;;;33292:318;;;:::o;56072:106::-;56127:4;56150:12;:20;56163:6;56150:20;;;;;;;;;;;;;;;;56143:27;;56072:106;;;:::o;55148:87::-;55193:4;55216:11;;55209:18;;55148:87;:::o;53642:370::-;7133:12;:10;:12::i;:::-;7122:23;;:7;:5;:7::i;:::-;:23;;;7114:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53741:1:::1;53733:5;:9;53725:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;53798:17;;53789:5;:26;;53781:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;53897:14;;53887:5;53872:11;;:20;;;;:::i;:::-;:39;;53864:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;53949:24;53959:6;53967:5;53949:9;:24::i;:::-;53999:5;53984:11;;:20;;;;;;;:::i;:::-;;;;;;;;53642:370:::0;;:::o;50972:909::-;51085:1;51070:11;;:16;51062:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;51177:1;51168:6;:10;51160:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;51271:11;;51261:6;:21;;51253:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;51400:14;;51390:6;50050:3;51363:11;;:24;;;;:::i;:::-;:33;;;;:::i;:::-;:51;;51355:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;51513:11;;51504:6;51477:12;:24;51490:10;51477:24;;;;;;;;;;;;;;;;:33;;;;:::i;:::-;:47;51469:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;51631:6;51618:10;;:19;;;;:::i;:::-;51605:9;:32;;51597:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;51701:29;51711:10;51723:6;51701:9;:29::i;:::-;51790:6;51775:11;;:21;;;;;;;:::i;:::-;;;;;;;;51867:6;51839:12;:24;51852:10;51839:24;;;;;;;;;;;;;;;;:34;;;;;;;:::i;:::-;;;;;;;;50972:909;:::o;56575:83::-;7133:12;:10;:12::i;:::-;7122:23;;:7;:5;:7::i;:::-;:23;;;7114:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56646:4:::1;56640:3;;:10;;;;;;;;;;;;;;;;;;56575:83:::0;:::o;35085:164::-;35182:4;35206:18;:25;35225:5;35206:25;;;;;;;;;;;;;;;:35;35232:8;35206:35;;;;;;;;;;;;;;;;;;;;;;;;;35199:42;;35085:164;;;;:::o;54435:102::-;7133:12;:10;:12::i;:::-;7122:23;;:7;:5;:7::i;:::-;:23;;;7114:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54519:10:::1;54505:11;:24;;;;54435:102:::0;:::o;7811:201::-;7133:12;:10;:12::i;:::-;7122:23;;:7;:5;:7::i;:::-;:23;;;7114:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;7920:1:::1;7900:22;;:8;:22;;;;7892:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;7976:28;7995:8;7976:18;:28::i;:::-;7811:201:::0;:::o;56308:81::-;7133:12;:10;:12::i;:::-;7122:23;;:7;:5;:7::i;:::-;:23;;;7114:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56377:4:::1;56372:2;;:9;;;;;;;;;;;;;;;;;;56308:81:::0;:::o;50016:37::-;50050:3;50016:37;:::o;9603:326::-;9663:4;9920:1;9898:7;:19;;;:23;9891:30;;9603:326;;;:::o;29835:305::-;29937:4;29989:25;29974:40;;;:11;:40;;;;:105;;;;30046:33;30031:48;;;:11;:48;;;;29974:105;:158;;;;30096:36;30120:11;30096:23;:36::i;:::-;29974:158;29954:178;;29835:305;;;:::o;36437:187::-;36494:4;36537:7;36518:15;:13;:15::i;:::-;:26;;:53;;;;;36558:13;;36548:7;:23;36518:53;:98;;;;;36589:11;:20;36601:7;36589:20;;;;;;;;;;;:27;;;;;;;;;;;;36588:28;36518:98;36511:105;;36437:187;;;:::o;5626:98::-;5679:7;5706:10;5699:17;;5626:98;:::o;44607:196::-;44749:2;44722:15;:24;44738:7;44722:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;44787:7;44783:2;44767:28;;44776:5;44767:28;;;;;;;;;;;;44607:196;;;:::o;28858:92::-;28914:7;28858:92;:::o;39550:2130::-;39665:35;39703:21;39716:7;39703:12;:21::i;:::-;39665:59;;39763:4;39741:26;;:13;:18;;;:26;;;39737:67;;39776:28;;;;;;;;;;;;;;39737:67;39817:22;39859:4;39843:20;;:12;:10;:12::i;:::-;:20;;;:73;;;;39880:36;39897:4;39903:12;:10;:12::i;:::-;39880:16;:36::i;:::-;39843:73;:126;;;;39957:12;:10;:12::i;:::-;39933:36;;:20;39945:7;39933:11;:20::i;:::-;:36;;;39843:126;39817:153;;39988:17;39983:66;;40014:35;;;;;;;;;;;;;;39983:66;40078:1;40064:16;;:2;:16;;;40060:52;;;40089:23;;;;;;;;;;;;;;40060:52;40125:43;40147:4;40153:2;40157:7;40166:1;40125:21;:43::i;:::-;40233:35;40250:1;40254:7;40263:4;40233:8;:35::i;:::-;40594:1;40564:12;:18;40577:4;40564:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40638:1;40610:12;:16;40623:2;40610:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40656:31;40690:11;:20;40702:7;40690:20;;;;;;;;;;;40656:54;;40741:2;40725:8;:13;;;:18;;;;;;;;;;;;;;;;;;40791:15;40758:8;:23;;;:49;;;;;;;;;;;;;;;;;;41059:19;41091:1;41081:7;:11;41059:33;;41107:31;41141:11;:24;41153:11;41141:24;;;;;;;;;;;41107:58;;41209:1;41184:27;;:8;:13;;;;;;;;;;;;:27;;;41180:384;;;41394:13;;41379:11;:28;41375:174;;41448:4;41432:8;:13;;;:20;;;;;;;;;;;;;;;;;;41501:13;:28;;;41475:8;:23;;;:54;;;;;;;;;;;;;;;;;;41375:174;41180:384;40539:1036;;;41611:7;41607:2;41592:27;;41601:4;41592:27;;;;;;;;;;;;41630:42;41651:4;41657:2;41661:7;41670:1;41630:20;:42::i;:::-;39654:2026;;39550:2130;;;:::o;41763:89::-;41823:21;41829:7;41838:5;41823;:21::i;:::-;41763:89;:::o;31585:1109::-;31647:21;;:::i;:::-;31681:12;31696:7;31681:22;;31764:4;31745:15;:13;:15::i;:::-;:23;;:47;;;;;31779:13;;31772:4;:20;31745:47;31741:886;;;31813:31;31847:11;:17;31859:4;31847:17;;;;;;;;;;;31813:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31888:9;:16;;;31883:729;;31959:1;31933:28;;:9;:14;;;:28;;;31929:101;;31997:9;31990:16;;;;;;31929:101;32332:261;32339:4;32332:261;;;32372:6;;;;;;;;32417:11;:17;32429:4;32417:17;;;;;;;;;;;32405:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32491:1;32465:28;;:9;:14;;;:28;;;32461:109;;32533:9;32526:16;;;;;;32461:109;32332:261;;;31883:729;31794:833;31741:886;32655:31;;;;;;;;;;;;;;31585:1109;;;;:::o;1358:190::-;1483:4;1536;1507:25;1520:5;1527:4;1507:12;:25::i;:::-;:33;1500:40;;1358:190;;;;;:::o;36632:104::-;36701:27;36711:2;36715:8;36701:27;;;;;;;;;;;;:9;:27::i;:::-;36632:104;;:::o;8172:191::-;8246:16;8265:6;;;;;;;;;;;8246:25;;8291:8;8282:6;;:17;;;;;;;;;;;;;;;;;;8346:8;8315:40;;8336:8;8315:40;;;;;;;;;;;;8235:128;8172:191;:::o;45295:667::-;45458:4;45495:2;45479:36;;;45516:12;:10;:12::i;:::-;45530:4;45536:7;45545:5;45479:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;45475:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45730:1;45713:6;:13;:18;45709:235;;;45759:40;;;;;;;;;;;;;;45709:235;45902:6;45896:13;45887:6;45883:2;45879:15;45872:38;45475:480;45608:45;;;45598:55;;;:6;:55;;;;45591:62;;;45295:667;;;;;;:::o;56186:108::-;56246:13;56279:7;56272:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56186:108;:::o;3188:723::-;3244:13;3474:1;3465:5;:10;3461:53;;;3492:10;;;;;;;;;;;;;;;;;;;;;3461:53;3524:12;3539:5;3524:20;;3555:14;3580:78;3595:1;3587:4;:9;3580:78;;3613:8;;;;;:::i;:::-;;;;3644:2;3636:10;;;;;:::i;:::-;;;3580:78;;;3668:19;3700:6;3690:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3668:39;;3718:154;3734:1;3725:5;:10;3718:154;;3762:1;3752:11;;;;;:::i;:::-;;;3829:2;3821:5;:10;;;;:::i;:::-;3808:2;:24;;;;:::i;:::-;3795:39;;3778:6;3785;3778:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;3858:2;3849:11;;;;;:::i;:::-;;;3718:154;;;3896:6;3882:21;;;;;3188:723;;;;:::o;19686:157::-;19771:4;19810:25;19795:40;;;:11;:40;;;;19788:47;;19686:157;;;:::o;46610:159::-;;;;;:::o;47428:158::-;;;;;:::o;42081:2408::-;42161:35;42199:21;42212:7;42199:12;:21::i;:::-;42161:59;;42233:12;42248:13;:18;;;42233:33;;42283:13;42279:290;;;42313:22;42355:4;42339:20;;:12;:10;:12::i;:::-;:20;;;:77;;;;42380:36;42397:4;42403:12;:10;:12::i;:::-;42380:16;:36::i;:::-;42339:77;:134;;;;42461:12;:10;:12::i;:::-;42437:36;;:20;42449:7;42437:11;:20::i;:::-;:36;;;42339:134;42313:161;;42496:17;42491:66;;42522:35;;;;;;;;;;;;;;42491:66;42298:271;42279:290;42581:51;42603:4;42617:1;42621:7;42630:1;42581:21;:51::i;:::-;42697:35;42714:1;42718:7;42727:4;42697:8;:35::i;:::-;43028:31;43062:12;:18;43075:4;43062:18;;;;;;;;;;;;;;;43028:52;;43118:1;43095:11;:19;;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43162:1;43134:11;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43262:31;43296:11;:20;43308:7;43296:20;;;;;;;;;;;43262:54;;43347:4;43331:8;:13;;;:20;;;;;;;;;;;;;;;;;;43399:15;43366:8;:23;;;:49;;;;;;;;;;;;;;;;;;43448:4;43430:8;:15;;;:22;;;;;;;;;;;;;;;;;;43700:19;43732:1;43722:7;:11;43700:33;;43748:31;43782:11;:24;43794:11;43782:24;;;;;;;;;;;43748:58;;43850:1;43825:27;;:8;:13;;;;;;;;;;;;:27;;;43821:384;;;44035:13;;44020:11;:28;44016:174;;44089:4;44073:8;:13;;;:20;;;;;;;;;;;;;;;;;;44142:13;:28;;;44116:8;:23;;;:54;;;;;;;;;;;;;;;;;;44016:174;43821:384;43003:1213;;;;44260:7;44256:1;44233:35;;44242:4;44233:35;;;;;;;;;;;;44279:50;44300:4;44314:1;44318:7;44327:1;44279:20;:50::i;:::-;44456:12;;:14;;;;;;;;;;;;;42150:2339;;42081:2408;;:::o;1909:675::-;1992:7;2012:20;2035:4;2012:27;;2055:9;2050:497;2074:5;:12;2070:1;:16;2050:497;;;2108:20;2131:5;2137:1;2131:8;;;;;;;;:::i;:::-;;;;;;;;2108:31;;2174:12;2158;:28;2154:382;;2301:42;2316:12;2330;2301:14;:42::i;:::-;2286:57;;2154:382;;;2478:42;2493:12;2507;2478:14;:42::i;:::-;2463:57;;2154:382;2093:454;2088:3;;;;;:::i;:::-;;;;2050:497;;;;2564:12;2557:19;;;1909:675;;;;:::o;37099:163::-;37222:32;37228:2;37232:8;37242:5;37249:4;37222:5;:32::i;:::-;37099:163;;;:::o;2592:224::-;2660:13;2723:1;2717:4;2710:15;2752:1;2746:4;2739:15;2793:4;2787;2777:21;2768:30;;2592:224;;;;:::o;37521:1775::-;37660:20;37683:13;;37660:36;;37725:1;37711:16;;:2;:16;;;37707:48;;;37736:19;;;;;;;;;;;;;;37707:48;37782:1;37770:8;:13;37766:44;;;37792:18;;;;;;;;;;;;;;37766:44;37823:61;37853:1;37857:2;37861:12;37875:8;37823:21;:61::i;:::-;38196:8;38161:12;:16;38174:2;38161:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38260:8;38220:12;:16;38233:2;38220:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38319:2;38286:11;:25;38298:12;38286:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;38386:15;38336:11;:25;38348:12;38336:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;38419:20;38442:12;38419:35;;38469:11;38498:8;38483:12;:23;38469:37;;38527:4;:23;;;;;38535:15;:2;:13;;;:15::i;:::-;38527:23;38523:641;;;38571:314;38627:12;38623:2;38602:38;;38619:1;38602:38;;;;;;;;;;;;38668:69;38707:1;38711:2;38715:14;;;;;;38731:5;38668:30;:69::i;:::-;38663:174;;38773:40;;;;;;;;;;;;;;38663:174;38880:3;38864:12;:19;;38571:314;;38966:12;38949:13;;:29;38945:43;;38980:8;;;38945:43;38523:641;;;39029:120;39085:14;;;;;;39081:2;39060:40;;39077:1;39060:40;;;;;;;;;;;;39144:3;39128:12;:19;;39029:120;;38523:641;39194:12;39178:13;:28;;;;38136:1082;;39228:60;39257:1;39261:2;39265:12;39279:8;39228:20;:60::i;:::-;37649:1647;37521:1775;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:118::-;5025:24;5043:5;5025:24;:::i;:::-;5020:3;5013:37;4938:118;;:::o;5062:222::-;5155:4;5193:2;5182:9;5178:18;5170:26;;5206:71;5274:1;5263:9;5259:17;5250:6;5206:71;:::i;:::-;5062:222;;;;:::o;5290:619::-;5367:6;5375;5383;5432:2;5420:9;5411:7;5407:23;5403:32;5400:119;;;5438:79;;:::i;:::-;5400:119;5558:1;5583:53;5628:7;5619:6;5608:9;5604:22;5583:53;:::i;:::-;5573:63;;5529:117;5685:2;5711:53;5756:7;5747:6;5736:9;5732:22;5711:53;:::i;:::-;5701:63;;5656:118;5813:2;5839:53;5884:7;5875:6;5864:9;5860:22;5839:53;:::i;:::-;5829:63;;5784:118;5290:619;;;;;:::o;5915:77::-;5952:7;5981:5;5970:16;;5915:77;;;:::o;5998:122::-;6071:24;6089:5;6071:24;:::i;:::-;6064:5;6061:35;6051:63;;6110:1;6107;6100:12;6051:63;5998:122;:::o;6126:139::-;6172:5;6210:6;6197:20;6188:29;;6226:33;6253:5;6226:33;:::i;:::-;6126:139;;;;:::o;6271:329::-;6330:6;6379:2;6367:9;6358:7;6354:23;6350:32;6347:119;;;6385:79;;:::i;:::-;6347:119;6505:1;6530:53;6575:7;6566:6;6555:9;6551:22;6530:53;:::i;:::-;6520:63;;6476:117;6271:329;;;;:::o;6606:117::-;6715:1;6712;6705:12;6729:117;6838:1;6835;6828:12;6852:117;6961:1;6958;6951:12;6992:568;7065:8;7075:6;7125:3;7118:4;7110:6;7106:17;7102:27;7092:122;;7133:79;;:::i;:::-;7092:122;7246:6;7233:20;7223:30;;7276:18;7268:6;7265:30;7262:117;;;7298:79;;:::i;:::-;7262:117;7412:4;7404:6;7400:17;7388:29;;7466:3;7458:4;7450:6;7446:17;7436:8;7432:32;7429:41;7426:128;;;7473:79;;:::i;:::-;7426:128;6992:568;;;;;:::o;7566:704::-;7661:6;7669;7677;7726:2;7714:9;7705:7;7701:23;7697:32;7694:119;;;7732:79;;:::i;:::-;7694:119;7880:1;7869:9;7865:17;7852:31;7910:18;7902:6;7899:30;7896:117;;;7932:79;;:::i;:::-;7896:117;8045:80;8117:7;8108:6;8097:9;8093:22;8045:80;:::i;:::-;8027:98;;;;7823:312;8174:2;8200:53;8245:7;8236:6;8225:9;8221:22;8200:53;:::i;:::-;8190:63;;8145:118;7566:704;;;;;:::o;8276:329::-;8335:6;8384:2;8372:9;8363:7;8359:23;8355:32;8352:119;;;8390:79;;:::i;:::-;8352:119;8510:1;8535:53;8580:7;8571:6;8560:9;8556:22;8535:53;:::i;:::-;8525:63;;8481:117;8276:329;;;;:::o;8611:180::-;8659:77;8656:1;8649:88;8756:4;8753:1;8746:15;8780:4;8777:1;8770:15;8797:281;8880:27;8902:4;8880:27;:::i;:::-;8872:6;8868:40;9010:6;8998:10;8995:22;8974:18;8962:10;8959:34;8956:62;8953:88;;;9021:18;;:::i;:::-;8953:88;9061:10;9057:2;9050:22;8840:238;8797:281;;:::o;9084:129::-;9118:6;9145:20;;:::i;:::-;9135:30;;9174:33;9202:4;9194:6;9174:33;:::i;:::-;9084:129;;;:::o;9219:311::-;9296:4;9386:18;9378:6;9375:30;9372:56;;;9408:18;;:::i;:::-;9372:56;9458:4;9450:6;9446:17;9438:25;;9518:4;9512;9508:15;9500:23;;9219:311;;;:::o;9553:710::-;9649:5;9674:81;9690:64;9747:6;9690:64;:::i;:::-;9674:81;:::i;:::-;9665:90;;9775:5;9804:6;9797:5;9790:21;9838:4;9831:5;9827:16;9820:23;;9891:4;9883:6;9879:17;9871:6;9867:30;9920:3;9912:6;9909:15;9906:122;;;9939:79;;:::i;:::-;9906:122;10054:6;10037:220;10071:6;10066:3;10063:15;10037:220;;;10146:3;10175:37;10208:3;10196:10;10175:37;:::i;:::-;10170:3;10163:50;10242:4;10237:3;10233:14;10226:21;;10113:144;10097:4;10092:3;10088:14;10081:21;;10037:220;;;10041:21;9655:608;;9553:710;;;;;:::o;10286:370::-;10357:5;10406:3;10399:4;10391:6;10387:17;10383:27;10373:122;;10414:79;;:::i;:::-;10373:122;10531:6;10518:20;10556:94;10646:3;10638:6;10631:4;10623:6;10619:17;10556:94;:::i;:::-;10547:103;;10363:293;10286:370;;;;:::o;10662:539::-;10746:6;10795:2;10783:9;10774:7;10770:23;10766:32;10763:119;;;10801:79;;:::i;:::-;10763:119;10949:1;10938:9;10934:17;10921:31;10979:18;10971:6;10968:30;10965:117;;;11001:79;;:::i;:::-;10965:117;11106:78;11176:7;11167:6;11156:9;11152:22;11106:78;:::i;:::-;11096:88;;10892:302;10662:539;;;;:::o;11207:474::-;11275:6;11283;11332:2;11320:9;11311:7;11307:23;11303:32;11300:119;;;11338:79;;:::i;:::-;11300:119;11458:1;11483:53;11528:7;11519:6;11508:9;11504:22;11483:53;:::i;:::-;11473:63;;11429:117;11585:2;11611:53;11656:7;11647:6;11636:9;11632:22;11611:53;:::i;:::-;11601:63;;11556:118;11207:474;;;;;:::o;11687:117::-;11796:1;11793;11786:12;11810:308;11872:4;11962:18;11954:6;11951:30;11948:56;;;11984:18;;:::i;:::-;11948:56;12022:29;12044:6;12022:29;:::i;:::-;12014:37;;12106:4;12100;12096:15;12088:23;;11810:308;;;:::o;12124:154::-;12208:6;12203:3;12198;12185:30;12270:1;12261:6;12256:3;12252:16;12245:27;12124:154;;;:::o;12284:412::-;12362:5;12387:66;12403:49;12445:6;12403:49;:::i;:::-;12387:66;:::i;:::-;12378:75;;12476:6;12469:5;12462:21;12514:4;12507:5;12503:16;12552:3;12543:6;12538:3;12534:16;12531:25;12528:112;;;12559:79;;:::i;:::-;12528:112;12649:41;12683:6;12678:3;12673;12649:41;:::i;:::-;12368:328;12284:412;;;;;:::o;12716:340::-;12772:5;12821:3;12814:4;12806:6;12802:17;12798:27;12788:122;;12829:79;;:::i;:::-;12788:122;12946:6;12933:20;12971:79;13046:3;13038:6;13031:4;13023:6;13019:17;12971:79;:::i;:::-;12962:88;;12778:278;12716:340;;;;:::o;13062:509::-;13131:6;13180:2;13168:9;13159:7;13155:23;13151:32;13148:119;;;13186:79;;:::i;:::-;13148:119;13334:1;13323:9;13319:17;13306:31;13364:18;13356:6;13353:30;13350:117;;;13386:79;;:::i;:::-;13350:117;13491:63;13546:7;13537:6;13526:9;13522:22;13491:63;:::i;:::-;13481:73;;13277:287;13062:509;;;;:::o;13577:116::-;13647:21;13662:5;13647:21;:::i;:::-;13640:5;13637:32;13627:60;;13683:1;13680;13673:12;13627:60;13577:116;:::o;13699:133::-;13742:5;13780:6;13767:20;13758:29;;13796:30;13820:5;13796:30;:::i;:::-;13699:133;;;;:::o;13838:468::-;13903:6;13911;13960:2;13948:9;13939:7;13935:23;13931:32;13928:119;;;13966:79;;:::i;:::-;13928:119;14086:1;14111:53;14156:7;14147:6;14136:9;14132:22;14111:53;:::i;:::-;14101:63;;14057:117;14213:2;14239:50;14281:7;14272:6;14261:9;14257:22;14239:50;:::i;:::-;14229:60;;14184:115;13838:468;;;;;:::o;14312:307::-;14373:4;14463:18;14455:6;14452:30;14449:56;;;14485:18;;:::i;:::-;14449:56;14523:29;14545:6;14523:29;:::i;:::-;14515:37;;14607:4;14601;14597:15;14589:23;;14312:307;;;:::o;14625:410::-;14702:5;14727:65;14743:48;14784:6;14743:48;:::i;:::-;14727:65;:::i;:::-;14718:74;;14815:6;14808:5;14801:21;14853:4;14846:5;14842:16;14891:3;14882:6;14877:3;14873:16;14870:25;14867:112;;;14898:79;;:::i;:::-;14867:112;14988:41;15022:6;15017:3;15012;14988:41;:::i;:::-;14708:327;14625:410;;;;;:::o;15054:338::-;15109:5;15158:3;15151:4;15143:6;15139:17;15135:27;15125:122;;15166:79;;:::i;:::-;15125:122;15283:6;15270:20;15308:78;15382:3;15374:6;15367:4;15359:6;15355:17;15308:78;:::i;:::-;15299:87;;15115:277;15054:338;;;;:::o;15398:943::-;15493:6;15501;15509;15517;15566:3;15554:9;15545:7;15541:23;15537:33;15534:120;;;15573:79;;:::i;:::-;15534:120;15693:1;15718:53;15763:7;15754:6;15743:9;15739:22;15718:53;:::i;:::-;15708:63;;15664:117;15820:2;15846:53;15891:7;15882:6;15871:9;15867:22;15846:53;:::i;:::-;15836:63;;15791:118;15948:2;15974:53;16019:7;16010:6;15999:9;15995:22;15974:53;:::i;:::-;15964:63;;15919:118;16104:2;16093:9;16089:18;16076:32;16135:18;16127:6;16124:30;16121:117;;;16157:79;;:::i;:::-;16121:117;16262:62;16316:7;16307:6;16296:9;16292:22;16262:62;:::i;:::-;16252:72;;16047:287;15398:943;;;;;;;:::o;16347:474::-;16415:6;16423;16472:2;16460:9;16451:7;16447:23;16443:32;16440:119;;;16478:79;;:::i;:::-;16440:119;16598:1;16623:53;16668:7;16659:6;16648:9;16644:22;16623:53;:::i;:::-;16613:63;;16569:117;16725:2;16751:53;16796:7;16787:6;16776:9;16772:22;16751:53;:::i;:::-;16741:63;;16696:118;16347:474;;;;;:::o;16827:180::-;16875:77;16872:1;16865:88;16972:4;16969:1;16962:15;16996:4;16993:1;16986:15;17013:320;17057:6;17094:1;17088:4;17084:12;17074:22;;17141:1;17135:4;17131:12;17162:18;17152:81;;17218:4;17210:6;17206:17;17196:27;;17152:81;17280:2;17272:6;17269:14;17249:18;17246:38;17243:84;;;17299:18;;:::i;:::-;17243:84;17064:269;17013:320;;;:::o;17339:182::-;17479:34;17475:1;17467:6;17463:14;17456:58;17339:182;:::o;17527:366::-;17669:3;17690:67;17754:2;17749:3;17690:67;:::i;:::-;17683:74;;17766:93;17855:3;17766:93;:::i;:::-;17884:2;17879:3;17875:12;17868:19;;17527:366;;;:::o;17899:419::-;18065:4;18103:2;18092:9;18088:18;18080:26;;18152:9;18146:4;18142:20;18138:1;18127:9;18123:17;18116:47;18180:131;18306:4;18180:131;:::i;:::-;18172:139;;17899:419;;;:::o;18324:180::-;18372:77;18369:1;18362:88;18469:4;18466:1;18459:15;18493:4;18490:1;18483:15;18510:180;18558:77;18555:1;18548:88;18655:4;18652:1;18645:15;18679:4;18676:1;18669:15;18696:185;18736:1;18753:20;18771:1;18753:20;:::i;:::-;18748:25;;18787:20;18805:1;18787:20;:::i;:::-;18782:25;;18826:1;18816:35;;18831:18;;:::i;:::-;18816:35;18873:1;18870;18866:9;18861:14;;18696:185;;;;:::o;18887:182::-;19027:34;19023:1;19015:6;19011:14;19004:58;18887:182;:::o;19075:366::-;19217:3;19238:67;19302:2;19297:3;19238:67;:::i;:::-;19231:74;;19314:93;19403:3;19314:93;:::i;:::-;19432:2;19427:3;19423:12;19416:19;;19075:366;;;:::o;19447:419::-;19613:4;19651:2;19640:9;19636:18;19628:26;;19700:9;19694:4;19690:20;19686:1;19675:9;19671:17;19664:47;19728:131;19854:4;19728:131;:::i;:::-;19720:139;;19447:419;;;:::o;19872:191::-;19912:4;19932:20;19950:1;19932:20;:::i;:::-;19927:25;;19966:20;19984:1;19966:20;:::i;:::-;19961:25;;20005:1;20002;19999:8;19996:34;;;20010:18;;:::i;:::-;19996:34;20055:1;20052;20048:9;20040:17;;19872:191;;;;:::o;20069:181::-;20209:33;20205:1;20197:6;20193:14;20186:57;20069:181;:::o;20256:366::-;20398:3;20419:67;20483:2;20478:3;20419:67;:::i;:::-;20412:74;;20495:93;20584:3;20495:93;:::i;:::-;20613:2;20608:3;20604:12;20597:19;;20256:366;;;:::o;20628:419::-;20794:4;20832:2;20821:9;20817:18;20809:26;;20881:9;20875:4;20871:20;20867:1;20856:9;20852:17;20845:47;20909:131;21035:4;20909:131;:::i;:::-;20901:139;;20628:419;;;:::o;21053:305::-;21093:3;21112:20;21130:1;21112:20;:::i;:::-;21107:25;;21146:20;21164:1;21146:20;:::i;:::-;21141:25;;21300:1;21232:66;21228:74;21225:1;21222:81;21219:107;;;21306:18;;:::i;:::-;21219:107;21350:1;21347;21343:9;21336:16;;21053:305;;;;:::o;21364:231::-;21504:34;21500:1;21492:6;21488:14;21481:58;21573:14;21568:2;21560:6;21556:15;21549:39;21364:231;:::o;21601:366::-;21743:3;21764:67;21828:2;21823:3;21764:67;:::i;:::-;21757:74;;21840:93;21929:3;21840:93;:::i;:::-;21958:2;21953:3;21949:12;21942:19;;21601:366;;;:::o;21973:419::-;22139:4;22177:2;22166:9;22162:18;22154:26;;22226:9;22220:4;22216:20;22212:1;22201:9;22197:17;22190:47;22254:131;22380:4;22254:131;:::i;:::-;22246:139;;21973:419;;;:::o;22398:94::-;22431:8;22479:5;22475:2;22471:14;22450:35;;22398:94;;;:::o;22498:::-;22537:7;22566:20;22580:5;22566:20;:::i;:::-;22555:31;;22498:94;;;:::o;22598:100::-;22637:7;22666:26;22686:5;22666:26;:::i;:::-;22655:37;;22598:100;;;:::o;22704:157::-;22809:45;22829:24;22847:5;22829:24;:::i;:::-;22809:45;:::i;:::-;22804:3;22797:58;22704:157;;:::o;22867:256::-;22979:3;22994:75;23065:3;23056:6;22994:75;:::i;:::-;23094:2;23089:3;23085:12;23078:19;;23114:3;23107:10;;22867:256;;;;:::o;23129:234::-;23269:34;23265:1;23257:6;23253:14;23246:58;23338:17;23333:2;23325:6;23321:15;23314:42;23129:234;:::o;23369:366::-;23511:3;23532:67;23596:2;23591:3;23532:67;:::i;:::-;23525:74;;23608:93;23697:3;23608:93;:::i;:::-;23726:2;23721:3;23717:12;23710:19;;23369:366;;;:::o;23741:419::-;23907:4;23945:2;23934:9;23930:18;23922:26;;23994:9;23988:4;23984:20;23980:1;23969:9;23965:17;23958:47;24022:131;24148:4;24022:131;:::i;:::-;24014:139;;23741:419;;;:::o;24166:173::-;24306:25;24302:1;24294:6;24290:14;24283:49;24166:173;:::o;24345:366::-;24487:3;24508:67;24572:2;24567:3;24508:67;:::i;:::-;24501:74;;24584:93;24673:3;24584:93;:::i;:::-;24702:2;24697:3;24693:12;24686:19;;24345:366;;;:::o;24717:419::-;24883:4;24921:2;24910:9;24906:18;24898:26;;24970:9;24964:4;24960:20;24956:1;24945:9;24941:17;24934:47;24998:131;25124:4;24998:131;:::i;:::-;24990:139;;24717:419;;;:::o;25142:176::-;25282:28;25278:1;25270:6;25266:14;25259:52;25142:176;:::o;25324:366::-;25466:3;25487:67;25551:2;25546:3;25487:67;:::i;:::-;25480:74;;25563:93;25652:3;25563:93;:::i;:::-;25681:2;25676:3;25672:12;25665:19;;25324:366;;;:::o;25696:419::-;25862:4;25900:2;25889:9;25885:18;25877:26;;25949:9;25943:4;25939:20;25935:1;25924:9;25920:17;25913:47;25977:131;26103:4;25977:131;:::i;:::-;25969:139;;25696:419;;;:::o;26121:158::-;26261:10;26257:1;26249:6;26245:14;26238:34;26121:158;:::o;26285:365::-;26427:3;26448:66;26512:1;26507:3;26448:66;:::i;:::-;26441:73;;26523:93;26612:3;26523:93;:::i;:::-;26641:2;26636:3;26632:12;26625:19;;26285:365;;;:::o;26656:419::-;26822:4;26860:2;26849:9;26845:18;26837:26;;26909:9;26903:4;26899:20;26895:1;26884:9;26880:17;26873:47;26937:131;27063:4;26937:131;:::i;:::-;26929:139;;26656:419;;;:::o;27081:348::-;27121:7;27144:20;27162:1;27144:20;:::i;:::-;27139:25;;27178:20;27196:1;27178:20;:::i;:::-;27173:25;;27366:1;27298:66;27294:74;27291:1;27288:81;27283:1;27276:9;27269:17;27265:105;27262:131;;;27373:18;;:::i;:::-;27262:131;27421:1;27418;27414:9;27403:20;;27081:348;;;;:::o;27435:181::-;27575:33;27571:1;27563:6;27559:14;27552:57;27435:181;:::o;27622:366::-;27764:3;27785:67;27849:2;27844:3;27785:67;:::i;:::-;27778:74;;27861:93;27950:3;27861:93;:::i;:::-;27979:2;27974:3;27970:12;27963:19;;27622:366;;;:::o;27994:419::-;28160:4;28198:2;28187:9;28183:18;28175:26;;28247:9;28241:4;28237:20;28233:1;28222:9;28218:17;28211:47;28275:131;28401:4;28275:131;:::i;:::-;28267:139;;27994:419;;;:::o;28419:220::-;28559:34;28555:1;28547:6;28543:14;28536:58;28628:3;28623:2;28615:6;28611:15;28604:28;28419:220;:::o;28645:366::-;28787:3;28808:67;28872:2;28867:3;28808:67;:::i;:::-;28801:74;;28884:93;28973:3;28884:93;:::i;:::-;29002:2;28997:3;28993:12;28986:19;;28645:366;;;:::o;29017:419::-;29183:4;29221:2;29210:9;29206:18;29198:26;;29270:9;29264:4;29260:20;29256:1;29245:9;29241:17;29234:47;29298:131;29424:4;29298:131;:::i;:::-;29290:139;;29017:419;;;:::o;29442:172::-;29582:24;29578:1;29570:6;29566:14;29559:48;29442:172;:::o;29620:366::-;29762:3;29783:67;29847:2;29842:3;29783:67;:::i;:::-;29776:74;;29859:93;29948:3;29859:93;:::i;:::-;29977:2;29972:3;29968:12;29961:19;;29620:366;;;:::o;29992:419::-;30158:4;30196:2;30185:9;30181:18;30173:26;;30245:9;30239:4;30235:20;30231:1;30220:9;30216:17;30209:47;30273:131;30399:4;30273:131;:::i;:::-;30265:139;;29992:419;;;:::o;30417:180::-;30465:77;30462:1;30455:88;30562:4;30559:1;30552:15;30586:4;30583:1;30576:15;30603:233;30642:3;30665:24;30683:5;30665:24;:::i;:::-;30656:33;;30711:66;30704:5;30701:77;30698:103;;;30781:18;;:::i;:::-;30698:103;30828:1;30821:5;30817:13;30810:20;;30603:233;;;:::o;30842:148::-;30944:11;30981:3;30966:18;;30842:148;;;;:::o;30996:377::-;31102:3;31130:39;31163:5;31130:39;:::i;:::-;31185:89;31267:6;31262:3;31185:89;:::i;:::-;31178:96;;31283:52;31328:6;31323:3;31316:4;31309:5;31305:16;31283:52;:::i;:::-;31360:6;31355:3;31351:16;31344:23;;31106:267;30996:377;;;;:::o;31379:435::-;31559:3;31581:95;31672:3;31663:6;31581:95;:::i;:::-;31574:102;;31693:95;31784:3;31775:6;31693:95;:::i;:::-;31686:102;;31805:3;31798:10;;31379:435;;;;;:::o;31820:173::-;31960:25;31956:1;31948:6;31944:14;31937:49;31820:173;:::o;31999:366::-;32141:3;32162:67;32226:2;32221:3;32162:67;:::i;:::-;32155:74;;32238:93;32327:3;32238:93;:::i;:::-;32356:2;32351:3;32347:12;32340:19;;31999:366;;;:::o;32371:419::-;32537:4;32575:2;32564:9;32560:18;32552:26;;32624:9;32618:4;32614:20;32610:1;32599:9;32595:17;32588:47;32652:131;32778:4;32652:131;:::i;:::-;32644:139;;32371:419;;;:::o;32796:178::-;32936:30;32932:1;32924:6;32920:14;32913:54;32796:178;:::o;32980:366::-;33122:3;33143:67;33207:2;33202:3;33143:67;:::i;:::-;33136:74;;33219:93;33308:3;33219:93;:::i;:::-;33337:2;33332:3;33328:12;33321:19;;32980:366;;;:::o;33352:419::-;33518:4;33556:2;33545:9;33541:18;33533:26;;33605:9;33599:4;33595:20;33591:1;33580:9;33576:17;33569:47;33633:131;33759:4;33633:131;:::i;:::-;33625:139;;33352:419;;;:::o;33777:178::-;33917:30;33913:1;33905:6;33901:14;33894:54;33777:178;:::o;33961:366::-;34103:3;34124:67;34188:2;34183:3;34124:67;:::i;:::-;34117:74;;34200:93;34289:3;34200:93;:::i;:::-;34318:2;34313:3;34309:12;34302:19;;33961:366;;;:::o;34333:419::-;34499:4;34537:2;34526:9;34522:18;34514:26;;34586:9;34580:4;34576:20;34572:1;34561:9;34557:17;34550:47;34614:131;34740:4;34614:131;:::i;:::-;34606:139;;34333:419;;;:::o;34758:225::-;34898:34;34894:1;34886:6;34882:14;34875:58;34967:8;34962:2;34954:6;34950:15;34943:33;34758:225;:::o;34989:366::-;35131:3;35152:67;35216:2;35211:3;35152:67;:::i;:::-;35145:74;;35228:93;35317:3;35228:93;:::i;:::-;35346:2;35341:3;35337:12;35330:19;;34989:366;;;:::o;35361:419::-;35527:4;35565:2;35554:9;35550:18;35542:26;;35614:9;35608:4;35604:20;35600:1;35589:9;35585:17;35578:47;35642:131;35768:4;35642:131;:::i;:::-;35634:139;;35361:419;;;:::o;35786:98::-;35837:6;35871:5;35865:12;35855:22;;35786:98;;;:::o;35890:168::-;35973:11;36007:6;36002:3;35995:19;36047:4;36042:3;36038:14;36023:29;;35890:168;;;;:::o;36064:360::-;36150:3;36178:38;36210:5;36178:38;:::i;:::-;36232:70;36295:6;36290:3;36232:70;:::i;:::-;36225:77;;36311:52;36356:6;36351:3;36344:4;36337:5;36333:16;36311:52;:::i;:::-;36388:29;36410:6;36388:29;:::i;:::-;36383:3;36379:39;36372:46;;36154:270;36064:360;;;;:::o;36430:640::-;36625:4;36663:3;36652:9;36648:19;36640:27;;36677:71;36745:1;36734:9;36730:17;36721:6;36677:71;:::i;:::-;36758:72;36826:2;36815:9;36811:18;36802:6;36758:72;:::i;:::-;36840;36908:2;36897:9;36893:18;36884:6;36840:72;:::i;:::-;36959:9;36953:4;36949:20;36944:2;36933:9;36929:18;36922:48;36987:76;37058:4;37049:6;36987:76;:::i;:::-;36979:84;;36430:640;;;;;;;:::o;37076:141::-;37132:5;37163:6;37157:13;37148:22;;37179:32;37205:5;37179:32;:::i;:::-;37076:141;;;;:::o;37223:349::-;37292:6;37341:2;37329:9;37320:7;37316:23;37312:32;37309:119;;;37347:79;;:::i;:::-;37309:119;37467:1;37492:63;37547:7;37538:6;37527:9;37523:22;37492:63;:::i;:::-;37482:73;;37438:127;37223:349;;;;:::o;37578:176::-;37610:1;37627:20;37645:1;37627:20;:::i;:::-;37622:25;;37661:20;37679:1;37661:20;:::i;:::-;37656:25;;37700:1;37690:35;;37705:18;;:::i;:::-;37690:35;37746:1;37743;37739:9;37734:14;;37578:176;;;;:::o

Swarm Source

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