Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
1,000 BGA
Holders
457
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
2 BGALoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
BearmarketGoaway
Compiler Version
v0.8.9+commit.e5eed63a
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-06-02 */ // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/security/ReentrancyGuard.sol // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File: https://github.com/chiru-labs/ERC721A/blob/main/contracts/IERC721A.sol // ERC721A Contracts v4.0.0 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of an ERC721A compliant contract. */ interface IERC721A { /** * The caller must own the token or be an approved operator. */ error ApprovalCallerNotOwnerNorApproved(); /** * The token does not exist. */ error ApprovalQueryForNonexistentToken(); /** * The caller cannot approve to their own address. */ error ApproveToCaller(); /** * The caller cannot approve to the current owner. */ error ApprovalToCurrentOwner(); /** * Cannot query the balance for the zero address. */ error BalanceQueryForZeroAddress(); /** * Cannot mint to the zero address. */ error MintToZeroAddress(); /** * The quantity of tokens minted must be more than zero. */ error MintZeroQuantity(); /** * The token does not exist. */ error OwnerQueryForNonexistentToken(); /** * The caller must own the token or be an approved operator. */ error TransferCallerNotOwnerNorApproved(); /** * The token must be owned by `from`. */ error TransferFromIncorrectOwner(); /** * Cannot safely transfer to a contract that does not implement the ERC721Receiver interface. */ error TransferToNonERC721ReceiverImplementer(); /** * Cannot transfer to the zero address. */ error TransferToZeroAddress(); /** * The token does not exist. */ error URIQueryForNonexistentToken(); struct TokenOwnership { // The address of the owner. address addr; // Keeps track of the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; } /** * @dev Returns the total amount of tokens stored by the contract. * * Burned tokens are calculated here, use `_totalMinted()` if you want to count just minted tokens. */ function totalSupply() external view returns (uint256); // ============================== // 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); // ============================== // IERC721 // ============================== /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); // ============================== // IERC721Metadata // ============================== /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: https://github.com/chiru-labs/ERC721A/blob/main/contracts/ERC721A.sol // ERC721A Contracts v4.0.0 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev ERC721 token receiver interface. */ interface ERC721A__IERC721Receiver { function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..). * * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is IERC721A { // Mask of an entry in packed address data. uint256 private constant BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1; // The bit position of `numberMinted` in packed address data. uint256 private constant BITPOS_NUMBER_MINTED = 64; // The bit position of `numberBurned` in packed address data. uint256 private constant BITPOS_NUMBER_BURNED = 128; // The bit position of `aux` in packed address data. uint256 private constant BITPOS_AUX = 192; // Mask of all 256 bits in packed address data except the 64 bits for `aux`. uint256 private constant BITMASK_AUX_COMPLEMENT = (1 << 192) - 1; // The bit position of `startTimestamp` in packed ownership. uint256 private constant BITPOS_START_TIMESTAMP = 160; // The bit mask of the `burned` bit in packed ownership. uint256 private constant BITMASK_BURNED = 1 << 224; // The bit position of the `nextInitialized` bit in packed ownership. uint256 private constant BITPOS_NEXT_INITIALIZED = 225; // The bit mask of the `nextInitialized` bit in packed ownership. uint256 private constant BITMASK_NEXT_INITIALIZED = 1 << 225; // The tokenId of the next token to be minted. uint256 private _currentIndex; // The number of tokens burned. uint256 private _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. // See `_packedOwnershipOf` implementation for details. // // Bits Layout: // - [0..159] `addr` // - [160..223] `startTimestamp` // - [224] `burned` // - [225] `nextInitialized` mapping(uint256 => uint256) private _packedOwnerships; // Mapping owner address to address data. // // Bits Layout: // - [0..63] `balance` // - [64..127] `numberMinted` // - [128..191] `numberBurned` // - [192..255] `aux` mapping(address => uint256) private _packedAddressData; // 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; constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } /** * @dev Returns the starting token ID. * To change the starting token ID, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev Returns the next token ID to be minted. */ function _nextTokenId() internal view returns (uint256) { return _currentIndex; } /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see `_totalMinted`. */ function totalSupply() public view override returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than `_currentIndex - _startTokenId()` times. unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * @dev Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view returns (uint256) { // Counter underflow is impossible as _currentIndex does not decrement, // and it is initialized to `_startTokenId()` unchecked { return _currentIndex - _startTokenId(); } } /** * @dev Returns the total number of tokens burned. */ function _totalBurned() internal view returns (uint256) { return _burnCounter; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { // The interface IDs are constants representing the first 4 bytes of the XOR of // all function selectors in the interface. See: https://eips.ethereum.org/EIPS/eip-165 // e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)` return interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165. interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721. interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata. } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view override returns (uint256) { if (_addressToUint256(owner) == 0) revert BalanceQueryForZeroAddress(); return _packedAddressData[owner] & BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> BITPOS_NUMBER_MINTED) & BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> BITPOS_NUMBER_BURNED) & BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return uint64(_packedAddressData[owner] >> BITPOS_AUX); } /** * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal { uint256 packed = _packedAddressData[owner]; uint256 auxCasted; assembly { // Cast aux without masking. auxCasted := aux } packed = (packed & BITMASK_AUX_COMPLEMENT) | (auxCasted << BITPOS_AUX); _packedAddressData[owner] = packed; } /** * Returns the packed ownership data of `tokenId`. */ function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr) if (curr < _currentIndex) { uint256 packed = _packedOwnerships[curr]; // If not burned. if (packed & BITMASK_BURNED == 0) { // Invariant: // There will always be an ownership that has an address and is not burned // before an ownership that does not have an address and is not burned. // Hence, curr will not underflow. // // We can directly compare the packed value. // If the address is zero, packed is zero. while (packed == 0) { packed = _packedOwnerships[--curr]; } return packed; } } } revert OwnerQueryForNonexistentToken(); } /** * Returns the unpacked `TokenOwnership` struct from `packed`. */ function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) { ownership.addr = address(uint160(packed)); ownership.startTimestamp = uint64(packed >> BITPOS_START_TIMESTAMP); ownership.burned = packed & BITMASK_BURNED != 0; } /** * Returns the unpacked `TokenOwnership` struct at `index`. */ function _ownershipAt(uint256 index) internal view returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnerships[index]); } /** * @dev Initializes the ownership slot minted at `index` for efficiency purposes. */ function _initializeOwnershipAt(uint256 index) internal { if (_packedOwnerships[index] == 0) { _packedOwnerships[index] = _packedOwnershipOf(index); } } /** * Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around in the collection over time. */ function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnershipOf(tokenId)); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return address(uint160(_packedOwnershipOf(tokenId))); } /** * @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) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : ''; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } /** * @dev Casts the address to uint256 without masking. */ function _addressToUint256(address value) private pure returns (uint256 result) { assembly { result := value } } /** * @dev Casts the boolean to uint256 without branching. */ function _boolToUint256(bool value) private pure returns (uint256 result) { assembly { result := value } } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public override { address owner = address(uint160(_packedOwnershipOf(tokenId))); if (to == owner) revert ApprovalToCurrentOwner(); if (_msgSenderERC721A() != owner) if (!isApprovedForAll(owner, _msgSenderERC721A())) { revert ApprovalCallerNotOwnerNorApproved(); } _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { if (operator == _msgSenderERC721A()) revert ApproveToCaller(); _operatorApprovals[_msgSenderERC721A()][operator] = approved; emit ApprovalForAll(_msgSenderERC721A(), 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 { _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 { _transfer(from, to, tokenId); if (to.code.length != 0) if (!_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @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`), */ function _exists(uint256 tokenId) internal view returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && // If within bounds, _packedOwnerships[tokenId] & BITMASK_BURNED == 0; // and not burned. } /** * @dev Equivalent to `_safeMint(to, quantity, '')`. */ function _safeMint(address to, uint256 quantity) internal { _safeMint(to, quantity, ''); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { uint256 startTokenId = _currentIndex; if (_addressToUint256(to) == 0) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1 // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1 unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the balance and number minted. _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _addressToUint256(to) | (block.timestamp << BITPOS_START_TIMESTAMP) | (_boolToUint256(quantity == 1) << BITPOS_NEXT_INITIALIZED); uint256 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; if (to.code.length != 0) { do { emit Transfer(address(0), to, updatedIndex); if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (updatedIndex < end); // Reentrancy protection if (_currentIndex != startTokenId) revert(); } else { do { emit Transfer(address(0), to, updatedIndex++); } while (updatedIndex < end); } _currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _mint(address to, uint256 quantity) internal { uint256 startTokenId = _currentIndex; if (_addressToUint256(to) == 0) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1 // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1 unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the balance and number minted. _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _addressToUint256(to) | (block.timestamp << BITPOS_START_TIMESTAMP) | (_boolToUint256(quantity == 1) << BITPOS_NEXT_INITIALIZED); uint256 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; do { emit Transfer(address(0), to, updatedIndex++); } while (updatedIndex < end); _currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Transfers `tokenId` from `from` to `to`. * * 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 ) private { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner(); address approvedAddress = _tokenApprovals[tokenId]; bool isApprovedOrOwner = (_msgSenderERC721A() == from || isApprovedForAll(from, _msgSenderERC721A()) || approvedAddress == _msgSenderERC721A()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); if (_addressToUint256(to) == 0) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner. if (_addressToUint256(approvedAddress) != 0) { delete _tokenApprovals[tokenId]; } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { // We can directly increment and decrement the balances. --_packedAddressData[from]; // Updates: `balance -= 1`. ++_packedAddressData[to]; // Updates: `balance += 1`. // Updates: // - `address` to the next owner. // - `startTimestamp` to the timestamp of transfering. // - `burned` to `false`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _addressToUint256(to) | (block.timestamp << BITPOS_START_TIMESTAMP) | BITMASK_NEXT_INITIALIZED; // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Equivalent to `_burn(tokenId, false)`. */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); address from = address(uint160(prevOwnershipPacked)); address approvedAddress = _tokenApprovals[tokenId]; if (approvalCheck) { bool isApprovedOrOwner = (_msgSenderERC721A() == from || isApprovedForAll(from, _msgSenderERC721A()) || approvedAddress == _msgSenderERC721A()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner. if (_addressToUint256(approvedAddress) != 0) { delete _tokenApprovals[tokenId]; } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { // Updates: // - `balance -= 1`. // - `numberBurned += 1`. // // We can directly decrement the balance, and increment the number burned. // This is equivalent to `packed -= 1; packed += 1 << BITPOS_NUMBER_BURNED;`. _packedAddressData[from] += (1 << BITPOS_NUMBER_BURNED) - 1; // Updates: // - `address` to the last owner. // - `startTimestamp` to the timestamp of burning. // - `burned` to `true`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _addressToUint256(from) | (block.timestamp << BITPOS_START_TIMESTAMP) | BITMASK_BURNED | BITMASK_NEXT_INITIALIZED; // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target 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 _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns ( bytes4 retval ) { return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } /** * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting. * And also called before burning one token. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * 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, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes * minting. * And also called after one token has been burned. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Returns the message sender (defaults to `msg.sender`). * * If you are writing GSN compatible contracts, you need to override this function. */ function _msgSenderERC721A() internal view virtual returns (address) { return msg.sender; } /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function _toString(uint256 value) internal pure returns (string memory ptr) { assembly { // The maximum value of a uint256 contains 78 digits (1 byte per digit), // but we allocate 128 bytes to keep the free memory pointer 32-byte word aliged. // We will need 1 32-byte word to store the length, // and 3 32-byte words to store a maximum of 78 digits. Total: 32 + 3 * 32 = 128. ptr := add(mload(0x40), 128) // Update the free memory pointer to allocate. mstore(0x40, ptr) // Cache the end of the memory to calculate the length later. let end := ptr // We write the string from the rightmost digit to the leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // Costs a bit more than early returning for the zero case, // but cheaper in terms of deployment and overall runtime costs. for { // Initialize and perform the first pass without check. let temp := value // Move the pointer 1 byte leftwards to point to an empty character slot. ptr := sub(ptr, 1) // Write the character to the pointer. 48 is the ASCII index of '0'. mstore8(ptr, add(48, mod(temp, 10))) temp := div(temp, 10) } temp { // Keep dividing `temp` until zero. temp := div(temp, 10) } { // Body of the for loop. ptr := sub(ptr, 1) mstore8(ptr, add(48, mod(temp, 10))) } let length := sub(end, ptr) // Move the pointer 32 bytes leftwards to make room for the length. ptr := sub(ptr, 32) // Store the length. mstore(ptr, length) } } } // File: BearmarketGoaway.sol pragma solidity >=0.8.9 <0.9.0; contract BearmarketGoaway is ERC721A, Ownable, ReentrancyGuard { using Strings for uint256; string public uri; string public uriSuffix = ".json"; uint256 public price = 0 ether; uint256 public supplyLimit = 5; uint256 public maxMintAmountPerTx = 2; uint256 public maxLimitPerWallet = 2; bool public publicSale = false; mapping(address => uint256) public walletMintedCount; constructor(string memory _uri) ERC721A("BearGoaway", "BGA") { seturi(_uri); } function publicMint(uint256 _mintAmount) public payable { require(publicSale, "PublicMint is paused!"); require(msg.sender == tx.origin, "no bots"); require( _mintAmount > 0 && _mintAmount <= maxMintAmountPerTx, "Invalid mint amount!" ); require( totalSupply() + _mintAmount <= supplyLimit, "Max supply exceeded!" ); require( _mintAmount + walletMintedCount[msg.sender] <= supplyLimit, "Max mints per wallet exceeded" ); require(msg.value >= price * _mintAmount, "Insufficient funds!"); _safeMint(_msgSender(), _mintAmount); } function seturi(string memory _uri) public onlyOwner { uri = _uri; } function setUriSuffix(string memory _uriSuffix) public onlyOwner { uriSuffix = _uriSuffix; } function setPublicSale(bool _publicSale) public onlyOwner { publicSale = _publicSale; } function setMaxMintAmountPerTx(uint256 _maxMintAmountPerTx) public onlyOwner { maxMintAmountPerTx = _maxMintAmountPerTx; } function setmaxLimitPerWallet(uint256 _maxLimitPerWallet) public onlyOwner { maxLimitPerWallet = _maxLimitPerWallet; } function setPrice(uint256 _price) public onlyOwner { price = _price; } function setsupplyLimit(uint256 _supplyLimit) public onlyOwner { supplyLimit = _supplyLimit; } function xrewardMint(uint256 quantity) public payable onlyOwner { require(walletMintedCount[msg.sender] <= 60, "Max mints limit"); require( totalSupply() + quantity <= supplyLimit, "Max supply exceeded!" ); walletMintedCount[msg.sender] = walletMintedCount[msg.sender] + quantity; _safeMint(msg.sender, quantity); } function withdraw() public onlyOwner nonReentrant { (bool os, ) = payable(owner()).call{value: address(this).balance}(""); require(os); } function _startTokenId() internal view virtual override returns (uint256) { return 1; } function tokenURI(uint256 _tokenId) public view virtual override returns (string memory) { require( _exists(_tokenId), "ERC721Metadata: URI query for nonexistent token" ); string memory currentBaseURI = _baseURI(); return bytes(currentBaseURI).length > 0 ? string( abi.encodePacked( currentBaseURI, _tokenId.toString(), uriSuffix ) ) : ""; } function _baseURI() internal view virtual override returns (string memory) { return uri; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxLimitPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmountPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"publicSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxMintAmountPerTx","type":"uint256"}],"name":"setMaxMintAmountPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_publicSale","type":"bool"}],"name":"setPublicSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriSuffix","type":"string"}],"name":"setUriSuffix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxLimitPerWallet","type":"uint256"}],"name":"setmaxLimitPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_supplyLimit","type":"uint256"}],"name":"setsupplyLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"seturi","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"supplyLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uriSuffix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"walletMintedCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"xrewardMint","outputs":[],"stateMutability":"payable","type":"function"}]
Contract Creation Code
60806040526040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600b90805190602001906200005192919062000356565b506000600c556005600d556002600e556002600f556000601060006101000a81548160ff0219169083151502179055503480156200008e57600080fd5b50604051620040a4380380620040a48339818101604052810190620000b49190620005a3565b6040518060400160405280600a81526020017f42656172476f61776179000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f424741000000000000000000000000000000000000000000000000000000000081525081600290805190602001906200013892919062000356565b5080600390805190602001906200015192919062000356565b5062000162620001aa60201b60201c565b60008190555050506200018a6200017e620001b360201b60201c565b620001bb60201b60201c565b6001600981905550620001a3816200028160201b60201c565b50620006dc565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b62000291620001b360201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620002b76200032c60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000310576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003079062000655565b60405180910390fd5b80600a90805190602001906200032892919062000356565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b8280546200036490620006a6565b90600052602060002090601f016020900481019282620003885760008555620003d4565b82601f10620003a357805160ff1916838001178555620003d4565b82800160010185558215620003d4579182015b82811115620003d3578251825591602001919060010190620003b6565b5b509050620003e39190620003e7565b5090565b5b8082111562000402576000816000905550600101620003e8565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200046f8262000424565b810181811067ffffffffffffffff8211171562000491576200049062000435565b5b80604052505050565b6000620004a662000406565b9050620004b4828262000464565b919050565b600067ffffffffffffffff821115620004d757620004d662000435565b5b620004e28262000424565b9050602081019050919050565b60005b838110156200050f578082015181840152602081019050620004f2565b838111156200051f576000848401525b50505050565b60006200053c6200053684620004b9565b6200049a565b9050828152602081018484840111156200055b576200055a6200041f565b5b62000568848285620004ef565b509392505050565b600082601f8301126200058857620005876200041a565b5b81516200059a84826020860162000525565b91505092915050565b600060208284031215620005bc57620005bb62000410565b5b600082015167ffffffffffffffff811115620005dd57620005dc62000415565b5b620005eb8482850162000570565b91505092915050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006200063d602083620005f4565b91506200064a8262000605565b602082019050919050565b6000602082019050818103600083015262000670816200062e565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620006bf57607f821691505b60208210811415620006d657620006d562000677565b5b50919050565b6139b880620006ec6000396000f3fe6080604052600436106102035760003560e01c80635aca1bb611610118578063a22cb465116100a0578063d9f0a6711161006f578063d9f0a67114610724578063e985e9c51461074d578063eac989f81461078a578063f2fde38b146107b5578063f6484980146107de57610203565b8063a22cb4651461066c578063b071401b14610695578063b88d4fde146106be578063c87b56dd146106e757610203565b80638da5cb5b116100e75780638da5cb5b1461059757806391b7f5ed146105c257806394354fd0146105eb57806395d89b4114610616578063a035b1fe1461064157610203565b80635aca1bb6146104dd5780636352211e1461050657806370a0823114610543578063715018a61461058057610203565b806323b872dd1161019b5780633ccfd60b1161016a5780633ccfd60b1461042b57806342842e0e146104425780635458c1241461046b5780635503a0e8146104875780635a0b8b23146104b257610203565b806323b872dd1461037e578063249f851b146103a75780632db11544146103e457806333bc1c5c1461040057610203565b8063095ea7b3116101d7578063095ea7b3146102d657806316ba10e0146102ff57806318160ddd1461032857806319d1997a1461035357610203565b806275770a1461020857806301ffc9a71461023157806306fdde031461026e578063081812fc14610299575b600080fd5b34801561021457600080fd5b5061022f600480360381019061022a919061295b565b610807565b005b34801561023d57600080fd5b50610258600480360381019061025391906129e0565b61088d565b6040516102659190612a28565b60405180910390f35b34801561027a57600080fd5b5061028361091f565b6040516102909190612adc565b60405180910390f35b3480156102a557600080fd5b506102c060048036038101906102bb919061295b565b6109b1565b6040516102cd9190612b3f565b60405180910390f35b3480156102e257600080fd5b506102fd60048036038101906102f89190612b86565b610a2d565b005b34801561030b57600080fd5b5061032660048036038101906103219190612cfb565b610bd4565b005b34801561033457600080fd5b5061033d610c6a565b60405161034a9190612d53565b60405180910390f35b34801561035f57600080fd5b50610368610c81565b6040516103759190612d53565b60405180910390f35b34801561038a57600080fd5b506103a560048036038101906103a09190612d6e565b610c87565b005b3480156103b357600080fd5b506103ce60048036038101906103c99190612dc1565b610c97565b6040516103db9190612d53565b60405180910390f35b6103fe60048036038101906103f9919061295b565b610caf565b005b34801561040c57600080fd5b50610415610f07565b6040516104229190612a28565b60405180910390f35b34801561043757600080fd5b50610440610f1a565b005b34801561044e57600080fd5b5061046960048036038101906104649190612d6e565b61106c565b005b6104856004803603810190610480919061295b565b61108c565b005b34801561049357600080fd5b5061049c61127d565b6040516104a99190612adc565b60405180910390f35b3480156104be57600080fd5b506104c761130b565b6040516104d49190612d53565b60405180910390f35b3480156104e957600080fd5b5061050460048036038101906104ff9190612e1a565b611311565b005b34801561051257600080fd5b5061052d6004803603810190610528919061295b565b6113aa565b60405161053a9190612b3f565b60405180910390f35b34801561054f57600080fd5b5061056a60048036038101906105659190612dc1565b6113bc565b6040516105779190612d53565b60405180910390f35b34801561058c57600080fd5b50610595611451565b005b3480156105a357600080fd5b506105ac6114d9565b6040516105b99190612b3f565b60405180910390f35b3480156105ce57600080fd5b506105e960048036038101906105e4919061295b565b611503565b005b3480156105f757600080fd5b50610600611589565b60405161060d9190612d53565b60405180910390f35b34801561062257600080fd5b5061062b61158f565b6040516106389190612adc565b60405180910390f35b34801561064d57600080fd5b50610656611621565b6040516106639190612d53565b60405180910390f35b34801561067857600080fd5b50610693600480360381019061068e9190612e47565b611627565b005b3480156106a157600080fd5b506106bc60048036038101906106b7919061295b565b61179f565b005b3480156106ca57600080fd5b506106e560048036038101906106e09190612f28565b611825565b005b3480156106f357600080fd5b5061070e6004803603810190610709919061295b565b611898565b60405161071b9190612adc565b60405180910390f35b34801561073057600080fd5b5061074b6004803603810190610746919061295b565b611942565b005b34801561075957600080fd5b50610774600480360381019061076f9190612fab565b6119c8565b6040516107819190612a28565b60405180910390f35b34801561079657600080fd5b5061079f611a5c565b6040516107ac9190612adc565b60405180910390f35b3480156107c157600080fd5b506107dc60048036038101906107d79190612dc1565b611aea565b005b3480156107ea57600080fd5b5061080560048036038101906108009190612cfb565b611be2565b005b61080f611c78565b73ffffffffffffffffffffffffffffffffffffffff1661082d6114d9565b73ffffffffffffffffffffffffffffffffffffffff1614610883576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161087a90613037565b60405180910390fd5b80600d8190555050565b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108e857506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109185750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60606002805461092e90613086565b80601f016020809104026020016040519081016040528092919081815260200182805461095a90613086565b80156109a75780601f1061097c576101008083540402835291602001916109a7565b820191906000526020600020905b81548152906001019060200180831161098a57829003601f168201915b5050505050905090565b60006109bc82611c80565b6109f2576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a3882611cdf565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610aa0576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610abf611dad565b73ffffffffffffffffffffffffffffffffffffffff1614610b2257610aeb81610ae6611dad565b6119c8565b610b21576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b610bdc611c78565b73ffffffffffffffffffffffffffffffffffffffff16610bfa6114d9565b73ffffffffffffffffffffffffffffffffffffffff1614610c50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4790613037565b60405180910390fd5b80600b9080519060200190610c6692919061286e565b5050565b6000610c74611db5565b6001546000540303905090565b600d5481565b610c92838383611dbe565b505050565b60116020528060005260406000206000915090505481565b601060009054906101000a900460ff16610cfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf590613104565b60405180910390fd5b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610d6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6390613170565b60405180910390fd5b600081118015610d7e5750600e548111155b610dbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db4906131dc565b60405180910390fd5b600d5481610dc9610c6a565b610dd3919061322b565b1115610e14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0b906132cd565b60405180910390fd5b600d54601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482610e62919061322b565b1115610ea3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9a90613339565b60405180910390fd5b80600c54610eb19190613359565b341015610ef3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eea906133ff565b60405180910390fd5b610f04610efe611c78565b82612186565b50565b601060009054906101000a900460ff1681565b610f22611c78565b73ffffffffffffffffffffffffffffffffffffffff16610f406114d9565b73ffffffffffffffffffffffffffffffffffffffff1614610f96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8d90613037565b60405180910390fd5b60026009541415610fdc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd39061346b565b60405180910390fd5b60026009819055506000610fee6114d9565b73ffffffffffffffffffffffffffffffffffffffff1647604051611011906134bc565b60006040518083038185875af1925050503d806000811461104e576040519150601f19603f3d011682016040523d82523d6000602084013e611053565b606091505b505090508061106157600080fd5b506001600981905550565b61108783838360405180602001604052806000815250611825565b505050565b611094611c78565b73ffffffffffffffffffffffffffffffffffffffff166110b26114d9565b73ffffffffffffffffffffffffffffffffffffffff1614611108576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ff90613037565b60405180910390fd5b603c601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054111561118b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111829061351d565b60405180910390fd5b600d5481611197610c6a565b6111a1919061322b565b11156111e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d9906132cd565b60405180910390fd5b80601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461122d919061322b565b601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061127a3382612186565b50565b600b805461128a90613086565b80601f01602080910402602001604051908101604052809291908181526020018280546112b690613086565b80156113035780601f106112d857610100808354040283529160200191611303565b820191906000526020600020905b8154815290600101906020018083116112e657829003601f168201915b505050505081565b600f5481565b611319611c78565b73ffffffffffffffffffffffffffffffffffffffff166113376114d9565b73ffffffffffffffffffffffffffffffffffffffff161461138d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138490613037565b60405180910390fd5b80601060006101000a81548160ff02191690831515021790555050565b60006113b582611cdf565b9050919050565b6000806113c8836121a4565b1415611400576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611459611c78565b73ffffffffffffffffffffffffffffffffffffffff166114776114d9565b73ffffffffffffffffffffffffffffffffffffffff16146114cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c490613037565b60405180910390fd5b6114d760006121ae565b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61150b611c78565b73ffffffffffffffffffffffffffffffffffffffff166115296114d9565b73ffffffffffffffffffffffffffffffffffffffff161461157f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157690613037565b60405180910390fd5b80600c8190555050565b600e5481565b60606003805461159e90613086565b80601f01602080910402602001604051908101604052809291908181526020018280546115ca90613086565b80156116175780601f106115ec57610100808354040283529160200191611617565b820191906000526020600020905b8154815290600101906020018083116115fa57829003601f168201915b5050505050905090565b600c5481565b61162f611dad565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611694576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006116a1611dad565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661174e611dad565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516117939190612a28565b60405180910390a35050565b6117a7611c78565b73ffffffffffffffffffffffffffffffffffffffff166117c56114d9565b73ffffffffffffffffffffffffffffffffffffffff161461181b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181290613037565b60405180910390fd5b80600e8190555050565b611830848484611dbe565b60008373ffffffffffffffffffffffffffffffffffffffff163b146118925761185b84848484612274565b611891576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b60606118a382611c80565b6118e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d9906135af565b60405180910390fd5b60006118ec6123d4565b9050600081511161190c576040518060200160405280600081525061193a565b8061191684612466565b600b60405160200161192a9392919061369f565b6040516020818303038152906040525b915050919050565b61194a611c78565b73ffffffffffffffffffffffffffffffffffffffff166119686114d9565b73ffffffffffffffffffffffffffffffffffffffff16146119be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b590613037565b60405180910390fd5b80600f8190555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600a8054611a6990613086565b80601f0160208091040260200160405190810160405280929190818152602001828054611a9590613086565b8015611ae25780601f10611ab757610100808354040283529160200191611ae2565b820191906000526020600020905b815481529060010190602001808311611ac557829003601f168201915b505050505081565b611af2611c78565b73ffffffffffffffffffffffffffffffffffffffff16611b106114d9565b73ffffffffffffffffffffffffffffffffffffffff1614611b66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5d90613037565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611bd6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bcd90613742565b60405180910390fd5b611bdf816121ae565b50565b611bea611c78565b73ffffffffffffffffffffffffffffffffffffffff16611c086114d9565b73ffffffffffffffffffffffffffffffffffffffff1614611c5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5590613037565b60405180910390fd5b80600a9080519060200190611c7492919061286e565b5050565b600033905090565b600081611c8b611db5565b11158015611c9a575060005482105b8015611cd8575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b60008082905080611cee611db5565b11611d7657600054811015611d755760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415611d73575b6000811415611d69576004600083600190039350838152602001908152602001600020549050611d3e565b8092505050611da8565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600033905090565b60006001905090565b6000611dc982611cdf565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611e30576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006006600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008573ffffffffffffffffffffffffffffffffffffffff16611e89611dad565b73ffffffffffffffffffffffffffffffffffffffff161480611eb85750611eb786611eb2611dad565b6119c8565b5b80611ef55750611ec6611dad565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b905080611f2e576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611f39866121a4565b1415611f71576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611f7e86868660016125c7565b6000611f89836121a4565b14611fc5576006600085815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b61208c876121a4565b1717600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415612116576000600185019050600060046000838152602001908152602001600020541415612114576000548114612113578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461217e86868660016125cd565b505050505050565b6121a08282604051806020016040528060008152506125d3565b5050565b6000819050919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261229a611dad565b8786866040518563ffffffff1660e01b81526004016122bc94939291906137b7565b602060405180830381600087803b1580156122d657600080fd5b505af192505050801561230757506040513d601f19601f820116820180604052508101906123049190613818565b60015b612381573d8060008114612337576040519150601f19603f3d011682016040523d82523d6000602084013e61233c565b606091505b50600081511415612379576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600a80546123e390613086565b80601f016020809104026020016040519081016040528092919081815260200182805461240f90613086565b801561245c5780601f106124315761010080835404028352916020019161245c565b820191906000526020600020905b81548152906001019060200180831161243f57829003601f168201915b5050505050905090565b606060008214156124ae576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506125c2565b600082905060005b600082146124e05780806124c990613845565b915050600a826124d991906138bd565b91506124b6565b60008167ffffffffffffffff8111156124fc576124fb612bd0565b5b6040519080825280601f01601f19166020018201604052801561252e5781602001600182028036833780820191505090505b5090505b600085146125bb5760018261254791906138ee565b9150600a856125569190613922565b6030612562919061322b565b60f81b81838151811061257857612577613953565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856125b491906138bd565b9450612532565b8093505050505b919050565b50505050565b50505050565b60008054905060006125e4856121a4565b141561261c576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000831415612657576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61266460008583866125c7565b600160406001901b178302600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e16126c960018514612864565b901b60a042901b6126d9866121a4565b1717600460008381526020019081526020016000208190555060008190506000848201905060008673ffffffffffffffffffffffffffffffffffffffff163b146127dd575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461278d6000878480600101955087612274565b6127c3576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80821061271e5782600054146127d857600080fd5b612848565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082106127de575b81600081905550505061285e60008583866125cd565b50505050565b6000819050919050565b82805461287a90613086565b90600052602060002090601f01602090048101928261289c57600085556128e3565b82601f106128b557805160ff19168380011785556128e3565b828001600101855582156128e3579182015b828111156128e25782518255916020019190600101906128c7565b5b5090506128f091906128f4565b5090565b5b8082111561290d5760008160009055506001016128f5565b5090565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b61293881612925565b811461294357600080fd5b50565b6000813590506129558161292f565b92915050565b6000602082840312156129715761297061291b565b5b600061297f84828501612946565b91505092915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6129bd81612988565b81146129c857600080fd5b50565b6000813590506129da816129b4565b92915050565b6000602082840312156129f6576129f561291b565b5b6000612a04848285016129cb565b91505092915050565b60008115159050919050565b612a2281612a0d565b82525050565b6000602082019050612a3d6000830184612a19565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612a7d578082015181840152602081019050612a62565b83811115612a8c576000848401525b50505050565b6000601f19601f8301169050919050565b6000612aae82612a43565b612ab88185612a4e565b9350612ac8818560208601612a5f565b612ad181612a92565b840191505092915050565b60006020820190508181036000830152612af68184612aa3565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612b2982612afe565b9050919050565b612b3981612b1e565b82525050565b6000602082019050612b546000830184612b30565b92915050565b612b6381612b1e565b8114612b6e57600080fd5b50565b600081359050612b8081612b5a565b92915050565b60008060408385031215612b9d57612b9c61291b565b5b6000612bab85828601612b71565b9250506020612bbc85828601612946565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612c0882612a92565b810181811067ffffffffffffffff82111715612c2757612c26612bd0565b5b80604052505050565b6000612c3a612911565b9050612c468282612bff565b919050565b600067ffffffffffffffff821115612c6657612c65612bd0565b5b612c6f82612a92565b9050602081019050919050565b82818337600083830152505050565b6000612c9e612c9984612c4b565b612c30565b905082815260208101848484011115612cba57612cb9612bcb565b5b612cc5848285612c7c565b509392505050565b600082601f830112612ce257612ce1612bc6565b5b8135612cf2848260208601612c8b565b91505092915050565b600060208284031215612d1157612d1061291b565b5b600082013567ffffffffffffffff811115612d2f57612d2e612920565b5b612d3b84828501612ccd565b91505092915050565b612d4d81612925565b82525050565b6000602082019050612d686000830184612d44565b92915050565b600080600060608486031215612d8757612d8661291b565b5b6000612d9586828701612b71565b9350506020612da686828701612b71565b9250506040612db786828701612946565b9150509250925092565b600060208284031215612dd757612dd661291b565b5b6000612de584828501612b71565b91505092915050565b612df781612a0d565b8114612e0257600080fd5b50565b600081359050612e1481612dee565b92915050565b600060208284031215612e3057612e2f61291b565b5b6000612e3e84828501612e05565b91505092915050565b60008060408385031215612e5e57612e5d61291b565b5b6000612e6c85828601612b71565b9250506020612e7d85828601612e05565b9150509250929050565b600067ffffffffffffffff821115612ea257612ea1612bd0565b5b612eab82612a92565b9050602081019050919050565b6000612ecb612ec684612e87565b612c30565b905082815260208101848484011115612ee757612ee6612bcb565b5b612ef2848285612c7c565b509392505050565b600082601f830112612f0f57612f0e612bc6565b5b8135612f1f848260208601612eb8565b91505092915050565b60008060008060808587031215612f4257612f4161291b565b5b6000612f5087828801612b71565b9450506020612f6187828801612b71565b9350506040612f7287828801612946565b925050606085013567ffffffffffffffff811115612f9357612f92612920565b5b612f9f87828801612efa565b91505092959194509250565b60008060408385031215612fc257612fc161291b565b5b6000612fd085828601612b71565b9250506020612fe185828601612b71565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613021602083612a4e565b915061302c82612feb565b602082019050919050565b6000602082019050818103600083015261305081613014565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061309e57607f821691505b602082108114156130b2576130b1613057565b5b50919050565b7f5075626c69634d696e7420697320706175736564210000000000000000000000600082015250565b60006130ee601583612a4e565b91506130f9826130b8565b602082019050919050565b6000602082019050818103600083015261311d816130e1565b9050919050565b7f6e6f20626f747300000000000000000000000000000000000000000000000000600082015250565b600061315a600783612a4e565b915061316582613124565b602082019050919050565b600060208201905081810360008301526131898161314d565b9050919050565b7f496e76616c6964206d696e7420616d6f756e7421000000000000000000000000600082015250565b60006131c6601483612a4e565b91506131d182613190565b602082019050919050565b600060208201905081810360008301526131f5816131b9565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061323682612925565b915061324183612925565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613276576132756131fc565b5b828201905092915050565b7f4d617820737570706c7920657863656564656421000000000000000000000000600082015250565b60006132b7601483612a4e565b91506132c282613281565b602082019050919050565b600060208201905081810360008301526132e6816132aa565b9050919050565b7f4d6178206d696e7473207065722077616c6c6574206578636565646564000000600082015250565b6000613323601d83612a4e565b915061332e826132ed565b602082019050919050565b6000602082019050818103600083015261335281613316565b9050919050565b600061336482612925565b915061336f83612925565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156133a8576133a76131fc565b5b828202905092915050565b7f496e73756666696369656e742066756e64732100000000000000000000000000600082015250565b60006133e9601383612a4e565b91506133f4826133b3565b602082019050919050565b60006020820190508181036000830152613418816133dc565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000613455601f83612a4e565b91506134608261341f565b602082019050919050565b6000602082019050818103600083015261348481613448565b9050919050565b600081905092915050565b50565b60006134a660008361348b565b91506134b182613496565b600082019050919050565b60006134c782613499565b9150819050919050565b7f4d6178206d696e7473206c696d69740000000000000000000000000000000000600082015250565b6000613507600f83612a4e565b9150613512826134d1565b602082019050919050565b60006020820190508181036000830152613536816134fa565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000613599602f83612a4e565b91506135a48261353d565b604082019050919050565b600060208201905081810360008301526135c88161358c565b9050919050565b600081905092915050565b60006135e582612a43565b6135ef81856135cf565b93506135ff818560208601612a5f565b80840191505092915050565b60008190508160005260206000209050919050565b6000815461362d81613086565b61363781866135cf565b94506001821660008114613652576001811461366357613696565b60ff19831686528186019350613696565b61366c8561360b565b60005b8381101561368e5781548189015260018201915060208101905061366f565b838801955050505b50505092915050565b60006136ab82866135da565b91506136b782856135da565b91506136c38284613620565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061372c602683612a4e565b9150613737826136d0565b604082019050919050565b6000602082019050818103600083015261375b8161371f565b9050919050565b600081519050919050565b600082825260208201905092915050565b600061378982613762565b613793818561376d565b93506137a3818560208601612a5f565b6137ac81612a92565b840191505092915050565b60006080820190506137cc6000830187612b30565b6137d96020830186612b30565b6137e66040830185612d44565b81810360608301526137f8818461377e565b905095945050505050565b600081519050613812816129b4565b92915050565b60006020828403121561382e5761382d61291b565b5b600061383c84828501613803565b91505092915050565b600061385082612925565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613883576138826131fc565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006138c882612925565b91506138d383612925565b9250826138e3576138e261388e565b5b828204905092915050565b60006138f982612925565b915061390483612925565b925082821015613917576139166131fc565b5b828203905092915050565b600061392d82612925565b915061393883612925565b9250826139485761394761388e565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea264697066735822122041c1d791b2d1ca8382bef68613ad1e930d1c9dfc0c19ea004562f6643b341ed964736f6c6343000809003300000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d54746f517370455463597037634d4a73574863335a765442426f426b6a4558585a50574746364658756f55612f00000000000000000000
Deployed Bytecode
0x6080604052600436106102035760003560e01c80635aca1bb611610118578063a22cb465116100a0578063d9f0a6711161006f578063d9f0a67114610724578063e985e9c51461074d578063eac989f81461078a578063f2fde38b146107b5578063f6484980146107de57610203565b8063a22cb4651461066c578063b071401b14610695578063b88d4fde146106be578063c87b56dd146106e757610203565b80638da5cb5b116100e75780638da5cb5b1461059757806391b7f5ed146105c257806394354fd0146105eb57806395d89b4114610616578063a035b1fe1461064157610203565b80635aca1bb6146104dd5780636352211e1461050657806370a0823114610543578063715018a61461058057610203565b806323b872dd1161019b5780633ccfd60b1161016a5780633ccfd60b1461042b57806342842e0e146104425780635458c1241461046b5780635503a0e8146104875780635a0b8b23146104b257610203565b806323b872dd1461037e578063249f851b146103a75780632db11544146103e457806333bc1c5c1461040057610203565b8063095ea7b3116101d7578063095ea7b3146102d657806316ba10e0146102ff57806318160ddd1461032857806319d1997a1461035357610203565b806275770a1461020857806301ffc9a71461023157806306fdde031461026e578063081812fc14610299575b600080fd5b34801561021457600080fd5b5061022f600480360381019061022a919061295b565b610807565b005b34801561023d57600080fd5b50610258600480360381019061025391906129e0565b61088d565b6040516102659190612a28565b60405180910390f35b34801561027a57600080fd5b5061028361091f565b6040516102909190612adc565b60405180910390f35b3480156102a557600080fd5b506102c060048036038101906102bb919061295b565b6109b1565b6040516102cd9190612b3f565b60405180910390f35b3480156102e257600080fd5b506102fd60048036038101906102f89190612b86565b610a2d565b005b34801561030b57600080fd5b5061032660048036038101906103219190612cfb565b610bd4565b005b34801561033457600080fd5b5061033d610c6a565b60405161034a9190612d53565b60405180910390f35b34801561035f57600080fd5b50610368610c81565b6040516103759190612d53565b60405180910390f35b34801561038a57600080fd5b506103a560048036038101906103a09190612d6e565b610c87565b005b3480156103b357600080fd5b506103ce60048036038101906103c99190612dc1565b610c97565b6040516103db9190612d53565b60405180910390f35b6103fe60048036038101906103f9919061295b565b610caf565b005b34801561040c57600080fd5b50610415610f07565b6040516104229190612a28565b60405180910390f35b34801561043757600080fd5b50610440610f1a565b005b34801561044e57600080fd5b5061046960048036038101906104649190612d6e565b61106c565b005b6104856004803603810190610480919061295b565b61108c565b005b34801561049357600080fd5b5061049c61127d565b6040516104a99190612adc565b60405180910390f35b3480156104be57600080fd5b506104c761130b565b6040516104d49190612d53565b60405180910390f35b3480156104e957600080fd5b5061050460048036038101906104ff9190612e1a565b611311565b005b34801561051257600080fd5b5061052d6004803603810190610528919061295b565b6113aa565b60405161053a9190612b3f565b60405180910390f35b34801561054f57600080fd5b5061056a60048036038101906105659190612dc1565b6113bc565b6040516105779190612d53565b60405180910390f35b34801561058c57600080fd5b50610595611451565b005b3480156105a357600080fd5b506105ac6114d9565b6040516105b99190612b3f565b60405180910390f35b3480156105ce57600080fd5b506105e960048036038101906105e4919061295b565b611503565b005b3480156105f757600080fd5b50610600611589565b60405161060d9190612d53565b60405180910390f35b34801561062257600080fd5b5061062b61158f565b6040516106389190612adc565b60405180910390f35b34801561064d57600080fd5b50610656611621565b6040516106639190612d53565b60405180910390f35b34801561067857600080fd5b50610693600480360381019061068e9190612e47565b611627565b005b3480156106a157600080fd5b506106bc60048036038101906106b7919061295b565b61179f565b005b3480156106ca57600080fd5b506106e560048036038101906106e09190612f28565b611825565b005b3480156106f357600080fd5b5061070e6004803603810190610709919061295b565b611898565b60405161071b9190612adc565b60405180910390f35b34801561073057600080fd5b5061074b6004803603810190610746919061295b565b611942565b005b34801561075957600080fd5b50610774600480360381019061076f9190612fab565b6119c8565b6040516107819190612a28565b60405180910390f35b34801561079657600080fd5b5061079f611a5c565b6040516107ac9190612adc565b60405180910390f35b3480156107c157600080fd5b506107dc60048036038101906107d79190612dc1565b611aea565b005b3480156107ea57600080fd5b5061080560048036038101906108009190612cfb565b611be2565b005b61080f611c78565b73ffffffffffffffffffffffffffffffffffffffff1661082d6114d9565b73ffffffffffffffffffffffffffffffffffffffff1614610883576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161087a90613037565b60405180910390fd5b80600d8190555050565b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108e857506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109185750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60606002805461092e90613086565b80601f016020809104026020016040519081016040528092919081815260200182805461095a90613086565b80156109a75780601f1061097c576101008083540402835291602001916109a7565b820191906000526020600020905b81548152906001019060200180831161098a57829003601f168201915b5050505050905090565b60006109bc82611c80565b6109f2576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a3882611cdf565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610aa0576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610abf611dad565b73ffffffffffffffffffffffffffffffffffffffff1614610b2257610aeb81610ae6611dad565b6119c8565b610b21576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b610bdc611c78565b73ffffffffffffffffffffffffffffffffffffffff16610bfa6114d9565b73ffffffffffffffffffffffffffffffffffffffff1614610c50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4790613037565b60405180910390fd5b80600b9080519060200190610c6692919061286e565b5050565b6000610c74611db5565b6001546000540303905090565b600d5481565b610c92838383611dbe565b505050565b60116020528060005260406000206000915090505481565b601060009054906101000a900460ff16610cfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf590613104565b60405180910390fd5b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610d6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6390613170565b60405180910390fd5b600081118015610d7e5750600e548111155b610dbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db4906131dc565b60405180910390fd5b600d5481610dc9610c6a565b610dd3919061322b565b1115610e14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0b906132cd565b60405180910390fd5b600d54601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482610e62919061322b565b1115610ea3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9a90613339565b60405180910390fd5b80600c54610eb19190613359565b341015610ef3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eea906133ff565b60405180910390fd5b610f04610efe611c78565b82612186565b50565b601060009054906101000a900460ff1681565b610f22611c78565b73ffffffffffffffffffffffffffffffffffffffff16610f406114d9565b73ffffffffffffffffffffffffffffffffffffffff1614610f96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8d90613037565b60405180910390fd5b60026009541415610fdc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd39061346b565b60405180910390fd5b60026009819055506000610fee6114d9565b73ffffffffffffffffffffffffffffffffffffffff1647604051611011906134bc565b60006040518083038185875af1925050503d806000811461104e576040519150601f19603f3d011682016040523d82523d6000602084013e611053565b606091505b505090508061106157600080fd5b506001600981905550565b61108783838360405180602001604052806000815250611825565b505050565b611094611c78565b73ffffffffffffffffffffffffffffffffffffffff166110b26114d9565b73ffffffffffffffffffffffffffffffffffffffff1614611108576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ff90613037565b60405180910390fd5b603c601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054111561118b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111829061351d565b60405180910390fd5b600d5481611197610c6a565b6111a1919061322b565b11156111e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d9906132cd565b60405180910390fd5b80601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461122d919061322b565b601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061127a3382612186565b50565b600b805461128a90613086565b80601f01602080910402602001604051908101604052809291908181526020018280546112b690613086565b80156113035780601f106112d857610100808354040283529160200191611303565b820191906000526020600020905b8154815290600101906020018083116112e657829003601f168201915b505050505081565b600f5481565b611319611c78565b73ffffffffffffffffffffffffffffffffffffffff166113376114d9565b73ffffffffffffffffffffffffffffffffffffffff161461138d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138490613037565b60405180910390fd5b80601060006101000a81548160ff02191690831515021790555050565b60006113b582611cdf565b9050919050565b6000806113c8836121a4565b1415611400576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611459611c78565b73ffffffffffffffffffffffffffffffffffffffff166114776114d9565b73ffffffffffffffffffffffffffffffffffffffff16146114cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c490613037565b60405180910390fd5b6114d760006121ae565b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61150b611c78565b73ffffffffffffffffffffffffffffffffffffffff166115296114d9565b73ffffffffffffffffffffffffffffffffffffffff161461157f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157690613037565b60405180910390fd5b80600c8190555050565b600e5481565b60606003805461159e90613086565b80601f01602080910402602001604051908101604052809291908181526020018280546115ca90613086565b80156116175780601f106115ec57610100808354040283529160200191611617565b820191906000526020600020905b8154815290600101906020018083116115fa57829003601f168201915b5050505050905090565b600c5481565b61162f611dad565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611694576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006116a1611dad565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661174e611dad565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516117939190612a28565b60405180910390a35050565b6117a7611c78565b73ffffffffffffffffffffffffffffffffffffffff166117c56114d9565b73ffffffffffffffffffffffffffffffffffffffff161461181b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181290613037565b60405180910390fd5b80600e8190555050565b611830848484611dbe565b60008373ffffffffffffffffffffffffffffffffffffffff163b146118925761185b84848484612274565b611891576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b60606118a382611c80565b6118e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d9906135af565b60405180910390fd5b60006118ec6123d4565b9050600081511161190c576040518060200160405280600081525061193a565b8061191684612466565b600b60405160200161192a9392919061369f565b6040516020818303038152906040525b915050919050565b61194a611c78565b73ffffffffffffffffffffffffffffffffffffffff166119686114d9565b73ffffffffffffffffffffffffffffffffffffffff16146119be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b590613037565b60405180910390fd5b80600f8190555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600a8054611a6990613086565b80601f0160208091040260200160405190810160405280929190818152602001828054611a9590613086565b8015611ae25780601f10611ab757610100808354040283529160200191611ae2565b820191906000526020600020905b815481529060010190602001808311611ac557829003601f168201915b505050505081565b611af2611c78565b73ffffffffffffffffffffffffffffffffffffffff16611b106114d9565b73ffffffffffffffffffffffffffffffffffffffff1614611b66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5d90613037565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611bd6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bcd90613742565b60405180910390fd5b611bdf816121ae565b50565b611bea611c78565b73ffffffffffffffffffffffffffffffffffffffff16611c086114d9565b73ffffffffffffffffffffffffffffffffffffffff1614611c5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5590613037565b60405180910390fd5b80600a9080519060200190611c7492919061286e565b5050565b600033905090565b600081611c8b611db5565b11158015611c9a575060005482105b8015611cd8575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b60008082905080611cee611db5565b11611d7657600054811015611d755760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415611d73575b6000811415611d69576004600083600190039350838152602001908152602001600020549050611d3e565b8092505050611da8565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600033905090565b60006001905090565b6000611dc982611cdf565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611e30576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006006600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008573ffffffffffffffffffffffffffffffffffffffff16611e89611dad565b73ffffffffffffffffffffffffffffffffffffffff161480611eb85750611eb786611eb2611dad565b6119c8565b5b80611ef55750611ec6611dad565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b905080611f2e576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611f39866121a4565b1415611f71576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611f7e86868660016125c7565b6000611f89836121a4565b14611fc5576006600085815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b61208c876121a4565b1717600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415612116576000600185019050600060046000838152602001908152602001600020541415612114576000548114612113578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461217e86868660016125cd565b505050505050565b6121a08282604051806020016040528060008152506125d3565b5050565b6000819050919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261229a611dad565b8786866040518563ffffffff1660e01b81526004016122bc94939291906137b7565b602060405180830381600087803b1580156122d657600080fd5b505af192505050801561230757506040513d601f19601f820116820180604052508101906123049190613818565b60015b612381573d8060008114612337576040519150601f19603f3d011682016040523d82523d6000602084013e61233c565b606091505b50600081511415612379576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600a80546123e390613086565b80601f016020809104026020016040519081016040528092919081815260200182805461240f90613086565b801561245c5780601f106124315761010080835404028352916020019161245c565b820191906000526020600020905b81548152906001019060200180831161243f57829003601f168201915b5050505050905090565b606060008214156124ae576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506125c2565b600082905060005b600082146124e05780806124c990613845565b915050600a826124d991906138bd565b91506124b6565b60008167ffffffffffffffff8111156124fc576124fb612bd0565b5b6040519080825280601f01601f19166020018201604052801561252e5781602001600182028036833780820191505090505b5090505b600085146125bb5760018261254791906138ee565b9150600a856125569190613922565b6030612562919061322b565b60f81b81838151811061257857612577613953565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856125b491906138bd565b9450612532565b8093505050505b919050565b50505050565b50505050565b60008054905060006125e4856121a4565b141561261c576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000831415612657576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61266460008583866125c7565b600160406001901b178302600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e16126c960018514612864565b901b60a042901b6126d9866121a4565b1717600460008381526020019081526020016000208190555060008190506000848201905060008673ffffffffffffffffffffffffffffffffffffffff163b146127dd575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461278d6000878480600101955087612274565b6127c3576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80821061271e5782600054146127d857600080fd5b612848565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082106127de575b81600081905550505061285e60008583866125cd565b50505050565b6000819050919050565b82805461287a90613086565b90600052602060002090601f01602090048101928261289c57600085556128e3565b82601f106128b557805160ff19168380011785556128e3565b828001600101855582156128e3579182015b828111156128e25782518255916020019190600101906128c7565b5b5090506128f091906128f4565b5090565b5b8082111561290d5760008160009055506001016128f5565b5090565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b61293881612925565b811461294357600080fd5b50565b6000813590506129558161292f565b92915050565b6000602082840312156129715761297061291b565b5b600061297f84828501612946565b91505092915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6129bd81612988565b81146129c857600080fd5b50565b6000813590506129da816129b4565b92915050565b6000602082840312156129f6576129f561291b565b5b6000612a04848285016129cb565b91505092915050565b60008115159050919050565b612a2281612a0d565b82525050565b6000602082019050612a3d6000830184612a19565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612a7d578082015181840152602081019050612a62565b83811115612a8c576000848401525b50505050565b6000601f19601f8301169050919050565b6000612aae82612a43565b612ab88185612a4e565b9350612ac8818560208601612a5f565b612ad181612a92565b840191505092915050565b60006020820190508181036000830152612af68184612aa3565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612b2982612afe565b9050919050565b612b3981612b1e565b82525050565b6000602082019050612b546000830184612b30565b92915050565b612b6381612b1e565b8114612b6e57600080fd5b50565b600081359050612b8081612b5a565b92915050565b60008060408385031215612b9d57612b9c61291b565b5b6000612bab85828601612b71565b9250506020612bbc85828601612946565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612c0882612a92565b810181811067ffffffffffffffff82111715612c2757612c26612bd0565b5b80604052505050565b6000612c3a612911565b9050612c468282612bff565b919050565b600067ffffffffffffffff821115612c6657612c65612bd0565b5b612c6f82612a92565b9050602081019050919050565b82818337600083830152505050565b6000612c9e612c9984612c4b565b612c30565b905082815260208101848484011115612cba57612cb9612bcb565b5b612cc5848285612c7c565b509392505050565b600082601f830112612ce257612ce1612bc6565b5b8135612cf2848260208601612c8b565b91505092915050565b600060208284031215612d1157612d1061291b565b5b600082013567ffffffffffffffff811115612d2f57612d2e612920565b5b612d3b84828501612ccd565b91505092915050565b612d4d81612925565b82525050565b6000602082019050612d686000830184612d44565b92915050565b600080600060608486031215612d8757612d8661291b565b5b6000612d9586828701612b71565b9350506020612da686828701612b71565b9250506040612db786828701612946565b9150509250925092565b600060208284031215612dd757612dd661291b565b5b6000612de584828501612b71565b91505092915050565b612df781612a0d565b8114612e0257600080fd5b50565b600081359050612e1481612dee565b92915050565b600060208284031215612e3057612e2f61291b565b5b6000612e3e84828501612e05565b91505092915050565b60008060408385031215612e5e57612e5d61291b565b5b6000612e6c85828601612b71565b9250506020612e7d85828601612e05565b9150509250929050565b600067ffffffffffffffff821115612ea257612ea1612bd0565b5b612eab82612a92565b9050602081019050919050565b6000612ecb612ec684612e87565b612c30565b905082815260208101848484011115612ee757612ee6612bcb565b5b612ef2848285612c7c565b509392505050565b600082601f830112612f0f57612f0e612bc6565b5b8135612f1f848260208601612eb8565b91505092915050565b60008060008060808587031215612f4257612f4161291b565b5b6000612f5087828801612b71565b9450506020612f6187828801612b71565b9350506040612f7287828801612946565b925050606085013567ffffffffffffffff811115612f9357612f92612920565b5b612f9f87828801612efa565b91505092959194509250565b60008060408385031215612fc257612fc161291b565b5b6000612fd085828601612b71565b9250506020612fe185828601612b71565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613021602083612a4e565b915061302c82612feb565b602082019050919050565b6000602082019050818103600083015261305081613014565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061309e57607f821691505b602082108114156130b2576130b1613057565b5b50919050565b7f5075626c69634d696e7420697320706175736564210000000000000000000000600082015250565b60006130ee601583612a4e565b91506130f9826130b8565b602082019050919050565b6000602082019050818103600083015261311d816130e1565b9050919050565b7f6e6f20626f747300000000000000000000000000000000000000000000000000600082015250565b600061315a600783612a4e565b915061316582613124565b602082019050919050565b600060208201905081810360008301526131898161314d565b9050919050565b7f496e76616c6964206d696e7420616d6f756e7421000000000000000000000000600082015250565b60006131c6601483612a4e565b91506131d182613190565b602082019050919050565b600060208201905081810360008301526131f5816131b9565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061323682612925565b915061324183612925565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613276576132756131fc565b5b828201905092915050565b7f4d617820737570706c7920657863656564656421000000000000000000000000600082015250565b60006132b7601483612a4e565b91506132c282613281565b602082019050919050565b600060208201905081810360008301526132e6816132aa565b9050919050565b7f4d6178206d696e7473207065722077616c6c6574206578636565646564000000600082015250565b6000613323601d83612a4e565b915061332e826132ed565b602082019050919050565b6000602082019050818103600083015261335281613316565b9050919050565b600061336482612925565b915061336f83612925565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156133a8576133a76131fc565b5b828202905092915050565b7f496e73756666696369656e742066756e64732100000000000000000000000000600082015250565b60006133e9601383612a4e565b91506133f4826133b3565b602082019050919050565b60006020820190508181036000830152613418816133dc565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000613455601f83612a4e565b91506134608261341f565b602082019050919050565b6000602082019050818103600083015261348481613448565b9050919050565b600081905092915050565b50565b60006134a660008361348b565b91506134b182613496565b600082019050919050565b60006134c782613499565b9150819050919050565b7f4d6178206d696e7473206c696d69740000000000000000000000000000000000600082015250565b6000613507600f83612a4e565b9150613512826134d1565b602082019050919050565b60006020820190508181036000830152613536816134fa565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000613599602f83612a4e565b91506135a48261353d565b604082019050919050565b600060208201905081810360008301526135c88161358c565b9050919050565b600081905092915050565b60006135e582612a43565b6135ef81856135cf565b93506135ff818560208601612a5f565b80840191505092915050565b60008190508160005260206000209050919050565b6000815461362d81613086565b61363781866135cf565b94506001821660008114613652576001811461366357613696565b60ff19831686528186019350613696565b61366c8561360b565b60005b8381101561368e5781548189015260018201915060208101905061366f565b838801955050505b50505092915050565b60006136ab82866135da565b91506136b782856135da565b91506136c38284613620565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061372c602683612a4e565b9150613737826136d0565b604082019050919050565b6000602082019050818103600083015261375b8161371f565b9050919050565b600081519050919050565b600082825260208201905092915050565b600061378982613762565b613793818561376d565b93506137a3818560208601612a5f565b6137ac81612a92565b840191505092915050565b60006080820190506137cc6000830187612b30565b6137d96020830186612b30565b6137e66040830185612d44565b81810360608301526137f8818461377e565b905095945050505050565b600081519050613812816129b4565b92915050565b60006020828403121561382e5761382d61291b565b5b600061383c84828501613803565b91505092915050565b600061385082612925565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613883576138826131fc565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006138c882612925565b91506138d383612925565b9250826138e3576138e261388e565b5b828204905092915050565b60006138f982612925565b915061390483612925565b925082821015613917576139166131fc565b5b828203905092915050565b600061392d82612925565b915061393883612925565b9250826139485761394761388e565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea264697066735822122041c1d791b2d1ca8382bef68613ad1e930d1c9dfc0c19ea004562f6643b341ed964736f6c63430008090033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d54746f517370455463597037634d4a73574863335a765442426f426b6a4558585a50574746364658756f55612f00000000000000000000
-----Decoded View---------------
Arg [0] : _uri (string): ipfs://QmTtoQspETcYp7cMJsWHc3ZvTBBoBkjEXXZPWGF6FXuoUa/
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000036
Arg [2] : 697066733a2f2f516d54746f517370455463597037634d4a73574863335a7654
Arg [3] : 42426f426b6a4558585a50574746364658756f55612f00000000000000000000
Deployed Bytecode Sourcemap
47086:3526:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49038:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21453:615;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26476:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28544:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28004:474;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48416:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20507:315;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47291:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29430:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47456:52;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47617:701;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47417:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49579:160;;;;;;;;;;;;;:::i;:::-;;29671:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49154:417;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47212:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47372:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48530:101;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26265:144;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22132:234;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4730:103;;;;;;;;;;;;;:::i;:::-;;4079:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48946:84;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47328:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26645:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47254:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28820:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48639:159;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29927:396;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49856:641;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48806:132;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29199:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47188:17;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4988:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48326:82;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49038:108;4310:12;:10;:12::i;:::-;4299:23;;:7;:5;:7::i;:::-;:23;;;4291:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49126:12:::1;49112:11;:26;;;;49038:108:::0;:::o;21453:615::-;21538:4;21853:10;21838:25;;:11;:25;;;;:102;;;;21930:10;21915:25;;:11;:25;;;;21838:102;:179;;;;22007:10;21992:25;;:11;:25;;;;21838:179;21818:199;;21453:615;;;:::o;26476:100::-;26530:13;26563:5;26556:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26476:100;:::o;28544:204::-;28612:7;28637:16;28645:7;28637;:16::i;:::-;28632:64;;28662:34;;;;;;;;;;;;;;28632:64;28716:15;:24;28732:7;28716:24;;;;;;;;;;;;;;;;;;;;;28709:31;;28544:204;;;:::o;28004:474::-;28077:13;28109:27;28128:7;28109:18;:27::i;:::-;28077:61;;28159:5;28153:11;;:2;:11;;;28149:48;;;28173:24;;;;;;;;;;;;;;28149:48;28237:5;28214:28;;:19;:17;:19::i;:::-;:28;;;28210:175;;28262:44;28279:5;28286:19;:17;:19::i;:::-;28262:16;:44::i;:::-;28257:128;;28334:35;;;;;;;;;;;;;;28257:128;28210:175;28424:2;28397:15;:24;28413:7;28397:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;28462:7;28458:2;28442:28;;28451:5;28442:28;;;;;;;;;;;;28066:412;28004:474;;:::o;48416:106::-;4310:12;:10;:12::i;:::-;4299:23;;:7;:5;:7::i;:::-;:23;;;4291:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48504:10:::1;48492:9;:22;;;;;;;;;;;;:::i;:::-;;48416:106:::0;:::o;20507:315::-;20560:7;20788:15;:13;:15::i;:::-;20773:12;;20757:13;;:28;:46;20750:53;;20507:315;:::o;47291:30::-;;;;:::o;29430:170::-;29564:28;29574:4;29580:2;29584:7;29564:9;:28::i;:::-;29430:170;;;:::o;47456:52::-;;;;;;;;;;;;;;;;;:::o;47617:701::-;47692:10;;;;;;;;;;;47684:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;47761:9;47747:23;;:10;:23;;;47739:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;47829:1;47815:11;:15;:52;;;;;47849:18;;47834:11;:33;;47815:52;47793:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;47979:11;;47964;47948:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:42;;47926:112;;;;;;;;;;;;:::i;:::-;;;;;;;;;48118:11;;48085:17;:29;48103:10;48085:29;;;;;;;;;;;;;;;;48071:11;:43;;;;:::i;:::-;:58;;48049:137;;;;;;;;;;;;:::i;:::-;;;;;;;;;48226:11;48218:5;;:19;;;;:::i;:::-;48205:9;:32;;48197:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;48274:36;48284:12;:10;:12::i;:::-;48298:11;48274:9;:36::i;:::-;47617:701;:::o;47417:30::-;;;;;;;;;;;;;:::o;49579:160::-;4310:12;:10;:12::i;:::-;4299:23;;:7;:5;:7::i;:::-;:23;;;4291:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;7359:1:::1;7957:7;;:19;;7949:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;7359:1;8090:7;:18;;;;49641:7:::2;49662;:5;:7::i;:::-;49654:21;;49683;49654:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49640:69;;;49728:2;49720:11;;;::::0;::::2;;49629:110;7315:1:::1;8269:7;:22;;;;49579:160::o:0;29671:185::-;29809:39;29826:4;29832:2;29836:7;29809:39;;;;;;;;;;;;:16;:39::i;:::-;29671:185;;;:::o;49154:417::-;4310:12;:10;:12::i;:::-;4299:23;;:7;:5;:7::i;:::-;:23;;;4291:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49270:2:::1;49237:17;:29;49255:10;49237:29;;;;;;;;;;;;;;;;:35;;49229:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;49353:11;;49341:8;49325:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:39;;49303:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;49513:8;49468:17;:29;49486:10;49468:29;;;;;;;;;;;;;;;;:53;;;;:::i;:::-;49423:17;:29;49441:10;49423:29;;;;;;;;;;;;;;;:98;;;;49532:31;49542:10;49554:8;49532:9;:31::i;:::-;49154:417:::0;:::o;47212:33::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;47372:36::-;;;;:::o;48530:101::-;4310:12;:10;:12::i;:::-;4299:23;;:7;:5;:7::i;:::-;:23;;;4291:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48612:11:::1;48599:10;;:24;;;;;;;;;;;;;;;;;;48530:101:::0;:::o;26265:144::-;26329:7;26372:27;26391:7;26372:18;:27::i;:::-;26349:52;;26265:144;;;:::o;22132:234::-;22196:7;22248:1;22220:24;22238:5;22220:17;:24::i;:::-;:29;22216:70;;;22258:28;;;;;;;;;;;;;;22216:70;17477:13;22304:18;:25;22323:5;22304:25;;;;;;;;;;;;;;;;:54;22297:61;;22132:234;;;:::o;4730:103::-;4310:12;:10;:12::i;:::-;4299:23;;:7;:5;:7::i;:::-;:23;;;4291:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4795:30:::1;4822:1;4795:18;:30::i;:::-;4730:103::o:0;4079:87::-;4125:7;4152:6;;;;;;;;;;;4145:13;;4079:87;:::o;48946:84::-;4310:12;:10;:12::i;:::-;4299:23;;:7;:5;:7::i;:::-;:23;;;4291:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49016:6:::1;49008:5;:14;;;;48946:84:::0;:::o;47328:37::-;;;;:::o;26645:104::-;26701:13;26734:7;26727:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26645:104;:::o;47254:30::-;;;;:::o;28820:308::-;28931:19;:17;:19::i;:::-;28919:31;;:8;:31;;;28915:61;;;28959:17;;;;;;;;;;;;;;28915:61;29041:8;28989:18;:39;29008:19;:17;:19::i;:::-;28989:39;;;;;;;;;;;;;;;:49;29029:8;28989:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;29101:8;29065:55;;29080:19;:17;:19::i;:::-;29065:55;;;29111:8;29065:55;;;;;;:::i;:::-;;;;;;;;28820:308;;:::o;48639:159::-;4310:12;:10;:12::i;:::-;4299:23;;:7;:5;:7::i;:::-;:23;;;4291:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48771:19:::1;48750:18;:40;;;;48639:159:::0;:::o;29927:396::-;30094:28;30104:4;30110:2;30114:7;30094:9;:28::i;:::-;30155:1;30137:2;:14;;;:19;30133:183;;30176:56;30207:4;30213:2;30217:7;30226:5;30176:30;:56::i;:::-;30171:145;;30260:40;;;;;;;;;;;;;;30171:145;30133:183;29927:396;;;;:::o;49856:641::-;49975:13;50028:17;50036:8;50028:7;:17::i;:::-;50006:114;;;;;;;;;;;;:::i;:::-;;;;;;;;;50133:28;50164:10;:8;:10::i;:::-;50133:41;;50236:1;50211:14;50205:28;:32;:284;;;;;;;;;;;;;;;;;50329:14;50370:19;:8;:17;:19::i;:::-;50416:9;50286:162;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;50205:284;50185:304;;;49856:641;;;:::o;48806:132::-;4310:12;:10;:12::i;:::-;4299:23;;:7;:5;:7::i;:::-;:23;;;4291:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48912:18:::1;48892:17;:38;;;;48806:132:::0;:::o;29199:164::-;29296:4;29320:18;:25;29339:5;29320:25;;;;;;;;;;;;;;;:35;29346:8;29320:35;;;;;;;;;;;;;;;;;;;;;;;;;29313:42;;29199:164;;;;:::o;47188:17::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;4988:201::-;4310:12;:10;:12::i;:::-;4299:23;;:7;:5;:7::i;:::-;:23;;;4291:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5097:1:::1;5077:22;;:8;:22;;;;5069:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;5153:28;5172:8;5153:18;:28::i;:::-;4988:201:::0;:::o;48326:82::-;4310:12;:10;:12::i;:::-;4299:23;;:7;:5;:7::i;:::-;:23;;;4291:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48396:4:::1;48390:3;:10;;;;;;;;;;;;:::i;:::-;;48326:82:::0;:::o;2803:98::-;2856:7;2883:10;2876:17;;2803:98;:::o;30578:273::-;30635:4;30691:7;30672:15;:13;:15::i;:::-;:26;;:66;;;;;30725:13;;30715:7;:23;30672:66;:152;;;;;30823:1;18247:8;30776:17;:26;30794:7;30776:26;;;;;;;;;;;;:43;:48;30672:152;30652:172;;30578:273;;;:::o;23780:1129::-;23847:7;23867:12;23882:7;23867:22;;23950:4;23931:15;:13;:15::i;:::-;:23;23927:915;;23984:13;;23977:4;:20;23973:869;;;24022:14;24039:17;:23;24057:4;24039:23;;;;;;;;;;;;24022:40;;24155:1;18247:8;24128:6;:23;:28;24124:699;;;24647:113;24664:1;24654:6;:11;24647:113;;;24707:17;:25;24725:6;;;;;;;24707:25;;;;;;;;;;;;24698:34;;24647:113;;;24793:6;24786:13;;;;;;24124:699;23999:843;23973:869;23927:915;24870:31;;;;;;;;;;;;;;23780:1129;;;;:::o;44845:105::-;44905:7;44932:10;44925:17;;44845:105;:::o;49747:101::-;49812:7;49839:1;49832:8;;49747:101;:::o;35837:2654::-;35952:27;35982;36001:7;35982:18;:27::i;:::-;35952:57;;36067:4;36026:45;;36042:19;36026:45;;;36022:86;;36080:28;;;;;;;;;;;;;;36022:86;36121:23;36147:15;:24;36163:7;36147:24;;;;;;;;;;;;;;;;;;;;;36121:50;;36184:22;36233:4;36210:27;;:19;:17;:19::i;:::-;:27;;;:87;;;;36254:43;36271:4;36277:19;:17;:19::i;:::-;36254:16;:43::i;:::-;36210:87;:142;;;;36333:19;:17;:19::i;:::-;36314:38;;:15;:38;;;36210:142;36184:169;;36371:17;36366:66;;36397:35;;;;;;;;;;;;;;36366:66;36472:1;36447:21;36465:2;36447:17;:21::i;:::-;:26;36443:62;;;36482:23;;;;;;;;;;;;;;36443:62;36518:43;36540:4;36546:2;36550:7;36559:1;36518:21;:43::i;:::-;36669:1;36631:34;36649:15;36631:17;:34::i;:::-;:39;36627:103;;36694:15;:24;36710:7;36694:24;;;;;;;;;;;;36687:31;;;;;;;;;;;36627:103;37097:18;:24;37116:4;37097:24;;;;;;;;;;;;;;;;37095:26;;;;;;;;;;;;37166:18;:22;37185:2;37166:22;;;;;;;;;;;;;;;;37164:24;;;;;;;;;;;18525:8;18131:3;37547:15;:41;;37505:21;37523:2;37505:17;:21::i;:::-;:84;:128;37459:17;:26;37477:7;37459:26;;;;;;;;;;;:174;;;;37803:1;18525:8;37753:19;:46;:51;37749:626;;;37825:19;37857:1;37847:7;:11;37825:33;;38014:1;37980:17;:30;37998:11;37980:30;;;;;;;;;;;;:35;37976:384;;;38118:13;;38103:11;:28;38099:242;;38298:19;38265:17;:30;38283:11;38265:30;;;;;;;;;;;:52;;;;38099:242;37976:384;37806:569;37749:626;38422:7;38418:2;38403:27;;38412:4;38403:27;;;;;;;;;;;;38441:42;38462:4;38468:2;38472:7;38481:1;38441:20;:42::i;:::-;35941:2550;;;35837:2654;;;:::o;30935:104::-;31004:27;31014:2;31018:8;31004:27;;;;;;;;;;;;:9;:27::i;:::-;30935:104;;:::o;27565:148::-;27629:14;27690:5;27680:15;;27565:148;;;:::o;5349:191::-;5423:16;5442:6;;;;;;;;;;;5423:25;;5468:8;5459:6;;:17;;;;;;;;;;;;;;;;;;5523:8;5492:40;;5513:8;5492:40;;;;;;;;;;;;5412:128;5349:191;:::o;42314:716::-;42477:4;42523:2;42498:45;;;42544:19;:17;:19::i;:::-;42565:4;42571:7;42580:5;42498:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;42494:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42798:1;42781:6;:13;:18;42777:235;;;42827:40;;;;;;;;;;;;;;42777:235;42970:6;42964:13;42955:6;42951:2;42947:15;42940:38;42494:529;42667:54;;;42657:64;;;:6;:64;;;;42650:71;;;42314:716;;;;;;:::o;50505:104::-;50565:13;50598:3;50591:10;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50505:104;:::o;365:723::-;421:13;651:1;642:5;:10;638:53;;;669:10;;;;;;;;;;;;;;;;;;;;;638:53;701:12;716:5;701:20;;732:14;757:78;772:1;764:4;:9;757:78;;790:8;;;;;:::i;:::-;;;;821:2;813:10;;;;;:::i;:::-;;;757:78;;;845:19;877:6;867:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;845:39;;895:154;911:1;902:5;:10;895:154;;939:1;929:11;;;;;:::i;:::-;;;1006:2;998:5;:10;;;;:::i;:::-;985:2;:24;;;;:::i;:::-;972:39;;955:6;962;955:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1035:2;1026:11;;;;;:::i;:::-;;;895:154;;;1073:6;1059:21;;;;;365:723;;;;:::o;43678:159::-;;;;;:::o;44496:158::-;;;;;:::o;31412:2246::-;31535:20;31558:13;;31535:36;;31611:1;31586:21;31604:2;31586:17;:21::i;:::-;:26;31582:58;;;31621:19;;;;;;;;;;;;;;31582:58;31667:1;31655:8;:13;31651:44;;;31677:18;;;;;;;;;;;;;;31651:44;31708:61;31738:1;31742:2;31746:12;31760:8;31708:21;:61::i;:::-;32312:1;17614:2;32283:1;:25;;32282:31;32270:8;:44;32244:18;:22;32263:2;32244:22;;;;;;;;;;;;;;;;:70;;;;;;;;;;;18390:3;32713:29;32740:1;32728:8;:13;32713:14;:29::i;:::-;:56;;18131:3;32650:15;:41;;32608:21;32626:2;32608:17;:21::i;:::-;:84;:162;32557:17;:31;32575:12;32557:31;;;;;;;;;;;:213;;;;32787:20;32810:12;32787:35;;32837:11;32866:8;32851:12;:23;32837:37;;32913:1;32895:2;:14;;;:19;32891:635;;32935:313;32991:12;32987:2;32966:38;;32983:1;32966:38;;;;;;;;;;;;33032:69;33071:1;33075:2;33079:14;;;;;;33095:5;33032:30;:69::i;:::-;33027:174;;33137:40;;;;;;;;;;;;;;33027:174;33243:3;33228:12;:18;32935:313;;33329:12;33312:13;;:29;33308:43;;33343:8;;;33308:43;32891:635;;;33392:119;33448:14;;;;;;33444:2;33423:40;;33440:1;33423:40;;;;;;;;;;;;33506:3;33491:12;:18;33392:119;;32891:635;33556:12;33540:13;:28;;;;32021:1559;;33590:60;33619:1;33623:2;33627:12;33641:8;33590:20;:60::i;:::-;31524:2134;31412:2246;;;:::o;27800:142::-;27858:14;27919:5;27909:15;;27800:142;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:77;371:7;400:5;389:16;;334:77;;;:::o;417:122::-;490:24;508:5;490:24;:::i;:::-;483:5;480:35;470:63;;529:1;526;519:12;470:63;417:122;:::o;545:139::-;591:5;629:6;616:20;607:29;;645:33;672:5;645:33;:::i;:::-;545:139;;;;:::o;690:329::-;749:6;798:2;786:9;777:7;773:23;769:32;766:119;;;804:79;;:::i;:::-;766:119;924:1;949:53;994:7;985:6;974:9;970:22;949:53;:::i;:::-;939:63;;895:117;690:329;;;;:::o;1025:149::-;1061:7;1101:66;1094:5;1090:78;1079:89;;1025:149;;;:::o;1180:120::-;1252:23;1269:5;1252:23;:::i;:::-;1245:5;1242:34;1232:62;;1290:1;1287;1280:12;1232:62;1180:120;:::o;1306:137::-;1351:5;1389:6;1376:20;1367:29;;1405:32;1431:5;1405:32;:::i;:::-;1306:137;;;;:::o;1449:327::-;1507:6;1556:2;1544:9;1535:7;1531:23;1527:32;1524:119;;;1562:79;;:::i;:::-;1524:119;1682:1;1707:52;1751:7;1742:6;1731:9;1727:22;1707:52;:::i;:::-;1697:62;;1653:116;1449:327;;;;:::o;1782:90::-;1816:7;1859:5;1852:13;1845:21;1834:32;;1782:90;;;:::o;1878:109::-;1959:21;1974:5;1959:21;:::i;:::-;1954:3;1947:34;1878:109;;:::o;1993:210::-;2080:4;2118:2;2107:9;2103:18;2095:26;;2131:65;2193:1;2182:9;2178:17;2169:6;2131:65;:::i;:::-;1993:210;;;;:::o;2209:99::-;2261:6;2295:5;2289:12;2279:22;;2209:99;;;:::o;2314:169::-;2398:11;2432:6;2427:3;2420:19;2472:4;2467:3;2463:14;2448:29;;2314:169;;;;:::o;2489:307::-;2557:1;2567:113;2581:6;2578:1;2575:13;2567:113;;;2666:1;2661:3;2657:11;2651:18;2647:1;2642:3;2638:11;2631:39;2603:2;2600:1;2596:10;2591:15;;2567:113;;;2698:6;2695:1;2692:13;2689:101;;;2778:1;2769:6;2764:3;2760:16;2753:27;2689:101;2538:258;2489:307;;;:::o;2802:102::-;2843:6;2894:2;2890:7;2885:2;2878:5;2874:14;2870:28;2860:38;;2802:102;;;:::o;2910:364::-;2998:3;3026:39;3059:5;3026:39;:::i;:::-;3081:71;3145:6;3140:3;3081:71;:::i;:::-;3074:78;;3161:52;3206:6;3201:3;3194:4;3187:5;3183:16;3161:52;:::i;:::-;3238:29;3260:6;3238:29;:::i;:::-;3233:3;3229:39;3222:46;;3002:272;2910:364;;;;:::o;3280:313::-;3393:4;3431:2;3420:9;3416:18;3408:26;;3480:9;3474:4;3470:20;3466:1;3455:9;3451:17;3444:47;3508:78;3581:4;3572:6;3508:78;:::i;:::-;3500:86;;3280:313;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:117::-;5047:1;5044;5037:12;5061:117;5170:1;5167;5160:12;5184:180;5232:77;5229:1;5222:88;5329:4;5326:1;5319:15;5353:4;5350:1;5343:15;5370:281;5453:27;5475:4;5453:27;:::i;:::-;5445:6;5441:40;5583:6;5571:10;5568:22;5547:18;5535:10;5532:34;5529:62;5526:88;;;5594:18;;:::i;:::-;5526:88;5634:10;5630:2;5623:22;5413:238;5370:281;;:::o;5657:129::-;5691:6;5718:20;;:::i;:::-;5708:30;;5747:33;5775:4;5767:6;5747:33;:::i;:::-;5657:129;;;:::o;5792:308::-;5854:4;5944:18;5936:6;5933:30;5930:56;;;5966:18;;:::i;:::-;5930:56;6004:29;6026:6;6004:29;:::i;:::-;5996:37;;6088:4;6082;6078:15;6070:23;;5792:308;;;:::o;6106:154::-;6190:6;6185:3;6180;6167:30;6252:1;6243:6;6238:3;6234:16;6227:27;6106:154;;;:::o;6266:412::-;6344:5;6369:66;6385:49;6427:6;6385:49;:::i;:::-;6369:66;:::i;:::-;6360:75;;6458:6;6451:5;6444:21;6496:4;6489:5;6485:16;6534:3;6525:6;6520:3;6516:16;6513:25;6510:112;;;6541:79;;:::i;:::-;6510:112;6631:41;6665:6;6660:3;6655;6631:41;:::i;:::-;6350:328;6266:412;;;;;:::o;6698:340::-;6754:5;6803:3;6796:4;6788:6;6784:17;6780:27;6770:122;;6811:79;;:::i;:::-;6770:122;6928:6;6915:20;6953:79;7028:3;7020:6;7013:4;7005:6;7001:17;6953:79;:::i;:::-;6944:88;;6760:278;6698:340;;;;:::o;7044:509::-;7113:6;7162:2;7150:9;7141:7;7137:23;7133:32;7130:119;;;7168:79;;:::i;:::-;7130:119;7316:1;7305:9;7301:17;7288:31;7346:18;7338:6;7335:30;7332:117;;;7368:79;;:::i;:::-;7332:117;7473:63;7528:7;7519:6;7508:9;7504:22;7473:63;:::i;:::-;7463:73;;7259:287;7044:509;;;;:::o;7559:118::-;7646:24;7664:5;7646:24;:::i;:::-;7641:3;7634:37;7559:118;;:::o;7683:222::-;7776:4;7814:2;7803:9;7799:18;7791:26;;7827:71;7895:1;7884:9;7880:17;7871:6;7827:71;:::i;:::-;7683:222;;;;:::o;7911:619::-;7988:6;7996;8004;8053:2;8041:9;8032:7;8028:23;8024:32;8021:119;;;8059:79;;:::i;:::-;8021:119;8179:1;8204:53;8249:7;8240:6;8229:9;8225:22;8204:53;:::i;:::-;8194:63;;8150:117;8306:2;8332:53;8377:7;8368:6;8357:9;8353:22;8332:53;:::i;:::-;8322:63;;8277:118;8434:2;8460:53;8505:7;8496:6;8485:9;8481:22;8460:53;:::i;:::-;8450:63;;8405:118;7911:619;;;;;:::o;8536:329::-;8595:6;8644:2;8632:9;8623:7;8619:23;8615:32;8612:119;;;8650:79;;:::i;:::-;8612:119;8770:1;8795:53;8840:7;8831:6;8820:9;8816:22;8795:53;:::i;:::-;8785:63;;8741:117;8536:329;;;;:::o;8871:116::-;8941:21;8956:5;8941:21;:::i;:::-;8934:5;8931:32;8921:60;;8977:1;8974;8967:12;8921:60;8871:116;:::o;8993:133::-;9036:5;9074:6;9061:20;9052:29;;9090:30;9114:5;9090:30;:::i;:::-;8993:133;;;;:::o;9132:323::-;9188:6;9237:2;9225:9;9216:7;9212:23;9208:32;9205:119;;;9243:79;;:::i;:::-;9205:119;9363:1;9388:50;9430:7;9421:6;9410:9;9406:22;9388:50;:::i;:::-;9378:60;;9334:114;9132:323;;;;:::o;9461:468::-;9526:6;9534;9583:2;9571:9;9562:7;9558:23;9554:32;9551:119;;;9589:79;;:::i;:::-;9551:119;9709:1;9734:53;9779:7;9770:6;9759:9;9755:22;9734:53;:::i;:::-;9724:63;;9680:117;9836:2;9862:50;9904:7;9895:6;9884:9;9880:22;9862:50;:::i;:::-;9852:60;;9807:115;9461:468;;;;;:::o;9935:307::-;9996:4;10086:18;10078:6;10075:30;10072:56;;;10108:18;;:::i;:::-;10072:56;10146:29;10168:6;10146:29;:::i;:::-;10138:37;;10230:4;10224;10220:15;10212:23;;9935:307;;;:::o;10248:410::-;10325:5;10350:65;10366:48;10407:6;10366:48;:::i;:::-;10350:65;:::i;:::-;10341:74;;10438:6;10431:5;10424:21;10476:4;10469:5;10465:16;10514:3;10505:6;10500:3;10496:16;10493:25;10490:112;;;10521:79;;:::i;:::-;10490:112;10611:41;10645:6;10640:3;10635;10611:41;:::i;:::-;10331:327;10248:410;;;;;:::o;10677:338::-;10732:5;10781:3;10774:4;10766:6;10762:17;10758:27;10748:122;;10789:79;;:::i;:::-;10748:122;10906:6;10893:20;10931:78;11005:3;10997:6;10990:4;10982:6;10978:17;10931:78;:::i;:::-;10922:87;;10738:277;10677:338;;;;:::o;11021:943::-;11116:6;11124;11132;11140;11189:3;11177:9;11168:7;11164:23;11160:33;11157:120;;;11196:79;;:::i;:::-;11157:120;11316:1;11341:53;11386:7;11377:6;11366:9;11362:22;11341:53;:::i;:::-;11331:63;;11287:117;11443:2;11469:53;11514:7;11505:6;11494:9;11490:22;11469:53;:::i;:::-;11459:63;;11414:118;11571:2;11597:53;11642:7;11633:6;11622:9;11618:22;11597:53;:::i;:::-;11587:63;;11542:118;11727:2;11716:9;11712:18;11699:32;11758:18;11750:6;11747:30;11744:117;;;11780:79;;:::i;:::-;11744:117;11885:62;11939:7;11930:6;11919:9;11915:22;11885:62;:::i;:::-;11875:72;;11670:287;11021:943;;;;;;;:::o;11970:474::-;12038:6;12046;12095:2;12083:9;12074:7;12070:23;12066:32;12063:119;;;12101:79;;:::i;:::-;12063:119;12221:1;12246:53;12291:7;12282:6;12271:9;12267:22;12246:53;:::i;:::-;12236:63;;12192:117;12348:2;12374:53;12419:7;12410:6;12399:9;12395:22;12374:53;:::i;:::-;12364:63;;12319:118;11970:474;;;;;:::o;12450:182::-;12590:34;12586:1;12578:6;12574:14;12567:58;12450:182;:::o;12638:366::-;12780:3;12801:67;12865:2;12860:3;12801:67;:::i;:::-;12794:74;;12877:93;12966:3;12877:93;:::i;:::-;12995:2;12990:3;12986:12;12979:19;;12638:366;;;:::o;13010:419::-;13176:4;13214:2;13203:9;13199:18;13191:26;;13263:9;13257:4;13253:20;13249:1;13238:9;13234:17;13227:47;13291:131;13417:4;13291:131;:::i;:::-;13283:139;;13010:419;;;:::o;13435:180::-;13483:77;13480:1;13473:88;13580:4;13577:1;13570:15;13604:4;13601:1;13594:15;13621:320;13665:6;13702:1;13696:4;13692:12;13682:22;;13749:1;13743:4;13739:12;13770:18;13760:81;;13826:4;13818:6;13814:17;13804:27;;13760:81;13888:2;13880:6;13877:14;13857:18;13854:38;13851:84;;;13907:18;;:::i;:::-;13851:84;13672:269;13621:320;;;:::o;13947:171::-;14087:23;14083:1;14075:6;14071:14;14064:47;13947:171;:::o;14124:366::-;14266:3;14287:67;14351:2;14346:3;14287:67;:::i;:::-;14280:74;;14363:93;14452:3;14363:93;:::i;:::-;14481:2;14476:3;14472:12;14465:19;;14124:366;;;:::o;14496:419::-;14662:4;14700:2;14689:9;14685:18;14677:26;;14749:9;14743:4;14739:20;14735:1;14724:9;14720:17;14713:47;14777:131;14903:4;14777:131;:::i;:::-;14769:139;;14496:419;;;:::o;14921:157::-;15061:9;15057:1;15049:6;15045:14;15038:33;14921:157;:::o;15084:365::-;15226:3;15247:66;15311:1;15306:3;15247:66;:::i;:::-;15240:73;;15322:93;15411:3;15322:93;:::i;:::-;15440:2;15435:3;15431:12;15424:19;;15084:365;;;:::o;15455:419::-;15621:4;15659:2;15648:9;15644:18;15636:26;;15708:9;15702:4;15698:20;15694:1;15683:9;15679:17;15672:47;15736:131;15862:4;15736:131;:::i;:::-;15728:139;;15455:419;;;:::o;15880:170::-;16020:22;16016:1;16008:6;16004:14;15997:46;15880:170;:::o;16056:366::-;16198:3;16219:67;16283:2;16278:3;16219:67;:::i;:::-;16212:74;;16295:93;16384:3;16295:93;:::i;:::-;16413:2;16408:3;16404:12;16397:19;;16056:366;;;:::o;16428:419::-;16594:4;16632:2;16621:9;16617:18;16609:26;;16681:9;16675:4;16671:20;16667:1;16656:9;16652:17;16645:47;16709:131;16835:4;16709:131;:::i;:::-;16701:139;;16428:419;;;:::o;16853:180::-;16901:77;16898:1;16891:88;16998:4;16995:1;16988:15;17022:4;17019:1;17012:15;17039:305;17079:3;17098:20;17116:1;17098:20;:::i;:::-;17093:25;;17132:20;17150:1;17132:20;:::i;:::-;17127:25;;17286:1;17218:66;17214:74;17211:1;17208:81;17205:107;;;17292:18;;:::i;:::-;17205:107;17336:1;17333;17329:9;17322:16;;17039:305;;;;:::o;17350:170::-;17490:22;17486:1;17478:6;17474:14;17467:46;17350:170;:::o;17526:366::-;17668:3;17689:67;17753:2;17748:3;17689:67;:::i;:::-;17682:74;;17765:93;17854:3;17765:93;:::i;:::-;17883:2;17878:3;17874:12;17867:19;;17526:366;;;:::o;17898:419::-;18064:4;18102:2;18091:9;18087:18;18079:26;;18151:9;18145:4;18141:20;18137:1;18126:9;18122:17;18115:47;18179:131;18305:4;18179:131;:::i;:::-;18171:139;;17898:419;;;:::o;18323:179::-;18463:31;18459:1;18451:6;18447:14;18440:55;18323:179;:::o;18508:366::-;18650:3;18671:67;18735:2;18730:3;18671:67;:::i;:::-;18664:74;;18747:93;18836:3;18747:93;:::i;:::-;18865:2;18860:3;18856:12;18849:19;;18508:366;;;:::o;18880:419::-;19046:4;19084:2;19073:9;19069:18;19061:26;;19133:9;19127:4;19123:20;19119:1;19108:9;19104:17;19097:47;19161:131;19287:4;19161:131;:::i;:::-;19153:139;;18880:419;;;:::o;19305:348::-;19345:7;19368:20;19386:1;19368:20;:::i;:::-;19363:25;;19402:20;19420:1;19402:20;:::i;:::-;19397:25;;19590:1;19522:66;19518:74;19515:1;19512:81;19507:1;19500:9;19493:17;19489:105;19486:131;;;19597:18;;:::i;:::-;19486:131;19645:1;19642;19638:9;19627:20;;19305:348;;;;:::o;19659:169::-;19799:21;19795:1;19787:6;19783:14;19776:45;19659:169;:::o;19834:366::-;19976:3;19997:67;20061:2;20056:3;19997:67;:::i;:::-;19990:74;;20073:93;20162:3;20073:93;:::i;:::-;20191:2;20186:3;20182:12;20175:19;;19834:366;;;:::o;20206:419::-;20372:4;20410:2;20399:9;20395:18;20387:26;;20459:9;20453:4;20449:20;20445:1;20434:9;20430:17;20423:47;20487:131;20613:4;20487:131;:::i;:::-;20479:139;;20206:419;;;:::o;20631:181::-;20771:33;20767:1;20759:6;20755:14;20748:57;20631:181;:::o;20818:366::-;20960:3;20981:67;21045:2;21040:3;20981:67;:::i;:::-;20974:74;;21057:93;21146:3;21057:93;:::i;:::-;21175:2;21170:3;21166:12;21159:19;;20818:366;;;:::o;21190:419::-;21356:4;21394:2;21383:9;21379:18;21371:26;;21443:9;21437:4;21433:20;21429:1;21418:9;21414:17;21407:47;21471:131;21597:4;21471:131;:::i;:::-;21463:139;;21190:419;;;:::o;21615:147::-;21716:11;21753:3;21738:18;;21615:147;;;;:::o;21768:114::-;;:::o;21888:398::-;22047:3;22068:83;22149:1;22144:3;22068:83;:::i;:::-;22061:90;;22160:93;22249:3;22160:93;:::i;:::-;22278:1;22273:3;22269:11;22262:18;;21888:398;;;:::o;22292:379::-;22476:3;22498:147;22641:3;22498:147;:::i;:::-;22491:154;;22662:3;22655:10;;22292:379;;;:::o;22677:165::-;22817:17;22813:1;22805:6;22801:14;22794:41;22677:165;:::o;22848:366::-;22990:3;23011:67;23075:2;23070:3;23011:67;:::i;:::-;23004:74;;23087:93;23176:3;23087:93;:::i;:::-;23205:2;23200:3;23196:12;23189:19;;22848:366;;;:::o;23220:419::-;23386:4;23424:2;23413:9;23409:18;23401:26;;23473:9;23467:4;23463:20;23459:1;23448:9;23444:17;23437:47;23501:131;23627:4;23501:131;:::i;:::-;23493:139;;23220:419;;;:::o;23645:234::-;23785:34;23781:1;23773:6;23769:14;23762:58;23854:17;23849:2;23841:6;23837:15;23830:42;23645:234;:::o;23885:366::-;24027:3;24048:67;24112:2;24107:3;24048:67;:::i;:::-;24041:74;;24124:93;24213:3;24124:93;:::i;:::-;24242:2;24237:3;24233:12;24226:19;;23885:366;;;:::o;24257:419::-;24423:4;24461:2;24450:9;24446:18;24438:26;;24510:9;24504:4;24500:20;24496:1;24485:9;24481:17;24474:47;24538:131;24664:4;24538:131;:::i;:::-;24530:139;;24257:419;;;:::o;24682:148::-;24784:11;24821:3;24806:18;;24682:148;;;;:::o;24836:377::-;24942:3;24970:39;25003:5;24970:39;:::i;:::-;25025:89;25107:6;25102:3;25025:89;:::i;:::-;25018:96;;25123:52;25168:6;25163:3;25156:4;25149:5;25145:16;25123:52;:::i;:::-;25200:6;25195:3;25191:16;25184:23;;24946:267;24836:377;;;;:::o;25219:141::-;25268:4;25291:3;25283:11;;25314:3;25311:1;25304:14;25348:4;25345:1;25335:18;25327:26;;25219:141;;;:::o;25390:845::-;25493:3;25530:5;25524:12;25559:36;25585:9;25559:36;:::i;:::-;25611:89;25693:6;25688:3;25611:89;:::i;:::-;25604:96;;25731:1;25720:9;25716:17;25747:1;25742:137;;;;25893:1;25888:341;;;;25709:520;;25742:137;25826:4;25822:9;25811;25807:25;25802:3;25795:38;25862:6;25857:3;25853:16;25846:23;;25742:137;;25888:341;25955:38;25987:5;25955:38;:::i;:::-;26015:1;26029:154;26043:6;26040:1;26037:13;26029:154;;;26117:7;26111:14;26107:1;26102:3;26098:11;26091:35;26167:1;26158:7;26154:15;26143:26;;26065:4;26062:1;26058:12;26053:17;;26029:154;;;26212:6;26207:3;26203:16;26196:23;;25895:334;;25709:520;;25497:738;;25390:845;;;;:::o;26241:589::-;26466:3;26488:95;26579:3;26570:6;26488:95;:::i;:::-;26481:102;;26600:95;26691:3;26682:6;26600:95;:::i;:::-;26593:102;;26712:92;26800:3;26791:6;26712:92;:::i;:::-;26705:99;;26821:3;26814:10;;26241:589;;;;;;:::o;26836:225::-;26976:34;26972:1;26964:6;26960:14;26953:58;27045:8;27040:2;27032:6;27028:15;27021:33;26836:225;:::o;27067:366::-;27209:3;27230:67;27294:2;27289:3;27230:67;:::i;:::-;27223:74;;27306:93;27395:3;27306:93;:::i;:::-;27424:2;27419:3;27415:12;27408:19;;27067:366;;;:::o;27439:419::-;27605:4;27643:2;27632:9;27628:18;27620:26;;27692:9;27686:4;27682:20;27678:1;27667:9;27663:17;27656:47;27720:131;27846:4;27720:131;:::i;:::-;27712:139;;27439:419;;;:::o;27864:98::-;27915:6;27949:5;27943:12;27933:22;;27864:98;;;:::o;27968:168::-;28051:11;28085:6;28080:3;28073:19;28125:4;28120:3;28116:14;28101:29;;27968:168;;;;:::o;28142:360::-;28228:3;28256:38;28288:5;28256:38;:::i;:::-;28310:70;28373:6;28368:3;28310:70;:::i;:::-;28303:77;;28389:52;28434:6;28429:3;28422:4;28415:5;28411:16;28389:52;:::i;:::-;28466:29;28488:6;28466:29;:::i;:::-;28461:3;28457:39;28450:46;;28232:270;28142:360;;;;:::o;28508:640::-;28703:4;28741:3;28730:9;28726:19;28718:27;;28755:71;28823:1;28812:9;28808:17;28799:6;28755:71;:::i;:::-;28836:72;28904:2;28893:9;28889:18;28880:6;28836:72;:::i;:::-;28918;28986:2;28975:9;28971:18;28962:6;28918:72;:::i;:::-;29037:9;29031:4;29027:20;29022:2;29011:9;29007:18;29000:48;29065:76;29136:4;29127:6;29065:76;:::i;:::-;29057:84;;28508:640;;;;;;;:::o;29154:141::-;29210:5;29241:6;29235:13;29226:22;;29257:32;29283:5;29257:32;:::i;:::-;29154:141;;;;:::o;29301:349::-;29370:6;29419:2;29407:9;29398:7;29394:23;29390:32;29387:119;;;29425:79;;:::i;:::-;29387:119;29545:1;29570:63;29625:7;29616:6;29605:9;29601:22;29570:63;:::i;:::-;29560:73;;29516:127;29301:349;;;;:::o;29656:233::-;29695:3;29718:24;29736:5;29718:24;:::i;:::-;29709:33;;29764:66;29757:5;29754:77;29751:103;;;29834:18;;:::i;:::-;29751:103;29881:1;29874:5;29870:13;29863:20;;29656:233;;;:::o;29895:180::-;29943:77;29940:1;29933:88;30040:4;30037:1;30030:15;30064:4;30061:1;30054:15;30081:185;30121:1;30138:20;30156:1;30138:20;:::i;:::-;30133:25;;30172:20;30190:1;30172:20;:::i;:::-;30167:25;;30211:1;30201:35;;30216:18;;:::i;:::-;30201:35;30258:1;30255;30251:9;30246:14;;30081:185;;;;:::o;30272:191::-;30312:4;30332:20;30350:1;30332:20;:::i;:::-;30327:25;;30366:20;30384:1;30366:20;:::i;:::-;30361:25;;30405:1;30402;30399:8;30396:34;;;30410:18;;:::i;:::-;30396:34;30455:1;30452;30448:9;30440:17;;30272:191;;;;:::o;30469:176::-;30501:1;30518:20;30536:1;30518:20;:::i;:::-;30513:25;;30552:20;30570:1;30552:20;:::i;:::-;30547:25;;30591:1;30581:35;;30596:18;;:::i;:::-;30581:35;30637:1;30634;30630:9;30625:14;;30469:176;;;;:::o;30651:180::-;30699:77;30696:1;30689:88;30796:4;30793:1;30786:15;30820:4;30817:1;30810:15
Swarm Source
ipfs://41c1d791b2d1ca8382bef68613ad1e930d1c9dfc0c19ea004562f6643b341ed9
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.