Token Baby Pixel Doodled Punks

 

Overview ERC-721

Total Supply:
2,000 bPDP

Holders:
301 addresses

Transfers:
-

Loading
[ Download CSV Export  ] 
Loading
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
BabyPixelDoodledPunks

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-02-27
*/

// SPDX-License-Identifier: MIT
/*

 /$$$$$$$   /$$$$$$  /$$$$$$$  /$$     /$$       /$$$$$$$  /$$$$$$$  /$$$$$$$ 
| $$__  $$ /$$__  $$| $$__  $$|  $$   /$$/      | $$__  $$| $$__  $$| $$__  $$
| $$  \ $$| $$  \ $$| $$  \ $$ \  $$ /$$/       | $$  \ $$| $$  \ $$| $$  \ $$
| $$$$$$$ | $$$$$$$$| $$$$$$$   \  $$$$/        | $$$$$$$/| $$  | $$| $$$$$$$/
| $$__  $$| $$__  $$| $$__  $$   \  $$/         | $$____/ | $$  | $$| $$____/ 
| $$  \ $$| $$  | $$| $$  \ $$    | $$          | $$      | $$  | $$| $$      
| $$$$$$$/| $$  | $$| $$$$$$$/    | $$          | $$      | $$$$$$$/| $$      
|_______/ |__/  |__/|_______/     |__/          |__/      |_______/ |__/  
                                                                                                                                                  
doodledpunkfam.club
discord.com/invite/ErghMMe866 Come join the family!

*/                                                                                                                                                  
// File: @openzeppelin/contracts/utils/introspection/IERC165.sol
pragma solidity ^0.8.0;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @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) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    /**
     * @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 sub(a, b, "SafeMath: subtraction overflow");
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

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

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts 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) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts 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) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts 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 mod(a, b, "SafeMath: modulo by zero");
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message 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, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
 
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);


    /**
     * 
     */
    function burn(uint256 burnQuantity) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

/**
 * @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/token/ERC721/IERC721.sol
pragma solidity ^0.8.0;
/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;
}


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

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

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


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



pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
}

// File: @openzeppelin/contracts/token/ERC721/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/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/token/ERC721/ERC721.sol
pragma solidity ^0.8.0;
/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

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



pragma solidity ^0.8.0;



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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity >=0.7.0 <0.9.0;

contract BabyPixelDoodledPunks is ERC721Enumerable, Ownable {
  using Strings for uint256;

  string baseURI;
  string public baseExtension = ".json";
  uint256 public cost = 100 ether;
  uint256 public maxSupply = 2000;
  uint256 public maxMintAmount = 3;
  uint256 public NAME_CHANGE_PRICE = 100 ether;
  bool public paused = true;
  bool public revealed = false;
  string public notRevealedUri;
  address private _dpunkAddress;
  mapping (uint256 => string) private _tokenName;
  mapping (string => bool) private _nameReserved;
  uint256 public maxMintPerWallet = 5;
  mapping(address => uint256) private _saleClaimed;

  constructor(
    string memory _name,
    string memory _symbol,
    string memory _initBaseURI,
    string memory _initNotRevealedUri,
    address dpunkAddress
  ) ERC721(_name, _symbol) {
    setBaseURI(_initBaseURI);
    _dpunkAddress = dpunkAddress;
    setNotRevealedURI(_initNotRevealedUri);
  }

  // events

  event NameChange (uint256 indexed maskIndex, string newName);

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

  // public
  function mintBPDP(uint256 _mintAmount) public {
    uint256 supply = totalSupply();
    require(!paused);
    require(_mintAmount > 0);
    require(_mintAmount <= maxMintAmount);
    require(supply + _mintAmount <= maxSupply);
    require((balanceOf(msg.sender) + _mintAmount) <= maxMintPerWallet, "Cannot buy more than 5 per wallet");

    IERC20(_dpunkAddress).transferFrom(msg.sender, address(this), cost * _mintAmount);

    
    for (uint256 i = 1; i <= _mintAmount; i++) {
      _safeMint(msg.sender, supply + i);
    }
  }

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

  function tokenURI(uint256 tokenId)
    public
    view
    virtual
    override
    returns (string memory)
  {
    require(
      _exists(tokenId),
      "ERC721Metadata: URI query for nonexistent token"
    );
    
    if(revealed == false) {
        return notRevealedUri;
    }

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

  //only owner
  function reveal() public onlyOwner {
      revealed = true;
  }
  
  function setCost(uint256 _newCost) public onlyOwner {
    cost = _newCost;
  }

  function setmaxMintAmount(uint256 _newmaxMintAmount) public onlyOwner {
    maxMintAmount = _newmaxMintAmount;
  }
  
  function setNotRevealedURI(string memory _notRevealedURI) public onlyOwner {
    notRevealedUri = _notRevealedURI;
  }

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

  function setBaseExtension(string memory _newBaseExtension) public onlyOwner {
    baseExtension = _newBaseExtension;
  }

  function pause(bool _state) public onlyOwner {
    paused = _state;
  }
 
  function withdraw() public payable onlyOwner {
    (bool os, ) = payable(owner()).call{value: address(this).balance}("");
    require(os);
  }

  function tokenNameByIndex(uint256 index) public view returns (string memory) {
    return _tokenName[index];
  }

  function isNameReserved(string memory nameString) public view returns (bool) {
      return _nameReserved[toLower(nameString)];
  }

  function changeName(uint256 tokenId, string memory newName) public {
      address owner = ownerOf(tokenId);
      require(_msgSender() == owner, "ERC721: caller is not the owner");
      require(validateName(newName) == true, "Not a valid name");
      require(sha256(bytes(newName)) != sha256(bytes(_tokenName[tokenId])), "New name is same as the current name");
      require(isNameReserved(newName) == false, "Name already reserved");

      if (bytes(_tokenName[tokenId]).length > 0) {
          toggleReserveName(_tokenName[tokenId], false);
      }
      toggleReserveName(newName, true);
      _tokenName[tokenId] = newName;
      IERC20(_dpunkAddress).transferFrom(msg.sender, address(this), NAME_CHANGE_PRICE);
      emit NameChange(tokenId, newName);
  }

  function toggleReserveName(string memory str, bool isReserve) internal {
      _nameReserved[toLower(str)] = isReserve;
  }

  function validateName(string memory str) public pure returns (bool) {
      bytes memory b = bytes(str);
      if(b.length < 3) return false;
      if(b.length > 25) return false;
      if(b[b.length - 1] == 0x20) return false;

      bytes1 lastChar = b[0];

      for(uint i; i<b.length; i++){
          bytes1 char = b[i];

          if (char == 0x20 && lastChar == 0x20) return false;
          if (
              !(char >= 0x30 && char <= 0x39) &&
              !(char >= 0x41 && char <= 0x5A) &&
              !(char >= 0x61 && char <= 0x7A) &&
              !(char == 0x20)
          )
          return false;
          lastChar = char;
      }
      return true;
  }
  function toLower(string memory str) public pure returns (string memory) {
      bytes memory bStr = bytes(str);
      bytes memory bLower = new bytes(bStr.length);
      for (uint i = 0; i < bStr.length; i++) {
          if ((uint8(bStr[i]) >= 65) && (uint8(bStr[i]) <= 90)){
              bLower[i] = bytes1(uint8(bStr[i]) + 32);
          } else {
              bLower[i] = bStr[i];
          }
      }
      return string(bLower);
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"string","name":"_initBaseURI","type":"string"},{"internalType":"string","name":"_initNotRevealedUri","type":"string"},{"internalType":"address","name":"dpunkAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"maskIndex","type":"uint256"},{"indexed":false,"internalType":"string","name":"newName","type":"string"}],"name":"NameChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"NAME_CHANGE_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"newName","type":"string"}],"name":"changeName","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"nameString","type":"string"}],"name":"isNameReserved","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mintBPDP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"notRevealedUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_notRevealedURI","type":"string"}],"name":"setNotRevealedURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newmaxMintAmount","type":"uint256"}],"name":"setmaxMintAmount","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":"string","name":"str","type":"string"}],"name":"toLower","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenNameByIndex","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"str","type":"string"}],"name":"validateName","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

60806040526040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600c908051906020019062000051929190620003f7565b5068056bc75e2d63100000600d556107d0600e556003600f5568056bc75e2d631000006010556001601160006101000a81548160ff0219169083151502179055506000601160016101000a81548160ff0219169083151502179055506005601655348015620000bf57600080fd5b5060405162005dd738038062005dd78339818101604052810190620000e591906200053c565b84848160009080519060200190620000ff929190620003f7565b50806001908051906020019062000118929190620003f7565b5050506200013b6200012f620001a960201b60201c565b620001b160201b60201c565b6200014c836200027760201b60201c565b80601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506200019e826200032260201b60201c565b505050505062000895565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b62000287620001a960201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620002ad620003cd60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000306576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002fd9062000667565b60405180910390fd5b80600b90805190602001906200031e929190620003f7565b5050565b62000332620001a960201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1662000358620003cd60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620003b1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003a89062000667565b60405180910390fd5b8060129080519060200190620003c9929190620003f7565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b828054620004059062000763565b90600052602060002090601f01602090048101928262000429576000855562000475565b82601f106200044457805160ff191683800117855562000475565b8280016001018555821562000475579182015b828111156200047457825182559160200191906001019062000457565b5b50905062000484919062000488565b5090565b5b80821115620004a357600081600090555060010162000489565b5090565b6000620004be620004b884620006b2565b62000689565b905082815260208101848484011115620004dd57620004dc62000832565b5b620004ea8482856200072d565b509392505050565b60008151905062000503816200087b565b92915050565b600082601f8301126200052157620005206200082d565b5b815162000533848260208601620004a7565b91505092915050565b600080600080600060a086880312156200055b576200055a6200083c565b5b600086015167ffffffffffffffff8111156200057c576200057b62000837565b5b6200058a8882890162000509565b955050602086015167ffffffffffffffff811115620005ae57620005ad62000837565b5b620005bc8882890162000509565b945050604086015167ffffffffffffffff811115620005e057620005df62000837565b5b620005ee8882890162000509565b935050606086015167ffffffffffffffff81111562000612576200061162000837565b5b620006208882890162000509565b92505060806200063388828901620004f2565b9150509295509295909350565b60006200064f602083620006e8565b91506200065c8262000852565b602082019050919050565b60006020820190508181036000830152620006828162000640565b9050919050565b600062000695620006a8565b9050620006a3828262000799565b919050565b6000604051905090565b600067ffffffffffffffff821115620006d057620006cf620007fe565b5b620006db8262000841565b9050602081019050919050565b600082825260208201905092915050565b600062000706826200070d565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60005b838110156200074d57808201518184015260208101905062000730565b838111156200075d576000848401525b50505050565b600060028204905060018216806200077c57607f821691505b60208210811415620007935762000792620007cf565b5b50919050565b620007a48262000841565b810181811067ffffffffffffffff82111715620007c657620007c5620007fe565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6200088681620006f9565b81146200089257600080fd5b50565b61553280620008a56000396000f3fe60806040526004361061025c5760003560e01c80635c975abb11610144578063a475b5dd116100b6578063c87b56dd1161007a578063c87b56dd146108ff578063d5abeb011461093c578063da3ef23f14610967578063e985e9c514610990578063f2c4ce1e146109cd578063f2fde38b146109f65761025c565b8063a475b5dd14610840578063b228d92514610857578063b88d4fde14610882578063c39cbef1146108ab578063c6682862146108d45761025c565b80637f00c7a6116101085780637f00c7a61461071e5780638da5cb5b146107475780639416b4231461077257806395d89b41146107af5780639ffdb65a146107da578063a22cb465146108175761025c565b80635c975abb146106255780636352211e146106505780636d5224181461068d57806370a08231146106ca578063715018a6146107075761025c565b8063239c70ae116101dd578063438b6300116101a1578063438b63001461050357806344a0d68a146105405780634f6ccce71461056957806351830227146105a657806354b6f161146105d157806355f804b3146105fc5761025c565b8063239c70ae1461043f57806323b872dd1461046a5780632f745c59146104935780633ccfd60b146104d057806342842e0e146104da5761025c565b8063081c8c4411610224578063081c8c4414610358578063095ea7b31461038357806313faede6146103ac57806315b56d10146103d757806318160ddd146104145761025c565b806301ffc9a71461026157806302329a291461029e57806305f24c21146102c757806306fdde03146102f0578063081812fc1461031b575b600080fd5b34801561026d57600080fd5b5061028860048036038101906102839190613d8f565b610a1f565b60405161029591906145d2565b60405180910390f35b3480156102aa57600080fd5b506102c560048036038101906102c09190613d08565b610a99565b005b3480156102d357600080fd5b506102ee60048036038101906102e99190613e32565b610b32565b005b3480156102fc57600080fd5b50610305610ce0565b60405161031291906145ed565b60405180910390f35b34801561032757600080fd5b50610342600480360381019061033d9190613e32565b610d72565b60405161034f9190614512565b60405180910390f35b34801561036457600080fd5b5061036d610df7565b60405161037a91906145ed565b60405180910390f35b34801561038f57600080fd5b506103aa60048036038101906103a59190613cc8565b610e85565b005b3480156103b857600080fd5b506103c1610f9d565b6040516103ce91906148ef565b60405180910390f35b3480156103e357600080fd5b506103fe60048036038101906103f99190613de9565b610fa3565b60405161040b91906145d2565b60405180910390f35b34801561042057600080fd5b50610429610fe0565b60405161043691906148ef565b60405180910390f35b34801561044b57600080fd5b50610454610fed565b60405161046191906148ef565b60405180910390f35b34801561047657600080fd5b50610491600480360381019061048c9190613bb2565b610ff3565b005b34801561049f57600080fd5b506104ba60048036038101906104b59190613cc8565b611053565b6040516104c791906148ef565b60405180910390f35b6104d86110f8565b005b3480156104e657600080fd5b5061050160048036038101906104fc9190613bb2565b6111f4565b005b34801561050f57600080fd5b5061052a60048036038101906105259190613b45565b611214565b60405161053791906145b0565b60405180910390f35b34801561054c57600080fd5b5061056760048036038101906105629190613e32565b6112c2565b005b34801561057557600080fd5b50610590600480360381019061058b9190613e32565b611348565b60405161059d91906148ef565b60405180910390f35b3480156105b257600080fd5b506105bb6113b9565b6040516105c891906145d2565b60405180910390f35b3480156105dd57600080fd5b506105e66113cc565b6040516105f391906148ef565b60405180910390f35b34801561060857600080fd5b50610623600480360381019061061e9190613de9565b6113d2565b005b34801561063157600080fd5b5061063a611468565b60405161064791906145d2565b60405180910390f35b34801561065c57600080fd5b5061067760048036038101906106729190613e32565b61147b565b6040516106849190614512565b60405180910390f35b34801561069957600080fd5b506106b460048036038101906106af9190613e32565b61152d565b6040516106c191906145ed565b60405180910390f35b3480156106d657600080fd5b506106f160048036038101906106ec9190613b45565b6115d2565b6040516106fe91906148ef565b60405180910390f35b34801561071357600080fd5b5061071c61168a565b005b34801561072a57600080fd5b5061074560048036038101906107409190613e32565b611712565b005b34801561075357600080fd5b5061075c611798565b6040516107699190614512565b60405180910390f35b34801561077e57600080fd5b5061079960048036038101906107949190613de9565b6117c2565b6040516107a691906145ed565b60405180910390f35b3480156107bb57600080fd5b506107c461197a565b6040516107d191906145ed565b60405180910390f35b3480156107e657600080fd5b5061080160048036038101906107fc9190613de9565b611a0c565b60405161080e91906145d2565b60405180910390f35b34801561082357600080fd5b5061083e60048036038101906108399190613c88565b611ce8565b005b34801561084c57600080fd5b50610855611e69565b005b34801561086357600080fd5b5061086c611f02565b60405161087991906148ef565b60405180910390f35b34801561088e57600080fd5b506108a960048036038101906108a49190613c05565b611f08565b005b3480156108b757600080fd5b506108d260048036038101906108cd9190613e5f565b611f6a565b005b3480156108e057600080fd5b506108e9612370565b6040516108f691906145ed565b60405180910390f35b34801561090b57600080fd5b5061092660048036038101906109219190613e32565b6123fe565b60405161093391906145ed565b60405180910390f35b34801561094857600080fd5b50610951612557565b60405161095e91906148ef565b60405180910390f35b34801561097357600080fd5b5061098e60048036038101906109899190613de9565b61255d565b005b34801561099c57600080fd5b506109b760048036038101906109b29190613b72565b6125f3565b6040516109c491906145d2565b60405180910390f35b3480156109d957600080fd5b506109f460048036038101906109ef9190613de9565b612687565b005b348015610a0257600080fd5b50610a1d6004803603810190610a189190613b45565b61271d565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a925750610a9182612815565b5b9050919050565b610aa16128f7565b73ffffffffffffffffffffffffffffffffffffffff16610abf611798565b73ffffffffffffffffffffffffffffffffffffffff1614610b15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0c906147cf565b60405180910390fd5b80601160006101000a81548160ff02191690831515021790555050565b6000610b3c610fe0565b9050601160009054906101000a900460ff1615610b5857600080fd5b60008211610b6557600080fd5b600f54821115610b7457600080fd5b600e548282610b839190614a42565b1115610b8e57600080fd5b60165482610b9b336115d2565b610ba59190614a42565b1115610be6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bdd906148cf565b60405180910390fd5b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd333085600d54610c349190614b00565b6040518463ffffffff1660e01b8152600401610c529392919061452d565b602060405180830381600087803b158015610c6c57600080fd5b505af1158015610c80573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ca49190613d35565b506000600190505b828111610cdb57610cc8338284610cc39190614a42565b6128ff565b8080610cd390614cbe565b915050610cac565b505050565b606060008054610cef90614c5b565b80601f0160208091040260200160405190810160405280929190818152602001828054610d1b90614c5b565b8015610d685780601f10610d3d57610100808354040283529160200191610d68565b820191906000526020600020905b815481529060010190602001808311610d4b57829003601f168201915b5050505050905090565b6000610d7d8261291d565b610dbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db3906147af565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60128054610e0490614c5b565b80601f0160208091040260200160405190810160405280929190818152602001828054610e3090614c5b565b8015610e7d5780601f10610e5257610100808354040283529160200191610e7d565b820191906000526020600020905b815481529060010190602001808311610e6057829003601f168201915b505050505081565b6000610e908261147b565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610f01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef89061484f565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610f206128f7565b73ffffffffffffffffffffffffffffffffffffffff161480610f4f5750610f4e81610f496128f7565b6125f3565b5b610f8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f859061470f565b60405180910390fd5b610f988383612989565b505050565b600d5481565b60006015610fb0836117c2565b604051610fbd91906144b5565b908152602001604051809103902060009054906101000a900460ff169050919050565b6000600880549050905090565b600f5481565b611004610ffe6128f7565b82612a42565b611043576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103a9061488f565b60405180910390fd5b61104e838383612b20565b505050565b600061105e836115d2565b821061109f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110969061462f565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6111006128f7565b73ffffffffffffffffffffffffffffffffffffffff1661111e611798565b73ffffffffffffffffffffffffffffffffffffffff1614611174576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116b906147cf565b60405180910390fd5b600061117e611798565b73ffffffffffffffffffffffffffffffffffffffff16476040516111a1906144fd565b60006040518083038185875af1925050503d80600081146111de576040519150601f19603f3d011682016040523d82523d6000602084013e6111e3565b606091505b50509050806111f157600080fd5b50565b61120f83838360405180602001604052806000815250611f08565b505050565b60606000611221836115d2565b905060008167ffffffffffffffff81111561123f5761123e614e23565b5b60405190808252806020026020018201604052801561126d5781602001602082028036833780820191505090505b50905060005b828110156112b7576112858582611053565b82828151811061129857611297614df4565b5b60200260200101818152505080806112af90614cbe565b915050611273565b508092505050919050565b6112ca6128f7565b73ffffffffffffffffffffffffffffffffffffffff166112e8611798565b73ffffffffffffffffffffffffffffffffffffffff161461133e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611335906147cf565b60405180910390fd5b80600d8190555050565b6000611352610fe0565b8210611393576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138a906148af565b60405180910390fd5b600882815481106113a7576113a6614df4565b5b90600052602060002001549050919050565b601160019054906101000a900460ff1681565b60105481565b6113da6128f7565b73ffffffffffffffffffffffffffffffffffffffff166113f8611798565b73ffffffffffffffffffffffffffffffffffffffff161461144e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611445906147cf565b60405180910390fd5b80600b908051906020019061146492919061392f565b5050565b601160009054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611524576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151b9061474f565b60405180910390fd5b80915050919050565b606060146000838152602001908152602001600020805461154d90614c5b565b80601f016020809104026020016040519081016040528092919081815260200182805461157990614c5b565b80156115c65780601f1061159b576101008083540402835291602001916115c6565b820191906000526020600020905b8154815290600101906020018083116115a957829003601f168201915b50505050509050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611643576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163a9061472f565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6116926128f7565b73ffffffffffffffffffffffffffffffffffffffff166116b0611798565b73ffffffffffffffffffffffffffffffffffffffff1614611706576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116fd906147cf565b60405180910390fd5b6117106000612d7c565b565b61171a6128f7565b73ffffffffffffffffffffffffffffffffffffffff16611738611798565b73ffffffffffffffffffffffffffffffffffffffff161461178e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611785906147cf565b60405180910390fd5b80600f8190555050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060008290506000815167ffffffffffffffff8111156117e6576117e5614e23565b5b6040519080825280601f01601f1916602001820160405280156118185781602001600182028036833780820191505090505b50905060005b825181101561196f57604183828151811061183c5761183b614df4565b5b602001015160f81c60f81b60f81c60ff161015801561187f5750605a83828151811061186b5761186a614df4565b5b602001015160f81c60f81b60f81c60ff1611155b156118fb57602083828151811061189957611898614df4565b5b602001015160f81c60f81b60f81c6118b19190614a98565b60f81b8282815181106118c7576118c6614df4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535061195c565b82818151811061190e5761190d614df4565b5b602001015160f81c60f81b82828151811061192c5761192b614df4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b808061196790614cbe565b91505061181e565b508092505050919050565b60606001805461198990614c5b565b80601f01602080910402602001604051908101604052809291908181526020018280546119b590614c5b565b8015611a025780601f106119d757610100808354040283529160200191611a02565b820191906000526020600020905b8154815290600101906020018083116119e557829003601f168201915b5050505050905090565b600080829050600381511015611a26576000915050611ce3565b601981511115611a3a576000915050611ce3565b602060f81b8160018351611a4e9190614b5a565b81518110611a5f57611a5e614df4565b5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415611a9c576000915050611ce3565b600081600081518110611ab257611ab1614df4565b5b602001015160f81c60f81b905060005b8251811015611cdb576000838281518110611ae057611adf614df4565b5b602001015160f81c60f81b9050602060f81b817effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148015611b475750602060f81b837effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b15611b59576000945050505050611ce3565b603060f81b817effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191610158015611bb55750603960f81b817effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191611155b158015611c1b5750604160f81b817effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191610158015611c195750605a60f81b817effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191611155b155b8015611c805750606160f81b817effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191610158015611c7e5750607a60f81b817effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191611155b155b8015611cb25750602060f81b817effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614155b15611cc4576000945050505050611ce3565b809250508080611cd390614cbe565b915050611ac2565b506001925050505b919050565b611cf06128f7565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d55906146cf565b60405180910390fd5b8060056000611d6b6128f7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611e186128f7565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611e5d91906145d2565b60405180910390a35050565b611e716128f7565b73ffffffffffffffffffffffffffffffffffffffff16611e8f611798565b73ffffffffffffffffffffffffffffffffffffffff1614611ee5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611edc906147cf565b60405180910390fd5b6001601160016101000a81548160ff021916908315150217905550565b60165481565b611f19611f136128f7565b83612a42565b611f58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f4f9061488f565b60405180910390fd5b611f6484848484612e42565b50505050565b6000611f758361147b565b90508073ffffffffffffffffffffffffffffffffffffffff16611f966128f7565b73ffffffffffffffffffffffffffffffffffffffff1614611fec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe39061460f565b60405180910390fd5b60011515611ff983611a0c565b15151461203b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120329061486f565b60405180910390fd5b60026014600085815260200190815260200160002060405161205d919061449e565b602060405180830381855afa15801561207a573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061209d9190613d62565b6002836040516120ad9190614487565b602060405180830381855afa1580156120ca573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906120ed9190613d62565b141561212e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612125906147ef565b60405180910390fd5b6000151561213b83610fa3565b15151461217d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121749061478f565b60405180910390fd5b600060146000858152602001908152602001600020805461219d90614c5b565b9050111561224c5761224b6014600085815260200190815260200160002080546121c690614c5b565b80601f01602080910402602001604051908101604052809291908181526020018280546121f290614c5b565b801561223f5780601f106122145761010080835404028352916020019161223f565b820191906000526020600020905b81548152906001019060200180831161222257829003601f168201915b50505050506000612e9e565b5b612257826001612e9e565b8160146000858152602001908152602001600020908051906020019061227e92919061392f565b50601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd33306010546040518463ffffffff1660e01b81526004016122e09392919061452d565b602060405180830381600087803b1580156122fa57600080fd5b505af115801561230e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123329190613d35565b50827f7e632a301794d8d4a81ea7e20f37d1947158d36e66403af04ba85dd194b66f1b8360405161236391906145ed565b60405180910390a2505050565b600c805461237d90614c5b565b80601f01602080910402602001604051908101604052809291908181526020018280546123a990614c5b565b80156123f65780601f106123cb576101008083540402835291602001916123f6565b820191906000526020600020905b8154815290600101906020018083116123d957829003601f168201915b505050505081565b60606124098261291d565b612448576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161243f9061482f565b60405180910390fd5b60001515601160019054906101000a900460ff16151514156124f6576012805461247190614c5b565b80601f016020809104026020016040519081016040528092919081815260200182805461249d90614c5b565b80156124ea5780601f106124bf576101008083540402835291602001916124ea565b820191906000526020600020905b8154815290600101906020018083116124cd57829003601f168201915b50505050509050612552565b6000612500612ee0565b90506000815111612520576040518060200160405280600081525061254e565b8061252a84612f72565b600c60405160200161253e939291906144cc565b6040516020818303038152906040525b9150505b919050565b600e5481565b6125656128f7565b73ffffffffffffffffffffffffffffffffffffffff16612583611798565b73ffffffffffffffffffffffffffffffffffffffff16146125d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125d0906147cf565b60405180910390fd5b80600c90805190602001906125ef92919061392f565b5050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61268f6128f7565b73ffffffffffffffffffffffffffffffffffffffff166126ad611798565b73ffffffffffffffffffffffffffffffffffffffff1614612703576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126fa906147cf565b60405180910390fd5b806012908051906020019061271992919061392f565b5050565b6127256128f7565b73ffffffffffffffffffffffffffffffffffffffff16612743611798565b73ffffffffffffffffffffffffffffffffffffffff1614612799576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612790906147cf565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612809576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128009061466f565b60405180910390fd5b61281281612d7c565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806128e057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806128f057506128ef826130d3565b5b9050919050565b600033905090565b61291982826040518060200160405280600081525061313d565b5050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166129fc8361147b565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612a4d8261291d565b612a8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a83906146ef565b60405180910390fd5b6000612a978361147b565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612b0657508373ffffffffffffffffffffffffffffffffffffffff16612aee84610d72565b73ffffffffffffffffffffffffffffffffffffffff16145b80612b175750612b1681856125f3565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612b408261147b565b73ffffffffffffffffffffffffffffffffffffffff1614612b96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b8d9061480f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612c06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bfd906146af565b60405180910390fd5b612c11838383613198565b612c1c600082612989565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612c6c9190614b5a565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612cc39190614a42565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612e4d848484612b20565b612e59848484846132ac565b612e98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e8f9061464f565b60405180910390fd5b50505050565b806015612eaa846117c2565b604051612eb791906144b5565b908152602001604051809103902060006101000a81548160ff0219169083151502179055505050565b6060600b8054612eef90614c5b565b80601f0160208091040260200160405190810160405280929190818152602001828054612f1b90614c5b565b8015612f685780601f10612f3d57610100808354040283529160200191612f68565b820191906000526020600020905b815481529060010190602001808311612f4b57829003601f168201915b5050505050905090565b60606000821415612fba576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506130ce565b600082905060005b60008214612fec578080612fd590614cbe565b915050600a82612fe59190614acf565b9150612fc2565b60008167ffffffffffffffff81111561300857613007614e23565b5b6040519080825280601f01601f19166020018201604052801561303a5781602001600182028036833780820191505090505b5090505b600085146130c7576001826130539190614b5a565b9150600a856130629190614d07565b603061306e9190614a42565b60f81b81838151811061308457613083614df4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856130c09190614acf565b945061303e565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6131478383613443565b61315460008484846132ac565b613193576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161318a9061464f565b60405180910390fd5b505050565b6131a3838383613611565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156131e6576131e181613616565b613225565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461322457613223838261365f565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561326857613263816137cc565b6132a7565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146132a6576132a5828261389d565b5b5b505050565b60006132cd8473ffffffffffffffffffffffffffffffffffffffff1661391c565b15613436578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026132f66128f7565b8786866040518563ffffffff1660e01b81526004016133189493929190614564565b602060405180830381600087803b15801561333257600080fd5b505af192505050801561336357506040513d601f19601f820116820180604052508101906133609190613dbc565b60015b6133e6573d8060008114613393576040519150601f19603f3d011682016040523d82523d6000602084013e613398565b606091505b506000815114156133de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133d59061464f565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061343b565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156134b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134aa9061476f565b60405180910390fd5b6134bc8161291d565b156134fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134f39061468f565b60405180910390fd5b61350860008383613198565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546135589190614a42565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161366c846115d2565b6136769190614b5a565b905060006007600084815260200190815260200160002054905081811461375b576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506137e09190614b5a565b90506000600960008481526020019081526020016000205490506000600883815481106138105761380f614df4565b5b90600052602060002001549050806008838154811061383257613831614df4565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061388157613880614dc5565b5b6001900381819060005260206000200160009055905550505050565b60006138a8836115d2565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b82805461393b90614c5b565b90600052602060002090601f01602090048101928261395d57600085556139a4565b82601f1061397657805160ff19168380011785556139a4565b828001600101855582156139a4579182015b828111156139a3578251825591602001919060010190613988565b5b5090506139b191906139b5565b5090565b5b808211156139ce5760008160009055506001016139b6565b5090565b60006139e56139e08461492f565b61490a565b905082815260208101848484011115613a0157613a00614e57565b5b613a0c848285614c19565b509392505050565b6000613a27613a2284614960565b61490a565b905082815260208101848484011115613a4357613a42614e57565b5b613a4e848285614c19565b509392505050565b600081359050613a6581615489565b92915050565b600081359050613a7a816154a0565b92915050565b600081519050613a8f816154a0565b92915050565b600081519050613aa4816154b7565b92915050565b600081359050613ab9816154ce565b92915050565b600081519050613ace816154ce565b92915050565b600082601f830112613ae957613ae8614e52565b5b8135613af98482602086016139d2565b91505092915050565b600082601f830112613b1757613b16614e52565b5b8135613b27848260208601613a14565b91505092915050565b600081359050613b3f816154e5565b92915050565b600060208284031215613b5b57613b5a614e61565b5b6000613b6984828501613a56565b91505092915050565b60008060408385031215613b8957613b88614e61565b5b6000613b9785828601613a56565b9250506020613ba885828601613a56565b9150509250929050565b600080600060608486031215613bcb57613bca614e61565b5b6000613bd986828701613a56565b9350506020613bea86828701613a56565b9250506040613bfb86828701613b30565b9150509250925092565b60008060008060808587031215613c1f57613c1e614e61565b5b6000613c2d87828801613a56565b9450506020613c3e87828801613a56565b9350506040613c4f87828801613b30565b925050606085013567ffffffffffffffff811115613c7057613c6f614e5c565b5b613c7c87828801613ad4565b91505092959194509250565b60008060408385031215613c9f57613c9e614e61565b5b6000613cad85828601613a56565b9250506020613cbe85828601613a6b565b9150509250929050565b60008060408385031215613cdf57613cde614e61565b5b6000613ced85828601613a56565b9250506020613cfe85828601613b30565b9150509250929050565b600060208284031215613d1e57613d1d614e61565b5b6000613d2c84828501613a6b565b91505092915050565b600060208284031215613d4b57613d4a614e61565b5b6000613d5984828501613a80565b91505092915050565b600060208284031215613d7857613d77614e61565b5b6000613d8684828501613a95565b91505092915050565b600060208284031215613da557613da4614e61565b5b6000613db384828501613aaa565b91505092915050565b600060208284031215613dd257613dd1614e61565b5b6000613de084828501613abf565b91505092915050565b600060208284031215613dff57613dfe614e61565b5b600082013567ffffffffffffffff811115613e1d57613e1c614e5c565b5b613e2984828501613b02565b91505092915050565b600060208284031215613e4857613e47614e61565b5b6000613e5684828501613b30565b91505092915050565b60008060408385031215613e7657613e75614e61565b5b6000613e8485828601613b30565b925050602083013567ffffffffffffffff811115613ea557613ea4614e5c565b5b613eb185828601613b02565b9150509250929050565b6000613ec78383614469565b60208301905092915050565b613edc81614b8e565b82525050565b6000613eed826149cb565b613ef781856149f9565b9350613f0283614991565b8060005b83811015613f33578151613f1a8882613ebb565b9750613f25836149ec565b925050600181019050613f06565b5085935050505092915050565b613f4981614ba0565b82525050565b6000613f5a826149d6565b613f648185614a0a565b9350613f74818560208601614c28565b613f7d81614e66565b840191505092915050565b6000613f93826149d6565b613f9d8185614a1b565b9350613fad818560208601614c28565b80840191505092915050565b60008154613fc681614c5b565b613fd08186614a1b565b94506001821660008114613feb5760018114613ffc5761402f565b60ff1983168652818601935061402f565b614005856149a1565b60005b8381101561402757815481890152600182019150602081019050614008565b838801955050505b50505092915050565b6000614043826149e1565b61404d8185614a26565b935061405d818560208601614c28565b61406681614e66565b840191505092915050565b600061407c826149e1565b6140868185614a37565b9350614096818560208601614c28565b80840191505092915050565b600081546140af81614c5b565b6140b98186614a37565b945060018216600081146140d457600181146140e557614118565b60ff19831686528186019350614118565b6140ee856149b6565b60005b83811015614110578154818901526001820191506020810190506140f1565b838801955050505b50505092915050565b600061412e601f83614a26565b915061413982614e77565b602082019050919050565b6000614151602b83614a26565b915061415c82614ea0565b604082019050919050565b6000614174603283614a26565b915061417f82614eef565b604082019050919050565b6000614197602683614a26565b91506141a282614f3e565b604082019050919050565b60006141ba601c83614a26565b91506141c582614f8d565b602082019050919050565b60006141dd602483614a26565b91506141e882614fb6565b604082019050919050565b6000614200601983614a26565b915061420b82615005565b602082019050919050565b6000614223602c83614a26565b915061422e8261502e565b604082019050919050565b6000614246603883614a26565b91506142518261507d565b604082019050919050565b6000614269602a83614a26565b9150614274826150cc565b604082019050919050565b600061428c602983614a26565b91506142978261511b565b604082019050919050565b60006142af602083614a26565b91506142ba8261516a565b602082019050919050565b60006142d2601583614a26565b91506142dd82615193565b602082019050919050565b60006142f5602c83614a26565b9150614300826151bc565b604082019050919050565b6000614318602083614a26565b91506143238261520b565b602082019050919050565b600061433b602483614a26565b915061434682615234565b604082019050919050565b600061435e602983614a26565b915061436982615283565b604082019050919050565b6000614381602f83614a26565b915061438c826152d2565b604082019050919050565b60006143a4602183614a26565b91506143af82615321565b604082019050919050565b60006143c7600083614a1b565b91506143d282615370565b600082019050919050565b60006143ea601083614a26565b91506143f582615373565b602082019050919050565b600061440d603183614a26565b91506144188261539c565b604082019050919050565b6000614430602c83614a26565b915061443b826153eb565b604082019050919050565b6000614453602183614a26565b915061445e8261543a565b604082019050919050565b61447281614c02565b82525050565b61448181614c02565b82525050565b60006144938284613f88565b915081905092915050565b60006144aa8284613fb9565b915081905092915050565b60006144c18284614071565b915081905092915050565b60006144d88286614071565b91506144e48285614071565b91506144f082846140a2565b9150819050949350505050565b6000614508826143ba565b9150819050919050565b60006020820190506145276000830184613ed3565b92915050565b60006060820190506145426000830186613ed3565b61454f6020830185613ed3565b61455c6040830184614478565b949350505050565b60006080820190506145796000830187613ed3565b6145866020830186613ed3565b6145936040830185614478565b81810360608301526145a58184613f4f565b905095945050505050565b600060208201905081810360008301526145ca8184613ee2565b905092915050565b60006020820190506145e76000830184613f40565b92915050565b600060208201905081810360008301526146078184614038565b905092915050565b6000602082019050818103600083015261462881614121565b9050919050565b6000602082019050818103600083015261464881614144565b9050919050565b6000602082019050818103600083015261466881614167565b9050919050565b600060208201905081810360008301526146888161418a565b9050919050565b600060208201905081810360008301526146a8816141ad565b9050919050565b600060208201905081810360008301526146c8816141d0565b9050919050565b600060208201905081810360008301526146e8816141f3565b9050919050565b6000602082019050818103600083015261470881614216565b9050919050565b6000602082019050818103600083015261472881614239565b9050919050565b600060208201905081810360008301526147488161425c565b9050919050565b600060208201905081810360008301526147688161427f565b9050919050565b60006020820190508181036000830152614788816142a2565b9050919050565b600060208201905081810360008301526147a8816142c5565b9050919050565b600060208201905081810360008301526147c8816142e8565b9050919050565b600060208201905081810360008301526147e88161430b565b9050919050565b600060208201905081810360008301526148088161432e565b9050919050565b6000602082019050818103600083015261482881614351565b9050919050565b6000602082019050818103600083015261484881614374565b9050919050565b6000602082019050818103600083015261486881614397565b9050919050565b60006020820190508181036000830152614888816143dd565b9050919050565b600060208201905081810360008301526148a881614400565b9050919050565b600060208201905081810360008301526148c881614423565b9050919050565b600060208201905081810360008301526148e881614446565b9050919050565b60006020820190506149046000830184614478565b92915050565b6000614914614925565b90506149208282614c8d565b919050565b6000604051905090565b600067ffffffffffffffff82111561494a57614949614e23565b5b61495382614e66565b9050602081019050919050565b600067ffffffffffffffff82111561497b5761497a614e23565b5b61498482614e66565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614a4d82614c02565b9150614a5883614c02565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614a8d57614a8c614d38565b5b828201905092915050565b6000614aa382614c0c565b9150614aae83614c0c565b92508260ff03821115614ac457614ac3614d38565b5b828201905092915050565b6000614ada82614c02565b9150614ae583614c02565b925082614af557614af4614d67565b5b828204905092915050565b6000614b0b82614c02565b9150614b1683614c02565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614b4f57614b4e614d38565b5b828202905092915050565b6000614b6582614c02565b9150614b7083614c02565b925082821015614b8357614b82614d38565b5b828203905092915050565b6000614b9982614be2565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015614c46578082015181840152602081019050614c2b565b83811115614c55576000848401525b50505050565b60006002820490506001821680614c7357607f821691505b60208210811415614c8757614c86614d96565b5b50919050565b614c9682614e66565b810181811067ffffffffffffffff82111715614cb557614cb4614e23565b5b80604052505050565b6000614cc982614c02565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614cfc57614cfb614d38565b5b600182019050919050565b6000614d1282614c02565b9150614d1d83614c02565b925082614d2d57614d2c614d67565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746865206f776e657200600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4e616d6520616c72656164792072657365727665640000000000000000000000600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4e6577206e616d652069732073616d65206173207468652063757272656e742060008201527f6e616d6500000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f4e6f7420612076616c6964206e616d6500000000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f43616e6e6f7420627579206d6f7265207468616e2035207065722077616c6c6560008201527f7400000000000000000000000000000000000000000000000000000000000000602082015250565b61549281614b8e565b811461549d57600080fd5b50565b6154a981614ba0565b81146154b457600080fd5b50565b6154c081614bac565b81146154cb57600080fd5b50565b6154d781614bb6565b81146154e257600080fd5b50565b6154ee81614c02565b81146154f957600080fd5b5056fea26469706673582212208e7527edf40c28ed231f5ca03f4cea57a3a03d8f9f52be75747bcaf8b47ae71b64736f6c6343000807003300000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001600000000000000000000000005defafd6feced6e37766ece63e3e11942b21466400000000000000000000000000000000000000000000000000000000000000184261627920506978656c20446f6f646c65642050756e6b730000000000000000000000000000000000000000000000000000000000000000000000000000000462504450000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000014697066733a2f2f746f626572657665616c65642f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000041697066733a2f2f516d624d48386941466a526943773357795070515a78696a4c4c42357a72644871414b585637427539746b5542482f68696464656e2e6a736f6e00000000000000000000000000000000000000000000000000000000000000

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

00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001600000000000000000000000005defafd6feced6e37766ece63e3e11942b21466400000000000000000000000000000000000000000000000000000000000000184261627920506978656c20446f6f646c65642050756e6b730000000000000000000000000000000000000000000000000000000000000000000000000000000462504450000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000014697066733a2f2f746f626572657665616c65642f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000041697066733a2f2f516d624d48386941466a526943773357795070515a78696a4c4c42357a72644871414b585637427539746b5542482f68696464656e2e6a736f6e00000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _name (string): Baby Pixel Doodled Punks
Arg [1] : _symbol (string): bPDP
Arg [2] : _initBaseURI (string): ipfs://toberevealed/
Arg [3] : _initNotRevealedUri (string): ipfs://QmbMH8iAFjRiCw3WyPpQZxijLLB5zrdHqAKXV7Bu9tkUBH/hidden.json
Arg [4] : dpunkAddress (address): 0x5defafd6feced6e37766ece63e3e11942b214664

-----Encoded View---------------
15 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000160
Arg [4] : 0000000000000000000000005defafd6feced6e37766ece63e3e11942b214664
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000018
Arg [6] : 4261627920506978656c20446f6f646c65642050756e6b730000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [8] : 6250445000000000000000000000000000000000000000000000000000000000
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000014
Arg [10] : 697066733a2f2f746f626572657665616c65642f000000000000000000000000
Arg [11] : 0000000000000000000000000000000000000000000000000000000000000041
Arg [12] : 697066733a2f2f516d624d48386941466a526943773357795070515a78696a4c
Arg [13] : 4c42357a72644871414b585637427539746b5542482f68696464656e2e6a736f
Arg [14] : 6e00000000000000000000000000000000000000000000000000000000000000


Deployed ByteCode Sourcemap

52240:5798:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43787:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55481:73;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53418:543;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31679:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33238:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52619:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32761:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52398:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55832:133;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44427:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52470:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34128:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44095:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55561:145;;;:::i;:::-;;34538:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53967:348;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54913:80;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44617:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52586:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52507:44;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55249:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52556:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31373:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55712:114;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31103:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51576:94;;;;;;;;;;;;;:::i;:::-;;54999:116;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50925:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57587:448;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31848:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56887:696;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33531:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54840:65;;;;;;;;;;;;;:::i;:::-;;52788:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34794:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55971:779;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52356:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54321:497;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52434:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55353:122;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33897:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55123:120;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51825:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43787:224;43889:4;43928:35;43913:50;;;:11;:50;;;;:90;;;;43967:36;43991:11;43967:23;:36::i;:::-;43913:90;43906:97;;43787:224;;;:::o;55481:73::-;51156:12;:10;:12::i;:::-;51145:23;;:7;:5;:7::i;:::-;:23;;;51137:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55542:6:::1;55533;;:15;;;;;;;;;;;;;;;;;;55481:73:::0;:::o;53418:543::-;53471:14;53488:13;:11;:13::i;:::-;53471:30;;53517:6;;;;;;;;;;;53516:7;53508:16;;;;;;53553:1;53539:11;:15;53531:24;;;;;;53585:13;;53570:11;:28;;53562:37;;;;;;53638:9;;53623:11;53614:6;:20;;;;:::i;:::-;:33;;53606:42;;;;;;53704:16;;53688:11;53664:21;53674:10;53664:9;:21::i;:::-;:35;;;;:::i;:::-;53663:57;;53655:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;53774:13;;;;;;;;;;;53767:34;;;53802:10;53822:4;53836:11;53829:4;;:18;;;;:::i;:::-;53767:81;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;53868:9;53880:1;53868:13;;53863:93;53888:11;53883:1;:16;53863:93;;53915:33;53925:10;53946:1;53937:6;:10;;;;:::i;:::-;53915:9;:33::i;:::-;53901:3;;;;;:::i;:::-;;;;53863:93;;;;53464:497;53418:543;:::o;31679:100::-;31733:13;31766:5;31759:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31679:100;:::o;33238:221::-;33314:7;33342:16;33350:7;33342;:16::i;:::-;33334:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;33427:15;:24;33443:7;33427:24;;;;;;;;;;;;;;;;;;;;;33420:31;;33238:221;;;:::o;52619:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;32761:411::-;32842:13;32858:23;32873:7;32858:14;:23::i;:::-;32842:39;;32906:5;32900:11;;:2;:11;;;;32892:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;33000:5;32984:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;33009:37;33026:5;33033:12;:10;:12::i;:::-;33009:16;:37::i;:::-;32984:62;32962:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;33143:21;33152:2;33156:7;33143:8;:21::i;:::-;32831:341;32761:411;;:::o;52398:31::-;;;;:::o;55832:133::-;55903:4;55925:13;55939:19;55947:10;55939:7;:19::i;:::-;55925:34;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;55918:41;;55832:133;;;:::o;44427:113::-;44488:7;44515:10;:17;;;;44508:24;;44427:113;:::o;52470:32::-;;;;:::o;34128:339::-;34323:41;34342:12;:10;:12::i;:::-;34356:7;34323:18;:41::i;:::-;34315:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;34431:28;34441:4;34447:2;34451:7;34431:9;:28::i;:::-;34128:339;;;:::o;44095:256::-;44192:7;44228:23;44245:5;44228:16;:23::i;:::-;44220:5;:31;44212:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;44317:12;:19;44330:5;44317:19;;;;;;;;;;;;;;;:26;44337:5;44317:26;;;;;;;;;;;;44310:33;;44095:256;;;;:::o;55561:145::-;51156:12;:10;:12::i;:::-;51145:23;;:7;:5;:7::i;:::-;:23;;;51137:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55614:7:::1;55635;:5;:7::i;:::-;55627:21;;55656;55627:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55613:69;;;55697:2;55689:11;;;::::0;::::1;;55606:100;55561:145::o:0;34538:185::-;34676:39;34693:4;34699:2;34703:7;34676:39;;;;;;;;;;;;:16;:39::i;:::-;34538:185;;;:::o;53967:348::-;54042:16;54070:23;54096:17;54106:6;54096:9;:17::i;:::-;54070:43;;54120:25;54162:15;54148:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54120:58;;54190:9;54185:103;54205:15;54201:1;:19;54185:103;;;54250:30;54270:6;54278:1;54250:19;:30::i;:::-;54236:8;54245:1;54236:11;;;;;;;;:::i;:::-;;;;;;;:44;;;;;54222:3;;;;;:::i;:::-;;;;54185:103;;;;54301:8;54294:15;;;;53967:348;;;:::o;54913:80::-;51156:12;:10;:12::i;:::-;51145:23;;:7;:5;:7::i;:::-;:23;;;51137:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54979:8:::1;54972:4;:15;;;;54913:80:::0;:::o;44617:233::-;44692:7;44728:30;:28;:30::i;:::-;44720:5;:38;44712:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;44825:10;44836:5;44825:17;;;;;;;;:::i;:::-;;;;;;;;;;44818:24;;44617:233;;;:::o;52586:28::-;;;;;;;;;;;;;:::o;52507:44::-;;;;:::o;55249:98::-;51156:12;:10;:12::i;:::-;51145:23;;:7;:5;:7::i;:::-;:23;;;51137:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55330:11:::1;55320:7;:21;;;;;;;;;;;;:::i;:::-;;55249:98:::0;:::o;52556:25::-;;;;;;;;;;;;;:::o;31373:239::-;31445:7;31465:13;31481:7;:16;31489:7;31481:16;;;;;;;;;;;;;;;;;;;;;31465:32;;31533:1;31516:19;;:5;:19;;;;31508:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;31599:5;31592:12;;;31373:239;;;:::o;55712:114::-;55774:13;55803:10;:17;55814:5;55803:17;;;;;;;;;;;55796:24;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55712:114;;;:::o;31103:208::-;31175:7;31220:1;31203:19;;:5;:19;;;;31195:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;31287:9;:16;31297:5;31287:16;;;;;;;;;;;;;;;;31280:23;;31103:208;;;:::o;51576:94::-;51156:12;:10;:12::i;:::-;51145:23;;:7;:5;:7::i;:::-;:23;;;51137:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51641:21:::1;51659:1;51641:9;:21::i;:::-;51576:94::o:0;54999:116::-;51156:12;:10;:12::i;:::-;51145:23;;:7;:5;:7::i;:::-;:23;;;51137:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55092:17:::1;55076:13;:33;;;;54999:116:::0;:::o;50925:87::-;50971:7;50998:6;;;;;;;;;;;50991:13;;50925:87;:::o;57587:448::-;57644:13;57668:17;57694:3;57668:30;;57707:19;57739:4;:11;57729:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57707:44;;57765:6;57760:240;57781:4;:11;57777:1;:15;57760:240;;;57835:2;57823:4;57828:1;57823:7;;;;;;;;:::i;:::-;;;;;;;;;;57817:14;;:20;;;;57816:48;;;;;57861:2;57849:4;57854:1;57849:7;;;;;;;;:::i;:::-;;;;;;;;;;57843:14;;:20;;;;57816:48;57812:179;;;57918:2;57907:4;57912:1;57907:7;;;;;;;;:::i;:::-;;;;;;;;;;57901:14;;:19;;;;:::i;:::-;57894:27;;57882:6;57889:1;57882:9;;;;;;;;:::i;:::-;;;;;:39;;;;;;;;;;;57812:179;;;57970:4;57975:1;57970:7;;;;;;;;:::i;:::-;;;;;;;;;;57958:6;57965:1;57958:9;;;;;;;;:::i;:::-;;;;;:19;;;;;;;;;;;57812:179;57794:3;;;;;:::i;:::-;;;;57760:240;;;;58022:6;58008:21;;;;57587:448;;;:::o;31848:104::-;31904:13;31937:7;31930:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31848:104;:::o;56887:696::-;56949:4;56964:14;56987:3;56964:27;;57014:1;57003;:8;:12;57000:29;;;57024:5;57017:12;;;;;57000:29;57052:2;57041:1;:8;:13;57038:30;;;57063:5;57056:12;;;;;57038:30;57099:4;57080:23;;:1;57093;57082;:8;:12;;;;:::i;:::-;57080:15;;;;;;;;:::i;:::-;;;;;;;;;;:23;;;;57077:40;;;57112:5;57105:12;;;;;57077:40;57128:15;57146:1;57148;57146:4;;;;;;;;:::i;:::-;;;;;;;;;;57128:22;;57165:6;57161:397;57175:1;:8;57173:1;:10;57161:397;;;57202:11;57216:1;57218;57216:4;;;;;;;;:::i;:::-;;;;;;;;;;57202:18;;57247:4;57239:12;;:4;:12;;;;:32;;;;;57267:4;57255:16;;:8;:16;;;;57239:32;57235:50;;;57280:5;57273:12;;;;;;;;57235:50;57328:4;57320:12;;:4;:12;;;;;:28;;;;;57344:4;57336:12;;:4;:12;;;;;57320:28;57318:31;:81;;;;;57378:4;57370:12;;:4;:12;;;;;:28;;;;;57394:4;57386:12;;:4;:12;;;;;57370:28;57368:31;57318:81;:131;;;;;57428:4;57420:12;;:4;:12;;;;;:28;;;;;57444:4;57436:12;;:4;:12;;;;;57420:28;57418:31;57318:131;:165;;;;;57478:4;57470:12;;:4;:12;;;;57468:15;57318:165;57298:222;;;57515:5;57508:12;;;;;;;;57298:222;57544:4;57533:15;;57189:369;57185:3;;;;;:::i;:::-;;;;57161:397;;;;57573:4;57566:11;;;;56887:696;;;;:::o;33531:295::-;33646:12;:10;:12::i;:::-;33634:24;;:8;:24;;;;33626:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;33746:8;33701:18;:32;33720:12;:10;:12::i;:::-;33701:32;;;;;;;;;;;;;;;:42;33734:8;33701:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;33799:8;33770:48;;33785:12;:10;:12::i;:::-;33770:48;;;33809:8;33770:48;;;;;;:::i;:::-;;;;;;;;33531:295;;:::o;54840:65::-;51156:12;:10;:12::i;:::-;51145:23;;:7;:5;:7::i;:::-;:23;;;51137:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54895:4:::1;54884:8;;:15;;;;;;;;;;;;;;;;;;54840:65::o:0;52788:35::-;;;;:::o;34794:328::-;34969:41;34988:12;:10;:12::i;:::-;35002:7;34969:18;:41::i;:::-;34961:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;35075:39;35089:4;35095:2;35099:7;35108:5;35075:13;:39::i;:::-;34794:328;;;;:::o;55971:779::-;56047:13;56063:16;56071:7;56063;:16::i;:::-;56047:32;;56112:5;56096:21;;:12;:10;:12::i;:::-;:21;;;56088:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;56195:4;56170:29;;:21;56183:7;56170:12;:21::i;:::-;:29;;;56162:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;56263:34;56276:10;:19;56287:7;56276:19;;;;;;;;;;;56263:34;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;56237:22;56250:7;56237:22;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:60;;56229:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;56382:5;56355:32;;:23;56370:7;56355:14;:23::i;:::-;:32;;;56347:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;56464:1;56434:10;:19;56445:7;56434:19;;;;;;;;;;;56428:33;;;;;:::i;:::-;;;:37;56424:111;;;56480:45;56498:10;:19;56509:7;56498:19;;;;;;;;;;;56480:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56519:5;56480:17;:45::i;:::-;56424:111;56543:32;56561:7;56570:4;56543:17;:32::i;:::-;56606:7;56584:10;:19;56595:7;56584:19;;;;;;;;;;;:29;;;;;;;;;;;;:::i;:::-;;56629:13;;;;;;;;;;;56622:34;;;56657:10;56677:4;56684:17;;56622:80;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;56727:7;56716:28;56736:7;56716:28;;;;;;:::i;:::-;;;;;;;;56038:712;55971:779;;:::o;52356:37::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;54321:497::-;54419:13;54460:16;54468:7;54460;:16::i;:::-;54444:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;54569:5;54557:17;;:8;;;;;;;;;;;:17;;;54554:62;;;54594:14;54587:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54554:62;54624:28;54655:10;:8;:10::i;:::-;54624:41;;54710:1;54685:14;54679:28;:32;:133;;;;;;;;;;;;;;;;;54747:14;54763:18;:7;:16;:18::i;:::-;54783:13;54730:67;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;54679:133;54672:140;;;54321:497;;;;:::o;52434:31::-;;;;:::o;55353:122::-;51156:12;:10;:12::i;:::-;51145:23;;:7;:5;:7::i;:::-;:23;;;51137:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55452:17:::1;55436:13;:33;;;;;;;;;;;;:::i;:::-;;55353:122:::0;:::o;33897:164::-;33994:4;34018:18;:25;34037:5;34018:25;;;;;;;;;;;;;;;:35;34044:8;34018:35;;;;;;;;;;;;;;;;;;;;;;;;;34011:42;;33897:164;;;;:::o;55123:120::-;51156:12;:10;:12::i;:::-;51145:23;;:7;:5;:7::i;:::-;:23;;;51137:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55222:15:::1;55205:14;:32;;;;;;;;;;;;:::i;:::-;;55123:120:::0;:::o;51825:192::-;51156:12;:10;:12::i;:::-;51145:23;;:7;:5;:7::i;:::-;:23;;;51137:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51934:1:::1;51914:22;;:8;:22;;;;51906:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;51990:19;52000:8;51990:9;:19::i;:::-;51825:192:::0;:::o;30734:305::-;30836:4;30888:25;30873:40;;;:11;:40;;;;:105;;;;30945:33;30930:48;;;:11;:48;;;;30873:105;:158;;;;30995:36;31019:11;30995:23;:36::i;:::-;30873:158;30853:178;;30734:305;;;:::o;29208:98::-;29261:7;29288:10;29281:17;;29208:98;:::o;37616:110::-;37692:26;37702:2;37706:7;37692:26;;;;;;;;;;;;:9;:26::i;:::-;37616:110;;:::o;36632:127::-;36697:4;36749:1;36721:30;;:7;:16;36729:7;36721:16;;;;;;;;;;;;;;;;;;;;;:30;;;;36714:37;;36632:127;;;:::o;40614:174::-;40716:2;40689:15;:24;40705:7;40689:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;40772:7;40768:2;40734:46;;40743:23;40758:7;40743:14;:23::i;:::-;40734:46;;;;;;;;;;;;40614:174;;:::o;36926:348::-;37019:4;37044:16;37052:7;37044;:16::i;:::-;37036:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;37120:13;37136:23;37151:7;37136:14;:23::i;:::-;37120:39;;37189:5;37178:16;;:7;:16;;;:51;;;;37222:7;37198:31;;:20;37210:7;37198:11;:20::i;:::-;:31;;;37178:51;:87;;;;37233:32;37250:5;37257:7;37233:16;:32::i;:::-;37178:87;37170:96;;;36926:348;;;;:::o;39918:578::-;40077:4;40050:31;;:23;40065:7;40050:14;:23::i;:::-;:31;;;40042:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;40160:1;40146:16;;:2;:16;;;;40138:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;40216:39;40237:4;40243:2;40247:7;40216:20;:39::i;:::-;40320:29;40337:1;40341:7;40320:8;:29::i;:::-;40381:1;40362:9;:15;40372:4;40362:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;40410:1;40393:9;:13;40403:2;40393:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;40441:2;40422:7;:16;40430:7;40422:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;40480:7;40476:2;40461:27;;40470:4;40461:27;;;;;;;;;;;;39918:578;;;:::o;52025:173::-;52081:16;52100:6;;;;;;;;;;;52081:25;;52126:8;52117:6;;:17;;;;;;;;;;;;;;;;;;52181:8;52150:40;;52171:8;52150:40;;;;;;;;;;;;52070:128;52025:173;:::o;36004:315::-;36161:28;36171:4;36177:2;36181:7;36161:9;:28::i;:::-;36208:48;36231:4;36237:2;36241:7;36250:5;36208:22;:48::i;:::-;36200:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;36004:315;;;;:::o;56756:125::-;56866:9;56836:13;56850:12;56858:3;56850:7;:12::i;:::-;56836:27;;;;;;:::i;:::-;;;;;;;;;;;;;;:39;;;;;;;;;;;;;;;;;;56756:125;;:::o;53297:102::-;53357:13;53386:7;53379:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53297:102;:::o;17040:723::-;17096:13;17326:1;17317:5;:10;17313:53;;;17344:10;;;;;;;;;;;;;;;;;;;;;17313:53;17376:12;17391:5;17376:20;;17407:14;17432:78;17447:1;17439:4;:9;17432:78;;17465:8;;;;;:::i;:::-;;;;17496:2;17488:10;;;;;:::i;:::-;;;17432:78;;;17520:19;17552:6;17542:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17520:39;;17570:154;17586:1;17577:5;:10;17570:154;;17614:1;17604:11;;;;;:::i;:::-;;;17681:2;17673:5;:10;;;;:::i;:::-;17660:2;:24;;;;:::i;:::-;17647:39;;17630:6;17637;17630:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;17710:2;17701:11;;;;;:::i;:::-;;;17570:154;;;17748:6;17734:21;;;;;17040:723;;;;:::o;16569:157::-;16654:4;16693:25;16678:40;;;:11;:40;;;;16671:47;;16569:157;;;:::o;37953:321::-;38083:18;38089:2;38093:7;38083:5;:18::i;:::-;38134:54;38165:1;38169:2;38173:7;38182:5;38134:22;:54::i;:::-;38112:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;37953:321;;;:::o;45463:589::-;45607:45;45634:4;45640:2;45644:7;45607:26;:45::i;:::-;45685:1;45669:18;;:4;:18;;;45665:187;;;45704:40;45736:7;45704:31;:40::i;:::-;45665:187;;;45774:2;45766:10;;:4;:10;;;45762:90;;45793:47;45826:4;45832:7;45793:32;:47::i;:::-;45762:90;45665:187;45880:1;45866:16;;:2;:16;;;45862:183;;;45899:45;45936:7;45899:36;:45::i;:::-;45862:183;;;45972:4;45966:10;;:2;:10;;;45962:83;;45993:40;46021:2;46025:7;45993:27;:40::i;:::-;45962:83;45862:183;45463:589;;;:::o;41353:799::-;41508:4;41529:15;:2;:13;;;:15::i;:::-;41525:620;;;41581:2;41565:36;;;41602:12;:10;:12::i;:::-;41616:4;41622:7;41631:5;41565:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;41561:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41824:1;41807:6;:13;:18;41803:272;;;41850:60;;;;;;;;;;:::i;:::-;;;;;;;;41803:272;42025:6;42019:13;42010:6;42006:2;42002:15;41995:38;41561:529;41698:41;;;41688:51;;;:6;:51;;;;41681:58;;;;;41525:620;42129:4;42122:11;;41353:799;;;;;;;:::o;38610:382::-;38704:1;38690:16;;:2;:16;;;;38682:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;38763:16;38771:7;38763;:16::i;:::-;38762:17;38754:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;38825:45;38854:1;38858:2;38862:7;38825:20;:45::i;:::-;38900:1;38883:9;:13;38893:2;38883:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;38931:2;38912:7;:16;38920:7;38912:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;38976:7;38972:2;38951:33;;38968:1;38951:33;;;;;;;;;;;;38610:382;;:::o;42724:126::-;;;;:::o;46775:164::-;46879:10;:17;;;;46852:15;:24;46868:7;46852:24;;;;;;;;;;;:44;;;;46907:10;46923:7;46907:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46775:164;:::o;47566:988::-;47832:22;47882:1;47857:22;47874:4;47857:16;:22::i;:::-;:26;;;;:::i;:::-;47832:51;;47894:18;47915:17;:26;47933:7;47915:26;;;;;;;;;;;;47894:47;;48062:14;48048:10;:28;48044:328;;48093:19;48115:12;:18;48128:4;48115:18;;;;;;;;;;;;;;;:34;48134:14;48115:34;;;;;;;;;;;;48093:56;;48199:11;48166:12;:18;48179:4;48166:18;;;;;;;;;;;;;;;:30;48185:10;48166:30;;;;;;;;;;;:44;;;;48316:10;48283:17;:30;48301:11;48283:30;;;;;;;;;;;:43;;;;48078:294;48044:328;48468:17;:26;48486:7;48468:26;;;;;;;;;;;48461:33;;;48512:12;:18;48525:4;48512:18;;;;;;;;;;;;;;;:34;48531:14;48512:34;;;;;;;;;;;48505:41;;;47647:907;;47566:988;;:::o;48849:1079::-;49102:22;49147:1;49127:10;:17;;;;:21;;;;:::i;:::-;49102:46;;49159:18;49180:15;:24;49196:7;49180:24;;;;;;;;;;;;49159:45;;49531:19;49553:10;49564:14;49553:26;;;;;;;;:::i;:::-;;;;;;;;;;49531:48;;49617:11;49592:10;49603;49592:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;49728:10;49697:15;:28;49713:11;49697:28;;;;;;;;;;;:41;;;;49869:15;:24;49885:7;49869:24;;;;;;;;;;;49862:31;;;49904:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;48920:1008;;;48849:1079;:::o;46353:221::-;46438:14;46455:20;46472:2;46455:16;:20::i;:::-;46438:37;;46513:7;46486:12;:16;46499:2;46486:16;;;;;;;;;;;;;;;:24;46503:6;46486:24;;;;;;;;;;;:34;;;;46560:6;46531:17;:26;46549:7;46531:26;;;;;;;;;;;:35;;;;46427:147;46353:221;;:::o;19565:387::-;19625:4;19833:12;19900:7;19888:20;19880:28;;19943:1;19936:4;:8;19929:15;;;19565:387;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1179:5;1210:6;1204:13;1195:22;;1226:30;1250:5;1226:30;:::i;:::-;1125:137;;;;:::o;1268:143::-;1325:5;1356:6;1350:13;1341:22;;1372:33;1399:5;1372:33;:::i;:::-;1268:143;;;;:::o;1417:137::-;1462:5;1500:6;1487:20;1478:29;;1516:32;1542:5;1516:32;:::i;:::-;1417:137;;;;:::o;1560:141::-;1616:5;1647:6;1641:13;1632:22;;1663:32;1689:5;1663:32;:::i;:::-;1560:141;;;;:::o;1720:338::-;1775:5;1824:3;1817:4;1809:6;1805:17;1801:27;1791:122;;1832:79;;:::i;:::-;1791:122;1949:6;1936:20;1974:78;2048:3;2040:6;2033:4;2025:6;2021:17;1974:78;:::i;:::-;1965:87;;1781:277;1720:338;;;;:::o;2078:340::-;2134:5;2183:3;2176:4;2168:6;2164:17;2160:27;2150:122;;2191:79;;:::i;:::-;2150:122;2308:6;2295:20;2333:79;2408:3;2400:6;2393:4;2385:6;2381:17;2333:79;:::i;:::-;2324:88;;2140:278;2078:340;;;;:::o;2424:139::-;2470:5;2508:6;2495:20;2486:29;;2524:33;2551:5;2524:33;:::i;:::-;2424:139;;;;:::o;2569:329::-;2628:6;2677:2;2665:9;2656:7;2652:23;2648:32;2645:119;;;2683:79;;:::i;:::-;2645:119;2803:1;2828:53;2873:7;2864:6;2853:9;2849:22;2828:53;:::i;:::-;2818:63;;2774:117;2569:329;;;;:::o;2904:474::-;2972:6;2980;3029:2;3017:9;3008:7;3004:23;3000:32;2997:119;;;3035:79;;:::i;:::-;2997:119;3155:1;3180:53;3225:7;3216:6;3205:9;3201:22;3180:53;:::i;:::-;3170:63;;3126:117;3282:2;3308:53;3353:7;3344:6;3333:9;3329:22;3308:53;:::i;:::-;3298:63;;3253:118;2904:474;;;;;:::o;3384:619::-;3461:6;3469;3477;3526:2;3514:9;3505:7;3501:23;3497:32;3494:119;;;3532:79;;:::i;:::-;3494:119;3652:1;3677:53;3722:7;3713:6;3702:9;3698:22;3677:53;:::i;:::-;3667:63;;3623:117;3779:2;3805:53;3850:7;3841:6;3830:9;3826:22;3805:53;:::i;:::-;3795:63;;3750:118;3907:2;3933:53;3978:7;3969:6;3958:9;3954:22;3933:53;:::i;:::-;3923:63;;3878:118;3384:619;;;;;:::o;4009:943::-;4104:6;4112;4120;4128;4177:3;4165:9;4156:7;4152:23;4148:33;4145:120;;;4184:79;;:::i;:::-;4145:120;4304:1;4329:53;4374:7;4365:6;4354:9;4350:22;4329:53;:::i;:::-;4319:63;;4275:117;4431:2;4457:53;4502:7;4493:6;4482:9;4478:22;4457:53;:::i;:::-;4447:63;;4402:118;4559:2;4585:53;4630:7;4621:6;4610:9;4606:22;4585:53;:::i;:::-;4575:63;;4530:118;4715:2;4704:9;4700:18;4687:32;4746:18;4738:6;4735:30;4732:117;;;4768:79;;:::i;:::-;4732:117;4873:62;4927:7;4918:6;4907:9;4903:22;4873:62;:::i;:::-;4863:72;;4658:287;4009:943;;;;;;;:::o;4958:468::-;5023:6;5031;5080:2;5068:9;5059:7;5055:23;5051:32;5048:119;;;5086:79;;:::i;:::-;5048:119;5206:1;5231:53;5276:7;5267:6;5256:9;5252:22;5231:53;:::i;:::-;5221:63;;5177:117;5333:2;5359:50;5401:7;5392:6;5381:9;5377:22;5359:50;:::i;:::-;5349:60;;5304:115;4958:468;;;;;:::o;5432:474::-;5500:6;5508;5557:2;5545:9;5536:7;5532:23;5528:32;5525:119;;;5563:79;;:::i;:::-;5525:119;5683:1;5708:53;5753:7;5744:6;5733:9;5729:22;5708:53;:::i;:::-;5698:63;;5654:117;5810:2;5836:53;5881:7;5872:6;5861:9;5857:22;5836:53;:::i;:::-;5826:63;;5781:118;5432:474;;;;;:::o;5912:323::-;5968:6;6017:2;6005:9;5996:7;5992:23;5988:32;5985:119;;;6023:79;;:::i;:::-;5985:119;6143:1;6168:50;6210:7;6201:6;6190:9;6186:22;6168:50;:::i;:::-;6158:60;;6114:114;5912:323;;;;:::o;6241:345::-;6308:6;6357:2;6345:9;6336:7;6332:23;6328:32;6325:119;;;6363:79;;:::i;:::-;6325:119;6483:1;6508:61;6561:7;6552:6;6541:9;6537:22;6508:61;:::i;:::-;6498:71;;6454:125;6241:345;;;;:::o;6592:351::-;6662:6;6711:2;6699:9;6690:7;6686:23;6682:32;6679:119;;;6717:79;;:::i;:::-;6679:119;6837:1;6862:64;6918:7;6909:6;6898:9;6894:22;6862:64;:::i;:::-;6852:74;;6808:128;6592:351;;;;:::o;6949:327::-;7007:6;7056:2;7044:9;7035:7;7031:23;7027:32;7024:119;;;7062:79;;:::i;:::-;7024:119;7182:1;7207:52;7251:7;7242:6;7231:9;7227:22;7207:52;:::i;:::-;7197:62;;7153:116;6949:327;;;;:::o;7282:349::-;7351:6;7400:2;7388:9;7379:7;7375:23;7371:32;7368:119;;;7406:79;;:::i;:::-;7368:119;7526:1;7551:63;7606:7;7597:6;7586:9;7582:22;7551:63;:::i;:::-;7541:73;;7497:127;7282:349;;;;:::o;7637:509::-;7706:6;7755:2;7743:9;7734:7;7730:23;7726:32;7723:119;;;7761:79;;:::i;:::-;7723:119;7909:1;7898:9;7894:17;7881:31;7939:18;7931:6;7928:30;7925:117;;;7961:79;;:::i;:::-;7925:117;8066:63;8121:7;8112:6;8101:9;8097:22;8066:63;:::i;:::-;8056:73;;7852:287;7637:509;;;;:::o;8152:329::-;8211:6;8260:2;8248:9;8239:7;8235:23;8231:32;8228:119;;;8266:79;;:::i;:::-;8228:119;8386:1;8411:53;8456:7;8447:6;8436:9;8432:22;8411:53;:::i;:::-;8401:63;;8357:117;8152:329;;;;:::o;8487:654::-;8565:6;8573;8622:2;8610:9;8601:7;8597:23;8593:32;8590:119;;;8628:79;;:::i;:::-;8590:119;8748:1;8773:53;8818:7;8809:6;8798:9;8794:22;8773:53;:::i;:::-;8763:63;;8719:117;8903:2;8892:9;8888:18;8875:32;8934:18;8926:6;8923:30;8920:117;;;8956:79;;:::i;:::-;8920:117;9061:63;9116:7;9107:6;9096:9;9092:22;9061:63;:::i;:::-;9051:73;;8846:288;8487:654;;;;;:::o;9147:179::-;9216:10;9237:46;9279:3;9271:6;9237:46;:::i;:::-;9315:4;9310:3;9306:14;9292:28;;9147:179;;;;:::o;9332:118::-;9419:24;9437:5;9419:24;:::i;:::-;9414:3;9407:37;9332:118;;:::o;9486:732::-;9605:3;9634:54;9682:5;9634:54;:::i;:::-;9704:86;9783:6;9778:3;9704:86;:::i;:::-;9697:93;;9814:56;9864:5;9814:56;:::i;:::-;9893:7;9924:1;9909:284;9934:6;9931:1;9928:13;9909:284;;;10010:6;10004:13;10037:63;10096:3;10081:13;10037:63;:::i;:::-;10030:70;;10123:60;10176:6;10123:60;:::i;:::-;10113:70;;9969:224;9956:1;9953;9949:9;9944:14;;9909:284;;;9913:14;10209:3;10202:10;;9610:608;;;9486:732;;;;:::o;10224:109::-;10305:21;10320:5;10305:21;:::i;:::-;10300:3;10293:34;10224:109;;:::o;10339:360::-;10425:3;10453:38;10485:5;10453:38;:::i;:::-;10507:70;10570:6;10565:3;10507:70;:::i;:::-;10500:77;;10586:52;10631:6;10626:3;10619:4;10612:5;10608:16;10586:52;:::i;:::-;10663:29;10685:6;10663:29;:::i;:::-;10658:3;10654:39;10647:46;;10429:270;10339:360;;;;:::o;10705:373::-;10809:3;10837:38;10869:5;10837:38;:::i;:::-;10891:88;10972:6;10967:3;10891:88;:::i;:::-;10884:95;;10988:52;11033:6;11028:3;11021:4;11014:5;11010:16;10988:52;:::i;:::-;11065:6;11060:3;11056:16;11049:23;;10813:265;10705:373;;;;:::o;11106:849::-;11211:3;11248:5;11242:12;11277:36;11303:9;11277:36;:::i;:::-;11329:88;11410:6;11405:3;11329:88;:::i;:::-;11322:95;;11448:1;11437:9;11433:17;11464:1;11459:137;;;;11610:1;11605:344;;;;11426:523;;11459:137;11543:4;11539:9;11528;11524:25;11519:3;11512:38;11579:6;11574:3;11570:16;11563:23;;11459:137;;11605:344;11672:41;11707:5;11672:41;:::i;:::-;11735:1;11749:154;11763:6;11760:1;11757:13;11749:154;;;11837:7;11831:14;11827:1;11822:3;11818:11;11811:35;11887:1;11878:7;11874:15;11863:26;;11785:4;11782:1;11778:12;11773:17;;11749:154;;;11932:6;11927:3;11923:16;11916:23;;11612:337;;11426:523;;11215:740;;11106:849;;;;:::o;11961:364::-;12049:3;12077:39;12110:5;12077:39;:::i;:::-;12132:71;12196:6;12191:3;12132:71;:::i;:::-;12125:78;;12212:52;12257:6;12252:3;12245:4;12238:5;12234:16;12212:52;:::i;:::-;12289:29;12311:6;12289:29;:::i;:::-;12284:3;12280:39;12273:46;;12053:272;11961:364;;;;:::o;12331:377::-;12437:3;12465:39;12498:5;12465:39;:::i;:::-;12520:89;12602:6;12597:3;12520:89;:::i;:::-;12513:96;;12618:52;12663:6;12658:3;12651:4;12644:5;12640:16;12618:52;:::i;:::-;12695:6;12690:3;12686:16;12679:23;;12441:267;12331:377;;;;:::o;12738:845::-;12841:3;12878:5;12872:12;12907:36;12933:9;12907:36;:::i;:::-;12959:89;13041:6;13036:3;12959:89;:::i;:::-;12952:96;;13079:1;13068:9;13064:17;13095:1;13090:137;;;;13241:1;13236:341;;;;13057:520;;13090:137;13174:4;13170:9;13159;13155:25;13150:3;13143:38;13210:6;13205:3;13201:16;13194:23;;13090:137;;13236:341;13303:38;13335:5;13303:38;:::i;:::-;13363:1;13377:154;13391:6;13388:1;13385:13;13377:154;;;13465:7;13459:14;13455:1;13450:3;13446:11;13439:35;13515:1;13506:7;13502:15;13491:26;;13413:4;13410:1;13406:12;13401:17;;13377:154;;;13560:6;13555:3;13551:16;13544:23;;13243:334;;13057:520;;12845:738;;12738:845;;;;:::o;13589:366::-;13731:3;13752:67;13816:2;13811:3;13752:67;:::i;:::-;13745:74;;13828:93;13917:3;13828:93;:::i;:::-;13946:2;13941:3;13937:12;13930:19;;13589:366;;;:::o;13961:::-;14103:3;14124:67;14188:2;14183:3;14124:67;:::i;:::-;14117:74;;14200:93;14289:3;14200:93;:::i;:::-;14318:2;14313:3;14309:12;14302:19;;13961:366;;;:::o;14333:::-;14475:3;14496:67;14560:2;14555:3;14496:67;:::i;:::-;14489:74;;14572:93;14661:3;14572:93;:::i;:::-;14690:2;14685:3;14681:12;14674:19;;14333:366;;;:::o;14705:::-;14847:3;14868:67;14932:2;14927:3;14868:67;:::i;:::-;14861:74;;14944:93;15033:3;14944:93;:::i;:::-;15062:2;15057:3;15053:12;15046:19;;14705:366;;;:::o;15077:::-;15219:3;15240:67;15304:2;15299:3;15240:67;:::i;:::-;15233:74;;15316:93;15405:3;15316:93;:::i;:::-;15434:2;15429:3;15425:12;15418:19;;15077:366;;;:::o;15449:::-;15591:3;15612:67;15676:2;15671:3;15612:67;:::i;:::-;15605:74;;15688:93;15777:3;15688:93;:::i;:::-;15806:2;15801:3;15797:12;15790:19;;15449:366;;;:::o;15821:::-;15963:3;15984:67;16048:2;16043:3;15984:67;:::i;:::-;15977:74;;16060:93;16149:3;16060:93;:::i;:::-;16178:2;16173:3;16169:12;16162:19;;15821:366;;;:::o;16193:::-;16335:3;16356:67;16420:2;16415:3;16356:67;:::i;:::-;16349:74;;16432:93;16521:3;16432:93;:::i;:::-;16550:2;16545:3;16541:12;16534:19;;16193:366;;;:::o;16565:::-;16707:3;16728:67;16792:2;16787:3;16728:67;:::i;:::-;16721:74;;16804:93;16893:3;16804:93;:::i;:::-;16922:2;16917:3;16913:12;16906:19;;16565:366;;;:::o;16937:::-;17079:3;17100:67;17164:2;17159:3;17100:67;:::i;:::-;17093:74;;17176:93;17265:3;17176:93;:::i;:::-;17294:2;17289:3;17285:12;17278:19;;16937:366;;;:::o;17309:::-;17451:3;17472:67;17536:2;17531:3;17472:67;:::i;:::-;17465:74;;17548:93;17637:3;17548:93;:::i;:::-;17666:2;17661:3;17657:12;17650:19;;17309:366;;;:::o;17681:::-;17823:3;17844:67;17908:2;17903:3;17844:67;:::i;:::-;17837:74;;17920:93;18009:3;17920:93;:::i;:::-;18038:2;18033:3;18029:12;18022:19;;17681:366;;;:::o;18053:::-;18195:3;18216:67;18280:2;18275:3;18216:67;:::i;:::-;18209:74;;18292:93;18381:3;18292:93;:::i;:::-;18410:2;18405:3;18401:12;18394:19;;18053:366;;;:::o;18425:::-;18567:3;18588:67;18652:2;18647:3;18588:67;:::i;:::-;18581:74;;18664:93;18753:3;18664:93;:::i;:::-;18782:2;18777:3;18773:12;18766:19;;18425:366;;;:::o;18797:::-;18939:3;18960:67;19024:2;19019:3;18960:67;:::i;:::-;18953:74;;19036:93;19125:3;19036:93;:::i;:::-;19154:2;19149:3;19145:12;19138:19;;18797:366;;;:::o;19169:::-;19311:3;19332:67;19396:2;19391:3;19332:67;:::i;:::-;19325:74;;19408:93;19497:3;19408:93;:::i;:::-;19526:2;19521:3;19517:12;19510:19;;19169:366;;;:::o;19541:::-;19683:3;19704:67;19768:2;19763:3;19704:67;:::i;:::-;19697:74;;19780:93;19869:3;19780:93;:::i;:::-;19898:2;19893:3;19889:12;19882:19;;19541:366;;;:::o;19913:::-;20055:3;20076:67;20140:2;20135:3;20076:67;:::i;:::-;20069:74;;20152:93;20241:3;20152:93;:::i;:::-;20270:2;20265:3;20261:12;20254:19;;19913:366;;;:::o;20285:::-;20427:3;20448:67;20512:2;20507:3;20448:67;:::i;:::-;20441:74;;20524:93;20613:3;20524:93;:::i;:::-;20642:2;20637:3;20633:12;20626:19;;20285:366;;;:::o;20657:398::-;20816:3;20837:83;20918:1;20913:3;20837:83;:::i;:::-;20830:90;;20929:93;21018:3;20929:93;:::i;:::-;21047:1;21042:3;21038:11;21031:18;;20657:398;;;:::o;21061:366::-;21203:3;21224:67;21288:2;21283:3;21224:67;:::i;:::-;21217:74;;21300:93;21389:3;21300:93;:::i;:::-;21418:2;21413:3;21409:12;21402:19;;21061:366;;;:::o;21433:::-;21575:3;21596:67;21660:2;21655:3;21596:67;:::i;:::-;21589:74;;21672:93;21761:3;21672:93;:::i;:::-;21790:2;21785:3;21781:12;21774:19;;21433:366;;;:::o;21805:::-;21947:3;21968:67;22032:2;22027:3;21968:67;:::i;:::-;21961:74;;22044:93;22133:3;22044:93;:::i;:::-;22162:2;22157:3;22153:12;22146:19;;21805:366;;;:::o;22177:::-;22319:3;22340:67;22404:2;22399:3;22340:67;:::i;:::-;22333:74;;22416:93;22505:3;22416:93;:::i;:::-;22534:2;22529:3;22525:12;22518:19;;22177:366;;;:::o;22549:108::-;22626:24;22644:5;22626:24;:::i;:::-;22621:3;22614:37;22549:108;;:::o;22663:118::-;22750:24;22768:5;22750:24;:::i;:::-;22745:3;22738:37;22663:118;;:::o;22787:271::-;22917:3;22939:93;23028:3;23019:6;22939:93;:::i;:::-;22932:100;;23049:3;23042:10;;22787:271;;;;:::o;23064:273::-;23195:3;23217:94;23307:3;23298:6;23217:94;:::i;:::-;23210:101;;23328:3;23321:10;;23064:273;;;;:::o;23343:275::-;23475:3;23497:95;23588:3;23579:6;23497:95;:::i;:::-;23490:102;;23609:3;23602:10;;23343:275;;;;:::o;23624:589::-;23849:3;23871:95;23962:3;23953:6;23871:95;:::i;:::-;23864:102;;23983:95;24074:3;24065:6;23983:95;:::i;:::-;23976:102;;24095:92;24183:3;24174:6;24095:92;:::i;:::-;24088:99;;24204:3;24197:10;;23624:589;;;;;;:::o;24219:379::-;24403:3;24425:147;24568:3;24425:147;:::i;:::-;24418:154;;24589:3;24582:10;;24219:379;;;:::o;24604:222::-;24697:4;24735:2;24724:9;24720:18;24712:26;;24748:71;24816:1;24805:9;24801:17;24792:6;24748:71;:::i;:::-;24604:222;;;;:::o;24832:442::-;24981:4;25019:2;25008:9;25004:18;24996:26;;25032:71;25100:1;25089:9;25085:17;25076:6;25032:71;:::i;:::-;25113:72;25181:2;25170:9;25166:18;25157:6;25113:72;:::i;:::-;25195;25263:2;25252:9;25248:18;25239:6;25195:72;:::i;:::-;24832:442;;;;;;:::o;25280:640::-;25475:4;25513:3;25502:9;25498:19;25490:27;;25527:71;25595:1;25584:9;25580:17;25571:6;25527:71;:::i;:::-;25608:72;25676:2;25665:9;25661:18;25652:6;25608:72;:::i;:::-;25690;25758:2;25747:9;25743:18;25734:6;25690:72;:::i;:::-;25809:9;25803:4;25799:20;25794:2;25783:9;25779:18;25772:48;25837:76;25908:4;25899:6;25837:76;:::i;:::-;25829:84;;25280:640;;;;;;;:::o;25926:373::-;26069:4;26107:2;26096:9;26092:18;26084:26;;26156:9;26150:4;26146:20;26142:1;26131:9;26127:17;26120:47;26184:108;26287:4;26278:6;26184:108;:::i;:::-;26176:116;;25926:373;;;;:::o;26305:210::-;26392:4;26430:2;26419:9;26415:18;26407:26;;26443:65;26505:1;26494:9;26490:17;26481:6;26443:65;:::i;:::-;26305:210;;;;:::o;26521:313::-;26634:4;26672:2;26661:9;26657:18;26649:26;;26721:9;26715:4;26711:20;26707:1;26696:9;26692:17;26685:47;26749:78;26822:4;26813:6;26749:78;:::i;:::-;26741:86;;26521:313;;;;:::o;26840:419::-;27006:4;27044:2;27033:9;27029:18;27021:26;;27093:9;27087:4;27083:20;27079:1;27068:9;27064:17;27057:47;27121:131;27247:4;27121:131;:::i;:::-;27113:139;;26840:419;;;:::o;27265:::-;27431:4;27469:2;27458:9;27454:18;27446:26;;27518:9;27512:4;27508:20;27504:1;27493:9;27489:17;27482:47;27546:131;27672:4;27546:131;:::i;:::-;27538:139;;27265:419;;;:::o;27690:::-;27856:4;27894:2;27883:9;27879:18;27871:26;;27943:9;27937:4;27933:20;27929:1;27918:9;27914:17;27907:47;27971:131;28097:4;27971:131;:::i;:::-;27963:139;;27690:419;;;:::o;28115:::-;28281:4;28319:2;28308:9;28304:18;28296:26;;28368:9;28362:4;28358:20;28354:1;28343:9;28339:17;28332:47;28396:131;28522:4;28396:131;:::i;:::-;28388:139;;28115:419;;;:::o;28540:::-;28706:4;28744:2;28733:9;28729:18;28721:26;;28793:9;28787:4;28783:20;28779:1;28768:9;28764:17;28757:47;28821:131;28947:4;28821:131;:::i;:::-;28813:139;;28540:419;;;:::o;28965:::-;29131:4;29169:2;29158:9;29154:18;29146:26;;29218:9;29212:4;29208:20;29204:1;29193:9;29189:17;29182:47;29246:131;29372:4;29246:131;:::i;:::-;29238:139;;28965:419;;;:::o;29390:::-;29556:4;29594:2;29583:9;29579:18;29571:26;;29643:9;29637:4;29633:20;29629:1;29618:9;29614:17;29607:47;29671:131;29797:4;29671:131;:::i;:::-;29663:139;;29390:419;;;:::o;29815:::-;29981:4;30019:2;30008:9;30004:18;29996:26;;30068:9;30062:4;30058:20;30054:1;30043:9;30039:17;30032:47;30096:131;30222:4;30096:131;:::i;:::-;30088:139;;29815:419;;;:::o;30240:::-;30406:4;30444:2;30433:9;30429:18;30421:26;;30493:9;30487:4;30483:20;30479:1;30468:9;30464:17;30457:47;30521:131;30647:4;30521:131;:::i;:::-;30513:139;;30240:419;;;:::o;30665:::-;30831:4;30869:2;30858:9;30854:18;30846:26;;30918:9;30912:4;30908:20;30904:1;30893:9;30889:17;30882:47;30946:131;31072:4;30946:131;:::i;:::-;30938:139;;30665:419;;;:::o;31090:::-;31256:4;31294:2;31283:9;31279:18;31271:26;;31343:9;31337:4;31333:20;31329:1;31318:9;31314:17;31307:47;31371:131;31497:4;31371:131;:::i;:::-;31363:139;;31090:419;;;:::o;31515:::-;31681:4;31719:2;31708:9;31704:18;31696:26;;31768:9;31762:4;31758:20;31754:1;31743:9;31739:17;31732:47;31796:131;31922:4;31796:131;:::i;:::-;31788:139;;31515:419;;;:::o;31940:::-;32106:4;32144:2;32133:9;32129:18;32121:26;;32193:9;32187:4;32183:20;32179:1;32168:9;32164:17;32157:47;32221:131;32347:4;32221:131;:::i;:::-;32213:139;;31940:419;;;:::o;32365:::-;32531:4;32569:2;32558:9;32554:18;32546:26;;32618:9;32612:4;32608:20;32604:1;32593:9;32589:17;32582:47;32646:131;32772:4;32646:131;:::i;:::-;32638:139;;32365:419;;;:::o;32790:::-;32956:4;32994:2;32983:9;32979:18;32971:26;;33043:9;33037:4;33033:20;33029:1;33018:9;33014:17;33007:47;33071:131;33197:4;33071:131;:::i;:::-;33063:139;;32790:419;;;:::o;33215:::-;33381:4;33419:2;33408:9;33404:18;33396:26;;33468:9;33462:4;33458:20;33454:1;33443:9;33439:17;33432:47;33496:131;33622:4;33496:131;:::i;:::-;33488:139;;33215:419;;;:::o;33640:::-;33806:4;33844:2;33833:9;33829:18;33821:26;;33893:9;33887:4;33883:20;33879:1;33868:9;33864:17;33857:47;33921:131;34047:4;33921:131;:::i;:::-;33913:139;;33640:419;;;:::o;34065:::-;34231:4;34269:2;34258:9;34254:18;34246:26;;34318:9;34312:4;34308:20;34304:1;34293:9;34289:17;34282:47;34346:131;34472:4;34346:131;:::i;:::-;34338:139;;34065:419;;;:::o;34490:::-;34656:4;34694:2;34683:9;34679:18;34671:26;;34743:9;34737:4;34733:20;34729:1;34718:9;34714:17;34707:47;34771:131;34897:4;34771:131;:::i;:::-;34763:139;;34490:419;;;:::o;34915:::-;35081:4;35119:2;35108:9;35104:18;35096:26;;35168:9;35162:4;35158:20;35154:1;35143:9;35139:17;35132:47;35196:131;35322:4;35196:131;:::i;:::-;35188:139;;34915:419;;;:::o;35340:::-;35506:4;35544:2;35533:9;35529:18;35521:26;;35593:9;35587:4;35583:20;35579:1;35568:9;35564:17;35557:47;35621:131;35747:4;35621:131;:::i;:::-;35613:139;;35340:419;;;:::o;35765:::-;35931:4;35969:2;35958:9;35954:18;35946:26;;36018:9;36012:4;36008:20;36004:1;35993:9;35989:17;35982:47;36046:131;36172:4;36046:131;:::i;:::-;36038:139;;35765:419;;;:::o;36190:::-;36356:4;36394:2;36383:9;36379:18;36371:26;;36443:9;36437:4;36433:20;36429:1;36418:9;36414:17;36407:47;36471:131;36597:4;36471:131;:::i;:::-;36463:139;;36190:419;;;:::o;36615:222::-;36708:4;36746:2;36735:9;36731:18;36723:26;;36759:71;36827:1;36816:9;36812:17;36803:6;36759:71;:::i;:::-;36615:222;;;;:::o;36843:129::-;36877:6;36904:20;;:::i;:::-;36894:30;;36933:33;36961:4;36953:6;36933:33;:::i;:::-;36843:129;;;:::o;36978:75::-;37011:6;37044:2;37038:9;37028:19;;36978:75;:::o;37059:307::-;37120:4;37210:18;37202:6;37199:30;37196:56;;;37232:18;;:::i;:::-;37196:56;37270:29;37292:6;37270:29;:::i;:::-;37262:37;;37354:4;37348;37344:15;37336:23;;37059:307;;;:::o;37372:308::-;37434:4;37524:18;37516:6;37513:30;37510:56;;;37546:18;;:::i;:::-;37510:56;37584:29;37606:6;37584:29;:::i;:::-;37576:37;;37668:4;37662;37658:15;37650:23;;37372:308;;;:::o;37686:132::-;37753:4;37776:3;37768:11;;37806:4;37801:3;37797:14;37789:22;;37686:132;;;:::o;37824:144::-;37876:4;37899:3;37891:11;;37922:3;37919:1;37912:14;37956:4;37953:1;37943:18;37935:26;;37824:144;;;:::o;37974:141::-;38023:4;38046:3;38038:11;;38069:3;38066:1;38059:14;38103:4;38100:1;38090:18;38082:26;;37974:141;;;:::o;38121:114::-;38188:6;38222:5;38216:12;38206:22;;38121:114;;;:::o;38241:98::-;38292:6;38326:5;38320:12;38310:22;;38241:98;;;:::o;38345:99::-;38397:6;38431:5;38425:12;38415:22;;38345:99;;;:::o;38450:113::-;38520:4;38552;38547:3;38543:14;38535:22;;38450:113;;;:::o;38569:184::-;38668:11;38702:6;38697:3;38690:19;38742:4;38737:3;38733:14;38718:29;;38569:184;;;;:::o;38759:168::-;38842:11;38876:6;38871:3;38864:19;38916:4;38911:3;38907:14;38892:29;;38759:168;;;;:::o;38933:147::-;39034:11;39071:3;39056:18;;38933:147;;;;:::o;39086:169::-;39170:11;39204:6;39199:3;39192:19;39244:4;39239:3;39235:14;39220:29;;39086:169;;;;:::o;39261:148::-;39363:11;39400:3;39385:18;;39261:148;;;;:::o;39415:305::-;39455:3;39474:20;39492:1;39474:20;:::i;:::-;39469:25;;39508:20;39526:1;39508:20;:::i;:::-;39503:25;;39662:1;39594:66;39590:74;39587:1;39584:81;39581:107;;;39668:18;;:::i;:::-;39581:107;39712:1;39709;39705:9;39698:16;;39415:305;;;;:::o;39726:237::-;39764:3;39783:18;39799:1;39783:18;:::i;:::-;39778:23;;39815:18;39831:1;39815:18;:::i;:::-;39810:23;;39905:1;39899:4;39895:12;39892:1;39889:19;39886:45;;;39911:18;;:::i;:::-;39886:45;39955:1;39952;39948:9;39941:16;;39726:237;;;;:::o;39969:185::-;40009:1;40026:20;40044:1;40026:20;:::i;:::-;40021:25;;40060:20;40078:1;40060:20;:::i;:::-;40055:25;;40099:1;40089:35;;40104:18;;:::i;:::-;40089:35;40146:1;40143;40139:9;40134:14;;39969:185;;;;:::o;40160:348::-;40200:7;40223:20;40241:1;40223:20;:::i;:::-;40218:25;;40257:20;40275:1;40257:20;:::i;:::-;40252:25;;40445:1;40377:66;40373:74;40370:1;40367:81;40362:1;40355:9;40348:17;40344:105;40341:131;;;40452:18;;:::i;:::-;40341:131;40500:1;40497;40493:9;40482:20;;40160:348;;;;:::o;40514:191::-;40554:4;40574:20;40592:1;40574:20;:::i;:::-;40569:25;;40608:20;40626:1;40608:20;:::i;:::-;40603:25;;40647:1;40644;40641:8;40638:34;;;40652:18;;:::i;:::-;40638:34;40697:1;40694;40690:9;40682:17;;40514:191;;;;:::o;40711:96::-;40748:7;40777:24;40795:5;40777:24;:::i;:::-;40766:35;;40711:96;;;:::o;40813:90::-;40847:7;40890:5;40883:13;40876:21;40865:32;;40813:90;;;:::o;40909:77::-;40946:7;40975:5;40964:16;;40909:77;;;:::o;40992:149::-;41028:7;41068:66;41061:5;41057:78;41046:89;;40992:149;;;:::o;41147:126::-;41184:7;41224:42;41217:5;41213:54;41202:65;;41147:126;;;:::o;41279:77::-;41316:7;41345:5;41334:16;;41279:77;;;:::o;41362:86::-;41397:7;41437:4;41430:5;41426:16;41415:27;;41362:86;;;:::o;41454:154::-;41538:6;41533:3;41528;41515:30;41600:1;41591:6;41586:3;41582:16;41575:27;41454:154;;;:::o;41614:307::-;41682:1;41692:113;41706:6;41703:1;41700:13;41692:113;;;41791:1;41786:3;41782:11;41776:18;41772:1;41767:3;41763:11;41756:39;41728:2;41725:1;41721:10;41716:15;;41692:113;;;41823:6;41820:1;41817:13;41814:101;;;41903:1;41894:6;41889:3;41885:16;41878:27;41814:101;41663:258;41614:307;;;:::o;41927:320::-;41971:6;42008:1;42002:4;41998:12;41988:22;;42055:1;42049:4;42045:12;42076:18;42066:81;;42132:4;42124:6;42120:17;42110:27;;42066:81;42194:2;42186:6;42183:14;42163:18;42160:38;42157:84;;;42213:18;;:::i;:::-;42157:84;41978:269;41927:320;;;:::o;42253:281::-;42336:27;42358:4;42336:27;:::i;:::-;42328:6;42324:40;42466:6;42454:10;42451:22;42430:18;42418:10;42415:34;42412:62;42409:88;;;42477:18;;:::i;:::-;42409:88;42517:10;42513:2;42506:22;42296:238;42253:281;;:::o;42540:233::-;42579:3;42602:24;42620:5;42602:24;:::i;:::-;42593:33;;42648:66;42641:5;42638:77;42635:103;;;42718:18;;:::i;:::-;42635:103;42765:1;42758:5;42754:13;42747:20;;42540:233;;;:::o;42779:176::-;42811:1;42828:20;42846:1;42828:20;:::i;:::-;42823:25;;42862:20;42880:1;42862:20;:::i;:::-;42857:25;;42901:1;42891:35;;42906:18;;:::i;:::-;42891:35;42947:1;42944;42940:9;42935:14;;42779:176;;;;:::o;42961:180::-;43009:77;43006:1;42999:88;43106:4;43103:1;43096:15;43130:4;43127:1;43120:15;43147:180;43195:77;43192:1;43185:88;43292:4;43289:1;43282:15;43316:4;43313:1;43306:15;43333:180;43381:77;43378:1;43371:88;43478:4;43475:1;43468:15;43502:4;43499:1;43492:15;43519:180;43567:77;43564:1;43557:88;43664:4;43661:1;43654:15;43688:4;43685:1;43678:15;43705:180;43753:77;43750:1;43743:88;43850:4;43847:1;43840:15;43874:4;43871:1;43864:15;43891:180;43939:77;43936:1;43929:88;44036:4;44033:1;44026:15;44060:4;44057:1;44050:15;44077:117;44186:1;44183;44176:12;44200:117;44309:1;44306;44299:12;44323:117;44432:1;44429;44422:12;44446:117;44555:1;44552;44545:12;44569:102;44610:6;44661:2;44657:7;44652:2;44645:5;44641:14;44637:28;44627:38;;44569:102;;;:::o;44677:181::-;44817:33;44813:1;44805:6;44801:14;44794:57;44677:181;:::o;44864:230::-;45004:34;45000:1;44992:6;44988:14;44981:58;45073:13;45068:2;45060:6;45056:15;45049:38;44864:230;:::o;45100:237::-;45240:34;45236:1;45228:6;45224:14;45217:58;45309:20;45304:2;45296:6;45292:15;45285:45;45100:237;:::o;45343:225::-;45483:34;45479:1;45471:6;45467:14;45460:58;45552:8;45547:2;45539:6;45535:15;45528:33;45343:225;:::o;45574:178::-;45714:30;45710:1;45702:6;45698:14;45691:54;45574:178;:::o;45758:223::-;45898:34;45894:1;45886:6;45882:14;45875:58;45967:6;45962:2;45954:6;45950:15;45943:31;45758:223;:::o;45987:175::-;46127:27;46123:1;46115:6;46111:14;46104:51;45987:175;:::o;46168:231::-;46308:34;46304:1;46296:6;46292:14;46285:58;46377:14;46372:2;46364:6;46360:15;46353:39;46168:231;:::o;46405:243::-;46545:34;46541:1;46533:6;46529:14;46522:58;46614:26;46609:2;46601:6;46597:15;46590:51;46405:243;:::o;46654:229::-;46794:34;46790:1;46782:6;46778:14;46771:58;46863:12;46858:2;46850:6;46846:15;46839:37;46654:229;:::o;46889:228::-;47029:34;47025:1;47017:6;47013:14;47006:58;47098:11;47093:2;47085:6;47081:15;47074:36;46889:228;:::o;47123:182::-;47263:34;47259:1;47251:6;47247:14;47240:58;47123:182;:::o;47311:171::-;47451:23;47447:1;47439:6;47435:14;47428:47;47311:171;:::o;47488:231::-;47628:34;47624:1;47616:6;47612:14;47605:58;47697:14;47692:2;47684:6;47680:15;47673:39;47488:231;:::o;47725:182::-;47865:34;47861:1;47853:6;47849:14;47842:58;47725:182;:::o;47913:223::-;48053:34;48049:1;48041:6;48037:14;48030:58;48122:6;48117:2;48109:6;48105:15;48098:31;47913:223;:::o;48142:228::-;48282:34;48278:1;48270:6;48266:14;48259:58;48351:11;48346:2;48338:6;48334:15;48327:36;48142:228;:::o;48376:234::-;48516:34;48512:1;48504:6;48500:14;48493:58;48585:17;48580:2;48572:6;48568:15;48561:42;48376:234;:::o;48616:220::-;48756:34;48752:1;48744:6;48740:14;48733:58;48825:3;48820:2;48812:6;48808:15;48801:28;48616:220;:::o;48842:114::-;;:::o;48962:166::-;49102:18;49098:1;49090:6;49086:14;49079:42;48962:166;:::o;49134:236::-;49274:34;49270:1;49262:6;49258:14;49251:58;49343:19;49338:2;49330:6;49326:15;49319:44;49134:236;:::o;49376:231::-;49516:34;49512:1;49504:6;49500:14;49493:58;49585:14;49580:2;49572:6;49568:15;49561:39;49376:231;:::o;49613:220::-;49753:34;49749:1;49741:6;49737:14;49730:58;49822:3;49817:2;49809:6;49805:15;49798:28;49613:220;:::o;49839:122::-;49912:24;49930:5;49912:24;:::i;:::-;49905:5;49902:35;49892:63;;49951:1;49948;49941:12;49892:63;49839:122;:::o;49967:116::-;50037:21;50052:5;50037:21;:::i;:::-;50030:5;50027:32;50017:60;;50073:1;50070;50063:12;50017:60;49967:116;:::o;50089:122::-;50162:24;50180:5;50162:24;:::i;:::-;50155:5;50152:35;50142:63;;50201:1;50198;50191:12;50142:63;50089:122;:::o;50217:120::-;50289:23;50306:5;50289:23;:::i;:::-;50282:5;50279:34;50269:62;;50327:1;50324;50317:12;50269:62;50217:120;:::o;50343:122::-;50416:24;50434:5;50416:24;:::i;:::-;50409:5;50406:35;50396:63;;50455:1;50452;50445:12;50396:63;50343:122;:::o

Swarm Source

ipfs://8e7527edf40c28ed231f5ca03f4cea57a3a03d8f9f52be75747bcaf8b47ae71b
Loading