Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
5,555 MRNA
Holders
1,763
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 MRNALoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
MrNaughty
Compiler Version
v0.8.13+commit.abaa5c0e
Contract Source Code (Solidity Multiple files format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.13; import './ERC721A.sol'; import './Ownable.sol'; import './ReentrancyGuard.sol'; import './Strings.sol'; contract MrNaughty is ERC721A, Ownable, ReentrancyGuard { // ===== Variables ===== string public baseTokenURI; uint256 public mintPrice = 0.0 ether; uint256 public collectionSize = 5555; uint256 public maxPublicMint = 3; uint256 public reserveSize; bool public publicSale; bool public void; address[] public reserveAddresses; mapping(address => uint256) public walletMints; mapping(address => uint256) public totalReservedMints; mapping(address => bool) userAddr; constructor() ERC721A("MrNaughty", "MRNA") {} function mint(uint256 _mintAmount) public payable nonReentrant { uint256 s = totalSupply(); require(publicSale, "Public Minting is on Pause"); require(_mintAmount > 0, "Cant mint 0"); require(s + _mintAmount <= collectionSize, "Minting supply exceeded"); require((walletMints[msg.sender] + _mintAmount) <= maxPublicMint, "Cannot mint beyond max mint!"); _safeMint(msg.sender, _mintAmount); walletMints[msg.sender] += _mintAmount; } function naughty() external nonReentrant { require(totalReservedMints[msg.sender] + reserveSize <= reserveSize, "Already been naughty!"); require(allowedToMint(msg.sender), "You aren't naughty!"); _safeMint(msg.sender, reserveSize); totalReservedMints[msg.sender] += reserveSize; } function setMintPrice(uint256 _mintPrice) external onlyOwner { mintPrice = _mintPrice; } function setMaxPublicMint(uint256 _maxPublicMint) external onlyOwner { maxPublicMint = _maxPublicMint; } function setBaseTokenURI(string memory _baseTokenURI) external onlyOwner { baseTokenURI = _baseTokenURI; } function setReservelist(address[] calldata _addressArray) public onlyOwner { delete reserveAddresses; reserveAddresses = _addressArray; } function setReserveSize(uint256 _reserveSize) public onlyOwner { reserveSize = _reserveSize; } function togglePublicSale() external onlyOwner{ publicSale = !publicSale; } function allowedToMint(address _user) private view returns (bool) { uint i = 0; while (i < reserveAddresses.length) { if(reserveAddresses[i] == _user) { return true; } i++; } return false; } function tokenURI(uint256 tokenId) public view override(ERC721A) returns (string memory) { return string(abi.encodePacked(baseTokenURI, Strings.toString(tokenId), ".json")); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT // ERC721A Contracts v4.0.0 // Creator: Chiru Labs pragma solidity ^0.8.4; import './IERC721A.sol'; /** * @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 auxiliary 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 auxiliary 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 (_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 for each mint. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { _mint(to, quantity); unchecked { if (to.code.length != 0) { uint256 end = _currentIndex; uint256 index = end - quantity; do { if (!_checkContractOnERC721Received(address(0), to, index++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (index < end); // Reentrancy protection. if (_currentIndex != end) revert(); } } } /** * @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 for each mint. */ 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 offset; do { emit Transfer(address(0), to, startTokenId + offset++); } while (offset < quantity); _currentIndex = startTokenId + quantity; } _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) } } }
// SPDX-License-Identifier: MIT // 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(); /** * 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); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; import "./Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { 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); } }
// SPDX-License-Identifier: MIT // 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; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @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); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","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":[],"name":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"collectionSize","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":"maxPublicMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintPrice","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":"naughty","outputs":[],"stateMutability":"nonpayable","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":"publicSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"reserveAddresses","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reserveSize","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":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseTokenURI","type":"string"}],"name":"setBaseTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxPublicMint","type":"uint256"}],"name":"setMaxPublicMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintPrice","type":"uint256"}],"name":"setMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_reserveSize","type":"uint256"}],"name":"setReserveSize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addressArray","type":"address[]"}],"name":"setReservelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"togglePublicSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"totalReservedMints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"void","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"walletMints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60806040526000600b556115b3600c556003600d553480156200002157600080fd5b506040518060400160405280600981526020017f4d724e61756768747900000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f4d524e41000000000000000000000000000000000000000000000000000000008152508160029080519060200190620000a6929190620001d9565b508060039080519060200190620000bf929190620001d9565b50620000d06200010660201b60201c565b6000819055505050620000f8620000ec6200010b60201b60201c565b6200011360201b60201c565b6001600981905550620002ed565b600090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620001e790620002b8565b90600052602060002090601f0160209004810192826200020b576000855562000257565b82601f106200022657805160ff191683800117855562000257565b8280016001018555821562000257579182015b828111156200025657825182559160200191906001019062000239565b5b5090506200026691906200026a565b5090565b5b80821115620002855760008160009055506001016200026b565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620002d157607f821691505b602082108103620002e757620002e662000289565b5b50919050565b61331980620002fd6000396000f3fe6080604052600436106102045760003560e01c8063715018a611610118578063b88d4fde116100a0578063e222c7f91161006f578063e222c7f914610748578063e985e9c51461075f578063f0293fd31461079c578063f2fde38b146107d9578063f4a0a5281461080257610204565b8063b88d4fde1461068c578063c87b56dd146106b5578063cabadaa0146106f2578063d547cfb71461071d57610204565b806395d89b41116100e757806395d89b41146105b457806398689fb5146105df578063a0712d681461061c578063a22cb46514610638578063ac4c25b21461066157610204565b8063715018a61461050c57806381244d51146105235780638da5cb5b146105605780638fabb4541461058b57610204565b8063270ab52c1161019b57806345c0f5331161016a57806345c0f533146104255780636006a993146104505780636352211e146104675780636817c76c146104a457806370a08231146104cf57610204565b8063270ab52c1461037f57806330176e13146103a857806333bc1c5c146103d157806342842e0e146103fc57610204565b80630aaea7ac116101d75780630aaea7ac146102d757806318160ddd1461030257806323b872dd1461032d57806326203ada1461035657610204565b806301ffc9a71461020957806306fdde0314610246578063081812fc14610271578063095ea7b3146102ae575b600080fd5b34801561021557600080fd5b50610230600480360381019061022b91906123b4565b61082b565b60405161023d91906123fc565b60405180910390f35b34801561025257600080fd5b5061025b6108bd565b60405161026891906124b0565b60405180910390f35b34801561027d57600080fd5b5061029860048036038101906102939190612508565b61094f565b6040516102a59190612576565b60405180910390f35b3480156102ba57600080fd5b506102d560048036038101906102d091906125bd565b6109cb565b005b3480156102e357600080fd5b506102ec610b0c565b6040516102f9919061260c565b60405180910390f35b34801561030e57600080fd5b50610317610b12565b604051610324919061260c565b60405180910390f35b34801561033957600080fd5b50610354600480360381019061034f9190612627565b610b29565b005b34801561036257600080fd5b5061037d60048036038101906103789190612508565b610b39565b005b34801561038b57600080fd5b506103a660048036038101906103a19190612508565b610b4b565b005b3480156103b457600080fd5b506103cf60048036038101906103ca91906127af565b610b5d565b005b3480156103dd57600080fd5b506103e6610b7f565b6040516103f391906123fc565b60405180910390f35b34801561040857600080fd5b50610423600480360381019061041e9190612627565b610b92565b005b34801561043157600080fd5b5061043a610bb2565b604051610447919061260c565b60405180910390f35b34801561045c57600080fd5b50610465610bb8565b005b34801561047357600080fd5b5061048e60048036038101906104899190612508565b610d4c565b60405161049b9190612576565b60405180910390f35b3480156104b057600080fd5b506104b9610d5e565b6040516104c6919061260c565b60405180910390f35b3480156104db57600080fd5b506104f660048036038101906104f191906127f8565b610d64565b604051610503919061260c565b60405180910390f35b34801561051857600080fd5b50610521610df8565b005b34801561052f57600080fd5b5061054a60048036038101906105459190612508565b610e0c565b6040516105579190612576565b60405180910390f35b34801561056c57600080fd5b50610575610e4b565b6040516105829190612576565b60405180910390f35b34801561059757600080fd5b506105b260048036038101906105ad9190612885565b610e75565b005b3480156105c057600080fd5b506105c9610ea1565b6040516105d691906124b0565b60405180910390f35b3480156105eb57600080fd5b50610606600480360381019061060191906127f8565b610f33565b604051610613919061260c565b60405180910390f35b61063660048036038101906106319190612508565b610f4b565b005b34801561064457600080fd5b5061065f600480360381019061065a91906128fe565b611181565b005b34801561066d57600080fd5b506106766112f8565b60405161068391906123fc565b60405180910390f35b34801561069857600080fd5b506106b360048036038101906106ae91906129df565b61130b565b005b3480156106c157600080fd5b506106dc60048036038101906106d79190612508565b61137e565b6040516106e991906124b0565b60405180910390f35b3480156106fe57600080fd5b506107076113b2565b604051610714919061260c565b60405180910390f35b34801561072957600080fd5b506107326113b8565b60405161073f91906124b0565b60405180910390f35b34801561075457600080fd5b5061075d611446565b005b34801561076b57600080fd5b5061078660048036038101906107819190612a62565b61147a565b60405161079391906123fc565b60405180910390f35b3480156107a857600080fd5b506107c360048036038101906107be91906127f8565b61150e565b6040516107d0919061260c565b60405180910390f35b3480156107e557600080fd5b5061080060048036038101906107fb91906127f8565b611526565b005b34801561080e57600080fd5b5061082960048036038101906108249190612508565b6115a9565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061088657506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108b65750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6060600280546108cc90612ad1565b80601f01602080910402602001604051908101604052809291908181526020018280546108f890612ad1565b80156109455780601f1061091a57610100808354040283529160200191610945565b820191906000526020600020905b81548152906001019060200180831161092857829003601f168201915b5050505050905090565b600061095a826115bb565b610990576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109d68261161a565b90508073ffffffffffffffffffffffffffffffffffffffff166109f76116e6565b73ffffffffffffffffffffffffffffffffffffffff1614610a5a57610a2381610a1e6116e6565b61147a565b610a59576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600e5481565b6000610b1c6116ee565b6001546000540303905090565b610b348383836116f3565b505050565b610b41611ab8565b80600e8190555050565b610b53611ab8565b80600d8190555050565b610b65611ab8565b80600a9080519060200190610b7b9291906121e4565b5050565b600f60009054906101000a900460ff1681565b610bad8383836040518060200160405280600081525061130b565b505050565b600c5481565b600260095403610bfd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf490612b4e565b60405180910390fd5b6002600981905550600e54600e54601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610c559190612b9d565b1115610c96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8d90612c3f565b60405180910390fd5b610c9f33611b36565b610cde576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd590612cab565b60405180910390fd5b610cea33600e54611be4565b600e54601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610d3b9190612b9d565b925050819055506001600981905550565b6000610d578261161a565b9050919050565b600b5481565b600080610d7083611c02565b03610da7576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b610e00611ab8565b610e0a6000611c0c565b565b60108181548110610e1c57600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610e7d611ab8565b60106000610e8b919061226a565b818160109190610e9c92919061228b565b505050565b606060038054610eb090612ad1565b80601f0160208091040260200160405190810160405280929190818152602001828054610edc90612ad1565b8015610f295780601f10610efe57610100808354040283529160200191610f29565b820191906000526020600020905b815481529060010190602001808311610f0c57829003601f168201915b5050505050905090565b60126020528060005260406000206000915090505481565b600260095403610f90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8790612b4e565b60405180910390fd5b60026009819055506000610fa2610b12565b9050600f60009054906101000a900460ff16610ff3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fea90612d17565b60405180910390fd5b60008211611036576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102d90612d83565b60405180910390fd5b600c5482826110459190612b9d565b1115611086576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107d90612def565b60405180910390fd5b600d5482601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546110d49190612b9d565b1115611115576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110c90612e5b565b60405180910390fd5b61111f3383611be4565b81601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461116e9190612b9d565b9250508190555050600160098190555050565b6111896116e6565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036111ed576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006111fa6116e6565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166112a76116e6565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516112ec91906123fc565b60405180910390a35050565b600f60019054906101000a900460ff1681565b6113168484846116f3565b60008373ffffffffffffffffffffffffffffffffffffffff163b146113785761134184848484611cd2565b611377576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6060600a61138b83611e22565b60405160200161139c929190612f97565b6040516020818303038152906040529050919050565b600d5481565b600a80546113c590612ad1565b80601f01602080910402602001604051908101604052809291908181526020018280546113f190612ad1565b801561143e5780601f106114135761010080835404028352916020019161143e565b820191906000526020600020905b81548152906001019060200180831161142157829003601f168201915b505050505081565b61144e611ab8565b600f60009054906101000a900460ff1615600f60006101000a81548160ff021916908315150217905550565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60116020528060005260406000206000915090505481565b61152e611ab8565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361159d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159490613038565b60405180910390fd5b6115a681611c0c565b50565b6115b1611ab8565b80600b8190555050565b6000816115c66116ee565b111580156115d5575060005482105b8015611613575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600080829050806116296116ee565b116116af576000548110156116ae5760006004600083815260200190815260200160002054905060007c01000000000000000000000000000000000000000000000000000000008216036116ac575b600081036116a2576004600083600190039350838152602001908152602001600020549050611678565b80925050506116e1565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600033905090565b600090565b60006116fe8261161a565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611765576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006006600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008573ffffffffffffffffffffffffffffffffffffffff166117be6116e6565b73ffffffffffffffffffffffffffffffffffffffff1614806117ed57506117ec866117e76116e6565b61147a565b5b8061182a57506117fb6116e6565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b905080611863576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061186e86611c02565b036118a5576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6118b28686866001611f82565b60006118bd83611c02565b146118f9576006600085815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b6119c087611c02565b1717600460008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841603611a485760006001850190506000600460008381526020019081526020016000205403611a46576000548114611a45578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611ab08686866001611f88565b505050505050565b611ac0611f8e565b73ffffffffffffffffffffffffffffffffffffffff16611ade610e4b565b73ffffffffffffffffffffffffffffffffffffffff1614611b34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2b906130a4565b60405180910390fd5b565b600080600090505b601080549050811015611bd9578273ffffffffffffffffffffffffffffffffffffffff1660108281548110611b7657611b756130c4565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611bc6576001915050611bdf565b8080611bd1906130f3565b915050611b3e565b60009150505b919050565b611bfe828260405180602001604052806000815250611f96565b5050565b6000819050919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611cf86116e6565b8786866040518563ffffffff1660e01b8152600401611d1a9493929190613190565b6020604051808303816000875af1925050508015611d5657506040513d601f19601f82011682018060405250810190611d5391906131f1565b60015b611dcf573d8060008114611d86576040519150601f19603f3d011682016040523d82523d6000602084013e611d8b565b606091505b506000815103611dc7576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060008203611e69576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611f7d565b600082905060005b60008214611e9b578080611e84906130f3565b915050600a82611e94919061324d565b9150611e71565b60008167ffffffffffffffff811115611eb757611eb6612684565b5b6040519080825280601f01601f191660200182016040528015611ee95781602001600182028036833780820191505090505b5090505b60008514611f7657600182611f02919061327e565b9150600a85611f1191906132b2565b6030611f1d9190612b9d565b60f81b818381518110611f3357611f326130c4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611f6f919061324d565b9450611eed565b8093505050505b919050565b50505050565b50505050565b600033905090565b611fa08383612033565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461202e57600080549050600083820390505b611fe06000868380600101945086611cd2565b612016576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110611fcd57816000541461202b57600080fd5b50505b505050565b600080549050600061204484611c02565b0361207b576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082036120b5576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6120c26000848385611f82565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e1612127600184146121da565b901b60a042901b61213785611c02565b1717600460008381526020019081526020016000208190555060005b8080600101915082018473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a482811061215357828201600081905550506121d56000848385611f88565b505050565b6000819050919050565b8280546121f090612ad1565b90600052602060002090601f0160209004810192826122125760008555612259565b82601f1061222b57805160ff1916838001178555612259565b82800160010185558215612259579182015b8281111561225857825182559160200191906001019061223d565b5b509050612266919061232b565b5090565b5080546000825590600052602060002090810190612288919061232b565b50565b82805482825590600052602060002090810192821561231a579160200282015b8281111561231957823573ffffffffffffffffffffffffffffffffffffffff168260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550916020019190600101906122ab565b5b509050612327919061232b565b5090565b5b8082111561234457600081600090555060010161232c565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6123918161235c565b811461239c57600080fd5b50565b6000813590506123ae81612388565b92915050565b6000602082840312156123ca576123c9612352565b5b60006123d88482850161239f565b91505092915050565b60008115159050919050565b6123f6816123e1565b82525050565b600060208201905061241160008301846123ed565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612451578082015181840152602081019050612436565b83811115612460576000848401525b50505050565b6000601f19601f8301169050919050565b600061248282612417565b61248c8185612422565b935061249c818560208601612433565b6124a581612466565b840191505092915050565b600060208201905081810360008301526124ca8184612477565b905092915050565b6000819050919050565b6124e5816124d2565b81146124f057600080fd5b50565b600081359050612502816124dc565b92915050565b60006020828403121561251e5761251d612352565b5b600061252c848285016124f3565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061256082612535565b9050919050565b61257081612555565b82525050565b600060208201905061258b6000830184612567565b92915050565b61259a81612555565b81146125a557600080fd5b50565b6000813590506125b781612591565b92915050565b600080604083850312156125d4576125d3612352565b5b60006125e2858286016125a8565b92505060206125f3858286016124f3565b9150509250929050565b612606816124d2565b82525050565b600060208201905061262160008301846125fd565b92915050565b6000806000606084860312156126405761263f612352565b5b600061264e868287016125a8565b935050602061265f868287016125a8565b9250506040612670868287016124f3565b9150509250925092565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6126bc82612466565b810181811067ffffffffffffffff821117156126db576126da612684565b5b80604052505050565b60006126ee612348565b90506126fa82826126b3565b919050565b600067ffffffffffffffff82111561271a57612719612684565b5b61272382612466565b9050602081019050919050565b82818337600083830152505050565b600061275261274d846126ff565b6126e4565b90508281526020810184848401111561276e5761276d61267f565b5b612779848285612730565b509392505050565b600082601f8301126127965761279561267a565b5b81356127a684826020860161273f565b91505092915050565b6000602082840312156127c5576127c4612352565b5b600082013567ffffffffffffffff8111156127e3576127e2612357565b5b6127ef84828501612781565b91505092915050565b60006020828403121561280e5761280d612352565b5b600061281c848285016125a8565b91505092915050565b600080fd5b600080fd5b60008083601f8401126128455761284461267a565b5b8235905067ffffffffffffffff81111561286257612861612825565b5b60208301915083602082028301111561287e5761287d61282a565b5b9250929050565b6000806020838503121561289c5761289b612352565b5b600083013567ffffffffffffffff8111156128ba576128b9612357565b5b6128c68582860161282f565b92509250509250929050565b6128db816123e1565b81146128e657600080fd5b50565b6000813590506128f8816128d2565b92915050565b6000806040838503121561291557612914612352565b5b6000612923858286016125a8565b9250506020612934858286016128e9565b9150509250929050565b600067ffffffffffffffff82111561295957612958612684565b5b61296282612466565b9050602081019050919050565b600061298261297d8461293e565b6126e4565b90508281526020810184848401111561299e5761299d61267f565b5b6129a9848285612730565b509392505050565b600082601f8301126129c6576129c561267a565b5b81356129d684826020860161296f565b91505092915050565b600080600080608085870312156129f9576129f8612352565b5b6000612a07878288016125a8565b9450506020612a18878288016125a8565b9350506040612a29878288016124f3565b925050606085013567ffffffffffffffff811115612a4a57612a49612357565b5b612a56878288016129b1565b91505092959194509250565b60008060408385031215612a7957612a78612352565b5b6000612a87858286016125a8565b9250506020612a98858286016125a8565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612ae957607f821691505b602082108103612afc57612afb612aa2565b5b50919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000612b38601f83612422565b9150612b4382612b02565b602082019050919050565b60006020820190508181036000830152612b6781612b2b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612ba8826124d2565b9150612bb3836124d2565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612be857612be7612b6e565b5b828201905092915050565b7f416c7265616479206265656e206e617567687479210000000000000000000000600082015250565b6000612c29601583612422565b9150612c3482612bf3565b602082019050919050565b60006020820190508181036000830152612c5881612c1c565b9050919050565b7f596f75206172656e2774206e6175676874792100000000000000000000000000600082015250565b6000612c95601383612422565b9150612ca082612c5f565b602082019050919050565b60006020820190508181036000830152612cc481612c88565b9050919050565b7f5075626c6963204d696e74696e67206973206f6e205061757365000000000000600082015250565b6000612d01601a83612422565b9150612d0c82612ccb565b602082019050919050565b60006020820190508181036000830152612d3081612cf4565b9050919050565b7f43616e74206d696e742030000000000000000000000000000000000000000000600082015250565b6000612d6d600b83612422565b9150612d7882612d37565b602082019050919050565b60006020820190508181036000830152612d9c81612d60565b9050919050565b7f4d696e74696e6720737570706c79206578636565646564000000000000000000600082015250565b6000612dd9601783612422565b9150612de482612da3565b602082019050919050565b60006020820190508181036000830152612e0881612dcc565b9050919050565b7f43616e6e6f74206d696e74206265796f6e64206d6178206d696e742100000000600082015250565b6000612e45601c83612422565b9150612e5082612e0f565b602082019050919050565b60006020820190508181036000830152612e7481612e38565b9050919050565b600081905092915050565b60008190508160005260206000209050919050565b60008154612ea881612ad1565b612eb28186612e7b565b94506001821660008114612ecd5760018114612ede57612f11565b60ff19831686528186019350612f11565b612ee785612e86565b60005b83811015612f0957815481890152600182019150602081019050612eea565b838801955050505b50505092915050565b6000612f2582612417565b612f2f8185612e7b565b9350612f3f818560208601612433565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000612f81600583612e7b565b9150612f8c82612f4b565b600582019050919050565b6000612fa38285612e9b565b9150612faf8284612f1a565b9150612fba82612f74565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613022602683612422565b915061302d82612fc6565b604082019050919050565b6000602082019050818103600083015261305181613015565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061308e602083612422565b915061309982613058565b602082019050919050565b600060208201905081810360008301526130bd81613081565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006130fe826124d2565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036131305761312f612b6e565b5b600182019050919050565b600081519050919050565b600082825260208201905092915050565b60006131628261313b565b61316c8185613146565b935061317c818560208601612433565b61318581612466565b840191505092915050565b60006080820190506131a56000830187612567565b6131b26020830186612567565b6131bf60408301856125fd565b81810360608301526131d18184613157565b905095945050505050565b6000815190506131eb81612388565b92915050565b60006020828403121561320757613206612352565b5b6000613215848285016131dc565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613258826124d2565b9150613263836124d2565b9250826132735761327261321e565b5b828204905092915050565b6000613289826124d2565b9150613294836124d2565b9250828210156132a7576132a6612b6e565b5b828203905092915050565b60006132bd826124d2565b91506132c8836124d2565b9250826132d8576132d761321e565b5b82820690509291505056fea2646970667358221220dc8e7b03cd20ad0e4932a58f8bb4e70cc539ee6e24bbcb4f52a99f22f02346df64736f6c634300080d0033
Deployed Bytecode
0x6080604052600436106102045760003560e01c8063715018a611610118578063b88d4fde116100a0578063e222c7f91161006f578063e222c7f914610748578063e985e9c51461075f578063f0293fd31461079c578063f2fde38b146107d9578063f4a0a5281461080257610204565b8063b88d4fde1461068c578063c87b56dd146106b5578063cabadaa0146106f2578063d547cfb71461071d57610204565b806395d89b41116100e757806395d89b41146105b457806398689fb5146105df578063a0712d681461061c578063a22cb46514610638578063ac4c25b21461066157610204565b8063715018a61461050c57806381244d51146105235780638da5cb5b146105605780638fabb4541461058b57610204565b8063270ab52c1161019b57806345c0f5331161016a57806345c0f533146104255780636006a993146104505780636352211e146104675780636817c76c146104a457806370a08231146104cf57610204565b8063270ab52c1461037f57806330176e13146103a857806333bc1c5c146103d157806342842e0e146103fc57610204565b80630aaea7ac116101d75780630aaea7ac146102d757806318160ddd1461030257806323b872dd1461032d57806326203ada1461035657610204565b806301ffc9a71461020957806306fdde0314610246578063081812fc14610271578063095ea7b3146102ae575b600080fd5b34801561021557600080fd5b50610230600480360381019061022b91906123b4565b61082b565b60405161023d91906123fc565b60405180910390f35b34801561025257600080fd5b5061025b6108bd565b60405161026891906124b0565b60405180910390f35b34801561027d57600080fd5b5061029860048036038101906102939190612508565b61094f565b6040516102a59190612576565b60405180910390f35b3480156102ba57600080fd5b506102d560048036038101906102d091906125bd565b6109cb565b005b3480156102e357600080fd5b506102ec610b0c565b6040516102f9919061260c565b60405180910390f35b34801561030e57600080fd5b50610317610b12565b604051610324919061260c565b60405180910390f35b34801561033957600080fd5b50610354600480360381019061034f9190612627565b610b29565b005b34801561036257600080fd5b5061037d60048036038101906103789190612508565b610b39565b005b34801561038b57600080fd5b506103a660048036038101906103a19190612508565b610b4b565b005b3480156103b457600080fd5b506103cf60048036038101906103ca91906127af565b610b5d565b005b3480156103dd57600080fd5b506103e6610b7f565b6040516103f391906123fc565b60405180910390f35b34801561040857600080fd5b50610423600480360381019061041e9190612627565b610b92565b005b34801561043157600080fd5b5061043a610bb2565b604051610447919061260c565b60405180910390f35b34801561045c57600080fd5b50610465610bb8565b005b34801561047357600080fd5b5061048e60048036038101906104899190612508565b610d4c565b60405161049b9190612576565b60405180910390f35b3480156104b057600080fd5b506104b9610d5e565b6040516104c6919061260c565b60405180910390f35b3480156104db57600080fd5b506104f660048036038101906104f191906127f8565b610d64565b604051610503919061260c565b60405180910390f35b34801561051857600080fd5b50610521610df8565b005b34801561052f57600080fd5b5061054a60048036038101906105459190612508565b610e0c565b6040516105579190612576565b60405180910390f35b34801561056c57600080fd5b50610575610e4b565b6040516105829190612576565b60405180910390f35b34801561059757600080fd5b506105b260048036038101906105ad9190612885565b610e75565b005b3480156105c057600080fd5b506105c9610ea1565b6040516105d691906124b0565b60405180910390f35b3480156105eb57600080fd5b50610606600480360381019061060191906127f8565b610f33565b604051610613919061260c565b60405180910390f35b61063660048036038101906106319190612508565b610f4b565b005b34801561064457600080fd5b5061065f600480360381019061065a91906128fe565b611181565b005b34801561066d57600080fd5b506106766112f8565b60405161068391906123fc565b60405180910390f35b34801561069857600080fd5b506106b360048036038101906106ae91906129df565b61130b565b005b3480156106c157600080fd5b506106dc60048036038101906106d79190612508565b61137e565b6040516106e991906124b0565b60405180910390f35b3480156106fe57600080fd5b506107076113b2565b604051610714919061260c565b60405180910390f35b34801561072957600080fd5b506107326113b8565b60405161073f91906124b0565b60405180910390f35b34801561075457600080fd5b5061075d611446565b005b34801561076b57600080fd5b5061078660048036038101906107819190612a62565b61147a565b60405161079391906123fc565b60405180910390f35b3480156107a857600080fd5b506107c360048036038101906107be91906127f8565b61150e565b6040516107d0919061260c565b60405180910390f35b3480156107e557600080fd5b5061080060048036038101906107fb91906127f8565b611526565b005b34801561080e57600080fd5b5061082960048036038101906108249190612508565b6115a9565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061088657506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108b65750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6060600280546108cc90612ad1565b80601f01602080910402602001604051908101604052809291908181526020018280546108f890612ad1565b80156109455780601f1061091a57610100808354040283529160200191610945565b820191906000526020600020905b81548152906001019060200180831161092857829003601f168201915b5050505050905090565b600061095a826115bb565b610990576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109d68261161a565b90508073ffffffffffffffffffffffffffffffffffffffff166109f76116e6565b73ffffffffffffffffffffffffffffffffffffffff1614610a5a57610a2381610a1e6116e6565b61147a565b610a59576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600e5481565b6000610b1c6116ee565b6001546000540303905090565b610b348383836116f3565b505050565b610b41611ab8565b80600e8190555050565b610b53611ab8565b80600d8190555050565b610b65611ab8565b80600a9080519060200190610b7b9291906121e4565b5050565b600f60009054906101000a900460ff1681565b610bad8383836040518060200160405280600081525061130b565b505050565b600c5481565b600260095403610bfd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf490612b4e565b60405180910390fd5b6002600981905550600e54600e54601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610c559190612b9d565b1115610c96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8d90612c3f565b60405180910390fd5b610c9f33611b36565b610cde576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd590612cab565b60405180910390fd5b610cea33600e54611be4565b600e54601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610d3b9190612b9d565b925050819055506001600981905550565b6000610d578261161a565b9050919050565b600b5481565b600080610d7083611c02565b03610da7576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b610e00611ab8565b610e0a6000611c0c565b565b60108181548110610e1c57600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610e7d611ab8565b60106000610e8b919061226a565b818160109190610e9c92919061228b565b505050565b606060038054610eb090612ad1565b80601f0160208091040260200160405190810160405280929190818152602001828054610edc90612ad1565b8015610f295780601f10610efe57610100808354040283529160200191610f29565b820191906000526020600020905b815481529060010190602001808311610f0c57829003601f168201915b5050505050905090565b60126020528060005260406000206000915090505481565b600260095403610f90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8790612b4e565b60405180910390fd5b60026009819055506000610fa2610b12565b9050600f60009054906101000a900460ff16610ff3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fea90612d17565b60405180910390fd5b60008211611036576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102d90612d83565b60405180910390fd5b600c5482826110459190612b9d565b1115611086576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107d90612def565b60405180910390fd5b600d5482601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546110d49190612b9d565b1115611115576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110c90612e5b565b60405180910390fd5b61111f3383611be4565b81601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461116e9190612b9d565b9250508190555050600160098190555050565b6111896116e6565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036111ed576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006111fa6116e6565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166112a76116e6565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516112ec91906123fc565b60405180910390a35050565b600f60019054906101000a900460ff1681565b6113168484846116f3565b60008373ffffffffffffffffffffffffffffffffffffffff163b146113785761134184848484611cd2565b611377576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6060600a61138b83611e22565b60405160200161139c929190612f97565b6040516020818303038152906040529050919050565b600d5481565b600a80546113c590612ad1565b80601f01602080910402602001604051908101604052809291908181526020018280546113f190612ad1565b801561143e5780601f106114135761010080835404028352916020019161143e565b820191906000526020600020905b81548152906001019060200180831161142157829003601f168201915b505050505081565b61144e611ab8565b600f60009054906101000a900460ff1615600f60006101000a81548160ff021916908315150217905550565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60116020528060005260406000206000915090505481565b61152e611ab8565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361159d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159490613038565b60405180910390fd5b6115a681611c0c565b50565b6115b1611ab8565b80600b8190555050565b6000816115c66116ee565b111580156115d5575060005482105b8015611613575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600080829050806116296116ee565b116116af576000548110156116ae5760006004600083815260200190815260200160002054905060007c01000000000000000000000000000000000000000000000000000000008216036116ac575b600081036116a2576004600083600190039350838152602001908152602001600020549050611678565b80925050506116e1565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600033905090565b600090565b60006116fe8261161a565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611765576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006006600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008573ffffffffffffffffffffffffffffffffffffffff166117be6116e6565b73ffffffffffffffffffffffffffffffffffffffff1614806117ed57506117ec866117e76116e6565b61147a565b5b8061182a57506117fb6116e6565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b905080611863576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061186e86611c02565b036118a5576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6118b28686866001611f82565b60006118bd83611c02565b146118f9576006600085815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b6119c087611c02565b1717600460008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841603611a485760006001850190506000600460008381526020019081526020016000205403611a46576000548114611a45578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611ab08686866001611f88565b505050505050565b611ac0611f8e565b73ffffffffffffffffffffffffffffffffffffffff16611ade610e4b565b73ffffffffffffffffffffffffffffffffffffffff1614611b34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2b906130a4565b60405180910390fd5b565b600080600090505b601080549050811015611bd9578273ffffffffffffffffffffffffffffffffffffffff1660108281548110611b7657611b756130c4565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611bc6576001915050611bdf565b8080611bd1906130f3565b915050611b3e565b60009150505b919050565b611bfe828260405180602001604052806000815250611f96565b5050565b6000819050919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611cf86116e6565b8786866040518563ffffffff1660e01b8152600401611d1a9493929190613190565b6020604051808303816000875af1925050508015611d5657506040513d601f19601f82011682018060405250810190611d5391906131f1565b60015b611dcf573d8060008114611d86576040519150601f19603f3d011682016040523d82523d6000602084013e611d8b565b606091505b506000815103611dc7576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060008203611e69576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611f7d565b600082905060005b60008214611e9b578080611e84906130f3565b915050600a82611e94919061324d565b9150611e71565b60008167ffffffffffffffff811115611eb757611eb6612684565b5b6040519080825280601f01601f191660200182016040528015611ee95781602001600182028036833780820191505090505b5090505b60008514611f7657600182611f02919061327e565b9150600a85611f1191906132b2565b6030611f1d9190612b9d565b60f81b818381518110611f3357611f326130c4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611f6f919061324d565b9450611eed565b8093505050505b919050565b50505050565b50505050565b600033905090565b611fa08383612033565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461202e57600080549050600083820390505b611fe06000868380600101945086611cd2565b612016576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110611fcd57816000541461202b57600080fd5b50505b505050565b600080549050600061204484611c02565b0361207b576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082036120b5576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6120c26000848385611f82565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e1612127600184146121da565b901b60a042901b61213785611c02565b1717600460008381526020019081526020016000208190555060005b8080600101915082018473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a482811061215357828201600081905550506121d56000848385611f88565b505050565b6000819050919050565b8280546121f090612ad1565b90600052602060002090601f0160209004810192826122125760008555612259565b82601f1061222b57805160ff1916838001178555612259565b82800160010185558215612259579182015b8281111561225857825182559160200191906001019061223d565b5b509050612266919061232b565b5090565b5080546000825590600052602060002090810190612288919061232b565b50565b82805482825590600052602060002090810192821561231a579160200282015b8281111561231957823573ffffffffffffffffffffffffffffffffffffffff168260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550916020019190600101906122ab565b5b509050612327919061232b565b5090565b5b8082111561234457600081600090555060010161232c565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6123918161235c565b811461239c57600080fd5b50565b6000813590506123ae81612388565b92915050565b6000602082840312156123ca576123c9612352565b5b60006123d88482850161239f565b91505092915050565b60008115159050919050565b6123f6816123e1565b82525050565b600060208201905061241160008301846123ed565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612451578082015181840152602081019050612436565b83811115612460576000848401525b50505050565b6000601f19601f8301169050919050565b600061248282612417565b61248c8185612422565b935061249c818560208601612433565b6124a581612466565b840191505092915050565b600060208201905081810360008301526124ca8184612477565b905092915050565b6000819050919050565b6124e5816124d2565b81146124f057600080fd5b50565b600081359050612502816124dc565b92915050565b60006020828403121561251e5761251d612352565b5b600061252c848285016124f3565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061256082612535565b9050919050565b61257081612555565b82525050565b600060208201905061258b6000830184612567565b92915050565b61259a81612555565b81146125a557600080fd5b50565b6000813590506125b781612591565b92915050565b600080604083850312156125d4576125d3612352565b5b60006125e2858286016125a8565b92505060206125f3858286016124f3565b9150509250929050565b612606816124d2565b82525050565b600060208201905061262160008301846125fd565b92915050565b6000806000606084860312156126405761263f612352565b5b600061264e868287016125a8565b935050602061265f868287016125a8565b9250506040612670868287016124f3565b9150509250925092565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6126bc82612466565b810181811067ffffffffffffffff821117156126db576126da612684565b5b80604052505050565b60006126ee612348565b90506126fa82826126b3565b919050565b600067ffffffffffffffff82111561271a57612719612684565b5b61272382612466565b9050602081019050919050565b82818337600083830152505050565b600061275261274d846126ff565b6126e4565b90508281526020810184848401111561276e5761276d61267f565b5b612779848285612730565b509392505050565b600082601f8301126127965761279561267a565b5b81356127a684826020860161273f565b91505092915050565b6000602082840312156127c5576127c4612352565b5b600082013567ffffffffffffffff8111156127e3576127e2612357565b5b6127ef84828501612781565b91505092915050565b60006020828403121561280e5761280d612352565b5b600061281c848285016125a8565b91505092915050565b600080fd5b600080fd5b60008083601f8401126128455761284461267a565b5b8235905067ffffffffffffffff81111561286257612861612825565b5b60208301915083602082028301111561287e5761287d61282a565b5b9250929050565b6000806020838503121561289c5761289b612352565b5b600083013567ffffffffffffffff8111156128ba576128b9612357565b5b6128c68582860161282f565b92509250509250929050565b6128db816123e1565b81146128e657600080fd5b50565b6000813590506128f8816128d2565b92915050565b6000806040838503121561291557612914612352565b5b6000612923858286016125a8565b9250506020612934858286016128e9565b9150509250929050565b600067ffffffffffffffff82111561295957612958612684565b5b61296282612466565b9050602081019050919050565b600061298261297d8461293e565b6126e4565b90508281526020810184848401111561299e5761299d61267f565b5b6129a9848285612730565b509392505050565b600082601f8301126129c6576129c561267a565b5b81356129d684826020860161296f565b91505092915050565b600080600080608085870312156129f9576129f8612352565b5b6000612a07878288016125a8565b9450506020612a18878288016125a8565b9350506040612a29878288016124f3565b925050606085013567ffffffffffffffff811115612a4a57612a49612357565b5b612a56878288016129b1565b91505092959194509250565b60008060408385031215612a7957612a78612352565b5b6000612a87858286016125a8565b9250506020612a98858286016125a8565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612ae957607f821691505b602082108103612afc57612afb612aa2565b5b50919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000612b38601f83612422565b9150612b4382612b02565b602082019050919050565b60006020820190508181036000830152612b6781612b2b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612ba8826124d2565b9150612bb3836124d2565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612be857612be7612b6e565b5b828201905092915050565b7f416c7265616479206265656e206e617567687479210000000000000000000000600082015250565b6000612c29601583612422565b9150612c3482612bf3565b602082019050919050565b60006020820190508181036000830152612c5881612c1c565b9050919050565b7f596f75206172656e2774206e6175676874792100000000000000000000000000600082015250565b6000612c95601383612422565b9150612ca082612c5f565b602082019050919050565b60006020820190508181036000830152612cc481612c88565b9050919050565b7f5075626c6963204d696e74696e67206973206f6e205061757365000000000000600082015250565b6000612d01601a83612422565b9150612d0c82612ccb565b602082019050919050565b60006020820190508181036000830152612d3081612cf4565b9050919050565b7f43616e74206d696e742030000000000000000000000000000000000000000000600082015250565b6000612d6d600b83612422565b9150612d7882612d37565b602082019050919050565b60006020820190508181036000830152612d9c81612d60565b9050919050565b7f4d696e74696e6720737570706c79206578636565646564000000000000000000600082015250565b6000612dd9601783612422565b9150612de482612da3565b602082019050919050565b60006020820190508181036000830152612e0881612dcc565b9050919050565b7f43616e6e6f74206d696e74206265796f6e64206d6178206d696e742100000000600082015250565b6000612e45601c83612422565b9150612e5082612e0f565b602082019050919050565b60006020820190508181036000830152612e7481612e38565b9050919050565b600081905092915050565b60008190508160005260206000209050919050565b60008154612ea881612ad1565b612eb28186612e7b565b94506001821660008114612ecd5760018114612ede57612f11565b60ff19831686528186019350612f11565b612ee785612e86565b60005b83811015612f0957815481890152600182019150602081019050612eea565b838801955050505b50505092915050565b6000612f2582612417565b612f2f8185612e7b565b9350612f3f818560208601612433565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000612f81600583612e7b565b9150612f8c82612f4b565b600582019050919050565b6000612fa38285612e9b565b9150612faf8284612f1a565b9150612fba82612f74565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613022602683612422565b915061302d82612fc6565b604082019050919050565b6000602082019050818103600083015261305181613015565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061308e602083612422565b915061309982613058565b602082019050919050565b600060208201905081810360008301526130bd81613081565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006130fe826124d2565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036131305761312f612b6e565b5b600182019050919050565b600081519050919050565b600082825260208201905092915050565b60006131628261313b565b61316c8185613146565b935061317c818560208601612433565b61318581612466565b840191505092915050565b60006080820190506131a56000830187612567565b6131b26020830186612567565b6131bf60408301856125fd565b81810360608301526131d18184613157565b905095945050505050565b6000815190506131eb81612388565b92915050565b60006020828403121561320757613206612352565b5b6000613215848285016131dc565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613258826124d2565b9150613263836124d2565b9250826132735761327261321e565b5b828204905092915050565b6000613289826124d2565b9150613294836124d2565b9250828210156132a7576132a6612b6e565b5b828203905092915050565b60006132bd826124d2565b91506132c8836124d2565b9250826132d8576132d761321e565b5b82820690509291505056fea2646970667358221220dc8e7b03cd20ad0e4932a58f8bb4e70cc539ee6e24bbcb4f52a99f22f02346df64736f6c634300080d0033
Deployed Bytecode Sourcemap
163:2630:3:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4874:607:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9784:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11727:200;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11261:405;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;408:26:3;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3957:309:1;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12587:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2071:104:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1662:116;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1784:118;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;441:22;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12817:179:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;328:36:3;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1233:317;;;;;;;;;;;;;:::i;:::-;;9580:142:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;286:36:3;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5540:231:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1809:101:4;;;;;;;;;;;;;:::i;:::-;;492:33:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1179:85:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1908:157:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9946:102:1;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;584:53:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;734:493;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;11994:303:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;469:16:3;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13062:385:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2554:236:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;370:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;254:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2181:87;;;;;;;;;;;;;:::i;:::-;;12363:162:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;532:46:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2059:198:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1556:100:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4874:607:1;4959:4;5269:10;5254:25;;:11;:25;;;;:101;;;;5345:10;5330:25;;:11;:25;;;;5254:101;:177;;;;5421:10;5406:25;;:11;:25;;;;5254:177;5235:196;;4874:607;;;:::o;9784:98::-;9838:13;9870:5;9863:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9784:98;:::o;11727:200::-;11795:7;11819:16;11827:7;11819;:16::i;:::-;11814:64;;11844:34;;;;;;;;;;;;;;11814:64;11896:15;:24;11912:7;11896:24;;;;;;;;;;;;;;;;;;;;;11889:31;;11727:200;;;:::o;11261:405::-;11333:13;11365:27;11384:7;11365:18;:27::i;:::-;11333:61;;11432:5;11409:28;;:19;:17;:19::i;:::-;:28;;;11405:172;;11456:44;11473:5;11480:19;:17;:19::i;:::-;11456:16;:44::i;:::-;11451:126;;11527:35;;;;;;;;;;;;;;11451:126;11405:172;11614:2;11587:15;:24;11603:7;11587:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;11651:7;11647:2;11631:28;;11640:5;11631:28;;;;;;;;;;;;11323:343;11261:405;;:::o;408:26:3:-;;;;:::o;3957:309:1:-;4010:7;4234:15;:13;:15::i;:::-;4219:12;;4203:13;;:28;:46;4196:53;;3957:309;:::o;12587:164::-;12716:28;12726:4;12732:2;12736:7;12716:9;:28::i;:::-;12587:164;;;:::o;2071:104:3:-;1072:13:4;:11;:13::i;:::-;2156:12:3::1;2142:11;:26;;;;2071:104:::0;:::o;1662:116::-;1072:13:4;:11;:13::i;:::-;1757:14:3::1;1741:13;:30;;;;1662:116:::0;:::o;1784:118::-;1072:13:4;:11;:13::i;:::-;1882::3::1;1867:12;:28;;;;;;;;;;;;:::i;:::-;;1784:118:::0;:::o;441:22::-;;;;;;;;;;;;;:::o;12817:179:1:-;12950:39;12967:4;12973:2;12977:7;12950:39;;;;;;;;;;;;:16;:39::i;:::-;12817:179;;;:::o;328:36:3:-;;;;:::o;1233:317::-;1744:1:5;2325:7;;:19;2317:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1744:1;2455:7;:18;;;;1340:11:3::1;;1325;;1292:18;:30;1311:10;1292:30;;;;;;;;;;;;;;;;:44;;;;:::i;:::-;:59;;1284:93;;;;;;;;;;;;:::i;:::-;;;;;;;;;1395:25;1409:10;1395:13;:25::i;:::-;1387:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;1454:34;1464:10;1476:11;;1454:9;:34::i;:::-;1532:11;;1498:18;:30;1517:10;1498:30;;;;;;;;;;;;;;;;:45;;;;;;;:::i;:::-;;;;;;;;1701:1:5::0;2628:7;:22;;;;1233:317:3:o;9580:142:1:-;9644:7;9686:27;9705:7;9686:18;:27::i;:::-;9663:52;;9580:142;;;:::o;286:36:3:-;;;;:::o;5540:231:1:-;5604:7;5655:1;5627:24;5645:5;5627:17;:24::i;:::-;:29;5623:70;;5665:28;;;;;;;;;;;;;;5623:70;1017:13;5710:18;:25;5729:5;5710:25;;;;;;;;;;;;;;;;:54;5703:61;;5540:231;;;:::o;1809:101:4:-;1072:13;:11;:13::i;:::-;1873:30:::1;1900:1;1873:18;:30::i;:::-;1809:101::o:0;492:33:3:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1179:85:4:-;1225:7;1251:6;;;;;;;;;;;1244:13;;1179:85;:::o;1908:157:3:-;1072:13:4;:11;:13::i;:::-;2000:16:3::1;;1993:23;;;;:::i;:::-;2045:13;;2026:16;:32;;;;;;;:::i;:::-;;1908:157:::0;;:::o;9946:102:1:-;10002:13;10034:7;10027:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9946:102;:::o;584:53:3:-;;;;;;;;;;;;;;;;;:::o;734:493::-;1744:1:5;2325:7;;:19;2317:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1744:1;2455:7;:18;;;;807:9:3::1;819:13;:11;:13::i;:::-;807:25;;850:10;;;;;;;;;;;842:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;923:1;909:11;:15;901:39;;;;;;;;;;;;:::i;:::-;;;;;;;;;977:14;;962:11;958:1;:15;;;;:::i;:::-;:33;;950:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;1081:13;;1064:11;1038;:23;1050:10;1038:23;;;;;;;;;;;;;;;;:37;;;;:::i;:::-;1037:57;;1029:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;1138:34;1148:10;1160:11;1138:9;:34::i;:::-;1209:11;1182;:23;1194:10;1182:23;;;;;;;;;;;;;;;;:38;;;;;;;:::i;:::-;;;;;;;;797:430;1701:1:5::0;2628:7;:22;;;;734:493:3;:::o;11994:303:1:-;12104:19;:17;:19::i;:::-;12092:31;;:8;:31;;;12088:61;;12132:17;;;;;;;;;;;;;;12088:61;12212:8;12160:18;:39;12179:19;:17;:19::i;:::-;12160:39;;;;;;;;;;;;;;;:49;12200:8;12160:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;12271:8;12235:55;;12250:19;:17;:19::i;:::-;12235:55;;;12281:8;12235:55;;;;;;:::i;:::-;;;;;;;;11994:303;;:::o;469:16:3:-;;;;;;;;;;;;;:::o;13062:385:1:-;13223:28;13233:4;13239:2;13243:7;13223:9;:28::i;:::-;13283:1;13265:2;:14;;;:19;13261:180;;13303:56;13334:4;13340:2;13344:7;13353:5;13303:30;:56::i;:::-;13298:143;;13386:40;;;;;;;;;;;;;;13298:143;13261:180;13062:385;;;;:::o;2554:236:3:-;2660:13;2732:12;2746:25;2763:7;2746:16;:25::i;:::-;2715:67;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2689:94;;2554:236;;;:::o;370:32::-;;;;:::o;254:26::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;2181:87::-;1072:13:4;:11;:13::i;:::-;2251:10:3::1;;;;;;;;;;;2250:11;2237:10;;:24;;;;;;;;;;;;;;;;;;2181:87::o:0;12363:162:1:-;12460:4;12483:18;:25;12502:5;12483:25;;;;;;;;;;;;;;;:35;12509:8;12483:35;;;;;;;;;;;;;;;;;;;;;;;;;12476:42;;12363:162;;;;:::o;532:46:3:-;;;;;;;;;;;;;;;;;:::o;2059:198:4:-;1072:13;:11;:13::i;:::-;2167:1:::1;2147:22;;:8;:22;;::::0;2139:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;2222:28;2241:8;2222:18;:28::i;:::-;2059:198:::0;:::o;1556:100:3:-;1072:13:4;:11;:13::i;:::-;1639:10:3::1;1627:9;:22;;;;1556:100:::0;:::o;13693:268:1:-;13750:4;13804:7;13785:15;:13;:15::i;:::-;:26;;:65;;;;;13837:13;;13827:7;:23;13785:65;:150;;;;;13934:1;1769:8;13887:17;:26;13905:7;13887:26;;;;;;;;;;;;:43;:48;13785:150;13766:169;;13693:268;;;:::o;7157:1105::-;7224:7;7243:12;7258:7;7243:22;;7323:4;7304:15;:13;:15::i;:::-;:23;7300:898;;7356:13;;7349:4;:20;7345:853;;;7393:14;7410:17;:23;7428:4;7410:23;;;;;;;;;;;;7393:40;;7524:1;1769:8;7497:6;:23;:28;7493:687;;8008:111;8025:1;8015:6;:11;8008:111;;8067:17;:25;8085:6;;;;;;;8067:25;;;;;;;;;;;;8058:34;;8008:111;;;8151:6;8144:13;;;;;;7493:687;7371:827;7345:853;7300:898;8224:31;;;;;;;;;;;;;;7157:1105;;;;:::o;26037:103::-;26097:7;26123:10;26116:17;;26037:103;:::o;3497:90::-;3553:7;3497:90;:::o;17254:2595::-;17364:27;17394;17413:7;17394:18;:27::i;:::-;17364:57;;17477:4;17436:45;;17452:19;17436:45;;;17432:86;;17490:28;;;;;;;;;;;;;;17432:86;17529:23;17555:15;:24;17571:7;17555:24;;;;;;;;;;;;;;;;;;;;;17529:50;;17590:22;17639:4;17616:27;;:19;:17;:19::i;:::-;:27;;;:86;;;;17659:43;17676:4;17682:19;:17;:19::i;:::-;17659:16;:43::i;:::-;17616:86;:140;;;;17737:19;:17;:19::i;:::-;17718:38;;:15;:38;;;17616:140;17590:167;;17773:17;17768:66;;17799:35;;;;;;;;;;;;;;17768:66;17873:1;17848:21;17866:2;17848:17;:21::i;:::-;:26;17844:62;;17883:23;;;;;;;;;;;;;;17844:62;17917:43;17939:4;17945:2;17949:7;17958:1;17917:21;:43::i;:::-;18065:1;18027:34;18045:15;18027:17;:34::i;:::-;:39;18023:101;;18089:15;:24;18105:7;18089:24;;;;;;;;;;;;18082:31;;;;;;;;;;;18023:101;18484:18;:24;18503:4;18484:24;;;;;;;;;;;;;;;;18482:26;;;;;;;;;;;;18552:18;:22;18571:2;18552:22;;;;;;;;;;;;;;;;18550:24;;;;;;;;;;;2041:8;1656:3;18924:15;:41;;18883:21;18901:2;18883:17;:21::i;:::-;:83;:126;18838:17;:26;18856:7;18838:26;;;;;;;;;;;:171;;;;19176:1;2041:8;19126:19;:46;:51;19122:616;;19197:19;19229:1;19219:7;:11;19197:33;;19384:1;19350:17;:30;19368:11;19350:30;;;;;;;;;;;;:35;19346:378;;19486:13;;19471:11;:28;19467:239;;19664:19;19631:17;:30;19649:11;19631:30;;;;;;;;;;;:52;;;;19467:239;19346:378;19179:559;19122:616;19782:7;19778:2;19763:27;;19772:4;19763:27;;;;;;;;;;;;19800:42;19821:4;19827:2;19831:7;19840:1;19800:20;:42::i;:::-;17354:2495;;;17254:2595;;;:::o;1337:130:4:-;1411:12;:10;:12::i;:::-;1400:23;;:7;:5;:7::i;:::-;:23;;;1392:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1337:130::o;2274:274:3:-;2334:4;2350:6;2359:1;2350:10;;2370:150;2381:16;:23;;;;2377:1;:27;2370:150;;;2446:5;2423:28;;:16;2440:1;2423:19;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:28;;;2420:77;;2478:4;2471:11;;;;;2420:77;2506:3;;;;;:::i;:::-;;;;2370:150;;;2536:5;2529:12;;;2274:274;;;;:::o;14040:102:1:-;14108:27;14118:2;14122:8;14108:27;;;;;;;;;;;;:9;:27::i;:::-;14040:102;;:::o;10840:144::-;10904:14;10963:5;10953:15;;10840:144;;;:::o;2411:187:4:-;2484:16;2503:6;;;;;;;;;;;2484:25;;2528:8;2519:6;;:17;;;;;;;;;;;;;;;;;;2582:8;2551:40;;2572:8;2551:40;;;;;;;;;;;;2474:124;2411:187;:::o;23577:697:1:-;23735:4;23780:2;23755:45;;;23801:19;:17;:19::i;:::-;23822:4;23828:7;23837:5;23755:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;23751:517;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24050:1;24033:6;:13;:18;24029:229;;24078:40;;;;;;;;;;;;;;24029:229;24218:6;24212:13;24203:6;24199:2;24195:15;24188:38;23751:517;23921:54;;;23911:64;;;:6;:64;;;;23904:71;;;23577:697;;;;;;:::o;377:703:6:-;433:13;659:1;650:5;:10;646:51;;676:10;;;;;;;;;;;;;;;;;;;;;646:51;706:12;721:5;706:20;;736:14;760:75;775:1;767:4;:9;760:75;;792:8;;;;;:::i;:::-;;;;822:2;814:10;;;;;:::i;:::-;;;760:75;;;844:19;876:6;866:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;844:39;;893:150;909:1;900:5;:10;893:150;;936:1;926:11;;;;;:::i;:::-;;;1002:2;994:5;:10;;;;:::i;:::-;981:2;:24;;;;:::i;:::-;968:39;;951:6;958;951:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1030:2;1021:11;;;;;:::i;:::-;;;893:150;;;1066:6;1052:21;;;;;377:703;;;;:::o;24905:154:1:-;;;;;:::o;25700:153::-;;;;;:::o;640:96:0:-;693:7;719:10;712:17;;640:96;:::o;14516:661:1:-;14634:19;14640:2;14644:8;14634:5;:19::i;:::-;14710:1;14692:2;:14;;;:19;14688:473;;14731:11;14745:13;;14731:27;;14776:13;14798:8;14792:3;:14;14776:30;;14824:229;14854:62;14893:1;14897:2;14901:7;;;;;;14910:5;14854:30;:62::i;:::-;14849:165;;14951:40;;;;;;;;;;;;;;14849:165;15048:3;15040:5;:11;14824:229;;15133:3;15116:13;;:20;15112:34;;15138:8;;;15112:34;14713:448;;14688:473;14516:661;;;:::o;15438:1574::-;15502:20;15525:13;;15502:36;;15577:1;15552:21;15570:2;15552:17;:21::i;:::-;:26;15548:58;;15587:19;;;;;;;;;;;;;;15548:58;15632:1;15620:8;:13;15616:44;;15642:18;;;;;;;;;;;;;;15616:44;15671:61;15701:1;15705:2;15709:12;15723:8;15671:21;:61::i;:::-;16264:1;1151:2;16235:1;:25;;16234:31;16222:8;:44;16196:18;:22;16215:2;16196:22;;;;;;;;;;;;;;;;:70;;;;;;;;;;;1909:3;16655:29;16682:1;16670:8;:13;16655:14;:29::i;:::-;:56;;1656:3;16593:15;:41;;16552:21;16570:2;16552:17;:21::i;:::-;:83;:160;16502:17;:31;16520:12;16502:31;;;;;;;;;;;:210;;;;16727:14;16755:117;16821:8;;;;;;16806:12;:23;16802:2;16781:49;;16798:1;16781:49;;;;;;;;;;;;16862:8;16853:6;:17;16755:117;;16917:8;16902:12;:23;16886:13;:39;;;;15979:957;16945:60;16974:1;16978:2;16982:12;16996:8;16945:20;:60::i;:::-;15492:1520;15438:1574;;:::o;11066:138::-;11124:14;11183:5;11173:15;;11066:138;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:7:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::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:118::-;5025:24;5043:5;5025:24;:::i;:::-;5020:3;5013:37;4938:118;;:::o;5062:222::-;5155:4;5193:2;5182:9;5178:18;5170:26;;5206:71;5274:1;5263:9;5259:17;5250:6;5206:71;:::i;:::-;5062:222;;;;:::o;5290:619::-;5367:6;5375;5383;5432:2;5420:9;5411:7;5407:23;5403:32;5400:119;;;5438:79;;:::i;:::-;5400:119;5558:1;5583:53;5628:7;5619:6;5608:9;5604:22;5583:53;:::i;:::-;5573:63;;5529:117;5685:2;5711:53;5756:7;5747:6;5736:9;5732:22;5711:53;:::i;:::-;5701:63;;5656:118;5813:2;5839:53;5884:7;5875:6;5864:9;5860:22;5839:53;:::i;:::-;5829:63;;5784:118;5290:619;;;;;:::o;5915:117::-;6024:1;6021;6014:12;6038:117;6147:1;6144;6137:12;6161:180;6209:77;6206:1;6199:88;6306:4;6303:1;6296:15;6330:4;6327:1;6320:15;6347:281;6430:27;6452:4;6430:27;:::i;:::-;6422:6;6418:40;6560:6;6548:10;6545:22;6524:18;6512:10;6509:34;6506:62;6503:88;;;6571:18;;:::i;:::-;6503:88;6611:10;6607:2;6600:22;6390:238;6347:281;;:::o;6634:129::-;6668:6;6695:20;;:::i;:::-;6685:30;;6724:33;6752:4;6744:6;6724:33;:::i;:::-;6634:129;;;:::o;6769:308::-;6831:4;6921:18;6913:6;6910:30;6907:56;;;6943:18;;:::i;:::-;6907:56;6981:29;7003:6;6981:29;:::i;:::-;6973:37;;7065:4;7059;7055:15;7047:23;;6769:308;;;:::o;7083:154::-;7167:6;7162:3;7157;7144:30;7229:1;7220:6;7215:3;7211:16;7204:27;7083:154;;;:::o;7243:412::-;7321:5;7346:66;7362:49;7404:6;7362:49;:::i;:::-;7346:66;:::i;:::-;7337:75;;7435:6;7428:5;7421:21;7473:4;7466:5;7462:16;7511:3;7502:6;7497:3;7493:16;7490:25;7487:112;;;7518:79;;:::i;:::-;7487:112;7608:41;7642:6;7637:3;7632;7608:41;:::i;:::-;7327:328;7243:412;;;;;:::o;7675:340::-;7731:5;7780:3;7773:4;7765:6;7761:17;7757:27;7747:122;;7788:79;;:::i;:::-;7747:122;7905:6;7892:20;7930:79;8005:3;7997:6;7990:4;7982:6;7978:17;7930:79;:::i;:::-;7921:88;;7737:278;7675:340;;;;:::o;8021:509::-;8090:6;8139:2;8127:9;8118:7;8114:23;8110:32;8107:119;;;8145:79;;:::i;:::-;8107:119;8293:1;8282:9;8278:17;8265:31;8323:18;8315:6;8312:30;8309:117;;;8345:79;;:::i;:::-;8309:117;8450:63;8505:7;8496:6;8485:9;8481:22;8450:63;:::i;:::-;8440:73;;8236:287;8021:509;;;;:::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:117::-;8980:1;8977;8970:12;8994:117;9103:1;9100;9093:12;9134:568;9207:8;9217:6;9267:3;9260:4;9252:6;9248:17;9244:27;9234:122;;9275:79;;:::i;:::-;9234:122;9388:6;9375:20;9365:30;;9418:18;9410:6;9407:30;9404:117;;;9440:79;;:::i;:::-;9404:117;9554:4;9546:6;9542:17;9530:29;;9608:3;9600:4;9592:6;9588:17;9578:8;9574:32;9571:41;9568:128;;;9615:79;;:::i;:::-;9568:128;9134:568;;;;;:::o;9708:559::-;9794:6;9802;9851:2;9839:9;9830:7;9826:23;9822:32;9819:119;;;9857:79;;:::i;:::-;9819:119;10005:1;9994:9;9990:17;9977:31;10035:18;10027:6;10024:30;10021:117;;;10057:79;;:::i;:::-;10021:117;10170:80;10242:7;10233:6;10222:9;10218:22;10170:80;:::i;:::-;10152:98;;;;9948:312;9708:559;;;;;:::o;10273:116::-;10343:21;10358:5;10343:21;:::i;:::-;10336:5;10333:32;10323:60;;10379:1;10376;10369:12;10323:60;10273:116;:::o;10395:133::-;10438:5;10476:6;10463:20;10454:29;;10492:30;10516:5;10492:30;:::i;:::-;10395:133;;;;:::o;10534:468::-;10599:6;10607;10656:2;10644:9;10635:7;10631:23;10627:32;10624:119;;;10662:79;;:::i;:::-;10624:119;10782:1;10807:53;10852:7;10843:6;10832:9;10828:22;10807:53;:::i;:::-;10797:63;;10753:117;10909:2;10935:50;10977:7;10968:6;10957:9;10953:22;10935:50;:::i;:::-;10925:60;;10880:115;10534:468;;;;;:::o;11008:307::-;11069:4;11159:18;11151:6;11148:30;11145:56;;;11181:18;;:::i;:::-;11145:56;11219:29;11241:6;11219:29;:::i;:::-;11211:37;;11303:4;11297;11293:15;11285:23;;11008:307;;;:::o;11321:410::-;11398:5;11423:65;11439:48;11480:6;11439:48;:::i;:::-;11423:65;:::i;:::-;11414:74;;11511:6;11504:5;11497:21;11549:4;11542:5;11538:16;11587:3;11578:6;11573:3;11569:16;11566:25;11563:112;;;11594:79;;:::i;:::-;11563:112;11684:41;11718:6;11713:3;11708;11684:41;:::i;:::-;11404:327;11321:410;;;;;:::o;11750:338::-;11805:5;11854:3;11847:4;11839:6;11835:17;11831:27;11821:122;;11862:79;;:::i;:::-;11821:122;11979:6;11966:20;12004:78;12078:3;12070:6;12063:4;12055:6;12051:17;12004:78;:::i;:::-;11995:87;;11811:277;11750:338;;;;:::o;12094:943::-;12189:6;12197;12205;12213;12262:3;12250:9;12241:7;12237:23;12233:33;12230:120;;;12269:79;;:::i;:::-;12230:120;12389:1;12414:53;12459:7;12450:6;12439:9;12435:22;12414:53;:::i;:::-;12404:63;;12360:117;12516:2;12542:53;12587:7;12578:6;12567:9;12563:22;12542:53;:::i;:::-;12532:63;;12487:118;12644:2;12670:53;12715:7;12706:6;12695:9;12691:22;12670:53;:::i;:::-;12660:63;;12615:118;12800:2;12789:9;12785:18;12772:32;12831:18;12823:6;12820:30;12817:117;;;12853:79;;:::i;:::-;12817:117;12958:62;13012:7;13003:6;12992:9;12988:22;12958:62;:::i;:::-;12948:72;;12743:287;12094:943;;;;;;;:::o;13043:474::-;13111:6;13119;13168:2;13156:9;13147:7;13143:23;13139:32;13136:119;;;13174:79;;:::i;:::-;13136:119;13294:1;13319:53;13364:7;13355:6;13344:9;13340:22;13319:53;:::i;:::-;13309:63;;13265:117;13421:2;13447:53;13492:7;13483:6;13472:9;13468:22;13447:53;:::i;:::-;13437:63;;13392:118;13043:474;;;;;:::o;13523:180::-;13571:77;13568:1;13561:88;13668:4;13665:1;13658:15;13692:4;13689:1;13682:15;13709:320;13753:6;13790:1;13784:4;13780:12;13770:22;;13837:1;13831:4;13827:12;13858:18;13848:81;;13914:4;13906:6;13902:17;13892:27;;13848:81;13976:2;13968:6;13965:14;13945:18;13942:38;13939:84;;13995:18;;:::i;:::-;13939:84;13760:269;13709:320;;;:::o;14035:181::-;14175:33;14171:1;14163:6;14159:14;14152:57;14035:181;:::o;14222:366::-;14364:3;14385:67;14449:2;14444:3;14385:67;:::i;:::-;14378:74;;14461:93;14550:3;14461:93;:::i;:::-;14579:2;14574:3;14570:12;14563:19;;14222:366;;;:::o;14594:419::-;14760:4;14798:2;14787:9;14783:18;14775:26;;14847:9;14841:4;14837:20;14833:1;14822:9;14818:17;14811:47;14875:131;15001:4;14875:131;:::i;:::-;14867:139;;14594:419;;;:::o;15019:180::-;15067:77;15064:1;15057:88;15164:4;15161:1;15154:15;15188:4;15185:1;15178:15;15205:305;15245:3;15264:20;15282:1;15264:20;:::i;:::-;15259:25;;15298:20;15316:1;15298:20;:::i;:::-;15293:25;;15452:1;15384:66;15380:74;15377:1;15374:81;15371:107;;;15458:18;;:::i;:::-;15371:107;15502:1;15499;15495:9;15488:16;;15205:305;;;;:::o;15516:171::-;15656:23;15652:1;15644:6;15640:14;15633:47;15516:171;:::o;15693:366::-;15835:3;15856:67;15920:2;15915:3;15856:67;:::i;:::-;15849:74;;15932:93;16021:3;15932:93;:::i;:::-;16050:2;16045:3;16041:12;16034:19;;15693:366;;;:::o;16065:419::-;16231:4;16269:2;16258:9;16254:18;16246:26;;16318:9;16312:4;16308:20;16304:1;16293:9;16289:17;16282:47;16346:131;16472:4;16346:131;:::i;:::-;16338:139;;16065:419;;;:::o;16490:169::-;16630:21;16626:1;16618:6;16614:14;16607:45;16490:169;:::o;16665:366::-;16807:3;16828:67;16892:2;16887:3;16828:67;:::i;:::-;16821:74;;16904:93;16993:3;16904:93;:::i;:::-;17022:2;17017:3;17013:12;17006:19;;16665:366;;;:::o;17037:419::-;17203:4;17241:2;17230:9;17226:18;17218:26;;17290:9;17284:4;17280:20;17276:1;17265:9;17261:17;17254:47;17318:131;17444:4;17318:131;:::i;:::-;17310:139;;17037:419;;;:::o;17462:176::-;17602:28;17598:1;17590:6;17586:14;17579:52;17462:176;:::o;17644:366::-;17786:3;17807:67;17871:2;17866:3;17807:67;:::i;:::-;17800:74;;17883:93;17972:3;17883:93;:::i;:::-;18001:2;17996:3;17992:12;17985:19;;17644:366;;;:::o;18016:419::-;18182:4;18220:2;18209:9;18205:18;18197:26;;18269:9;18263:4;18259:20;18255:1;18244:9;18240:17;18233:47;18297:131;18423:4;18297:131;:::i;:::-;18289:139;;18016:419;;;:::o;18441:161::-;18581:13;18577:1;18569:6;18565:14;18558:37;18441:161;:::o;18608:366::-;18750:3;18771:67;18835:2;18830:3;18771:67;:::i;:::-;18764:74;;18847:93;18936:3;18847:93;:::i;:::-;18965:2;18960:3;18956:12;18949:19;;18608:366;;;:::o;18980:419::-;19146:4;19184:2;19173:9;19169:18;19161:26;;19233:9;19227:4;19223:20;19219:1;19208:9;19204:17;19197:47;19261:131;19387:4;19261:131;:::i;:::-;19253:139;;18980:419;;;:::o;19405:173::-;19545:25;19541:1;19533:6;19529:14;19522:49;19405:173;:::o;19584:366::-;19726:3;19747:67;19811:2;19806:3;19747:67;:::i;:::-;19740:74;;19823:93;19912:3;19823:93;:::i;:::-;19941:2;19936:3;19932:12;19925:19;;19584:366;;;:::o;19956:419::-;20122:4;20160:2;20149:9;20145:18;20137:26;;20209:9;20203:4;20199:20;20195:1;20184:9;20180:17;20173:47;20237:131;20363:4;20237:131;:::i;:::-;20229:139;;19956:419;;;:::o;20381:178::-;20521:30;20517:1;20509:6;20505:14;20498:54;20381:178;:::o;20565:366::-;20707:3;20728:67;20792:2;20787:3;20728:67;:::i;:::-;20721:74;;20804:93;20893:3;20804:93;:::i;:::-;20922:2;20917:3;20913:12;20906:19;;20565:366;;;:::o;20937:419::-;21103:4;21141:2;21130:9;21126:18;21118:26;;21190:9;21184:4;21180:20;21176:1;21165:9;21161:17;21154:47;21218:131;21344:4;21218:131;:::i;:::-;21210:139;;20937:419;;;:::o;21362:148::-;21464:11;21501:3;21486:18;;21362:148;;;;:::o;21516:141::-;21565:4;21588:3;21580:11;;21611:3;21608:1;21601:14;21645:4;21642:1;21632:18;21624:26;;21516:141;;;:::o;21687:845::-;21790:3;21827:5;21821:12;21856:36;21882:9;21856:36;:::i;:::-;21908:89;21990:6;21985:3;21908:89;:::i;:::-;21901:96;;22028:1;22017:9;22013:17;22044:1;22039:137;;;;22190:1;22185:341;;;;22006:520;;22039:137;22123:4;22119:9;22108;22104:25;22099:3;22092:38;22159:6;22154:3;22150:16;22143:23;;22039:137;;22185:341;22252:38;22284:5;22252:38;:::i;:::-;22312:1;22326:154;22340:6;22337:1;22334:13;22326:154;;;22414:7;22408:14;22404:1;22399:3;22395:11;22388:35;22464:1;22455:7;22451:15;22440:26;;22362:4;22359:1;22355:12;22350:17;;22326:154;;;22509:6;22504:3;22500:16;22493:23;;22192:334;;22006:520;;21794:738;;21687:845;;;;:::o;22538:377::-;22644:3;22672:39;22705:5;22672:39;:::i;:::-;22727:89;22809:6;22804:3;22727:89;:::i;:::-;22720:96;;22825:52;22870:6;22865:3;22858:4;22851:5;22847:16;22825:52;:::i;:::-;22902:6;22897:3;22893:16;22886:23;;22648:267;22538:377;;;;:::o;22921:155::-;23061:7;23057:1;23049:6;23045:14;23038:31;22921:155;:::o;23082:400::-;23242:3;23263:84;23345:1;23340:3;23263:84;:::i;:::-;23256:91;;23356:93;23445:3;23356:93;:::i;:::-;23474:1;23469:3;23465:11;23458:18;;23082:400;;;:::o;23488:695::-;23766:3;23788:92;23876:3;23867:6;23788:92;:::i;:::-;23781:99;;23897:95;23988:3;23979:6;23897:95;:::i;:::-;23890:102;;24009:148;24153:3;24009:148;:::i;:::-;24002:155;;24174:3;24167:10;;23488:695;;;;;:::o;24189:225::-;24329:34;24325:1;24317:6;24313:14;24306:58;24398:8;24393:2;24385:6;24381:15;24374:33;24189:225;:::o;24420:366::-;24562:3;24583:67;24647:2;24642:3;24583:67;:::i;:::-;24576:74;;24659:93;24748:3;24659:93;:::i;:::-;24777:2;24772:3;24768:12;24761:19;;24420:366;;;:::o;24792:419::-;24958:4;24996:2;24985:9;24981:18;24973:26;;25045:9;25039:4;25035:20;25031:1;25020:9;25016:17;25009:47;25073:131;25199:4;25073:131;:::i;:::-;25065:139;;24792:419;;;:::o;25217:182::-;25357:34;25353:1;25345:6;25341:14;25334:58;25217:182;:::o;25405:366::-;25547:3;25568:67;25632:2;25627:3;25568:67;:::i;:::-;25561:74;;25644:93;25733:3;25644:93;:::i;:::-;25762:2;25757:3;25753:12;25746:19;;25405:366;;;:::o;25777:419::-;25943:4;25981:2;25970:9;25966:18;25958:26;;26030:9;26024:4;26020:20;26016:1;26005:9;26001:17;25994:47;26058:131;26184:4;26058:131;:::i;:::-;26050:139;;25777:419;;;:::o;26202:180::-;26250:77;26247:1;26240:88;26347:4;26344:1;26337:15;26371:4;26368:1;26361:15;26388:233;26427:3;26450:24;26468:5;26450:24;:::i;:::-;26441:33;;26496:66;26489:5;26486:77;26483:103;;26566:18;;:::i;:::-;26483:103;26613:1;26606:5;26602:13;26595:20;;26388:233;;;:::o;26627:98::-;26678:6;26712:5;26706:12;26696:22;;26627:98;;;:::o;26731:168::-;26814:11;26848:6;26843:3;26836:19;26888:4;26883:3;26879:14;26864:29;;26731:168;;;;:::o;26905:360::-;26991:3;27019:38;27051:5;27019:38;:::i;:::-;27073:70;27136:6;27131:3;27073:70;:::i;:::-;27066:77;;27152:52;27197:6;27192:3;27185:4;27178:5;27174:16;27152:52;:::i;:::-;27229:29;27251:6;27229:29;:::i;:::-;27224:3;27220:39;27213:46;;26995:270;26905:360;;;;:::o;27271:640::-;27466:4;27504:3;27493:9;27489:19;27481:27;;27518:71;27586:1;27575:9;27571:17;27562:6;27518:71;:::i;:::-;27599:72;27667:2;27656:9;27652:18;27643:6;27599:72;:::i;:::-;27681;27749:2;27738:9;27734:18;27725:6;27681:72;:::i;:::-;27800:9;27794:4;27790:20;27785:2;27774:9;27770:18;27763:48;27828:76;27899:4;27890:6;27828:76;:::i;:::-;27820:84;;27271:640;;;;;;;:::o;27917:141::-;27973:5;28004:6;27998:13;27989:22;;28020:32;28046:5;28020:32;:::i;:::-;27917:141;;;;:::o;28064:349::-;28133:6;28182:2;28170:9;28161:7;28157:23;28153:32;28150:119;;;28188:79;;:::i;:::-;28150:119;28308:1;28333:63;28388:7;28379:6;28368:9;28364:22;28333:63;:::i;:::-;28323:73;;28279:127;28064:349;;;;:::o;28419:180::-;28467:77;28464:1;28457:88;28564:4;28561:1;28554:15;28588:4;28585:1;28578:15;28605:185;28645:1;28662:20;28680:1;28662:20;:::i;:::-;28657:25;;28696:20;28714:1;28696:20;:::i;:::-;28691:25;;28735:1;28725:35;;28740:18;;:::i;:::-;28725:35;28782:1;28779;28775:9;28770:14;;28605:185;;;;:::o;28796:191::-;28836:4;28856:20;28874:1;28856:20;:::i;:::-;28851:25;;28890:20;28908:1;28890:20;:::i;:::-;28885:25;;28929:1;28926;28923:8;28920:34;;;28934:18;;:::i;:::-;28920:34;28979:1;28976;28972:9;28964:17;;28796:191;;;;:::o;28993:176::-;29025:1;29042:20;29060:1;29042:20;:::i;:::-;29037:25;;29076:20;29094:1;29076:20;:::i;:::-;29071:25;;29115:1;29105:35;;29120:18;;:::i;:::-;29105:35;29161:1;29158;29154:9;29149:14;;28993:176;;;;:::o
Swarm Source
ipfs://dc8e7b03cd20ad0e4932a58f8bb4e70cc539ee6e24bbcb4f52a99f22f02346df
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.