Contract 0xd8f0d5052589ebc9d4d7a495ef4aec7d955c5ef9 4

Txn Hash Method
Block
From
To
Value [Txn Fee]
0x9510bfdaa5b3e6299a3289262a34e3694c8f8d50e0e4573080846ea44ace8ba8Set Approval For...31838842023-03-21 3:24:302 days 13 hrs ago0xf2a3d0e3336dcce72a0b17b5766dad55a91b9d77 IN  0xd8f0d5052589ebc9d4d7a495ef4aec7d955c5ef90 GLMR0.0047027995
0x1263bde9732dd3302fa56ecf2977e6c10e4eb549adddc1b692fa068925e92e01Set Approval For...29973462023-02-21 16:20:0030 days 53 mins ago0x33587634d9a3985879dbc86747f2af177e0c87a2 IN  0xd8f0d5052589ebc9d4d7a495ef4aec7d955c5ef90 GLMR0.0047027995
0x5d786858a6cd46c27c50a4fe2c86be8646a71842e606fa5ab96cbfd608b8d915Set Approval For...28414132023-01-30 13:19:4852 days 3 hrs ago0x328c9f1517df08702470aaef67fc784b5fb3f886 IN  0xd8f0d5052589ebc9d4d7a495ef4aec7d955c5ef90 GLMR0.0024787315
0xd2845f8aa7e2a34dc6e78e6b1444c70f0dfe637501b828c9a2001102c1c89e9fSet Approval For...25436722022-12-19 12:54:1294 days 4 hrs ago0x2b1e19177353280b7657b834efb3175aec850062 IN  0xd8f0d5052589ebc9d4d7a495ef4aec7d955c5ef90 GLMR0.0047027995
0xe08ae45b9543de7224fe698834d3d3d13d1069c823d3c2b8718bf4f6c908c1c3Set Approval For...24519382022-12-06 13:29:42107 days 3 hrs ago0xf52f489e893dfef14501bf54a14032713127abc9 IN  0xd8f0d5052589ebc9d4d7a495ef4aec7d955c5ef90 GLMR0.0047491325
0xdb0e197f4452553241e94a476e34049c58e6645b041e9ea529e9ce2ec6a9cb73Approve24487712022-12-06 2:41:54107 days 14 hrs ago0xe469220d444d4c30361f1416082ea4bf3f2a55b3 IN  0xd8f0d5052589ebc9d4d7a495ef4aec7d955c5ef90 GLMR0.004963147
0x62e9187964368631861617b56960ae0d000ce07c08c49a33682aa06b37014619Approve24487712022-12-06 2:41:54107 days 14 hrs ago0xe469220d444d4c30361f1416082ea4bf3f2a55b3 IN  0xd8f0d5052589ebc9d4d7a495ef4aec7d955c5ef90 GLMR0.004963147
0x715e67f5452d38c1c80ab02fca2a6f9c3f01e5dc0863fdc1603d18af4b2b288aApprove24486472022-12-06 2:16:42107 days 14 hrs ago0xe469220d444d4c30361f1416082ea4bf3f2a55b3 IN  0xd8f0d5052589ebc9d4d7a495ef4aec7d955c5ef90 GLMR0.00498466212
0x83fb496da72c56aed5825d25fe4816f9934f4b1455e6927462db3b0efa87ae0eApprove24486472022-12-06 2:16:42107 days 14 hrs ago0xe469220d444d4c30361f1416082ea4bf3f2a55b3 IN  0xd8f0d5052589ebc9d4d7a495ef4aec7d955c5ef90 GLMR0.0053641106
0x576d440ad8f8436dbbdfdfd14c79d3c540718eb2b221e50a4588c3d4fcc60696Approve24486422022-12-06 2:15:36107 days 14 hrs ago0xe469220d444d4c30361f1416082ea4bf3f2a55b3 IN  0xd8f0d5052589ebc9d4d7a495ef4aec7d955c5ef90 GLMR0.0053627942
0xef4de2cffdb409a36863942faf11b39cad584129b8b8246984da4da9a6d1ebd9Set Approval For...24399582022-12-04 20:52:18108 days 20 hrs ago0xcd98aa3437f953259e6983ebb8fe47b5f50317b4 IN  0xd8f0d5052589ebc9d4d7a495ef4aec7d955c5ef90 GLMR0.0047491325
0xd823e7fcaafc2cc96074986cfbd4d806e1524e0e78130ba933d0bff5e25ddf99Set Approval For...24287652022-12-03 6:58:54110 days 10 hrs ago0xbb036c35112a5a627119f9935c508b2fdd0b66e6 IN  0xd8f0d5052589ebc9d4d7a495ef4aec7d955c5ef90 GLMR0.0047491325
0xa03f922acf557bbd267e5d93b1ee26efbb3be310da0b8b53e95cda9501cd7274Set Approval For...24284582022-12-03 5:56:24110 days 11 hrs ago0x88f04f482a2597892865de1ebb58a65625955167 IN  0xd8f0d5052589ebc9d4d7a495ef4aec7d955c5ef90 GLMR0.0047027995
0xa0cbb7ae15afebe0aa228f7574a124ce830dafcea010902c021760ea205a012dSet Approval For...24280012022-12-03 4:23:54110 days 12 hrs ago0x624310638b9901933fab5f5b0deb2b33e13c87cc IN  0xd8f0d5052589ebc9d4d7a495ef4aec7d955c5ef90 GLMR0.0047491325
0xaef78397ee3ad065f59530807823fe91910cfa211ad14b4507cb88a94da2676cSet Approval For...24263872022-12-02 22:58:42110 days 18 hrs ago0xdb9e63907ec0aca7728c285e566c927839505814 IN  0xd8f0d5052589ebc9d4d7a495ef4aec7d955c5ef90 GLMR0.0047491325
0x85e795a30fc73b2abe279abb961cf7703dd9cdc4720d0874274cad6e0b8aa5a1Set Approval For...24260692022-12-02 21:54:54110 days 19 hrs ago0x9853fda0b5e99eac2968dc59ad37cded61cb1bf5 IN  0xd8f0d5052589ebc9d4d7a495ef4aec7d955c5ef90 GLMR0.0047491325
0xc549c6e54d54b8bb14bd8af666fc70f68a2886d7e9c646c8a1b6557631833ea9Set Approval For...24255672022-12-02 20:12:48110 days 21 hrs ago0xd74d04fc3420110e752939cb4b2e1689fe6ccfb2 IN  0xd8f0d5052589ebc9d4d7a495ef4aec7d955c5ef90 GLMR0.0047491325
0x9c0aa2534da29d347e35330abde7b91fc6cba2956cb98f8419d4f337db7bc4deSet Approval For...24252922022-12-02 19:17:12110 days 21 hrs ago0xa8a4a0a74937c4b90f5bf59c9caab7bf9d7e1747 IN  0xd8f0d5052589ebc9d4d7a495ef4aec7d955c5ef90 GLMR0.0047491325
0x2d6d1f19beb94416c9c243143d86db69a8d24140361d58e28a40509055836c1bSet Approval For...24248782022-12-02 17:53:42110 days 23 hrs ago0x5290797f8f69b7cdbdf407f8debfb388cb716dc7 IN  0xd8f0d5052589ebc9d4d7a495ef4aec7d955c5ef90 GLMR0.0047491325
0x724128dbb4a8046c4178790000ec6ea470680385f7282d0405d4812fc7ab99c3Set Approval For...24172312022-12-01 15:56:54112 days 1 hr ago0xf7f0efadfe0719dcfe40d384db070bc475bda2a7 IN  0xd8f0d5052589ebc9d4d7a495ef4aec7d955c5ef90 GLMR0.0047491325
0xb1e6f4c0418558ef19beb326570fe40e77a46204829b27e4d43e5caae5231105Set Approval For...24171592022-12-01 15:42:06112 days 1 hr ago0xb4d32b655300260e8916fb8b621ced5be65ce236 IN  0xd8f0d5052589ebc9d4d7a495ef4aec7d955c5ef90 GLMR0.0047491325
0xf46379dbc9f0741e062cc2e5ff4e880f55387bad95a552baf0609ad3b463ca7eSet Approval For...24168982022-12-01 14:48:48112 days 2 hrs ago0xa63d7e35d28cdc1938a5800c4a322c5baba60729 IN  0xd8f0d5052589ebc9d4d7a495ef4aec7d955c5ef90 GLMR0.0047491325
0x4e439daf61e9032ce0792121f80486e579ca71dcb5e20fe9c0ca56e8825ea953Set Approval For...24168482022-12-01 14:38:36112 days 2 hrs ago0x0ab43743b32e97e339d421eb531a7acf5c449703 IN  0xd8f0d5052589ebc9d4d7a495ef4aec7d955c5ef90 GLMR0.0047491325
0xea51777552d3852efab860f35b0c683ea3bd5e6727bf57e099a64b77bc36d977Set Approval For...24167042022-12-01 14:09:00112 days 3 hrs ago0xf5e511fabd9b250150113006b2f5e3ed5b3953b6 IN  0xd8f0d5052589ebc9d4d7a495ef4aec7d955c5ef90 GLMR0.0047491325
0xa784cdfd29203cd0872b036a688338b4e815673d7fbb4969286dd57f336c7c73Set Approval For...24166242022-12-01 13:52:48112 days 3 hrs ago0x45130524602c53d8824c035579d5295bd73c2522 IN  0xd8f0d5052589ebc9d4d7a495ef4aec7d955c5ef90 GLMR0.0047491325
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0xc7928229b65d18ea6f7af0ca7928409b88fbe11a38ff09fc4269e31e7d4f90ab7342192022-04-02 12:46:48355 days 4 hrs ago 0xd8f0d5052589ebc9d4d7a495ef4aec7d955c5ef90x18da170f3b9c3357ef8252b0d00365d06b37417318.9 GLMR
0x3bfdcc29f78a8e445898dde6ed6e5a8aa3d65b62f48b0a9d9c3e0b2d3305170b6161512022-03-16 14:05:18372 days 3 hrs ago 0xd8f0d5052589ebc9d4d7a495ef4aec7d955c5ef90x5072080e6d046fa7bf5617fa1d1c742f3af0e6c40.7 GLMR
0x85028bd6e895475fca5efd161a9da873885977cdbac5330d91530177582475236127692022-03-16 2:35:30372 days 14 hrs ago 0xd8f0d5052589ebc9d4d7a495ef4aec7d955c5ef90x5072080e6d046fa7bf5617fa1d1c742f3af0e6c40.7 GLMR
0xe2dc0d35f17426731c58979ed0e46555edcbf5a767d92ebc565ec40c941547fb6125472022-03-16 1:49:42372 days 15 hrs ago 0xd8f0d5052589ebc9d4d7a495ef4aec7d955c5ef90x5072080e6d046fa7bf5617fa1d1c742f3af0e6c40.7 GLMR
0x42cde9aa6a9063eb4a63155200bcdcba066b54d9da4e3e47136d7e2e3b808ba95744982022-03-10 15:57:48378 days 1 hr ago 0xd8f0d5052589ebc9d4d7a495ef4aec7d955c5ef90x18da170f3b9c3357ef8252b0d00365d06b374173138.6 GLMR
0xa67dd846655e499e106e8410aedf2bc0c50c88f41481981d0bc73c71b02a7e055744412022-03-10 15:46:24378 days 1 hr ago 0xd8f0d5052589ebc9d4d7a495ef4aec7d955c5ef90x5072080e6d046fa7bf5617fa1d1c742f3af0e6c40.7 GLMR
0x55dfae8d831ab5c8fca0dffaf974a10f825f36541eec3d86c049ccbc9c1c8c385744412022-03-10 15:46:24378 days 1 hr ago 0xd8f0d5052589ebc9d4d7a495ef4aec7d955c5ef90x5072080e6d046fa7bf5617fa1d1c742f3af0e6c40.7 GLMR
0xa298076c7631808aee0a75d95ee88ea6993662754dfce53332aeceaf9fe66ab75744412022-03-10 15:46:24378 days 1 hr ago 0xd8f0d5052589ebc9d4d7a495ef4aec7d955c5ef90x5072080e6d046fa7bf5617fa1d1c742f3af0e6c40.7 GLMR
0x421f00ae7c15f089fd9acd607aa6d41c8d12f4782afe7f86ea7c089928f636755744412022-03-10 15:46:24378 days 1 hr ago 0xd8f0d5052589ebc9d4d7a495ef4aec7d955c5ef90x5072080e6d046fa7bf5617fa1d1c742f3af0e6c40.7 GLMR
0xfda62615382f64987dc5f1559265b3c22b3862d9858e9a6b5b75c32407d4db9b5744402022-03-10 15:46:12378 days 1 hr ago 0xd8f0d5052589ebc9d4d7a495ef4aec7d955c5ef90x5072080e6d046fa7bf5617fa1d1c742f3af0e6c40.7 GLMR
0xd9ff429d193b97405cdcdbaf4258d49b5c81020133b53576cc5134ed059471505744402022-03-10 15:46:12378 days 1 hr ago 0xd8f0d5052589ebc9d4d7a495ef4aec7d955c5ef90x5072080e6d046fa7bf5617fa1d1c742f3af0e6c40.7 GLMR
0x79a12e6e04829548e239b1d1abb433e84b7e5f8062c75a2632f5e9d665d8bfca5744392022-03-10 15:46:00378 days 1 hr ago 0xd8f0d5052589ebc9d4d7a495ef4aec7d955c5ef90x5072080e6d046fa7bf5617fa1d1c742f3af0e6c40.7 GLMR
0xec20a20256dcf0a1cff66be270d0ce1edcc78b563fb948593071d79334013da75744392022-03-10 15:46:00378 days 1 hr ago 0xd8f0d5052589ebc9d4d7a495ef4aec7d955c5ef90x5072080e6d046fa7bf5617fa1d1c742f3af0e6c40.7 GLMR
0xab4007a239860c2710137a8acbe61e26e8dc04e0eeae081239e010c47e47376d5744392022-03-10 15:46:00378 days 1 hr ago 0xd8f0d5052589ebc9d4d7a495ef4aec7d955c5ef90x5072080e6d046fa7bf5617fa1d1c742f3af0e6c40.7 GLMR
0xb436505270130a9815bd46edbfe72af8221bbb7abdc583cefc4d2919f41237555744392022-03-10 15:46:00378 days 1 hr ago 0xd8f0d5052589ebc9d4d7a495ef4aec7d955c5ef90x5072080e6d046fa7bf5617fa1d1c742f3af0e6c40.7 GLMR
0xa5aaae5ec069728a20ad1cf5084985f201d989ce535162034a15cba5bff959f45744382022-03-10 15:45:48378 days 1 hr ago 0xd8f0d5052589ebc9d4d7a495ef4aec7d955c5ef90x5072080e6d046fa7bf5617fa1d1c742f3af0e6c40.7 GLMR
0xff030e2b0bda4290ce2bbf0aa2593c678eb45c7c4cf7ade262d0393bb574926a5744362022-03-10 15:45:24378 days 1 hr ago 0xd8f0d5052589ebc9d4d7a495ef4aec7d955c5ef90x5072080e6d046fa7bf5617fa1d1c742f3af0e6c40.7 GLMR
0x458013087002ab2510388b1fa804f94da7f420e35dda40bbff7ecddb05f3902d5744362022-03-10 15:45:24378 days 1 hr ago 0xd8f0d5052589ebc9d4d7a495ef4aec7d955c5ef90x5072080e6d046fa7bf5617fa1d1c742f3af0e6c40.7 GLMR
0x7fe7d20ef49dfb2383e070a500e0861448d809aef54a4a7a47eac79536b727a15744352022-03-10 15:45:12378 days 1 hr ago 0xd8f0d5052589ebc9d4d7a495ef4aec7d955c5ef90x5072080e6d046fa7bf5617fa1d1c742f3af0e6c40.7 GLMR
0xf8aa90fa041de2d66438240542f7ab1f869d7b699b32c41c03fabe5582ebd09a5744342022-03-10 15:45:00378 days 1 hr ago 0xd8f0d5052589ebc9d4d7a495ef4aec7d955c5ef90x5072080e6d046fa7bf5617fa1d1c742f3af0e6c40.7 GLMR
0x157d3f3d9f6da6551e233ff249ac0068268a70645c201efeda756e87296686a55744332022-03-10 15:44:48378 days 1 hr ago 0xd8f0d5052589ebc9d4d7a495ef4aec7d955c5ef90x5072080e6d046fa7bf5617fa1d1c742f3af0e6c40.7 GLMR
0x3377fa045f33740b58d3587e666bd7dbfceccb089516f5bc974a2c1245b6734d5744312022-03-10 15:44:24378 days 1 hr ago 0xd8f0d5052589ebc9d4d7a495ef4aec7d955c5ef90x5072080e6d046fa7bf5617fa1d1c742f3af0e6c40.7 GLMR
0x72e5f83a5249acfaf0091fcb85970b6fcfbbbc3ca5f1860a9ec7b89d5707e6845744272022-03-10 15:43:30378 days 1 hr ago 0xd8f0d5052589ebc9d4d7a495ef4aec7d955c5ef90x5072080e6d046fa7bf5617fa1d1c742f3af0e6c40.7 GLMR
0xa5238f7714924b3288a669eefa932c03cad5b1f249ade5b56e70ce977cb02a925744262022-03-10 15:43:18378 days 1 hr ago 0xd8f0d5052589ebc9d4d7a495ef4aec7d955c5ef90x5072080e6d046fa7bf5617fa1d1c742f3af0e6c40.7 GLMR
0xc93eba0ab006639704145c4c155161a564c08a5c4b22277e69ec642ddd6a40d95744252022-03-10 15:43:08378 days 1 hr ago 0xd8f0d5052589ebc9d4d7a495ef4aec7d955c5ef90x5072080e6d046fa7bf5617fa1d1c742f3af0e6c40.7 GLMR
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
MOONKEYS

Compiler Version
v0.8.1+commit.df193b15

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at moonbeam.moonscan.io on 2022-03-03
*/

// SPDX-License-Identifier: MIT

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



pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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


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



pragma solidity ^0.8.0;

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


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



pragma solidity ^0.8.0;

/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {

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

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

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


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



pragma solidity ^0.8.0;

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

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 0;
    }

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

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private 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

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}


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



pragma solidity ^0.8.0;

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

    function _msgData() internal view virtual returns (bytes calldata) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}


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



pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant alphabet = "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] = alphabet[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }

}


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



pragma solidity ^0.8.0;

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


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



pragma solidity ^0.8.0;







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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Base URI for computing {tokenURI}. Empty by default, can be overriden
     * in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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


// File contracts/@openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol



pragma solidity ^0.8.0;

/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {

    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

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

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


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



pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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



pragma solidity ^0.8.0;

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

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

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

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


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



pragma solidity ^0.8.0;

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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), 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 {
        emit OwnershipTransferred(_owner, address(0));
        _owner = 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");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.1;

contract MOONKEYS is ERC721, Ownable {

    address beneficiary;
    address public devWallet = address(0x5072080e6D046fA7BF5617Fa1d1C742F3aF0e6c4);
    using SafeMath for uint256;
    using Strings for uint256;
    uint256 private _currentTokenId = 0;
    uint256 private _limitTokenCount = 3301;
    uint256 public _mintPrice = 7 ether;

    uint256 public saleFeePercentage = 10; 
    

    
    // Optional mapping for token URIs
    mapping (uint256 => string) private _tokenURIs;

    // Base URI
    string public baseURI;

    constructor()
        ERC721("MOONKEYS", "MOONKEYS")
    {
        beneficiary = msg.sender;
    }

    /**
        * @dev calculates the next token ID based on value of _currentTokenId
        * @return uint256 for the next token ID
        */
    function _getNextTokenId() public view returns (uint256) {
        return _currentTokenId.add(1);
    }

    /**
        * @dev increments the value of _currentTokenId
        */
    function _incrementTokenId() private {
        _currentTokenId++;
    }
    
    function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {
        require(_exists(tokenId), "ERC721Metadata: URI set of nonexistent token");
        _tokenURIs[tokenId] = _tokenURI;
    }
    
    function setTokenURI(uint256 tokenId, string memory _tokenURI) public virtual {
        require(_exists(tokenId), "ERC721Metadata: URI set of nonexistent token");
        _tokenURIs[tokenId] = _tokenURI;
    }

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

    function setBaseURI(string memory _URI) external onlyOwner {
        baseURI = _URI;
    }
    
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        string memory _tokenURI = _tokenURIs[tokenId];
        string memory base = _baseURI();
        return _tokenURI;
        
        // 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));
        }
        // If there is a baseURI but no tokenURI, concatenate the tokenID to the baseURI.
        return string(abi.encodePacked(base, tokenId.toString()));
    }
    
    function mint(
        address _to,
        string memory tokenURI_
    ) public virtual payable {

        require(msg.value >= _mintPrice, "not enough");

        uint256 fees = SafeMath.div(_mintPrice, 100).mul(saleFeePercentage);

        payable(devWallet).transfer(fees);

        uint256 newTokenId = _getNextTokenId();
        _mint(_to, newTokenId);
        _setTokenURI(newTokenId, tokenURI_);
        _incrementTokenId();
    }

    function updateMintPrice(uint256 mintPrice) external onlyOwner{
        _mintPrice = mintPrice;
    }

    function updateBeneficiary(address _newBeneficiary) external onlyOwner{
        require(beneficiary != _newBeneficiary,"The same address as the old one.");
        beneficiary = _newBeneficiary;
    }

    function withdraw_all() public onlyOwner{
        payable(beneficiary).transfer(address(this).balance);
    }
}

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"_getNextTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_mintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"devWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"string","name":"tokenURI_","type":"string"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleFeePercentage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"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":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newBeneficiary","type":"address"}],"name":"updateBeneficiary","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"mintPrice","type":"uint256"}],"name":"updateMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw_all","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052600880546001600160a01b031916735072080e6d046fa7bf5617fa1d1c742f3af0e6c41790556000600955610ce5600a908155676124fee993bc0000600b55600c553480156200005357600080fd5b506040805180820182526008808252674d4f4f4e4b45595360c01b60208084018281528551808701909652928552840152815191929162000097916000916200012c565b508051620000ad9060019060208401906200012c565b5050506000620000c26200012860201b60201c565b600680546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600780546001600160a01b031916331790556200020f565b3390565b8280546200013a90620001d2565b90600052602060002090601f0160209004810192826200015e5760008555620001a9565b82601f106200017957805160ff1916838001178555620001a9565b82800160010185558215620001a9579182015b82811115620001a95782518255916020019190600101906200018c565b50620001b7929150620001bb565b5090565b5b80821115620001b75760008155600101620001bc565b600281046001821680620001e757607f821691505b602082108114156200020957634e487b7160e01b600052602260045260246000fd5b50919050565b611eb9806200021f6000396000f3fe60806040526004361061019b5760003560e01c806370a08231116100ec578063a22cb4651161008a578063d0def52111610064578063d0def5211461045c578063dd473d2b1461046f578063e985e9c514610484578063f2fde38b146104a45761019b565b8063a22cb465146103fc578063b88d4fde1461041c578063c87b56dd1461043c5761019b565b80638da5cb5b116100c65780638da5cb5b146103a85780638ea5220f146103bd57806395d89b41146103d2578063972d1ae2146103e75761019b565b806370a082311461035e578063715018a61461037e5780637be3f006146103935761019b565b80630aaffd2a1161015957806342842e0e1161013357806342842e0e146102e957806355f804b3146103095780636352211e146103295780636c0360eb146103495761019b565b80630aaffd2a14610289578063162094c4146102a957806323b872dd146102c95761019b565b8062728e46146101a057806301ffc9a7146101c25780630387da42146101f857806306fdde031461021a578063081812fc1461023c578063095ea7b314610269575b600080fd5b3480156101ac57600080fd5b506101c06101bb36600461173d565b6104c4565b005b3480156101ce57600080fd5b506101e26101dd3660046116d2565b610511565b6040516101ef9190611801565b60405180910390f35b34801561020457600080fd5b5061020d610559565b6040516101ef9190611d2a565b34801561022657600080fd5b5061022f61055f565b6040516101ef919061180c565b34801561024857600080fd5b5061025c61025736600461173d565b6105f1565b6040516101ef91906117b0565b34801561027557600080fd5b506101c06102843660046116a9565b610634565b34801561029557600080fd5b506101c06102a4366004611523565b6106cc565b3480156102b557600080fd5b506101c06102c4366004611755565b61075b565b3480156102d557600080fd5b506101c06102e436600461156f565b61079f565b3480156102f557600080fd5b506101c061030436600461156f565b6107d7565b34801561031557600080fd5b506101c061032436600461170a565b6107f2565b34801561033557600080fd5b5061025c61034436600461173d565b610848565b34801561035557600080fd5b5061022f61087d565b34801561036a57600080fd5b5061020d610379366004611523565b61090b565b34801561038a57600080fd5b506101c061094f565b34801561039f57600080fd5b5061020d6109d8565b3480156103b457600080fd5b5061025c6109de565b3480156103c957600080fd5b5061025c6109ed565b3480156103de57600080fd5b5061022f6109fc565b3480156103f357600080fd5b5061020d610a0b565b34801561040857600080fd5b506101c0610417366004611623565b610a21565b34801561042857600080fd5b506101c06104373660046115aa565b610aef565b34801561044857600080fd5b5061022f61045736600461173d565b610b2e565b6101c061046a36600461165d565b610c03565b34801561047b57600080fd5b506101c0610ca4565b34801561049057600080fd5b506101e261049f36600461153d565b610d1f565b3480156104b057600080fd5b506101c06104bf366004611523565b610d4d565b6104cc610e0e565b6001600160a01b03166104dd6109de565b6001600160a01b03161461050c5760405162461bcd60e51b815260040161050390611b96565b60405180910390fd5b600b55565b60006001600160e01b031982166380ac58cd60e01b148061054257506001600160e01b03198216635b5e139f60e01b145b80610551575061055182610e12565b90505b919050565b600b5481565b60606000805461056e90611dc1565b80601f016020809104026020016040519081016040528092919081815260200182805461059a90611dc1565b80156105e75780601f106105bc576101008083540402835291602001916105e7565b820191906000526020600020905b8154815290600101906020018083116105ca57829003601f168201915b5050505050905090565b60006105fc82610e2b565b6106185760405162461bcd60e51b815260040161050390611afe565b506000908152600460205260409020546001600160a01b031690565b600061063f82610848565b9050806001600160a01b0316836001600160a01b031614156106735760405162461bcd60e51b815260040161050390611c63565b806001600160a01b0316610685610e0e565b6001600160a01b031614806106a157506106a18161049f610e0e565b6106bd5760405162461bcd60e51b8152600401610503906119d9565b6106c78383610e48565b505050565b6106d4610e0e565b6001600160a01b03166106e56109de565b6001600160a01b03161461070b5760405162461bcd60e51b815260040161050390611b96565b6007546001600160a01b03828116911614156107395760405162461bcd60e51b815260040161050390611cf5565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b61076482610e2b565b6107805760405162461bcd60e51b815260040161050390611b4a565b6000828152600d6020908152604090912082516106c7928401906113de565b6107b06107aa610e0e565b82610eb6565b6107cc5760405162461bcd60e51b815260040161050390611ca4565b6106c7838383610f3b565b6106c783838360405180602001604052806000815250610aef565b6107fa610e0e565b6001600160a01b031661080b6109de565b6001600160a01b0316146108315760405162461bcd60e51b815260040161050390611b96565b805161084490600e9060208401906113de565b5050565b6000818152600260205260408120546001600160a01b0316806105515760405162461bcd60e51b815260040161050390611a80565b600e805461088a90611dc1565b80601f01602080910402602001604051908101604052809291908181526020018280546108b690611dc1565b80156109035780601f106108d857610100808354040283529160200191610903565b820191906000526020600020905b8154815290600101906020018083116108e657829003601f168201915b505050505081565b60006001600160a01b0382166109335760405162461bcd60e51b815260040161050390611a36565b506001600160a01b031660009081526003602052604090205490565b610957610e0e565b6001600160a01b03166109686109de565b6001600160a01b03161461098e5760405162461bcd60e51b815260040161050390611b96565b6006546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600680546001600160a01b0319169055565b600c5481565b6006546001600160a01b031690565b6008546001600160a01b031681565b60606001805461056e90611dc1565b600954600090610a1c906001611068565b905090565b610a29610e0e565b6001600160a01b0316826001600160a01b03161415610a5a5760405162461bcd60e51b815260040161050390611956565b8060056000610a67610e0e565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff191692151592909217909155610aab610e0e565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610ae39190611801565b60405180910390a35050565b610b00610afa610e0e565b83610eb6565b610b1c5760405162461bcd60e51b815260040161050390611ca4565b610b288484848461107b565b50505050565b6060610b3982610e2b565b610b555760405162461bcd60e51b815260040161050390611c14565b6000828152600d602052604081208054610b6e90611dc1565b80601f0160208091040260200160405190810160405280929190818152602001828054610b9a90611dc1565b8015610be75780601f10610bbc57610100808354040283529160200191610be7565b820191906000526020600020905b815481529060010190602001808311610bca57829003601f168201915b505050505090506000610bf86110ae565b509091506105549050565b600b54341015610c255760405162461bcd60e51b8152600401610503906118ee565b6000610c40600c54610c3a600b5460646111af565b906111bb565b6008546040519192506001600160a01b03169082156108fc029083906000818181858888f19350505050158015610c7b573d6000803e3d6000fd5b506000610c86610a0b565b9050610c9284826111c7565b610c9c818461075b565b610b286112a6565b610cac610e0e565b6001600160a01b0316610cbd6109de565b6001600160a01b031614610ce35760405162461bcd60e51b815260040161050390611b96565b6007546040516001600160a01b03909116904780156108fc02916000818181858888f19350505050158015610d1c573d6000803e3d6000fd5b50565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b610d55610e0e565b6001600160a01b0316610d666109de565b6001600160a01b031614610d8c5760405162461bcd60e51b815260040161050390611b96565b6001600160a01b038116610db25760405162461bcd60e51b815260040161050390611871565b6006546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600680546001600160a01b0319166001600160a01b0392909216919091179055565b3390565b6001600160e01b031981166301ffc9a760e01b14919050565b6000908152600260205260409020546001600160a01b0316151590565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190610e7d82610848565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000610ec182610e2b565b610edd5760405162461bcd60e51b81526004016105039061198d565b6000610ee883610848565b9050806001600160a01b0316846001600160a01b03161480610f235750836001600160a01b0316610f18846105f1565b6001600160a01b0316145b80610f335750610f338185610d1f565b949350505050565b826001600160a01b0316610f4e82610848565b6001600160a01b031614610f745760405162461bcd60e51b815260040161050390611bcb565b6001600160a01b038216610f9a5760405162461bcd60e51b815260040161050390611912565b610fa58383836106c7565b610fb0600082610e48565b6001600160a01b0383166000908152600360205260408120805460019290610fd9908490611d7e565b90915550506001600160a01b0382166000908152600360205260408120805460019290611007908490611d33565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60006110748284611d33565b9392505050565b611086848484610f3b565b611092848484846112bd565b610b285760405162461bcd60e51b81526004016105039061181f565b6060600e805461056e90611dc1565b81156110e357806110cd81611dfc565b91506110dc9050600a83611d4b565b91506110bd565b60008167ffffffffffffffff81111561110c57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611136576020820181803683370190505b5090505b8415610f335761114b600183611d7e565b9150611158600a86611e17565b611163906030611d33565b60f81b81838151811061118657634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a9053506111a8600a86611d4b565b945061113a565b60006110748284611d4b565b60006110748284611d5f565b6001600160a01b0382166111ed5760405162461bcd60e51b815260040161050390611ac9565b6111f681610e2b565b156112135760405162461bcd60e51b8152600401610503906118b7565b61121f600083836106c7565b6001600160a01b0382166000908152600360205260408120805460019290611248908490611d33565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600980549060006112b683611dfc565b9190505550565b60006112d1846001600160a01b03166113d8565b156113cd57836001600160a01b031663150b7a026112ed610e0e565b8786866040518563ffffffff1660e01b815260040161130f94939291906117c4565b602060405180830381600087803b15801561132957600080fd5b505af1925050508015611359575060408051601f3d908101601f19168201909252611356918101906116ee565b60015b6113b3573d808015611387576040519150601f19603f3d011682016040523d82523d6000602084013e61138c565b606091505b5080516113ab5760405162461bcd60e51b81526004016105039061181f565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050610f33565b506001949350505050565b3b151590565b8280546113ea90611dc1565b90600052602060002090601f01602090048101928261140c5760008555611452565b82601f1061142557805160ff1916838001178555611452565b82800160010185558215611452579182015b82811115611452578251825591602001919060010190611437565b5061145e929150611462565b5090565b5b8082111561145e5760008155600101611463565b600067ffffffffffffffff8084111561149257611492611e57565b604051601f8501601f19908116603f011681019082821181831017156114ba576114ba611e57565b816040528093508581528686860111156114d357600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b038116811461055457600080fd5b600082601f830112611514578081fd5b61107483833560208501611477565b600060208284031215611534578081fd5b611074826114ed565b6000806040838503121561154f578081fd5b611558836114ed565b9150611566602084016114ed565b90509250929050565b600080600060608486031215611583578081fd5b61158c846114ed565b925061159a602085016114ed565b9150604084013590509250925092565b600080600080608085870312156115bf578081fd5b6115c8856114ed565b93506115d6602086016114ed565b925060408501359150606085013567ffffffffffffffff8111156115f8578182fd5b8501601f81018713611608578182fd5b61161787823560208401611477565b91505092959194509250565b60008060408385031215611635578182fd5b61163e836114ed565b915060208301358015158114611652578182fd5b809150509250929050565b6000806040838503121561166f578182fd5b611678836114ed565b9150602083013567ffffffffffffffff811115611693578182fd5b61169f85828601611504565b9150509250929050565b600080604083850312156116bb578182fd5b6116c4836114ed565b946020939093013593505050565b6000602082840312156116e3578081fd5b813561107481611e6d565b6000602082840312156116ff578081fd5b815161107481611e6d565b60006020828403121561171b578081fd5b813567ffffffffffffffff811115611731578182fd5b610f3384828501611504565b60006020828403121561174e578081fd5b5035919050565b60008060408385031215611767578182fd5b82359150602083013567ffffffffffffffff811115611693578182fd5b6000815180845261179c816020860160208601611d95565b601f01601f19169290920160200192915050565b6001600160a01b0391909116815260200190565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906117f790830184611784565b9695505050505050565b901515815260200190565b6000602082526110746020830184611784565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604082015260600190565b6020808252600a90820152690dcdee840cadcdeeaced60b31b604082015260600190565b60208082526024908201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526019908201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604082015260600190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604082015269726f206164647265737360b01b606082015260800190565b60208082526029908201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460408201526832b73a103a37b5b2b760b91b606082015260800190565b6020808252818101527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604082015260600190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252602c908201527f4552433732314d657461646174613a2055524920736574206f66206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526029908201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960408201526839903737ba1037bbb760b91b606082015260800190565b6020808252602f908201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60408201526e3732bc34b9ba32b73a103a37b5b2b760891b606082015260800190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656040820152603960f91b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252818101527f5468652073616d65206164647265737320617320746865206f6c64206f6e652e604082015260600190565b90815260200190565b60008219821115611d4657611d46611e2b565b500190565b600082611d5a57611d5a611e41565b500490565b6000816000190483118215151615611d7957611d79611e2b565b500290565b600082821015611d9057611d90611e2b565b500390565b60005b83811015611db0578181015183820152602001611d98565b83811115610b285750506000910152565b600281046001821680611dd557607f821691505b60208210811415611df657634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415611e1057611e10611e2b565b5060010190565b600082611e2657611e26611e41565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610d1c57600080fdfea26469706673582212202e93301222e38f08e788b6b829ef7e7856b8dc2b72670f98fbc57a14be48386964736f6c63430008010033

Deployed ByteCode Sourcemap

51038:3492:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54094:103;;;;;;;;;;-1:-1:-1;54094:103:0;;;;;:::i;:::-;;:::i;:::-;;20609:292;;;;;;;;;;-1:-1:-1;20609:292:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51348:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;21541:100::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;23001:221::-;;;;;;;;;;-1:-1:-1;23001:221:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;22538:397::-;;;;;;;;;;-1:-1:-1;22538:397:0;;;;;:::i;:::-;;:::i;54205:203::-;;;;;;;;;;-1:-1:-1;54205:203:0;;;;;:::i;:::-;;:::i;52354:212::-;;;;;;;;;;-1:-1:-1;52354:212:0;;;;;:::i;:::-;;:::i;23891:305::-;;;;;;;;;;-1:-1:-1;23891:305:0;;;;;:::i;:::-;;:::i;24267:151::-;;;;;;;;;;-1:-1:-1;24267:151:0;;;;;:::i;:::-;;:::i;52689:92::-;;;;;;;;;;-1:-1:-1;52689:92:0;;;;;:::i;:::-;;:::i;21235:239::-;;;;;;;;;;-1:-1:-1;21235:239:0;;;;;:::i;:::-;;:::i;51563:21::-;;;;;;;;;;;;;:::i;20965:208::-;;;;;;;;;;-1:-1:-1;20965:208:0;;;;;:::i;:::-;;:::i;43564:148::-;;;;;;;;;;;;;:::i;51392:37::-;;;;;;;;;;;;;:::i;42913:87::-;;;;;;;;;;;;;:::i;51110:78::-;;;;;;;;;;;;;:::i;21710:104::-;;;;;;;;;;;;;:::i;51852:105::-;;;;;;;;;;;;;:::i;23294:295::-;;;;;;;;;;-1:-1:-1;23294:295:0;;;;;:::i;:::-;;:::i;24489:285::-;;;;;;;;;;-1:-1:-1;24489:285:0;;;;;:::i;:::-;;:::i;52793:828::-;;;;;;;;;;-1:-1:-1;52793:828:0;;;;;:::i;:::-;;:::i;53633:453::-;;;;;;:::i;:::-;;:::i;54416:111::-;;;;;;;;;;;;;:::i;23660:164::-;;;;;;;;;;-1:-1:-1;23660:164:0;;;;;:::i;:::-;;:::i;43867:244::-;;;;;;;;;;-1:-1:-1;43867:244:0;;;;;:::i;:::-;;:::i;54094:103::-;43144:12;:10;:12::i;:::-;-1:-1:-1;;;;;43133:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;43133:23:0;;43125:68;;;;-1:-1:-1;;;43125:68:0;;;;;;;:::i;:::-;;;;;;;;;54167:10:::1;:22:::0;54094:103::o;20609:292::-;20711:4;-1:-1:-1;;;;;;20735:40:0;;-1:-1:-1;;;20735:40:0;;:105;;-1:-1:-1;;;;;;;20792:48:0;;-1:-1:-1;;;20792:48:0;20735:105;:158;;;;20857:36;20881:11;20857:23;:36::i;:::-;20728:165;;20609:292;;;;:::o;51348:35::-;;;;:::o;21541:100::-;21595:13;21628:5;21621:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21541:100;:::o;23001:221::-;23077:7;23105:16;23113:7;23105;:16::i;:::-;23097:73;;;;-1:-1:-1;;;23097:73:0;;;;;;;:::i;:::-;-1:-1:-1;23190:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;23190:24:0;;23001:221::o;22538:397::-;22619:13;22635:23;22650:7;22635:14;:23::i;:::-;22619:39;;22683:5;-1:-1:-1;;;;;22677:11:0;:2;-1:-1:-1;;;;;22677:11:0;;;22669:57;;;;-1:-1:-1;;;22669:57:0;;;;;;;:::i;:::-;22763:5;-1:-1:-1;;;;;22747:21:0;:12;:10;:12::i;:::-;-1:-1:-1;;;;;22747:21:0;;:62;;;;22772:37;22789:5;22796:12;:10;:12::i;22772:37::-;22739:154;;;;-1:-1:-1;;;22739:154:0;;;;;;;:::i;:::-;22906:21;22915:2;22919:7;22906:8;:21::i;:::-;22538:397;;;:::o;54205:203::-;43144:12;:10;:12::i;:::-;-1:-1:-1;;;;;43133:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;43133:23:0;;43125:68;;;;-1:-1:-1;;;43125:68:0;;;;;;;:::i;:::-;54294:11:::1;::::0;-1:-1:-1;;;;;54294:30:0;;::::1;:11:::0;::::1;:30;;54286:74;;;;-1:-1:-1::0;;;54286:74:0::1;;;;;;;:::i;:::-;54371:11;:29:::0;;-1:-1:-1;;;;;;54371:29:0::1;-1:-1:-1::0;;;;;54371:29:0;;;::::1;::::0;;;::::1;::::0;;54205:203::o;52354:212::-;52451:16;52459:7;52451;:16::i;:::-;52443:73;;;;-1:-1:-1;;;52443:73:0;;;;;;;:::i;:::-;52527:19;;;;:10;:19;;;;;;;;:31;;;;;;;;:::i;23891:305::-;24052:41;24071:12;:10;:12::i;:::-;24085:7;24052:18;:41::i;:::-;24044:103;;;;-1:-1:-1;;;24044:103:0;;;;;;;:::i;:::-;24160:28;24170:4;24176:2;24180:7;24160:9;:28::i;24267:151::-;24371:39;24388:4;24394:2;24398:7;24371:39;;;;;;;;;;;;:16;:39::i;52689:92::-;43144:12;:10;:12::i;:::-;-1:-1:-1;;;;;43133:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;43133:23:0;;43125:68;;;;-1:-1:-1;;;43125:68:0;;;;;;;:::i;:::-;52759:14;;::::1;::::0;:7:::1;::::0;:14:::1;::::0;::::1;::::0;::::1;:::i;:::-;;52689:92:::0;:::o;21235:239::-;21307:7;21343:16;;;:7;:16;;;;;;-1:-1:-1;;;;;21343:16:0;21378:19;21370:73;;;;-1:-1:-1;;;21370:73:0;;;;;;;:::i;51563:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;20965:208::-;21037:7;-1:-1:-1;;;;;21065:19:0;;21057:74;;;;-1:-1:-1;;;21057:74:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;;21149:16:0;;;;;:9;:16;;;;;;;20965:208::o;43564:148::-;43144:12;:10;:12::i;:::-;-1:-1:-1;;;;;43133:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;43133:23:0;;43125:68;;;;-1:-1:-1;;;43125:68:0;;;;;;;:::i;:::-;43655:6:::1;::::0;43634:40:::1;::::0;43671:1:::1;::::0;-1:-1:-1;;;;;43655:6:0::1;::::0;43634:40:::1;::::0;43671:1;;43634:40:::1;43685:6;:19:::0;;-1:-1:-1;;;;;;43685:19:0::1;::::0;;43564:148::o;51392:37::-;;;;:::o;42913:87::-;42986:6;;-1:-1:-1;;;;;42986:6:0;42913:87;:::o;51110:78::-;;;-1:-1:-1;;;;;51110:78:0;;:::o;21710:104::-;21766:13;21799:7;21792:14;;;;;:::i;51852:105::-;51927:15;;51900:7;;51927:22;;51947:1;51927:19;:22::i;:::-;51920:29;;51852:105;:::o;23294:295::-;23409:12;:10;:12::i;:::-;-1:-1:-1;;;;;23397:24:0;:8;-1:-1:-1;;;;;23397:24:0;;;23389:62;;;;-1:-1:-1;;;23389:62:0;;;;;;;:::i;:::-;23509:8;23464:18;:32;23483:12;:10;:12::i;:::-;-1:-1:-1;;;;;23464:32:0;;;;;;;;;;;;;;;;;-1:-1:-1;23464:32:0;;;:42;;;;;;;;;;;;:53;;-1:-1:-1;;23464:53:0;;;;;;;;;;;23548:12;:10;:12::i;:::-;-1:-1:-1;;;;;23533:48:0;;23572:8;23533:48;;;;;;:::i;:::-;;;;;;;;23294:295;;:::o;24489:285::-;24621:41;24640:12;:10;:12::i;:::-;24654:7;24621:18;:41::i;:::-;24613:103;;;;-1:-1:-1;;;24613:103:0;;;;;;;:::i;:::-;24727:39;24741:4;24747:2;24751:7;24760:5;24727:13;:39::i;:::-;24489:285;;;;:::o;52793:828::-;52866:13;52900:16;52908:7;52900;:16::i;:::-;52892:76;;;;-1:-1:-1;;;52892:76:0;;;;;;;:::i;:::-;52981:23;53007:19;;;:10;:19;;;;;52981:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53037:18;53058:10;:8;:10::i;:::-;-1:-1:-1;53086:9:0;;-1:-1:-1;53079:16:0;;-1:-1:-1;53079:16:0;53633:453;53767:10;;53754:9;:23;;53746:46;;;;-1:-1:-1;;;53746:46:0;;;;;;;:::i;:::-;53805:12;53820:52;53854:17;;53820:29;53833:10;;53845:3;53820:12;:29::i;:::-;:33;;:52::i;:::-;53893:9;;53885:33;;53805:67;;-1:-1:-1;;;;;;53893:9:0;;53885:33;;;;;53805:67;;53893:9;53885:33;53893:9;53885:33;53805:67;53893:9;53885:33;;;;;;;;;;;;;;;;;;;;;53931:18;53952:17;:15;:17::i;:::-;53931:38;;53980:22;53986:3;53991:10;53980:5;:22::i;:::-;54013:35;54026:10;54038:9;54013:12;:35::i;:::-;54059:19;:17;:19::i;54416:111::-;43144:12;:10;:12::i;:::-;-1:-1:-1;;;;;43133:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;43133:23:0;;43125:68;;;;-1:-1:-1;;;43125:68:0;;;;;;;:::i;:::-;54475:11:::1;::::0;54467:52:::1;::::0;-1:-1:-1;;;;;54475:11:0;;::::1;::::0;54497:21:::1;54467:52:::0;::::1;;;::::0;54475:11:::1;54467:52:::0;54475:11;54467:52;54497:21;54475:11;54467:52;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;54416:111::o:0;23660:164::-;-1:-1:-1;;;;;23781:25:0;;;23757:4;23781:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;23660:164::o;43867:244::-;43144:12;:10;:12::i;:::-;-1:-1:-1;;;;;43133:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;43133:23:0;;43125:68;;;;-1:-1:-1;;;43125:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;43956:22:0;::::1;43948:73;;;;-1:-1:-1::0;;;43948:73:0::1;;;;;;;:::i;:::-;44058:6;::::0;44037:38:::1;::::0;-1:-1:-1;;;;;44037:38:0;;::::1;::::0;44058:6:::1;::::0;44037:38:::1;::::0;44058:6:::1;::::0;44037:38:::1;44086:6;:17:::0;;-1:-1:-1;;;;;;44086:17:0::1;-1:-1:-1::0;;;;;44086:17:0;;;::::1;::::0;;;::::1;::::0;;43867:244::o;15868:98::-;15948:10;15868:98;:::o;19098:157::-;-1:-1:-1;;;;;;19207:40:0;;-1:-1:-1;;;19207:40:0;19098:157;;;:::o;26241:127::-;26306:4;26330:16;;;:7;:16;;;;;;-1:-1:-1;;;;;26330:16:0;:30;;;26241:127::o;30118:174::-;30193:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;30193:29:0;-1:-1:-1;;;;;30193:29:0;;;;;;;;:24;;30247:23;30193:24;30247:14;:23::i;:::-;-1:-1:-1;;;;;30238:46:0;;;;;;;;;;;30118:174;;:::o;26535:348::-;26628:4;26653:16;26661:7;26653;:16::i;:::-;26645:73;;;;-1:-1:-1;;;26645:73:0;;;;;;;:::i;:::-;26729:13;26745:23;26760:7;26745:14;:23::i;:::-;26729:39;;26798:5;-1:-1:-1;;;;;26787:16:0;:7;-1:-1:-1;;;;;26787:16:0;;:51;;;;26831:7;-1:-1:-1;;;;;26807:31:0;:20;26819:7;26807:11;:20::i;:::-;-1:-1:-1;;;;;26807:31:0;;26787:51;:87;;;;26842:32;26859:5;26866:7;26842:16;:32::i;:::-;26779:96;26535:348;-1:-1:-1;;;;26535:348:0:o;29456:544::-;29581:4;-1:-1:-1;;;;;29554:31:0;:23;29569:7;29554:14;:23::i;:::-;-1:-1:-1;;;;;29554:31:0;;29546:85;;;;-1:-1:-1;;;29546:85:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;29650:16:0;;29642:65;;;;-1:-1:-1;;;29642:65:0;;;;;;;:::i;:::-;29720:39;29741:4;29747:2;29751:7;29720:20;:39::i;:::-;29824:29;29841:1;29845:7;29824:8;:29::i;:::-;-1:-1:-1;;;;;29866:15:0;;;;;;:9;:15;;;;;:20;;29885:1;;29866:15;:20;;29885:1;;29866:20;:::i;:::-;;;;-1:-1:-1;;;;;;;29897:13:0;;;;;;:9;:13;;;;;:18;;29914:1;;29897:13;:18;;29914:1;;29897:18;:::i;:::-;;;;-1:-1:-1;;29926:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;29926:21:0;-1:-1:-1;;;;;29926:21:0;;;;;;;;;29965:27;;29926:16;;29965:27;;;;;;;29456:544;;;:::o;46846:98::-;46904:7;46931:5;46935:1;46931;:5;:::i;:::-;46924:12;46846:98;-1:-1:-1;;;46846:98:0:o;25656:272::-;25770:28;25780:4;25786:2;25790:7;25770:9;:28::i;:::-;25817:48;25840:4;25846:2;25850:7;25859:5;25817:22;:48::i;:::-;25809:111;;;;-1:-1:-1;;;25809:111:0;;;;;;;:::i;52574:107::-;52633:13;52666:7;52659:14;;;;;:::i;16926:78::-;16933:9;;16926:78;;16959:8;;;;:::i;:::-;;-1:-1:-1;16982:10:0;;-1:-1:-1;16990:2:0;16982:10;;:::i;:::-;;;16926:78;;;17014:19;17046:6;17036:17;;;;;;-1:-1:-1;;;17036:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17036:17:0;;17014:39;;17064:154;17071:10;;17064:154;;17098:11;17108:1;17098:11;;:::i;:::-;;-1:-1:-1;17167:10:0;17175:2;17167:5;:10;:::i;:::-;17154:24;;:2;:24;:::i;:::-;17141:39;;17124:6;17131;17124:14;;;;;;-1:-1:-1;;;17124:14:0;;;;;;;;;;;;:56;-1:-1:-1;;;;;17124:56:0;;;;;;;;-1:-1:-1;17195:11:0;17204:2;17195:11;;:::i;:::-;;;17064:154;;47983:98;48041:7;48068:5;48072:1;48068;:5;:::i;47584:98::-;47642:7;47669:5;47673:1;47669;:5;:::i;28148:382::-;-1:-1:-1;;;;;28228:16:0;;28220:61;;;;-1:-1:-1;;;28220:61:0;;;;;;;:::i;:::-;28301:16;28309:7;28301;:16::i;:::-;28300:17;28292:58;;;;-1:-1:-1;;;28292:58:0;;;;;;;:::i;:::-;28363:45;28392:1;28396:2;28400:7;28363:20;:45::i;:::-;-1:-1:-1;;;;;28421:13:0;;;;;;:9;:13;;;;;:18;;28438:1;;28421:13;:18;;28438:1;;28421:18;:::i;:::-;;;;-1:-1:-1;;28450:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;28450:21:0;-1:-1:-1;;;;;28450:21:0;;;;;;;;28489:33;;28450:16;;;28489:33;;28450:16;;28489:33;28148:382;;:::o;52042:73::-;52090:15;:17;;;:15;:17;;;:::i;:::-;;;;;;52042:73::o;30857:843::-;30978:4;31004:15;:2;-1:-1:-1;;;;;31004:13:0;;:15::i;:::-;31000:693;;;31056:2;-1:-1:-1;;;;;31040:36:0;;31077:12;:10;:12::i;:::-;31091:4;31097:7;31106:5;31040:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31040:72:0;;;;;;;;-1:-1:-1;;31040:72:0;;;;;;;;;;;;:::i;:::-;;;31036:602;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31286:13:0;;31282:341;;31329:60;;-1:-1:-1;;;31329:60:0;;;;;;;:::i;31282:341::-;31573:6;31567:13;31558:6;31554:2;31550:15;31543:38;31036:602;-1:-1:-1;;;;;;31163:55:0;-1:-1:-1;;;31163:55:0;;-1:-1:-1;31156:62:0;;31000:693;-1:-1:-1;31677:4:0;30857:843;;;;;;:::o;7974:422::-;8341:20;8380:8;;;7974:422::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:633:1;;110:18;151:2;143:6;140:14;137:2;;;157:18;;:::i;:::-;232:2;226:9;200:2;286:15;;-1:-1:-1;;282:24:1;;;308:2;278:33;274:42;262:55;;;332:18;;;352:22;;;329:46;326:2;;;378:18;;:::i;:::-;418:10;414:2;407:22;447:6;438:15;;477:6;469;462:22;517:3;508:6;503:3;499:16;496:25;493:2;;;534:1;531;524:12;493:2;584:6;579:3;572:4;564:6;560:17;547:44;639:1;632:4;623:6;615;611:19;607:30;600:41;;;;90:557;;;;;:::o;652:175::-;722:20;;-1:-1:-1;;;;;771:31:1;;761:42;;751:2;;817:1;814;807:12;832:233;;930:3;923:4;915:6;911:17;907:27;897:2;;952:5;945;938:20;897:2;978:81;1055:3;1046:6;1033:20;1026:4;1018:6;1014:17;978:81;:::i;1070:198::-;;1182:2;1170:9;1161:7;1157:23;1153:32;1150:2;;;1203:6;1195;1188:22;1150:2;1231:31;1252:9;1231:31;:::i;1273:274::-;;;1402:2;1390:9;1381:7;1377:23;1373:32;1370:2;;;1423:6;1415;1408:22;1370:2;1451:31;1472:9;1451:31;:::i;:::-;1441:41;;1501:40;1537:2;1526:9;1522:18;1501:40;:::i;:::-;1491:50;;1360:187;;;;;:::o;1552:342::-;;;;1698:2;1686:9;1677:7;1673:23;1669:32;1666:2;;;1719:6;1711;1704:22;1666:2;1747:31;1768:9;1747:31;:::i;:::-;1737:41;;1797:40;1833:2;1822:9;1818:18;1797:40;:::i;:::-;1787:50;;1884:2;1873:9;1869:18;1856:32;1846:42;;1656:238;;;;;:::o;1899:702::-;;;;;2071:3;2059:9;2050:7;2046:23;2042:33;2039:2;;;2093:6;2085;2078:22;2039:2;2121:31;2142:9;2121:31;:::i;:::-;2111:41;;2171:40;2207:2;2196:9;2192:18;2171:40;:::i;:::-;2161:50;;2258:2;2247:9;2243:18;2230:32;2220:42;;2313:2;2302:9;2298:18;2285:32;2340:18;2332:6;2329:30;2326:2;;;2377:6;2369;2362:22;2326:2;2405:22;;2458:4;2450:13;;2446:27;-1:-1:-1;2436:2:1;;2492:6;2484;2477:22;2436:2;2520:75;2587:7;2582:2;2569:16;2564:2;2560;2556:11;2520:75;:::i;:::-;2510:85;;;2029:572;;;;;;;:::o;2606:369::-;;;2732:2;2720:9;2711:7;2707:23;2703:32;2700:2;;;2753:6;2745;2738:22;2700:2;2781:31;2802:9;2781:31;:::i;:::-;2771:41;;2862:2;2851:9;2847:18;2834:32;2909:5;2902:13;2895:21;2888:5;2885:32;2875:2;;2936:6;2928;2921:22;2875:2;2964:5;2954:15;;;2690:285;;;;;:::o;2980:420::-;;;3119:2;3107:9;3098:7;3094:23;3090:32;3087:2;;;3140:6;3132;3125:22;3087:2;3168:31;3189:9;3168:31;:::i;:::-;3158:41;;3250:2;3239:9;3235:18;3222:32;3277:18;3269:6;3266:30;3263:2;;;3314:6;3306;3299:22;3263:2;3342:52;3386:7;3377:6;3366:9;3362:22;3342:52;:::i;:::-;3332:62;;;3077:323;;;;;:::o;3405:266::-;;;3534:2;3522:9;3513:7;3509:23;3505:32;3502:2;;;3555:6;3547;3540:22;3502:2;3583:31;3604:9;3583:31;:::i;:::-;3573:41;3661:2;3646:18;;;;3633:32;;-1:-1:-1;;;3492:179:1:o;3676:257::-;;3787:2;3775:9;3766:7;3762:23;3758:32;3755:2;;;3808:6;3800;3793:22;3755:2;3852:9;3839:23;3871:32;3897:5;3871:32;:::i;3938:261::-;;4060:2;4048:9;4039:7;4035:23;4031:32;4028:2;;;4081:6;4073;4066:22;4028:2;4118:9;4112:16;4137:32;4163:5;4137:32;:::i;4204:344::-;;4326:2;4314:9;4305:7;4301:23;4297:32;4294:2;;;4347:6;4339;4332:22;4294:2;4392:9;4379:23;4425:18;4417:6;4414:30;4411:2;;;4462:6;4454;4447:22;4411:2;4490:52;4534:7;4525:6;4514:9;4510:22;4490:52;:::i;4553:190::-;;4665:2;4653:9;4644:7;4640:23;4636:32;4633:2;;;4686:6;4678;4671:22;4633:2;-1:-1:-1;4714:23:1;;4623:120;-1:-1:-1;4623:120:1:o;4748:412::-;;;4887:2;4875:9;4866:7;4862:23;4858:32;4855:2;;;4908:6;4900;4893:22;4855:2;4949:9;4936:23;4926:33;;5010:2;4999:9;4995:18;4982:32;5037:18;5029:6;5026:30;5023:2;;;5074:6;5066;5059:22;5165:259;;5246:5;5240:12;5273:6;5268:3;5261:19;5289:63;5345:6;5338:4;5333:3;5329:14;5322:4;5315:5;5311:16;5289:63;:::i;:::-;5406:2;5385:15;-1:-1:-1;;5381:29:1;5372:39;;;;5413:4;5368:50;;5216:208;-1:-1:-1;;5216:208:1:o;5904:203::-;-1:-1:-1;;;;;6068:32:1;;;;6050:51;;6038:2;6023:18;;6005:102::o;6112:490::-;-1:-1:-1;;;;;6381:15:1;;;6363:34;;6433:15;;6428:2;6413:18;;6406:43;6480:2;6465:18;;6458:34;;;6528:3;6523:2;6508:18;;6501:31;;;6112:490;;6549:47;;6576:19;;6568:6;6549:47;:::i;:::-;6541:55;6315:287;-1:-1:-1;;;;;;6315:287:1:o;6607:187::-;6772:14;;6765:22;6747:41;;6735:2;6720:18;;6702:92::o;6799:221::-;;6948:2;6937:9;6930:21;6968:46;7010:2;6999:9;6995:18;6987:6;6968:46;:::i;7025:414::-;7227:2;7209:21;;;7266:2;7246:18;;;7239:30;7305:34;7300:2;7285:18;;7278:62;-1:-1:-1;;;7371:2:1;7356:18;;7349:48;7429:3;7414:19;;7199:240::o;7444:402::-;7646:2;7628:21;;;7685:2;7665:18;;;7658:30;7724:34;7719:2;7704:18;;7697:62;-1:-1:-1;;;7790:2:1;7775:18;;7768:36;7836:3;7821:19;;7618:228::o;7851:352::-;8053:2;8035:21;;;8092:2;8072:18;;;8065:30;8131;8126:2;8111:18;;8104:58;8194:2;8179:18;;8025:178::o;8208:334::-;8410:2;8392:21;;;8449:2;8429:18;;;8422:30;-1:-1:-1;;;8483:2:1;8468:18;;8461:40;8533:2;8518:18;;8382:160::o;8547:400::-;8749:2;8731:21;;;8788:2;8768:18;;;8761:30;8827:34;8822:2;8807:18;;8800:62;-1:-1:-1;;;8893:2:1;8878:18;;8871:34;8937:3;8922:19;;8721:226::o;8952:349::-;9154:2;9136:21;;;9193:2;9173:18;;;9166:30;9232:27;9227:2;9212:18;;9205:55;9292:2;9277:18;;9126:175::o;9306:408::-;9508:2;9490:21;;;9547:2;9527:18;;;9520:30;9586:34;9581:2;9566:18;;9559:62;-1:-1:-1;;;9652:2:1;9637:18;;9630:42;9704:3;9689:19;;9480:234::o;9719:420::-;9921:2;9903:21;;;9960:2;9940:18;;;9933:30;9999:34;9994:2;9979:18;;9972:62;10070:26;10065:2;10050:18;;10043:54;10129:3;10114:19;;9893:246::o;10144:406::-;10346:2;10328:21;;;10385:2;10365:18;;;10358:30;10424:34;10419:2;10404:18;;10397:62;-1:-1:-1;;;10490:2:1;10475:18;;10468:40;10540:3;10525:19;;10318:232::o;10555:405::-;10757:2;10739:21;;;10796:2;10776:18;;;10769:30;10835:34;10830:2;10815:18;;10808:62;-1:-1:-1;;;10901:2:1;10886:18;;10879:39;10950:3;10935:19;;10729:231::o;10965:356::-;11167:2;11149:21;;;11186:18;;;11179:30;11245:34;11240:2;11225:18;;11218:62;11312:2;11297:18;;11139:182::o;11326:408::-;11528:2;11510:21;;;11567:2;11547:18;;;11540:30;11606:34;11601:2;11586:18;;11579:62;-1:-1:-1;;;11672:2:1;11657:18;;11650:42;11724:3;11709:19;;11500:234::o;11739:408::-;11941:2;11923:21;;;11980:2;11960:18;;;11953:30;12019:34;12014:2;11999:18;;11992:62;-1:-1:-1;;;12085:2:1;12070:18;;12063:42;12137:3;12122:19;;11913:234::o;12152:356::-;12354:2;12336:21;;;12373:18;;;12366:30;12432:34;12427:2;12412:18;;12405:62;12499:2;12484:18;;12326:182::o;12513:405::-;12715:2;12697:21;;;12754:2;12734:18;;;12727:30;12793:34;12788:2;12773:18;;12766:62;-1:-1:-1;;;12859:2:1;12844:18;;12837:39;12908:3;12893:19;;12687:231::o;12923:411::-;13125:2;13107:21;;;13164:2;13144:18;;;13137:30;13203:34;13198:2;13183:18;;13176:62;-1:-1:-1;;;13269:2:1;13254:18;;13247:45;13324:3;13309:19;;13097:237::o;13339:397::-;13541:2;13523:21;;;13580:2;13560:18;;;13553:30;13619:34;13614:2;13599:18;;13592:62;-1:-1:-1;;;13685:2:1;13670:18;;13663:31;13726:3;13711:19;;13513:223::o;13741:413::-;13943:2;13925:21;;;13982:2;13962:18;;;13955:30;14021:34;14016:2;14001:18;;13994:62;-1:-1:-1;;;14087:2:1;14072:18;;14065:47;14144:3;14129:19;;13915:239::o;14159:356::-;14361:2;14343:21;;;14380:18;;;14373:30;14439:34;14434:2;14419:18;;14412:62;14506:2;14491:18;;14333:182::o;14520:177::-;14666:25;;;14654:2;14639:18;;14621:76::o;14702:128::-;;14773:1;14769:6;14766:1;14763:13;14760:2;;;14779:18;;:::i;:::-;-1:-1:-1;14815:9:1;;14750:80::o;14835:120::-;;14901:1;14891:2;;14906:18;;:::i;:::-;-1:-1:-1;14940:9:1;;14881:74::o;14960:168::-;;15066:1;15062;15058:6;15054:14;15051:1;15048:21;15043:1;15036:9;15029:17;15025:45;15022:2;;;15073:18;;:::i;:::-;-1:-1:-1;15113:9:1;;15012:116::o;15133:125::-;;15201:1;15198;15195:8;15192:2;;;15206:18;;:::i;:::-;-1:-1:-1;15243:9:1;;15182:76::o;15263:258::-;15335:1;15345:113;15359:6;15356:1;15353:13;15345:113;;;15435:11;;;15429:18;15416:11;;;15409:39;15381:2;15374:10;15345:113;;;15476:6;15473:1;15470:13;15467:2;;;-1:-1:-1;;15511:1:1;15493:16;;15486:27;15316:205::o;15526:380::-;15611:1;15601:12;;15658:1;15648:12;;;15669:2;;15723:4;15715:6;15711:17;15701:27;;15669:2;15776;15768:6;15765:14;15745:18;15742:38;15739:2;;;15822:10;15817:3;15813:20;15810:1;15803:31;15857:4;15854:1;15847:15;15885:4;15882:1;15875:15;15739:2;;15581:325;;;:::o;15911:135::-;;-1:-1:-1;;15971:17:1;;15968:2;;;15991:18;;:::i;:::-;-1:-1:-1;16038:1:1;16027:13;;15958:88::o;16051:112::-;;16109:1;16099:2;;16114:18;;:::i;:::-;-1:-1:-1;16148:9:1;;16089:74::o;16168:127::-;16229:10;16224:3;16220:20;16217:1;16210:31;16260:4;16257:1;16250:15;16284:4;16281:1;16274:15;16300:127;16361:10;16356:3;16352:20;16349:1;16342:31;16392:4;16389:1;16382:15;16416:4;16413:1;16406:15;16432:127;16493:10;16488:3;16484:20;16481:1;16474:31;16524:4;16521:1;16514:15;16548:4;16545:1;16538:15;16564:133;-1:-1:-1;;;;;;16640:32:1;;16630:43;;16620:2;;16687:1;16684;16677:12

Swarm Source

ipfs://2e93301222e38f08e788b6b829ef7e7856b8dc2b72670f98fbc57a14be483869
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.