ETH Price: $3,329.42 (-0.90%)

Token

PeopleInThePlaceTheyLove (PPTL)
 

Overview

Max Total Supply

1,000 PPTL

Holders

708

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
juchunko.eth
Balance
1 PPTL
0xe8c8271baa2d476fecd5ae2727ece63d2ae661df
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

#Yusuke Hanai is coming to the metaverse **“People In The Place They Love”** is a collection of 1,000 NFTs- specially designed, dressed in unique hand-drawn attributes. This is the 1st out of 3 phases of Yusuke Hanai’s NFT project. NFT holders are able to gain membership acc...

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
PeopleInThePlaceTheyLove

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-13
*/

// File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

// File: @openzeppelin/contracts/interfaces/IERC721Receiver.sol


// OpenZeppelin Contracts v4.4.1 (interfaces/IERC721Receiver.sol)

pragma solidity ^0.8.0;


// File: @openzeppelin/contracts/utils/introspection/IERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

// File: @openzeppelin/contracts/token/ERC721/IERC721.sol


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

pragma solidity ^0.8.0;


/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

// File: @openzeppelin/contracts/interfaces/IERC721Metadata.sol


// OpenZeppelin Contracts v4.4.1 (interfaces/IERC721Metadata.sol)

pragma solidity ^0.8.0;


// File: @openzeppelin/contracts/interfaces/IERC721.sol


// OpenZeppelin Contracts v4.4.1 (interfaces/IERC721.sol)

pragma solidity ^0.8.0;


// File: @openzeppelin/contracts/interfaces/IERC165.sol


// OpenZeppelin Contracts v4.4.1 (interfaces/IERC165.sol)

pragma solidity ^0.8.0;


// File: @openzeppelin/contracts/interfaces/IERC2981.sol


// OpenZeppelin Contracts (last updated v4.5.0) (interfaces/IERC2981.sol)

pragma solidity ^0.8.0;


/**
 * @dev Interface for the NFT Royalty Standard.
 *
 * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal
 * support for royalty payments across all NFT marketplaces and ecosystem participants.
 *
 * _Available since v4.5._
 */
interface IERC2981 is IERC165 {
    /**
     * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of
     * exchange. The royalty amount is denominated and should be payed in that same unit of exchange.
     */
    function royaltyInfo(uint256 tokenId, uint256 salePrice)
        external
        view
        returns (address receiver, uint256 royaltyAmount);
}

// File: @openzeppelin/contracts/utils/introspection/ERC165.sol


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

pragma solidity ^0.8.0;


/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

// File: @openzeppelin/contracts/access/IAccessControl.sol


// OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol)

pragma solidity ^0.8.0;

/**
 * @dev External interface of AccessControl declared to support ERC165 detection.
 */
interface IAccessControl {
    /**
     * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`
     *
     * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite
     * {RoleAdminChanged} not being emitted signaling this.
     *
     * _Available since v3.1._
     */
    event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);

    /**
     * @dev Emitted when `account` is granted `role`.
     *
     * `sender` is the account that originated the contract call, an admin role
     * bearer except when using {AccessControl-_setupRole}.
     */
    event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Emitted when `account` is revoked `role`.
     *
     * `sender` is the account that originated the contract call:
     *   - if using `revokeRole`, it is the admin role bearer
     *   - if using `renounceRole`, it is the role bearer (i.e. `account`)
     */
    event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) external view returns (bool);

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {AccessControl-_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) external view returns (bytes32);

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function grantRole(bytes32 role, address account) external;

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function revokeRole(bytes32 role, address account) external;

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been granted `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `account`.
     */
    function renounceRole(bytes32 role, address account) external;
}

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


// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

// File: @openzeppelin/contracts/access/Ownable.sol


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

pragma solidity ^0.8.0;


/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

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

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

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

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

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

// File: @openzeppelin/contracts/interfaces/IERC1271.sol


// OpenZeppelin Contracts v4.4.1 (interfaces/IERC1271.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC1271 standard signature validation method for
 * contracts as defined in https://eips.ethereum.org/EIPS/eip-1271[ERC-1271].
 *
 * _Available since v4.1._
 */
interface IERC1271 {
    /**
     * @dev Should return whether the signature provided is valid for the provided data
     * @param hash      Hash of the data to be signed
     * @param signature Signature byte array associated with _data
     */
    function isValidSignature(bytes32 hash, bytes memory signature) external view returns (bytes4 magicValue);
}

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


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

pragma solidity ^0.8.1;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: github/nicole-air/PPTL/contracts/erc/ERC721.sol



pragma solidity ^0.8.7;







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

    // 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() {
    }

    /**
     * @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 "";
    }

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

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

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

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


// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}

// File: @openzeppelin/contracts/access/AccessControl.sol


// OpenZeppelin Contracts (last updated v4.5.0) (access/AccessControl.sol)

pragma solidity ^0.8.0;





/**
 * @dev Contract module that allows children to implement role-based access
 * control mechanisms. This is a lightweight version that doesn't allow enumerating role
 * members except through off-chain means by accessing the contract event logs. Some
 * applications may benefit from on-chain enumerability, for those cases see
 * {AccessControlEnumerable}.
 *
 * Roles are referred to by their `bytes32` identifier. These should be exposed
 * in the external API and be unique. The best way to achieve this is by
 * using `public constant` hash digests:
 *
 * ```
 * bytes32 public constant MY_ROLE = keccak256("MY_ROLE");
 * ```
 *
 * Roles can be used to represent a set of permissions. To restrict access to a
 * function call, use {hasRole}:
 *
 * ```
 * function foo() public {
 *     require(hasRole(MY_ROLE, msg.sender));
 *     ...
 * }
 * ```
 *
 * Roles can be granted and revoked dynamically via the {grantRole} and
 * {revokeRole} functions. Each role has an associated admin role, and only
 * accounts that have a role's admin role can call {grantRole} and {revokeRole}.
 *
 * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means
 * that only accounts with this role will be able to grant or revoke other
 * roles. More complex role relationships can be created by using
 * {_setRoleAdmin}.
 *
 * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to
 * grant and revoke this role. Extra precautions should be taken to secure
 * accounts that have been granted it.
 */
abstract contract AccessControl is Context, IAccessControl, ERC165 {
    struct RoleData {
        mapping(address => bool) members;
        bytes32 adminRole;
    }

    mapping(bytes32 => RoleData) private _roles;

    bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;

    /**
     * @dev Modifier that checks that an account has a specific role. Reverts
     * with a standardized message including the required role.
     *
     * The format of the revert reason is given by the following regular expression:
     *
     *  /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
     *
     * _Available since v4.1._
     */
    modifier onlyRole(bytes32 role) {
        _checkRole(role, _msgSender());
        _;
    }

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

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) public view virtual override returns (bool) {
        return _roles[role].members[account];
    }

    /**
     * @dev Revert with a standard message if `account` is missing `role`.
     *
     * The format of the revert reason is given by the following regular expression:
     *
     *  /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
     */
    function _checkRole(bytes32 role, address account) internal view virtual {
        if (!hasRole(role, account)) {
            revert(
                string(
                    abi.encodePacked(
                        "AccessControl: account ",
                        Strings.toHexString(uint160(account), 20),
                        " is missing role ",
                        Strings.toHexString(uint256(role), 32)
                    )
                )
            );
        }
    }

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) {
        return _roles[role].adminRole;
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
        _grantRole(role, account);
    }

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
        _revokeRole(role, account);
    }

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been revoked `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `account`.
     */
    function renounceRole(bytes32 role, address account) public virtual override {
        require(account == _msgSender(), "AccessControl: can only renounce roles for self");

        _revokeRole(role, account);
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event. Note that unlike {grantRole}, this function doesn't perform any
     * checks on the calling account.
     *
     * [WARNING]
     * ====
     * This function should only be called from the constructor when setting
     * up the initial roles for the system.
     *
     * Using this function in any other way is effectively circumventing the admin
     * system imposed by {AccessControl}.
     * ====
     *
     * NOTE: This function is deprecated in favor of {_grantRole}.
     */
    function _setupRole(bytes32 role, address account) internal virtual {
        _grantRole(role, account);
    }

    /**
     * @dev Sets `adminRole` as ``role``'s admin role.
     *
     * Emits a {RoleAdminChanged} event.
     */
    function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {
        bytes32 previousAdminRole = getRoleAdmin(role);
        _roles[role].adminRole = adminRole;
        emit RoleAdminChanged(role, previousAdminRole, adminRole);
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * Internal function without access restriction.
     */
    function _grantRole(bytes32 role, address account) internal virtual {
        if (!hasRole(role, account)) {
            _roles[role].members[account] = true;
            emit RoleGranted(role, account, _msgSender());
        }
    }

    /**
     * @dev Revokes `role` from `account`.
     *
     * Internal function without access restriction.
     */
    function _revokeRole(bytes32 role, address account) internal virtual {
        if (hasRole(role, account)) {
            _roles[role].members[account] = false;
            emit RoleRevoked(role, account, _msgSender());
        }
    }
}

// File: github/nicole-air/PPTL/contracts/pptl/PPTLBase.sol



pragma solidity ^0.8.7;





contract PPTLBase is ERC721, IERC2981, AccessControl, Ownable {
    // ======== Royalties =========
    address private _royaltyAddress;
    uint256 private _royaltyPercent;

    /**
     * @dev Initializes the contract by setting a `default_admin` of the token access control.
     */
    constructor(address default_admin) {
        _setupRole(DEFAULT_ADMIN_ROLE, default_admin);
        _royaltyAddress = address(this);
        _royaltyPercent = 6;
    }

    /**
     * @dev Returns the token collection name.
     */
    function name() public view virtual override returns (string memory) {
        return "PeopleInThePlaceTheyLoveBase";
    }

    /**
     * @dev Returns the token collection symbol
     */
    function symbol() public view virtual override returns (string memory) {
        return "PPTLBase";
    }

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

    /**
     * @dev Set royalty info for all tokens
     * @param royaltyReceiver address to receive royalty fee
     * @param royaltyPercentage percentage of royalty fee
     *
     * Requirements:
     *
     * - the caller must have the contract owner.
     */
    function setRoyaltyInfo(address royaltyReceiver, uint256 royaltyPercentage) public onlyOwner {
        require(royaltyPercentage <= 100, "PPTL: RoyaltyPercentage exceed");
        _royaltyAddress = royaltyReceiver;
        _royaltyPercent = royaltyPercentage;
    }

    /**
     * @dev See {IERC2981-royaltyInfo}.
     */
    function royaltyInfo(uint256 tokenId, uint256 salePrice) external view override returns (address receiver, uint256 royaltyAmount){
        require(_exists(tokenId), "PPTL: Query royalty info for non-existent token");
        return (_royaltyAddress, (salePrice * _royaltyPercent) / 100);
    }
}

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

        return (signer, RecoverError.NoError);
    }

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

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

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

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

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


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

pragma solidity ^0.8.0;




/**
 * @dev Signature verification helper that can be used instead of `ECDSA.recover` to seamlessly support both ECDSA
 * signatures from externally owned accounts (EOAs) as well as ERC1271 signatures from smart contract wallets like
 * Argent and Gnosis Safe.
 *
 * _Available since v4.1._
 */
library SignatureChecker {
    /**
     * @dev Checks if a signature is valid for a given signer and data hash. If the signer is a smart contract, the
     * signature is validated against that smart contract using ERC1271, otherwise it's validated using `ECDSA.recover`.
     *
     * NOTE: Unlike ECDSA signatures, contract signatures are revocable, and the outcome of this function can thus
     * change through time. It could return true at block N and false at block N+1 (or the opposite).
     */
    function isValidSignatureNow(
        address signer,
        bytes32 hash,
        bytes memory signature
    ) internal view returns (bool) {
        (address recovered, ECDSA.RecoverError error) = ECDSA.tryRecover(hash, signature);
        if (error == ECDSA.RecoverError.NoError && recovered == signer) {
            return true;
        }

        (bool success, bytes memory result) = signer.staticcall(
            abi.encodeWithSelector(IERC1271.isValidSignature.selector, hash, signature)
        );
        return (success && result.length == 32 && abi.decode(result, (bytes4)) == IERC1271.isValidSignature.selector);
    }
}

// File: github/nicole-air/PPTL/contracts/pptl/PeopleInThePlaceTheyLove.sol



// @title:     PeopleInThePlaceTheyLove (PPTL)
// @desc:      “People In The Place They Love” is a collection of 1,000 NFTs- specially designed, dressed in unique hand-drawn attributes. This is the 1st out of 3 phases of Yusuke Hanai’s NFT project. NFT holders are able to gain membership access to the exclusive Yusuke Hanai collectors’ community with ever-growing benefits and offers.
// @twitter:   https://twitter.com/fwenclub
// @instagram: https://instagram.com/fwenclub
// @discord:   https://discord.gg/fwenclub
// @url:       https://www.fwenclub.com/

/*
* ███████╗░██╗░░░░░░░██╗███████╗███╗░░██╗░█████╗░██╗░░░░░██╗░░░██╗██████╗░
* ██╔════╝░██║░░██╗░░██║██╔════╝████╗░██║██╔══██╗██║░░░░░██║░░░██║██╔══██╗
* █████╗░░░╚██╗████╗██╔╝█████╗░░██╔██╗██║██║░░╚═╝██║░░░░░██║░░░██║██████╦╝
* ██╔══╝░░░░████╔═████║░██╔══╝░░██║╚████║██║░░██╗██║░░░░░██║░░░██║██╔══██╗
* ██║░░░░░░░╚██╔╝░╚██╔╝░███████╗██║░╚███║╚█████╔╝███████╗╚██████╔╝██████╦╝
* ╚═╝░░░░░░░░╚═╝░░░╚═╝░░╚══════╝╚═╝░░╚══╝░╚════╝░╚══════╝░╚═════╝░╚═════╝░
*/

pragma solidity ^0.8.7;




contract PeopleInThePlaceTheyLove is PPTLBase {
    using Strings for uint256;

    // ======================== Access Control =========================
    bytes32 internal constant MINTER_ROLE = keccak256("MINTER_ROLE");
    bytes32 internal constant OPERATOR_ROLE = keccak256("OPERATOR_ROLE");
    bytes32 internal constant WITHDRAW_ROLE = keccak256("WITHDRAW_ROLE");

    // ================ Lucky Draw ================
    struct UserTier {
        uint256 startTime;
        uint256 duration;
        uint256 ticketMaxNum;
        uint256 ticketPrice;
        mapping(address => uint256) users;
    }

    mapping(uint256 => UserTier) private _userTiers;
    bool public luckyDrawActive;

    // ===== Provenance ======
    bytes32 public provenance;

    // ======= Burning =========
    bool public isBurningActive;

    // ======= Supply =========
    uint256 public maxSupply;
    uint256 public totalSupply;

    // ===== Metadata ======
    string private _baseURI;

    // ====== Signature =======
    address private _authority;

    // === Marketplace ====
    address private _payee;

    // =================== Events ====================
    event PaymentReceived(address from, uint256 amount);
    event BalancePayout(address recipient, uint256 amount);

    /**
     * @dev Constructor function
     * @param default_admin access control default_admin
     * @param authority signature authority
     * @param payee lucky draw Ether receiver
     * @param maxSupply_ token max supply
     */
    constructor(address default_admin, address authority, address payee, uint256 maxSupply_) PPTLBase(default_admin) {
        _authority = authority;
        _payee = payee;
        maxSupply = maxSupply_;
    }

    /**
     * @dev The Ether received will be logged with {PaymentReceived} events. Note that these events are not fully
     * reliable: it's possible for a contract to receive Ether without triggering this function. This only affects the
     * reliability of the events, and not the actual splitting of Ether.
     */
    receive() external payable {
        emit PaymentReceived(_msgSender(), msg.value);
    }

    /**
     * @dev Returns the token collection name.
     */
    function name() public view virtual override returns (string memory) {
        return "PeopleInThePlaceTheyLove";
    }

    /**
     * @dev Returns the token collection symbol
     */
    function symbol() public view virtual override returns (string memory) {
        return "PPTL";
    }

    /**
     * @dev Sets base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`.
     * @param baseURI base URI to set
     *
     * Requirements:
     *
     * - the caller must have the `MINTER_ROLE`.
     */
    function setBaseURI(string memory baseURI) external onlyRole(MINTER_ROLE) {
        require(bytes(_baseURI).length == 0, "PPTL: BaseURI already set");
        _baseURI = baseURI;
    }

    /**
     * @dev Returns the URI for a given token ID
     * Throws if the token ID does not exist.
     * @param tokenId uint256 ID of the token to query
     */
    function tokenURI(uint256 tokenId) public view override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
        if (bytes(_baseURI).length > 0)
            return string(abi.encodePacked(_baseURI, tokenId.toString()));
        return string(abi.encodePacked("https://raffle.thefwenclub.com/token/", tokenId.toString()));
    }

    /**
     * @dev Toggles burning active flag
     *
     * Requirements:
     *
     * - the caller must have the `MINTER_ROLE`.
     */
    function toggleBurningActive() external onlyRole(MINTER_ROLE) {
        isBurningActive = !isBurningActive;
    }

    /**
     * @dev Destroys `tokenId`.
     * Throws if the caller is not token owner or approved
     * @param tokenId uint256 ID of the token to be destroyed
     */
    function burn(uint256 tokenId) external {
        require(isBurningActive && !luckyDrawActive, "PPTL: Burning not active");
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: Caller not owner or approved");
        _burn(tokenId);
    }

    /**
     * @dev Toggles lucky draw active flag
     *
     * Requirements:
     *
     * - the caller must have the `OPERATOR_ROLE`.
     */
    function toggleLuckydrawActive() external onlyRole(OPERATOR_ROLE) {
        luckyDrawActive = !luckyDrawActive;
    }

    /**
     * @dev Creates a new token for every address in `tos`. TokenIDs will be automatically assigned
     * @param tos owners of new tokens
     *
     * Requirements:
     *
     * - the caller must have the `MINTER_ROLE`.
     */
    function privateMint(address[] memory tos) external onlyRole(MINTER_ROLE) {
        require(!luckyDrawActive, "PPTL: Lucky draw has begun");

        for (uint256 i = 0; i < tos.length; i++) {
            _mint(tos[i], totalSupply + 1 + i);
        }
        totalSupply += tos.length;
        require(totalSupply <= maxSupply, "PPTL: Exceed max supply");
    }

    /**
     * @dev Creates lucky draw provenance and user tiers
     * @param provenance_ provenance of lucky draw token metadatas
     * @param userTierIds ids of user tiers in lucky draw
     * @param userTierStartTimes start times of user tiers in lucky draw
     * @param userTierDurations durations of user tiers in lucky draw
     * @param userTierTicketMaxNums max ticket numbers per user of user tiers in lucky draw
     * @param userTierTicketPrices ticket prices of user tiers in lucky draw
     *
     * Requirements:
     *
     * - the caller must have the `OPERATOR_ROLE`.
     */
    function createLuckyDraw(
        bytes32 provenance_,
        uint256[] memory userTierIds,
        uint256[] memory userTierStartTimes,
        uint256[] memory userTierDurations,
        uint256[] memory userTierTicketMaxNums,
        uint256[] memory userTierTicketPrices
    ) external onlyRole(OPERATOR_ROLE) {
        require(!luckyDrawActive, "PPTL: Lucky draw has begun");

        require(
            userTierIds.length == userTierStartTimes.length &&
            userTierIds.length == userTierDurations.length &&
            userTierIds.length == userTierTicketMaxNums.length &&
            userTierIds.length == userTierTicketPrices.length,
            "PPTL: array length mismatch"
        );

        provenance = provenance_;

        for (uint256 i = 0; i < userTierIds.length; i++) {
            _userTiers[userTierIds[i]].startTime = userTierStartTimes[i];
            _userTiers[userTierIds[i]].duration = userTierDurations[i];
            _userTiers[userTierIds[i]].ticketMaxNum = userTierTicketMaxNums[i];
            _userTiers[userTierIds[i]].ticketPrice = userTierTicketPrices[i];
        }
    }

    /**
     * @dev Creates new token(s) for valid caller. TokenID(s) will be automatically assigned
     * 
     * @param userTierId user tier id of caller belonged to
     * @param ticketNum number of tokens to create
     * @param signature signature from `_authority`
     */
    function draw(uint256 userTierId, uint256 ticketNum, bytes memory signature) external payable {
        require(luckyDrawActive, "PPTL: Lucky draw inactive");

        uint256 startTime = _userTiers[userTierId].startTime;
        uint256 endTime = startTime + _userTiers[userTierId].duration * 1 seconds;
        require(block.timestamp >= startTime && block.timestamp < endTime, "PPTL: Invalid time");

        bytes32 data = keccak256(abi.encode(address(this), _msgSender(), userTierId));
        require(SignatureChecker.isValidSignatureNow(_authority, data, signature), "PPTL: Invalid signature");

        uint256 newSupply = totalSupply + ticketNum;
        require(newSupply <= maxSupply, "PPTL: Exceed max supply");

        uint256 newTicketNum = _userTiers[userTierId].users[_msgSender()] + ticketNum;
        require(newTicketNum <= _userTiers[userTierId].ticketMaxNum, "PPTL: Exceed max ticket num");
        _userTiers[userTierId].users[_msgSender()] = newTicketNum;

        require(msg.value == _userTiers[userTierId].ticketPrice * ticketNum, "PPTL: Incorrect payment");
        (bool sent, ) = _payee.call{value: msg.value}("");
        require(sent, "PPTL: Failed to send Ether");

        for (uint256 i = 0; i < ticketNum; i++) {
            _mint(_msgSender(), totalSupply + i + 1);
        }
        totalSupply = newSupply;
    }

    /**
     * @dev Payouts contract balance
     * 
     * @param recipients addresses to receive Ether
     * @param fractions percentages of recipients receiving Ether
     *
     * Requirements:
     *
     * - the caller must have the `WITHDRAW_ROLE`.
     */
    function payout(address[] memory recipients, uint96[] memory fractions) external onlyRole(WITHDRAW_ROLE) {
        require(recipients.length == fractions.length, "PPTL: Array length mismatch");
        uint256 balance = address(this).balance;
        require(balance > 0, "PPTL: Invalid contract balance to payout");

        uint256 counter = 0;
        for (uint256 i = 0; i < recipients.length; i++) {
            require(recipients[i] != address(0), "PPTL: Invalid payout recipient");
            counter += fractions[i];

            uint256 amount = balance * fractions[i] / 100;
            (bool success, ) = recipients[i].call{value: amount}("");
            require(success, "PPTL: Failed to send Ether");
            emit BalancePayout(recipients[i], amount);
        }
        require(counter <= 100, "PPTL: Invalid payout");
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"default_admin","type":"address"},{"internalType":"address","name":"authority","type":"address"},{"internalType":"address","name":"payee","type":"address"},{"internalType":"uint256","name":"maxSupply_","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"BalancePayout","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":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","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":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"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":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"provenance_","type":"bytes32"},{"internalType":"uint256[]","name":"userTierIds","type":"uint256[]"},{"internalType":"uint256[]","name":"userTierStartTimes","type":"uint256[]"},{"internalType":"uint256[]","name":"userTierDurations","type":"uint256[]"},{"internalType":"uint256[]","name":"userTierTicketMaxNums","type":"uint256[]"},{"internalType":"uint256[]","name":"userTierTicketPrices","type":"uint256[]"}],"name":"createLuckyDraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"userTierId","type":"uint256"},{"internalType":"uint256","name":"ticketNum","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"draw","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isBurningActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"luckyDrawActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint96[]","name":"fractions","type":"uint96[]"}],"name":"payout","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"tos","type":"address[]"}],"name":"privateMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"provenance","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","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":"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":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"royaltyReceiver","type":"address"},{"internalType":"uint256","name":"royaltyPercentage","type":"uint256"}],"name":"setRoyaltyInfo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggleBurningActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleLuckydrawActive","outputs":[],"stateMutability":"nonpayable","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"},{"stateMutability":"payable","type":"receive"}]

60806040523480156200001157600080fd5b506040516200641d3803806200641d8339818101604052810190620000379190620003b9565b83620000586200004c6200014a60201b60201c565b6200015260201b60201c565b6200006d6000801b826200021860201b60201c565b30600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060066007819055505082600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600c8190555050505050620004a2565b600033905090565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6200022a82826200022e60201b60201c565b5050565b6200024082826200032060201b60201c565b6200031c5760016004600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550620002c16200014a60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b60006004600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000815190506200039c816200046e565b92915050565b600081519050620003b38162000488565b92915050565b60008060008060808587031215620003d657620003d562000469565b5b6000620003e6878288016200038b565b9450506020620003f9878288016200038b565b93505060406200040c878288016200038b565b92505060606200041f87828801620003a2565b91505092959194509250565b600062000438826200043f565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600080fd5b62000479816200042b565b81146200048557600080fd5b50565b62000493816200045f565b81146200049f57600080fd5b50565b615f6b80620004b26000396000f3fe60806040526004361061021e5760003560e01c8063715018a611610123578063c87b56dd116100ab578063e2e784d51161006f578063e2e784d514610807578063e47e9bb214610830578063e52ad1bc1461084c578063e985e9c514610875578063f2fde38b146108b257610265565b8063c87b56dd14610736578063cc50f26514610773578063d547741f1461079c578063d5abeb01146107c5578063d7f01693146107f057610265565b806395d89b41116100f257806395d89b4114610663578063a217fddf1461068e578063a22cb465146106b9578063a77e0198146106e2578063b88d4fde1461070d57610265565b8063715018a6146105cd5780637ae46355146105e45780638da5cb5b146105fb57806391d148541461062657610265565b80632f2ff15d116101a657806355f804b31161017557806355f804b3146104d657806357127247146104ff5780635ec670f71461052a5780636352211e1461055357806370a082311461059057610265565b80632f2ff15d1461043257806336568abe1461045b57806342842e0e1461048457806342966c68146104ad57610265565b80630f7309e8116101ed5780630f7309e81461033857806318160ddd1461036357806323b872dd1461038e578063248a9ca3146103b75780632a55205a146103f457610265565b806301ffc9a71461026a57806306fdde03146102a7578063081812fc146102d2578063095ea7b31461030f57610265565b36610265577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be77061024c6108db565b3460405161025b929190614a9f565b60405180910390a1005b600080fd5b34801561027657600080fd5b50610291600480360381019061028c91906140c0565b6108e3565b60405161029e9190614ac8565b60405180910390f35b3480156102b357600080fd5b506102bc61095d565b6040516102c99190614b73565b60405180910390f35b3480156102de57600080fd5b506102f960048036038101906102f49190614163565b61099a565b6040516103069190614a01565b60405180910390f35b34801561031b57600080fd5b5061033660048036038101906103319190613e39565b610a1f565b005b34801561034457600080fd5b5061034d610b37565b60405161035a9190614ae3565b60405180910390f35b34801561036f57600080fd5b50610378610b3d565b6040516103859190615015565b60405180910390f35b34801561039a57600080fd5b506103b560048036038101906103b09190613d23565b610b43565b005b3480156103c357600080fd5b506103de60048036038101906103d99190613f3a565b610ba3565b6040516103eb9190614ae3565b60405180910390f35b34801561040057600080fd5b5061041b60048036038101906104169190614190565b610bc3565b604051610429929190614a9f565b60405180910390f35b34801561043e57600080fd5b5061045960048036038101906104549190613f67565b610c56565b005b34801561046757600080fd5b50610482600480360381019061047d9190613f67565b610c7f565b005b34801561049057600080fd5b506104ab60048036038101906104a69190613d23565b610d02565b005b3480156104b957600080fd5b506104d460048036038101906104cf9190614163565b610d22565b005b3480156104e257600080fd5b506104fd60048036038101906104f8919061411a565b610de6565b005b34801561050b57600080fd5b50610514610e84565b6040516105219190614ac8565b60405180910390f35b34801561053657600080fd5b50610551600480360381019061054c9190613fa7565b610e97565b005b34801561055f57600080fd5b5061057a60048036038101906105759190614163565b6110f0565b6040516105879190614a01565b60405180910390f35b34801561059c57600080fd5b506105b760048036038101906105b29190613cb6565b6111a1565b6040516105c49190615015565b60405180910390f35b3480156105d957600080fd5b506105e2611259565b005b3480156105f057600080fd5b506105f96112e1565b005b34801561060757600080fd5b50610610611340565b60405161061d9190614a01565b60405180910390f35b34801561063257600080fd5b5061064d60048036038101906106489190613f67565b61136a565b60405161065a9190614ac8565b60405180910390f35b34801561066f57600080fd5b506106786113d5565b6040516106859190614b73565b60405180910390f35b34801561069a57600080fd5b506106a3611412565b6040516106b09190614ae3565b60405180910390f35b3480156106c557600080fd5b506106e060048036038101906106db9190613df9565b611419565b005b3480156106ee57600080fd5b506106f761142f565b6040516107049190614ac8565b60405180910390f35b34801561071957600080fd5b50610734600480360381019061072f9190613d76565b611442565b005b34801561074257600080fd5b5061075d60048036038101906107589190614163565b6114a4565b60405161076a9190614b73565b60405180910390f35b34801561077f57600080fd5b5061079a60048036038101906107959190613e79565b611567565b005b3480156107a857600080fd5b506107c360048036038101906107be9190613f67565b6116ab565b005b3480156107d157600080fd5b506107da6116d4565b6040516107e79190615015565b60405180910390f35b3480156107fc57600080fd5b506108056116da565b005b34801561081357600080fd5b5061082e60048036038101906108299190613e39565b611739565b005b61084a600480360381019061084591906141d0565b611845565b005b34801561085857600080fd5b50610873600480360381019061086e9190613ec2565b611cd6565b005b34801561088157600080fd5b5061089c60048036038101906108979190613ce3565b61201f565b6040516108a99190614ac8565b60405180910390f35b3480156108be57600080fd5b506108d960048036038101906108d49190613cb6565b6120b3565b005b600033905090565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109565750610955826121ab565b5b9050919050565b60606040518060400160405280601881526020017f50656f706c65496e546865506c616365546865794c6f76650000000000000000815250905090565b60006109a582612225565b6109e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109db90614dd5565b60405180910390fd5b6002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a2a826110f0565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9290614f15565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610aba6108db565b73ffffffffffffffffffffffffffffffffffffffff161480610ae95750610ae881610ae36108db565b61201f565b5b610b28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1f90614d15565b60405180910390fd5b610b328383612290565b505050565b600a5481565b600d5481565b610b54610b4e6108db565b82612349565b610b93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8a90614f55565b60405180910390fd5b610b9e838383612427565b505050565b600060046000838152602001908152602001600020600101549050919050565b600080610bcf84612225565b610c0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0590614f75565b60405180910390fd5b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16606460075485610c419190615225565b610c4b91906151f4565b915091509250929050565b610c5f82610ba3565b610c7081610c6b6108db565b612680565b610c7a838361271d565b505050565b610c876108db565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610cf4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ceb90614ff5565b60405180910390fd5b610cfe82826127fe565b5050565b610d1d83838360405180602001604052806000815250611442565b505050565b600b60009054906101000a900460ff168015610d4b5750600960009054906101000a900460ff16155b610d8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8190614cf5565b60405180910390fd5b610d9b610d956108db565b82612349565b610dda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd190614e35565b60405180910390fd5b610de3816128e0565b50565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6610e1881610e136108db565b612680565b6000600e8054610e27906153c2565b905014610e69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6090614ef5565b60405180910390fd5b81600e9080519060200190610e7f9291906138c6565b505050565b600b60009054906101000a900460ff1681565b7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b929610ec981610ec46108db565b612680565b600960009054906101000a900460ff1615610f19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1090614f35565b60405180910390fd5b84518651148015610f2b575083518651145b8015610f38575082518651145b8015610f45575081518651145b610f84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7b90614fb5565b60405180910390fd5b86600a8190555060005b86518110156110e657858181518110610faa57610fa961555b565b5b602002602001015160086000898481518110610fc957610fc861555b565b5b6020026020010151815260200190815260200160002060000181905550848181518110610ff957610ff861555b565b5b6020026020010151600860008984815181106110185761101761555b565b5b60200260200101518152602001908152602001600020600101819055508381815181106110485761104761555b565b5b6020026020010151600860008984815181106110675761106661555b565b5b60200260200101518152602001908152602001600020600201819055508281815181106110975761109661555b565b5b6020026020010151600860008984815181106110b6576110b561555b565b5b602002602001015181526020019081526020016000206003018190555080806110de90615425565b915050610f8e565b5050505050505050565b60008060008084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611198576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118f90614d75565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611212576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120990614d55565b60405180910390fd5b600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6112616108db565b73ffffffffffffffffffffffffffffffffffffffff1661127f611340565b73ffffffffffffffffffffffffffffffffffffffff16146112d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112cc90614e15565b60405180910390fd5b6112df60006129ef565b565b7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b9296113138161130e6108db565b612680565b600960009054906101000a900460ff1615600960006101000a81548160ff02191690831515021790555050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60006004600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60606040518060400160405280600481526020017f5050544c00000000000000000000000000000000000000000000000000000000815250905090565b6000801b81565b61142b6114246108db565b8383612ab5565b5050565b600960009054906101000a900460ff1681565b61145361144d6108db565b83612349565b611492576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148990614f55565b60405180910390fd5b61149e84848484612c22565b50505050565b60606114af82612225565b6114ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e590614e75565b60405180910390fd5b6000600e80546114fd906153c2565b9050111561153757600e61151083612c7e565b60405160200161152192919061496c565b6040516020818303038152906040529050611562565b61154082612c7e565b6040516020016115509190614990565b60405160208183030381529060405290505b919050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6611599816115946108db565b612680565b600960009054906101000a900460ff16156115e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e090614f35565b60405180910390fd5b60005b82518110156116455761163283828151811061160b5761160a61555b565b5b6020026020010151826001600d54611623919061519e565b61162d919061519e565b612ddf565b808061163d90615425565b9150506115ec565b508151600d6000828254611659919061519e565b92505081905550600c54600d5411156116a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169e90614e95565b60405180910390fd5b5050565b6116b482610ba3565b6116c5816116c06108db565b612680565b6116cf83836127fe565b505050565b600c5481565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a661170c816117076108db565b612680565b600b60009054906101000a900460ff1615600b60006101000a81548160ff02191690831515021790555050565b6117416108db565b73ffffffffffffffffffffffffffffffffffffffff1661175f611340565b73ffffffffffffffffffffffffffffffffffffffff16146117b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ac90614e15565b60405180910390fd5b60648111156117f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f090614c15565b60405180910390fd5b81600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550806007819055505050565b600960009054906101000a900460ff16611894576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188b90614d95565b60405180910390fd5b6000600860008581526020019081526020016000206000015490506000600160086000878152602001908152602001600020600101546118d49190615225565b826118df919061519e565b90508142101580156118f057508042105b61192f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192690614fd5565b60405180910390fd5b60003061193a6108db565b8760405160200161194d93929190614a1c565b604051602081830303815290604052805190602001209050611992600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168286612fab565b6119d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c890614f95565b60405180910390fd5b600085600d546119e1919061519e565b9050600c54811115611a28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1f90614e95565b60405180910390fd5b600086600860008a81526020019081526020016000206004016000611a4b6108db565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611a90919061519e565b90506008600089815260200190815260200160002060020154811115611aeb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ae290614ed5565b60405180910390fd5b80600860008a81526020019081526020016000206004016000611b0c6108db565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555086600860008a815260200190815260200160002060030154611b6c9190615225565b3414611bad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ba490614eb5565b60405180910390fd5b6000601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1634604051611bf5906149b2565b60006040518083038185875af1925050503d8060008114611c32576040519150601f19603f3d011682016040523d82523d6000602084013e611c37565b606091505b5050905080611c7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7290614bb5565b60405180910390fd5b60005b88811015611cc357611cb0611c916108db565b600183600d54611ca1919061519e565b611cab919061519e565b612ddf565b8080611cbb90615425565b915050611c7e565b5082600d81905550505050505050505050565b7f5d8e12c39142ff96d79d04d15d1ba1269e4fe57bb9d26f43523628b34ba108ec611d0881611d036108db565b612680565b8151835114611d4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4390614cb5565b60405180910390fd5b600047905060008111611d94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d8b90614c55565b60405180910390fd5b6000805b8551811015611fd357600073ffffffffffffffffffffffffffffffffffffffff16868281518110611dcc57611dcb61555b565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff161415611e2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2290614df5565b60405180910390fd5b848181518110611e3e57611e3d61555b565b5b60200260200101516bffffffffffffffffffffffff1682611e5f919061519e565b915060006064868381518110611e7857611e7761555b565b5b60200260200101516bffffffffffffffffffffffff1685611e999190615225565b611ea391906151f4565b90506000878381518110611eba57611eb961555b565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1682604051611ee5906149b2565b60006040518083038185875af1925050503d8060008114611f22576040519150601f19603f3d011682016040523d82523d6000602084013e611f27565b606091505b5050905080611f6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f6290614bb5565b60405180910390fd5b7f773d0e2b7d29fd7a9da3b776769ae51f123465c10d42e90684205842e407ad5c888481518110611f9f57611f9e61555b565b5b602002602001015183604051611fb6929190614a9f565b60405180910390a150508080611fcb90615425565b915050611d98565b506064811115612018576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161200f90614d35565b60405180910390fd5b5050505050565b6000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6120bb6108db565b73ffffffffffffffffffffffffffffffffffffffff166120d9611340565b73ffffffffffffffffffffffffffffffffffffffff161461212f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161212690614e15565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561219f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161219690614bf5565b60405180910390fd5b6121a8816129ef565b50565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061221e575061221d82613190565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff1660008084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612303836110f0565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061235482612225565b612393576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161238a90614cd5565b60405180910390fd5b600061239e836110f0565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061240d57508373ffffffffffffffffffffffffffffffffffffffff166123f58461099a565b73ffffffffffffffffffffffffffffffffffffffff16145b8061241e575061241d818561201f565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612447826110f0565b73ffffffffffffffffffffffffffffffffffffffff161461249d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161249490614e55565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561250d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161250490614c75565b60405180910390fd5b612518838383613272565b612523600082612290565b60018060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612572919061527f565b9250508190555060018060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125c8919061519e565b925050819055508160008083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b61268a828261136a565b612719576126af8173ffffffffffffffffffffffffffffffffffffffff166014613277565b6126bd8360001c6020613277565b6040516020016126ce9291906149c7565b6040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127109190614b73565b60405180910390fd5b5050565b612727828261136a565b6127fa5760016004600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061279f6108db565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b612808828261136a565b156128dc5760006004600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506128816108db565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b60006128eb826110f0565b90506128f981600084613272565b612904600083612290565b60018060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612953919061527f565b9250508190555060008083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612b24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b1b90614c95565b60405180910390fd5b80600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612c159190614ac8565b60405180910390a3505050565b612c2d848484612427565b612c39848484846134b3565b612c78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c6f90614bd5565b60405180910390fd5b50505050565b60606000821415612cc6576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612dda565b600082905060005b60008214612cf8578080612ce190615425565b915050600a82612cf191906151f4565b9150612cce565b60008167ffffffffffffffff811115612d1457612d1361558a565b5b6040519080825280601f01601f191660200182016040528015612d465781602001600182028036833780820191505090505b5090505b60008514612dd357600182612d5f919061527f565b9150600a85612d6e919061546e565b6030612d7a919061519e565b60f81b818381518110612d9057612d8f61555b565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612dcc91906151f4565b9450612d4a565b8093505050505b919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612e4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e4690614db5565b60405180910390fd5b612e5881612225565b15612e98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e8f90614c35565b60405180910390fd5b612ea460008383613272565b60018060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612ef3919061519e565b925050819055508160008083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000806000612fba858561364a565b9150915060006004811115612fd257612fd16154fd565b5b816004811115612fe557612fe46154fd565b5b14801561301d57508573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b1561302d57600192505050613189565b6000808773ffffffffffffffffffffffffffffffffffffffff16631626ba7e60e01b8888604051602401613062929190614afe565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516130cc9190614955565b600060405180830381855afa9150503d8060008114613107576040519150601f19603f3d011682016040523d82523d6000602084013e61310c565b606091505b509150915081801561311f575060208151145b80156131825750631626ba7e60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168180602001905181019061316191906140ed565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9450505050505b9392505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061325b57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061326b575061326a826136cd565b5b9050919050565b505050565b60606000600283600261328a9190615225565b613294919061519e565b67ffffffffffffffff8111156132ad576132ac61558a565b5b6040519080825280601f01601f1916602001820160405280156132df5781602001600182028036833780820191505090505b5090507f3000000000000000000000000000000000000000000000000000000000000000816000815181106133175761331661555b565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f78000000000000000000000000000000000000000000000000000000000000008160018151811061337b5761337a61555b565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600060018460026133bb9190615225565b6133c5919061519e565b90505b6001811115613465577f3031323334353637383961626364656600000000000000000000000000000000600f8616601081106134075761340661555b565b5b1a60f81b82828151811061341e5761341d61555b565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c94508061345e90615398565b90506133c8565b50600084146134a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134a090614b95565b60405180910390fd5b8091505092915050565b60006134d48473ffffffffffffffffffffffffffffffffffffffff16613737565b1561363d578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026134fd6108db565b8786866040518563ffffffff1660e01b815260040161351f9493929190614a53565b602060405180830381600087803b15801561353957600080fd5b505af192505050801561356a57506040513d601f19601f8201168201806040525081019061356791906140ed565b60015b6135ed573d806000811461359a576040519150601f19603f3d011682016040523d82523d6000602084013e61359f565b606091505b506000815114156135e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135dc90614bd5565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613642565b600190505b949350505050565b60008060418351141561368c5760008060006020860151925060408601519150606086015160001a90506136808782858561375a565b945094505050506136c6565b6040835114156136bd5760008060208501519150604085015190506136b2868383613867565b9350935050506136c6565b60006002915091505b9250929050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c111561379557600060039150915061385e565b601b8560ff16141580156137ad5750601c8560ff1614155b156137bf57600060049150915061385e565b6000600187878787604051600081526020016040526040516137e49493929190614b2e565b6020604051602081039080840390855afa158015613806573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156138555760006001925092505061385e565b80600092509250505b94509492505050565b60008060007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60001b841690506000601b60ff8660001c901c6138aa919061519e565b90506138b88782888561375a565b935093505050935093915050565b8280546138d2906153c2565b90600052602060002090601f0160209004810192826138f4576000855561393b565b82601f1061390d57805160ff191683800117855561393b565b8280016001018555821561393b579182015b8281111561393a57825182559160200191906001019061391f565b5b509050613948919061394c565b5090565b5b8082111561396557600081600090555060010161394d565b5090565b600061397c61397784615055565b615030565b9050808382526020820190508285602086028201111561399f5761399e6155be565b5b60005b858110156139cf57816139b58882613b3d565b8452602084019350602083019250506001810190506139a2565b5050509392505050565b60006139ec6139e784615081565b615030565b90508083825260208201905082856020860282011115613a0f57613a0e6155be565b5b60005b85811015613a3f5781613a258882613c8c565b845260208401935060208301925050600181019050613a12565b5050509392505050565b6000613a5c613a57846150ad565b615030565b90508083825260208201905082856020860282011115613a7f57613a7e6155be565b5b60005b85811015613aaf5781613a958882613ca1565b845260208401935060208301925050600181019050613a82565b5050509392505050565b6000613acc613ac7846150d9565b615030565b905082815260208101848484011115613ae857613ae76155c3565b5b613af3848285615356565b509392505050565b6000613b0e613b098461510a565b615030565b905082815260208101848484011115613b2a57613b296155c3565b5b613b35848285615356565b509392505050565b600081359050613b4c81615eab565b92915050565b600082601f830112613b6757613b666155b9565b5b8135613b77848260208601613969565b91505092915050565b600082601f830112613b9557613b946155b9565b5b8135613ba58482602086016139d9565b91505092915050565b600082601f830112613bc357613bc26155b9565b5b8135613bd3848260208601613a49565b91505092915050565b600081359050613beb81615ec2565b92915050565b600081359050613c0081615ed9565b92915050565b600081359050613c1581615ef0565b92915050565b600081519050613c2a81615ef0565b92915050565b600082601f830112613c4557613c446155b9565b5b8135613c55848260208601613ab9565b91505092915050565b600082601f830112613c7357613c726155b9565b5b8135613c83848260208601613afb565b91505092915050565b600081359050613c9b81615f07565b92915050565b600081359050613cb081615f1e565b92915050565b600060208284031215613ccc57613ccb6155cd565b5b6000613cda84828501613b3d565b91505092915050565b60008060408385031215613cfa57613cf96155cd565b5b6000613d0885828601613b3d565b9250506020613d1985828601613b3d565b9150509250929050565b600080600060608486031215613d3c57613d3b6155cd565b5b6000613d4a86828701613b3d565b9350506020613d5b86828701613b3d565b9250506040613d6c86828701613c8c565b9150509250925092565b60008060008060808587031215613d9057613d8f6155cd565b5b6000613d9e87828801613b3d565b9450506020613daf87828801613b3d565b9350506040613dc087828801613c8c565b925050606085013567ffffffffffffffff811115613de157613de06155c8565b5b613ded87828801613c30565b91505092959194509250565b60008060408385031215613e1057613e0f6155cd565b5b6000613e1e85828601613b3d565b9250506020613e2f85828601613bdc565b9150509250929050565b60008060408385031215613e5057613e4f6155cd565b5b6000613e5e85828601613b3d565b9250506020613e6f85828601613c8c565b9150509250929050565b600060208284031215613e8f57613e8e6155cd565b5b600082013567ffffffffffffffff811115613ead57613eac6155c8565b5b613eb984828501613b52565b91505092915050565b60008060408385031215613ed957613ed86155cd565b5b600083013567ffffffffffffffff811115613ef757613ef66155c8565b5b613f0385828601613b52565b925050602083013567ffffffffffffffff811115613f2457613f236155c8565b5b613f3085828601613bae565b9150509250929050565b600060208284031215613f5057613f4f6155cd565b5b6000613f5e84828501613bf1565b91505092915050565b60008060408385031215613f7e57613f7d6155cd565b5b6000613f8c85828601613bf1565b9250506020613f9d85828601613b3d565b9150509250929050565b60008060008060008060c08789031215613fc457613fc36155cd565b5b6000613fd289828a01613bf1565b965050602087013567ffffffffffffffff811115613ff357613ff26155c8565b5b613fff89828a01613b80565b955050604087013567ffffffffffffffff8111156140205761401f6155c8565b5b61402c89828a01613b80565b945050606087013567ffffffffffffffff81111561404d5761404c6155c8565b5b61405989828a01613b80565b935050608087013567ffffffffffffffff81111561407a576140796155c8565b5b61408689828a01613b80565b92505060a087013567ffffffffffffffff8111156140a7576140a66155c8565b5b6140b389828a01613b80565b9150509295509295509295565b6000602082840312156140d6576140d56155cd565b5b60006140e484828501613c06565b91505092915050565b600060208284031215614103576141026155cd565b5b600061411184828501613c1b565b91505092915050565b6000602082840312156141305761412f6155cd565b5b600082013567ffffffffffffffff81111561414e5761414d6155c8565b5b61415a84828501613c5e565b91505092915050565b600060208284031215614179576141786155cd565b5b600061418784828501613c8c565b91505092915050565b600080604083850312156141a7576141a66155cd565b5b60006141b585828601613c8c565b92505060206141c685828601613c8c565b9150509250929050565b6000806000606084860312156141e9576141e86155cd565b5b60006141f786828701613c8c565b935050602061420886828701613c8c565b925050604084013567ffffffffffffffff811115614229576142286155c8565b5b61423586828701613c30565b9150509250925092565b614248816152b3565b82525050565b614257816152c5565b82525050565b614266816152d1565b82525050565b600061427782615150565b6142818185615166565b9350614291818560208601615365565b61429a816155d2565b840191505092915050565b60006142b082615150565b6142ba8185615177565b93506142ca818560208601615365565b80840191505092915050565b60006142e18261515b565b6142eb8185615182565b93506142fb818560208601615365565b614304816155d2565b840191505092915050565b600061431a8261515b565b6143248185615193565b9350614334818560208601615365565b80840191505092915050565b6000815461434d816153c2565b6143578186615193565b945060018216600081146143725760018114614383576143b6565b60ff198316865281860193506143b6565b61438c8561513b565b60005b838110156143ae5781548189015260018201915060208101905061438f565b838801955050505b50505092915050565b60006143cc602083615182565b91506143d7826155e3565b602082019050919050565b60006143ef601a83615182565b91506143fa8261560c565b602082019050919050565b6000614412603283615182565b915061441d82615635565b604082019050919050565b6000614435602683615182565b915061444082615684565b604082019050919050565b6000614458601e83615182565b9150614463826156d3565b602082019050919050565b600061447b601c83615182565b9150614486826156fc565b602082019050919050565b600061449e602883615182565b91506144a982615725565b604082019050919050565b60006144c1602483615182565b91506144cc82615774565b604082019050919050565b60006144e4601983615182565b91506144ef826157c3565b602082019050919050565b6000614507601b83615182565b9150614512826157ec565b602082019050919050565b600061452a602c83615182565b915061453582615815565b604082019050919050565b600061454d601883615182565b915061455882615864565b602082019050919050565b6000614570603883615182565b915061457b8261588d565b604082019050919050565b6000614593601483615182565b915061459e826158dc565b602082019050919050565b60006145b6602a83615182565b91506145c182615905565b604082019050919050565b60006145d9602983615182565b91506145e482615954565b604082019050919050565b60006145fc601983615182565b9150614607826159a3565b602082019050919050565b600061461f602083615182565b915061462a826159cc565b602082019050919050565b6000614642602c83615182565b915061464d826159f5565b604082019050919050565b6000614665601e83615182565b915061467082615a44565b602082019050919050565b6000614688602083615182565b915061469382615a6d565b602082019050919050565b60006146ab602483615182565b91506146b682615a96565b604082019050919050565b60006146ce602983615182565b91506146d982615ae5565b604082019050919050565b60006146f1602f83615182565b91506146fc82615b34565b604082019050919050565b6000614714601783615182565b915061471f82615b83565b602082019050919050565b6000614737601783615182565b915061474282615bac565b602082019050919050565b600061475a601b83615182565b915061476582615bd5565b602082019050919050565b600061477d601983615182565b915061478882615bfe565b602082019050919050565b60006147a0602183615182565b91506147ab82615c27565b604082019050919050565b60006147c3602583615193565b91506147ce82615c76565b602582019050919050565b60006147e6601a83615182565b91506147f182615cc5565b602082019050919050565b6000614809600083615177565b915061481482615cee565b600082019050919050565b600061482c603183615182565b915061483782615cf1565b604082019050919050565b600061484f602f83615182565b915061485a82615d40565b604082019050919050565b6000614872601783615182565b915061487d82615d8f565b602082019050919050565b6000614895601783615193565b91506148a082615db8565b601782019050919050565b60006148b8601b83615182565b91506148c382615de1565b602082019050919050565b60006148db601183615193565b91506148e682615e0a565b601182019050919050565b60006148fe601283615182565b915061490982615e33565b602082019050919050565b6000614921602f83615182565b915061492c82615e5c565b604082019050919050565b61494081615327565b82525050565b61494f81615331565b82525050565b600061496182846142a5565b915081905092915050565b60006149788285614340565b9150614984828461430f565b91508190509392505050565b600061499b826147b6565b91506149a7828461430f565b915081905092915050565b60006149bd826147fc565b9150819050919050565b60006149d282614888565b91506149de828561430f565b91506149e9826148ce565b91506149f5828461430f565b91508190509392505050565b6000602082019050614a16600083018461423f565b92915050565b6000606082019050614a31600083018661423f565b614a3e602083018561423f565b614a4b6040830184614937565b949350505050565b6000608082019050614a68600083018761423f565b614a75602083018661423f565b614a826040830185614937565b8181036060830152614a94818461426c565b905095945050505050565b6000604082019050614ab4600083018561423f565b614ac16020830184614937565b9392505050565b6000602082019050614add600083018461424e565b92915050565b6000602082019050614af8600083018461425d565b92915050565b6000604082019050614b13600083018561425d565b8181036020830152614b25818461426c565b90509392505050565b6000608082019050614b43600083018761425d565b614b506020830186614946565b614b5d604083018561425d565b614b6a606083018461425d565b95945050505050565b60006020820190508181036000830152614b8d81846142d6565b905092915050565b60006020820190508181036000830152614bae816143bf565b9050919050565b60006020820190508181036000830152614bce816143e2565b9050919050565b60006020820190508181036000830152614bee81614405565b9050919050565b60006020820190508181036000830152614c0e81614428565b9050919050565b60006020820190508181036000830152614c2e8161444b565b9050919050565b60006020820190508181036000830152614c4e8161446e565b9050919050565b60006020820190508181036000830152614c6e81614491565b9050919050565b60006020820190508181036000830152614c8e816144b4565b9050919050565b60006020820190508181036000830152614cae816144d7565b9050919050565b60006020820190508181036000830152614cce816144fa565b9050919050565b60006020820190508181036000830152614cee8161451d565b9050919050565b60006020820190508181036000830152614d0e81614540565b9050919050565b60006020820190508181036000830152614d2e81614563565b9050919050565b60006020820190508181036000830152614d4e81614586565b9050919050565b60006020820190508181036000830152614d6e816145a9565b9050919050565b60006020820190508181036000830152614d8e816145cc565b9050919050565b60006020820190508181036000830152614dae816145ef565b9050919050565b60006020820190508181036000830152614dce81614612565b9050919050565b60006020820190508181036000830152614dee81614635565b9050919050565b60006020820190508181036000830152614e0e81614658565b9050919050565b60006020820190508181036000830152614e2e8161467b565b9050919050565b60006020820190508181036000830152614e4e8161469e565b9050919050565b60006020820190508181036000830152614e6e816146c1565b9050919050565b60006020820190508181036000830152614e8e816146e4565b9050919050565b60006020820190508181036000830152614eae81614707565b9050919050565b60006020820190508181036000830152614ece8161472a565b9050919050565b60006020820190508181036000830152614eee8161474d565b9050919050565b60006020820190508181036000830152614f0e81614770565b9050919050565b60006020820190508181036000830152614f2e81614793565b9050919050565b60006020820190508181036000830152614f4e816147d9565b9050919050565b60006020820190508181036000830152614f6e8161481f565b9050919050565b60006020820190508181036000830152614f8e81614842565b9050919050565b60006020820190508181036000830152614fae81614865565b9050919050565b60006020820190508181036000830152614fce816148ab565b9050919050565b60006020820190508181036000830152614fee816148f1565b9050919050565b6000602082019050818103600083015261500e81614914565b9050919050565b600060208201905061502a6000830184614937565b92915050565b600061503a61504b565b905061504682826153f4565b919050565b6000604051905090565b600067ffffffffffffffff8211156150705761506f61558a565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561509c5761509b61558a565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156150c8576150c761558a565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156150f4576150f361558a565b5b6150fd826155d2565b9050602081019050919050565b600067ffffffffffffffff8211156151255761512461558a565b5b61512e826155d2565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006151a982615327565b91506151b483615327565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156151e9576151e861549f565b5b828201905092915050565b60006151ff82615327565b915061520a83615327565b92508261521a576152196154ce565b5b828204905092915050565b600061523082615327565b915061523b83615327565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156152745761527361549f565b5b828202905092915050565b600061528a82615327565b915061529583615327565b9250828210156152a8576152a761549f565b5b828203905092915050565b60006152be82615307565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60006bffffffffffffffffffffffff82169050919050565b82818337600083830152505050565b60005b83811015615383578082015181840152602081019050615368565b83811115615392576000848401525b50505050565b60006153a382615327565b915060008214156153b7576153b661549f565b5b600182039050919050565b600060028204905060018216806153da57607f821691505b602082108114156153ee576153ed61552c565b5b50919050565b6153fd826155d2565b810181811067ffffffffffffffff8211171561541c5761541b61558a565b5b80604052505050565b600061543082615327565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156154635761546261549f565b5b600182019050919050565b600061547982615327565b915061548483615327565b925082615494576154936154ce565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b7f5050544c3a204661696c656420746f2073656e64204574686572000000000000600082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f5050544c3a20526f79616c747950657263656e74616765206578636565640000600082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f5050544c3a20496e76616c696420636f6e74726163742062616c616e6365207460008201527f6f207061796f7574000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f5050544c3a204172726179206c656e677468206d69736d617463680000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f5050544c3a204275726e696e67206e6f74206163746976650000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f5050544c3a20496e76616c6964207061796f7574000000000000000000000000600082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f5050544c3a204c75636b79206472617720696e61637469766500000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f5050544c3a20496e76616c6964207061796f757420726563697069656e740000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a2043616c6c6572206e6f74206f776e6572206f72206170707260008201527f6f76656400000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f5050544c3a20457863656564206d617820737570706c79000000000000000000600082015250565b7f5050544c3a20496e636f7272656374207061796d656e74000000000000000000600082015250565b7f5050544c3a20457863656564206d6178207469636b6574206e756d0000000000600082015250565b7f5050544c3a204261736555524920616c72656164792073657400000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f68747470733a2f2f726166666c652e7468656677656e636c75622e636f6d2f7460008201527f6f6b656e2f000000000000000000000000000000000000000000000000000000602082015250565b7f5050544c3a204c75636b7920647261772068617320626567756e000000000000600082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f5050544c3a20517565727920726f79616c747920696e666f20666f72206e6f6e60008201527f2d6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f5050544c3a20496e76616c6964207369676e6174757265000000000000000000600082015250565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b7f5050544c3a206172726179206c656e677468206d69736d617463680000000000600082015250565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b7f5050544c3a20496e76616c69642074696d650000000000000000000000000000600082015250565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b615eb4816152b3565b8114615ebf57600080fd5b50565b615ecb816152c5565b8114615ed657600080fd5b50565b615ee2816152d1565b8114615eed57600080fd5b50565b615ef9816152db565b8114615f0457600080fd5b50565b615f1081615327565b8114615f1b57600080fd5b50565b615f278161533e565b8114615f3257600080fd5b5056fea2646970667358221220535e90bf952804a6c096e8453bd3fd7c9739a2f639478fd61f33854fe17b7d5764736f6c63430008070033000000000000000000000000df92e031b00fbff462eceac436e2d906047ff70d0000000000000000000000005112d14803dbaf87c0261bb3ef39d374e3f739fc0000000000000000000000009316810cd683f84c44b09eb60414fdb0e26486eb00000000000000000000000000000000000000000000000000000000000003e8

Deployed Bytecode

0x60806040526004361061021e5760003560e01c8063715018a611610123578063c87b56dd116100ab578063e2e784d51161006f578063e2e784d514610807578063e47e9bb214610830578063e52ad1bc1461084c578063e985e9c514610875578063f2fde38b146108b257610265565b8063c87b56dd14610736578063cc50f26514610773578063d547741f1461079c578063d5abeb01146107c5578063d7f01693146107f057610265565b806395d89b41116100f257806395d89b4114610663578063a217fddf1461068e578063a22cb465146106b9578063a77e0198146106e2578063b88d4fde1461070d57610265565b8063715018a6146105cd5780637ae46355146105e45780638da5cb5b146105fb57806391d148541461062657610265565b80632f2ff15d116101a657806355f804b31161017557806355f804b3146104d657806357127247146104ff5780635ec670f71461052a5780636352211e1461055357806370a082311461059057610265565b80632f2ff15d1461043257806336568abe1461045b57806342842e0e1461048457806342966c68146104ad57610265565b80630f7309e8116101ed5780630f7309e81461033857806318160ddd1461036357806323b872dd1461038e578063248a9ca3146103b75780632a55205a146103f457610265565b806301ffc9a71461026a57806306fdde03146102a7578063081812fc146102d2578063095ea7b31461030f57610265565b36610265577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be77061024c6108db565b3460405161025b929190614a9f565b60405180910390a1005b600080fd5b34801561027657600080fd5b50610291600480360381019061028c91906140c0565b6108e3565b60405161029e9190614ac8565b60405180910390f35b3480156102b357600080fd5b506102bc61095d565b6040516102c99190614b73565b60405180910390f35b3480156102de57600080fd5b506102f960048036038101906102f49190614163565b61099a565b6040516103069190614a01565b60405180910390f35b34801561031b57600080fd5b5061033660048036038101906103319190613e39565b610a1f565b005b34801561034457600080fd5b5061034d610b37565b60405161035a9190614ae3565b60405180910390f35b34801561036f57600080fd5b50610378610b3d565b6040516103859190615015565b60405180910390f35b34801561039a57600080fd5b506103b560048036038101906103b09190613d23565b610b43565b005b3480156103c357600080fd5b506103de60048036038101906103d99190613f3a565b610ba3565b6040516103eb9190614ae3565b60405180910390f35b34801561040057600080fd5b5061041b60048036038101906104169190614190565b610bc3565b604051610429929190614a9f565b60405180910390f35b34801561043e57600080fd5b5061045960048036038101906104549190613f67565b610c56565b005b34801561046757600080fd5b50610482600480360381019061047d9190613f67565b610c7f565b005b34801561049057600080fd5b506104ab60048036038101906104a69190613d23565b610d02565b005b3480156104b957600080fd5b506104d460048036038101906104cf9190614163565b610d22565b005b3480156104e257600080fd5b506104fd60048036038101906104f8919061411a565b610de6565b005b34801561050b57600080fd5b50610514610e84565b6040516105219190614ac8565b60405180910390f35b34801561053657600080fd5b50610551600480360381019061054c9190613fa7565b610e97565b005b34801561055f57600080fd5b5061057a60048036038101906105759190614163565b6110f0565b6040516105879190614a01565b60405180910390f35b34801561059c57600080fd5b506105b760048036038101906105b29190613cb6565b6111a1565b6040516105c49190615015565b60405180910390f35b3480156105d957600080fd5b506105e2611259565b005b3480156105f057600080fd5b506105f96112e1565b005b34801561060757600080fd5b50610610611340565b60405161061d9190614a01565b60405180910390f35b34801561063257600080fd5b5061064d60048036038101906106489190613f67565b61136a565b60405161065a9190614ac8565b60405180910390f35b34801561066f57600080fd5b506106786113d5565b6040516106859190614b73565b60405180910390f35b34801561069a57600080fd5b506106a3611412565b6040516106b09190614ae3565b60405180910390f35b3480156106c557600080fd5b506106e060048036038101906106db9190613df9565b611419565b005b3480156106ee57600080fd5b506106f761142f565b6040516107049190614ac8565b60405180910390f35b34801561071957600080fd5b50610734600480360381019061072f9190613d76565b611442565b005b34801561074257600080fd5b5061075d60048036038101906107589190614163565b6114a4565b60405161076a9190614b73565b60405180910390f35b34801561077f57600080fd5b5061079a60048036038101906107959190613e79565b611567565b005b3480156107a857600080fd5b506107c360048036038101906107be9190613f67565b6116ab565b005b3480156107d157600080fd5b506107da6116d4565b6040516107e79190615015565b60405180910390f35b3480156107fc57600080fd5b506108056116da565b005b34801561081357600080fd5b5061082e60048036038101906108299190613e39565b611739565b005b61084a600480360381019061084591906141d0565b611845565b005b34801561085857600080fd5b50610873600480360381019061086e9190613ec2565b611cd6565b005b34801561088157600080fd5b5061089c60048036038101906108979190613ce3565b61201f565b6040516108a99190614ac8565b60405180910390f35b3480156108be57600080fd5b506108d960048036038101906108d49190613cb6565b6120b3565b005b600033905090565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109565750610955826121ab565b5b9050919050565b60606040518060400160405280601881526020017f50656f706c65496e546865506c616365546865794c6f76650000000000000000815250905090565b60006109a582612225565b6109e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109db90614dd5565b60405180910390fd5b6002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a2a826110f0565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9290614f15565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610aba6108db565b73ffffffffffffffffffffffffffffffffffffffff161480610ae95750610ae881610ae36108db565b61201f565b5b610b28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1f90614d15565b60405180910390fd5b610b328383612290565b505050565b600a5481565b600d5481565b610b54610b4e6108db565b82612349565b610b93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8a90614f55565b60405180910390fd5b610b9e838383612427565b505050565b600060046000838152602001908152602001600020600101549050919050565b600080610bcf84612225565b610c0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0590614f75565b60405180910390fd5b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16606460075485610c419190615225565b610c4b91906151f4565b915091509250929050565b610c5f82610ba3565b610c7081610c6b6108db565b612680565b610c7a838361271d565b505050565b610c876108db565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610cf4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ceb90614ff5565b60405180910390fd5b610cfe82826127fe565b5050565b610d1d83838360405180602001604052806000815250611442565b505050565b600b60009054906101000a900460ff168015610d4b5750600960009054906101000a900460ff16155b610d8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8190614cf5565b60405180910390fd5b610d9b610d956108db565b82612349565b610dda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd190614e35565b60405180910390fd5b610de3816128e0565b50565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6610e1881610e136108db565b612680565b6000600e8054610e27906153c2565b905014610e69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6090614ef5565b60405180910390fd5b81600e9080519060200190610e7f9291906138c6565b505050565b600b60009054906101000a900460ff1681565b7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b929610ec981610ec46108db565b612680565b600960009054906101000a900460ff1615610f19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1090614f35565b60405180910390fd5b84518651148015610f2b575083518651145b8015610f38575082518651145b8015610f45575081518651145b610f84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7b90614fb5565b60405180910390fd5b86600a8190555060005b86518110156110e657858181518110610faa57610fa961555b565b5b602002602001015160086000898481518110610fc957610fc861555b565b5b6020026020010151815260200190815260200160002060000181905550848181518110610ff957610ff861555b565b5b6020026020010151600860008984815181106110185761101761555b565b5b60200260200101518152602001908152602001600020600101819055508381815181106110485761104761555b565b5b6020026020010151600860008984815181106110675761106661555b565b5b60200260200101518152602001908152602001600020600201819055508281815181106110975761109661555b565b5b6020026020010151600860008984815181106110b6576110b561555b565b5b602002602001015181526020019081526020016000206003018190555080806110de90615425565b915050610f8e565b5050505050505050565b60008060008084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611198576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118f90614d75565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611212576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120990614d55565b60405180910390fd5b600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6112616108db565b73ffffffffffffffffffffffffffffffffffffffff1661127f611340565b73ffffffffffffffffffffffffffffffffffffffff16146112d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112cc90614e15565b60405180910390fd5b6112df60006129ef565b565b7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b9296113138161130e6108db565b612680565b600960009054906101000a900460ff1615600960006101000a81548160ff02191690831515021790555050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60006004600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60606040518060400160405280600481526020017f5050544c00000000000000000000000000000000000000000000000000000000815250905090565b6000801b81565b61142b6114246108db565b8383612ab5565b5050565b600960009054906101000a900460ff1681565b61145361144d6108db565b83612349565b611492576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148990614f55565b60405180910390fd5b61149e84848484612c22565b50505050565b60606114af82612225565b6114ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e590614e75565b60405180910390fd5b6000600e80546114fd906153c2565b9050111561153757600e61151083612c7e565b60405160200161152192919061496c565b6040516020818303038152906040529050611562565b61154082612c7e565b6040516020016115509190614990565b60405160208183030381529060405290505b919050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6611599816115946108db565b612680565b600960009054906101000a900460ff16156115e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e090614f35565b60405180910390fd5b60005b82518110156116455761163283828151811061160b5761160a61555b565b5b6020026020010151826001600d54611623919061519e565b61162d919061519e565b612ddf565b808061163d90615425565b9150506115ec565b508151600d6000828254611659919061519e565b92505081905550600c54600d5411156116a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169e90614e95565b60405180910390fd5b5050565b6116b482610ba3565b6116c5816116c06108db565b612680565b6116cf83836127fe565b505050565b600c5481565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a661170c816117076108db565b612680565b600b60009054906101000a900460ff1615600b60006101000a81548160ff02191690831515021790555050565b6117416108db565b73ffffffffffffffffffffffffffffffffffffffff1661175f611340565b73ffffffffffffffffffffffffffffffffffffffff16146117b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ac90614e15565b60405180910390fd5b60648111156117f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f090614c15565b60405180910390fd5b81600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550806007819055505050565b600960009054906101000a900460ff16611894576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188b90614d95565b60405180910390fd5b6000600860008581526020019081526020016000206000015490506000600160086000878152602001908152602001600020600101546118d49190615225565b826118df919061519e565b90508142101580156118f057508042105b61192f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192690614fd5565b60405180910390fd5b60003061193a6108db565b8760405160200161194d93929190614a1c565b604051602081830303815290604052805190602001209050611992600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168286612fab565b6119d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c890614f95565b60405180910390fd5b600085600d546119e1919061519e565b9050600c54811115611a28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1f90614e95565b60405180910390fd5b600086600860008a81526020019081526020016000206004016000611a4b6108db565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611a90919061519e565b90506008600089815260200190815260200160002060020154811115611aeb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ae290614ed5565b60405180910390fd5b80600860008a81526020019081526020016000206004016000611b0c6108db565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555086600860008a815260200190815260200160002060030154611b6c9190615225565b3414611bad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ba490614eb5565b60405180910390fd5b6000601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1634604051611bf5906149b2565b60006040518083038185875af1925050503d8060008114611c32576040519150601f19603f3d011682016040523d82523d6000602084013e611c37565b606091505b5050905080611c7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7290614bb5565b60405180910390fd5b60005b88811015611cc357611cb0611c916108db565b600183600d54611ca1919061519e565b611cab919061519e565b612ddf565b8080611cbb90615425565b915050611c7e565b5082600d81905550505050505050505050565b7f5d8e12c39142ff96d79d04d15d1ba1269e4fe57bb9d26f43523628b34ba108ec611d0881611d036108db565b612680565b8151835114611d4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4390614cb5565b60405180910390fd5b600047905060008111611d94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d8b90614c55565b60405180910390fd5b6000805b8551811015611fd357600073ffffffffffffffffffffffffffffffffffffffff16868281518110611dcc57611dcb61555b565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff161415611e2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2290614df5565b60405180910390fd5b848181518110611e3e57611e3d61555b565b5b60200260200101516bffffffffffffffffffffffff1682611e5f919061519e565b915060006064868381518110611e7857611e7761555b565b5b60200260200101516bffffffffffffffffffffffff1685611e999190615225565b611ea391906151f4565b90506000878381518110611eba57611eb961555b565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1682604051611ee5906149b2565b60006040518083038185875af1925050503d8060008114611f22576040519150601f19603f3d011682016040523d82523d6000602084013e611f27565b606091505b5050905080611f6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f6290614bb5565b60405180910390fd5b7f773d0e2b7d29fd7a9da3b776769ae51f123465c10d42e90684205842e407ad5c888481518110611f9f57611f9e61555b565b5b602002602001015183604051611fb6929190614a9f565b60405180910390a150508080611fcb90615425565b915050611d98565b506064811115612018576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161200f90614d35565b60405180910390fd5b5050505050565b6000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6120bb6108db565b73ffffffffffffffffffffffffffffffffffffffff166120d9611340565b73ffffffffffffffffffffffffffffffffffffffff161461212f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161212690614e15565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561219f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161219690614bf5565b60405180910390fd5b6121a8816129ef565b50565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061221e575061221d82613190565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff1660008084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612303836110f0565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061235482612225565b612393576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161238a90614cd5565b60405180910390fd5b600061239e836110f0565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061240d57508373ffffffffffffffffffffffffffffffffffffffff166123f58461099a565b73ffffffffffffffffffffffffffffffffffffffff16145b8061241e575061241d818561201f565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612447826110f0565b73ffffffffffffffffffffffffffffffffffffffff161461249d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161249490614e55565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561250d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161250490614c75565b60405180910390fd5b612518838383613272565b612523600082612290565b60018060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612572919061527f565b9250508190555060018060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125c8919061519e565b925050819055508160008083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b61268a828261136a565b612719576126af8173ffffffffffffffffffffffffffffffffffffffff166014613277565b6126bd8360001c6020613277565b6040516020016126ce9291906149c7565b6040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127109190614b73565b60405180910390fd5b5050565b612727828261136a565b6127fa5760016004600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061279f6108db565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b612808828261136a565b156128dc5760006004600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506128816108db565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b60006128eb826110f0565b90506128f981600084613272565b612904600083612290565b60018060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612953919061527f565b9250508190555060008083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612b24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b1b90614c95565b60405180910390fd5b80600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612c159190614ac8565b60405180910390a3505050565b612c2d848484612427565b612c39848484846134b3565b612c78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c6f90614bd5565b60405180910390fd5b50505050565b60606000821415612cc6576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612dda565b600082905060005b60008214612cf8578080612ce190615425565b915050600a82612cf191906151f4565b9150612cce565b60008167ffffffffffffffff811115612d1457612d1361558a565b5b6040519080825280601f01601f191660200182016040528015612d465781602001600182028036833780820191505090505b5090505b60008514612dd357600182612d5f919061527f565b9150600a85612d6e919061546e565b6030612d7a919061519e565b60f81b818381518110612d9057612d8f61555b565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612dcc91906151f4565b9450612d4a565b8093505050505b919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612e4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e4690614db5565b60405180910390fd5b612e5881612225565b15612e98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e8f90614c35565b60405180910390fd5b612ea460008383613272565b60018060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612ef3919061519e565b925050819055508160008083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000806000612fba858561364a565b9150915060006004811115612fd257612fd16154fd565b5b816004811115612fe557612fe46154fd565b5b14801561301d57508573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b1561302d57600192505050613189565b6000808773ffffffffffffffffffffffffffffffffffffffff16631626ba7e60e01b8888604051602401613062929190614afe565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516130cc9190614955565b600060405180830381855afa9150503d8060008114613107576040519150601f19603f3d011682016040523d82523d6000602084013e61310c565b606091505b509150915081801561311f575060208151145b80156131825750631626ba7e60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168180602001905181019061316191906140ed565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9450505050505b9392505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061325b57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061326b575061326a826136cd565b5b9050919050565b505050565b60606000600283600261328a9190615225565b613294919061519e565b67ffffffffffffffff8111156132ad576132ac61558a565b5b6040519080825280601f01601f1916602001820160405280156132df5781602001600182028036833780820191505090505b5090507f3000000000000000000000000000000000000000000000000000000000000000816000815181106133175761331661555b565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f78000000000000000000000000000000000000000000000000000000000000008160018151811061337b5761337a61555b565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600060018460026133bb9190615225565b6133c5919061519e565b90505b6001811115613465577f3031323334353637383961626364656600000000000000000000000000000000600f8616601081106134075761340661555b565b5b1a60f81b82828151811061341e5761341d61555b565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c94508061345e90615398565b90506133c8565b50600084146134a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134a090614b95565b60405180910390fd5b8091505092915050565b60006134d48473ffffffffffffffffffffffffffffffffffffffff16613737565b1561363d578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026134fd6108db565b8786866040518563ffffffff1660e01b815260040161351f9493929190614a53565b602060405180830381600087803b15801561353957600080fd5b505af192505050801561356a57506040513d601f19601f8201168201806040525081019061356791906140ed565b60015b6135ed573d806000811461359a576040519150601f19603f3d011682016040523d82523d6000602084013e61359f565b606091505b506000815114156135e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135dc90614bd5565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613642565b600190505b949350505050565b60008060418351141561368c5760008060006020860151925060408601519150606086015160001a90506136808782858561375a565b945094505050506136c6565b6040835114156136bd5760008060208501519150604085015190506136b2868383613867565b9350935050506136c6565b60006002915091505b9250929050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c111561379557600060039150915061385e565b601b8560ff16141580156137ad5750601c8560ff1614155b156137bf57600060049150915061385e565b6000600187878787604051600081526020016040526040516137e49493929190614b2e565b6020604051602081039080840390855afa158015613806573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156138555760006001925092505061385e565b80600092509250505b94509492505050565b60008060007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60001b841690506000601b60ff8660001c901c6138aa919061519e565b90506138b88782888561375a565b935093505050935093915050565b8280546138d2906153c2565b90600052602060002090601f0160209004810192826138f4576000855561393b565b82601f1061390d57805160ff191683800117855561393b565b8280016001018555821561393b579182015b8281111561393a57825182559160200191906001019061391f565b5b509050613948919061394c565b5090565b5b8082111561396557600081600090555060010161394d565b5090565b600061397c61397784615055565b615030565b9050808382526020820190508285602086028201111561399f5761399e6155be565b5b60005b858110156139cf57816139b58882613b3d565b8452602084019350602083019250506001810190506139a2565b5050509392505050565b60006139ec6139e784615081565b615030565b90508083825260208201905082856020860282011115613a0f57613a0e6155be565b5b60005b85811015613a3f5781613a258882613c8c565b845260208401935060208301925050600181019050613a12565b5050509392505050565b6000613a5c613a57846150ad565b615030565b90508083825260208201905082856020860282011115613a7f57613a7e6155be565b5b60005b85811015613aaf5781613a958882613ca1565b845260208401935060208301925050600181019050613a82565b5050509392505050565b6000613acc613ac7846150d9565b615030565b905082815260208101848484011115613ae857613ae76155c3565b5b613af3848285615356565b509392505050565b6000613b0e613b098461510a565b615030565b905082815260208101848484011115613b2a57613b296155c3565b5b613b35848285615356565b509392505050565b600081359050613b4c81615eab565b92915050565b600082601f830112613b6757613b666155b9565b5b8135613b77848260208601613969565b91505092915050565b600082601f830112613b9557613b946155b9565b5b8135613ba58482602086016139d9565b91505092915050565b600082601f830112613bc357613bc26155b9565b5b8135613bd3848260208601613a49565b91505092915050565b600081359050613beb81615ec2565b92915050565b600081359050613c0081615ed9565b92915050565b600081359050613c1581615ef0565b92915050565b600081519050613c2a81615ef0565b92915050565b600082601f830112613c4557613c446155b9565b5b8135613c55848260208601613ab9565b91505092915050565b600082601f830112613c7357613c726155b9565b5b8135613c83848260208601613afb565b91505092915050565b600081359050613c9b81615f07565b92915050565b600081359050613cb081615f1e565b92915050565b600060208284031215613ccc57613ccb6155cd565b5b6000613cda84828501613b3d565b91505092915050565b60008060408385031215613cfa57613cf96155cd565b5b6000613d0885828601613b3d565b9250506020613d1985828601613b3d565b9150509250929050565b600080600060608486031215613d3c57613d3b6155cd565b5b6000613d4a86828701613b3d565b9350506020613d5b86828701613b3d565b9250506040613d6c86828701613c8c565b9150509250925092565b60008060008060808587031215613d9057613d8f6155cd565b5b6000613d9e87828801613b3d565b9450506020613daf87828801613b3d565b9350506040613dc087828801613c8c565b925050606085013567ffffffffffffffff811115613de157613de06155c8565b5b613ded87828801613c30565b91505092959194509250565b60008060408385031215613e1057613e0f6155cd565b5b6000613e1e85828601613b3d565b9250506020613e2f85828601613bdc565b9150509250929050565b60008060408385031215613e5057613e4f6155cd565b5b6000613e5e85828601613b3d565b9250506020613e6f85828601613c8c565b9150509250929050565b600060208284031215613e8f57613e8e6155cd565b5b600082013567ffffffffffffffff811115613ead57613eac6155c8565b5b613eb984828501613b52565b91505092915050565b60008060408385031215613ed957613ed86155cd565b5b600083013567ffffffffffffffff811115613ef757613ef66155c8565b5b613f0385828601613b52565b925050602083013567ffffffffffffffff811115613f2457613f236155c8565b5b613f3085828601613bae565b9150509250929050565b600060208284031215613f5057613f4f6155cd565b5b6000613f5e84828501613bf1565b91505092915050565b60008060408385031215613f7e57613f7d6155cd565b5b6000613f8c85828601613bf1565b9250506020613f9d85828601613b3d565b9150509250929050565b60008060008060008060c08789031215613fc457613fc36155cd565b5b6000613fd289828a01613bf1565b965050602087013567ffffffffffffffff811115613ff357613ff26155c8565b5b613fff89828a01613b80565b955050604087013567ffffffffffffffff8111156140205761401f6155c8565b5b61402c89828a01613b80565b945050606087013567ffffffffffffffff81111561404d5761404c6155c8565b5b61405989828a01613b80565b935050608087013567ffffffffffffffff81111561407a576140796155c8565b5b61408689828a01613b80565b92505060a087013567ffffffffffffffff8111156140a7576140a66155c8565b5b6140b389828a01613b80565b9150509295509295509295565b6000602082840312156140d6576140d56155cd565b5b60006140e484828501613c06565b91505092915050565b600060208284031215614103576141026155cd565b5b600061411184828501613c1b565b91505092915050565b6000602082840312156141305761412f6155cd565b5b600082013567ffffffffffffffff81111561414e5761414d6155c8565b5b61415a84828501613c5e565b91505092915050565b600060208284031215614179576141786155cd565b5b600061418784828501613c8c565b91505092915050565b600080604083850312156141a7576141a66155cd565b5b60006141b585828601613c8c565b92505060206141c685828601613c8c565b9150509250929050565b6000806000606084860312156141e9576141e86155cd565b5b60006141f786828701613c8c565b935050602061420886828701613c8c565b925050604084013567ffffffffffffffff811115614229576142286155c8565b5b61423586828701613c30565b9150509250925092565b614248816152b3565b82525050565b614257816152c5565b82525050565b614266816152d1565b82525050565b600061427782615150565b6142818185615166565b9350614291818560208601615365565b61429a816155d2565b840191505092915050565b60006142b082615150565b6142ba8185615177565b93506142ca818560208601615365565b80840191505092915050565b60006142e18261515b565b6142eb8185615182565b93506142fb818560208601615365565b614304816155d2565b840191505092915050565b600061431a8261515b565b6143248185615193565b9350614334818560208601615365565b80840191505092915050565b6000815461434d816153c2565b6143578186615193565b945060018216600081146143725760018114614383576143b6565b60ff198316865281860193506143b6565b61438c8561513b565b60005b838110156143ae5781548189015260018201915060208101905061438f565b838801955050505b50505092915050565b60006143cc602083615182565b91506143d7826155e3565b602082019050919050565b60006143ef601a83615182565b91506143fa8261560c565b602082019050919050565b6000614412603283615182565b915061441d82615635565b604082019050919050565b6000614435602683615182565b915061444082615684565b604082019050919050565b6000614458601e83615182565b9150614463826156d3565b602082019050919050565b600061447b601c83615182565b9150614486826156fc565b602082019050919050565b600061449e602883615182565b91506144a982615725565b604082019050919050565b60006144c1602483615182565b91506144cc82615774565b604082019050919050565b60006144e4601983615182565b91506144ef826157c3565b602082019050919050565b6000614507601b83615182565b9150614512826157ec565b602082019050919050565b600061452a602c83615182565b915061453582615815565b604082019050919050565b600061454d601883615182565b915061455882615864565b602082019050919050565b6000614570603883615182565b915061457b8261588d565b604082019050919050565b6000614593601483615182565b915061459e826158dc565b602082019050919050565b60006145b6602a83615182565b91506145c182615905565b604082019050919050565b60006145d9602983615182565b91506145e482615954565b604082019050919050565b60006145fc601983615182565b9150614607826159a3565b602082019050919050565b600061461f602083615182565b915061462a826159cc565b602082019050919050565b6000614642602c83615182565b915061464d826159f5565b604082019050919050565b6000614665601e83615182565b915061467082615a44565b602082019050919050565b6000614688602083615182565b915061469382615a6d565b602082019050919050565b60006146ab602483615182565b91506146b682615a96565b604082019050919050565b60006146ce602983615182565b91506146d982615ae5565b604082019050919050565b60006146f1602f83615182565b91506146fc82615b34565b604082019050919050565b6000614714601783615182565b915061471f82615b83565b602082019050919050565b6000614737601783615182565b915061474282615bac565b602082019050919050565b600061475a601b83615182565b915061476582615bd5565b602082019050919050565b600061477d601983615182565b915061478882615bfe565b602082019050919050565b60006147a0602183615182565b91506147ab82615c27565b604082019050919050565b60006147c3602583615193565b91506147ce82615c76565b602582019050919050565b60006147e6601a83615182565b91506147f182615cc5565b602082019050919050565b6000614809600083615177565b915061481482615cee565b600082019050919050565b600061482c603183615182565b915061483782615cf1565b604082019050919050565b600061484f602f83615182565b915061485a82615d40565b604082019050919050565b6000614872601783615182565b915061487d82615d8f565b602082019050919050565b6000614895601783615193565b91506148a082615db8565b601782019050919050565b60006148b8601b83615182565b91506148c382615de1565b602082019050919050565b60006148db601183615193565b91506148e682615e0a565b601182019050919050565b60006148fe601283615182565b915061490982615e33565b602082019050919050565b6000614921602f83615182565b915061492c82615e5c565b604082019050919050565b61494081615327565b82525050565b61494f81615331565b82525050565b600061496182846142a5565b915081905092915050565b60006149788285614340565b9150614984828461430f565b91508190509392505050565b600061499b826147b6565b91506149a7828461430f565b915081905092915050565b60006149bd826147fc565b9150819050919050565b60006149d282614888565b91506149de828561430f565b91506149e9826148ce565b91506149f5828461430f565b91508190509392505050565b6000602082019050614a16600083018461423f565b92915050565b6000606082019050614a31600083018661423f565b614a3e602083018561423f565b614a4b6040830184614937565b949350505050565b6000608082019050614a68600083018761423f565b614a75602083018661423f565b614a826040830185614937565b8181036060830152614a94818461426c565b905095945050505050565b6000604082019050614ab4600083018561423f565b614ac16020830184614937565b9392505050565b6000602082019050614add600083018461424e565b92915050565b6000602082019050614af8600083018461425d565b92915050565b6000604082019050614b13600083018561425d565b8181036020830152614b25818461426c565b90509392505050565b6000608082019050614b43600083018761425d565b614b506020830186614946565b614b5d604083018561425d565b614b6a606083018461425d565b95945050505050565b60006020820190508181036000830152614b8d81846142d6565b905092915050565b60006020820190508181036000830152614bae816143bf565b9050919050565b60006020820190508181036000830152614bce816143e2565b9050919050565b60006020820190508181036000830152614bee81614405565b9050919050565b60006020820190508181036000830152614c0e81614428565b9050919050565b60006020820190508181036000830152614c2e8161444b565b9050919050565b60006020820190508181036000830152614c4e8161446e565b9050919050565b60006020820190508181036000830152614c6e81614491565b9050919050565b60006020820190508181036000830152614c8e816144b4565b9050919050565b60006020820190508181036000830152614cae816144d7565b9050919050565b60006020820190508181036000830152614cce816144fa565b9050919050565b60006020820190508181036000830152614cee8161451d565b9050919050565b60006020820190508181036000830152614d0e81614540565b9050919050565b60006020820190508181036000830152614d2e81614563565b9050919050565b60006020820190508181036000830152614d4e81614586565b9050919050565b60006020820190508181036000830152614d6e816145a9565b9050919050565b60006020820190508181036000830152614d8e816145cc565b9050919050565b60006020820190508181036000830152614dae816145ef565b9050919050565b60006020820190508181036000830152614dce81614612565b9050919050565b60006020820190508181036000830152614dee81614635565b9050919050565b60006020820190508181036000830152614e0e81614658565b9050919050565b60006020820190508181036000830152614e2e8161467b565b9050919050565b60006020820190508181036000830152614e4e8161469e565b9050919050565b60006020820190508181036000830152614e6e816146c1565b9050919050565b60006020820190508181036000830152614e8e816146e4565b9050919050565b60006020820190508181036000830152614eae81614707565b9050919050565b60006020820190508181036000830152614ece8161472a565b9050919050565b60006020820190508181036000830152614eee8161474d565b9050919050565b60006020820190508181036000830152614f0e81614770565b9050919050565b60006020820190508181036000830152614f2e81614793565b9050919050565b60006020820190508181036000830152614f4e816147d9565b9050919050565b60006020820190508181036000830152614f6e8161481f565b9050919050565b60006020820190508181036000830152614f8e81614842565b9050919050565b60006020820190508181036000830152614fae81614865565b9050919050565b60006020820190508181036000830152614fce816148ab565b9050919050565b60006020820190508181036000830152614fee816148f1565b9050919050565b6000602082019050818103600083015261500e81614914565b9050919050565b600060208201905061502a6000830184614937565b92915050565b600061503a61504b565b905061504682826153f4565b919050565b6000604051905090565b600067ffffffffffffffff8211156150705761506f61558a565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561509c5761509b61558a565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156150c8576150c761558a565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156150f4576150f361558a565b5b6150fd826155d2565b9050602081019050919050565b600067ffffffffffffffff8211156151255761512461558a565b5b61512e826155d2565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006151a982615327565b91506151b483615327565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156151e9576151e861549f565b5b828201905092915050565b60006151ff82615327565b915061520a83615327565b92508261521a576152196154ce565b5b828204905092915050565b600061523082615327565b915061523b83615327565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156152745761527361549f565b5b828202905092915050565b600061528a82615327565b915061529583615327565b9250828210156152a8576152a761549f565b5b828203905092915050565b60006152be82615307565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60006bffffffffffffffffffffffff82169050919050565b82818337600083830152505050565b60005b83811015615383578082015181840152602081019050615368565b83811115615392576000848401525b50505050565b60006153a382615327565b915060008214156153b7576153b661549f565b5b600182039050919050565b600060028204905060018216806153da57607f821691505b602082108114156153ee576153ed61552c565b5b50919050565b6153fd826155d2565b810181811067ffffffffffffffff8211171561541c5761541b61558a565b5b80604052505050565b600061543082615327565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156154635761546261549f565b5b600182019050919050565b600061547982615327565b915061548483615327565b925082615494576154936154ce565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b7f5050544c3a204661696c656420746f2073656e64204574686572000000000000600082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f5050544c3a20526f79616c747950657263656e74616765206578636565640000600082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f5050544c3a20496e76616c696420636f6e74726163742062616c616e6365207460008201527f6f207061796f7574000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f5050544c3a204172726179206c656e677468206d69736d617463680000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f5050544c3a204275726e696e67206e6f74206163746976650000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f5050544c3a20496e76616c6964207061796f7574000000000000000000000000600082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f5050544c3a204c75636b79206472617720696e61637469766500000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f5050544c3a20496e76616c6964207061796f757420726563697069656e740000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a2043616c6c6572206e6f74206f776e6572206f72206170707260008201527f6f76656400000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f5050544c3a20457863656564206d617820737570706c79000000000000000000600082015250565b7f5050544c3a20496e636f7272656374207061796d656e74000000000000000000600082015250565b7f5050544c3a20457863656564206d6178207469636b6574206e756d0000000000600082015250565b7f5050544c3a204261736555524920616c72656164792073657400000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f68747470733a2f2f726166666c652e7468656677656e636c75622e636f6d2f7460008201527f6f6b656e2f000000000000000000000000000000000000000000000000000000602082015250565b7f5050544c3a204c75636b7920647261772068617320626567756e000000000000600082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f5050544c3a20517565727920726f79616c747920696e666f20666f72206e6f6e60008201527f2d6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f5050544c3a20496e76616c6964207369676e6174757265000000000000000000600082015250565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b7f5050544c3a206172726179206c656e677468206d69736d617463680000000000600082015250565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b7f5050544c3a20496e76616c69642074696d650000000000000000000000000000600082015250565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b615eb4816152b3565b8114615ebf57600080fd5b50565b615ecb816152c5565b8114615ed657600080fd5b50565b615ee2816152d1565b8114615eed57600080fd5b50565b615ef9816152db565b8114615f0457600080fd5b50565b615f1081615327565b8114615f1b57600080fd5b50565b615f278161533e565b8114615f3257600080fd5b5056fea2646970667358221220535e90bf952804a6c096e8453bd3fd7c9739a2f639478fd61f33854fe17b7d5764736f6c63430008070033

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

000000000000000000000000df92e031b00fbff462eceac436e2d906047ff70d0000000000000000000000005112d14803dbaf87c0261bb3ef39d374e3f739fc0000000000000000000000009316810cd683f84c44b09eb60414fdb0e26486eb00000000000000000000000000000000000000000000000000000000000003e8

-----Decoded View---------------
Arg [0] : default_admin (address): 0xDf92e031B00fbFF462eceAC436E2d906047ff70D
Arg [1] : authority (address): 0x5112d14803dBAf87C0261BB3EF39D374e3f739Fc
Arg [2] : payee (address): 0x9316810cD683f84C44B09eb60414Fdb0e26486eB
Arg [3] : maxSupply_ (uint256): 1000

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 000000000000000000000000df92e031b00fbff462eceac436e2d906047ff70d
Arg [1] : 0000000000000000000000005112d14803dbaf87c0261bb3ef39d374e3f739fc
Arg [2] : 0000000000000000000000009316810cd683f84c44b09eb60414fdb0e26486eb
Arg [3] : 00000000000000000000000000000000000000000000000000000000000003e8


Deployed Bytecode Sourcemap

62952:9847:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65108:40;65124:12;:10;:12::i;:::-;65138:9;65108:40;;;;;;;:::i;:::-;;;;;;;;62952:9847;;;;;48569:230;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65230:121;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28997:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28520:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63703:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63871:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29747:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43987:131;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49416:296;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;44380:147;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45428:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30157:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67059:257;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65846:187;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63771:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68836:1147;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27613:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27343:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15834:103;;;;;;;;;;;;;:::i;:::-;;67476:119;;;;;;;;;;;;;:::i;:::-;;15183:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42856:147;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65426:103;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41947:49;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29290:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63635:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30413:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66212:395;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67850:369;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44772:149;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63840:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66762:115;;;;;;;;;;;;;:::i;:::-;;49080:269;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70278:1376;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71937:859;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29516:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16092:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;13907:98;13960:7;13987:10;13980:17;;13907:98;:::o;48569:230::-;48686:4;48725:26;48710:41;;;:11;:41;;;;:81;;;;48755:36;48779:11;48755:23;:36::i;:::-;48710:81;48703:88;;48569:230;;;:::o;65230:121::-;65284:13;65310:33;;;;;;;;;;;;;;;;;;;65230:121;:::o;28997:221::-;29073:7;29101:16;29109:7;29101;:16::i;:::-;29093:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;29186:15;:24;29202:7;29186:24;;;;;;;;;;;;;;;;;;;;;29179:31;;28997:221;;;:::o;28520:411::-;28601:13;28617:23;28632:7;28617:14;:23::i;:::-;28601:39;;28665:5;28659:11;;:2;:11;;;;28651:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;28759:5;28743:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;28768:37;28785:5;28792:12;:10;:12::i;:::-;28768:16;:37::i;:::-;28743:62;28721:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;28902:21;28911:2;28915:7;28902:8;:21::i;:::-;28590:341;28520:411;;:::o;63703:25::-;;;;:::o;63871:26::-;;;;:::o;29747:339::-;29942:41;29961:12;:10;:12::i;:::-;29975:7;29942:18;:41::i;:::-;29934:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;30050:28;30060:4;30066:2;30070:7;30050:9;:28::i;:::-;29747:339;;;:::o;43987:131::-;44061:7;44088:6;:12;44095:4;44088:12;;;;;;;;;;;:22;;;44081:29;;43987:131;;;:::o;49416:296::-;49505:16;49523:21;49564:16;49572:7;49564;:16::i;:::-;49556:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;49651:15;;;;;;;;;;;49700:3;49681:15;;49669:9;:27;;;;:::i;:::-;49668:35;;;;:::i;:::-;49643:61;;;;49416:296;;;;;:::o;44380:147::-;44463:18;44476:4;44463:12;:18::i;:::-;42438:30;42449:4;42455:12;:10;:12::i;:::-;42438:10;:30::i;:::-;44494:25:::1;44505:4;44511:7;44494:10;:25::i;:::-;44380:147:::0;;;:::o;45428:218::-;45535:12;:10;:12::i;:::-;45524:23;;:7;:23;;;45516:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;45612:26;45624:4;45630:7;45612:11;:26::i;:::-;45428:218;;:::o;30157:185::-;30295:39;30312:4;30318:2;30322:7;30295:39;;;;;;;;;;;;:16;:39::i;:::-;30157:185;;;:::o;67059:257::-;67118:15;;;;;;;;;;;:35;;;;;67138:15;;;;;;;;;;;67137:16;67118:35;67110:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;67201:41;67220:12;:10;:12::i;:::-;67234:7;67201:18;:41::i;:::-;67193:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;67294:14;67300:7;67294:5;:14::i;:::-;67059:257;:::o;65846:187::-;63153:24;42438:30;42449:4;42455:12;:10;:12::i;:::-;42438:10;:30::i;:::-;65965:1:::1;65945:8;65939:22;;;;;:::i;:::-;;;:27;65931:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;66018:7;66007:8;:18;;;;;;;;;;;;:::i;:::-;;65846:187:::0;;:::o;63771:27::-;;;;;;;;;;;;;:::o;68836:1147::-;63226:26;42438:30;42449:4;42455:12;:10;:12::i;:::-;42438:10;:30::i;:::-;69178:15:::1;;;;;;;;;;;69177:16;69169:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;69281:18;:25;69259:11;:18;:47;:110;;;;;69345:17;:24;69323:11;:18;:46;69259:110;:177;;;;;69408:21;:28;69386:11;:18;:50;69259:177;:243;;;;;69475:20;:27;69453:11;:18;:49;69259:243;69237:320;;;;;;;;;;;;:::i;:::-;;;;;;;;;69583:11;69570:10;:24;;;;69612:9;69607:369;69631:11;:18;69627:1;:22;69607:369;;;69710:18;69729:1;69710:21;;;;;;;;:::i;:::-;;;;;;;;69671:10;:26;69682:11;69694:1;69682:14;;;;;;;;:::i;:::-;;;;;;;;69671:26;;;;;;;;;;;:36;;:60;;;;69784:17;69802:1;69784:20;;;;;;;;:::i;:::-;;;;;;;;69746:10;:26;69757:11;69769:1;69757:14;;;;;;;;:::i;:::-;;;;;;;;69746:26;;;;;;;;;;;:35;;:58;;;;69861:21;69883:1;69861:24;;;;;;;;:::i;:::-;;;;;;;;69819:10;:26;69830:11;69842:1;69830:14;;;;;;;;:::i;:::-;;;;;;;;69819:26;;;;;;;;;;;:39;;:66;;;;69941:20;69962:1;69941:23;;;;;;;;:::i;:::-;;;;;;;;69900:10;:26;69911:11;69923:1;69911:14;;;;;;;;:::i;:::-;;;;;;;;69900:26;;;;;;;;;;;:38;;:64;;;;69651:3;;;;;:::i;:::-;;;;69607:369;;;;68836:1147:::0;;;;;;;:::o;27613:239::-;27685:7;27705:13;27721:7;:16;27729:7;27721:16;;;;;;;;;;;;;;;;;;;;;27705:32;;27773:1;27756:19;;:5;:19;;;;27748:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27839:5;27832:12;;;27613:239;;;:::o;27343:208::-;27415:7;27460:1;27443:19;;:5;:19;;;;27435:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;27527:9;:16;27537:5;27527:16;;;;;;;;;;;;;;;;27520:23;;27343:208;;;:::o;15834:103::-;15414:12;:10;:12::i;:::-;15403:23;;:7;:5;:7::i;:::-;:23;;;15395:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;15899:30:::1;15926:1;15899:18;:30::i;:::-;15834:103::o:0;67476:119::-;63226:26;42438:30;42449:4;42455:12;:10;:12::i;:::-;42438:10;:30::i;:::-;67572:15:::1;;;;;;;;;;;67571:16;67553:15;;:34;;;;;;;;;;;;;;;;;;67476:119:::0;:::o;15183:87::-;15229:7;15256:6;;;;;;;;;;;15249:13;;15183:87;:::o;42856:147::-;42942:4;42966:6;:12;42973:4;42966:12;;;;;;;;;;;:20;;:29;42987:7;42966:29;;;;;;;;;;;;;;;;;;;;;;;;;42959:36;;42856:147;;;;:::o;65426:103::-;65482:13;65508;;;;;;;;;;;;;;;;;;;65426:103;:::o;41947:49::-;41992:4;41947:49;;;:::o;29290:155::-;29385:52;29404:12;:10;:12::i;:::-;29418:8;29428;29385:18;:52::i;:::-;29290:155;;:::o;63635:27::-;;;;;;;;;;;;;:::o;30413:328::-;30588:41;30607:12;:10;:12::i;:::-;30621:7;30588:18;:41::i;:::-;30580:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;30694:39;30708:4;30714:2;30718:7;30727:5;30694:13;:39::i;:::-;30413:328;;;;:::o;66212:395::-;66277:13;66311:16;66319:7;66311;:16::i;:::-;66303:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;66419:1;66400:8;66394:22;;;;;:::i;:::-;;;:26;66390:106;;;66466:8;66476:18;:7;:16;:18::i;:::-;66449:46;;;;;;;;;:::i;:::-;;;;;;;;;;;;;66435:61;;;;66390:106;66579:18;:7;:16;:18::i;:::-;66521:77;;;;;;;;:::i;:::-;;;;;;;;;;;;;66507:92;;66212:395;;;;:::o;67850:369::-;63153:24;42438:30;42449:4;42455:12;:10;:12::i;:::-;42438:10;:30::i;:::-;67944:15:::1;;;;;;;;;;;67943:16;67935:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;68008:9;68003:102;68027:3;:10;68023:1;:14;68003:102;;;68059:34;68065:3;68069:1;68065:6;;;;;;;;:::i;:::-;;;;;;;;68091:1;68087;68073:11;;:15;;;;:::i;:::-;:19;;;;:::i;:::-;68059:5;:34::i;:::-;68039:3;;;;;:::i;:::-;;;;68003:102;;;;68130:3;:10;68115:11;;:25;;;;;;;:::i;:::-;;;;;;;;68174:9;;68159:11;;:24;;68151:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;67850:369:::0;;:::o;44772:149::-;44856:18;44869:4;44856:12;:18::i;:::-;42438:30;42449:4;42455:12;:10;:12::i;:::-;42438:10;:30::i;:::-;44887:26:::1;44899:4;44905:7;44887:11;:26::i;:::-;44772:149:::0;;;:::o;63840:24::-;;;;:::o;66762:115::-;63153:24;42438:30;42449:4;42455:12;:10;:12::i;:::-;42438:10;:30::i;:::-;66854:15:::1;;;;;;;;;;;66853:16;66835:15;;:34;;;;;;;;;;;;;;;;;;66762:115:::0;:::o;49080:269::-;15414:12;:10;:12::i;:::-;15403:23;;:7;:5;:7::i;:::-;:23;;;15395:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49213:3:::1;49192:17;:24;;49184:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;49280:15;49262;;:33;;;;;;;;;;;;;;;;;;49324:17;49306:15;:35;;;;49080:269:::0;;:::o;70278:1376::-;70391:15;;;;;;;;;;;70383:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;70449:17;70469:10;:22;70480:10;70469:22;;;;;;;;;;;:32;;;70449:52;;70512:15;70576:9;70542:10;:22;70553:10;70542:22;;;;;;;;;;;:31;;;:43;;;;:::i;:::-;70530:9;:55;;;;:::i;:::-;70512:73;;70623:9;70604:15;:28;;:57;;;;;70654:7;70636:15;:25;70604:57;70596:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;70697:12;70741:4;70748:12;:10;:12::i;:::-;70762:10;70722:51;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;70712:62;;;;;;70697:77;;70793:65;70830:10;;;;;;;;;;;70842:4;70848:9;70793:36;:65::i;:::-;70785:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;70899:17;70933:9;70919:11;;:23;;;;:::i;:::-;70899:43;;70974:9;;70961;:22;;70953:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;71024:20;71092:9;71047:10;:22;71058:10;71047:22;;;;;;;;;;;:28;;:42;71076:12;:10;:12::i;:::-;71047:42;;;;;;;;;;;;;;;;:54;;;;:::i;:::-;71024:77;;71136:10;:22;71147:10;71136:22;;;;;;;;;;;:35;;;71120:12;:51;;71112:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;71259:12;71214:10;:22;71225:10;71214:22;;;;;;;;;;;:28;;:42;71243:12;:10;:12::i;:::-;71214:42;;;;;;;;;;;;;;;:57;;;;71342:9;71305:10;:22;71316:10;71305:22;;;;;;;;;;;:34;;;:46;;;;:::i;:::-;71292:9;:59;71284:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;71391:9;71406:6;;;;;;;;;;;:11;;71425:9;71406:33;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71390:49;;;71458:4;71450:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;71511:9;71506:107;71530:9;71526:1;:13;71506:107;;;71561:40;71567:12;:10;:12::i;:::-;71599:1;71595;71581:11;;:15;;;;:::i;:::-;:19;;;;:::i;:::-;71561:5;:40::i;:::-;71541:3;;;;;:::i;:::-;;;;71506:107;;;;71637:9;71623:11;:23;;;;70372:1282;;;;;;70278:1376;;;:::o;71937:859::-;63301:26;42438:30;42449:4;42455:12;:10;:12::i;:::-;42438:10;:30::i;:::-;72082:9:::1;:16;72061:10;:17;:37;72053:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;72141:15;72159:21;72141:39;;72209:1;72199:7;:11;72191:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;72268:15;72303:9:::0;72298:433:::1;72322:10;:17;72318:1;:21;72298:433;;;72394:1;72369:27;;:10;72380:1;72369:13;;;;;;;;:::i;:::-;;;;;;;;:27;;;;72361:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;72457:9;72467:1;72457:12;;;;;;;;:::i;:::-;;;;;;;;72446:23;;;;;;;:::i;:::-;;;72486:14;72528:3;72513:9;72523:1;72513:12;;;;;;;;:::i;:::-;;;;;;;;72503:22;;:7;:22;;;;:::i;:::-;:28;;;;:::i;:::-;72486:45;;72547:12;72565:10;72576:1;72565:13;;;;;;;;:::i;:::-;;;;;;;;:18;;72591:6;72565:37;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72546:56;;;72625:7;72617:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;72683:36;72697:10;72708:1;72697:13;;;;;;;;:::i;:::-;;;;;;;;72712:6;72683:36;;;;;;;:::i;:::-;;;;;;;;72346:385;;72341:3;;;;;:::i;:::-;;;;72298:433;;;;72760:3;72749:7;:14;;72741:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;72042:754;;71937:859:::0;;;:::o;29516:164::-;29613:4;29637:18;:25;29656:5;29637:25;;;;;;;;;;;;;;;:35;29663:8;29637:35;;;;;;;;;;;;;;;;;;;;;;;;;29630:42;;29516:164;;;;:::o;16092:201::-;15414:12;:10;:12::i;:::-;15403:23;;:7;:5;:7::i;:::-;:23;;;15395:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;16201:1:::1;16181:22;;:8;:22;;;;16173:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;16257:28;16276:8;16257:18;:28::i;:::-;16092:201:::0;:::o;42560:204::-;42645:4;42684:32;42669:47;;;:11;:47;;;;:87;;;;42720:36;42744:11;42720:23;:36::i;:::-;42669:87;42662:94;;42560:204;;;:::o;32251:127::-;32316:4;32368:1;32340:30;;:7;:16;32348:7;32340:16;;;;;;;;;;;;;;;;;;;;;:30;;;;32333:37;;32251:127;;;:::o;35145:174::-;35247:2;35220:15;:24;35236:7;35220:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;35303:7;35299:2;35265:46;;35274:23;35289:7;35274:14;:23::i;:::-;35265:46;;;;;;;;;;;;35145:174;;:::o;32545:348::-;32638:4;32663:16;32671:7;32663;:16::i;:::-;32655:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;32739:13;32755:23;32770:7;32755:14;:23::i;:::-;32739:39;;32808:5;32797:16;;:7;:16;;;:51;;;;32841:7;32817:31;;:20;32829:7;32817:11;:20::i;:::-;:31;;;32797:51;:87;;;;32852:32;32869:5;32876:7;32852:16;:32::i;:::-;32797:87;32789:96;;;32545:348;;;;:::o;34449:578::-;34608:4;34581:31;;:23;34596:7;34581:14;:23::i;:::-;:31;;;34573:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;34691:1;34677:16;;:2;:16;;;;34669:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;34747:39;34768:4;34774:2;34778:7;34747:20;:39::i;:::-;34851:29;34868:1;34872:7;34851:8;:29::i;:::-;34912:1;34893:9;:15;34903:4;34893:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;34941:1;34924:9;:13;34934:2;34924:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;34972:2;34953:7;:16;34961:7;34953:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;35011:7;35007:2;34992:27;;35001:4;34992:27;;;;;;;;;;;;34449:578;;;:::o;43293:505::-;43382:22;43390:4;43396:7;43382;:22::i;:::-;43377:414;;43570:41;43598:7;43570:41;;43608:2;43570:19;:41::i;:::-;43684:38;43712:4;43704:13;;43719:2;43684:19;:38::i;:::-;43475:270;;;;;;;;;:::i;:::-;;;;;;;;;;;;;43421:358;;;;;;;;;;;:::i;:::-;;;;;;;;43377:414;43293:505;;:::o;46929:238::-;47013:22;47021:4;47027:7;47013;:22::i;:::-;47008:152;;47084:4;47052:6;:12;47059:4;47052:12;;;;;;;;;;;:20;;:29;47073:7;47052:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;47135:12;:10;:12::i;:::-;47108:40;;47126:7;47108:40;;47120:4;47108:40;;;;;;;;;;47008:152;46929:238;;:::o;47299:239::-;47383:22;47391:4;47397:7;47383;:22::i;:::-;47379:152;;;47454:5;47422:6;:12;47429:4;47422:12;;;;;;;;;;;:20;;:29;47443:7;47422:29;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;47506:12;:10;:12::i;:::-;47479:40;;47497:7;47479:40;;47491:4;47479:40;;;;;;;;;;47379:152;47299:239;;:::o;33752:360::-;33812:13;33828:23;33843:7;33828:14;:23::i;:::-;33812:39;;33864:48;33885:5;33900:1;33904:7;33864:20;:48::i;:::-;33953:29;33970:1;33974:7;33953:8;:29::i;:::-;34015:1;33995:9;:16;34005:5;33995:16;;;;;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;34034:7;:16;34042:7;34034:16;;;;;;;;;;;;34027:23;;;;;;;;;;;34096:7;34092:1;34068:36;;34077:5;34068:36;;;;;;;;;;;;33801:311;33752:360;:::o;16453:191::-;16527:16;16546:6;;;;;;;;;;;16527:25;;16572:8;16563:6;;:17;;;;;;;;;;;;;;;;;;16627:8;16596:40;;16617:8;16596:40;;;;;;;;;;;;16516:128;16453:191;:::o;35461:315::-;35616:8;35607:17;;:5;:17;;;;35599:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;35703:8;35665:18;:25;35684:5;35665:25;;;;;;;;;;;;;;;:35;35691:8;35665:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;35749:8;35727:41;;35742:5;35727:41;;;35759:8;35727:41;;;;;;:::i;:::-;;;;;;;;35461:315;;;:::o;31623:::-;31780:28;31790:4;31796:2;31800:7;31780:9;:28::i;:::-;31827:48;31850:4;31856:2;31860:7;31869:5;31827:22;:48::i;:::-;31819:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;31623:315;;;;:::o;38210:723::-;38266:13;38496:1;38487:5;:10;38483:53;;;38514:10;;;;;;;;;;;;;;;;;;;;;38483:53;38546:12;38561:5;38546:20;;38577:14;38602:78;38617:1;38609:4;:9;38602:78;;38635:8;;;;;:::i;:::-;;;;38666:2;38658:10;;;;;:::i;:::-;;;38602:78;;;38690:19;38722:6;38712:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38690:39;;38740:154;38756:1;38747:5;:10;38740:154;;38784:1;38774:11;;;;;:::i;:::-;;;38851:2;38843:5;:10;;;;:::i;:::-;38830:2;:24;;;;:::i;:::-;38817:39;;38800:6;38807;38800:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;38880:2;38871:11;;;;;:::i;:::-;;;38740:154;;;38918:6;38904:21;;;;;38210:723;;;;:::o;33141:382::-;33235:1;33221:16;;:2;:16;;;;33213:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;33294:16;33302:7;33294;:16::i;:::-;33293:17;33285:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;33356:45;33385:1;33389:2;33393:7;33356:20;:45::i;:::-;33431:1;33414:9;:13;33424:2;33414:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;33462:2;33443:7;:16;33451:7;33443:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;33507:7;33503:2;33482:33;;33499:1;33482:33;;;;;;;;;;;;33141:382;;:::o;60275:647::-;60415:4;60433:17;60452:24;60480:33;60497:4;60503:9;60480:16;:33::i;:::-;60432:81;;;;60537:26;60528:35;;;;;;;;:::i;:::-;;:5;:35;;;;;;;;:::i;:::-;;;:58;;;;;60580:6;60567:19;;:9;:19;;;60528:58;60524:102;;;60610:4;60603:11;;;;;;60524:102;60639:12;60653:19;60676:6;:17;;60731:34;;;60767:4;60773:9;60708:75;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60676:118;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60638:156;;;;60813:7;:30;;;;;60841:2;60824:6;:13;:19;60813:30;:100;;;;;60879:34;;;60847:66;;;60858:6;60847:28;;;;;;;;;;;;:::i;:::-;:66;;;;60813:100;60805:109;;;;;;60275:647;;;;;;:::o;26974:305::-;27076:4;27128:25;27113:40;;;:11;:40;;;;:105;;;;27185:33;27170:48;;;:11;:48;;;;27113:105;:158;;;;27235:36;27259:11;27235:23;:36::i;:::-;27113:158;27093:178;;26974:305;;;:::o;37712:126::-;;;;:::o;39511:451::-;39586:13;39612:19;39657:1;39648:6;39644:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;39634:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39612:47;;39670:15;:6;39677:1;39670:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;39696;:6;39703:1;39696:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;39727:9;39752:1;39743:6;39739:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;39727:26;;39722:135;39759:1;39755;:5;39722:135;;;39794:12;39815:3;39807:5;:11;39794:25;;;;;;;:::i;:::-;;;;;39782:6;39789:1;39782:9;;;;;;;;:::i;:::-;;;;;:37;;;;;;;;;;;39844:1;39834:11;;;;;39762:3;;;;:::i;:::-;;;39722:135;;;;39884:1;39875:5;:10;39867:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;39947:6;39933:21;;;39511:451;;;;:::o;36341:799::-;36496:4;36517:15;:2;:13;;;:15::i;:::-;36513:620;;;36569:2;36553:36;;;36590:12;:10;:12::i;:::-;36604:4;36610:7;36619:5;36553:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;36549:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36812:1;36795:6;:13;:18;36791:272;;;36838:60;;;;;;;;;;:::i;:::-;;;;;;;;36791:272;37013:6;37007:13;36998:6;36994:2;36990:15;36983:38;36549:529;36686:41;;;36676:51;;;:6;:51;;;;36669:58;;;;;36513:620;37117:4;37110:11;;36341:799;;;;;;;:::o;52026:1308::-;52107:7;52116:12;52361:2;52341:9;:16;:22;52337:990;;;52380:9;52404;52428:7;52637:4;52626:9;52622:20;52616:27;52611:32;;52687:4;52676:9;52672:20;52666:27;52661:32;;52745:4;52734:9;52730:20;52724:27;52721:1;52716:36;52711:41;;52788:25;52799:4;52805:1;52808;52811;52788:10;:25::i;:::-;52781:32;;;;;;;;;52337:990;52855:2;52835:9;:16;:22;52831:496;;;52874:9;52898:10;53110:4;53099:9;53095:20;53089:27;53084:32;;53161:4;53150:9;53146:20;53140:27;53134:33;;53203:23;53214:4;53220:1;53223:2;53203:10;:23::i;:::-;53196:30;;;;;;;;52831:496;53275:1;53279:35;53259:56;;;;52026:1308;;;;;;:::o;10023:157::-;10108:4;10147:25;10132:40;;;:11;:40;;;;10125:47;;10023:157;;;:::o;18600:326::-;18660:4;18917:1;18895:7;:19;;;:23;18888:30;;18600:326;;;:::o;55588:1632::-;55719:7;55728:12;56653:66;56648:1;56640:10;;:79;56636:163;;;56752:1;56756:30;56736:51;;;;;;56636:163;56818:2;56813:1;:7;;;;:18;;;;;56829:2;56824:1;:7;;;;56813:18;56809:102;;;56864:1;56868:30;56848:51;;;;;;56809:102;57008:14;57025:24;57035:4;57041:1;57044;57047;57025:24;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57008:41;;57082:1;57064:20;;:6;:20;;;57060:103;;;57117:1;57121:29;57101:50;;;;;;;57060:103;57183:6;57191:20;57175:37;;;;;55588:1632;;;;;;;;:::o;54630:344::-;54744:7;54753:12;54778:9;54803:66;54795:75;;54790:2;:80;54778:92;;54881:7;54920:2;54913:3;54906:2;54898:11;;:18;;54897:25;;;;:::i;:::-;54881:42;;54941:25;54952:4;54958:1;54961;54964;54941:10;:25::i;:::-;54934:32;;;;;;54630:344;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;769:::-;865:5;890:81;906:64;963:6;906:64;:::i;:::-;890:81;:::i;:::-;881:90;;991:5;1020:6;1013:5;1006:21;1054:4;1047:5;1043:16;1036:23;;1080:6;1130:3;1122:4;1114:6;1110:17;1105:3;1101:27;1098:36;1095:143;;;1149:79;;:::i;:::-;1095:143;1262:1;1247:238;1272:6;1269:1;1266:13;1247:238;;;1340:3;1369:37;1402:3;1390:10;1369:37;:::i;:::-;1364:3;1357:50;1436:4;1431:3;1427:14;1420:21;;1470:4;1465:3;1461:14;1454:21;;1307:178;1294:1;1291;1287:9;1282:14;;1247:238;;;1251:14;871:620;;769:722;;;;;:::o;1513:719::-;1608:5;1633:80;1649:63;1705:6;1649:63;:::i;:::-;1633:80;:::i;:::-;1624:89;;1733:5;1762:6;1755:5;1748:21;1796:4;1789:5;1785:16;1778:23;;1822:6;1872:3;1864:4;1856:6;1852:17;1847:3;1843:27;1840:36;1837:143;;;1891:79;;:::i;:::-;1837:143;2004:1;1989:237;2014:6;2011:1;2008:13;1989:237;;;2082:3;2111:36;2143:3;2131:10;2111:36;:::i;:::-;2106:3;2099:49;2177:4;2172:3;2168:14;2161:21;;2211:4;2206:3;2202:14;2195:21;;2049:177;2036:1;2033;2029:9;2024:14;;1989:237;;;1993:14;1614:618;;1513:719;;;;;:::o;2238:410::-;2315:5;2340:65;2356:48;2397:6;2356:48;:::i;:::-;2340:65;:::i;:::-;2331:74;;2428:6;2421:5;2414:21;2466:4;2459:5;2455:16;2504:3;2495:6;2490:3;2486:16;2483:25;2480:112;;;2511:79;;:::i;:::-;2480:112;2601:41;2635:6;2630:3;2625;2601:41;:::i;:::-;2321:327;2238:410;;;;;:::o;2654:412::-;2732:5;2757:66;2773:49;2815:6;2773:49;:::i;:::-;2757:66;:::i;:::-;2748:75;;2846:6;2839:5;2832:21;2884:4;2877:5;2873:16;2922:3;2913:6;2908:3;2904:16;2901:25;2898:112;;;2929:79;;:::i;:::-;2898:112;3019:41;3053:6;3048:3;3043;3019:41;:::i;:::-;2738:328;2654:412;;;;;:::o;3072:139::-;3118:5;3156:6;3143:20;3134:29;;3172:33;3199:5;3172:33;:::i;:::-;3072:139;;;;:::o;3234:370::-;3305:5;3354:3;3347:4;3339:6;3335:17;3331:27;3321:122;;3362:79;;:::i;:::-;3321:122;3479:6;3466:20;3504:94;3594:3;3586:6;3579:4;3571:6;3567:17;3504:94;:::i;:::-;3495:103;;3311:293;3234:370;;;;:::o;3627:::-;3698:5;3747:3;3740:4;3732:6;3728:17;3724:27;3714:122;;3755:79;;:::i;:::-;3714:122;3872:6;3859:20;3897:94;3987:3;3979:6;3972:4;3964:6;3960:17;3897:94;:::i;:::-;3888:103;;3704:293;3627:370;;;;:::o;4019:368::-;4089:5;4138:3;4131:4;4123:6;4119:17;4115:27;4105:122;;4146:79;;:::i;:::-;4105:122;4263:6;4250:20;4288:93;4377:3;4369:6;4362:4;4354:6;4350:17;4288:93;:::i;:::-;4279:102;;4095:292;4019:368;;;;:::o;4393:133::-;4436:5;4474:6;4461:20;4452:29;;4490:30;4514:5;4490:30;:::i;:::-;4393:133;;;;:::o;4532:139::-;4578:5;4616:6;4603:20;4594:29;;4632:33;4659:5;4632:33;:::i;:::-;4532:139;;;;:::o;4677:137::-;4722:5;4760:6;4747:20;4738:29;;4776:32;4802:5;4776:32;:::i;:::-;4677:137;;;;:::o;4820:141::-;4876:5;4907:6;4901:13;4892:22;;4923:32;4949:5;4923:32;:::i;:::-;4820:141;;;;:::o;4980:338::-;5035:5;5084:3;5077:4;5069:6;5065:17;5061:27;5051:122;;5092:79;;:::i;:::-;5051:122;5209:6;5196:20;5234:78;5308:3;5300:6;5293:4;5285:6;5281:17;5234:78;:::i;:::-;5225:87;;5041:277;4980:338;;;;:::o;5338:340::-;5394:5;5443:3;5436:4;5428:6;5424:17;5420:27;5410:122;;5451:79;;:::i;:::-;5410:122;5568:6;5555:20;5593:79;5668:3;5660:6;5653:4;5645:6;5641:17;5593:79;:::i;:::-;5584:88;;5400:278;5338:340;;;;:::o;5684:139::-;5730:5;5768:6;5755:20;5746:29;;5784:33;5811:5;5784:33;:::i;:::-;5684:139;;;;:::o;5829:137::-;5874:5;5912:6;5899:20;5890:29;;5928:32;5954:5;5928:32;:::i;:::-;5829:137;;;;:::o;5972:329::-;6031:6;6080:2;6068:9;6059:7;6055:23;6051:32;6048:119;;;6086:79;;:::i;:::-;6048:119;6206:1;6231:53;6276:7;6267:6;6256:9;6252:22;6231:53;:::i;:::-;6221:63;;6177:117;5972:329;;;;:::o;6307:474::-;6375:6;6383;6432:2;6420:9;6411:7;6407:23;6403:32;6400:119;;;6438:79;;:::i;:::-;6400:119;6558:1;6583:53;6628:7;6619:6;6608:9;6604:22;6583:53;:::i;:::-;6573:63;;6529:117;6685:2;6711:53;6756:7;6747:6;6736:9;6732:22;6711:53;:::i;:::-;6701:63;;6656:118;6307:474;;;;;:::o;6787:619::-;6864:6;6872;6880;6929:2;6917:9;6908:7;6904:23;6900:32;6897:119;;;6935:79;;:::i;:::-;6897:119;7055:1;7080:53;7125:7;7116:6;7105:9;7101:22;7080:53;:::i;:::-;7070:63;;7026:117;7182:2;7208:53;7253:7;7244:6;7233:9;7229:22;7208:53;:::i;:::-;7198:63;;7153:118;7310:2;7336:53;7381:7;7372:6;7361:9;7357:22;7336:53;:::i;:::-;7326:63;;7281:118;6787:619;;;;;:::o;7412:943::-;7507:6;7515;7523;7531;7580:3;7568:9;7559:7;7555:23;7551:33;7548:120;;;7587:79;;:::i;:::-;7548:120;7707:1;7732:53;7777:7;7768:6;7757:9;7753:22;7732:53;:::i;:::-;7722:63;;7678:117;7834:2;7860:53;7905:7;7896:6;7885:9;7881:22;7860:53;:::i;:::-;7850:63;;7805:118;7962:2;7988:53;8033:7;8024:6;8013:9;8009:22;7988:53;:::i;:::-;7978:63;;7933:118;8118:2;8107:9;8103:18;8090:32;8149:18;8141:6;8138:30;8135:117;;;8171:79;;:::i;:::-;8135:117;8276:62;8330:7;8321:6;8310:9;8306:22;8276:62;:::i;:::-;8266:72;;8061:287;7412:943;;;;;;;:::o;8361:468::-;8426:6;8434;8483:2;8471:9;8462:7;8458:23;8454:32;8451:119;;;8489:79;;:::i;:::-;8451:119;8609:1;8634:53;8679:7;8670:6;8659:9;8655:22;8634:53;:::i;:::-;8624:63;;8580:117;8736:2;8762:50;8804:7;8795:6;8784:9;8780:22;8762:50;:::i;:::-;8752:60;;8707:115;8361:468;;;;;:::o;8835:474::-;8903:6;8911;8960:2;8948:9;8939:7;8935:23;8931:32;8928:119;;;8966:79;;:::i;:::-;8928:119;9086:1;9111:53;9156:7;9147:6;9136:9;9132:22;9111:53;:::i;:::-;9101:63;;9057:117;9213:2;9239:53;9284:7;9275:6;9264:9;9260:22;9239:53;:::i;:::-;9229:63;;9184:118;8835:474;;;;;:::o;9315:539::-;9399:6;9448:2;9436:9;9427:7;9423:23;9419:32;9416:119;;;9454:79;;:::i;:::-;9416:119;9602:1;9591:9;9587:17;9574:31;9632:18;9624:6;9621:30;9618:117;;;9654:79;;:::i;:::-;9618:117;9759:78;9829:7;9820:6;9809:9;9805:22;9759:78;:::i;:::-;9749:88;;9545:302;9315:539;;;;:::o;9860:892::-;9977:6;9985;10034:2;10022:9;10013:7;10009:23;10005:32;10002:119;;;10040:79;;:::i;:::-;10002:119;10188:1;10177:9;10173:17;10160:31;10218:18;10210:6;10207:30;10204:117;;;10240:79;;:::i;:::-;10204:117;10345:78;10415:7;10406:6;10395:9;10391:22;10345:78;:::i;:::-;10335:88;;10131:302;10500:2;10489:9;10485:18;10472:32;10531:18;10523:6;10520:30;10517:117;;;10553:79;;:::i;:::-;10517:117;10658:77;10727:7;10718:6;10707:9;10703:22;10658:77;:::i;:::-;10648:87;;10443:302;9860:892;;;;;:::o;10758:329::-;10817:6;10866:2;10854:9;10845:7;10841:23;10837:32;10834:119;;;10872:79;;:::i;:::-;10834:119;10992:1;11017:53;11062:7;11053:6;11042:9;11038:22;11017:53;:::i;:::-;11007:63;;10963:117;10758:329;;;;:::o;11093:474::-;11161:6;11169;11218:2;11206:9;11197:7;11193:23;11189:32;11186:119;;;11224:79;;:::i;:::-;11186:119;11344:1;11369:53;11414:7;11405:6;11394:9;11390:22;11369:53;:::i;:::-;11359:63;;11315:117;11471:2;11497:53;11542:7;11533:6;11522:9;11518:22;11497:53;:::i;:::-;11487:63;;11442:118;11093:474;;;;;:::o;11573:2107::-;11802:6;11810;11818;11826;11834;11842;11891:3;11879:9;11870:7;11866:23;11862:33;11859:120;;;11898:79;;:::i;:::-;11859:120;12018:1;12043:53;12088:7;12079:6;12068:9;12064:22;12043:53;:::i;:::-;12033:63;;11989:117;12173:2;12162:9;12158:18;12145:32;12204:18;12196:6;12193:30;12190:117;;;12226:79;;:::i;:::-;12190:117;12331:78;12401:7;12392:6;12381:9;12377:22;12331:78;:::i;:::-;12321:88;;12116:303;12486:2;12475:9;12471:18;12458:32;12517:18;12509:6;12506:30;12503:117;;;12539:79;;:::i;:::-;12503:117;12644:78;12714:7;12705:6;12694:9;12690:22;12644:78;:::i;:::-;12634:88;;12429:303;12799:2;12788:9;12784:18;12771:32;12830:18;12822:6;12819:30;12816:117;;;12852:79;;:::i;:::-;12816:117;12957:78;13027:7;13018:6;13007:9;13003:22;12957:78;:::i;:::-;12947:88;;12742:303;13112:3;13101:9;13097:19;13084:33;13144:18;13136:6;13133:30;13130:117;;;13166:79;;:::i;:::-;13130:117;13271:78;13341:7;13332:6;13321:9;13317:22;13271:78;:::i;:::-;13261:88;;13055:304;13426:3;13415:9;13411:19;13398:33;13458:18;13450:6;13447:30;13444:117;;;13480:79;;:::i;:::-;13444:117;13585:78;13655:7;13646:6;13635:9;13631:22;13585:78;:::i;:::-;13575:88;;13369:304;11573:2107;;;;;;;;:::o;13686:327::-;13744:6;13793:2;13781:9;13772:7;13768:23;13764:32;13761:119;;;13799:79;;:::i;:::-;13761:119;13919:1;13944:52;13988:7;13979:6;13968:9;13964:22;13944:52;:::i;:::-;13934:62;;13890:116;13686:327;;;;:::o;14019:349::-;14088:6;14137:2;14125:9;14116:7;14112:23;14108:32;14105:119;;;14143:79;;:::i;:::-;14105:119;14263:1;14288:63;14343:7;14334:6;14323:9;14319:22;14288:63;:::i;:::-;14278:73;;14234:127;14019:349;;;;:::o;14374:509::-;14443:6;14492:2;14480:9;14471:7;14467:23;14463:32;14460:119;;;14498:79;;:::i;:::-;14460:119;14646:1;14635:9;14631:17;14618:31;14676:18;14668:6;14665:30;14662:117;;;14698:79;;:::i;:::-;14662:117;14803:63;14858:7;14849:6;14838:9;14834:22;14803:63;:::i;:::-;14793:73;;14589:287;14374:509;;;;:::o;14889:329::-;14948:6;14997:2;14985:9;14976:7;14972:23;14968:32;14965:119;;;15003:79;;:::i;:::-;14965:119;15123:1;15148:53;15193:7;15184:6;15173:9;15169:22;15148:53;:::i;:::-;15138:63;;15094:117;14889:329;;;;:::o;15224:474::-;15292:6;15300;15349:2;15337:9;15328:7;15324:23;15320:32;15317:119;;;15355:79;;:::i;:::-;15317:119;15475:1;15500:53;15545:7;15536:6;15525:9;15521:22;15500:53;:::i;:::-;15490:63;;15446:117;15602:2;15628:53;15673:7;15664:6;15653:9;15649:22;15628:53;:::i;:::-;15618:63;;15573:118;15224:474;;;;;:::o;15704:797::-;15790:6;15798;15806;15855:2;15843:9;15834:7;15830:23;15826:32;15823:119;;;15861:79;;:::i;:::-;15823:119;15981:1;16006:53;16051:7;16042:6;16031:9;16027:22;16006:53;:::i;:::-;15996:63;;15952:117;16108:2;16134:53;16179:7;16170:6;16159:9;16155:22;16134:53;:::i;:::-;16124:63;;16079:118;16264:2;16253:9;16249:18;16236:32;16295:18;16287:6;16284:30;16281:117;;;16317:79;;:::i;:::-;16281:117;16422:62;16476:7;16467:6;16456:9;16452:22;16422:62;:::i;:::-;16412:72;;16207:287;15704:797;;;;;:::o;16507:118::-;16594:24;16612:5;16594:24;:::i;:::-;16589:3;16582:37;16507:118;;:::o;16631:109::-;16712:21;16727:5;16712:21;:::i;:::-;16707:3;16700:34;16631:109;;:::o;16746:118::-;16833:24;16851:5;16833:24;:::i;:::-;16828:3;16821:37;16746:118;;:::o;16870:360::-;16956:3;16984:38;17016:5;16984:38;:::i;:::-;17038:70;17101:6;17096:3;17038:70;:::i;:::-;17031:77;;17117:52;17162:6;17157:3;17150:4;17143:5;17139:16;17117:52;:::i;:::-;17194:29;17216:6;17194:29;:::i;:::-;17189:3;17185:39;17178:46;;16960:270;16870:360;;;;:::o;17236:373::-;17340:3;17368:38;17400:5;17368:38;:::i;:::-;17422:88;17503:6;17498:3;17422:88;:::i;:::-;17415:95;;17519:52;17564:6;17559:3;17552:4;17545:5;17541:16;17519:52;:::i;:::-;17596:6;17591:3;17587:16;17580:23;;17344:265;17236:373;;;;:::o;17615:364::-;17703:3;17731:39;17764:5;17731:39;:::i;:::-;17786:71;17850:6;17845:3;17786:71;:::i;:::-;17779:78;;17866:52;17911:6;17906:3;17899:4;17892:5;17888:16;17866:52;:::i;:::-;17943:29;17965:6;17943:29;:::i;:::-;17938:3;17934:39;17927:46;;17707:272;17615:364;;;;:::o;17985:377::-;18091:3;18119:39;18152:5;18119:39;:::i;:::-;18174:89;18256:6;18251:3;18174:89;:::i;:::-;18167:96;;18272:52;18317:6;18312:3;18305:4;18298:5;18294:16;18272:52;:::i;:::-;18349:6;18344:3;18340:16;18333:23;;18095:267;17985:377;;;;:::o;18392:845::-;18495:3;18532:5;18526:12;18561:36;18587:9;18561:36;:::i;:::-;18613:89;18695:6;18690:3;18613:89;:::i;:::-;18606:96;;18733:1;18722:9;18718:17;18749:1;18744:137;;;;18895:1;18890:341;;;;18711:520;;18744:137;18828:4;18824:9;18813;18809:25;18804:3;18797:38;18864:6;18859:3;18855:16;18848:23;;18744:137;;18890:341;18957:38;18989:5;18957:38;:::i;:::-;19017:1;19031:154;19045:6;19042:1;19039:13;19031:154;;;19119:7;19113:14;19109:1;19104:3;19100:11;19093:35;19169:1;19160:7;19156:15;19145:26;;19067:4;19064:1;19060:12;19055:17;;19031:154;;;19214:6;19209:3;19205:16;19198:23;;18897:334;;18711:520;;18499:738;;18392:845;;;;:::o;19243:366::-;19385:3;19406:67;19470:2;19465:3;19406:67;:::i;:::-;19399:74;;19482:93;19571:3;19482:93;:::i;:::-;19600:2;19595:3;19591:12;19584:19;;19243:366;;;:::o;19615:::-;19757:3;19778:67;19842:2;19837:3;19778:67;:::i;:::-;19771:74;;19854:93;19943:3;19854:93;:::i;:::-;19972:2;19967:3;19963:12;19956:19;;19615:366;;;:::o;19987:::-;20129:3;20150:67;20214:2;20209:3;20150:67;:::i;:::-;20143:74;;20226:93;20315:3;20226:93;:::i;:::-;20344:2;20339:3;20335:12;20328:19;;19987:366;;;:::o;20359:::-;20501:3;20522:67;20586:2;20581:3;20522:67;:::i;:::-;20515:74;;20598:93;20687:3;20598:93;:::i;:::-;20716:2;20711:3;20707:12;20700:19;;20359:366;;;:::o;20731:::-;20873:3;20894:67;20958:2;20953:3;20894:67;:::i;:::-;20887:74;;20970:93;21059:3;20970:93;:::i;:::-;21088:2;21083:3;21079:12;21072:19;;20731:366;;;:::o;21103:::-;21245:3;21266:67;21330:2;21325:3;21266:67;:::i;:::-;21259:74;;21342:93;21431:3;21342:93;:::i;:::-;21460:2;21455:3;21451:12;21444:19;;21103:366;;;:::o;21475:::-;21617:3;21638:67;21702:2;21697:3;21638:67;:::i;:::-;21631:74;;21714:93;21803:3;21714:93;:::i;:::-;21832:2;21827:3;21823:12;21816:19;;21475:366;;;:::o;21847:::-;21989:3;22010:67;22074:2;22069:3;22010:67;:::i;:::-;22003:74;;22086:93;22175:3;22086:93;:::i;:::-;22204:2;22199:3;22195:12;22188:19;;21847:366;;;:::o;22219:::-;22361:3;22382:67;22446:2;22441:3;22382:67;:::i;:::-;22375:74;;22458:93;22547:3;22458:93;:::i;:::-;22576:2;22571:3;22567:12;22560:19;;22219:366;;;:::o;22591:::-;22733:3;22754:67;22818:2;22813:3;22754:67;:::i;:::-;22747:74;;22830:93;22919:3;22830:93;:::i;:::-;22948:2;22943:3;22939:12;22932:19;;22591:366;;;:::o;22963:::-;23105:3;23126:67;23190:2;23185:3;23126:67;:::i;:::-;23119:74;;23202:93;23291:3;23202:93;:::i;:::-;23320:2;23315:3;23311:12;23304:19;;22963:366;;;:::o;23335:::-;23477:3;23498:67;23562:2;23557:3;23498:67;:::i;:::-;23491:74;;23574:93;23663:3;23574:93;:::i;:::-;23692:2;23687:3;23683:12;23676:19;;23335:366;;;:::o;23707:::-;23849:3;23870:67;23934:2;23929:3;23870:67;:::i;:::-;23863:74;;23946:93;24035:3;23946:93;:::i;:::-;24064:2;24059:3;24055:12;24048:19;;23707:366;;;:::o;24079:::-;24221:3;24242:67;24306:2;24301:3;24242:67;:::i;:::-;24235:74;;24318:93;24407:3;24318:93;:::i;:::-;24436:2;24431:3;24427:12;24420:19;;24079:366;;;:::o;24451:::-;24593:3;24614:67;24678:2;24673:3;24614:67;:::i;:::-;24607:74;;24690:93;24779:3;24690:93;:::i;:::-;24808:2;24803:3;24799:12;24792:19;;24451:366;;;:::o;24823:::-;24965:3;24986:67;25050:2;25045:3;24986:67;:::i;:::-;24979:74;;25062:93;25151:3;25062:93;:::i;:::-;25180:2;25175:3;25171:12;25164:19;;24823:366;;;:::o;25195:::-;25337:3;25358:67;25422:2;25417:3;25358:67;:::i;:::-;25351:74;;25434:93;25523:3;25434:93;:::i;:::-;25552:2;25547:3;25543:12;25536:19;;25195:366;;;:::o;25567:::-;25709:3;25730:67;25794:2;25789:3;25730:67;:::i;:::-;25723:74;;25806:93;25895:3;25806:93;:::i;:::-;25924:2;25919:3;25915:12;25908:19;;25567:366;;;:::o;25939:::-;26081:3;26102:67;26166:2;26161:3;26102:67;:::i;:::-;26095:74;;26178:93;26267:3;26178:93;:::i;:::-;26296:2;26291:3;26287:12;26280:19;;25939:366;;;:::o;26311:::-;26453:3;26474:67;26538:2;26533:3;26474:67;:::i;:::-;26467:74;;26550:93;26639:3;26550:93;:::i;:::-;26668:2;26663:3;26659:12;26652:19;;26311:366;;;:::o;26683:::-;26825:3;26846:67;26910:2;26905:3;26846:67;:::i;:::-;26839:74;;26922:93;27011:3;26922:93;:::i;:::-;27040:2;27035:3;27031:12;27024:19;;26683:366;;;:::o;27055:::-;27197:3;27218:67;27282:2;27277:3;27218:67;:::i;:::-;27211:74;;27294:93;27383:3;27294:93;:::i;:::-;27412:2;27407:3;27403:12;27396:19;;27055:366;;;:::o;27427:::-;27569:3;27590:67;27654:2;27649:3;27590:67;:::i;:::-;27583:74;;27666:93;27755:3;27666:93;:::i;:::-;27784:2;27779:3;27775:12;27768:19;;27427:366;;;:::o;27799:::-;27941:3;27962:67;28026:2;28021:3;27962:67;:::i;:::-;27955:74;;28038:93;28127:3;28038:93;:::i;:::-;28156:2;28151:3;28147:12;28140:19;;27799:366;;;:::o;28171:::-;28313:3;28334:67;28398:2;28393:3;28334:67;:::i;:::-;28327:74;;28410:93;28499:3;28410:93;:::i;:::-;28528:2;28523:3;28519:12;28512:19;;28171:366;;;:::o;28543:::-;28685:3;28706:67;28770:2;28765:3;28706:67;:::i;:::-;28699:74;;28782:93;28871:3;28782:93;:::i;:::-;28900:2;28895:3;28891:12;28884:19;;28543:366;;;:::o;28915:::-;29057:3;29078:67;29142:2;29137:3;29078:67;:::i;:::-;29071:74;;29154:93;29243:3;29154:93;:::i;:::-;29272:2;29267:3;29263:12;29256:19;;28915:366;;;:::o;29287:::-;29429:3;29450:67;29514:2;29509:3;29450:67;:::i;:::-;29443:74;;29526:93;29615:3;29526:93;:::i;:::-;29644:2;29639:3;29635:12;29628:19;;29287:366;;;:::o;29659:::-;29801:3;29822:67;29886:2;29881:3;29822:67;:::i;:::-;29815:74;;29898:93;29987:3;29898:93;:::i;:::-;30016:2;30011:3;30007:12;30000:19;;29659:366;;;:::o;30031:402::-;30191:3;30212:85;30294:2;30289:3;30212:85;:::i;:::-;30205:92;;30306:93;30395:3;30306:93;:::i;:::-;30424:2;30419:3;30415:12;30408:19;;30031:402;;;:::o;30439:366::-;30581:3;30602:67;30666:2;30661:3;30602:67;:::i;:::-;30595:74;;30678:93;30767:3;30678:93;:::i;:::-;30796:2;30791:3;30787:12;30780:19;;30439:366;;;:::o;30811:398::-;30970:3;30991:83;31072:1;31067:3;30991:83;:::i;:::-;30984:90;;31083:93;31172:3;31083:93;:::i;:::-;31201:1;31196:3;31192:11;31185:18;;30811:398;;;:::o;31215:366::-;31357:3;31378:67;31442:2;31437:3;31378:67;:::i;:::-;31371:74;;31454:93;31543:3;31454:93;:::i;:::-;31572:2;31567:3;31563:12;31556:19;;31215:366;;;:::o;31587:::-;31729:3;31750:67;31814:2;31809:3;31750:67;:::i;:::-;31743:74;;31826:93;31915:3;31826:93;:::i;:::-;31944:2;31939:3;31935:12;31928:19;;31587:366;;;:::o;31959:::-;32101:3;32122:67;32186:2;32181:3;32122:67;:::i;:::-;32115:74;;32198:93;32287:3;32198:93;:::i;:::-;32316:2;32311:3;32307:12;32300:19;;31959:366;;;:::o;32331:402::-;32491:3;32512:85;32594:2;32589:3;32512:85;:::i;:::-;32505:92;;32606:93;32695:3;32606:93;:::i;:::-;32724:2;32719:3;32715:12;32708:19;;32331:402;;;:::o;32739:366::-;32881:3;32902:67;32966:2;32961:3;32902:67;:::i;:::-;32895:74;;32978:93;33067:3;32978:93;:::i;:::-;33096:2;33091:3;33087:12;33080:19;;32739:366;;;:::o;33111:402::-;33271:3;33292:85;33374:2;33369:3;33292:85;:::i;:::-;33285:92;;33386:93;33475:3;33386:93;:::i;:::-;33504:2;33499:3;33495:12;33488:19;;33111:402;;;:::o;33519:366::-;33661:3;33682:67;33746:2;33741:3;33682:67;:::i;:::-;33675:74;;33758:93;33847:3;33758:93;:::i;:::-;33876:2;33871:3;33867:12;33860:19;;33519:366;;;:::o;33891:::-;34033:3;34054:67;34118:2;34113:3;34054:67;:::i;:::-;34047:74;;34130:93;34219:3;34130:93;:::i;:::-;34248:2;34243:3;34239:12;34232:19;;33891:366;;;:::o;34263:118::-;34350:24;34368:5;34350:24;:::i;:::-;34345:3;34338:37;34263:118;;:::o;34387:112::-;34470:22;34486:5;34470:22;:::i;:::-;34465:3;34458:35;34387:112;;:::o;34505:271::-;34635:3;34657:93;34746:3;34737:6;34657:93;:::i;:::-;34650:100;;34767:3;34760:10;;34505:271;;;;:::o;34782:429::-;34959:3;34981:92;35069:3;35060:6;34981:92;:::i;:::-;34974:99;;35090:95;35181:3;35172:6;35090:95;:::i;:::-;35083:102;;35202:3;35195:10;;34782:429;;;;;:::o;35217:541::-;35450:3;35472:148;35616:3;35472:148;:::i;:::-;35465:155;;35637:95;35728:3;35719:6;35637:95;:::i;:::-;35630:102;;35749:3;35742:10;;35217:541;;;;:::o;35764:379::-;35948:3;35970:147;36113:3;35970:147;:::i;:::-;35963:154;;36134:3;36127:10;;35764:379;;;:::o;36149:967::-;36531:3;36553:148;36697:3;36553:148;:::i;:::-;36546:155;;36718:95;36809:3;36800:6;36718:95;:::i;:::-;36711:102;;36830:148;36974:3;36830:148;:::i;:::-;36823:155;;36995:95;37086:3;37077:6;36995:95;:::i;:::-;36988:102;;37107:3;37100:10;;36149:967;;;;;:::o;37122:222::-;37215:4;37253:2;37242:9;37238:18;37230:26;;37266:71;37334:1;37323:9;37319:17;37310:6;37266:71;:::i;:::-;37122:222;;;;:::o;37350:442::-;37499:4;37537:2;37526:9;37522:18;37514:26;;37550:71;37618:1;37607:9;37603:17;37594:6;37550:71;:::i;:::-;37631:72;37699:2;37688:9;37684:18;37675:6;37631:72;:::i;:::-;37713;37781:2;37770:9;37766:18;37757:6;37713:72;:::i;:::-;37350:442;;;;;;:::o;37798:640::-;37993:4;38031:3;38020:9;38016:19;38008:27;;38045:71;38113:1;38102:9;38098:17;38089:6;38045:71;:::i;:::-;38126:72;38194:2;38183:9;38179:18;38170:6;38126:72;:::i;:::-;38208;38276:2;38265:9;38261:18;38252:6;38208:72;:::i;:::-;38327:9;38321:4;38317:20;38312:2;38301:9;38297:18;38290:48;38355:76;38426:4;38417:6;38355:76;:::i;:::-;38347:84;;37798:640;;;;;;;:::o;38444:332::-;38565:4;38603:2;38592:9;38588:18;38580:26;;38616:71;38684:1;38673:9;38669:17;38660:6;38616:71;:::i;:::-;38697:72;38765:2;38754:9;38750:18;38741:6;38697:72;:::i;:::-;38444:332;;;;;:::o;38782:210::-;38869:4;38907:2;38896:9;38892:18;38884:26;;38920:65;38982:1;38971:9;38967:17;38958:6;38920:65;:::i;:::-;38782:210;;;;:::o;38998:222::-;39091:4;39129:2;39118:9;39114:18;39106:26;;39142:71;39210:1;39199:9;39195:17;39186:6;39142:71;:::i;:::-;38998:222;;;;:::o;39226:419::-;39365:4;39403:2;39392:9;39388:18;39380:26;;39416:71;39484:1;39473:9;39469:17;39460:6;39416:71;:::i;:::-;39534:9;39528:4;39524:20;39519:2;39508:9;39504:18;39497:48;39562:76;39633:4;39624:6;39562:76;:::i;:::-;39554:84;;39226:419;;;;;:::o;39651:545::-;39824:4;39862:3;39851:9;39847:19;39839:27;;39876:71;39944:1;39933:9;39929:17;39920:6;39876:71;:::i;:::-;39957:68;40021:2;40010:9;40006:18;39997:6;39957:68;:::i;:::-;40035:72;40103:2;40092:9;40088:18;40079:6;40035:72;:::i;:::-;40117;40185:2;40174:9;40170:18;40161:6;40117:72;:::i;:::-;39651:545;;;;;;;:::o;40202:313::-;40315:4;40353:2;40342:9;40338:18;40330:26;;40402:9;40396:4;40392:20;40388:1;40377:9;40373:17;40366:47;40430:78;40503:4;40494:6;40430:78;:::i;:::-;40422:86;;40202:313;;;;:::o;40521:419::-;40687:4;40725:2;40714:9;40710:18;40702:26;;40774:9;40768:4;40764:20;40760:1;40749:9;40745:17;40738:47;40802:131;40928:4;40802:131;:::i;:::-;40794:139;;40521:419;;;:::o;40946:::-;41112:4;41150:2;41139:9;41135:18;41127:26;;41199:9;41193:4;41189:20;41185:1;41174:9;41170:17;41163:47;41227:131;41353:4;41227:131;:::i;:::-;41219:139;;40946:419;;;:::o;41371:::-;41537:4;41575:2;41564:9;41560:18;41552:26;;41624:9;41618:4;41614:20;41610:1;41599:9;41595:17;41588:47;41652:131;41778:4;41652:131;:::i;:::-;41644:139;;41371:419;;;:::o;41796:::-;41962:4;42000:2;41989:9;41985:18;41977:26;;42049:9;42043:4;42039:20;42035:1;42024:9;42020:17;42013:47;42077:131;42203:4;42077:131;:::i;:::-;42069:139;;41796:419;;;:::o;42221:::-;42387:4;42425:2;42414:9;42410:18;42402:26;;42474:9;42468:4;42464:20;42460:1;42449:9;42445:17;42438:47;42502:131;42628:4;42502:131;:::i;:::-;42494:139;;42221:419;;;:::o;42646:::-;42812:4;42850:2;42839:9;42835:18;42827:26;;42899:9;42893:4;42889:20;42885:1;42874:9;42870:17;42863:47;42927:131;43053:4;42927:131;:::i;:::-;42919:139;;42646:419;;;:::o;43071:::-;43237:4;43275:2;43264:9;43260:18;43252:26;;43324:9;43318:4;43314:20;43310:1;43299:9;43295:17;43288:47;43352:131;43478:4;43352:131;:::i;:::-;43344:139;;43071:419;;;:::o;43496:::-;43662:4;43700:2;43689:9;43685:18;43677:26;;43749:9;43743:4;43739:20;43735:1;43724:9;43720:17;43713:47;43777:131;43903:4;43777:131;:::i;:::-;43769:139;;43496:419;;;:::o;43921:::-;44087:4;44125:2;44114:9;44110:18;44102:26;;44174:9;44168:4;44164:20;44160:1;44149:9;44145:17;44138:47;44202:131;44328:4;44202:131;:::i;:::-;44194:139;;43921:419;;;:::o;44346:::-;44512:4;44550:2;44539:9;44535:18;44527:26;;44599:9;44593:4;44589:20;44585:1;44574:9;44570:17;44563:47;44627:131;44753:4;44627:131;:::i;:::-;44619:139;;44346:419;;;:::o;44771:::-;44937:4;44975:2;44964:9;44960:18;44952:26;;45024:9;45018:4;45014:20;45010:1;44999:9;44995:17;44988:47;45052:131;45178:4;45052:131;:::i;:::-;45044:139;;44771:419;;;:::o;45196:::-;45362:4;45400:2;45389:9;45385:18;45377:26;;45449:9;45443:4;45439:20;45435:1;45424:9;45420:17;45413:47;45477:131;45603:4;45477:131;:::i;:::-;45469:139;;45196:419;;;:::o;45621:::-;45787:4;45825:2;45814:9;45810:18;45802:26;;45874:9;45868:4;45864:20;45860:1;45849:9;45845:17;45838:47;45902:131;46028:4;45902:131;:::i;:::-;45894:139;;45621:419;;;:::o;46046:::-;46212:4;46250:2;46239:9;46235:18;46227:26;;46299:9;46293:4;46289:20;46285:1;46274:9;46270:17;46263:47;46327:131;46453:4;46327:131;:::i;:::-;46319:139;;46046:419;;;:::o;46471:::-;46637:4;46675:2;46664:9;46660:18;46652:26;;46724:9;46718:4;46714:20;46710:1;46699:9;46695:17;46688:47;46752:131;46878:4;46752:131;:::i;:::-;46744:139;;46471:419;;;:::o;46896:::-;47062:4;47100:2;47089:9;47085:18;47077:26;;47149:9;47143:4;47139:20;47135:1;47124:9;47120:17;47113:47;47177:131;47303:4;47177:131;:::i;:::-;47169:139;;46896:419;;;:::o;47321:::-;47487:4;47525:2;47514:9;47510:18;47502:26;;47574:9;47568:4;47564:20;47560:1;47549:9;47545:17;47538:47;47602:131;47728:4;47602:131;:::i;:::-;47594:139;;47321:419;;;:::o;47746:::-;47912:4;47950:2;47939:9;47935:18;47927:26;;47999:9;47993:4;47989:20;47985:1;47974:9;47970:17;47963:47;48027:131;48153:4;48027:131;:::i;:::-;48019:139;;47746:419;;;:::o;48171:::-;48337:4;48375:2;48364:9;48360:18;48352:26;;48424:9;48418:4;48414:20;48410:1;48399:9;48395:17;48388:47;48452:131;48578:4;48452:131;:::i;:::-;48444:139;;48171:419;;;:::o;48596:::-;48762:4;48800:2;48789:9;48785:18;48777:26;;48849:9;48843:4;48839:20;48835:1;48824:9;48820:17;48813:47;48877:131;49003:4;48877:131;:::i;:::-;48869:139;;48596:419;;;:::o;49021:::-;49187:4;49225:2;49214:9;49210:18;49202:26;;49274:9;49268:4;49264:20;49260:1;49249:9;49245:17;49238:47;49302:131;49428:4;49302:131;:::i;:::-;49294:139;;49021:419;;;:::o;49446:::-;49612:4;49650:2;49639:9;49635:18;49627:26;;49699:9;49693:4;49689:20;49685:1;49674:9;49670:17;49663:47;49727:131;49853:4;49727:131;:::i;:::-;49719:139;;49446:419;;;:::o;49871:::-;50037:4;50075:2;50064:9;50060:18;50052:26;;50124:9;50118:4;50114:20;50110:1;50099:9;50095:17;50088:47;50152:131;50278:4;50152:131;:::i;:::-;50144:139;;49871:419;;;:::o;50296:::-;50462:4;50500:2;50489:9;50485:18;50477:26;;50549:9;50543:4;50539:20;50535:1;50524:9;50520:17;50513:47;50577:131;50703:4;50577:131;:::i;:::-;50569:139;;50296:419;;;:::o;50721:::-;50887:4;50925:2;50914:9;50910:18;50902:26;;50974:9;50968:4;50964:20;50960:1;50949:9;50945:17;50938:47;51002:131;51128:4;51002:131;:::i;:::-;50994:139;;50721:419;;;:::o;51146:::-;51312:4;51350:2;51339:9;51335:18;51327:26;;51399:9;51393:4;51389:20;51385:1;51374:9;51370:17;51363:47;51427:131;51553:4;51427:131;:::i;:::-;51419:139;;51146:419;;;:::o;51571:::-;51737:4;51775:2;51764:9;51760:18;51752:26;;51824:9;51818:4;51814:20;51810:1;51799:9;51795:17;51788:47;51852:131;51978:4;51852:131;:::i;:::-;51844:139;;51571:419;;;:::o;51996:::-;52162:4;52200:2;52189:9;52185:18;52177:26;;52249:9;52243:4;52239:20;52235:1;52224:9;52220:17;52213:47;52277:131;52403:4;52277:131;:::i;:::-;52269:139;;51996:419;;;:::o;52421:::-;52587:4;52625:2;52614:9;52610:18;52602:26;;52674:9;52668:4;52664:20;52660:1;52649:9;52645:17;52638:47;52702:131;52828:4;52702:131;:::i;:::-;52694:139;;52421:419;;;:::o;52846:::-;53012:4;53050:2;53039:9;53035:18;53027:26;;53099:9;53093:4;53089:20;53085:1;53074:9;53070:17;53063:47;53127:131;53253:4;53127:131;:::i;:::-;53119:139;;52846:419;;;:::o;53271:::-;53437:4;53475:2;53464:9;53460:18;53452:26;;53524:9;53518:4;53514:20;53510:1;53499:9;53495:17;53488:47;53552:131;53678:4;53552:131;:::i;:::-;53544:139;;53271:419;;;:::o;53696:::-;53862:4;53900:2;53889:9;53885:18;53877:26;;53949:9;53943:4;53939:20;53935:1;53924:9;53920:17;53913:47;53977:131;54103:4;53977:131;:::i;:::-;53969:139;;53696:419;;;:::o;54121:::-;54287:4;54325:2;54314:9;54310:18;54302:26;;54374:9;54368:4;54364:20;54360:1;54349:9;54345:17;54338:47;54402:131;54528:4;54402:131;:::i;:::-;54394:139;;54121:419;;;:::o;54546:::-;54712:4;54750:2;54739:9;54735:18;54727:26;;54799:9;54793:4;54789:20;54785:1;54774:9;54770:17;54763:47;54827:131;54953:4;54827:131;:::i;:::-;54819:139;;54546:419;;;:::o;54971:::-;55137:4;55175:2;55164:9;55160:18;55152:26;;55224:9;55218:4;55214:20;55210:1;55199:9;55195:17;55188:47;55252:131;55378:4;55252:131;:::i;:::-;55244:139;;54971:419;;;:::o;55396:::-;55562:4;55600:2;55589:9;55585:18;55577:26;;55649:9;55643:4;55639:20;55635:1;55624:9;55620:17;55613:47;55677:131;55803:4;55677:131;:::i;:::-;55669:139;;55396:419;;;:::o;55821:222::-;55914:4;55952:2;55941:9;55937:18;55929:26;;55965:71;56033:1;56022:9;56018:17;56009:6;55965:71;:::i;:::-;55821:222;;;;:::o;56049:129::-;56083:6;56110:20;;:::i;:::-;56100:30;;56139:33;56167:4;56159:6;56139:33;:::i;:::-;56049:129;;;:::o;56184:75::-;56217:6;56250:2;56244:9;56234:19;;56184:75;:::o;56265:311::-;56342:4;56432:18;56424:6;56421:30;56418:56;;;56454:18;;:::i;:::-;56418:56;56504:4;56496:6;56492:17;56484:25;;56564:4;56558;56554:15;56546:23;;56265:311;;;:::o;56582:::-;56659:4;56749:18;56741:6;56738:30;56735:56;;;56771:18;;:::i;:::-;56735:56;56821:4;56813:6;56809:17;56801:25;;56881:4;56875;56871:15;56863:23;;56582:311;;;:::o;56899:310::-;56975:4;57065:18;57057:6;57054:30;57051:56;;;57087:18;;:::i;:::-;57051:56;57137:4;57129:6;57125:17;57117:25;;57197:4;57191;57187:15;57179:23;;56899:310;;;:::o;57215:307::-;57276:4;57366:18;57358:6;57355:30;57352:56;;;57388:18;;:::i;:::-;57352:56;57426:29;57448:6;57426:29;:::i;:::-;57418:37;;57510:4;57504;57500:15;57492:23;;57215:307;;;:::o;57528:308::-;57590:4;57680:18;57672:6;57669:30;57666:56;;;57702:18;;:::i;:::-;57666:56;57740:29;57762:6;57740:29;:::i;:::-;57732:37;;57824:4;57818;57814:15;57806:23;;57528:308;;;:::o;57842:141::-;57891:4;57914:3;57906:11;;57937:3;57934:1;57927:14;57971:4;57968:1;57958:18;57950:26;;57842:141;;;:::o;57989:98::-;58040:6;58074:5;58068:12;58058:22;;57989:98;;;:::o;58093:99::-;58145:6;58179:5;58173:12;58163:22;;58093:99;;;:::o;58198:168::-;58281:11;58315:6;58310:3;58303:19;58355:4;58350:3;58346:14;58331:29;;58198:168;;;;:::o;58372:147::-;58473:11;58510:3;58495:18;;58372:147;;;;:::o;58525:169::-;58609:11;58643:6;58638:3;58631:19;58683:4;58678:3;58674:14;58659:29;;58525:169;;;;:::o;58700:148::-;58802:11;58839:3;58824:18;;58700:148;;;;:::o;58854:305::-;58894:3;58913:20;58931:1;58913:20;:::i;:::-;58908:25;;58947:20;58965:1;58947:20;:::i;:::-;58942:25;;59101:1;59033:66;59029:74;59026:1;59023:81;59020:107;;;59107:18;;:::i;:::-;59020:107;59151:1;59148;59144:9;59137:16;;58854:305;;;;:::o;59165:185::-;59205:1;59222:20;59240:1;59222:20;:::i;:::-;59217:25;;59256:20;59274:1;59256:20;:::i;:::-;59251:25;;59295:1;59285:35;;59300:18;;:::i;:::-;59285:35;59342:1;59339;59335:9;59330:14;;59165:185;;;;:::o;59356:348::-;59396:7;59419:20;59437:1;59419:20;:::i;:::-;59414:25;;59453:20;59471:1;59453:20;:::i;:::-;59448:25;;59641:1;59573:66;59569:74;59566:1;59563:81;59558:1;59551:9;59544:17;59540:105;59537:131;;;59648:18;;:::i;:::-;59537:131;59696:1;59693;59689:9;59678:20;;59356:348;;;;:::o;59710:191::-;59750:4;59770:20;59788:1;59770:20;:::i;:::-;59765:25;;59804:20;59822:1;59804:20;:::i;:::-;59799:25;;59843:1;59840;59837:8;59834:34;;;59848:18;;:::i;:::-;59834:34;59893:1;59890;59886:9;59878:17;;59710:191;;;;:::o;59907:96::-;59944:7;59973:24;59991:5;59973:24;:::i;:::-;59962:35;;59907:96;;;:::o;60009:90::-;60043:7;60086:5;60079:13;60072:21;60061:32;;60009:90;;;:::o;60105:77::-;60142:7;60171:5;60160:16;;60105:77;;;:::o;60188:149::-;60224:7;60264:66;60257:5;60253:78;60242:89;;60188:149;;;:::o;60343:126::-;60380:7;60420:42;60413:5;60409:54;60398:65;;60343:126;;;:::o;60475:77::-;60512:7;60541:5;60530:16;;60475:77;;;:::o;60558:86::-;60593:7;60633:4;60626:5;60622:16;60611:27;;60558:86;;;:::o;60650:109::-;60686:7;60726:26;60719:5;60715:38;60704:49;;60650:109;;;:::o;60765:154::-;60849:6;60844:3;60839;60826:30;60911:1;60902:6;60897:3;60893:16;60886:27;60765:154;;;:::o;60925:307::-;60993:1;61003:113;61017:6;61014:1;61011:13;61003:113;;;61102:1;61097:3;61093:11;61087:18;61083:1;61078:3;61074:11;61067:39;61039:2;61036:1;61032:10;61027:15;;61003:113;;;61134:6;61131:1;61128:13;61125:101;;;61214:1;61205:6;61200:3;61196:16;61189:27;61125:101;60974:258;60925:307;;;:::o;61238:171::-;61277:3;61300:24;61318:5;61300:24;:::i;:::-;61291:33;;61346:4;61339:5;61336:15;61333:41;;;61354:18;;:::i;:::-;61333:41;61401:1;61394:5;61390:13;61383:20;;61238:171;;;:::o;61415:320::-;61459:6;61496:1;61490:4;61486:12;61476:22;;61543:1;61537:4;61533:12;61564:18;61554:81;;61620:4;61612:6;61608:17;61598:27;;61554:81;61682:2;61674:6;61671:14;61651:18;61648:38;61645:84;;;61701:18;;:::i;:::-;61645:84;61466:269;61415:320;;;:::o;61741:281::-;61824:27;61846:4;61824:27;:::i;:::-;61816:6;61812:40;61954:6;61942:10;61939:22;61918:18;61906:10;61903:34;61900:62;61897:88;;;61965:18;;:::i;:::-;61897:88;62005:10;62001:2;61994:22;61784:238;61741:281;;:::o;62028:233::-;62067:3;62090:24;62108:5;62090:24;:::i;:::-;62081:33;;62136:66;62129:5;62126:77;62123:103;;;62206:18;;:::i;:::-;62123:103;62253:1;62246:5;62242:13;62235:20;;62028:233;;;:::o;62267:176::-;62299:1;62316:20;62334:1;62316:20;:::i;:::-;62311:25;;62350:20;62368:1;62350:20;:::i;:::-;62345:25;;62389:1;62379:35;;62394:18;;:::i;:::-;62379:35;62435:1;62432;62428:9;62423:14;;62267:176;;;;:::o;62449:180::-;62497:77;62494:1;62487:88;62594:4;62591:1;62584:15;62618:4;62615:1;62608:15;62635:180;62683:77;62680:1;62673:88;62780:4;62777:1;62770:15;62804:4;62801:1;62794:15;62821:180;62869:77;62866:1;62859:88;62966:4;62963:1;62956:15;62990:4;62987:1;62980:15;63007:180;63055:77;63052:1;63045:88;63152:4;63149:1;63142:15;63176:4;63173:1;63166:15;63193:180;63241:77;63238:1;63231:88;63338:4;63335:1;63328:15;63362:4;63359:1;63352:15;63379:180;63427:77;63424:1;63417:88;63524:4;63521:1;63514:15;63548:4;63545:1;63538:15;63565:117;63674:1;63671;63664:12;63688:117;63797:1;63794;63787:12;63811:117;63920:1;63917;63910:12;63934:117;64043:1;64040;64033:12;64057:117;64166:1;64163;64156:12;64180:102;64221:6;64272:2;64268:7;64263:2;64256:5;64252:14;64248:28;64238:38;;64180:102;;;:::o;64288:182::-;64428:34;64424:1;64416:6;64412:14;64405:58;64288:182;:::o;64476:176::-;64616:28;64612:1;64604:6;64600:14;64593:52;64476:176;:::o;64658:237::-;64798:34;64794:1;64786:6;64782:14;64775:58;64867:20;64862:2;64854:6;64850:15;64843:45;64658:237;:::o;64901:225::-;65041:34;65037:1;65029:6;65025:14;65018:58;65110:8;65105:2;65097:6;65093:15;65086:33;64901:225;:::o;65132:180::-;65272:32;65268:1;65260:6;65256:14;65249:56;65132:180;:::o;65318:178::-;65458:30;65454:1;65446:6;65442:14;65435:54;65318:178;:::o;65502:227::-;65642:34;65638:1;65630:6;65626:14;65619:58;65711:10;65706:2;65698:6;65694:15;65687:35;65502:227;:::o;65735:223::-;65875:34;65871:1;65863:6;65859:14;65852:58;65944:6;65939:2;65931:6;65927:15;65920:31;65735:223;:::o;65964:175::-;66104:27;66100:1;66092:6;66088:14;66081:51;65964:175;:::o;66145:177::-;66285:29;66281:1;66273:6;66269:14;66262:53;66145:177;:::o;66328:231::-;66468:34;66464:1;66456:6;66452:14;66445:58;66537:14;66532:2;66524:6;66520:15;66513:39;66328:231;:::o;66565:174::-;66705:26;66701:1;66693:6;66689:14;66682:50;66565:174;:::o;66745:243::-;66885:34;66881:1;66873:6;66869:14;66862:58;66954:26;66949:2;66941:6;66937:15;66930:51;66745:243;:::o;66994:170::-;67134:22;67130:1;67122:6;67118:14;67111:46;66994:170;:::o;67170:229::-;67310:34;67306:1;67298:6;67294:14;67287:58;67379:12;67374:2;67366:6;67362:15;67355:37;67170:229;:::o;67405:228::-;67545:34;67541:1;67533:6;67529:14;67522:58;67614:11;67609:2;67601:6;67597:15;67590:36;67405:228;:::o;67639:175::-;67779:27;67775:1;67767:6;67763:14;67756:51;67639:175;:::o;67820:182::-;67960:34;67956:1;67948:6;67944:14;67937:58;67820:182;:::o;68008:231::-;68148:34;68144:1;68136:6;68132:14;68125:58;68217:14;68212:2;68204:6;68200:15;68193:39;68008:231;:::o;68245:180::-;68385:32;68381:1;68373:6;68369:14;68362:56;68245:180;:::o;68431:182::-;68571:34;68567:1;68559:6;68555:14;68548:58;68431:182;:::o;68619:223::-;68759:34;68755:1;68747:6;68743:14;68736:58;68828:6;68823:2;68815:6;68811:15;68804:31;68619:223;:::o;68848:228::-;68988:34;68984:1;68976:6;68972:14;68965:58;69057:11;69052:2;69044:6;69040:15;69033:36;68848:228;:::o;69082:234::-;69222:34;69218:1;69210:6;69206:14;69199:58;69291:17;69286:2;69278:6;69274:15;69267:42;69082:234;:::o;69322:173::-;69462:25;69458:1;69450:6;69446:14;69439:49;69322:173;:::o;69501:::-;69641:25;69637:1;69629:6;69625:14;69618:49;69501:173;:::o;69680:177::-;69820:29;69816:1;69808:6;69804:14;69797:53;69680:177;:::o;69863:175::-;70003:27;69999:1;69991:6;69987:14;69980:51;69863:175;:::o;70044:220::-;70184:34;70180:1;70172:6;70168:14;70161:58;70253:3;70248:2;70240:6;70236:15;70229:28;70044:220;:::o;70270:232::-;70410:34;70406:1;70398:6;70394:14;70387:58;70483:7;70478:2;70470:6;70466:15;70459:32;70270:232;:::o;70512:184::-;70656:28;70652:1;70644:6;70640:14;70633:52;70512:184;:::o;70706:118::-;;:::o;70834:248::-;70978:34;70974:1;70966:6;70962:14;70955:58;71051:19;71046:2;71038:6;71034:15;71027:44;70834:248;:::o;71092:246::-;71236:34;71232:1;71224:6;71220:14;71213:58;71309:17;71304:2;71296:6;71292:15;71285:42;71092:246;:::o;71348:181::-;71492:25;71488:1;71480:6;71476:14;71469:49;71348:181;:::o;71539:::-;71683:25;71679:1;71671:6;71667:14;71660:49;71539:181;:::o;71730:185::-;71874:29;71870:1;71862:6;71858:14;71851:53;71730:185;:::o;71925:175::-;72069:19;72065:1;72057:6;72053:14;72046:43;71925:175;:::o;72110:176::-;72254:20;72250:1;72242:6;72238:14;72231:44;72110:176;:::o;72296:246::-;72440:34;72436:1;72428:6;72424:14;72417:58;72513:17;72508:2;72500:6;72496:15;72489:42;72296:246;:::o;72552:130::-;72629:24;72647:5;72629:24;:::i;:::-;72622:5;72619:35;72609:63;;72668:1;72665;72658:12;72609:63;72552:130;:::o;72692:124::-;72766:21;72781:5;72766:21;:::i;:::-;72759:5;72756:32;72746:60;;72802:1;72799;72792:12;72746:60;72692:124;:::o;72826:130::-;72903:24;72921:5;72903:24;:::i;:::-;72896:5;72893:35;72883:63;;72942:1;72939;72932:12;72883:63;72826:130;:::o;72966:128::-;73042:23;73059:5;73042:23;:::i;:::-;73035:5;73032:34;73022:62;;73080:1;73077;73070:12;73022:62;72966:128;:::o;73104:130::-;73181:24;73199:5;73181:24;:::i;:::-;73174:5;73171:35;73161:63;;73220:1;73217;73210:12;73161:63;73104:130;:::o;73244:128::-;73320:23;73337:5;73320:23;:::i;:::-;73313:5;73310:34;73300:62;;73358:1;73355;73348:12;73300:62;73244:128;:::o

Swarm Source

ipfs://535e90bf952804a6c096e8453bd3fd7c9739a2f639478fd61f33854fe17b7d57
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.