ETH Price: $3,520.40 (-0.13%)
Gas: 3 Gwei

Token

Billi The Cat (BTC)
 

Overview

Max Total Supply

86 BTC

Holders

33

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
plexie.eth
Balance
2 BTC
0xdd4ba0505485bdecf9b6f1bb60609f1a23a2a970
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

The original cool cat! If you know, you know. Billi the cat, is a limited collection of 5,000 rare collectible cool cats!

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
NFT

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, Unlicense license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-04-16
*/

// File: @openzeppelin/contracts/security/ReentrancyGuard.sol



pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and make it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

// File: @openzeppelin/contracts/utils/math/SafeMath.sol



pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

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

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

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

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

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

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

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

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

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

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

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

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

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



pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

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

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

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


// OpenZeppelin Contracts v4.4.1 (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: ERC721A.sol


// Creator: Chiru Labs

pragma solidity ^0.8.0;









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

    struct TokenOwnership {
        address addr;
        uint64 startTimestamp;
    }

    struct AddressData {
        uint128 balance;
        uint128 numberMinted;
    }

    uint256 internal currentIndex = 0;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view override returns (uint256) {
        require(index < totalSupply(), 'ERC721A: global index out of bounds');
        return index;
    }

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     * This read function is O(totalSupply). If calling from a separate contract, be sure to test gas first.
     * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256) {
        require(index < balanceOf(owner), 'ERC721A: owner index out of bounds');
        uint256 numMintedSoFar = totalSupply();
        uint256 tokenIdsIdx = 0;
        address currOwnershipAddr = address(0);
        for (uint256 i = 0; i < numMintedSoFar; i++) {
            TokenOwnership memory ownership = _ownerships[i];
            if (ownership.addr != address(0)) {
                currOwnershipAddr = ownership.addr;
            }
            if (currOwnershipAddr == owner) {
                if (tokenIdsIdx == index) {
                    return i;
                }
                tokenIdsIdx++;
            }
        }
        revert('ERC721A: unable to get token of owner by index');
    }

    /**
     * @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 ||
            interfaceId == type(IERC721Enumerable).interfaceId ||
            super.supportsInterface(interfaceId);
    }

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

    function _numberMinted(address owner) internal view returns (uint256) {
        require(owner != address(0), 'ERC721A: number minted query for the zero address');
        return uint256(_addressData[owner].numberMinted);
    }

    function ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
        require(_exists(tokenId), 'ERC721A: owner query for nonexistent token');

        for (uint256 curr = tokenId; ; curr--) {
            TokenOwnership memory ownership = _ownerships[curr];
            if (ownership.addr != address(0)) {
                return ownership;
            }
        }

        revert('ERC721A: unable to determine the owner of token');
    }

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

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

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

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        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 override {
        address owner = ERC721A.ownerOf(tokenId);
        require(to != owner, 'ERC721A: approval to current owner');

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

        _approve(to, tokenId, owner);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public override {
        require(operator != _msgSender(), 'ERC721A: 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 override {
        _transfer(from, to, tokenId);
    }

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public override {
        _transfer(from, to, tokenId);
        require(
            _checkOnERC721Received(from, to, tokenId, _data),
            'ERC721A: 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`),
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        return tokenId < currentIndex;
    }

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

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` cannot be larger than the max batch size.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        uint256 startTokenId = currentIndex;
        require(to != address(0), 'ERC721A: mint to the zero address');
        // We know if the first token in the batch doesn't exist, the other ones don't as well, because of serial ordering.
        require(!_exists(startTokenId), 'ERC721A: token already minted');
        require(quantity > 0, 'ERC721A: quantity must be greater 0');

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

        AddressData memory addressData = _addressData[to];
        _addressData[to] = AddressData(
            addressData.balance + uint128(quantity),
            addressData.numberMinted + uint128(quantity)
        );
        _ownerships[startTokenId] = TokenOwnership(to, uint64(block.timestamp));

        uint256 updatedIndex = startTokenId;

        for (uint256 i = 0; i < quantity; i++) {
            emit Transfer(address(0), to, updatedIndex);
            require(
                _checkOnERC721Received(address(0), to, updatedIndex, _data),
                'ERC721A: transfer to non ERC721Receiver implementer'
            );
            updatedIndex++;
        }

        currentIndex = updatedIndex;
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) private {
        TokenOwnership memory prevOwnership = ownershipOf(tokenId);

        bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr ||
            getApproved(tokenId) == _msgSender() ||
            isApprovedForAll(prevOwnership.addr, _msgSender()));

        require(isApprovedOrOwner, 'ERC721A: transfer caller is not owner nor approved');

        require(prevOwnership.addr == from, 'ERC721A: transfer from incorrect owner');
        require(to != address(0), 'ERC721A: transfer to the zero address');

        _beforeTokenTransfers(from, to, tokenId, 1);

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        unchecked {
            _addressData[from].balance -= 1;
            _addressData[to].balance += 1;
        }

        _ownerships[tokenId] = TokenOwnership(to, uint64(block.timestamp));

        // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
        // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
        uint256 nextTokenId = tokenId + 1;
        if (_ownerships[nextTokenId].addr == address(0)) {
            if (_exists(nextTokenId)) {
                _ownerships[nextTokenId] = TokenOwnership(prevOwnership.addr, prevOwnership.startTimestamp);
            }
        }

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

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

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target 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(to).onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert('ERC721A: transfer to non ERC721Receiver implementer');
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     */
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes
     * minting.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero.
     * - `from` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}
}
// File: NFTV3.sol


pragma solidity ^0.8.7;







contract NFT is ERC721A, Ownable, ReentrancyGuard {

  using Counters for Counters.Counter;
  using SafeMath for uint256;

  uint256 private _mintCost;
  uint256 private _maxSupply;
  bool private _isPublicMintEnabled;
  uint256 private _freeSupply;
  uint256 private _freeMintLimit;
  string private _baseURL;
  address private _feeCollector = 0xfdA84Df1a3e7aA676a5B5f34E6474aaeAef007B3;

  uint256 private FEE_DENOMINATOR = 1000;
  uint256 private FEE_PLATFORM_NUMERATOR = 50;
  uint256 private FEE_OWNER_NUMERATOR = 950;
  uint256 private VERSION = 1;

  event MintCostUpdated(uint256 _value);
  event MaxSupplyUpdated(uint256 _value);
  event PublicMintStatusChanged(bool _value);
  event FreeSupplyUpdated(uint256 _value);
  event FreeMintLimitUpdated(uint256 _value);
  event BaseUrlUpdated(string _value);
  event PlatformFeeAddressUpdated(address indexed _address);
  
  /**
  * @dev Initializes the contract setting the `tokenName` and `symbol` of the nft, `cost` of each mint call, and maximum `supply` of the nft.
  * Note: `cost` is in wei. 
  */
  constructor(string memory tokenName, string memory symbol, uint256 cost, uint256 supply, string memory baseURL, bool enablePublicMinting) ERC721A(tokenName, symbol) Ownable() {
    _mintCost = cost;
    _maxSupply = supply;
    _isPublicMintEnabled = enablePublicMinting;
    _freeSupply = 0;
    _freeMintLimit = 1;
    _baseURL = baseURL;
  }

  /**
  * @dev Mint `count` tokens if requirements are satisfied.
  * 
  */
  function mintTokens(uint256 count)
  public
  payable
  nonReentrant{
    require(count > 0 && count <= 100, "You can mint minimum 1, maximum 100 NFTs");
    require(count.add(totalSupply()) <= _maxSupply, "Exceeds max supply");
    require(owner() == msg.sender || msg.value >= _mintCost.mul(count),
           "Ether value sent is below the price");
    
    if(msg.value > 0){
      payable(owner()).transfer(msg.value.mul(FEE_OWNER_NUMERATOR).div(FEE_DENOMINATOR));
      payable(_feeCollector).transfer(msg.value.mul(FEE_PLATFORM_NUMERATOR).div(FEE_DENOMINATOR));
    }

    _mint(msg.sender, count);
  }

  /**
  * @dev Mint a token to each Address of `recipients`.
  * Can only be called if requirements are satisfied.
  */
  function mintTokens(address[] calldata recipients)
  public
  payable
  nonReentrant{
    require(recipients.length>0,"Missing recipient addresses");
    require(recipients.length > 0 && recipients.length <= 100, "You can mint minimum 1, maximum 100 NFTs");
    require(recipients.length.add(totalSupply()) <= _maxSupply, "Exceeds max supply");
    require(owner() == msg.sender || msg.value >= _mintCost.mul(recipients.length),
           "Ether value sent is below the price");
    
    if(msg.value > 0){
      payable(owner()).transfer(msg.value.mul(FEE_OWNER_NUMERATOR).div(FEE_DENOMINATOR));
      payable(_feeCollector).transfer(msg.value.mul(FEE_PLATFORM_NUMERATOR).div(FEE_DENOMINATOR));
    }
    
    for(uint i=0; i<recipients.length; i++){
        _mint(recipients[i], 1);
     }
  }

  /**
  * @dev Mint `count` tokens if requirements are satisfied.
  */
  function freeMint(uint256 count) 
  public 
  payable 
  nonReentrant{
    require(owner() == msg.sender || _isPublicMintEnabled, "Mint disabled");
    require(totalSupply() + count <= _freeSupply, "Exceeded max free supply");
    require(count <= _freeMintLimit, "Cant mint more than mint limit");
    require(count > 0, "Must mint at least 1 token");

    _safeMint(msg.sender, count);
  }

  /**
  * @dev Changes contract state to enable public access to `mintTokens` function
  * Can only be called by the current owner.
  */
  function enablePublicMint()
  public
  onlyOwner{
    _isPublicMintEnabled = true;
    emit PublicMintStatusChanged(true);
  }

  /**
  * @dev Changes contract state to disable public access to `mintTokens` function
  * Can only be called by the current owner.
  */
  function disablePublicMint()
  public
  onlyOwner{
    _isPublicMintEnabled = false;
    emit PublicMintStatusChanged(false);
  }

  /**
  * @dev Update the cost to mint a token.
  * Can only be called by the current owner.
  */
  function setCost(uint256 cost) public onlyOwner{
    _mintCost = cost;
    emit MintCostUpdated(cost);
  }

  /**
  * @dev Update the max supply.
  * Can only be called by the current owner.
  */
  function setMaxSupply(uint256 max) public onlyOwner{
    _maxSupply = max;
    emit MaxSupplyUpdated(max);
  }

  /**
  * @dev Update the max free supply.
  * Can only be called by the current owner.
  */
  function setFreeSupply(uint256 max) public onlyOwner{
    _freeSupply = max;
    emit FreeSupplyUpdated(max);
  }
  /**
  * @dev Update the free mint transaction limit.
  * Can only be called by the current owner.
  */
  function setFreeMintLimit(uint256 max) public onlyOwner{
    _freeMintLimit = max;
    emit FreeMintLimitUpdated(max);
  }
  /**
  * @dev Update base base uri 
  */
  function updateBaseUrl(string memory newBaseUrl) public onlyOwner{
    require(msg.sender == Ownable(_feeCollector).owner(), "Caller unauthorized");
    _baseURL = newBaseUrl;
    emit BaseUrlUpdated(newBaseUrl);
  }
  /**
  * @dev Update fee address
  */
  function updatePlatformFeeAddress(address newAddress) public onlyOwner{
    require(msg.sender == Ownable(_feeCollector).owner(), "Caller unauthorized");
    _feeCollector = newAddress;
    emit PlatformFeeAddressUpdated(newAddress);
  }
  /**
  * @dev Used by public mint functions and by owner functions.
  * Can only be called internally by other functions.
  */
  function _mint(address to, uint256 count) internal virtual returns (uint256){
    _safeMint(to, count);

    return count;
  }

  /**
  *  PUBLIC GETTERS:
  */

  function canFreeMint(uint256 count) public view returns (bool){
    return (_isPublicMintEnabled && totalSupply() + count <= _freeSupply && count <= _freeMintLimit && count > 0);
  }
  function getState() public view returns (uint256, address, bool, uint256, uint256, uint256, uint256, uint256, address, string memory){
    return (VERSION, _feeCollector, _isPublicMintEnabled, _mintCost, _maxSupply, totalSupply(), _freeSupply, _freeMintLimit, owner(), _baseURL);
  }
  function getMintStatus() public view returns (bool) {
    return _isPublicMintEnabled;
  }
  function getCost() public view returns (uint256){
    return _mintCost;
  }
  function getMaxSupply() public view returns (uint256){
    return _maxSupply;
  }
  function getCurrentSupply() public view returns (uint256){
    return totalSupply();
  }
  function getFreeSupply() public view returns (uint256) {
    return _freeSupply;
  }
  function getFreeMintLimit() public view returns (uint256) {
    return _freeMintLimit;
  }
  function _baseURI() override internal view returns (string memory) {
    return _baseURL;
  }
  function tokenURI(uint256 tokenId) public view 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, Strings.toString(tokenId), "/metadata.json")) : "";
  }
  function contractURI() public view returns (string memory) {
    string memory baseURI = _baseURI();
    return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, "metadata.json")) : "";
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"tokenName","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"uint256","name":"cost","type":"uint256"},{"internalType":"uint256","name":"supply","type":"uint256"},{"internalType":"string","name":"baseURL","type":"string"},{"internalType":"bool","name":"enablePublicMinting","type":"bool"}],"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":false,"internalType":"string","name":"_value","type":"string"}],"name":"BaseUrlUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"FreeMintLimitUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"FreeSupplyUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"MaxSupplyUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"MintCostUpdated","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":"_address","type":"address"}],"name":"PlatformFeeAddressUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"_value","type":"bool"}],"name":"PublicMintStatusChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"name":"canFreeMint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"disablePublicMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enablePublicMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"name":"freeMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getFreeMintLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getFreeSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMaxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMintStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getState","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"},{"internalType":"bool","name":"","type":"bool"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"},{"internalType":"string","name":"","type":"string"}],"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":[{"internalType":"address[]","name":"recipients","type":"address[]"}],"name":"mintTokens","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"name":"mintTokens","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":"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":"uint256","name":"cost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"max","type":"uint256"}],"name":"setFreeMintLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"max","type":"uint256"}],"name":"setFreeSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"max","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"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":"string","name":"newBaseUrl","type":"string"}],"name":"updateBaseUrl","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"updatePlatformFeeAddress","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526000805573fda84df1a3e7aa676a5b5f34e6474aaeaef007b3600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506103e860105560326011556103b660125560016013553480156200008057600080fd5b5060405162005d2338038062005d238339818101604052810190620000a691906200038b565b85858160019080519060200190620000c09291906200022f565b508060029080519060200190620000d99291906200022f565b505050620000fc620000f06200016160201b60201c565b6200016960201b60201c565b60016008819055508360098190555082600a8190555080600b60006101000a81548160ff0219169083151502179055506000600c819055506001600d8190555081600e9080519060200190620001549291906200022f565b5050505050505062000652565b600033905090565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200023d906200052f565b90600052602060002090601f016020900481019282620002615760008555620002ad565b82601f106200027c57805160ff1916838001178555620002ad565b82800160010185558215620002ad579182015b82811115620002ac5782518255916020019190600101906200028f565b5b509050620002bc9190620002c0565b5090565b5b80821115620002db576000816000905550600101620002c1565b5090565b6000620002f6620002f084620004ad565b62000484565b905082815260208101848484011115620003155762000314620005fe565b5b62000322848285620004f9565b509392505050565b6000815190506200033b816200061e565b92915050565b600082601f830112620003595762000358620005f9565b5b81516200036b848260208601620002df565b91505092915050565b600081519050620003858162000638565b92915050565b60008060008060008060c08789031215620003ab57620003aa62000608565b5b600087015167ffffffffffffffff811115620003cc57620003cb62000603565b5b620003da89828a0162000341565b965050602087015167ffffffffffffffff811115620003fe57620003fd62000603565b5b6200040c89828a0162000341565b95505060406200041f89828a0162000374565b94505060606200043289828a0162000374565b935050608087015167ffffffffffffffff81111562000456576200045562000603565b5b6200046489828a0162000341565b92505060a06200047789828a016200032a565b9150509295509295509295565b600062000490620004a3565b90506200049e828262000565565b919050565b6000604051905090565b600067ffffffffffffffff821115620004cb57620004ca620005ca565b5b620004d6826200060d565b9050602081019050919050565b60008115159050919050565b6000819050919050565b60005b8381101562000519578082015181840152602081019050620004fc565b8381111562000529576000848401525b50505050565b600060028204905060018216806200054857607f821691505b602082108114156200055f576200055e6200059b565b5b50919050565b62000570826200060d565b810181811067ffffffffffffffff82111715620005925762000591620005ca565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b6200062981620004e3565b81146200063557600080fd5b50565b6200064381620004ef565b81146200064f57600080fd5b50565b6156c180620006626000396000f3fe6080604052600436106102305760003560e01c80637c928fe91161012e578063bd2f6eb8116100ab578063e8a3d4851161006f578063e8a3d48514610809578063e985e9c514610834578063ea21e5eb14610871578063f2fde38b1461089a578063f676308a146108c357610230565b8063bd2f6eb81461074a578063bd3e19d414610773578063c87b56dd1461079e578063d62f3b1c146107db578063d64bc611146107f257610230565b806397304ced116100f257806397304ced146106885780639b63222b146106a4578063a22cb465146106cd578063b0505132146106f6578063b88d4fde1461072157610230565b80637c928fe9146105ae57806385dac12d146105ca5780638da5cb5b14610607578063941ada0e1461063257806395d89b411461065d57610230565b80634282b335116101bc5780634f6ccce7116101805780634f6ccce7146104b75780636352211e146104f45780636f8b44b01461053157806370a082311461055a578063715018a61461059757610230565b80634282b335146103e457806342842e0e1461040f57806344a0d68a146104385780634c0f38c2146104615780634f3e1efc1461048c57610230565b806318160ddd1161020357806318160ddd146103035780631865c57d1461032e57806323b872dd146103625780632f745c591461038b5780633fa40f94146103c857610230565b806301ffc9a71461023557806306fdde0314610272578063081812fc1461029d578063095ea7b3146102da575b600080fd5b34801561024157600080fd5b5061025c60048036038101906102579190613e44565b6108ec565b60405161026991906144d9565b60405180910390f35b34801561027e57600080fd5b50610287610a36565b60405161029491906144f4565b60405180910390f35b3480156102a957600080fd5b506102c460048036038101906102bf9190613ee7565b610ac8565b6040516102d19190614472565b60405180910390f35b3480156102e657600080fd5b5061030160048036038101906102fc9190613db7565b610b4d565b005b34801561030f57600080fd5b50610318610c66565b60405161032591906148b6565b60405180910390f35b34801561033a57600080fd5b50610343610c6f565b6040516103599a999897969594939291906148d1565b60405180910390f35b34801561036e57600080fd5b5061038960048036038101906103849190613ca1565b610d7f565b005b34801561039757600080fd5b506103b260048036038101906103ad9190613db7565b610d8f565b6040516103bf91906148b6565b60405180910390f35b6103e260048036038101906103dd9190613df7565b610f8d565b005b3480156103f057600080fd5b506103f96112e1565b60405161040691906148b6565b60405180910390f35b34801561041b57600080fd5b5061043660048036038101906104319190613ca1565b6112eb565b005b34801561044457600080fd5b5061045f600480360381019061045a9190613ee7565b61130b565b005b34801561046d57600080fd5b506104766113c8565b60405161048391906148b6565b60405180910390f35b34801561049857600080fd5b506104a16113d2565b6040516104ae91906148b6565b60405180910390f35b3480156104c357600080fd5b506104de60048036038101906104d99190613ee7565b6113e1565b6040516104eb91906148b6565b60405180910390f35b34801561050057600080fd5b5061051b60048036038101906105169190613ee7565b611434565b6040516105289190614472565b60405180910390f35b34801561053d57600080fd5b5061055860048036038101906105539190613ee7565b61144a565b005b34801561056657600080fd5b50610581600480360381019061057c9190613c07565b611507565b60405161058e91906148b6565b60405180910390f35b3480156105a357600080fd5b506105ac6115f0565b005b6105c860048036038101906105c39190613ee7565b611678565b005b3480156105d657600080fd5b506105f160048036038101906105ec9190613ee7565b611846565b6040516105fe91906144d9565b60405180910390f35b34801561061357600080fd5b5061061c611899565b6040516106299190614472565b60405180910390f35b34801561063e57600080fd5b506106476118c3565b60405161065491906144d9565b60405180910390f35b34801561066957600080fd5b506106726118da565b60405161067f91906144f4565b60405180910390f35b6106a2600480360381019061069d9190613ee7565b61196c565b005b3480156106b057600080fd5b506106cb60048036038101906106c69190613c07565b611c23565b005b3480156106d957600080fd5b506106f460048036038101906106ef9190613d77565b611e33565b005b34801561070257600080fd5b5061070b611fb4565b60405161071891906148b6565b60405180910390f35b34801561072d57600080fd5b5061074860048036038101906107439190613cf4565b611fbe565b005b34801561075657600080fd5b50610771600480360381019061076c9190613ee7565b61201a565b005b34801561077f57600080fd5b506107886120d7565b60405161079591906148b6565b60405180910390f35b3480156107aa57600080fd5b506107c560048036038101906107c09190613ee7565b6120e1565b6040516107d291906144f4565b60405180910390f35b3480156107e757600080fd5b506107f0612188565b005b3480156107fe57600080fd5b50610807612259565b005b34801561081557600080fd5b5061081e61232a565b60405161082b91906144f4565b60405180910390f35b34801561084057600080fd5b5061085b60048036038101906108569190613c61565b61237d565b60405161086891906144d9565b60405180910390f35b34801561087d57600080fd5b5061089860048036038101906108939190613e9e565b612411565b005b3480156108a657600080fd5b506108c160048036038101906108bc9190613c07565b6125eb565b005b3480156108cf57600080fd5b506108ea60048036038101906108e59190613ee7565b6126e3565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109b757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a1f57507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a2f5750610a2e826127a0565b5b9050919050565b606060018054610a4590614c95565b80601f0160208091040260200160405190810160405280929190818152602001828054610a7190614c95565b8015610abe5780601f10610a9357610100808354040283529160200191610abe565b820191906000526020600020905b815481529060010190602001808311610aa157829003601f168201915b5050505050905090565b6000610ad38261280a565b610b12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0990614896565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b5882611434565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610bc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc090614776565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610be8612817565b73ffffffffffffffffffffffffffffffffffffffff161480610c175750610c1681610c11612817565b61237d565b5b610c56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4d90614636565b60405180910390fd5b610c6183838361281f565b505050565b60008054905090565b60008060008060008060008060006060601354600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900460ff16600954600a54610cc3610c66565b600c54600d54610cd1611899565b600e808054610cdf90614c95565b80601f0160208091040260200160405190810160405280929190818152602001828054610d0b90614c95565b8015610d585780601f10610d2d57610100808354040283529160200191610d58565b820191906000526020600020905b815481529060010190602001808311610d3b57829003601f168201915b50505050509050995099509950995099509950995099509950995090919293949596979899565b610d8a8383836128d1565b505050565b6000610d9a83611507565b8210610ddb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd290614516565b60405180910390fd5b6000610de5610c66565b905060008060005b83811015610f4b576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610edf57806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610f375786841415610f28578195505050505050610f87565b8380610f3390614cf8565b9450505b508080610f4390614cf8565b915050610ded565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7e90614836565b60405180910390fd5b92915050565b60026008541415610fd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fca90614876565b60405180910390fd5b600260088190555060008282905011611021576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101890614756565b60405180910390fd5b600082829050118015611038575060648282905011155b611077576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106e90614856565b60405180910390fd5b600a54611097611085610c66565b84849050612e7890919063ffffffff16565b11156110d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110cf90614656565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166110f7611899565b73ffffffffffffffffffffffffffffffffffffffff161480611130575061112c82829050600954612e8e90919063ffffffff16565b3410155b61116f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116690614676565b60405180910390fd5b600034111561128057611180611899565b73ffffffffffffffffffffffffffffffffffffffff166108fc6111c26010546111b460125434612e8e90919063ffffffff16565b612ea490919063ffffffff16565b9081150290604051600060405180830381858888f193505050501580156111ed573d6000803e3d6000fd5b50600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc61125360105461124560115434612e8e90919063ffffffff16565b612ea490919063ffffffff16565b9081150290604051600060405180830381858888f1935050505015801561127e573d6000803e3d6000fd5b505b60005b828290508110156112d4576112c08383838181106112a4576112a3614dff565b5b90506020020160208101906112b99190613c07565b6001612eba565b5080806112cc90614cf8565b915050611283565b5060016008819055505050565b6000600d54905090565b61130683838360405180602001604052806000815250611fbe565b505050565b611313612817565b73ffffffffffffffffffffffffffffffffffffffff16611331611899565b73ffffffffffffffffffffffffffffffffffffffff1614611387576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137e906146d6565b60405180910390fd5b806009819055507fde03a6195f6a732ff0af69781292526beecc585b4278fa1baa4d9dd578f88a5c816040516113bd91906148b6565b60405180910390a150565b6000600a54905090565b60006113dc610c66565b905090565b60006113eb610c66565b821061142c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611423906145d6565b60405180910390fd5b819050919050565b600061143f82612ecf565b600001519050919050565b611452612817565b73ffffffffffffffffffffffffffffffffffffffff16611470611899565b73ffffffffffffffffffffffffffffffffffffffff16146114c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114bd906146d6565b60405180910390fd5b80600a819055507f7810bd47de260c3e9ee10061cf438099dd12256c79485f12f94dbccc981e806c816040516114fc91906148b6565b60405180910390a150565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611578576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156f90614696565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b6115f8612817565b73ffffffffffffffffffffffffffffffffffffffff16611616611899565b73ffffffffffffffffffffffffffffffffffffffff161461166c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611663906146d6565b60405180910390fd5b611676600061302a565b565b600260085414156116be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b590614876565b60405180910390fd5b60026008819055503373ffffffffffffffffffffffffffffffffffffffff166116e5611899565b73ffffffffffffffffffffffffffffffffffffffff1614806117135750600b60009054906101000a900460ff165b611752576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174990614816565b60405180910390fd5b600c548161175e610c66565b6117689190614a84565b11156117a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a090614616565b60405180910390fd5b600d548111156117ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e590614536565b60405180910390fd5b60008111611831576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182890614596565b60405180910390fd5b61183b33826130f0565b600160088190555050565b6000600b60009054906101000a900460ff1680156118785750600c548261186b610c66565b6118759190614a84565b11155b80156118865750600d548211155b80156118925750600082115b9050919050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600b60009054906101000a900460ff16905090565b6060600280546118e990614c95565b80601f016020809104026020016040519081016040528092919081815260200182805461191590614c95565b80156119625780601f1061193757610100808354040283529160200191611962565b820191906000526020600020905b81548152906001019060200180831161194557829003601f168201915b5050505050905090565b600260085414156119b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119a990614876565b60405180910390fd5b60026008819055506000811180156119cb575060648111155b611a0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0190614856565b60405180910390fd5b600a54611a27611a18610c66565b83612e7890919063ffffffff16565b1115611a68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5f90614656565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16611a87611899565b73ffffffffffffffffffffffffffffffffffffffff161480611abd5750611ab981600954612e8e90919063ffffffff16565b3410155b611afc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611af390614676565b60405180910390fd5b6000341115611c0d57611b0d611899565b73ffffffffffffffffffffffffffffffffffffffff166108fc611b4f601054611b4160125434612e8e90919063ffffffff16565b612ea490919063ffffffff16565b9081150290604051600060405180830381858888f19350505050158015611b7a573d6000803e3d6000fd5b50600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc611be0601054611bd260115434612e8e90919063ffffffff16565b612ea490919063ffffffff16565b9081150290604051600060405180830381858888f19350505050158015611c0b573d6000803e3d6000fd5b505b611c173382612eba565b50600160088190555050565b611c2b612817565b73ffffffffffffffffffffffffffffffffffffffff16611c49611899565b73ffffffffffffffffffffffffffffffffffffffff1614611c9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c96906146d6565b60405180910390fd5b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b158015611d0757600080fd5b505afa158015611d1b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d3f9190613c34565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611dac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611da3906145b6565b60405180910390fd5b80600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff167fd71a785e6a17cb0adfab30204e78a85411c5ef1c18714f35966f1664f890408160405160405180910390a250565b611e3b612817565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611ea9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ea090614716565b60405180910390fd5b8060066000611eb6612817565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611f63612817565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611fa891906144d9565b60405180910390a35050565b6000600c54905090565b611fc98484846128d1565b611fd58484848461310e565b612014576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161200b906147b6565b60405180910390fd5b50505050565b612022612817565b73ffffffffffffffffffffffffffffffffffffffff16612040611899565b73ffffffffffffffffffffffffffffffffffffffff1614612096576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208d906146d6565b60405180910390fd5b80600d819055507fd42ac6ec13f1fff9e4589dda4dfc42edad65acb15194635771b11d3e108cdae3816040516120cc91906148b6565b60405180910390a150565b6000600954905090565b60606120ec8261280a565b61212b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612122906146f6565b60405180910390fd5b60006121356132a5565b905060008151116121555760405180602001604052806000815250612180565b8061215f84613337565b604051602001612170929190614421565b6040516020818303038152906040525b915050919050565b612190612817565b73ffffffffffffffffffffffffffffffffffffffff166121ae611899565b73ffffffffffffffffffffffffffffffffffffffff1614612204576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121fb906146d6565b60405180910390fd5b6001600b60006101000a81548160ff0219169083151502179055507f696ca93f2d646dcbf31ca7a85da7f825bd3796a6d7baa7321166e324bd25f4db600160405161224f91906144d9565b60405180910390a1565b612261612817565b73ffffffffffffffffffffffffffffffffffffffff1661227f611899565b73ffffffffffffffffffffffffffffffffffffffff16146122d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122cc906146d6565b60405180910390fd5b6000600b60006101000a81548160ff0219169083151502179055507f696ca93f2d646dcbf31ca7a85da7f825bd3796a6d7baa7321166e324bd25f4db600060405161232091906144d9565b60405180910390a1565b606060006123366132a5565b905060008151116123565760405180602001604052806000815250612377565b806040516020016123679190614450565b6040516020818303038152906040525b91505090565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b612419612817565b73ffffffffffffffffffffffffffffffffffffffff16612437611899565b73ffffffffffffffffffffffffffffffffffffffff161461248d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612484906146d6565b60405180910390fd5b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156124f557600080fd5b505afa158015612509573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061252d9190613c34565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461259a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612591906145b6565b60405180910390fd5b80600e90805190602001906125b0929190613976565b507f7978693abd0b21e74ac988b69d39920de613f19cfbd49da4171f223a25c76633816040516125e091906144f4565b60405180910390a150565b6125f3612817565b73ffffffffffffffffffffffffffffffffffffffff16612611611899565b73ffffffffffffffffffffffffffffffffffffffff1614612667576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161265e906146d6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156126d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126ce90614556565b60405180910390fd5b6126e08161302a565b50565b6126eb612817565b73ffffffffffffffffffffffffffffffffffffffff16612709611899565b73ffffffffffffffffffffffffffffffffffffffff161461275f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612756906146d6565b60405180910390fd5b80600c819055507fcc2cb9c93bdd0107c2409596dd628888b57746cf7868d4e44e4d92c9d40392068160405161279591906148b6565b60405180910390a150565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000805482109050919050565b600033905090565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006128dc82612ecf565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16612903612817565b73ffffffffffffffffffffffffffffffffffffffff16148061295f5750612928612817565b73ffffffffffffffffffffffffffffffffffffffff1661294784610ac8565b73ffffffffffffffffffffffffffffffffffffffff16145b8061297b575061297a8260000151612975612817565b61237d565b5b9050806129bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129b490614736565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614612a2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a26906146b6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612a9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a96906145f6565b60405180910390fd5b612aac8585856001613498565b612abc600084846000015161281f565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160392506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060405180604001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050506000600184612cc29190614a84565b9050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612e0857612d388161280a565b15612e07576040518060400160405280846000015173ffffffffffffffffffffffffffffffffffffffff168152602001846020015167ffffffffffffffff168152506003600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050505b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612e70868686600161349e565b505050505050565b60008183612e869190614a84565b905092915050565b60008183612e9c9190614b0b565b905092915050565b60008183612eb29190614ada565b905092915050565b6000612ec683836130f0565b81905092915050565b612ed76139fc565b612ee08261280a565b612f1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f1690614576565b60405180910390fd5b60008290505b6000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614613011578092505050613025565b50808061301d90614c6b565b915050612f25565b919050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61310a8282604051806020016040528060008152506134a4565b5050565b600061312f8473ffffffffffffffffffffffffffffffffffffffff16613963565b15613298578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613158612817565b8786866040518563ffffffff1660e01b815260040161317a949392919061448d565b602060405180830381600087803b15801561319457600080fd5b505af19250505080156131c557506040513d601f19601f820116820180604052508101906131c29190613e71565b60015b613248573d80600081146131f5576040519150601f19603f3d011682016040523d82523d6000602084013e6131fa565b606091505b50600081511415613240576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613237906147b6565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061329d565b600190505b949350505050565b6060600e80546132b490614c95565b80601f01602080910402602001604051908101604052809291908181526020018280546132e090614c95565b801561332d5780601f106133025761010080835404028352916020019161332d565b820191906000526020600020905b81548152906001019060200180831161331057829003601f168201915b5050505050905090565b6060600082141561337f576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613493565b600082905060005b600082146133b157808061339a90614cf8565b915050600a826133aa9190614ada565b9150613387565b60008167ffffffffffffffff8111156133cd576133cc614e2e565b5b6040519080825280601f01601f1916602001820160405280156133ff5781602001600182028036833780820191505090505b5090505b6000851461348c576001826134189190614b65565b9150600a856134279190614d41565b60306134339190614a84565b60f81b81838151811061344957613448614dff565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856134859190614ada565b9450613403565b8093505050505b919050565b50505050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561351a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613511906147f6565b60405180910390fd5b6135238161280a565b15613563576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161355a906147d6565b60405180910390fd5b600083116135a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161359d90614796565b60405180910390fd5b6135b36000858386613498565b6000600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681525050905060405180604001604052808583600001516136b09190614a3e565b6fffffffffffffffffffffffffffffffff1681526020018583602001516136d79190614a3e565b6fffffffffffffffffffffffffffffffff16815250600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555090505060405180604001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600082905060005b8581101561394657818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46138e6600088848861310e565b613925576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161391c906147b6565b60405180910390fd5b818061393090614cf8565b925050808061393e90614cf8565b915050613875565b508060008190555061395b600087858861349e565b505050505050565b600080823b905060008111915050919050565b82805461398290614c95565b90600052602060002090601f0160209004810192826139a457600085556139eb565b82601f106139bd57805160ff19168380011785556139eb565b828001600101855582156139eb579182015b828111156139ea5782518255916020019190600101906139cf565b5b5090506139f89190613a36565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b80821115613a4f576000816000905550600101613a37565b5090565b6000613a66613a6184614999565b614974565b905082815260208101848484011115613a8257613a81614e6c565b5b613a8d848285614c29565b509392505050565b6000613aa8613aa3846149ca565b614974565b905082815260208101848484011115613ac457613ac3614e6c565b5b613acf848285614c29565b509392505050565b600081359050613ae68161562f565b92915050565b600081519050613afb8161562f565b92915050565b60008083601f840112613b1757613b16614e62565b5b8235905067ffffffffffffffff811115613b3457613b33614e5d565b5b602083019150836020820283011115613b5057613b4f614e67565b5b9250929050565b600081359050613b6681615646565b92915050565b600081359050613b7b8161565d565b92915050565b600081519050613b908161565d565b92915050565b600082601f830112613bab57613baa614e62565b5b8135613bbb848260208601613a53565b91505092915050565b600082601f830112613bd957613bd8614e62565b5b8135613be9848260208601613a95565b91505092915050565b600081359050613c0181615674565b92915050565b600060208284031215613c1d57613c1c614e76565b5b6000613c2b84828501613ad7565b91505092915050565b600060208284031215613c4a57613c49614e76565b5b6000613c5884828501613aec565b91505092915050565b60008060408385031215613c7857613c77614e76565b5b6000613c8685828601613ad7565b9250506020613c9785828601613ad7565b9150509250929050565b600080600060608486031215613cba57613cb9614e76565b5b6000613cc886828701613ad7565b9350506020613cd986828701613ad7565b9250506040613cea86828701613bf2565b9150509250925092565b60008060008060808587031215613d0e57613d0d614e76565b5b6000613d1c87828801613ad7565b9450506020613d2d87828801613ad7565b9350506040613d3e87828801613bf2565b925050606085013567ffffffffffffffff811115613d5f57613d5e614e71565b5b613d6b87828801613b96565b91505092959194509250565b60008060408385031215613d8e57613d8d614e76565b5b6000613d9c85828601613ad7565b9250506020613dad85828601613b57565b9150509250929050565b60008060408385031215613dce57613dcd614e76565b5b6000613ddc85828601613ad7565b9250506020613ded85828601613bf2565b9150509250929050565b60008060208385031215613e0e57613e0d614e76565b5b600083013567ffffffffffffffff811115613e2c57613e2b614e71565b5b613e3885828601613b01565b92509250509250929050565b600060208284031215613e5a57613e59614e76565b5b6000613e6884828501613b6c565b91505092915050565b600060208284031215613e8757613e86614e76565b5b6000613e9584828501613b81565b91505092915050565b600060208284031215613eb457613eb3614e76565b5b600082013567ffffffffffffffff811115613ed257613ed1614e71565b5b613ede84828501613bc4565b91505092915050565b600060208284031215613efd57613efc614e76565b5b6000613f0b84828501613bf2565b91505092915050565b613f1d81614b99565b82525050565b613f2c81614bab565b82525050565b6000613f3d826149fb565b613f478185614a11565b9350613f57818560208601614c38565b613f6081614e7b565b840191505092915050565b6000613f7682614a06565b613f808185614a22565b9350613f90818560208601614c38565b613f9981614e7b565b840191505092915050565b6000613faf82614a06565b613fb98185614a33565b9350613fc9818560208601614c38565b80840191505092915050565b6000613fe2602283614a22565b9150613fed82614e8c565b604082019050919050565b6000614005601e83614a22565b915061401082614edb565b602082019050919050565b6000614028602683614a22565b915061403382614f04565b604082019050919050565b600061404b602a83614a22565b915061405682614f53565b604082019050919050565b600061406e601a83614a22565b915061407982614fa2565b602082019050919050565b6000614091601383614a22565b915061409c82614fcb565b602082019050919050565b60006140b4600e83614a33565b91506140bf82614ff4565b600e82019050919050565b60006140d7602383614a22565b91506140e28261501d565b604082019050919050565b60006140fa602583614a22565b91506141058261506c565b604082019050919050565b600061411d601883614a22565b9150614128826150bb565b602082019050919050565b6000614140603983614a22565b915061414b826150e4565b604082019050919050565b6000614163601283614a22565b915061416e82615133565b602082019050919050565b6000614186602383614a22565b91506141918261515c565b604082019050919050565b60006141a9602b83614a22565b91506141b4826151ab565b604082019050919050565b60006141cc602683614a22565b91506141d7826151fa565b604082019050919050565b60006141ef602083614a22565b91506141fa82615249565b602082019050919050565b6000614212602f83614a22565b915061421d82615272565b604082019050919050565b6000614235601a83614a22565b9150614240826152c1565b602082019050919050565b6000614258603283614a22565b9150614263826152ea565b604082019050919050565b600061427b601b83614a22565b915061428682615339565b602082019050919050565b600061429e602283614a22565b91506142a982615362565b604082019050919050565b60006142c1602383614a22565b91506142cc826153b1565b604082019050919050565b60006142e4603383614a22565b91506142ef82615400565b604082019050919050565b6000614307601d83614a22565b91506143128261544f565b602082019050919050565b600061432a602183614a22565b915061433582615478565b604082019050919050565b600061434d600d83614a22565b9150614358826154c7565b602082019050919050565b6000614370602e83614a22565b915061437b826154f0565b604082019050919050565b6000614393602883614a22565b915061439e8261553f565b604082019050919050565b60006143b6601f83614a22565b91506143c18261558e565b602082019050919050565b60006143d9600d83614a33565b91506143e4826155b7565b600d82019050919050565b60006143fc602d83614a22565b9150614407826155e0565b604082019050919050565b61441b81614c1f565b82525050565b600061442d8285613fa4565b91506144398284613fa4565b9150614444826140a7565b91508190509392505050565b600061445c8284613fa4565b9150614467826143cc565b915081905092915050565b60006020820190506144876000830184613f14565b92915050565b60006080820190506144a26000830187613f14565b6144af6020830186613f14565b6144bc6040830185614412565b81810360608301526144ce8184613f32565b905095945050505050565b60006020820190506144ee6000830184613f23565b92915050565b6000602082019050818103600083015261450e8184613f6b565b905092915050565b6000602082019050818103600083015261452f81613fd5565b9050919050565b6000602082019050818103600083015261454f81613ff8565b9050919050565b6000602082019050818103600083015261456f8161401b565b9050919050565b6000602082019050818103600083015261458f8161403e565b9050919050565b600060208201905081810360008301526145af81614061565b9050919050565b600060208201905081810360008301526145cf81614084565b9050919050565b600060208201905081810360008301526145ef816140ca565b9050919050565b6000602082019050818103600083015261460f816140ed565b9050919050565b6000602082019050818103600083015261462f81614110565b9050919050565b6000602082019050818103600083015261464f81614133565b9050919050565b6000602082019050818103600083015261466f81614156565b9050919050565b6000602082019050818103600083015261468f81614179565b9050919050565b600060208201905081810360008301526146af8161419c565b9050919050565b600060208201905081810360008301526146cf816141bf565b9050919050565b600060208201905081810360008301526146ef816141e2565b9050919050565b6000602082019050818103600083015261470f81614205565b9050919050565b6000602082019050818103600083015261472f81614228565b9050919050565b6000602082019050818103600083015261474f8161424b565b9050919050565b6000602082019050818103600083015261476f8161426e565b9050919050565b6000602082019050818103600083015261478f81614291565b9050919050565b600060208201905081810360008301526147af816142b4565b9050919050565b600060208201905081810360008301526147cf816142d7565b9050919050565b600060208201905081810360008301526147ef816142fa565b9050919050565b6000602082019050818103600083015261480f8161431d565b9050919050565b6000602082019050818103600083015261482f81614340565b9050919050565b6000602082019050818103600083015261484f81614363565b9050919050565b6000602082019050818103600083015261486f81614386565b9050919050565b6000602082019050818103600083015261488f816143a9565b9050919050565b600060208201905081810360008301526148af816143ef565b9050919050565b60006020820190506148cb6000830184614412565b92915050565b6000610140820190506148e7600083018d614412565b6148f4602083018c613f14565b614901604083018b613f23565b61490e606083018a614412565b61491b6080830189614412565b61492860a0830188614412565b61493560c0830187614412565b61494260e0830186614412565b614950610100830185613f14565b8181036101208301526149638184613f6b565b90509b9a5050505050505050505050565b600061497e61498f565b905061498a8282614cc7565b919050565b6000604051905090565b600067ffffffffffffffff8211156149b4576149b3614e2e565b5b6149bd82614e7b565b9050602081019050919050565b600067ffffffffffffffff8211156149e5576149e4614e2e565b5b6149ee82614e7b565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614a4982614be3565b9150614a5483614be3565b9250826fffffffffffffffffffffffffffffffff03821115614a7957614a78614d72565b5b828201905092915050565b6000614a8f82614c1f565b9150614a9a83614c1f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614acf57614ace614d72565b5b828201905092915050565b6000614ae582614c1f565b9150614af083614c1f565b925082614b0057614aff614da1565b5b828204905092915050565b6000614b1682614c1f565b9150614b2183614c1f565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614b5a57614b59614d72565b5b828202905092915050565b6000614b7082614c1f565b9150614b7b83614c1f565b925082821015614b8e57614b8d614d72565b5b828203905092915050565b6000614ba482614bff565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614c56578082015181840152602081019050614c3b565b83811115614c65576000848401525b50505050565b6000614c7682614c1f565b91506000821415614c8a57614c89614d72565b5b600182039050919050565b60006002820490506001821680614cad57607f821691505b60208210811415614cc157614cc0614dd0565b5b50919050565b614cd082614e7b565b810181811067ffffffffffffffff82111715614cef57614cee614e2e565b5b80604052505050565b6000614d0382614c1f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614d3657614d35614d72565b5b600182019050919050565b6000614d4c82614c1f565b9150614d5783614c1f565b925082614d6757614d66614da1565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f43616e74206d696e74206d6f7265207468616e206d696e74206c696d69740000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b7f4d757374206d696e74206174206c65617374203120746f6b656e000000000000600082015250565b7f43616c6c657220756e617574686f72697a656400000000000000000000000000600082015250565b7f2f6d657461646174612e6a736f6e000000000000000000000000000000000000600082015250565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f4578636565646564206d6178206672656520737570706c790000000000000000600082015250565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b7f45786365656473206d617820737570706c790000000000000000000000000000600082015250565b7f45746865722076616c75652073656e742069732062656c6f772074686520707260008201527f6963650000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f4d697373696e6720726563697069656e74206164647265737365730000000000600082015250565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207175616e74697479206d7573742062652067726561746560008201527f7220300000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b7f455243373231413a20746f6b656e20616c7265616479206d696e746564000000600082015250565b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f4d696e742064697361626c656400000000000000000000000000000000000000600082015250565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b7f596f752063616e206d696e74206d696e696d756d20312c206d6178696d756d2060008201527f313030204e465473000000000000000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f6d657461646174612e6a736f6e00000000000000000000000000000000000000600082015250565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b61563881614b99565b811461564357600080fd5b50565b61564f81614bab565b811461565a57600080fd5b50565b61566681614bb7565b811461567157600080fd5b50565b61567d81614c1f565b811461568857600080fd5b5056fea264697066735822122058e0638a12460b1ca8db8d727985c47092422590731b71e93bc657ad2be6e73664736f6c6343000807003300000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000470de4df820000000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000d42696c6c6920546865204361740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034254430000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009d68747470733a2f2f6d696e7474656176326275636b65743134353532352d70726f642e73332e616d617a6f6e6177732e636f6d2f70726f7465637465642f75732d656173742d3125334162366161323731372d343235662d343339362d383566642d6637376636656561393437622f70726f6a656374732f66376239623637352d626538632d346265622d383133312d6236666566376164653264302f000000

Deployed Bytecode

0x6080604052600436106102305760003560e01c80637c928fe91161012e578063bd2f6eb8116100ab578063e8a3d4851161006f578063e8a3d48514610809578063e985e9c514610834578063ea21e5eb14610871578063f2fde38b1461089a578063f676308a146108c357610230565b8063bd2f6eb81461074a578063bd3e19d414610773578063c87b56dd1461079e578063d62f3b1c146107db578063d64bc611146107f257610230565b806397304ced116100f257806397304ced146106885780639b63222b146106a4578063a22cb465146106cd578063b0505132146106f6578063b88d4fde1461072157610230565b80637c928fe9146105ae57806385dac12d146105ca5780638da5cb5b14610607578063941ada0e1461063257806395d89b411461065d57610230565b80634282b335116101bc5780634f6ccce7116101805780634f6ccce7146104b75780636352211e146104f45780636f8b44b01461053157806370a082311461055a578063715018a61461059757610230565b80634282b335146103e457806342842e0e1461040f57806344a0d68a146104385780634c0f38c2146104615780634f3e1efc1461048c57610230565b806318160ddd1161020357806318160ddd146103035780631865c57d1461032e57806323b872dd146103625780632f745c591461038b5780633fa40f94146103c857610230565b806301ffc9a71461023557806306fdde0314610272578063081812fc1461029d578063095ea7b3146102da575b600080fd5b34801561024157600080fd5b5061025c60048036038101906102579190613e44565b6108ec565b60405161026991906144d9565b60405180910390f35b34801561027e57600080fd5b50610287610a36565b60405161029491906144f4565b60405180910390f35b3480156102a957600080fd5b506102c460048036038101906102bf9190613ee7565b610ac8565b6040516102d19190614472565b60405180910390f35b3480156102e657600080fd5b5061030160048036038101906102fc9190613db7565b610b4d565b005b34801561030f57600080fd5b50610318610c66565b60405161032591906148b6565b60405180910390f35b34801561033a57600080fd5b50610343610c6f565b6040516103599a999897969594939291906148d1565b60405180910390f35b34801561036e57600080fd5b5061038960048036038101906103849190613ca1565b610d7f565b005b34801561039757600080fd5b506103b260048036038101906103ad9190613db7565b610d8f565b6040516103bf91906148b6565b60405180910390f35b6103e260048036038101906103dd9190613df7565b610f8d565b005b3480156103f057600080fd5b506103f96112e1565b60405161040691906148b6565b60405180910390f35b34801561041b57600080fd5b5061043660048036038101906104319190613ca1565b6112eb565b005b34801561044457600080fd5b5061045f600480360381019061045a9190613ee7565b61130b565b005b34801561046d57600080fd5b506104766113c8565b60405161048391906148b6565b60405180910390f35b34801561049857600080fd5b506104a16113d2565b6040516104ae91906148b6565b60405180910390f35b3480156104c357600080fd5b506104de60048036038101906104d99190613ee7565b6113e1565b6040516104eb91906148b6565b60405180910390f35b34801561050057600080fd5b5061051b60048036038101906105169190613ee7565b611434565b6040516105289190614472565b60405180910390f35b34801561053d57600080fd5b5061055860048036038101906105539190613ee7565b61144a565b005b34801561056657600080fd5b50610581600480360381019061057c9190613c07565b611507565b60405161058e91906148b6565b60405180910390f35b3480156105a357600080fd5b506105ac6115f0565b005b6105c860048036038101906105c39190613ee7565b611678565b005b3480156105d657600080fd5b506105f160048036038101906105ec9190613ee7565b611846565b6040516105fe91906144d9565b60405180910390f35b34801561061357600080fd5b5061061c611899565b6040516106299190614472565b60405180910390f35b34801561063e57600080fd5b506106476118c3565b60405161065491906144d9565b60405180910390f35b34801561066957600080fd5b506106726118da565b60405161067f91906144f4565b60405180910390f35b6106a2600480360381019061069d9190613ee7565b61196c565b005b3480156106b057600080fd5b506106cb60048036038101906106c69190613c07565b611c23565b005b3480156106d957600080fd5b506106f460048036038101906106ef9190613d77565b611e33565b005b34801561070257600080fd5b5061070b611fb4565b60405161071891906148b6565b60405180910390f35b34801561072d57600080fd5b5061074860048036038101906107439190613cf4565b611fbe565b005b34801561075657600080fd5b50610771600480360381019061076c9190613ee7565b61201a565b005b34801561077f57600080fd5b506107886120d7565b60405161079591906148b6565b60405180910390f35b3480156107aa57600080fd5b506107c560048036038101906107c09190613ee7565b6120e1565b6040516107d291906144f4565b60405180910390f35b3480156107e757600080fd5b506107f0612188565b005b3480156107fe57600080fd5b50610807612259565b005b34801561081557600080fd5b5061081e61232a565b60405161082b91906144f4565b60405180910390f35b34801561084057600080fd5b5061085b60048036038101906108569190613c61565b61237d565b60405161086891906144d9565b60405180910390f35b34801561087d57600080fd5b5061089860048036038101906108939190613e9e565b612411565b005b3480156108a657600080fd5b506108c160048036038101906108bc9190613c07565b6125eb565b005b3480156108cf57600080fd5b506108ea60048036038101906108e59190613ee7565b6126e3565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109b757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a1f57507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a2f5750610a2e826127a0565b5b9050919050565b606060018054610a4590614c95565b80601f0160208091040260200160405190810160405280929190818152602001828054610a7190614c95565b8015610abe5780601f10610a9357610100808354040283529160200191610abe565b820191906000526020600020905b815481529060010190602001808311610aa157829003601f168201915b5050505050905090565b6000610ad38261280a565b610b12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0990614896565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b5882611434565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610bc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc090614776565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610be8612817565b73ffffffffffffffffffffffffffffffffffffffff161480610c175750610c1681610c11612817565b61237d565b5b610c56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4d90614636565b60405180910390fd5b610c6183838361281f565b505050565b60008054905090565b60008060008060008060008060006060601354600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900460ff16600954600a54610cc3610c66565b600c54600d54610cd1611899565b600e808054610cdf90614c95565b80601f0160208091040260200160405190810160405280929190818152602001828054610d0b90614c95565b8015610d585780601f10610d2d57610100808354040283529160200191610d58565b820191906000526020600020905b815481529060010190602001808311610d3b57829003601f168201915b50505050509050995099509950995099509950995099509950995090919293949596979899565b610d8a8383836128d1565b505050565b6000610d9a83611507565b8210610ddb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd290614516565b60405180910390fd5b6000610de5610c66565b905060008060005b83811015610f4b576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610edf57806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610f375786841415610f28578195505050505050610f87565b8380610f3390614cf8565b9450505b508080610f4390614cf8565b915050610ded565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7e90614836565b60405180910390fd5b92915050565b60026008541415610fd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fca90614876565b60405180910390fd5b600260088190555060008282905011611021576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101890614756565b60405180910390fd5b600082829050118015611038575060648282905011155b611077576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106e90614856565b60405180910390fd5b600a54611097611085610c66565b84849050612e7890919063ffffffff16565b11156110d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110cf90614656565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166110f7611899565b73ffffffffffffffffffffffffffffffffffffffff161480611130575061112c82829050600954612e8e90919063ffffffff16565b3410155b61116f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116690614676565b60405180910390fd5b600034111561128057611180611899565b73ffffffffffffffffffffffffffffffffffffffff166108fc6111c26010546111b460125434612e8e90919063ffffffff16565b612ea490919063ffffffff16565b9081150290604051600060405180830381858888f193505050501580156111ed573d6000803e3d6000fd5b50600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc61125360105461124560115434612e8e90919063ffffffff16565b612ea490919063ffffffff16565b9081150290604051600060405180830381858888f1935050505015801561127e573d6000803e3d6000fd5b505b60005b828290508110156112d4576112c08383838181106112a4576112a3614dff565b5b90506020020160208101906112b99190613c07565b6001612eba565b5080806112cc90614cf8565b915050611283565b5060016008819055505050565b6000600d54905090565b61130683838360405180602001604052806000815250611fbe565b505050565b611313612817565b73ffffffffffffffffffffffffffffffffffffffff16611331611899565b73ffffffffffffffffffffffffffffffffffffffff1614611387576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137e906146d6565b60405180910390fd5b806009819055507fde03a6195f6a732ff0af69781292526beecc585b4278fa1baa4d9dd578f88a5c816040516113bd91906148b6565b60405180910390a150565b6000600a54905090565b60006113dc610c66565b905090565b60006113eb610c66565b821061142c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611423906145d6565b60405180910390fd5b819050919050565b600061143f82612ecf565b600001519050919050565b611452612817565b73ffffffffffffffffffffffffffffffffffffffff16611470611899565b73ffffffffffffffffffffffffffffffffffffffff16146114c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114bd906146d6565b60405180910390fd5b80600a819055507f7810bd47de260c3e9ee10061cf438099dd12256c79485f12f94dbccc981e806c816040516114fc91906148b6565b60405180910390a150565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611578576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156f90614696565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b6115f8612817565b73ffffffffffffffffffffffffffffffffffffffff16611616611899565b73ffffffffffffffffffffffffffffffffffffffff161461166c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611663906146d6565b60405180910390fd5b611676600061302a565b565b600260085414156116be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b590614876565b60405180910390fd5b60026008819055503373ffffffffffffffffffffffffffffffffffffffff166116e5611899565b73ffffffffffffffffffffffffffffffffffffffff1614806117135750600b60009054906101000a900460ff165b611752576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174990614816565b60405180910390fd5b600c548161175e610c66565b6117689190614a84565b11156117a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a090614616565b60405180910390fd5b600d548111156117ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e590614536565b60405180910390fd5b60008111611831576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182890614596565b60405180910390fd5b61183b33826130f0565b600160088190555050565b6000600b60009054906101000a900460ff1680156118785750600c548261186b610c66565b6118759190614a84565b11155b80156118865750600d548211155b80156118925750600082115b9050919050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600b60009054906101000a900460ff16905090565b6060600280546118e990614c95565b80601f016020809104026020016040519081016040528092919081815260200182805461191590614c95565b80156119625780601f1061193757610100808354040283529160200191611962565b820191906000526020600020905b81548152906001019060200180831161194557829003601f168201915b5050505050905090565b600260085414156119b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119a990614876565b60405180910390fd5b60026008819055506000811180156119cb575060648111155b611a0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0190614856565b60405180910390fd5b600a54611a27611a18610c66565b83612e7890919063ffffffff16565b1115611a68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5f90614656565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16611a87611899565b73ffffffffffffffffffffffffffffffffffffffff161480611abd5750611ab981600954612e8e90919063ffffffff16565b3410155b611afc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611af390614676565b60405180910390fd5b6000341115611c0d57611b0d611899565b73ffffffffffffffffffffffffffffffffffffffff166108fc611b4f601054611b4160125434612e8e90919063ffffffff16565b612ea490919063ffffffff16565b9081150290604051600060405180830381858888f19350505050158015611b7a573d6000803e3d6000fd5b50600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc611be0601054611bd260115434612e8e90919063ffffffff16565b612ea490919063ffffffff16565b9081150290604051600060405180830381858888f19350505050158015611c0b573d6000803e3d6000fd5b505b611c173382612eba565b50600160088190555050565b611c2b612817565b73ffffffffffffffffffffffffffffffffffffffff16611c49611899565b73ffffffffffffffffffffffffffffffffffffffff1614611c9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c96906146d6565b60405180910390fd5b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b158015611d0757600080fd5b505afa158015611d1b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d3f9190613c34565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611dac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611da3906145b6565b60405180910390fd5b80600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff167fd71a785e6a17cb0adfab30204e78a85411c5ef1c18714f35966f1664f890408160405160405180910390a250565b611e3b612817565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611ea9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ea090614716565b60405180910390fd5b8060066000611eb6612817565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611f63612817565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611fa891906144d9565b60405180910390a35050565b6000600c54905090565b611fc98484846128d1565b611fd58484848461310e565b612014576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161200b906147b6565b60405180910390fd5b50505050565b612022612817565b73ffffffffffffffffffffffffffffffffffffffff16612040611899565b73ffffffffffffffffffffffffffffffffffffffff1614612096576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208d906146d6565b60405180910390fd5b80600d819055507fd42ac6ec13f1fff9e4589dda4dfc42edad65acb15194635771b11d3e108cdae3816040516120cc91906148b6565b60405180910390a150565b6000600954905090565b60606120ec8261280a565b61212b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612122906146f6565b60405180910390fd5b60006121356132a5565b905060008151116121555760405180602001604052806000815250612180565b8061215f84613337565b604051602001612170929190614421565b6040516020818303038152906040525b915050919050565b612190612817565b73ffffffffffffffffffffffffffffffffffffffff166121ae611899565b73ffffffffffffffffffffffffffffffffffffffff1614612204576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121fb906146d6565b60405180910390fd5b6001600b60006101000a81548160ff0219169083151502179055507f696ca93f2d646dcbf31ca7a85da7f825bd3796a6d7baa7321166e324bd25f4db600160405161224f91906144d9565b60405180910390a1565b612261612817565b73ffffffffffffffffffffffffffffffffffffffff1661227f611899565b73ffffffffffffffffffffffffffffffffffffffff16146122d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122cc906146d6565b60405180910390fd5b6000600b60006101000a81548160ff0219169083151502179055507f696ca93f2d646dcbf31ca7a85da7f825bd3796a6d7baa7321166e324bd25f4db600060405161232091906144d9565b60405180910390a1565b606060006123366132a5565b905060008151116123565760405180602001604052806000815250612377565b806040516020016123679190614450565b6040516020818303038152906040525b91505090565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b612419612817565b73ffffffffffffffffffffffffffffffffffffffff16612437611899565b73ffffffffffffffffffffffffffffffffffffffff161461248d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612484906146d6565b60405180910390fd5b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156124f557600080fd5b505afa158015612509573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061252d9190613c34565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461259a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612591906145b6565b60405180910390fd5b80600e90805190602001906125b0929190613976565b507f7978693abd0b21e74ac988b69d39920de613f19cfbd49da4171f223a25c76633816040516125e091906144f4565b60405180910390a150565b6125f3612817565b73ffffffffffffffffffffffffffffffffffffffff16612611611899565b73ffffffffffffffffffffffffffffffffffffffff1614612667576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161265e906146d6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156126d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126ce90614556565b60405180910390fd5b6126e08161302a565b50565b6126eb612817565b73ffffffffffffffffffffffffffffffffffffffff16612709611899565b73ffffffffffffffffffffffffffffffffffffffff161461275f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612756906146d6565b60405180910390fd5b80600c819055507fcc2cb9c93bdd0107c2409596dd628888b57746cf7868d4e44e4d92c9d40392068160405161279591906148b6565b60405180910390a150565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000805482109050919050565b600033905090565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006128dc82612ecf565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16612903612817565b73ffffffffffffffffffffffffffffffffffffffff16148061295f5750612928612817565b73ffffffffffffffffffffffffffffffffffffffff1661294784610ac8565b73ffffffffffffffffffffffffffffffffffffffff16145b8061297b575061297a8260000151612975612817565b61237d565b5b9050806129bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129b490614736565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614612a2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a26906146b6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612a9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a96906145f6565b60405180910390fd5b612aac8585856001613498565b612abc600084846000015161281f565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160392506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060405180604001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050506000600184612cc29190614a84565b9050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612e0857612d388161280a565b15612e07576040518060400160405280846000015173ffffffffffffffffffffffffffffffffffffffff168152602001846020015167ffffffffffffffff168152506003600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050505b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612e70868686600161349e565b505050505050565b60008183612e869190614a84565b905092915050565b60008183612e9c9190614b0b565b905092915050565b60008183612eb29190614ada565b905092915050565b6000612ec683836130f0565b81905092915050565b612ed76139fc565b612ee08261280a565b612f1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f1690614576565b60405180910390fd5b60008290505b6000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614613011578092505050613025565b50808061301d90614c6b565b915050612f25565b919050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61310a8282604051806020016040528060008152506134a4565b5050565b600061312f8473ffffffffffffffffffffffffffffffffffffffff16613963565b15613298578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613158612817565b8786866040518563ffffffff1660e01b815260040161317a949392919061448d565b602060405180830381600087803b15801561319457600080fd5b505af19250505080156131c557506040513d601f19601f820116820180604052508101906131c29190613e71565b60015b613248573d80600081146131f5576040519150601f19603f3d011682016040523d82523d6000602084013e6131fa565b606091505b50600081511415613240576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613237906147b6565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061329d565b600190505b949350505050565b6060600e80546132b490614c95565b80601f01602080910402602001604051908101604052809291908181526020018280546132e090614c95565b801561332d5780601f106133025761010080835404028352916020019161332d565b820191906000526020600020905b81548152906001019060200180831161331057829003601f168201915b5050505050905090565b6060600082141561337f576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613493565b600082905060005b600082146133b157808061339a90614cf8565b915050600a826133aa9190614ada565b9150613387565b60008167ffffffffffffffff8111156133cd576133cc614e2e565b5b6040519080825280601f01601f1916602001820160405280156133ff5781602001600182028036833780820191505090505b5090505b6000851461348c576001826134189190614b65565b9150600a856134279190614d41565b60306134339190614a84565b60f81b81838151811061344957613448614dff565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856134859190614ada565b9450613403565b8093505050505b919050565b50505050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561351a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613511906147f6565b60405180910390fd5b6135238161280a565b15613563576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161355a906147d6565b60405180910390fd5b600083116135a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161359d90614796565b60405180910390fd5b6135b36000858386613498565b6000600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681525050905060405180604001604052808583600001516136b09190614a3e565b6fffffffffffffffffffffffffffffffff1681526020018583602001516136d79190614a3e565b6fffffffffffffffffffffffffffffffff16815250600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555090505060405180604001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600082905060005b8581101561394657818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46138e6600088848861310e565b613925576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161391c906147b6565b60405180910390fd5b818061393090614cf8565b925050808061393e90614cf8565b915050613875565b508060008190555061395b600087858861349e565b505050505050565b600080823b905060008111915050919050565b82805461398290614c95565b90600052602060002090601f0160209004810192826139a457600085556139eb565b82601f106139bd57805160ff19168380011785556139eb565b828001600101855582156139eb579182015b828111156139ea5782518255916020019190600101906139cf565b5b5090506139f89190613a36565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b80821115613a4f576000816000905550600101613a37565b5090565b6000613a66613a6184614999565b614974565b905082815260208101848484011115613a8257613a81614e6c565b5b613a8d848285614c29565b509392505050565b6000613aa8613aa3846149ca565b614974565b905082815260208101848484011115613ac457613ac3614e6c565b5b613acf848285614c29565b509392505050565b600081359050613ae68161562f565b92915050565b600081519050613afb8161562f565b92915050565b60008083601f840112613b1757613b16614e62565b5b8235905067ffffffffffffffff811115613b3457613b33614e5d565b5b602083019150836020820283011115613b5057613b4f614e67565b5b9250929050565b600081359050613b6681615646565b92915050565b600081359050613b7b8161565d565b92915050565b600081519050613b908161565d565b92915050565b600082601f830112613bab57613baa614e62565b5b8135613bbb848260208601613a53565b91505092915050565b600082601f830112613bd957613bd8614e62565b5b8135613be9848260208601613a95565b91505092915050565b600081359050613c0181615674565b92915050565b600060208284031215613c1d57613c1c614e76565b5b6000613c2b84828501613ad7565b91505092915050565b600060208284031215613c4a57613c49614e76565b5b6000613c5884828501613aec565b91505092915050565b60008060408385031215613c7857613c77614e76565b5b6000613c8685828601613ad7565b9250506020613c9785828601613ad7565b9150509250929050565b600080600060608486031215613cba57613cb9614e76565b5b6000613cc886828701613ad7565b9350506020613cd986828701613ad7565b9250506040613cea86828701613bf2565b9150509250925092565b60008060008060808587031215613d0e57613d0d614e76565b5b6000613d1c87828801613ad7565b9450506020613d2d87828801613ad7565b9350506040613d3e87828801613bf2565b925050606085013567ffffffffffffffff811115613d5f57613d5e614e71565b5b613d6b87828801613b96565b91505092959194509250565b60008060408385031215613d8e57613d8d614e76565b5b6000613d9c85828601613ad7565b9250506020613dad85828601613b57565b9150509250929050565b60008060408385031215613dce57613dcd614e76565b5b6000613ddc85828601613ad7565b9250506020613ded85828601613bf2565b9150509250929050565b60008060208385031215613e0e57613e0d614e76565b5b600083013567ffffffffffffffff811115613e2c57613e2b614e71565b5b613e3885828601613b01565b92509250509250929050565b600060208284031215613e5a57613e59614e76565b5b6000613e6884828501613b6c565b91505092915050565b600060208284031215613e8757613e86614e76565b5b6000613e9584828501613b81565b91505092915050565b600060208284031215613eb457613eb3614e76565b5b600082013567ffffffffffffffff811115613ed257613ed1614e71565b5b613ede84828501613bc4565b91505092915050565b600060208284031215613efd57613efc614e76565b5b6000613f0b84828501613bf2565b91505092915050565b613f1d81614b99565b82525050565b613f2c81614bab565b82525050565b6000613f3d826149fb565b613f478185614a11565b9350613f57818560208601614c38565b613f6081614e7b565b840191505092915050565b6000613f7682614a06565b613f808185614a22565b9350613f90818560208601614c38565b613f9981614e7b565b840191505092915050565b6000613faf82614a06565b613fb98185614a33565b9350613fc9818560208601614c38565b80840191505092915050565b6000613fe2602283614a22565b9150613fed82614e8c565b604082019050919050565b6000614005601e83614a22565b915061401082614edb565b602082019050919050565b6000614028602683614a22565b915061403382614f04565b604082019050919050565b600061404b602a83614a22565b915061405682614f53565b604082019050919050565b600061406e601a83614a22565b915061407982614fa2565b602082019050919050565b6000614091601383614a22565b915061409c82614fcb565b602082019050919050565b60006140b4600e83614a33565b91506140bf82614ff4565b600e82019050919050565b60006140d7602383614a22565b91506140e28261501d565b604082019050919050565b60006140fa602583614a22565b91506141058261506c565b604082019050919050565b600061411d601883614a22565b9150614128826150bb565b602082019050919050565b6000614140603983614a22565b915061414b826150e4565b604082019050919050565b6000614163601283614a22565b915061416e82615133565b602082019050919050565b6000614186602383614a22565b91506141918261515c565b604082019050919050565b60006141a9602b83614a22565b91506141b4826151ab565b604082019050919050565b60006141cc602683614a22565b91506141d7826151fa565b604082019050919050565b60006141ef602083614a22565b91506141fa82615249565b602082019050919050565b6000614212602f83614a22565b915061421d82615272565b604082019050919050565b6000614235601a83614a22565b9150614240826152c1565b602082019050919050565b6000614258603283614a22565b9150614263826152ea565b604082019050919050565b600061427b601b83614a22565b915061428682615339565b602082019050919050565b600061429e602283614a22565b91506142a982615362565b604082019050919050565b60006142c1602383614a22565b91506142cc826153b1565b604082019050919050565b60006142e4603383614a22565b91506142ef82615400565b604082019050919050565b6000614307601d83614a22565b91506143128261544f565b602082019050919050565b600061432a602183614a22565b915061433582615478565b604082019050919050565b600061434d600d83614a22565b9150614358826154c7565b602082019050919050565b6000614370602e83614a22565b915061437b826154f0565b604082019050919050565b6000614393602883614a22565b915061439e8261553f565b604082019050919050565b60006143b6601f83614a22565b91506143c18261558e565b602082019050919050565b60006143d9600d83614a33565b91506143e4826155b7565b600d82019050919050565b60006143fc602d83614a22565b9150614407826155e0565b604082019050919050565b61441b81614c1f565b82525050565b600061442d8285613fa4565b91506144398284613fa4565b9150614444826140a7565b91508190509392505050565b600061445c8284613fa4565b9150614467826143cc565b915081905092915050565b60006020820190506144876000830184613f14565b92915050565b60006080820190506144a26000830187613f14565b6144af6020830186613f14565b6144bc6040830185614412565b81810360608301526144ce8184613f32565b905095945050505050565b60006020820190506144ee6000830184613f23565b92915050565b6000602082019050818103600083015261450e8184613f6b565b905092915050565b6000602082019050818103600083015261452f81613fd5565b9050919050565b6000602082019050818103600083015261454f81613ff8565b9050919050565b6000602082019050818103600083015261456f8161401b565b9050919050565b6000602082019050818103600083015261458f8161403e565b9050919050565b600060208201905081810360008301526145af81614061565b9050919050565b600060208201905081810360008301526145cf81614084565b9050919050565b600060208201905081810360008301526145ef816140ca565b9050919050565b6000602082019050818103600083015261460f816140ed565b9050919050565b6000602082019050818103600083015261462f81614110565b9050919050565b6000602082019050818103600083015261464f81614133565b9050919050565b6000602082019050818103600083015261466f81614156565b9050919050565b6000602082019050818103600083015261468f81614179565b9050919050565b600060208201905081810360008301526146af8161419c565b9050919050565b600060208201905081810360008301526146cf816141bf565b9050919050565b600060208201905081810360008301526146ef816141e2565b9050919050565b6000602082019050818103600083015261470f81614205565b9050919050565b6000602082019050818103600083015261472f81614228565b9050919050565b6000602082019050818103600083015261474f8161424b565b9050919050565b6000602082019050818103600083015261476f8161426e565b9050919050565b6000602082019050818103600083015261478f81614291565b9050919050565b600060208201905081810360008301526147af816142b4565b9050919050565b600060208201905081810360008301526147cf816142d7565b9050919050565b600060208201905081810360008301526147ef816142fa565b9050919050565b6000602082019050818103600083015261480f8161431d565b9050919050565b6000602082019050818103600083015261482f81614340565b9050919050565b6000602082019050818103600083015261484f81614363565b9050919050565b6000602082019050818103600083015261486f81614386565b9050919050565b6000602082019050818103600083015261488f816143a9565b9050919050565b600060208201905081810360008301526148af816143ef565b9050919050565b60006020820190506148cb6000830184614412565b92915050565b6000610140820190506148e7600083018d614412565b6148f4602083018c613f14565b614901604083018b613f23565b61490e606083018a614412565b61491b6080830189614412565b61492860a0830188614412565b61493560c0830187614412565b61494260e0830186614412565b614950610100830185613f14565b8181036101208301526149638184613f6b565b90509b9a5050505050505050505050565b600061497e61498f565b905061498a8282614cc7565b919050565b6000604051905090565b600067ffffffffffffffff8211156149b4576149b3614e2e565b5b6149bd82614e7b565b9050602081019050919050565b600067ffffffffffffffff8211156149e5576149e4614e2e565b5b6149ee82614e7b565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614a4982614be3565b9150614a5483614be3565b9250826fffffffffffffffffffffffffffffffff03821115614a7957614a78614d72565b5b828201905092915050565b6000614a8f82614c1f565b9150614a9a83614c1f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614acf57614ace614d72565b5b828201905092915050565b6000614ae582614c1f565b9150614af083614c1f565b925082614b0057614aff614da1565b5b828204905092915050565b6000614b1682614c1f565b9150614b2183614c1f565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614b5a57614b59614d72565b5b828202905092915050565b6000614b7082614c1f565b9150614b7b83614c1f565b925082821015614b8e57614b8d614d72565b5b828203905092915050565b6000614ba482614bff565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614c56578082015181840152602081019050614c3b565b83811115614c65576000848401525b50505050565b6000614c7682614c1f565b91506000821415614c8a57614c89614d72565b5b600182039050919050565b60006002820490506001821680614cad57607f821691505b60208210811415614cc157614cc0614dd0565b5b50919050565b614cd082614e7b565b810181811067ffffffffffffffff82111715614cef57614cee614e2e565b5b80604052505050565b6000614d0382614c1f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614d3657614d35614d72565b5b600182019050919050565b6000614d4c82614c1f565b9150614d5783614c1f565b925082614d6757614d66614da1565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f43616e74206d696e74206d6f7265207468616e206d696e74206c696d69740000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b7f4d757374206d696e74206174206c65617374203120746f6b656e000000000000600082015250565b7f43616c6c657220756e617574686f72697a656400000000000000000000000000600082015250565b7f2f6d657461646174612e6a736f6e000000000000000000000000000000000000600082015250565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f4578636565646564206d6178206672656520737570706c790000000000000000600082015250565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b7f45786365656473206d617820737570706c790000000000000000000000000000600082015250565b7f45746865722076616c75652073656e742069732062656c6f772074686520707260008201527f6963650000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f4d697373696e6720726563697069656e74206164647265737365730000000000600082015250565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207175616e74697479206d7573742062652067726561746560008201527f7220300000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b7f455243373231413a20746f6b656e20616c7265616479206d696e746564000000600082015250565b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f4d696e742064697361626c656400000000000000000000000000000000000000600082015250565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b7f596f752063616e206d696e74206d696e696d756d20312c206d6178696d756d2060008201527f313030204e465473000000000000000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f6d657461646174612e6a736f6e00000000000000000000000000000000000000600082015250565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b61563881614b99565b811461564357600080fd5b50565b61564f81614bab565b811461565a57600080fd5b50565b61566681614bb7565b811461567157600080fd5b50565b61567d81614c1f565b811461568857600080fd5b5056fea264697066735822122058e0638a12460b1ca8db8d727985c47092422590731b71e93bc657ad2be6e73664736f6c63430008070033

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

00000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000470de4df820000000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000d42696c6c6920546865204361740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034254430000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009d68747470733a2f2f6d696e7474656176326275636b65743134353532352d70726f642e73332e616d617a6f6e6177732e636f6d2f70726f7465637465642f75732d656173742d3125334162366161323731372d343235662d343339362d383566642d6637376636656561393437622f70726f6a656374732f66376239623637352d626538632d346265622d383133312d6236666566376164653264302f000000

-----Decoded View---------------
Arg [0] : tokenName (string): Billi The Cat
Arg [1] : symbol (string): BTC
Arg [2] : cost (uint256): 20000000000000000
Arg [3] : supply (uint256): 5
Arg [4] : baseURL (string): https://mintteav2bucket145525-prod.s3.amazonaws.com/protected/us-east-1%3Ab6aa2717-425f-4396-85fd-f77f6eea947b/projects/f7b9b675-be8c-4beb-8131-b6fef7ade2d0/
Arg [5] : enablePublicMinting (bool): True

-----Encoded View---------------
16 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [2] : 00000000000000000000000000000000000000000000000000470de4df820000
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000140
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [6] : 000000000000000000000000000000000000000000000000000000000000000d
Arg [7] : 42696c6c69205468652043617400000000000000000000000000000000000000
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [9] : 4254430000000000000000000000000000000000000000000000000000000000
Arg [10] : 000000000000000000000000000000000000000000000000000000000000009d
Arg [11] : 68747470733a2f2f6d696e7474656176326275636b65743134353532352d7072
Arg [12] : 6f642e73332e616d617a6f6e6177732e636f6d2f70726f7465637465642f7573
Arg [13] : 2d656173742d3125334162366161323731372d343235662d343339362d383566
Arg [14] : 642d6637376636656561393437622f70726f6a656374732f6637623962363735
Arg [15] : 2d626538632d346265622d383133312d6236666566376164653264302f000000


Deployed Bytecode Sourcemap

49134:7554:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37085:372;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38712:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40273:214;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39794:413;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35526:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55209:285;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;41149:162;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36190:823;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51416:814;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55946:92;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41382:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53379:109;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55675:83;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55762:90;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35703:187;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38521:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53586:113;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37521:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15617:94;;;;;;;;;;;;;:::i;:::-;;52310:401;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55021:184;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14966:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55498:92;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38881:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50662:624;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54471:241;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40559:288;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55856:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41630:355;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54031:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55594:77;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56141:337;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52858:131;;;;;;;;;;;;;:::i;:::-;;53137:134;;;;;;;;;;;;;:::i;:::-;;56482:203;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40918:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54205:220;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;15866:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53802:116;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37085:372;37187:4;37239:25;37224:40;;;:11;:40;;;;:105;;;;37296:33;37281:48;;;:11;:48;;;;37224:105;:172;;;;37361:35;37346:50;;;:11;:50;;;;37224:172;:225;;;;37413:36;37437:11;37413:23;:36::i;:::-;37224:225;37204:245;;37085:372;;;:::o;38712:100::-;38766:13;38799:5;38792:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38712:100;:::o;40273:214::-;40341:7;40369:16;40377:7;40369;:16::i;:::-;40361:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;40455:15;:24;40471:7;40455:24;;;;;;;;;;;;;;;;;;;;;40448:31;;40273:214;;;:::o;39794:413::-;39867:13;39883:24;39899:7;39883:15;:24::i;:::-;39867:40;;39932:5;39926:11;;:2;:11;;;;39918:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;40027:5;40011:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;40036:37;40053:5;40060:12;:10;:12::i;:::-;40036:16;:37::i;:::-;40011:62;39989:169;;;;;;;;;;;;:::i;:::-;;;;;;;;;40171:28;40180:2;40184:7;40193:5;40171:8;:28::i;:::-;39856:351;39794:413;;:::o;35526:100::-;35579:7;35606:12;;35599:19;;35526:100;:::o;55209:285::-;55250:7;55259;55268:4;55274:7;55283;55292;55301;55310;55319;55328:13;55357:7;;55366:13;;;;;;;;;;;55381:20;;;;;;;;;;;55403:9;;55414:10;;55426:13;:11;:13::i;:::-;55441:11;;55454:14;;55470:7;:5;:7::i;:::-;55479:8;55349:139;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55209:285;;;;;;;;;;:::o;41149:162::-;41275:28;41285:4;41291:2;41295:7;41275:9;:28::i;:::-;41149:162;;;:::o;36190:823::-;36279:7;36315:16;36325:5;36315:9;:16::i;:::-;36307:5;:24;36299:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;36381:22;36406:13;:11;:13::i;:::-;36381:38;;36430:19;36464:25;36518:9;36513:426;36537:14;36533:1;:18;36513:426;;;36573:31;36607:11;:14;36619:1;36607:14;;;;;;;;;;;36573:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36666:1;36640:28;;:9;:14;;;:28;;;36636:103;;36709:9;:14;;;36689:34;;36636:103;36778:5;36757:26;;:17;:26;;;36753:175;;;36823:5;36808:11;:20;36804:77;;;36860:1;36853:8;;;;;;;;;36804:77;36899:13;;;;;:::i;:::-;;;;36753:175;36558:381;36553:3;;;;;:::i;:::-;;;;36513:426;;;;36949:56;;;;;;;;;;:::i;:::-;;;;;;;;36190:823;;;;;:::o;51416:814::-;1747:1;2343:7;;:19;;2335:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1747:1;2476:7;:18;;;;51536:1:::1;51518:10;;:17;;:19;51510:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;51603:1;51583:10;;:17;;:21;:49;;;;;51629:3;51608:10;;:17;;:24;;51583:49;51575:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;51732:10;;51692:36;51714:13;:11;:13::i;:::-;51692:10;;:17;;:21;;:36;;;;:::i;:::-;:50;;51684:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;51791:10;51780:21;;:7;:5;:7::i;:::-;:21;;;:70;;;;51818:32;51832:10;;:17;;51818:9;;:13;;:32;;;;:::i;:::-;51805:9;:45;;51780:70;51772:130;;;;;;;;;;;;:::i;:::-;;;;;;;;;51930:1;51918:9;:13;51915:216;;;51949:7;:5;:7::i;:::-;51941:25;;:82;51967:55;52006:15;;51967:34;51981:19;;51967:9;:13;;:34;;;;:::i;:::-;:38;;:55;;;;:::i;:::-;51941:82;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;52040:13;;;;;;;;;;;52032:31;;:91;52064:58;52106:15;;52064:37;52078:22;;52064:9;:13;;:37;;;;:::i;:::-;:41;;:58;;;;:::i;:::-;52032:91;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;51915:216;52147:6;52143:82;52159:10;;:17;;52157:1;:19;52143:82;;;52193:23;52199:10;;52210:1;52199:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;52214:1;52193:5;:23::i;:::-;;52178:3;;;;;:::i;:::-;;;;52143:82;;;;1703:1:::0;2655:7;:22;;;;51416:814;;:::o;55946:92::-;55995:7;56018:14;;56011:21;;55946:92;:::o;41382:177::-;41512:39;41529:4;41535:2;41539:7;41512:39;;;;;;;;;;;;:16;:39::i;:::-;41382:177;;;:::o;53379:109::-;15197:12;:10;:12::i;:::-;15186:23;;:7;:5;:7::i;:::-;:23;;;15178:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53445:4:::1;53433:9;:16;;;;53461:21;53477:4;53461:21;;;;;;:::i;:::-;;;;;;;;53379:109:::0;:::o;55675:83::-;55720:7;55742:10;;55735:17;;55675:83;:::o;55762:90::-;55811:7;55833:13;:11;:13::i;:::-;55826:20;;55762:90;:::o;35703:187::-;35770:7;35806:13;:11;:13::i;:::-;35798:5;:21;35790:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;35877:5;35870:12;;35703:187;;;:::o;38521:124::-;38585:7;38612:20;38624:7;38612:11;:20::i;:::-;:25;;;38605:32;;38521:124;;;:::o;53586:113::-;15197:12;:10;:12::i;:::-;15186:23;;:7;:5;:7::i;:::-;:23;;;15178:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53657:3:::1;53644:10;:16;;;;53672:21;53689:3;53672:21;;;;;;:::i;:::-;;;;;;;;53586:113:::0;:::o;37521:221::-;37585:7;37630:1;37613:19;;:5;:19;;;;37605:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;37706:12;:19;37719:5;37706:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;37698:36;;37691:43;;37521:221;;;:::o;15617:94::-;15197:12;:10;:12::i;:::-;15186:23;;:7;:5;:7::i;:::-;:23;;;15178:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;15682:21:::1;15700:1;15682:9;:21::i;:::-;15617:94::o:0;52310:401::-;1747:1;2343:7;;:19;;2335:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1747:1;2476:7;:18;;;;52408:10:::1;52397:21;;:7;:5;:7::i;:::-;:21;;;:45;;;;52422:20;;;;;;;;;;;52397:45;52389:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;52500:11;;52491:5;52475:13;:11;:13::i;:::-;:21;;;;:::i;:::-;:36;;52467:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;52564:14;;52555:5;:23;;52547:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;52636:1;52628:5;:9;52620:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;52677:28;52687:10;52699:5;52677:9;:28::i;:::-;1703:1:::0;2655:7;:22;;;;52310:401;:::o;55021:184::-;55078:4;55098:20;;;;;;;;;;;:60;;;;;55147:11;;55138:5;55122:13;:11;:13::i;:::-;:21;;;;:::i;:::-;:36;;55098:60;:87;;;;;55171:14;;55162:5;:23;;55098:87;:100;;;;;55197:1;55189:5;:9;55098:100;55090:109;;55021:184;;;:::o;14966:87::-;15012:7;15039:6;;;;;;;;;;;15032:13;;14966:87;:::o;55498:92::-;55544:4;55564:20;;;;;;;;;;;55557:27;;55498:92;:::o;38881:104::-;38937:13;38970:7;38963:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38881:104;:::o;50662:624::-;1747:1;2343:7;;:19;;2335:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1747:1;2476:7;:18;;;;50756:1:::1;50748:5;:9;:25;;;;;50770:3;50761:5;:12;;50748:25;50740:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;50861:10;;50833:24;50843:13;:11;:13::i;:::-;50833:5;:9;;:24;;;;:::i;:::-;:38;;50825:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;50920:10;50909:21;;:7;:5;:7::i;:::-;:21;;;:58;;;;50947:20;50961:5;50947:9;;:13;;:20;;;;:::i;:::-;50934:9;:33;;50909:58;50901:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;51047:1;51035:9;:13;51032:216;;;51066:7;:5;:7::i;:::-;51058:25;;:82;51084:55;51123:15;;51084:34;51098:19;;51084:9;:13;;:34;;;;:::i;:::-;:38;;:55;;;;:::i;:::-;51058:82;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;51157:13;;;;;;;;;;;51149:31;;:91;51181:58;51223:15;;51181:37;51195:22;;51181:9;:13;;:37;;;;:::i;:::-;:41;;:58;;;;:::i;:::-;51149:91;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;51032:216;51256:24;51262:10;51274:5;51256;:24::i;:::-;;1703:1:::0;2655:7;:22;;;;50662:624;:::o;54471:241::-;15197:12;:10;:12::i;:::-;15186:23;;:7;:5;:7::i;:::-;:23;;;15178:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54578:13:::1;;;;;;;;;;;54570:28;;;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54556:44;;:10;:44;;;54548:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;54647:10;54631:13;;:26;;;;;;;;;;;;;;;;;;54695:10;54669:37;;;;;;;;;;;;54471:241:::0;:::o;40559:288::-;40666:12;:10;:12::i;:::-;40654:24;;:8;:24;;;;40646:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;40767:8;40722:18;:32;40741:12;:10;:12::i;:::-;40722:32;;;;;;;;;;;;;;;:42;40755:8;40722:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;40820:8;40791:48;;40806:12;:10;:12::i;:::-;40791:48;;;40830:8;40791:48;;;;;;:::i;:::-;;;;;;;;40559:288;;:::o;55856:86::-;55902:7;55925:11;;55918:18;;55856:86;:::o;41630:355::-;41789:28;41799:4;41805:2;41809:7;41789:9;:28::i;:::-;41850:48;41873:4;41879:2;41883:7;41892:5;41850:22;:48::i;:::-;41828:149;;;;;;;;;;;;:::i;:::-;;;;;;;;;41630:355;;;;:::o;54031:125::-;15197:12;:10;:12::i;:::-;15186:23;;:7;:5;:7::i;:::-;:23;;;15178:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54110:3:::1;54093:14;:20;;;;54125:25;54146:3;54125:25;;;;;;:::i;:::-;;;;;;;;54031:125:::0;:::o;55594:77::-;55634:7;55656:9;;55649:16;;55594:77;:::o;56141:337::-;56206:13;56236:16;56244:7;56236;:16::i;:::-;56228:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;56313:21;56337:10;:8;:10::i;:::-;56313:34;;56385:1;56367:7;56361:21;:25;:111;;;;;;;;;;;;;;;;;56413:7;56422:25;56439:7;56422:16;:25::i;:::-;56396:70;;;;;;;;;:::i;:::-;;;;;;;;;;;;;56361:111;56354:118;;;56141:337;;;:::o;52858:131::-;15197:12;:10;:12::i;:::-;15186:23;;:7;:5;:7::i;:::-;:23;;;15178:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52938:4:::1;52915:20;;:27;;;;;;;;;;;;;;;;;;52954:29;52978:4;52954:29;;;;;;:::i;:::-;;;;;;;;52858:131::o:0;53137:134::-;15197:12;:10;:12::i;:::-;15186:23;;:7;:5;:7::i;:::-;:23;;;15178:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53218:5:::1;53195:20;;:28;;;;;;;;;;;;;;;;;;53235:30;53259:5;53235:30;;;;;;:::i;:::-;;;;;;;;53137:134::o:0;56482:203::-;56526:13;56548:21;56572:10;:8;:10::i;:::-;56548:34;;56620:1;56602:7;56596:21;:25;:83;;;;;;;;;;;;;;;;;56648:7;56631:42;;;;;;;;:::i;:::-;;;;;;;;;;;;;56596:83;56589:90;;;56482:203;:::o;40918:164::-;41015:4;41039:18;:25;41058:5;41039:25;;;;;;;;;;;;;;;:35;41065:8;41039:35;;;;;;;;;;;;;;;;;;;;;;;;;41032:42;;40918:164;;;;:::o;54205:220::-;15197:12;:10;:12::i;:::-;15186:23;;:7;:5;:7::i;:::-;:23;;;15178:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54307:13:::1;;;;;;;;;;;54299:28;;;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54285:44;;:10;:44;;;54277:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;54371:10;54360:8;:21;;;;;;;;;;;;:::i;:::-;;54393:26;54408:10;54393:26;;;;;;:::i;:::-;;;;;;;;54205:220:::0;:::o;15866:192::-;15197:12;:10;:12::i;:::-;15186:23;;:7;:5;:7::i;:::-;:23;;;15178:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;15975:1:::1;15955:22;;:8;:22;;;;15947:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;16031:19;16041:8;16031:9;:19::i;:::-;15866:192:::0;:::o;53802:116::-;15197:12;:10;:12::i;:::-;15186:23;;:7;:5;:7::i;:::-;:23;;;15178:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53875:3:::1;53861:11;:17;;;;53890:22;53908:3;53890:22;;;;;;:::i;:::-;;;;;;;;53802:116:::0;:::o;26952:157::-;27037:4;27076:25;27061:40;;;:11;:40;;;;27054:47;;26952:157;;;:::o;42240:111::-;42297:4;42331:12;;42321:7;:22;42314:29;;42240:111;;;:::o;13754:98::-;13807:7;13834:10;13827:17;;13754:98;:::o;46284:196::-;46426:2;46399:15;:24;46415:7;46399:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;46464:7;46460:2;46444:28;;46453:5;46444:28;;;;;;;;;;;;46284:196;;;:::o;44383:1783::-;44498:35;44536:20;44548:7;44536:11;:20::i;:::-;44498:58;;44569:22;44611:13;:18;;;44595:34;;:12;:10;:12::i;:::-;:34;;;:87;;;;44670:12;:10;:12::i;:::-;44646:36;;:20;44658:7;44646:11;:20::i;:::-;:36;;;44595:87;:154;;;;44699:50;44716:13;:18;;;44736:12;:10;:12::i;:::-;44699:16;:50::i;:::-;44595:154;44569:181;;44771:17;44763:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;44886:4;44864:26;;:13;:18;;;:26;;;44856:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;44966:1;44952:16;;:2;:16;;;;44944:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;45023:43;45045:4;45051:2;45055:7;45064:1;45023:21;:43::i;:::-;45131:49;45148:1;45152:7;45161:13;:18;;;45131:8;:49::i;:::-;45415:1;45385:12;:18;45398:4;45385:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45459:1;45431:12;:16;45444:2;45431:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45507:43;;;;;;;;45522:2;45507:43;;;;;;45533:15;45507:43;;;;;45484:11;:20;45496:7;45484:20;;;;;;;;;;;:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45790:19;45822:1;45812:7;:11;;;;:::i;:::-;45790:33;;45879:1;45838:43;;:11;:24;45850:11;45838:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;45834:227;;;45902:20;45910:11;45902:7;:20::i;:::-;45898:152;;;45970:64;;;;;;;;45985:13;:18;;;45970:64;;;;;;46005:13;:28;;;45970:64;;;;;45943:11;:24;45955:11;45943:24;;;;;;;;;;;:91;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45898:152;45834:227;46097:7;46093:2;46078:27;;46087:4;46078:27;;;;;;;;;;;;46116:42;46137:4;46143:2;46147:7;46156:1;46116:20;:42::i;:::-;44487:1679;;;44383:1783;;;:::o;5484:98::-;5542:7;5573:1;5569;:5;;;;:::i;:::-;5562:12;;5484:98;;;;:::o;6222:::-;6280:7;6311:1;6307;:5;;;;:::i;:::-;6300:12;;6222:98;;;;:::o;6621:::-;6679:7;6710:1;6706;:5;;;;:::i;:::-;6699:12;;6621:98;;;;:::o;54848:130::-;54916:7;54931:20;54941:2;54945:5;54931:9;:20::i;:::-;54967:5;54960:12;;54848:130;;;;:::o;37987:472::-;38048:21;;:::i;:::-;38090:16;38098:7;38090;:16::i;:::-;38082:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;38171:12;38186:7;38171:22;;38166:216;38220:31;38254:11;:17;38266:4;38254:17;;;;;;;;;;;38220:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38316:1;38290:28;;:9;:14;;;:28;;;38286:85;;38346:9;38339:16;;;;;;38286:85;38205:177;38197:6;;;;;:::i;:::-;;;;38166:216;;37987:472;;;;:::o;16066:173::-;16122:16;16141:6;;;;;;;;;;;16122:25;;16167:8;16158:6;;:17;;;;;;;;;;;;;;;;;;16222:8;16191:40;;16212:8;16191:40;;;;;;;;;;;;16111:128;16066:173;:::o;42359:104::-;42428:27;42438:2;42442:8;42428:27;;;;;;;;;;;;:9;:27::i;:::-;42359:104;;:::o;47045:804::-;47200:4;47221:15;:2;:13;;;:15::i;:::-;47217:625;;;47273:2;47257:36;;;47294:12;:10;:12::i;:::-;47308:4;47314:7;47323:5;47257:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;47253:534;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47520:1;47503:6;:13;:18;47499:273;;;47546:61;;;;;;;;;;:::i;:::-;;;;;;;;47499:273;47722:6;47716:13;47707:6;47703:2;47699:15;47692:38;47253:534;47390:45;;;47380:55;;;:6;:55;;;;47373:62;;;;;47217:625;47826:4;47819:11;;47045:804;;;;;;;:::o;56042:95::-;56094:13;56123:8;56116:15;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56042:95;:::o;11370:723::-;11426:13;11656:1;11647:5;:10;11643:53;;;11674:10;;;;;;;;;;;;;;;;;;;;;11643:53;11706:12;11721:5;11706:20;;11737:14;11762:78;11777:1;11769:4;:9;11762:78;;11795:8;;;;;:::i;:::-;;;;11826:2;11818:10;;;;;:::i;:::-;;;11762:78;;;11850:19;11882:6;11872:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11850:39;;11900:154;11916:1;11907:5;:10;11900:154;;11944:1;11934:11;;;;;:::i;:::-;;;12011:2;12003:5;:10;;;;:::i;:::-;11990:2;:24;;;;:::i;:::-;11977:39;;11960:6;11967;11960:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;12040:2;12031:11;;;;;:::i;:::-;;;11900:154;;;12078:6;12064:21;;;;;11370:723;;;;:::o;48337:159::-;;;;;:::o;48908:158::-;;;;;:::o;42740:1389::-;42863:20;42886:12;;42863:35;;42931:1;42917:16;;:2;:16;;;;42909:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;43116:21;43124:12;43116:7;:21::i;:::-;43115:22;43107:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;43201:1;43190:8;:12;43182:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;43255:61;43285:1;43289:2;43293:12;43307:8;43255:21;:61::i;:::-;43329:30;43362:12;:16;43375:2;43362:16;;;;;;;;;;;;;;;43329:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43408:135;;;;;;;;43464:8;43434:11;:19;;;:39;;;;:::i;:::-;43408:135;;;;;;43523:8;43488:11;:24;;;:44;;;;:::i;:::-;43408:135;;;;;43389:12;:16;43402:2;43389:16;;;;;;;;;;;;;;;:154;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43582:43;;;;;;;;43597:2;43582:43;;;;;;43608:15;43582:43;;;;;43554:11;:25;43566:12;43554:25;;;;;;;;;;;:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43638:20;43661:12;43638:35;;43691:9;43686:325;43710:8;43706:1;:12;43686:325;;;43770:12;43766:2;43745:38;;43762:1;43745:38;;;;;;;;;;;;43824:59;43855:1;43859:2;43863:12;43877:5;43824:22;:59::i;:::-;43798:172;;;;;;;;;;;;:::i;:::-;;;;;;;;;43985:14;;;;;:::i;:::-;;;;43720:3;;;;;:::i;:::-;;;;43686:325;;;;44038:12;44023;:27;;;;44061:60;44090:1;44094:2;44098:12;44112:8;44061:20;:60::i;:::-;42852:1277;;;42740:1389;;;:::o;17012:387::-;17072:4;17280:12;17347:7;17335:20;17327:28;;17390:1;17383:4;:8;17376:15;;;17012:387;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;:::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:143::-;1043:5;1074:6;1068:13;1059:22;;1090:33;1117:5;1090:33;:::i;:::-;986:143;;;;:::o;1152:568::-;1225:8;1235:6;1285:3;1278:4;1270:6;1266:17;1262:27;1252:122;;1293:79;;:::i;:::-;1252:122;1406:6;1393:20;1383:30;;1436:18;1428:6;1425:30;1422:117;;;1458:79;;:::i;:::-;1422:117;1572:4;1564:6;1560:17;1548:29;;1626:3;1618:4;1610:6;1606:17;1596:8;1592:32;1589:41;1586:128;;;1633:79;;:::i;:::-;1586:128;1152:568;;;;;:::o;1726:133::-;1769:5;1807:6;1794:20;1785:29;;1823:30;1847:5;1823:30;:::i;:::-;1726:133;;;;:::o;1865:137::-;1910:5;1948:6;1935:20;1926:29;;1964:32;1990:5;1964:32;:::i;:::-;1865:137;;;;:::o;2008:141::-;2064:5;2095:6;2089:13;2080:22;;2111:32;2137:5;2111:32;:::i;:::-;2008:141;;;;:::o;2168:338::-;2223:5;2272:3;2265:4;2257:6;2253:17;2249:27;2239:122;;2280:79;;:::i;:::-;2239:122;2397:6;2384:20;2422:78;2496:3;2488:6;2481:4;2473:6;2469:17;2422:78;:::i;:::-;2413:87;;2229:277;2168:338;;;;:::o;2526:340::-;2582:5;2631:3;2624:4;2616:6;2612:17;2608:27;2598:122;;2639:79;;:::i;:::-;2598:122;2756:6;2743:20;2781:79;2856:3;2848:6;2841:4;2833:6;2829:17;2781:79;:::i;:::-;2772:88;;2588:278;2526:340;;;;:::o;2872:139::-;2918:5;2956:6;2943:20;2934:29;;2972:33;2999:5;2972:33;:::i;:::-;2872:139;;;;:::o;3017:329::-;3076:6;3125:2;3113:9;3104:7;3100:23;3096:32;3093:119;;;3131:79;;:::i;:::-;3093:119;3251:1;3276:53;3321:7;3312:6;3301:9;3297:22;3276:53;:::i;:::-;3266:63;;3222:117;3017:329;;;;:::o;3352:351::-;3422:6;3471:2;3459:9;3450:7;3446:23;3442:32;3439:119;;;3477:79;;:::i;:::-;3439:119;3597:1;3622:64;3678:7;3669:6;3658:9;3654:22;3622:64;:::i;:::-;3612:74;;3568:128;3352:351;;;;:::o;3709:474::-;3777:6;3785;3834:2;3822:9;3813:7;3809:23;3805:32;3802:119;;;3840:79;;:::i;:::-;3802:119;3960:1;3985:53;4030:7;4021:6;4010:9;4006:22;3985:53;:::i;:::-;3975:63;;3931:117;4087:2;4113:53;4158:7;4149:6;4138:9;4134:22;4113:53;:::i;:::-;4103:63;;4058:118;3709:474;;;;;:::o;4189:619::-;4266:6;4274;4282;4331:2;4319:9;4310:7;4306:23;4302:32;4299:119;;;4337:79;;:::i;:::-;4299:119;4457:1;4482:53;4527:7;4518:6;4507:9;4503:22;4482:53;:::i;:::-;4472:63;;4428:117;4584:2;4610:53;4655:7;4646:6;4635:9;4631:22;4610:53;:::i;:::-;4600:63;;4555:118;4712:2;4738:53;4783:7;4774:6;4763:9;4759:22;4738:53;:::i;:::-;4728:63;;4683:118;4189:619;;;;;:::o;4814:943::-;4909:6;4917;4925;4933;4982:3;4970:9;4961:7;4957:23;4953:33;4950:120;;;4989:79;;:::i;:::-;4950:120;5109:1;5134:53;5179:7;5170:6;5159:9;5155:22;5134:53;:::i;:::-;5124:63;;5080:117;5236:2;5262:53;5307:7;5298:6;5287:9;5283:22;5262:53;:::i;:::-;5252:63;;5207:118;5364:2;5390:53;5435:7;5426:6;5415:9;5411:22;5390:53;:::i;:::-;5380:63;;5335:118;5520:2;5509:9;5505:18;5492:32;5551:18;5543:6;5540:30;5537:117;;;5573:79;;:::i;:::-;5537:117;5678:62;5732:7;5723:6;5712:9;5708:22;5678:62;:::i;:::-;5668:72;;5463:287;4814:943;;;;;;;:::o;5763:468::-;5828:6;5836;5885:2;5873:9;5864:7;5860:23;5856:32;5853:119;;;5891:79;;:::i;:::-;5853:119;6011:1;6036:53;6081:7;6072:6;6061:9;6057:22;6036:53;:::i;:::-;6026:63;;5982:117;6138:2;6164:50;6206:7;6197:6;6186:9;6182:22;6164:50;:::i;:::-;6154:60;;6109:115;5763:468;;;;;:::o;6237:474::-;6305:6;6313;6362:2;6350:9;6341:7;6337:23;6333:32;6330:119;;;6368:79;;:::i;:::-;6330:119;6488:1;6513:53;6558:7;6549:6;6538:9;6534:22;6513:53;:::i;:::-;6503:63;;6459:117;6615:2;6641:53;6686:7;6677:6;6666:9;6662:22;6641:53;:::i;:::-;6631:63;;6586:118;6237:474;;;;;:::o;6717:559::-;6803:6;6811;6860:2;6848:9;6839:7;6835:23;6831:32;6828:119;;;6866:79;;:::i;:::-;6828:119;7014:1;7003:9;6999:17;6986:31;7044:18;7036:6;7033:30;7030:117;;;7066:79;;:::i;:::-;7030:117;7179:80;7251:7;7242:6;7231:9;7227:22;7179:80;:::i;:::-;7161:98;;;;6957:312;6717:559;;;;;:::o;7282:327::-;7340:6;7389:2;7377:9;7368:7;7364:23;7360:32;7357:119;;;7395:79;;:::i;:::-;7357:119;7515:1;7540:52;7584:7;7575:6;7564:9;7560:22;7540:52;:::i;:::-;7530:62;;7486:116;7282:327;;;;:::o;7615:349::-;7684:6;7733:2;7721:9;7712:7;7708:23;7704:32;7701:119;;;7739:79;;:::i;:::-;7701:119;7859:1;7884:63;7939:7;7930:6;7919:9;7915:22;7884:63;:::i;:::-;7874:73;;7830:127;7615:349;;;;:::o;7970:509::-;8039:6;8088:2;8076:9;8067:7;8063:23;8059:32;8056:119;;;8094:79;;:::i;:::-;8056:119;8242:1;8231:9;8227:17;8214:31;8272:18;8264:6;8261:30;8258:117;;;8294:79;;:::i;:::-;8258:117;8399:63;8454:7;8445:6;8434:9;8430:22;8399:63;:::i;:::-;8389:73;;8185:287;7970:509;;;;:::o;8485:329::-;8544:6;8593:2;8581:9;8572:7;8568:23;8564:32;8561:119;;;8599:79;;:::i;:::-;8561:119;8719:1;8744:53;8789:7;8780:6;8769:9;8765:22;8744:53;:::i;:::-;8734:63;;8690:117;8485:329;;;;:::o;8820:118::-;8907:24;8925:5;8907:24;:::i;:::-;8902:3;8895:37;8820:118;;:::o;8944:109::-;9025:21;9040:5;9025:21;:::i;:::-;9020:3;9013:34;8944:109;;:::o;9059:360::-;9145:3;9173:38;9205:5;9173:38;:::i;:::-;9227:70;9290:6;9285:3;9227:70;:::i;:::-;9220:77;;9306:52;9351:6;9346:3;9339:4;9332:5;9328:16;9306:52;:::i;:::-;9383:29;9405:6;9383:29;:::i;:::-;9378:3;9374:39;9367:46;;9149:270;9059:360;;;;:::o;9425:364::-;9513:3;9541:39;9574:5;9541:39;:::i;:::-;9596:71;9660:6;9655:3;9596:71;:::i;:::-;9589:78;;9676:52;9721:6;9716:3;9709:4;9702:5;9698:16;9676:52;:::i;:::-;9753:29;9775:6;9753:29;:::i;:::-;9748:3;9744:39;9737:46;;9517:272;9425:364;;;;:::o;9795:377::-;9901:3;9929:39;9962:5;9929:39;:::i;:::-;9984:89;10066:6;10061:3;9984:89;:::i;:::-;9977:96;;10082:52;10127:6;10122:3;10115:4;10108:5;10104:16;10082:52;:::i;:::-;10159:6;10154:3;10150:16;10143:23;;9905:267;9795:377;;;;:::o;10178:366::-;10320:3;10341:67;10405:2;10400:3;10341:67;:::i;:::-;10334:74;;10417:93;10506:3;10417:93;:::i;:::-;10535:2;10530:3;10526:12;10519:19;;10178:366;;;:::o;10550:::-;10692:3;10713:67;10777:2;10772:3;10713:67;:::i;:::-;10706:74;;10789:93;10878:3;10789:93;:::i;:::-;10907:2;10902:3;10898:12;10891:19;;10550:366;;;:::o;10922:::-;11064:3;11085:67;11149:2;11144:3;11085:67;:::i;:::-;11078:74;;11161:93;11250:3;11161:93;:::i;:::-;11279:2;11274:3;11270:12;11263:19;;10922:366;;;:::o;11294:::-;11436:3;11457:67;11521:2;11516:3;11457:67;:::i;:::-;11450:74;;11533:93;11622:3;11533:93;:::i;:::-;11651:2;11646:3;11642:12;11635:19;;11294:366;;;:::o;11666:::-;11808:3;11829:67;11893:2;11888:3;11829:67;:::i;:::-;11822:74;;11905:93;11994:3;11905:93;:::i;:::-;12023:2;12018:3;12014:12;12007:19;;11666:366;;;:::o;12038:::-;12180:3;12201:67;12265:2;12260:3;12201:67;:::i;:::-;12194:74;;12277:93;12366:3;12277:93;:::i;:::-;12395:2;12390:3;12386:12;12379:19;;12038:366;;;:::o;12410:402::-;12570:3;12591:85;12673:2;12668:3;12591:85;:::i;:::-;12584:92;;12685:93;12774:3;12685:93;:::i;:::-;12803:2;12798:3;12794:12;12787:19;;12410:402;;;:::o;12818:366::-;12960:3;12981:67;13045:2;13040:3;12981:67;:::i;:::-;12974:74;;13057:93;13146:3;13057:93;:::i;:::-;13175:2;13170:3;13166:12;13159:19;;12818:366;;;:::o;13190:::-;13332:3;13353:67;13417:2;13412:3;13353:67;:::i;:::-;13346:74;;13429:93;13518:3;13429:93;:::i;:::-;13547:2;13542:3;13538:12;13531:19;;13190:366;;;:::o;13562:::-;13704:3;13725:67;13789:2;13784:3;13725:67;:::i;:::-;13718:74;;13801:93;13890:3;13801:93;:::i;:::-;13919:2;13914:3;13910:12;13903:19;;13562:366;;;:::o;13934:::-;14076:3;14097:67;14161:2;14156:3;14097:67;:::i;:::-;14090:74;;14173:93;14262:3;14173:93;:::i;:::-;14291:2;14286:3;14282:12;14275:19;;13934:366;;;:::o;14306:::-;14448:3;14469:67;14533:2;14528:3;14469:67;:::i;:::-;14462:74;;14545:93;14634:3;14545:93;:::i;:::-;14663:2;14658:3;14654:12;14647:19;;14306:366;;;:::o;14678:::-;14820:3;14841:67;14905:2;14900:3;14841:67;:::i;:::-;14834:74;;14917:93;15006:3;14917:93;:::i;:::-;15035:2;15030:3;15026:12;15019:19;;14678:366;;;:::o;15050:::-;15192:3;15213:67;15277:2;15272:3;15213:67;:::i;:::-;15206:74;;15289:93;15378:3;15289:93;:::i;:::-;15407:2;15402:3;15398:12;15391:19;;15050:366;;;:::o;15422:::-;15564:3;15585:67;15649:2;15644:3;15585:67;:::i;:::-;15578:74;;15661:93;15750:3;15661:93;:::i;:::-;15779:2;15774:3;15770:12;15763:19;;15422:366;;;:::o;15794:::-;15936:3;15957:67;16021:2;16016:3;15957:67;:::i;:::-;15950:74;;16033:93;16122:3;16033:93;:::i;:::-;16151:2;16146:3;16142:12;16135:19;;15794:366;;;:::o;16166:::-;16308:3;16329:67;16393:2;16388:3;16329:67;:::i;:::-;16322:74;;16405:93;16494:3;16405:93;:::i;:::-;16523:2;16518:3;16514:12;16507:19;;16166:366;;;:::o;16538:::-;16680:3;16701:67;16765:2;16760:3;16701:67;:::i;:::-;16694:74;;16777:93;16866:3;16777:93;:::i;:::-;16895:2;16890:3;16886:12;16879:19;;16538:366;;;:::o;16910:::-;17052:3;17073:67;17137:2;17132:3;17073:67;:::i;:::-;17066:74;;17149:93;17238:3;17149:93;:::i;:::-;17267:2;17262:3;17258:12;17251:19;;16910:366;;;:::o;17282:::-;17424:3;17445:67;17509:2;17504:3;17445:67;:::i;:::-;17438:74;;17521:93;17610:3;17521:93;:::i;:::-;17639:2;17634:3;17630:12;17623:19;;17282:366;;;:::o;17654:::-;17796:3;17817:67;17881:2;17876:3;17817:67;:::i;:::-;17810:74;;17893:93;17982:3;17893:93;:::i;:::-;18011:2;18006:3;18002:12;17995:19;;17654:366;;;:::o;18026:::-;18168:3;18189:67;18253:2;18248:3;18189:67;:::i;:::-;18182:74;;18265:93;18354:3;18265:93;:::i;:::-;18383:2;18378:3;18374:12;18367:19;;18026:366;;;:::o;18398:::-;18540:3;18561:67;18625:2;18620:3;18561:67;:::i;:::-;18554:74;;18637:93;18726:3;18637:93;:::i;:::-;18755:2;18750:3;18746:12;18739:19;;18398:366;;;:::o;18770:::-;18912:3;18933:67;18997:2;18992:3;18933:67;:::i;:::-;18926:74;;19009:93;19098:3;19009:93;:::i;:::-;19127:2;19122:3;19118:12;19111:19;;18770:366;;;:::o;19142:::-;19284:3;19305:67;19369:2;19364:3;19305:67;:::i;:::-;19298:74;;19381:93;19470:3;19381:93;:::i;:::-;19499:2;19494:3;19490:12;19483:19;;19142:366;;;:::o;19514:::-;19656:3;19677:67;19741:2;19736:3;19677:67;:::i;:::-;19670:74;;19753:93;19842:3;19753:93;:::i;:::-;19871:2;19866:3;19862:12;19855:19;;19514:366;;;:::o;19886:::-;20028:3;20049:67;20113:2;20108:3;20049:67;:::i;:::-;20042:74;;20125:93;20214:3;20125:93;:::i;:::-;20243:2;20238:3;20234:12;20227:19;;19886:366;;;:::o;20258:::-;20400:3;20421:67;20485:2;20480:3;20421:67;:::i;:::-;20414:74;;20497:93;20586:3;20497:93;:::i;:::-;20615:2;20610:3;20606:12;20599:19;;20258:366;;;:::o;20630:::-;20772:3;20793:67;20857:2;20852:3;20793:67;:::i;:::-;20786:74;;20869:93;20958:3;20869:93;:::i;:::-;20987:2;20982:3;20978:12;20971:19;;20630:366;;;:::o;21374:402::-;21534:3;21555:85;21637:2;21632:3;21555:85;:::i;:::-;21548:92;;21649:93;21738:3;21649:93;:::i;:::-;21767:2;21762:3;21758:12;21751:19;;21374:402;;;:::o;21782:366::-;21924:3;21945:67;22009:2;22004:3;21945:67;:::i;:::-;21938:74;;22021:93;22110:3;22021:93;:::i;:::-;22139:2;22134:3;22130:12;22123:19;;21782:366;;;:::o;22154:118::-;22241:24;22259:5;22241:24;:::i;:::-;22236:3;22229:37;22154:118;;:::o;22278:701::-;22559:3;22581:95;22672:3;22663:6;22581:95;:::i;:::-;22574:102;;22693:95;22784:3;22775:6;22693:95;:::i;:::-;22686:102;;22805:148;22949:3;22805:148;:::i;:::-;22798:155;;22970:3;22963:10;;22278:701;;;;;:::o;22985:541::-;23218:3;23240:95;23331:3;23322:6;23240:95;:::i;:::-;23233:102;;23352:148;23496:3;23352:148;:::i;:::-;23345:155;;23517:3;23510:10;;22985:541;;;;:::o;23532:222::-;23625:4;23663:2;23652:9;23648:18;23640:26;;23676:71;23744:1;23733:9;23729:17;23720:6;23676:71;:::i;:::-;23532:222;;;;:::o;23760:640::-;23955:4;23993:3;23982:9;23978:19;23970:27;;24007:71;24075:1;24064:9;24060:17;24051:6;24007:71;:::i;:::-;24088:72;24156:2;24145:9;24141:18;24132:6;24088:72;:::i;:::-;24170;24238:2;24227:9;24223:18;24214:6;24170:72;:::i;:::-;24289:9;24283:4;24279:20;24274:2;24263:9;24259:18;24252:48;24317:76;24388:4;24379:6;24317:76;:::i;:::-;24309:84;;23760:640;;;;;;;:::o;24406:210::-;24493:4;24531:2;24520:9;24516:18;24508:26;;24544:65;24606:1;24595:9;24591:17;24582:6;24544:65;:::i;:::-;24406:210;;;;:::o;24622:313::-;24735:4;24773:2;24762:9;24758:18;24750:26;;24822:9;24816:4;24812:20;24808:1;24797:9;24793:17;24786:47;24850:78;24923:4;24914:6;24850:78;:::i;:::-;24842:86;;24622:313;;;;:::o;24941:419::-;25107:4;25145:2;25134:9;25130:18;25122:26;;25194:9;25188:4;25184:20;25180:1;25169:9;25165:17;25158:47;25222:131;25348:4;25222:131;:::i;:::-;25214:139;;24941:419;;;:::o;25366:::-;25532:4;25570:2;25559:9;25555:18;25547:26;;25619:9;25613:4;25609:20;25605:1;25594:9;25590:17;25583:47;25647:131;25773:4;25647:131;:::i;:::-;25639:139;;25366:419;;;:::o;25791:::-;25957:4;25995:2;25984:9;25980:18;25972:26;;26044:9;26038:4;26034:20;26030:1;26019:9;26015:17;26008:47;26072:131;26198:4;26072:131;:::i;:::-;26064:139;;25791:419;;;:::o;26216:::-;26382:4;26420:2;26409:9;26405:18;26397:26;;26469:9;26463:4;26459:20;26455:1;26444:9;26440:17;26433:47;26497:131;26623:4;26497:131;:::i;:::-;26489:139;;26216:419;;;:::o;26641:::-;26807:4;26845:2;26834:9;26830:18;26822:26;;26894:9;26888:4;26884:20;26880:1;26869:9;26865:17;26858:47;26922:131;27048:4;26922:131;:::i;:::-;26914:139;;26641:419;;;:::o;27066:::-;27232:4;27270:2;27259:9;27255:18;27247:26;;27319:9;27313:4;27309:20;27305:1;27294:9;27290:17;27283:47;27347:131;27473:4;27347:131;:::i;:::-;27339:139;;27066:419;;;:::o;27491:::-;27657:4;27695:2;27684:9;27680:18;27672:26;;27744:9;27738:4;27734:20;27730:1;27719:9;27715:17;27708:47;27772:131;27898:4;27772:131;:::i;:::-;27764:139;;27491:419;;;:::o;27916:::-;28082:4;28120:2;28109:9;28105:18;28097:26;;28169:9;28163:4;28159:20;28155:1;28144:9;28140:17;28133:47;28197:131;28323:4;28197:131;:::i;:::-;28189:139;;27916:419;;;:::o;28341:::-;28507:4;28545:2;28534:9;28530:18;28522:26;;28594:9;28588:4;28584:20;28580:1;28569:9;28565:17;28558:47;28622:131;28748:4;28622:131;:::i;:::-;28614:139;;28341:419;;;:::o;28766:::-;28932:4;28970:2;28959:9;28955:18;28947:26;;29019:9;29013:4;29009:20;29005:1;28994:9;28990:17;28983:47;29047:131;29173:4;29047:131;:::i;:::-;29039:139;;28766:419;;;:::o;29191:::-;29357:4;29395:2;29384:9;29380:18;29372:26;;29444:9;29438:4;29434:20;29430:1;29419:9;29415:17;29408:47;29472:131;29598:4;29472:131;:::i;:::-;29464:139;;29191:419;;;:::o;29616:::-;29782:4;29820:2;29809:9;29805:18;29797:26;;29869:9;29863:4;29859:20;29855:1;29844:9;29840:17;29833:47;29897:131;30023:4;29897:131;:::i;:::-;29889:139;;29616:419;;;:::o;30041:::-;30207:4;30245:2;30234:9;30230:18;30222:26;;30294:9;30288:4;30284:20;30280:1;30269:9;30265:17;30258:47;30322:131;30448:4;30322:131;:::i;:::-;30314:139;;30041:419;;;:::o;30466:::-;30632:4;30670:2;30659:9;30655:18;30647:26;;30719:9;30713:4;30709:20;30705:1;30694:9;30690:17;30683:47;30747:131;30873:4;30747:131;:::i;:::-;30739:139;;30466:419;;;:::o;30891:::-;31057:4;31095:2;31084:9;31080:18;31072:26;;31144:9;31138:4;31134:20;31130:1;31119:9;31115:17;31108:47;31172:131;31298:4;31172:131;:::i;:::-;31164:139;;30891:419;;;:::o;31316:::-;31482:4;31520:2;31509:9;31505:18;31497:26;;31569:9;31563:4;31559:20;31555:1;31544:9;31540:17;31533:47;31597:131;31723:4;31597:131;:::i;:::-;31589:139;;31316:419;;;:::o;31741:::-;31907:4;31945:2;31934:9;31930:18;31922:26;;31994:9;31988:4;31984:20;31980:1;31969:9;31965:17;31958:47;32022:131;32148:4;32022:131;:::i;:::-;32014:139;;31741:419;;;:::o;32166:::-;32332:4;32370:2;32359:9;32355:18;32347:26;;32419:9;32413:4;32409:20;32405:1;32394:9;32390:17;32383:47;32447:131;32573:4;32447:131;:::i;:::-;32439:139;;32166:419;;;:::o;32591:::-;32757:4;32795:2;32784:9;32780:18;32772:26;;32844:9;32838:4;32834:20;32830:1;32819:9;32815:17;32808:47;32872:131;32998:4;32872:131;:::i;:::-;32864:139;;32591:419;;;:::o;33016:::-;33182:4;33220:2;33209:9;33205:18;33197:26;;33269:9;33263:4;33259:20;33255:1;33244:9;33240:17;33233:47;33297:131;33423:4;33297:131;:::i;:::-;33289:139;;33016:419;;;:::o;33441:::-;33607:4;33645:2;33634:9;33630:18;33622:26;;33694:9;33688:4;33684:20;33680:1;33669:9;33665:17;33658:47;33722:131;33848:4;33722:131;:::i;:::-;33714:139;;33441:419;;;:::o;33866:::-;34032:4;34070:2;34059:9;34055:18;34047:26;;34119:9;34113:4;34109:20;34105:1;34094:9;34090:17;34083:47;34147:131;34273:4;34147:131;:::i;:::-;34139:139;;33866:419;;;:::o;34291:::-;34457:4;34495:2;34484:9;34480:18;34472:26;;34544:9;34538:4;34534:20;34530:1;34519:9;34515:17;34508:47;34572:131;34698:4;34572:131;:::i;:::-;34564:139;;34291:419;;;:::o;34716:::-;34882:4;34920:2;34909:9;34905:18;34897:26;;34969:9;34963:4;34959:20;34955:1;34944:9;34940:17;34933:47;34997:131;35123:4;34997:131;:::i;:::-;34989:139;;34716:419;;;:::o;35141:::-;35307:4;35345:2;35334:9;35330:18;35322:26;;35394:9;35388:4;35384:20;35380:1;35369:9;35365:17;35358:47;35422:131;35548:4;35422:131;:::i;:::-;35414:139;;35141:419;;;:::o;35566:::-;35732:4;35770:2;35759:9;35755:18;35747:26;;35819:9;35813:4;35809:20;35805:1;35794:9;35790:17;35783:47;35847:131;35973:4;35847:131;:::i;:::-;35839:139;;35566:419;;;:::o;35991:::-;36157:4;36195:2;36184:9;36180:18;36172:26;;36244:9;36238:4;36234:20;36230:1;36219:9;36215:17;36208:47;36272:131;36398:4;36272:131;:::i;:::-;36264:139;;35991:419;;;:::o;36416:::-;36582:4;36620:2;36609:9;36605:18;36597:26;;36669:9;36663:4;36659:20;36655:1;36644:9;36640:17;36633:47;36697:131;36823:4;36697:131;:::i;:::-;36689:139;;36416:419;;;:::o;37266:::-;37432:4;37470:2;37459:9;37455:18;37447:26;;37519:9;37513:4;37509:20;37505:1;37494:9;37490:17;37483:47;37547:131;37673:4;37547:131;:::i;:::-;37539:139;;37266:419;;;:::o;37691:222::-;37784:4;37822:2;37811:9;37807:18;37799:26;;37835:71;37903:1;37892:9;37888:17;37879:6;37835:71;:::i;:::-;37691:222;;;;:::o;37919:1298::-;38278:4;38316:3;38305:9;38301:19;38293:27;;38330:71;38398:1;38387:9;38383:17;38374:6;38330:71;:::i;:::-;38411:72;38479:2;38468:9;38464:18;38455:6;38411:72;:::i;:::-;38493:66;38555:2;38544:9;38540:18;38531:6;38493:66;:::i;:::-;38569:72;38637:2;38626:9;38622:18;38613:6;38569:72;:::i;:::-;38651:73;38719:3;38708:9;38704:19;38695:6;38651:73;:::i;:::-;38734;38802:3;38791:9;38787:19;38778:6;38734:73;:::i;:::-;38817;38885:3;38874:9;38870:19;38861:6;38817:73;:::i;:::-;38900;38968:3;38957:9;38953:19;38944:6;38900:73;:::i;:::-;38983;39051:3;39040:9;39036:19;39027:6;38983:73;:::i;:::-;39104:9;39098:4;39094:20;39088:3;39077:9;39073:19;39066:49;39132:78;39205:4;39196:6;39132:78;:::i;:::-;39124:86;;37919:1298;;;;;;;;;;;;;:::o;39223:129::-;39257:6;39284:20;;:::i;:::-;39274:30;;39313:33;39341:4;39333:6;39313:33;:::i;:::-;39223:129;;;:::o;39358:75::-;39391:6;39424:2;39418:9;39408:19;;39358:75;:::o;39439:307::-;39500:4;39590:18;39582:6;39579:30;39576:56;;;39612:18;;:::i;:::-;39576:56;39650:29;39672:6;39650:29;:::i;:::-;39642:37;;39734:4;39728;39724:15;39716:23;;39439:307;;;:::o;39752:308::-;39814:4;39904:18;39896:6;39893:30;39890:56;;;39926:18;;:::i;:::-;39890:56;39964:29;39986:6;39964:29;:::i;:::-;39956:37;;40048:4;40042;40038:15;40030:23;;39752:308;;;:::o;40066:98::-;40117:6;40151:5;40145:12;40135:22;;40066:98;;;:::o;40170:99::-;40222:6;40256:5;40250:12;40240:22;;40170:99;;;:::o;40275:168::-;40358:11;40392:6;40387:3;40380:19;40432:4;40427:3;40423:14;40408:29;;40275:168;;;;:::o;40449:169::-;40533:11;40567:6;40562:3;40555:19;40607:4;40602:3;40598:14;40583:29;;40449:169;;;;:::o;40624:148::-;40726:11;40763:3;40748:18;;40624:148;;;;:::o;40778:273::-;40818:3;40837:20;40855:1;40837:20;:::i;:::-;40832:25;;40871:20;40889:1;40871:20;:::i;:::-;40866:25;;40993:1;40957:34;40953:42;40950:1;40947:49;40944:75;;;40999:18;;:::i;:::-;40944:75;41043:1;41040;41036:9;41029:16;;40778:273;;;;:::o;41057:305::-;41097:3;41116:20;41134:1;41116:20;:::i;:::-;41111:25;;41150:20;41168:1;41150:20;:::i;:::-;41145:25;;41304:1;41236:66;41232:74;41229:1;41226:81;41223:107;;;41310:18;;:::i;:::-;41223:107;41354:1;41351;41347:9;41340:16;;41057:305;;;;:::o;41368:185::-;41408:1;41425:20;41443:1;41425:20;:::i;:::-;41420:25;;41459:20;41477:1;41459:20;:::i;:::-;41454:25;;41498:1;41488:35;;41503:18;;:::i;:::-;41488:35;41545:1;41542;41538:9;41533:14;;41368:185;;;;:::o;41559:348::-;41599:7;41622:20;41640:1;41622:20;:::i;:::-;41617:25;;41656:20;41674:1;41656:20;:::i;:::-;41651:25;;41844:1;41776:66;41772:74;41769:1;41766:81;41761:1;41754:9;41747:17;41743:105;41740:131;;;41851:18;;:::i;:::-;41740:131;41899:1;41896;41892:9;41881:20;;41559:348;;;;:::o;41913:191::-;41953:4;41973:20;41991:1;41973:20;:::i;:::-;41968:25;;42007:20;42025:1;42007:20;:::i;:::-;42002:25;;42046:1;42043;42040:8;42037:34;;;42051:18;;:::i;:::-;42037:34;42096:1;42093;42089:9;42081:17;;41913:191;;;;:::o;42110:96::-;42147:7;42176:24;42194:5;42176:24;:::i;:::-;42165:35;;42110:96;;;:::o;42212:90::-;42246:7;42289:5;42282:13;42275:21;42264:32;;42212:90;;;:::o;42308:149::-;42344:7;42384:66;42377:5;42373:78;42362:89;;42308:149;;;:::o;42463:118::-;42500:7;42540:34;42533:5;42529:46;42518:57;;42463:118;;;:::o;42587:126::-;42624:7;42664:42;42657:5;42653:54;42642:65;;42587:126;;;:::o;42719:77::-;42756:7;42785:5;42774:16;;42719:77;;;:::o;42802:154::-;42886:6;42881:3;42876;42863:30;42948:1;42939:6;42934:3;42930:16;42923:27;42802:154;;;:::o;42962:307::-;43030:1;43040:113;43054:6;43051:1;43048:13;43040:113;;;43139:1;43134:3;43130:11;43124:18;43120:1;43115:3;43111:11;43104:39;43076:2;43073:1;43069:10;43064:15;;43040:113;;;43171:6;43168:1;43165:13;43162:101;;;43251:1;43242:6;43237:3;43233:16;43226:27;43162:101;43011:258;42962:307;;;:::o;43275:171::-;43314:3;43337:24;43355:5;43337:24;:::i;:::-;43328:33;;43383:4;43376:5;43373:15;43370:41;;;43391:18;;:::i;:::-;43370:41;43438:1;43431:5;43427:13;43420:20;;43275:171;;;:::o;43452:320::-;43496:6;43533:1;43527:4;43523:12;43513:22;;43580:1;43574:4;43570:12;43601:18;43591:81;;43657:4;43649:6;43645:17;43635:27;;43591:81;43719:2;43711:6;43708:14;43688:18;43685:38;43682:84;;;43738:18;;:::i;:::-;43682:84;43503:269;43452:320;;;:::o;43778:281::-;43861:27;43883:4;43861:27;:::i;:::-;43853:6;43849:40;43991:6;43979:10;43976:22;43955:18;43943:10;43940:34;43937:62;43934:88;;;44002:18;;:::i;:::-;43934:88;44042:10;44038:2;44031:22;43821:238;43778:281;;:::o;44065:233::-;44104:3;44127:24;44145:5;44127:24;:::i;:::-;44118:33;;44173:66;44166:5;44163:77;44160:103;;;44243:18;;:::i;:::-;44160:103;44290:1;44283:5;44279:13;44272:20;;44065:233;;;:::o;44304:176::-;44336:1;44353:20;44371:1;44353:20;:::i;:::-;44348:25;;44387:20;44405:1;44387:20;:::i;:::-;44382:25;;44426:1;44416:35;;44431:18;;:::i;:::-;44416:35;44472:1;44469;44465:9;44460:14;;44304:176;;;;:::o;44486:180::-;44534:77;44531:1;44524:88;44631:4;44628:1;44621:15;44655:4;44652:1;44645:15;44672:180;44720:77;44717:1;44710:88;44817:4;44814:1;44807:15;44841:4;44838:1;44831:15;44858:180;44906:77;44903:1;44896:88;45003:4;45000:1;44993:15;45027:4;45024:1;45017:15;45044:180;45092:77;45089:1;45082:88;45189:4;45186:1;45179:15;45213:4;45210:1;45203:15;45230:180;45278:77;45275:1;45268:88;45375:4;45372:1;45365:15;45399:4;45396:1;45389:15;45416:117;45525:1;45522;45515:12;45539:117;45648:1;45645;45638:12;45662:117;45771:1;45768;45761:12;45785:117;45894:1;45891;45884:12;45908:117;46017:1;46014;46007:12;46031:117;46140:1;46137;46130:12;46154:102;46195:6;46246:2;46242:7;46237:2;46230:5;46226:14;46222:28;46212:38;;46154:102;;;:::o;46262:221::-;46402:34;46398:1;46390:6;46386:14;46379:58;46471:4;46466:2;46458:6;46454:15;46447:29;46262:221;:::o;46489:180::-;46629:32;46625:1;46617:6;46613:14;46606:56;46489:180;:::o;46675:225::-;46815:34;46811:1;46803:6;46799:14;46792:58;46884:8;46879:2;46871:6;46867:15;46860:33;46675:225;:::o;46906:229::-;47046:34;47042:1;47034:6;47030:14;47023:58;47115:12;47110:2;47102:6;47098:15;47091:37;46906:229;:::o;47141:176::-;47281:28;47277:1;47269:6;47265:14;47258:52;47141:176;:::o;47323:169::-;47463:21;47459:1;47451:6;47447:14;47440:45;47323:169;:::o;47498:164::-;47638:16;47634:1;47626:6;47622:14;47615:40;47498:164;:::o;47668:222::-;47808:34;47804:1;47796:6;47792:14;47785:58;47877:5;47872:2;47864:6;47860:15;47853:30;47668:222;:::o;47896:224::-;48036:34;48032:1;48024:6;48020:14;48013:58;48105:7;48100:2;48092:6;48088:15;48081:32;47896:224;:::o;48126:174::-;48266:26;48262:1;48254:6;48250:14;48243:50;48126:174;:::o;48306:244::-;48446:34;48442:1;48434:6;48430:14;48423:58;48515:27;48510:2;48502:6;48498:15;48491:52;48306:244;:::o;48556:168::-;48696:20;48692:1;48684:6;48680:14;48673:44;48556:168;:::o;48730:222::-;48870:34;48866:1;48858:6;48854:14;48847:58;48939:5;48934:2;48926:6;48922:15;48915:30;48730:222;:::o;48958:230::-;49098:34;49094:1;49086:6;49082:14;49075:58;49167:13;49162:2;49154:6;49150:15;49143:38;48958:230;:::o;49194:225::-;49334:34;49330:1;49322:6;49318:14;49311:58;49403:8;49398:2;49390:6;49386:15;49379:33;49194:225;:::o;49425:182::-;49565:34;49561:1;49553:6;49549:14;49542:58;49425:182;:::o;49613:234::-;49753:34;49749:1;49741:6;49737:14;49730:58;49822:17;49817:2;49809:6;49805:15;49798:42;49613:234;:::o;49853:176::-;49993:28;49989:1;49981:6;49977:14;49970:52;49853:176;:::o;50035:237::-;50175:34;50171:1;50163:6;50159:14;50152:58;50244:20;50239:2;50231:6;50227:15;50220:45;50035:237;:::o;50278:177::-;50418:29;50414:1;50406:6;50402:14;50395:53;50278:177;:::o;50461:221::-;50601:34;50597:1;50589:6;50585:14;50578:58;50670:4;50665:2;50657:6;50653:15;50646:29;50461:221;:::o;50688:222::-;50828:34;50824:1;50816:6;50812:14;50805:58;50897:5;50892:2;50884:6;50880:15;50873:30;50688:222;:::o;50916:238::-;51056:34;51052:1;51044:6;51040:14;51033:58;51125:21;51120:2;51112:6;51108:15;51101:46;50916:238;:::o;51160:179::-;51300:31;51296:1;51288:6;51284:14;51277:55;51160:179;:::o;51345:220::-;51485:34;51481:1;51473:6;51469:14;51462:58;51554:3;51549:2;51541:6;51537:15;51530:28;51345:220;:::o;51571:163::-;51711:15;51707:1;51699:6;51695:14;51688:39;51571:163;:::o;51740:233::-;51880:34;51876:1;51868:6;51864:14;51857:58;51949:16;51944:2;51936:6;51932:15;51925:41;51740:233;:::o;51979:227::-;52119:34;52115:1;52107:6;52103:14;52096:58;52188:10;52183:2;52175:6;52171:15;52164:35;51979:227;:::o;52212:181::-;52352:33;52348:1;52340:6;52336:14;52329:57;52212:181;:::o;52639:163::-;52779:15;52775:1;52767:6;52763:14;52756:39;52639:163;:::o;52808:232::-;52948:34;52944:1;52936:6;52932:14;52925:58;53017:15;53012:2;53004:6;53000:15;52993:40;52808:232;:::o;53046:122::-;53119:24;53137:5;53119:24;:::i;:::-;53112:5;53109:35;53099:63;;53158:1;53155;53148:12;53099:63;53046:122;:::o;53174:116::-;53244:21;53259:5;53244:21;:::i;:::-;53237:5;53234:32;53224:60;;53280:1;53277;53270:12;53224:60;53174:116;:::o;53296:120::-;53368:23;53385:5;53368:23;:::i;:::-;53361:5;53358:34;53348:62;;53406:1;53403;53396:12;53348:62;53296:120;:::o;53422:122::-;53495:24;53513:5;53495:24;:::i;:::-;53488:5;53485:35;53475:63;;53534:1;53531;53524:12;53475:63;53422:122;:::o

Swarm Source

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