Polygon Sponsored slots available. Book your slot here!
More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 124,182 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Safe Transfer Fr... | 70606242 | 26 hrs ago | IN | 0 POL | 0.00279365 | ||||
Safe Transfer Fr... | 70565620 | 2 days ago | IN | 0 POL | 0.0041334 | ||||
Set Approval For... | 70381885 | 6 days ago | IN | 0 POL | 0.00140034 | ||||
Set Approval For... | 70283910 | 9 days ago | IN | 0 POL | 0.00089196 | ||||
Set Approval For... | 70283884 | 9 days ago | IN | 0 POL | 0.00089203 | ||||
Safe Transfer Fr... | 70255742 | 9 days ago | IN | 0 POL | 0.00327128 | ||||
Set Approval For... | 70229784 | 10 days ago | IN | 0 POL | 0.00140034 | ||||
Set Approval For... | 70217819 | 10 days ago | IN | 0 POL | 0.00140034 | ||||
Set Approval For... | 70217622 | 10 days ago | IN | 0 POL | 0.00140034 | ||||
Safe Transfer Fr... | 70217427 | 10 days ago | IN | 0 POL | 0.002733 | ||||
Set Approval For... | 70159704 | 12 days ago | IN | 0 POL | 0.0023339 | ||||
Set Approval For... | 70133217 | 12 days ago | IN | 0 POL | 0.00193037 | ||||
Set Approval For... | 70128579 | 12 days ago | IN | 0 POL | 0.00074298 | ||||
Set Approval For... | 70118060 | 13 days ago | IN | 0 POL | 0.00140034 | ||||
Safe Transfer Fr... | 70107208 | 13 days ago | IN | 0 POL | 0.00270546 | ||||
Safe Transfer Fr... | 70075886 | 14 days ago | IN | 0 POL | 0.01136662 | ||||
Safe Transfer Fr... | 70075042 | 14 days ago | IN | 0 POL | 0.00270364 | ||||
Transfer From | 70074783 | 14 days ago | IN | 0 POL | 0.00261711 | ||||
Set Approval For... | 69952486 | 17 days ago | IN | 0 POL | 0.00160323 | ||||
Safe Transfer Fr... | 69952486 | 17 days ago | IN | 0 POL | 0.00312898 | ||||
Set Approval For... | 69929933 | 17 days ago | IN | 0 POL | 0.00136008 | ||||
Safe Transfer Fr... | 69831093 | 20 days ago | IN | 0 POL | 0.00273403 | ||||
Safe Transfer Fr... | 69792695 | 21 days ago | IN | 0 POL | 0.002733 | ||||
Set Approval For... | 69717926 | 23 days ago | IN | 0 POL | 0.00145612 | ||||
Set Approval For... | 69600593 | 25 days ago | IN | 0 POL | 0.00175976 |
Loading...
Loading
Contract Name:
Bumpkin
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at polygonscan.com on 2022-12-22 */ // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: contracts/GameOwner.sol pragma solidity ^0.8.0; contract GameOwner is Ownable { mapping(address => bool) public gameRoles; function addGameRole(address _game) public onlyOwner { gameRoles[_game] = true; } function gameAddGameRole(address _game) public onlyGame { gameRoles[_game] = true; } function gameRemoveGameRole(address _game) public onlyGame { gameRoles[_game] = false; } function removeGameRole(address _game) public onlyOwner { gameRoles[_game] = false; } modifier onlyGame() { require(gameRoles[_msgSender()] == true, "You are not the game"); _; } } // File: @openzeppelin/contracts/security/Pausable.sol // OpenZeppelin Contracts v4.4.1 (security/Pausable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { require(!paused(), "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { require(paused(), "Pausable: not paused"); _; } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/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/token/common/ERC2981.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/common/ERC2981.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information. * * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first. * * Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the * fee is specified in basis points by default. * * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported. * * _Available since v4.5._ */ abstract contract ERC2981 is IERC2981, ERC165 { struct RoyaltyInfo { address receiver; uint96 royaltyFraction; } RoyaltyInfo private _defaultRoyaltyInfo; mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC165) returns (bool) { return interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId); } /** * @inheritdoc IERC2981 */ function royaltyInfo(uint256 _tokenId, uint256 _salePrice) external view virtual override returns (address, uint256) { RoyaltyInfo memory royalty = _tokenRoyaltyInfo[_tokenId]; if (royalty.receiver == address(0)) { royalty = _defaultRoyaltyInfo; } uint256 royaltyAmount = (_salePrice * royalty.royaltyFraction) / _feeDenominator(); return (royalty.receiver, royaltyAmount); } /** * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an * override. */ function _feeDenominator() internal pure virtual returns (uint96) { return 10000; } /** * @dev Sets the royalty information that all ids in this contract will default to. * * Requirements: * * - `receiver` cannot be the zero address. * - `feeNumerator` cannot be greater than the fee denominator. */ function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual { require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice"); require(receiver != address(0), "ERC2981: invalid receiver"); _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator); } /** * @dev Removes default royalty information. */ function _deleteDefaultRoyalty() internal virtual { delete _defaultRoyaltyInfo; } /** * @dev Sets the royalty information for a specific token id, overriding the global default. * * Requirements: * * - `tokenId` must be already minted. * - `receiver` cannot be the zero address. * - `feeNumerator` cannot be greater than the fee denominator. */ function _setTokenRoyalty( uint256 tokenId, address receiver, uint96 feeNumerator ) internal virtual { require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice"); require(receiver != address(0), "ERC2981: Invalid parameters"); _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator); } /** * @dev Resets royalty information for the token id back to the global default. */ function _resetTokenRoyalty(uint256 tokenId) internal virtual { delete _tokenRoyaltyInfo[tokenId]; } } // 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/IERC721Enumerable.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol // 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/token/ERC721/ERC721.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _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 Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(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); _afterTokenTransfer(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 from incorrect owner"); 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); _afterTokenTransfer(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 {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } // File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Royalty.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/ERC721Royalty.sol) pragma solidity ^0.8.0; /** * @dev Extension of ERC721 with the ERC2981 NFT Royalty Standard, a standardized way to retrieve royalty payment * information. * * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first. * * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported. * * _Available since v4.5._ */ abstract contract ERC721Royalty is ERC2981, ERC721 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721, ERC2981) returns (bool) { return super.supportsInterface(interfaceId); } /** * @dev See {ERC721-_burn}. This override additionally clears the royalty information for the token. */ function _burn(uint256 tokenId) internal virtual override { super._burn(tokenId); _resetTokenRoyalty(tokenId); } } // File: @openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721URIStorage.sol) pragma solidity ^0.8.0; /** * @dev ERC721 token with storage based token URI management. */ abstract contract ERC721URIStorage is ERC721 { using Strings for uint256; // Optional mapping for token URIs mapping(uint256 => string) private _tokenURIs; /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721URIStorage: URI query for nonexistent token"); string memory _tokenURI = _tokenURIs[tokenId]; string memory base = _baseURI(); // If there is no base URI, return the token URI. if (bytes(base).length == 0) { return _tokenURI; } // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked). if (bytes(_tokenURI).length > 0) { return string(abi.encodePacked(base, _tokenURI)); } return super.tokenURI(tokenId); } /** * @dev Sets `_tokenURI` as the tokenURI of `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual { require(_exists(tokenId), "ERC721URIStorage: URI set of nonexistent token"); _tokenURIs[tokenId] = _tokenURI; } /** * @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 override { super._burn(tokenId); if (bytes(_tokenURIs[tokenId]).length != 0) { delete _tokenURIs[tokenId]; } } } // File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Pausable.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Pausable.sol) pragma solidity ^0.8.0; /** * @dev ERC721 token with pausable token transfers, minting and burning. * * Useful for scenarios such as preventing trades until the end of an evaluation * period, or having an emergency switch for freezing all token transfers in the * event of a large bug. */ abstract contract ERC721Pausable is ERC721, Pausable { /** * @dev See {ERC721-_beforeTokenTransfer}. * * Requirements: * * - the contract must not be paused. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); require(!paused(), "ERC721Pausable: token transfer while paused"); } } // File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } // File: contracts/Bumpkin.sol pragma solidity ^0.8.0; /** * Data Storage contract for Bumpkin NFTs * Refer to metadata endpoint for licence details */ contract Bumpkin is ERC721Enumerable, ERC721Pausable, ERC721URIStorage, ERC721Royalty, GameOwner { string baseURI; uint256 public id = 0; event SetTokenURI(uint256 indexed tokenId, string tokenURI); constructor( string memory initialBaseURI, address royaltyReceiver, uint96 royaltyFeeNumerator ) ERC721("Bumpkin", "BK") { baseURI = initialBaseURI; _setDefaultRoyalty(royaltyReceiver, royaltyFeeNumerator); addGameRole(_msgSender()); } function _baseURI() internal view override returns (string memory) { return baseURI; } function setBaseURI(string memory uri) external onlyGame { baseURI = uri; } function tokenURI(uint256 tokenId) public view virtual override(ERC721, ERC721URIStorage) returns (string memory) { return super.tokenURI(tokenId); } function setTokenURI(uint256 tokenId, string memory _tokenURI) external onlyGame { _setTokenURI(tokenId, _tokenURI); emit SetTokenURI(tokenId, _tokenURI); } function gameMint(address account) external onlyGame returns (uint256) { uint256 tokenId = ++id; _safeMint(account, tokenId); return tokenId; } function gameTransfer( address from, address to, uint256 tokenId ) external onlyGame { _safeTransfer(from, to, tokenId, ""); } function gameBurn(uint256 tokenId) external onlyGame { _burn(tokenId); } function gameApprove(address to, uint256 tokenId) external onlyGame { _approve(to, tokenId); } function _burn(uint256 tokenId) internal virtual override(ERC721, ERC721URIStorage, ERC721Royalty) { super._burn(tokenId); } function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal override(ERC721, ERC721Enumerable, ERC721Pausable) { super._beforeTokenTransfer(from, to, tokenId); } function supportsInterface(bytes4 interfaceId) public view override(ERC721, ERC721Enumerable, ERC721Royalty) returns (bool) { return super.supportsInterface(interfaceId); } function pause() external onlyGame { _pause(); } function unpause() external onlyGame { _unpause(); } function setDefaultRoyalty(address receiver, uint96 feeNumerator) external onlyGame { _setDefaultRoyalty(receiver, feeNumerator); } function deleteDefaultRoyalty() external onlyGame { _deleteDefaultRoyalty(); } function setTokenRoyaltyBatch( uint256[] memory tokenIds, address[] memory receivers, uint96[] memory feeNumerators ) external onlyGame { require( tokenIds.length == receivers.length && receivers.length == feeNumerators.length, "Bumpkin: Length mismatch" ); for (uint256 i = 0; i < tokenIds.length; i++) { _setTokenRoyalty(tokenIds[i], receivers[i], feeNumerators[i]); } } function resetTokenRoyaltyBatch(uint256[] memory tokenIds) external onlyGame { for (uint256 i = 0; i < tokenIds.length; i++) { _resetTokenRoyalty(tokenIds[i]); } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"string","name":"initialBaseURI","type":"string"},{"internalType":"address","name":"royaltyReceiver","type":"address"},{"internalType":"uint96","name":"royaltyFeeNumerator","type":"uint96"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"string","name":"tokenURI","type":"string"}],"name":"SetTokenURI","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[{"internalType":"address","name":"_game","type":"address"}],"name":"addGameRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deleteDefaultRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_game","type":"address"}],"name":"gameAddGameRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"gameApprove","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"gameBurn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"gameMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_game","type":"address"}],"name":"gameRemoveGameRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"gameRoles","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"gameTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"id","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_game","type":"address"}],"name":"removeGameRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"resetTokenRoyaltyBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"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":"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":"uri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint96","name":"feeNumerator","type":"uint96"}],"name":"setDefaultRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"address[]","name":"receivers","type":"address[]"},{"internalType":"uint96[]","name":"feeNumerators","type":"uint96[]"}],"name":"setTokenRoyaltyBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"_tokenURI","type":"string"}],"name":"setTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405260006011553480156200001657600080fd5b50604051620065243803806200652483398181016040528101906200003c919062000656565b6040518060400160405280600781526020017f42756d706b696e000000000000000000000000000000000000000000000000008152506040518060400160405280600281526020017f424b0000000000000000000000000000000000000000000000000000000000008152508160029080519060200190620000c0929190620004fa565b508060039080519060200190620000d9929190620004fa565b5050506000600c60006101000a81548160ff021916908315150217905550620001176200010b6200016b60201b60201c565b6200017360201b60201c565b82601090805190602001906200012f929190620004fa565b506200014282826200023960201b60201c565b62000162620001566200016b60201b60201c565b620003dc60201b60201c565b50505062000a62565b600033905090565b6000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b62000249620004c660201b60201c565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff161115620002aa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002a19062000768565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156200031d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000314906200078a565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff168152506000808201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b620003ec6200016b60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1662000412620004d060201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16146200046b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004629062000746565b60405180910390fd5b6001600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6000612710905090565b6000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b82805462000508906200089e565b90600052602060002090601f0160209004810192826200052c576000855562000578565b82601f106200054757805160ff191683800117855562000578565b8280016001018555821562000578579182015b82811115620005775782518255916020019190600101906200055a565b5b5090506200058791906200058b565b5090565b5b80821115620005a65760008160009055506001016200058c565b5090565b6000620005c1620005bb84620007d5565b620007ac565b905082815260208101848484011115620005e057620005df6200096d565b5b620005ed84828562000868565b509392505050565b600081519050620006068162000a2e565b92915050565b600082601f83011262000624576200062362000968565b5b815162000636848260208601620005aa565b91505092915050565b600081519050620006508162000a48565b92915050565b60008060006060848603121562000672576200067162000977565b5b600084015167ffffffffffffffff81111562000693576200069262000972565b5b620006a1868287016200060c565b9350506020620006b486828701620005f5565b9250506040620006c7868287016200063f565b9150509250925092565b6000620006e06020836200080b565b9150620006ed826200098d565b602082019050919050565b600062000707602a836200080b565b91506200071482620009b6565b604082019050919050565b60006200072e6019836200080b565b91506200073b8262000a05565b602082019050919050565b600060208201905081810360008301526200076181620006d1565b9050919050565b600060208201905081810360008301526200078381620006f8565b9050919050565b60006020820190508181036000830152620007a5816200071f565b9050919050565b6000620007b8620007cb565b9050620007c68282620008d4565b919050565b6000604051905090565b600067ffffffffffffffff821115620007f357620007f262000939565b5b620007fe826200097c565b9050602081019050919050565b600082825260208201905092915050565b6000620008298262000830565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006bffffffffffffffffffffffff82169050919050565b60005b83811015620008885780820151818401526020810190506200086b565b8381111562000898576000848401525b50505050565b60006002820490506001821680620008b757607f821691505b60208210811415620008ce57620008cd6200090a565b5b50919050565b620008df826200097c565b810181811067ffffffffffffffff8211171562000901576200090062000939565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b62000a39816200081c565b811462000a4557600080fd5b50565b62000a538162000850565b811462000a5f57600080fd5b50565b615ab28062000a726000396000f3fe608060405234801561001057600080fd5b506004361061023d5760003560e01c806362252bc31161013b578063a8a99ce8116100b8578063c87b56dd1161007c578063c87b56dd14610673578063d2afae2a146106a3578063e985e9c5146106bf578063f027853d146106ef578063f2fde38b1461070b5761023d565b8063a8a99ce8146105f7578063aa1b103f14610613578063af640d0f1461061d578063b35f51ad1461063b578063b88d4fde146106575761023d565b806383dd4700116100ff57806383dd4700146105655780638456cb59146105955780638da5cb5b1461059f57806395d89b41146105bd578063a22cb465146105db5761023d565b806362252bc3146104c35780636352211e146104df57806370a082311461050f578063715018a61461053f5780637323b8fa146105495761023d565b806323b872dd116101c957806342842e0e1161018d57806342842e0e1461040d5780634b354ecf146104295780634f6ccce71461045957806355f804b3146104895780635c975abb146104a55761023d565b806323b872dd1461036a578063266fb15f146103865780632a55205a146103a25780632f745c59146103d35780633f4ba83a146104035761023d565b8063095ea7b311610210578063095ea7b3146102dc578063162094c4146102f857806318160ddd1461031457806319892b51146103325780632348c8321461034e5761023d565b806301ffc9a71461024257806304634d8d1461027257806306fdde031461028e578063081812fc146102ac575b600080fd5b61025c600480360381019061025791906142f3565b610727565b60405161026991906149b7565b60405180910390f35b61028c600480360381019061028791906141c3565b610739565b005b6102966107e1565b6040516102a391906149d2565b60405180910390f35b6102c660048036038101906102c19190614396565b610873565b6040516102d39190614927565b60405180910390f35b6102f660048036038101906102f19190614183565b6108f8565b005b610312600480360381019061030d91906143c3565b610a10565b005b61031c610af0565b6040516103299190614d74565b60405180910390f35b61034c60048036038101906103479190614000565b610afd565b005b61036860048036038101906103639190614000565b610bd4565b005b610384600480360381019061037f919061406d565b610cc9565b005b6103a0600480360381019061039b919061424c565b610d29565b005b6103bc60048036038101906103b7919061441f565b610e92565b6040516103ca92919061498e565b60405180910390f35b6103ed60048036038101906103e89190614183565b61107d565b6040516103fa9190614d74565b60405180910390f35b61040b611122565b005b6104276004803603810190610422919061406d565b6111c6565b005b610443600480360381019061043e9190614000565b6111e6565b60405161045091906149b7565b60405180910390f35b610473600480360381019061046e9190614396565b611206565b6040516104809190614d74565b60405180910390f35b6104a3600480360381019061049e919061434d565b611277565b005b6104ad61132b565b6040516104ba91906149b7565b60405180910390f35b6104dd60048036038101906104d8919061406d565b611342565b005b6104f960048036038101906104f49190614396565b6113fc565b6040516105069190614927565b60405180910390f35b61052960048036038101906105249190614000565b6114ae565b6040516105369190614d74565b60405180910390f35b610547611566565b005b610563600480360381019061055e9190614000565b6115ee565b005b61057f600480360381019061057a9190614000565b6116c5565b60405161058c9190614d74565b60405180910390f35b61059d61178d565b005b6105a7611831565b6040516105b49190614927565b60405180910390f35b6105c561185b565b6040516105d291906149d2565b60405180910390f35b6105f560048036038101906105f09190614143565b6118ed565b005b610611600480360381019061060c9190614183565b611903565b005b61061b6119ab565b005b610625611a4f565b6040516106329190614d74565b60405180910390f35b61065560048036038101906106509190614000565b611a55565b005b610671600480360381019061066c91906140c0565b611b4a565b005b61068d60048036038101906106889190614396565b611bac565b60405161069a91906149d2565b60405180910390f35b6106bd60048036038101906106b89190614203565b611bbe565b005b6106d960048036038101906106d4919061402d565b611c9e565b6040516106e691906149b7565b60405180910390f35b61070960048036038101906107049190614396565b611d32565b005b61072560048036038101906107209190614000565b611dd8565b005b600061073282611ed0565b9050919050565b60011515600f6000610749611ee2565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515146107d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107ca90614b34565b60405180910390fd5b6107dd8282611eea565b5050565b6060600280546107f0906150c0565b80601f016020809104026020016040519081016040528092919081815260200182805461081c906150c0565b80156108695780601f1061083e57610100808354040283529160200191610869565b820191906000526020600020905b81548152906001019060200180831161084c57829003601f168201915b5050505050905090565b600061087e8261207f565b6108bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108b490614c54565b60405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610903826113fc565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610974576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161096b90614cb4565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610993611ee2565b73ffffffffffffffffffffffffffffffffffffffff1614806109c257506109c1816109bc611ee2565b611c9e565b5b610a01576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109f890614b74565b60405180910390fd5b610a0b83836120eb565b505050565b60011515600f6000610a20611ee2565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514610aaa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aa190614b34565b60405180910390fd5b610ab482826121a4565b817fd2d827dddfc9c9a02afc5fc68d3251684b36e213a7999ebd90a861f25df4077e82604051610ae491906149d2565b60405180910390a25050565b6000600a80549050905090565b610b05611ee2565b73ffffffffffffffffffffffffffffffffffffffff16610b23611831565b73ffffffffffffffffffffffffffffffffffffffff1614610b79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7090614c74565b60405180910390fd5b6000600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b60011515600f6000610be4611ee2565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514610c6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6590614b34565b60405180910390fd5b6001600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b610cda610cd4611ee2565b82612218565b610d19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1090614cd4565b60405180910390fd5b610d248383836122f6565b505050565b60011515600f6000610d39611ee2565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514610dc3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dba90614b34565b60405180910390fd5b81518351148015610dd5575080518251145b610e14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0b90614bf4565b60405180910390fd5b60005b8351811015610e8c57610e79848281518110610e3657610e35615259565b5b6020026020010151848381518110610e5157610e50615259565b5b6020026020010151848481518110610e6c57610e6b615259565b5b602002602001015161255d565b8080610e8490615123565b915050610e17565b50505050565b6000806000600160008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614156110285760006040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b6000611032612705565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff168661105e9190614f64565b6110689190614f33565b90508160000151819350935050509250929050565b6000611088836114ae565b82106110c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c090614a34565b60405180910390fd5b600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b60011515600f6000611132611ee2565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515146111bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b390614b34565b60405180910390fd5b6111c461270f565b565b6111e183838360405180602001604052806000815250611b4a565b505050565b600f6020528060005260406000206000915054906101000a900460ff1681565b6000611210610af0565b8210611251576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124890614d14565b60405180910390fd5b600a828154811061126557611264615259565b5b90600052602060002001549050919050565b60011515600f6000611287611ee2565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514611311576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130890614b34565b60405180910390fd5b8060109080519060200190611327929190613be5565b5050565b6000600c60009054906101000a900460ff16905090565b60011515600f6000611352611ee2565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515146113dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d390614b34565b60405180910390fd5b6113f7838383604051806020016040528060008152506127b1565b505050565b6000806004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156114a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149c90614bb4565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561151f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151690614b94565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61156e611ee2565b73ffffffffffffffffffffffffffffffffffffffff1661158c611831565b73ffffffffffffffffffffffffffffffffffffffff16146115e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d990614c74565b60405180910390fd5b6115ec600061280d565b565b6115f6611ee2565b73ffffffffffffffffffffffffffffffffffffffff16611614611831565b73ffffffffffffffffffffffffffffffffffffffff161461166a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166190614c74565b60405180910390fd5b6001600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600060011515600f60006116d7611ee2565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514611761576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175890614b34565b60405180910390fd5b600060116000815461177290615123565b919050819055905061178483826128d3565b80915050919050565b60011515600f600061179d611ee2565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514611827576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181e90614b34565b60405180910390fd5b61182f6128f1565b565b6000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606003805461186a906150c0565b80601f0160208091040260200160405190810160405280929190818152602001828054611896906150c0565b80156118e35780601f106118b8576101008083540402835291602001916118e3565b820191906000526020600020905b8154815290600101906020018083116118c657829003601f168201915b5050505050905090565b6118ff6118f8611ee2565b8383612994565b5050565b60011515600f6000611913611ee2565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615151461199d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199490614b34565b60405180910390fd5b6119a782826120eb565b5050565b60011515600f60006119bb611ee2565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514611a45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3c90614b34565b60405180910390fd5b611a4d612b01565b565b60115481565b60011515600f6000611a65611ee2565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514611aef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ae690614b34565b60405180910390fd5b6000600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b611b5b611b55611ee2565b83612218565b611b9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9190614cd4565b60405180910390fd5b611ba6848484846127b1565b50505050565b6060611bb782612b4e565b9050919050565b60011515600f6000611bce611ee2565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514611c58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4f90614b34565b60405180910390fd5b60005b8151811015611c9a57611c87828281518110611c7a57611c79615259565b5b6020026020010151612ca0565b8080611c9290615123565b915050611c5b565b5050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60011515600f6000611d42611ee2565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514611dcc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dc390614b34565b60405180910390fd5b611dd581612cff565b50565b611de0611ee2565b73ffffffffffffffffffffffffffffffffffffffff16611dfe611831565b73ffffffffffffffffffffffffffffffffffffffff1614611e54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4b90614c74565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611ec4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ebb90614a74565b60405180910390fd5b611ecd8161280d565b50565b6000611edb82612d0b565b9050919050565b600033905090565b611ef2612705565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff161115611f50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f4790614d34565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611fc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fb790614d54565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff168152506000808201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b60008073ffffffffffffffffffffffffffffffffffffffff166004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816006600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661215e836113fc565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6121ad8261207f565b6121ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121e390614bd4565b60405180910390fd5b80600d60008481526020019081526020016000209080519060200190612213929190613be5565b505050565b60006122238261207f565b612262576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161225990614b14565b60405180910390fd5b600061226d836113fc565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806122dc57508373ffffffffffffffffffffffffffffffffffffffff166122c484610873565b73ffffffffffffffffffffffffffffffffffffffff16145b806122ed57506122ec8185611c9e565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612316826113fc565b73ffffffffffffffffffffffffffffffffffffffff161461236c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161236390614a94565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156123dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123d390614ad4565b60405180910390fd5b6123e7838383612d85565b6123f26000826120eb565b6001600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124429190614fbe565b925050819055506001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124999190614edd565b92505081905550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612558838383612d95565b505050565b612565612705565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff1611156125c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125ba90614d34565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612633576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161262a90614cf4565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff168152506001600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff160217905550905050505050565b6000612710905090565b61271761132b565b612756576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161274d90614a14565b60405180910390fd5b6000600c60006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa61279a611ee2565b6040516127a79190614927565b60405180910390a1565b6127bc8484846122f6565b6127c884848484612d9a565b612807576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127fe90614a54565b60405180910390fd5b50505050565b6000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6128ed828260405180602001604052806000815250612f31565b5050565b6128f961132b565b15612939576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161293090614b54565b60405180910390fd5b6001600c60006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861297d611ee2565b60405161298a9190614927565b60405180910390a1565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612a03576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129fa90614af4565b60405180910390fd5b80600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612af491906149b7565b60405180910390a3505050565b6000806000820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556000820160146101000a8154906bffffffffffffffffffffffff02191690555050565b6060612b598261207f565b612b98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b8f90614c34565b60405180910390fd5b6000600d60008481526020019081526020016000208054612bb8906150c0565b80601f0160208091040260200160405190810160405280929190818152602001828054612be4906150c0565b8015612c315780601f10612c0657610100808354040283529160200191612c31565b820191906000526020600020905b815481529060010190602001808311612c1457829003601f168201915b505050505090506000612c42612f8c565b9050600081511415612c58578192505050612c9b565b600082511115612c8d578082604051602001612c75929190614903565b60405160208183030381529060405292505050612c9b565b612c968461301e565b925050505b919050565b60016000828152602001908152602001600020600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556000820160146101000a8154906bffffffffffffffffffffffff0219169055505050565b612d08816130c5565b50565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612d7e5750612d7d826130da565b5b9050919050565b612d908383836131bc565b505050565b505050565b6000612dbb8473ffffffffffffffffffffffffffffffffffffffff16613214565b15612f24578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612de4611ee2565b8786866040518563ffffffff1660e01b8152600401612e069493929190614942565b602060405180830381600087803b158015612e2057600080fd5b505af1925050508015612e5157506040513d601f19601f82011682018060405250810190612e4e9190614320565b60015b612ed4573d8060008114612e81576040519150601f19603f3d011682016040523d82523d6000602084013e612e86565b606091505b50600081511415612ecc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ec390614a54565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612f29565b600190505b949350505050565b612f3b8383613237565b612f486000848484612d9a565b612f87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f7e90614a54565b60405180910390fd5b505050565b606060108054612f9b906150c0565b80601f0160208091040260200160405190810160405280929190818152602001828054612fc7906150c0565b80156130145780601f10612fe957610100808354040283529160200191613014565b820191906000526020600020905b815481529060010190602001808311612ff757829003601f168201915b5050505050905090565b60606130298261207f565b613068576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161305f90614c94565b60405180910390fd5b6000613072612f8c565b9050600081511161309257604051806020016040528060008152506130bd565b8061309c84613411565b6040516020016130ad929190614903565b6040516020818303038152906040525b915050919050565b6130ce81613572565b6130d781612ca0565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806131a557507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806131b557506131b4826135c5565b5b9050919050565b6131c783838361363f565b6131cf61132b565b1561320f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613206906149f4565b60405180910390fd5b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156132a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161329e90614c14565b60405180910390fd5b6132b08161207f565b156132f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132e790614ab4565b60405180910390fd5b6132fc60008383612d85565b6001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461334c9190614edd565b92505081905550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461340d60008383612d95565b5050565b60606000821415613459576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061356d565b600082905060005b6000821461348b57808061347490615123565b915050600a826134849190614f33565b9150613461565b60008167ffffffffffffffff8111156134a7576134a6615288565b5b6040519080825280601f01601f1916602001820160405280156134d95781602001600182028036833780820191505090505b5090505b60008514613566576001826134f29190614fbe565b9150600a85613501919061516c565b603061350d9190614edd565b60f81b81838151811061352357613522615259565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561355f9190614f33565b94506134dd565b8093505050505b919050565b61357b81613753565b6000600d6000838152602001908152602001600020805461359b906150c0565b9050146135c257600d600082815260200190815260200160002060006135c19190613c6b565b5b50565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480613638575061363782613870565b5b9050919050565b61364a8383836138da565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561368d57613688816138df565b6136cc565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146136cb576136ca8382613928565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561370f5761370a81613a95565b61374e565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461374d5761374c8282613b66565b5b5b505050565b600061375e826113fc565b905061376c81600084612d85565b6137776000836120eb565b6001600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546137c79190614fbe565b925050819055506004600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461386c81600084612d95565b5050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b505050565b600a80549050600b600083815260200190815260200160002081905550600a81908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001613935846114ae565b61393f9190614fbe565b9050600060096000848152602001908152602001600020549050818114613a24576000600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816009600083815260200190815260200160002081905550505b6009600084815260200190815260200160002060009055600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600a80549050613aa99190614fbe565b90506000600b60008481526020019081526020016000205490506000600a8381548110613ad957613ad8615259565b5b9060005260206000200154905080600a8381548110613afb57613afa615259565b5b906000526020600020018190555081600b600083815260200190815260200160002081905550600b600085815260200190815260200160002060009055600a805480613b4a57613b4961522a565b5b6001900381819060005260206000200160009055905550505050565b6000613b71836114ae565b905081600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806009600084815260200190815260200160002081905550505050565b828054613bf1906150c0565b90600052602060002090601f016020900481019282613c135760008555613c5a565b82601f10613c2c57805160ff1916838001178555613c5a565b82800160010185558215613c5a579182015b82811115613c59578251825591602001919060010190613c3e565b5b509050613c679190613cab565b5090565b508054613c77906150c0565b6000825580601f10613c895750613ca8565b601f016020900490600052602060002090810190613ca79190613cab565b5b50565b5b80821115613cc4576000816000905550600101613cac565b5090565b6000613cdb613cd684614db4565b614d8f565b90508083825260208201905082856020860282011115613cfe57613cfd6152bc565b5b60005b85811015613d2e5781613d148882613e9c565b845260208401935060208301925050600181019050613d01565b5050509392505050565b6000613d4b613d4684614de0565b614d8f565b90508083825260208201905082856020860282011115613d6e57613d6d6152bc565b5b60005b85811015613d9e5781613d848882613fd6565b845260208401935060208301925050600181019050613d71565b5050509392505050565b6000613dbb613db684614e0c565b614d8f565b90508083825260208201905082856020860282011115613dde57613ddd6152bc565b5b60005b85811015613e0e5781613df48882613feb565b845260208401935060208301925050600181019050613de1565b5050509392505050565b6000613e2b613e2684614e38565b614d8f565b905082815260208101848484011115613e4757613e466152c1565b5b613e5284828561507e565b509392505050565b6000613e6d613e6884614e69565b614d8f565b905082815260208101848484011115613e8957613e886152c1565b5b613e9484828561507e565b509392505050565b600081359050613eab81615a09565b92915050565b600082601f830112613ec657613ec56152b7565b5b8135613ed6848260208601613cc8565b91505092915050565b600082601f830112613ef457613ef36152b7565b5b8135613f04848260208601613d38565b91505092915050565b600082601f830112613f2257613f216152b7565b5b8135613f32848260208601613da8565b91505092915050565b600081359050613f4a81615a20565b92915050565b600081359050613f5f81615a37565b92915050565b600081519050613f7481615a37565b92915050565b600082601f830112613f8f57613f8e6152b7565b5b8135613f9f848260208601613e18565b91505092915050565b600082601f830112613fbd57613fbc6152b7565b5b8135613fcd848260208601613e5a565b91505092915050565b600081359050613fe581615a4e565b92915050565b600081359050613ffa81615a65565b92915050565b600060208284031215614016576140156152cb565b5b600061402484828501613e9c565b91505092915050565b60008060408385031215614044576140436152cb565b5b600061405285828601613e9c565b925050602061406385828601613e9c565b9150509250929050565b600080600060608486031215614086576140856152cb565b5b600061409486828701613e9c565b93505060206140a586828701613e9c565b92505060406140b686828701613fd6565b9150509250925092565b600080600080608085870312156140da576140d96152cb565b5b60006140e887828801613e9c565b94505060206140f987828801613e9c565b935050604061410a87828801613fd6565b925050606085013567ffffffffffffffff81111561412b5761412a6152c6565b5b61413787828801613f7a565b91505092959194509250565b6000806040838503121561415a576141596152cb565b5b600061416885828601613e9c565b925050602061417985828601613f3b565b9150509250929050565b6000806040838503121561419a576141996152cb565b5b60006141a885828601613e9c565b92505060206141b985828601613fd6565b9150509250929050565b600080604083850312156141da576141d96152cb565b5b60006141e885828601613e9c565b92505060206141f985828601613feb565b9150509250929050565b600060208284031215614219576142186152cb565b5b600082013567ffffffffffffffff811115614237576142366152c6565b5b61424384828501613edf565b91505092915050565b600080600060608486031215614265576142646152cb565b5b600084013567ffffffffffffffff811115614283576142826152c6565b5b61428f86828701613edf565b935050602084013567ffffffffffffffff8111156142b0576142af6152c6565b5b6142bc86828701613eb1565b925050604084013567ffffffffffffffff8111156142dd576142dc6152c6565b5b6142e986828701613f0d565b9150509250925092565b600060208284031215614309576143086152cb565b5b600061431784828501613f50565b91505092915050565b600060208284031215614336576143356152cb565b5b600061434484828501613f65565b91505092915050565b600060208284031215614363576143626152cb565b5b600082013567ffffffffffffffff811115614381576143806152c6565b5b61438d84828501613fa8565b91505092915050565b6000602082840312156143ac576143ab6152cb565b5b60006143ba84828501613fd6565b91505092915050565b600080604083850312156143da576143d96152cb565b5b60006143e885828601613fd6565b925050602083013567ffffffffffffffff811115614409576144086152c6565b5b61441585828601613fa8565b9150509250929050565b60008060408385031215614436576144356152cb565b5b600061444485828601613fd6565b925050602061445585828601613fd6565b9150509250929050565b61446881614ff2565b82525050565b61447781615004565b82525050565b600061448882614e9a565b6144928185614eb0565b93506144a281856020860161508d565b6144ab816152d0565b840191505092915050565b60006144c182614ea5565b6144cb8185614ec1565b93506144db81856020860161508d565b6144e4816152d0565b840191505092915050565b60006144fa82614ea5565b6145048185614ed2565b935061451481856020860161508d565b80840191505092915050565b600061452d602b83614ec1565b9150614538826152e1565b604082019050919050565b6000614550601483614ec1565b915061455b82615330565b602082019050919050565b6000614573602b83614ec1565b915061457e82615359565b604082019050919050565b6000614596603283614ec1565b91506145a1826153a8565b604082019050919050565b60006145b9602683614ec1565b91506145c4826153f7565b604082019050919050565b60006145dc602583614ec1565b91506145e782615446565b604082019050919050565b60006145ff601c83614ec1565b915061460a82615495565b602082019050919050565b6000614622602483614ec1565b915061462d826154be565b604082019050919050565b6000614645601983614ec1565b91506146508261550d565b602082019050919050565b6000614668602c83614ec1565b915061467382615536565b604082019050919050565b600061468b601483614ec1565b915061469682615585565b602082019050919050565b60006146ae601083614ec1565b91506146b9826155ae565b602082019050919050565b60006146d1603883614ec1565b91506146dc826155d7565b604082019050919050565b60006146f4602a83614ec1565b91506146ff82615626565b604082019050919050565b6000614717602983614ec1565b915061472282615675565b604082019050919050565b600061473a602e83614ec1565b9150614745826156c4565b604082019050919050565b600061475d601883614ec1565b915061476882615713565b602082019050919050565b6000614780602083614ec1565b915061478b8261573c565b602082019050919050565b60006147a3603183614ec1565b91506147ae82615765565b604082019050919050565b60006147c6602c83614ec1565b91506147d1826157b4565b604082019050919050565b60006147e9602083614ec1565b91506147f482615803565b602082019050919050565b600061480c602f83614ec1565b91506148178261582c565b604082019050919050565b600061482f602183614ec1565b915061483a8261587b565b604082019050919050565b6000614852603183614ec1565b915061485d826158ca565b604082019050919050565b6000614875601b83614ec1565b915061488082615919565b602082019050919050565b6000614898602c83614ec1565b91506148a382615942565b604082019050919050565b60006148bb602a83614ec1565b91506148c682615991565b604082019050919050565b60006148de601983614ec1565b91506148e9826159e0565b602082019050919050565b6148fd8161505c565b82525050565b600061490f82856144ef565b915061491b82846144ef565b91508190509392505050565b600060208201905061493c600083018461445f565b92915050565b6000608082019050614957600083018761445f565b614964602083018661445f565b61497160408301856148f4565b8181036060830152614983818461447d565b905095945050505050565b60006040820190506149a3600083018561445f565b6149b060208301846148f4565b9392505050565b60006020820190506149cc600083018461446e565b92915050565b600060208201905081810360008301526149ec81846144b6565b905092915050565b60006020820190508181036000830152614a0d81614520565b9050919050565b60006020820190508181036000830152614a2d81614543565b9050919050565b60006020820190508181036000830152614a4d81614566565b9050919050565b60006020820190508181036000830152614a6d81614589565b9050919050565b60006020820190508181036000830152614a8d816145ac565b9050919050565b60006020820190508181036000830152614aad816145cf565b9050919050565b60006020820190508181036000830152614acd816145f2565b9050919050565b60006020820190508181036000830152614aed81614615565b9050919050565b60006020820190508181036000830152614b0d81614638565b9050919050565b60006020820190508181036000830152614b2d8161465b565b9050919050565b60006020820190508181036000830152614b4d8161467e565b9050919050565b60006020820190508181036000830152614b6d816146a1565b9050919050565b60006020820190508181036000830152614b8d816146c4565b9050919050565b60006020820190508181036000830152614bad816146e7565b9050919050565b60006020820190508181036000830152614bcd8161470a565b9050919050565b60006020820190508181036000830152614bed8161472d565b9050919050565b60006020820190508181036000830152614c0d81614750565b9050919050565b60006020820190508181036000830152614c2d81614773565b9050919050565b60006020820190508181036000830152614c4d81614796565b9050919050565b60006020820190508181036000830152614c6d816147b9565b9050919050565b60006020820190508181036000830152614c8d816147dc565b9050919050565b60006020820190508181036000830152614cad816147ff565b9050919050565b60006020820190508181036000830152614ccd81614822565b9050919050565b60006020820190508181036000830152614ced81614845565b9050919050565b60006020820190508181036000830152614d0d81614868565b9050919050565b60006020820190508181036000830152614d2d8161488b565b9050919050565b60006020820190508181036000830152614d4d816148ae565b9050919050565b60006020820190508181036000830152614d6d816148d1565b9050919050565b6000602082019050614d8960008301846148f4565b92915050565b6000614d99614daa565b9050614da582826150f2565b919050565b6000604051905090565b600067ffffffffffffffff821115614dcf57614dce615288565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614dfb57614dfa615288565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614e2757614e26615288565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614e5357614e52615288565b5b614e5c826152d0565b9050602081019050919050565b600067ffffffffffffffff821115614e8457614e83615288565b5b614e8d826152d0565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614ee88261505c565b9150614ef38361505c565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614f2857614f2761519d565b5b828201905092915050565b6000614f3e8261505c565b9150614f498361505c565b925082614f5957614f586151cc565b5b828204905092915050565b6000614f6f8261505c565b9150614f7a8361505c565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614fb357614fb261519d565b5b828202905092915050565b6000614fc98261505c565b9150614fd48361505c565b925082821015614fe757614fe661519d565b5b828203905092915050565b6000614ffd8261503c565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006bffffffffffffffffffffffff82169050919050565b82818337600083830152505050565b60005b838110156150ab578082015181840152602081019050615090565b838111156150ba576000848401525b50505050565b600060028204905060018216806150d857607f821691505b602082108114156150ec576150eb6151fb565b5b50919050565b6150fb826152d0565b810181811067ffffffffffffffff8211171561511a57615119615288565b5b80604052505050565b600061512e8261505c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156151615761516061519d565b5b600182019050919050565b60006151778261505c565b91506151828361505c565b925082615192576151916151cc565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4552433732315061757361626c653a20746f6b656e207472616e73666572207760008201527f68696c6520706175736564000000000000000000000000000000000000000000602082015250565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f596f7520617265206e6f74207468652067616d65000000000000000000000000600082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008201527f6578697374656e7420746f6b656e000000000000000000000000000000000000602082015250565b7f42756d706b696e3a204c656e677468206d69736d617463680000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f45524337323155524953746f726167653a2055524920717565727920666f722060008201527f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243323938313a20496e76616c696420706172616d65746572730000000000600082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b615a1281614ff2565b8114615a1d57600080fd5b50565b615a2981615004565b8114615a3457600080fd5b50565b615a4081615010565b8114615a4b57600080fd5b50565b615a578161505c565b8114615a6257600080fd5b50565b615a6e81615066565b8114615a7957600080fd5b5056fea264697066735822122043d730302878941338f52811a2d261749fa8739147724ff94e5c4348a4317b8564736f6c6343000807003300000000000000000000000000000000000000000000000000000000000000600000000000000000000000001b309c0813e0885086956970e929414273a4784400000000000000000000000000000000000000000000000000000000000003e8000000000000000000000000000000000000000000000000000000000000003168747470733a2f2f6170692e73756e666c6f7765722d6c616e642e636f6d2f62756d706b696e732f6d657461646174612f000000000000000000000000000000
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061023d5760003560e01c806362252bc31161013b578063a8a99ce8116100b8578063c87b56dd1161007c578063c87b56dd14610673578063d2afae2a146106a3578063e985e9c5146106bf578063f027853d146106ef578063f2fde38b1461070b5761023d565b8063a8a99ce8146105f7578063aa1b103f14610613578063af640d0f1461061d578063b35f51ad1461063b578063b88d4fde146106575761023d565b806383dd4700116100ff57806383dd4700146105655780638456cb59146105955780638da5cb5b1461059f57806395d89b41146105bd578063a22cb465146105db5761023d565b806362252bc3146104c35780636352211e146104df57806370a082311461050f578063715018a61461053f5780637323b8fa146105495761023d565b806323b872dd116101c957806342842e0e1161018d57806342842e0e1461040d5780634b354ecf146104295780634f6ccce71461045957806355f804b3146104895780635c975abb146104a55761023d565b806323b872dd1461036a578063266fb15f146103865780632a55205a146103a25780632f745c59146103d35780633f4ba83a146104035761023d565b8063095ea7b311610210578063095ea7b3146102dc578063162094c4146102f857806318160ddd1461031457806319892b51146103325780632348c8321461034e5761023d565b806301ffc9a71461024257806304634d8d1461027257806306fdde031461028e578063081812fc146102ac575b600080fd5b61025c600480360381019061025791906142f3565b610727565b60405161026991906149b7565b60405180910390f35b61028c600480360381019061028791906141c3565b610739565b005b6102966107e1565b6040516102a391906149d2565b60405180910390f35b6102c660048036038101906102c19190614396565b610873565b6040516102d39190614927565b60405180910390f35b6102f660048036038101906102f19190614183565b6108f8565b005b610312600480360381019061030d91906143c3565b610a10565b005b61031c610af0565b6040516103299190614d74565b60405180910390f35b61034c60048036038101906103479190614000565b610afd565b005b61036860048036038101906103639190614000565b610bd4565b005b610384600480360381019061037f919061406d565b610cc9565b005b6103a0600480360381019061039b919061424c565b610d29565b005b6103bc60048036038101906103b7919061441f565b610e92565b6040516103ca92919061498e565b60405180910390f35b6103ed60048036038101906103e89190614183565b61107d565b6040516103fa9190614d74565b60405180910390f35b61040b611122565b005b6104276004803603810190610422919061406d565b6111c6565b005b610443600480360381019061043e9190614000565b6111e6565b60405161045091906149b7565b60405180910390f35b610473600480360381019061046e9190614396565b611206565b6040516104809190614d74565b60405180910390f35b6104a3600480360381019061049e919061434d565b611277565b005b6104ad61132b565b6040516104ba91906149b7565b60405180910390f35b6104dd60048036038101906104d8919061406d565b611342565b005b6104f960048036038101906104f49190614396565b6113fc565b6040516105069190614927565b60405180910390f35b61052960048036038101906105249190614000565b6114ae565b6040516105369190614d74565b60405180910390f35b610547611566565b005b610563600480360381019061055e9190614000565b6115ee565b005b61057f600480360381019061057a9190614000565b6116c5565b60405161058c9190614d74565b60405180910390f35b61059d61178d565b005b6105a7611831565b6040516105b49190614927565b60405180910390f35b6105c561185b565b6040516105d291906149d2565b60405180910390f35b6105f560048036038101906105f09190614143565b6118ed565b005b610611600480360381019061060c9190614183565b611903565b005b61061b6119ab565b005b610625611a4f565b6040516106329190614d74565b60405180910390f35b61065560048036038101906106509190614000565b611a55565b005b610671600480360381019061066c91906140c0565b611b4a565b005b61068d60048036038101906106889190614396565b611bac565b60405161069a91906149d2565b60405180910390f35b6106bd60048036038101906106b89190614203565b611bbe565b005b6106d960048036038101906106d4919061402d565b611c9e565b6040516106e691906149b7565b60405180910390f35b61070960048036038101906107049190614396565b611d32565b005b61072560048036038101906107209190614000565b611dd8565b005b600061073282611ed0565b9050919050565b60011515600f6000610749611ee2565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515146107d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107ca90614b34565b60405180910390fd5b6107dd8282611eea565b5050565b6060600280546107f0906150c0565b80601f016020809104026020016040519081016040528092919081815260200182805461081c906150c0565b80156108695780601f1061083e57610100808354040283529160200191610869565b820191906000526020600020905b81548152906001019060200180831161084c57829003601f168201915b5050505050905090565b600061087e8261207f565b6108bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108b490614c54565b60405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610903826113fc565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610974576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161096b90614cb4565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610993611ee2565b73ffffffffffffffffffffffffffffffffffffffff1614806109c257506109c1816109bc611ee2565b611c9e565b5b610a01576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109f890614b74565b60405180910390fd5b610a0b83836120eb565b505050565b60011515600f6000610a20611ee2565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514610aaa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aa190614b34565b60405180910390fd5b610ab482826121a4565b817fd2d827dddfc9c9a02afc5fc68d3251684b36e213a7999ebd90a861f25df4077e82604051610ae491906149d2565b60405180910390a25050565b6000600a80549050905090565b610b05611ee2565b73ffffffffffffffffffffffffffffffffffffffff16610b23611831565b73ffffffffffffffffffffffffffffffffffffffff1614610b79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7090614c74565b60405180910390fd5b6000600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b60011515600f6000610be4611ee2565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514610c6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6590614b34565b60405180910390fd5b6001600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b610cda610cd4611ee2565b82612218565b610d19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1090614cd4565b60405180910390fd5b610d248383836122f6565b505050565b60011515600f6000610d39611ee2565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514610dc3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dba90614b34565b60405180910390fd5b81518351148015610dd5575080518251145b610e14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0b90614bf4565b60405180910390fd5b60005b8351811015610e8c57610e79848281518110610e3657610e35615259565b5b6020026020010151848381518110610e5157610e50615259565b5b6020026020010151848481518110610e6c57610e6b615259565b5b602002602001015161255d565b8080610e8490615123565b915050610e17565b50505050565b6000806000600160008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614156110285760006040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b6000611032612705565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff168661105e9190614f64565b6110689190614f33565b90508160000151819350935050509250929050565b6000611088836114ae565b82106110c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c090614a34565b60405180910390fd5b600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b60011515600f6000611132611ee2565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515146111bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b390614b34565b60405180910390fd5b6111c461270f565b565b6111e183838360405180602001604052806000815250611b4a565b505050565b600f6020528060005260406000206000915054906101000a900460ff1681565b6000611210610af0565b8210611251576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124890614d14565b60405180910390fd5b600a828154811061126557611264615259565b5b90600052602060002001549050919050565b60011515600f6000611287611ee2565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514611311576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130890614b34565b60405180910390fd5b8060109080519060200190611327929190613be5565b5050565b6000600c60009054906101000a900460ff16905090565b60011515600f6000611352611ee2565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515146113dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d390614b34565b60405180910390fd5b6113f7838383604051806020016040528060008152506127b1565b505050565b6000806004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156114a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149c90614bb4565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561151f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151690614b94565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61156e611ee2565b73ffffffffffffffffffffffffffffffffffffffff1661158c611831565b73ffffffffffffffffffffffffffffffffffffffff16146115e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d990614c74565b60405180910390fd5b6115ec600061280d565b565b6115f6611ee2565b73ffffffffffffffffffffffffffffffffffffffff16611614611831565b73ffffffffffffffffffffffffffffffffffffffff161461166a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166190614c74565b60405180910390fd5b6001600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600060011515600f60006116d7611ee2565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514611761576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175890614b34565b60405180910390fd5b600060116000815461177290615123565b919050819055905061178483826128d3565b80915050919050565b60011515600f600061179d611ee2565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514611827576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181e90614b34565b60405180910390fd5b61182f6128f1565b565b6000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606003805461186a906150c0565b80601f0160208091040260200160405190810160405280929190818152602001828054611896906150c0565b80156118e35780601f106118b8576101008083540402835291602001916118e3565b820191906000526020600020905b8154815290600101906020018083116118c657829003601f168201915b5050505050905090565b6118ff6118f8611ee2565b8383612994565b5050565b60011515600f6000611913611ee2565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615151461199d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199490614b34565b60405180910390fd5b6119a782826120eb565b5050565b60011515600f60006119bb611ee2565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514611a45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3c90614b34565b60405180910390fd5b611a4d612b01565b565b60115481565b60011515600f6000611a65611ee2565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514611aef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ae690614b34565b60405180910390fd5b6000600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b611b5b611b55611ee2565b83612218565b611b9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9190614cd4565b60405180910390fd5b611ba6848484846127b1565b50505050565b6060611bb782612b4e565b9050919050565b60011515600f6000611bce611ee2565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514611c58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4f90614b34565b60405180910390fd5b60005b8151811015611c9a57611c87828281518110611c7a57611c79615259565b5b6020026020010151612ca0565b8080611c9290615123565b915050611c5b565b5050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60011515600f6000611d42611ee2565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514611dcc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dc390614b34565b60405180910390fd5b611dd581612cff565b50565b611de0611ee2565b73ffffffffffffffffffffffffffffffffffffffff16611dfe611831565b73ffffffffffffffffffffffffffffffffffffffff1614611e54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4b90614c74565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611ec4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ebb90614a74565b60405180910390fd5b611ecd8161280d565b50565b6000611edb82612d0b565b9050919050565b600033905090565b611ef2612705565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff161115611f50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f4790614d34565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611fc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fb790614d54565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff168152506000808201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b60008073ffffffffffffffffffffffffffffffffffffffff166004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816006600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661215e836113fc565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6121ad8261207f565b6121ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121e390614bd4565b60405180910390fd5b80600d60008481526020019081526020016000209080519060200190612213929190613be5565b505050565b60006122238261207f565b612262576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161225990614b14565b60405180910390fd5b600061226d836113fc565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806122dc57508373ffffffffffffffffffffffffffffffffffffffff166122c484610873565b73ffffffffffffffffffffffffffffffffffffffff16145b806122ed57506122ec8185611c9e565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612316826113fc565b73ffffffffffffffffffffffffffffffffffffffff161461236c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161236390614a94565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156123dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123d390614ad4565b60405180910390fd5b6123e7838383612d85565b6123f26000826120eb565b6001600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124429190614fbe565b925050819055506001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124999190614edd565b92505081905550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612558838383612d95565b505050565b612565612705565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff1611156125c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125ba90614d34565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612633576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161262a90614cf4565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff168152506001600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff160217905550905050505050565b6000612710905090565b61271761132b565b612756576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161274d90614a14565b60405180910390fd5b6000600c60006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa61279a611ee2565b6040516127a79190614927565b60405180910390a1565b6127bc8484846122f6565b6127c884848484612d9a565b612807576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127fe90614a54565b60405180910390fd5b50505050565b6000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6128ed828260405180602001604052806000815250612f31565b5050565b6128f961132b565b15612939576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161293090614b54565b60405180910390fd5b6001600c60006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861297d611ee2565b60405161298a9190614927565b60405180910390a1565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612a03576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129fa90614af4565b60405180910390fd5b80600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612af491906149b7565b60405180910390a3505050565b6000806000820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556000820160146101000a8154906bffffffffffffffffffffffff02191690555050565b6060612b598261207f565b612b98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b8f90614c34565b60405180910390fd5b6000600d60008481526020019081526020016000208054612bb8906150c0565b80601f0160208091040260200160405190810160405280929190818152602001828054612be4906150c0565b8015612c315780601f10612c0657610100808354040283529160200191612c31565b820191906000526020600020905b815481529060010190602001808311612c1457829003601f168201915b505050505090506000612c42612f8c565b9050600081511415612c58578192505050612c9b565b600082511115612c8d578082604051602001612c75929190614903565b60405160208183030381529060405292505050612c9b565b612c968461301e565b925050505b919050565b60016000828152602001908152602001600020600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556000820160146101000a8154906bffffffffffffffffffffffff0219169055505050565b612d08816130c5565b50565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612d7e5750612d7d826130da565b5b9050919050565b612d908383836131bc565b505050565b505050565b6000612dbb8473ffffffffffffffffffffffffffffffffffffffff16613214565b15612f24578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612de4611ee2565b8786866040518563ffffffff1660e01b8152600401612e069493929190614942565b602060405180830381600087803b158015612e2057600080fd5b505af1925050508015612e5157506040513d601f19601f82011682018060405250810190612e4e9190614320565b60015b612ed4573d8060008114612e81576040519150601f19603f3d011682016040523d82523d6000602084013e612e86565b606091505b50600081511415612ecc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ec390614a54565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612f29565b600190505b949350505050565b612f3b8383613237565b612f486000848484612d9a565b612f87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f7e90614a54565b60405180910390fd5b505050565b606060108054612f9b906150c0565b80601f0160208091040260200160405190810160405280929190818152602001828054612fc7906150c0565b80156130145780601f10612fe957610100808354040283529160200191613014565b820191906000526020600020905b815481529060010190602001808311612ff757829003601f168201915b5050505050905090565b60606130298261207f565b613068576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161305f90614c94565b60405180910390fd5b6000613072612f8c565b9050600081511161309257604051806020016040528060008152506130bd565b8061309c84613411565b6040516020016130ad929190614903565b6040516020818303038152906040525b915050919050565b6130ce81613572565b6130d781612ca0565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806131a557507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806131b557506131b4826135c5565b5b9050919050565b6131c783838361363f565b6131cf61132b565b1561320f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613206906149f4565b60405180910390fd5b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156132a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161329e90614c14565b60405180910390fd5b6132b08161207f565b156132f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132e790614ab4565b60405180910390fd5b6132fc60008383612d85565b6001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461334c9190614edd565b92505081905550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461340d60008383612d95565b5050565b60606000821415613459576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061356d565b600082905060005b6000821461348b57808061347490615123565b915050600a826134849190614f33565b9150613461565b60008167ffffffffffffffff8111156134a7576134a6615288565b5b6040519080825280601f01601f1916602001820160405280156134d95781602001600182028036833780820191505090505b5090505b60008514613566576001826134f29190614fbe565b9150600a85613501919061516c565b603061350d9190614edd565b60f81b81838151811061352357613522615259565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561355f9190614f33565b94506134dd565b8093505050505b919050565b61357b81613753565b6000600d6000838152602001908152602001600020805461359b906150c0565b9050146135c257600d600082815260200190815260200160002060006135c19190613c6b565b5b50565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480613638575061363782613870565b5b9050919050565b61364a8383836138da565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561368d57613688816138df565b6136cc565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146136cb576136ca8382613928565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561370f5761370a81613a95565b61374e565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461374d5761374c8282613b66565b5b5b505050565b600061375e826113fc565b905061376c81600084612d85565b6137776000836120eb565b6001600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546137c79190614fbe565b925050819055506004600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461386c81600084612d95565b5050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b505050565b600a80549050600b600083815260200190815260200160002081905550600a81908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001613935846114ae565b61393f9190614fbe565b9050600060096000848152602001908152602001600020549050818114613a24576000600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816009600083815260200190815260200160002081905550505b6009600084815260200190815260200160002060009055600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600a80549050613aa99190614fbe565b90506000600b60008481526020019081526020016000205490506000600a8381548110613ad957613ad8615259565b5b9060005260206000200154905080600a8381548110613afb57613afa615259565b5b906000526020600020018190555081600b600083815260200190815260200160002081905550600b600085815260200190815260200160002060009055600a805480613b4a57613b4961522a565b5b6001900381819060005260206000200160009055905550505050565b6000613b71836114ae565b905081600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806009600084815260200190815260200160002081905550505050565b828054613bf1906150c0565b90600052602060002090601f016020900481019282613c135760008555613c5a565b82601f10613c2c57805160ff1916838001178555613c5a565b82800160010185558215613c5a579182015b82811115613c59578251825591602001919060010190613c3e565b5b509050613c679190613cab565b5090565b508054613c77906150c0565b6000825580601f10613c895750613ca8565b601f016020900490600052602060002090810190613ca79190613cab565b5b50565b5b80821115613cc4576000816000905550600101613cac565b5090565b6000613cdb613cd684614db4565b614d8f565b90508083825260208201905082856020860282011115613cfe57613cfd6152bc565b5b60005b85811015613d2e5781613d148882613e9c565b845260208401935060208301925050600181019050613d01565b5050509392505050565b6000613d4b613d4684614de0565b614d8f565b90508083825260208201905082856020860282011115613d6e57613d6d6152bc565b5b60005b85811015613d9e5781613d848882613fd6565b845260208401935060208301925050600181019050613d71565b5050509392505050565b6000613dbb613db684614e0c565b614d8f565b90508083825260208201905082856020860282011115613dde57613ddd6152bc565b5b60005b85811015613e0e5781613df48882613feb565b845260208401935060208301925050600181019050613de1565b5050509392505050565b6000613e2b613e2684614e38565b614d8f565b905082815260208101848484011115613e4757613e466152c1565b5b613e5284828561507e565b509392505050565b6000613e6d613e6884614e69565b614d8f565b905082815260208101848484011115613e8957613e886152c1565b5b613e9484828561507e565b509392505050565b600081359050613eab81615a09565b92915050565b600082601f830112613ec657613ec56152b7565b5b8135613ed6848260208601613cc8565b91505092915050565b600082601f830112613ef457613ef36152b7565b5b8135613f04848260208601613d38565b91505092915050565b600082601f830112613f2257613f216152b7565b5b8135613f32848260208601613da8565b91505092915050565b600081359050613f4a81615a20565b92915050565b600081359050613f5f81615a37565b92915050565b600081519050613f7481615a37565b92915050565b600082601f830112613f8f57613f8e6152b7565b5b8135613f9f848260208601613e18565b91505092915050565b600082601f830112613fbd57613fbc6152b7565b5b8135613fcd848260208601613e5a565b91505092915050565b600081359050613fe581615a4e565b92915050565b600081359050613ffa81615a65565b92915050565b600060208284031215614016576140156152cb565b5b600061402484828501613e9c565b91505092915050565b60008060408385031215614044576140436152cb565b5b600061405285828601613e9c565b925050602061406385828601613e9c565b9150509250929050565b600080600060608486031215614086576140856152cb565b5b600061409486828701613e9c565b93505060206140a586828701613e9c565b92505060406140b686828701613fd6565b9150509250925092565b600080600080608085870312156140da576140d96152cb565b5b60006140e887828801613e9c565b94505060206140f987828801613e9c565b935050604061410a87828801613fd6565b925050606085013567ffffffffffffffff81111561412b5761412a6152c6565b5b61413787828801613f7a565b91505092959194509250565b6000806040838503121561415a576141596152cb565b5b600061416885828601613e9c565b925050602061417985828601613f3b565b9150509250929050565b6000806040838503121561419a576141996152cb565b5b60006141a885828601613e9c565b92505060206141b985828601613fd6565b9150509250929050565b600080604083850312156141da576141d96152cb565b5b60006141e885828601613e9c565b92505060206141f985828601613feb565b9150509250929050565b600060208284031215614219576142186152cb565b5b600082013567ffffffffffffffff811115614237576142366152c6565b5b61424384828501613edf565b91505092915050565b600080600060608486031215614265576142646152cb565b5b600084013567ffffffffffffffff811115614283576142826152c6565b5b61428f86828701613edf565b935050602084013567ffffffffffffffff8111156142b0576142af6152c6565b5b6142bc86828701613eb1565b925050604084013567ffffffffffffffff8111156142dd576142dc6152c6565b5b6142e986828701613f0d565b9150509250925092565b600060208284031215614309576143086152cb565b5b600061431784828501613f50565b91505092915050565b600060208284031215614336576143356152cb565b5b600061434484828501613f65565b91505092915050565b600060208284031215614363576143626152cb565b5b600082013567ffffffffffffffff811115614381576143806152c6565b5b61438d84828501613fa8565b91505092915050565b6000602082840312156143ac576143ab6152cb565b5b60006143ba84828501613fd6565b91505092915050565b600080604083850312156143da576143d96152cb565b5b60006143e885828601613fd6565b925050602083013567ffffffffffffffff811115614409576144086152c6565b5b61441585828601613fa8565b9150509250929050565b60008060408385031215614436576144356152cb565b5b600061444485828601613fd6565b925050602061445585828601613fd6565b9150509250929050565b61446881614ff2565b82525050565b61447781615004565b82525050565b600061448882614e9a565b6144928185614eb0565b93506144a281856020860161508d565b6144ab816152d0565b840191505092915050565b60006144c182614ea5565b6144cb8185614ec1565b93506144db81856020860161508d565b6144e4816152d0565b840191505092915050565b60006144fa82614ea5565b6145048185614ed2565b935061451481856020860161508d565b80840191505092915050565b600061452d602b83614ec1565b9150614538826152e1565b604082019050919050565b6000614550601483614ec1565b915061455b82615330565b602082019050919050565b6000614573602b83614ec1565b915061457e82615359565b604082019050919050565b6000614596603283614ec1565b91506145a1826153a8565b604082019050919050565b60006145b9602683614ec1565b91506145c4826153f7565b604082019050919050565b60006145dc602583614ec1565b91506145e782615446565b604082019050919050565b60006145ff601c83614ec1565b915061460a82615495565b602082019050919050565b6000614622602483614ec1565b915061462d826154be565b604082019050919050565b6000614645601983614ec1565b91506146508261550d565b602082019050919050565b6000614668602c83614ec1565b915061467382615536565b604082019050919050565b600061468b601483614ec1565b915061469682615585565b602082019050919050565b60006146ae601083614ec1565b91506146b9826155ae565b602082019050919050565b60006146d1603883614ec1565b91506146dc826155d7565b604082019050919050565b60006146f4602a83614ec1565b91506146ff82615626565b604082019050919050565b6000614717602983614ec1565b915061472282615675565b604082019050919050565b600061473a602e83614ec1565b9150614745826156c4565b604082019050919050565b600061475d601883614ec1565b915061476882615713565b602082019050919050565b6000614780602083614ec1565b915061478b8261573c565b602082019050919050565b60006147a3603183614ec1565b91506147ae82615765565b604082019050919050565b60006147c6602c83614ec1565b91506147d1826157b4565b604082019050919050565b60006147e9602083614ec1565b91506147f482615803565b602082019050919050565b600061480c602f83614ec1565b91506148178261582c565b604082019050919050565b600061482f602183614ec1565b915061483a8261587b565b604082019050919050565b6000614852603183614ec1565b915061485d826158ca565b604082019050919050565b6000614875601b83614ec1565b915061488082615919565b602082019050919050565b6000614898602c83614ec1565b91506148a382615942565b604082019050919050565b60006148bb602a83614ec1565b91506148c682615991565b604082019050919050565b60006148de601983614ec1565b91506148e9826159e0565b602082019050919050565b6148fd8161505c565b82525050565b600061490f82856144ef565b915061491b82846144ef565b91508190509392505050565b600060208201905061493c600083018461445f565b92915050565b6000608082019050614957600083018761445f565b614964602083018661445f565b61497160408301856148f4565b8181036060830152614983818461447d565b905095945050505050565b60006040820190506149a3600083018561445f565b6149b060208301846148f4565b9392505050565b60006020820190506149cc600083018461446e565b92915050565b600060208201905081810360008301526149ec81846144b6565b905092915050565b60006020820190508181036000830152614a0d81614520565b9050919050565b60006020820190508181036000830152614a2d81614543565b9050919050565b60006020820190508181036000830152614a4d81614566565b9050919050565b60006020820190508181036000830152614a6d81614589565b9050919050565b60006020820190508181036000830152614a8d816145ac565b9050919050565b60006020820190508181036000830152614aad816145cf565b9050919050565b60006020820190508181036000830152614acd816145f2565b9050919050565b60006020820190508181036000830152614aed81614615565b9050919050565b60006020820190508181036000830152614b0d81614638565b9050919050565b60006020820190508181036000830152614b2d8161465b565b9050919050565b60006020820190508181036000830152614b4d8161467e565b9050919050565b60006020820190508181036000830152614b6d816146a1565b9050919050565b60006020820190508181036000830152614b8d816146c4565b9050919050565b60006020820190508181036000830152614bad816146e7565b9050919050565b60006020820190508181036000830152614bcd8161470a565b9050919050565b60006020820190508181036000830152614bed8161472d565b9050919050565b60006020820190508181036000830152614c0d81614750565b9050919050565b60006020820190508181036000830152614c2d81614773565b9050919050565b60006020820190508181036000830152614c4d81614796565b9050919050565b60006020820190508181036000830152614c6d816147b9565b9050919050565b60006020820190508181036000830152614c8d816147dc565b9050919050565b60006020820190508181036000830152614cad816147ff565b9050919050565b60006020820190508181036000830152614ccd81614822565b9050919050565b60006020820190508181036000830152614ced81614845565b9050919050565b60006020820190508181036000830152614d0d81614868565b9050919050565b60006020820190508181036000830152614d2d8161488b565b9050919050565b60006020820190508181036000830152614d4d816148ae565b9050919050565b60006020820190508181036000830152614d6d816148d1565b9050919050565b6000602082019050614d8960008301846148f4565b92915050565b6000614d99614daa565b9050614da582826150f2565b919050565b6000604051905090565b600067ffffffffffffffff821115614dcf57614dce615288565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614dfb57614dfa615288565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614e2757614e26615288565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614e5357614e52615288565b5b614e5c826152d0565b9050602081019050919050565b600067ffffffffffffffff821115614e8457614e83615288565b5b614e8d826152d0565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614ee88261505c565b9150614ef38361505c565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614f2857614f2761519d565b5b828201905092915050565b6000614f3e8261505c565b9150614f498361505c565b925082614f5957614f586151cc565b5b828204905092915050565b6000614f6f8261505c565b9150614f7a8361505c565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614fb357614fb261519d565b5b828202905092915050565b6000614fc98261505c565b9150614fd48361505c565b925082821015614fe757614fe661519d565b5b828203905092915050565b6000614ffd8261503c565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006bffffffffffffffffffffffff82169050919050565b82818337600083830152505050565b60005b838110156150ab578082015181840152602081019050615090565b838111156150ba576000848401525b50505050565b600060028204905060018216806150d857607f821691505b602082108114156150ec576150eb6151fb565b5b50919050565b6150fb826152d0565b810181811067ffffffffffffffff8211171561511a57615119615288565b5b80604052505050565b600061512e8261505c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156151615761516061519d565b5b600182019050919050565b60006151778261505c565b91506151828361505c565b925082615192576151916151cc565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4552433732315061757361626c653a20746f6b656e207472616e73666572207760008201527f68696c6520706175736564000000000000000000000000000000000000000000602082015250565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f596f7520617265206e6f74207468652067616d65000000000000000000000000600082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008201527f6578697374656e7420746f6b656e000000000000000000000000000000000000602082015250565b7f42756d706b696e3a204c656e677468206d69736d617463680000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f45524337323155524953746f726167653a2055524920717565727920666f722060008201527f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243323938313a20496e76616c696420706172616d65746572730000000000600082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b615a1281614ff2565b8114615a1d57600080fd5b50565b615a2981615004565b8114615a3457600080fd5b50565b615a4081615010565b8114615a4b57600080fd5b50565b615a578161505c565b8114615a6257600080fd5b50565b615a6e81615066565b8114615a7957600080fd5b5056fea264697066735822122043d730302878941338f52811a2d261749fa8739147724ff94e5c4348a4317b8564736f6c63430008070033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000600000000000000000000000001b309c0813e0885086956970e929414273a4784400000000000000000000000000000000000000000000000000000000000003e8000000000000000000000000000000000000000000000000000000000000003168747470733a2f2f6170692e73756e666c6f7765722d6c616e642e636f6d2f62756d706b696e732f6d657461646174612f000000000000000000000000000000
-----Decoded View---------------
Arg [0] : initialBaseURI (string): https://api.sunflower-land.com/bumpkins/metadata/
Arg [1] : royaltyReceiver (address): 0x1B309C0813E0885086956970e929414273A47844
Arg [2] : royaltyFeeNumerator (uint96): 1000
-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 0000000000000000000000001b309c0813e0885086956970e929414273a47844
Arg [2] : 00000000000000000000000000000000000000000000000000000000000003e8
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000031
Arg [4] : 68747470733a2f2f6170692e73756e666c6f7765722d6c616e642e636f6d2f62
Arg [5] : 756d706b696e732f6d657461646174612f000000000000000000000000000000
Deployed Bytecode Sourcemap
58431:3581:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60623:227;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61002:168;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34453:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36012:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35535:411;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59417:204;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52746:113;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6020:99;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5804:98;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36762:339;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61278:501;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22753:494;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;52414:256;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60928:66;;;:::i;:::-;;37172:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5651:41;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52936:233;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59099:89;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7381:86;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59816:172;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34147:239;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33877:208;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4730:103;;;:::i;:::-;;5701:95;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59629:179;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60858:62;;;:::i;:::-;;4079:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34622:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36305:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60090:108;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61178:92;;;:::i;:::-;;58582:21;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5910:102;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37428:328;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59196:213;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61787:222;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36531:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59996:86;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4988:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60623:227;60777:4;60806:36;60830:11;60806:23;:36::i;:::-;60799:43;;60623:227;;;:::o;61002:168::-;6193:4;6166:31;;:9;:23;6176:12;:10;:12::i;:::-;6166:23;;;;;;;;;;;;;;;;;;;;;;;;;:31;;;6158:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;61120:42:::1;61139:8;61149:12;61120:18;:42::i;:::-;61002:168:::0;;:::o;34453:100::-;34507:13;34540:5;34533:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34453:100;:::o;36012:221::-;36088:7;36116:16;36124:7;36116;:16::i;:::-;36108:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;36201:15;:24;36217:7;36201:24;;;;;;;;;;;;;;;;;;;;;36194:31;;36012:221;;;:::o;35535:411::-;35616:13;35632:23;35647:7;35632:14;:23::i;:::-;35616:39;;35680:5;35674:11;;:2;:11;;;;35666:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;35774:5;35758:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;35783:37;35800:5;35807:12;:10;:12::i;:::-;35783:16;:37::i;:::-;35758:62;35736:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;35917:21;35926:2;35930:7;35917:8;:21::i;:::-;35605:341;35535:411;;:::o;59417:204::-;6193:4;6166:31;;:9;:23;6176:12;:10;:12::i;:::-;6166:23;;;;;;;;;;;;;;;;;;;;;;;;;:31;;;6158:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;59532:32:::1;59545:7;59554:9;59532:12;:32::i;:::-;59594:7;59582:31;59603:9;59582:31;;;;;;:::i;:::-;;;;;;;;59417:204:::0;;:::o;52746:113::-;52807:7;52834:10;:17;;;;52827:24;;52746:113;:::o;6020:99::-;4310:12;:10;:12::i;:::-;4299:23;;:7;:5;:7::i;:::-;:23;;;4291:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6106:5:::1;6087:9;:16;6097:5;6087:16;;;;;;;;;;;;;;;;:24;;;;;;;;;;;;;;;;;;6020:99:::0;:::o;5804:98::-;6193:4;6166:31;;:9;:23;6176:12;:10;:12::i;:::-;6166:23;;;;;;;;;;;;;;;;;;;;;;;;;:31;;;6158:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;5890:4:::1;5871:9;:16;5881:5;5871:16;;;;;;;;;;;;;;;;:23;;;;;;;;;;;;;;;;;;5804:98:::0;:::o;36762:339::-;36957:41;36976:12;:10;:12::i;:::-;36990:7;36957:18;:41::i;:::-;36949:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;37065:28;37075:4;37081:2;37085:7;37065:9;:28::i;:::-;36762:339;;;:::o;61278:501::-;6193:4;6166:31;;:9;:23;6176:12;:10;:12::i;:::-;6166:23;;;;;;;;;;;;;;;;;;;;;;;;;:31;;;6158:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;61498:9:::1;:16;61479:8;:15;:35;:96;;;;;61555:13;:20;61535:9;:16;:40;61479:96;61457:170;;;;;;;;;;;;:::i;:::-;;;;;;;;;61643:9;61638:134;61662:8;:15;61658:1;:19;61638:134;;;61699:61;61716:8;61725:1;61716:11;;;;;;;;:::i;:::-;;;;;;;;61729:9;61739:1;61729:12;;;;;;;;:::i;:::-;;;;;;;;61743:13;61757:1;61743:16;;;;;;;;:::i;:::-;;;;;;;;61699;:61::i;:::-;61679:3;;;;;:::i;:::-;;;;61638:134;;;;61278:501:::0;;;:::o;22753:494::-;22897:7;22906;22931:26;22960:17;:27;22978:8;22960:27;;;;;;;;;;;22931:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23032:1;23004:30;;:7;:16;;;:30;;;23000:92;;;23061:19;23051:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23000:92;23104:21;23169:17;:15;:17::i;:::-;23128:58;;23142:7;:23;;;23129:36;;:10;:36;;;;:::i;:::-;23128:58;;;;:::i;:::-;23104:82;;23207:7;:16;;;23225:13;23199:40;;;;;;22753:494;;;;;:::o;52414:256::-;52511:7;52547:23;52564:5;52547:16;:23::i;:::-;52539:5;:31;52531:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;52636:12;:19;52649:5;52636:19;;;;;;;;;;;;;;;:26;52656:5;52636:26;;;;;;;;;;;;52629:33;;52414:256;;;;:::o;60928:66::-;6193:4;6166:31;;:9;:23;6176:12;:10;:12::i;:::-;6166:23;;;;;;;;;;;;;;;;;;;;;;;;;:31;;;6158:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;60976:10:::1;:8;:10::i;:::-;60928:66::o:0;37172:185::-;37310:39;37327:4;37333:2;37337:7;37310:39;;;;;;;;;;;;:16;:39::i;:::-;37172:185;;;:::o;5651:41::-;;;;;;;;;;;;;;;;;;;;;;:::o;52936:233::-;53011:7;53047:30;:28;:30::i;:::-;53039:5;:38;53031:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;53144:10;53155:5;53144:17;;;;;;;;:::i;:::-;;;;;;;;;;53137:24;;52936:233;;;:::o;59099:89::-;6193:4;6166:31;;:9;:23;6176:12;:10;:12::i;:::-;6166:23;;;;;;;;;;;;;;;;;;;;;;;;;:31;;;6158:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;59177:3:::1;59167:7;:13;;;;;;;;;;;;:::i;:::-;;59099:89:::0;:::o;7381:86::-;7428:4;7452:7;;;;;;;;;;;7445:14;;7381:86;:::o;59816:172::-;6193:4;6166:31;;:9;:23;6176:12;:10;:12::i;:::-;6166:23;;;;;;;;;;;;;;;;;;;;;;;;;:31;;;6158:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;59944:36:::1;59958:4;59964:2;59968:7;59944:36;;;;;;;;;;;::::0;:13:::1;:36::i;:::-;59816:172:::0;;;:::o;34147:239::-;34219:7;34239:13;34255:7;:16;34263:7;34255:16;;;;;;;;;;;;;;;;;;;;;34239:32;;34307:1;34290:19;;:5;:19;;;;34282:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;34373:5;34366:12;;;34147:239;;;:::o;33877:208::-;33949:7;33994:1;33977:19;;:5;:19;;;;33969:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;34061:9;:16;34071:5;34061:16;;;;;;;;;;;;;;;;34054:23;;33877:208;;;:::o;4730:103::-;4310:12;:10;:12::i;:::-;4299:23;;:7;:5;:7::i;:::-;:23;;;4291:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4795:30:::1;4822:1;4795:18;:30::i;:::-;4730:103::o:0;5701:95::-;4310:12;:10;:12::i;:::-;4299:23;;:7;:5;:7::i;:::-;:23;;;4291:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5784:4:::1;5765:9;:16;5775:5;5765:16;;;;;;;;;;;;;;;;:23;;;;;;;;;;;;;;;;;;5701:95:::0;:::o;59629:179::-;59691:7;6193:4;6166:31;;:9;:23;6176:12;:10;:12::i;:::-;6166:23;;;;;;;;;;;;;;;;;;;;;;;;;:31;;;6158:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;59711:15:::1;59731:2;;59729:4;;;;;:::i;:::-;;;;;;;59711:22;;59746:27;59756:7;59765;59746:9;:27::i;:::-;59793:7;59786:14;;;59629:179:::0;;;:::o;60858:62::-;6193:4;6166:31;;:9;:23;6176:12;:10;:12::i;:::-;6166:23;;;;;;;;;;;;;;;;;;;;;;;;;:31;;;6158:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;60904:8:::1;:6;:8::i;:::-;60858:62::o:0;4079:87::-;4125:7;4152:6;;;;;;;;;;;4145:13;;4079:87;:::o;34622:104::-;34678:13;34711:7;34704:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34622:104;:::o;36305:155::-;36400:52;36419:12;:10;:12::i;:::-;36433:8;36443;36400:18;:52::i;:::-;36305:155;;:::o;60090:108::-;6193:4;6166:31;;:9;:23;6176:12;:10;:12::i;:::-;6166:23;;;;;;;;;;;;;;;;;;;;;;;;;:31;;;6158:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;60169:21:::1;60178:2;60182:7;60169:8;:21::i;:::-;60090:108:::0;;:::o;61178:92::-;6193:4;6166:31;;:9;:23;6176:12;:10;:12::i;:::-;6166:23;;;;;;;;;;;;;;;;;;;;;;;;;:31;;;6158:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;61239:23:::1;:21;:23::i;:::-;61178:92::o:0;58582:21::-;;;;:::o;5910:102::-;6193:4;6166:31;;:9;:23;6176:12;:10;:12::i;:::-;6166:23;;;;;;;;;;;;;;;;;;;;;;;;;:31;;;6158:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;5999:5:::1;5980:9;:16;5990:5;5980:16;;;;;;;;;;;;;;;;:24;;;;;;;;;;;;;;;;;;5910:102:::0;:::o;37428:328::-;37603:41;37622:12;:10;:12::i;:::-;37636:7;37603:18;:41::i;:::-;37595:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;37709:39;37723:4;37729:2;37733:7;37742:5;37709:13;:39::i;:::-;37428:328;;;;:::o;59196:213::-;59340:13;59378:23;59393:7;59378:14;:23::i;:::-;59371:30;;59196:213;;;:::o;61787:222::-;6193:4;6166:31;;:9;:23;6176:12;:10;:12::i;:::-;6166:23;;;;;;;;;;;;;;;;;;;;;;;;;:31;;;6158:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;61903:9:::1;61898:104;61922:8;:15;61918:1;:19;61898:104;;;61959:31;61978:8;61987:1;61978:11;;;;;;;;:::i;:::-;;;;;;;;61959:18;:31::i;:::-;61939:3;;;;;:::i;:::-;;;;61898:104;;;;61787:222:::0;:::o;36531:164::-;36628:4;36652:18;:25;36671:5;36652:25;;;;;;;;;;;;;;;:35;36678:8;36652:35;;;;;;;;;;;;;;;;;;;;;;;;;36645:42;;36531:164;;;;:::o;59996:86::-;6193:4;6166:31;;:9;:23;6176:12;:10;:12::i;:::-;6166:23;;;;;;;;;;;;;;;;;;;;;;;;;:31;;;6158:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;60060:14:::1;60066:7;60060:5;:14::i;:::-;59996:86:::0;:::o;4988:201::-;4310:12;:10;:12::i;:::-;4299:23;;:7;:5;:7::i;:::-;:23;;;4291:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5097:1:::1;5077:22;;:8;:22;;;;5069:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;5153:28;5172:8;5153:18;:28::i;:::-;4988:201:::0;:::o;47686:170::-;47788:4;47812:36;47836:11;47812:23;:36::i;:::-;47805:43;;47686:170;;;:::o;2803:98::-;2856:7;2883:10;2876:17;;2803:98;:::o;23897:332::-;24016:17;:15;:17::i;:::-;24000:33;;:12;:33;;;;23992:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;24119:1;24099:22;;:8;:22;;;;24091:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;24186:35;;;;;;;;24198:8;24186:35;;;;;;24208:12;24186:35;;;;;24164:19;:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23897:332;;:::o;39266:127::-;39331:4;39383:1;39355:30;;:7;:16;39363:7;39355:16;;;;;;;;;;;;;;;;;;;;;:30;;;;39348:37;;39266:127;;;:::o;43412:174::-;43514:2;43487:15;:24;43503:7;43487:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;43570:7;43566:2;43532:46;;43541:23;43556:7;43541:14;:23::i;:::-;43532:46;;;;;;;;;;;;43412:174;;:::o;49476:217::-;49576:16;49584:7;49576;:16::i;:::-;49568:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;49676:9;49654:10;:19;49665:7;49654:19;;;;;;;;;;;:31;;;;;;;;;;;;:::i;:::-;;49476:217;;:::o;39560:348::-;39653:4;39678:16;39686:7;39678;:16::i;:::-;39670:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;39754:13;39770:23;39785:7;39770:14;:23::i;:::-;39754:39;;39823:5;39812:16;;:7;:16;;;:51;;;;39856:7;39832:31;;:20;39844:7;39832:11;:20::i;:::-;:31;;;39812:51;:87;;;;39867:32;39884:5;39891:7;39867:16;:32::i;:::-;39812:87;39804:96;;;39560:348;;;;:::o;42669:625::-;42828:4;42801:31;;:23;42816:7;42801:14;:23::i;:::-;:31;;;42793:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;42907:1;42893:16;;:2;:16;;;;42885:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;42963:39;42984:4;42990:2;42994:7;42963:20;:39::i;:::-;43067:29;43084:1;43088:7;43067:8;:29::i;:::-;43128:1;43109:9;:15;43119:4;43109:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;43157:1;43140:9;:13;43150:2;43140:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;43188:2;43169:7;:16;43177:7;43169:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;43227:7;43223:2;43208:27;;43217:4;43208:27;;;;;;;;;;;;43248:38;43268:4;43274:2;43278:7;43248:19;:38::i;:::-;42669:625;;;:::o;24724:390::-;24892:17;:15;:17::i;:::-;24876:33;;:12;:33;;;;24868:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;24995:1;24975:22;;:8;:22;;;;24967:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;25071:35;;;;;;;;25083:8;25071:35;;;;;;25093:12;25071:35;;;;;25042:17;:26;25060:7;25042:26;;;;;;;;;;;:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24724:390;;;:::o;23529:97::-;23587:6;23613:5;23606:12;;23529:97;:::o;8440:120::-;7984:8;:6;:8::i;:::-;7976:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;8509:5:::1;8499:7;;:15;;;;;;;;;;;;;;;;;;8530:22;8539:12;:10;:12::i;:::-;8530:22;;;;;;:::i;:::-;;;;;;;;8440:120::o:0;38638:315::-;38795:28;38805:4;38811:2;38815:7;38795:9;:28::i;:::-;38842:48;38865:4;38871:2;38875:7;38884:5;38842:22;:48::i;:::-;38834:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;38638:315;;;;:::o;5349:191::-;5423:16;5442:6;;;;;;;;;;;5423:25;;5468:8;5459:6;;:17;;;;;;;;;;;;;;;;;;5523:8;5492:40;;5513:8;5492:40;;;;;;;;;;;;5412:128;5349:191;:::o;40250:110::-;40326:26;40336:2;40340:7;40326:26;;;;;;;;;;;;:9;:26::i;:::-;40250:110;;:::o;8181:118::-;7707:8;:6;:8::i;:::-;7706:9;7698:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;8251:4:::1;8241:7;;:14;;;;;;;;;;;;;;;;;;8271:20;8278:12;:10;:12::i;:::-;8271:20;;;;;;:::i;:::-;;;;;;;;8181:118::o:0;43728:315::-;43883:8;43874:17;;:5;:17;;;;43866:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;43970:8;43932:18;:25;43951:5;43932:25;;;;;;;;;;;;;;;:35;43958:8;43932:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;44016:8;43994:41;;44009:5;43994:41;;;44026:8;43994:41;;;;;;:::i;:::-;;;;;;;;43728:315;;;:::o;24305:95::-;24373:19;;24366:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24305:95::o;48641:679::-;48714:13;48748:16;48756:7;48748;:16::i;:::-;48740:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;48831:23;48857:10;:19;48868:7;48857:19;;;;;;;;;;;48831:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48887:18;48908:10;:8;:10::i;:::-;48887:31;;49016:1;49000:4;48994:18;:23;48990:72;;;49041:9;49034:16;;;;;;48990:72;49192:1;49172:9;49166:23;:27;49162:108;;;49241:4;49247:9;49224:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;49210:48;;;;;;49162:108;49289:23;49304:7;49289:14;:23::i;:::-;49282:30;;;;48641:679;;;;:::o;25225:114::-;25305:17;:26;25323:7;25305:26;;;;;;;;;;;;25298:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25225:114;:::o;60206:170::-;60348:20;60360:7;60348:11;:20::i;:::-;60206:170;:::o;52106:224::-;52208:4;52247:35;52232:50;;;:11;:50;;;;:90;;;;52286:36;52310:11;52286:23;:36::i;:::-;52232:90;52225:97;;52106:224;;;:::o;60384:231::-;60562:45;60589:4;60595:2;60599:7;60562:26;:45::i;:::-;60384:231;;;:::o;46490:125::-;;;;:::o;44608:799::-;44763:4;44784:15;:2;:13;;;:15::i;:::-;44780:620;;;44836:2;44820:36;;;44857:12;:10;:12::i;:::-;44871:4;44877:7;44886:5;44820:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;44816:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45079:1;45062:6;:13;:18;45058:272;;;45105:60;;;;;;;;;;:::i;:::-;;;;;;;;45058:272;45280:6;45274:13;45265:6;45261:2;45257:15;45250:38;44816:529;44953:41;;;44943:51;;;:6;:51;;;;44936:58;;;;;44780:620;45384:4;45377:11;;44608:799;;;;;;;:::o;40587:321::-;40717:18;40723:2;40727:7;40717:5;:18::i;:::-;40768:54;40799:1;40803:2;40807:7;40816:5;40768:22;:54::i;:::-;40746:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;40587:321;;;:::o;58991:100::-;59043:13;59076:7;59069:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58991:100;:::o;34797:334::-;34870:13;34904:16;34912:7;34904;:16::i;:::-;34896:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;34985:21;35009:10;:8;:10::i;:::-;34985:34;;35061:1;35043:7;35037:21;:25;:86;;;;;;;;;;;;;;;;;35089:7;35098:18;:7;:16;:18::i;:::-;35072:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;35037:86;35030:93;;;34797:334;;;:::o;47988:135::-;48057:20;48069:7;48057:11;:20::i;:::-;48088:27;48107:7;48088:18;:27::i;:::-;47988:135;:::o;33508:305::-;33610:4;33662:25;33647:40;;;:11;:40;;;;:105;;;;33719:33;33704:48;;;:11;:48;;;;33647:105;:158;;;;33769:36;33793:11;33769:23;:36::i;:::-;33647:158;33627:178;;33508:305;;;:::o;50813:275::-;50957:45;50984:4;50990:2;50994:7;50957:26;:45::i;:::-;51024:8;:6;:8::i;:::-;51023:9;51015:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;50813:275;;;:::o;9800:326::-;9860:4;10117:1;10095:7;:19;;;:23;10088:30;;9800:326;;;:::o;41244:439::-;41338:1;41324:16;;:2;:16;;;;41316:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;41397:16;41405:7;41397;:16::i;:::-;41396:17;41388:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;41459:45;41488:1;41492:2;41496:7;41459:20;:45::i;:::-;41534:1;41517:9;:13;41527:2;41517:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;41565:2;41546:7;:16;41554:7;41546:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;41610:7;41606:2;41585:33;;41602:1;41585:33;;;;;;;;;;;;41631:44;41659:1;41663:2;41667:7;41631:19;:44::i;:::-;41244:439;;:::o;365:723::-;421:13;651:1;642:5;:10;638:53;;;669:10;;;;;;;;;;;;;;;;;;;;;638:53;701:12;716:5;701:20;;732:14;757:78;772:1;764:4;:9;757:78;;790:8;;;;;:::i;:::-;;;;821:2;813:10;;;;;:::i;:::-;;;757:78;;;845:19;877:6;867:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;845:39;;895:154;911:1;902:5;:10;895:154;;939:1;929:11;;;;;:::i;:::-;;;1006:2;998:5;:10;;;;:::i;:::-;985:2;:24;;;;:::i;:::-;972:39;;955:6;962;955:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1035:2;1026:11;;;;;:::i;:::-;;;895:154;;;1073:6;1059:21;;;;;365:723;;;;:::o;49922:206::-;49991:20;50003:7;49991:11;:20::i;:::-;50065:1;50034:10;:19;50045:7;50034:19;;;;;;;;;;;50028:33;;;;;:::i;:::-;;;:38;50024:97;;50090:10;:19;50101:7;50090:19;;;;;;;;;;;;50083:26;;;;:::i;:::-;50024:97;49922:206;:::o;22483:215::-;22585:4;22624:26;22609:41;;;:11;:41;;;;:81;;;;22654:36;22678:11;22654:23;:36::i;:::-;22609:81;22602:88;;22483:215;;;:::o;53782:589::-;53926:45;53953:4;53959:2;53963:7;53926:26;:45::i;:::-;54004:1;53988:18;;:4;:18;;;53984:187;;;54023:40;54055:7;54023:31;:40::i;:::-;53984:187;;;54093:2;54085:10;;:4;:10;;;54081:90;;54112:47;54145:4;54151:7;54112:32;:47::i;:::-;54081:90;53984:187;54199:1;54185:16;;:2;:16;;;54181:183;;;54218:45;54255:7;54218:36;:45::i;:::-;54181:183;;;54291:4;54285:10;;:2;:10;;;54281:83;;54312:40;54340:2;54344:7;54312:27;:40::i;:::-;54281:83;54181:183;53782:589;;;:::o;41912:420::-;41972:13;41988:23;42003:7;41988:14;:23::i;:::-;41972:39;;42024:48;42045:5;42060:1;42064:7;42024:20;:48::i;:::-;42113:29;42130:1;42134:7;42113:8;:29::i;:::-;42175:1;42155:9;:16;42165:5;42155:16;;;;;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;42194:7;:16;42202:7;42194:16;;;;;;;;;;;;42187:23;;;;;;;;;;;42256:7;42252:1;42228:36;;42237:5;42228:36;;;;;;;;;;;;42277:47;42297:5;42312:1;42316:7;42277:19;:47::i;:::-;41961:371;41912:420;:::o;20933:157::-;21018:4;21057:25;21042:40;;;:11;:40;;;;21035:47;;20933:157;;;:::o;45979:126::-;;;;:::o;55094:164::-;55198:10;:17;;;;55171:15;:24;55187:7;55171:24;;;;;;;;;;;:44;;;;55226:10;55242:7;55226:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55094:164;:::o;55885:988::-;56151:22;56201:1;56176:22;56193:4;56176:16;:22::i;:::-;:26;;;;:::i;:::-;56151:51;;56213:18;56234:17;:26;56252:7;56234:26;;;;;;;;;;;;56213:47;;56381:14;56367:10;:28;56363:328;;56412:19;56434:12;:18;56447:4;56434:18;;;;;;;;;;;;;;;:34;56453:14;56434:34;;;;;;;;;;;;56412:56;;56518:11;56485:12;:18;56498:4;56485:18;;;;;;;;;;;;;;;:30;56504:10;56485:30;;;;;;;;;;;:44;;;;56635:10;56602:17;:30;56620:11;56602:30;;;;;;;;;;;:43;;;;56397:294;56363:328;56787:17;:26;56805:7;56787:26;;;;;;;;;;;56780:33;;;56831:12;:18;56844:4;56831:18;;;;;;;;;;;;;;;:34;56850:14;56831:34;;;;;;;;;;;56824:41;;;55966:907;;55885:988;;:::o;57168:1079::-;57421:22;57466:1;57446:10;:17;;;;:21;;;;:::i;:::-;57421:46;;57478:18;57499:15;:24;57515:7;57499:24;;;;;;;;;;;;57478:45;;57850:19;57872:10;57883:14;57872:26;;;;;;;;:::i;:::-;;;;;;;;;;57850:48;;57936:11;57911:10;57922;57911:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;58047:10;58016:15;:28;58032:11;58016:28;;;;;;;;;;;:41;;;;58188:15;:24;58204:7;58188:24;;;;;;;;;;;58181:31;;;58223:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;57239:1008;;;57168:1079;:::o;54672:221::-;54757:14;54774:20;54791:2;54774:16;:20::i;:::-;54757:37;;54832:7;54805:12;:16;54818:2;54805:16;;;;;;;;;;;;;;;:24;54822:6;54805:24;;;;;;;;;;;:34;;;;54879:6;54850:17;:26;54868:7;54850:26;;;;;;;;;;;:35;;;;54746:147;54672:221;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::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:137::-;4577:5;4615:6;4602:20;4593:29;;4631:32;4657:5;4631:32;:::i;:::-;4532:137;;;;:::o;4675:141::-;4731:5;4762:6;4756:13;4747:22;;4778:32;4804:5;4778:32;:::i;:::-;4675:141;;;;:::o;4835:338::-;4890:5;4939:3;4932:4;4924:6;4920:17;4916:27;4906:122;;4947:79;;:::i;:::-;4906:122;5064:6;5051:20;5089:78;5163:3;5155:6;5148:4;5140:6;5136:17;5089:78;:::i;:::-;5080:87;;4896:277;4835:338;;;;:::o;5193:340::-;5249:5;5298:3;5291:4;5283:6;5279:17;5275:27;5265:122;;5306:79;;:::i;:::-;5265:122;5423:6;5410:20;5448:79;5523:3;5515:6;5508:4;5500:6;5496:17;5448:79;:::i;:::-;5439:88;;5255:278;5193:340;;;;:::o;5539:139::-;5585:5;5623:6;5610:20;5601:29;;5639:33;5666:5;5639:33;:::i;:::-;5539:139;;;;:::o;5684:137::-;5729:5;5767:6;5754:20;5745:29;;5783:32;5809:5;5783:32;:::i;:::-;5684:137;;;;:::o;5827:329::-;5886:6;5935:2;5923:9;5914:7;5910:23;5906:32;5903:119;;;5941:79;;:::i;:::-;5903:119;6061:1;6086:53;6131:7;6122:6;6111:9;6107:22;6086:53;:::i;:::-;6076:63;;6032:117;5827:329;;;;:::o;6162:474::-;6230:6;6238;6287:2;6275:9;6266:7;6262:23;6258:32;6255:119;;;6293:79;;:::i;:::-;6255:119;6413:1;6438:53;6483:7;6474:6;6463:9;6459:22;6438:53;:::i;:::-;6428:63;;6384:117;6540:2;6566:53;6611:7;6602:6;6591:9;6587:22;6566:53;:::i;:::-;6556:63;;6511:118;6162:474;;;;;:::o;6642:619::-;6719:6;6727;6735;6784:2;6772:9;6763:7;6759:23;6755:32;6752:119;;;6790:79;;:::i;:::-;6752:119;6910:1;6935:53;6980:7;6971:6;6960:9;6956:22;6935:53;:::i;:::-;6925:63;;6881:117;7037:2;7063:53;7108:7;7099:6;7088:9;7084:22;7063:53;:::i;:::-;7053:63;;7008:118;7165:2;7191:53;7236:7;7227:6;7216:9;7212:22;7191:53;:::i;:::-;7181:63;;7136:118;6642:619;;;;;:::o;7267:943::-;7362:6;7370;7378;7386;7435:3;7423:9;7414:7;7410:23;7406:33;7403:120;;;7442:79;;:::i;:::-;7403:120;7562:1;7587:53;7632:7;7623:6;7612:9;7608:22;7587:53;:::i;:::-;7577:63;;7533:117;7689:2;7715:53;7760:7;7751:6;7740:9;7736:22;7715:53;:::i;:::-;7705:63;;7660:118;7817:2;7843:53;7888:7;7879:6;7868:9;7864:22;7843:53;:::i;:::-;7833:63;;7788:118;7973:2;7962:9;7958:18;7945:32;8004:18;7996:6;7993:30;7990:117;;;8026:79;;:::i;:::-;7990:117;8131:62;8185:7;8176:6;8165:9;8161:22;8131:62;:::i;:::-;8121:72;;7916:287;7267:943;;;;;;;:::o;8216:468::-;8281:6;8289;8338:2;8326:9;8317:7;8313:23;8309:32;8306:119;;;8344:79;;:::i;:::-;8306:119;8464:1;8489:53;8534:7;8525:6;8514:9;8510:22;8489:53;:::i;:::-;8479:63;;8435:117;8591:2;8617:50;8659:7;8650:6;8639:9;8635:22;8617:50;:::i;:::-;8607:60;;8562:115;8216:468;;;;;:::o;8690:474::-;8758:6;8766;8815:2;8803:9;8794:7;8790:23;8786:32;8783:119;;;8821:79;;:::i;:::-;8783:119;8941:1;8966:53;9011:7;9002:6;8991:9;8987:22;8966:53;:::i;:::-;8956:63;;8912:117;9068:2;9094:53;9139:7;9130:6;9119:9;9115:22;9094:53;:::i;:::-;9084:63;;9039:118;8690:474;;;;;:::o;9170:472::-;9237:6;9245;9294:2;9282:9;9273:7;9269:23;9265:32;9262:119;;;9300:79;;:::i;:::-;9262:119;9420:1;9445:53;9490:7;9481:6;9470:9;9466:22;9445:53;:::i;:::-;9435:63;;9391:117;9547:2;9573:52;9617:7;9608:6;9597:9;9593:22;9573:52;:::i;:::-;9563:62;;9518:117;9170:472;;;;;:::o;9648:539::-;9732:6;9781:2;9769:9;9760:7;9756:23;9752:32;9749:119;;;9787:79;;:::i;:::-;9749:119;9935:1;9924:9;9920:17;9907:31;9965:18;9957:6;9954:30;9951:117;;;9987:79;;:::i;:::-;9951:117;10092:78;10162:7;10153:6;10142:9;10138:22;10092:78;:::i;:::-;10082:88;;9878:302;9648:539;;;;:::o;10193:1247::-;10344:6;10352;10360;10409:2;10397:9;10388:7;10384:23;10380:32;10377:119;;;10415:79;;:::i;:::-;10377:119;10563:1;10552:9;10548:17;10535:31;10593:18;10585:6;10582:30;10579:117;;;10615:79;;:::i;:::-;10579:117;10720:78;10790:7;10781:6;10770:9;10766:22;10720:78;:::i;:::-;10710:88;;10506:302;10875:2;10864:9;10860:18;10847:32;10906:18;10898:6;10895:30;10892:117;;;10928:79;;:::i;:::-;10892:117;11033:78;11103:7;11094:6;11083:9;11079:22;11033:78;:::i;:::-;11023:88;;10818:303;11188:2;11177:9;11173:18;11160:32;11219:18;11211:6;11208:30;11205:117;;;11241:79;;:::i;:::-;11205:117;11346:77;11415:7;11406:6;11395:9;11391:22;11346:77;:::i;:::-;11336:87;;11131:302;10193:1247;;;;;:::o;11446:327::-;11504:6;11553:2;11541:9;11532:7;11528:23;11524:32;11521:119;;;11559:79;;:::i;:::-;11521:119;11679:1;11704:52;11748:7;11739:6;11728:9;11724:22;11704:52;:::i;:::-;11694:62;;11650:116;11446:327;;;;:::o;11779:349::-;11848:6;11897:2;11885:9;11876:7;11872:23;11868:32;11865:119;;;11903:79;;:::i;:::-;11865:119;12023:1;12048:63;12103:7;12094:6;12083:9;12079:22;12048:63;:::i;:::-;12038:73;;11994:127;11779:349;;;;:::o;12134:509::-;12203:6;12252:2;12240:9;12231:7;12227:23;12223:32;12220:119;;;12258:79;;:::i;:::-;12220:119;12406:1;12395:9;12391:17;12378:31;12436:18;12428:6;12425:30;12422:117;;;12458:79;;:::i;:::-;12422:117;12563:63;12618:7;12609:6;12598:9;12594:22;12563:63;:::i;:::-;12553:73;;12349:287;12134:509;;;;:::o;12649:329::-;12708:6;12757:2;12745:9;12736:7;12732:23;12728:32;12725:119;;;12763:79;;:::i;:::-;12725:119;12883:1;12908:53;12953:7;12944:6;12933:9;12929:22;12908:53;:::i;:::-;12898:63;;12854:117;12649:329;;;;:::o;12984:654::-;13062:6;13070;13119:2;13107:9;13098:7;13094:23;13090:32;13087:119;;;13125:79;;:::i;:::-;13087:119;13245:1;13270:53;13315:7;13306:6;13295:9;13291:22;13270:53;:::i;:::-;13260:63;;13216:117;13400:2;13389:9;13385:18;13372:32;13431:18;13423:6;13420:30;13417:117;;;13453:79;;:::i;:::-;13417:117;13558:63;13613:7;13604:6;13593:9;13589:22;13558:63;:::i;:::-;13548:73;;13343:288;12984:654;;;;;:::o;13644:474::-;13712:6;13720;13769:2;13757:9;13748:7;13744:23;13740:32;13737:119;;;13775:79;;:::i;:::-;13737:119;13895:1;13920:53;13965:7;13956:6;13945:9;13941:22;13920:53;:::i;:::-;13910:63;;13866:117;14022:2;14048:53;14093:7;14084:6;14073:9;14069:22;14048:53;:::i;:::-;14038:63;;13993:118;13644:474;;;;;:::o;14124:118::-;14211:24;14229:5;14211:24;:::i;:::-;14206:3;14199:37;14124:118;;:::o;14248:109::-;14329:21;14344:5;14329:21;:::i;:::-;14324:3;14317:34;14248:109;;:::o;14363:360::-;14449:3;14477:38;14509:5;14477:38;:::i;:::-;14531:70;14594:6;14589:3;14531:70;:::i;:::-;14524:77;;14610:52;14655:6;14650:3;14643:4;14636:5;14632:16;14610:52;:::i;:::-;14687:29;14709:6;14687:29;:::i;:::-;14682:3;14678:39;14671:46;;14453:270;14363:360;;;;:::o;14729:364::-;14817:3;14845:39;14878:5;14845:39;:::i;:::-;14900:71;14964:6;14959:3;14900:71;:::i;:::-;14893:78;;14980:52;15025:6;15020:3;15013:4;15006:5;15002:16;14980:52;:::i;:::-;15057:29;15079:6;15057:29;:::i;:::-;15052:3;15048:39;15041:46;;14821:272;14729:364;;;;:::o;15099:377::-;15205:3;15233:39;15266:5;15233:39;:::i;:::-;15288:89;15370:6;15365:3;15288:89;:::i;:::-;15281:96;;15386:52;15431:6;15426:3;15419:4;15412:5;15408:16;15386:52;:::i;:::-;15463:6;15458:3;15454:16;15447:23;;15209:267;15099:377;;;;:::o;15482:366::-;15624:3;15645:67;15709:2;15704:3;15645:67;:::i;:::-;15638:74;;15721:93;15810:3;15721:93;:::i;:::-;15839:2;15834:3;15830:12;15823:19;;15482:366;;;:::o;15854:::-;15996:3;16017:67;16081:2;16076:3;16017:67;:::i;:::-;16010:74;;16093:93;16182:3;16093:93;:::i;:::-;16211:2;16206:3;16202:12;16195:19;;15854:366;;;:::o;16226:::-;16368:3;16389:67;16453:2;16448:3;16389:67;:::i;:::-;16382:74;;16465:93;16554:3;16465:93;:::i;:::-;16583:2;16578:3;16574:12;16567:19;;16226:366;;;:::o;16598:::-;16740:3;16761:67;16825:2;16820:3;16761:67;:::i;:::-;16754:74;;16837:93;16926:3;16837:93;:::i;:::-;16955:2;16950:3;16946:12;16939:19;;16598:366;;;:::o;16970:::-;17112:3;17133:67;17197:2;17192:3;17133:67;:::i;:::-;17126:74;;17209:93;17298:3;17209:93;:::i;:::-;17327:2;17322:3;17318:12;17311:19;;16970:366;;;:::o;17342:::-;17484:3;17505:67;17569:2;17564:3;17505:67;:::i;:::-;17498:74;;17581:93;17670:3;17581:93;:::i;:::-;17699:2;17694:3;17690:12;17683:19;;17342:366;;;:::o;17714:::-;17856:3;17877:67;17941:2;17936:3;17877:67;:::i;:::-;17870:74;;17953:93;18042:3;17953:93;:::i;:::-;18071:2;18066:3;18062:12;18055:19;;17714:366;;;:::o;18086:::-;18228:3;18249:67;18313:2;18308:3;18249:67;:::i;:::-;18242:74;;18325:93;18414:3;18325:93;:::i;:::-;18443:2;18438:3;18434:12;18427:19;;18086:366;;;:::o;18458:::-;18600:3;18621:67;18685:2;18680:3;18621:67;:::i;:::-;18614:74;;18697:93;18786:3;18697:93;:::i;:::-;18815:2;18810:3;18806:12;18799:19;;18458:366;;;:::o;18830:::-;18972:3;18993:67;19057:2;19052:3;18993:67;:::i;:::-;18986:74;;19069:93;19158:3;19069:93;:::i;:::-;19187:2;19182:3;19178:12;19171:19;;18830:366;;;:::o;19202:::-;19344:3;19365:67;19429:2;19424:3;19365:67;:::i;:::-;19358:74;;19441:93;19530:3;19441:93;:::i;:::-;19559:2;19554:3;19550:12;19543:19;;19202:366;;;:::o;19574:::-;19716:3;19737:67;19801:2;19796:3;19737:67;:::i;:::-;19730:74;;19813:93;19902:3;19813:93;:::i;:::-;19931:2;19926:3;19922:12;19915:19;;19574:366;;;:::o;19946:::-;20088:3;20109:67;20173:2;20168:3;20109:67;:::i;:::-;20102:74;;20185:93;20274:3;20185:93;:::i;:::-;20303:2;20298:3;20294:12;20287:19;;19946:366;;;:::o;20318:::-;20460:3;20481:67;20545:2;20540:3;20481:67;:::i;:::-;20474:74;;20557:93;20646:3;20557:93;:::i;:::-;20675:2;20670:3;20666:12;20659:19;;20318:366;;;:::o;20690:::-;20832:3;20853:67;20917:2;20912:3;20853:67;:::i;:::-;20846:74;;20929:93;21018:3;20929:93;:::i;:::-;21047:2;21042:3;21038:12;21031:19;;20690:366;;;:::o;21062:::-;21204:3;21225:67;21289:2;21284:3;21225:67;:::i;:::-;21218:74;;21301:93;21390:3;21301:93;:::i;:::-;21419:2;21414:3;21410:12;21403:19;;21062:366;;;:::o;21434:::-;21576:3;21597:67;21661:2;21656:3;21597:67;:::i;:::-;21590:74;;21673:93;21762:3;21673:93;:::i;:::-;21791:2;21786:3;21782:12;21775:19;;21434:366;;;:::o;21806:::-;21948:3;21969:67;22033:2;22028:3;21969:67;:::i;:::-;21962:74;;22045:93;22134:3;22045:93;:::i;:::-;22163:2;22158:3;22154:12;22147:19;;21806:366;;;:::o;22178:::-;22320:3;22341:67;22405:2;22400:3;22341:67;:::i;:::-;22334:74;;22417:93;22506:3;22417:93;:::i;:::-;22535:2;22530:3;22526:12;22519:19;;22178:366;;;:::o;22550:::-;22692:3;22713:67;22777:2;22772:3;22713:67;:::i;:::-;22706:74;;22789:93;22878:3;22789:93;:::i;:::-;22907:2;22902:3;22898:12;22891:19;;22550:366;;;:::o;22922:::-;23064:3;23085:67;23149:2;23144:3;23085:67;:::i;:::-;23078:74;;23161:93;23250:3;23161:93;:::i;:::-;23279:2;23274:3;23270:12;23263:19;;22922:366;;;:::o;23294:::-;23436:3;23457:67;23521:2;23516:3;23457:67;:::i;:::-;23450:74;;23533:93;23622:3;23533:93;:::i;:::-;23651:2;23646:3;23642:12;23635:19;;23294:366;;;:::o;23666:::-;23808:3;23829:67;23893:2;23888:3;23829:67;:::i;:::-;23822:74;;23905:93;23994:3;23905:93;:::i;:::-;24023:2;24018:3;24014:12;24007:19;;23666:366;;;:::o;24038:::-;24180:3;24201:67;24265:2;24260:3;24201:67;:::i;:::-;24194:74;;24277:93;24366:3;24277:93;:::i;:::-;24395:2;24390:3;24386:12;24379:19;;24038:366;;;:::o;24410:::-;24552:3;24573:67;24637:2;24632:3;24573:67;:::i;:::-;24566:74;;24649:93;24738:3;24649:93;:::i;:::-;24767:2;24762:3;24758:12;24751:19;;24410:366;;;:::o;24782:::-;24924:3;24945:67;25009:2;25004:3;24945:67;:::i;:::-;24938:74;;25021:93;25110:3;25021:93;:::i;:::-;25139:2;25134:3;25130:12;25123:19;;24782:366;;;:::o;25154:::-;25296:3;25317:67;25381:2;25376:3;25317:67;:::i;:::-;25310:74;;25393:93;25482:3;25393:93;:::i;:::-;25511:2;25506:3;25502:12;25495:19;;25154:366;;;:::o;25526:::-;25668:3;25689:67;25753:2;25748:3;25689:67;:::i;:::-;25682:74;;25765:93;25854:3;25765:93;:::i;:::-;25883:2;25878:3;25874:12;25867:19;;25526:366;;;:::o;25898:118::-;25985:24;26003:5;25985:24;:::i;:::-;25980:3;25973:37;25898:118;;:::o;26022:435::-;26202:3;26224:95;26315:3;26306:6;26224:95;:::i;:::-;26217:102;;26336:95;26427:3;26418:6;26336:95;:::i;:::-;26329:102;;26448:3;26441:10;;26022:435;;;;;:::o;26463:222::-;26556:4;26594:2;26583:9;26579:18;26571:26;;26607:71;26675:1;26664:9;26660:17;26651:6;26607:71;:::i;:::-;26463:222;;;;:::o;26691:640::-;26886:4;26924:3;26913:9;26909:19;26901:27;;26938:71;27006:1;26995:9;26991:17;26982:6;26938:71;:::i;:::-;27019:72;27087:2;27076:9;27072:18;27063:6;27019:72;:::i;:::-;27101;27169:2;27158:9;27154:18;27145:6;27101:72;:::i;:::-;27220:9;27214:4;27210:20;27205:2;27194:9;27190:18;27183:48;27248:76;27319:4;27310:6;27248:76;:::i;:::-;27240:84;;26691:640;;;;;;;:::o;27337:332::-;27458:4;27496:2;27485:9;27481:18;27473:26;;27509:71;27577:1;27566:9;27562:17;27553:6;27509:71;:::i;:::-;27590:72;27658:2;27647:9;27643:18;27634:6;27590:72;:::i;:::-;27337:332;;;;;:::o;27675:210::-;27762:4;27800:2;27789:9;27785:18;27777:26;;27813:65;27875:1;27864:9;27860:17;27851:6;27813:65;:::i;:::-;27675:210;;;;:::o;27891:313::-;28004:4;28042:2;28031:9;28027:18;28019:26;;28091:9;28085:4;28081:20;28077:1;28066:9;28062:17;28055:47;28119:78;28192:4;28183:6;28119:78;:::i;:::-;28111:86;;27891:313;;;;:::o;28210:419::-;28376:4;28414:2;28403:9;28399:18;28391:26;;28463:9;28457:4;28453:20;28449:1;28438:9;28434:17;28427:47;28491:131;28617:4;28491:131;:::i;:::-;28483:139;;28210:419;;;:::o;28635:::-;28801:4;28839:2;28828:9;28824:18;28816:26;;28888:9;28882:4;28878:20;28874:1;28863:9;28859:17;28852:47;28916:131;29042:4;28916:131;:::i;:::-;28908:139;;28635:419;;;:::o;29060:::-;29226:4;29264:2;29253:9;29249:18;29241:26;;29313:9;29307:4;29303:20;29299:1;29288:9;29284:17;29277:47;29341:131;29467:4;29341:131;:::i;:::-;29333:139;;29060:419;;;:::o;29485:::-;29651:4;29689:2;29678:9;29674:18;29666:26;;29738:9;29732:4;29728:20;29724:1;29713:9;29709:17;29702:47;29766:131;29892:4;29766:131;:::i;:::-;29758:139;;29485:419;;;:::o;29910:::-;30076:4;30114:2;30103:9;30099:18;30091:26;;30163:9;30157:4;30153:20;30149:1;30138:9;30134:17;30127:47;30191:131;30317:4;30191:131;:::i;:::-;30183:139;;29910:419;;;:::o;30335:::-;30501:4;30539:2;30528:9;30524:18;30516:26;;30588:9;30582:4;30578:20;30574:1;30563:9;30559:17;30552:47;30616:131;30742:4;30616:131;:::i;:::-;30608:139;;30335:419;;;:::o;30760:::-;30926:4;30964:2;30953:9;30949:18;30941:26;;31013:9;31007:4;31003:20;30999:1;30988:9;30984:17;30977:47;31041:131;31167:4;31041:131;:::i;:::-;31033:139;;30760:419;;;:::o;31185:::-;31351:4;31389:2;31378:9;31374:18;31366:26;;31438:9;31432:4;31428:20;31424:1;31413:9;31409:17;31402:47;31466:131;31592:4;31466:131;:::i;:::-;31458:139;;31185:419;;;:::o;31610:::-;31776:4;31814:2;31803:9;31799:18;31791:26;;31863:9;31857:4;31853:20;31849:1;31838:9;31834:17;31827:47;31891:131;32017:4;31891:131;:::i;:::-;31883:139;;31610:419;;;:::o;32035:::-;32201:4;32239:2;32228:9;32224:18;32216:26;;32288:9;32282:4;32278:20;32274:1;32263:9;32259:17;32252:47;32316:131;32442:4;32316:131;:::i;:::-;32308:139;;32035:419;;;:::o;32460:::-;32626:4;32664:2;32653:9;32649:18;32641:26;;32713:9;32707:4;32703:20;32699:1;32688:9;32684:17;32677:47;32741:131;32867:4;32741:131;:::i;:::-;32733:139;;32460:419;;;:::o;32885:::-;33051:4;33089:2;33078:9;33074:18;33066:26;;33138:9;33132:4;33128:20;33124:1;33113:9;33109:17;33102:47;33166:131;33292:4;33166:131;:::i;:::-;33158:139;;32885:419;;;:::o;33310:::-;33476:4;33514:2;33503:9;33499:18;33491:26;;33563:9;33557:4;33553:20;33549:1;33538:9;33534:17;33527:47;33591:131;33717:4;33591:131;:::i;:::-;33583:139;;33310:419;;;:::o;33735:::-;33901:4;33939:2;33928:9;33924:18;33916:26;;33988:9;33982:4;33978:20;33974:1;33963:9;33959:17;33952:47;34016:131;34142:4;34016:131;:::i;:::-;34008:139;;33735:419;;;:::o;34160:::-;34326:4;34364:2;34353:9;34349:18;34341:26;;34413:9;34407:4;34403:20;34399:1;34388:9;34384:17;34377:47;34441:131;34567:4;34441:131;:::i;:::-;34433:139;;34160:419;;;:::o;34585:::-;34751:4;34789:2;34778:9;34774:18;34766:26;;34838:9;34832:4;34828:20;34824:1;34813:9;34809:17;34802:47;34866:131;34992:4;34866:131;:::i;:::-;34858:139;;34585:419;;;:::o;35010:::-;35176:4;35214:2;35203:9;35199:18;35191:26;;35263:9;35257:4;35253:20;35249:1;35238:9;35234:17;35227:47;35291:131;35417:4;35291:131;:::i;:::-;35283:139;;35010:419;;;:::o;35435:::-;35601:4;35639:2;35628:9;35624:18;35616:26;;35688:9;35682:4;35678:20;35674:1;35663:9;35659:17;35652:47;35716:131;35842:4;35716:131;:::i;:::-;35708:139;;35435:419;;;:::o;35860:::-;36026:4;36064:2;36053:9;36049:18;36041:26;;36113:9;36107:4;36103:20;36099:1;36088:9;36084:17;36077:47;36141:131;36267:4;36141:131;:::i;:::-;36133:139;;35860:419;;;:::o;36285:::-;36451:4;36489:2;36478:9;36474:18;36466:26;;36538:9;36532:4;36528:20;36524:1;36513:9;36509:17;36502:47;36566:131;36692:4;36566:131;:::i;:::-;36558:139;;36285:419;;;:::o;36710:::-;36876:4;36914:2;36903:9;36899:18;36891:26;;36963:9;36957:4;36953:20;36949:1;36938:9;36934:17;36927:47;36991:131;37117:4;36991:131;:::i;:::-;36983:139;;36710:419;;;:::o;37135:::-;37301:4;37339:2;37328:9;37324:18;37316:26;;37388:9;37382:4;37378:20;37374:1;37363:9;37359:17;37352:47;37416:131;37542:4;37416:131;:::i;:::-;37408:139;;37135:419;;;:::o;37560:::-;37726:4;37764:2;37753:9;37749:18;37741:26;;37813:9;37807:4;37803:20;37799:1;37788:9;37784:17;37777:47;37841:131;37967:4;37841:131;:::i;:::-;37833:139;;37560:419;;;:::o;37985:::-;38151:4;38189:2;38178:9;38174:18;38166:26;;38238:9;38232:4;38228:20;38224:1;38213:9;38209:17;38202:47;38266:131;38392:4;38266:131;:::i;:::-;38258:139;;37985:419;;;:::o;38410:::-;38576:4;38614:2;38603:9;38599:18;38591:26;;38663:9;38657:4;38653:20;38649:1;38638:9;38634:17;38627:47;38691:131;38817:4;38691:131;:::i;:::-;38683:139;;38410:419;;;:::o;38835:::-;39001:4;39039:2;39028:9;39024:18;39016:26;;39088:9;39082:4;39078:20;39074:1;39063:9;39059:17;39052:47;39116:131;39242:4;39116:131;:::i;:::-;39108:139;;38835:419;;;:::o;39260:::-;39426:4;39464:2;39453:9;39449:18;39441:26;;39513:9;39507:4;39503:20;39499:1;39488:9;39484:17;39477:47;39541:131;39667:4;39541:131;:::i;:::-;39533:139;;39260:419;;;:::o;39685:::-;39851:4;39889:2;39878:9;39874:18;39866:26;;39938:9;39932:4;39928:20;39924:1;39913:9;39909:17;39902:47;39966:131;40092:4;39966:131;:::i;:::-;39958:139;;39685:419;;;:::o;40110:222::-;40203:4;40241:2;40230:9;40226:18;40218:26;;40254:71;40322:1;40311:9;40307:17;40298:6;40254:71;:::i;:::-;40110:222;;;;:::o;40338:129::-;40372:6;40399:20;;:::i;:::-;40389:30;;40428:33;40456:4;40448:6;40428:33;:::i;:::-;40338:129;;;:::o;40473:75::-;40506:6;40539:2;40533:9;40523:19;;40473:75;:::o;40554:311::-;40631:4;40721:18;40713:6;40710:30;40707:56;;;40743:18;;:::i;:::-;40707:56;40793:4;40785:6;40781:17;40773:25;;40853:4;40847;40843:15;40835:23;;40554:311;;;:::o;40871:::-;40948:4;41038:18;41030:6;41027:30;41024:56;;;41060:18;;:::i;:::-;41024:56;41110:4;41102:6;41098:17;41090:25;;41170:4;41164;41160:15;41152:23;;40871:311;;;:::o;41188:310::-;41264:4;41354:18;41346:6;41343:30;41340:56;;;41376:18;;:::i;:::-;41340:56;41426:4;41418:6;41414:17;41406:25;;41486:4;41480;41476:15;41468:23;;41188:310;;;:::o;41504:307::-;41565:4;41655:18;41647:6;41644:30;41641:56;;;41677:18;;:::i;:::-;41641:56;41715:29;41737:6;41715:29;:::i;:::-;41707:37;;41799:4;41793;41789:15;41781:23;;41504:307;;;:::o;41817:308::-;41879:4;41969:18;41961:6;41958:30;41955:56;;;41991:18;;:::i;:::-;41955:56;42029:29;42051:6;42029:29;:::i;:::-;42021:37;;42113:4;42107;42103:15;42095:23;;41817:308;;;:::o;42131:98::-;42182:6;42216:5;42210:12;42200:22;;42131:98;;;:::o;42235:99::-;42287:6;42321:5;42315:12;42305:22;;42235:99;;;:::o;42340:168::-;42423:11;42457:6;42452:3;42445:19;42497:4;42492:3;42488:14;42473:29;;42340:168;;;;:::o;42514:169::-;42598:11;42632:6;42627:3;42620:19;42672:4;42667:3;42663:14;42648:29;;42514:169;;;;:::o;42689:148::-;42791:11;42828:3;42813:18;;42689:148;;;;:::o;42843:305::-;42883:3;42902:20;42920:1;42902:20;:::i;:::-;42897:25;;42936:20;42954:1;42936:20;:::i;:::-;42931:25;;43090:1;43022:66;43018:74;43015:1;43012:81;43009:107;;;43096:18;;:::i;:::-;43009:107;43140:1;43137;43133:9;43126:16;;42843:305;;;;:::o;43154:185::-;43194:1;43211:20;43229:1;43211:20;:::i;:::-;43206:25;;43245:20;43263:1;43245:20;:::i;:::-;43240:25;;43284:1;43274:35;;43289:18;;:::i;:::-;43274:35;43331:1;43328;43324:9;43319:14;;43154:185;;;;:::o;43345:348::-;43385:7;43408:20;43426:1;43408:20;:::i;:::-;43403:25;;43442:20;43460:1;43442:20;:::i;:::-;43437:25;;43630:1;43562:66;43558:74;43555:1;43552:81;43547:1;43540:9;43533:17;43529:105;43526:131;;;43637:18;;:::i;:::-;43526:131;43685:1;43682;43678:9;43667:20;;43345:348;;;;:::o;43699:191::-;43739:4;43759:20;43777:1;43759:20;:::i;:::-;43754:25;;43793:20;43811:1;43793:20;:::i;:::-;43788:25;;43832:1;43829;43826:8;43823:34;;;43837:18;;:::i;:::-;43823:34;43882:1;43879;43875:9;43867:17;;43699:191;;;;:::o;43896:96::-;43933:7;43962:24;43980:5;43962:24;:::i;:::-;43951:35;;43896:96;;;:::o;43998:90::-;44032:7;44075:5;44068:13;44061:21;44050:32;;43998:90;;;:::o;44094:149::-;44130:7;44170:66;44163:5;44159:78;44148:89;;44094:149;;;:::o;44249:126::-;44286:7;44326:42;44319:5;44315:54;44304:65;;44249:126;;;:::o;44381:77::-;44418:7;44447:5;44436:16;;44381:77;;;:::o;44464:109::-;44500:7;44540:26;44533:5;44529:38;44518:49;;44464:109;;;:::o;44579:154::-;44663:6;44658:3;44653;44640:30;44725:1;44716:6;44711:3;44707:16;44700:27;44579:154;;;:::o;44739:307::-;44807:1;44817:113;44831:6;44828:1;44825:13;44817:113;;;44916:1;44911:3;44907:11;44901:18;44897:1;44892:3;44888:11;44881:39;44853:2;44850:1;44846:10;44841:15;;44817:113;;;44948:6;44945:1;44942:13;44939:101;;;45028:1;45019:6;45014:3;45010:16;45003:27;44939:101;44788:258;44739:307;;;:::o;45052:320::-;45096:6;45133:1;45127:4;45123:12;45113:22;;45180:1;45174:4;45170:12;45201:18;45191:81;;45257:4;45249:6;45245:17;45235:27;;45191:81;45319:2;45311:6;45308:14;45288:18;45285:38;45282:84;;;45338:18;;:::i;:::-;45282:84;45103:269;45052:320;;;:::o;45378:281::-;45461:27;45483:4;45461:27;:::i;:::-;45453:6;45449:40;45591:6;45579:10;45576:22;45555:18;45543:10;45540:34;45537:62;45534:88;;;45602:18;;:::i;:::-;45534:88;45642:10;45638:2;45631:22;45421:238;45378:281;;:::o;45665:233::-;45704:3;45727:24;45745:5;45727:24;:::i;:::-;45718:33;;45773:66;45766:5;45763:77;45760:103;;;45843:18;;:::i;:::-;45760:103;45890:1;45883:5;45879:13;45872:20;;45665:233;;;:::o;45904:176::-;45936:1;45953:20;45971:1;45953:20;:::i;:::-;45948:25;;45987:20;46005:1;45987:20;:::i;:::-;45982:25;;46026:1;46016:35;;46031:18;;:::i;:::-;46016:35;46072:1;46069;46065:9;46060:14;;45904:176;;;;:::o;46086:180::-;46134:77;46131:1;46124:88;46231:4;46228:1;46221:15;46255:4;46252:1;46245:15;46272:180;46320:77;46317:1;46310:88;46417:4;46414:1;46407:15;46441:4;46438:1;46431:15;46458:180;46506:77;46503:1;46496:88;46603:4;46600:1;46593:15;46627:4;46624:1;46617:15;46644:180;46692:77;46689:1;46682:88;46789:4;46786:1;46779:15;46813:4;46810:1;46803:15;46830:180;46878:77;46875:1;46868:88;46975:4;46972:1;46965:15;46999:4;46996:1;46989:15;47016:180;47064:77;47061:1;47054:88;47161:4;47158:1;47151:15;47185:4;47182:1;47175:15;47202:117;47311:1;47308;47301:12;47325:117;47434:1;47431;47424:12;47448:117;47557:1;47554;47547:12;47571:117;47680:1;47677;47670:12;47694:117;47803:1;47800;47793:12;47817:102;47858:6;47909:2;47905:7;47900:2;47893:5;47889:14;47885:28;47875:38;;47817:102;;;:::o;47925:230::-;48065:34;48061:1;48053:6;48049:14;48042:58;48134:13;48129:2;48121:6;48117:15;48110:38;47925:230;:::o;48161:170::-;48301:22;48297:1;48289:6;48285:14;48278:46;48161:170;:::o;48337:230::-;48477:34;48473:1;48465:6;48461:14;48454:58;48546:13;48541:2;48533:6;48529:15;48522:38;48337:230;:::o;48573:237::-;48713:34;48709:1;48701:6;48697:14;48690:58;48782:20;48777:2;48769:6;48765:15;48758:45;48573:237;:::o;48816:225::-;48956:34;48952:1;48944:6;48940:14;48933:58;49025:8;49020:2;49012:6;49008:15;49001:33;48816:225;:::o;49047:224::-;49187:34;49183:1;49175:6;49171:14;49164:58;49256:7;49251:2;49243:6;49239:15;49232:32;49047:224;:::o;49277:178::-;49417:30;49413:1;49405:6;49401:14;49394:54;49277:178;:::o;49461:223::-;49601:34;49597:1;49589:6;49585:14;49578:58;49670:6;49665:2;49657:6;49653:15;49646:31;49461:223;:::o;49690:175::-;49830:27;49826:1;49818:6;49814:14;49807:51;49690:175;:::o;49871:231::-;50011:34;50007:1;49999:6;49995:14;49988:58;50080:14;50075:2;50067:6;50063:15;50056:39;49871:231;:::o;50108:170::-;50248:22;50244:1;50236:6;50232:14;50225:46;50108:170;:::o;50284:166::-;50424:18;50420:1;50412:6;50408:14;50401:42;50284:166;:::o;50456:243::-;50596:34;50592:1;50584:6;50580:14;50573:58;50665:26;50660:2;50652:6;50648:15;50641:51;50456:243;:::o;50705:229::-;50845:34;50841:1;50833:6;50829:14;50822:58;50914:12;50909:2;50901:6;50897:15;50890:37;50705:229;:::o;50940:228::-;51080:34;51076:1;51068:6;51064:14;51057:58;51149:11;51144:2;51136:6;51132:15;51125:36;50940:228;:::o;51174:233::-;51314:34;51310:1;51302:6;51298:14;51291:58;51383:16;51378:2;51370:6;51366:15;51359:41;51174:233;:::o;51413:174::-;51553:26;51549:1;51541:6;51537:14;51530:50;51413:174;:::o;51593:182::-;51733:34;51729:1;51721:6;51717:14;51710:58;51593:182;:::o;51781:236::-;51921:34;51917:1;51909:6;51905:14;51898:58;51990:19;51985:2;51977:6;51973:15;51966:44;51781:236;:::o;52023:231::-;52163:34;52159:1;52151:6;52147:14;52140:58;52232:14;52227:2;52219:6;52215:15;52208:39;52023:231;:::o;52260:182::-;52400:34;52396:1;52388:6;52384:14;52377:58;52260:182;:::o;52448:234::-;52588:34;52584:1;52576:6;52572:14;52565:58;52657:17;52652:2;52644:6;52640:15;52633:42;52448:234;:::o;52688:220::-;52828:34;52824:1;52816:6;52812:14;52805:58;52897:3;52892:2;52884:6;52880:15;52873:28;52688:220;:::o;52914:236::-;53054:34;53050:1;53042:6;53038:14;53031:58;53123:19;53118:2;53110:6;53106:15;53099:44;52914:236;:::o;53156:177::-;53296:29;53292:1;53284:6;53280:14;53273:53;53156:177;:::o;53339:231::-;53479:34;53475:1;53467:6;53463:14;53456:58;53548:14;53543:2;53535:6;53531:15;53524:39;53339:231;:::o;53576:229::-;53716:34;53712:1;53704:6;53700:14;53693:58;53785:12;53780:2;53772:6;53768:15;53761:37;53576:229;:::o;53811:175::-;53951:27;53947:1;53939:6;53935:14;53928:51;53811:175;:::o;53992:122::-;54065:24;54083:5;54065:24;:::i;:::-;54058:5;54055:35;54045:63;;54104:1;54101;54094:12;54045:63;53992:122;:::o;54120:116::-;54190:21;54205:5;54190:21;:::i;:::-;54183:5;54180:32;54170:60;;54226:1;54223;54216:12;54170:60;54120:116;:::o;54242:120::-;54314:23;54331:5;54314:23;:::i;:::-;54307:5;54304:34;54294:62;;54352:1;54349;54342:12;54294:62;54242:120;:::o;54368:122::-;54441:24;54459:5;54441:24;:::i;:::-;54434:5;54431:35;54421:63;;54480:1;54477;54470:12;54421:63;54368:122;:::o;54496:120::-;54568:23;54585:5;54568:23;:::i;:::-;54561:5;54558:34;54548:62;;54606:1;54603;54596:12;54548:62;54496:120;:::o
Swarm Source
ipfs://43d730302878941338f52811a2d261749fa8739147724ff94e5c4348a4317b85
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.