ETH Price: $3,380.52 (-0.21%)

Token

The Bornless (TBL)
 

Overview

Max Total Supply

666 TBL

Holders

226

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
grail.eth
Balance
3 TBL
0x649b0894Ce2BA6199F923F7Db0c45625020C2427
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

The Bornless is a multiplayer horror game & series of 8 NFT collections. https://thebornless.com

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Bornless

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-11-25
*/

// File: @openzeppelin/contracts/utils/cryptography/ECDSA.sol



pragma solidity ^0.8.0;

/**
 * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
 *
 * These functions can be used to verify that a message was signed by the holder
 * of the private keys of a given address.
 */
library ECDSA {
    enum RecoverError {
        NoError,
        InvalidSignature,
        InvalidSignatureLength,
        InvalidSignatureS,
        InvalidSignatureV
    }

    function _throwError(RecoverError error) private pure {
        if (error == RecoverError.NoError) {
            return; // no error: do nothing
        } else if (error == RecoverError.InvalidSignature) {
            revert("ECDSA: invalid signature");
        } else if (error == RecoverError.InvalidSignatureLength) {
            revert("ECDSA: invalid signature length");
        } else if (error == RecoverError.InvalidSignatureS) {
            revert("ECDSA: invalid signature 's' value");
        } else if (error == RecoverError.InvalidSignatureV) {
            revert("ECDSA: invalid signature 'v' value");
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature` or error string. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     *
     * Documentation for signature generation:
     * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]
     * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]
     *
     * _Available since v4.3._
     */
    function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {
        // Check the signature length
        // - case 65: r,s,v signature (standard)
        // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._
        if (signature.length == 65) {
            bytes32 r;
            bytes32 s;
            uint8 v;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                s := mload(add(signature, 0x40))
                v := byte(0, mload(add(signature, 0x60)))
            }
            return tryRecover(hash, v, r, s);
        } else if (signature.length == 64) {
            bytes32 r;
            bytes32 vs;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                vs := mload(add(signature, 0x40))
            }
            return tryRecover(hash, r, vs);
        } else {
            return (address(0), RecoverError.InvalidSignatureLength);
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature`. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     */
    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, signature);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.
     *
     * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address, RecoverError) {
        bytes32 s;
        uint8 v;
        assembly {
            s := and(vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)
            v := add(shr(255, vs), 27)
        }
        return tryRecover(hash, v, r, s);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.
     *
     * _Available since v4.2._
     */
    function recover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, r, vs);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `v`,
     * `r` and `s` signature fields separately.
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address, RecoverError) {
        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
        // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most
        // signatures from current libraries generate a unique signature with an s-value in the lower half order.
        //
        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
        // these malleable signatures as well.
        if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
            return (address(0), RecoverError.InvalidSignatureS);
        }
        if (v != 27 && v != 28) {
            return (address(0), RecoverError.InvalidSignatureV);
        }

        // If the signature is valid (and not malleable), return the signer address
        address signer = ecrecover(hash, v, r, s);
        if (signer == address(0)) {
            return (address(0), RecoverError.InvalidSignature);
        }

        return (signer, RecoverError.NoError);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `v`,
     * `r` and `s` signature fields separately.
     */
    function recover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, v, r, s);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from a `hash`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
        // 32 is the length in bytes of hash,
        // enforced by the type signature above
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
    }

    /**
     * @dev Returns an Ethereum Signed Typed Data, created from a
     * `domainSeparator` and a `structHash`. This produces hash corresponding
     * to the one signed with the
     * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]
     * JSON-RPC method as part of EIP-712.
     *
     * See {recover}.
     */
    function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
    }
}

// File: @openzeppelin/contracts/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



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



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() {
        _setOwner(_msgSender());
    }

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

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

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

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

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

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



pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/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



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



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



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/IERC721Enumerable.sol



pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}

// File: @openzeppelin/contracts/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: @openzeppelin/contracts/token/ERC721/ERC721.sol



pragma solidity ^0.8.0;








/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

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

// File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol



pragma solidity ^0.8.0;



/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

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

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

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

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

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _allTokens.length;
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
        return _allTokens[index];
    }

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

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

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

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

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

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

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

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

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}

// File: contracts/Bornless.sol



pragma solidity ^0.8.0;





contract Bornless is ERC721Enumerable, Ownable {
    using Strings for uint256;
    using ECDSA for bytes32;

    string public baseURI;
    string public extension = ".json";
    uint256 public cost = 0.0666 ether;
    uint256 public maxSupply = 666;
    uint256 private privateMaxSupply = 660;
    uint public maxMintAmount = 20;
    bool public publicSale = false;
    bool public privateSale = false;
    address public signer1;
    address public signer2;
    address public signer3;
    address public signer4;
    address public signer5;

    constructor(string memory _name, string memory _symbol, string memory _initBaseURI) ERC721 (_name, _symbol){
        setBaseURI(_initBaseURI);
    }

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

    function mint(uint _mintAmount) public payable {
        require(publicSale, "Minting currently on hold");
        require(_mintAmount <= maxMintAmount, "Maximum mint amount exceeded");
        require(totalSupply() + _mintAmount <= maxSupply, "Purchase would exceed max supply of NFT");
        mintX(_mintAmount);
    }

    function privateSaleMint(uint _mintAmount, bytes memory signature) public payable {
        require(privateSale, "Private sale is not currently running");
        uint8 group = 0;
        address recover = recoverSignerAddress(msg.sender, signature);
        if (recover == signer1) {
            group = 1;
        }else if (recover == signer2) {
            group = 2;
        }else if (recover == signer3) {
            group = 3;
        }else if (recover == signer4) {
            group = 4;
        }else if (recover == signer5) {
            group = 5;
        }

        require(group > 0 && group <= 5, "Address not whitelisted for sale");
        require(totalSupply() + _mintAmount <= privateMaxSupply, "Purchase would exceed max supply of private sale");
        require(balanceOf(msg.sender) + _mintAmount <= group, "Minting would exceed max per wallet for presale");
        mintX(_mintAmount);
    }

    function mintX(uint _mintAmount) private {
        uint supply = totalSupply();
        require(_mintAmount > 0, "Amount to mint can not be 0");
        if (msg.sender != owner()) {
            require(msg.value >= cost * _mintAmount, "Amount sent less than the cost of minting NFT(s)");
        }
        for (uint256 i = 1; i <= _mintAmount; i++) {
            _safeMint(msg.sender, supply + i);
        }
    }

    function walletOfOwner(address _owner) public view returns (uint256[] memory){
        uint256 ownerTokenCount = balanceOf(_owner);
        uint256[] memory tokenIds = new uint256[](ownerTokenCount);
        for (uint256 i; i < ownerTokenCount; i++) {
            tokenIds[i] = tokenOfOwnerByIndex(_owner, i);
        }
        return tokenIds;
    }

    function tokenURI(uint256 tokenId) public view virtual override returns (string memory){

        require(_exists(tokenId), "ERC721Metadata: tokenURI queried for nonexistent token");
        string memory currentBaseURI = _baseURI();
        return bytes(currentBaseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString(), extension)) : "";
    }

    //
    function hashTransaction(address minter) private pure returns (bytes32) {
        bytes32 argsHash = keccak256(abi.encodePacked(minter));
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", argsHash));
    }

    function recoverSignerAddress(address minter, bytes memory signature) private pure returns (address) {
        bytes32 hash = hashTransaction(minter);
        return hash.recover(signature);
    }


    // Access control
    function setSigner(address _signer) public onlyOwner() {
        signer1 = _signer;
    }

    function setSigner2(address _signer) public onlyOwner() {
        signer2 = _signer;
    }

    function setSigner3(address _signer) public onlyOwner() {
        signer3 = _signer;
    }

    function setSigner4(address _signer) public onlyOwner() {
        signer4 = _signer;
    }

    function setSigner5(address _signer) public onlyOwner() {
        signer5 = _signer;
    }

    function setCost(uint256 _cost) public onlyOwner() {
        cost = _cost;
    }

    function setMaxMintAmount(uint256 _maxMintAmount) public onlyOwner() {
        maxMintAmount = _maxMintAmount;
    }

    function setBaseURI(string memory _newBaseURI) public onlyOwner() {
        baseURI = _newBaseURI;
    }

    function togglePublicSale() public onlyOwner() {
        publicSale = !publicSale;
    }

    function togglePrivateSale() public onlyOwner() {
        privateSale = !privateSale;
    }

    function configure(bool _publicSale, bool _privateSale, uint256 _maxMintAmount,
        address _signer1, address _signer2, address _signer3, address _signer4, address _signer5) public onlyOwner() {
        publicSale = _publicSale;
        privateSale = _privateSale;
        maxMintAmount = _maxMintAmount;
        signer1 = _signer1;
        signer2 = _signer2;
        signer3 = _signer3;
        signer4 = _signer4;
        signer5 = _signer5;
    }

    function mintIndex(uint index) public payable onlyOwner() {
        require(totalSupply() + 1 <= maxSupply, "Purchase would exceed max supply of NFTs");
        _safeMint(msg.sender, index);
    }

    function mintIndex(uint index, address to) public payable onlyOwner() {
        require(totalSupply() + 1 <= maxSupply, "Purchase would exceed max supply of NFTs");
        _safeMint(to, index);
    }

    function withdraw() public payable onlyOwner() {
        (bool success,) = address(msg.sender).call{value : address(this).balance}("");
        require(success, "Unable to withdraw balance");
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"string","name":"_initBaseURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_publicSale","type":"bool"},{"internalType":"bool","name":"_privateSale","type":"bool"},{"internalType":"uint256","name":"_maxMintAmount","type":"uint256"},{"internalType":"address","name":"_signer1","type":"address"},{"internalType":"address","name":"_signer2","type":"address"},{"internalType":"address","name":"_signer3","type":"address"},{"internalType":"address","name":"_signer4","type":"address"},{"internalType":"address","name":"_signer5","type":"address"}],"name":"configure","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"extension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"mintIndex","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"mintIndex","outputs":[],"stateMutability":"payable","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":"privateSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"privateSaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"publicSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxMintAmount","type":"uint256"}],"name":"setMaxMintAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_signer","type":"address"}],"name":"setSigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_signer","type":"address"}],"name":"setSigner2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_signer","type":"address"}],"name":"setSigner3","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_signer","type":"address"}],"name":"setSigner4","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_signer","type":"address"}],"name":"setSigner5","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"signer1","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"signer2","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"signer3","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"signer4","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"signer5","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"togglePrivateSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"togglePublicSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","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":"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":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

60806040526040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600c908051906020019062000051929190620002ea565b5066ec9c58de0a8000600d5561029a600e55610294600f5560146010556000601160006101000a81548160ff0219169083151502179055506000601160016101000a81548160ff021916908315150217905550348015620000b157600080fd5b50604051620066e3380380620066e38339818101604052810190620000d7919062000418565b82828160009080519060200190620000f1929190620002ea565b5080600190805190602001906200010a929190620002ea565b5050506200012d620001216200014760201b60201c565b6200014f60201b60201c565b6200013e816200021560201b60201c565b505050620006d8565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002256200014760201b60201c565b73ffffffffffffffffffffffffffffffffffffffff166200024b620002c060201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620002a4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200029b90620004f8565b60405180910390fd5b80600b9080519060200190620002bc929190620002ea565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b828054620002f890620005c0565b90600052602060002090601f0160209004810192826200031c576000855562000368565b82601f106200033757805160ff191683800117855562000368565b8280016001018555821562000368579182015b82811115620003675782518255916020019190600101906200034a565b5b5090506200037791906200037b565b5090565b5b80821115620003965760008160009055506001016200037c565b5090565b6000620003b1620003ab8462000543565b6200051a565b905082815260208101848484011115620003d057620003cf6200068f565b5b620003dd8482856200058a565b509392505050565b600082601f830112620003fd57620003fc6200068a565b5b81516200040f8482602086016200039a565b91505092915050565b60008060006060848603121562000434576200043362000699565b5b600084015167ffffffffffffffff81111562000455576200045462000694565b5b6200046386828701620003e5565b935050602084015167ffffffffffffffff81111562000487576200048662000694565b5b6200049586828701620003e5565b925050604084015167ffffffffffffffff811115620004b957620004b862000694565b5b620004c786828701620003e5565b9150509250925092565b6000620004e060208362000579565b9150620004ed82620006af565b602082019050919050565b600060208201905081810360008301526200051381620004d1565b9050919050565b60006200052662000539565b9050620005348282620005f6565b919050565b6000604051905090565b600067ffffffffffffffff8211156200056157620005606200065b565b5b6200056c826200069e565b9050602081019050919050565b600082825260208201905092915050565b60005b83811015620005aa5780820151818401526020810190506200058d565b83811115620005ba576000848401525b50505050565b60006002820490506001821680620005d957607f821691505b60208210811415620005f057620005ef6200062c565b5b50919050565b62000601826200069e565b810181811067ffffffffffffffff821117156200062357620006226200065b565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b615ffb80620006e86000396000f3fe6080604052600436106102935760003560e01c80636352211e1161015a578063b0b50ed5116100c1578063e222c7f91161007a578063e222c7f91461099b578063e985e9c5146109b2578063f25b9368146109ef578063f2fde38b14610a18578063f9c01ea114610a41578063feebf00114610a6a57610293565b8063b0b50ed5146108ac578063b88d4fde146108c8578063ba1f879f146108f1578063c87b56dd1461091c578063d5abeb0114610959578063dfe5dd681461098457610293565b8063715018a611610113578063715018a6146107de5780638da5cb5b146107f557806390afc81b1461082057806395d89b411461083c578063a0712d6814610867578063a22cb4651461088357610293565b80636352211e146106cb5780636c0360eb146107085780636c19e783146107335780636f22a2981461075c5780636f86b0c81461078557806370a08231146107a157610293565b806333bc1c5c116101fe57806342842e0e116101b757806342842e0e146105ab578063438b6300146105d457806344a0d68a146106115780634f6ccce71461063a57806355f804b31461067757806357203255146106a057610293565b806333bc1c5c146104cc57806334107282146104f757806335be0f721461052257806338c0ac5f1461054b5780633ccfd60b146105765780633eeb92f61461058057610293565b806318160ddd1161025057806318160ddd146103ba578063239c70ae146103e557806323b872dd14610410578063258878cd146104395780632d5537b0146104645780632f745c591461048f57610293565b806301ffc9a71461029857806306fdde03146102d5578063081812fc14610300578063088a4ed01461033d578063095ea7b31461036657806313faede61461038f575b600080fd5b3480156102a457600080fd5b506102bf60048036038101906102ba9190614303565b610a93565b6040516102cc9190614c68565b60405180910390f35b3480156102e157600080fd5b506102ea610b0d565b6040516102f79190614cc8565b60405180910390f35b34801561030c57600080fd5b50610327600480360381019061032291906143a6565b610b9f565b6040516103349190614bdf565b60405180910390f35b34801561034957600080fd5b50610364600480360381019061035f91906143a6565b610c24565b005b34801561037257600080fd5b5061038d6004803603810190610388919061420d565b610caa565b005b34801561039b57600080fd5b506103a4610dc2565b6040516103b1919061510a565b60405180910390f35b3480156103c657600080fd5b506103cf610dc8565b6040516103dc919061510a565b60405180910390f35b3480156103f157600080fd5b506103fa610dd5565b604051610407919061510a565b60405180910390f35b34801561041c57600080fd5b50610437600480360381019061043291906140f7565b610ddb565b005b34801561044557600080fd5b5061044e610e3b565b60405161045b9190614bdf565b60405180910390f35b34801561047057600080fd5b50610479610e61565b6040516104869190614cc8565b60405180910390f35b34801561049b57600080fd5b506104b660048036038101906104b1919061420d565b610eef565b6040516104c3919061510a565b60405180910390f35b3480156104d857600080fd5b506104e1610f94565b6040516104ee9190614c68565b60405180910390f35b34801561050357600080fd5b5061050c610fa7565b6040516105199190614bdf565b60405180910390f35b34801561052e57600080fd5b506105496004803603810190610544919061424d565b610fcd565b005b34801561055757600080fd5b506105606111d3565b60405161056d9190614bdf565b60405180910390f35b61057e6111f9565b005b34801561058c57600080fd5b50610595611324565b6040516105a29190614bdf565b60405180910390f35b3480156105b757600080fd5b506105d260048036038101906105cd91906140f7565b61134a565b005b3480156105e057600080fd5b506105fb60048036038101906105f6919061408a565b61136a565b6040516106089190614c46565b60405180910390f35b34801561061d57600080fd5b50610638600480360381019061063391906143a6565b611418565b005b34801561064657600080fd5b50610661600480360381019061065c91906143a6565b61149e565b60405161066e919061510a565b60405180910390f35b34801561068357600080fd5b5061069e6004803603810190610699919061435d565b61150f565b005b3480156106ac57600080fd5b506106b56115a5565b6040516106c29190614bdf565b60405180910390f35b3480156106d757600080fd5b506106f260048036038101906106ed91906143a6565b6115cb565b6040516106ff9190614bdf565b60405180910390f35b34801561071457600080fd5b5061071d61167d565b60405161072a9190614cc8565b60405180910390f35b34801561073f57600080fd5b5061075a6004803603810190610755919061408a565b61170b565b005b34801561076857600080fd5b50610783600480360381019061077e919061408a565b6117cb565b005b61079f600480360381019061079a9190614413565b61188b565b005b3480156107ad57600080fd5b506107c860048036038101906107c3919061408a565b611bd9565b6040516107d5919061510a565b60405180910390f35b3480156107ea57600080fd5b506107f3611c91565b005b34801561080157600080fd5b5061080a611d19565b6040516108179190614bdf565b60405180910390f35b61083a600480360381019061083591906143d3565b611d43565b005b34801561084857600080fd5b50610851611e25565b60405161085e9190614cc8565b60405180910390f35b610881600480360381019061087c91906143a6565b611eb7565b005b34801561088f57600080fd5b506108aa60048036038101906108a591906141cd565b611fae565b005b6108c660048036038101906108c191906143a6565b61212f565b005b3480156108d457600080fd5b506108ef60048036038101906108ea919061414a565b612210565b005b3480156108fd57600080fd5b50610906612272565b6040516109139190614c68565b60405180910390f35b34801561092857600080fd5b50610943600480360381019061093e91906143a6565b612285565b6040516109509190614cc8565b60405180910390f35b34801561096557600080fd5b5061096e612330565b60405161097b919061510a565b60405180910390f35b34801561099057600080fd5b50610999612336565b005b3480156109a757600080fd5b506109b06123de565b005b3480156109be57600080fd5b506109d960048036038101906109d491906140b7565b612486565b6040516109e69190614c68565b60405180910390f35b3480156109fb57600080fd5b50610a166004803603810190610a11919061408a565b61251a565b005b348015610a2457600080fd5b50610a3f6004803603810190610a3a919061408a565b6125da565b005b348015610a4d57600080fd5b50610a686004803603810190610a63919061408a565b6126d2565b005b348015610a7657600080fd5b50610a916004803603810190610a8c919061408a565b612792565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b065750610b0582612852565b5b9050919050565b606060008054610b1c9061542a565b80601f0160208091040260200160405190810160405280929190818152602001828054610b489061542a565b8015610b955780601f10610b6a57610100808354040283529160200191610b95565b820191906000526020600020905b815481529060010190602001808311610b7857829003601f168201915b5050505050905090565b6000610baa82612934565b610be9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be090614faa565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b610c2c6129a0565b73ffffffffffffffffffffffffffffffffffffffff16610c4a611d19565b73ffffffffffffffffffffffffffffffffffffffff1614610ca0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9790614fca565b60405180910390fd5b8060108190555050565b6000610cb5826115cb565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1d9061504a565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d456129a0565b73ffffffffffffffffffffffffffffffffffffffff161480610d745750610d7381610d6e6129a0565b612486565b5b610db3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610daa90614eea565b60405180910390fd5b610dbd83836129a8565b505050565b600d5481565b6000600880549050905090565b60105481565b610dec610de66129a0565b82612a61565b610e2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e229061506a565b60405180910390fd5b610e36838383612b3f565b505050565b601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600c8054610e6e9061542a565b80601f0160208091040260200160405190810160405280929190818152602001828054610e9a9061542a565b8015610ee75780601f10610ebc57610100808354040283529160200191610ee7565b820191906000526020600020905b815481529060010190602001808311610eca57829003601f168201915b505050505081565b6000610efa83611bd9565b8210610f3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3290614d4a565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b601160009054906101000a900460ff1681565b601160029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610fd56129a0565b73ffffffffffffffffffffffffffffffffffffffff16610ff3611d19565b73ffffffffffffffffffffffffffffffffffffffff1614611049576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104090614fca565b60405180910390fd5b87601160006101000a81548160ff02191690831515021790555086601160016101000a81548160ff0219169083151502179055508560108190555084601160026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555083601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081601460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080601560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505050505050565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6112016129a0565b73ffffffffffffffffffffffffffffffffffffffff1661121f611d19565b73ffffffffffffffffffffffffffffffffffffffff1614611275576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126c90614fca565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff164760405161129b90614bca565b60006040518083038185875af1925050503d80600081146112d8576040519150601f19603f3d011682016040523d82523d6000602084013e6112dd565b606091505b5050905080611321576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131890614fea565b60405180910390fd5b50565b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61136583838360405180602001604052806000815250612210565b505050565b6060600061137783611bd9565b905060008167ffffffffffffffff8111156113955761139461564f565b5b6040519080825280602002602001820160405280156113c35781602001602082028036833780820191505090505b50905060005b8281101561140d576113db8582610eef565b8282815181106113ee576113ed615620565b5b60200260200101818152505080806114059061548d565b9150506113c9565b508092505050919050565b6114206129a0565b73ffffffffffffffffffffffffffffffffffffffff1661143e611d19565b73ffffffffffffffffffffffffffffffffffffffff1614611494576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148b90614fca565b60405180910390fd5b80600d8190555050565b60006114a8610dc8565b82106114e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e0906150aa565b60405180910390fd5b600882815481106114fd576114fc615620565b5b90600052602060002001549050919050565b6115176129a0565b73ffffffffffffffffffffffffffffffffffffffff16611535611d19565b73ffffffffffffffffffffffffffffffffffffffff161461158b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158290614fca565b60405180910390fd5b80600b90805190602001906115a1929190613e9e565b5050565b601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611674576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166b90614f2a565b60405180910390fd5b80915050919050565b600b805461168a9061542a565b80601f01602080910402602001604051908101604052809291908181526020018280546116b69061542a565b80156117035780601f106116d857610100808354040283529160200191611703565b820191906000526020600020905b8154815290600101906020018083116116e657829003601f168201915b505050505081565b6117136129a0565b73ffffffffffffffffffffffffffffffffffffffff16611731611d19565b73ffffffffffffffffffffffffffffffffffffffff1614611787576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177e90614fca565b60405180910390fd5b80601160026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6117d36129a0565b73ffffffffffffffffffffffffffffffffffffffff166117f1611d19565b73ffffffffffffffffffffffffffffffffffffffff1614611847576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183e90614fca565b60405180910390fd5b80601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b601160019054906101000a900460ff166118da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d1906150ea565b60405180910390fd5b6000806118e73384612d9b565b9050601160029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156119485760019150611ac4565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156119a75760029150611ac3565b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611a065760039150611ac2565b601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611a655760049150611ac1565b601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611ac057600591505b5b5b5b5b60008260ff16118015611adb575060058260ff1611155b611b1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1190614e0a565b60405180910390fd5b600f5484611b26610dc8565b611b309190615248565b1115611b71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b689061502a565b60405180910390fd5b8160ff1684611b7f33611bd9565b611b899190615248565b1115611bca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc190614d0a565b60405180910390fd5b611bd384612dc5565b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611c4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4190614f0a565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611c996129a0565b73ffffffffffffffffffffffffffffffffffffffff16611cb7611d19565b73ffffffffffffffffffffffffffffffffffffffff1614611d0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0490614fca565b60405180910390fd5b611d176000612eda565b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611d4b6129a0565b73ffffffffffffffffffffffffffffffffffffffff16611d69611d19565b73ffffffffffffffffffffffffffffffffffffffff1614611dbf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611db690614fca565b60405180910390fd5b600e546001611dcc610dc8565b611dd69190615248565b1115611e17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0e90614d8a565b60405180910390fd5b611e218183612fa0565b5050565b606060018054611e349061542a565b80601f0160208091040260200160405190810160405280929190818152602001828054611e609061542a565b8015611ead5780601f10611e8257610100808354040283529160200191611ead565b820191906000526020600020905b815481529060010190602001808311611e9057829003601f168201915b5050505050905090565b601160009054906101000a900460ff16611f06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611efd90614eca565b60405180910390fd5b601054811115611f4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f4290614f4a565b60405180910390fd5b600e5481611f57610dc8565b611f619190615248565b1115611fa2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9990614e2a565b60405180910390fd5b611fab81612dc5565b50565b611fb66129a0565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612024576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161201b90614e6a565b60405180910390fd5b80600560006120316129a0565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166120de6129a0565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516121239190614c68565b60405180910390a35050565b6121376129a0565b73ffffffffffffffffffffffffffffffffffffffff16612155611d19565b73ffffffffffffffffffffffffffffffffffffffff16146121ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121a290614fca565b60405180910390fd5b600e5460016121b8610dc8565b6121c29190615248565b1115612203576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121fa90614d8a565b60405180910390fd5b61220d3382612fa0565b50565b61222161221b6129a0565b83612a61565b612260576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122579061506a565b60405180910390fd5b61226c84848484612fbe565b50505050565b601160019054906101000a900460ff1681565b606061229082612934565b6122cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122c6906150ca565b60405180910390fd5b60006122d961301a565b905060008151116122f95760405180602001604052806000815250612328565b600b612304846130ac565b600c60405160200161231893929190614b73565b6040516020818303038152906040525b915050919050565b600e5481565b61233e6129a0565b73ffffffffffffffffffffffffffffffffffffffff1661235c611d19565b73ffffffffffffffffffffffffffffffffffffffff16146123b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a990614fca565b60405180910390fd5b601160019054906101000a900460ff1615601160016101000a81548160ff021916908315150217905550565b6123e66129a0565b73ffffffffffffffffffffffffffffffffffffffff16612404611d19565b73ffffffffffffffffffffffffffffffffffffffff161461245a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161245190614fca565b60405180910390fd5b601160009054906101000a900460ff1615601160006101000a81548160ff021916908315150217905550565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6125226129a0565b73ffffffffffffffffffffffffffffffffffffffff16612540611d19565b73ffffffffffffffffffffffffffffffffffffffff1614612596576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161258d90614fca565b60405180910390fd5b80601560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6125e26129a0565b73ffffffffffffffffffffffffffffffffffffffff16612600611d19565b73ffffffffffffffffffffffffffffffffffffffff1614612656576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161264d90614fca565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156126c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126bd90614daa565b60405180910390fd5b6126cf81612eda565b50565b6126da6129a0565b73ffffffffffffffffffffffffffffffffffffffff166126f8611d19565b73ffffffffffffffffffffffffffffffffffffffff161461274e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161274590614fca565b60405180910390fd5b80601460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61279a6129a0565b73ffffffffffffffffffffffffffffffffffffffff166127b8611d19565b73ffffffffffffffffffffffffffffffffffffffff161461280e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161280590614fca565b60405180910390fd5b80601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061291d57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061292d575061292c8261320d565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612a1b836115cb565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612a6c82612934565b612aab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612aa290614eaa565b60405180910390fd5b6000612ab6836115cb565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612b2557508373ffffffffffffffffffffffffffffffffffffffff16612b0d84610b9f565b73ffffffffffffffffffffffffffffffffffffffff16145b80612b365750612b358185612486565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612b5f826115cb565b73ffffffffffffffffffffffffffffffffffffffff1614612bb5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bac9061500a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612c25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c1c90614e4a565b60405180910390fd5b612c30838383613277565b612c3b6000826129a8565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612c8b9190615329565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612ce29190615248565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600080612da78461338b565b9050612dbc83826133e690919063ffffffff16565b91505092915050565b6000612dcf610dc8565b905060008211612e14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e0b9061508a565b60405180910390fd5b612e1c611d19565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612e9f5781600d54612e5c91906152cf565b341015612e9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e9590614dea565b60405180910390fd5b5b6000600190505b828111612ed557612ec2338284612ebd9190615248565b612fa0565b8080612ecd9061548d565b915050612ea6565b505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612fba82826040518060200160405280600081525061340d565b5050565b612fc9848484612b3f565b612fd584848484613468565b613014576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161300b90614d6a565b60405180910390fd5b50505050565b6060600b80546130299061542a565b80601f01602080910402602001604051908101604052809291908181526020018280546130559061542a565b80156130a25780601f10613077576101008083540402835291602001916130a2565b820191906000526020600020905b81548152906001019060200180831161308557829003601f168201915b5050505050905090565b606060008214156130f4576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613208565b600082905060005b6000821461312657808061310f9061548d565b915050600a8261311f919061529e565b91506130fc565b60008167ffffffffffffffff8111156131425761314161564f565b5b6040519080825280601f01601f1916602001820160405280156131745781602001600182028036833780820191505090505b5090505b600085146132015760018261318d9190615329565b9150600a8561319c9190615504565b60306131a89190615248565b60f81b8183815181106131be576131bd615620565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856131fa919061529e565b9450613178565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6132828383836135ff565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156132c5576132c081613604565b613304565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461330357613302838261364d565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561334757613342816137ba565b613386565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461338557613384828261388b565b5b5b505050565b6000808260405160200161339f9190614b58565b604051602081830303815290604052805190602001209050806040516020016133c89190614ba4565b60405160208183030381529060405280519060200120915050919050565b60008060006133f5858561390a565b915091506134028161398d565b819250505092915050565b6134178383613b62565b6134246000848484613468565b613463576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161345a90614d6a565b60405180910390fd5b505050565b60006134898473ffffffffffffffffffffffffffffffffffffffff16613d30565b156135f2578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026134b26129a0565b8786866040518563ffffffff1660e01b81526004016134d49493929190614bfa565b602060405180830381600087803b1580156134ee57600080fd5b505af192505050801561351f57506040513d601f19601f8201168201806040525081019061351c9190614330565b60015b6135a2573d806000811461354f576040519150601f19603f3d011682016040523d82523d6000602084013e613554565b606091505b5060008151141561359a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161359190614d6a565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506135f7565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161365a84611bd9565b6136649190615329565b9050600060076000848152602001908152602001600020549050818114613749576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506137ce9190615329565b90506000600960008481526020019081526020016000205490506000600883815481106137fe576137fd615620565b5b9060005260206000200154905080600883815481106138205761381f615620565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061386f5761386e6155f1565b5b6001900381819060005260206000200160009055905550505050565b600061389683611bd9565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b60008060418351141561394c5760008060006020860151925060408601519150606086015160001a905061394087828585613d43565b94509450505050613986565b60408351141561397d576000806020850151915060408501519050613972868383613e50565b935093505050613986565b60006002915091505b9250929050565b600060048111156139a1576139a0615593565b5b8160048111156139b4576139b3615593565b5b14156139bf57613b5f565b600160048111156139d3576139d2615593565b5b8160048111156139e6576139e5615593565b5b1415613a27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a1e90614cea565b60405180910390fd5b60026004811115613a3b57613a3a615593565b5b816004811115613a4e57613a4d615593565b5b1415613a8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a8690614d2a565b60405180910390fd5b60036004811115613aa357613aa2615593565b5b816004811115613ab657613ab5615593565b5b1415613af7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613aee90614e8a565b60405180910390fd5b600480811115613b0a57613b09615593565b5b816004811115613b1d57613b1c615593565b5b1415613b5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b5590614f6a565b60405180910390fd5b5b50565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613bd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613bc990614f8a565b60405180910390fd5b613bdb81612934565b15613c1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c1290614dca565b60405180910390fd5b613c2760008383613277565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613c779190615248565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115613d7e576000600391509150613e47565b601b8560ff1614158015613d965750601c8560ff1614155b15613da8576000600491509150613e47565b600060018787878760405160008152602001604052604051613dcd9493929190614c83565b6020604051602081039080840390855afa158015613def573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415613e3e57600060019250925050613e47565b80600092509250505b94509492505050565b6000806000807f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85169150601b8560ff1c019050613e9087828885613d43565b935093505050935093915050565b828054613eaa9061542a565b90600052602060002090601f016020900481019282613ecc5760008555613f13565b82601f10613ee557805160ff1916838001178555613f13565b82800160010185558215613f13579182015b82811115613f12578251825591602001919060010190613ef7565b5b509050613f209190613f24565b5090565b5b80821115613f3d576000816000905550600101613f25565b5090565b6000613f54613f4f8461514a565b615125565b905082815260208101848484011115613f7057613f6f615683565b5b613f7b8482856153e8565b509392505050565b6000613f96613f918461517b565b615125565b905082815260208101848484011115613fb257613fb1615683565b5b613fbd8482856153e8565b509392505050565b600081359050613fd481615f69565b92915050565b600081359050613fe981615f80565b92915050565b600081359050613ffe81615f97565b92915050565b60008151905061401381615f97565b92915050565b600082601f83011261402e5761402d61567e565b5b813561403e848260208601613f41565b91505092915050565b600082601f83011261405c5761405b61567e565b5b813561406c848260208601613f83565b91505092915050565b60008135905061408481615fae565b92915050565b6000602082840312156140a05761409f61568d565b5b60006140ae84828501613fc5565b91505092915050565b600080604083850312156140ce576140cd61568d565b5b60006140dc85828601613fc5565b92505060206140ed85828601613fc5565b9150509250929050565b6000806000606084860312156141105761410f61568d565b5b600061411e86828701613fc5565b935050602061412f86828701613fc5565b925050604061414086828701614075565b9150509250925092565b600080600080608085870312156141645761416361568d565b5b600061417287828801613fc5565b945050602061418387828801613fc5565b935050604061419487828801614075565b925050606085013567ffffffffffffffff8111156141b5576141b4615688565b5b6141c187828801614019565b91505092959194509250565b600080604083850312156141e4576141e361568d565b5b60006141f285828601613fc5565b925050602061420385828601613fda565b9150509250929050565b600080604083850312156142245761422361568d565b5b600061423285828601613fc5565b925050602061424385828601614075565b9150509250929050565b600080600080600080600080610100898b03121561426e5761426d61568d565b5b600061427c8b828c01613fda565b985050602061428d8b828c01613fda565b975050604061429e8b828c01614075565b96505060606142af8b828c01613fc5565b95505060806142c08b828c01613fc5565b94505060a06142d18b828c01613fc5565b93505060c06142e28b828c01613fc5565b92505060e06142f38b828c01613fc5565b9150509295985092959890939650565b6000602082840312156143195761431861568d565b5b600061432784828501613fef565b91505092915050565b6000602082840312156143465761434561568d565b5b600061435484828501614004565b91505092915050565b6000602082840312156143735761437261568d565b5b600082013567ffffffffffffffff81111561439157614390615688565b5b61439d84828501614047565b91505092915050565b6000602082840312156143bc576143bb61568d565b5b60006143ca84828501614075565b91505092915050565b600080604083850312156143ea576143e961568d565b5b60006143f885828601614075565b925050602061440985828601613fc5565b9150509250929050565b6000806040838503121561442a5761442961568d565b5b600061443885828601614075565b925050602083013567ffffffffffffffff81111561445957614458615688565b5b61446585828601614019565b9150509250929050565b600061447b8383614b2b565b60208301905092915050565b6144908161535d565b82525050565b6144a76144a28261535d565b6154d6565b82525050565b60006144b8826151d1565b6144c281856151ff565b93506144cd836151ac565b8060005b838110156144fe5781516144e5888261446f565b97506144f0836151f2565b9250506001810190506144d1565b5085935050505092915050565b6145148161536f565b82525050565b6145238161537b565b82525050565b61453a6145358261537b565b6154e8565b82525050565b600061454b826151dc565b6145558185615210565b93506145658185602086016153f7565b61456e81615692565b840191505092915050565b6000614584826151e7565b61458e818561522c565b935061459e8185602086016153f7565b6145a781615692565b840191505092915050565b60006145bd826151e7565b6145c7818561523d565b93506145d78185602086016153f7565b80840191505092915050565b600081546145f08161542a565b6145fa818661523d565b94506001821660008114614615576001811461462657614659565b60ff19831686528186019350614659565b61462f856151bc565b60005b8381101561465157815481890152600182019150602081019050614632565b838801955050505b50505092915050565b600061466f60188361522c565b915061467a826156b0565b602082019050919050565b6000614692602f8361522c565b915061469d826156d9565b604082019050919050565b60006146b5601f8361522c565b91506146c082615728565b602082019050919050565b60006146d8601c8361523d565b91506146e382615751565b601c82019050919050565b60006146fb602b8361522c565b91506147068261577a565b604082019050919050565b600061471e60328361522c565b9150614729826157c9565b604082019050919050565b600061474160288361522c565b915061474c82615818565b604082019050919050565b600061476460268361522c565b915061476f82615867565b604082019050919050565b6000614787601c8361522c565b9150614792826158b6565b602082019050919050565b60006147aa60308361522c565b91506147b5826158df565b604082019050919050565b60006147cd60208361522c565b91506147d88261592e565b602082019050919050565b60006147f060278361522c565b91506147fb82615957565b604082019050919050565b600061481360248361522c565b915061481e826159a6565b604082019050919050565b600061483660198361522c565b9150614841826159f5565b602082019050919050565b600061485960228361522c565b915061486482615a1e565b604082019050919050565b600061487c602c8361522c565b915061488782615a6d565b604082019050919050565b600061489f60198361522c565b91506148aa82615abc565b602082019050919050565b60006148c260388361522c565b91506148cd82615ae5565b604082019050919050565b60006148e5602a8361522c565b91506148f082615b34565b604082019050919050565b600061490860298361522c565b915061491382615b83565b604082019050919050565b600061492b601c8361522c565b915061493682615bd2565b602082019050919050565b600061494e60228361522c565b915061495982615bfb565b604082019050919050565b600061497160208361522c565b915061497c82615c4a565b602082019050919050565b6000614994602c8361522c565b915061499f82615c73565b604082019050919050565b60006149b760208361522c565b91506149c282615cc2565b602082019050919050565b60006149da601a8361522c565b91506149e582615ceb565b602082019050919050565b60006149fd60298361522c565b9150614a0882615d14565b604082019050919050565b6000614a2060308361522c565b9150614a2b82615d63565b604082019050919050565b6000614a4360218361522c565b9150614a4e82615db2565b604082019050919050565b6000614a66600083615221565b9150614a7182615e01565b600082019050919050565b6000614a8960318361522c565b9150614a9482615e04565b604082019050919050565b6000614aac601b8361522c565b9150614ab782615e53565b602082019050919050565b6000614acf602c8361522c565b9150614ada82615e7c565b604082019050919050565b6000614af260368361522c565b9150614afd82615ecb565b604082019050919050565b6000614b1560258361522c565b9150614b2082615f1a565b604082019050919050565b614b34816153d1565b82525050565b614b43816153d1565b82525050565b614b52816153db565b82525050565b6000614b648284614496565b60148201915081905092915050565b6000614b7f82866145e3565b9150614b8b82856145b2565b9150614b9782846145e3565b9150819050949350505050565b6000614baf826146cb565b9150614bbb8284614529565b60208201915081905092915050565b6000614bd582614a59565b9150819050919050565b6000602082019050614bf46000830184614487565b92915050565b6000608082019050614c0f6000830187614487565b614c1c6020830186614487565b614c296040830185614b3a565b8181036060830152614c3b8184614540565b905095945050505050565b60006020820190508181036000830152614c6081846144ad565b905092915050565b6000602082019050614c7d600083018461450b565b92915050565b6000608082019050614c98600083018761451a565b614ca56020830186614b49565b614cb2604083018561451a565b614cbf606083018461451a565b95945050505050565b60006020820190508181036000830152614ce28184614579565b905092915050565b60006020820190508181036000830152614d0381614662565b9050919050565b60006020820190508181036000830152614d2381614685565b9050919050565b60006020820190508181036000830152614d43816146a8565b9050919050565b60006020820190508181036000830152614d63816146ee565b9050919050565b60006020820190508181036000830152614d8381614711565b9050919050565b60006020820190508181036000830152614da381614734565b9050919050565b60006020820190508181036000830152614dc381614757565b9050919050565b60006020820190508181036000830152614de38161477a565b9050919050565b60006020820190508181036000830152614e038161479d565b9050919050565b60006020820190508181036000830152614e23816147c0565b9050919050565b60006020820190508181036000830152614e43816147e3565b9050919050565b60006020820190508181036000830152614e6381614806565b9050919050565b60006020820190508181036000830152614e8381614829565b9050919050565b60006020820190508181036000830152614ea38161484c565b9050919050565b60006020820190508181036000830152614ec38161486f565b9050919050565b60006020820190508181036000830152614ee381614892565b9050919050565b60006020820190508181036000830152614f03816148b5565b9050919050565b60006020820190508181036000830152614f23816148d8565b9050919050565b60006020820190508181036000830152614f43816148fb565b9050919050565b60006020820190508181036000830152614f638161491e565b9050919050565b60006020820190508181036000830152614f8381614941565b9050919050565b60006020820190508181036000830152614fa381614964565b9050919050565b60006020820190508181036000830152614fc381614987565b9050919050565b60006020820190508181036000830152614fe3816149aa565b9050919050565b60006020820190508181036000830152615003816149cd565b9050919050565b60006020820190508181036000830152615023816149f0565b9050919050565b6000602082019050818103600083015261504381614a13565b9050919050565b6000602082019050818103600083015261506381614a36565b9050919050565b6000602082019050818103600083015261508381614a7c565b9050919050565b600060208201905081810360008301526150a381614a9f565b9050919050565b600060208201905081810360008301526150c381614ac2565b9050919050565b600060208201905081810360008301526150e381614ae5565b9050919050565b6000602082019050818103600083015261510381614b08565b9050919050565b600060208201905061511f6000830184614b3a565b92915050565b600061512f615140565b905061513b828261545c565b919050565b6000604051905090565b600067ffffffffffffffff8211156151655761516461564f565b5b61516e82615692565b9050602081019050919050565b600067ffffffffffffffff8211156151965761519561564f565b5b61519f82615692565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000615253826153d1565b915061525e836153d1565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561529357615292615535565b5b828201905092915050565b60006152a9826153d1565b91506152b4836153d1565b9250826152c4576152c3615564565b5b828204905092915050565b60006152da826153d1565b91506152e5836153d1565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561531e5761531d615535565b5b828202905092915050565b6000615334826153d1565b915061533f836153d1565b92508282101561535257615351615535565b5b828203905092915050565b6000615368826153b1565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b838110156154155780820151818401526020810190506153fa565b83811115615424576000848401525b50505050565b6000600282049050600182168061544257607f821691505b60208210811415615456576154556155c2565b5b50919050565b61546582615692565b810181811067ffffffffffffffff821117156154845761548361564f565b5b80604052505050565b6000615498826153d1565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156154cb576154ca615535565b5b600182019050919050565b60006154e1826154f2565b9050919050565b6000819050919050565b60006154fd826156a3565b9050919050565b600061550f826153d1565b915061551a836153d1565b92508261552a57615529615564565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f4d696e74696e6720776f756c6420657863656564206d6178207065722077616c60008201527f6c657420666f722070726573616c650000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f507572636861736520776f756c6420657863656564206d617820737570706c7960008201527f206f66204e465473000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f416d6f756e742073656e74206c657373207468616e2074686520636f7374206f60008201527f66206d696e74696e67204e465428732900000000000000000000000000000000602082015250565b7f41646472657373206e6f742077686974656c697374656420666f722073616c65600082015250565b7f507572636861736520776f756c6420657863656564206d617820737570706c7960008201527f206f66204e465400000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4d696e74696e672063757272656e746c79206f6e20686f6c6400000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4d6178696d756d206d696e7420616d6f756e7420657863656564656400000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f556e61626c6520746f2077697468647261772062616c616e6365000000000000600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f507572636861736520776f756c6420657863656564206d617820737570706c7960008201527f206f6620707269766174652073616c6500000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f416d6f756e7420746f206d696e742063616e206e6f7420626520300000000000600082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a20746f6b656e555249207175657269656460008201527f20666f72206e6f6e6578697374656e7420746f6b656e00000000000000000000602082015250565b7f507269766174652073616c65206973206e6f742063757272656e746c7920727560008201527f6e6e696e67000000000000000000000000000000000000000000000000000000602082015250565b615f728161535d565b8114615f7d57600080fd5b50565b615f898161536f565b8114615f9457600080fd5b50565b615fa081615385565b8114615fab57600080fd5b50565b615fb7816153d1565b8114615fc257600080fd5b5056fea2646970667358221220c9a2d817cf1a84ef4c8719e10973cdd88b98eb88eab9e9ee6ed04737019f126a64736f6c63430008070033000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000000c54686520426f726e6c6573730000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000354424c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d4e54657651424864383858354c45546b3873467267443158544b3857726148525437755577427a39415770772f00000000000000000000

Deployed Bytecode

0x6080604052600436106102935760003560e01c80636352211e1161015a578063b0b50ed5116100c1578063e222c7f91161007a578063e222c7f91461099b578063e985e9c5146109b2578063f25b9368146109ef578063f2fde38b14610a18578063f9c01ea114610a41578063feebf00114610a6a57610293565b8063b0b50ed5146108ac578063b88d4fde146108c8578063ba1f879f146108f1578063c87b56dd1461091c578063d5abeb0114610959578063dfe5dd681461098457610293565b8063715018a611610113578063715018a6146107de5780638da5cb5b146107f557806390afc81b1461082057806395d89b411461083c578063a0712d6814610867578063a22cb4651461088357610293565b80636352211e146106cb5780636c0360eb146107085780636c19e783146107335780636f22a2981461075c5780636f86b0c81461078557806370a08231146107a157610293565b806333bc1c5c116101fe57806342842e0e116101b757806342842e0e146105ab578063438b6300146105d457806344a0d68a146106115780634f6ccce71461063a57806355f804b31461067757806357203255146106a057610293565b806333bc1c5c146104cc57806334107282146104f757806335be0f721461052257806338c0ac5f1461054b5780633ccfd60b146105765780633eeb92f61461058057610293565b806318160ddd1161025057806318160ddd146103ba578063239c70ae146103e557806323b872dd14610410578063258878cd146104395780632d5537b0146104645780632f745c591461048f57610293565b806301ffc9a71461029857806306fdde03146102d5578063081812fc14610300578063088a4ed01461033d578063095ea7b31461036657806313faede61461038f575b600080fd5b3480156102a457600080fd5b506102bf60048036038101906102ba9190614303565b610a93565b6040516102cc9190614c68565b60405180910390f35b3480156102e157600080fd5b506102ea610b0d565b6040516102f79190614cc8565b60405180910390f35b34801561030c57600080fd5b50610327600480360381019061032291906143a6565b610b9f565b6040516103349190614bdf565b60405180910390f35b34801561034957600080fd5b50610364600480360381019061035f91906143a6565b610c24565b005b34801561037257600080fd5b5061038d6004803603810190610388919061420d565b610caa565b005b34801561039b57600080fd5b506103a4610dc2565b6040516103b1919061510a565b60405180910390f35b3480156103c657600080fd5b506103cf610dc8565b6040516103dc919061510a565b60405180910390f35b3480156103f157600080fd5b506103fa610dd5565b604051610407919061510a565b60405180910390f35b34801561041c57600080fd5b50610437600480360381019061043291906140f7565b610ddb565b005b34801561044557600080fd5b5061044e610e3b565b60405161045b9190614bdf565b60405180910390f35b34801561047057600080fd5b50610479610e61565b6040516104869190614cc8565b60405180910390f35b34801561049b57600080fd5b506104b660048036038101906104b1919061420d565b610eef565b6040516104c3919061510a565b60405180910390f35b3480156104d857600080fd5b506104e1610f94565b6040516104ee9190614c68565b60405180910390f35b34801561050357600080fd5b5061050c610fa7565b6040516105199190614bdf565b60405180910390f35b34801561052e57600080fd5b506105496004803603810190610544919061424d565b610fcd565b005b34801561055757600080fd5b506105606111d3565b60405161056d9190614bdf565b60405180910390f35b61057e6111f9565b005b34801561058c57600080fd5b50610595611324565b6040516105a29190614bdf565b60405180910390f35b3480156105b757600080fd5b506105d260048036038101906105cd91906140f7565b61134a565b005b3480156105e057600080fd5b506105fb60048036038101906105f6919061408a565b61136a565b6040516106089190614c46565b60405180910390f35b34801561061d57600080fd5b50610638600480360381019061063391906143a6565b611418565b005b34801561064657600080fd5b50610661600480360381019061065c91906143a6565b61149e565b60405161066e919061510a565b60405180910390f35b34801561068357600080fd5b5061069e6004803603810190610699919061435d565b61150f565b005b3480156106ac57600080fd5b506106b56115a5565b6040516106c29190614bdf565b60405180910390f35b3480156106d757600080fd5b506106f260048036038101906106ed91906143a6565b6115cb565b6040516106ff9190614bdf565b60405180910390f35b34801561071457600080fd5b5061071d61167d565b60405161072a9190614cc8565b60405180910390f35b34801561073f57600080fd5b5061075a6004803603810190610755919061408a565b61170b565b005b34801561076857600080fd5b50610783600480360381019061077e919061408a565b6117cb565b005b61079f600480360381019061079a9190614413565b61188b565b005b3480156107ad57600080fd5b506107c860048036038101906107c3919061408a565b611bd9565b6040516107d5919061510a565b60405180910390f35b3480156107ea57600080fd5b506107f3611c91565b005b34801561080157600080fd5b5061080a611d19565b6040516108179190614bdf565b60405180910390f35b61083a600480360381019061083591906143d3565b611d43565b005b34801561084857600080fd5b50610851611e25565b60405161085e9190614cc8565b60405180910390f35b610881600480360381019061087c91906143a6565b611eb7565b005b34801561088f57600080fd5b506108aa60048036038101906108a591906141cd565b611fae565b005b6108c660048036038101906108c191906143a6565b61212f565b005b3480156108d457600080fd5b506108ef60048036038101906108ea919061414a565b612210565b005b3480156108fd57600080fd5b50610906612272565b6040516109139190614c68565b60405180910390f35b34801561092857600080fd5b50610943600480360381019061093e91906143a6565b612285565b6040516109509190614cc8565b60405180910390f35b34801561096557600080fd5b5061096e612330565b60405161097b919061510a565b60405180910390f35b34801561099057600080fd5b50610999612336565b005b3480156109a757600080fd5b506109b06123de565b005b3480156109be57600080fd5b506109d960048036038101906109d491906140b7565b612486565b6040516109e69190614c68565b60405180910390f35b3480156109fb57600080fd5b50610a166004803603810190610a11919061408a565b61251a565b005b348015610a2457600080fd5b50610a3f6004803603810190610a3a919061408a565b6125da565b005b348015610a4d57600080fd5b50610a686004803603810190610a63919061408a565b6126d2565b005b348015610a7657600080fd5b50610a916004803603810190610a8c919061408a565b612792565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b065750610b0582612852565b5b9050919050565b606060008054610b1c9061542a565b80601f0160208091040260200160405190810160405280929190818152602001828054610b489061542a565b8015610b955780601f10610b6a57610100808354040283529160200191610b95565b820191906000526020600020905b815481529060010190602001808311610b7857829003601f168201915b5050505050905090565b6000610baa82612934565b610be9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be090614faa565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b610c2c6129a0565b73ffffffffffffffffffffffffffffffffffffffff16610c4a611d19565b73ffffffffffffffffffffffffffffffffffffffff1614610ca0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9790614fca565b60405180910390fd5b8060108190555050565b6000610cb5826115cb565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1d9061504a565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d456129a0565b73ffffffffffffffffffffffffffffffffffffffff161480610d745750610d7381610d6e6129a0565b612486565b5b610db3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610daa90614eea565b60405180910390fd5b610dbd83836129a8565b505050565b600d5481565b6000600880549050905090565b60105481565b610dec610de66129a0565b82612a61565b610e2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e229061506a565b60405180910390fd5b610e36838383612b3f565b505050565b601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600c8054610e6e9061542a565b80601f0160208091040260200160405190810160405280929190818152602001828054610e9a9061542a565b8015610ee75780601f10610ebc57610100808354040283529160200191610ee7565b820191906000526020600020905b815481529060010190602001808311610eca57829003601f168201915b505050505081565b6000610efa83611bd9565b8210610f3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3290614d4a565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b601160009054906101000a900460ff1681565b601160029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610fd56129a0565b73ffffffffffffffffffffffffffffffffffffffff16610ff3611d19565b73ffffffffffffffffffffffffffffffffffffffff1614611049576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104090614fca565b60405180910390fd5b87601160006101000a81548160ff02191690831515021790555086601160016101000a81548160ff0219169083151502179055508560108190555084601160026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555083601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081601460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080601560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505050505050565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6112016129a0565b73ffffffffffffffffffffffffffffffffffffffff1661121f611d19565b73ffffffffffffffffffffffffffffffffffffffff1614611275576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126c90614fca565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff164760405161129b90614bca565b60006040518083038185875af1925050503d80600081146112d8576040519150601f19603f3d011682016040523d82523d6000602084013e6112dd565b606091505b5050905080611321576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131890614fea565b60405180910390fd5b50565b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61136583838360405180602001604052806000815250612210565b505050565b6060600061137783611bd9565b905060008167ffffffffffffffff8111156113955761139461564f565b5b6040519080825280602002602001820160405280156113c35781602001602082028036833780820191505090505b50905060005b8281101561140d576113db8582610eef565b8282815181106113ee576113ed615620565b5b60200260200101818152505080806114059061548d565b9150506113c9565b508092505050919050565b6114206129a0565b73ffffffffffffffffffffffffffffffffffffffff1661143e611d19565b73ffffffffffffffffffffffffffffffffffffffff1614611494576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148b90614fca565b60405180910390fd5b80600d8190555050565b60006114a8610dc8565b82106114e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e0906150aa565b60405180910390fd5b600882815481106114fd576114fc615620565b5b90600052602060002001549050919050565b6115176129a0565b73ffffffffffffffffffffffffffffffffffffffff16611535611d19565b73ffffffffffffffffffffffffffffffffffffffff161461158b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158290614fca565b60405180910390fd5b80600b90805190602001906115a1929190613e9e565b5050565b601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611674576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166b90614f2a565b60405180910390fd5b80915050919050565b600b805461168a9061542a565b80601f01602080910402602001604051908101604052809291908181526020018280546116b69061542a565b80156117035780601f106116d857610100808354040283529160200191611703565b820191906000526020600020905b8154815290600101906020018083116116e657829003601f168201915b505050505081565b6117136129a0565b73ffffffffffffffffffffffffffffffffffffffff16611731611d19565b73ffffffffffffffffffffffffffffffffffffffff1614611787576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177e90614fca565b60405180910390fd5b80601160026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6117d36129a0565b73ffffffffffffffffffffffffffffffffffffffff166117f1611d19565b73ffffffffffffffffffffffffffffffffffffffff1614611847576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183e90614fca565b60405180910390fd5b80601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b601160019054906101000a900460ff166118da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d1906150ea565b60405180910390fd5b6000806118e73384612d9b565b9050601160029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156119485760019150611ac4565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156119a75760029150611ac3565b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611a065760039150611ac2565b601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611a655760049150611ac1565b601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611ac057600591505b5b5b5b5b60008260ff16118015611adb575060058260ff1611155b611b1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1190614e0a565b60405180910390fd5b600f5484611b26610dc8565b611b309190615248565b1115611b71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b689061502a565b60405180910390fd5b8160ff1684611b7f33611bd9565b611b899190615248565b1115611bca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc190614d0a565b60405180910390fd5b611bd384612dc5565b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611c4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4190614f0a565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611c996129a0565b73ffffffffffffffffffffffffffffffffffffffff16611cb7611d19565b73ffffffffffffffffffffffffffffffffffffffff1614611d0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0490614fca565b60405180910390fd5b611d176000612eda565b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611d4b6129a0565b73ffffffffffffffffffffffffffffffffffffffff16611d69611d19565b73ffffffffffffffffffffffffffffffffffffffff1614611dbf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611db690614fca565b60405180910390fd5b600e546001611dcc610dc8565b611dd69190615248565b1115611e17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0e90614d8a565b60405180910390fd5b611e218183612fa0565b5050565b606060018054611e349061542a565b80601f0160208091040260200160405190810160405280929190818152602001828054611e609061542a565b8015611ead5780601f10611e8257610100808354040283529160200191611ead565b820191906000526020600020905b815481529060010190602001808311611e9057829003601f168201915b5050505050905090565b601160009054906101000a900460ff16611f06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611efd90614eca565b60405180910390fd5b601054811115611f4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f4290614f4a565b60405180910390fd5b600e5481611f57610dc8565b611f619190615248565b1115611fa2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9990614e2a565b60405180910390fd5b611fab81612dc5565b50565b611fb66129a0565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612024576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161201b90614e6a565b60405180910390fd5b80600560006120316129a0565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166120de6129a0565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516121239190614c68565b60405180910390a35050565b6121376129a0565b73ffffffffffffffffffffffffffffffffffffffff16612155611d19565b73ffffffffffffffffffffffffffffffffffffffff16146121ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121a290614fca565b60405180910390fd5b600e5460016121b8610dc8565b6121c29190615248565b1115612203576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121fa90614d8a565b60405180910390fd5b61220d3382612fa0565b50565b61222161221b6129a0565b83612a61565b612260576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122579061506a565b60405180910390fd5b61226c84848484612fbe565b50505050565b601160019054906101000a900460ff1681565b606061229082612934565b6122cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122c6906150ca565b60405180910390fd5b60006122d961301a565b905060008151116122f95760405180602001604052806000815250612328565b600b612304846130ac565b600c60405160200161231893929190614b73565b6040516020818303038152906040525b915050919050565b600e5481565b61233e6129a0565b73ffffffffffffffffffffffffffffffffffffffff1661235c611d19565b73ffffffffffffffffffffffffffffffffffffffff16146123b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a990614fca565b60405180910390fd5b601160019054906101000a900460ff1615601160016101000a81548160ff021916908315150217905550565b6123e66129a0565b73ffffffffffffffffffffffffffffffffffffffff16612404611d19565b73ffffffffffffffffffffffffffffffffffffffff161461245a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161245190614fca565b60405180910390fd5b601160009054906101000a900460ff1615601160006101000a81548160ff021916908315150217905550565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6125226129a0565b73ffffffffffffffffffffffffffffffffffffffff16612540611d19565b73ffffffffffffffffffffffffffffffffffffffff1614612596576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161258d90614fca565b60405180910390fd5b80601560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6125e26129a0565b73ffffffffffffffffffffffffffffffffffffffff16612600611d19565b73ffffffffffffffffffffffffffffffffffffffff1614612656576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161264d90614fca565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156126c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126bd90614daa565b60405180910390fd5b6126cf81612eda565b50565b6126da6129a0565b73ffffffffffffffffffffffffffffffffffffffff166126f8611d19565b73ffffffffffffffffffffffffffffffffffffffff161461274e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161274590614fca565b60405180910390fd5b80601460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61279a6129a0565b73ffffffffffffffffffffffffffffffffffffffff166127b8611d19565b73ffffffffffffffffffffffffffffffffffffffff161461280e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161280590614fca565b60405180910390fd5b80601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061291d57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061292d575061292c8261320d565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612a1b836115cb565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612a6c82612934565b612aab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612aa290614eaa565b60405180910390fd5b6000612ab6836115cb565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612b2557508373ffffffffffffffffffffffffffffffffffffffff16612b0d84610b9f565b73ffffffffffffffffffffffffffffffffffffffff16145b80612b365750612b358185612486565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612b5f826115cb565b73ffffffffffffffffffffffffffffffffffffffff1614612bb5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bac9061500a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612c25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c1c90614e4a565b60405180910390fd5b612c30838383613277565b612c3b6000826129a8565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612c8b9190615329565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612ce29190615248565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600080612da78461338b565b9050612dbc83826133e690919063ffffffff16565b91505092915050565b6000612dcf610dc8565b905060008211612e14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e0b9061508a565b60405180910390fd5b612e1c611d19565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612e9f5781600d54612e5c91906152cf565b341015612e9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e9590614dea565b60405180910390fd5b5b6000600190505b828111612ed557612ec2338284612ebd9190615248565b612fa0565b8080612ecd9061548d565b915050612ea6565b505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612fba82826040518060200160405280600081525061340d565b5050565b612fc9848484612b3f565b612fd584848484613468565b613014576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161300b90614d6a565b60405180910390fd5b50505050565b6060600b80546130299061542a565b80601f01602080910402602001604051908101604052809291908181526020018280546130559061542a565b80156130a25780601f10613077576101008083540402835291602001916130a2565b820191906000526020600020905b81548152906001019060200180831161308557829003601f168201915b5050505050905090565b606060008214156130f4576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613208565b600082905060005b6000821461312657808061310f9061548d565b915050600a8261311f919061529e565b91506130fc565b60008167ffffffffffffffff8111156131425761314161564f565b5b6040519080825280601f01601f1916602001820160405280156131745781602001600182028036833780820191505090505b5090505b600085146132015760018261318d9190615329565b9150600a8561319c9190615504565b60306131a89190615248565b60f81b8183815181106131be576131bd615620565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856131fa919061529e565b9450613178565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6132828383836135ff565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156132c5576132c081613604565b613304565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461330357613302838261364d565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561334757613342816137ba565b613386565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461338557613384828261388b565b5b5b505050565b6000808260405160200161339f9190614b58565b604051602081830303815290604052805190602001209050806040516020016133c89190614ba4565b60405160208183030381529060405280519060200120915050919050565b60008060006133f5858561390a565b915091506134028161398d565b819250505092915050565b6134178383613b62565b6134246000848484613468565b613463576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161345a90614d6a565b60405180910390fd5b505050565b60006134898473ffffffffffffffffffffffffffffffffffffffff16613d30565b156135f2578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026134b26129a0565b8786866040518563ffffffff1660e01b81526004016134d49493929190614bfa565b602060405180830381600087803b1580156134ee57600080fd5b505af192505050801561351f57506040513d601f19601f8201168201806040525081019061351c9190614330565b60015b6135a2573d806000811461354f576040519150601f19603f3d011682016040523d82523d6000602084013e613554565b606091505b5060008151141561359a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161359190614d6a565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506135f7565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161365a84611bd9565b6136649190615329565b9050600060076000848152602001908152602001600020549050818114613749576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506137ce9190615329565b90506000600960008481526020019081526020016000205490506000600883815481106137fe576137fd615620565b5b9060005260206000200154905080600883815481106138205761381f615620565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061386f5761386e6155f1565b5b6001900381819060005260206000200160009055905550505050565b600061389683611bd9565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b60008060418351141561394c5760008060006020860151925060408601519150606086015160001a905061394087828585613d43565b94509450505050613986565b60408351141561397d576000806020850151915060408501519050613972868383613e50565b935093505050613986565b60006002915091505b9250929050565b600060048111156139a1576139a0615593565b5b8160048111156139b4576139b3615593565b5b14156139bf57613b5f565b600160048111156139d3576139d2615593565b5b8160048111156139e6576139e5615593565b5b1415613a27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a1e90614cea565b60405180910390fd5b60026004811115613a3b57613a3a615593565b5b816004811115613a4e57613a4d615593565b5b1415613a8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a8690614d2a565b60405180910390fd5b60036004811115613aa357613aa2615593565b5b816004811115613ab657613ab5615593565b5b1415613af7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613aee90614e8a565b60405180910390fd5b600480811115613b0a57613b09615593565b5b816004811115613b1d57613b1c615593565b5b1415613b5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b5590614f6a565b60405180910390fd5b5b50565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613bd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613bc990614f8a565b60405180910390fd5b613bdb81612934565b15613c1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c1290614dca565b60405180910390fd5b613c2760008383613277565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613c779190615248565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115613d7e576000600391509150613e47565b601b8560ff1614158015613d965750601c8560ff1614155b15613da8576000600491509150613e47565b600060018787878760405160008152602001604052604051613dcd9493929190614c83565b6020604051602081039080840390855afa158015613def573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415613e3e57600060019250925050613e47565b80600092509250505b94509492505050565b6000806000807f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85169150601b8560ff1c019050613e9087828885613d43565b935093505050935093915050565b828054613eaa9061542a565b90600052602060002090601f016020900481019282613ecc5760008555613f13565b82601f10613ee557805160ff1916838001178555613f13565b82800160010185558215613f13579182015b82811115613f12578251825591602001919060010190613ef7565b5b509050613f209190613f24565b5090565b5b80821115613f3d576000816000905550600101613f25565b5090565b6000613f54613f4f8461514a565b615125565b905082815260208101848484011115613f7057613f6f615683565b5b613f7b8482856153e8565b509392505050565b6000613f96613f918461517b565b615125565b905082815260208101848484011115613fb257613fb1615683565b5b613fbd8482856153e8565b509392505050565b600081359050613fd481615f69565b92915050565b600081359050613fe981615f80565b92915050565b600081359050613ffe81615f97565b92915050565b60008151905061401381615f97565b92915050565b600082601f83011261402e5761402d61567e565b5b813561403e848260208601613f41565b91505092915050565b600082601f83011261405c5761405b61567e565b5b813561406c848260208601613f83565b91505092915050565b60008135905061408481615fae565b92915050565b6000602082840312156140a05761409f61568d565b5b60006140ae84828501613fc5565b91505092915050565b600080604083850312156140ce576140cd61568d565b5b60006140dc85828601613fc5565b92505060206140ed85828601613fc5565b9150509250929050565b6000806000606084860312156141105761410f61568d565b5b600061411e86828701613fc5565b935050602061412f86828701613fc5565b925050604061414086828701614075565b9150509250925092565b600080600080608085870312156141645761416361568d565b5b600061417287828801613fc5565b945050602061418387828801613fc5565b935050604061419487828801614075565b925050606085013567ffffffffffffffff8111156141b5576141b4615688565b5b6141c187828801614019565b91505092959194509250565b600080604083850312156141e4576141e361568d565b5b60006141f285828601613fc5565b925050602061420385828601613fda565b9150509250929050565b600080604083850312156142245761422361568d565b5b600061423285828601613fc5565b925050602061424385828601614075565b9150509250929050565b600080600080600080600080610100898b03121561426e5761426d61568d565b5b600061427c8b828c01613fda565b985050602061428d8b828c01613fda565b975050604061429e8b828c01614075565b96505060606142af8b828c01613fc5565b95505060806142c08b828c01613fc5565b94505060a06142d18b828c01613fc5565b93505060c06142e28b828c01613fc5565b92505060e06142f38b828c01613fc5565b9150509295985092959890939650565b6000602082840312156143195761431861568d565b5b600061432784828501613fef565b91505092915050565b6000602082840312156143465761434561568d565b5b600061435484828501614004565b91505092915050565b6000602082840312156143735761437261568d565b5b600082013567ffffffffffffffff81111561439157614390615688565b5b61439d84828501614047565b91505092915050565b6000602082840312156143bc576143bb61568d565b5b60006143ca84828501614075565b91505092915050565b600080604083850312156143ea576143e961568d565b5b60006143f885828601614075565b925050602061440985828601613fc5565b9150509250929050565b6000806040838503121561442a5761442961568d565b5b600061443885828601614075565b925050602083013567ffffffffffffffff81111561445957614458615688565b5b61446585828601614019565b9150509250929050565b600061447b8383614b2b565b60208301905092915050565b6144908161535d565b82525050565b6144a76144a28261535d565b6154d6565b82525050565b60006144b8826151d1565b6144c281856151ff565b93506144cd836151ac565b8060005b838110156144fe5781516144e5888261446f565b97506144f0836151f2565b9250506001810190506144d1565b5085935050505092915050565b6145148161536f565b82525050565b6145238161537b565b82525050565b61453a6145358261537b565b6154e8565b82525050565b600061454b826151dc565b6145558185615210565b93506145658185602086016153f7565b61456e81615692565b840191505092915050565b6000614584826151e7565b61458e818561522c565b935061459e8185602086016153f7565b6145a781615692565b840191505092915050565b60006145bd826151e7565b6145c7818561523d565b93506145d78185602086016153f7565b80840191505092915050565b600081546145f08161542a565b6145fa818661523d565b94506001821660008114614615576001811461462657614659565b60ff19831686528186019350614659565b61462f856151bc565b60005b8381101561465157815481890152600182019150602081019050614632565b838801955050505b50505092915050565b600061466f60188361522c565b915061467a826156b0565b602082019050919050565b6000614692602f8361522c565b915061469d826156d9565b604082019050919050565b60006146b5601f8361522c565b91506146c082615728565b602082019050919050565b60006146d8601c8361523d565b91506146e382615751565b601c82019050919050565b60006146fb602b8361522c565b91506147068261577a565b604082019050919050565b600061471e60328361522c565b9150614729826157c9565b604082019050919050565b600061474160288361522c565b915061474c82615818565b604082019050919050565b600061476460268361522c565b915061476f82615867565b604082019050919050565b6000614787601c8361522c565b9150614792826158b6565b602082019050919050565b60006147aa60308361522c565b91506147b5826158df565b604082019050919050565b60006147cd60208361522c565b91506147d88261592e565b602082019050919050565b60006147f060278361522c565b91506147fb82615957565b604082019050919050565b600061481360248361522c565b915061481e826159a6565b604082019050919050565b600061483660198361522c565b9150614841826159f5565b602082019050919050565b600061485960228361522c565b915061486482615a1e565b604082019050919050565b600061487c602c8361522c565b915061488782615a6d565b604082019050919050565b600061489f60198361522c565b91506148aa82615abc565b602082019050919050565b60006148c260388361522c565b91506148cd82615ae5565b604082019050919050565b60006148e5602a8361522c565b91506148f082615b34565b604082019050919050565b600061490860298361522c565b915061491382615b83565b604082019050919050565b600061492b601c8361522c565b915061493682615bd2565b602082019050919050565b600061494e60228361522c565b915061495982615bfb565b604082019050919050565b600061497160208361522c565b915061497c82615c4a565b602082019050919050565b6000614994602c8361522c565b915061499f82615c73565b604082019050919050565b60006149b760208361522c565b91506149c282615cc2565b602082019050919050565b60006149da601a8361522c565b91506149e582615ceb565b602082019050919050565b60006149fd60298361522c565b9150614a0882615d14565b604082019050919050565b6000614a2060308361522c565b9150614a2b82615d63565b604082019050919050565b6000614a4360218361522c565b9150614a4e82615db2565b604082019050919050565b6000614a66600083615221565b9150614a7182615e01565b600082019050919050565b6000614a8960318361522c565b9150614a9482615e04565b604082019050919050565b6000614aac601b8361522c565b9150614ab782615e53565b602082019050919050565b6000614acf602c8361522c565b9150614ada82615e7c565b604082019050919050565b6000614af260368361522c565b9150614afd82615ecb565b604082019050919050565b6000614b1560258361522c565b9150614b2082615f1a565b604082019050919050565b614b34816153d1565b82525050565b614b43816153d1565b82525050565b614b52816153db565b82525050565b6000614b648284614496565b60148201915081905092915050565b6000614b7f82866145e3565b9150614b8b82856145b2565b9150614b9782846145e3565b9150819050949350505050565b6000614baf826146cb565b9150614bbb8284614529565b60208201915081905092915050565b6000614bd582614a59565b9150819050919050565b6000602082019050614bf46000830184614487565b92915050565b6000608082019050614c0f6000830187614487565b614c1c6020830186614487565b614c296040830185614b3a565b8181036060830152614c3b8184614540565b905095945050505050565b60006020820190508181036000830152614c6081846144ad565b905092915050565b6000602082019050614c7d600083018461450b565b92915050565b6000608082019050614c98600083018761451a565b614ca56020830186614b49565b614cb2604083018561451a565b614cbf606083018461451a565b95945050505050565b60006020820190508181036000830152614ce28184614579565b905092915050565b60006020820190508181036000830152614d0381614662565b9050919050565b60006020820190508181036000830152614d2381614685565b9050919050565b60006020820190508181036000830152614d43816146a8565b9050919050565b60006020820190508181036000830152614d63816146ee565b9050919050565b60006020820190508181036000830152614d8381614711565b9050919050565b60006020820190508181036000830152614da381614734565b9050919050565b60006020820190508181036000830152614dc381614757565b9050919050565b60006020820190508181036000830152614de38161477a565b9050919050565b60006020820190508181036000830152614e038161479d565b9050919050565b60006020820190508181036000830152614e23816147c0565b9050919050565b60006020820190508181036000830152614e43816147e3565b9050919050565b60006020820190508181036000830152614e6381614806565b9050919050565b60006020820190508181036000830152614e8381614829565b9050919050565b60006020820190508181036000830152614ea38161484c565b9050919050565b60006020820190508181036000830152614ec38161486f565b9050919050565b60006020820190508181036000830152614ee381614892565b9050919050565b60006020820190508181036000830152614f03816148b5565b9050919050565b60006020820190508181036000830152614f23816148d8565b9050919050565b60006020820190508181036000830152614f43816148fb565b9050919050565b60006020820190508181036000830152614f638161491e565b9050919050565b60006020820190508181036000830152614f8381614941565b9050919050565b60006020820190508181036000830152614fa381614964565b9050919050565b60006020820190508181036000830152614fc381614987565b9050919050565b60006020820190508181036000830152614fe3816149aa565b9050919050565b60006020820190508181036000830152615003816149cd565b9050919050565b60006020820190508181036000830152615023816149f0565b9050919050565b6000602082019050818103600083015261504381614a13565b9050919050565b6000602082019050818103600083015261506381614a36565b9050919050565b6000602082019050818103600083015261508381614a7c565b9050919050565b600060208201905081810360008301526150a381614a9f565b9050919050565b600060208201905081810360008301526150c381614ac2565b9050919050565b600060208201905081810360008301526150e381614ae5565b9050919050565b6000602082019050818103600083015261510381614b08565b9050919050565b600060208201905061511f6000830184614b3a565b92915050565b600061512f615140565b905061513b828261545c565b919050565b6000604051905090565b600067ffffffffffffffff8211156151655761516461564f565b5b61516e82615692565b9050602081019050919050565b600067ffffffffffffffff8211156151965761519561564f565b5b61519f82615692565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000615253826153d1565b915061525e836153d1565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561529357615292615535565b5b828201905092915050565b60006152a9826153d1565b91506152b4836153d1565b9250826152c4576152c3615564565b5b828204905092915050565b60006152da826153d1565b91506152e5836153d1565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561531e5761531d615535565b5b828202905092915050565b6000615334826153d1565b915061533f836153d1565b92508282101561535257615351615535565b5b828203905092915050565b6000615368826153b1565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b838110156154155780820151818401526020810190506153fa565b83811115615424576000848401525b50505050565b6000600282049050600182168061544257607f821691505b60208210811415615456576154556155c2565b5b50919050565b61546582615692565b810181811067ffffffffffffffff821117156154845761548361564f565b5b80604052505050565b6000615498826153d1565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156154cb576154ca615535565b5b600182019050919050565b60006154e1826154f2565b9050919050565b6000819050919050565b60006154fd826156a3565b9050919050565b600061550f826153d1565b915061551a836153d1565b92508261552a57615529615564565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f4d696e74696e6720776f756c6420657863656564206d6178207065722077616c60008201527f6c657420666f722070726573616c650000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f507572636861736520776f756c6420657863656564206d617820737570706c7960008201527f206f66204e465473000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f416d6f756e742073656e74206c657373207468616e2074686520636f7374206f60008201527f66206d696e74696e67204e465428732900000000000000000000000000000000602082015250565b7f41646472657373206e6f742077686974656c697374656420666f722073616c65600082015250565b7f507572636861736520776f756c6420657863656564206d617820737570706c7960008201527f206f66204e465400000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4d696e74696e672063757272656e746c79206f6e20686f6c6400000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4d6178696d756d206d696e7420616d6f756e7420657863656564656400000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f556e61626c6520746f2077697468647261772062616c616e6365000000000000600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f507572636861736520776f756c6420657863656564206d617820737570706c7960008201527f206f6620707269766174652073616c6500000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f416d6f756e7420746f206d696e742063616e206e6f7420626520300000000000600082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a20746f6b656e555249207175657269656460008201527f20666f72206e6f6e6578697374656e7420746f6b656e00000000000000000000602082015250565b7f507269766174652073616c65206973206e6f742063757272656e746c7920727560008201527f6e6e696e67000000000000000000000000000000000000000000000000000000602082015250565b615f728161535d565b8114615f7d57600080fd5b50565b615f898161536f565b8114615f9457600080fd5b50565b615fa081615385565b8114615fab57600080fd5b50565b615fb7816153d1565b8114615fc257600080fd5b5056fea2646970667358221220c9a2d817cf1a84ef4c8719e10973cdd88b98eb88eab9e9ee6ed04737019f126a64736f6c63430008070033

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

000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000000c54686520426f726e6c6573730000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000354424c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d4e54657651424864383858354c45546b3873467267443158544b3857726148525437755577427a39415770772f00000000000000000000

-----Decoded View---------------
Arg [0] : _name (string): The Bornless
Arg [1] : _symbol (string): TBL
Arg [2] : _initBaseURI (string): ipfs://QmNTevQBHd88X5LETk8sFrgD1XTK8WraHRT7uUwBz9AWpw/

-----Encoded View---------------
10 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [3] : 000000000000000000000000000000000000000000000000000000000000000c
Arg [4] : 54686520426f726e6c6573730000000000000000000000000000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [6] : 54424c0000000000000000000000000000000000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000036
Arg [8] : 697066733a2f2f516d4e54657651424864383858354c45546b38734672674431
Arg [9] : 58544b3857726148525437755577427a39415770772f00000000000000000000


Deployed Bytecode Sourcemap

52195:5892:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45973:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33865:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35424:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56553:118;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34947:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52381:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46613:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52504:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36314:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52703:22;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52341:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46281:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52541:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52616:22;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56992:464;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52645:22;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57882:200;;;:::i;:::-;;52674:22;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36724:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54742:357;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56463:82;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46803:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56679:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52732:22;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33559:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52313:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55964:91;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56163:92;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53370:934;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33289:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13564:94;;;;;;;;;;;;;:::i;:::-;;12913:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57671:203;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34034:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53036:326;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35717:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57464:199;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36980:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52578:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55107:365;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52422:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56891:93;;;;;;;;;;;;;:::i;:::-;;56793:90;;;;;;;;;;;;;:::i;:::-;;36083:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56363:92;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;13813:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56263:92;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56063;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45973:224;46075:4;46114:35;46099:50;;;:11;:50;;;;:90;;;;46153:36;46177:11;46153:23;:36::i;:::-;46099:90;46092:97;;45973:224;;;:::o;33865:100::-;33919:13;33952:5;33945:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33865:100;:::o;35424:221::-;35500:7;35528:16;35536:7;35528;:16::i;:::-;35520:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;35613:15;:24;35629:7;35613:24;;;;;;;;;;;;;;;;;;;;;35606:31;;35424:221;;;:::o;56553:118::-;13144:12;:10;:12::i;:::-;13133:23;;:7;:5;:7::i;:::-;:23;;;13125:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56649:14:::1;56633:13;:30;;;;56553:118:::0;:::o;34947:411::-;35028:13;35044:23;35059:7;35044:14;:23::i;:::-;35028:39;;35092:5;35086:11;;:2;:11;;;;35078:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;35186:5;35170:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;35195:37;35212:5;35219:12;:10;:12::i;:::-;35195:16;:37::i;:::-;35170:62;35148:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;35329:21;35338:2;35342:7;35329:8;:21::i;:::-;35017:341;34947:411;;:::o;52381:34::-;;;;:::o;46613:113::-;46674:7;46701:10;:17;;;;46694:24;;46613:113;:::o;52504:30::-;;;;:::o;36314:339::-;36509:41;36528:12;:10;:12::i;:::-;36542:7;36509:18;:41::i;:::-;36501:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;36617:28;36627:4;36633:2;36637:7;36617:9;:28::i;:::-;36314:339;;;:::o;52703:22::-;;;;;;;;;;;;;:::o;52341:33::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;46281:256::-;46378:7;46414:23;46431:5;46414:16;:23::i;:::-;46406:5;:31;46398:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;46503:12;:19;46516:5;46503:19;;;;;;;;;;;;;;;:26;46523:5;46503:26;;;;;;;;;;;;46496:33;;46281:256;;;;:::o;52541:30::-;;;;;;;;;;;;;:::o;52616:22::-;;;;;;;;;;;;;:::o;56992:464::-;13144:12;:10;:12::i;:::-;13133:23;;:7;:5;:7::i;:::-;:23;;;13125:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57214:11:::1;57201:10;;:24;;;;;;;;;;;;;;;;;;57250:12;57236:11;;:26;;;;;;;;;;;;;;;;;;57289:14;57273:13;:30;;;;57324:8;57314:7;;:18;;;;;;;;;;;;;;;;;;57353:8;57343:7;;:18;;;;;;;;;;;;;;;;;;57382:8;57372:7;;:18;;;;;;;;;;;;;;;;;;57411:8;57401:7;;:18;;;;;;;;;;;;;;;;;;57440:8;57430:7;;:18;;;;;;;;;;;;;;;;;;56992:464:::0;;;;;;;;:::o;52645:22::-;;;;;;;;;;;;;:::o;57882:200::-;13144:12;:10;:12::i;:::-;13133:23;;:7;:5;:7::i;:::-;:23;;;13125:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57941:12:::1;57966:10;57958:24;;57991:21;57958:59;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57940:77;;;58036:7;58028:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;57929:153;57882:200::o:0;52674:22::-;;;;;;;;;;;;;:::o;36724:185::-;36862:39;36879:4;36885:2;36889:7;36862:39;;;;;;;;;;;;:16;:39::i;:::-;36724:185;;;:::o;54742:357::-;54802:16;54830:23;54856:17;54866:6;54856:9;:17::i;:::-;54830:43;;54884:25;54926:15;54912:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54884:58;;54958:9;54953:113;54973:15;54969:1;:19;54953:113;;;55024:30;55044:6;55052:1;55024:19;:30::i;:::-;55010:8;55019:1;55010:11;;;;;;;;:::i;:::-;;;;;;;:44;;;;;54990:3;;;;;:::i;:::-;;;;54953:113;;;;55083:8;55076:15;;;;54742:357;;;:::o;56463:82::-;13144:12;:10;:12::i;:::-;13133:23;;:7;:5;:7::i;:::-;:23;;;13125:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56532:5:::1;56525:4;:12;;;;56463:82:::0;:::o;46803:233::-;46878:7;46914:30;:28;:30::i;:::-;46906:5;:38;46898:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;47011:10;47022:5;47011:17;;;;;;;;:::i;:::-;;;;;;;;;;47004:24;;46803:233;;;:::o;56679:106::-;13144:12;:10;:12::i;:::-;13133:23;;:7;:5;:7::i;:::-;:23;;;13125:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56766:11:::1;56756:7;:21;;;;;;;;;;;;:::i;:::-;;56679:106:::0;:::o;52732:22::-;;;;;;;;;;;;;:::o;33559:239::-;33631:7;33651:13;33667:7;:16;33675:7;33667:16;;;;;;;;;;;;;;;;;;;;;33651:32;;33719:1;33702:19;;:5;:19;;;;33694:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;33785:5;33778:12;;;33559:239;;;:::o;52313:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;55964:91::-;13144:12;:10;:12::i;:::-;13133:23;;:7;:5;:7::i;:::-;:23;;;13125:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56040:7:::1;56030;;:17;;;;;;;;;;;;;;;;;;55964:91:::0;:::o;56163:92::-;13144:12;:10;:12::i;:::-;13133:23;;:7;:5;:7::i;:::-;:23;;;13125:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56240:7:::1;56230;;:17;;;;;;;;;;;;;;;;;;56163:92:::0;:::o;53370:934::-;53471:11;;;;;;;;;;;53463:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;53535:11;53561:15;53579:43;53600:10;53612:9;53579:20;:43::i;:::-;53561:61;;53648:7;;;;;;;;;;;53637:18;;:7;:18;;;53633:320;;;53680:1;53672:9;;53633:320;;;53713:7;;;;;;;;;;;53702:18;;:7;:18;;;53698:255;;;53745:1;53737:9;;53698:255;;;53778:7;;;;;;;;;;;53767:18;;:7;:18;;;53763:190;;;53810:1;53802:9;;53763:190;;;53843:7;;;;;;;;;;;53832:18;;:7;:18;;;53828:125;;;53875:1;53867:9;;53828:125;;;53908:7;;;;;;;;;;;53897:18;;:7;:18;;;53893:60;;;53940:1;53932:9;;53893:60;53828:125;53763:190;53698:255;53633:320;53981:1;53973:5;:9;;;:23;;;;;53995:1;53986:5;:10;;;;53973:23;53965:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54083:16;;54068:11;54052:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:47;;54044:108;;;;;;;;;;;;:::i;:::-;;;;;;;;;54210:5;54171:44;;54195:11;54171:21;54181:10;54171:9;:21::i;:::-;:35;;;;:::i;:::-;:44;;54163:104;;;;;;;;;;;;:::i;:::-;;;;;;;;;54278:18;54284:11;54278:5;:18::i;:::-;53452:852;;53370:934;;:::o;33289:208::-;33361:7;33406:1;33389:19;;:5;:19;;;;33381:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;33473:9;:16;33483:5;33473:16;;;;;;;;;;;;;;;;33466:23;;33289:208;;;:::o;13564:94::-;13144:12;:10;:12::i;:::-;13133:23;;:7;:5;:7::i;:::-;:23;;;13125:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;13629:21:::1;13647:1;13629:9;:21::i;:::-;13564:94::o:0;12913:87::-;12959:7;12986:6;;;;;;;;;;;12979:13;;12913:87;:::o;57671:203::-;13144:12;:10;:12::i;:::-;13133:23;;:7;:5;:7::i;:::-;:23;;;13125:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57781:9:::1;;57776:1;57760:13;:11;:13::i;:::-;:17;;;;:::i;:::-;:30;;57752:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;57846:20;57856:2;57860:5;57846:9;:20::i;:::-;57671:203:::0;;:::o;34034:104::-;34090:13;34123:7;34116:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34034:104;:::o;53036:326::-;53102:10;;;;;;;;;;;53094:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;53176:13;;53161:11;:28;;53153:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;53272:9;;53257:11;53241:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:40;;53233:92;;;;;;;;;;;;:::i;:::-;;;;;;;;;53336:18;53342:11;53336:5;:18::i;:::-;53036:326;:::o;35717:295::-;35832:12;:10;:12::i;:::-;35820:24;;:8;:24;;;;35812:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;35932:8;35887:18;:32;35906:12;:10;:12::i;:::-;35887:32;;;;;;;;;;;;;;;:42;35920:8;35887:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;35985:8;35956:48;;35971:12;:10;:12::i;:::-;35956:48;;;35995:8;35956:48;;;;;;:::i;:::-;;;;;;;;35717:295;;:::o;57464:199::-;13144:12;:10;:12::i;:::-;13133:23;;:7;:5;:7::i;:::-;:23;;;13125:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57562:9:::1;;57557:1;57541:13;:11;:13::i;:::-;:17;;;;:::i;:::-;:30;;57533:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;57627:28;57637:10;57649:5;57627:9;:28::i;:::-;57464:199:::0;:::o;36980:328::-;37155:41;37174:12;:10;:12::i;:::-;37188:7;37155:18;:41::i;:::-;37147:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;37261:39;37275:4;37281:2;37285:7;37294:5;37261:13;:39::i;:::-;36980:328;;;;:::o;52578:31::-;;;;;;;;;;;;;:::o;55107:365::-;55180:13;55215:16;55223:7;55215;:16::i;:::-;55207:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;55301:28;55332:10;:8;:10::i;:::-;55301:41;;55391:1;55366:14;55360:28;:32;:104;;;;;;;;;;;;;;;;;55419:7;55428:18;:7;:16;:18::i;:::-;55448:9;55402:56;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;55360:104;55353:111;;;55107:365;;;:::o;52422:30::-;;;;:::o;56891:93::-;13144:12;:10;:12::i;:::-;13133:23;;:7;:5;:7::i;:::-;:23;;;13125:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56965:11:::1;;;;;;;;;;;56964:12;56950:11;;:26;;;;;;;;;;;;;;;;;;56891:93::o:0;56793:90::-;13144:12;:10;:12::i;:::-;13133:23;;:7;:5;:7::i;:::-;:23;;;13125:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56865:10:::1;;;;;;;;;;;56864:11;56851:10;;:24;;;;;;;;;;;;;;;;;;56793:90::o:0;36083:164::-;36180:4;36204:18;:25;36223:5;36204:25;;;;;;;;;;;;;;;:35;36230:8;36204:35;;;;;;;;;;;;;;;;;;;;;;;;;36197:42;;36083:164;;;;:::o;56363:92::-;13144:12;:10;:12::i;:::-;13133:23;;:7;:5;:7::i;:::-;:23;;;13125:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56440:7:::1;56430;;:17;;;;;;;;;;;;;;;;;;56363:92:::0;:::o;13813:192::-;13144:12;:10;:12::i;:::-;13133:23;;:7;:5;:7::i;:::-;:23;;;13125:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;13922:1:::1;13902:22;;:8;:22;;;;13894:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;13978:19;13988:8;13978:9;:19::i;:::-;13813:192:::0;:::o;56263:92::-;13144:12;:10;:12::i;:::-;13133:23;;:7;:5;:7::i;:::-;:23;;;13125:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56340:7:::1;56330;;:17;;;;;;;;;;;;;;;;;;56263:92:::0;:::o;56063:::-;13144:12;:10;:12::i;:::-;13133:23;;:7;:5;:7::i;:::-;:23;;;13125:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56140:7:::1;56130;;:17;;;;;;;;;;;;;;;;;;56063:92:::0;:::o;32920:305::-;33022:4;33074:25;33059:40;;;:11;:40;;;;:105;;;;33131:33;33116:48;;;:11;:48;;;;33059:105;:158;;;;33181:36;33205:11;33181:23;:36::i;:::-;33059:158;33039:178;;32920:305;;;:::o;38818:127::-;38883:4;38935:1;38907:30;;:7;:16;38915:7;38907:16;;;;;;;;;;;;;;;;;;;;;:30;;;;38900:37;;38818:127;;;:::o;11701:98::-;11754:7;11781:10;11774:17;;11701:98;:::o;42800:174::-;42902:2;42875:15;:24;42891:7;42875:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;42958:7;42954:2;42920:46;;42929:23;42944:7;42929:14;:23::i;:::-;42920:46;;;;;;;;;;;;42800:174;;:::o;39112:348::-;39205:4;39230:16;39238:7;39230;:16::i;:::-;39222:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;39306:13;39322:23;39337:7;39322:14;:23::i;:::-;39306:39;;39375:5;39364:16;;:7;:16;;;:51;;;;39408:7;39384:31;;:20;39396:7;39384:11;:20::i;:::-;:31;;;39364:51;:87;;;;39419:32;39436:5;39443:7;39419:16;:32::i;:::-;39364:87;39356:96;;;39112:348;;;;:::o;42104:578::-;42263:4;42236:31;;:23;42251:7;42236:14;:23::i;:::-;:31;;;42228:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;42346:1;42332:16;;:2;:16;;;;42324:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;42402:39;42423:4;42429:2;42433:7;42402:20;:39::i;:::-;42506:29;42523:1;42527:7;42506:8;:29::i;:::-;42567:1;42548:9;:15;42558:4;42548:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;42596:1;42579:9;:13;42589:2;42579:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;42627:2;42608:7;:16;42616:7;42608:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;42666:7;42662:2;42647:27;;42656:4;42647:27;;;;;;;;;;;;42104:578;;;:::o;55732:199::-;55824:7;55844:12;55859:23;55875:6;55859:15;:23::i;:::-;55844:38;;55900:23;55913:9;55900:4;:12;;:23;;;;:::i;:::-;55893:30;;;55732:199;;;;:::o;54312:422::-;54364:11;54378:13;:11;:13::i;:::-;54364:27;;54424:1;54410:11;:15;54402:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;54486:7;:5;:7::i;:::-;54472:21;;:10;:21;;;54468:146;;54538:11;54531:4;;:18;;;;:::i;:::-;54518:9;:31;;54510:92;;;;;;;;;;;;:::i;:::-;;;;;;;;;54468:146;54629:9;54641:1;54629:13;;54624:103;54649:11;54644:1;:16;54624:103;;54682:33;54692:10;54713:1;54704:6;:10;;;;:::i;:::-;54682:9;:33::i;:::-;54662:3;;;;;:::i;:::-;;;;54624:103;;;;54353:381;54312:422;:::o;14013:173::-;14069:16;14088:6;;;;;;;;;;;14069:25;;14114:8;14105:6;;:17;;;;;;;;;;;;;;;;;;14169:8;14138:40;;14159:8;14138:40;;;;;;;;;;;;14058:128;14013:173;:::o;39802:110::-;39878:26;39888:2;39892:7;39878:26;;;;;;;;;;;;:9;:26::i;:::-;39802:110;;:::o;38190:315::-;38347:28;38357:4;38363:2;38367:7;38347:9;:28::i;:::-;38394:48;38417:4;38423:2;38427:7;38436:5;38394:22;:48::i;:::-;38386:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;38190:315;;;;:::o;52921:107::-;52981:13;53013:7;53006:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52921:107;:::o;9317:723::-;9373:13;9603:1;9594:5;:10;9590:53;;;9621:10;;;;;;;;;;;;;;;;;;;;;9590:53;9653:12;9668:5;9653:20;;9684:14;9709:78;9724:1;9716:4;:9;9709:78;;9742:8;;;;;:::i;:::-;;;;9773:2;9765:10;;;;;:::i;:::-;;;9709:78;;;9797:19;9829:6;9819:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9797:39;;9847:154;9863:1;9854:5;:10;9847:154;;9891:1;9881:11;;;;;:::i;:::-;;;9958:2;9950:5;:10;;;;:::i;:::-;9937:2;:24;;;;:::i;:::-;9924:39;;9907:6;9914;9907:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;9987:2;9978:11;;;;;:::i;:::-;;;9847:154;;;10025:6;10011:21;;;;;9317:723;;;;:::o;24899:157::-;24984:4;25023:25;25008:40;;;:11;:40;;;;25001:47;;24899:157;;;:::o;47649:589::-;47793:45;47820:4;47826:2;47830:7;47793:26;:45::i;:::-;47871:1;47855:18;;:4;:18;;;47851:187;;;47890:40;47922:7;47890:31;:40::i;:::-;47851:187;;;47960:2;47952:10;;:4;:10;;;47948:90;;47979:47;48012:4;48018:7;47979:32;:47::i;:::-;47948:90;47851:187;48066:1;48052:16;;:2;:16;;;48048:183;;;48085:45;48122:7;48085:36;:45::i;:::-;48048:183;;;48158:4;48152:10;;:2;:10;;;48148:83;;48179:40;48207:2;48211:7;48179:27;:40::i;:::-;48148:83;48048:183;47649:589;;;:::o;55488:236::-;55551:7;55571:16;55617:6;55600:24;;;;;;;;:::i;:::-;;;;;;;;;;;;;55590:35;;;;;;55571:54;;55706:8;55653:62;;;;;;;;:::i;:::-;;;;;;;;;;;;;55643:73;;;;;;55636:80;;;55488:236;;;:::o;4335:231::-;4413:7;4434:17;4453:18;4475:27;4486:4;4492:9;4475:10;:27::i;:::-;4433:69;;;;4513:18;4525:5;4513:11;:18::i;:::-;4549:9;4542:16;;;;4335:231;;;;:::o;40139:321::-;40269:18;40275:2;40279:7;40269:5;:18::i;:::-;40320:54;40351:1;40355:2;40359:7;40368:5;40320:22;:54::i;:::-;40298:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;40139:321;;;:::o;43539:799::-;43694:4;43715:15;:2;:13;;;:15::i;:::-;43711:620;;;43767:2;43751:36;;;43788:12;:10;:12::i;:::-;43802:4;43808:7;43817:5;43751:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;43747:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44010:1;43993:6;:13;:18;43989:272;;;44036:60;;;;;;;;;;:::i;:::-;;;;;;;;43989:272;44211:6;44205:13;44196:6;44192:2;44188:15;44181:38;43747:529;43884:41;;;43874:51;;;:6;:51;;;;43867:58;;;;;43711:620;44315:4;44308:11;;43539:799;;;;;;;:::o;44910:126::-;;;;:::o;48961:164::-;49065:10;:17;;;;49038:15;:24;49054:7;49038:24;;;;;;;;;;;:44;;;;49093:10;49109:7;49093:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48961:164;:::o;49752:988::-;50018:22;50068:1;50043:22;50060:4;50043:16;:22::i;:::-;:26;;;;:::i;:::-;50018:51;;50080:18;50101:17;:26;50119:7;50101:26;;;;;;;;;;;;50080:47;;50248:14;50234:10;:28;50230:328;;50279:19;50301:12;:18;50314:4;50301:18;;;;;;;;;;;;;;;:34;50320:14;50301:34;;;;;;;;;;;;50279:56;;50385:11;50352:12;:18;50365:4;50352:18;;;;;;;;;;;;;;;:30;50371:10;50352:30;;;;;;;;;;;:44;;;;50502:10;50469:17;:30;50487:11;50469:30;;;;;;;;;;;:43;;;;50264:294;50230:328;50654:17;:26;50672:7;50654:26;;;;;;;;;;;50647:33;;;50698:12;:18;50711:4;50698:18;;;;;;;;;;;;;;;:34;50717:14;50698:34;;;;;;;;;;;50691:41;;;49833:907;;49752:988;;:::o;51035:1079::-;51288:22;51333:1;51313:10;:17;;;;:21;;;;:::i;:::-;51288:46;;51345:18;51366:15;:24;51382:7;51366:24;;;;;;;;;;;;51345:45;;51717:19;51739:10;51750:14;51739:26;;;;;;;;:::i;:::-;;;;;;;;;;51717:48;;51803:11;51778:10;51789;51778:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;51914:10;51883:15;:28;51899:11;51883:28;;;;;;;;;;;:41;;;;52055:15;:24;52071:7;52055:24;;;;;;;;;;;52048:31;;;52090:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;51106:1008;;;51035:1079;:::o;48539:221::-;48624:14;48641:20;48658:2;48641:16;:20::i;:::-;48624:37;;48699:7;48672:12;:16;48685:2;48672:16;;;;;;;;;;;;;;;:24;48689:6;48672:24;;;;;;;;;;;:34;;;;48746:6;48717:17;:26;48735:7;48717:26;;;;;;;;;;;:35;;;;48613:147;48539:221;;:::o;2225:1308::-;2306:7;2315:12;2560:2;2540:9;:16;:22;2536:990;;;2579:9;2603;2627:7;2836:4;2825:9;2821:20;2815:27;2810:32;;2886:4;2875:9;2871:20;2865:27;2860:32;;2944:4;2933:9;2929:20;2923:27;2920:1;2915:36;2910:41;;2987:25;2998:4;3004:1;3007;3010;2987:10;:25::i;:::-;2980:32;;;;;;;;;2536:990;3054:2;3034:9;:16;:22;3030:496;;;3073:9;3097:10;3309:4;3298:9;3294:20;3288:27;3283:32;;3360:4;3349:9;3345:20;3339:27;3333:33;;3402:23;3413:4;3419:1;3422:2;3402:10;:23::i;:::-;3395:30;;;;;;;;3030:496;3474:1;3478:35;3458:56;;;;2225:1308;;;;;;:::o;496:643::-;574:20;565:29;;;;;;;;:::i;:::-;;:5;:29;;;;;;;;:::i;:::-;;;561:571;;;611:7;;561:571;672:29;663:38;;;;;;;;:::i;:::-;;:5;:38;;;;;;;;:::i;:::-;;;659:473;;;718:34;;;;;;;;;;:::i;:::-;;;;;;;;659:473;783:35;774:44;;;;;;;;:::i;:::-;;:5;:44;;;;;;;;:::i;:::-;;;770:362;;;835:41;;;;;;;;;;:::i;:::-;;;;;;;;770:362;907:30;898:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;894:238;;;954:44;;;;;;;;;;:::i;:::-;;;;;;;;894:238;1029:30;1020:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;1016:116;;;1076:44;;;;;;;;;;:::i;:::-;;;;;;;;1016:116;496:643;;:::o;40796:382::-;40890:1;40876:16;;:2;:16;;;;40868:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;40949:16;40957:7;40949;:16::i;:::-;40948:17;40940:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;41011:45;41040:1;41044:2;41048:7;41011:20;:45::i;:::-;41086:1;41069:9;:13;41079:2;41069:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;41117:2;41098:7;:16;41106:7;41098:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;41162:7;41158:2;41137:33;;41154:1;41137:33;;;;;;;;;;;;40796:382;;:::o;14959:387::-;15019:4;15227:12;15294:7;15282:20;15274:28;;15337:1;15330:4;:8;15323:15;;;14959:387;;;:::o;5834:1632::-;5965:7;5974:12;6899:66;6894:1;6886:10;;:79;6882:163;;;6998:1;7002:30;6982:51;;;;;;6882:163;7064:2;7059:1;:7;;;;:18;;;;;7075:2;7070:1;:7;;;;7059:18;7055:102;;;7110:1;7114:30;7094:51;;;;;;7055:102;7254:14;7271:24;7281:4;7287:1;7290;7293;7271:24;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7254:41;;7328:1;7310:20;;:6;:20;;;7306:103;;;7363:1;7367:29;7347:50;;;;;;;7306:103;7429:6;7437:20;7421:37;;;;;5834:1632;;;;;;;;:::o;4829:391::-;4943:7;4952:12;4977:9;4997:7;5052:66;5048:2;5044:75;5039:80;;5156:2;5151;5146:3;5142:12;5138:21;5133:26;;5187:25;5198:4;5204:1;5207;5210;5187:10;:25::i;:::-;5180:32;;;;;;4829:391;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1170:5;1208:6;1195:20;1186:29;;1224:32;1250:5;1224:32;:::i;:::-;1125:137;;;;:::o;1268:141::-;1324:5;1355:6;1349:13;1340:22;;1371:32;1397:5;1371:32;:::i;:::-;1268:141;;;;:::o;1428:338::-;1483:5;1532:3;1525:4;1517:6;1513:17;1509:27;1499:122;;1540:79;;:::i;:::-;1499:122;1657:6;1644:20;1682:78;1756:3;1748:6;1741:4;1733:6;1729:17;1682:78;:::i;:::-;1673:87;;1489:277;1428:338;;;;:::o;1786:340::-;1842:5;1891:3;1884:4;1876:6;1872:17;1868:27;1858:122;;1899:79;;:::i;:::-;1858:122;2016:6;2003:20;2041:79;2116:3;2108:6;2101:4;2093:6;2089:17;2041:79;:::i;:::-;2032:88;;1848:278;1786:340;;;;:::o;2132:139::-;2178:5;2216:6;2203:20;2194:29;;2232:33;2259:5;2232:33;:::i;:::-;2132:139;;;;:::o;2277:329::-;2336:6;2385:2;2373:9;2364:7;2360:23;2356:32;2353:119;;;2391:79;;:::i;:::-;2353:119;2511:1;2536:53;2581:7;2572:6;2561:9;2557:22;2536:53;:::i;:::-;2526:63;;2482:117;2277:329;;;;:::o;2612:474::-;2680:6;2688;2737:2;2725:9;2716:7;2712:23;2708:32;2705:119;;;2743:79;;:::i;:::-;2705:119;2863:1;2888:53;2933:7;2924:6;2913:9;2909:22;2888:53;:::i;:::-;2878:63;;2834:117;2990:2;3016:53;3061:7;3052:6;3041:9;3037:22;3016:53;:::i;:::-;3006:63;;2961:118;2612:474;;;;;:::o;3092:619::-;3169:6;3177;3185;3234:2;3222:9;3213:7;3209:23;3205:32;3202:119;;;3240:79;;:::i;:::-;3202:119;3360:1;3385:53;3430:7;3421:6;3410:9;3406:22;3385:53;:::i;:::-;3375:63;;3331:117;3487:2;3513:53;3558:7;3549:6;3538:9;3534:22;3513:53;:::i;:::-;3503:63;;3458:118;3615:2;3641:53;3686:7;3677:6;3666:9;3662:22;3641:53;:::i;:::-;3631:63;;3586:118;3092:619;;;;;:::o;3717:943::-;3812:6;3820;3828;3836;3885:3;3873:9;3864:7;3860:23;3856:33;3853:120;;;3892:79;;:::i;:::-;3853:120;4012:1;4037:53;4082:7;4073:6;4062:9;4058:22;4037:53;:::i;:::-;4027:63;;3983:117;4139:2;4165:53;4210:7;4201:6;4190:9;4186:22;4165:53;:::i;:::-;4155:63;;4110:118;4267:2;4293:53;4338:7;4329:6;4318:9;4314:22;4293:53;:::i;:::-;4283:63;;4238:118;4423:2;4412:9;4408:18;4395:32;4454:18;4446:6;4443:30;4440:117;;;4476:79;;:::i;:::-;4440:117;4581:62;4635:7;4626:6;4615:9;4611:22;4581:62;:::i;:::-;4571:72;;4366:287;3717:943;;;;;;;:::o;4666:468::-;4731:6;4739;4788:2;4776:9;4767:7;4763:23;4759:32;4756:119;;;4794:79;;:::i;:::-;4756:119;4914:1;4939:53;4984:7;4975:6;4964:9;4960:22;4939:53;:::i;:::-;4929:63;;4885:117;5041:2;5067:50;5109:7;5100:6;5089:9;5085:22;5067:50;:::i;:::-;5057:60;;5012:115;4666:468;;;;;:::o;5140:474::-;5208:6;5216;5265:2;5253:9;5244:7;5240:23;5236:32;5233:119;;;5271:79;;:::i;:::-;5233:119;5391:1;5416:53;5461:7;5452:6;5441:9;5437:22;5416:53;:::i;:::-;5406:63;;5362:117;5518:2;5544:53;5589:7;5580:6;5569:9;5565:22;5544:53;:::i;:::-;5534:63;;5489:118;5140:474;;;;;:::o;5620:1337::-;5736:6;5744;5752;5760;5768;5776;5784;5792;5841:3;5829:9;5820:7;5816:23;5812:33;5809:120;;;5848:79;;:::i;:::-;5809:120;5968:1;5993:50;6035:7;6026:6;6015:9;6011:22;5993:50;:::i;:::-;5983:60;;5939:114;6092:2;6118:50;6160:7;6151:6;6140:9;6136:22;6118:50;:::i;:::-;6108:60;;6063:115;6217:2;6243:53;6288:7;6279:6;6268:9;6264:22;6243:53;:::i;:::-;6233:63;;6188:118;6345:2;6371:53;6416:7;6407:6;6396:9;6392:22;6371:53;:::i;:::-;6361:63;;6316:118;6473:3;6500:53;6545:7;6536:6;6525:9;6521:22;6500:53;:::i;:::-;6490:63;;6444:119;6602:3;6629:53;6674:7;6665:6;6654:9;6650:22;6629:53;:::i;:::-;6619:63;;6573:119;6731:3;6758:53;6803:7;6794:6;6783:9;6779:22;6758:53;:::i;:::-;6748:63;;6702:119;6860:3;6887:53;6932:7;6923:6;6912:9;6908:22;6887:53;:::i;:::-;6877:63;;6831:119;5620:1337;;;;;;;;;;;:::o;6963:327::-;7021:6;7070:2;7058:9;7049:7;7045:23;7041:32;7038:119;;;7076:79;;:::i;:::-;7038:119;7196:1;7221:52;7265:7;7256:6;7245:9;7241:22;7221:52;:::i;:::-;7211:62;;7167:116;6963:327;;;;:::o;7296:349::-;7365:6;7414:2;7402:9;7393:7;7389:23;7385:32;7382:119;;;7420:79;;:::i;:::-;7382:119;7540:1;7565:63;7620:7;7611:6;7600:9;7596:22;7565:63;:::i;:::-;7555:73;;7511:127;7296:349;;;;:::o;7651:509::-;7720:6;7769:2;7757:9;7748:7;7744:23;7740:32;7737:119;;;7775:79;;:::i;:::-;7737:119;7923:1;7912:9;7908:17;7895:31;7953:18;7945:6;7942:30;7939:117;;;7975:79;;:::i;:::-;7939:117;8080:63;8135:7;8126:6;8115:9;8111:22;8080:63;:::i;:::-;8070:73;;7866:287;7651:509;;;;:::o;8166:329::-;8225:6;8274:2;8262:9;8253:7;8249:23;8245:32;8242:119;;;8280:79;;:::i;:::-;8242:119;8400:1;8425:53;8470:7;8461:6;8450:9;8446:22;8425:53;:::i;:::-;8415:63;;8371:117;8166:329;;;;:::o;8501:474::-;8569:6;8577;8626:2;8614:9;8605:7;8601:23;8597:32;8594:119;;;8632:79;;:::i;:::-;8594:119;8752:1;8777:53;8822:7;8813:6;8802:9;8798:22;8777:53;:::i;:::-;8767:63;;8723:117;8879:2;8905:53;8950:7;8941:6;8930:9;8926:22;8905:53;:::i;:::-;8895:63;;8850:118;8501:474;;;;;:::o;8981:652::-;9058:6;9066;9115:2;9103:9;9094:7;9090:23;9086:32;9083:119;;;9121:79;;:::i;:::-;9083:119;9241:1;9266:53;9311:7;9302:6;9291:9;9287:22;9266:53;:::i;:::-;9256:63;;9212:117;9396:2;9385:9;9381:18;9368:32;9427:18;9419:6;9416:30;9413:117;;;9449:79;;:::i;:::-;9413:117;9554:62;9608:7;9599:6;9588:9;9584:22;9554:62;:::i;:::-;9544:72;;9339:287;8981:652;;;;;:::o;9639:179::-;9708:10;9729:46;9771:3;9763:6;9729:46;:::i;:::-;9807:4;9802:3;9798:14;9784:28;;9639:179;;;;:::o;9824:118::-;9911:24;9929:5;9911:24;:::i;:::-;9906:3;9899:37;9824:118;;:::o;9948:157::-;10053:45;10073:24;10091:5;10073:24;:::i;:::-;10053:45;:::i;:::-;10048:3;10041:58;9948:157;;:::o;10141:732::-;10260:3;10289:54;10337:5;10289:54;:::i;:::-;10359:86;10438:6;10433:3;10359:86;:::i;:::-;10352:93;;10469:56;10519:5;10469:56;:::i;:::-;10548:7;10579:1;10564:284;10589:6;10586:1;10583:13;10564:284;;;10665:6;10659:13;10692:63;10751:3;10736:13;10692:63;:::i;:::-;10685:70;;10778:60;10831:6;10778:60;:::i;:::-;10768:70;;10624:224;10611:1;10608;10604:9;10599:14;;10564:284;;;10568:14;10864:3;10857:10;;10265:608;;;10141:732;;;;:::o;10879:109::-;10960:21;10975:5;10960:21;:::i;:::-;10955:3;10948:34;10879:109;;:::o;10994:118::-;11081:24;11099:5;11081:24;:::i;:::-;11076:3;11069:37;10994:118;;:::o;11118:157::-;11223:45;11243:24;11261:5;11243:24;:::i;:::-;11223:45;:::i;:::-;11218:3;11211:58;11118:157;;:::o;11281:360::-;11367:3;11395:38;11427:5;11395:38;:::i;:::-;11449:70;11512:6;11507:3;11449:70;:::i;:::-;11442:77;;11528:52;11573:6;11568:3;11561:4;11554:5;11550:16;11528:52;:::i;:::-;11605:29;11627:6;11605:29;:::i;:::-;11600:3;11596:39;11589:46;;11371:270;11281:360;;;;:::o;11647:364::-;11735:3;11763:39;11796:5;11763:39;:::i;:::-;11818:71;11882:6;11877:3;11818:71;:::i;:::-;11811:78;;11898:52;11943:6;11938:3;11931:4;11924:5;11920:16;11898:52;:::i;:::-;11975:29;11997:6;11975:29;:::i;:::-;11970:3;11966:39;11959:46;;11739:272;11647:364;;;;:::o;12017:377::-;12123:3;12151:39;12184:5;12151:39;:::i;:::-;12206:89;12288:6;12283:3;12206:89;:::i;:::-;12199:96;;12304:52;12349:6;12344:3;12337:4;12330:5;12326:16;12304:52;:::i;:::-;12381:6;12376:3;12372:16;12365:23;;12127:267;12017:377;;;;:::o;12424:845::-;12527:3;12564:5;12558:12;12593:36;12619:9;12593:36;:::i;:::-;12645:89;12727:6;12722:3;12645:89;:::i;:::-;12638:96;;12765:1;12754:9;12750:17;12781:1;12776:137;;;;12927:1;12922:341;;;;12743:520;;12776:137;12860:4;12856:9;12845;12841:25;12836:3;12829:38;12896:6;12891:3;12887:16;12880:23;;12776:137;;12922:341;12989:38;13021:5;12989:38;:::i;:::-;13049:1;13063:154;13077:6;13074:1;13071:13;13063:154;;;13151:7;13145:14;13141:1;13136:3;13132:11;13125:35;13201:1;13192:7;13188:15;13177:26;;13099:4;13096:1;13092:12;13087:17;;13063:154;;;13246:6;13241:3;13237:16;13230:23;;12929:334;;12743:520;;12531:738;;12424:845;;;;:::o;13275:366::-;13417:3;13438:67;13502:2;13497:3;13438:67;:::i;:::-;13431:74;;13514:93;13603:3;13514:93;:::i;:::-;13632:2;13627:3;13623:12;13616:19;;13275:366;;;:::o;13647:::-;13789:3;13810:67;13874:2;13869:3;13810:67;:::i;:::-;13803:74;;13886:93;13975:3;13886:93;:::i;:::-;14004:2;13999:3;13995:12;13988:19;;13647:366;;;:::o;14019:::-;14161:3;14182:67;14246:2;14241:3;14182:67;:::i;:::-;14175:74;;14258:93;14347:3;14258:93;:::i;:::-;14376:2;14371:3;14367:12;14360:19;;14019:366;;;:::o;14391:402::-;14551:3;14572:85;14654:2;14649:3;14572:85;:::i;:::-;14565:92;;14666:93;14755:3;14666:93;:::i;:::-;14784:2;14779:3;14775:12;14768:19;;14391:402;;;:::o;14799:366::-;14941:3;14962:67;15026:2;15021:3;14962:67;:::i;:::-;14955:74;;15038:93;15127:3;15038:93;:::i;:::-;15156:2;15151:3;15147:12;15140:19;;14799:366;;;:::o;15171:::-;15313:3;15334:67;15398:2;15393:3;15334:67;:::i;:::-;15327:74;;15410:93;15499:3;15410:93;:::i;:::-;15528:2;15523:3;15519:12;15512:19;;15171:366;;;:::o;15543:::-;15685:3;15706:67;15770:2;15765:3;15706:67;:::i;:::-;15699:74;;15782:93;15871:3;15782:93;:::i;:::-;15900:2;15895:3;15891:12;15884:19;;15543:366;;;:::o;15915:::-;16057:3;16078:67;16142:2;16137:3;16078:67;:::i;:::-;16071:74;;16154:93;16243:3;16154:93;:::i;:::-;16272:2;16267:3;16263:12;16256:19;;15915:366;;;:::o;16287:::-;16429:3;16450:67;16514:2;16509:3;16450:67;:::i;:::-;16443:74;;16526:93;16615:3;16526:93;:::i;:::-;16644:2;16639:3;16635:12;16628:19;;16287:366;;;:::o;16659:::-;16801:3;16822:67;16886:2;16881:3;16822:67;:::i;:::-;16815:74;;16898:93;16987:3;16898:93;:::i;:::-;17016:2;17011:3;17007:12;17000:19;;16659:366;;;:::o;17031:::-;17173:3;17194:67;17258:2;17253:3;17194:67;:::i;:::-;17187:74;;17270:93;17359:3;17270:93;:::i;:::-;17388:2;17383:3;17379:12;17372:19;;17031:366;;;:::o;17403:::-;17545:3;17566:67;17630:2;17625:3;17566:67;:::i;:::-;17559:74;;17642:93;17731:3;17642:93;:::i;:::-;17760:2;17755:3;17751:12;17744:19;;17403:366;;;:::o;17775:::-;17917:3;17938:67;18002:2;17997:3;17938:67;:::i;:::-;17931:74;;18014:93;18103:3;18014:93;:::i;:::-;18132:2;18127:3;18123:12;18116:19;;17775:366;;;:::o;18147:::-;18289:3;18310:67;18374:2;18369:3;18310:67;:::i;:::-;18303:74;;18386:93;18475:3;18386:93;:::i;:::-;18504:2;18499:3;18495:12;18488:19;;18147:366;;;:::o;18519:::-;18661:3;18682:67;18746:2;18741:3;18682:67;:::i;:::-;18675:74;;18758:93;18847:3;18758:93;:::i;:::-;18876:2;18871:3;18867:12;18860:19;;18519:366;;;:::o;18891:::-;19033:3;19054:67;19118:2;19113:3;19054:67;:::i;:::-;19047:74;;19130:93;19219:3;19130:93;:::i;:::-;19248:2;19243:3;19239:12;19232:19;;18891:366;;;:::o;19263:::-;19405:3;19426:67;19490:2;19485:3;19426:67;:::i;:::-;19419:74;;19502:93;19591:3;19502:93;:::i;:::-;19620:2;19615:3;19611:12;19604:19;;19263:366;;;:::o;19635:::-;19777:3;19798:67;19862:2;19857:3;19798:67;:::i;:::-;19791:74;;19874:93;19963:3;19874:93;:::i;:::-;19992:2;19987:3;19983:12;19976:19;;19635:366;;;:::o;20007:::-;20149:3;20170:67;20234:2;20229:3;20170:67;:::i;:::-;20163:74;;20246:93;20335:3;20246:93;:::i;:::-;20364:2;20359:3;20355:12;20348:19;;20007:366;;;:::o;20379:::-;20521:3;20542:67;20606:2;20601:3;20542:67;:::i;:::-;20535:74;;20618:93;20707:3;20618:93;:::i;:::-;20736:2;20731:3;20727:12;20720:19;;20379:366;;;:::o;20751:::-;20893:3;20914:67;20978:2;20973:3;20914:67;:::i;:::-;20907:74;;20990:93;21079:3;20990:93;:::i;:::-;21108:2;21103:3;21099:12;21092:19;;20751:366;;;:::o;21123:::-;21265:3;21286:67;21350:2;21345:3;21286:67;:::i;:::-;21279:74;;21362:93;21451:3;21362:93;:::i;:::-;21480:2;21475:3;21471:12;21464:19;;21123:366;;;:::o;21495:::-;21637:3;21658:67;21722:2;21717:3;21658:67;:::i;:::-;21651:74;;21734:93;21823:3;21734:93;:::i;:::-;21852:2;21847:3;21843:12;21836:19;;21495:366;;;:::o;21867:::-;22009:3;22030:67;22094:2;22089:3;22030:67;:::i;:::-;22023:74;;22106:93;22195:3;22106:93;:::i;:::-;22224:2;22219:3;22215:12;22208:19;;21867:366;;;:::o;22239:::-;22381:3;22402:67;22466:2;22461:3;22402:67;:::i;:::-;22395:74;;22478:93;22567:3;22478:93;:::i;:::-;22596:2;22591:3;22587:12;22580:19;;22239:366;;;:::o;22611:::-;22753:3;22774:67;22838:2;22833:3;22774:67;:::i;:::-;22767:74;;22850:93;22939:3;22850:93;:::i;:::-;22968:2;22963:3;22959:12;22952:19;;22611:366;;;:::o;22983:::-;23125:3;23146:67;23210:2;23205:3;23146:67;:::i;:::-;23139:74;;23222:93;23311:3;23222:93;:::i;:::-;23340:2;23335:3;23331:12;23324:19;;22983:366;;;:::o;23355:::-;23497:3;23518:67;23582:2;23577:3;23518:67;:::i;:::-;23511:74;;23594:93;23683:3;23594:93;:::i;:::-;23712:2;23707:3;23703:12;23696:19;;23355:366;;;:::o;23727:::-;23869:3;23890:67;23954:2;23949:3;23890:67;:::i;:::-;23883:74;;23966:93;24055:3;23966:93;:::i;:::-;24084:2;24079:3;24075:12;24068:19;;23727:366;;;:::o;24099:398::-;24258:3;24279:83;24360:1;24355:3;24279:83;:::i;:::-;24272:90;;24371:93;24460:3;24371:93;:::i;:::-;24489:1;24484:3;24480:11;24473:18;;24099:398;;;:::o;24503:366::-;24645:3;24666:67;24730:2;24725:3;24666:67;:::i;:::-;24659:74;;24742:93;24831:3;24742:93;:::i;:::-;24860:2;24855:3;24851:12;24844:19;;24503:366;;;:::o;24875:::-;25017:3;25038:67;25102:2;25097:3;25038:67;:::i;:::-;25031:74;;25114:93;25203:3;25114:93;:::i;:::-;25232:2;25227:3;25223:12;25216:19;;24875:366;;;:::o;25247:::-;25389:3;25410:67;25474:2;25469:3;25410:67;:::i;:::-;25403:74;;25486:93;25575:3;25486:93;:::i;:::-;25604:2;25599:3;25595:12;25588:19;;25247:366;;;:::o;25619:::-;25761:3;25782:67;25846:2;25841:3;25782:67;:::i;:::-;25775:74;;25858:93;25947:3;25858:93;:::i;:::-;25976:2;25971:3;25967:12;25960:19;;25619:366;;;:::o;25991:::-;26133:3;26154:67;26218:2;26213:3;26154:67;:::i;:::-;26147:74;;26230:93;26319:3;26230:93;:::i;:::-;26348:2;26343:3;26339:12;26332:19;;25991:366;;;:::o;26363:108::-;26440:24;26458:5;26440:24;:::i;:::-;26435:3;26428:37;26363:108;;:::o;26477:118::-;26564:24;26582:5;26564:24;:::i;:::-;26559:3;26552:37;26477:118;;:::o;26601:112::-;26684:22;26700:5;26684:22;:::i;:::-;26679:3;26672:35;26601:112;;:::o;26719:256::-;26831:3;26846:75;26917:3;26908:6;26846:75;:::i;:::-;26946:2;26941:3;26937:12;26930:19;;26966:3;26959:10;;26719:256;;;;:::o;26981:583::-;27203:3;27225:92;27313:3;27304:6;27225:92;:::i;:::-;27218:99;;27334:95;27425:3;27416:6;27334:95;:::i;:::-;27327:102;;27446:92;27534:3;27525:6;27446:92;:::i;:::-;27439:99;;27555:3;27548:10;;26981:583;;;;;;:::o;27570:522::-;27783:3;27805:148;27949:3;27805:148;:::i;:::-;27798:155;;27963:75;28034:3;28025:6;27963:75;:::i;:::-;28063:2;28058:3;28054:12;28047:19;;28083:3;28076:10;;27570:522;;;;:::o;28098:379::-;28282:3;28304:147;28447:3;28304:147;:::i;:::-;28297:154;;28468:3;28461:10;;28098:379;;;:::o;28483:222::-;28576:4;28614:2;28603:9;28599:18;28591:26;;28627:71;28695:1;28684:9;28680:17;28671:6;28627:71;:::i;:::-;28483:222;;;;:::o;28711:640::-;28906:4;28944:3;28933:9;28929:19;28921:27;;28958:71;29026:1;29015:9;29011:17;29002:6;28958:71;:::i;:::-;29039:72;29107:2;29096:9;29092:18;29083:6;29039:72;:::i;:::-;29121;29189:2;29178:9;29174:18;29165:6;29121:72;:::i;:::-;29240:9;29234:4;29230:20;29225:2;29214:9;29210:18;29203:48;29268:76;29339:4;29330:6;29268:76;:::i;:::-;29260:84;;28711:640;;;;;;;:::o;29357:373::-;29500:4;29538:2;29527:9;29523:18;29515:26;;29587:9;29581:4;29577:20;29573:1;29562:9;29558:17;29551:47;29615:108;29718:4;29709:6;29615:108;:::i;:::-;29607:116;;29357:373;;;;:::o;29736:210::-;29823:4;29861:2;29850:9;29846:18;29838:26;;29874:65;29936:1;29925:9;29921:17;29912:6;29874:65;:::i;:::-;29736:210;;;;:::o;29952:545::-;30125:4;30163:3;30152:9;30148:19;30140:27;;30177:71;30245:1;30234:9;30230:17;30221:6;30177:71;:::i;:::-;30258:68;30322:2;30311:9;30307:18;30298:6;30258:68;:::i;:::-;30336:72;30404:2;30393:9;30389:18;30380:6;30336:72;:::i;:::-;30418;30486:2;30475:9;30471:18;30462:6;30418:72;:::i;:::-;29952:545;;;;;;;:::o;30503:313::-;30616:4;30654:2;30643:9;30639:18;30631:26;;30703:9;30697:4;30693:20;30689:1;30678:9;30674:17;30667:47;30731:78;30804:4;30795:6;30731:78;:::i;:::-;30723:86;;30503:313;;;;:::o;30822:419::-;30988:4;31026:2;31015:9;31011:18;31003:26;;31075:9;31069:4;31065:20;31061:1;31050:9;31046:17;31039:47;31103:131;31229:4;31103:131;:::i;:::-;31095:139;;30822:419;;;:::o;31247:::-;31413:4;31451:2;31440:9;31436:18;31428:26;;31500:9;31494:4;31490:20;31486:1;31475:9;31471:17;31464:47;31528:131;31654:4;31528:131;:::i;:::-;31520:139;;31247:419;;;:::o;31672:::-;31838:4;31876:2;31865:9;31861:18;31853:26;;31925:9;31919:4;31915:20;31911:1;31900:9;31896:17;31889:47;31953:131;32079:4;31953:131;:::i;:::-;31945:139;;31672:419;;;:::o;32097:::-;32263:4;32301:2;32290:9;32286:18;32278:26;;32350:9;32344:4;32340:20;32336:1;32325:9;32321:17;32314:47;32378:131;32504:4;32378:131;:::i;:::-;32370:139;;32097:419;;;:::o;32522:::-;32688:4;32726:2;32715:9;32711:18;32703:26;;32775:9;32769:4;32765:20;32761:1;32750:9;32746:17;32739:47;32803:131;32929:4;32803:131;:::i;:::-;32795:139;;32522:419;;;:::o;32947:::-;33113:4;33151:2;33140:9;33136:18;33128:26;;33200:9;33194:4;33190:20;33186:1;33175:9;33171:17;33164:47;33228:131;33354:4;33228:131;:::i;:::-;33220:139;;32947:419;;;:::o;33372:::-;33538:4;33576:2;33565:9;33561:18;33553:26;;33625:9;33619:4;33615:20;33611:1;33600:9;33596:17;33589:47;33653:131;33779:4;33653:131;:::i;:::-;33645:139;;33372:419;;;:::o;33797:::-;33963:4;34001:2;33990:9;33986:18;33978:26;;34050:9;34044:4;34040:20;34036:1;34025:9;34021:17;34014:47;34078:131;34204:4;34078:131;:::i;:::-;34070:139;;33797:419;;;:::o;34222:::-;34388:4;34426:2;34415:9;34411:18;34403:26;;34475:9;34469:4;34465:20;34461:1;34450:9;34446:17;34439:47;34503:131;34629:4;34503:131;:::i;:::-;34495:139;;34222:419;;;:::o;34647:::-;34813:4;34851:2;34840:9;34836:18;34828:26;;34900:9;34894:4;34890:20;34886:1;34875:9;34871:17;34864:47;34928:131;35054:4;34928:131;:::i;:::-;34920:139;;34647:419;;;:::o;35072:::-;35238:4;35276:2;35265:9;35261:18;35253:26;;35325:9;35319:4;35315:20;35311:1;35300:9;35296:17;35289:47;35353:131;35479:4;35353:131;:::i;:::-;35345:139;;35072:419;;;:::o;35497:::-;35663:4;35701:2;35690:9;35686:18;35678:26;;35750:9;35744:4;35740:20;35736:1;35725:9;35721:17;35714:47;35778:131;35904:4;35778:131;:::i;:::-;35770:139;;35497:419;;;:::o;35922:::-;36088:4;36126:2;36115:9;36111:18;36103:26;;36175:9;36169:4;36165:20;36161:1;36150:9;36146:17;36139:47;36203:131;36329:4;36203:131;:::i;:::-;36195:139;;35922:419;;;:::o;36347:::-;36513:4;36551:2;36540:9;36536:18;36528:26;;36600:9;36594:4;36590:20;36586:1;36575:9;36571:17;36564:47;36628:131;36754:4;36628:131;:::i;:::-;36620:139;;36347:419;;;:::o;36772:::-;36938:4;36976:2;36965:9;36961:18;36953:26;;37025:9;37019:4;37015:20;37011:1;37000:9;36996:17;36989:47;37053:131;37179:4;37053:131;:::i;:::-;37045:139;;36772:419;;;:::o;37197:::-;37363:4;37401:2;37390:9;37386:18;37378:26;;37450:9;37444:4;37440:20;37436:1;37425:9;37421:17;37414:47;37478:131;37604:4;37478:131;:::i;:::-;37470:139;;37197:419;;;:::o;37622:::-;37788:4;37826:2;37815:9;37811:18;37803:26;;37875:9;37869:4;37865:20;37861:1;37850:9;37846:17;37839:47;37903:131;38029:4;37903:131;:::i;:::-;37895:139;;37622:419;;;:::o;38047:::-;38213:4;38251:2;38240:9;38236:18;38228:26;;38300:9;38294:4;38290:20;38286:1;38275:9;38271:17;38264:47;38328:131;38454:4;38328:131;:::i;:::-;38320:139;;38047:419;;;:::o;38472:::-;38638:4;38676:2;38665:9;38661:18;38653:26;;38725:9;38719:4;38715:20;38711:1;38700:9;38696:17;38689:47;38753:131;38879:4;38753:131;:::i;:::-;38745:139;;38472:419;;;:::o;38897:::-;39063:4;39101:2;39090:9;39086:18;39078:26;;39150:9;39144:4;39140:20;39136:1;39125:9;39121:17;39114:47;39178:131;39304:4;39178:131;:::i;:::-;39170:139;;38897:419;;;:::o;39322:::-;39488:4;39526:2;39515:9;39511:18;39503:26;;39575:9;39569:4;39565:20;39561:1;39550:9;39546:17;39539:47;39603:131;39729:4;39603:131;:::i;:::-;39595:139;;39322:419;;;:::o;39747:::-;39913:4;39951:2;39940:9;39936:18;39928:26;;40000:9;39994:4;39990:20;39986:1;39975:9;39971:17;39964:47;40028:131;40154:4;40028:131;:::i;:::-;40020:139;;39747:419;;;:::o;40172:::-;40338:4;40376:2;40365:9;40361:18;40353:26;;40425:9;40419:4;40415:20;40411:1;40400:9;40396:17;40389:47;40453:131;40579:4;40453:131;:::i;:::-;40445:139;;40172:419;;;:::o;40597:::-;40763:4;40801:2;40790:9;40786:18;40778:26;;40850:9;40844:4;40840:20;40836:1;40825:9;40821:17;40814:47;40878:131;41004:4;40878:131;:::i;:::-;40870:139;;40597:419;;;:::o;41022:::-;41188:4;41226:2;41215:9;41211:18;41203:26;;41275:9;41269:4;41265:20;41261:1;41250:9;41246:17;41239:47;41303:131;41429:4;41303:131;:::i;:::-;41295:139;;41022:419;;;:::o;41447:::-;41613:4;41651:2;41640:9;41636:18;41628:26;;41700:9;41694:4;41690:20;41686:1;41675:9;41671:17;41664:47;41728:131;41854:4;41728:131;:::i;:::-;41720:139;;41447:419;;;:::o;41872:::-;42038:4;42076:2;42065:9;42061:18;42053:26;;42125:9;42119:4;42115:20;42111:1;42100:9;42096:17;42089:47;42153:131;42279:4;42153:131;:::i;:::-;42145:139;;41872:419;;;:::o;42297:::-;42463:4;42501:2;42490:9;42486:18;42478:26;;42550:9;42544:4;42540:20;42536:1;42525:9;42521:17;42514:47;42578:131;42704:4;42578:131;:::i;:::-;42570:139;;42297:419;;;:::o;42722:::-;42888:4;42926:2;42915:9;42911:18;42903:26;;42975:9;42969:4;42965:20;42961:1;42950:9;42946:17;42939:47;43003:131;43129:4;43003:131;:::i;:::-;42995:139;;42722:419;;;:::o;43147:::-;43313:4;43351:2;43340:9;43336:18;43328:26;;43400:9;43394:4;43390:20;43386:1;43375:9;43371:17;43364:47;43428:131;43554:4;43428:131;:::i;:::-;43420:139;;43147:419;;;:::o;43572:::-;43738:4;43776:2;43765:9;43761:18;43753:26;;43825:9;43819:4;43815:20;43811:1;43800:9;43796:17;43789:47;43853:131;43979:4;43853:131;:::i;:::-;43845:139;;43572:419;;;:::o;43997:::-;44163:4;44201:2;44190:9;44186:18;44178:26;;44250:9;44244:4;44240:20;44236:1;44225:9;44221:17;44214:47;44278:131;44404:4;44278:131;:::i;:::-;44270:139;;43997:419;;;:::o;44422:::-;44588:4;44626:2;44615:9;44611:18;44603:26;;44675:9;44669:4;44665:20;44661:1;44650:9;44646:17;44639:47;44703:131;44829:4;44703:131;:::i;:::-;44695:139;;44422:419;;;:::o;44847:222::-;44940:4;44978:2;44967:9;44963:18;44955:26;;44991:71;45059:1;45048:9;45044:17;45035:6;44991:71;:::i;:::-;44847:222;;;;:::o;45075:129::-;45109:6;45136:20;;:::i;:::-;45126:30;;45165:33;45193:4;45185:6;45165:33;:::i;:::-;45075:129;;;:::o;45210:75::-;45243:6;45276:2;45270:9;45260:19;;45210:75;:::o;45291:307::-;45352:4;45442:18;45434:6;45431:30;45428:56;;;45464:18;;:::i;:::-;45428:56;45502:29;45524:6;45502:29;:::i;:::-;45494:37;;45586:4;45580;45576:15;45568:23;;45291:307;;;:::o;45604:308::-;45666:4;45756:18;45748:6;45745:30;45742:56;;;45778:18;;:::i;:::-;45742:56;45816:29;45838:6;45816:29;:::i;:::-;45808:37;;45900:4;45894;45890:15;45882:23;;45604:308;;;:::o;45918:132::-;45985:4;46008:3;46000:11;;46038:4;46033:3;46029:14;46021:22;;45918:132;;;:::o;46056:141::-;46105:4;46128:3;46120:11;;46151:3;46148:1;46141:14;46185:4;46182:1;46172:18;46164:26;;46056:141;;;:::o;46203:114::-;46270:6;46304:5;46298:12;46288:22;;46203:114;;;:::o;46323:98::-;46374:6;46408:5;46402:12;46392:22;;46323:98;;;:::o;46427:99::-;46479:6;46513:5;46507:12;46497:22;;46427:99;;;:::o;46532:113::-;46602:4;46634;46629:3;46625:14;46617:22;;46532:113;;;:::o;46651:184::-;46750:11;46784:6;46779:3;46772:19;46824:4;46819:3;46815:14;46800:29;;46651:184;;;;:::o;46841:168::-;46924:11;46958:6;46953:3;46946:19;46998:4;46993:3;46989:14;46974:29;;46841:168;;;;:::o;47015:147::-;47116:11;47153:3;47138:18;;47015:147;;;;:::o;47168:169::-;47252:11;47286:6;47281:3;47274:19;47326:4;47321:3;47317:14;47302:29;;47168:169;;;;:::o;47343:148::-;47445:11;47482:3;47467:18;;47343:148;;;;:::o;47497:305::-;47537:3;47556:20;47574:1;47556:20;:::i;:::-;47551:25;;47590:20;47608:1;47590:20;:::i;:::-;47585:25;;47744:1;47676:66;47672:74;47669:1;47666:81;47663:107;;;47750:18;;:::i;:::-;47663:107;47794:1;47791;47787:9;47780:16;;47497:305;;;;:::o;47808:185::-;47848:1;47865:20;47883:1;47865:20;:::i;:::-;47860:25;;47899:20;47917:1;47899:20;:::i;:::-;47894:25;;47938:1;47928:35;;47943:18;;:::i;:::-;47928:35;47985:1;47982;47978:9;47973:14;;47808:185;;;;:::o;47999:348::-;48039:7;48062:20;48080:1;48062:20;:::i;:::-;48057:25;;48096:20;48114:1;48096:20;:::i;:::-;48091:25;;48284:1;48216:66;48212:74;48209:1;48206:81;48201:1;48194:9;48187:17;48183:105;48180:131;;;48291:18;;:::i;:::-;48180:131;48339:1;48336;48332:9;48321:20;;47999:348;;;;:::o;48353:191::-;48393:4;48413:20;48431:1;48413:20;:::i;:::-;48408:25;;48447:20;48465:1;48447:20;:::i;:::-;48442:25;;48486:1;48483;48480:8;48477:34;;;48491:18;;:::i;:::-;48477:34;48536:1;48533;48529:9;48521:17;;48353:191;;;;:::o;48550:96::-;48587:7;48616:24;48634:5;48616:24;:::i;:::-;48605:35;;48550:96;;;:::o;48652:90::-;48686:7;48729:5;48722:13;48715:21;48704:32;;48652:90;;;:::o;48748:77::-;48785:7;48814:5;48803:16;;48748:77;;;:::o;48831:149::-;48867:7;48907:66;48900:5;48896:78;48885:89;;48831:149;;;:::o;48986:126::-;49023:7;49063:42;49056:5;49052:54;49041:65;;48986:126;;;:::o;49118:77::-;49155:7;49184:5;49173:16;;49118:77;;;:::o;49201:86::-;49236:7;49276:4;49269:5;49265:16;49254:27;;49201:86;;;:::o;49293:154::-;49377:6;49372:3;49367;49354:30;49439:1;49430:6;49425:3;49421:16;49414:27;49293:154;;;:::o;49453:307::-;49521:1;49531:113;49545:6;49542:1;49539:13;49531:113;;;49630:1;49625:3;49621:11;49615:18;49611:1;49606:3;49602:11;49595:39;49567:2;49564:1;49560:10;49555:15;;49531:113;;;49662:6;49659:1;49656:13;49653:101;;;49742:1;49733:6;49728:3;49724:16;49717:27;49653:101;49502:258;49453:307;;;:::o;49766:320::-;49810:6;49847:1;49841:4;49837:12;49827:22;;49894:1;49888:4;49884:12;49915:18;49905:81;;49971:4;49963:6;49959:17;49949:27;;49905:81;50033:2;50025:6;50022:14;50002:18;49999:38;49996:84;;;50052:18;;:::i;:::-;49996:84;49817:269;49766:320;;;:::o;50092:281::-;50175:27;50197:4;50175:27;:::i;:::-;50167:6;50163:40;50305:6;50293:10;50290:22;50269:18;50257:10;50254:34;50251:62;50248:88;;;50316:18;;:::i;:::-;50248:88;50356:10;50352:2;50345:22;50135:238;50092:281;;:::o;50379:233::-;50418:3;50441:24;50459:5;50441:24;:::i;:::-;50432:33;;50487:66;50480:5;50477:77;50474:103;;;50557:18;;:::i;:::-;50474:103;50604:1;50597:5;50593:13;50586:20;;50379:233;;;:::o;50618:100::-;50657:7;50686:26;50706:5;50686:26;:::i;:::-;50675:37;;50618:100;;;:::o;50724:79::-;50763:7;50792:5;50781:16;;50724:79;;;:::o;50809:94::-;50848:7;50877:20;50891:5;50877:20;:::i;:::-;50866:31;;50809:94;;;:::o;50909:176::-;50941:1;50958:20;50976:1;50958:20;:::i;:::-;50953:25;;50992:20;51010:1;50992:20;:::i;:::-;50987:25;;51031:1;51021:35;;51036:18;;:::i;:::-;51021:35;51077:1;51074;51070:9;51065:14;;50909:176;;;;:::o;51091:180::-;51139:77;51136:1;51129:88;51236:4;51233:1;51226:15;51260:4;51257:1;51250:15;51277:180;51325:77;51322:1;51315:88;51422:4;51419:1;51412:15;51446:4;51443:1;51436:15;51463:180;51511:77;51508:1;51501:88;51608:4;51605:1;51598:15;51632:4;51629:1;51622:15;51649:180;51697:77;51694:1;51687:88;51794:4;51791:1;51784:15;51818:4;51815:1;51808:15;51835:180;51883:77;51880:1;51873:88;51980:4;51977:1;51970:15;52004:4;52001:1;51994:15;52021:180;52069:77;52066:1;52059:88;52166:4;52163:1;52156:15;52190:4;52187:1;52180:15;52207:180;52255:77;52252:1;52245:88;52352:4;52349:1;52342:15;52376:4;52373:1;52366:15;52393:117;52502:1;52499;52492:12;52516:117;52625:1;52622;52615:12;52639:117;52748:1;52745;52738:12;52762:117;52871:1;52868;52861:12;52885:102;52926:6;52977:2;52973:7;52968:2;52961:5;52957:14;52953:28;52943:38;;52885:102;;;:::o;52993:94::-;53026:8;53074:5;53070:2;53066:14;53045:35;;52993:94;;;:::o;53093:174::-;53233:26;53229:1;53221:6;53217:14;53210:50;53093:174;:::o;53273:234::-;53413:34;53409:1;53401:6;53397:14;53390:58;53482:17;53477:2;53469:6;53465:15;53458:42;53273:234;:::o;53513:181::-;53653:33;53649:1;53641:6;53637:14;53630:57;53513:181;:::o;53700:214::-;53840:66;53836:1;53828:6;53824:14;53817:90;53700:214;:::o;53920:230::-;54060:34;54056:1;54048:6;54044:14;54037:58;54129:13;54124:2;54116:6;54112:15;54105:38;53920:230;:::o;54156:237::-;54296:34;54292:1;54284:6;54280:14;54273:58;54365:20;54360:2;54352:6;54348:15;54341:45;54156:237;:::o;54399:227::-;54539:34;54535:1;54527:6;54523:14;54516:58;54608:10;54603:2;54595:6;54591:15;54584:35;54399:227;:::o;54632:225::-;54772:34;54768:1;54760:6;54756:14;54749:58;54841:8;54836:2;54828:6;54824:15;54817:33;54632:225;:::o;54863:178::-;55003:30;54999:1;54991:6;54987:14;54980:54;54863:178;:::o;55047:235::-;55187:34;55183:1;55175:6;55171:14;55164:58;55256:18;55251:2;55243:6;55239:15;55232:43;55047:235;:::o;55288:182::-;55428:34;55424:1;55416:6;55412:14;55405:58;55288:182;:::o;55476:226::-;55616:34;55612:1;55604:6;55600:14;55593:58;55685:9;55680:2;55672:6;55668:15;55661:34;55476:226;:::o;55708:223::-;55848:34;55844:1;55836:6;55832:14;55825:58;55917:6;55912:2;55904:6;55900:15;55893:31;55708:223;:::o;55937:175::-;56077:27;56073:1;56065:6;56061:14;56054:51;55937:175;:::o;56118:221::-;56258:34;56254:1;56246:6;56242:14;56235:58;56327:4;56322:2;56314:6;56310:15;56303:29;56118:221;:::o;56345:231::-;56485:34;56481:1;56473:6;56469:14;56462:58;56554:14;56549:2;56541:6;56537:15;56530:39;56345:231;:::o;56582:175::-;56722:27;56718:1;56710:6;56706:14;56699:51;56582:175;:::o;56763:243::-;56903:34;56899:1;56891:6;56887:14;56880:58;56972:26;56967:2;56959:6;56955:15;56948:51;56763:243;:::o;57012:229::-;57152:34;57148:1;57140:6;57136:14;57129:58;57221:12;57216:2;57208:6;57204:15;57197:37;57012:229;:::o;57247:228::-;57387:34;57383:1;57375:6;57371:14;57364:58;57456:11;57451:2;57443:6;57439:15;57432:36;57247:228;:::o;57481:178::-;57621:30;57617:1;57609:6;57605:14;57598:54;57481:178;:::o;57665:221::-;57805:34;57801:1;57793:6;57789:14;57782:58;57874:4;57869:2;57861:6;57857:15;57850:29;57665:221;:::o;57892:182::-;58032:34;58028:1;58020:6;58016:14;58009:58;57892:182;:::o;58080:231::-;58220:34;58216:1;58208:6;58204:14;58197:58;58289:14;58284:2;58276:6;58272:15;58265:39;58080:231;:::o;58317:182::-;58457:34;58453:1;58445:6;58441:14;58434:58;58317:182;:::o;58505:176::-;58645:28;58641:1;58633:6;58629:14;58622:52;58505:176;:::o;58687:228::-;58827:34;58823:1;58815:6;58811:14;58804:58;58896:11;58891:2;58883:6;58879:15;58872:36;58687:228;:::o;58921:235::-;59061:34;59057:1;59049:6;59045:14;59038:58;59130:18;59125:2;59117:6;59113:15;59106:43;58921:235;:::o;59162:220::-;59302:34;59298:1;59290:6;59286:14;59279:58;59371:3;59366:2;59358:6;59354:15;59347:28;59162:220;:::o;59388:114::-;;:::o;59508:236::-;59648:34;59644:1;59636:6;59632:14;59625:58;59717:19;59712:2;59704:6;59700:15;59693:44;59508:236;:::o;59750:177::-;59890:29;59886:1;59878:6;59874:14;59867:53;59750:177;:::o;59933:231::-;60073:34;60069:1;60061:6;60057:14;60050:58;60142:14;60137:2;60129:6;60125:15;60118:39;59933:231;:::o;60170:241::-;60310:34;60306:1;60298:6;60294:14;60287:58;60379:24;60374:2;60366:6;60362:15;60355:49;60170:241;:::o;60417:224::-;60557:34;60553:1;60545:6;60541:14;60534:58;60626:7;60621:2;60613:6;60609:15;60602:32;60417:224;:::o;60647:122::-;60720:24;60738:5;60720:24;:::i;:::-;60713:5;60710:35;60700:63;;60759:1;60756;60749:12;60700:63;60647:122;:::o;60775:116::-;60845:21;60860:5;60845:21;:::i;:::-;60838:5;60835:32;60825:60;;60881:1;60878;60871:12;60825:60;60775:116;:::o;60897:120::-;60969:23;60986:5;60969:23;:::i;:::-;60962:5;60959:34;60949:62;;61007:1;61004;60997:12;60949:62;60897:120;:::o;61023:122::-;61096:24;61114:5;61096:24;:::i;:::-;61089:5;61086:35;61076:63;;61135:1;61132;61125:12;61076:63;61023:122;:::o

Swarm Source

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