Contract Overview
[ Download CSV Export ]
Contract Name:
Bezogis
Compiler Version
v0.8.0+commit.c7dfd78e
Contract Source Code (Solidity Multiple files format)
// @openzeppelin v3.2.0 // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./ERC20.sol"; import "./ERC721.sol"; import "./ERC721Enumerable.sol"; import "./ERC721Burnable.sol"; import "./ERC721Pausable.sol"; import "./AccessControlEnumerable.sol"; import "./Context.sol"; import "./Address.sol"; import "./EnumerableSet.sol"; import "./Ownable.sol"; import "./VRFConsumerBase.sol"; contract Bezogis is Context, AccessControlEnumerable, ERC721Enumerable, ERC721Burnable, ERC721Pausable , Ownable , VRFConsumerBase( 0x3d2341ADb2D31f1c5530cDC622016af293177AE0, // Polygon (Matic) Mainnet - VRF Coordinator 0xb0897686c545045aFc77CF20eC7A532E3120E0F1 // Polygon (Matic) Mainnet - LINK Token ) { using Strings for uint256; using Address for address; using EnumerableSet for EnumerableSet.UintSet; bytes32 private constant MINTER_ROLE = keccak256("MINTER_ROLE"); // 0=defaultURI uint256 private constant MIN_BEZOGI_URI = 1; // 0=defaultURI string private constant DEFAULT_BEZOGI_URI = "0"; // max NFT supply uint256 private MAX_NFT_SUPPLY = 0; // transfer the tokens from the sender to this contract IERC20 private _posWETHToken; // baseURI string private _baseTokenURI; // mapping for bezogi URIs=[1-4096](Uint256) EnumerableSet.UintSet private _uriSet; // mapping for token requestId mapping(bytes32 => uint256) private _requestIdTokenId; // total summoned bezogi uint256 private _totalSummonedBezogi = 0; // summoning mapping(uint256 => bool) private _summoning; // bezogi price,[4097-MAX] uint256 private _bezogiPrice = 1 ether; // sale available bool private _saleAvailable = false; // pre-sale available bool private _presaleAvailable = true; // transfer available bool private _transferAvailable = false; // summon available bool private _summonAvailable = false; // mapping for token URIs mapping(uint256 => string) private _tokenURIs; // presale whitelist mapping(address => bool) private _presaleWhitelist; // mapping for token transfer blacklist mapping (address => EnumerableSet.UintSet) private _tokenBlacklist; constructor( ) ERC721("Bezogis", "BEZOGIS") { _baseTokenURI = "https://api.bezoge.com/token/api/nft/"; // Polygon (Matic) Mainnet keyHash = 0xf86195cf7690c55907b2b611ebb7343a6f649bff128701cc542f0569e2c549da; fee = 0.0001 * 10 ** 18; // 0.0001 LINK (Varies by network) _posWETHToken = IERC20(0x7ceB23fD6bC0adD59E62ac25578270cFf1b9f619); _setupRole(DEFAULT_ADMIN_ROLE, msg.sender); } function _baseURI() internal view virtual override returns (string memory) { return _baseTokenURI; } function ownerInitMaxNFTSupply(uint256 maxNFTSupply) onlyOwner public { require(maxNFTSupply > MAX_NFT_SUPPLY, "ERC721: maxNFTSupply value is incorrect"); for (uint256 i = (MAX_NFT_SUPPLY + MIN_BEZOGI_URI); i <= maxNFTSupply; i++) { _uriSet.add(i); } MAX_NFT_SUPPLY = maxNFTSupply; } function ownerMintNFT(uint256 total) onlyOwner public { for (uint256 i = 0; i < total; i++) { uint256 mintIndex = totalSupply(); _safeMint(msg.sender, mintIndex); } } function ownerAirdrop(address[] memory _addressArray) onlyOwner public { for (uint256 i = 0; i < _addressArray.length; i++) { address owner = _addressArray[i]; uint256 mintIndex = totalSupply(); _safeMint(owner, mintIndex); } } function minterMintWithSummon(address[] memory _addressArray) public { require(hasRole(MINTER_ROLE, msg.sender), "ERC721: must have minter role to mint"); // 4096 uint256 mintIndex = totalSupply(); require(mintIndex >= MAX_NFT_SUPPLY, "ERC721: mintIndex value is incorrect"); for (uint256 i = 0; i < _addressArray.length; i++) { // [4096,4120)=[4096,4119] mintIndex = totalSupply(); address owner = _addressArray[i]; _safeMint(owner, mintIndex); summonTokenWithURI(mintIndex,(mintIndex + 1).toString()); MAX_NFT_SUPPLY = MAX_NFT_SUPPLY + 1; } } function ownerSetBaseTokenURI(string memory baseTokenURI) onlyOwner public { _baseTokenURI = baseTokenURI; } function ownerSetSaleAvailable(bool saleAvailable) onlyOwner public { _saleAvailable = saleAvailable; } function ownerSetSummonAvailable(bool summonAvailable) onlyOwner public { _summonAvailable = summonAvailable; } function ownerSetTransferAvailable(bool transferAvailable) onlyOwner public { _transferAvailable = transferAvailable; } function ownerSetPresaleAvailable(bool presaleAvailable) onlyOwner public { _presaleAvailable = presaleAvailable; } function ownerSetBezogiPrice(uint256 bezogiPrice) onlyOwner public { _bezogiPrice = bezogiPrice; } /** * @dev Withdraw ether from this contract (Callable by owner) */ function ownerWithdrawWETH() onlyOwner public { require(_posWETHToken.transfer(msg.sender, _posWETHToken.balanceOf(address(this))), "Unable to transfer WETH"); } /** * @dev Withdraw LINK from this contract (Callable by owner) */ function ownerWithdrawLink() onlyOwner public { LinkTokenInterface link = LinkTokenInterface(chainlinkTokenAddress()); require(link.transfer(msg.sender, link.balanceOf(address(this))), "Unable to transfer LINK"); } function pause() onlyOwner public virtual { _pause(); } function unpause() onlyOwner public virtual { _unpause(); } function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override(ERC721, ERC721Enumerable, ERC721Pausable) { require(from == address(0) || getTransferAvailable(), "Unable to transfer during NFT sale."); require(!publicTokenBlacklisted(from,tokenId), "Unable to transfer, your token is blacklisted"); super._beforeTokenTransfer(from, to, tokenId); } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(AccessControlEnumerable,ERC721, ERC721Enumerable) returns (bool) { return super.supportsInterface(interfaceId); } function getUriSetAtIndex(uint256 index) public view returns (uint256) { return _uriSet.at(index); } function getSummonAvailable() public view returns (bool) { return _summonAvailable; } function getTransferAvailable() public view returns (bool) { return _transferAvailable; } function getSaleAvailable() public view returns (bool) { return _saleAvailable; } function getPresaleAvailable() public view returns (bool) { return _presaleAvailable; } function getMaxNFTSupply() public view returns (uint256) { return MAX_NFT_SUPPLY; } function getTotalSummonedBezogi() public view returns (uint256) { return _totalSummonedBezogi; } function getAvailableBezogiURILength() public view returns (uint256) { return MAX_NFT_SUPPLY - getTotalSummonedBezogi(); } function getTokenSummoned(uint256 tokenId) public view returns (bool) { return bytes(_tokenURIs[tokenId]).length != 0; } function getBaseTokenURI() public view returns (string memory) { return _baseTokenURI; } function getBezogiPrice() public view returns (uint256) { return _bezogiPrice; } function publicSummonNFT(uint256 tokenId) public{ require(getSummonAvailable(), "ERC721: summon unavailable"); require(_exists(tokenId), "ERC721: operator query for nonexistent token"); require(!getTokenSummoned(tokenId), "ERC721: token has been summoned"); require(!_summoning[tokenId], "ERC721: token is summoning"); uint256 availableBezogiURILength = getAvailableBezogiURILength(); require(availableBezogiURILength > 0, "ERC721: no available bezogi"); address owner = ownerOf(tokenId); require(msg.sender == owner,"ERC721: only owner can summon"); _summoning[tokenId] = true; bytes32 requestId = getRandomNumber(); _requestIdTokenId[requestId] = tokenId; } /** * @dev Mints bezogi */ function publicMintNFT(uint256 numberOfNfts) public { // totalSupply() = [0,4096],MAX_NFT_SUPPLY=4096 require(totalSupply() < MAX_NFT_SUPPLY, "Sale has already ended"); require(numberOfNfts > 0, "numberOfNfts cannot be 0"); require((totalSupply() + numberOfNfts) <= MAX_NFT_SUPPLY, "Exceeds MAX_NFT_SUPPLY"); require(getSaleAvailable(), "Sale has not started"); require(_posWETHToken.allowance(msg.sender, address(this)) >= (publicGetNFTPrice() * numberOfNfts), "Ether allowance value is incorrect"); require(_posWETHToken.balanceOf(msg.sender) >= (publicGetNFTPrice() * numberOfNfts), "Insufficient WETH balance"); if(getPresaleAvailable()){ require(publicPresaleWhitelisted(msg.sender), "You are not on the pre-sale whitelist"); require(numberOfNfts <= 3, "You may not mint more than 3 NFTs during presale"); // max 3 NFT uint256 nftBalance = balanceOf(msg.sender) + numberOfNfts; require(nftBalance <= 3, "ERC721: You cannot mint more than 3 NFTs during presale"); } else { require(numberOfNfts <= 10, "You may not mint more than 10 NFTs"); // max 10 NFT uint256 nftBalance = balanceOf(msg.sender) + numberOfNfts; require(nftBalance <= 10, "ERC721: You cannot mint more than 10 NFTs"); } _posWETHToken.transferFrom(msg.sender, address(this), (publicGetNFTPrice() * numberOfNfts)); for (uint256 i = 0; i < numberOfNfts; i++) { uint256 mintIndex = totalSupply(); _safeMint(msg.sender, mintIndex); } } function publicGetWETHAllowance(address _address) public view returns (uint256) { return _posWETHToken.allowance(_address, address(this)); } /** * @dev Gets current Bezogi Price */ function publicGetNFTPrice() public view returns (uint256) { uint currentSupply = totalSupply(); // totalSupply() = [0,4096],MAX_NFT_SUPPLY=4096 if (currentSupply >= 4096) { return _bezogiPrice; } else if (currentSupply >= 4000) { return 0.16 ether; } else if (currentSupply >= 3000) { return 0.096 ether; } else if (currentSupply >= 2000) { return 0.064 ether; } else if (currentSupply >= 750) { return 0.032 ether; } else if (currentSupply >= 0) { return 0.0032 ether; } else { return 0.16 ether; } } /***********************************CHAINLINK****************************************** */ bytes32 internal keyHash; uint256 internal fee; /** * Requests randomness */ function getRandomNumber() internal returns (bytes32 requestId) { require(LINK.balanceOf(address(this)) >= fee, "Not enough LINK"); return requestRandomness(keyHash, fee); } /** * Callback function used by VRF Coordinator */ function fulfillRandomness(bytes32 requestId, uint256 randomness) internal override { // [0-4096] uint256 availableBezogiURILength = getAvailableBezogiURILength(); uint256 tokenId = _requestIdTokenId[requestId]; uint256 randomIndex = 0; if(availableBezogiURILength > 0){ // [0,4096)=[0-4095] randomIndex = randomness % availableBezogiURILength; if(_exists(tokenId) && !getTokenSummoned(tokenId) && _summoning[tokenId]){ // _uriSet.length(); 4096 ,index=[0,4096) values=[1-4096] uint256 uri = _uriSet.at(randomIndex); summonTokenWithURI(tokenId,uri.toString()); _uriSet.remove(uri); delete _summoning[tokenId]; } } } function summonTokenWithURI(uint256 tokenId, string memory bezogiURI) internal { _setTokenURI(tokenId, bezogiURI); _totalSummonedBezogi = _totalSummonedBezogi + 1; } function chainlinkTokenAddress() public pure returns (address) { return address(0xb0897686c545045aFc77CF20eC7A532E3120E0F1); } /***********************************CHAINLINK****************************************** */ /***********************************TOKEN URI****************************************** */ /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721URIStorage: URI query for nonexistent token"); string memory _tokenURI = _tokenURIs[tokenId]; string memory base = _baseURI(); // If there is no base URI, return the token URI. if (bytes(base).length == 0) { return _tokenURI; } // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked). if (bytes(_tokenURI).length > 0) { return string(abi.encodePacked(base, _tokenURI)); } else { // return string(abi.encodePacked(base, "0")); return string(abi.encodePacked(base, DEFAULT_BEZOGI_URI)); } } /** * @dev Sets `_tokenURI` as the tokenURI of `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual { require(_exists(tokenId), "ERC721URIStorage: URI set of nonexistent token"); _tokenURIs[tokenId] = _tokenURI; } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual override { require(msg.sender == owner(), "ERC721URIStorage: owner required"); super._burn(tokenId); if (bytes(_tokenURIs[tokenId]).length != 0) { delete _tokenURIs[tokenId]; } } /***********************************TOKEN URI****************************************** */ /***********************************PRESALE-WHITELIST********************************** */ function ownerPresaleWhitelistAdd(address[] memory _addressArray) public onlyOwner { for (uint256 i = 0; i < _addressArray.length; i++) { _presaleWhitelist[_addressArray[i]] = true; } } function ownerPresaleWhitelistRemove(address[] memory _addressArray) public onlyOwner { for (uint256 i = 0; i < _addressArray.length; i++) { delete _presaleWhitelist[_addressArray[i]]; } } function publicPresaleWhitelisted(address _address) public view returns(bool) { return _presaleWhitelist[_address]; } /***********************************PRESALE-WHITELIST********************************** */ // /**********************************TOKEN-BLACKLIST********************************** */ function minterTokenBlacklistAdd(address _address,uint256 tokenId) public { require(hasRole(MINTER_ROLE, msg.sender) || hasRole(DEFAULT_ADMIN_ROLE, msg.sender), "ERC721: must have minter or admin role to add"); require(_address != address(0), "ERC721: Cannot add zero address to the blacklist"); _tokenBlacklist[_address].add(tokenId); } function minterTokenBlacklistRemove(address _address,uint256 tokenId) public { require(hasRole(MINTER_ROLE, msg.sender) || hasRole(DEFAULT_ADMIN_ROLE, msg.sender), "ERC721: must have minter or admin role to remove"); _tokenBlacklist[_address].remove(tokenId); } function publicTokenBlacklisted(address _address,uint256 tokenId) public view returns(bool) { return _tokenBlacklist[_address].contains(tokenId); } // /**********************************TOKEN-BLACKLIST********************************** */ }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./Context.sol"; import "./Strings.sol"; import "./ERC165.sol"; /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControl { function hasRole(bytes32 role, address account) external view returns (bool); function getRoleAdmin(bytes32 role) external view returns (bytes32); function grantRole(bytes32 role, address account) external; function revokeRole(bytes32 role, address account) external; function renounceRole(bytes32 role, address account) external; } /** * @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 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 {_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 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]{20}) is missing role (0x[0-9a-f]{32})$/ * * _Available since v4.1._ */ modifier onlyRole(bytes32 role) { _checkRole(role, _msgSender()); _; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view override returns (bool) { return _roles[role].members[account]; } /** * @dev Revert with a standard message if `account` is missing `role`. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{20}) is missing role (0x[0-9a-f]{32})$/ */ function _checkRole(bytes32 role, address account) internal view { 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 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 granted `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}. * ==== */ 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 { emit RoleAdminChanged(role, getRoleAdmin(role), adminRole); _roles[role].adminRole = adminRole; } function _grantRole(bytes32 role, address account) private { if (!hasRole(role, account)) { _roles[role].members[account] = true; emit RoleGranted(role, account, _msgSender()); } } function _revokeRole(bytes32 role, address account) private { if (hasRole(role, account)) { _roles[role].members[account] = false; emit RoleRevoked(role, account, _msgSender()); } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./AccessControl.sol"; import "./EnumerableSet.sol"; /** * @dev External interface of AccessControlEnumerable declared to support ERC165 detection. */ interface IAccessControlEnumerable { function getRoleMember(bytes32 role, uint256 index) external view returns (address); function getRoleMemberCount(bytes32 role) external view returns (uint256); } /** * @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 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 override returns (uint256) { return _roleMembers[role].length(); } /** * @dev Overload {grantRole} to track enumerable memberships */ function grantRole(bytes32 role, address account) public virtual override { super.grantRole(role, account); _roleMembers[role].add(account); } /** * @dev Overload {revokeRole} to track enumerable memberships */ function revokeRole(bytes32 role, address account) public virtual override { super.revokeRole(role, account); _roleMembers[role].remove(account); } /** * @dev Overload {renounceRole} to track enumerable memberships */ function renounceRole(bytes32 role, address account) public virtual override { super.renounceRole(role, account); _roleMembers[role].remove(account); } /** * @dev Overload {_setupRole} to track enumerable memberships */ function _setupRole(bytes32 role, address account) internal virtual override { super._setupRole(role, account); _roleMembers[role].add(account); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) private pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT 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 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]; } // 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); } // 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)))); } // 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)); } }
// SPDX-License-Identifier: MIT 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 pragma solidity ^0.8.0; import "./IERC20.sol"; import "./IERC20Metadata.sol"; import "./Context.sol"; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin guidelines: functions revert instead * of returning `false` on failure. This behavior is nonetheless conventional * and does not conflict with the expectations of ERC20 applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20, IERC20Metadata { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The default value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5,05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless this function is * overridden; * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public virtual override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(_msgSender(), spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * Requirements: * * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for ``sender``'s tokens of at least * `amount`. */ function transferFrom( address sender, address recipient, uint256 amount ) public virtual override returns (bool) { _transfer(sender, recipient, amount); uint256 currentAllowance = _allowances[sender][_msgSender()]; require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance"); unchecked { _approve(sender, _msgSender(), currentAllowance - amount); } return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { uint256 currentAllowance = _allowances[_msgSender()][spender]; require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(_msgSender(), spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `sender` to `recipient`. * * This internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer( address sender, address recipient, uint256 amount ) internal virtual { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(sender, recipient, amount); uint256 senderBalance = _balances[sender]; require(senderBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[sender] = senderBalance - amount; } _balances[recipient] += amount; emit Transfer(sender, recipient, amount); _afterTokenTransfer(sender, recipient, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; _balances[account] += amount; emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; } _totalSupply -= amount; emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve( address owner, address spender, uint256 amount ) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens 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 amount ) 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, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been 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 _afterTokenTransfer( address from, address to, uint256 amount ) internal virtual {} }
// SPDX-License-Identifier: MIT 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 overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { require(operator != _msgSender(), "ERC721: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { 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 {} }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./ERC721.sol"; import "./Context.sol"; /** * @title ERC721 Burnable Token * @dev ERC721 Token that can be irreversibly burned (destroyed). */ abstract contract ERC721Burnable is Context, ERC721 { /** * @dev Burns `tokenId`. See {ERC721-_burn}. * * Requirements: * * - The caller must own `tokenId` or be an approved operator. */ function burn(uint256 tokenId) public virtual { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721Burnable: caller is not owner nor approved"); _burn(tokenId); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./ERC721.sol"; import "./IERC721Enumerable.sol"; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./ERC721.sol"; import "./Pausable.sol"; /** * @dev ERC721 token with pausable token transfers, minting and burning. * * Useful for scenarios such as preventing trades until the end of an evaluation * period, or having an emergency switch for freezing all token transfers in the * event of a large bug. */ abstract contract ERC721Pausable is ERC721, Pausable { /** * @dev See {ERC721-_beforeTokenTransfer}. * * Requirements: * * - the contract must not be paused. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); require(!paused(), "ERC721Pausable: token transfer while paused"); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC20.sol"; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); }
// SPDX-License-Identifier: MIT 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`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC721.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); }
// SPDX-License-Identifier: MIT 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 pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; interface LinkTokenInterface { function allowance( address owner, address spender ) external view returns ( uint256 remaining ); function approve( address spender, uint256 value ) external returns ( bool success ); function balanceOf( address owner ) external view returns ( uint256 balance ); function decimals() external view returns ( uint8 decimalPlaces ); function decreaseApproval( address spender, uint256 addedValue ) external returns ( bool success ); function increaseApproval( address spender, uint256 subtractedValue ) external; function name() external view returns ( string memory tokenName ); function symbol() external view returns ( string memory tokenSymbol ); function totalSupply() external view returns ( uint256 totalTokensIssued ); function transfer( address to, uint256 value ) external returns ( bool success ); function transferAndCall( address to, uint256 value, bytes calldata data ) external returns ( bool success ); function transferFrom( address from, address to, uint256 value ) external returns ( bool success ); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _setOwner(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _setOwner(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./Context.sol"; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { require(!paused(), "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { require(paused(), "Pausable: not paused"); _; } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } }
// SPDX-License-Identifier: MIT 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); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./LinkTokenInterface.sol"; import "./VRFRequestIDBase.sol"; /** **************************************************************************** * @notice Interface for contracts using VRF randomness * ***************************************************************************** * @dev PURPOSE * * @dev Reggie the Random Oracle (not his real job) wants to provide randomness * @dev to Vera the verifier in such a way that Vera can be sure he's not * @dev making his output up to suit himself. Reggie provides Vera a public key * @dev to which he knows the secret key. Each time Vera provides a seed to * @dev Reggie, he gives back a value which is computed completely * @dev deterministically from the seed and the secret key. * * @dev Reggie provides a proof by which Vera can verify that the output was * @dev correctly computed once Reggie tells it to her, but without that proof, * @dev the output is indistinguishable to her from a uniform random sample * @dev from the output space. * * @dev The purpose of this contract is to make it easy for unrelated contracts * @dev to talk to Vera the verifier about the work Reggie is doing, to provide * @dev simple access to a verifiable source of randomness. * ***************************************************************************** * @dev USAGE * * @dev Calling contracts must inherit from VRFConsumerBase, and can * @dev initialize VRFConsumerBase's attributes in their constructor as * @dev shown: * * @dev contract VRFConsumer { * @dev constuctor(<other arguments>, address _vrfCoordinator, address _link) * @dev VRFConsumerBase(_vrfCoordinator, _link) public { * @dev <initialization with other arguments goes here> * @dev } * @dev } * * @dev The oracle will have given you an ID for the VRF keypair they have * @dev committed to (let's call it keyHash), and have told you the minimum LINK * @dev price for VRF service. Make sure your contract has sufficient LINK, and * @dev call requestRandomness(keyHash, fee, seed), where seed is the input you * @dev want to generate randomness from. * * @dev Once the VRFCoordinator has received and validated the oracle's response * @dev to your request, it will call your contract's fulfillRandomness method. * * @dev The randomness argument to fulfillRandomness is the actual random value * @dev generated from your seed. * * @dev The requestId argument is generated from the keyHash and the seed by * @dev makeRequestId(keyHash, seed). If your contract could have concurrent * @dev requests open, you can use the requestId to track which seed is * @dev associated with which randomness. See VRFRequestIDBase.sol for more * @dev details. (See "SECURITY CONSIDERATIONS" for principles to keep in mind, * @dev if your contract could have multiple requests in flight simultaneously.) * * @dev Colliding `requestId`s are cryptographically impossible as long as seeds * @dev differ. (Which is critical to making unpredictable randomness! See the * @dev next section.) * * ***************************************************************************** * @dev SECURITY CONSIDERATIONS * * @dev A method with the ability to call your fulfillRandomness method directly * @dev could spoof a VRF response with any random value, so it's critical that * @dev it cannot be directly called by anything other than this base contract * @dev (specifically, by the VRFConsumerBase.rawFulfillRandomness method). * * @dev For your users to trust that your contract's random behavior is free * @dev from malicious interference, it's best if you can write it so that all * @dev behaviors implied by a VRF response are executed *during* your * @dev fulfillRandomness method. If your contract must store the response (or * @dev anything derived from it) and use it later, you must ensure that any * @dev user-significant behavior which depends on that stored value cannot be * @dev manipulated by a subsequent VRF request. * * @dev Similarly, both miners and the VRF oracle itself have some influence * @dev over the order in which VRF responses appear on the blockchain, so if * @dev your contract could have multiple VRF requests in flight simultaneously, * @dev you must ensure that the order in which the VRF responses arrive cannot * @dev be used to manipulate your contract's user-significant behavior. * * @dev Since the ultimate input to the VRF is mixed with the block hash of the * @dev block in which the request is made, user-provided seeds have no impact * @dev on its economic security properties. They are only included for API * @dev compatability with previous versions of this contract. * * @dev Since the block hash of the block which contains the requestRandomness * @dev call is mixed into the input to the VRF *last*, a sufficiently powerful * @dev miner could, in principle, fork the blockchain to evict the block * @dev containing the request, forcing the request to be included in a * @dev different block with a different hash, and therefore a different input * @dev to the VRF. However, such an attack would incur a substantial economic * @dev cost. This cost scales with the number of blocks the VRF oracle waits * @dev until it calls responds to a request. */ abstract contract VRFConsumerBase is VRFRequestIDBase { /** * @notice fulfillRandomness handles the VRF response. Your contract must * @notice implement it. See "SECURITY CONSIDERATIONS" above for important * @notice principles to keep in mind when implementing your fulfillRandomness * @notice method. * * @dev VRFConsumerBase expects its subcontracts to have a method with this * @dev signature, and will call it once it has verified the proof * @dev associated with the randomness. (It is triggered via a call to * @dev rawFulfillRandomness, below.) * * @param requestId The Id initially returned by requestRandomness * @param randomness the VRF output */ function fulfillRandomness( bytes32 requestId, uint256 randomness ) internal virtual; /** * @dev In order to keep backwards compatibility we have kept the user * seed field around. We remove the use of it because given that the blockhash * enters later, it overrides whatever randomness the used seed provides. * Given that it adds no security, and can easily lead to misunderstandings, * we have removed it from usage and can now provide a simpler API. */ uint256 constant private USER_SEED_PLACEHOLDER = 0; /** * @notice requestRandomness initiates a request for VRF output given _seed * * @dev The fulfillRandomness method receives the output, once it's provided * @dev by the Oracle, and verified by the vrfCoordinator. * * @dev The _keyHash must already be registered with the VRFCoordinator, and * @dev the _fee must exceed the fee specified during registration of the * @dev _keyHash. * * @dev The _seed parameter is vestigial, and is kept only for API * @dev compatibility with older versions. It can't *hurt* to mix in some of * @dev your own randomness, here, but it's not necessary because the VRF * @dev oracle will mix the hash of the block containing your request into the * @dev VRF seed it ultimately uses. * * @param _keyHash ID of public key against which randomness is generated * @param _fee The amount of LINK to send with the request * * @return requestId unique ID for this request * * @dev The returned requestId can be used to distinguish responses to * @dev concurrent requests. It is passed as the first argument to * @dev fulfillRandomness. */ function requestRandomness( bytes32 _keyHash, uint256 _fee ) internal returns ( bytes32 requestId ) { LINK.transferAndCall(vrfCoordinator, _fee, abi.encode(_keyHash, USER_SEED_PLACEHOLDER)); // This is the seed passed to VRFCoordinator. The oracle will mix this with // the hash of the block containing this request to obtain the seed/input // which is finally passed to the VRF cryptographic machinery. uint256 vRFSeed = makeVRFInputSeed(_keyHash, USER_SEED_PLACEHOLDER, address(this), nonces[_keyHash]); // nonces[_keyHash] must stay in sync with // VRFCoordinator.nonces[_keyHash][this], which was incremented by the above // successful LINK.transferAndCall (in VRFCoordinator.randomnessRequest). // This provides protection against the user repeating their input seed, // which would result in a predictable/duplicate output, if multiple such // requests appeared in the same block. nonces[_keyHash] = nonces[_keyHash] + 1; return makeRequestId(_keyHash, vRFSeed); } LinkTokenInterface immutable internal LINK; address immutable private vrfCoordinator; // Nonces for each VRF key from which randomness has been requested. // // Must stay in sync with VRFCoordinator[_keyHash][this] mapping(bytes32 /* keyHash */ => uint256 /* nonce */) private nonces; /** * @param _vrfCoordinator address of VRFCoordinator contract * @param _link address of LINK token contract * * @dev https://docs.chain.link/docs/link-token-contracts */ constructor( address _vrfCoordinator, address _link ) { vrfCoordinator = _vrfCoordinator; LINK = LinkTokenInterface(_link); } // rawFulfillRandomness is called by VRFCoordinator when it receives a valid VRF // proof. rawFulfillRandomness then calls fulfillRandomness, after validating // the origin of the call function rawFulfillRandomness( bytes32 requestId, uint256 randomness ) external { require(msg.sender == vrfCoordinator, "Only VRFCoordinator can fulfill"); fulfillRandomness(requestId, randomness); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; contract VRFRequestIDBase { /** * @notice returns the seed which is actually input to the VRF coordinator * * @dev To prevent repetition of VRF output due to repetition of the * @dev user-supplied seed, that seed is combined in a hash with the * @dev user-specific nonce, and the address of the consuming contract. The * @dev risk of repetition is mostly mitigated by inclusion of a blockhash in * @dev the final seed, but the nonce does protect against repetition in * @dev requests which are included in a single block. * * @param _userSeed VRF seed input provided by user * @param _requester Address of the requesting contract * @param _nonce User-specific nonce at the time of the request */ function makeVRFInputSeed( bytes32 _keyHash, uint256 _userSeed, address _requester, uint256 _nonce ) internal pure returns ( uint256 ) { return uint256(keccak256(abi.encode(_keyHash, _userSeed, _requester, _nonce))); } /** * @notice Returns the id for this request * @param _keyHash The serviceAgreement ID to be used for this request * @param _vRFInputSeed The seed to be passed directly to the VRF * @return The id for this request * * @dev Note that _vRFInputSeed is not the seed passed by the consuming * @dev contract, but the one generated by makeVRFInputSeed */ function makeRequestId( bytes32 _keyHash, uint256 _vRFInputSeed ) internal pure returns ( bytes32 ) { return keccak256(abi.encodePacked(_keyHash, _vRFInputSeed)); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"chainlinkTokenAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAvailableBezogiURILength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBaseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBezogiPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMaxNFTSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPresaleAvailable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":[],"name":"getSaleAvailable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSummonAvailable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getTokenSummoned","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalSummonedBezogi","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTransferAvailable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getUriSetAtIndex","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":[{"internalType":"address[]","name":"_addressArray","type":"address[]"}],"name":"minterMintWithSummon","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"minterTokenBlacklistAdd","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"minterTokenBlacklistRemove","outputs":[],"stateMutability":"nonpayable","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":"address[]","name":"_addressArray","type":"address[]"}],"name":"ownerAirdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxNFTSupply","type":"uint256"}],"name":"ownerInitMaxNFTSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"total","type":"uint256"}],"name":"ownerMintNFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addressArray","type":"address[]"}],"name":"ownerPresaleWhitelistAdd","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addressArray","type":"address[]"}],"name":"ownerPresaleWhitelistRemove","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseTokenURI","type":"string"}],"name":"ownerSetBaseTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"bezogiPrice","type":"uint256"}],"name":"ownerSetBezogiPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"presaleAvailable","type":"bool"}],"name":"ownerSetPresaleAvailable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"saleAvailable","type":"bool"}],"name":"ownerSetSaleAvailable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"summonAvailable","type":"bool"}],"name":"ownerSetSummonAvailable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"transferAvailable","type":"bool"}],"name":"ownerSetTransferAvailable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"ownerWithdrawLink","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"ownerWithdrawWETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicGetNFTPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"publicGetWETHAllowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfNfts","type":"uint256"}],"name":"publicMintNFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"publicPresaleWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"publicSummonNFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"publicTokenBlacklisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"requestId","type":"bytes32"},{"internalType":"uint256","name":"randomness","type":"uint256"}],"name":"rawFulfillRandomness","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"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":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60c06040526000600e819055601455670de0b6b3a76400006016556017805463ffff00001961ffff19909116610100171690553480156200003f57600080fd5b50733d2341adb2d31f1c5530cdc622016af293177ae073b0897686c545045afc77cf20ec7a532e3120e0f16040518060400160405280600781526020016642657a6f67697360c81b8152506040518060400160405280600781526020016642455a4f47495360c81b8152508160029080519060200190620000c292919062000393565b508051620000d890600390602084019062000393565b5050600c805460ff1916905550620000f9620000f3620001a8565b620001ac565b6001600160601b0319606092831b811660a05290821b1660805260408051918201905260258082526200517d60208301398051620001409160109160209091019062000393565b507ff86195cf7690c55907b2b611ebb7343a6f649bff128701cc542f0569e2c549da601b55655af3107a4000601c55600f80546001600160a01b031916737ceb23fd6bc0add59e62ac25578270cff1b9f619179055620001a260003362000206565b62000476565b3390565b600c80546001600160a01b03838116610100818102610100600160a81b031985161790945560405193909204169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6200021d82826200024960201b6200214b1760201c565b6000828152600160209081526040909120620002449183906200215562000259821b17901c565b505050565b62000255828262000279565b5050565b600062000270836001600160a01b03841662000303565b90505b92915050565b62000285828262000352565b62000255576000828152602081815260408083206001600160a01b03851684529091529020805460ff19166001179055620002bf620001a8565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b60006200031183836200037b565b620003495750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915562000273565b50600062000273565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b60009081526001919091016020526040902054151590565b828054620003a19062000439565b90600052602060002090601f016020900481019282620003c5576000855562000410565b82601f10620003e057805160ff191683800117855562000410565b8280016001018555821562000410579182015b8281111562000410578251825591602001919060010190620003f3565b506200041e92915062000422565b5090565b5b808211156200041e576000815560010162000423565b6002810460018216806200044e57607f821691505b602082108114156200047057634e487b7160e01b600052602260045260246000fd5b50919050565b60805160601c60a05160601c614ccd620004b0600039600081816113a70152612e0e0152600081816126980152612ddf0152614ccd6000f3fe608060405234801561001057600080fd5b50600436106103e65760003560e01c80638028e80c1161020a578063ae68ed0f11610125578063d2f6b2f7116100b8578063e985e9c511610087578063e985e9c5146107ca578063f2fde38b146107dd578063f75adec8146107f0578063fb91676c14610803578063fe2e4b851461080b576103e6565b8063d2f6b2f714610794578063d5444a3e1461079c578063d547741f146107a4578063e50b8f90146107b7576103e6565b8063c5f5579c116100f4578063c5f5579c14610753578063c87b56dd1461075b578063ca15c8731461076e578063cce2034e14610781576103e6565b8063ae68ed0f14610712578063b603595414610725578063b88d4fde14610738578063bdc32be01461074b576103e6565b80639a1466831161019d578063a217fddf1161016c578063a217fddf146106d1578063a22cb465146106d9578063a6472b34146106ec578063a8061b20146106ff576103e6565b80639a146683146106a65780639e63041b146106ae578063a0e5916e146106c1578063a165b160146106c9576103e6565b80639010d07c116101d95780639010d07c1461066557806391d148541461067857806394985ddd1461068b57806395d89b411461069e576103e6565b80638028e80c1461062f578063832cbfd6146106425780638456cb59146106555780638da5cb5b1461065d576103e6565b8063461a4096116103055780636352211e11610298578063715018a611610267578063715018a6146105f15780637206e3e5146105f9578063775ce0331461060c578063786234cc1461061f57806378b3689c14610627576103e6565b80636352211e146105bb5780636c8c59d2146105ce5780637020b511146105d657806370a08231146105de576103e6565b806355b3da7e116102d457806355b3da7e1461057a5780635be51b671461058d5780635c3d7419146105a05780635c975abb146105b3576103e6565b8063461a40961461052e5780634ac4a792146105415780634d9181d4146105545780634f6ccce714610567576103e6565b806323b872dd1161037d57806336568abe1161034c57806336568abe146104ed5780633f4ba83a1461050057806342842e0e1461050857806342966c681461051b576103e6565b806323b872dd146104a1578063248a9ca3146104b45780632f2ff15d146104c75780632f745c59146104da576103e6565b8063177e2cf8116103b9578063177e2cf81461045e57806317c704dd1461047157806318160ddd1461048457806319b25db814610499576103e6565b806301ffc9a7146103eb57806306fdde0314610414578063081812fc14610429578063095ea7b314610449575b600080fd5b6103fe6103f9366004613a7f565b61081e565b60405161040b9190613ccb565b60405180910390f35b61041c610831565b60405161040b9190613d03565b61043c610437366004613a24565b6108c4565b60405161040b9190613bf3565b61045c610457366004613915565b610910565b005b61045c61046c366004613a24565b6109a8565b61045c61047f36600461393e565b610a47565b61048c610b47565b60405161040b9190613cd6565b61048c610b4d565b61045c6104af36600461382b565b610b53565b61048c6104c2366004613a24565b610b8b565b61045c6104d5366004613a3c565b610ba0565b61048c6104e8366004613915565b610bc2565b61045c6104fb366004613a3c565b610c17565b61045c610c39565b61045c61051636600461382b565b610c82565b61045c610529366004613a24565b610c9d565b6103fe61053c366004613a24565b610cd0565b61048c61054f3660046137df565b610cf2565b61045c610562366004613a24565b610d75565b61048c610575366004613a24565b610eac565b61045c61058836600461393e565b610f07565b61045c61059b3660046139ec565b610fc0565b61048c6105ae366004613a24565b61101b565b6103fe611028565b61043c6105c9366004613a24565b611031565b61048c611066565b61043c611100565b61048c6105ec3660046137df565b611118565b61045c61115c565b61045c610607366004613a24565b6111a5565b61045c61061a366004613ab7565b611218565b6103fe61126a565b6103fe61127a565b6103fe61063d3660046137df565b611289565b61045c6106503660046139ec565b6112a7565b61045c6112f9565b61043c611340565b61043c610673366004613a5e565b611354565b6103fe610686366004613a3c565b611373565b61045c610699366004613a5e565b61139c565b61041c6113ee565b61045c6113fd565b61045c6106bc36600461393e565b611551565b6103fe6115fd565b61048c611606565b61048c61160c565b61045c6106e73660046138df565b611611565b61045c6106fa366004613a24565b6116df565b61045c61070d366004613915565b611a9c565b61045c61072036600461393e565b611b15565b61045c6107333660046139ec565b611bb7565b61045c610746366004613866565b611c14565b61041c611c53565b61048c611c62565b61041c610769366004613a24565b611c68565b61048c61077c366004613a24565b611da4565b6103fe61078f366004613915565b611dbb565b6103fe611ddd565b61048c611deb565b61045c6107b2366004613a3c565b611e07565b61045c6107c5366004613915565b611e11565b6103fe6107d83660046137f9565b611eb0565b61045c6107eb3660046137df565b611ede565b61045c6107fe366004613a24565b611f4c565b61045c611f90565b61045c6108193660046139ec565b6120f2565b60006108298261216a565b90505b919050565b60606002805461084090614bc7565b80601f016020809104026020016040519081016040528092919081815260200182805461086c90614bc7565b80156108b95780601f1061088e576101008083540402835291602001916108b9565b820191906000526020600020905b81548152906001019060200180831161089c57829003601f168201915b505050505090505b90565b60006108cf8261218f565b6108f45760405162461bcd60e51b81526004016108eb90614405565b60405180910390fd5b506000908152600660205260409020546001600160a01b031690565b600061091b82611031565b9050806001600160a01b0316836001600160a01b0316141561094f5760405162461bcd60e51b81526004016108eb906145bd565b806001600160a01b03166109616121ac565b6001600160a01b0316148061097d575061097d816107d86121ac565b6109995760405162461bcd60e51b81526004016108eb906141f1565b6109a383836121b0565b505050565b6109b06121ac565b6001600160a01b03166109c1611340565b6001600160a01b0316146109e75760405162461bcd60e51b81526004016108eb90614451565b600e548111610a085760405162461bcd60e51b81526004016108eb90614866565b60006001600e54610a199190614b22565b90505b818111610a4157610a2e60118261221e565b5080610a3981614c02565b915050610a1c565b50600e55565b610a717f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a633611373565b610a8d5760405162461bcd60e51b81526004016108eb90614a21565b6000610a97610b47565b9050600e54811015610abb5760405162461bcd60e51b81526004016108eb9061415a565b60005b82518110156109a357610acf610b47565b91506000838281518110610af357634e487b7160e01b600052603260045260246000fd5b60200260200101519050610b07818461222a565b610b2383610b1e610b19826001614b22565b612244565b612367565b600e54610b31906001614b22565b600e555080610b3f81614c02565b915050610abe565b600a5490565b60165490565b610b64610b5e6121ac565b82612386565b610b805760405162461bcd60e51b81526004016108eb9061474c565b6109a3838383612403565b60009081526020819052604090206001015490565b610baa8282612530565b60008281526001602052604090206109a39082612155565b6000610bcd83611118565b8210610beb5760405162461bcd60e51b81526004016108eb90613e4b565b506001600160a01b03821660009081526008602090815260408083208484529091529020545b92915050565b610c218282612554565b60008281526001602052604090206109a39082612596565b610c416121ac565b6001600160a01b0316610c52611340565b6001600160a01b031614610c785760405162461bcd60e51b81526004016108eb90614451565b610c806125ab565b565b6109a383838360405180602001604052806000815250611c14565b610ca8610b5e6121ac565b610cc45760405162461bcd60e51b81526004016108eb906149d1565b610ccd81612619565b50565b60008181526018602052604081208054610ce990614bc7565b15159392505050565b600f54604051636eb1769f60e11b81526000916001600160a01b03169063dd62ed3e90610d259085903090600401613c07565b60206040518083038186803b158015610d3d57600080fd5b505afa158015610d51573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108299190613afd565b610d7d61126a565b610d995760405162461bcd60e51b81526004016108eb90614586565b610da28161218f565b610dbe5760405162461bcd60e51b81526004016108eb9061410e565b610dc781610cd0565b15610de45760405162461bcd60e51b81526004016108eb906144cf565b60008181526015602052604090205460ff1615610e135760405162461bcd60e51b81526004016108eb9061469c565b6000610e1d611deb565b905060008111610e3f5760405162461bcd60e51b81526004016108eb90613e14565b6000610e4a83611031565b9050336001600160a01b03821614610e745760405162461bcd60e51b81526004016108eb906146d3565b6000838152601560205260408120805460ff19166001179055610e95612691565b600090815260136020526040902093909355505050565b6000610eb6610b47565b8210610ed45760405162461bcd60e51b81526004016108eb906148ad565b600a8281548110610ef557634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b610f0f6121ac565b6001600160a01b0316610f20611340565b6001600160a01b031614610f465760405162461bcd60e51b81526004016108eb90614451565b60005b8151811015610fbc57600160196000848481518110610f7857634e487b7160e01b600052603260045260246000fd5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905580610fb481614c02565b915050610f49565b5050565b610fc86121ac565b6001600160a01b0316610fd9611340565b6001600160a01b031614610fff5760405162461bcd60e51b81526004016108eb90614451565b60178054911515620100000262ff000019909216919091179055565b600061082960118361275e565b600c5460ff1690565b6000818152600460205260408120546001600160a01b0316806108295760405162461bcd60e51b81526004016108eb90614298565b600080611071610b47565b905061100081106110865750506016546108c1565b610fa081106110a0576702386f26fc1000009150506108c1565b610bb881106110ba576701550f7dca7000009150506108c1565b6107d081106110d35766e35fa931a000009150506108c1565b6102ee81106110ec576671afd498d000009150506108c1565b660b5e620f4800009150506108c1565b5090565b73b0897686c545045afc77cf20ec7a532e3120e0f190565b60006001600160a01b0382166111405760405162461bcd60e51b81526004016108eb9061424e565b506001600160a01b031660009081526005602052604090205490565b6111646121ac565b6001600160a01b0316611175611340565b6001600160a01b03161461119b5760405162461bcd60e51b81526004016108eb90614451565b610c80600061276a565b6111ad6121ac565b6001600160a01b03166111be611340565b6001600160a01b0316146111e45760405162461bcd60e51b81526004016108eb90614451565b60005b81811015610fbc5760006111f9610b47565b9050611205338261222a565b508061121081614c02565b9150506111e7565b6112206121ac565b6001600160a01b0316611231611340565b6001600160a01b0316146112575760405162461bcd60e51b81526004016108eb90614451565b8051610fbc9060109060208401906136a3565b6017546301000000900460ff1690565b60175462010000900460ff1690565b6001600160a01b031660009081526019602052604090205460ff1690565b6112af6121ac565b6001600160a01b03166112c0611340565b6001600160a01b0316146112e65760405162461bcd60e51b81526004016108eb90614451565b6017805460ff1916911515919091179055565b6113016121ac565b6001600160a01b0316611312611340565b6001600160a01b0316146113385760405162461bcd60e51b81526004016108eb90614451565b610c806127c4565b600c5461010090046001600160a01b031690565b600082815260016020526040812061136c908361275e565b9392505050565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146113e45760405162461bcd60e51b81526004016108eb90614506565b610fbc828261281f565b60606003805461084090614bc7565b6114056121ac565b6001600160a01b0316611416611340565b6001600160a01b03161461143c5760405162461bcd60e51b81526004016108eb90614451565b600f546040516370a0823160e01b81526001600160a01b039091169063a9059cbb90339083906370a0823190611476903090600401613bf3565b60206040518083038186803b15801561148e57600080fd5b505afa1580156114a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114c69190613afd565b6040518363ffffffff1660e01b81526004016114e3929190613c82565b602060405180830381600087803b1580156114fd57600080fd5b505af1158015611511573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115359190613a08565b610c805760405162461bcd60e51b81526004016108eb90613ee8565b6115596121ac565b6001600160a01b031661156a611340565b6001600160a01b0316146115905760405162461bcd60e51b81526004016108eb90614451565b60005b8151811015610fbc57601960008383815181106115c057634e487b7160e01b600052603260045260246000fd5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff19169055806115f581614c02565b915050611593565b60175460ff1690565b600e5490565b600081565b6116196121ac565b6001600160a01b0316826001600160a01b0316141561164a5760405162461bcd60e51b81526004016108eb90614045565b80600760006116576121ac565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff19169215159290921790915561169b6121ac565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516116d39190613ccb565b60405180910390a35050565b600e546116ea610b47565b106117075760405162461bcd60e51b81526004016108eb906145fe565b600081116117275760405162461bcd60e51b81526004016108eb90614665565b600e5481611733610b47565b61173d9190614b22565b111561175b5760405162461bcd60e51b81526004016108eb90613fd1565b6117636115fd565b61177f5760405162461bcd60e51b81526004016108eb906149a3565b80611788611066565b6117929190614b4e565b600f54604051636eb1769f60e11b81526001600160a01b039091169063dd62ed3e906117c49033903090600401613c07565b60206040518083038186803b1580156117dc57600080fd5b505afa1580156117f0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118149190613afd565b10156118325760405162461bcd60e51b81526004016108eb9061479d565b8061183b611066565b6118459190614b4e565b600f546040516370a0823160e01b81526001600160a01b03909116906370a0823190611875903390600401613bf3565b60206040518083038186803b15801561188d57600080fd5b505afa1580156118a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118c59190613afd565b10156118e35760405162461bcd60e51b81526004016108eb9061462e565b6118eb611ddd565b15611975576118f933611289565b6119155760405162461bcd60e51b81526004016108eb9061407c565b60038111156119365760405162461bcd60e51b81526004016108eb906147df565b60008161194233611118565b61194c9190614b22565b9050600381111561196f5760405162461bcd60e51b81526004016108eb90614946565b506119d1565b600a8111156119965760405162461bcd60e51b81526004016108eb9061470a565b6000816119a233611118565b6119ac9190614b22565b9050600a8111156119cf5760405162461bcd60e51b81526004016108eb9061453d565b505b600f546001600160a01b03166323b872dd3330846119ed611066565b6119f79190614b4e565b6040518463ffffffff1660e01b8152600401611a1593929190613c21565b602060405180830381600087803b158015611a2f57600080fd5b505af1158015611a43573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a679190613a08565b5060005b81811015610fbc576000611a7d610b47565b9050611a89338261222a565b5080611a9481614c02565b915050611a6b565b611ac67f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a633611373565b80611ad75750611ad7600033611373565b611af35760405162461bcd60e51b81526004016108eb90614364565b6001600160a01b0382166000908152601a602052604090206109a390826128ce565b611b1d6121ac565b6001600160a01b0316611b2e611340565b6001600160a01b031614611b545760405162461bcd60e51b81526004016108eb90614451565b60005b8151811015610fbc576000828281518110611b8257634e487b7160e01b600052603260045260246000fd5b602002602001015190506000611b96610b47565b9050611ba2828261222a565b50508080611baf90614c02565b915050611b57565b611bbf6121ac565b6001600160a01b0316611bd0611340565b6001600160a01b031614611bf65760405162461bcd60e51b81526004016108eb90614451565b6017805491151563010000000263ff00000019909216919091179055565b611c25611c1f6121ac565b83612386565b611c415760405162461bcd60e51b81526004016108eb9061474c565b611c4d848484846128da565b50505050565b60606010805461084090614bc7565b60145490565b6060611c738261218f565b611c8f5760405162461bcd60e51b81526004016108eb906143b4565b60008281526018602052604081208054611ca890614bc7565b80601f0160208091040260200160405190810160405280929190818152602001828054611cd490614bc7565b8015611d215780601f10611cf657610100808354040283529160200191611d21565b820191906000526020600020905b815481529060010190602001808311611d0457829003601f168201915b505050505090506000611d32611c53565b9050805160001415611d465750905061082c565b815115611d78578082604051602001611d60929190613b4f565b6040516020818303038152906040529250505061082c565b80604051806040016040528060018152602001600360fc1b815250604051602001611d60929190613b4f565b60008181526001602052604081206108299061290d565b6001600160a01b0382166000908152601a6020526040812061136c9083612918565b601754610100900460ff1690565b6000611df5611c62565b600e54611e029190614b6d565b905090565b610c218282612924565b611e3b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a633611373565b80611e4c5750611e4c600033611373565b611e685760405162461bcd60e51b81526004016108eb906148f9565b6001600160a01b038216611e8e5760405162461bcd60e51b81526004016108eb90613d4b565b6001600160a01b0382166000908152601a602052604090206109a3908261221e565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b611ee66121ac565b6001600160a01b0316611ef7611340565b6001600160a01b031614611f1d5760405162461bcd60e51b81526004016108eb90614451565b6001600160a01b038116611f435760405162461bcd60e51b81526004016108eb90613f1f565b610ccd8161276a565b611f546121ac565b6001600160a01b0316611f65611340565b6001600160a01b031614611f8b5760405162461bcd60e51b81526004016108eb90614451565b601655565b611f986121ac565b6001600160a01b0316611fa9611340565b6001600160a01b031614611fcf5760405162461bcd60e51b81526004016108eb90614451565b6000611fd9611100565b9050806001600160a01b031663a9059cbb33836001600160a01b03166370a08231306040518263ffffffff1660e01b81526004016120179190613bf3565b60206040518083038186803b15801561202f57600080fd5b505afa158015612043573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120679190613afd565b6040518363ffffffff1660e01b8152600401612084929190613c82565b602060405180830381600087803b15801561209e57600080fd5b505af11580156120b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120d69190613a08565b610ccd5760405162461bcd60e51b81526004016108eb9061482f565b6120fa6121ac565b6001600160a01b031661210b611340565b6001600160a01b0316146121315760405162461bcd60e51b81526004016108eb90614451565b601780549115156101000261ff0019909216919091179055565b610fbc8282612943565b600061136c836001600160a01b0384166129c8565b60006001600160e01b0319821663780e9d6360e01b1480610829575061082982612a12565b6000908152600460205260409020546001600160a01b0316151590565b3390565b600081815260066020526040902080546001600160a01b0319166001600160a01b03841690811790915581906121e582611031565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061136c83836129c8565b610fbc828260405180602001604052806000815250612a52565b60608161226957506040805180820190915260018152600360fc1b602082015261082c565b8160005b8115612293578061227d81614c02565b915061228c9050600a83614b3a565b915061226d565b60008167ffffffffffffffff8111156122bc57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156122e6576020820181803683370190505b5090505b841561235f576122fb600183614b6d565b9150612308600a86614c1d565b612313906030614b22565b60f81b81838151811061233657634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350612358600a86614b3a565b94506122ea565b949350505050565b6123718282612a85565b60145461237f906001614b22565b6014555050565b60006123918261218f565b6123ad5760405162461bcd60e51b81526004016108eb9061410e565b60006123b883611031565b9050806001600160a01b0316846001600160a01b031614806123f35750836001600160a01b03166123e8846108c4565b6001600160a01b0316145b8061235f575061235f8185611eb0565b826001600160a01b031661241682611031565b6001600160a01b03161461243c5760405162461bcd60e51b81526004016108eb90614486565b6001600160a01b0382166124625760405162461bcd60e51b81526004016108eb90614001565b61246d838383612ac9565b6124786000826121b0565b6001600160a01b03831660009081526005602052604081208054600192906124a1908490614b6d565b90915550506001600160a01b03821660009081526005602052604081208054600192906124cf908490614b22565b909155505060008181526004602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b61253982610b8b565b61254a816125456121ac565b612b30565b6109a38383612943565b61255c6121ac565b6001600160a01b0316816001600160a01b03161461258c5760405162461bcd60e51b81526004016108eb90614a66565b610fbc8282612b94565b600061136c836001600160a01b038416612c17565b6125b3611028565b6125cf5760405162461bcd60e51b81526004016108eb90613de6565b600c805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6126026121ac565b60405161260f9190613bf3565b60405180910390a1565b612621611340565b6001600160a01b0316336001600160a01b0316146126515760405162461bcd60e51b81526004016108eb90613f65565b61265a81612d34565b6000818152601860205260409020805461267390614bc7565b159050610ccd576000818152601860205260408120610ccd91613723565b6000601c547f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b81526004016126e29190613bf3565b60206040518083038186803b1580156126fa57600080fd5b505afa15801561270e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127329190613afd565b10156127505760405162461bcd60e51b81526004016108eb906141c8565b611e02601b54601c54612ddb565b600061136c8383612f16565b600c80546001600160a01b03838116610100818102610100600160a81b031985161790945560405193909204169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6127cc611028565b156127e95760405162461bcd60e51b81526004016108eb9061419e565b600c805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586126026121ac565b6000612829611deb565b60008481526013602052604081205491925082156128c75761284b8385614c1d565b90506128568261218f565b8015612868575061286682610cd0565b155b8015612882575060008281526015602052604090205460ff165b156128c757600061289460118361275e565b90506128a383610b1e83612244565b6128ae6011826128ce565b50506000828152601560205260409020805460ff191690555b5050505050565b600061136c8383612c17565b6128e5848484612403565b6128f184848484612f4e565b611c4d5760405162461bcd60e51b81526004016108eb90613e96565b600061082982613069565b600061136c838361306d565b61292d82610b8b565b612939816125456121ac565b6109a38383612b94565b61294d8282611373565b610fbc576000828152602081815260408083206001600160a01b03851684529091529020805460ff191660011790556129846121ac565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b60006129d4838361306d565b612a0a57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610c11565b506000610c11565b60006001600160e01b031982166380ac58cd60e01b1480612a4357506001600160e01b03198216635b5e139f60e01b145b80610829575061082982613085565b612a5c83836130aa565b612a696000848484612f4e565b6109a35760405162461bcd60e51b81526004016108eb90613e96565b612a8e8261218f565b612aaa5760405162461bcd60e51b81526004016108eb906142e1565b600082815260186020908152604090912082516109a3928401906136a3565b6001600160a01b0383161580612ae25750612ae261127a565b612afe5760405162461bcd60e51b81526004016108eb90614ab5565b612b088382611dbb565b15612b255760405162461bcd60e51b81526004016108eb906140c1565b6109a3838383613189565b612b3a8282611373565b610fbc57612b52816001600160a01b031660146131b9565b612b5d8360206131b9565b604051602001612b6e929190613b7e565b60408051601f198184030181529082905262461bcd60e51b82526108eb91600401613d03565b612b9e8282611373565b15610fbc576000828152602081815260408083206001600160a01b03851684529091529020805460ff19169055612bd36121ac565b6001600160a01b0316816001600160a01b0316837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45050565b60008181526001830160205260408120548015612d2a576000612c3b600183614b6d565b8554909150600090612c4f90600190614b6d565b9050818114612cd0576000866000018281548110612c7d57634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905080876000018481548110612cae57634e487b7160e01b600052603260045260246000fd5b6000918252602080832090910192909255918252600188019052604090208390555b8554869080612cef57634e487b7160e01b600052603160045260246000fd5b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610c11565b6000915050610c11565b6000612d3f82611031565b9050612d4d81600084612ac9565b612d586000836121b0565b6001600160a01b0381166000908152600560205260408120805460019290612d81908490614b6d565b909155505060008281526004602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316634000aea07f000000000000000000000000000000000000000000000000000000000000000084866000604051602001612e42929190613b41565b6040516020818303038152906040526040518463ffffffff1660e01b8152600401612e6f93929190613c9b565b602060405180830381600087803b158015612e8957600080fd5b505af1158015612e9d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ec19190613a08565b506000838152600d6020526040812054612ee09085908390309061336b565b6000858152600d6020526040902054909150612efd906001614b22565b6000858152600d602052604090205561235f84826133a5565b6000826000018281548110612f3b57634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905092915050565b6000612f62846001600160a01b03166133d8565b1561305e57836001600160a01b031663150b7a02612f7e6121ac565b8786866040518563ffffffff1660e01b8152600401612fa09493929190613c45565b602060405180830381600087803b158015612fba57600080fd5b505af1925050508015612fea575060408051601f3d908101601f19168201909252612fe791810190613a9b565b60015b613044573d808015613018576040519150601f19603f3d011682016040523d82523d6000602084013e61301d565b606091505b50805161303c5760405162461bcd60e51b81526004016108eb90613e96565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061235f565b506001949350505050565b5490565b60009081526001919091016020526040902054151590565b60006001600160e01b03198216635a05180f60e01b14806108295750610829826133de565b6001600160a01b0382166130d05760405162461bcd60e51b81526004016108eb9061432f565b6130d98161218f565b156130f65760405162461bcd60e51b81526004016108eb90613f9a565b61310260008383612ac9565b6001600160a01b038216600090815260056020526040812080546001929061312b908490614b22565b909155505060008181526004602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b613194838383613403565b61319c611028565b156109a35760405162461bcd60e51b81526004016108eb90613d9b565b606060006131c8836002614b4e565b6131d3906002614b22565b67ffffffffffffffff8111156131f957634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015613223576020820181803683370190505b509050600360fc1b8160008151811061324c57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811061328957634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535060006132ad846002614b4e565b6132b8906001614b22565b90505b600181111561334c576f181899199a1a9b1b9c1cb0b131b232b360811b85600f16601081106132fa57634e487b7160e01b600052603260045260246000fd5b1a60f81b82828151811061331e57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535060049490941c9361334581614bb0565b90506132bb565b50831561136c5760405162461bcd60e51b81526004016108eb90613d16565b6000848484846040516020016133849493929190613cdf565b60408051601f19818403018152919052805160209091012095945050505050565b600082826040516020016133ba929190613b41565b60405160208183030381529060405280519060200120905092915050565b3b151590565b60006001600160e01b03198216637965db0b60e01b148061082957506108298261348c565b61340e8383836109a3565b6001600160a01b03831661342a57613425816134a5565b61344d565b816001600160a01b0316836001600160a01b03161461344d5761344d83826134e9565b6001600160a01b0382166134695761346481613586565b6109a3565b826001600160a01b0316826001600160a01b0316146109a3576109a3828261365f565b6001600160e01b031981166301ffc9a760e01b14919050565b600a80546000838152600b60205260408120829055600182018355919091527fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a80155565b600060016134f684611118565b6135009190614b6d565b600083815260096020526040902054909150808214613553576001600160a01b03841660009081526008602090815260408083208584528252808320548484528184208190558352600990915290208190555b5060009182526009602090815260408084208490556001600160a01b039094168352600881528383209183525290812055565b600a5460009061359890600190614b6d565b6000838152600b6020526040812054600a80549394509092849081106135ce57634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905080600a83815481106135fd57634e487b7160e01b600052603260045260246000fd5b6000918252602080832090910192909255828152600b9091526040808220849055858252812055600a80548061364357634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061366a83611118565b6001600160a01b039093166000908152600860209081526040808320868452825280832085905593825260099052919091209190915550565b8280546136af90614bc7565b90600052602060002090601f0160209004810192826136d15760008555613717565b82601f106136ea57805160ff1916838001178555613717565b82800160010185558215613717579182015b828111156137175782518255916020019190600101906136fc565b506110fc92915061375b565b50805461372f90614bc7565b6000825580601f106137415750610ccd565b601f016020900490600052602060002090810190610ccd91905b5b808211156110fc576000815560010161375c565b600067ffffffffffffffff83111561378a5761378a614c5d565b61379d601f8401601f1916602001614af8565b90508281528383830111156137b157600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b038116811461082c57600080fd5b6000602082840312156137f0578081fd5b61136c826137c8565b6000806040838503121561380b578081fd5b613814836137c8565b9150613822602084016137c8565b90509250929050565b60008060006060848603121561383f578081fd5b613848846137c8565b9250613856602085016137c8565b9150604084013590509250925092565b6000806000806080858703121561387b578081fd5b613884856137c8565b9350613892602086016137c8565b925060408501359150606085013567ffffffffffffffff8111156138b4578182fd5b8501601f810187136138c4578182fd5b6138d387823560208401613770565b91505092959194509250565b600080604083850312156138f1578182fd5b6138fa836137c8565b9150602083013561390a81614c73565b809150509250929050565b60008060408385031215613927578182fd5b613930836137c8565b946020939093013593505050565b60006020808385031215613950578182fd5b823567ffffffffffffffff80821115613967578384fd5b818501915085601f83011261397a578384fd5b81358181111561398c5761398c614c5d565b838102915061399c848301614af8565b8181528481019084860184860187018a10156139b6578788fd5b8795505b838610156139df576139cb816137c8565b8352600195909501949186019186016139ba565b5098975050505050505050565b6000602082840312156139fd578081fd5b813561136c81614c73565b600060208284031215613a19578081fd5b815161136c81614c73565b600060208284031215613a35578081fd5b5035919050565b60008060408385031215613a4e578182fd5b82359150613822602084016137c8565b60008060408385031215613a70578182fd5b50508035926020909101359150565b600060208284031215613a90578081fd5b813561136c81614c81565b600060208284031215613aac578081fd5b815161136c81614c81565b600060208284031215613ac8578081fd5b813567ffffffffffffffff811115613ade578182fd5b8201601f81018413613aee578182fd5b61235f84823560208401613770565b600060208284031215613b0e578081fd5b5051919050565b60008151808452613b2d816020860160208601614b84565b601f01601f19169290920160200192915050565b918252602082015260400190565b60008351613b61818460208801614b84565b835190830190613b75818360208801614b84565b01949350505050565b60007f416363657373436f6e74726f6c3a206163636f756e742000000000000000000082528351613bb6816017850160208801614b84565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351613be7816028840160208801614b84565b01602801949350505050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613c7890830184613b15565b9695505050505050565b6001600160a01b03929092168252602082015260400190565b600060018060a01b038516825283602083015260606040830152613cc26060830184613b15565b95945050505050565b901515815260200190565b90815260200190565b93845260208401929092526001600160a01b03166040830152606082015260800190565b60006020825261136c6020830184613b15565b6020808252818101527f537472696e67733a20686578206c656e67746820696e73756666696369656e74604082015260600190565b60208082526030908201527f4552433732313a2043616e6e6f7420616464207a65726f20616464726573732060408201526f1d1bc81d1a1948189b1858dadb1a5cdd60821b606082015260800190565b6020808252602b908201527f4552433732315061757361626c653a20746f6b656e207472616e73666572207760408201526a1a1a5b19481c185d5cd95960aa1b606082015260800190565b60208082526014908201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604082015260600190565b6020808252601b908201527f4552433732313a206e6f20617661696c61626c652062657a6f67690000000000604082015260600190565b6020808252602b908201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560408201526a74206f6620626f756e647360a81b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526017908201527f556e61626c6520746f207472616e736665722057455448000000000000000000604082015260600190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252818101527f45524337323155524953746f726167653a206f776e6572207265717569726564604082015260600190565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604082015260600190565b60208082526016908201527545786365656473204d41585f4e46545f535550504c5960501b604082015260600190565b60208082526024908201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526019908201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604082015260600190565b60208082526025908201527f596f7520617265206e6f74206f6e20746865207072652d73616c652077686974604082015264195b1a5cdd60da1b606082015260800190565b6020808252602d908201527f556e61626c6520746f207472616e736665722c20796f757220746f6b656e206960408201526c1cc8189b1858dadb1a5cdd1959609a1b606082015260800190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b60208082526024908201527f4552433732313a206d696e74496e6465782076616c756520697320696e636f726040820152631c9958dd60e21b606082015260800190565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b6020808252600f908201526e4e6f7420656e6f756768204c494e4b60881b604082015260600190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604082015269726f206164647265737360b01b606082015260800190565b60208082526029908201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460408201526832b73a103a37b5b2b760b91b606082015260800190565b6020808252602e908201527f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60408201526d32bc34b9ba32b73a103a37b5b2b760911b606082015260800190565b6020808252818101527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604082015260600190565b60208082526030908201527f4552433732313a206d7573742068617665206d696e746572206f722061646d6960408201526f6e20726f6c6520746f2072656d6f766560801b606082015260800190565b60208082526031908201527f45524337323155524953746f726167653a2055524920717565727920666f72206040820152703737b732bc34b9ba32b73a103a37b5b2b760791b606082015260800190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526029908201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960408201526839903737ba1037bbb760b91b606082015260800190565b6020808252601f908201527f4552433732313a20746f6b656e20686173206265656e2073756d6d6f6e656400604082015260600190565b6020808252601f908201527f4f6e6c7920565246436f6f7264696e61746f722063616e2066756c66696c6c00604082015260600190565b60208082526029908201527f4552433732313a20596f752063616e6e6f74206d696e74206d6f7265207468616040820152686e203130204e46547360b81b606082015260800190565b6020808252601a908201527f4552433732313a2073756d6d6f6e20756e617661696c61626c65000000000000604082015260600190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656040820152603960f91b606082015260800190565b60208082526016908201527514d85b19481a185cc8185b1c9958591e48195b99195960521b604082015260600190565b60208082526019908201527f496e73756666696369656e7420574554482062616c616e636500000000000000604082015260600190565b60208082526018908201527f6e756d6265724f664e6674732063616e6e6f7420626520300000000000000000604082015260600190565b6020808252601a908201527f4552433732313a20746f6b656e2069732073756d6d6f6e696e67000000000000604082015260600190565b6020808252601d908201527f4552433732313a206f6e6c79206f776e65722063616e2073756d6d6f6e000000604082015260600190565b60208082526022908201527f596f75206d6179206e6f74206d696e74206d6f7265207468616e203130204e46604082015261547360f01b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60208082526022908201527f457468657220616c6c6f77616e63652076616c756520697320696e636f72726560408201526118dd60f21b606082015260800190565b60208082526030908201527f596f75206d6179206e6f74206d696e74206d6f7265207468616e2033204e465460408201526f7320647572696e672070726573616c6560801b606082015260800190565b60208082526017908201527f556e61626c6520746f207472616e73666572204c494e4b000000000000000000604082015260600190565b60208082526027908201527f4552433732313a206d61784e4654537570706c792076616c756520697320696e60408201526618dbdc9c9958dd60ca1b606082015260800190565b6020808252602c908201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60408201526b7574206f6620626f756e647360a01b606082015260800190565b6020808252602d908201527f4552433732313a206d7573742068617665206d696e746572206f722061646d6960408201526c1b881c9bdb19481d1bc8185919609a1b606082015260800190565b60208082526037908201527f4552433732313a20596f752063616e6e6f74206d696e74206d6f72652074686160408201527f6e2033204e46547320647572696e672070726573616c65000000000000000000606082015260800190565b60208082526014908201527314d85b19481a185cc81b9bdd081cdd185c9d195960621b604082015260600190565b60208082526030908201527f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760408201526f1b995c881b9bdc88185c1c1c9bdd995960821b606082015260800190565b60208082526025908201527f4552433732313a206d7573742068617665206d696e74657220726f6c6520746f604082015264081b5a5b9d60da1b606082015260800190565b6020808252602f908201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560408201526e103937b632b9903337b91039b2b63360891b606082015260800190565b60208082526023908201527f556e61626c6520746f207472616e7366657220647572696e67204e465420736160408201526236329760e91b606082015260800190565b60405181810167ffffffffffffffff81118282101715614b1a57614b1a614c5d565b604052919050565b60008219821115614b3557614b35614c31565b500190565b600082614b4957614b49614c47565b500490565b6000816000190483118215151615614b6857614b68614c31565b500290565b600082821015614b7f57614b7f614c31565b500390565b60005b83811015614b9f578181015183820152602001614b87565b83811115611c4d5750506000910152565b600081614bbf57614bbf614c31565b506000190190565b600281046001821680614bdb57607f821691505b60208210811415614bfc57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415614c1657614c16614c31565b5060010190565b600082614c2c57614c2c614c47565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b8015158114610ccd57600080fd5b6001600160e01b031981168114610ccd57600080fdfea264697066735822122018b6fa9e6262da212a4785a49d6ab963f77d44a89dc9f305cc699f0dff46a35d64736f6c6343000800003368747470733a2f2f6170692e62657a6f67652e636f6d2f746f6b656e2f6170692f6e66742f
Deployed ByteCode Sourcemap
404:16294:3:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6420:245;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2349:98:7;;;:::i;:::-;;;;;;;:::i;3860:217::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;3398:401::-;;;;;;:::i;:::-;;:::i;:::-;;2884:331:3;;;;;;:::i;:::-;;:::i;3723:690::-;;;;;;:::i;:::-;;:::i;1534:111:9:-;;;:::i;:::-;;;;;;;:::i;7802:92:3:-;;;:::i;4724:330:7:-;;;;;;:::i;:::-;;:::i;5412:121:0:-;;;;;;:::i;:::-;;:::i;2129:162:1:-;;;;;;:::i;:::-;;:::i;1210:253:9:-;;;;;;:::i;:::-;;:::i;2636:171:1:-;;;;;;:::i;:::-;;:::i;5838:71:3:-;;;:::i;5120:179:7:-;;;;;;:::i;:::-;;:::i;437:241:8:-;;;;;;:::i;:::-;;:::i;7559:132:3:-;;;;;;:::i;:::-;;:::i;10430:152::-;;;;;;:::i;:::-;;:::i;7906:761::-;;;;;;:::i;:::-;;:::i;1717:230:9:-;;;;;;:::i;:::-;;:::i;15009:217:3:-;;;;;;:::i;:::-;;:::i;4792:131::-;;;;;;:::i;:::-;;:::i;6673:112::-;;;;;;:::i;:::-;;:::i;1034:84:21:-;;;:::i;2052:235:7:-;;;;;;:::i;:::-;;:::i;10641:673:3:-;;;:::i;12786:138::-;;;:::i;1790:205:7:-;;;;;;:::i;:::-;;:::i;1598:92:20:-;;;:::i;3220:210:3:-;;;;;;:::i;:::-;;:::i;4419:120::-;;;;;;:::i;:::-;;:::i;6790:97::-;;;:::i;6892:101::-;;;:::i;15456:129::-;;;;;;:::i;:::-;;:::i;4544:115::-;;;;;;:::i;:::-;;:::i;5766:67::-;;;:::i;966:85:20:-;;;:::i;1599:143:1:-;;;;;;:::i;:::-;;:::i;4329:137:0:-;;;;;;:::i;:::-;;:::i;9628:225:23:-;;;;;;:::i;:::-;;:::i;2511:102:7:-;;;:::i;5268:173:3:-;;;:::i;15231:220::-;;;;;;:::i;:::-;;:::i;6998:93::-;;;:::i;7200:95::-;;;:::i;2361:49:0:-;;;:::i;4144:290:7:-;;;;;;:::i;:::-;;:::i;8719:1706:3:-;;;;;;:::i;:::-;;:::i;16153:282::-;;;;;;:::i;:::-;;:::i;3435:283::-;;;;;;:::i;:::-;;:::i;4664:123::-;;;;;;:::i;:::-;;:::i;5365:320:7:-;;;;;;:::i;:::-;;:::i;7696:100:3:-;;;:::i;7303:108::-;;;:::i;13180:778::-;;;;;;:::i;:::-;;:::i;1910:132:1:-;;;;;;:::i;:::-;;:::i;16440:159:3:-;;;;;;:::i;:::-;;:::i;7096:99::-;;;:::i;7417:134::-;;;:::i;2379:167:1:-;;;;;;:::i;:::-;;:::i;15782:366:3:-;;;;;;:::i;:::-;;:::i;4500:162:7:-;;;;;;:::i;:::-;;:::i;1839:189:20:-;;;;;;:::i;:::-;;:::i;5060:110:3:-;;;;;;:::i;:::-;;:::i;5526:234::-;;;:::i;4928:127::-;;;;;;:::i;:::-;;:::i;6420:245::-;6595:4;6622:36;6646:11;6622:23;:36::i;:::-;6615:43;;6420:245;;;;:::o;2349:98:7:-;2403:13;2435:5;2428:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2349:98;;:::o;3860:217::-;3936:7;3963:16;3971:7;3963;:16::i;:::-;3955:73;;;;-1:-1:-1;;;3955:73:7;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;4046:24:7;;;;:15;:24;;;;;;-1:-1:-1;;;;;4046:24:7;;3860:217::o;3398:401::-;3478:13;3494:23;3509:7;3494:14;:23::i;:::-;3478:39;;3541:5;-1:-1:-1;;;;;3535:11:7;:2;-1:-1:-1;;;;;3535:11:7;;;3527:57;;;;-1:-1:-1;;;3527:57:7;;;;;;;:::i;:::-;3632:5;-1:-1:-1;;;;;3616:21:7;:12;:10;:12::i;:::-;-1:-1:-1;;;;;3616:21:7;;:62;;;;3641:37;3658:5;3665:12;:10;:12::i;3641:37::-;3595:165;;;;-1:-1:-1;;;3595:165:7;;;;;;;:::i;:::-;3771:21;3780:2;3784:7;3771:8;:21::i;:::-;3398:401;;;:::o;2884:331:3:-;1189:12:20;:10;:12::i;:::-;-1:-1:-1;;;;;1178:23:20;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1178:23:20;;1170:68;;;;-1:-1:-1;;;1170:68:20;;;;;;;:::i;:::-;2987:14:3::1;;2972:12;:29;2964:81;;;;-1:-1:-1::0;;;2964:81:3::1;;;;;;;:::i;:::-;3060:9;1018:1;3073:14;;:31;;;;:::i;:::-;3060:45;;3055:115;3112:12;3107:1;:17;3055:115;;3145:14;:7;3157:1:::0;3145:11:::1;:14::i;:::-;-1:-1:-1::0;3126:3:3;::::1;::::0;::::1;:::i;:::-;;;;3055:115;;;-1:-1:-1::0;3179:14:3::1;:29:::0;2884:331::o;3723:690::-;3811:32;926:24;3832:10;3811:7;:32::i;:::-;3803:82;;;;-1:-1:-1;;;3803:82:3;;;;;;;:::i;:::-;3920:17;3940:13;:11;:13::i;:::-;3920:33;;3984:14;;3971:9;:27;;3963:76;;;;-1:-1:-1;;;3963:76:3;;;;;;;:::i;:::-;4064:9;4059:348;4083:13;:20;4079:1;:24;4059:348;;;4175:13;:11;:13::i;:::-;4163:25;;4202:13;4218;4232:1;4218:16;;;;;;-1:-1:-1;;;4218:16:3;;;;;;;;;;;;;;;4202:32;;4248:27;4258:5;4265:9;4248;:27::i;:::-;4290:56;4309:9;4319:26;4320:13;4309:9;4332:1;4320:13;:::i;:::-;4319:24;:26::i;:::-;4290:18;:56::i;:::-;4377:14;;:19;;4395:1;4377:19;:::i;:::-;4360:14;:36;-1:-1:-1;4105:3:3;;;;:::i;:::-;;;;4059:348;;1534:111:9;1621:10;:17;1534:111;:::o;7802:92:3:-;7875:12;;7802:92;:::o;4724:330:7:-;4913:41;4932:12;:10;:12::i;:::-;4946:7;4913:18;:41::i;:::-;4905:103;;;;-1:-1:-1;;;4905:103:7;;;;;;;:::i;:::-;5019:28;5029:4;5035:2;5039:7;5019:9;:28::i;5412:121:0:-;5478:7;5504:12;;;;;;;;;;:22;;;;5412:121::o;2129:162:1:-;2213:30;2229:4;2235:7;2213:15;:30::i;:::-;2253:18;;;;:12;:18;;;;;:31;;2276:7;2253:22;:31::i;1210:253:9:-;1307:7;1342:23;1359:5;1342:16;:23::i;:::-;1334:5;:31;1326:87;;;;-1:-1:-1;;;1326:87:9;;;;;;;:::i;:::-;-1:-1:-1;;;;;;1430:19:9;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;1210:253;;;;;:::o;2636:171:1:-;2723:33;2742:4;2748:7;2723:18;:33::i;:::-;2766:18;;;;:12;:18;;;;;:34;;2792:7;2766:25;:34::i;5838:71:3:-;1189:12:20;:10;:12::i;:::-;-1:-1:-1;;;;;1178:23:20;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1178:23:20;;1170:68;;;;-1:-1:-1;;;1170:68:20;;;;;;;:::i;:::-;5892:10:3::1;:8;:10::i;:::-;5838:71::o:0;5120:179:7:-;5253:39;5270:4;5276:2;5280:7;5253:39;;;;;;;;;;;;:16;:39::i;437:241:8:-;553:41;572:12;:10;:12::i;553:41::-;545:102;;;;-1:-1:-1;;;545:102:8;;;;;;;:::i;:::-;657:14;663:7;657:5;:14::i;:::-;437:241;:::o;7559:132:3:-;7623:4;7652:19;;;:10;:19;;;;;7646:33;;;;;:::i;:::-;:38;;;7559:132;-1:-1:-1;;;7559:132:3:o;10430:152::-;10527:13;;:48;;-1:-1:-1;;;10527:48:3;;10501:7;;-1:-1:-1;;;;;10527:13:3;;:23;;:48;;10551:8;;10569:4;;10527:48;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;7906:761::-;7972:20;:18;:20::i;:::-;7964:59;;;;-1:-1:-1;;;7964:59:3;;;;;;;:::i;:::-;8041:16;8049:7;8041;:16::i;:::-;8033:73;;;;-1:-1:-1;;;8033:73:3;;;;;;;:::i;:::-;8125:25;8142:7;8125:16;:25::i;:::-;8124:26;8116:70;;;;-1:-1:-1;;;8116:70:3;;;;;;;:::i;:::-;8205:19;;;;:10;:19;;;;;;;;8204:20;8196:59;;;;-1:-1:-1;;;8196:59:3;;;;;;;:::i;:::-;8265:32;8300:29;:27;:29::i;:::-;8265:64;;8374:1;8347:24;:28;8339:68;;;;-1:-1:-1;;;8339:68:3;;;;;;;:::i;:::-;8426:13;8442:16;8450:7;8442;:16::i;:::-;8426:32;-1:-1:-1;8476:10:3;-1:-1:-1;;;;;8476:19:3;;;8468:60;;;;-1:-1:-1;;;8468:60:3;;;;;;;:::i;:::-;8539:19;;;;:10;:19;;;;;:26;;-1:-1:-1;;8539:26:3;8561:4;8539:26;;;8595:17;:15;:17::i;:::-;8622:28;;;;:17;:28;;;;;:38;;;;-1:-1:-1;;;7906:761:3:o;1717:230:9:-;1792:7;1827:30;:28;:30::i;:::-;1819:5;:38;1811:95;;;;-1:-1:-1;;;1811:95:9;;;;;;;:::i;:::-;1923:10;1934:5;1923:17;;;;;;-1:-1:-1;;;1923:17:9;;;;;;;;;;;;;;;;;1916:24;;1717:230;;;:::o;15009:217:3:-;1189:12:20;:10;:12::i;:::-;-1:-1:-1;;;;;1178:23:20;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1178:23:20;;1170:68;;;;-1:-1:-1;;;1170:68:20;;;;;;;:::i;:::-;15107:9:3::1;15102:118;15126:13;:20;15122:1;:24;15102:118;;;15205:4;15167:17;:35;15185:13;15199:1;15185:16;;;;;;-1:-1:-1::0;;;15185:16:3::1;;;;;;;;;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;15167:35:3::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;15167:35:3;:42;;-1:-1:-1;;15167:42:3::1;::::0;::::1;;::::0;;;::::1;::::0;;15148:3;::::1;::::0;::::1;:::i;:::-;;;;15102:118;;;;15009:217:::0;:::o;4792:131::-;1189:12:20;:10;:12::i;:::-;-1:-1:-1;;;;;1178:23:20;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1178:23:20;;1170:68;;;;-1:-1:-1;;;1170:68:20;;;;;;;:::i;:::-;4878:18:3::1;:38:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;4878:38:3;;::::1;::::0;;;::::1;::::0;;4792:131::o;6673:112::-;6735:7;6761:17;:7;6772:5;6761:10;:17::i;1034:84:21:-;1104:7;;;;1034:84;:::o;2052:235:7:-;2124:7;2159:16;;;:7;:16;;;;;;-1:-1:-1;;;;;2159:16:7;2193:19;2185:73;;;;-1:-1:-1;;;2185:73:7;;;;;;;:::i;10641:673:3:-;10691:7;10710:18;10731:13;:11;:13::i;:::-;10710:34;;10832:4;10815:13;:21;10811:497;;-1:-1:-1;;10859:12:3;;10852:19;;10811:497;10909:4;10892:13;:21;10888:420;;10936:10;10929:17;;;;;10888:420;10985:4;10968:13;:21;10964:344;;11012:11;11005:18;;;;;10964:344;11061:4;11044:13;:21;11040:268;;11088:11;11081:18;;;;;11040:268;11137:3;11120:13;:20;11116:192;;11163:11;11156:18;;;;;11116:192;11236:12;11229:19;;;;;11191:117;10641:673;;:::o;12786:138::-;12874:42;12786:138;:::o;1790:205:7:-;1862:7;-1:-1:-1;;;;;1889:19:7;;1881:74;;;;-1:-1:-1;;;1881:74:7;;;;;;;:::i;:::-;-1:-1:-1;;;;;;1972:16:7;;;;;:9;:16;;;;;;;1790:205::o;1598:92:20:-;1189:12;:10;:12::i;:::-;-1:-1:-1;;;;;1178:23:20;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1178:23:20;;1170:68;;;;-1:-1:-1;;;1170:68:20;;;;;;;:::i;:::-;1662:21:::1;1680:1;1662:9;:21::i;3220:210:3:-:0;1189:12:20;:10;:12::i;:::-;-1:-1:-1;;;;;1178:23:20;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1178:23:20;;1170:68;;;;-1:-1:-1;;;1170:68:20;;;;;;;:::i;:::-;3289:9:3::1;3284:140;3308:5;3304:1;:9;3284:140;;;3334:17;3354:13;:11;:13::i;:::-;3334:33;;3381:32;3391:10;3403:9;3381;:32::i;:::-;-1:-1:-1::0;3315:3:3;::::1;::::0;::::1;:::i;:::-;;;;3284:140;;4419:120:::0;1189:12:20;:10;:12::i;:::-;-1:-1:-1;;;;;1178:23:20;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1178:23:20;;1170:68;;;;-1:-1:-1;;;1170:68:20;;;;;;;:::i;:::-;4504:28:3;;::::1;::::0;:13:::1;::::0;:28:::1;::::0;::::1;::::0;::::1;:::i;6790:97::-:0;6864:16;;;;;;;;6790:97::o;6892:101::-;6968:18;;;;;;;;6892:101::o;15456:129::-;-1:-1:-1;;;;;15551:27:3;15528:4;15551:27;;;:17;:27;;;;;;;;;15456:129::o;4544:115::-;1189:12:20;:10;:12::i;:::-;-1:-1:-1;;;;;1178:23:20;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1178:23:20;;1170:68;;;;-1:-1:-1;;;1170:68:20;;;;;;;:::i;:::-;4622:14:3::1;:30:::0;;-1:-1:-1;;4622:30:3::1;::::0;::::1;;::::0;;;::::1;::::0;;4544:115::o;5766:67::-;1189:12:20;:10;:12::i;:::-;-1:-1:-1;;;;;1178:23:20;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1178:23:20;;1170:68;;;;-1:-1:-1;;;1170:68:20;;;;;;;:::i;:::-;5818:8:3::1;:6;:8::i;966:85:20:-:0;1038:6;;;;;-1:-1:-1;;;;;1038:6:20;;966:85::o;1599:143:1:-;1681:7;1707:18;;;:12;:18;;;;;:28;;1729:5;1707:21;:28::i;:::-;1700:35;1599:143;-1:-1:-1;;;1599:143:1:o;4329:137:0:-;4407:4;4430:12;;;;;;;;;;;-1:-1:-1;;;;;4430:29:0;;;;;;;;;;;;;;;4329:137::o;9628:225:23:-;9738:10;-1:-1:-1;;;;;9752:14:23;9738:28;;9730:72;;;;-1:-1:-1;;;9730:72:23;;;;;;;:::i;:::-;9808:40;9826:9;9837:10;9808:17;:40::i;2511:102:7:-;2567:13;2599:7;2592:14;;;;;:::i;5268:173:3:-;1189:12:20;:10;:12::i;:::-;-1:-1:-1;;;;;1178:23:20;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1178:23:20;;1170:68;;;;-1:-1:-1;;;1170:68:20;;;;;;;:::i;:::-;5332:13:3::1;::::0;5367:38:::1;::::0;-1:-1:-1;;;5367:38:3;;-1:-1:-1;;;;;5332:13:3;;::::1;::::0;:22:::1;::::0;5355:10:::1;::::0;5332:13;;5367:23:::1;::::0;:38:::1;::::0;5399:4:::1;::::0;5367:38:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5332:74;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5324:110;;;;-1:-1:-1::0;;;5324:110:3::1;;;;;;;:::i;15231:220::-:0;1189:12:20;:10;:12::i;:::-;-1:-1:-1;;;;;1178:23:20;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1178:23:20;;1170:68;;;;-1:-1:-1;;;1170:68:20;;;;;;;:::i;:::-;15332:9:3::1;15327:118;15351:13;:20;15347:1;:24;15327:118;;;15399:17;:35;15417:13;15431:1;15417:16;;;;;;-1:-1:-1::0;;;15417:16:3::1;;;;;;;;;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;15399:35:3::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;15399:35:3;15392:42;;-1:-1:-1;;15392:42:3::1;::::0;;15373:3;::::1;::::0;::::1;:::i;:::-;;;;15327:118;;6998:93:::0;7070:14;;;;6998:93;:::o;7200:95::-;7274:14;;7200:95;:::o;2361:49:0:-;2406:4;2361:49;:::o;4144:290:7:-;4258:12;:10;:12::i;:::-;-1:-1:-1;;;;;4246:24:7;:8;-1:-1:-1;;;;;4246:24:7;;;4238:62;;;;-1:-1:-1;;;4238:62:7;;;;;;;:::i;:::-;4356:8;4311:18;:32;4330:12;:10;:12::i;:::-;-1:-1:-1;;;;;4311:32:7;;;;;;;;;;;;;;;;;-1:-1:-1;4311:32:7;;;:42;;;;;;;;;;;;:53;;-1:-1:-1;;4311:53:7;;;;;;;;;;;4394:12;:10;:12::i;:::-;-1:-1:-1;;;;;4379:48:7;;4418:8;4379:48;;;;;;:::i;:::-;;;;;;;;4144:290;;:::o;8719:1706:3:-;8862:14;;8846:13;:11;:13::i;:::-;:30;8838:65;;;;-1:-1:-1;;;8838:65:3;;;;;;;:::i;:::-;8936:1;8921:12;:16;8913:53;;;;-1:-1:-1;;;8913:53:3;;;;;;;:::i;:::-;9026:14;;9009:12;8993:13;:11;:13::i;:::-;:28;;;;:::i;:::-;8992:48;;8984:83;;;;-1:-1:-1;;;8984:83:3;;;;;;;:::i;:::-;9085:18;:16;:18::i;:::-;9077:51;;;;-1:-1:-1;;;9077:51:3;;;;;;;:::i;:::-;9223:12;9201:19;:17;:19::i;:::-;:34;;;;:::i;:::-;9146:13;;:50;;-1:-1:-1;;;9146:50:3;;-1:-1:-1;;;;;9146:13:3;;;;:23;;:50;;9170:10;;9190:4;;9146:50;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:90;;9138:137;;;;-1:-1:-1;;;9138:137:3;;;;;;;:::i;:::-;9355:12;9333:19;:17;:19::i;:::-;:34;;;;:::i;:::-;9293:13;;:35;;-1:-1:-1;;;9293:35:3;;-1:-1:-1;;;;;9293:13:3;;;;:23;;:35;;9317:10;;9293:35;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:75;;9285:113;;;;-1:-1:-1;;;9285:113:3;;;;;;;:::i;:::-;9425:21;:19;:21::i;:::-;9422:722;;;9469:36;9494:10;9469:24;:36::i;:::-;9461:86;;;;-1:-1:-1;;;9461:86:3;;;;;;;:::i;:::-;9597:1;9581:12;:17;;9573:78;;;;-1:-1:-1;;;9573:78:3;;;;;;;:::i;:::-;9702:18;9747:12;9723:21;9733:10;9723:9;:21::i;:::-;:36;;;;:::i;:::-;9702:57;;9795:1;9781:10;:15;;9773:83;;;;-1:-1:-1;;;9773:83:3;;;;;;;:::i;:::-;9422:722;;;;9911:2;9895:12;:18;;9887:65;;;;-1:-1:-1;;;9887:65:3;;;;;;;:::i;:::-;9992:18;10037:12;10013:21;10023:10;10013:9;:21::i;:::-;:36;;;;:::i;:::-;9992:57;;10085:2;10071:10;:16;;10063:70;;;;-1:-1:-1;;;10063:70:3;;;;;;;:::i;:::-;9422:722;;10162:13;;-1:-1:-1;;;;;10162:13:3;:26;10189:10;10209:4;10239:12;10217:19;:17;:19::i;:::-;:34;;;;:::i;:::-;10162:91;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;10268:9;10263:147;10287:12;10283:1;:16;10263:147;;;10320:17;10340:13;:11;:13::i;:::-;10320:33;;10367:32;10377:10;10389:9;10367;:32::i;:::-;-1:-1:-1;10301:3:3;;;;:::i;:::-;;;;10263:147;;16153:282;16249:32;926:24;16270:10;16249:7;:32::i;:::-;:75;;;-1:-1:-1;16285:39:3;2406:4:0;16313:10:3;16285:7;:39::i;:::-;16241:136;;;;-1:-1:-1;;;16241:136:3;;;;;;;:::i;:::-;-1:-1:-1;;;;;16387:25:3;;;;;;:15;:25;;;;;:41;;16420:7;16387:32;:41::i;3435:283::-;1189:12:20;:10;:12::i;:::-;-1:-1:-1;;;;;1178:23:20;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1178:23:20;;1170:68;;;;-1:-1:-1;;;1170:68:20;;;;;;;:::i;:::-;3521:9:3::1;3516:196;3540:13;:20;3536:1;:24;3516:196;;;3581:13;3597;3611:1;3597:16;;;;;;-1:-1:-1::0;;;3597:16:3::1;;;;;;;;;;;;;;;3581:32;;3627:17;3647:13;:11;:13::i;:::-;3627:33;;3674:27;3684:5;3691:9;3674;:27::i;:::-;3516:196;;3562:3;;;;;:::i;:::-;;;;3516:196;;4664:123:::0;1189:12:20;:10;:12::i;:::-;-1:-1:-1;;;;;1178:23:20;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1178:23:20;;1170:68;;;;-1:-1:-1;;;1170:68:20;;;;;;;:::i;:::-;4746:16:3::1;:34:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;4746:34:3;;::::1;::::0;;;::::1;::::0;;4664:123::o;5365:320:7:-;5534:41;5553:12;:10;:12::i;:::-;5567:7;5534:18;:41::i;:::-;5526:103;;;;-1:-1:-1;;;5526:103:7;;;;;;;:::i;:::-;5639:39;5653:4;5659:2;5663:7;5672:5;5639:13;:39::i;:::-;5365:320;;;;:::o;7696:100:3:-;7744:13;7776;7769:20;;;;;:::i;7303:108::-;7384:20;;7303:108;:::o;13180:778::-;13253:13;13286:16;13294:7;13286;:16::i;:::-;13278:78;;;;-1:-1:-1;;;13278:78:3;;;;;;;:::i;:::-;13375:23;13401:19;;;:10;:19;;;;;13375:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13430:18;13451:10;:8;:10::i;:::-;13430:31;;13540:4;13534:18;13556:1;13534:23;13530:70;;;-1:-1:-1;13580:9:3;-1:-1:-1;13573:16:3;;13530:70;13703:23;;:27;13699:253;;13777:4;13783:9;13760:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;13746:48;;;;;;13699:253;13915:4;13921:18;;;;;;;;;;;;;-1:-1:-1;;;13921:18:3;;;13898:42;;;;;;;;;:::i;1910:132:1:-;1982:7;2008:18;;;:12;:18;;;;;:27;;:25;:27::i;16440:159:3:-;-1:-1:-1;;;;;16549:25:3;;16526:4;16549:25;;;:15;:25;;;;;:43;;16584:7;16549:34;:43::i;7096:99::-;7171:17;;;;;;;;7096:99::o;7417:134::-;7477:7;7520:24;:22;:24::i;:::-;7503:14;;:41;;;;:::i;:::-;7496:48;;7417:134;:::o;2379:167:1:-;2464:31;2481:4;2487:7;2464:16;:31::i;15782:366:3:-;15875:32;926:24;15896:10;15875:7;:32::i;:::-;:75;;;-1:-1:-1;15911:39:3;2406:4:0;15939:10:3;15911:7;:39::i;:::-;15867:133;;;;-1:-1:-1;;;15867:133:3;;;;;;;:::i;:::-;-1:-1:-1;;;;;16018:22:3;;16010:83;;;;-1:-1:-1;;;16010:83:3;;;;;;;:::i;:::-;-1:-1:-1;;;;;16103:25:3;;;;;;:15;:25;;;;;:38;;16133:7;16103:29;:38::i;4500:162:7:-;-1:-1:-1;;;;;4620:25:7;;;4597:4;4620:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;4500:162::o;1839:189:20:-;1189:12;:10;:12::i;:::-;-1:-1:-1;;;;;1178:23:20;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1178:23:20;;1170:68;;;;-1:-1:-1;;;1170:68:20;;;;;;;:::i;:::-;-1:-1:-1;;;;;1927:22:20;::::1;1919:73;;;;-1:-1:-1::0;;;1919:73:20::1;;;;;;;:::i;:::-;2002:19;2012:8;2002:9;:19::i;5060:110:3:-:0;1189:12:20;:10;:12::i;:::-;-1:-1:-1;;;;;1178:23:20;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1178:23:20;;1170:68;;;;-1:-1:-1;;;1170:68:20;;;;;;;:::i;:::-;5137:12:3::1;:26:::0;5060:110::o;5526:234::-;1189:12:20;:10;:12::i;:::-;-1:-1:-1;;;;;1178:23:20;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1178:23:20;;1170:68;;;;-1:-1:-1;;;1170:68:20;;;;;;;:::i;:::-;5582:23:3::1;5627;:21;:23::i;:::-;5582:69;;5669:4;-1:-1:-1::0;;;;;5669:13:3::1;;5683:10;5695:4;-1:-1:-1::0;;;;;5695:14:3::1;;5718:4;5695:29;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5669:56;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5661:92;;;;-1:-1:-1::0;;;5661:92:3::1;;;;;;;:::i;4928:127::-:0;1189:12:20;:10;:12::i;:::-;-1:-1:-1;;;;;1178:23:20;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1178:23:20;;1170:68;;;;-1:-1:-1;;;1170:68:20;;;;;;;:::i;:::-;5012:17:3::1;:36:::0;;;::::1;;;;-1:-1:-1::0;;5012:36:3;;::::1;::::0;;;::::1;::::0;;4928:127::o;7579:110:0:-;7657:25;7668:4;7674:7;7657:10;:25::i;6232:150:11:-;6302:4;6325:50;6330:3;-1:-1:-1;;;;;6350:23:11;;6325:4;:50::i;909:222:9:-;1011:4;-1:-1:-1;;;;;;1034:50:9;;-1:-1:-1;;;1034:50:9;;:90;;;1088:36;1112:11;1088:23;:36::i;7157:125:7:-;7222:4;7245:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7245:16:7;:30;;;7157:125::o;586:96:4:-;665:10;586:96;:::o;11008:171:7:-;11082:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;11082:29:7;-1:-1:-1;;;;;11082:29:7;;;;;;;;:24;;11135:23;11082:24;11135:14;:23::i;:::-;-1:-1:-1;;;;;11126:46:7;;;;;;;;;;;11008:171;;:::o;7880:129:11:-;7947:4;7970:32;7975:3;7995:5;7970:4;:32::i;8114:108:7:-;8189:26;8199:2;8203:7;8189:26;;;;;;;;;;;;:9;:26::i;275:703:22:-;331:13;548:10;544:51;;-1:-1:-1;574:10:22;;;;;;;;;;;;-1:-1:-1;;;574:10:22;;;;;;544:51;619:5;604:12;658:75;665:9;;658:75;;690:8;;;;:::i;:::-;;-1:-1:-1;712:10:22;;-1:-1:-1;720:2:22;712:10;;:::i;:::-;;;658:75;;;742:19;774:6;764:17;;;;;;-1:-1:-1;;;764:17:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;764:17:22;;742:39;;791:150;798:10;;791:150;;824:11;834:1;824:11;;:::i;:::-;;-1:-1:-1;892:10:22;900:2;892:5;:10;:::i;:::-;879:24;;:2;:24;:::i;:::-;866:39;;849:6;856;849:14;;;;;;-1:-1:-1;;;849:14:22;;;;;;;;;;;;:56;-1:-1:-1;;;;;849:56:22;;;;;;;;-1:-1:-1;919:11:22;928:2;919:11;;:::i;:::-;;;791:150;;;964:6;275:703;-1:-1:-1;;;;275:703:22:o;12595:186:3:-;12685:32;12698:7;12707:9;12685:12;:32::i;:::-;12750:20;;:24;;12773:1;12750:24;:::i;:::-;12727:20;:47;-1:-1:-1;;12595:186:3:o;7440:344:7:-;7533:4;7557:16;7565:7;7557;:16::i;:::-;7549:73;;;;-1:-1:-1;;;7549:73:7;;;;;;;:::i;:::-;7632:13;7648:23;7663:7;7648:14;:23::i;:::-;7632:39;;7700:5;-1:-1:-1;;;;;7689:16:7;:7;-1:-1:-1;;;;;7689:16:7;;:51;;;;7733:7;-1:-1:-1;;;;;7709:31:7;:20;7721:7;7709:11;:20::i;:::-;-1:-1:-1;;;;;7709:31:7;;7689:51;:87;;;;7744:32;7761:5;7768:7;7744:16;:32::i;10337:560::-;10491:4;-1:-1:-1;;;;;10464:31:7;:23;10479:7;10464:14;:23::i;:::-;-1:-1:-1;;;;;10464:31:7;;10456:85;;;;-1:-1:-1;;;10456:85:7;;;;;;;:::i;:::-;-1:-1:-1;;;;;10559:16:7;;10551:65;;;;-1:-1:-1;;;10551:65:7;;;;;;;:::i;:::-;10627:39;10648:4;10654:2;10658:7;10627:20;:39::i;:::-;10728:29;10745:1;10749:7;10728:8;:29::i;:::-;-1:-1:-1;;;;;10768:15:7;;;;;;:9;:15;;;;;:20;;10787:1;;10768:15;:20;;10787:1;;10768:20;:::i;:::-;;;;-1:-1:-1;;;;;;;10798:13:7;;;;;;:9;:13;;;;;:18;;10815:1;;10798:13;:18;;10815:1;;10798:18;:::i;:::-;;;;-1:-1:-1;;10826:16:7;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;10826:21:7;-1:-1:-1;;;;;10826:21:7;;;;;;;;;10863:27;;10826:16;;10863:27;;;;;;;10337:560;;;:::o;5783:145:0:-;5866:18;5879:4;5866:12;:18::i;:::-;3925:30;3936:4;3942:12;:10;:12::i;:::-;3925:10;:30::i;:::-;5896:25:::1;5907:4;5913:7;5896:10;:25::i;6800:214::-:0;6906:12;:10;:12::i;:::-;-1:-1:-1;;;;;6895:23:0;:7;-1:-1:-1;;;;;6895:23:0;;6887:83;;;;-1:-1:-1;;;6887:83:0;;;;;;;:::i;:::-;6981:26;6993:4;6999:7;6981:11;:26::i;6550:156:11:-;6623:4;6646:53;6654:3;-1:-1:-1;;;;;6674:23:11;;6646:7;:53::i;2046:117:21:-;1613:8;:6;:8::i;:::-;1605:41;;;;-1:-1:-1;;;1605:41:21;;;;;;;:::i;:::-;2104:7:::1;:15:::0;;-1:-1:-1;;2104:15:21::1;::::0;;2134:22:::1;2143:12;:10;:12::i;:::-;2134:22;;;;;;:::i;:::-;;;;;;;;2046:117::o:0;14536:276:3:-;14626:7;:5;:7::i;:::-;-1:-1:-1;;;;;14612:21:3;:10;-1:-1:-1;;;;;14612:21:3;;14604:66;;;;-1:-1:-1;;;14604:66:3;;;;;;;:::i;:::-;14680:20;14692:7;14680:11;:20::i;:::-;14721:19;;;;:10;:19;;;;;14715:33;;;;;:::i;:::-;:38;;-1:-1:-1;14711:95:3;;14776:19;;;;:10;:19;;;;;14769:26;;;:::i;11530:193::-;11575:17;11645:3;;11612:4;-1:-1:-1;;;;;11612:14:3;;11635:4;11612:29;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:36;;11604:64;;;;-1:-1:-1;;;11604:64:3;;;;;;;:::i;:::-;11685:31;11703:7;;11712:3;;11685:17;:31::i;9072:135:11:-;9143:7;9177:22;9181:3;9193:5;9177:3;:22::i;2034:169:20:-;2108:6;;;-1:-1:-1;;;;;2124:17:20;;;2108:6;2124:17;;;-1:-1:-1;;;;;;2124:17:20;;;;;;2156:40;;2108:6;;;;;;;;2156:40;;2089:16;;2156:40;2034:169;;:::o;1799:115:21:-;1348:8;:6;:8::i;:::-;1347:9;1339:38;;;;-1:-1:-1;;;1339:38:21;;;;;;;:::i;:::-;1858:7:::1;:14:::0;;-1:-1:-1;;1858:14:21::1;1868:4;1858:14;::::0;;1887:20:::1;1894:12;:10;:12::i;11794:796:3:-:0;11908:32;11943:29;:27;:29::i;:::-;11982:15;12000:28;;;:17;:28;;;;;;11908:64;;-1:-1:-1;12075:28:3;;12072:512;;12165:37;12178:24;12165:10;:37;:::i;:::-;12151:51;;12219:16;12227:7;12219;:16::i;:::-;:46;;;;;12240:25;12257:7;12240:16;:25::i;:::-;12239:26;12219:46;:69;;;;-1:-1:-1;12269:19:3;;;;:10;:19;;;;;;;;12219:69;12216:358;;;12381:11;12395:23;:7;12406:11;12395:10;:23::i;:::-;12381:37;;12436:42;12455:7;12463:14;:3;:12;:14::i;12436:42::-;12496:19;:7;12511:3;12496:14;:19::i;:::-;-1:-1:-1;;12540:19:3;;;;:10;:19;;;;;12533:26;;-1:-1:-1;;12533:26:3;;;12216:358;11794:796;;;;;:::o;8177:135:11:-;8247:4;8270:35;8278:3;8298:5;8270:7;:35::i;6547:307:7:-;6698:28;6708:4;6714:2;6718:7;6698:9;:28::i;:::-;6744:48;6767:4;6773:2;6777:7;6786:5;6744:22;:48::i;:::-;6736:111;;;;-1:-1:-1;;;6736:111:7;;;;;;;:::i;7033:115:11:-;7096:7;7122:19;7130:3;7122:7;:19::i;8393:144::-;8470:4;8493:37;8503:3;8523:5;8493:9;:37::i;6162:147:0:-;6246:18;6259:4;6246:12;:18::i;:::-;3925:30;3936:4;3942:12;:10;:12::i;3925:30::-;6276:26:::1;6288:4;6294:7;6276:11;:26::i;8012:224::-:0;8086:22;8094:4;8100:7;8086;:22::i;:::-;8081:149;;8124:6;:12;;;;;;;;;;;-1:-1:-1;;;;;8124:29:0;;;;;;;;;:36;;-1:-1:-1;;8124:36:0;8156:4;8124:36;;;8206:12;:10;:12::i;:::-;-1:-1:-1;;;;;8179:40:0;8197:7;-1:-1:-1;;;;;8179:40:0;8191:4;8179:40;;;;;;;;;;8012:224;;:::o;1630:404:11:-;1693:4;1714:21;1724:3;1729:5;1714:9;:21::i;:::-;1709:319;;-1:-1:-1;1751:23:11;;;;;;;;:11;:23;;;;;;;;;;;;;1931:18;;1909:19;;;:12;;;:19;;;;;;:40;;;;1963:11;;1709:319;-1:-1:-1;2012:5:11;2005:12;;1431:300:7;1533:4;-1:-1:-1;;;;;;1568:40:7;;-1:-1:-1;;;1568:40:7;;:104;;-1:-1:-1;;;;;;;1624:48:7;;-1:-1:-1;;;1624:48:7;1568:104;:156;;;;1688:36;1712:11;1688:23;:36::i;8443:311::-;8568:18;8574:2;8578:7;8568:5;:18::i;:::-;8617:54;8648:1;8652:2;8656:7;8665:5;8617:22;:54::i;:::-;8596:151;;;;-1:-1:-1;;;8596:151:7;;;;;;;:::i;14105:214:3:-;14204:16;14212:7;14204;:16::i;:::-;14196:75;;;;-1:-1:-1;;;14196:75:3;;;;;;;:::i;:::-;14281:19;;;;:10;:19;;;;;;;;:31;;;;;;;;:::i;5914:440::-;-1:-1:-1;;;;;6103:18:3;;;;:44;;;6125:22;:20;:22::i;:::-;6095:92;;;;-1:-1:-1;;;6095:92:3;;;;;;;:::i;:::-;6206:36;6229:4;6234:7;6206:22;:36::i;:::-;6205:37;6197:95;;;;-1:-1:-1;;;6197:95:3;;;;;;;:::i;:::-;6302:45;6329:4;6335:2;6339:7;6302:26;:45::i;4747:484:0:-;4827:22;4835:4;4841:7;4827;:22::i;:::-;4822:403;;5010:41;5038:7;-1:-1:-1;;;;;5010:41:0;5048:2;5010:19;:41::i;:::-;5122:38;5150:4;5157:2;5122:19;:38::i;:::-;4917:265;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;4917:265:0;;;;;;;;;;-1:-1:-1;;;4865:349:0;;;;;;;:::i;8242:225::-;8316:22;8324:4;8330:7;8316;:22::i;:::-;8312:149;;;8386:5;8354:12;;;;;;;;;;;-1:-1:-1;;;;;8354:29:0;;;;;;;;;:37;;-1:-1:-1;;8354:37:0;;;8437:12;:10;:12::i;:::-;-1:-1:-1;;;;;8410:40:0;8428:7;-1:-1:-1;;;;;8410:40:0;8422:4;8410:40;;;;;;;;;;8242:225;;:::o;2202:1388:11:-;2268:4;2405:19;;;:12;;;:19;;;;;;2439:15;;2435:1149;;2808:21;2832:14;2845:1;2832:10;:14;:::i;:::-;2880:18;;2808:38;;-1:-1:-1;2860:17:11;;2880:22;;2901:1;;2880:22;:::i;:::-;2860:42;;2934:13;2921:9;:26;2917:398;;2967:17;2987:3;:11;;2999:9;2987:22;;;;;;-1:-1:-1;;;2987:22:11;;;;;;;;;;;;;;;;;2967:42;;3138:9;3109:3;:11;;3121:13;3109:26;;;;;;-1:-1:-1;;;3109:26:11;;;;;;;;;;;;;;;;;;;;:38;;;;3221:23;;;:12;;;:23;;;;;:36;;;2917:398;3393:17;;:3;;:17;;;-1:-1:-1;;;3393:17:11;;;;;;;;;;;;;;;;;;;;;;;;;;3485:3;:12;;:19;3498:5;3485:19;;;;;;;;;;;3478:26;;;3526:4;3519:11;;;;;;;2435:1149;3568:5;3561:12;;;;;9665:348:7;9724:13;9740:23;9755:7;9740:14;:23::i;:::-;9724:39;;9774:48;9795:5;9810:1;9814:7;9774:20;:48::i;:::-;9860:29;9877:1;9881:7;9860:8;:29::i;:::-;-1:-1:-1;;;;;9900:16:7;;;;;;:9;:16;;;;;:21;;9920:1;;9900:16;:21;;9920:1;;9900:21;:::i;:::-;;;;-1:-1:-1;;9938:16:7;;;;:7;:16;;;;;;9931:23;;-1:-1:-1;;;;;;9931:23:7;;;9970:36;9946:7;;9938:16;-1:-1:-1;;;;;9970:36:7;;;;;9938:16;;9970:36;9665:348;;:::o;7741:1055:23:-;7845:17;7877:4;-1:-1:-1;;;;;7877:20:23;;7898:14;7914:4;7931:8;6598:1;7920:43;;;;;;;;;:::i;:::-;;;;;;;;;;;;;7877:87;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;8195:15:23;8279:16;;;:6;:16;;;;;;8214:82;;8231:8;;8195:15;;8272:4;;8214:16;:82::i;:::-;8726:16;;;;:6;:16;;;;;;8195:101;;-1:-1:-1;8726:20:23;;8745:1;8726:20;:::i;:::-;8707:16;;;;:6;:16;;;;;:39;8759:32;8714:8;8783:7;8759:13;:32::i;4328:118:11:-;4395:7;4421:3;:11;;4433:5;4421:18;;;;;;-1:-1:-1;;;4421:18:11;;;;;;;;;;;;;;;;;4414:25;;4328:118;;;;:::o;11732:782:7:-;11882:4;11902:15;:2;-1:-1:-1;;;;;11902:13:7;;:15::i;:::-;11898:610;;;11953:2;-1:-1:-1;;;;;11937:36:7;;11974:12;:10;:12::i;:::-;11988:4;11994:7;12003:5;11937:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11937:72:7;;;;;;;;-1:-1:-1;;11937:72:7;;;;;;;;;;;;:::i;:::-;;;11933:523;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12180:13:7;;12176:266;;12222:60;;-1:-1:-1;;;12222:60:7;;;;;;;:::i;12176:266::-;12394:6;12388:13;12379:6;12375:2;12371:15;12364:38;11933:523;-1:-1:-1;;;;;;12059:55:7;-1:-1:-1;;;12059:55:7;;-1:-1:-1;12052:62:7;;11898:610;-1:-1:-1;12493:4:7;11732:782;;;;;;:::o;3879:107:11:-;3961:18;;3879:107::o;3671:127::-;3744:4;3767:19;;;:12;;;;;:19;;;;;;:24;;;3671:127::o;802:212:1:-;887:4;-1:-1:-1;;;;;;910:57:1;;-1:-1:-1;;;910:57:1;;:97;;;971:36;995:11;971:23;:36::i;9076:372:7:-;-1:-1:-1;;;;;9155:16:7;;9147:61;;;;-1:-1:-1;;;9147:61:7;;;;;;;:::i;:::-;9227:16;9235:7;9227;:16::i;:::-;9226:17;9218:58;;;;-1:-1:-1;;;9218:58:7;;;;;;;:::i;:::-;9287:45;9316:1;9320:2;9324:7;9287:20;:45::i;:::-;-1:-1:-1;;;;;9343:13:7;;;;;;:9;:13;;;;;:18;;9360:1;;9343:13;:18;;9360:1;;9343:18;:::i;:::-;;;;-1:-1:-1;;9371:16:7;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;9371:21:7;-1:-1:-1;;;;;9371:21:7;;;;;;;;9408:33;;9371:16;;;9408:33;;9371:16;;9408:33;9076:372;;:::o;577:267:10:-;716:45;743:4;749:2;753:7;716:26;:45::i;:::-;781:8;:6;:8::i;:::-;780:9;772:65;;;;-1:-1:-1;;;772:65:10;;;;;;;:::i;1535:441:22:-;1610:13;1635:19;1667:10;1671:6;1667:1;:10;:::i;:::-;:14;;1680:1;1667:14;:::i;:::-;1657:25;;;;;;-1:-1:-1;;;1657:25:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1657:25:22;;1635:47;;-1:-1:-1;;;1692:6:22;1699:1;1692:9;;;;;;-1:-1:-1;;;1692:9:22;;;;;;;;;;;;:15;-1:-1:-1;;;;;1692:15:22;;;;;;;;;-1:-1:-1;;;1717:6:22;1724:1;1717:9;;;;;;-1:-1:-1;;;1717:9:22;;;;;;;;;;;;:15;-1:-1:-1;;;;;1717:15:22;;;;;;;;-1:-1:-1;1747:9:22;1759:10;1763:6;1759:1;:10;:::i;:::-;:14;;1772:1;1759:14;:::i;:::-;1747:26;;1742:132;1779:1;1775;:5;1742:132;;;-1:-1:-1;;;1826:5:22;1834:3;1826:11;1813:25;;;;;-1:-1:-1;;;1813:25:22;;;;;;;;;;;;1801:6;1808:1;1801:9;;;;;;-1:-1:-1;;;1801:9:22;;;;;;;;;;;;:37;-1:-1:-1;;;;;1801:37:22;;;;;;;;-1:-1:-1;1862:1:22;1852:11;;;;;1782:3;;;:::i;:::-;;;1742:132;;;-1:-1:-1;1891:10:22;;1883:55;;;;-1:-1:-1;;;1883:55:22;;;;;;;:::i;797:266:24:-;958:7;1016:8;1026:9;1037:10;1049:6;1005:51;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;1005:51:24;;;;;;;;;995:62;;1005:51;995:62;;;;;797:266;-1:-1:-1;;;;;797:266:24:o;1443:204::-;1561:7;1617:8;1627:13;1600:41;;;;;;;;;:::i;:::-;;;;;;;;;;;;;1590:52;;;;;;1583:59;;1443:204;;;;:::o;718:377:2:-;1034:20;1080:8;;;718:377::o;4040:202:0:-;4125:4;-1:-1:-1;;;;;;4148:47:0;;-1:-1:-1;;;4148:47:0;;:87;;;4199:36;4223:11;4199:23;:36::i;2543:572:9:-;2682:45;2709:4;2715:2;2719:7;2682:26;:45::i;:::-;-1:-1:-1;;;;;2742:18:9;;2738:183;;2776:40;2808:7;2776:31;:40::i;:::-;2738:183;;;2845:2;-1:-1:-1;;;;;2837:10:9;:4;-1:-1:-1;;;;;2837:10:9;;2833:88;;2863:47;2896:4;2902:7;2863:32;:47::i;:::-;-1:-1:-1;;;;;2934:16:9;;2930:179;;2966:45;3003:7;2966:36;:45::i;:::-;2930:179;;;3038:4;-1:-1:-1;;;;;3032:10:9;:2;-1:-1:-1;;;;;3032:10:9;;3028:81;;3058:40;3086:2;3090:7;3058:27;:40::i;763:155:5:-;-1:-1:-1;;;;;;871:40:5;;-1:-1:-1;;;871:40:5;763:155;;;:::o;3821:161:9:-;3924:10;:17;;3897:24;;;;:15;:24;;;;;:44;;;3951:24;;;;;;;;;;;;3821:161::o;4599:970::-;4861:22;4911:1;4886:22;4903:4;4886:16;:22::i;:::-;:26;;;;:::i;:::-;4922:18;4943:26;;;:17;:26;;;;;;4861:51;;-1:-1:-1;5073:28:9;;;5069:323;;-1:-1:-1;;;;;5139:18:9;;5117:19;5139:18;;;:12;:18;;;;;;;;:34;;;;;;;;;5188:30;;;;;;:44;;;5304:30;;:17;:30;;;;;:43;;;5069:323;-1:-1:-1;5485:26:9;;;;:17;:26;;;;;;;;5478:33;;;-1:-1:-1;;;;;5528:18:9;;;;;:12;:18;;;;;:34;;;;;;;5521:41;4599:970::o;5857:1061::-;6131:10;:17;6106:22;;6131:21;;6151:1;;6131:21;:::i;:::-;6162:18;6183:24;;;:15;:24;;;;;;6551:10;:26;;6106:46;;-1:-1:-1;6183:24:9;;6106:46;;6551:26;;;;-1:-1:-1;;;6551:26:9;;;;;;;;;;;;;;;;;6529:48;;6613:11;6588:10;6599;6588:22;;;;;;-1:-1:-1;;;6588:22:9;;;;;;;;;;;;;;;;;;;;:36;;;;6692:28;;;:15;:28;;;;;;;:41;;;6861:24;;;;;6854:31;6895:10;:16;;;;;-1:-1:-1;;;6895:16:9;;;;;;;;;;;;;;;;;;;;;;;;;;5857:1061;;;;:::o;3409:217::-;3493:14;3510:20;3527:2;3510:16;:20::i;:::-;-1:-1:-1;;;;;3540:16:9;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;3584:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;3409:217:9:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:409:25;;114:18;106:6;103:30;100:2;;;136:18;;:::i;:::-;174:58;220:2;197:17;;-1:-1:-1;;193:31:25;226:4;189:42;174:58;:::i;:::-;165:67;;255:6;248:5;241:21;295:3;286:6;281:3;277:16;274:25;271:2;;;312:1;309;302:12;271:2;361:6;356:3;349:4;342:5;338:16;325:43;415:1;408:4;399:6;392:5;388:18;384:29;377:40;90:333;;;;;:::o;428:175::-;498:20;;-1:-1:-1;;;;;547:31:25;;537:42;;527:2;;593:1;590;583:12;608:198;;720:2;708:9;699:7;695:23;691:32;688:2;;;741:6;733;726:22;688:2;769:31;790:9;769:31;:::i;811:274::-;;;940:2;928:9;919:7;915:23;911:32;908:2;;;961:6;953;946:22;908:2;989:31;1010:9;989:31;:::i;:::-;979:41;;1039:40;1075:2;1064:9;1060:18;1039:40;:::i;:::-;1029:50;;898:187;;;;;:::o;1090:342::-;;;;1236:2;1224:9;1215:7;1211:23;1207:32;1204:2;;;1257:6;1249;1242:22;1204:2;1285:31;1306:9;1285:31;:::i;:::-;1275:41;;1335:40;1371:2;1360:9;1356:18;1335:40;:::i;:::-;1325:50;;1422:2;1411:9;1407:18;1394:32;1384:42;;1194:238;;;;;:::o;1437:702::-;;;;;1609:3;1597:9;1588:7;1584:23;1580:33;1577:2;;;1631:6;1623;1616:22;1577:2;1659:31;1680:9;1659:31;:::i;:::-;1649:41;;1709:40;1745:2;1734:9;1730:18;1709:40;:::i;:::-;1699:50;;1796:2;1785:9;1781:18;1768:32;1758:42;;1851:2;1840:9;1836:18;1823:32;1878:18;1870:6;1867:30;1864:2;;;1915:6;1907;1900:22;1864:2;1943:22;;1996:4;1988:13;;1984:27;-1:-1:-1;1974:2:25;;2030:6;2022;2015:22;1974:2;2058:75;2125:7;2120:2;2107:16;2102:2;2098;2094:11;2058:75;:::i;:::-;2048:85;;;1567:572;;;;;;;:::o;2144:329::-;;;2270:2;2258:9;2249:7;2245:23;2241:32;2238:2;;;2291:6;2283;2276:22;2238:2;2319:31;2340:9;2319:31;:::i;:::-;2309:41;;2400:2;2389:9;2385:18;2372:32;2413:30;2437:5;2413:30;:::i;:::-;2462:5;2452:15;;;2228:245;;;;;:::o;2478:266::-;;;2607:2;2595:9;2586:7;2582:23;2578:32;2575:2;;;2628:6;2620;2613:22;2575:2;2656:31;2677:9;2656:31;:::i;:::-;2646:41;2734:2;2719:18;;;;2706:32;;-1:-1:-1;;;2565:179:25:o;2749:1010::-;;2864:2;2907;2895:9;2886:7;2882:23;2878:32;2875:2;;;2928:6;2920;2913:22;2875:2;2973:9;2960:23;3002:18;3043:2;3035:6;3032:14;3029:2;;;3064:6;3056;3049:22;3029:2;3107:6;3096:9;3092:22;3082:32;;3152:7;3145:4;3141:2;3137:13;3133:27;3123:2;;3179:6;3171;3164:22;3123:2;3220;3207:16;3242:2;3238;3235:10;3232:2;;;3248:18;;:::i;:::-;3295:2;3291;3287:11;3277:21;;3318:27;3341:2;3337;3333:11;3318:27;:::i;:::-;3379:15;;;3410:12;;;;3442:11;;;3472;;;3468:20;;3465:33;-1:-1:-1;3462:2:25;;;3516:6;3508;3501:22;3462:2;3543:6;3534:15;;3558:171;3572:2;3569:1;3566:9;3558:171;;;3629:25;3650:3;3629:25;:::i;:::-;3617:38;;3590:1;3583:9;;;;;3675:12;;;;3707;;3558:171;;;-1:-1:-1;3748:5:25;2844:915;-1:-1:-1;;;;;;;;2844:915:25:o;3764:253::-;;3873:2;3861:9;3852:7;3848:23;3844:32;3841:2;;;3894:6;3886;3879:22;3841:2;3938:9;3925:23;3957:30;3981:5;3957:30;:::i;4022:257::-;;4142:2;4130:9;4121:7;4117:23;4113:32;4110:2;;;4163:6;4155;4148:22;4110:2;4200:9;4194:16;4219:30;4243:5;4219:30;:::i;4284:190::-;;4396:2;4384:9;4375:7;4371:23;4367:32;4364:2;;;4417:6;4409;4402:22;4364:2;-1:-1:-1;4445:23:25;;4354:120;-1:-1:-1;4354:120:25:o;4479:266::-;;;4608:2;4596:9;4587:7;4583:23;4579:32;4576:2;;;4629:6;4621;4614:22;4576:2;4670:9;4657:23;4647:33;;4699:40;4735:2;4724:9;4720:18;4699:40;:::i;4750:258::-;;;4879:2;4867:9;4858:7;4854:23;4850:32;4847:2;;;4900:6;4892;4885:22;4847:2;-1:-1:-1;;4928:23:25;;;4998:2;4983:18;;;4970:32;;-1:-1:-1;4837:171:25:o;5013:257::-;;5124:2;5112:9;5103:7;5099:23;5095:32;5092:2;;;5145:6;5137;5130:22;5092:2;5189:9;5176:23;5208:32;5234:5;5208:32;:::i;5275:261::-;;5397:2;5385:9;5376:7;5372:23;5368:32;5365:2;;;5418:6;5410;5403:22;5365:2;5455:9;5449:16;5474:32;5500:5;5474:32;:::i;5541:482::-;;5663:2;5651:9;5642:7;5638:23;5634:32;5631:2;;;5684:6;5676;5669:22;5631:2;5729:9;5716:23;5762:18;5754:6;5751:30;5748:2;;;5799:6;5791;5784:22;5748:2;5827:22;;5880:4;5872:13;;5868:27;-1:-1:-1;5858:2:25;;5914:6;5906;5899:22;5858:2;5942:75;6009:7;6004:2;5991:16;5986:2;5982;5978:11;5942:75;:::i;6223:194::-;;6346:2;6334:9;6325:7;6321:23;6317:32;6314:2;;;6367:6;6359;6352:22;6314:2;-1:-1:-1;6395:16:25;;6304:113;-1:-1:-1;6304:113:25:o;6422:259::-;;6503:5;6497:12;6530:6;6525:3;6518:19;6546:63;6602:6;6595:4;6590:3;6586:14;6579:4;6572:5;6568:16;6546:63;:::i;:::-;6663:2;6642:15;-1:-1:-1;;6638:29:25;6629:39;;;;6670:4;6625:50;;6473:208;-1:-1:-1;;6473:208:25:o;6686:247::-;6843:19;;;6887:2;6878:12;;6871:28;6924:2;6915:12;;6833:100::o;6938:470::-;;7155:6;7149:13;7171:53;7217:6;7212:3;7205:4;7197:6;7193:17;7171:53;:::i;:::-;7287:13;;7246:16;;;;7309:57;7287:13;7246:16;7343:4;7331:17;;7309:57;:::i;:::-;7382:20;;7125:283;-1:-1:-1;;;;7125:283:25:o;7413:786::-;;7824:25;7819:3;7812:38;7879:6;7873:13;7895:62;7950:6;7945:2;7940:3;7936:12;7929:4;7921:6;7917:17;7895:62;:::i;:::-;-1:-1:-1;;;8016:2:25;7976:16;;;8008:11;;;8001:40;8066:13;;8088:63;8066:13;8137:2;8129:11;;8122:4;8110:17;;8088:63;:::i;:::-;8171:17;8190:2;8167:26;;7802:397;-1:-1:-1;;;;7802:397:25:o;8204:203::-;-1:-1:-1;;;;;8368:32:25;;;;8350:51;;8338:2;8323:18;;8305:102::o;8412:304::-;-1:-1:-1;;;;;8642:15:25;;;8624:34;;8694:15;;8689:2;8674:18;;8667:43;8574:2;8559:18;;8541:175::o;8721:375::-;-1:-1:-1;;;;;8979:15:25;;;8961:34;;9031:15;;;;9026:2;9011:18;;9004:43;9078:2;9063:18;;9056:34;;;;8911:2;8896:18;;8878:218::o;9101:490::-;-1:-1:-1;;;;;9370:15:25;;;9352:34;;9422:15;;9417:2;9402:18;;9395:43;9469:2;9454:18;;9447:34;;;9517:3;9512:2;9497:18;;9490:31;;;9101:490;;9538:47;;9565:19;;9557:6;9538:47;:::i;:::-;9530:55;9304:287;-1:-1:-1;;;;;;9304:287:25:o;9596:274::-;-1:-1:-1;;;;;9788:32:25;;;;9770:51;;9852:2;9837:18;;9830:34;9758:2;9743:18;;9725:145::o;9875:387::-;;10107:1;10103;10098:3;10094:11;10090:19;10082:6;10078:32;10067:9;10060:51;10147:6;10142:2;10131:9;10127:18;10120:34;10190:2;10185;10174:9;10170:18;10163:30;10210:46;10252:2;10241:9;10237:18;10229:6;10210:46;:::i;:::-;10202:54;10050:212;-1:-1:-1;;;;;10050:212:25:o;10267:187::-;10432:14;;10425:22;10407:41;;10395:2;10380:18;;10362:92::o;10459:177::-;10605:25;;;10593:2;10578:18;;10560:76::o;10894:417::-;11125:25;;;11181:2;11166:18;;11159:34;;;;-1:-1:-1;;;;;11229:32:25;11224:2;11209:18;;11202:60;11293:2;11278:18;;11271:34;11112:3;11097:19;;11079:232::o;11316:221::-;;11465:2;11454:9;11447:21;11485:46;11527:2;11516:9;11512:18;11504:6;11485:46;:::i;11542:356::-;11744:2;11726:21;;;11763:18;;;11756:30;11822:34;11817:2;11802:18;;11795:62;11889:2;11874:18;;11716:182::o;11903:412::-;12105:2;12087:21;;;12144:2;12124:18;;;12117:30;12183:34;12178:2;12163:18;;12156:62;-1:-1:-1;;;12249:2:25;12234:18;;12227:46;12305:3;12290:19;;12077:238::o;12320:407::-;12522:2;12504:21;;;12561:2;12541:18;;;12534:30;12600:34;12595:2;12580:18;;12573:62;-1:-1:-1;;;12666:2:25;12651:18;;12644:41;12717:3;12702:19;;12494:233::o;12732:344::-;12934:2;12916:21;;;12973:2;12953:18;;;12946:30;-1:-1:-1;;;13007:2:25;12992:18;;12985:50;13067:2;13052:18;;12906:170::o;13081:351::-;13283:2;13265:21;;;13322:2;13302:18;;;13295:30;13361:29;13356:2;13341:18;;13334:57;13423:2;13408:18;;13255:177::o;13437:407::-;13639:2;13621:21;;;13678:2;13658:18;;;13651:30;13717:34;13712:2;13697:18;;13690:62;-1:-1:-1;;;13783:2:25;13768:18;;13761:41;13834:3;13819:19;;13611:233::o;13849:414::-;14051:2;14033:21;;;14090:2;14070:18;;;14063:30;14129:34;14124:2;14109:18;;14102:62;-1:-1:-1;;;14195:2:25;14180:18;;14173:48;14253:3;14238:19;;14023:240::o;14268:347::-;14470:2;14452:21;;;14509:2;14489:18;;;14482:30;14548:25;14543:2;14528:18;;14521:53;14606:2;14591:18;;14442:173::o;14620:402::-;14822:2;14804:21;;;14861:2;14841:18;;;14834:30;14900:34;14895:2;14880:18;;14873:62;-1:-1:-1;;;14966:2:25;14951:18;;14944:36;15012:3;14997:19;;14794:228::o;15027:356::-;15229:2;15211:21;;;15248:18;;;15241:30;15307:34;15302:2;15287:18;;15280:62;15374:2;15359:18;;15201:182::o;15388:352::-;15590:2;15572:21;;;15629:2;15609:18;;;15602:30;15668;15663:2;15648:18;;15641:58;15731:2;15716:18;;15562:178::o;15745:346::-;15947:2;15929:21;;;15986:2;15966:18;;;15959:30;-1:-1:-1;;;16020:2:25;16005:18;;15998:52;16082:2;16067:18;;15919:172::o;16096:400::-;16298:2;16280:21;;;16337:2;16317:18;;;16310:30;16376:34;16371:2;16356:18;;16349:62;-1:-1:-1;;;16442:2:25;16427:18;;16420:34;16486:3;16471:19;;16270:226::o;16501:349::-;16703:2;16685:21;;;16742:2;16722:18;;;16715:30;16781:27;16776:2;16761:18;;16754:55;16841:2;16826:18;;16675:175::o;16855:401::-;17057:2;17039:21;;;17096:2;17076:18;;;17069:30;17135:34;17130:2;17115:18;;17108:62;-1:-1:-1;;;17201:2:25;17186:18;;17179:35;17246:3;17231:19;;17029:227::o;17261:409::-;17463:2;17445:21;;;17502:2;17482:18;;;17475:30;17541:34;17536:2;17521:18;;17514:62;-1:-1:-1;;;17607:2:25;17592:18;;17585:43;17660:3;17645:19;;17435:235::o;17675:408::-;17877:2;17859:21;;;17916:2;17896:18;;;17889:30;17955:34;17950:2;17935:18;;17928:62;-1:-1:-1;;;18021:2:25;18006:18;;17999:42;18073:3;18058:19;;17849:234::o;18088:400::-;18290:2;18272:21;;;18329:2;18309:18;;;18302:30;18368:34;18363:2;18348:18;;18341:62;-1:-1:-1;;;18434:2:25;18419:18;;18412:34;18478:3;18463:19;;18262:226::o;18493:340::-;18695:2;18677:21;;;18734:2;18714:18;;;18707:30;-1:-1:-1;;;18768:2:25;18753:18;;18746:46;18824:2;18809:18;;18667:166::o;18838:339::-;19040:2;19022:21;;;19079:2;19059:18;;;19052:30;-1:-1:-1;;;19113:2:25;19098:18;;19091:45;19168:2;19153:18;;19012:165::o;19182:420::-;19384:2;19366:21;;;19423:2;19403:18;;;19396:30;19462:34;19457:2;19442:18;;19435:62;19533:26;19528:2;19513:18;;19506:54;19592:3;19577:19;;19356:246::o;19607:406::-;19809:2;19791:21;;;19848:2;19828:18;;;19821:30;19887:34;19882:2;19867:18;;19860:62;-1:-1:-1;;;19953:2:25;19938:18;;19931:40;20003:3;19988:19;;19781:232::o;20018:405::-;20220:2;20202:21;;;20259:2;20239:18;;;20232:30;20298:34;20293:2;20278:18;;20271:62;-1:-1:-1;;;20364:2:25;20349:18;;20342:39;20413:3;20398:19;;20192:231::o;20428:410::-;20630:2;20612:21;;;20669:2;20649:18;;;20642:30;20708:34;20703:2;20688:18;;20681:62;-1:-1:-1;;;20774:2:25;20759:18;;20752:44;20828:3;20813:19;;20602:236::o;20843:356::-;21045:2;21027:21;;;21064:18;;;21057:30;21123:34;21118:2;21103:18;;21096:62;21190:2;21175:18;;21017:182::o;21204:412::-;21406:2;21388:21;;;21445:2;21425:18;;;21418:30;21484:34;21479:2;21464:18;;21457:62;-1:-1:-1;;;21550:2:25;21535:18;;21528:46;21606:3;21591:19;;21378:238::o;21621:413::-;21823:2;21805:21;;;21862:2;21842:18;;;21835:30;21901:34;21896:2;21881:18;;21874:62;-1:-1:-1;;;21967:2:25;21952:18;;21945:47;22024:3;22009:19;;21795:239::o;22039:408::-;22241:2;22223:21;;;22280:2;22260:18;;;22253:30;22319:34;22314:2;22299:18;;22292:62;-1:-1:-1;;;22385:2:25;22370:18;;22363:42;22437:3;22422:19;;22213:234::o;22452:356::-;22654:2;22636:21;;;22673:18;;;22666:30;22732:34;22727:2;22712:18;;22705:62;22799:2;22784:18;;22626:182::o;22813:405::-;23015:2;22997:21;;;23054:2;23034:18;;;23027:30;23093:34;23088:2;23073:18;;23066:62;-1:-1:-1;;;23159:2:25;23144:18;;23137:39;23208:3;23193:19;;22987:231::o;23223:355::-;23425:2;23407:21;;;23464:2;23444:18;;;23437:30;23503:33;23498:2;23483:18;;23476:61;23569:2;23554:18;;23397:181::o;23583:355::-;23785:2;23767:21;;;23824:2;23804:18;;;23797:30;23863:33;23858:2;23843:18;;23836:61;23929:2;23914:18;;23757:181::o;23943:405::-;24145:2;24127:21;;;24184:2;24164:18;;;24157:30;24223:34;24218:2;24203:18;;24196:62;-1:-1:-1;;;24289:2:25;24274:18;;24267:39;24338:3;24323:19;;24117:231::o;24353:350::-;24555:2;24537:21;;;24594:2;24574:18;;;24567:30;24633:28;24628:2;24613:18;;24606:56;24694:2;24679:18;;24527:176::o;24708:397::-;24910:2;24892:21;;;24949:2;24929:18;;;24922:30;24988:34;24983:2;24968:18;;24961:62;-1:-1:-1;;;25054:2:25;25039:18;;25032:31;25095:3;25080:19;;24882:223::o;25110:346::-;25312:2;25294:21;;;25351:2;25331:18;;;25324:30;-1:-1:-1;;;25385:2:25;25370:18;;25363:52;25447:2;25432:18;;25284:172::o;25461:349::-;25663:2;25645:21;;;25702:2;25682:18;;;25675:30;25741:27;25736:2;25721:18;;25714:55;25801:2;25786:18;;25635:175::o;25815:348::-;26017:2;25999:21;;;26056:2;26036:18;;;26029:30;26095:26;26090:2;26075:18;;26068:54;26154:2;26139:18;;25989:174::o;26168:350::-;26370:2;26352:21;;;26409:2;26389:18;;;26382:30;26448:28;26443:2;26428:18;;26421:56;26509:2;26494:18;;26342:176::o;26523:353::-;26725:2;26707:21;;;26764:2;26744:18;;;26737:30;26803:31;26798:2;26783:18;;26776:59;26867:2;26852:18;;26697:179::o;26881:398::-;27083:2;27065:21;;;27122:2;27102:18;;;27095:30;27161:34;27156:2;27141:18;;27134:62;-1:-1:-1;;;27227:2:25;27212:18;;27205:32;27269:3;27254:19;;27055:224::o;27284:413::-;27486:2;27468:21;;;27525:2;27505:18;;;27498:30;27564:34;27559:2;27544:18;;27537:62;-1:-1:-1;;;27630:2:25;27615:18;;27608:47;27687:3;27672:19;;27458:239::o;27702:398::-;27904:2;27886:21;;;27943:2;27923:18;;;27916:30;27982:34;27977:2;27962:18;;27955:62;-1:-1:-1;;;28048:2:25;28033:18;;28026:32;28090:3;28075:19;;27876:224::o;28105:412::-;28307:2;28289:21;;;28346:2;28326:18;;;28319:30;28385:34;28380:2;28365:18;;28358:62;-1:-1:-1;;;28451:2:25;28436:18;;28429:46;28507:3;28492:19;;28279:238::o;28522:347::-;28724:2;28706:21;;;28763:2;28743:18;;;28736:30;28802:25;28797:2;28782:18;;28775:53;28860:2;28845:18;;28696:173::o;28874:403::-;29076:2;29058:21;;;29115:2;29095:18;;;29088:30;29154:34;29149:2;29134:18;;29127:62;-1:-1:-1;;;29220:2:25;29205:18;;29198:37;29267:3;29252:19;;29048:229::o;29282:408::-;29484:2;29466:21;;;29523:2;29503:18;;;29496:30;29562:34;29557:2;29542:18;;29535:62;-1:-1:-1;;;29628:2:25;29613:18;;29606:42;29680:3;29665:19;;29456:234::o;29695:409::-;29897:2;29879:21;;;29936:2;29916:18;;;29909:30;29975:34;29970:2;29955:18;;29948:62;-1:-1:-1;;;30041:2:25;30026:18;;30019:43;30094:3;30079:19;;29869:235::o;30109:419::-;30311:2;30293:21;;;30350:2;30330:18;;;30323:30;30389:34;30384:2;30369:18;;30362:62;30460:25;30455:2;30440:18;;30433:53;30518:3;30503:19;;30283:245::o;30533:344::-;30735:2;30717:21;;;30774:2;30754:18;;;30747:30;-1:-1:-1;;;30808:2:25;30793:18;;30786:50;30868:2;30853:18;;30707:170::o;30882:412::-;31084:2;31066:21;;;31123:2;31103:18;;;31096:30;31162:34;31157:2;31142:18;;31135:62;-1:-1:-1;;;31228:2:25;31213:18;;31206:46;31284:3;31269:19;;31056:238::o;31299:401::-;31501:2;31483:21;;;31540:2;31520:18;;;31513:30;31579:34;31574:2;31559:18;;31552:62;-1:-1:-1;;;31645:2:25;31630:18;;31623:35;31690:3;31675:19;;31473:227::o;31705:411::-;31907:2;31889:21;;;31946:2;31926:18;;;31919:30;31985:34;31980:2;31965:18;;31958:62;-1:-1:-1;;;32051:2:25;32036:18;;32029:45;32106:3;32091:19;;31879:237::o;32121:399::-;32323:2;32305:21;;;32362:2;32342:18;;;32335:30;32401:34;32396:2;32381:18;;32374:62;-1:-1:-1;;;32467:2:25;32452:18;;32445:33;32510:3;32495:19;;32295:225::o;32707:251::-;32777:2;32771:9;32807:17;;;32854:18;32839:34;;32875:22;;;32836:62;32833:2;;;32901:18;;:::i;:::-;32937:2;32930:22;32751:207;;-1:-1:-1;32751:207:25:o;32963:128::-;;33034:1;33030:6;33027:1;33024:13;33021:2;;;33040:18;;:::i;:::-;-1:-1:-1;33076:9:25;;33011:80::o;33096:120::-;;33162:1;33152:2;;33167:18;;:::i;:::-;-1:-1:-1;33201:9:25;;33142:74::o;33221:168::-;;33327:1;33323;33319:6;33315:14;33312:1;33309:21;33304:1;33297:9;33290:17;33286:45;33283:2;;;33334:18;;:::i;:::-;-1:-1:-1;33374:9:25;;33273:116::o;33394:125::-;;33462:1;33459;33456:8;33453:2;;;33467:18;;:::i;:::-;-1:-1:-1;33504:9:25;;33443:76::o;33524:258::-;33596:1;33606:113;33620:6;33617:1;33614:13;33606:113;;;33696:11;;;33690:18;33677:11;;;33670:39;33642:2;33635:10;33606:113;;;33737:6;33734:1;33731:13;33728:2;;;-1:-1:-1;;33772:1:25;33754:16;;33747:27;33577:205::o;33787:136::-;;33854:5;33844:2;;33863:18;;:::i;:::-;-1:-1:-1;;;33899:18:25;;33834:89::o;33928:380::-;34013:1;34003:12;;34060:1;34050:12;;;34071:2;;34125:4;34117:6;34113:17;34103:27;;34071:2;34178;34170:6;34167:14;34147:18;34144:38;34141:2;;;34224:10;34219:3;34215:20;34212:1;34205:31;34259:4;34256:1;34249:15;34287:4;34284:1;34277:15;34141:2;;33983:325;;;:::o;34313:135::-;;-1:-1:-1;;34373:17:25;;34370:2;;;34393:18;;:::i;:::-;-1:-1:-1;34440:1:25;34429:13;;34360:88::o;34453:112::-;;34511:1;34501:2;;34516:18;;:::i;:::-;-1:-1:-1;34550:9:25;;34491:74::o;34570:127::-;34631:10;34626:3;34622:20;34619:1;34612:31;34662:4;34659:1;34652:15;34686:4;34683:1;34676:15;34702:127;34763:10;34758:3;34754:20;34751:1;34744:31;34794:4;34791:1;34784:15;34818:4;34815:1;34808:15;34834:127;34895:10;34890:3;34886:20;34883:1;34876:31;34926:4;34923:1;34916:15;34950:4;34947:1;34940:15;34966:120;35054:5;35047:13;35040:21;35033:5;35030:32;35020:2;;35076:1;35073;35066:12;35091:133;-1:-1:-1;;;;;;35167:32:25;;35157:43;;35147:2;;35214:1;35211;35204:12
Swarm Source
ipfs://18b6fa9e6262da212a4785a49d6ab963f77d44a89dc9f305cc699f0dff46a35d
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.