Polygon Sponsored slots available. Book your slot here!
Contract Overview
Balance:
0.015 MATIC
MATIC Value:
$0.01 (@ $0.96/MATIC)
Txn Hash | Method |
Block
|
From
|
To
|
Value | [Txn Fee] | |||
---|---|---|---|---|---|---|---|---|---|
0x4b48108043832e4d4847904306bfb2ed905b80d64c46e2327b040ffa37fd1737 | Whitelist Mint | 29913328 | 52 days 14 hrs ago | 0xac00688fe98dbd229210b482da15abf8b2ab4df6 | IN | 0x72fc55ad370299414546669f03441a14f587bf6f | 0.0075 MATIC | 0.003425270549 | |
0xd7a69a3e41061e430f14b3b2fb61bc746130e96d42153ac3c7687501fd4bb1a7 | Whitelist Mint | 29913297 | 52 days 14 hrs ago | 0xac00688fe98dbd229210b482da15abf8b2ab4df6 | IN | 0x72fc55ad370299414546669f03441a14f587bf6f | 0.0075 MATIC | 0.005121325478 | |
0xe84f6a9e2a0b43cc148c9f4ce33c2b1439189ca1045db8275f4147ecc451d6f4 | Set Whitelist Pr... | 29907156 | 52 days 18 hrs ago | 0x486587c0af967962f107dec516070f6f2d3d727a | IN | 0x72fc55ad370299414546669f03441a14f587bf6f | 0 MATIC | 0.001498940054 | |
0x58188a6d88c27c7be2af46d55f09e057822421604b1414ca0f5ca4ff8f847a44 | 0x60806040 | 29906758 | 52 days 19 hrs ago | 0x486587c0af967962f107dec516070f6f2d3d727a | IN | Create: NftMinter | 0 MATIC | 0.17862395887 |
[ Download CSV Export ]
Contract Name:
NftMinter
Compiler Version
v0.8.14+commit.80d49f37
Contract Source Code (Solidity Multiple files format)
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC20/ERC20.sol) pragma solidity ^0.8.0; import "./AccessControlEnumerable.sol"; import "./ERC2981.sol"; import "./Counters.sol"; import "./SafeMath.sol"; import "./ERC721.sol"; contract NftMinter is ERC721, AccessControlEnumerable, ERC2981 { using Counters for Counters.Counter; bytes32 public constant PAYOUT_ROLE = keccak256("PAYOUT_ROLE"); bytes32 public constant LEGENDARY_PROVIDER_ROLE = keccak256("LEGENDARY_PROVIDER_ROLE"); Counters.Counter private _tokenIds; uint256 public maxSupply; uint256 public pricePerNft; uint256 public whitelistPricePerNft; address private _creatorAddress; string private _baseUri; bool private _baseUriSettable = true; uint64 public whitelistMintStartTime = 0; uint64 public mintStartTime = 0; // The default end time is 2030/12/31 at 23:59:59. uint64 public mintEndTime = 1925009999; bool public mintingAllowed = true; bytes32 public whitelistProofRoot = 0x0; mapping(address => uint256) public whitelistMinted; string public legendaryStatus; /** * @dev Emitted when tokens are minted via the mint() function. */ event TokensMinted(uint256 numTokensMinted, string clientInfo); /** * @dev Initializes the NftMinter with default admin and payout roles. * * @param name_ the name of the NFT collection. * @param symbol_ the symbol of the NFT collection. * @param maxSupply_ the maximum number of items in the collection. * @param pricePerNft_ the price per NFT. */ constructor( string memory name_, string memory symbol_, uint256 maxSupply_, uint256 pricePerNft_, uint256 whitelistPricePerNft_ ) ERC721(name_, symbol_) { _setupRole(DEFAULT_ADMIN_ROLE, _msgSender()); _setupRole(LEGENDARY_PROVIDER_ROLE, _msgSender()); maxSupply = maxSupply_; pricePerNft = pricePerNft_; whitelistPricePerNft = whitelistPricePerNft_; _baseUri = ""; legendaryStatus = "Verified Still Valid (Unused)"; super._setRoleAdmin(LEGENDARY_PROVIDER_ROLE, LEGENDARY_PROVIDER_ROLE); } /** * @dev Set price per NFT. */ function setPricePerNft(uint256 pricePerNft_) public onlyRole(DEFAULT_ADMIN_ROLE) { pricePerNft = pricePerNft_; } /** * @dev Set whitelist price per NFT. */ function setWhitelistPricePerNft(uint256 whitelistPricePerNft_) public onlyRole(DEFAULT_ADMIN_ROLE) { whitelistPricePerNft = whitelistPricePerNft_; } /** * @dev Public facing minting function. */ function mint(uint256 numTokensToMint, string memory clientInfo) public payable { uint256 currentPayment = numTokensToMint * pricePerNft; require(msg.value == currentPayment, "Invalid payment amount."); require(mintStartTime <= block.timestamp, "Minting is not open yet."); uint256 startTokenId = _tokenIds.current(); _mintCommon(numTokensToMint); emit TokensMinted(_tokenIds.current() - startTokenId, clientInfo); } /** * @dev Minting function for buys on a whitelist. The price can be different from * the regular minting function. In addition, */ function whitelistMint( bytes32[] memory proof, uint256 maxMintableTokens, uint256 numTokensToMint, string memory clientInfo ) public payable { require( whitelistMinted[_msgSender()] + numTokensToMint <= maxMintableTokens, "Trying to mint more whitelist tokens than allowed." ); require( onWhitelist(_msgSender(), maxMintableTokens, proof), "Invalid proof." ); require(msg.value == whitelistPricePerNft, "Invalid payment value."); require(whitelistMintStartTime <= block.timestamp, "Minting not open."); uint256 startTokenId = _tokenIds.current(); _mintCommon(numTokensToMint); whitelistMinted[_msgSender()] += numTokensToMint; emit TokensMinted(_tokenIds.current() - startTokenId, clientInfo); } /** * @dev Irreversibly stops all future minting. */ function stopFutureMinting() public onlyRole(DEFAULT_ADMIN_ROLE) { mintingAllowed = false; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { require(getRoleMemberCount(DEFAULT_ADMIN_ROLE) == 1); return getRoleMember(DEFAULT_ADMIN_ROLE, 0); } /** * @dev Sets the address that will get royalties. */ function setRoyalty(address receiver, uint96 royaltyBps) public onlyRole(DEFAULT_ADMIN_ROLE) { _setDefaultRoyalty(receiver, royaltyBps); } /** * @dev Allows administrators to mint for free. This could be used * for raffles or listing NFTs on marketplaces such as OpenSea or * Rarible. This can happen prior to the mint opening, but not * after minting has closed and cannot be used to increase the * number of NFTs beyond the max supply. */ function adminMint(uint256 numTokensToMint) public onlyRole(DEFAULT_ADMIN_ROLE) { _mintCommon(numTokensToMint); } /** * @dev Allows token holders to burn their tokens. This is irreversible. */ function burn(uint256 tokenId) public { require( super.ownerOf(tokenId) == msg.sender, "Only token owner can burn." ); super._burn(tokenId); } /** * @dev Remaining number of tokens that can be minted. */ function totalSupply() public view returns (uint256) { return _tokenIds.current(); } /** * @dev Withdraw ETH from this contract to an account in `PAYOUT_ROLL`. */ function withdraw() public onlyRole(PAYOUT_ROLE) { (bool sent, ) = msg.sender.call{value: address(this).balance}(""); require(sent, "Send failed."); } /** * @dev Updates the baseUri of the NFTs. For example, when artwork is ready. */ function setBaseUri(string memory baseUri) public onlyRole(DEFAULT_ADMIN_ROLE) { require(_baseUriSettable, "URIs frozen."); _baseUri = baseUri; } /** * @dev Prohibits future updating of the metadata. */ function freezeMetadata() public onlyRole(DEFAULT_ADMIN_ROLE) { _baseUriSettable = false; } /** * @dev Sets when minting can begin. */ function setMintStartTime(uint64 mintStartTime_) public onlyRole(DEFAULT_ADMIN_ROLE) { mintStartTime = mintStartTime_; } /** * @dev Sets when whitelist minting can begin. */ function setWhitelistMintStartTime(uint64 whitelistMintStartTime_) public onlyRole(DEFAULT_ADMIN_ROLE) { whitelistMintStartTime = whitelistMintStartTime_; } /** * @dev Sets when minting can end. */ function setMintEndTime(uint64 mintEndTime_) public onlyRole(DEFAULT_ADMIN_ROLE) { require(mintEndTime_ <= mintEndTime, "New end time must be sooner."); mintEndTime = mintEndTime_; } /** * @dev Updates the status of the legendary NFT once it has been allocated. */ function setLegendaryStatus(string memory legendaryStatus_) public onlyRole(LEGENDARY_PROVIDER_ROLE) { legendaryStatus = legendaryStatus_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721, AccessControlEnumerable, ERC2981) returns (bool) { return interfaceId == type(IAccessControlEnumerable).interfaceId || interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Sets the root hash of a Merkel tree to recreate a white list. */ function setWhitelistProof(bytes32 whitelistProofRoot_) public onlyRole(DEFAULT_ADMIN_ROLE) { whitelistProofRoot = whitelistProofRoot_; } function _baseURI() internal view override returns (string memory) { return _baseUri; } /** * @dev Checks if `claimant` is on a white list, specified by a Merkel tree. */ function onWhitelist( address claimant, uint256 maxMintableTokens, bytes32[] memory proof ) internal view returns (bool) { if (whitelistProofRoot == 0x0) { return false; } bytes32 computedHash = keccak256( abi.encodePacked(claimant, maxMintableTokens) ); for (uint256 i = 0; i < proof.length; i++) { bytes32 proofElement = proof[i]; if (computedHash <= proofElement) { // Hash(current computed hash + current element of the proof) computedHash = keccak256( abi.encodePacked(computedHash, proofElement) ); } else { // Hash(current element of the proof + current computed hash) computedHash = keccak256( abi.encodePacked(proofElement, computedHash) ); } } return computedHash == whitelistProofRoot; } function _mintCommon(uint256 numTokensToMint) internal { require(mintingAllowed, "Minting unallowed."); require(block.timestamp <= mintEndTime, "Minting closed."); for (uint256 i = 0; i < numTokensToMint; ++i) { _tokenIds.increment(); uint256 newItemId = _tokenIds.current(); require(newItemId <= maxSupply, "Can't mint that many NFTs."); super._safeMint(msg.sender, newItemId); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (access/AccessControl.sol) pragma solidity ^0.8.0; import "./IAccessControl.sol"; import "./Context.sol"; import "./Strings.sol"; import "./ERC165.sol"; /** * @dev Contract module that allows children to implement role-based access * control mechanisms. This is a lightweight version that doesn't allow enumerating role * members except through off-chain means by accessing the contract event logs. Some * applications may benefit from on-chain enumerability, for those cases see * {AccessControlEnumerable}. * * Roles are referred to by their `bytes32` identifier. These should be exposed * in the external API and be unique. The best way to achieve this is by * using `public constant` hash digests: * * ``` * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); * ``` * * Roles can be used to represent a set of permissions. To restrict access to a * function call, use {hasRole}: * * ``` * function foo() public { * require(hasRole(MY_ROLE, msg.sender)); * ... * } * ``` * * Roles can be granted and revoked dynamically via the {grantRole} and * {revokeRole} functions. Each role has an associated admin role, and only * accounts that have a role's admin role can call {grantRole} and {revokeRole}. * * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means * that only accounts with this role will be able to grant or revoke other * roles. More complex role relationships can be created by using * {_setRoleAdmin}. * * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to * grant and revoke this role. Extra precautions should be taken to secure * accounts that have been granted it. */ abstract contract AccessControl is Context, IAccessControl, ERC165 { struct RoleData { mapping(address => bool) members; bytes32 adminRole; } mapping(bytes32 => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Modifier that checks that an account has a specific role. Reverts * with a standardized message including the required role. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ * * _Available since v4.1._ */ modifier onlyRole(bytes32 role) { _checkRole(role); _; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view virtual override returns (bool) { return _roles[role].members[account]; } /** * @dev Revert with a standard message if `_msgSender()` is missing `role`. * Overriding this function changes the behavior of the {onlyRole} modifier. * * Format of the revert message is described in {_checkRole}. * * _Available since v4.6._ */ function _checkRole(bytes32 role) internal view virtual { _checkRole(role, _msgSender()); } /** * @dev Revert with a standard message if `account` is missing `role`. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ */ function _checkRole(bytes32 role, address account) internal view virtual { if (!hasRole(role, account)) { revert( string( abi.encodePacked( "AccessControl: account ", Strings.toHexString(uint160(account), 20), " is missing role ", Strings.toHexString(uint256(role), 32) ) ) ); } } /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) { return _roles[role].adminRole; } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _grantRole(role, account); } /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _revokeRole(role, account); } /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been revoked `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) public virtual override { require(account == _msgSender(), "AccessControl: can only renounce roles for self"); _revokeRole(role, account); } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. Note that unlike {grantRole}, this function doesn't perform any * checks on the calling account. * * [WARNING] * ==== * This function should only be called from the constructor when setting * up the initial roles for the system. * * Using this function in any other way is effectively circumventing the admin * system imposed by {AccessControl}. * ==== * * NOTE: This function is deprecated in favor of {_grantRole}. */ function _setupRole(bytes32 role, address account) internal virtual { _grantRole(role, account); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { bytes32 previousAdminRole = getRoleAdmin(role); _roles[role].adminRole = adminRole; emit RoleAdminChanged(role, previousAdminRole, adminRole); } /** * @dev Grants `role` to `account`. * * Internal function without access restriction. */ function _grantRole(bytes32 role, address account) internal virtual { if (!hasRole(role, account)) { _roles[role].members[account] = true; emit RoleGranted(role, account, _msgSender()); } } /** * @dev Revokes `role` from `account`. * * Internal function without access restriction. */ function _revokeRole(bytes32 role, address account) internal virtual { if (hasRole(role, account)) { _roles[role].members[account] = false; emit RoleRevoked(role, account, _msgSender()); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (access/AccessControlEnumerable.sol) pragma solidity ^0.8.0; import "./IAccessControlEnumerable.sol"; import "./AccessControl.sol"; import "./EnumerableSet.sol"; /** * @dev Extension of {AccessControl} that allows enumerating the members of each role. */ abstract contract AccessControlEnumerable is IAccessControlEnumerable, AccessControl { using EnumerableSet for EnumerableSet.AddressSet; mapping(bytes32 => EnumerableSet.AddressSet) private _roleMembers; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControlEnumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns one of the accounts that have `role`. `index` must be a * value between 0 and {getRoleMemberCount}, non-inclusive. * * Role bearers are not sorted in any particular way, and their ordering may * change at any point. * * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure * you perform all queries on the same block. See the following * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post] * for more information. */ function getRoleMember(bytes32 role, uint256 index) public view virtual override returns (address) { return _roleMembers[role].at(index); } /** * @dev Returns the number of accounts that have `role`. Can be used * together with {getRoleMember} to enumerate all bearers of a role. */ function getRoleMemberCount(bytes32 role) public view virtual override returns (uint256) { return _roleMembers[role].length(); } /** * @dev Overload {_grantRole} to track enumerable memberships */ function _grantRole(bytes32 role, address account) internal virtual override { super._grantRole(role, account); _roleMembers[role].add(account); } /** * @dev Overload {_revokeRole} to track enumerable memberships */ function _revokeRole(bytes32 role, address account) internal virtual override { super._revokeRole(role, account); _roleMembers[role].remove(account); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Counters.sol) pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (utils/structs/EnumerableSet.sol) pragma solidity ^0.8.0; /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`) * and `uint256` (`UintSet`) are supported. */ library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping(bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; if (lastIndex != toDeleteIndex) { bytes32 lastValue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastValue; // Update the index for the moved value set._indexes[lastValue] = valueIndex; // Replace lastValue's index to valueIndex } // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { return set._values[index]; } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function _values(Set storage set) private view returns (bytes32[] memory) { return set._values; } // Bytes32Set struct Bytes32Set { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values in the set. O(1). */ function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(Bytes32Set storage set) internal view returns (bytes32[] memory) { return _values(set._inner); } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint160(uint256(_at(set._inner, index)))); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(AddressSet storage set) internal view returns (address[] memory) { bytes32[] memory store = _values(set._inner); address[] memory result; assembly { result := store } return result; } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values on the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(UintSet storage set) internal view returns (uint256[] memory) { bytes32[] memory store = _values(set._inner); uint256[] memory result; assembly { result := store } return result; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @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; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/common/ERC2981.sol) pragma solidity ^0.8.0; import "./IERC2981.sol"; import "./ERC165.sol"; /** * @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information. * * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first. * * Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the * fee is specified in basis points by default. * * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported. * * _Available since v4.5._ */ abstract contract ERC2981 is IERC2981, ERC165 { struct RoyaltyInfo { address receiver; uint96 royaltyFraction; } RoyaltyInfo private _defaultRoyaltyInfo; mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC165) returns (bool) { return interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId); } /** * @inheritdoc IERC2981 */ function royaltyInfo(uint256 _tokenId, uint256 _salePrice) public view virtual override returns (address, uint256) { RoyaltyInfo memory royalty = _tokenRoyaltyInfo[_tokenId]; if (royalty.receiver == address(0)) { royalty = _defaultRoyaltyInfo; } uint256 royaltyAmount = (_salePrice * royalty.royaltyFraction) / _feeDenominator(); return (royalty.receiver, royaltyAmount); } /** * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an * override. */ function _feeDenominator() internal pure virtual returns (uint96) { return 10000; } /** * @dev Sets the royalty information that all ids in this contract will default to. * * Requirements: * * - `receiver` cannot be the zero address. * - `feeNumerator` cannot be greater than the fee denominator. */ function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual { require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice"); require(receiver != address(0), "ERC2981: invalid receiver"); _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator); } /** * @dev Removes default royalty information. */ function _deleteDefaultRoyalty() internal virtual { delete _defaultRoyaltyInfo; } /** * @dev Sets the royalty information for a specific token id, overriding the global default. * * Requirements: * * - `tokenId` must be already minted. * - `receiver` cannot be the zero address. * - `feeNumerator` cannot be greater than the fee denominator. */ function _setTokenRoyalty( uint256 tokenId, address receiver, uint96 feeNumerator ) internal virtual { require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice"); require(receiver != address(0), "ERC2981: Invalid parameters"); _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator); } /** * @dev Resets royalty information for the token id back to the global default. */ function _resetTokenRoyalty(uint256 tokenId) internal virtual { delete _tokenRoyaltyInfo[tokenId]; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; import "./IERC721.sol"; import "./IERC721Receiver.sol"; import "./IERC721Metadata.sol"; import "./Address.sol"; import "./Context.sol"; import "./Strings.sol"; import "./ERC165.sol"; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol) pragma solidity ^0.8.0; /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControl { /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. * * _Available since v3.1._ */ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {AccessControl-_setupRole}. */ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) external view returns (bool); /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {AccessControl-_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) external view returns (bytes32); /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) external; /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) external; /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) external; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (access/IAccessControlEnumerable.sol) pragma solidity ^0.8.0; import "./IAccessControl.sol"; /** * @dev External interface of AccessControlEnumerable declared to support ERC165 detection. */ interface IAccessControlEnumerable is IAccessControl { /** * @dev Returns one of the accounts that have `role`. `index` must be a * value between 0 and {getRoleMemberCount}, non-inclusive. * * Role bearers are not sorted in any particular way, and their ordering may * change at any point. * * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure * you perform all queries on the same block. See the following * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post] * for more information. */ function getRoleMember(bytes32 role, uint256 index) external view returns (address); /** * @dev Returns the number of accounts that have `role`. Can be used * together with {getRoleMember} to enumerate all bearers of a role. */ function getRoleMemberCount(bytes32 role) external view returns (uint256); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (interfaces/IERC2981.sol) pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Interface for the NFT Royalty Standard. * * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal * support for royalty payments across all NFT marketplaces and ecosystem participants. * * _Available since v4.5._ */ interface IERC2981 is IERC165 { /** * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of * exchange. The royalty amount is denominated and should be paid in that same unit of exchange. */ function royaltyInfo(uint256 tokenId, uint256 salePrice) external view returns (address receiver, uint256 royaltyAmount); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @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`. * * 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; /** * @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 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 the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @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); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; import "./IERC721.sol"; /** * @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); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (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 `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (utils/math/SafeMath.sol) pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since 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 subtraction 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; } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"uint256","name":"maxSupply_","type":"uint256"},{"internalType":"uint256","name":"pricePerNft_","type":"uint256"},{"internalType":"uint256","name":"whitelistPricePerNft_","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"numTokensMinted","type":"uint256"},{"indexed":false,"internalType":"string","name":"clientInfo","type":"string"}],"name":"TokensMinted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LEGENDARY_PROVIDER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PAYOUT_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numTokensToMint","type":"uint256"}],"name":"adminMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"freezeMetadata","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getRoleMember","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleMemberCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"legendaryStatus","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numTokensToMint","type":"uint256"},{"internalType":"string","name":"clientInfo","type":"string"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintEndTime","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintStartTime","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintingAllowed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pricePerNft","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseUri","type":"string"}],"name":"setBaseUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"legendaryStatus_","type":"string"}],"name":"setLegendaryStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"mintEndTime_","type":"uint64"}],"name":"setMintEndTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"mintStartTime_","type":"uint64"}],"name":"setMintStartTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pricePerNft_","type":"uint256"}],"name":"setPricePerNft","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint96","name":"royaltyBps","type":"uint96"}],"name":"setRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"whitelistMintStartTime_","type":"uint64"}],"name":"setWhitelistMintStartTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"whitelistPricePerNft_","type":"uint256"}],"name":"setWhitelistPricePerNft","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"whitelistProofRoot_","type":"bytes32"}],"name":"setWhitelistProof","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stopFutureMinting","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":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"},{"internalType":"uint256","name":"maxMintableTokens","type":"uint256"},{"internalType":"uint256","name":"numTokensToMint","type":"uint256"},{"internalType":"string","name":"clientInfo","type":"string"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"whitelistMintStartTime","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistPricePerNft","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistProofRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526001601060006101000a81548160ff0219169083151502179055506000601060016101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000601060096101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506372bd524f601060116101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001601060196101000a81548160ff0219169083151502179055506000801b601155348015620000cf57600080fd5b506040516200673a3803806200673a8339818101604052810190620000f5919062000801565b848481600090805190602001906200010f92919062000579565b5080600190805190602001906200012892919062000579565b5050506200014f6000801b620001436200025d60201b60201c565b6200026560201b60201c565b620001907ff43adc78cba96d478e4a730c7aa087db7735c415426abb1c86fddc44ee1c8a3e620001846200025d60201b60201c565b6200026560201b60201c565b82600b8190555081600c8190555080600d8190555060405180602001604052806000815250600f9080519060200190620001cc92919062000579565b506040518060400160405280601d81526020017f5665726966696564205374696c6c2056616c69642028556e7573656429000000815250601390805190602001906200021a92919062000579565b50620002527ff43adc78cba96d478e4a730c7aa087db7735c415426abb1c86fddc44ee1c8a3e806200027b60201b620020db1760201c565b50505050506200092b565b600033905090565b620002778282620002df60201b60201c565b5050565b60006200028e836200032760201b60201c565b90508160066000858152602001908152602001600020600101819055508181847fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff60405160405180910390a4505050565b620002f682826200034760201b620021371760201c565b6200032281600760008581526020019081526020016000206200043960201b620022181790919060201c565b505050565b600060066000838152602001908152602001600020600101549050919050565b6200035982826200047160201b60201c565b620004355760016006600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550620003da6200025d60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b600062000469836000018373ffffffffffffffffffffffffffffffffffffffff1660001b620004dc60201b60201c565b905092915050565b60006006600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000620004f083836200055660201b60201c565b6200054b57826000018290806001815401808255809150506001900390600052602060002001600090919091909150558260000180549050836001016000848152602001908152602001600020819055506001905062000550565b600090505b92915050565b600080836001016000848152602001908152602001600020541415905092915050565b8280546200058790620008f6565b90600052602060002090601f016020900481019282620005ab5760008555620005f7565b82601f10620005c657805160ff1916838001178555620005f7565b82800160010185558215620005f7579182015b82811115620005f6578251825591602001919060010190620005d9565b5b5090506200060691906200060a565b5090565b5b80821115620006255760008160009055506001016200060b565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620006928262000647565b810181811067ffffffffffffffff82111715620006b457620006b362000658565b5b80604052505050565b6000620006c962000629565b9050620006d7828262000687565b919050565b600067ffffffffffffffff821115620006fa57620006f962000658565b5b620007058262000647565b9050602081019050919050565b60005b838110156200073257808201518184015260208101905062000715565b8381111562000742576000848401525b50505050565b60006200075f6200075984620006dc565b620006bd565b9050828152602081018484840111156200077e576200077d62000642565b5b6200078b84828562000712565b509392505050565b600082601f830112620007ab57620007aa6200063d565b5b8151620007bd84826020860162000748565b91505092915050565b6000819050919050565b620007db81620007c6565b8114620007e757600080fd5b50565b600081519050620007fb81620007d0565b92915050565b600080600080600060a0868803121562000820576200081f62000633565b5b600086015167ffffffffffffffff81111562000841576200084062000638565b5b6200084f8882890162000793565b955050602086015167ffffffffffffffff81111562000873576200087262000638565b5b620008818882890162000793565b94505060406200089488828901620007ea565b9350506060620008a788828901620007ea565b9250506080620008ba88828901620007ea565b9150509295509295909350565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200090f57607f821691505b602082108103620009255762000924620008c7565b5b50919050565b615dff806200093b6000396000f3fe6080604052600436106102ff5760003560e01c806386d3df7d11610190578063a6979438116100dc578063ca15c87311610095578063d5abeb011161006f578063d5abeb0114610b6a578063df339de514610b95578063e985e9c514610bb1578063fe3165c714610bee576102ff565b8063ca15c87314610aed578063d111515d14610b2a578063d547741f14610b41576102ff565b8063a6979438146109e1578063b88d4fde14610a0a578063badbda9a14610a33578063be5ffb9914610a5e578063c1f2612314610a87578063c87b56dd14610ab0576102ff565b806395d89b41116101495780639d596701116101235780639d5967011461093b578063a0bcfc7f14610964578063a217fddf1461098d578063a22cb465146109b8576102ff565b806395d89b41146108a857806396532d1c146108d357806398a8cffe146108fe576102ff565b806386d3df7d146107845780638da5cb5b146107af5780638f2fc60b146107da5780639010d07c1461080357806391d1485414610840578063931e2e491461087d576102ff565b80633ccfd60b1161024f5780635562effe116102085780636c39e00a116101e25780636c39e00a146106e957806370a0823114610700578063717a002b1461073d57806377097fc814610768576102ff565b80635562effe146106585780636352211e1461068157806365720c3e146106be576102ff565b80633ccfd60b146105705780634179a8f61461058757806342842e0e146105b257806342966c68146105db57806348c3581b14610604578063505e30721461062f576102ff565b806323b872dd116102bc5780632a55205a116102965780632a55205a146104b55780632bb1a91a146104f35780632f2ff15d1461051e57806336568abe14610547576102ff565b806323b872dd14610426578063248a9ca31461044f57806329e0e4a11461048c576102ff565b806301ffc9a714610304578063049126c51461034157806306fdde031461036a578063081812fc14610395578063095ea7b3146103d257806318160ddd146103fb575b600080fd5b34801561031057600080fd5b5061032b60048036038101906103269190613dcc565b610c19565b6040516103389190613e14565b60405180910390f35b34801561034d57600080fd5b5061036860048036038101906103639190613e6f565b610dcb565b005b34801561037657600080fd5b5061037f610e72565b60405161038c9190613f35565b60405180910390f35b3480156103a157600080fd5b506103bc60048036038101906103b79190613f8d565b610f04565b6040516103c99190613ffb565b60405180910390f35b3480156103de57600080fd5b506103f960048036038101906103f49190614042565b610f89565b005b34801561040757600080fd5b506104106110a0565b60405161041d9190614091565b60405180910390f35b34801561043257600080fd5b5061044d600480360381019061044891906140ac565b6110b1565b005b34801561045b57600080fd5b5061047660048036038101906104719190614135565b611111565b6040516104839190614171565b60405180910390f35b34801561049857600080fd5b506104b360048036038101906104ae9190613e6f565b611131565b005b3480156104c157600080fd5b506104dc60048036038101906104d7919061418c565b61116b565b6040516104ea9291906141cc565b60405180910390f35b3480156104ff57600080fd5b50610508611355565b6040516105159190614204565b60405180910390f35b34801561052a57600080fd5b506105456004803603810190610540919061421f565b61136f565b005b34801561055357600080fd5b5061056e6004803603810190610569919061421f565b611390565b005b34801561057c57600080fd5b50610585611413565b005b34801561059357600080fd5b5061059c6114ed565b6040516105a99190614171565b60405180910390f35b3480156105be57600080fd5b506105d960048036038101906105d491906140ac565b611511565b005b3480156105e757600080fd5b5061060260048036038101906105fd9190613f8d565b611531565b005b34801561061057600080fd5b506106196115b3565b6040516106269190614091565b60405180910390f35b34801561063b57600080fd5b5061065660048036038101906106519190614394565b6115b9565b005b34801561066457600080fd5b5061067f600480360381019061067a9190613e6f565b6115fe565b005b34801561068d57600080fd5b506106a860048036038101906106a39190613f8d565b611638565b6040516106b59190613ffb565b60405180910390f35b3480156106ca57600080fd5b506106d36116e9565b6040516106e09190614171565b60405180910390f35b3480156106f557600080fd5b506106fe61170d565b005b34801561070c57600080fd5b50610727600480360381019061072291906143dd565b611738565b6040516107349190614091565b60405180910390f35b34801561074957600080fd5b506107526117ef565b60405161075f9190614204565b60405180910390f35b610782600480360381019061077d919061440a565b611809565b005b34801561079057600080fd5b5061079961192a565b6040516107a69190613f35565b60405180910390f35b3480156107bb57600080fd5b506107c46119b8565b6040516107d19190613ffb565b60405180910390f35b3480156107e657600080fd5b5061080160048036038101906107fc91906144aa565b6119e5565b005b34801561080f57600080fd5b5061082a600480360381019061082591906144ea565b611a01565b6040516108379190613ffb565b60405180910390f35b34801561084c57600080fd5b506108676004803603810190610862919061421f565b611a30565b6040516108749190613e14565b60405180910390f35b34801561088957600080fd5b50610892611a9b565b60405161089f9190614204565b60405180910390f35b3480156108b457600080fd5b506108bd611ab5565b6040516108ca9190613f35565b60405180910390f35b3480156108df57600080fd5b506108e8611b47565b6040516108f59190613e14565b60405180910390f35b34801561090a57600080fd5b50610925600480360381019061092091906143dd565b611b5a565b6040516109329190614091565b60405180910390f35b34801561094757600080fd5b50610962600480360381019061095d9190614135565b611b72565b005b34801561097057600080fd5b5061098b60048036038101906109869190614394565b611b8a565b005b34801561099957600080fd5b506109a2611c01565b6040516109af9190614171565b60405180910390f35b3480156109c457600080fd5b506109df60048036038101906109da9190614556565b611c08565b005b3480156109ed57600080fd5b50610a086004803603810190610a039190613f8d565b611c1e565b005b348015610a1657600080fd5b50610a316004803603810190610a2c9190614637565b611c36565b005b348015610a3f57600080fd5b50610a48611c98565b604051610a559190614171565b60405180910390f35b348015610a6a57600080fd5b50610a856004803603810190610a809190613f8d565b611c9e565b005b348015610a9357600080fd5b50610aae6004803603810190610aa99190613f8d565b611cb6565b005b348015610abc57600080fd5b50610ad76004803603810190610ad29190613f8d565b611cd0565b604051610ae49190613f35565b60405180910390f35b348015610af957600080fd5b50610b146004803603810190610b0f9190614135565b611d77565b604051610b219190614091565b60405180910390f35b348015610b3657600080fd5b50610b3f611d9b565b005b348015610b4d57600080fd5b50610b686004803603810190610b63919061421f565b611dc6565b005b348015610b7657600080fd5b50610b7f611de7565b604051610b8c9190614091565b60405180910390f35b610baf6004803603810190610baa9190614782565b611ded565b005b348015610bbd57600080fd5b50610bd86004803603810190610bd39190614821565b612041565b604051610be59190613e14565b60405180910390f35b348015610bfa57600080fd5b50610c036120d5565b604051610c109190614091565b60405180910390f35b60007f5a05180f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610ce457507f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610d4c57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610db457507f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610dc45750610dc382612248565b5b9050919050565b6000801b610dd8816122c2565b601060119054906101000a900467ffffffffffffffff1667ffffffffffffffff168267ffffffffffffffff161115610e45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3c906148ad565b60405180910390fd5b81601060116101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505050565b606060008054610e81906148fc565b80601f0160208091040260200160405190810160405280929190818152602001828054610ead906148fc565b8015610efa5780601f10610ecf57610100808354040283529160200191610efa565b820191906000526020600020905b815481529060010190602001808311610edd57829003601f168201915b5050505050905090565b6000610f0f826122d6565b610f4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f459061499f565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610f9482611638565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611004576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ffb90614a31565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16611023612342565b73ffffffffffffffffffffffffffffffffffffffff16148061105257506110518161104c612342565b612041565b5b611091576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108890614ac3565b60405180910390fd5b61109b838361234a565b505050565b60006110ac600a612403565b905090565b6110c26110bc612342565b82612411565b611101576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f890614b55565b60405180910390fd5b61110c8383836124ef565b505050565b600060066000838152602001908152602001600020600101549050919050565b6000801b61113e816122c2565b81601060016101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505050565b6000806000600960008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16036113005760086040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b600061130a612755565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff16866113369190614ba4565b6113409190614c2d565b90508160000151819350935050509250929050565b601060019054906101000a900467ffffffffffffffff1681565b61137882611111565b611381816122c2565b61138b838361275f565b505050565b611398612342565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611405576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113fc90614cd0565b60405180910390fd5b61140f8282612793565b5050565b7f5612063648f807201ec1c6d4f999a34ed02c6a8b521b7b99e155a6823c56873661143d816122c2565b60003373ffffffffffffffffffffffffffffffffffffffff164760405161146390614d21565b60006040518083038185875af1925050503d80600081146114a0576040519150601f19603f3d011682016040523d82523d6000602084013e6114a5565b606091505b50509050806114e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e090614d82565b60405180910390fd5b5050565b7f5612063648f807201ec1c6d4f999a34ed02c6a8b521b7b99e155a6823c56873681565b61152c83838360405180602001604052806000815250611c36565b505050565b3373ffffffffffffffffffffffffffffffffffffffff1661155182611638565b73ffffffffffffffffffffffffffffffffffffffff16146115a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159e90614dee565b60405180910390fd5b6115b0816127c7565b50565b600d5481565b7ff43adc78cba96d478e4a730c7aa087db7735c415426abb1c86fddc44ee1c8a3e6115e3816122c2565b81601390805190602001906115f9929190613cbd565b505050565b6000801b61160b816122c2565b81601060096101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036116e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d790614e80565b60405180910390fd5b80915050919050565b7ff43adc78cba96d478e4a730c7aa087db7735c415426abb1c86fddc44ee1c8a3e81565b6000801b61171a816122c2565b6000601060196101000a81548160ff02191690831515021790555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036117a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179f90614f12565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b601060119054906101000a900467ffffffffffffffff1681565b6000600c54836118199190614ba4565b905080341461185d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185490614f7e565b60405180910390fd5b42601060099054906101000a900467ffffffffffffffff1667ffffffffffffffff1611156118c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b790614fea565b60405180910390fd5b60006118cc600a612403565b90506118d7846128e4565b7ff9a3e63482a5118eca8fc536a42876aefbc3aebb4d7097a76ac65a011e3359bc81611903600a612403565b61190d919061500a565b8460405161191c92919061503e565b60405180910390a150505050565b60138054611937906148fc565b80601f0160208091040260200160405190810160405280929190818152602001828054611963906148fc565b80156119b05780601f10611985576101008083540402835291602001916119b0565b820191906000526020600020905b81548152906001019060200180831161199357829003601f168201915b505050505081565b600060016119c86000801b611d77565b146119d257600080fd5b6119e06000801b6000611a01565b905090565b6000801b6119f2816122c2565b6119fc8383612a1e565b505050565b6000611a288260076000868152602001908152602001600020612bb390919063ffffffff16565b905092915050565b60006006600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b601060099054906101000a900467ffffffffffffffff1681565b606060018054611ac4906148fc565b80601f0160208091040260200160405190810160405280929190818152602001828054611af0906148fc565b8015611b3d5780601f10611b1257610100808354040283529160200191611b3d565b820191906000526020600020905b815481529060010190602001808311611b2057829003601f168201915b5050505050905090565b601060199054906101000a900460ff1681565b60126020528060005260406000206000915090505481565b6000801b611b7f816122c2565b816011819055505050565b6000801b611b97816122c2565b601060009054906101000a900460ff16611be6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bdd906150ba565b60405180910390fd5b81600f9080519060200190611bfc929190613cbd565b505050565b6000801b81565b611c1a611c13612342565b8383612bcd565b5050565b6000801b611c2b816122c2565b81600d819055505050565b611c47611c41612342565b83612411565b611c86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7d90614b55565b60405180910390fd5b611c9284848484612d39565b50505050565b60115481565b6000801b611cab816122c2565b81600c819055505050565b6000801b611cc3816122c2565b611ccc826128e4565b5050565b6060611cdb826122d6565b611d1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d119061514c565b60405180910390fd5b6000611d24612d95565b90506000815111611d445760405180602001604052806000815250611d6f565b80611d4e84612e27565b604051602001611d5f9291906151a8565b6040516020818303038152906040525b915050919050565b6000611d9460076000848152602001908152602001600020612f87565b9050919050565b6000801b611da8816122c2565b6000601060006101000a81548160ff02191690831515021790555050565b611dcf82611111565b611dd8816122c2565b611de28383612793565b505050565b600b5481565b828260126000611dfb612342565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611e4091906151cc565b1115611e81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7890615294565b60405180910390fd5b611e93611e8c612342565b8486612f9c565b611ed2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ec990615300565b60405180910390fd5b600d543414611f16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f0d9061536c565b60405180910390fd5b42601060019054906101000a900467ffffffffffffffff1667ffffffffffffffff161115611f79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f70906153d8565b60405180910390fd5b6000611f85600a612403565b9050611f90836128e4565b8260126000611f9d612342565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611fe691906151cc565b925050819055507ff9a3e63482a5118eca8fc536a42876aefbc3aebb4d7097a76ac65a011e3359bc81612019600a612403565b612023919061500a565b8360405161203292919061503e565b60405180910390a15050505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600c5481565b60006120e683611111565b90508160066000858152602001908152602001600020600101819055508181847fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff60405160405180910390a4505050565b6121418282611a30565b6122145760016006600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506121b9612342565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6000612240836000018373ffffffffffffffffffffffffffffffffffffffff1660001b613093565b905092915050565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806122bb57506122ba82613103565b5b9050919050565b6122d3816122ce612342565b61317d565b50565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166123bd83611638565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b600061241c826122d6565b61245b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124529061546a565b60405180910390fd5b600061246683611638565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806124a857506124a78185612041565b5b806124e657508373ffffffffffffffffffffffffffffffffffffffff166124ce84610f04565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661250f82611638565b73ffffffffffffffffffffffffffffffffffffffff1614612565576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161255c906154fc565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036125d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125cb9061558e565b60405180910390fd5b6125df83838361321a565b6125ea60008261234a565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461263a919061500a565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461269191906151cc565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461275083838361321f565b505050565b6000612710905090565b6127698282612137565b61278e816007600085815260200190815260200160002061221890919063ffffffff16565b505050565b61279d8282613224565b6127c2816007600085815260200190815260200160002061330690919063ffffffff16565b505050565b60006127d282611638565b90506127e08160008461321a565b6127eb60008361234a565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461283b919061500a565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46128e08160008461321f565b5050565b601060199054906101000a900460ff16612933576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161292a906155fa565b60405180910390fd5b601060119054906101000a900467ffffffffffffffff1667ffffffffffffffff16421115612996576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161298d90615666565b60405180910390fd5b60005b81811015612a1a576129ab600a613336565b60006129b7600a612403565b9050600b548111156129fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129f5906156d2565b60405180910390fd5b612a08338261334c565b5080612a13906156f2565b9050612999565b5050565b612a26612755565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff161115612a84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a7b906157ac565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612af3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612aea90615818565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250600860008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b6000612bc2836000018361336a565b60001c905092915050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612c3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c3290615884565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612d2c9190613e14565b60405180910390a3505050565b612d448484846124ef565b612d5084848484613395565b612d8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d8690615916565b60405180910390fd5b50505050565b6060600f8054612da4906148fc565b80601f0160208091040260200160405190810160405280929190818152602001828054612dd0906148fc565b8015612e1d5780601f10612df257610100808354040283529160200191612e1d565b820191906000526020600020905b815481529060010190602001808311612e0057829003601f168201915b5050505050905090565b606060008203612e6e576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612f82565b600082905060005b60008214612ea0578080612e89906156f2565b915050600a82612e999190614c2d565b9150612e76565b60008167ffffffffffffffff811115612ebc57612ebb614269565b5b6040519080825280601f01601f191660200182016040528015612eee5781602001600182028036833780820191505090505b5090505b60008514612f7b57600182612f07919061500a565b9150600a85612f169190615936565b6030612f2291906151cc565b60f81b818381518110612f3857612f37615967565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612f749190614c2d565b9450612ef2565b8093505050505b919050565b6000612f958260000161351c565b9050919050565b60008060001b60115403612fb3576000905061308c565b60008484604051602001612fc89291906159ff565b60405160208183030381529060405280519060200120905060005b835181101561308257600084828151811061300157613000615967565b5b60200260200101519050808311613042578281604051602001613025929190615a4c565b60405160208183030381529060405280519060200120925061306e565b8083604051602001613055929190615a4c565b6040516020818303038152906040528051906020012092505b50808061307a906156f2565b915050612fe3565b5060115481149150505b9392505050565b600061309f838361352d565b6130f85782600001829080600181540180825580915050600190039060005260206000200160009091909190915055826000018054905083600101600084815260200190815260200160002081905550600190506130fd565b600090505b92915050565b60007f5a05180f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480613176575061317582613550565b5b9050919050565b6131878282611a30565b613216576131ac8173ffffffffffffffffffffffffffffffffffffffff1660146135ca565b6131ba8360001c60206135ca565b6040516020016131cb929190615b10565b6040516020818303038152906040526040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161320d9190613f35565b60405180910390fd5b5050565b505050565b505050565b61322e8282611a30565b156133025760006006600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506132a7612342565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b600061332e836000018373ffffffffffffffffffffffffffffffffffffffff1660001b613806565b905092915050565b6001816000016000828254019250508190555050565b61336682826040518060200160405280600081525061391a565b5050565b600082600001828154811061338257613381615967565b5b9060005260206000200154905092915050565b60006133b68473ffffffffffffffffffffffffffffffffffffffff16613975565b1561350f578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026133df612342565b8786866040518563ffffffff1660e01b81526004016134019493929190615b9f565b6020604051808303816000875af192505050801561343d57506040513d601f19601f8201168201806040525081019061343a9190615c00565b60015b6134bf573d806000811461346d576040519150601f19603f3d011682016040523d82523d6000602084013e613472565b606091505b5060008151036134b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134ae90615916565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613514565b600190505b949350505050565b600081600001805490509050919050565b600080836001016000848152602001908152602001600020541415905092915050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806135c357506135c282613998565b5b9050919050565b6060600060028360026135dd9190614ba4565b6135e791906151cc565b67ffffffffffffffff811115613600576135ff614269565b5b6040519080825280601f01601f1916602001820160405280156136325781602001600182028036833780820191505090505b5090507f30000000000000000000000000000000000000000000000000000000000000008160008151811061366a57613669615967565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f7800000000000000000000000000000000000000000000000000000000000000816001815181106136ce576136cd615967565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506000600184600261370e9190614ba4565b61371891906151cc565b90505b60018111156137b8577f3031323334353637383961626364656600000000000000000000000000000000600f86166010811061375a57613759615967565b5b1a60f81b82828151811061377157613770615967565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c9450806137b190615c2d565b905061371b565b50600084146137fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137f390615ca2565b60405180910390fd5b8091505092915050565b6000808360010160008481526020019081526020016000205490506000811461390e576000600182613838919061500a565b9050600060018660000180549050613850919061500a565b90508181146138bf57600086600001828154811061387157613870615967565b5b906000526020600020015490508087600001848154811061389557613894615967565b5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b856000018054806138d3576138d2615cc2565b5b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050613914565b60009150505b92915050565b6139248383613a7a565b6139316000848484613395565b613970576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161396790615916565b60405180910390fd5b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480613a6357507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80613a735750613a7282613c53565b5b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603613ae9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613ae090615d3d565b60405180910390fd5b613af2816122d6565b15613b32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b2990615da9565b60405180910390fd5b613b3e6000838361321a565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613b8e91906151cc565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613c4f6000838361321f565b5050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b828054613cc9906148fc565b90600052602060002090601f016020900481019282613ceb5760008555613d32565b82601f10613d0457805160ff1916838001178555613d32565b82800160010185558215613d32579182015b82811115613d31578251825591602001919060010190613d16565b5b509050613d3f9190613d43565b5090565b5b80821115613d5c576000816000905550600101613d44565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613da981613d74565b8114613db457600080fd5b50565b600081359050613dc681613da0565b92915050565b600060208284031215613de257613de1613d6a565b5b6000613df084828501613db7565b91505092915050565b60008115159050919050565b613e0e81613df9565b82525050565b6000602082019050613e296000830184613e05565b92915050565b600067ffffffffffffffff82169050919050565b613e4c81613e2f565b8114613e5757600080fd5b50565b600081359050613e6981613e43565b92915050565b600060208284031215613e8557613e84613d6a565b5b6000613e9384828501613e5a565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613ed6578082015181840152602081019050613ebb565b83811115613ee5576000848401525b50505050565b6000601f19601f8301169050919050565b6000613f0782613e9c565b613f118185613ea7565b9350613f21818560208601613eb8565b613f2a81613eeb565b840191505092915050565b60006020820190508181036000830152613f4f8184613efc565b905092915050565b6000819050919050565b613f6a81613f57565b8114613f7557600080fd5b50565b600081359050613f8781613f61565b92915050565b600060208284031215613fa357613fa2613d6a565b5b6000613fb184828501613f78565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613fe582613fba565b9050919050565b613ff581613fda565b82525050565b60006020820190506140106000830184613fec565b92915050565b61401f81613fda565b811461402a57600080fd5b50565b60008135905061403c81614016565b92915050565b6000806040838503121561405957614058613d6a565b5b60006140678582860161402d565b925050602061407885828601613f78565b9150509250929050565b61408b81613f57565b82525050565b60006020820190506140a66000830184614082565b92915050565b6000806000606084860312156140c5576140c4613d6a565b5b60006140d38682870161402d565b93505060206140e48682870161402d565b92505060406140f586828701613f78565b9150509250925092565b6000819050919050565b614112816140ff565b811461411d57600080fd5b50565b60008135905061412f81614109565b92915050565b60006020828403121561414b5761414a613d6a565b5b600061415984828501614120565b91505092915050565b61416b816140ff565b82525050565b60006020820190506141866000830184614162565b92915050565b600080604083850312156141a3576141a2613d6a565b5b60006141b185828601613f78565b92505060206141c285828601613f78565b9150509250929050565b60006040820190506141e16000830185613fec565b6141ee6020830184614082565b9392505050565b6141fe81613e2f565b82525050565b600060208201905061421960008301846141f5565b92915050565b6000806040838503121561423657614235613d6a565b5b600061424485828601614120565b92505060206142558582860161402d565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6142a182613eeb565b810181811067ffffffffffffffff821117156142c0576142bf614269565b5b80604052505050565b60006142d3613d60565b90506142df8282614298565b919050565b600067ffffffffffffffff8211156142ff576142fe614269565b5b61430882613eeb565b9050602081019050919050565b82818337600083830152505050565b6000614337614332846142e4565b6142c9565b90508281526020810184848401111561435357614352614264565b5b61435e848285614315565b509392505050565b600082601f83011261437b5761437a61425f565b5b813561438b848260208601614324565b91505092915050565b6000602082840312156143aa576143a9613d6a565b5b600082013567ffffffffffffffff8111156143c8576143c7613d6f565b5b6143d484828501614366565b91505092915050565b6000602082840312156143f3576143f2613d6a565b5b60006144018482850161402d565b91505092915050565b6000806040838503121561442157614420613d6a565b5b600061442f85828601613f78565b925050602083013567ffffffffffffffff8111156144505761444f613d6f565b5b61445c85828601614366565b9150509250929050565b60006bffffffffffffffffffffffff82169050919050565b61448781614466565b811461449257600080fd5b50565b6000813590506144a48161447e565b92915050565b600080604083850312156144c1576144c0613d6a565b5b60006144cf8582860161402d565b92505060206144e085828601614495565b9150509250929050565b6000806040838503121561450157614500613d6a565b5b600061450f85828601614120565b925050602061452085828601613f78565b9150509250929050565b61453381613df9565b811461453e57600080fd5b50565b6000813590506145508161452a565b92915050565b6000806040838503121561456d5761456c613d6a565b5b600061457b8582860161402d565b925050602061458c85828601614541565b9150509250929050565b600067ffffffffffffffff8211156145b1576145b0614269565b5b6145ba82613eeb565b9050602081019050919050565b60006145da6145d584614596565b6142c9565b9050828152602081018484840111156145f6576145f5614264565b5b614601848285614315565b509392505050565b600082601f83011261461e5761461d61425f565b5b813561462e8482602086016145c7565b91505092915050565b6000806000806080858703121561465157614650613d6a565b5b600061465f8782880161402d565b94505060206146708782880161402d565b935050604061468187828801613f78565b925050606085013567ffffffffffffffff8111156146a2576146a1613d6f565b5b6146ae87828801614609565b91505092959194509250565b600067ffffffffffffffff8211156146d5576146d4614269565b5b602082029050602081019050919050565b600080fd5b60006146fe6146f9846146ba565b6142c9565b90508083825260208201905060208402830185811115614721576147206146e6565b5b835b8181101561474a57806147368882614120565b845260208401935050602081019050614723565b5050509392505050565b600082601f8301126147695761476861425f565b5b81356147798482602086016146eb565b91505092915050565b6000806000806080858703121561479c5761479b613d6a565b5b600085013567ffffffffffffffff8111156147ba576147b9613d6f565b5b6147c687828801614754565b94505060206147d787828801613f78565b93505060406147e887828801613f78565b925050606085013567ffffffffffffffff81111561480957614808613d6f565b5b61481587828801614366565b91505092959194509250565b6000806040838503121561483857614837613d6a565b5b60006148468582860161402d565b92505060206148578582860161402d565b9150509250929050565b7f4e657720656e642074696d65206d75737420626520736f6f6e65722e00000000600082015250565b6000614897601c83613ea7565b91506148a282614861565b602082019050919050565b600060208201905081810360008301526148c68161488a565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061491457607f821691505b602082108103614927576149266148cd565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000614989602c83613ea7565b91506149948261492d565b604082019050919050565b600060208201905081810360008301526149b88161497c565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000614a1b602183613ea7565b9150614a26826149bf565b604082019050919050565b60006020820190508181036000830152614a4a81614a0e565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000614aad603883613ea7565b9150614ab882614a51565b604082019050919050565b60006020820190508181036000830152614adc81614aa0565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000614b3f603183613ea7565b9150614b4a82614ae3565b604082019050919050565b60006020820190508181036000830152614b6e81614b32565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614baf82613f57565b9150614bba83613f57565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614bf357614bf2614b75565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614c3882613f57565b9150614c4383613f57565b925082614c5357614c52614bfe565b5b828204905092915050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b6000614cba602f83613ea7565b9150614cc582614c5e565b604082019050919050565b60006020820190508181036000830152614ce981614cad565b9050919050565b600081905092915050565b50565b6000614d0b600083614cf0565b9150614d1682614cfb565b600082019050919050565b6000614d2c82614cfe565b9150819050919050565b7f53656e64206661696c65642e0000000000000000000000000000000000000000600082015250565b6000614d6c600c83613ea7565b9150614d7782614d36565b602082019050919050565b60006020820190508181036000830152614d9b81614d5f565b9050919050565b7f4f6e6c7920746f6b656e206f776e65722063616e206275726e2e000000000000600082015250565b6000614dd8601a83613ea7565b9150614de382614da2565b602082019050919050565b60006020820190508181036000830152614e0781614dcb565b9050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000614e6a602983613ea7565b9150614e7582614e0e565b604082019050919050565b60006020820190508181036000830152614e9981614e5d565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000614efc602a83613ea7565b9150614f0782614ea0565b604082019050919050565b60006020820190508181036000830152614f2b81614eef565b9050919050565b7f496e76616c6964207061796d656e7420616d6f756e742e000000000000000000600082015250565b6000614f68601783613ea7565b9150614f7382614f32565b602082019050919050565b60006020820190508181036000830152614f9781614f5b565b9050919050565b7f4d696e74696e67206973206e6f74206f70656e207965742e0000000000000000600082015250565b6000614fd4601883613ea7565b9150614fdf82614f9e565b602082019050919050565b6000602082019050818103600083015261500381614fc7565b9050919050565b600061501582613f57565b915061502083613f57565b92508282101561503357615032614b75565b5b828203905092915050565b60006040820190506150536000830185614082565b81810360208301526150658184613efc565b90509392505050565b7f555249732066726f7a656e2e0000000000000000000000000000000000000000600082015250565b60006150a4600c83613ea7565b91506150af8261506e565b602082019050919050565b600060208201905081810360008301526150d381615097565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000615136602f83613ea7565b9150615141826150da565b604082019050919050565b6000602082019050818103600083015261516581615129565b9050919050565b600081905092915050565b600061518282613e9c565b61518c818561516c565b935061519c818560208601613eb8565b80840191505092915050565b60006151b48285615177565b91506151c08284615177565b91508190509392505050565b60006151d782613f57565b91506151e283613f57565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561521757615216614b75565b5b828201905092915050565b7f547279696e6720746f206d696e74206d6f72652077686974656c69737420746f60008201527f6b656e73207468616e20616c6c6f7765642e0000000000000000000000000000602082015250565b600061527e603283613ea7565b915061528982615222565b604082019050919050565b600060208201905081810360008301526152ad81615271565b9050919050565b7f496e76616c69642070726f6f662e000000000000000000000000000000000000600082015250565b60006152ea600e83613ea7565b91506152f5826152b4565b602082019050919050565b60006020820190508181036000830152615319816152dd565b9050919050565b7f496e76616c6964207061796d656e742076616c75652e00000000000000000000600082015250565b6000615356601683613ea7565b915061536182615320565b602082019050919050565b6000602082019050818103600083015261538581615349565b9050919050565b7f4d696e74696e67206e6f74206f70656e2e000000000000000000000000000000600082015250565b60006153c2601183613ea7565b91506153cd8261538c565b602082019050919050565b600060208201905081810360008301526153f1816153b5565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000615454602c83613ea7565b915061545f826153f8565b604082019050919050565b6000602082019050818103600083015261548381615447565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b60006154e6602583613ea7565b91506154f18261548a565b604082019050919050565b60006020820190508181036000830152615515816154d9565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000615578602483613ea7565b91506155838261551c565b604082019050919050565b600060208201905081810360008301526155a78161556b565b9050919050565b7f4d696e74696e6720756e616c6c6f7765642e0000000000000000000000000000600082015250565b60006155e4601283613ea7565b91506155ef826155ae565b602082019050919050565b60006020820190508181036000830152615613816155d7565b9050919050565b7f4d696e74696e6720636c6f7365642e0000000000000000000000000000000000600082015250565b6000615650600f83613ea7565b915061565b8261561a565b602082019050919050565b6000602082019050818103600083015261567f81615643565b9050919050565b7f43616e2774206d696e742074686174206d616e79204e4654732e000000000000600082015250565b60006156bc601a83613ea7565b91506156c782615686565b602082019050919050565b600060208201905081810360008301526156eb816156af565b9050919050565b60006156fd82613f57565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361572f5761572e614b75565b5b600182019050919050565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b6000615796602a83613ea7565b91506157a18261573a565b604082019050919050565b600060208201905081810360008301526157c581615789565b9050919050565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b6000615802601983613ea7565b915061580d826157cc565b602082019050919050565b60006020820190508181036000830152615831816157f5565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b600061586e601983613ea7565b915061587982615838565b602082019050919050565b6000602082019050818103600083015261589d81615861565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000615900603283613ea7565b915061590b826158a4565b604082019050919050565b6000602082019050818103600083015261592f816158f3565b9050919050565b600061594182613f57565b915061594c83613f57565b92508261595c5761595b614bfe565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008160601b9050919050565b60006159ae82615996565b9050919050565b60006159c0826159a3565b9050919050565b6159d86159d382613fda565b6159b5565b82525050565b6000819050919050565b6159f96159f482613f57565b6159de565b82525050565b6000615a0b82856159c7565b601482019150615a1b82846159e8565b6020820191508190509392505050565b6000819050919050565b615a46615a41826140ff565b615a2b565b82525050565b6000615a588285615a35565b602082019150615a688284615a35565b6020820191508190509392505050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b6000615aae60178361516c565b9150615ab982615a78565b601782019050919050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b6000615afa60118361516c565b9150615b0582615ac4565b601182019050919050565b6000615b1b82615aa1565b9150615b278285615177565b9150615b3282615aed565b9150615b3e8284615177565b91508190509392505050565b600081519050919050565b600082825260208201905092915050565b6000615b7182615b4a565b615b7b8185615b55565b9350615b8b818560208601613eb8565b615b9481613eeb565b840191505092915050565b6000608082019050615bb46000830187613fec565b615bc16020830186613fec565b615bce6040830185614082565b8181036060830152615be08184615b66565b905095945050505050565b600081519050615bfa81613da0565b92915050565b600060208284031215615c1657615c15613d6a565b5b6000615c2484828501615beb565b91505092915050565b6000615c3882613f57565b915060008203615c4b57615c4a614b75565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b6000615c8c602083613ea7565b9150615c9782615c56565b602082019050919050565b60006020820190508181036000830152615cbb81615c7f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000615d27602083613ea7565b9150615d3282615cf1565b602082019050919050565b60006020820190508181036000830152615d5681615d1a565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000615d93601c83613ea7565b9150615d9e82615d5d565b602082019050919050565b60006020820190508181036000830152615dc281615d86565b905091905056fea26469706673582212200565751596128715fcc7e5a03924f9539e11ab9dfc5851648ad93524c83c8db064736f6c634300080e003300000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000271000000000000000000000000000000000000000000000000000354a6ba7a18000000000000000000000000000000000000000000000000000001aa535d3d0c0000000000000000000000000000000000000000000000000000000000000000009487964636c69656e74000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044859444300000000000000000000000000000000000000000000000000000000
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000271000000000000000000000000000000000000000000000000000354a6ba7a18000000000000000000000000000000000000000000000000000001aa535d3d0c0000000000000000000000000000000000000000000000000000000000000000009487964636c69656e74000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044859444300000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : name_ (string): Hydclient
Arg [1] : symbol_ (string): HYDC
Arg [2] : maxSupply_ (uint256): 10000
Arg [3] : pricePerNft_ (uint256): 15000000000000000
Arg [4] : whitelistPricePerNft_ (uint256): 7500000000000000
-----Encoded View---------------
9 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000002710
Arg [3] : 00000000000000000000000000000000000000000000000000354a6ba7a18000
Arg [4] : 000000000000000000000000000000000000000000000000001aa535d3d0c000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000009
Arg [6] : 487964636c69656e740000000000000000000000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [8] : 4859444300000000000000000000000000000000000000000000000000000000
Deployed ByteCode Sourcemap
253:9916:16:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7727:499;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7164:222;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2423:98:7;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3935:217;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3473:401;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5795:96:16;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4662:330:7;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4356:129:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6915:188:16;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1632:432:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;783:40:16;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4735:145:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5752:214;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5989:170:16;;;;;;;;;;;;;:::i;:::-;;363:62;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5058:179:7;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5520:194:16;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;634:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7488:172;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6690:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2126:235:7;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;431:94:16;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4327:104;;;;;;;;;;;;;:::i;:::-;;1864:205:7;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;921:38:16;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2727:488;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1105:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4507:177;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4760:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1416:151:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2860:145:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;829:31:16;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2585:102:7;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;965:33:16;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1049:50;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8322:169;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6262:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1992:49:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4219:153:7;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2480:181:16;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5303:320:7;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1004:39:16;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2272:145;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5276;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2753:329:7;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1735:140:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6524:103:16;;;;;;;;;;;;;:::i;:::-;;5114:147:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;572:24:16;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3374:880;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4438:162:7;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;602:26:16;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7727:499;7894:4;7948:42;7933:57;;;:11;:57;;;;:113;;;;8021:25;8006:40;;;:11;:40;;;;7933:113;:177;;;;8077:33;8062:48;;;:11;:48;;;;7933:177;:234;;;;8141:26;8126:41;;;:11;:41;;;;7933:234;:286;;;;8183:36;8207:11;8183:23;:36::i;:::-;7933:286;7914:305;;7727:499;;;:::o;7164:222::-;2037:4:0;7241:18:16;;2470:16:0;2481:4;2470:10;:16::i;:::-;7299:11:16::1;;;;;;;;;;;7283:27;;:12;:27;;;;7275:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;7367:12;7353:11;;:26;;;;;;;;;;;;;;;;;;7164:222:::0;;:::o;2423:98:7:-;2477:13;2509:5;2502:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2423:98;:::o;3935:217::-;4011:7;4038:16;4046:7;4038;:16::i;:::-;4030:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;4121:15;:24;4137:7;4121:24;;;;;;;;;;;;;;;;;;;;;4114:31;;3935:217;;;:::o;3473:401::-;3553:13;3569:23;3584:7;3569:14;:23::i;:::-;3553:39;;3616:5;3610:11;;:2;:11;;;3602:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;3707:5;3691:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;3716:37;3733:5;3740:12;:10;:12::i;:::-;3716:16;:37::i;:::-;3691:62;3670:165;;;;;;;;;;;;:::i;:::-;;;;;;;;;3846:21;3855:2;3859:7;3846:8;:21::i;:::-;3543:331;3473:401;;:::o;5795:96:16:-;5839:7;5865:19;:9;:17;:19::i;:::-;5858:26;;5795:96;:::o;4662:330:7:-;4851:41;4870:12;:10;:12::i;:::-;4884:7;4851:18;:41::i;:::-;4843:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;4957:28;4967:4;4973:2;4977:7;4957:9;:28::i;:::-;4662:330;;;:::o;4356:129:0:-;4430:7;4456:6;:12;4463:4;4456:12;;;;;;;;;;;:22;;;4449:29;;4356:129;;;:::o;6915:188:16:-;2037:4:0;7014:18:16;;2470:16:0;2481:4;2470:10;:16::i;:::-;7073:23:16::1;7048:22;;:48;;;;;;;;;;;;;;;;;;6915:188:::0;;:::o;1632:432:6:-;1729:7;1738;1757:26;1786:17;:27;1804:8;1786:27;;;;;;;;;;;1757:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1856:1;1828:30;;:7;:16;;;:30;;;1824:90;;1884:19;1874:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1824:90;1924:21;1989:17;:15;:17::i;:::-;1948:58;;1962:7;:23;;;1949:36;;:10;:36;;;;:::i;:::-;1948:58;;;;:::i;:::-;1924:82;;2025:7;:16;;;2043:13;2017:40;;;;;;1632:432;;;;;:::o;783:40:16:-;;;;;;;;;;;;;:::o;4735:145:0:-;4818:18;4831:4;4818:12;:18::i;:::-;2470:16;2481:4;2470:10;:16::i;:::-;4848:25:::1;4859:4;4865:7;4848:10;:25::i;:::-;4735:145:::0;;;:::o;5752:214::-;5858:12;:10;:12::i;:::-;5847:23;;:7;:23;;;5839:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;5933:26;5945:4;5951:7;5933:11;:26::i;:::-;5752:214;;:::o;5989:170:16:-;401:24;2470:16:0;2481:4;2470:10;:16::i;:::-;6049:9:16::1;6064:10;:15;;6087:21;6064:49;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6048:65;;;6131:4;6123:29;;;;;;;;;;;;:::i;:::-;;;;;;;;;6038:121;5989:170:::0;:::o;363:62::-;401:24;363:62;:::o;5058:179:7:-;5191:39;5208:4;5214:2;5218:7;5191:39;;;;;;;;;;;;:16;:39::i;:::-;5058:179;;;:::o;5520:194:16:-;5615:10;5589:36;;:22;5603:7;5589:13;:22::i;:::-;:36;;;5568:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;5687:20;5699:7;5687:11;:20::i;:::-;5520:194;:::o;634:35::-;;;;:::o;7488:172::-;489:36;2470:16:0;2481:4;2470:10;:16::i;:::-;7637::16::1;7619:15;:34;;;;;;;;;;;;:::i;:::-;;7488:172:::0;;:::o;6690:152::-;2037:4:0;6771:18:16;;2470:16:0;2481:4;2470:10;:16::i;:::-;6821:14:16::1;6805:13;;:30;;;;;;;;;;;;;;;;;;6690:152:::0;;:::o;2126:235:7:-;2198:7;2217:13;2233:7;:16;2241:7;2233:16;;;;;;;;;;;;;;;;;;;;;2217:32;;2284:1;2267:19;;:5;:19;;;2259:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2349:5;2342:12;;;2126:235;;;:::o;431:94:16:-;489:36;431:94;:::o;4327:104::-;2037:4:0;4372:18:16;;2470:16:0;2481:4;2470:10;:16::i;:::-;4419:5:16::1;4402:14;;:22;;;;;;;;;;;;;;;;;;4327:104:::0;:::o;1864:205:7:-;1936:7;1980:1;1963:19;;:5;:19;;;1955:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;2046:9;:16;2056:5;2046:16;;;;;;;;;;;;;;;;2039:23;;1864:205;;;:::o;921:38:16:-;;;;;;;;;;;;;:::o;2727:488::-;2837:22;2880:11;;2862:15;:29;;;;:::i;:::-;2837:54;;2922:14;2909:9;:27;2901:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;2999:15;2982:13;;;;;;;;;;;:32;;;;2974:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;3053:20;3076:19;:9;:17;:19::i;:::-;3053:42;;3105:28;3117:15;3105:11;:28::i;:::-;3148:60;3183:12;3161:19;:9;:17;:19::i;:::-;:34;;;;:::i;:::-;3197:10;3148:60;;;;;;;:::i;:::-;;;;;;;;2827:388;;2727:488;;:::o;1105:29::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;4507:177::-;4553:7;4622:1;4580:38;2037:4:0;4599:18:16;;4580;:38::i;:::-;:43;4572:52;;;;;;4641:36;2037:4:0;4655:18:16;;4675:1;4641:13;:36::i;:::-;4634:43;;4507:177;:::o;4760:170::-;2037:4:0;4849:18:16;;2470:16:0;2481:4;2470:10;:16::i;:::-;4883:40:16::1;4902:8;4912:10;4883:18;:40::i;:::-;4760:170:::0;;;:::o;1416:151:1:-;1506:7;1532:28;1554:5;1532:12;:18;1545:4;1532:18;;;;;;;;;;;:21;;:28;;;;:::i;:::-;1525:35;;1416:151;;;;:::o;2860:145:0:-;2946:4;2969:6;:12;2976:4;2969:12;;;;;;;;;;;:20;;:29;2990:7;2969:29;;;;;;;;;;;;;;;;;;;;;;;;;2962:36;;2860:145;;;;:::o;829:31:16:-;;;;;;;;;;;;;:::o;2585:102:7:-;2641:13;2673:7;2666:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2585:102;:::o;965:33:16:-;;;;;;;;;;;;;:::o;1049:50::-;;;;;;;;;;;;;;;;;:::o;8322:169::-;2037:4:0;8410:18:16;;2470:16:0;2481:4;2470:10;:16::i;:::-;8465:19:16::1;8444:18;:40;;;;8322:169:::0;;:::o;6262:185::-;2037:4:0;6337:18:16;;2470:16:0;2481:4;2470:10;:16::i;:::-;6379::16::1;;;;;;;;;;;6371:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;6433:7;6422:8;:18;;;;;;;;;;;;:::i;:::-;;6262:185:::0;;:::o;1992:49:0:-;2037:4;1992:49;;;:::o;4219:153:7:-;4313:52;4332:12;:10;:12::i;:::-;4346:8;4356;4313:18;:52::i;:::-;4219:153;;:::o;2480:181:16:-;2037:4:0;2576:18:16;;2470:16:0;2481:4;2470:10;:16::i;:::-;2633:21:16::1;2610:20;:44;;;;2480:181:::0;;:::o;5303:320:7:-;5472:41;5491:12;:10;:12::i;:::-;5505:7;5472:18;:41::i;:::-;5464:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;5577:39;5591:4;5597:2;5601:7;5610:5;5577:13;:39::i;:::-;5303:320;;;;:::o;1004:39:16:-;;;;:::o;2272:145::-;2037:4:0;2350:18:16;;2470:16:0;2481:4;2470:10;:16::i;:::-;2398:12:16::1;2384:11;:26;;;;2272:145:::0;;:::o;5276:::-;2037:4:0;5352:18:16;;2470:16:0;2481:4;2470:10;:16::i;:::-;5386:28:16::1;5398:15;5386:11;:28::i;:::-;5276:145:::0;;:::o;2753:329:7:-;2826:13;2859:16;2867:7;2859;:16::i;:::-;2851:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;2938:21;2962:10;:8;:10::i;:::-;2938:34;;3013:1;2995:7;2989:21;:25;:86;;;;;;;;;;;;;;;;;3041:7;3050:18;:7;:16;:18::i;:::-;3024:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2989:86;2982:93;;;2753:329;;;:::o;1735:140:1:-;1815:7;1841:27;:12;:18;1854:4;1841:18;;;;;;;;;;;:25;:27::i;:::-;1834:34;;1735:140;;;:::o;6524:103:16:-;2037:4:0;6566:18:16;;2470:16:0;2481:4;2470:10;:16::i;:::-;6615:5:16::1;6596:16;;:24;;;;;;;;;;;;;;;;;;6524:103:::0;:::o;5114:147:0:-;5198:18;5211:4;5198:12;:18::i;:::-;2470:16;2481:4;2470:10;:16::i;:::-;5228:26:::1;5240:4;5246:7;5228:11;:26::i;:::-;5114:147:::0;;;:::o;572:24:16:-;;;;:::o;3374:880::-;3650:17;3615:15;3583;:29;3599:12;:10;:12::i;:::-;3583:29;;;;;;;;;;;;;;;;:47;;;;:::i;:::-;:84;;3562:181;;;;;;;;;;;;:::i;:::-;;;;;;;;;3774:51;3786:12;:10;:12::i;:::-;3800:17;3819:5;3774:11;:51::i;:::-;3753:112;;;;;;;;;;;;:::i;:::-;;;;;;;;;3896:20;;3883:9;:33;3875:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3987:15;3961:22;;;;;;;;;;;:41;;;;3953:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;4034:20;4057:19;:9;:17;:19::i;:::-;4034:42;;4086:28;4098:15;4086:11;:28::i;:::-;4157:15;4124;:29;4140:12;:10;:12::i;:::-;4124:29;;;;;;;;;;;;;;;;:48;;;;;;;:::i;:::-;;;;;;;;4187:60;4222:12;4200:19;:9;:17;:19::i;:::-;:34;;;;:::i;:::-;4236:10;4187:60;;;;;;;:::i;:::-;;;;;;;;3552:702;3374:880;;;;:::o;4438:162:7:-;4535:4;4558:18;:25;4577:5;4558:25;;;;;;;;;;;;;;;:35;4584:8;4558:35;;;;;;;;;;;;;;;;;;;;;;;;;4551:42;;4438:162;;;;:::o;602:26:16:-;;;;:::o;6840:247:0:-;6923:25;6951:18;6964:4;6951:12;:18::i;:::-;6923:46;;7004:9;6979:6;:12;6986:4;6979:12;;;;;;;;;;;:22;;:34;;;;7070:9;7051:17;7045:4;7028:52;;;;;;;;;;6913:174;6840:247;;:::o;7209:233::-;7292:22;7300:4;7306:7;7292;:22::i;:::-;7287:149;;7362:4;7330:6;:12;7337:4;7330:12;;;;;;;;;;;:20;;:29;7351:7;7330:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;7412:12;:10;:12::i;:::-;7385:40;;7403:7;7385:40;;7397:4;7385:40;;;;;;;;;;7287:149;7209:233;;:::o;7627:150:8:-;7697:4;7720:50;7725:3;:10;;7761:5;7745:23;;7737:32;;7720:4;:50::i;:::-;7713:57;;7627:150;;;;:::o;1369:213:6:-;1471:4;1509:26;1494:41;;;:11;:41;;;;:81;;;;1539:36;1563:11;1539:23;:36::i;:::-;1494:81;1487:88;;1369:213;;;:::o;3299:103:0:-;3365:30;3376:4;3382:12;:10;:12::i;:::-;3365:10;:30::i;:::-;3299:103;:::o;7095:125:7:-;7160:4;7211:1;7183:30;;:7;:16;7191:7;7183:16;;;;;;;;;;;;;;;;;;;;;:30;;;;7176:37;;7095:125;;;:::o;640:96:3:-;693:7;719:10;712:17;;640:96;:::o;11104:171:7:-;11205:2;11178:15;:24;11194:7;11178:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;11260:7;11256:2;11222:46;;11231:23;11246:7;11231:14;:23::i;:::-;11222:46;;;;;;;;;;;;11104:171;;:::o;827:112:4:-;892:7;918;:14;;;911:21;;827:112;;;:::o;7378:344:7:-;7471:4;7495:16;7503:7;7495;:16::i;:::-;7487:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;7570:13;7586:23;7601:7;7586:14;:23::i;:::-;7570:39;;7638:5;7627:16;;:7;:16;;;:52;;;;7647:32;7664:5;7671:7;7647:16;:32::i;:::-;7627:52;:87;;;;7707:7;7683:31;;:20;7695:7;7683:11;:20::i;:::-;:31;;;7627:87;7619:96;;;7378:344;;;;:::o;10388:605::-;10542:4;10515:31;;:23;10530:7;10515:14;:23::i;:::-;:31;;;10507:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;10620:1;10606:16;;:2;:16;;;10598:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;10674:39;10695:4;10701:2;10705:7;10674:20;:39::i;:::-;10775:29;10792:1;10796:7;10775:8;:29::i;:::-;10834:1;10815:9;:15;10825:4;10815:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;10862:1;10845:9;:13;10855:2;10845:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;10892:2;10873:7;:16;10881:7;10873:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;10929:7;10925:2;10910:27;;10919:4;10910:27;;;;;;;;;;;;10948:38;10968:4;10974:2;10978:7;10948:19;:38::i;:::-;10388:605;;;:::o;2339:95:6:-;2397:6;2422:5;2415:12;;2339:95;:::o;1963:166:1:-;2050:31;2067:4;2073:7;2050:16;:31::i;:::-;2091;2114:7;2091:12;:18;2104:4;2091:18;;;;;;;;;;;:22;;:31;;;;:::i;:::-;;1963:166;;:::o;2218:171::-;2306:32;2324:4;2330:7;2306:17;:32::i;:::-;2348:34;2374:7;2348:12;:18;2361:4;2348:18;;;;;;;;;;;:25;;:34;;;;:::i;:::-;;2218:171;;:::o;9658:406:7:-;9717:13;9733:23;9748:7;9733:14;:23::i;:::-;9717:39;;9767:48;9788:5;9803:1;9807:7;9767:20;:48::i;:::-;9853:29;9870:1;9874:7;9853:8;:29::i;:::-;9913:1;9893:9;:16;9903:5;9893:16;;;;;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;9931:7;:16;9939:7;9931:16;;;;;;;;;;;;9924:23;;;;;;;;;;;9991:7;9987:1;9963:36;;9972:5;9963:36;;;;;;;;;;;;10010:47;10030:5;10045:1;10049:7;10010:19;:47::i;:::-;9707:357;9658:406;:::o;9700:467:16:-;9773:14;;;;;;;;;;;9765:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;9847:11;;;;;;;;;;;9828:30;;:15;:30;;9820:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;9893:9;9888:273;9912:15;9908:1;:19;9888:273;;;9948:21;:9;:19;:21::i;:::-;9983:17;10003:19;:9;:17;:19::i;:::-;9983:39;;10057:9;;10044;:22;;10036:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;10112:38;10128:10;10140:9;10112:15;:38::i;:::-;9934:227;9929:3;;;;:::i;:::-;;;9888:273;;;;9700:467;:::o;2695:327:6:-;2813:17;:15;:17::i;:::-;2797:33;;:12;:33;;;;2789:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;2915:1;2895:22;;:8;:22;;;2887:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;2980:35;;;;;;;;2992:8;2980:35;;;;;;3002:12;2980:35;;;;;2958:19;:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2695:327;;:::o;8885:156:8:-;8959:7;9009:22;9013:3;:10;;9025:5;9009:3;:22::i;:::-;9001:31;;8978:56;;8885:156;;;;:::o;11410:307:7:-;11560:8;11551:17;;:5;:17;;;11543:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;11646:8;11608:18;:25;11627:5;11608:25;;;;;;;;;;;;;;;:35;11634:8;11608:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;11691:8;11669:41;;11684:5;11669:41;;;11701:8;11669:41;;;;;;:::i;:::-;;;;;;;;11410:307;;;:::o;6485:::-;6636:28;6646:4;6652:2;6656:7;6636:9;:28::i;:::-;6682:48;6705:4;6711:2;6715:7;6724:5;6682:22;:48::i;:::-;6674:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;6485:307;;;;:::o;8497:99:16:-;8549:13;8581:8;8574:15;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8497:99;:::o;328:703:18:-;384:13;610:1;601:5;:10;597:51;;627:10;;;;;;;;;;;;;;;;;;;;;597:51;657:12;672:5;657:20;;687:14;711:75;726:1;718:4;:9;711:75;;743:8;;;;;:::i;:::-;;;;773:2;765:10;;;;;:::i;:::-;;;711:75;;;795:19;827:6;817:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;795:39;;844:150;860:1;851:5;:10;844:150;;887:1;877:11;;;;;:::i;:::-;;;953:2;945:5;:10;;;;:::i;:::-;932:2;:24;;;;:::i;:::-;919:39;;902:6;909;902:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;981:2;972:11;;;;;:::i;:::-;;;844:150;;;1017:6;1003:21;;;;;328:703;;;;:::o;8428:115:8:-;8491:7;8517:19;8525:3;:10;;8517:7;:19::i;:::-;8510:26;;8428:115;;;:::o;8699:995:16:-;8842:4;8884:3;8862:25;;:18;;:25;8858:68;;8910:5;8903:12;;;;8858:68;8935:20;8998:8;9008:17;8981:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;8958:78;;;;;;8935:101;;9051:9;9046:591;9070:5;:12;9066:1;:16;9046:591;;;9103:20;9126:5;9132:1;9126:8;;;;;;;;:::i;:::-;;;;;;;;9103:31;;9169:12;9153;:28;9149:478;;9342:12;9356;9325:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;9294:93;;;;;;9279:108;;9149:478;;;9567:12;9581;9550:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;9519:93;;;;;;9504:108;;9149:478;9089:548;9084:3;;;;;:::i;:::-;;;;9046:591;;;;9669:18;;9653:12;:34;9646:41;;;8699:995;;;;;;:::o;1712:404:8:-;1775:4;1796:21;1806:3;1811:5;1796:9;:21::i;:::-;1791:319;;1833:3;:11;;1850:5;1833:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2013:3;:11;;:18;;;;1991:3;:12;;:19;2004:5;1991:19;;;;;;;;;;;:40;;;;2052:4;2045:11;;;;1791:319;2094:5;2087:12;;1712:404;;;;;:::o;619:212:1:-;704:4;742:42;727:57;;;:11;:57;;;;:97;;;;788:36;812:11;788:23;:36::i;:::-;727:97;720:104;;619:212;;;:::o;3683:492:0:-;3771:22;3779:4;3785:7;3771;:22::i;:::-;3766:403;;3954:41;3982:7;3954:41;;3992:2;3954:19;:41::i;:::-;4066:38;4094:4;4086:13;;4101:2;4066:19;:38::i;:::-;3861:265;;;;;;;;;:::i;:::-;;;;;;;;;;;;;3809:349;;;;;;;;;;;:::i;:::-;;;;;;;;3766:403;3683:492;;:::o;13604:122:7:-;;;;:::o;14098:121::-;;;;:::o;7567:234:0:-;7650:22;7658:4;7664:7;7650;:22::i;:::-;7646:149;;;7720:5;7688:6;:12;7695:4;7688:12;;;;;;;;;;;:20;;:29;7709:7;7688:29;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;7771:12;:10;:12::i;:::-;7744:40;;7762:7;7744:40;;7756:4;7744:40;;;;;;;;;;7646:149;7567:234;;:::o;7945:156:8:-;8018:4;8041:53;8049:3;:10;;8085:5;8069:23;;8061:32;;8041:7;:53::i;:::-;8034:60;;7945:156;;;;:::o;945:123:4:-;1050:1;1032:7;:14;;;:19;;;;;;;;;;;945:123;:::o;8052:108:7:-;8127:26;8137:2;8141:7;8127:26;;;;;;;;;;;;:9;:26::i;:::-;8052:108;;:::o;4410:118:8:-;4477:7;4503:3;:11;;4515:5;4503:18;;;;;;;;:::i;:::-;;;;;;;;;;4496:25;;4410:118;;;;:::o;12270:778:7:-;12420:4;12440:15;:2;:13;;;:15::i;:::-;12436:606;;;12491:2;12475:36;;;12512:12;:10;:12::i;:::-;12526:4;12532:7;12541:5;12475:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;12471:519;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12731:1;12714:6;:13;:18;12710:266;;12756:60;;;;;;;;;;:::i;:::-;;;;;;;;12710:266;12928:6;12922:13;12913:6;12909:2;12905:15;12898:38;12471:519;12607:41;;;12597:51;;;:6;:51;;;;12590:58;;;;;12436:606;13027:4;13020:11;;12270:778;;;;;;;:::o;3961:107:8:-;4017:7;4043:3;:11;;:18;;;;4036:25;;3961:107;;;:::o;3753:127::-;3826:4;3872:1;3849:3;:12;;:19;3862:5;3849:19;;;;;;;;;;;;:24;;3842:31;;3753:127;;;;:::o;2571:202:0:-;2656:4;2694:32;2679:47;;;:11;:47;;;;:87;;;;2730:36;2754:11;2730:23;:36::i;:::-;2679:87;2672:94;;2571:202;;;:::o;1588:441:18:-;1663:13;1688:19;1733:1;1724:6;1720:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;1710:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1688:47;;1745:15;:6;1752:1;1745:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;1770;:6;1777:1;1770:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;1800:9;1825:1;1816:6;1812:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;1800:26;;1795:132;1832:1;1828;:5;1795:132;;;1866:12;1887:3;1879:5;:11;1866:25;;;;;;;:::i;:::-;;;;;1854:6;1861:1;1854:9;;;;;;;;:::i;:::-;;;;;:37;;;;;;;;;;;1915:1;1905:11;;;;;1835:3;;;;:::i;:::-;;;1795:132;;;;1953:1;1944:5;:10;1936:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;2015:6;2001:21;;;1588:441;;;;:::o;2284:1388:8:-;2350:4;2466:18;2487:3;:12;;:19;2500:5;2487:19;;;;;;;;;;;;2466:40;;2535:1;2521:10;:15;2517:1149;;2890:21;2927:1;2914:10;:14;;;;:::i;:::-;2890:38;;2942:17;2983:1;2962:3;:11;;:18;;;;:22;;;;:::i;:::-;2942:42;;3016:13;3003:9;:26;2999:398;;3049:17;3069:3;:11;;3081:9;3069:22;;;;;;;;:::i;:::-;;;;;;;;;;3049:42;;3220:9;3191:3;:11;;3203:13;3191:26;;;;;;;;:::i;:::-;;;;;;;;;:38;;;;3329:10;3303:3;:12;;:23;3316:9;3303:23;;;;;;;;;;;:36;;;;3031:366;2999:398;3475:3;:11;;:17;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;3567:3;:12;;:19;3580:5;3567:19;;;;;;;;;;;3560:26;;;3608:4;3601:11;;;;;;;2517:1149;3650:5;3643:12;;;2284:1388;;;;;:::o;8381:311:7:-;8506:18;8512:2;8516:7;8506:5;:18::i;:::-;8555:54;8586:1;8590:2;8594:7;8603:5;8555:22;:54::i;:::-;8534:151;;;;;;;;;;;;:::i;:::-;;;;;;;;;8381:311;;;:::o;1175:320:2:-;1235:4;1487:1;1465:7;:19;;;:23;1458:30;;1175:320;;;:::o;1505:300:7:-;1607:4;1657:25;1642:40;;;:11;:40;;;;:104;;;;1713:33;1698:48;;;:11;:48;;;;1642:104;:156;;;;1762:36;1786:11;1762:23;:36::i;:::-;1642:156;1623:175;;1505:300;;;:::o;9014:427::-;9107:1;9093:16;;:2;:16;;;9085:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;9165:16;9173:7;9165;:16::i;:::-;9164:17;9156:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;9225:45;9254:1;9258:2;9262:7;9225:20;:45::i;:::-;9298:1;9281:9;:13;9291:2;9281:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;9328:2;9309:7;:16;9317:7;9309:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;9371:7;9367:2;9346:33;;9363:1;9346:33;;;;;;;;;;;;9390:44;9418:1;9422:2;9426:7;9390:19;:44::i;:::-;9014:427;;:::o;829:155:5:-;914:4;952:25;937:40;;;:11;:40;;;;930:47;;829:155;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:19:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:101::-;1554:7;1594:18;1587:5;1583:30;1572:41;;1518:101;;;:::o;1625:120::-;1697:23;1714:5;1697:23;:::i;:::-;1690:5;1687:34;1677:62;;1735:1;1732;1725:12;1677:62;1625:120;:::o;1751:137::-;1796:5;1834:6;1821:20;1812:29;;1850:32;1876:5;1850:32;:::i;:::-;1751:137;;;;:::o;1894:327::-;1952:6;2001:2;1989:9;1980:7;1976:23;1972:32;1969:119;;;2007:79;;:::i;:::-;1969:119;2127:1;2152:52;2196:7;2187:6;2176:9;2172:22;2152:52;:::i;:::-;2142:62;;2098:116;1894:327;;;;:::o;2227:99::-;2279:6;2313:5;2307:12;2297:22;;2227:99;;;:::o;2332:169::-;2416:11;2450:6;2445:3;2438:19;2490:4;2485:3;2481:14;2466:29;;2332:169;;;;:::o;2507:307::-;2575:1;2585:113;2599:6;2596:1;2593:13;2585:113;;;2684:1;2679:3;2675:11;2669:18;2665:1;2660:3;2656:11;2649:39;2621:2;2618:1;2614:10;2609:15;;2585:113;;;2716:6;2713:1;2710:13;2707:101;;;2796:1;2787:6;2782:3;2778:16;2771:27;2707:101;2556:258;2507:307;;;:::o;2820:102::-;2861:6;2912:2;2908:7;2903:2;2896:5;2892:14;2888:28;2878:38;;2820:102;;;:::o;2928:364::-;3016:3;3044:39;3077:5;3044:39;:::i;:::-;3099:71;3163:6;3158:3;3099:71;:::i;:::-;3092:78;;3179:52;3224:6;3219:3;3212:4;3205:5;3201:16;3179:52;:::i;:::-;3256:29;3278:6;3256:29;:::i;:::-;3251:3;3247:39;3240:46;;3020:272;2928:364;;;;:::o;3298:313::-;3411:4;3449:2;3438:9;3434:18;3426:26;;3498:9;3492:4;3488:20;3484:1;3473:9;3469:17;3462:47;3526:78;3599:4;3590:6;3526:78;:::i;:::-;3518:86;;3298:313;;;;:::o;3617:77::-;3654:7;3683:5;3672:16;;3617:77;;;:::o;3700:122::-;3773:24;3791:5;3773:24;:::i;:::-;3766:5;3763:35;3753:63;;3812:1;3809;3802:12;3753:63;3700:122;:::o;3828:139::-;3874:5;3912:6;3899:20;3890:29;;3928:33;3955:5;3928:33;:::i;:::-;3828:139;;;;:::o;3973:329::-;4032:6;4081:2;4069:9;4060:7;4056:23;4052:32;4049:119;;;4087:79;;:::i;:::-;4049:119;4207:1;4232:53;4277:7;4268:6;4257:9;4253:22;4232:53;:::i;:::-;4222:63;;4178:117;3973:329;;;;:::o;4308:126::-;4345:7;4385:42;4378:5;4374:54;4363:65;;4308:126;;;:::o;4440:96::-;4477:7;4506:24;4524:5;4506:24;:::i;:::-;4495:35;;4440:96;;;:::o;4542:118::-;4629:24;4647:5;4629:24;:::i;:::-;4624:3;4617:37;4542:118;;:::o;4666:222::-;4759:4;4797:2;4786:9;4782:18;4774:26;;4810:71;4878:1;4867:9;4863:17;4854:6;4810:71;:::i;:::-;4666:222;;;;:::o;4894:122::-;4967:24;4985:5;4967:24;:::i;:::-;4960:5;4957:35;4947:63;;5006:1;5003;4996:12;4947:63;4894:122;:::o;5022:139::-;5068:5;5106:6;5093:20;5084:29;;5122:33;5149:5;5122:33;:::i;:::-;5022:139;;;;:::o;5167:474::-;5235:6;5243;5292:2;5280:9;5271:7;5267:23;5263:32;5260:119;;;5298:79;;:::i;:::-;5260:119;5418:1;5443:53;5488:7;5479:6;5468:9;5464:22;5443:53;:::i;:::-;5433:63;;5389:117;5545:2;5571:53;5616:7;5607:6;5596:9;5592:22;5571:53;:::i;:::-;5561:63;;5516:118;5167:474;;;;;:::o;5647:118::-;5734:24;5752:5;5734:24;:::i;:::-;5729:3;5722:37;5647:118;;:::o;5771:222::-;5864:4;5902:2;5891:9;5887:18;5879:26;;5915:71;5983:1;5972:9;5968:17;5959:6;5915:71;:::i;:::-;5771:222;;;;:::o;5999:619::-;6076:6;6084;6092;6141:2;6129:9;6120:7;6116:23;6112:32;6109:119;;;6147:79;;:::i;:::-;6109:119;6267:1;6292:53;6337:7;6328:6;6317:9;6313:22;6292:53;:::i;:::-;6282:63;;6238:117;6394:2;6420:53;6465:7;6456:6;6445:9;6441:22;6420:53;:::i;:::-;6410:63;;6365:118;6522:2;6548:53;6593:7;6584:6;6573:9;6569:22;6548:53;:::i;:::-;6538:63;;6493:118;5999:619;;;;;:::o;6624:77::-;6661:7;6690:5;6679:16;;6624:77;;;:::o;6707:122::-;6780:24;6798:5;6780:24;:::i;:::-;6773:5;6770:35;6760:63;;6819:1;6816;6809:12;6760:63;6707:122;:::o;6835:139::-;6881:5;6919:6;6906:20;6897:29;;6935:33;6962:5;6935:33;:::i;:::-;6835:139;;;;:::o;6980:329::-;7039:6;7088:2;7076:9;7067:7;7063:23;7059:32;7056:119;;;7094:79;;:::i;:::-;7056:119;7214:1;7239:53;7284:7;7275:6;7264:9;7260:22;7239:53;:::i;:::-;7229:63;;7185:117;6980:329;;;;:::o;7315:118::-;7402:24;7420:5;7402:24;:::i;:::-;7397:3;7390:37;7315:118;;:::o;7439:222::-;7532:4;7570:2;7559:9;7555:18;7547:26;;7583:71;7651:1;7640:9;7636:17;7627:6;7583:71;:::i;:::-;7439:222;;;;:::o;7667:474::-;7735:6;7743;7792:2;7780:9;7771:7;7767:23;7763:32;7760:119;;;7798:79;;:::i;:::-;7760:119;7918:1;7943:53;7988:7;7979:6;7968:9;7964:22;7943:53;:::i;:::-;7933:63;;7889:117;8045:2;8071:53;8116:7;8107:6;8096:9;8092:22;8071:53;:::i;:::-;8061:63;;8016:118;7667:474;;;;;:::o;8147:332::-;8268:4;8306:2;8295:9;8291:18;8283:26;;8319:71;8387:1;8376:9;8372:17;8363:6;8319:71;:::i;:::-;8400:72;8468:2;8457:9;8453:18;8444:6;8400:72;:::i;:::-;8147:332;;;;;:::o;8485:115::-;8570:23;8587:5;8570:23;:::i;:::-;8565:3;8558:36;8485:115;;:::o;8606:218::-;8697:4;8735:2;8724:9;8720:18;8712:26;;8748:69;8814:1;8803:9;8799:17;8790:6;8748:69;:::i;:::-;8606:218;;;;:::o;8830:474::-;8898:6;8906;8955:2;8943:9;8934:7;8930:23;8926:32;8923:119;;;8961:79;;:::i;:::-;8923:119;9081:1;9106:53;9151:7;9142:6;9131:9;9127:22;9106:53;:::i;:::-;9096:63;;9052:117;9208:2;9234:53;9279:7;9270:6;9259:9;9255:22;9234:53;:::i;:::-;9224:63;;9179:118;8830:474;;;;;:::o;9310:117::-;9419:1;9416;9409:12;9433:117;9542:1;9539;9532:12;9556:180;9604:77;9601:1;9594:88;9701:4;9698:1;9691:15;9725:4;9722:1;9715:15;9742:281;9825:27;9847:4;9825:27;:::i;:::-;9817:6;9813:40;9955:6;9943:10;9940:22;9919:18;9907:10;9904:34;9901:62;9898:88;;;9966:18;;:::i;:::-;9898:88;10006:10;10002:2;9995:22;9785:238;9742:281;;:::o;10029:129::-;10063:6;10090:20;;:::i;:::-;10080:30;;10119:33;10147:4;10139:6;10119:33;:::i;:::-;10029:129;;;:::o;10164:308::-;10226:4;10316:18;10308:6;10305:30;10302:56;;;10338:18;;:::i;:::-;10302:56;10376:29;10398:6;10376:29;:::i;:::-;10368:37;;10460:4;10454;10450:15;10442:23;;10164:308;;;:::o;10478:154::-;10562:6;10557:3;10552;10539:30;10624:1;10615:6;10610:3;10606:16;10599:27;10478:154;;;:::o;10638:412::-;10716:5;10741:66;10757:49;10799:6;10757:49;:::i;:::-;10741:66;:::i;:::-;10732:75;;10830:6;10823:5;10816:21;10868:4;10861:5;10857:16;10906:3;10897:6;10892:3;10888:16;10885:25;10882:112;;;10913:79;;:::i;:::-;10882:112;11003:41;11037:6;11032:3;11027;11003:41;:::i;:::-;10722:328;10638:412;;;;;:::o;11070:340::-;11126:5;11175:3;11168:4;11160:6;11156:17;11152:27;11142:122;;11183:79;;:::i;:::-;11142:122;11300:6;11287:20;11325:79;11400:3;11392:6;11385:4;11377:6;11373:17;11325:79;:::i;:::-;11316:88;;11132:278;11070:340;;;;:::o;11416:509::-;11485:6;11534:2;11522:9;11513:7;11509:23;11505:32;11502:119;;;11540:79;;:::i;:::-;11502:119;11688:1;11677:9;11673:17;11660:31;11718:18;11710:6;11707:30;11704:117;;;11740:79;;:::i;:::-;11704:117;11845:63;11900:7;11891:6;11880:9;11876:22;11845:63;:::i;:::-;11835:73;;11631:287;11416:509;;;;:::o;11931:329::-;11990:6;12039:2;12027:9;12018:7;12014:23;12010:32;12007:119;;;12045:79;;:::i;:::-;12007:119;12165:1;12190:53;12235:7;12226:6;12215:9;12211:22;12190:53;:::i;:::-;12180:63;;12136:117;11931:329;;;;:::o;12266:654::-;12344:6;12352;12401:2;12389:9;12380:7;12376:23;12372:32;12369:119;;;12407:79;;:::i;:::-;12369:119;12527:1;12552:53;12597:7;12588:6;12577:9;12573:22;12552:53;:::i;:::-;12542:63;;12498:117;12682:2;12671:9;12667:18;12654:32;12713:18;12705:6;12702:30;12699:117;;;12735:79;;:::i;:::-;12699:117;12840:63;12895:7;12886:6;12875:9;12871:22;12840:63;:::i;:::-;12830:73;;12625:288;12266:654;;;;;:::o;12926:109::-;12962:7;13002:26;12995:5;12991:38;12980:49;;12926:109;;;:::o;13041:120::-;13113:23;13130:5;13113:23;:::i;:::-;13106:5;13103:34;13093:62;;13151:1;13148;13141:12;13093:62;13041:120;:::o;13167:137::-;13212:5;13250:6;13237:20;13228:29;;13266:32;13292:5;13266:32;:::i;:::-;13167:137;;;;:::o;13310:472::-;13377:6;13385;13434:2;13422:9;13413:7;13409:23;13405:32;13402:119;;;13440:79;;:::i;:::-;13402:119;13560:1;13585:53;13630:7;13621:6;13610:9;13606:22;13585:53;:::i;:::-;13575:63;;13531:117;13687:2;13713:52;13757:7;13748:6;13737:9;13733:22;13713:52;:::i;:::-;13703:62;;13658:117;13310:472;;;;;:::o;13788:474::-;13856:6;13864;13913:2;13901:9;13892:7;13888:23;13884:32;13881:119;;;13919:79;;:::i;:::-;13881:119;14039:1;14064:53;14109:7;14100:6;14089:9;14085:22;14064:53;:::i;:::-;14054:63;;14010:117;14166:2;14192:53;14237:7;14228:6;14217:9;14213:22;14192:53;:::i;:::-;14182:63;;14137:118;13788:474;;;;;:::o;14268:116::-;14338:21;14353:5;14338:21;:::i;:::-;14331:5;14328:32;14318:60;;14374:1;14371;14364:12;14318:60;14268:116;:::o;14390:133::-;14433:5;14471:6;14458:20;14449:29;;14487:30;14511:5;14487:30;:::i;:::-;14390:133;;;;:::o;14529:468::-;14594:6;14602;14651:2;14639:9;14630:7;14626:23;14622:32;14619:119;;;14657:79;;:::i;:::-;14619:119;14777:1;14802:53;14847:7;14838:6;14827:9;14823:22;14802:53;:::i;:::-;14792:63;;14748:117;14904:2;14930:50;14972:7;14963:6;14952:9;14948:22;14930:50;:::i;:::-;14920:60;;14875:115;14529:468;;;;;:::o;15003:307::-;15064:4;15154:18;15146:6;15143:30;15140:56;;;15176:18;;:::i;:::-;15140:56;15214:29;15236:6;15214:29;:::i;:::-;15206:37;;15298:4;15292;15288:15;15280:23;;15003:307;;;:::o;15316:410::-;15393:5;15418:65;15434:48;15475:6;15434:48;:::i;:::-;15418:65;:::i;:::-;15409:74;;15506:6;15499:5;15492:21;15544:4;15537:5;15533:16;15582:3;15573:6;15568:3;15564:16;15561:25;15558:112;;;15589:79;;:::i;:::-;15558:112;15679:41;15713:6;15708:3;15703;15679:41;:::i;:::-;15399:327;15316:410;;;;;:::o;15745:338::-;15800:5;15849:3;15842:4;15834:6;15830:17;15826:27;15816:122;;15857:79;;:::i;:::-;15816:122;15974:6;15961:20;15999:78;16073:3;16065:6;16058:4;16050:6;16046:17;15999:78;:::i;:::-;15990:87;;15806:277;15745:338;;;;:::o;16089:943::-;16184:6;16192;16200;16208;16257:3;16245:9;16236:7;16232:23;16228:33;16225:120;;;16264:79;;:::i;:::-;16225:120;16384:1;16409:53;16454:7;16445:6;16434:9;16430:22;16409:53;:::i;:::-;16399:63;;16355:117;16511:2;16537:53;16582:7;16573:6;16562:9;16558:22;16537:53;:::i;:::-;16527:63;;16482:118;16639:2;16665:53;16710:7;16701:6;16690:9;16686:22;16665:53;:::i;:::-;16655:63;;16610:118;16795:2;16784:9;16780:18;16767:32;16826:18;16818:6;16815:30;16812:117;;;16848:79;;:::i;:::-;16812:117;16953:62;17007:7;16998:6;16987:9;16983:22;16953:62;:::i;:::-;16943:72;;16738:287;16089:943;;;;;;;:::o;17038:311::-;17115:4;17205:18;17197:6;17194:30;17191:56;;;17227:18;;:::i;:::-;17191:56;17277:4;17269:6;17265:17;17257:25;;17337:4;17331;17327:15;17319:23;;17038:311;;;:::o;17355:117::-;17464:1;17461;17454:12;17495:710;17591:5;17616:81;17632:64;17689:6;17632:64;:::i;:::-;17616:81;:::i;:::-;17607:90;;17717:5;17746:6;17739:5;17732:21;17780:4;17773:5;17769:16;17762:23;;17833:4;17825:6;17821:17;17813:6;17809:30;17862:3;17854:6;17851:15;17848:122;;;17881:79;;:::i;:::-;17848:122;17996:6;17979:220;18013:6;18008:3;18005:15;17979:220;;;18088:3;18117:37;18150:3;18138:10;18117:37;:::i;:::-;18112:3;18105:50;18184:4;18179:3;18175:14;18168:21;;18055:144;18039:4;18034:3;18030:14;18023:21;;17979:220;;;17983:21;17597:608;;17495:710;;;;;:::o;18228:370::-;18299:5;18348:3;18341:4;18333:6;18329:17;18325:27;18315:122;;18356:79;;:::i;:::-;18315:122;18473:6;18460:20;18498:94;18588:3;18580:6;18573:4;18565:6;18561:17;18498:94;:::i;:::-;18489:103;;18305:293;18228:370;;;;:::o;18604:1155::-;18725:6;18733;18741;18749;18798:3;18786:9;18777:7;18773:23;18769:33;18766:120;;;18805:79;;:::i;:::-;18766:120;18953:1;18942:9;18938:17;18925:31;18983:18;18975:6;18972:30;18969:117;;;19005:79;;:::i;:::-;18969:117;19110:78;19180:7;19171:6;19160:9;19156:22;19110:78;:::i;:::-;19100:88;;18896:302;19237:2;19263:53;19308:7;19299:6;19288:9;19284:22;19263:53;:::i;:::-;19253:63;;19208:118;19365:2;19391:53;19436:7;19427:6;19416:9;19412:22;19391:53;:::i;:::-;19381:63;;19336:118;19521:2;19510:9;19506:18;19493:32;19552:18;19544:6;19541:30;19538:117;;;19574:79;;:::i;:::-;19538:117;19679:63;19734:7;19725:6;19714:9;19710:22;19679:63;:::i;:::-;19669:73;;19464:288;18604:1155;;;;;;;:::o;19765:474::-;19833:6;19841;19890:2;19878:9;19869:7;19865:23;19861:32;19858:119;;;19896:79;;:::i;:::-;19858:119;20016:1;20041:53;20086:7;20077:6;20066:9;20062:22;20041:53;:::i;:::-;20031:63;;19987:117;20143:2;20169:53;20214:7;20205:6;20194:9;20190:22;20169:53;:::i;:::-;20159:63;;20114:118;19765:474;;;;;:::o;20245:178::-;20385:30;20381:1;20373:6;20369:14;20362:54;20245:178;:::o;20429:366::-;20571:3;20592:67;20656:2;20651:3;20592:67;:::i;:::-;20585:74;;20668:93;20757:3;20668:93;:::i;:::-;20786:2;20781:3;20777:12;20770:19;;20429:366;;;:::o;20801:419::-;20967:4;21005:2;20994:9;20990:18;20982:26;;21054:9;21048:4;21044:20;21040:1;21029:9;21025:17;21018:47;21082:131;21208:4;21082:131;:::i;:::-;21074:139;;20801:419;;;:::o;21226:180::-;21274:77;21271:1;21264:88;21371:4;21368:1;21361:15;21395:4;21392:1;21385:15;21412:320;21456:6;21493:1;21487:4;21483:12;21473:22;;21540:1;21534:4;21530:12;21561:18;21551:81;;21617:4;21609:6;21605:17;21595:27;;21551:81;21679:2;21671:6;21668:14;21648:18;21645:38;21642:84;;21698:18;;:::i;:::-;21642:84;21463:269;21412:320;;;:::o;21738:231::-;21878:34;21874:1;21866:6;21862:14;21855:58;21947:14;21942:2;21934:6;21930:15;21923:39;21738:231;:::o;21975:366::-;22117:3;22138:67;22202:2;22197:3;22138:67;:::i;:::-;22131:74;;22214:93;22303:3;22214:93;:::i;:::-;22332:2;22327:3;22323:12;22316:19;;21975:366;;;:::o;22347:419::-;22513:4;22551:2;22540:9;22536:18;22528:26;;22600:9;22594:4;22590:20;22586:1;22575:9;22571:17;22564:47;22628:131;22754:4;22628:131;:::i;:::-;22620:139;;22347:419;;;:::o;22772:220::-;22912:34;22908:1;22900:6;22896:14;22889:58;22981:3;22976:2;22968:6;22964:15;22957:28;22772:220;:::o;22998:366::-;23140:3;23161:67;23225:2;23220:3;23161:67;:::i;:::-;23154:74;;23237:93;23326:3;23237:93;:::i;:::-;23355:2;23350:3;23346:12;23339:19;;22998:366;;;:::o;23370:419::-;23536:4;23574:2;23563:9;23559:18;23551:26;;23623:9;23617:4;23613:20;23609:1;23598:9;23594:17;23587:47;23651:131;23777:4;23651:131;:::i;:::-;23643:139;;23370:419;;;:::o;23795:243::-;23935:34;23931:1;23923:6;23919:14;23912:58;24004:26;23999:2;23991:6;23987:15;23980:51;23795:243;:::o;24044:366::-;24186:3;24207:67;24271:2;24266:3;24207:67;:::i;:::-;24200:74;;24283:93;24372:3;24283:93;:::i;:::-;24401:2;24396:3;24392:12;24385:19;;24044:366;;;:::o;24416:419::-;24582:4;24620:2;24609:9;24605:18;24597:26;;24669:9;24663:4;24659:20;24655:1;24644:9;24640:17;24633:47;24697:131;24823:4;24697:131;:::i;:::-;24689:139;;24416:419;;;:::o;24841:236::-;24981:34;24977:1;24969:6;24965:14;24958:58;25050:19;25045:2;25037:6;25033:15;25026:44;24841:236;:::o;25083:366::-;25225:3;25246:67;25310:2;25305:3;25246:67;:::i;:::-;25239:74;;25322:93;25411:3;25322:93;:::i;:::-;25440:2;25435:3;25431:12;25424:19;;25083:366;;;:::o;25455:419::-;25621:4;25659:2;25648:9;25644:18;25636:26;;25708:9;25702:4;25698:20;25694:1;25683:9;25679:17;25672:47;25736:131;25862:4;25736:131;:::i;:::-;25728:139;;25455:419;;;:::o;25880:180::-;25928:77;25925:1;25918:88;26025:4;26022:1;26015:15;26049:4;26046:1;26039:15;26066:348;26106:7;26129:20;26147:1;26129:20;:::i;:::-;26124:25;;26163:20;26181:1;26163:20;:::i;:::-;26158:25;;26351:1;26283:66;26279:74;26276:1;26273:81;26268:1;26261:9;26254:17;26250:105;26247:131;;;26358:18;;:::i;:::-;26247:131;26406:1;26403;26399:9;26388:20;;26066:348;;;;:::o;26420:180::-;26468:77;26465:1;26458:88;26565:4;26562:1;26555:15;26589:4;26586:1;26579:15;26606:185;26646:1;26663:20;26681:1;26663:20;:::i;:::-;26658:25;;26697:20;26715:1;26697:20;:::i;:::-;26692:25;;26736:1;26726:35;;26741:18;;:::i;:::-;26726:35;26783:1;26780;26776:9;26771:14;;26606:185;;;;:::o;26797:234::-;26937:34;26933:1;26925:6;26921:14;26914:58;27006:17;27001:2;26993:6;26989:15;26982:42;26797:234;:::o;27037:366::-;27179:3;27200:67;27264:2;27259:3;27200:67;:::i;:::-;27193:74;;27276:93;27365:3;27276:93;:::i;:::-;27394:2;27389:3;27385:12;27378:19;;27037:366;;;:::o;27409:419::-;27575:4;27613:2;27602:9;27598:18;27590:26;;27662:9;27656:4;27652:20;27648:1;27637:9;27633:17;27626:47;27690:131;27816:4;27690:131;:::i;:::-;27682:139;;27409:419;;;:::o;27834:147::-;27935:11;27972:3;27957:18;;27834:147;;;;:::o;27987:114::-;;:::o;28107:398::-;28266:3;28287:83;28368:1;28363:3;28287:83;:::i;:::-;28280:90;;28379:93;28468:3;28379:93;:::i;:::-;28497:1;28492:3;28488:11;28481:18;;28107:398;;;:::o;28511:379::-;28695:3;28717:147;28860:3;28717:147;:::i;:::-;28710:154;;28881:3;28874:10;;28511:379;;;:::o;28896:162::-;29036:14;29032:1;29024:6;29020:14;29013:38;28896:162;:::o;29064:366::-;29206:3;29227:67;29291:2;29286:3;29227:67;:::i;:::-;29220:74;;29303:93;29392:3;29303:93;:::i;:::-;29421:2;29416:3;29412:12;29405:19;;29064:366;;;:::o;29436:419::-;29602:4;29640:2;29629:9;29625:18;29617:26;;29689:9;29683:4;29679:20;29675:1;29664:9;29660:17;29653:47;29717:131;29843:4;29717:131;:::i;:::-;29709:139;;29436:419;;;:::o;29861:176::-;30001:28;29997:1;29989:6;29985:14;29978:52;29861:176;:::o;30043:366::-;30185:3;30206:67;30270:2;30265:3;30206:67;:::i;:::-;30199:74;;30282:93;30371:3;30282:93;:::i;:::-;30400:2;30395:3;30391:12;30384:19;;30043:366;;;:::o;30415:419::-;30581:4;30619:2;30608:9;30604:18;30596:26;;30668:9;30662:4;30658:20;30654:1;30643:9;30639:17;30632:47;30696:131;30822:4;30696:131;:::i;:::-;30688:139;;30415:419;;;:::o;30840:228::-;30980:34;30976:1;30968:6;30964:14;30957:58;31049:11;31044:2;31036:6;31032:15;31025:36;30840:228;:::o;31074:366::-;31216:3;31237:67;31301:2;31296:3;31237:67;:::i;:::-;31230:74;;31313:93;31402:3;31313:93;:::i;:::-;31431:2;31426:3;31422:12;31415:19;;31074:366;;;:::o;31446:419::-;31612:4;31650:2;31639:9;31635:18;31627:26;;31699:9;31693:4;31689:20;31685:1;31674:9;31670:17;31663:47;31727:131;31853:4;31727:131;:::i;:::-;31719:139;;31446:419;;;:::o;31871:229::-;32011:34;32007:1;31999:6;31995:14;31988:58;32080:12;32075:2;32067:6;32063:15;32056:37;31871:229;:::o;32106:366::-;32248:3;32269:67;32333:2;32328:3;32269:67;:::i;:::-;32262:74;;32345:93;32434:3;32345:93;:::i;:::-;32463:2;32458:3;32454:12;32447:19;;32106:366;;;:::o;32478:419::-;32644:4;32682:2;32671:9;32667:18;32659:26;;32731:9;32725:4;32721:20;32717:1;32706:9;32702:17;32695:47;32759:131;32885:4;32759:131;:::i;:::-;32751:139;;32478:419;;;:::o;32903:173::-;33043:25;33039:1;33031:6;33027:14;33020:49;32903:173;:::o;33082:366::-;33224:3;33245:67;33309:2;33304:3;33245:67;:::i;:::-;33238:74;;33321:93;33410:3;33321:93;:::i;:::-;33439:2;33434:3;33430:12;33423:19;;33082:366;;;:::o;33454:419::-;33620:4;33658:2;33647:9;33643:18;33635:26;;33707:9;33701:4;33697:20;33693:1;33682:9;33678:17;33671:47;33735:131;33861:4;33735:131;:::i;:::-;33727:139;;33454:419;;;:::o;33879:174::-;34019:26;34015:1;34007:6;34003:14;33996:50;33879:174;:::o;34059:366::-;34201:3;34222:67;34286:2;34281:3;34222:67;:::i;:::-;34215:74;;34298:93;34387:3;34298:93;:::i;:::-;34416:2;34411:3;34407:12;34400:19;;34059:366;;;:::o;34431:419::-;34597:4;34635:2;34624:9;34620:18;34612:26;;34684:9;34678:4;34674:20;34670:1;34659:9;34655:17;34648:47;34712:131;34838:4;34712:131;:::i;:::-;34704:139;;34431:419;;;:::o;34856:191::-;34896:4;34916:20;34934:1;34916:20;:::i;:::-;34911:25;;34950:20;34968:1;34950:20;:::i;:::-;34945:25;;34989:1;34986;34983:8;34980:34;;;34994:18;;:::i;:::-;34980:34;35039:1;35036;35032:9;35024:17;;34856:191;;;;:::o;35053:423::-;35194:4;35232:2;35221:9;35217:18;35209:26;;35245:71;35313:1;35302:9;35298:17;35289:6;35245:71;:::i;:::-;35363:9;35357:4;35353:20;35348:2;35337:9;35333:18;35326:48;35391:78;35464:4;35455:6;35391:78;:::i;:::-;35383:86;;35053:423;;;;;:::o;35482:162::-;35622:14;35618:1;35610:6;35606:14;35599:38;35482:162;:::o;35650:366::-;35792:3;35813:67;35877:2;35872:3;35813:67;:::i;:::-;35806:74;;35889:93;35978:3;35889:93;:::i;:::-;36007:2;36002:3;35998:12;35991:19;;35650:366;;;:::o;36022:419::-;36188:4;36226:2;36215:9;36211:18;36203:26;;36275:9;36269:4;36265:20;36261:1;36250:9;36246:17;36239:47;36303:131;36429:4;36303:131;:::i;:::-;36295:139;;36022:419;;;:::o;36447:234::-;36587:34;36583:1;36575:6;36571:14;36564:58;36656:17;36651:2;36643:6;36639:15;36632:42;36447:234;:::o;36687:366::-;36829:3;36850:67;36914:2;36909:3;36850:67;:::i;:::-;36843:74;;36926:93;37015:3;36926:93;:::i;:::-;37044:2;37039:3;37035:12;37028:19;;36687:366;;;:::o;37059:419::-;37225:4;37263:2;37252:9;37248:18;37240:26;;37312:9;37306:4;37302:20;37298:1;37287:9;37283:17;37276:47;37340:131;37466:4;37340:131;:::i;:::-;37332:139;;37059:419;;;:::o;37484:148::-;37586:11;37623:3;37608:18;;37484:148;;;;:::o;37638:377::-;37744:3;37772:39;37805:5;37772:39;:::i;:::-;37827:89;37909:6;37904:3;37827:89;:::i;:::-;37820:96;;37925:52;37970:6;37965:3;37958:4;37951:5;37947:16;37925:52;:::i;:::-;38002:6;37997:3;37993:16;37986:23;;37748:267;37638:377;;;;:::o;38021:435::-;38201:3;38223:95;38314:3;38305:6;38223:95;:::i;:::-;38216:102;;38335:95;38426:3;38417:6;38335:95;:::i;:::-;38328:102;;38447:3;38440:10;;38021:435;;;;;:::o;38462:305::-;38502:3;38521:20;38539:1;38521:20;:::i;:::-;38516:25;;38555:20;38573:1;38555:20;:::i;:::-;38550:25;;38709:1;38641:66;38637:74;38634:1;38631:81;38628:107;;;38715:18;;:::i;:::-;38628:107;38759:1;38756;38752:9;38745:16;;38462:305;;;;:::o;38773:237::-;38913:34;38909:1;38901:6;38897:14;38890:58;38982:20;38977:2;38969:6;38965:15;38958:45;38773:237;:::o;39016:366::-;39158:3;39179:67;39243:2;39238:3;39179:67;:::i;:::-;39172:74;;39255:93;39344:3;39255:93;:::i;:::-;39373:2;39368:3;39364:12;39357:19;;39016:366;;;:::o;39388:419::-;39554:4;39592:2;39581:9;39577:18;39569:26;;39641:9;39635:4;39631:20;39627:1;39616:9;39612:17;39605:47;39669:131;39795:4;39669:131;:::i;:::-;39661:139;;39388:419;;;:::o;39813:164::-;39953:16;39949:1;39941:6;39937:14;39930:40;39813:164;:::o;39983:366::-;40125:3;40146:67;40210:2;40205:3;40146:67;:::i;:::-;40139:74;;40222:93;40311:3;40222:93;:::i;:::-;40340:2;40335:3;40331:12;40324:19;;39983:366;;;:::o;40355:419::-;40521:4;40559:2;40548:9;40544:18;40536:26;;40608:9;40602:4;40598:20;40594:1;40583:9;40579:17;40572:47;40636:131;40762:4;40636:131;:::i;:::-;40628:139;;40355:419;;;:::o;40780:172::-;40920:24;40916:1;40908:6;40904:14;40897:48;40780:172;:::o;40958:366::-;41100:3;41121:67;41185:2;41180:3;41121:67;:::i;:::-;41114:74;;41197:93;41286:3;41197:93;:::i;:::-;41315:2;41310:3;41306:12;41299:19;;40958:366;;;:::o;41330:419::-;41496:4;41534:2;41523:9;41519:18;41511:26;;41583:9;41577:4;41573:20;41569:1;41558:9;41554:17;41547:47;41611:131;41737:4;41611:131;:::i;:::-;41603:139;;41330:419;;;:::o;41755:167::-;41895:19;41891:1;41883:6;41879:14;41872:43;41755:167;:::o;41928:366::-;42070:3;42091:67;42155:2;42150:3;42091:67;:::i;:::-;42084:74;;42167:93;42256:3;42167:93;:::i;:::-;42285:2;42280:3;42276:12;42269:19;;41928:366;;;:::o;42300:419::-;42466:4;42504:2;42493:9;42489:18;42481:26;;42553:9;42547:4;42543:20;42539:1;42528:9;42524:17;42517:47;42581:131;42707:4;42581:131;:::i;:::-;42573:139;;42300:419;;;:::o;42725:231::-;42865:34;42861:1;42853:6;42849:14;42842:58;42934:14;42929:2;42921:6;42917:15;42910:39;42725:231;:::o;42962:366::-;43104:3;43125:67;43189:2;43184:3;43125:67;:::i;:::-;43118:74;;43201:93;43290:3;43201:93;:::i;:::-;43319:2;43314:3;43310:12;43303:19;;42962:366;;;:::o;43334:419::-;43500:4;43538:2;43527:9;43523:18;43515:26;;43587:9;43581:4;43577:20;43573:1;43562:9;43558:17;43551:47;43615:131;43741:4;43615:131;:::i;:::-;43607:139;;43334:419;;;:::o;43759:224::-;43899:34;43895:1;43887:6;43883:14;43876:58;43968:7;43963:2;43955:6;43951:15;43944:32;43759:224;:::o;43989:366::-;44131:3;44152:67;44216:2;44211:3;44152:67;:::i;:::-;44145:74;;44228:93;44317:3;44228:93;:::i;:::-;44346:2;44341:3;44337:12;44330:19;;43989:366;;;:::o;44361:419::-;44527:4;44565:2;44554:9;44550:18;44542:26;;44614:9;44608:4;44604:20;44600:1;44589:9;44585:17;44578:47;44642:131;44768:4;44642:131;:::i;:::-;44634:139;;44361:419;;;:::o;44786:223::-;44926:34;44922:1;44914:6;44910:14;44903:58;44995:6;44990:2;44982:6;44978:15;44971:31;44786:223;:::o;45015:366::-;45157:3;45178:67;45242:2;45237:3;45178:67;:::i;:::-;45171:74;;45254:93;45343:3;45254:93;:::i;:::-;45372:2;45367:3;45363:12;45356:19;;45015:366;;;:::o;45387:419::-;45553:4;45591:2;45580:9;45576:18;45568:26;;45640:9;45634:4;45630:20;45626:1;45615:9;45611:17;45604:47;45668:131;45794:4;45668:131;:::i;:::-;45660:139;;45387:419;;;:::o;45812:168::-;45952:20;45948:1;45940:6;45936:14;45929:44;45812:168;:::o;45986:366::-;46128:3;46149:67;46213:2;46208:3;46149:67;:::i;:::-;46142:74;;46225:93;46314:3;46225:93;:::i;:::-;46343:2;46338:3;46334:12;46327:19;;45986:366;;;:::o;46358:419::-;46524:4;46562:2;46551:9;46547:18;46539:26;;46611:9;46605:4;46601:20;46597:1;46586:9;46582:17;46575:47;46639:131;46765:4;46639:131;:::i;:::-;46631:139;;46358:419;;;:::o;46783:165::-;46923:17;46919:1;46911:6;46907:14;46900:41;46783:165;:::o;46954:366::-;47096:3;47117:67;47181:2;47176:3;47117:67;:::i;:::-;47110:74;;47193:93;47282:3;47193:93;:::i;:::-;47311:2;47306:3;47302:12;47295:19;;46954:366;;;:::o;47326:419::-;47492:4;47530:2;47519:9;47515:18;47507:26;;47579:9;47573:4;47569:20;47565:1;47554:9;47550:17;47543:47;47607:131;47733:4;47607:131;:::i;:::-;47599:139;;47326:419;;;:::o;47751:176::-;47891:28;47887:1;47879:6;47875:14;47868:52;47751:176;:::o;47933:366::-;48075:3;48096:67;48160:2;48155:3;48096:67;:::i;:::-;48089:74;;48172:93;48261:3;48172:93;:::i;:::-;48290:2;48285:3;48281:12;48274:19;;47933:366;;;:::o;48305:419::-;48471:4;48509:2;48498:9;48494:18;48486:26;;48558:9;48552:4;48548:20;48544:1;48533:9;48529:17;48522:47;48586:131;48712:4;48586:131;:::i;:::-;48578:139;;48305:419;;;:::o;48730:233::-;48769:3;48792:24;48810:5;48792:24;:::i;:::-;48783:33;;48838:66;48831:5;48828:77;48825:103;;48908:18;;:::i;:::-;48825:103;48955:1;48948:5;48944:13;48937:20;;48730:233;;;:::o;48969:229::-;49109:34;49105:1;49097:6;49093:14;49086:58;49178:12;49173:2;49165:6;49161:15;49154:37;48969:229;:::o;49204:366::-;49346:3;49367:67;49431:2;49426:3;49367:67;:::i;:::-;49360:74;;49443:93;49532:3;49443:93;:::i;:::-;49561:2;49556:3;49552:12;49545:19;;49204:366;;;:::o;49576:419::-;49742:4;49780:2;49769:9;49765:18;49757:26;;49829:9;49823:4;49819:20;49815:1;49804:9;49800:17;49793:47;49857:131;49983:4;49857:131;:::i;:::-;49849:139;;49576:419;;;:::o;50001:175::-;50141:27;50137:1;50129:6;50125:14;50118:51;50001:175;:::o;50182:366::-;50324:3;50345:67;50409:2;50404:3;50345:67;:::i;:::-;50338:74;;50421:93;50510:3;50421:93;:::i;:::-;50539:2;50534:3;50530:12;50523:19;;50182:366;;;:::o;50554:419::-;50720:4;50758:2;50747:9;50743:18;50735:26;;50807:9;50801:4;50797:20;50793:1;50782:9;50778:17;50771:47;50835:131;50961:4;50835:131;:::i;:::-;50827:139;;50554:419;;;:::o;50979:175::-;51119:27;51115:1;51107:6;51103:14;51096:51;50979:175;:::o;51160:366::-;51302:3;51323:67;51387:2;51382:3;51323:67;:::i;:::-;51316:74;;51399:93;51488:3;51399:93;:::i;:::-;51517:2;51512:3;51508:12;51501:19;;51160:366;;;:::o;51532:419::-;51698:4;51736:2;51725:9;51721:18;51713:26;;51785:9;51779:4;51775:20;51771:1;51760:9;51756:17;51749:47;51813:131;51939:4;51813:131;:::i;:::-;51805:139;;51532:419;;;:::o;51957:237::-;52097:34;52093:1;52085:6;52081:14;52074:58;52166:20;52161:2;52153:6;52149:15;52142:45;51957:237;:::o;52200:366::-;52342:3;52363:67;52427:2;52422:3;52363:67;:::i;:::-;52356:74;;52439:93;52528:3;52439:93;:::i;:::-;52557:2;52552:3;52548:12;52541:19;;52200:366;;;:::o;52572:419::-;52738:4;52776:2;52765:9;52761:18;52753:26;;52825:9;52819:4;52815:20;52811:1;52800:9;52796:17;52789:47;52853:131;52979:4;52853:131;:::i;:::-;52845:139;;52572:419;;;:::o;52997:176::-;53029:1;53046:20;53064:1;53046:20;:::i;:::-;53041:25;;53080:20;53098:1;53080:20;:::i;:::-;53075:25;;53119:1;53109:35;;53124:18;;:::i;:::-;53109:35;53165:1;53162;53158:9;53153:14;;52997:176;;;;:::o;53179:180::-;53227:77;53224:1;53217:88;53324:4;53321:1;53314:15;53348:4;53345:1;53338:15;53365:94;53398:8;53446:5;53442:2;53438:14;53417:35;;53365:94;;;:::o;53465:::-;53504:7;53533:20;53547:5;53533:20;:::i;:::-;53522:31;;53465:94;;;:::o;53565:100::-;53604:7;53633:26;53653:5;53633:26;:::i;:::-;53622:37;;53565:100;;;:::o;53671:157::-;53776:45;53796:24;53814:5;53796:24;:::i;:::-;53776:45;:::i;:::-;53771:3;53764:58;53671:157;;:::o;53834:79::-;53873:7;53902:5;53891:16;;53834:79;;;:::o;53919:157::-;54024:45;54044:24;54062:5;54044:24;:::i;:::-;54024:45;:::i;:::-;54019:3;54012:58;53919:157;;:::o;54082:397::-;54222:3;54237:75;54308:3;54299:6;54237:75;:::i;:::-;54337:2;54332:3;54328:12;54321:19;;54350:75;54421:3;54412:6;54350:75;:::i;:::-;54450:2;54445:3;54441:12;54434:19;;54470:3;54463:10;;54082:397;;;;;:::o;54485:79::-;54524:7;54553:5;54542:16;;54485:79;;;:::o;54570:157::-;54675:45;54695:24;54713:5;54695:24;:::i;:::-;54675:45;:::i;:::-;54670:3;54663:58;54570:157;;:::o;54733:397::-;54873:3;54888:75;54959:3;54950:6;54888:75;:::i;:::-;54988:2;54983:3;54979:12;54972:19;;55001:75;55072:3;55063:6;55001:75;:::i;:::-;55101:2;55096:3;55092:12;55085:19;;55121:3;55114:10;;54733:397;;;;;:::o;55136:173::-;55276:25;55272:1;55264:6;55260:14;55253:49;55136:173;:::o;55315:402::-;55475:3;55496:85;55578:2;55573:3;55496:85;:::i;:::-;55489:92;;55590:93;55679:3;55590:93;:::i;:::-;55708:2;55703:3;55699:12;55692:19;;55315:402;;;:::o;55723:167::-;55863:19;55859:1;55851:6;55847:14;55840:43;55723:167;:::o;55896:402::-;56056:3;56077:85;56159:2;56154:3;56077:85;:::i;:::-;56070:92;;56171:93;56260:3;56171:93;:::i;:::-;56289:2;56284:3;56280:12;56273:19;;55896:402;;;:::o;56304:967::-;56686:3;56708:148;56852:3;56708:148;:::i;:::-;56701:155;;56873:95;56964:3;56955:6;56873:95;:::i;:::-;56866:102;;56985:148;57129:3;56985:148;:::i;:::-;56978:155;;57150:95;57241:3;57232:6;57150:95;:::i;:::-;57143:102;;57262:3;57255:10;;56304:967;;;;;:::o;57277:98::-;57328:6;57362:5;57356:12;57346:22;;57277:98;;;:::o;57381:168::-;57464:11;57498:6;57493:3;57486:19;57538:4;57533:3;57529:14;57514:29;;57381:168;;;;:::o;57555:360::-;57641:3;57669:38;57701:5;57669:38;:::i;:::-;57723:70;57786:6;57781:3;57723:70;:::i;:::-;57716:77;;57802:52;57847:6;57842:3;57835:4;57828:5;57824:16;57802:52;:::i;:::-;57879:29;57901:6;57879:29;:::i;:::-;57874:3;57870:39;57863:46;;57645:270;57555:360;;;;:::o;57921:640::-;58116:4;58154:3;58143:9;58139:19;58131:27;;58168:71;58236:1;58225:9;58221:17;58212:6;58168:71;:::i;:::-;58249:72;58317:2;58306:9;58302:18;58293:6;58249:72;:::i;:::-;58331;58399:2;58388:9;58384:18;58375:6;58331:72;:::i;:::-;58450:9;58444:4;58440:20;58435:2;58424:9;58420:18;58413:48;58478:76;58549:4;58540:6;58478:76;:::i;:::-;58470:84;;57921:640;;;;;;;:::o;58567:141::-;58623:5;58654:6;58648:13;58639:22;;58670:32;58696:5;58670:32;:::i;:::-;58567:141;;;;:::o;58714:349::-;58783:6;58832:2;58820:9;58811:7;58807:23;58803:32;58800:119;;;58838:79;;:::i;:::-;58800:119;58958:1;58983:63;59038:7;59029:6;59018:9;59014:22;58983:63;:::i;:::-;58973:73;;58929:127;58714:349;;;;:::o;59069:171::-;59108:3;59131:24;59149:5;59131:24;:::i;:::-;59122:33;;59177:4;59170:5;59167:15;59164:41;;59185:18;;:::i;:::-;59164:41;59232:1;59225:5;59221:13;59214:20;;59069:171;;;:::o;59246:182::-;59386:34;59382:1;59374:6;59370:14;59363:58;59246:182;:::o;59434:366::-;59576:3;59597:67;59661:2;59656:3;59597:67;:::i;:::-;59590:74;;59673:93;59762:3;59673:93;:::i;:::-;59791:2;59786:3;59782:12;59775:19;;59434:366;;;:::o;59806:419::-;59972:4;60010:2;59999:9;59995:18;59987:26;;60059:9;60053:4;60049:20;60045:1;60034:9;60030:17;60023:47;60087:131;60213:4;60087:131;:::i;:::-;60079:139;;59806:419;;;:::o;60231:180::-;60279:77;60276:1;60269:88;60376:4;60373:1;60366:15;60400:4;60397:1;60390:15;60417:182;60557:34;60553:1;60545:6;60541:14;60534:58;60417:182;:::o;60605:366::-;60747:3;60768:67;60832:2;60827:3;60768:67;:::i;:::-;60761:74;;60844:93;60933:3;60844:93;:::i;:::-;60962:2;60957:3;60953:12;60946:19;;60605:366;;;:::o;60977:419::-;61143:4;61181:2;61170:9;61166:18;61158:26;;61230:9;61224:4;61220:20;61216:1;61205:9;61201:17;61194:47;61258:131;61384:4;61258:131;:::i;:::-;61250:139;;60977:419;;;:::o;61402:178::-;61542:30;61538:1;61530:6;61526:14;61519:54;61402:178;:::o;61586:366::-;61728:3;61749:67;61813:2;61808:3;61749:67;:::i;:::-;61742:74;;61825:93;61914:3;61825:93;:::i;:::-;61943:2;61938:3;61934:12;61927:19;;61586:366;;;:::o;61958:419::-;62124:4;62162:2;62151:9;62147:18;62139:26;;62211:9;62205:4;62201:20;62197:1;62186:9;62182:17;62175:47;62239:131;62365:4;62239:131;:::i;:::-;62231:139;;61958:419;;;:::o
Swarm Source
ipfs://0565751596128715fcc7e5a03924f9539e11ab9dfc5851648ad93524c83c8db0
Age | Block | Fee Address | BC Fee Address | Voting Power | Jailed | Incoming |
---|
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.