ERC-721
Overview
Max Total Supply
0 GenMu
Holders
157
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 GenMuLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Gener8tiveMutationsERC721
Compiler Version
v0.8.0+commit.c7dfd78e
Optimization Enabled:
No with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
//SPDX-License-Identifier: MIT pragma solidity ^0.8.0; pragma abicoder v2; import "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol"; import "@openzeppelin/contracts/token/ERC721/utils/ERC721Holder.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/utils/Counters.sol"; import "@openzeppelin/contracts/utils/Strings.sol"; contract Gener8tiveMutationsERC721 is ERC721URIStorage, ERC721Holder, Ownable { using Counters for Counters.Counter; using Strings for uint256; // ======================================================= // EVENTS // ======================================================= event TokenMinted(uint256 indexed tokenIndex, string tokenUri); event PriceChanged(uint256 newPrice); event ContractMetaDataAdded(uint8 index, string info); event TokenUriUpdated(uint16 tokenId, string uri); // ======================================================= // STORAGE // ======================================================= Counters.Counter public tokenId; uint256 public price = 350000000 gwei; uint256 public feePercentage = 50; uint16 public maxSupply = 256; string[] public contractMetadata; address payable public causeBeneficiary; mapping(uint256 => address) public creators; string mintBaseUrl; string[] rarities = ["Ultra Rare", "Extremely Rare", "Extremely Rare", "Extremely Rare", "Rare", "Rare", "Rare", "Rare", "Rare", "Rare", "Rare", "Rare", "Extremely Rare", "Extremely Rare", "Extremely Rare", "Ultra Rare"]; uint8[] tuning_numCreatorTrianges = [3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6]; uint8[] tuning_numSpikes = [8, 8, 8, 8, 7, 7, 6, 6, 5, 5, 4, 4, 3, 3, 2, 1]; uint8[] tuning_spikeAngleMultiplier = [2, 3, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 7, 8, 8, 8]; uint8[] tuning_spikeLengthMultiplier = [4, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 1, 1, 1]; uint16[] tuning_creatorDrawMultiplier = [20, 19, 18, 17, 16, 15, 14, 14, 13, 13, 12, 12, 11, 11, 10, 9]; bool mintingEnabled = true; // ======================================================= // STRUCTS & ENUMS // ======================================================= struct Triangle { uint x1; uint y1; uint x2; uint y2; uint x3; uint y3; } struct HslColor { uint32 hue; uint saturation; uint lightness; } struct Spike { uint8 x; uint8 y; } struct TokenData { uint8 variant; uint8 mutationParts; uint16 mutationMultiplier; uint8 numSpikes; uint8 spikeAngle; uint8 spikeLength; bytes creator; bytes32 tokenHash; string rarity; HslColor creatorColor; Triangle[] creatorTriangles; Spike[] spikes; } // ======================================================= // CONSTRUCTOR // ======================================================= constructor(string memory _name, string memory _symbol, string memory _baseUrl, address payable _causeBeneficiary ) ERC721(_name, _symbol) { contractMetadata = new string[](10); mintBaseUrl = _baseUrl; changeCauseBeneficiary(_causeBeneficiary); } // ======================================================= // ADMIN // ======================================================= function applyHandbrake() public onlyOwner { mintingEnabled = false; } function releaseHandbrake() public onlyOwner { mintingEnabled = true; } function updateTokenURI(uint16 _tokenId, string memory newTokenURI) public onlyOwner { super._setTokenURI(_tokenId, newTokenURI); emit TokenUriUpdated(_tokenId, newTokenURI); } function changeCauseBeneficiary(address payable newCauseBeneficiary) public onlyOwner { causeBeneficiary = newCauseBeneficiary; } function changeFeePercentage(uint256 percentage) public onlyOwner { feePercentage = percentage; } function changePrice(uint256 newPrice) public onlyOwner { price = newPrice; emit PriceChanged(newPrice); } function writeContractMetaData(uint8 index, string memory info) public onlyOwner { contractMetadata[index] = info; emit ContractMetaDataAdded(index, info); } function withdrawFunds(address payable recipient, uint256 amount) public onlyOwner { recipient.transfer(amount); } function ownerMint(address ownerAddress) public onlyOwner { internalMint(ownerAddress); } // ======================================================= // UTILS & HELPERS // ======================================================= function getCreatorData(bytes memory creator, uint8 numCreatorTrianges, uint16 creatorDrawMultiplier) private pure returns(HslColor memory creatorColor, Triangle[] memory creatorTriangles) { uint8 pointer = 0; creatorColor = HslColor({ hue: uint8((creator[pointer] >> 4) & 0x0f), //22.5 accuracy saturation: uint8(creator[pointer] & 0x0f), //6.25 accuracy lightness: uint8(creator[++pointer] >> 4) & 0x0f //6.25 accuracy }); creatorTriangles = new Triangle[](numCreatorTrianges); for(uint8 t = 0; t < numCreatorTrianges; t++) { Triangle memory triangle = Triangle({ x1: uint8(creator[pointer] & 0x0f) * creatorDrawMultiplier, y1: uint8((creator[++pointer] >> 4) & 0x0f) * creatorDrawMultiplier, x2: uint8(creator[pointer] & 0x0f) * creatorDrawMultiplier, y2: uint8((creator[++pointer] >> 4) & 0x0f) * creatorDrawMultiplier, x3: uint8(creator[pointer] & 0x0f) * creatorDrawMultiplier, y3: uint8((creator[++pointer] >> 4) & 0x0f) * creatorDrawMultiplier }); creatorTriangles[t] = triangle; } } function getSpikeData(bytes32 tokenHash, uint8 numSpikes, uint8 spikeAngleMultiplier, uint8 spikeLengthMultiplier ) private pure returns(Spike[] memory spikes) { uint8 pointer = 0; spikes = new Spike[](numSpikes); for(uint8 s = 0; s < numSpikes; s++) { Spike memory spike = Spike({ x: uint8((tokenHash[pointer] >> 4) & 0x0f) * spikeAngleMultiplier, y: uint8(tokenHash[pointer] & 0x0f) * spikeLengthMultiplier }); pointer++; spikes[s] = spike; } } function getMutationData(uint16 _tokenId, uint8 numCreatorTrianges, uint16 creatorDrawMultiplier, uint8 numSpikes, uint8 spikeAngleMultiplier, uint8 spikeLengthMultiplier ) private view returns(bytes memory creator, bytes32 tokenHash, HslColor memory creatorColor, Triangle[] memory creatorTriangles, Spike[] memory spikes ) { //creator signature creator = abi.encodePacked(creators[_tokenId]); tokenHash = keccak256(abi.encodePacked(_tokenId)); (creatorColor, creatorTriangles) = getCreatorData(creator, numCreatorTrianges, creatorDrawMultiplier); // spikes spikes = getSpikeData(tokenHash, numSpikes, spikeAngleMultiplier, spikeLengthMultiplier); } function div256(uint256 a, uint256 b) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 require(b > 0); uint256 c = a / b; return c; } function internalMint(address owner) private { super._safeMint(msg.sender, tokenId.current()); string memory tokenUri = string(abi.encodePacked(mintBaseUrl, tokenId.current().toString())); super._setTokenURI(tokenId.current(), tokenUri); creators[tokenId.current()] = owner; tokenId.increment(); emit TokenMinted(tokenId.current() - 1, tokenUri); } // ======================================================= // PUBLIC API // ======================================================= function getSupplyData() external view returns( uint256 currentTokenId, uint256 supplyDataPrice, uint16 supplyDataMaxSupply, address cBeneficiary, uint256 supplyDataFeePercentage ) { currentTokenId = tokenId.current(); supplyDataPrice = price; supplyDataMaxSupply = maxSupply; cBeneficiary = causeBeneficiary; supplyDataFeePercentage = feePercentage; } function mint() external payable { // check minting handbrake require(mintingEnabled, "Minting is currently disabled"); // ensure the max supply has not been reached if(tokenId.current() > 0) { require(tokenId.current() - 1 < maxSupply, "Max tokens issued"); } // disallow same creator for two consecutive tokens if(tokenId.current() > 0) { require(creators[tokenId.current() - 1] != msg.sender); } // ensure sufficient funds were sent require(msg.value >= price, "Insufficient ETH sent"); // // calculate system fees percentage uint256 fee = div256((feePercentage * msg.value), 100); // // send to cause beneficiary (revert if no beneficiary is set) require(causeBeneficiary != address(0), "Cause Beneficiary not set"); causeBeneficiary.transfer(msg.value - fee); internalMint(msg.sender); } function getCreatorOfToken(uint256 _tokenId) public view returns (address creatorAddress) { creatorAddress = creators[_tokenId]; } function getVariantData(uint16 _tokenId) public view returns (TokenData[] memory tokenData) { require(_exists(_tokenId), "Requested token does not exist yet"); uint16 startIndex; uint8 variant; if(_tokenId < 16) { startIndex = 0; variant = 1; } else if(_tokenId < 32) { startIndex = 16; variant = 2; } else if(_tokenId < 48) { startIndex = 32; variant = 3; } else if(_tokenId < 64) { startIndex = 48; variant = 4; } else if(_tokenId < 80) { startIndex = 64; variant = 5; } else if(_tokenId < 96) { startIndex = 80; variant = 6; } else if(_tokenId < 112) { startIndex = 96; variant = 7; } else if(_tokenId < 128) { startIndex = 112; variant = 8; } else if(_tokenId < 144) { startIndex = 128; variant = 9; } else if(_tokenId < 160) { startIndex = 144; variant = 10; } else if(_tokenId < 176) { startIndex = 160; variant = 11; } else if(_tokenId < 192) { startIndex = 176; variant = 12; } else if(_tokenId < 208) { startIndex = 192; variant = 13; } else if(_tokenId < 224) { startIndex = 208; variant = 14; } else if(_tokenId < 240) { startIndex = 224; variant = 15; } else if(_tokenId < 256) { startIndex = 240; variant = 16; } tokenData = new TokenData[]((_tokenId % 16) + 1); bytes memory tmpCreator; bytes32 tmpTokenHash; HslColor memory tmpCreatorColor; Triangle[] memory tmpCreatorTriangles; Spike[] memory tmpSpikes; uint8 counter = 0; for(uint16 i = startIndex; i <= _tokenId; i++) { (tmpCreator, tmpTokenHash, tmpCreatorColor, tmpCreatorTriangles, tmpSpikes) = getMutationData ( i, tuning_numCreatorTrianges[variant - 1], tuning_creatorDrawMultiplier[variant - 1], tuning_numSpikes[variant - 1], tuning_spikeAngleMultiplier[variant - 1], tuning_spikeLengthMultiplier[variant - 1] ); tokenData[counter] = TokenData({ variant: variant, mutationParts: tuning_numCreatorTrianges[variant - 1], mutationMultiplier: tuning_creatorDrawMultiplier[variant - 1], numSpikes: tuning_numSpikes[variant - 1], spikeAngle: tuning_spikeAngleMultiplier[variant - 1], spikeLength: tuning_spikeLengthMultiplier[variant - 1], creator: tmpCreator, tokenHash: tmpTokenHash, creatorColor: tmpCreatorColor, creatorTriangles: tmpCreatorTriangles, spikes: tmpSpikes, rarity: rarities[counter] }); counter ++; } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../utils/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 () { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC721.sol"; import "./IERC721Receiver.sol"; import "./extensions/IERC721Metadata.sol"; import "./extensions/IERC721Enumerable.sol"; import "../../utils/Address.sol"; import "../../utils/Context.sol"; import "../../utils/Strings.sol"; import "../../utils/introspection/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}. 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 || ERC721.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 || ERC721.isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint(address to, uint256 tokenId, bytes memory _data) internal virtual { _mint(to, tokenId); require(_checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer(address from, address to, uint256 tokenId) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory _data) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { // solhint-disable-next-line no-inline-assembly assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal virtual { } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../../utils/introspection/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; /** * @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; import "../ERC721.sol"; /** * @dev ERC721 token with storage based token URI management. */ abstract contract ERC721URIStorage is ERC721 { using Strings for uint256; // Optional mapping for token URIs mapping (uint256 => string) private _tokenURIs; /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721URIStorage: URI query for nonexistent token"); string memory _tokenURI = _tokenURIs[tokenId]; string memory base = _baseURI(); // If there is no base URI, return the token URI. if (bytes(base).length == 0) { return _tokenURI; } // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked). if (bytes(_tokenURI).length > 0) { return string(abi.encodePacked(base, _tokenURI)); } return super.tokenURI(tokenId); } /** * @dev Sets `_tokenURI` as the tokenURI of `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual { require(_exists(tokenId), "ERC721URIStorage: URI set of nonexistent token"); _tokenURIs[tokenId] = _tokenURI; } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual override { super._burn(tokenId); if (bytes(_tokenURIs[tokenId]).length != 0) { delete _tokenURIs[tokenId]; } } }
// 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; import "../IERC721Receiver.sol"; /** * @dev Implementation of the {IERC721Receiver} interface. * * Accepts all token transfers. * Make sure the contract is able to use its token with {IERC721-safeTransferFrom}, {IERC721-approve} or {IERC721-setApprovalForAll}. */ contract ERC721Holder is IERC721Receiver { /** * @dev See {IERC721Receiver-onERC721Received}. * * Always returns `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received(address, address, uint256, bytes memory) public virtual override returns (bytes4) { return this.onERC721Received.selector; } }
// 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; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: value }(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// 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) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented or decremented by one. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant alphabet = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = alphabet[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } }
// 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; /** * @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); }
{ "remappings": [], "optimizer": { "enabled": false, "runs": 200 }, "evmVersion": "istanbul", "libraries": {}, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"string","name":"_baseUrl","type":"string"},{"internalType":"address payable","name":"_causeBeneficiary","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"index","type":"uint8"},{"indexed":false,"internalType":"string","name":"info","type":"string"}],"name":"ContractMetaDataAdded","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":"uint256","name":"newPrice","type":"uint256"}],"name":"PriceChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenIndex","type":"uint256"},{"indexed":false,"internalType":"string","name":"tokenUri","type":"string"}],"name":"TokenMinted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"tokenId","type":"uint16"},{"indexed":false,"internalType":"string","name":"uri","type":"string"}],"name":"TokenUriUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"applyHandbrake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"causeBeneficiary","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"newCauseBeneficiary","type":"address"}],"name":"changeCauseBeneficiary","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"percentage","type":"uint256"}],"name":"changeFeePercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"changePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"contractMetadata","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"creators","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feePercentage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getCreatorOfToken","outputs":[{"internalType":"address","name":"creatorAddress","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSupplyData","outputs":[{"internalType":"uint256","name":"currentTokenId","type":"uint256"},{"internalType":"uint256","name":"supplyDataPrice","type":"uint256"},{"internalType":"uint16","name":"supplyDataMaxSupply","type":"uint16"},{"internalType":"address","name":"cBeneficiary","type":"address"},{"internalType":"uint256","name":"supplyDataFeePercentage","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_tokenId","type":"uint16"}],"name":"getVariantData","outputs":[{"components":[{"internalType":"uint8","name":"variant","type":"uint8"},{"internalType":"uint8","name":"mutationParts","type":"uint8"},{"internalType":"uint16","name":"mutationMultiplier","type":"uint16"},{"internalType":"uint8","name":"numSpikes","type":"uint8"},{"internalType":"uint8","name":"spikeAngle","type":"uint8"},{"internalType":"uint8","name":"spikeLength","type":"uint8"},{"internalType":"bytes","name":"creator","type":"bytes"},{"internalType":"bytes32","name":"tokenHash","type":"bytes32"},{"internalType":"string","name":"rarity","type":"string"},{"components":[{"internalType":"uint32","name":"hue","type":"uint32"},{"internalType":"uint256","name":"saturation","type":"uint256"},{"internalType":"uint256","name":"lightness","type":"uint256"}],"internalType":"struct Gener8tiveMutationsERC721.HslColor","name":"creatorColor","type":"tuple"},{"components":[{"internalType":"uint256","name":"x1","type":"uint256"},{"internalType":"uint256","name":"y1","type":"uint256"},{"internalType":"uint256","name":"x2","type":"uint256"},{"internalType":"uint256","name":"y2","type":"uint256"},{"internalType":"uint256","name":"x3","type":"uint256"},{"internalType":"uint256","name":"y3","type":"uint256"}],"internalType":"struct Gener8tiveMutationsERC721.Triangle[]","name":"creatorTriangles","type":"tuple[]"},{"components":[{"internalType":"uint8","name":"x","type":"uint8"},{"internalType":"uint8","name":"y","type":"uint8"}],"internalType":"struct Gener8tiveMutationsERC721.Spike[]","name":"spikes","type":"tuple[]"}],"internalType":"struct Gener8tiveMutationsERC721.TokenData[]","name":"tokenData","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"ownerAddress","type":"address"}],"name":"ownerMint","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":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"releaseHandbrake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"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":[],"name":"tokenId","outputs":[{"internalType":"uint256","name":"_value","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":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_tokenId","type":"uint16"},{"internalType":"string","name":"newTokenURI","type":"string"}],"name":"updateTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"index","type":"uint8"},{"internalType":"string","name":"info","type":"string"}],"name":"writeContractMetaData","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526704db7325476300006009556032600a55610100600b60006101000a81548161ffff021916908361ffff1602179055506040518061020001604052806040518060400160405280600a81526020017f556c74726120526172650000000000000000000000000000000000000000000081525081526020016040518060400160405280600e81526020017f45787472656d656c79205261726500000000000000000000000000000000000081525081526020016040518060400160405280600e81526020017f45787472656d656c79205261726500000000000000000000000000000000000081525081526020016040518060400160405280600e81526020017f45787472656d656c79205261726500000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f526172650000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f526172650000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f526172650000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f526172650000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f526172650000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f526172650000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f526172650000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f526172650000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600e81526020017f45787472656d656c79205261726500000000000000000000000000000000000081525081526020016040518060400160405280600e81526020017f45787472656d656c79205261726500000000000000000000000000000000000081525081526020016040518060400160405280600e81526020017f45787472656d656c79205261726500000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f556c74726120526172650000000000000000000000000000000000000000000081525081525060109060106200040092919062000ab0565b50604051806102000160405280600360ff168152602001600360ff168152602001600360ff168152602001600360ff168152602001600460ff168152602001600460ff168152602001600460ff168152602001600460ff168152602001600460ff168152602001600460ff168152602001600560ff168152602001600560ff168152602001600560ff168152602001600560ff168152602001600660ff168152602001600660ff168152506011906010620004bd92919062000b17565b50604051806102000160405280600860ff168152602001600860ff168152602001600860ff168152602001600860ff168152602001600760ff168152602001600760ff168152602001600660ff168152602001600660ff168152602001600560ff168152602001600560ff168152602001600460ff168152602001600460ff168152602001600360ff168152602001600360ff168152602001600260ff168152602001600160ff1681525060129060106200057a92919062000b17565b50604051806102000160405280600260ff168152602001600360ff168152602001600360ff168152602001600360ff168152602001600460ff168152602001600460ff168152602001600560ff168152602001600560ff168152602001600660ff168152602001600660ff168152602001600760ff168152602001600760ff168152602001600760ff168152602001600860ff168152602001600860ff168152602001600860ff1681525060139060106200063792919062000b17565b50604051806102000160405280600460ff168152602001600360ff168152602001600360ff168152602001600360ff168152602001600360ff168152602001600360ff168152602001600360ff168152602001600360ff168152602001600260ff168152602001600260ff168152602001600260ff168152602001600260ff168152602001600260ff168152602001600160ff168152602001600160ff168152602001600160ff168152506014906010620006f492919062000b17565b50604051806102000160405280601460ff168152602001601360ff168152602001601260ff168152602001601160ff168152602001601060ff168152602001600f60ff168152602001600e60ff168152602001600e60ff168152602001600d60ff168152602001600d60ff168152602001600c60ff168152602001600c60ff168152602001600b60ff168152602001600b60ff168152602001600a60ff168152602001600960ff168152506015906010620007b192919062000bc5565b506001601660006101000a81548160ff021916908315150217905550348015620007da57600080fd5b50604051620070fd380380620070fd833981810160405281019062000800919062000e83565b838381600090805190602001906200081a92919062000c75565b5080600190805190602001906200083392919062000c75565b505050600062000848620009ab60201b60201c565b905080600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350600a67ffffffffffffffff81111562000929577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156200095e57816020015b6060815260200190600190039081620009485790505b50600c90805190602001906200097692919062000d06565b5081600f90805190602001906200098f92919062000c75565b50620009a181620009b360201b60201c565b505050506200112e565b600033905090565b620009c3620009ab60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620009e962000a8660201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000a42576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000a399062000f7c565b60405180910390fd5b80600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b82805482825590600052602060002090810192821562000b04579160200282015b8281111562000b0357825182908051906020019062000af292919062000c75565b509160200191906001019062000ad1565b5b50905062000b13919062000d6d565b5090565b82805482825590600052602060002090601f0160209004810192821562000bb25791602002820160005b8382111562000b8157835183826101000a81548160ff021916908360ff160217905550926020019260010160208160000104928301926001030262000b41565b801562000bb05782816101000a81549060ff021916905560010160208160000104928301926001030262000b81565b505b50905062000bc1919062000d95565b5090565b82805482825590600052602060002090600f0160109004810192821562000c625791602002820160005b8382111562000c3057835183826101000a81548161ffff021916908360ff160217905550926020019260020160208160010104928301926001030262000bef565b801562000c605782816101000a81549061ffff021916905560020160208160010104928301926001030262000c30565b505b50905062000c71919062000d95565b5090565b82805462000c839062001080565b90600052602060002090601f01602090048101928262000ca7576000855562000cf3565b82601f1062000cc257805160ff191683800117855562000cf3565b8280016001018555821562000cf3579182015b8281111562000cf257825182559160200191906001019062000cd5565b5b50905062000d02919062000d95565b5090565b82805482825590600052602060002090810192821562000d5a579160200282015b8281111562000d5957825182908051906020019062000d4892919062000c75565b509160200191906001019062000d27565b5b50905062000d69919062000d6d565b5090565b5b8082111562000d91576000818162000d87919062000db4565b5060010162000d6e565b5090565b5b8082111562000db057600081600090555060010162000d96565b5090565b50805462000dc29062001080565b6000825580601f1062000dd6575062000df7565b601f01602090049060005260206000209081019062000df6919062000d95565b5b50565b600062000e1162000e0b8462000fd2565b62000f9e565b90508281526020810184848401111562000e2a57600080fd5b62000e378482856200104a565b509392505050565b60008151905062000e508162001114565b92915050565b600082601f83011262000e6857600080fd5b815162000e7a84826020860162000dfa565b91505092915050565b6000806000806080858703121562000e9a57600080fd5b600085015167ffffffffffffffff81111562000eb557600080fd5b62000ec38782880162000e56565b945050602085015167ffffffffffffffff81111562000ee157600080fd5b62000eef8782880162000e56565b935050604085015167ffffffffffffffff81111562000f0d57600080fd5b62000f1b8782880162000e56565b925050606062000f2e8782880162000e3f565b91505092959194509250565b600062000f4960208362001005565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000602082019050818103600083015262000f978162000f3a565b9050919050565b6000604051905081810181811067ffffffffffffffff8211171562000fc85762000fc7620010e5565b5b8060405250919050565b600067ffffffffffffffff82111562000ff05762000fef620010e5565b5b601f19601f8301169050602081019050919050565b600082825260208201905092915050565b600062001023826200102a565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60005b838110156200106a5780820151818401526020810190506200104d565b838111156200107a576000848401525b50505050565b600060028204905060018216806200109957607f821691505b60208210811415620010b057620010af620010b6565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200111f8162001016565b81146200112b57600080fd5b50565b615fbf806200113e6000396000f3fe6080604052600436106102195760003560e01c80637ca0f03611610123578063b88d4fde116100ab578063d57948821161006f578063d5794882146107c5578063d5abeb01146107ee578063e985e9c514610819578063f2fde38b14610856578063fae141921461087f57610219565b8063b88d4fde146106d0578063be80af4a146106f9578063c107532914610722578063c87b56dd1461074b578063cd53d08e1461078857610219565b8063a001ecdd116100f2578063a001ecdd146105eb578063a035b1fe14610616578063a22cb46514610641578063a2b40d191461066a578063a87f7fd51461069357610219565b80637ca0f036146105415780638da5cb5b1461055857806395d89b411461058357806398fa4cb9146105ae57610219565b80631e3bcc8e116101a65780636352211e116101755780636352211e1461044457806370a0823114610481578063715018a6146104be5780637539fc5c146104d5578063797743381461051257610219565b80631e3bcc8e146103b257806323b872dd146103db57806342842e0e1461040457806343415fc21461042d57610219565b8063093e1073116101ed578063093e1073146102ee578063095ea7b3146103175780631249c58b14610340578063150b7a021461034a57806317d70f7c1461038757610219565b8062ff44421461021e57806301ffc9a71461024957806306fdde0314610286578063081812fc146102b1575b600080fd5b34801561022a57600080fd5b506102336108a8565b6040516102409190615344565b60405180910390f35b34801561025557600080fd5b50610270600480360381019061026b9190614375565b6108ce565b60405161027d91906153cd565b60405180910390f35b34801561029257600080fd5b5061029b6109b0565b6040516102a89190615403565b60405180910390f35b3480156102bd57600080fd5b506102d860048036038101906102d39190614444565b610a42565b6040516102e59190615329565b60405180910390f35b3480156102fa57600080fd5b5061031560048036038101906103109190614192565b610ac7565b005b34801561032357600080fd5b5061033e60048036038101906103399190614339565b610b87565b005b610348610c9f565b005b34801561035657600080fd5b50610371600480360381019061036c9190614282565b610f73565b60405161037e91906153e8565b60405180910390f35b34801561039357600080fd5b5061039c610f87565b6040516103a99190615750565b60405180910390f35b3480156103be57600080fd5b506103d960048036038101906103d49190614169565b610f93565b005b3480156103e757600080fd5b5061040260048036038101906103fd9190614233565b61101b565b005b34801561041057600080fd5b5061042b60048036038101906104269190614233565b61107b565b005b34801561043957600080fd5b5061044261109b565b005b34801561045057600080fd5b5061046b60048036038101906104669190614444565b611134565b6040516104789190615329565b60405180910390f35b34801561048d57600080fd5b506104a860048036038101906104a39190614169565b6111e6565b6040516104b59190615750565b60405180910390f35b3480156104ca57600080fd5b506104d361129e565b005b3480156104e157600080fd5b506104fc60048036038101906104f79190614444565b6113db565b6040516105099190615329565b60405180910390f35b34801561051e57600080fd5b50610527611418565b60405161053895949392919061576b565b60405180910390f35b34801561054d57600080fd5b50610556611475565b005b34801561056457600080fd5b5061056d61150e565b60405161057a9190615329565b60405180910390f35b34801561058f57600080fd5b50610598611538565b6040516105a59190615403565b60405180910390f35b3480156105ba57600080fd5b506105d560048036038101906105d09190614444565b6115ca565b6040516105e29190615403565b60405180910390f35b3480156105f757600080fd5b50610600611676565b60405161060d9190615750565b60405180910390f35b34801561062257600080fd5b5061062b61167c565b6040516106389190615750565b60405180910390f35b34801561064d57600080fd5b50610668600480360381019061066391906142fd565b611682565b005b34801561067657600080fd5b50610691600480360381019061068c9190614444565b611803565b005b34801561069f57600080fd5b506106ba60048036038101906106b591906143c7565b6118c0565b6040516106c791906153ab565b60405180910390f35b3480156106dc57600080fd5b506106f760048036038101906106f29190614282565b61215e565b005b34801561070557600080fd5b50610720600480360381019061071b91906143f0565b6121c0565b005b34801561072e57600080fd5b50610749600480360381019061074491906141bb565b612287565b005b34801561075757600080fd5b50610772600480360381019061076d9190614444565b61234e565b60405161077f9190615403565b60405180910390f35b34801561079457600080fd5b506107af60048036038101906107aa9190614444565b6124a0565b6040516107bc9190615329565b60405180910390f35b3480156107d157600080fd5b506107ec60048036038101906107e7919061446d565b6124d3565b005b3480156107fa57600080fd5b506108036125e8565b6040516108109190615705565b60405180910390f35b34801561082557600080fd5b50610840600480360381019061083b91906141f7565b6125fc565b60405161084d91906153cd565b60405180910390f35b34801561086257600080fd5b5061087d60048036038101906108789190614169565b612690565b005b34801561088b57600080fd5b506108a660048036038101906108a19190614444565b61283c565b005b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061099957507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109a957506109a8826128c2565b5b9050919050565b6060600080546109bf90615c99565b80601f01602080910402602001604051908101604052809291908181526020018280546109eb90615c99565b8015610a385780601f10610a0d57610100808354040283529160200191610a38565b820191906000526020600020905b815481529060010190602001808311610a1b57829003601f168201915b5050505050905090565b6000610a4d8261292c565b610a8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8390615625565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b610acf612998565b73ffffffffffffffffffffffffffffffffffffffff16610aed61150e565b73ffffffffffffffffffffffffffffffffffffffff1614610b43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3a90615645565b60405180910390fd5b80600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000610b9282611134565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bfa906156a5565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c22612998565b73ffffffffffffffffffffffffffffffffffffffff161480610c515750610c5081610c4b612998565b6125fc565b5b610c90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8790615525565b60405180910390fd5b610c9a83836129a0565b505050565b601660009054906101000a900460ff16610cee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce590615505565b60405180910390fd5b6000610cfa6008612a59565b1115610d6c57600b60009054906101000a900461ffff1661ffff166001610d216008612a59565b610d2b9190615b34565b10610d6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d62906155c5565b60405180910390fd5b5b6000610d786008612a59565b1115610e00573373ffffffffffffffffffffffffffffffffffffffff16600e60006001610da56008612a59565b610daf9190615b34565b815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610dff57600080fd5b5b600954341015610e45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3c90615425565b60405180910390fd5b6000610e5f34600a54610e589190615a9f565b6064612a67565b9050600073ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610ef3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eea90615585565b60405180910390fd5b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc8234610f3b9190615b34565b9081150290604051600060405180830381858888f19350505050158015610f66573d6000803e3d6000fd5b50610f7033612a8f565b50565b600063150b7a0260e01b9050949350505050565b60088060000154905081565b610f9b612998565b73ffffffffffffffffffffffffffffffffffffffff16610fb961150e565b73ffffffffffffffffffffffffffffffffffffffff161461100f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100690615645565b60405180910390fd5b61101881612a8f565b50565b61102c611026612998565b82612ba3565b61106b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611062906156e5565b60405180910390fd5b611076838383612c81565b505050565b6110968383836040518060200160405280600081525061215e565b505050565b6110a3612998565b73ffffffffffffffffffffffffffffffffffffffff166110c161150e565b73ffffffffffffffffffffffffffffffffffffffff1614611117576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110e90615645565b60405180910390fd5b6001601660006101000a81548160ff021916908315150217905550565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156111dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d490615565565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611257576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124e90615545565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6112a6612998565b73ffffffffffffffffffffffffffffffffffffffff166112c461150e565b73ffffffffffffffffffffffffffffffffffffffff161461131a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131190615645565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000600e600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600080600080600061142a6008612a59565b94506009549350600b60009054906101000a900461ffff169250600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169150600a5490509091929394565b61147d612998565b73ffffffffffffffffffffffffffffffffffffffff1661149b61150e565b73ffffffffffffffffffffffffffffffffffffffff16146114f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e890615645565b60405180910390fd5b6000601660006101000a81548160ff021916908315150217905550565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461154790615c99565b80601f016020809104026020016040519081016040528092919081815260200182805461157390615c99565b80156115c05780601f10611595576101008083540402835291602001916115c0565b820191906000526020600020905b8154815290600101906020018083116115a357829003601f168201915b5050505050905090565b600c81815481106115da57600080fd5b9060005260206000200160009150905080546115f590615c99565b80601f016020809104026020016040519081016040528092919081815260200182805461162190615c99565b801561166e5780601f106116435761010080835404028352916020019161166e565b820191906000526020600020905b81548152906001019060200180831161165157829003601f168201915b505050505081565b600a5481565b60095481565b61168a612998565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156116f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ef906154c5565b60405180910390fd5b8060056000611705612998565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166117b2612998565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516117f791906153cd565b60405180910390a35050565b61180b612998565b73ffffffffffffffffffffffffffffffffffffffff1661182961150e565b73ffffffffffffffffffffffffffffffffffffffff161461187f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187690615645565b60405180910390fd5b806009819055507fa6dc15bdb68da224c66db4b3838d9a2b205138e8cff6774e57d0af91e196d622816040516118b59190615750565b60405180910390a150565b60606118cf8261ffff1661292c565b61190e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611905906156c5565b60405180910390fd5b60008060108461ffff16101561192b576000915060019050611abd565b60208461ffff161015611945576010915060029050611abc565b60308461ffff16101561195f576020915060039050611abb565b60408461ffff161015611979576030915060049050611aba565b60508461ffff161015611993576040915060059050611ab9565b60608461ffff1610156119ad576050915060069050611ab8565b60708461ffff1610156119c7576060915060079050611ab7565b60808461ffff1610156119e1576070915060089050611ab6565b60908461ffff1610156119fb576080915060099050611ab5565b60a08461ffff161015611a155760909150600a9050611ab4565b60b08461ffff161015611a2f5760a09150600b9050611ab3565b60c08461ffff161015611a495760b09150600c9050611ab2565b60d08461ffff161015611a635760c09150600d9050611ab1565b60e08461ffff161015611a7d5760d09150600e9050611ab0565b60f08461ffff161015611a975760e09150600f9050611aaf565b6101008461ffff161015611aae5760f09150601090505b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b6001601085611acc9190615d9f565b611ad691906159a4565b61ffff1667ffffffffffffffff811115611b19577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015611b5257816020015b611b3f613e54565b815260200190600190039081611b375790505b50925060606000611b61613ed1565b6060806000808890505b8a61ffff168161ffff161161215057611d9481601160018b611b8d9190615b68565b60ff1681548110611bc7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090602091828204019190069054906101000a900460ff16601560018c611bf69190615b68565b60ff1681548110611c30577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090601091828204019190066002029054906101000a900461ffff16601260018d611c639190615b68565b60ff1681548110611c9d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090602091828204019190069054906101000a900460ff16601360018e611ccc9190615b68565b60ff1681548110611d06577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090602091828204019190069054906101000a900460ff16601460018f611d359190615b68565b60ff1681548110611d6f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090602091828204019190069054906101000a900460ff16612edd565b809750819850829950839a50849b5050505050506040518061018001604052808960ff168152602001601160018b611dcc9190615b68565b60ff1681548110611e06577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090602091828204019190069054906101000a900460ff1660ff168152602001601560018b611e3d9190615b68565b60ff1681548110611e77577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090601091828204019190066002029054906101000a900461ffff1661ffff168152602001601260018b611eb39190615b68565b60ff1681548110611eed577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090602091828204019190069054906101000a900460ff1660ff168152602001601360018b611f249190615b68565b60ff1681548110611f5e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090602091828204019190069054906101000a900460ff1660ff168152602001601460018b611f959190615b68565b60ff1681548110611fcf577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090602091828204019190069054906101000a900460ff1660ff16815260200188815260200187815260200160108460ff1681548110612040577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001805461205590615c99565b80601f016020809104026020016040519081016040528092919081815260200182805461208190615c99565b80156120ce5780601f106120a3576101008083540402835291602001916120ce565b820191906000526020600020905b8154815290600101906020018083116120b157829003601f168201915b50505050508152602001868152602001858152602001848152508a8360ff1681518110612124577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181905250818061213a90615d3f565b925050808061214890615ccb565b915050611b6b565b505050505050505050919050565b61216f612169612998565b83612ba3565b6121ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121a5906156e5565b60405180910390fd5b6121ba84848484612f9d565b50505050565b6121c8612998565b73ffffffffffffffffffffffffffffffffffffffff166121e661150e565b73ffffffffffffffffffffffffffffffffffffffff161461223c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161223390615645565b60405180910390fd5b61224a8261ffff1682612ff9565b7f70d7d33e97e93f5470088d44f15876b79e8c3b1eb23451169b15f0140a60a798828260405161227b929190615720565b60405180910390a15050565b61228f612998565b73ffffffffffffffffffffffffffffffffffffffff166122ad61150e565b73ffffffffffffffffffffffffffffffffffffffff1614612303576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122fa90615645565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015612349573d6000803e3d6000fd5b505050565b60606123598261292c565b612398576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161238f90615605565b60405180910390fd5b60006006600084815260200190815260200160002080546123b890615c99565b80601f01602080910402602001604051908101604052809291908181526020018280546123e490615c99565b80156124315780601f1061240657610100808354040283529160200191612431565b820191906000526020600020905b81548152906001019060200180831161241457829003601f168201915b50505050509050600061244261306d565b905060008151141561245857819250505061249b565b60008251111561248d5780826040516020016124759291906152c6565b6040516020818303038152906040529250505061249b565b61249684613084565b925050505b919050565b600e6020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6124db612998565b73ffffffffffffffffffffffffffffffffffffffff166124f961150e565b73ffffffffffffffffffffffffffffffffffffffff161461254f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161254690615645565b60405180910390fd5b80600c8360ff168154811061258d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200190805190602001906125aa929190613ef8565b507f07db7abac2f5d75b8ded7fcc6a1ada1cdaa305f73d67f1b5f17c56338b22c18882826040516125dc9291906157be565b60405180910390a15050565b600b60009054906101000a900461ffff1681565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b612698612998565b73ffffffffffffffffffffffffffffffffffffffff166126b661150e565b73ffffffffffffffffffffffffffffffffffffffff161461270c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161270390615645565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561277c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161277390615465565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b612844612998565b73ffffffffffffffffffffffffffffffffffffffff1661286261150e565b73ffffffffffffffffffffffffffffffffffffffff16146128b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128af90615645565b60405180910390fd5b80600a8190555050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612a1383611134565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b6000808211612a7557600080fd5b60008284612a839190615a32565b90508091505092915050565b612aa233612a9d6008612a59565b61312b565b6000600f612ab8612ab36008612a59565b613149565b604051602001612ac99291906152ea565b6040516020818303038152906040529050612aed612ae76008612a59565b82612ff9565b81600e6000612afc6008612a59565b815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550612b5260086132f6565b6001612b5e6008612a59565b612b689190615b34565b7fac60a09674f049f6a63c51f373fb7febaf74a582f3a9f82cd39275be73988d2182604051612b979190615403565b60405180910390a25050565b6000612bae8261292c565b612bed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612be4906154e5565b60405180910390fd5b6000612bf883611134565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612c6757508373ffffffffffffffffffffffffffffffffffffffff16612c4f84610a42565b73ffffffffffffffffffffffffffffffffffffffff16145b80612c785750612c7781856125fc565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612ca182611134565b73ffffffffffffffffffffffffffffffffffffffff1614612cf7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cee90615665565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612d67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d5e906154a5565b60405180910390fd5b612d7283838361330c565b612d7d6000826129a0565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612dcd9190615b34565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612e2491906159dc565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60606000612ee9613ed1565b606080600e60008c61ffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16604051602001612f3491906152ab565b60405160208183030381529060405294508a604051602001612f56919061530e565b604051602081830303815290604052805190602001209350612f79858b8b613311565b8093508194505050612f8d8489898961388e565b9050965096509650965096915050565b612fa8848484612c81565b612fb484848484613a81565b612ff3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fea90615445565b60405180910390fd5b50505050565b6130028261292c565b613041576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613038906155a5565b60405180910390fd5b80600660008481526020019081526020016000209080519060200190613068929190613ef8565b505050565b606060405180602001604052806000815250905090565b606061308f8261292c565b6130ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130c590615685565b60405180910390fd5b60006130d861306d565b905060008151116130f85760405180602001604052806000815250613123565b8061310284613149565b6040516020016131139291906152c6565b6040516020818303038152906040525b915050919050565b613145828260405180602001604052806000815250613c18565b5050565b60606000821415613191576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506132f1565b600082905060005b600082146131c35780806131ac90615cf6565b915050600a826131bc9190615a32565b9150613199565b60008167ffffffffffffffff811115613205577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156132375781602001600182028036833780820191505090505b5090505b600085146132ea576001826132509190615b34565b9150600a8561325f9190615dd0565b603061326b91906159dc565b60f81b8183815181106132a7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856132e39190615a32565b945061323b565b8093505050505b919050565b6001816000016000828254019250508190555050565b505050565b613319613ed1565b606060006040518060600160405280600f60f81b6004898560ff168151811061336b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916901c1660f81c60ff1663ffffffff168152602001600f60f81b888460ff16815181106133ed577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b1660f81c60ff168152602001600f6004898561341390615d3f565b95508560ff1681518110613450577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916901c60f81c1660ff1681525092508460ff1667ffffffffffffffff8111156134ce577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405190808252806020026020018201604052801561350757816020015b6134f4613f7e565b8152602001906001900390816134ec5790505b50915060005b8560ff168160ff1610156138845760006040518060c0016040528087600f60f81b8b8760ff168151811061356a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b1660f81c60ff166135869190615a63565b61ffff16815260200187600f60f81b60048c886135a290615d3f565b98508860ff16815181106135df577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916901c1660f81c60ff1661361f9190615a63565b61ffff16815260200187600f60f81b8b8760ff168151811061366a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b1660f81c60ff166136869190615a63565b61ffff16815260200187600f60f81b60048c886136a290615d3f565b98508860ff16815181106136df577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916901c1660f81c60ff1661371f9190615a63565b61ffff16815260200187600f60f81b8b8760ff168151811061376a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b1660f81c60ff166137869190615a63565b61ffff16815260200187600f60f81b60048c886137a290615d3f565b98508860ff16815181106137df577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916901c1660f81c60ff1661381f9190615a63565b61ffff16815250905080848360ff1681518110613865577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001018190525050808061387c90615d3f565b91505061350d565b5050935093915050565b606060008460ff1667ffffffffffffffff8111156138d5577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405190808252806020026020018201604052801561390e57816020015b6138fb613fb4565b8152602001906001900390816138f35790505b50915060005b8560ff168160ff161015613a77576000604051806040016040528087600f60f81b60048c8860ff1660208110613973577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b1a60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916901c1660f81c6139a99190615af9565b60ff16815260200186600f60f81b8b8760ff16602081106139f3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b1a60f81b1660f81c613a059190615af9565b60ff1681525090508280613a1890615d3f565b93505080848360ff1681518110613a58577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181905250508080613a6f90615d3f565b915050613914565b5050949350505050565b6000613aa28473ffffffffffffffffffffffffffffffffffffffff16613c73565b15613c0b578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613acb612998565b8786866040518563ffffffff1660e01b8152600401613aed949392919061535f565b602060405180830381600087803b158015613b0757600080fd5b505af1925050508015613b3857506040513d601f19601f82011682018060405250810190613b35919061439e565b60015b613bbb573d8060008114613b68576040519150601f19603f3d011682016040523d82523d6000602084013e613b6d565b606091505b50600081511415613bb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613baa90615445565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613c10565b600190505b949350505050565b613c228383613c86565b613c2f6000848484613a81565b613c6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c6590615445565b60405180910390fd5b505050565b600080823b905060008111915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613cf6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613ced906155e5565b60405180910390fd5b613cff8161292c565b15613d3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613d3690615485565b60405180910390fd5b613d4b6000838361330c565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613d9b91906159dc565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b604051806101800160405280600060ff168152602001600060ff168152602001600061ffff168152602001600060ff168152602001600060ff168152602001600060ff168152602001606081526020016000801916815260200160608152602001613ebd613ed1565b815260200160608152602001606081525090565b6040518060600160405280600063ffffffff16815260200160008152602001600081525090565b828054613f0490615c99565b90600052602060002090601f016020900481019282613f265760008555613f6d565b82601f10613f3f57805160ff1916838001178555613f6d565b82800160010185558215613f6d579182015b82811115613f6c578251825591602001919060010190613f51565b5b509050613f7a9190613fd4565b5090565b6040518060c001604052806000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6040518060400160405280600060ff168152602001600060ff1681525090565b5b80821115613fed576000816000905550600101613fd5565b5090565b6000614004613fff8461581f565b6157ee565b90508281526020810184848401111561401c57600080fd5b614027848285615c57565b509392505050565b600061404261403d8461584f565b6157ee565b90508281526020810184848401111561405a57600080fd5b614065848285615c57565b509392505050565b60008135905061407c81615ee8565b92915050565b60008135905061409181615eff565b92915050565b6000813590506140a681615f16565b92915050565b6000813590506140bb81615f2d565b92915050565b6000815190506140d081615f2d565b92915050565b600082601f8301126140e757600080fd5b81356140f7848260208601613ff1565b91505092915050565b600082601f83011261411157600080fd5b813561412184826020860161402f565b91505092915050565b60008135905061413981615f44565b92915050565b60008135905061414e81615f5b565b92915050565b60008135905061416381615f72565b92915050565b60006020828403121561417b57600080fd5b60006141898482850161406d565b91505092915050565b6000602082840312156141a457600080fd5b60006141b284828501614082565b91505092915050565b600080604083850312156141ce57600080fd5b60006141dc85828601614082565b92505060206141ed8582860161413f565b9150509250929050565b6000806040838503121561420a57600080fd5b60006142188582860161406d565b92505060206142298582860161406d565b9150509250929050565b60008060006060848603121561424857600080fd5b60006142568682870161406d565b93505060206142678682870161406d565b92505060406142788682870161413f565b9150509250925092565b6000806000806080858703121561429857600080fd5b60006142a68782880161406d565b94505060206142b78782880161406d565b93505060406142c88782880161413f565b925050606085013567ffffffffffffffff8111156142e557600080fd5b6142f1878288016140d6565b91505092959194509250565b6000806040838503121561431057600080fd5b600061431e8582860161406d565b925050602061432f85828601614097565b9150509250929050565b6000806040838503121561434c57600080fd5b600061435a8582860161406d565b925050602061436b8582860161413f565b9150509250929050565b60006020828403121561438757600080fd5b6000614395848285016140ac565b91505092915050565b6000602082840312156143b057600080fd5b60006143be848285016140c1565b91505092915050565b6000602082840312156143d957600080fd5b60006143e78482850161412a565b91505092915050565b6000806040838503121561440357600080fd5b60006144118582860161412a565b925050602083013567ffffffffffffffff81111561442e57600080fd5b61443a85828601614100565b9150509250929050565b60006020828403121561445657600080fd5b60006144648482850161413f565b91505092915050565b6000806040838503121561448057600080fd5b600061448e85828601614154565b925050602083013567ffffffffffffffff8111156144ab57600080fd5b6144b785828601614100565b9150509250929050565b60006144cd8383615068565b60408301905092915050565b60006144e58383615097565b905092915050565b60006144f983836151b0565b60c08301905092915050565b61450e81615bae565b82525050565b61451d81615b9c565b82525050565b61453461452f82615b9c565b615d69565b82525050565b6000614545826158c4565b61454f8185615922565b935061455a8361587f565b8060005b8381101561458b57815161457288826144c1565b975061457d836158fb565b92505060018101905061455e565b5085935050505092915050565b60006145a3826158cf565b6145ad8185615933565b9350836020820285016145bf8561588f565b8060005b858110156145fb57848403895281516145dc85826144d9565b94506145e783615908565b925060208a019950506001810190506145c3565b50829750879550505050505092915050565b6000614618826158da565b6146228185615944565b935061462d8361589f565b8060005b8381101561465e57815161464588826144ed565b975061465083615915565b925050600181019050614631565b5085935050505092915050565b61467481615bc0565b82525050565b61468381615bcc565b82525050565b61469281615bd6565b82525050565b60006146a3826158e5565b6146ad8185615955565b93506146bd818560208601615c66565b6146c681615ebd565b840191505092915050565b60006146dc826158e5565b6146e68185615966565b93506146f6818560208601615c66565b6146ff81615ebd565b840191505092915050565b6000614715826158f0565b61471f8185615977565b935061472f818560208601615c66565b61473881615ebd565b840191505092915050565b600061474e826158f0565b6147588185615988565b9350614768818560208601615c66565b61477181615ebd565b840191505092915050565b6000614787826158f0565b6147918185615999565b93506147a1818560208601615c66565b80840191505092915050565b600081546147ba81615c99565b6147c48186615999565b945060018216600081146147df57600181146147f057614823565b60ff19831686528186019350614823565b6147f9856158af565b60005b8381101561481b578154818901526001820191506020810190506147fc565b838801955050505b50505092915050565b6000614839601583615988565b91507f496e73756666696369656e74204554482073656e7400000000000000000000006000830152602082019050919050565b6000614879603283615988565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b60006148df602683615988565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614945601c83615988565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000614985602483615988565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006149eb601983615988565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000614a2b602c83615988565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000614a91601d83615988565b91507f4d696e74696e672069732063757272656e746c792064697361626c65640000006000830152602082019050919050565b6000614ad1603883615988565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000614b37602a83615988565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000614b9d602983615988565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000614c03601983615988565b91507f43617573652042656e6566696369617279206e6f7420736574000000000000006000830152602082019050919050565b6000614c43602e83615988565b91507f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008301527f6578697374656e7420746f6b656e0000000000000000000000000000000000006020830152604082019050919050565b6000614ca9601183615988565b91507f4d617820746f6b656e73206973737565640000000000000000000000000000006000830152602082019050919050565b6000614ce9602083615988565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000614d29603183615988565b91507f45524337323155524953746f726167653a2055524920717565727920666f722060008301527f6e6f6e6578697374656e7420746f6b656e0000000000000000000000000000006020830152604082019050919050565b6000614d8f602c83615988565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000614df5602083615988565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000614e35602983615988565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000614e9b602f83615988565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000614f01602183615988565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614f67602283615988565b91507f52657175657374656420746f6b656e20646f6573206e6f74206578697374207960008301527f65740000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614fcd603183615988565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b60608201600082015161503c600085018261527e565b50602082015161504f6020850182615260565b5060408201516150626040850182615260565b50505050565b60408201600082015161507e600085018261528d565b506020820151615091602085018261528d565b50505050565b60006101c0830160008301516150b0600086018261528d565b5060208301516150c3602086018261528d565b5060408301516150d6604086018261522b565b5060608301516150e9606086018261528d565b5060808301516150fc608086018261528d565b5060a083015161510f60a086018261528d565b5060c083015184820360c08601526151278282614698565b91505060e083015161513c60e086018261467a565b50610100830151848203610100860152615156828261470a565b91505061012083015161516d610120860182615026565b50610140830151848203610180860152615187828261460d565b9150506101608301518482036101a08601526151a3828261453a565b9150508091505092915050565b60c0820160008201516151c66000850182615260565b5060208201516151d96020850182615260565b5060408201516151ec6040850182615260565b5060608201516151ff6060850182615260565b5060808201516152126080850182615260565b5060a082015161522560a0850182615260565b50505050565b61523481615c02565b82525050565b61524381615c02565b82525050565b61525a61525582615c02565b615d7b565b82525050565b61526981615c30565b82525050565b61527881615c30565b82525050565b61528781615c3a565b82525050565b61529681615c4a565b82525050565b6152a581615c4a565b82525050565b60006152b78284614523565b60148201915081905092915050565b60006152d2828561477c565b91506152de828461477c565b91508190509392505050565b60006152f682856147ad565b9150615302828461477c565b91508190509392505050565b600061531a8284615249565b60028201915081905092915050565b600060208201905061533e6000830184614514565b92915050565b60006020820190506153596000830184614505565b92915050565b60006080820190506153746000830187614514565b6153816020830186614514565b61538e604083018561526f565b81810360608301526153a081846146d1565b905095945050505050565b600060208201905081810360008301526153c58184614598565b905092915050565b60006020820190506153e2600083018461466b565b92915050565b60006020820190506153fd6000830184614689565b92915050565b6000602082019050818103600083015261541d8184614743565b905092915050565b6000602082019050818103600083015261543e8161482c565b9050919050565b6000602082019050818103600083015261545e8161486c565b9050919050565b6000602082019050818103600083015261547e816148d2565b9050919050565b6000602082019050818103600083015261549e81614938565b9050919050565b600060208201905081810360008301526154be81614978565b9050919050565b600060208201905081810360008301526154de816149de565b9050919050565b600060208201905081810360008301526154fe81614a1e565b9050919050565b6000602082019050818103600083015261551e81614a84565b9050919050565b6000602082019050818103600083015261553e81614ac4565b9050919050565b6000602082019050818103600083015261555e81614b2a565b9050919050565b6000602082019050818103600083015261557e81614b90565b9050919050565b6000602082019050818103600083015261559e81614bf6565b9050919050565b600060208201905081810360008301526155be81614c36565b9050919050565b600060208201905081810360008301526155de81614c9c565b9050919050565b600060208201905081810360008301526155fe81614cdc565b9050919050565b6000602082019050818103600083015261561e81614d1c565b9050919050565b6000602082019050818103600083015261563e81614d82565b9050919050565b6000602082019050818103600083015261565e81614de8565b9050919050565b6000602082019050818103600083015261567e81614e28565b9050919050565b6000602082019050818103600083015261569e81614e8e565b9050919050565b600060208201905081810360008301526156be81614ef4565b9050919050565b600060208201905081810360008301526156de81614f5a565b9050919050565b600060208201905081810360008301526156fe81614fc0565b9050919050565b600060208201905061571a600083018461523a565b92915050565b6000604082019050615735600083018561523a565b81810360208301526157478184614743565b90509392505050565b6000602082019050615765600083018461526f565b92915050565b600060a082019050615780600083018861526f565b61578d602083018761526f565b61579a604083018661523a565b6157a76060830185614514565b6157b4608083018461526f565b9695505050505050565b60006040820190506157d3600083018561529c565b81810360208301526157e58184614743565b90509392505050565b6000604051905081810181811067ffffffffffffffff8211171561581557615814615e8e565b5b8060405250919050565b600067ffffffffffffffff82111561583a57615839615e8e565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff82111561586a57615869615e8e565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006159af82615c02565b91506159ba83615c02565b92508261ffff038211156159d1576159d0615e01565b5b828201905092915050565b60006159e782615c30565b91506159f283615c30565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115615a2757615a26615e01565b5b828201905092915050565b6000615a3d82615c30565b9150615a4883615c30565b925082615a5857615a57615e30565b5b828204905092915050565b6000615a6e82615c02565b9150615a7983615c02565b92508161ffff0483118215151615615a9457615a93615e01565b5b828202905092915050565b6000615aaa82615c30565b9150615ab583615c30565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615615aee57615aed615e01565b5b828202905092915050565b6000615b0482615c4a565b9150615b0f83615c4a565b92508160ff0483118215151615615b2957615b28615e01565b5b828202905092915050565b6000615b3f82615c30565b9150615b4a83615c30565b925082821015615b5d57615b5c615e01565b5b828203905092915050565b6000615b7382615c4a565b9150615b7e83615c4a565b925082821015615b9157615b90615e01565b5b828203905092915050565b6000615ba782615c10565b9050919050565b6000615bb982615c10565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600063ffffffff82169050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015615c84578082015181840152602081019050615c69565b83811115615c93576000848401525b50505050565b60006002820490506001821680615cb157607f821691505b60208210811415615cc557615cc4615e5f565b5b50919050565b6000615cd682615c02565b915061ffff821415615ceb57615cea615e01565b5b600182019050919050565b6000615d0182615c30565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415615d3457615d33615e01565b5b600182019050919050565b6000615d4a82615c4a565b915060ff821415615d5e57615d5d615e01565b5b600182019050919050565b6000615d7482615d8d565b9050919050565b6000615d8682615ece565b9050919050565b6000615d9882615edb565b9050919050565b6000615daa82615c02565b9150615db583615c02565b925082615dc557615dc4615e30565b5b828206905092915050565b6000615ddb82615c30565b9150615de683615c30565b925082615df657615df5615e30565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160f01b9050919050565b60008160601b9050919050565b615ef181615b9c565b8114615efc57600080fd5b50565b615f0881615bae565b8114615f1357600080fd5b50565b615f1f81615bc0565b8114615f2a57600080fd5b50565b615f3681615bd6565b8114615f4157600080fd5b50565b615f4d81615c02565b8114615f5857600080fd5b50565b615f6481615c30565b8114615f6f57600080fd5b50565b615f7b81615c4a565b8114615f8657600080fd5b5056fea2646970667358221220dd6c6b388c5cc92616da715c078fbeeb2863a835ea209978d2b3818c4a62efa964736f6c63430008000033000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000c7464dbca260a8faf033460622b23467df5aea42000000000000000000000000000000000000000000000000000000000000001447656e65723874697665204d75746174696f6e73000000000000000000000000000000000000000000000000000000000000000000000000000000000000000547656e4d75000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002d68747470733a2f2f6170692e67656e657238746976652e696f2f6d75746174696f6e732f6d657461646174612f00000000000000000000000000000000000000
Deployed Bytecode
0x6080604052600436106102195760003560e01c80637ca0f03611610123578063b88d4fde116100ab578063d57948821161006f578063d5794882146107c5578063d5abeb01146107ee578063e985e9c514610819578063f2fde38b14610856578063fae141921461087f57610219565b8063b88d4fde146106d0578063be80af4a146106f9578063c107532914610722578063c87b56dd1461074b578063cd53d08e1461078857610219565b8063a001ecdd116100f2578063a001ecdd146105eb578063a035b1fe14610616578063a22cb46514610641578063a2b40d191461066a578063a87f7fd51461069357610219565b80637ca0f036146105415780638da5cb5b1461055857806395d89b411461058357806398fa4cb9146105ae57610219565b80631e3bcc8e116101a65780636352211e116101755780636352211e1461044457806370a0823114610481578063715018a6146104be5780637539fc5c146104d5578063797743381461051257610219565b80631e3bcc8e146103b257806323b872dd146103db57806342842e0e1461040457806343415fc21461042d57610219565b8063093e1073116101ed578063093e1073146102ee578063095ea7b3146103175780631249c58b14610340578063150b7a021461034a57806317d70f7c1461038757610219565b8062ff44421461021e57806301ffc9a71461024957806306fdde0314610286578063081812fc146102b1575b600080fd5b34801561022a57600080fd5b506102336108a8565b6040516102409190615344565b60405180910390f35b34801561025557600080fd5b50610270600480360381019061026b9190614375565b6108ce565b60405161027d91906153cd565b60405180910390f35b34801561029257600080fd5b5061029b6109b0565b6040516102a89190615403565b60405180910390f35b3480156102bd57600080fd5b506102d860048036038101906102d39190614444565b610a42565b6040516102e59190615329565b60405180910390f35b3480156102fa57600080fd5b5061031560048036038101906103109190614192565b610ac7565b005b34801561032357600080fd5b5061033e60048036038101906103399190614339565b610b87565b005b610348610c9f565b005b34801561035657600080fd5b50610371600480360381019061036c9190614282565b610f73565b60405161037e91906153e8565b60405180910390f35b34801561039357600080fd5b5061039c610f87565b6040516103a99190615750565b60405180910390f35b3480156103be57600080fd5b506103d960048036038101906103d49190614169565b610f93565b005b3480156103e757600080fd5b5061040260048036038101906103fd9190614233565b61101b565b005b34801561041057600080fd5b5061042b60048036038101906104269190614233565b61107b565b005b34801561043957600080fd5b5061044261109b565b005b34801561045057600080fd5b5061046b60048036038101906104669190614444565b611134565b6040516104789190615329565b60405180910390f35b34801561048d57600080fd5b506104a860048036038101906104a39190614169565b6111e6565b6040516104b59190615750565b60405180910390f35b3480156104ca57600080fd5b506104d361129e565b005b3480156104e157600080fd5b506104fc60048036038101906104f79190614444565b6113db565b6040516105099190615329565b60405180910390f35b34801561051e57600080fd5b50610527611418565b60405161053895949392919061576b565b60405180910390f35b34801561054d57600080fd5b50610556611475565b005b34801561056457600080fd5b5061056d61150e565b60405161057a9190615329565b60405180910390f35b34801561058f57600080fd5b50610598611538565b6040516105a59190615403565b60405180910390f35b3480156105ba57600080fd5b506105d560048036038101906105d09190614444565b6115ca565b6040516105e29190615403565b60405180910390f35b3480156105f757600080fd5b50610600611676565b60405161060d9190615750565b60405180910390f35b34801561062257600080fd5b5061062b61167c565b6040516106389190615750565b60405180910390f35b34801561064d57600080fd5b50610668600480360381019061066391906142fd565b611682565b005b34801561067657600080fd5b50610691600480360381019061068c9190614444565b611803565b005b34801561069f57600080fd5b506106ba60048036038101906106b591906143c7565b6118c0565b6040516106c791906153ab565b60405180910390f35b3480156106dc57600080fd5b506106f760048036038101906106f29190614282565b61215e565b005b34801561070557600080fd5b50610720600480360381019061071b91906143f0565b6121c0565b005b34801561072e57600080fd5b50610749600480360381019061074491906141bb565b612287565b005b34801561075757600080fd5b50610772600480360381019061076d9190614444565b61234e565b60405161077f9190615403565b60405180910390f35b34801561079457600080fd5b506107af60048036038101906107aa9190614444565b6124a0565b6040516107bc9190615329565b60405180910390f35b3480156107d157600080fd5b506107ec60048036038101906107e7919061446d565b6124d3565b005b3480156107fa57600080fd5b506108036125e8565b6040516108109190615705565b60405180910390f35b34801561082557600080fd5b50610840600480360381019061083b91906141f7565b6125fc565b60405161084d91906153cd565b60405180910390f35b34801561086257600080fd5b5061087d60048036038101906108789190614169565b612690565b005b34801561088b57600080fd5b506108a660048036038101906108a19190614444565b61283c565b005b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061099957507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109a957506109a8826128c2565b5b9050919050565b6060600080546109bf90615c99565b80601f01602080910402602001604051908101604052809291908181526020018280546109eb90615c99565b8015610a385780601f10610a0d57610100808354040283529160200191610a38565b820191906000526020600020905b815481529060010190602001808311610a1b57829003601f168201915b5050505050905090565b6000610a4d8261292c565b610a8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8390615625565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b610acf612998565b73ffffffffffffffffffffffffffffffffffffffff16610aed61150e565b73ffffffffffffffffffffffffffffffffffffffff1614610b43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3a90615645565b60405180910390fd5b80600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000610b9282611134565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bfa906156a5565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c22612998565b73ffffffffffffffffffffffffffffffffffffffff161480610c515750610c5081610c4b612998565b6125fc565b5b610c90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8790615525565b60405180910390fd5b610c9a83836129a0565b505050565b601660009054906101000a900460ff16610cee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce590615505565b60405180910390fd5b6000610cfa6008612a59565b1115610d6c57600b60009054906101000a900461ffff1661ffff166001610d216008612a59565b610d2b9190615b34565b10610d6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d62906155c5565b60405180910390fd5b5b6000610d786008612a59565b1115610e00573373ffffffffffffffffffffffffffffffffffffffff16600e60006001610da56008612a59565b610daf9190615b34565b815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610dff57600080fd5b5b600954341015610e45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3c90615425565b60405180910390fd5b6000610e5f34600a54610e589190615a9f565b6064612a67565b9050600073ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610ef3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eea90615585565b60405180910390fd5b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc8234610f3b9190615b34565b9081150290604051600060405180830381858888f19350505050158015610f66573d6000803e3d6000fd5b50610f7033612a8f565b50565b600063150b7a0260e01b9050949350505050565b60088060000154905081565b610f9b612998565b73ffffffffffffffffffffffffffffffffffffffff16610fb961150e565b73ffffffffffffffffffffffffffffffffffffffff161461100f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100690615645565b60405180910390fd5b61101881612a8f565b50565b61102c611026612998565b82612ba3565b61106b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611062906156e5565b60405180910390fd5b611076838383612c81565b505050565b6110968383836040518060200160405280600081525061215e565b505050565b6110a3612998565b73ffffffffffffffffffffffffffffffffffffffff166110c161150e565b73ffffffffffffffffffffffffffffffffffffffff1614611117576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110e90615645565b60405180910390fd5b6001601660006101000a81548160ff021916908315150217905550565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156111dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d490615565565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611257576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124e90615545565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6112a6612998565b73ffffffffffffffffffffffffffffffffffffffff166112c461150e565b73ffffffffffffffffffffffffffffffffffffffff161461131a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131190615645565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000600e600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600080600080600061142a6008612a59565b94506009549350600b60009054906101000a900461ffff169250600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169150600a5490509091929394565b61147d612998565b73ffffffffffffffffffffffffffffffffffffffff1661149b61150e565b73ffffffffffffffffffffffffffffffffffffffff16146114f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e890615645565b60405180910390fd5b6000601660006101000a81548160ff021916908315150217905550565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461154790615c99565b80601f016020809104026020016040519081016040528092919081815260200182805461157390615c99565b80156115c05780601f10611595576101008083540402835291602001916115c0565b820191906000526020600020905b8154815290600101906020018083116115a357829003601f168201915b5050505050905090565b600c81815481106115da57600080fd5b9060005260206000200160009150905080546115f590615c99565b80601f016020809104026020016040519081016040528092919081815260200182805461162190615c99565b801561166e5780601f106116435761010080835404028352916020019161166e565b820191906000526020600020905b81548152906001019060200180831161165157829003601f168201915b505050505081565b600a5481565b60095481565b61168a612998565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156116f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ef906154c5565b60405180910390fd5b8060056000611705612998565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166117b2612998565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516117f791906153cd565b60405180910390a35050565b61180b612998565b73ffffffffffffffffffffffffffffffffffffffff1661182961150e565b73ffffffffffffffffffffffffffffffffffffffff161461187f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187690615645565b60405180910390fd5b806009819055507fa6dc15bdb68da224c66db4b3838d9a2b205138e8cff6774e57d0af91e196d622816040516118b59190615750565b60405180910390a150565b60606118cf8261ffff1661292c565b61190e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611905906156c5565b60405180910390fd5b60008060108461ffff16101561192b576000915060019050611abd565b60208461ffff161015611945576010915060029050611abc565b60308461ffff16101561195f576020915060039050611abb565b60408461ffff161015611979576030915060049050611aba565b60508461ffff161015611993576040915060059050611ab9565b60608461ffff1610156119ad576050915060069050611ab8565b60708461ffff1610156119c7576060915060079050611ab7565b60808461ffff1610156119e1576070915060089050611ab6565b60908461ffff1610156119fb576080915060099050611ab5565b60a08461ffff161015611a155760909150600a9050611ab4565b60b08461ffff161015611a2f5760a09150600b9050611ab3565b60c08461ffff161015611a495760b09150600c9050611ab2565b60d08461ffff161015611a635760c09150600d9050611ab1565b60e08461ffff161015611a7d5760d09150600e9050611ab0565b60f08461ffff161015611a975760e09150600f9050611aaf565b6101008461ffff161015611aae5760f09150601090505b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b6001601085611acc9190615d9f565b611ad691906159a4565b61ffff1667ffffffffffffffff811115611b19577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015611b5257816020015b611b3f613e54565b815260200190600190039081611b375790505b50925060606000611b61613ed1565b6060806000808890505b8a61ffff168161ffff161161215057611d9481601160018b611b8d9190615b68565b60ff1681548110611bc7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090602091828204019190069054906101000a900460ff16601560018c611bf69190615b68565b60ff1681548110611c30577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090601091828204019190066002029054906101000a900461ffff16601260018d611c639190615b68565b60ff1681548110611c9d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090602091828204019190069054906101000a900460ff16601360018e611ccc9190615b68565b60ff1681548110611d06577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090602091828204019190069054906101000a900460ff16601460018f611d359190615b68565b60ff1681548110611d6f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090602091828204019190069054906101000a900460ff16612edd565b809750819850829950839a50849b5050505050506040518061018001604052808960ff168152602001601160018b611dcc9190615b68565b60ff1681548110611e06577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090602091828204019190069054906101000a900460ff1660ff168152602001601560018b611e3d9190615b68565b60ff1681548110611e77577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090601091828204019190066002029054906101000a900461ffff1661ffff168152602001601260018b611eb39190615b68565b60ff1681548110611eed577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090602091828204019190069054906101000a900460ff1660ff168152602001601360018b611f249190615b68565b60ff1681548110611f5e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090602091828204019190069054906101000a900460ff1660ff168152602001601460018b611f959190615b68565b60ff1681548110611fcf577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090602091828204019190069054906101000a900460ff1660ff16815260200188815260200187815260200160108460ff1681548110612040577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001805461205590615c99565b80601f016020809104026020016040519081016040528092919081815260200182805461208190615c99565b80156120ce5780601f106120a3576101008083540402835291602001916120ce565b820191906000526020600020905b8154815290600101906020018083116120b157829003601f168201915b50505050508152602001868152602001858152602001848152508a8360ff1681518110612124577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181905250818061213a90615d3f565b925050808061214890615ccb565b915050611b6b565b505050505050505050919050565b61216f612169612998565b83612ba3565b6121ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121a5906156e5565b60405180910390fd5b6121ba84848484612f9d565b50505050565b6121c8612998565b73ffffffffffffffffffffffffffffffffffffffff166121e661150e565b73ffffffffffffffffffffffffffffffffffffffff161461223c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161223390615645565b60405180910390fd5b61224a8261ffff1682612ff9565b7f70d7d33e97e93f5470088d44f15876b79e8c3b1eb23451169b15f0140a60a798828260405161227b929190615720565b60405180910390a15050565b61228f612998565b73ffffffffffffffffffffffffffffffffffffffff166122ad61150e565b73ffffffffffffffffffffffffffffffffffffffff1614612303576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122fa90615645565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015612349573d6000803e3d6000fd5b505050565b60606123598261292c565b612398576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161238f90615605565b60405180910390fd5b60006006600084815260200190815260200160002080546123b890615c99565b80601f01602080910402602001604051908101604052809291908181526020018280546123e490615c99565b80156124315780601f1061240657610100808354040283529160200191612431565b820191906000526020600020905b81548152906001019060200180831161241457829003601f168201915b50505050509050600061244261306d565b905060008151141561245857819250505061249b565b60008251111561248d5780826040516020016124759291906152c6565b6040516020818303038152906040529250505061249b565b61249684613084565b925050505b919050565b600e6020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6124db612998565b73ffffffffffffffffffffffffffffffffffffffff166124f961150e565b73ffffffffffffffffffffffffffffffffffffffff161461254f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161254690615645565b60405180910390fd5b80600c8360ff168154811061258d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200190805190602001906125aa929190613ef8565b507f07db7abac2f5d75b8ded7fcc6a1ada1cdaa305f73d67f1b5f17c56338b22c18882826040516125dc9291906157be565b60405180910390a15050565b600b60009054906101000a900461ffff1681565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b612698612998565b73ffffffffffffffffffffffffffffffffffffffff166126b661150e565b73ffffffffffffffffffffffffffffffffffffffff161461270c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161270390615645565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561277c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161277390615465565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b612844612998565b73ffffffffffffffffffffffffffffffffffffffff1661286261150e565b73ffffffffffffffffffffffffffffffffffffffff16146128b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128af90615645565b60405180910390fd5b80600a8190555050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612a1383611134565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b6000808211612a7557600080fd5b60008284612a839190615a32565b90508091505092915050565b612aa233612a9d6008612a59565b61312b565b6000600f612ab8612ab36008612a59565b613149565b604051602001612ac99291906152ea565b6040516020818303038152906040529050612aed612ae76008612a59565b82612ff9565b81600e6000612afc6008612a59565b815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550612b5260086132f6565b6001612b5e6008612a59565b612b689190615b34565b7fac60a09674f049f6a63c51f373fb7febaf74a582f3a9f82cd39275be73988d2182604051612b979190615403565b60405180910390a25050565b6000612bae8261292c565b612bed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612be4906154e5565b60405180910390fd5b6000612bf883611134565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612c6757508373ffffffffffffffffffffffffffffffffffffffff16612c4f84610a42565b73ffffffffffffffffffffffffffffffffffffffff16145b80612c785750612c7781856125fc565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612ca182611134565b73ffffffffffffffffffffffffffffffffffffffff1614612cf7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cee90615665565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612d67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d5e906154a5565b60405180910390fd5b612d7283838361330c565b612d7d6000826129a0565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612dcd9190615b34565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612e2491906159dc565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60606000612ee9613ed1565b606080600e60008c61ffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16604051602001612f3491906152ab565b60405160208183030381529060405294508a604051602001612f56919061530e565b604051602081830303815290604052805190602001209350612f79858b8b613311565b8093508194505050612f8d8489898961388e565b9050965096509650965096915050565b612fa8848484612c81565b612fb484848484613a81565b612ff3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fea90615445565b60405180910390fd5b50505050565b6130028261292c565b613041576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613038906155a5565b60405180910390fd5b80600660008481526020019081526020016000209080519060200190613068929190613ef8565b505050565b606060405180602001604052806000815250905090565b606061308f8261292c565b6130ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130c590615685565b60405180910390fd5b60006130d861306d565b905060008151116130f85760405180602001604052806000815250613123565b8061310284613149565b6040516020016131139291906152c6565b6040516020818303038152906040525b915050919050565b613145828260405180602001604052806000815250613c18565b5050565b60606000821415613191576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506132f1565b600082905060005b600082146131c35780806131ac90615cf6565b915050600a826131bc9190615a32565b9150613199565b60008167ffffffffffffffff811115613205577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156132375781602001600182028036833780820191505090505b5090505b600085146132ea576001826132509190615b34565b9150600a8561325f9190615dd0565b603061326b91906159dc565b60f81b8183815181106132a7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856132e39190615a32565b945061323b565b8093505050505b919050565b6001816000016000828254019250508190555050565b505050565b613319613ed1565b606060006040518060600160405280600f60f81b6004898560ff168151811061336b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916901c1660f81c60ff1663ffffffff168152602001600f60f81b888460ff16815181106133ed577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b1660f81c60ff168152602001600f6004898561341390615d3f565b95508560ff1681518110613450577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916901c60f81c1660ff1681525092508460ff1667ffffffffffffffff8111156134ce577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405190808252806020026020018201604052801561350757816020015b6134f4613f7e565b8152602001906001900390816134ec5790505b50915060005b8560ff168160ff1610156138845760006040518060c0016040528087600f60f81b8b8760ff168151811061356a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b1660f81c60ff166135869190615a63565b61ffff16815260200187600f60f81b60048c886135a290615d3f565b98508860ff16815181106135df577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916901c1660f81c60ff1661361f9190615a63565b61ffff16815260200187600f60f81b8b8760ff168151811061366a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b1660f81c60ff166136869190615a63565b61ffff16815260200187600f60f81b60048c886136a290615d3f565b98508860ff16815181106136df577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916901c1660f81c60ff1661371f9190615a63565b61ffff16815260200187600f60f81b8b8760ff168151811061376a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b1660f81c60ff166137869190615a63565b61ffff16815260200187600f60f81b60048c886137a290615d3f565b98508860ff16815181106137df577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916901c1660f81c60ff1661381f9190615a63565b61ffff16815250905080848360ff1681518110613865577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001018190525050808061387c90615d3f565b91505061350d565b5050935093915050565b606060008460ff1667ffffffffffffffff8111156138d5577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405190808252806020026020018201604052801561390e57816020015b6138fb613fb4565b8152602001906001900390816138f35790505b50915060005b8560ff168160ff161015613a77576000604051806040016040528087600f60f81b60048c8860ff1660208110613973577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b1a60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916901c1660f81c6139a99190615af9565b60ff16815260200186600f60f81b8b8760ff16602081106139f3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b1a60f81b1660f81c613a059190615af9565b60ff1681525090508280613a1890615d3f565b93505080848360ff1681518110613a58577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181905250508080613a6f90615d3f565b915050613914565b5050949350505050565b6000613aa28473ffffffffffffffffffffffffffffffffffffffff16613c73565b15613c0b578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613acb612998565b8786866040518563ffffffff1660e01b8152600401613aed949392919061535f565b602060405180830381600087803b158015613b0757600080fd5b505af1925050508015613b3857506040513d601f19601f82011682018060405250810190613b35919061439e565b60015b613bbb573d8060008114613b68576040519150601f19603f3d011682016040523d82523d6000602084013e613b6d565b606091505b50600081511415613bb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613baa90615445565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613c10565b600190505b949350505050565b613c228383613c86565b613c2f6000848484613a81565b613c6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c6590615445565b60405180910390fd5b505050565b600080823b905060008111915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613cf6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613ced906155e5565b60405180910390fd5b613cff8161292c565b15613d3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613d3690615485565b60405180910390fd5b613d4b6000838361330c565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613d9b91906159dc565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b604051806101800160405280600060ff168152602001600060ff168152602001600061ffff168152602001600060ff168152602001600060ff168152602001600060ff168152602001606081526020016000801916815260200160608152602001613ebd613ed1565b815260200160608152602001606081525090565b6040518060600160405280600063ffffffff16815260200160008152602001600081525090565b828054613f0490615c99565b90600052602060002090601f016020900481019282613f265760008555613f6d565b82601f10613f3f57805160ff1916838001178555613f6d565b82800160010185558215613f6d579182015b82811115613f6c578251825591602001919060010190613f51565b5b509050613f7a9190613fd4565b5090565b6040518060c001604052806000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6040518060400160405280600060ff168152602001600060ff1681525090565b5b80821115613fed576000816000905550600101613fd5565b5090565b6000614004613fff8461581f565b6157ee565b90508281526020810184848401111561401c57600080fd5b614027848285615c57565b509392505050565b600061404261403d8461584f565b6157ee565b90508281526020810184848401111561405a57600080fd5b614065848285615c57565b509392505050565b60008135905061407c81615ee8565b92915050565b60008135905061409181615eff565b92915050565b6000813590506140a681615f16565b92915050565b6000813590506140bb81615f2d565b92915050565b6000815190506140d081615f2d565b92915050565b600082601f8301126140e757600080fd5b81356140f7848260208601613ff1565b91505092915050565b600082601f83011261411157600080fd5b813561412184826020860161402f565b91505092915050565b60008135905061413981615f44565b92915050565b60008135905061414e81615f5b565b92915050565b60008135905061416381615f72565b92915050565b60006020828403121561417b57600080fd5b60006141898482850161406d565b91505092915050565b6000602082840312156141a457600080fd5b60006141b284828501614082565b91505092915050565b600080604083850312156141ce57600080fd5b60006141dc85828601614082565b92505060206141ed8582860161413f565b9150509250929050565b6000806040838503121561420a57600080fd5b60006142188582860161406d565b92505060206142298582860161406d565b9150509250929050565b60008060006060848603121561424857600080fd5b60006142568682870161406d565b93505060206142678682870161406d565b92505060406142788682870161413f565b9150509250925092565b6000806000806080858703121561429857600080fd5b60006142a68782880161406d565b94505060206142b78782880161406d565b93505060406142c88782880161413f565b925050606085013567ffffffffffffffff8111156142e557600080fd5b6142f1878288016140d6565b91505092959194509250565b6000806040838503121561431057600080fd5b600061431e8582860161406d565b925050602061432f85828601614097565b9150509250929050565b6000806040838503121561434c57600080fd5b600061435a8582860161406d565b925050602061436b8582860161413f565b9150509250929050565b60006020828403121561438757600080fd5b6000614395848285016140ac565b91505092915050565b6000602082840312156143b057600080fd5b60006143be848285016140c1565b91505092915050565b6000602082840312156143d957600080fd5b60006143e78482850161412a565b91505092915050565b6000806040838503121561440357600080fd5b60006144118582860161412a565b925050602083013567ffffffffffffffff81111561442e57600080fd5b61443a85828601614100565b9150509250929050565b60006020828403121561445657600080fd5b60006144648482850161413f565b91505092915050565b6000806040838503121561448057600080fd5b600061448e85828601614154565b925050602083013567ffffffffffffffff8111156144ab57600080fd5b6144b785828601614100565b9150509250929050565b60006144cd8383615068565b60408301905092915050565b60006144e58383615097565b905092915050565b60006144f983836151b0565b60c08301905092915050565b61450e81615bae565b82525050565b61451d81615b9c565b82525050565b61453461452f82615b9c565b615d69565b82525050565b6000614545826158c4565b61454f8185615922565b935061455a8361587f565b8060005b8381101561458b57815161457288826144c1565b975061457d836158fb565b92505060018101905061455e565b5085935050505092915050565b60006145a3826158cf565b6145ad8185615933565b9350836020820285016145bf8561588f565b8060005b858110156145fb57848403895281516145dc85826144d9565b94506145e783615908565b925060208a019950506001810190506145c3565b50829750879550505050505092915050565b6000614618826158da565b6146228185615944565b935061462d8361589f565b8060005b8381101561465e57815161464588826144ed565b975061465083615915565b925050600181019050614631565b5085935050505092915050565b61467481615bc0565b82525050565b61468381615bcc565b82525050565b61469281615bd6565b82525050565b60006146a3826158e5565b6146ad8185615955565b93506146bd818560208601615c66565b6146c681615ebd565b840191505092915050565b60006146dc826158e5565b6146e68185615966565b93506146f6818560208601615c66565b6146ff81615ebd565b840191505092915050565b6000614715826158f0565b61471f8185615977565b935061472f818560208601615c66565b61473881615ebd565b840191505092915050565b600061474e826158f0565b6147588185615988565b9350614768818560208601615c66565b61477181615ebd565b840191505092915050565b6000614787826158f0565b6147918185615999565b93506147a1818560208601615c66565b80840191505092915050565b600081546147ba81615c99565b6147c48186615999565b945060018216600081146147df57600181146147f057614823565b60ff19831686528186019350614823565b6147f9856158af565b60005b8381101561481b578154818901526001820191506020810190506147fc565b838801955050505b50505092915050565b6000614839601583615988565b91507f496e73756666696369656e74204554482073656e7400000000000000000000006000830152602082019050919050565b6000614879603283615988565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b60006148df602683615988565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614945601c83615988565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000614985602483615988565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006149eb601983615988565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000614a2b602c83615988565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000614a91601d83615988565b91507f4d696e74696e672069732063757272656e746c792064697361626c65640000006000830152602082019050919050565b6000614ad1603883615988565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000614b37602a83615988565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000614b9d602983615988565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000614c03601983615988565b91507f43617573652042656e6566696369617279206e6f7420736574000000000000006000830152602082019050919050565b6000614c43602e83615988565b91507f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008301527f6578697374656e7420746f6b656e0000000000000000000000000000000000006020830152604082019050919050565b6000614ca9601183615988565b91507f4d617820746f6b656e73206973737565640000000000000000000000000000006000830152602082019050919050565b6000614ce9602083615988565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000614d29603183615988565b91507f45524337323155524953746f726167653a2055524920717565727920666f722060008301527f6e6f6e6578697374656e7420746f6b656e0000000000000000000000000000006020830152604082019050919050565b6000614d8f602c83615988565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000614df5602083615988565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000614e35602983615988565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000614e9b602f83615988565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000614f01602183615988565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614f67602283615988565b91507f52657175657374656420746f6b656e20646f6573206e6f74206578697374207960008301527f65740000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614fcd603183615988565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b60608201600082015161503c600085018261527e565b50602082015161504f6020850182615260565b5060408201516150626040850182615260565b50505050565b60408201600082015161507e600085018261528d565b506020820151615091602085018261528d565b50505050565b60006101c0830160008301516150b0600086018261528d565b5060208301516150c3602086018261528d565b5060408301516150d6604086018261522b565b5060608301516150e9606086018261528d565b5060808301516150fc608086018261528d565b5060a083015161510f60a086018261528d565b5060c083015184820360c08601526151278282614698565b91505060e083015161513c60e086018261467a565b50610100830151848203610100860152615156828261470a565b91505061012083015161516d610120860182615026565b50610140830151848203610180860152615187828261460d565b9150506101608301518482036101a08601526151a3828261453a565b9150508091505092915050565b60c0820160008201516151c66000850182615260565b5060208201516151d96020850182615260565b5060408201516151ec6040850182615260565b5060608201516151ff6060850182615260565b5060808201516152126080850182615260565b5060a082015161522560a0850182615260565b50505050565b61523481615c02565b82525050565b61524381615c02565b82525050565b61525a61525582615c02565b615d7b565b82525050565b61526981615c30565b82525050565b61527881615c30565b82525050565b61528781615c3a565b82525050565b61529681615c4a565b82525050565b6152a581615c4a565b82525050565b60006152b78284614523565b60148201915081905092915050565b60006152d2828561477c565b91506152de828461477c565b91508190509392505050565b60006152f682856147ad565b9150615302828461477c565b91508190509392505050565b600061531a8284615249565b60028201915081905092915050565b600060208201905061533e6000830184614514565b92915050565b60006020820190506153596000830184614505565b92915050565b60006080820190506153746000830187614514565b6153816020830186614514565b61538e604083018561526f565b81810360608301526153a081846146d1565b905095945050505050565b600060208201905081810360008301526153c58184614598565b905092915050565b60006020820190506153e2600083018461466b565b92915050565b60006020820190506153fd6000830184614689565b92915050565b6000602082019050818103600083015261541d8184614743565b905092915050565b6000602082019050818103600083015261543e8161482c565b9050919050565b6000602082019050818103600083015261545e8161486c565b9050919050565b6000602082019050818103600083015261547e816148d2565b9050919050565b6000602082019050818103600083015261549e81614938565b9050919050565b600060208201905081810360008301526154be81614978565b9050919050565b600060208201905081810360008301526154de816149de565b9050919050565b600060208201905081810360008301526154fe81614a1e565b9050919050565b6000602082019050818103600083015261551e81614a84565b9050919050565b6000602082019050818103600083015261553e81614ac4565b9050919050565b6000602082019050818103600083015261555e81614b2a565b9050919050565b6000602082019050818103600083015261557e81614b90565b9050919050565b6000602082019050818103600083015261559e81614bf6565b9050919050565b600060208201905081810360008301526155be81614c36565b9050919050565b600060208201905081810360008301526155de81614c9c565b9050919050565b600060208201905081810360008301526155fe81614cdc565b9050919050565b6000602082019050818103600083015261561e81614d1c565b9050919050565b6000602082019050818103600083015261563e81614d82565b9050919050565b6000602082019050818103600083015261565e81614de8565b9050919050565b6000602082019050818103600083015261567e81614e28565b9050919050565b6000602082019050818103600083015261569e81614e8e565b9050919050565b600060208201905081810360008301526156be81614ef4565b9050919050565b600060208201905081810360008301526156de81614f5a565b9050919050565b600060208201905081810360008301526156fe81614fc0565b9050919050565b600060208201905061571a600083018461523a565b92915050565b6000604082019050615735600083018561523a565b81810360208301526157478184614743565b90509392505050565b6000602082019050615765600083018461526f565b92915050565b600060a082019050615780600083018861526f565b61578d602083018761526f565b61579a604083018661523a565b6157a76060830185614514565b6157b4608083018461526f565b9695505050505050565b60006040820190506157d3600083018561529c565b81810360208301526157e58184614743565b90509392505050565b6000604051905081810181811067ffffffffffffffff8211171561581557615814615e8e565b5b8060405250919050565b600067ffffffffffffffff82111561583a57615839615e8e565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff82111561586a57615869615e8e565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006159af82615c02565b91506159ba83615c02565b92508261ffff038211156159d1576159d0615e01565b5b828201905092915050565b60006159e782615c30565b91506159f283615c30565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115615a2757615a26615e01565b5b828201905092915050565b6000615a3d82615c30565b9150615a4883615c30565b925082615a5857615a57615e30565b5b828204905092915050565b6000615a6e82615c02565b9150615a7983615c02565b92508161ffff0483118215151615615a9457615a93615e01565b5b828202905092915050565b6000615aaa82615c30565b9150615ab583615c30565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615615aee57615aed615e01565b5b828202905092915050565b6000615b0482615c4a565b9150615b0f83615c4a565b92508160ff0483118215151615615b2957615b28615e01565b5b828202905092915050565b6000615b3f82615c30565b9150615b4a83615c30565b925082821015615b5d57615b5c615e01565b5b828203905092915050565b6000615b7382615c4a565b9150615b7e83615c4a565b925082821015615b9157615b90615e01565b5b828203905092915050565b6000615ba782615c10565b9050919050565b6000615bb982615c10565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600063ffffffff82169050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015615c84578082015181840152602081019050615c69565b83811115615c93576000848401525b50505050565b60006002820490506001821680615cb157607f821691505b60208210811415615cc557615cc4615e5f565b5b50919050565b6000615cd682615c02565b915061ffff821415615ceb57615cea615e01565b5b600182019050919050565b6000615d0182615c30565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415615d3457615d33615e01565b5b600182019050919050565b6000615d4a82615c4a565b915060ff821415615d5e57615d5d615e01565b5b600182019050919050565b6000615d7482615d8d565b9050919050565b6000615d8682615ece565b9050919050565b6000615d9882615edb565b9050919050565b6000615daa82615c02565b9150615db583615c02565b925082615dc557615dc4615e30565b5b828206905092915050565b6000615ddb82615c30565b9150615de683615c30565b925082615df657615df5615e30565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160f01b9050919050565b60008160601b9050919050565b615ef181615b9c565b8114615efc57600080fd5b50565b615f0881615bae565b8114615f1357600080fd5b50565b615f1f81615bc0565b8114615f2a57600080fd5b50565b615f3681615bd6565b8114615f4157600080fd5b50565b615f4d81615c02565b8114615f5857600080fd5b50565b615f6481615c30565b8114615f6f57600080fd5b50565b615f7b81615c4a565b8114615f8657600080fd5b5056fea2646970667358221220dd6c6b388c5cc92616da715c078fbeeb2863a835ea209978d2b3818c4a62efa964736f6c63430008000033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000c7464dbca260a8faf033460622b23467df5aea42000000000000000000000000000000000000000000000000000000000000001447656e65723874697665204d75746174696f6e73000000000000000000000000000000000000000000000000000000000000000000000000000000000000000547656e4d75000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002d68747470733a2f2f6170692e67656e657238746976652e696f2f6d75746174696f6e732f6d657461646174612f00000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _name (string): Gener8tive Mutations
Arg [1] : _symbol (string): GenMu
Arg [2] : _baseUrl (string): https://api.gener8tive.io/mutations/metadata/
Arg [3] : _causeBeneficiary (address): 0xc7464dbcA260A8faF033460622B23467Df5AEA42
-----Encoded View---------------
11 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [3] : 000000000000000000000000c7464dbca260a8faf033460622b23467df5aea42
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000014
Arg [5] : 47656e65723874697665204d75746174696f6e73000000000000000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [7] : 47656e4d75000000000000000000000000000000000000000000000000000000
Arg [8] : 000000000000000000000000000000000000000000000000000000000000002d
Arg [9] : 68747470733a2f2f6170692e67656e657238746976652e696f2f6d7574617469
Arg [10] : 6f6e732f6d657461646174612f00000000000000000000000000000000000000
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.