ERC-721
NFT
Overview
Max Total Supply
0 IPT
Holders
456
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
2 IPTLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Hootbirds
Compiler Version
v0.8.14+commit.80d49f37
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT /* + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + . .^!!~: .^!!^. . . :7Y5Y7^. .^!J5Y7^. . . :!5B#GY7^. .^!JP##P7: . . 7777??! ~????7. :5@@@@&GY7^. .^!JG#@@@@G^ 7????????????^ ~????77 . . @@@@@G P@@@@@: J#@@@@@@@@@@&G57~. .^7YG#@@@@@@@@@@&5: #@@@@@@@@@@@@@? P@@@@@@ . . @@@@@G 5@@@@@: :B@@@@@BJG@@@@@@@@@&B5?~:^7YG#@@@@@@@@BJP@@@ @@&!! #@@@@@@@@@@@@@? P@@@@@@ . . @@@@@G 5@@@@@: .B@@@@#!!J@@@@@@@@@@@@@@@&@@@@@@@@@@@@@@@P ^G@@@@@~. ^~~~~~^J@ @@@@??:~~~~~ . . @@@@@B^^^^^^^^. 5@@@@@: J@@@@&^ G@7?@@@@@@&@@@@@@@@@@@&@J7&@@@@@#. .B@@@@P !@@@@@? . . @@@@@@@@@@@@@@! 5@@@@@: 5@@@@B ^B&&@@@@@#!#@@@@@@@@@@7G&&@@@@@#! Y@@@@#. !@@@@@? . . @@@@@@@@@@@@@@! P@@@@@: ?@@@@&^ !YPGPY! !@@@@@Y&@@@@Y ~YPGP57. .B@@@@P !@@@@@? . . @@@@@B~~~~~~~!!.?GPPGP: .B@@@@&7 ?&@@@@P ?@@@@@5. ~B@@@@&^ !@@@@@? . . @@@@@G ^~~~~~. :G@@@@@BY7~^^~75#@@@@@5. J@@@@@&P?~^^^!JG@@@@@#~ !@@@@@? . . @@@@@G 5@@@@@: ?B@@@@@@@@@@@@@@@@B!! ^P@@@@@@@@@@@@@@@@&Y !@@@@@? . . @@@@@G. P@@@@@: !YB&@@@@@@@@&BY~ ^JG#@@@@@@@@&#P7. !@@@@@? . . YYYYY7 !YJJJJ. :~!7??7!^: .^!7??7!~: ^YJJJY~ . . . . . . . . ……………… ………………………………………… ………………………………………… . . PBGGB?? 7&######&5 :B##############&5 .G#################^ . . &@@@@5 ?@@@@@@@@@@ :@@@@@@@@@@@@@@@@@G &@@@@@@@@@@@@ @@@@@^ . . PBBBBJ !!!!!JPPPPPPPPPY !!!!! :&@@@@P?JJJJJJJJJJJJJJ? :JJJJJJJJJJJJJJJJJJJJJJ. . . ~~~~~: .#@@@@Y ~@@@@@~ :&@@@@7 ~@@@&. ^@@@@. . . #@@@@Y .#@@@@G?JJJJJJJJ?5@@@@@~ :&@@@@7 !JJJJJJJJJJJJ? :JJJJJJJJJJJJJJJJJ!! . . #@@@@Y .#@@@@@@@@@@@@@@@@@@@@@@~ :&@@@@7 G@@@@@@@@G &@@ @@@@@@@@@@P . . #@@@@Y .#@@@@&##########&@@@@@~ :&@@@@7 7YYYYYYYYJ???7 JYYYYYYYYYYYYJ???7 . . #@@@@Y .#@@@@5 ........ !@@@@@~ :&@@@@7 ~@@@&. !@@@# . . #@@@@#5PPPPPPPPPJJ .#@@@@Y !@@@@@~ :&@@@@P7??????????JYY5J .?????????? ???????JYY5J . . &@@@@@@@@@@@@@@@@@ .#@@@@Y !@@@@@~ :&@@@@@@@@@@@@@@@@@G ^@@@@@@@@@@@@@@@@@P . . PBBBBBBBBBBBBBBBBY .#@@@@Y !@@@@@~ :&@@@@@@@@@@@@@@@@@G ^@@@@@@@@@@@@@@@ @@5 . + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + */ pragma solidity ^0.8.0; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/security/ReentrancyGuard.sol"; import "@openzeppelin/contracts/token/ERC721/ERC721.sol"; import "@openzeppelin/contracts/utils/Strings.sol"; import "@openzeppelin/contracts/security/Pausable.sol"; /** * @title Crypto * @author HootLabs */ contract Crypto { bytes constant ALPHABET = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'; /** * @notice base58 is used to calculate the base58 encoded value of given bytes. * This algorithm was migrated from github.com/mr-tron/base58 to solidity by our developers. * Note that it is not yet optimized for gas, so please use it only in read-only scenarios. * @param data_ bytes. * @return base58 encoded results. */ function base58(bytes memory data_) public pure returns (bytes memory){ uint256 size = data_.length; uint256 zeroCount; while (zeroCount < size && data_[zeroCount] == 0) { zeroCount++; } size = zeroCount + (size - zeroCount)*8351/6115+1; bytes memory slot = new bytes(size); uint32 carry; int256 m; int256 high = int256(size) - 1; for (uint256 i = 0; i < data_.length; i++) { m = int256(size - 1); for (carry = uint8(data_[i]); m > high || carry != 0; m--) { carry = carry + 256 * uint8(slot[uint256(m)]); slot[uint256(m)] = bytes1(uint8(carry % 58)); carry /= 58; } high = m; } uint256 n; for (n = zeroCount; n < size && slot[n] == 0; n++) {} size = slot.length - (n - zeroCount); bytes memory out = new bytes(size); for (uint256 i = 0; i < size; i++) { uint256 j = i + n - zeroCount; out[i] = ALPHABET[uint8(slot[j])]; } return out; } /** * @notice cidv0 is used to convert sha256 hash to cid(v0) used by IPFS. * @param sha256Hash_ sha256 hash generated by anything. * @return IPFS cid that meets the version0 specification. */ function cidv0(bytes32 sha256Hash_) public pure returns (string memory) { bytes memory hashString = new bytes(34); hashString[0] = 0x12; hashString[1] = 0x20; for (uint256 i = 0; i < sha256Hash_.length; i++) { hashString[i+2] = sha256Hash_[i]; } return string(base58(hashString)); } } /** * @title Hootbirds * @author HootLabs */ contract Hootbirds is Ownable, ReentrancyGuard, Pausable, ERC721, Crypto { using Strings for uint256; event ProvenanceUpdated(string procenance); event MaintainerAddressChanged(address indexed maintainer); event BaseURIChanged(string url); event TokenHashChanged(uint256 indexed tokenId, bytes32 oldTokenHash, bytes32 newTokenHash); event INKEPASSMapURIChanged(string url); event AirdropTimeChanged(uint256 airdropTime); event RevealTimeChanged(uint256 revealTime); event Revealed(); event Deposit(address indexed account, uint256 amount); event Withdraw(address indexed account, uint256 amount); event ContractParsed(); event ContractUnparsed(); event ContractSealed(); uint256 public constant MAX_SUPPLY = 1111; string public provenance; string public inkepassMapURI; string private _placeholderURI; string private _collectionURI; address public maintainerAddress; uint256 public airdropTime = 1; // start time to air-drop uint256 public revealTime = 1; // start time to reveal uint64 public mintedNumber = 0; bool public contractSealed = false; bool public revealed = false; uint256[MAX_SUPPLY] internal _randIndices; // Used to generate random tokenids mapping(uint256 => bytes32) private _tokenHashes; constructor(string memory placeholderURI_) ERC721("Hootbirds", "IPT") { _placeholderURI = placeholderURI_; } /***********************************| | Provenance | |__________________________________*/ function setProvenance(string calldata provenance_) external onlyOwner { provenance = provenance_; emit ProvenanceUpdated(provenance_); } /***********************************| | Config | |__________________________________*/ /** * @notice setMaintainerAddress is used to allow the issuer to modify the maintainerAddress */ function setMaintainerAddress(address maintainerAddress_) external onlyOwner { maintainerAddress = maintainerAddress_; emit MaintainerAddressChanged(maintainerAddress_); } function setAirdropTime(uint256 airdropTime_) external onlyOwner { airdropTime = airdropTime_; emit AirdropTimeChanged(airdropTime_); } function isAirdropEnabled() public view returns (bool) { return airdropTime > 1 && block.timestamp > airdropTime; } function setRevealTime(uint256 revealTime_) external onlyOwner { revealTime = revealTime_; emit RevealTimeChanged(revealTime_); } /** * @notice return is revealed */ function isRevealEnabled() public view returns (bool) { return revealTime > 1 && block.timestamp > revealTime; } function setPlaceholderURI(string calldata uri_) external onlyOwner { require(!revealed, "already revealed, can not set placeholder uri"); _placeholderURI = uri_; emit BaseURIChanged(uri_); } /** * @notice set the nft metadata * This process is under the supervision of the community. */ function setCollectionURI(string calldata uri_) external onlyOwner { _collectionURI = uri_; if (revealed) { emit BaseURIChanged(uri_); } } function _baseURI() internal view virtual override returns (string memory) { return _collectionURI; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "query for nonexistent token"); if (!revealed) { return _placeholderURI; } bytes32 hash = _tokenHashes[tokenId]; if (hash == "") { string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } return string(abi.encodePacked("ipfs://", cidv0(hash))); } /** * set the ipfs url to reach a consensus about the INKEPASS MAP data */ function setINKEPASSMapURI(string calldata uri_) external onlyOwner { inkepassMapURI = uri_; emit INKEPASSMapURIChanged(uri_); } /** * @notice setTokenHash is used to set the ipfs hash of the token * This process is under the supervision of the community. */ function setTokenHash(uint256 tokenId_, bytes32 tokenHash_) public atLeastMaintainer { bytes32 oldTokenHash = _tokenHashes[tokenId_]; _tokenHashes[tokenId_] = tokenHash_; emit TokenHashChanged(tokenId_, oldTokenHash, tokenHash_); } /** * @notice similar to setTokenHash, but in bulk */ function batchSetTokenHash(uint256[] calldata tokenIds_, bytes32[] calldata tokenHashes_) external atLeastMaintainer { require(tokenIds_.length == tokenHashes_.length, "tokenIds_ and tokenHashes_ length mismatch"); require(tokenIds_.length > 0, "no tokenId"); for (uint256 i = 0; i < tokenIds_.length; i++) { setTokenHash(tokenIds_[i], tokenHashes_[i]); } } /***********************************| | Core | |__________________________________*/ /** * airdrop Hootbirds NFT to receivers who has INKEPASS. */ function airdrop( address[] calldata receivers_, uint16[] calldata amounts_ ) external onlyOwner nonReentrant { require( receivers_.length == amounts_.length, "the length of Listing Receiver is different from that of Listing Amounts" ); require(isAirdropEnabled(), "airdrop is not enabled"); require(mintedNumber < MAX_SUPPLY, "airdrop is already completed"); unchecked { for (uint64 i=0; i < receivers_.length; ++i) { airdropToReceiver(receivers_[i], amounts_[i]); } } } function airdropToReceiver(address receiverAddr_, uint16 amount_) internal { require(amount_ > 0, "mint amount is zero"); unchecked { require( mintedNumber + amount_ <= MAX_SUPPLY, "minted number is out of MAX_SUPPLY" ); do { uint256 tokenId = genRandomTokenId(); _mint(receiverAddr_, tokenId); --amount_; ++mintedNumber; } while (amount_ > 0); } } /** * mint first Hootbirds NFT, then it will be shown on NFT marketplaces. */ function openUpWastedland() external onlyOwner nonReentrant{ require(mintedNumber==0, "already opened up wastedland"); changePos(MAX_SUPPLY-1, 0); _safeMint(_msgSender(), 1); ++mintedNumber; } /** * @notice Flip token metadata to revealed * @dev Can only be revealed after airdrop already been completed */ function reveal() external onlyOwner nonReentrant { require(!revealed, "already revealed"); require(mintedNumber == MAX_SUPPLY, "airdrop is not finished yet"); require(isRevealEnabled(), "reveal is not enabled"); revealed = true; emit BaseURIChanged(_baseURI()); emit Revealed(); } /** * @notice issuer deposit ETH into the contract. only issuer have permission */ function deposit() external payable onlyOwner nonReentrant { emit Deposit(_msgSender(), msg.value); } /** * issuer withdraws the ETH temporarily stored in the contract through this method. */ function withdraw() external onlyOwner nonReentrant { uint256 balance = address(this).balance; payable(_msgSender()).transfer(balance); emit Withdraw(_msgSender(), balance); } /** * @notice issuer have permission to burn token. * @param tokenIds_ list of tokenId */ function burn(uint256[] calldata tokenIds_) external onlyOwner nonReentrant { for (uint256 i = 0; i < tokenIds_.length; i++) { uint256 tokenId = tokenIds_[i]; require(ownerOf(tokenId) == _msgSender(), "caller is not owner"); _burn(tokenId); } } /***********************************| | RandomTokenId | |__________________________________*/ function genRandomTokenId() internal returns (uint256) { unchecked { uint256 remain = MAX_SUPPLY - mintedNumber; return changePos(remain-1, unsafeRandom() % remain); } } function changePos(uint256 lastestPos, uint256 pos) internal returns (uint256) { uint256 val = _randIndices[pos] == 0 ? pos + 1 : _randIndices[pos]; _randIndices[pos] = _randIndices[lastestPos] == 0 ? lastestPos + 1 : _randIndices[lastestPos]; return val; } /***********************************| | Util | |__________________________________*/ /** * @notice unsafeRandom is used to generate a random number by on-chain randomness. * Please note that on-chain random is potentially manipulated by miners, and most scenarios suggest using VRF. * @return randomly generated number. */ function unsafeRandom() internal view returns (uint256) { unchecked { return uint256( keccak256( abi.encodePacked( blockhash(block.number - 1), block.difficulty, block.timestamp, block.coinbase, mintedNumber, tx.origin ) ) ); } } /***********************************| | Beak Raising | |__________________________________*/ event BeakRaisingStarted(uint256 indexed tokenId, address indexed account); event BeakRaisingStopped(uint256 indexed tokenId, address indexed account); event BeakRaisingInterrupted(uint256 indexed tokenId); event BeakRaisingTokenTransfered(address indexed from, address indexed to, uint256 indexed tokenId); event BeakRaisingAllowedFlagChanged(bool isBeakRaisingAllowed); event BeakRaisingTransferAllowedFlagChanged(bool isBeakRaisingTransferAllowed); struct BeakRaisingStatus { uint256 lastStartTime; uint256 total; bool provisionalFree; } bool public isBeakRaisingAllowed; bool public isBeakRaisingTransferAllowed; mapping(uint256 => BeakRaisingStatus) private _beakRaisingStatuses; /***********************************| | Beak Raising Config | |__________________________________*/ /** * @notice setIsBeakRaisingAllowed is used to set the global switch to control whether users are allowed to brew. * @param isBeakRaisingAllowed_ set to true to allow */ function setIsBeakRaisingAllowed(bool isBeakRaisingAllowed_) external onlyOwner { isBeakRaisingAllowed = isBeakRaisingAllowed_; emit BeakRaisingAllowedFlagChanged(isBeakRaisingAllowed); } function setIsBeakRaisingTransferAllowed(bool isBeakRaisingTransferAllowed_) external onlyOwner { isBeakRaisingTransferAllowed = isBeakRaisingTransferAllowed_; emit BeakRaisingTransferAllowedFlagChanged(isBeakRaisingTransferAllowed); } /***********************************| | Beak Raising Core | |__________________________________*/ /** * @notice safeTransferWhileBeakRaising is used to safely transfer tokens while beak raising * @param from_ transfer from address, cannot be the zero. * @param to_ transfer to address, cannot be the zero. * @param tokenId_ token must exist and be owned by `from`. */ function safeTransferWhileBeakRaising(address from_, address to_, uint256 tokenId_) external nonReentrant { require(ownerOf(tokenId_) == _msgSender(), "caller is not owner"); require(isBeakRaisingTransferAllowed, "transfer while beak raising is not enabled"); _beakRaisingStatuses[tokenId_].provisionalFree = true; safeTransferFrom(from_, to_, tokenId_); _beakRaisingStatuses[tokenId_].provisionalFree = false; if (_beakRaisingStatuses[tokenId_].lastStartTime != 0) { emit BeakRaisingTokenTransfered(from_, to_, tokenId_); } } /** * @notice getTokenBeakRaisingStatus is used to get the detailed beak raising status of a specific token. * @param tokenId_ token id * @return isBeakRaising_ whether the current token is beak raising. * @return current_ how long the token has been beak raising in the hands of the current hodler. * @return total_ total amount of beak raising since the token minted. */ function getTokenBeakRaisingStatus(uint256 tokenId_) external view returns (bool isBeakRaising_, uint256 current_, uint256 total_) { require(_exists(tokenId_), "query for nonexistent token"); BeakRaisingStatus memory status = _beakRaisingStatuses[tokenId_]; if (status.lastStartTime != 0) { isBeakRaising_ = true; current_ = block.timestamp - status.lastStartTime; } total_ = status.total + current_; } /** * @notice setTokenBeakRaisingState is used to modify the BeakRaising state of the Token, * only the Owner of the Token has this permission. * @param tokenIds_ list of tokenId */ function startTokenBeakRaising(uint256[] calldata tokenIds_) external nonReentrant { require(isBeakRaisingAllowed, "beak raising is not allowed"); unchecked { for (uint256 i = 0; i < tokenIds_.length; i++) { uint256 tokenId = tokenIds_[i]; require(ownerOf(tokenId) == _msgSender(), "caller is not owner"); BeakRaisingStatus storage status = _beakRaisingStatuses[tokenId]; if (status.lastStartTime == 0) { status.lastStartTime = block.timestamp; emit BeakRaisingStarted(tokenId, _msgSender()); } } } } function stopTokenBeakRaising(uint256[] calldata tokenIds_) external nonReentrant { unchecked { for (uint256 i = 0; i < tokenIds_.length; i++) { uint256 tokenId = tokenIds_[i]; require(ownerOf(tokenId) == _msgSender(), "caller is not owner"); BeakRaisingStatus storage status = _beakRaisingStatuses[tokenId]; uint256 lastStartTime = status.lastStartTime; if (lastStartTime > 0) { status.total += block.timestamp - lastStartTime; status.lastStartTime = 0; emit BeakRaisingStopped(tokenId, _msgSender()); } } } } /** * @notice interruptTokenBeakRaising gives the issuer the right to forcibly interrupt the beak raising state of the token. * One scenario of using it is: someone may maliciously place low-priced beak raising tokens on * the secondary market (because beak raising tokens cannot be traded). * @param tokenIds_ the tokenId list to operate */ function interruptTokenBeakRaising(uint256[] calldata tokenIds_) external atLeastMaintainer { for (uint256 i = 0; i < tokenIds_.length; i++) { uint256 tokenId = tokenIds_[i]; require(_exists(tokenId), "operate for nonexistent token"); BeakRaisingStatus storage status = _beakRaisingStatuses[tokenId]; if(status.lastStartTime == 0){ continue; } unchecked { status.total += block.timestamp - status.lastStartTime; status.lastStartTime = 0; } emit BeakRaisingStopped(tokenId, _msgSender()); emit BeakRaisingInterrupted(tokenId); } } /***********************************| | Pause | |__________________________________*/ /** * @notice hook function, used to intercept the transfer of token. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { require(!paused(), "token transfer paused"); if (!_beakRaisingStatuses[tokenId].provisionalFree) { require(_beakRaisingStatuses[tokenId].lastStartTime == 0, "token is beak raising"); } super._beforeTokenTransfer(from, to, tokenId); } /** * @notice for the purpose of protecting user assets, under extreme conditions, * the circulation of all tokens in the contract needs to be frozen. * This process is under the supervision of the community. */ function emergencyPause() external onlyOwner notSealed { _pause(); emit ContractParsed(); } /** * @notice unpause the contract */ function unpause() external onlyOwner notSealed { _unpause(); emit ContractUnparsed(); } /** * @notice when the project is stable enough, the issuer will call sealContract * to give up the permission to call emergencyPause and unpause. */ function sealContract() external onlyOwner { contractSealed = true; emit ContractSealed(); } /***********************************| | Modifier | |__________________________________*/ /** * @notice for security reasons, CA is not allowed to call sensitive methods. */ modifier callerIsUser() { require(tx.origin == _msgSender(), "caller is another contract"); _; } /** * @notice function call is only allowed when the contract has not been sealed */ modifier notSealed() { require(!contractSealed, "contract sealed"); _; } /** * @notice only owner or maintainer has the permission to call this method */ modifier atLeastMaintainer() { require(owner() == _msgSender() || (maintainerAddress != address(0) && maintainerAddress == _msgSender()), "not authorized"); _; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (security/Pausable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { require(!paused(), "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { require(paused(), "Pausable: not paused"); _; } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; import "./IERC721.sol"; import "./IERC721Receiver.sol"; import "./extensions/IERC721Metadata.sol"; import "../../utils/Address.sol"; import "../../utils/Context.sol"; import "../../utils/Strings.sol"; import "../../utils/introspection/ERC165.sol"; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (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 (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; import "../IERC721.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; import "../../utils/introspection/IERC165.sol"; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
{ "optimizer": { "enabled": true, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"placeholderURI_","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"airdropTime","type":"uint256"}],"name":"AirdropTimeChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"url","type":"string"}],"name":"BaseURIChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"isBeakRaisingAllowed","type":"bool"}],"name":"BeakRaisingAllowedFlagChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"BeakRaisingInterrupted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"BeakRaisingStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"BeakRaisingStopped","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":"BeakRaisingTokenTransfered","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"isBeakRaisingTransferAllowed","type":"bool"}],"name":"BeakRaisingTransferAllowedFlagChanged","type":"event"},{"anonymous":false,"inputs":[],"name":"ContractParsed","type":"event"},{"anonymous":false,"inputs":[],"name":"ContractSealed","type":"event"},{"anonymous":false,"inputs":[],"name":"ContractUnparsed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"url","type":"string"}],"name":"INKEPASSMapURIChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"maintainer","type":"address"}],"name":"MaintainerAddressChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"procenance","type":"string"}],"name":"ProvenanceUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"revealTime","type":"uint256"}],"name":"RevealTimeChanged","type":"event"},{"anonymous":false,"inputs":[],"name":"Revealed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"oldTokenHash","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"newTokenHash","type":"bytes32"}],"name":"TokenHashChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"receivers_","type":"address[]"},{"internalType":"uint16[]","name":"amounts_","type":"uint16[]"}],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"airdropTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"data_","type":"bytes"}],"name":"base58","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds_","type":"uint256[]"},{"internalType":"bytes32[]","name":"tokenHashes_","type":"bytes32[]"}],"name":"batchSetTokenHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds_","type":"uint256[]"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"sha256Hash_","type":"bytes32"}],"name":"cidv0","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"contractSealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"emergencyPause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId_","type":"uint256"}],"name":"getTokenBeakRaisingStatus","outputs":[{"internalType":"bool","name":"isBeakRaising_","type":"bool"},{"internalType":"uint256","name":"current_","type":"uint256"},{"internalType":"uint256","name":"total_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"inkepassMapURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds_","type":"uint256[]"}],"name":"interruptTokenBeakRaising","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isAirdropEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isBeakRaisingAllowed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isBeakRaisingTransferAllowed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isRevealEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maintainerAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintedNumber","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"openUpWastedland","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":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"provenance","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"from_","type":"address"},{"internalType":"address","name":"to_","type":"address"},{"internalType":"uint256","name":"tokenId_","type":"uint256"}],"name":"safeTransferWhileBeakRaising","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sealContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"airdropTime_","type":"uint256"}],"name":"setAirdropTime","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":"uri_","type":"string"}],"name":"setCollectionURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri_","type":"string"}],"name":"setINKEPASSMapURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"isBeakRaisingAllowed_","type":"bool"}],"name":"setIsBeakRaisingAllowed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"isBeakRaisingTransferAllowed_","type":"bool"}],"name":"setIsBeakRaisingTransferAllowed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"maintainerAddress_","type":"address"}],"name":"setMaintainerAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri_","type":"string"}],"name":"setPlaceholderURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"provenance_","type":"string"}],"name":"setProvenance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"revealTime_","type":"uint256"}],"name":"setRevealTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId_","type":"uint256"},{"internalType":"bytes32","name":"tokenHash_","type":"bytes32"}],"name":"setTokenHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds_","type":"uint256[]"}],"name":"startTokenBeakRaising","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds_","type":"uint256[]"}],"name":"stopTokenBeakRaising","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526001600e819055600f55601080546001600160501b03191690553480156200002b57600080fd5b5060405162004517380380620045178339810160408190526200004e916200020f565b60405180604001604052806009815260200168486f6f74626972647360b81b8152506040518060400160405280600381526020016212541560ea1b815250620000a6620000a0620000ff60201b60201c565b62000103565b600180556002805460ff191690558151620000c990600390602085019062000153565b508051620000df90600490602084019062000153565b50508151620000f79150600b90602084019062000153565b505062000327565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b8280546200016190620002eb565b90600052602060002090601f016020900481019282620001855760008555620001d0565b82601f10620001a057805160ff1916838001178555620001d0565b82800160010185558215620001d0579182015b82811115620001d0578251825591602001919060010190620001b3565b50620001de929150620001e2565b5090565b5b80821115620001de5760008155600101620001e3565b634e487b7160e01b600052604160045260246000fd5b600060208083850312156200022357600080fd5b82516001600160401b03808211156200023b57600080fd5b818501915085601f8301126200025057600080fd5b815181811115620002655762000265620001f9565b604051601f8201601f19908116603f01168101908382118183101715620002905762000290620001f9565b816040528281528886848701011115620002a957600080fd5b600093505b82841015620002cd5784840186015181850187015292850192620002ae565b82841115620002df5760008684830101525b98975050505050505050565b600181811c908216806200030057607f821691505b6020821081036200032157634e487b7160e01b600052602260045260246000fd5b50919050565b6141e080620003376000396000f3fe6080604052600436106103765760003560e01c8063833c9ad7116101d1578063b88d4fde11610102578063d218e21e116100a0578063e985e9c51161006f578063e985e9c5146109c8578063f2fde38b14610a11578063f95b496c14610a31578063ffe630b514610a5157600080fd5b8063d218e21e1461093b578063d4b998c21461095b578063d4fa440f1461097b578063e77ab2dc146109b357600080fd5b8063c1e28507116100dc578063c1e28507146108dd578063c403f90f146108fd578063c87b56dd14610913578063d0e30db01461093357600080fd5b8063b88d4fde14610887578063ba829d71146108a7578063be6d8d58146108bd57600080fd5b8063a22cb4651161016f578063b0681af211610149578063b0681af214610806578063b160809414610826578063b650163714610846578063b80f55c91461086757600080fd5b8063a22cb465146107bc578063a475b5dd146107dc578063a4b36c1c146107f157600080fd5b80638d0b3e7a116101ab5780638d0b3e7a1461075f5780638da5cb5b1461077457806395d89b4114610792578063a004bd85146107a757600080fd5b8063833c9ad714610704578063853a7e061461072457806387cda6b81461073f57600080fd5b806341cf0dd7116102ab57806361acdaaf1161024957806370a082311161022357806370a082311461068f578063715018a6146106af57806372862c30146106c457806379962237146106e457600080fd5b806361acdaaf1461063a5780636352211e1461065a57806368bd580e1461067a57600080fd5b806351858e271161028557806351858e27146105b0578063591fc5ee146105c55780635c975abb146105e55780635deb9e6f146105fd57600080fd5b806341cf0dd71461054f57806342842e0e1461056f578063518302271461058f57600080fd5b806323b872dd116103185780633574a2dd116102f25780633574a2dd146104e55780633b94f67c146105055780633ccfd60b146105255780633f4ba83a1461053a57600080fd5b806323b872dd146104815780632639f460146104a157806332cb6b0c146104c157600080fd5b806309296ce91161035457806309296ce91461040a578063095ea7b31461042c5780630f7309e81461044c5780631a2e971f1461046157600080fd5b806301ffc9a71461037b57806306fdde03146103b0578063081812fc146103d2575b600080fd5b34801561038757600080fd5b5061039b610396366004613858565b610a71565b60405190151581526020015b60405180910390f35b3480156103bc57600080fd5b506103c5610ac3565b6040516103a791906138cd565b3480156103de57600080fd5b506103f26103ed3660046138e0565b610b55565b6040516001600160a01b0390911681526020016103a7565b34801561041657600080fd5b5061042a61042536600461390e565b610be2565b005b34801561043857600080fd5b5061042a610447366004613940565b610c5b565b34801561045857600080fd5b506103c5610d70565b34801561046d57600080fd5b5061042a61047c36600461396a565b610dfe565b34801561048d57600080fd5b5061042a61049c36600461398c565b610ea9565b3480156104ad57600080fd5b5061042a6104bc3660046139c8565b610eda565b3480156104cd57600080fd5b506104d761045781565b6040519081526020016103a7565b3480156104f157600080fd5b5061042a6105003660046139c8565b610f61565b34801561051157600080fd5b50600d546103f2906001600160a01b031681565b34801561053157600080fd5b5061042a611039565b34801561054657600080fd5b5061042a6110f6565b34801561055b57600080fd5b506104695461039b90610100900460ff1681565b34801561057b57600080fd5b5061042a61058a36600461398c565b61119f565b34801561059b57600080fd5b5060105461039b90600160481b900460ff1681565b3480156105bc57600080fd5b5061042a6111ba565b3480156105d157600080fd5b5061042a6105e036600461390e565b611263565b3480156105f157600080fd5b5060025460ff1661039b565b34801561060957600080fd5b5061061d6106183660046138e0565b6112df565b6040805193151584526020840192909252908201526060016103a7565b34801561064657600080fd5b506103c5610655366004613adb565b6113a8565b34801561066657600080fd5b506103f26106753660046138e0565b6116dc565b34801561068657600080fd5b5061042a611753565b34801561069b57600080fd5b506104d76106aa366004613b0f565b6117c0565b3480156106bb57600080fd5b5061042a611847565b3480156106d057600080fd5b5061042a6106df3660046139c8565b61187d565b3480156106f057600080fd5b5061042a6106ff3660046138e0565b6118e5565b34801561071057600080fd5b5061042a61071f366004613b75565b611944565b34801561073057600080fd5b506104695461039b9060ff1681565b34801561074b57600080fd5b506103c561075a3660046138e0565b611ab6565b34801561076b57600080fd5b5061039b611bb0565b34801561078057600080fd5b506000546001600160a01b03166103f2565b34801561079e57600080fd5b506103c5611bca565b3480156107b357600080fd5b506103c5611bd9565b3480156107c857600080fd5b5061042a6107d7366004613bb6565b611be6565b3480156107e857600080fd5b5061042a611bf1565b3480156107fd57600080fd5b5061039b611dbd565b34801561081257600080fd5b5061042a610821366004613be9565b611dd5565b34801561083257600080fd5b5061042a610841366004613b75565b611fe6565b34801561085257600080fd5b5060105461039b90600160401b900460ff1681565b34801561087357600080fd5b5061042a610882366004613b75565b612123565b34801561089357600080fd5b5061042a6108a2366004613c54565b6121f7565b3480156108b357600080fd5b506104d7600f5481565b3480156108c957600080fd5b5061042a6108d8366004613b0f565b61222f565b3480156108e957600080fd5b5061042a6108f83660046138e0565b6122a3565b34801561090957600080fd5b506104d7600e5481565b34801561091f57600080fd5b506103c561092e3660046138e0565b612302565b61042a6124a1565b34801561094757600080fd5b5061042a61095636600461398c565b61252d565b34801561096757600080fd5b5061042a610976366004613b75565b612682565b34801561098757600080fd5b5060105461099b906001600160401b031681565b6040516001600160401b0390911681526020016103a7565b3480156109bf57600080fd5b5061042a612770565b3480156109d457600080fd5b5061039b6109e3366004613cbb565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205460ff1690565b348015610a1d57600080fd5b5061042a610a2c366004613b0f565b612883565b348015610a3d57600080fd5b5061042a610a4c366004613be9565b61291e565b348015610a5d57600080fd5b5061042a610a6c3660046139c8565b612a6c565b60006001600160e01b031982166380ac58cd60e01b1480610aa257506001600160e01b03198216635b5e139f60e01b145b80610abd57506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060038054610ad290613ce5565b80601f0160208091040260200160405190810160405280929190818152602001828054610afe90613ce5565b8015610b4b5780601f10610b2057610100808354040283529160200191610b4b565b820191906000526020600020905b815481529060010190602001808311610b2e57829003601f168201915b5050505050905090565b6000610b6082612ad4565b610bc65760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600760205260409020546001600160a01b031690565b6000546001600160a01b03163314610c0c5760405162461bcd60e51b8152600401610bbd90613d1f565b610469805460ff191682151590811790915560405160ff909116151581527f01a1b47d193ba66a6973b35275cf6ece7f622932529a7a2d57568b9f4e74d5ea906020015b60405180910390a150565b6000610c66826116dc565b9050806001600160a01b0316836001600160a01b031603610cd35760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610bbd565b336001600160a01b0382161480610cef5750610cef81336109e3565b610d615760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610bbd565b610d6b8383612af1565b505050565b60098054610d7d90613ce5565b80601f0160208091040260200160405190810160405280929190818152602001828054610da990613ce5565b8015610df65780601f10610dcb57610100808354040283529160200191610df6565b820191906000526020600020905b815481529060010190602001808311610dd957829003601f168201915b505050505081565b6000546001600160a01b0316331480610e365750600d546001600160a01b031615801590610e365750600d546001600160a01b031633145b610e525760405162461bcd60e51b8152600401610bbd90613d54565b6000828152610468602090815260409182902080549084905582518181529182018490529184917f58bb998424097ccb940a03a76697b0049c2b58abc744badaaab7bd6fdbd65745910160405180910390a2505050565b610eb33382612b5f565b610ecf5760405162461bcd60e51b8152600401610bbd90613d7c565b610d6b838383612c48565b6000546001600160a01b03163314610f045760405162461bcd60e51b8152600401610bbd90613d1f565b610f10600c83836137a9565b50601054600160481b900460ff1615610f5d577f5411e8ebf1636d9e83d5fc4900bf80cbac82e8790da2a4c94db4895e889eedf68282604051610f54929190613dcd565b60405180910390a15b5050565b6000546001600160a01b03163314610f8b5760405162461bcd60e51b8152600401610bbd90613d1f565b601054600160481b900460ff1615610ffb5760405162461bcd60e51b815260206004820152602d60248201527f616c72656164792072657665616c65642c2063616e206e6f742073657420706c60448201526c616365686f6c6465722075726960981b6064820152608401610bbd565b611007600b83836137a9565b507f5411e8ebf1636d9e83d5fc4900bf80cbac82e8790da2a4c94db4895e889eedf68282604051610f54929190613dcd565b6000546001600160a01b031633146110635760405162461bcd60e51b8152600401610bbd90613d1f565b6002600154036110855760405162461bcd60e51b8152600401610bbd90613dfc565b60026001556040514790339082156108fc029083906000818181858888f193505050501580156110b9573d6000803e3d6000fd5b5060405181815233907f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a94243649060200160405180910390a25060018055565b6000546001600160a01b031633146111205760405162461bcd60e51b8152600401610bbd90613d1f565b601054600160401b900460ff161561116c5760405162461bcd60e51b815260206004820152600f60248201526e18dbdb9d1c9858dd081cd9585b1959608a1b6044820152606401610bbd565b611174612def565b6040517f092af66b0bd1c72d72f759dca6111b54869afce41de52c8b070daca48832ff3290600090a1565b610d6b838383604051806020016040528060008152506121f7565b6000546001600160a01b031633146111e45760405162461bcd60e51b8152600401610bbd90613d1f565b601054600160401b900460ff16156112305760405162461bcd60e51b815260206004820152600f60248201526e18dbdb9d1c9858dd081cd9585b1959608a1b6044820152606401610bbd565b611238612e82565b6040517f76ba3851df4b69972443b0c99bcba0f237d990fbc8cd7ab5c86537c15da180ca90600090a1565b6000546001600160a01b0316331461128d5760405162461bcd60e51b8152600401610bbd90613d1f565b610469805461ff0019166101008315158102919091179182905560405160ff9190920416151581527fbce593fb48457d19e6b05921dad362974c148403b54a09fc37096c28d22fe64b90602001610c50565b60008060006112ed84612ad4565b6113395760405162461bcd60e51b815260206004820152601b60248201527f717565727920666f72206e6f6e6578697374656e7420746f6b656e00000000006044820152606401610bbd565b600084815261046a60209081526040918290208251606081018452815480825260018301549382019390935260029091015460ff161515928101929092521561138f5780516001945061138c9042613e49565b92505b82816020015161139f9190613e60565b93959294505050565b805160609060005b81811080156113dd57508381815181106113cc576113cc613e78565b01602001516001600160f81b031916155b156113f457806113ec81613e8e565b9150506113b0565b6117e36114018284613e49565b61140d9061209f613ea7565b6114179190613edc565b6114219082613e60565b61142c906001613e60565b91506000826001600160401b0381111561144857611448613a39565b6040519080825280601f01601f191660200182016040528015611472576020820181803683370190505b50905060008080611484600187613ef0565b905060005b88518110156115755761149d600188613e49565b92508881815181106114b1576114b1613e78565b016020015160f81c93505b818313806114cf575063ffffffff841615155b15611560578483815181106114e6576114e6613e78565b01602001516114fa9060f81c610100613f2f565b6115089061ffff1685613f59565b9350611515603a85613f81565b60f81b85848151811061152a5761152a613e78565b60200101906001600160f81b031916908160001a90535061154c603a85613fa4565b93508261155881613fc7565b9350506114bc565b8291508061156d81613e8e565b915050611489565b50845b86811080156115a5575084818151811061159457611594613e78565b01602001516001600160f81b031916155b156115bc57806115b481613e8e565b915050611578565b6115c68682613e49565b85516115d29190613e49565b96506000876001600160401b038111156115ee576115ee613a39565b6040519080825280601f01601f191660200182016040528015611618576020820181803683370190505b50905060005b888110156116ce576000886116338584613e60565b61163d9190613e49565b90506040518060600160405280603a8152602001614171603a913988828151811061166a5761166a613e78565b0160200151815160f89190911c90811061168657611686613e78565b602001015160f81c60f81b8383815181106116a3576116a3613e78565b60200101906001600160f81b031916908160001a9053505080806116c690613e8e565b91505061161e565b509998505050505050505050565b6000818152600560205260408120546001600160a01b031680610abd5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610bbd565b6000546001600160a01b0316331461177d5760405162461bcd60e51b8152600401610bbd90613d1f565b6010805468ff00000000000000001916600160401b1790556040517fa0058887862c892ade184993a48c672897bca2e36ebf7fa2b4703d4805fc3a0190600090a1565b60006001600160a01b03821661182b5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610bbd565b506001600160a01b031660009081526006602052604090205490565b6000546001600160a01b031633146118715760405162461bcd60e51b8152600401610bbd90613d1f565b61187b6000612efd565b565b6000546001600160a01b031633146118a75760405162461bcd60e51b8152600401610bbd90613d1f565b6118b3600a83836137a9565b507fa170456c81147521bf85bb03cad18387dbdb3872f1a575758fd3152c69456c6a8282604051610f54929190613dcd565b6000546001600160a01b0316331461190f5760405162461bcd60e51b8152600401610bbd90613d1f565b600e8190556040518181527f9ce955277efb54388c4175e4ce3491360acee0d5eefd9e4f881d80579aaf012590602001610c50565b6000546001600160a01b031633148061197c5750600d546001600160a01b03161580159061197c5750600d546001600160a01b031633145b6119985760405162461bcd60e51b8152600401610bbd90613d54565b60005b81811015610d6b5760008383838181106119b7576119b7613e78565b9050602002013590506119c981612ad4565b611a155760405162461bcd60e51b815260206004820152601d60248201527f6f70657261746520666f72206e6f6e6578697374656e7420746f6b656e0000006044820152606401610bbd565b600081815261046a602052604081208054909103611a34575050611aa4565b8054600182018054429290920390910190556000808255604051339184917f0541ab784739f7063afc5fa98ff93a6c03b6f6127bbf894c267587158cb9de209190a360405182907f7b33a8a8c5f97794957f95000aa0836300d2aa7e174ce62d8d3078869a9b948690600090a250505b80611aae81613e8e565b91505061199b565b604080516022808252606082810190935260009190602082018180368337019050509050601260f81b81600081518110611af257611af2613e78565b60200101906001600160f81b031916908160001a905350602060f81b81600181518110611b2157611b21613e78565b60200101906001600160f81b031916908160001a90535060005b6020811015611b9f57838160208110611b5657611b56613e78565b1a60f81b82611b66836002613e60565b81518110611b7657611b76613e78565b60200101906001600160f81b031916908160001a90535080611b9781613e8e565b915050611b3b565b50611ba9816113a8565b9392505050565b60006001600e54118015611bc55750600e5442115b905090565b606060048054610ad290613ce5565b600a8054610d7d90613ce5565b610f5d338383612f4d565b6000546001600160a01b03163314611c1b5760405162461bcd60e51b8152600401610bbd90613d1f565b600260015403611c3d5760405162461bcd60e51b8152600401610bbd90613dfc565b6002600155601054600160481b900460ff1615611c8f5760405162461bcd60e51b815260206004820152601060248201526f185b1c9958591e481c995d99585b195960821b6044820152606401610bbd565b6010546001600160401b031661045714611ceb5760405162461bcd60e51b815260206004820152601b60248201527f61697264726f70206973206e6f742066696e69736865642079657400000000006044820152606401610bbd565b611cf3611dbd565b611d375760405162461bcd60e51b81526020600482015260156024820152741c995d99585b081a5cc81b9bdd08195b98589b1959605a1b6044820152606401610bbd565b6010805469ff0000000000000000001916600160481b1790557f5411e8ebf1636d9e83d5fc4900bf80cbac82e8790da2a4c94db4895e889eedf6611d7961301b565b604051611d8691906138cd565b60405180910390a16040517fe2a7169cedebe39671840370ae19ca4fc41be6191d4c77f174f189a4d8cd08c890600090a160018055565b60006001600f54118015611bc5575050600f54421190565b6000546001600160a01b03163314611dff5760405162461bcd60e51b8152600401610bbd90613d1f565b600260015403611e215760405162461bcd60e51b8152600401610bbd90613dfc565b6002600155828114611eac5760405162461bcd60e51b815260206004820152604860248201527f746865206c656e677468206f66204c697374696e67205265636569766572206960448201527f7320646966666572656e742066726f6d2074686174206f66204c697374696e6760648201526720416d6f756e747360c01b608482015260a401610bbd565b611eb4611bb0565b611ef95760405162461bcd60e51b8152602060048201526016602482015275185a5c991c9bdc081a5cc81b9bdd08195b98589b195960521b6044820152606401610bbd565b6010546104576001600160401b0390911610611f575760405162461bcd60e51b815260206004820152601c60248201527f61697264726f7020697320616c726561647920636f6d706c65746564000000006044820152606401610bbd565b60005b6001600160401b038116841115611fdb57611fd38585836001600160401b0316818110611f8957611f89613e78565b9050602002016020810190611f9e9190613b0f565b8484846001600160401b0316818110611fb957611fb9613e78565b9050602002016020810190611fce9190613fe4565b61302a565b600101611f5a565b505060018055505050565b6002600154036120085760405162461bcd60e51b8152600401610bbd90613dfc565b60026001556104695460ff166120605760405162461bcd60e51b815260206004820152601b60248201527f6265616b2072616973696e67206973206e6f7420616c6c6f77656400000000006044820152606401610bbd565b60005b8181101561211a57600083838381811061207f5761207f613e78565b90506020020135905061208f3390565b6001600160a01b03166120a1826116dc565b6001600160a01b0316146120c75760405162461bcd60e51b8152600401610bbd90614008565b600081815261046a60205260408120805490910361211057428155604051339083907f3abfe793e0ee3196b59c78a0397e775d04396d3272252b51c10992a2d237b01790600090a35b5050600101612063565b50506001805550565b6000546001600160a01b0316331461214d5760405162461bcd60e51b8152600401610bbd90613d1f565b60026001540361216f5760405162461bcd60e51b8152600401610bbd90613dfc565b600260015560005b8181101561211a57600083838381811061219357612193613e78565b9050602002013590506121a33390565b6001600160a01b03166121b5826116dc565b6001600160a01b0316146121db5760405162461bcd60e51b8152600401610bbd90614008565b6121e481613132565b50806121ef81613e8e565b915050612177565b6122013383612b5f565b61221d5760405162461bcd60e51b8152600401610bbd90613d7c565b612229848484846131d9565b50505050565b6000546001600160a01b031633146122595760405162461bcd60e51b8152600401610bbd90613d1f565b600d80546001600160a01b0319166001600160a01b0383169081179091556040517f5f000c8ffdab0f90a947ce0e76033315e60bd358a0995d362e157f587f1a0a2390600090a250565b6000546001600160a01b031633146122cd5760405162461bcd60e51b8152600401610bbd90613d1f565b600f8190556040518181527fca6c85d7f557c8e4f0503f08679cbc42bd3cc26cbdda84c5ed3cd2b15503437490602001610c50565b606061230d82612ad4565b6123595760405162461bcd60e51b815260206004820152601b60248201527f717565727920666f72206e6f6e6578697374656e7420746f6b656e00000000006044820152606401610bbd565b601054600160481b900460ff166123fc57600b805461237790613ce5565b80601f01602080910402602001604051908101604052809291908181526020018280546123a390613ce5565b80156123f05780601f106123c5576101008083540402835291602001916123f0565b820191906000526020600020905b8154815290600101906020018083116123d357829003601f168201915b50505050509050919050565b600082815261046860205260408120549081900361247157600061241e61301b565b9050600081511161243e5760405180602001604052806000815250612469565b806124488561320c565b604051602001612459929190614035565b6040516020818303038152906040525b949350505050565b61247a81611ab6565b60405160200161248a919061405b565b604051602081830303815290604052915050919050565b6000546001600160a01b031633146124cb5760405162461bcd60e51b8152600401610bbd90613d1f565b6002600154036124ed5760405162461bcd60e51b8152600401610bbd90613dfc565b600260015560405134815233907fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c9060200160405180910390a260018055565b60026001540361254f5760405162461bcd60e51b8152600401610bbd90613dfc565b60026001553361255e826116dc565b6001600160a01b0316146125845760405162461bcd60e51b8152600401610bbd90614008565b61046954610100900460ff166125ef5760405162461bcd60e51b815260206004820152602a60248201527f7472616e73666572207768696c65206265616b2072616973696e67206973206e6044820152691bdd08195b98589b195960b21b6064820152608401610bbd565b600081815261046a60205260409020600201805460ff1916600117905561261783838361119f565b600081815261046a6020526040902060028101805460ff19169055541561211a5780826001600160a01b0316846001600160a01b03167fa854c20eeb0195c71303f7dea939e7aedebb62a26a8767308b3b1eb848726bc760405160405180910390a450506001805550565b6002600154036126a45760405162461bcd60e51b8152600401610bbd90613dfc565b600260015560005b8181101561211a5760008383838181106126c8576126c8613e78565b9050602002013590506126d83390565b6001600160a01b03166126ea826116dc565b6001600160a01b0316146127105760405162461bcd60e51b8152600401610bbd90614008565b600081815261046a602052604090208054801561276557600182018054428390030190556000808355604051339185917f0541ab784739f7063afc5fa98ff93a6c03b6f6127bbf894c267587158cb9de209190a35b5050506001016126ac565b6000546001600160a01b0316331461279a5760405162461bcd60e51b8152600401610bbd90613d1f565b6002600154036127bc5760405162461bcd60e51b8152600401610bbd90613dfc565b60026001556010546001600160401b03161561281a5760405162461bcd60e51b815260206004820152601c60248201527f616c7265616479206f70656e6564207570207761737465646c616e64000000006044820152606401610bbd565b61283161282a6001610457613e49565b600061330c565b5061283d3360016133b0565b60108054600090612856906001600160401b031661408a565b91906101000a8154816001600160401b0302191690836001600160401b0316021790555060018081905550565b6000546001600160a01b031633146128ad5760405162461bcd60e51b8152600401610bbd90613d1f565b6001600160a01b0381166129125760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610bbd565b61291b81612efd565b50565b6000546001600160a01b03163314806129565750600d546001600160a01b0316158015906129565750600d546001600160a01b031633145b6129725760405162461bcd60e51b8152600401610bbd90613d54565b8281146129d45760405162461bcd60e51b815260206004820152602a60248201527f746f6b656e4964735f20616e6420746f6b656e4861736865735f206c656e67746044820152690d040dad2e6dac2e8c6d60b31b6064820152608401610bbd565b82612a0e5760405162461bcd60e51b815260206004820152600a6024820152691b9bc81d1bdad95b925960b21b6044820152606401610bbd565b60005b83811015612a6557612a53858583818110612a2e57612a2e613e78565b90506020020135848484818110612a4757612a47613e78565b90506020020135610dfe565b80612a5d81613e8e565b915050612a11565b5050505050565b6000546001600160a01b03163314612a965760405162461bcd60e51b8152600401610bbd90613d1f565b612aa2600983836137a9565b507f638b2296aed59fe9e4f72c7536065ba3e36cb7690c2d130f66334da9cc2406cf8282604051610f54929190613dcd565b6000908152600560205260409020546001600160a01b0316151590565b600081815260076020526040902080546001600160a01b0319166001600160a01b0384169081179091558190612b26826116dc565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612b6a82612ad4565b612bcb5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610bbd565b6000612bd6836116dc565b9050806001600160a01b0316846001600160a01b03161480612c1d57506001600160a01b0380821660009081526008602090815260408083209388168352929052205460ff165b806124695750836001600160a01b0316612c3684610b55565b6001600160a01b031614949350505050565b826001600160a01b0316612c5b826116dc565b6001600160a01b031614612cbf5760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610bbd565b6001600160a01b038216612d215760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610bbd565b612d2c8383836133ca565b612d37600082612af1565b6001600160a01b0383166000908152600660205260408120805460019290612d60908490613e49565b90915550506001600160a01b0382166000908152600660205260408120805460019290612d8e908490613e60565b909155505060008181526005602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60025460ff16612e385760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610bbd565b6002805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b60025460ff1615612ec85760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610bbd565b6002805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612e653390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b816001600160a01b0316836001600160a01b031603612fae5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610bbd565b6001600160a01b03838116600081815260086020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6060600c8054610ad290613ce5565b60008161ffff16116130745760405162461bcd60e51b81526020600482015260136024820152726d696e7420616d6f756e74206973207a65726f60681b6044820152606401610bbd565b6010546104576001600160401b0391821661ffff84160190911611156130e75760405162461bcd60e51b815260206004820152602260248201527f6d696e746564206e756d626572206973206f7574206f66204d41585f535550506044820152614c5960f01b6064820152608401610bbd565b60006130f1613484565b90506130fd8382613536565b50601080546001600160401b038082166001011667ffffffffffffffff199091161790556000190161ffff81166130e7575050565b600061313d826116dc565b905061314b816000846133ca565b613156600083612af1565b6001600160a01b038116600090815260066020526040812080546001929061317f908490613e49565b909155505060008281526005602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b6131e4848484612c48565b6131f084848484613675565b6122295760405162461bcd60e51b8152600401610bbd906140b0565b6060816000036132335750506040805180820190915260018152600360fc1b602082015290565b8160005b811561325d578061324781613e8e565b91506132569050600a83613edc565b9150613237565b6000816001600160401b0381111561327757613277613a39565b6040519080825280601f01601f1916602001820160405280156132a1576020820181803683370190505b5090505b8415612469576132b6600183613e49565b91506132c3600a86614102565b6132ce906030613e60565b60f81b8183815181106132e3576132e3613e78565b60200101906001600160f81b031916908160001a905350613305600a86613edc565b94506132a5565b600080601183610457811061332357613323613e78565b01541561334557601183610457811061333e5761333e613e78565b0154613350565b613350836001613e60565b9050601184610457811061336657613366613e78565b01541561338857601184610457811061338157613381613e78565b0154613393565b613393846001613e60565b60118461045781106133a7576133a7613e78565b01559392505050565b610f5d828260405180602001604052806000815250613776565b60025460ff16156134155760405162461bcd60e51b81526020600482015260156024820152741d1bdad95b881d1c985b9cd9995c881c185d5cd959605a1b6044820152606401610bbd565b600081815261046a602052604090206002015460ff16610d6b57600081815261046a602052604090205415610d6b5760405162461bcd60e51b8152602060048201526015602482015274746f6b656e206973206265616b2072616973696e6760581b6044820152606401610bbd565b6010546000906001600160401b03166104570361353060001982018261351d601054604080514360001901406020808301919091524482840152426060808401919091526bffffffffffffffffffffffff1941821b811660808501526001600160c01b031960c09690961b95909516609484015232901b909316609c8201528151609081830301815260b0909101909152805191012090565b8161352a5761352a613ec6565b0661330c565b91505090565b6001600160a01b03821661358c5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610bbd565b61359581612ad4565b156135e25760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610bbd565b6135ee600083836133ca565b6001600160a01b0382166000908152600660205260408120805460019290613617908490613e60565b909155505060008181526005602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006001600160a01b0384163b1561376b57604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906136b9903390899088908890600401614116565b6020604051808303816000875af19250505080156136f4575060408051601f3d908101601f191682019092526136f191810190614153565b60015b613751573d808015613722576040519150601f19603f3d011682016040523d82523d6000602084013e613727565b606091505b5080516000036137495760405162461bcd60e51b8152600401610bbd906140b0565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612469565b506001949350505050565b6137808383613536565b61378d6000848484613675565b610d6b5760405162461bcd60e51b8152600401610bbd906140b0565b8280546137b590613ce5565b90600052602060002090601f0160209004810192826137d7576000855561381d565b82601f106137f05782800160ff1982351617855561381d565b8280016001018555821561381d579182015b8281111561381d578235825591602001919060010190613802565b5061382992915061382d565b5090565b5b80821115613829576000815560010161382e565b6001600160e01b03198116811461291b57600080fd5b60006020828403121561386a57600080fd5b8135611ba981613842565b60005b83811015613890578181015183820152602001613878565b838111156122295750506000910152565b600081518084526138b9816020860160208601613875565b601f01601f19169290920160200192915050565b602081526000611ba960208301846138a1565b6000602082840312156138f257600080fd5b5035919050565b8035801515811461390957600080fd5b919050565b60006020828403121561392057600080fd5b611ba9826138f9565b80356001600160a01b038116811461390957600080fd5b6000806040838503121561395357600080fd5b61395c83613929565b946020939093013593505050565b6000806040838503121561397d57600080fd5b50508035926020909101359150565b6000806000606084860312156139a157600080fd5b6139aa84613929565b92506139b860208501613929565b9150604084013590509250925092565b600080602083850312156139db57600080fd5b82356001600160401b03808211156139f257600080fd5b818501915085601f830112613a0657600080fd5b813581811115613a1557600080fd5b866020828501011115613a2757600080fd5b60209290920196919550909350505050565b634e487b7160e01b600052604160045260246000fd5b600082601f830112613a6057600080fd5b81356001600160401b0380821115613a7a57613a7a613a39565b604051601f8301601f19908116603f01168101908282118183101715613aa257613aa2613a39565b81604052838152866020858801011115613abb57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600060208284031215613aed57600080fd5b81356001600160401b03811115613b0357600080fd5b61246984828501613a4f565b600060208284031215613b2157600080fd5b611ba982613929565b60008083601f840112613b3c57600080fd5b5081356001600160401b03811115613b5357600080fd5b6020830191508360208260051b8501011115613b6e57600080fd5b9250929050565b60008060208385031215613b8857600080fd5b82356001600160401b03811115613b9e57600080fd5b613baa85828601613b2a565b90969095509350505050565b60008060408385031215613bc957600080fd5b613bd283613929565b9150613be0602084016138f9565b90509250929050565b60008060008060408587031215613bff57600080fd5b84356001600160401b0380821115613c1657600080fd5b613c2288838901613b2a565b90965094506020870135915080821115613c3b57600080fd5b50613c4887828801613b2a565b95989497509550505050565b60008060008060808587031215613c6a57600080fd5b613c7385613929565b9350613c8160208601613929565b92506040850135915060608501356001600160401b03811115613ca357600080fd5b613caf87828801613a4f565b91505092959194509250565b60008060408385031215613cce57600080fd5b613cd783613929565b9150613be060208401613929565b600181811c90821680613cf957607f821691505b602082108103613d1957634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252600e908201526d1b9bdd08185d5d1a1bdc9a5e995960921b604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600082821015613e5b57613e5b613e33565b500390565b60008219821115613e7357613e73613e33565b500190565b634e487b7160e01b600052603260045260246000fd5b600060018201613ea057613ea0613e33565b5060010190565b6000816000190483118215151615613ec157613ec1613e33565b500290565b634e487b7160e01b600052601260045260246000fd5b600082613eeb57613eeb613ec6565b500490565b60008083128015600160ff1b850184121615613f0e57613f0e613e33565b6001600160ff1b0384018313811615613f2957613f29613e33565b50500390565b600061ffff80831681851681830481118215151615613f5057613f50613e33565b02949350505050565b600063ffffffff808316818516808303821115613f7857613f78613e33565b01949350505050565b600063ffffffff80841680613f9857613f98613ec6565b92169190910692915050565b600063ffffffff80841680613fbb57613fbb613ec6565b92169190910492915050565b6000600160ff1b8201613fdc57613fdc613e33565b506000190190565b600060208284031215613ff657600080fd5b813561ffff81168114611ba957600080fd5b60208082526013908201527231b0b63632b91034b9903737ba1037bbb732b960691b604082015260600190565b60008351614047818460208801613875565b835190830190613f78818360208801613875565b66697066733a2f2f60c81b81526000825161407d816007850160208701613875565b9190910160070192915050565b60006001600160401b038083168181036140a6576140a6613e33565b6001019392505050565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60008261411157614111613ec6565b500690565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090614149908301846138a1565b9695505050505050565b60006020828403121561416557600080fd5b8151611ba98161384256fe31323334353637383941424344454647484a4b4c4d4e505152535455565758595a6162636465666768696a6b6d6e6f707172737475767778797aa26469706673582212209f427d2a7096f41da6228473470e12dd552fc37f39861fe96770b88a9327ef9c64736f6c634300080e00330000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000004f68747470733a2f2f697066732e696e667572612d697066732e696f2f697066732f516d615a337554485a475243717864653237373238314c367636325665564d78636d734d7654504c7659634574720000000000000000000000000000000000
Deployed Bytecode
0x6080604052600436106103765760003560e01c8063833c9ad7116101d1578063b88d4fde11610102578063d218e21e116100a0578063e985e9c51161006f578063e985e9c5146109c8578063f2fde38b14610a11578063f95b496c14610a31578063ffe630b514610a5157600080fd5b8063d218e21e1461093b578063d4b998c21461095b578063d4fa440f1461097b578063e77ab2dc146109b357600080fd5b8063c1e28507116100dc578063c1e28507146108dd578063c403f90f146108fd578063c87b56dd14610913578063d0e30db01461093357600080fd5b8063b88d4fde14610887578063ba829d71146108a7578063be6d8d58146108bd57600080fd5b8063a22cb4651161016f578063b0681af211610149578063b0681af214610806578063b160809414610826578063b650163714610846578063b80f55c91461086757600080fd5b8063a22cb465146107bc578063a475b5dd146107dc578063a4b36c1c146107f157600080fd5b80638d0b3e7a116101ab5780638d0b3e7a1461075f5780638da5cb5b1461077457806395d89b4114610792578063a004bd85146107a757600080fd5b8063833c9ad714610704578063853a7e061461072457806387cda6b81461073f57600080fd5b806341cf0dd7116102ab57806361acdaaf1161024957806370a082311161022357806370a082311461068f578063715018a6146106af57806372862c30146106c457806379962237146106e457600080fd5b806361acdaaf1461063a5780636352211e1461065a57806368bd580e1461067a57600080fd5b806351858e271161028557806351858e27146105b0578063591fc5ee146105c55780635c975abb146105e55780635deb9e6f146105fd57600080fd5b806341cf0dd71461054f57806342842e0e1461056f578063518302271461058f57600080fd5b806323b872dd116103185780633574a2dd116102f25780633574a2dd146104e55780633b94f67c146105055780633ccfd60b146105255780633f4ba83a1461053a57600080fd5b806323b872dd146104815780632639f460146104a157806332cb6b0c146104c157600080fd5b806309296ce91161035457806309296ce91461040a578063095ea7b31461042c5780630f7309e81461044c5780631a2e971f1461046157600080fd5b806301ffc9a71461037b57806306fdde03146103b0578063081812fc146103d2575b600080fd5b34801561038757600080fd5b5061039b610396366004613858565b610a71565b60405190151581526020015b60405180910390f35b3480156103bc57600080fd5b506103c5610ac3565b6040516103a791906138cd565b3480156103de57600080fd5b506103f26103ed3660046138e0565b610b55565b6040516001600160a01b0390911681526020016103a7565b34801561041657600080fd5b5061042a61042536600461390e565b610be2565b005b34801561043857600080fd5b5061042a610447366004613940565b610c5b565b34801561045857600080fd5b506103c5610d70565b34801561046d57600080fd5b5061042a61047c36600461396a565b610dfe565b34801561048d57600080fd5b5061042a61049c36600461398c565b610ea9565b3480156104ad57600080fd5b5061042a6104bc3660046139c8565b610eda565b3480156104cd57600080fd5b506104d761045781565b6040519081526020016103a7565b3480156104f157600080fd5b5061042a6105003660046139c8565b610f61565b34801561051157600080fd5b50600d546103f2906001600160a01b031681565b34801561053157600080fd5b5061042a611039565b34801561054657600080fd5b5061042a6110f6565b34801561055b57600080fd5b506104695461039b90610100900460ff1681565b34801561057b57600080fd5b5061042a61058a36600461398c565b61119f565b34801561059b57600080fd5b5060105461039b90600160481b900460ff1681565b3480156105bc57600080fd5b5061042a6111ba565b3480156105d157600080fd5b5061042a6105e036600461390e565b611263565b3480156105f157600080fd5b5060025460ff1661039b565b34801561060957600080fd5b5061061d6106183660046138e0565b6112df565b6040805193151584526020840192909252908201526060016103a7565b34801561064657600080fd5b506103c5610655366004613adb565b6113a8565b34801561066657600080fd5b506103f26106753660046138e0565b6116dc565b34801561068657600080fd5b5061042a611753565b34801561069b57600080fd5b506104d76106aa366004613b0f565b6117c0565b3480156106bb57600080fd5b5061042a611847565b3480156106d057600080fd5b5061042a6106df3660046139c8565b61187d565b3480156106f057600080fd5b5061042a6106ff3660046138e0565b6118e5565b34801561071057600080fd5b5061042a61071f366004613b75565b611944565b34801561073057600080fd5b506104695461039b9060ff1681565b34801561074b57600080fd5b506103c561075a3660046138e0565b611ab6565b34801561076b57600080fd5b5061039b611bb0565b34801561078057600080fd5b506000546001600160a01b03166103f2565b34801561079e57600080fd5b506103c5611bca565b3480156107b357600080fd5b506103c5611bd9565b3480156107c857600080fd5b5061042a6107d7366004613bb6565b611be6565b3480156107e857600080fd5b5061042a611bf1565b3480156107fd57600080fd5b5061039b611dbd565b34801561081257600080fd5b5061042a610821366004613be9565b611dd5565b34801561083257600080fd5b5061042a610841366004613b75565b611fe6565b34801561085257600080fd5b5060105461039b90600160401b900460ff1681565b34801561087357600080fd5b5061042a610882366004613b75565b612123565b34801561089357600080fd5b5061042a6108a2366004613c54565b6121f7565b3480156108b357600080fd5b506104d7600f5481565b3480156108c957600080fd5b5061042a6108d8366004613b0f565b61222f565b3480156108e957600080fd5b5061042a6108f83660046138e0565b6122a3565b34801561090957600080fd5b506104d7600e5481565b34801561091f57600080fd5b506103c561092e3660046138e0565b612302565b61042a6124a1565b34801561094757600080fd5b5061042a61095636600461398c565b61252d565b34801561096757600080fd5b5061042a610976366004613b75565b612682565b34801561098757600080fd5b5060105461099b906001600160401b031681565b6040516001600160401b0390911681526020016103a7565b3480156109bf57600080fd5b5061042a612770565b3480156109d457600080fd5b5061039b6109e3366004613cbb565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205460ff1690565b348015610a1d57600080fd5b5061042a610a2c366004613b0f565b612883565b348015610a3d57600080fd5b5061042a610a4c366004613be9565b61291e565b348015610a5d57600080fd5b5061042a610a6c3660046139c8565b612a6c565b60006001600160e01b031982166380ac58cd60e01b1480610aa257506001600160e01b03198216635b5e139f60e01b145b80610abd57506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060038054610ad290613ce5565b80601f0160208091040260200160405190810160405280929190818152602001828054610afe90613ce5565b8015610b4b5780601f10610b2057610100808354040283529160200191610b4b565b820191906000526020600020905b815481529060010190602001808311610b2e57829003601f168201915b5050505050905090565b6000610b6082612ad4565b610bc65760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600760205260409020546001600160a01b031690565b6000546001600160a01b03163314610c0c5760405162461bcd60e51b8152600401610bbd90613d1f565b610469805460ff191682151590811790915560405160ff909116151581527f01a1b47d193ba66a6973b35275cf6ece7f622932529a7a2d57568b9f4e74d5ea906020015b60405180910390a150565b6000610c66826116dc565b9050806001600160a01b0316836001600160a01b031603610cd35760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610bbd565b336001600160a01b0382161480610cef5750610cef81336109e3565b610d615760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610bbd565b610d6b8383612af1565b505050565b60098054610d7d90613ce5565b80601f0160208091040260200160405190810160405280929190818152602001828054610da990613ce5565b8015610df65780601f10610dcb57610100808354040283529160200191610df6565b820191906000526020600020905b815481529060010190602001808311610dd957829003601f168201915b505050505081565b6000546001600160a01b0316331480610e365750600d546001600160a01b031615801590610e365750600d546001600160a01b031633145b610e525760405162461bcd60e51b8152600401610bbd90613d54565b6000828152610468602090815260409182902080549084905582518181529182018490529184917f58bb998424097ccb940a03a76697b0049c2b58abc744badaaab7bd6fdbd65745910160405180910390a2505050565b610eb33382612b5f565b610ecf5760405162461bcd60e51b8152600401610bbd90613d7c565b610d6b838383612c48565b6000546001600160a01b03163314610f045760405162461bcd60e51b8152600401610bbd90613d1f565b610f10600c83836137a9565b50601054600160481b900460ff1615610f5d577f5411e8ebf1636d9e83d5fc4900bf80cbac82e8790da2a4c94db4895e889eedf68282604051610f54929190613dcd565b60405180910390a15b5050565b6000546001600160a01b03163314610f8b5760405162461bcd60e51b8152600401610bbd90613d1f565b601054600160481b900460ff1615610ffb5760405162461bcd60e51b815260206004820152602d60248201527f616c72656164792072657665616c65642c2063616e206e6f742073657420706c60448201526c616365686f6c6465722075726960981b6064820152608401610bbd565b611007600b83836137a9565b507f5411e8ebf1636d9e83d5fc4900bf80cbac82e8790da2a4c94db4895e889eedf68282604051610f54929190613dcd565b6000546001600160a01b031633146110635760405162461bcd60e51b8152600401610bbd90613d1f565b6002600154036110855760405162461bcd60e51b8152600401610bbd90613dfc565b60026001556040514790339082156108fc029083906000818181858888f193505050501580156110b9573d6000803e3d6000fd5b5060405181815233907f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a94243649060200160405180910390a25060018055565b6000546001600160a01b031633146111205760405162461bcd60e51b8152600401610bbd90613d1f565b601054600160401b900460ff161561116c5760405162461bcd60e51b815260206004820152600f60248201526e18dbdb9d1c9858dd081cd9585b1959608a1b6044820152606401610bbd565b611174612def565b6040517f092af66b0bd1c72d72f759dca6111b54869afce41de52c8b070daca48832ff3290600090a1565b610d6b838383604051806020016040528060008152506121f7565b6000546001600160a01b031633146111e45760405162461bcd60e51b8152600401610bbd90613d1f565b601054600160401b900460ff16156112305760405162461bcd60e51b815260206004820152600f60248201526e18dbdb9d1c9858dd081cd9585b1959608a1b6044820152606401610bbd565b611238612e82565b6040517f76ba3851df4b69972443b0c99bcba0f237d990fbc8cd7ab5c86537c15da180ca90600090a1565b6000546001600160a01b0316331461128d5760405162461bcd60e51b8152600401610bbd90613d1f565b610469805461ff0019166101008315158102919091179182905560405160ff9190920416151581527fbce593fb48457d19e6b05921dad362974c148403b54a09fc37096c28d22fe64b90602001610c50565b60008060006112ed84612ad4565b6113395760405162461bcd60e51b815260206004820152601b60248201527f717565727920666f72206e6f6e6578697374656e7420746f6b656e00000000006044820152606401610bbd565b600084815261046a60209081526040918290208251606081018452815480825260018301549382019390935260029091015460ff161515928101929092521561138f5780516001945061138c9042613e49565b92505b82816020015161139f9190613e60565b93959294505050565b805160609060005b81811080156113dd57508381815181106113cc576113cc613e78565b01602001516001600160f81b031916155b156113f457806113ec81613e8e565b9150506113b0565b6117e36114018284613e49565b61140d9061209f613ea7565b6114179190613edc565b6114219082613e60565b61142c906001613e60565b91506000826001600160401b0381111561144857611448613a39565b6040519080825280601f01601f191660200182016040528015611472576020820181803683370190505b50905060008080611484600187613ef0565b905060005b88518110156115755761149d600188613e49565b92508881815181106114b1576114b1613e78565b016020015160f81c93505b818313806114cf575063ffffffff841615155b15611560578483815181106114e6576114e6613e78565b01602001516114fa9060f81c610100613f2f565b6115089061ffff1685613f59565b9350611515603a85613f81565b60f81b85848151811061152a5761152a613e78565b60200101906001600160f81b031916908160001a90535061154c603a85613fa4565b93508261155881613fc7565b9350506114bc565b8291508061156d81613e8e565b915050611489565b50845b86811080156115a5575084818151811061159457611594613e78565b01602001516001600160f81b031916155b156115bc57806115b481613e8e565b915050611578565b6115c68682613e49565b85516115d29190613e49565b96506000876001600160401b038111156115ee576115ee613a39565b6040519080825280601f01601f191660200182016040528015611618576020820181803683370190505b50905060005b888110156116ce576000886116338584613e60565b61163d9190613e49565b90506040518060600160405280603a8152602001614171603a913988828151811061166a5761166a613e78565b0160200151815160f89190911c90811061168657611686613e78565b602001015160f81c60f81b8383815181106116a3576116a3613e78565b60200101906001600160f81b031916908160001a9053505080806116c690613e8e565b91505061161e565b509998505050505050505050565b6000818152600560205260408120546001600160a01b031680610abd5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610bbd565b6000546001600160a01b0316331461177d5760405162461bcd60e51b8152600401610bbd90613d1f565b6010805468ff00000000000000001916600160401b1790556040517fa0058887862c892ade184993a48c672897bca2e36ebf7fa2b4703d4805fc3a0190600090a1565b60006001600160a01b03821661182b5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610bbd565b506001600160a01b031660009081526006602052604090205490565b6000546001600160a01b031633146118715760405162461bcd60e51b8152600401610bbd90613d1f565b61187b6000612efd565b565b6000546001600160a01b031633146118a75760405162461bcd60e51b8152600401610bbd90613d1f565b6118b3600a83836137a9565b507fa170456c81147521bf85bb03cad18387dbdb3872f1a575758fd3152c69456c6a8282604051610f54929190613dcd565b6000546001600160a01b0316331461190f5760405162461bcd60e51b8152600401610bbd90613d1f565b600e8190556040518181527f9ce955277efb54388c4175e4ce3491360acee0d5eefd9e4f881d80579aaf012590602001610c50565b6000546001600160a01b031633148061197c5750600d546001600160a01b03161580159061197c5750600d546001600160a01b031633145b6119985760405162461bcd60e51b8152600401610bbd90613d54565b60005b81811015610d6b5760008383838181106119b7576119b7613e78565b9050602002013590506119c981612ad4565b611a155760405162461bcd60e51b815260206004820152601d60248201527f6f70657261746520666f72206e6f6e6578697374656e7420746f6b656e0000006044820152606401610bbd565b600081815261046a602052604081208054909103611a34575050611aa4565b8054600182018054429290920390910190556000808255604051339184917f0541ab784739f7063afc5fa98ff93a6c03b6f6127bbf894c267587158cb9de209190a360405182907f7b33a8a8c5f97794957f95000aa0836300d2aa7e174ce62d8d3078869a9b948690600090a250505b80611aae81613e8e565b91505061199b565b604080516022808252606082810190935260009190602082018180368337019050509050601260f81b81600081518110611af257611af2613e78565b60200101906001600160f81b031916908160001a905350602060f81b81600181518110611b2157611b21613e78565b60200101906001600160f81b031916908160001a90535060005b6020811015611b9f57838160208110611b5657611b56613e78565b1a60f81b82611b66836002613e60565b81518110611b7657611b76613e78565b60200101906001600160f81b031916908160001a90535080611b9781613e8e565b915050611b3b565b50611ba9816113a8565b9392505050565b60006001600e54118015611bc55750600e5442115b905090565b606060048054610ad290613ce5565b600a8054610d7d90613ce5565b610f5d338383612f4d565b6000546001600160a01b03163314611c1b5760405162461bcd60e51b8152600401610bbd90613d1f565b600260015403611c3d5760405162461bcd60e51b8152600401610bbd90613dfc565b6002600155601054600160481b900460ff1615611c8f5760405162461bcd60e51b815260206004820152601060248201526f185b1c9958591e481c995d99585b195960821b6044820152606401610bbd565b6010546001600160401b031661045714611ceb5760405162461bcd60e51b815260206004820152601b60248201527f61697264726f70206973206e6f742066696e69736865642079657400000000006044820152606401610bbd565b611cf3611dbd565b611d375760405162461bcd60e51b81526020600482015260156024820152741c995d99585b081a5cc81b9bdd08195b98589b1959605a1b6044820152606401610bbd565b6010805469ff0000000000000000001916600160481b1790557f5411e8ebf1636d9e83d5fc4900bf80cbac82e8790da2a4c94db4895e889eedf6611d7961301b565b604051611d8691906138cd565b60405180910390a16040517fe2a7169cedebe39671840370ae19ca4fc41be6191d4c77f174f189a4d8cd08c890600090a160018055565b60006001600f54118015611bc5575050600f54421190565b6000546001600160a01b03163314611dff5760405162461bcd60e51b8152600401610bbd90613d1f565b600260015403611e215760405162461bcd60e51b8152600401610bbd90613dfc565b6002600155828114611eac5760405162461bcd60e51b815260206004820152604860248201527f746865206c656e677468206f66204c697374696e67205265636569766572206960448201527f7320646966666572656e742066726f6d2074686174206f66204c697374696e6760648201526720416d6f756e747360c01b608482015260a401610bbd565b611eb4611bb0565b611ef95760405162461bcd60e51b8152602060048201526016602482015275185a5c991c9bdc081a5cc81b9bdd08195b98589b195960521b6044820152606401610bbd565b6010546104576001600160401b0390911610611f575760405162461bcd60e51b815260206004820152601c60248201527f61697264726f7020697320616c726561647920636f6d706c65746564000000006044820152606401610bbd565b60005b6001600160401b038116841115611fdb57611fd38585836001600160401b0316818110611f8957611f89613e78565b9050602002016020810190611f9e9190613b0f565b8484846001600160401b0316818110611fb957611fb9613e78565b9050602002016020810190611fce9190613fe4565b61302a565b600101611f5a565b505060018055505050565b6002600154036120085760405162461bcd60e51b8152600401610bbd90613dfc565b60026001556104695460ff166120605760405162461bcd60e51b815260206004820152601b60248201527f6265616b2072616973696e67206973206e6f7420616c6c6f77656400000000006044820152606401610bbd565b60005b8181101561211a57600083838381811061207f5761207f613e78565b90506020020135905061208f3390565b6001600160a01b03166120a1826116dc565b6001600160a01b0316146120c75760405162461bcd60e51b8152600401610bbd90614008565b600081815261046a60205260408120805490910361211057428155604051339083907f3abfe793e0ee3196b59c78a0397e775d04396d3272252b51c10992a2d237b01790600090a35b5050600101612063565b50506001805550565b6000546001600160a01b0316331461214d5760405162461bcd60e51b8152600401610bbd90613d1f565b60026001540361216f5760405162461bcd60e51b8152600401610bbd90613dfc565b600260015560005b8181101561211a57600083838381811061219357612193613e78565b9050602002013590506121a33390565b6001600160a01b03166121b5826116dc565b6001600160a01b0316146121db5760405162461bcd60e51b8152600401610bbd90614008565b6121e481613132565b50806121ef81613e8e565b915050612177565b6122013383612b5f565b61221d5760405162461bcd60e51b8152600401610bbd90613d7c565b612229848484846131d9565b50505050565b6000546001600160a01b031633146122595760405162461bcd60e51b8152600401610bbd90613d1f565b600d80546001600160a01b0319166001600160a01b0383169081179091556040517f5f000c8ffdab0f90a947ce0e76033315e60bd358a0995d362e157f587f1a0a2390600090a250565b6000546001600160a01b031633146122cd5760405162461bcd60e51b8152600401610bbd90613d1f565b600f8190556040518181527fca6c85d7f557c8e4f0503f08679cbc42bd3cc26cbdda84c5ed3cd2b15503437490602001610c50565b606061230d82612ad4565b6123595760405162461bcd60e51b815260206004820152601b60248201527f717565727920666f72206e6f6e6578697374656e7420746f6b656e00000000006044820152606401610bbd565b601054600160481b900460ff166123fc57600b805461237790613ce5565b80601f01602080910402602001604051908101604052809291908181526020018280546123a390613ce5565b80156123f05780601f106123c5576101008083540402835291602001916123f0565b820191906000526020600020905b8154815290600101906020018083116123d357829003601f168201915b50505050509050919050565b600082815261046860205260408120549081900361247157600061241e61301b565b9050600081511161243e5760405180602001604052806000815250612469565b806124488561320c565b604051602001612459929190614035565b6040516020818303038152906040525b949350505050565b61247a81611ab6565b60405160200161248a919061405b565b604051602081830303815290604052915050919050565b6000546001600160a01b031633146124cb5760405162461bcd60e51b8152600401610bbd90613d1f565b6002600154036124ed5760405162461bcd60e51b8152600401610bbd90613dfc565b600260015560405134815233907fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c9060200160405180910390a260018055565b60026001540361254f5760405162461bcd60e51b8152600401610bbd90613dfc565b60026001553361255e826116dc565b6001600160a01b0316146125845760405162461bcd60e51b8152600401610bbd90614008565b61046954610100900460ff166125ef5760405162461bcd60e51b815260206004820152602a60248201527f7472616e73666572207768696c65206265616b2072616973696e67206973206e6044820152691bdd08195b98589b195960b21b6064820152608401610bbd565b600081815261046a60205260409020600201805460ff1916600117905561261783838361119f565b600081815261046a6020526040902060028101805460ff19169055541561211a5780826001600160a01b0316846001600160a01b03167fa854c20eeb0195c71303f7dea939e7aedebb62a26a8767308b3b1eb848726bc760405160405180910390a450506001805550565b6002600154036126a45760405162461bcd60e51b8152600401610bbd90613dfc565b600260015560005b8181101561211a5760008383838181106126c8576126c8613e78565b9050602002013590506126d83390565b6001600160a01b03166126ea826116dc565b6001600160a01b0316146127105760405162461bcd60e51b8152600401610bbd90614008565b600081815261046a602052604090208054801561276557600182018054428390030190556000808355604051339185917f0541ab784739f7063afc5fa98ff93a6c03b6f6127bbf894c267587158cb9de209190a35b5050506001016126ac565b6000546001600160a01b0316331461279a5760405162461bcd60e51b8152600401610bbd90613d1f565b6002600154036127bc5760405162461bcd60e51b8152600401610bbd90613dfc565b60026001556010546001600160401b03161561281a5760405162461bcd60e51b815260206004820152601c60248201527f616c7265616479206f70656e6564207570207761737465646c616e64000000006044820152606401610bbd565b61283161282a6001610457613e49565b600061330c565b5061283d3360016133b0565b60108054600090612856906001600160401b031661408a565b91906101000a8154816001600160401b0302191690836001600160401b0316021790555060018081905550565b6000546001600160a01b031633146128ad5760405162461bcd60e51b8152600401610bbd90613d1f565b6001600160a01b0381166129125760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610bbd565b61291b81612efd565b50565b6000546001600160a01b03163314806129565750600d546001600160a01b0316158015906129565750600d546001600160a01b031633145b6129725760405162461bcd60e51b8152600401610bbd90613d54565b8281146129d45760405162461bcd60e51b815260206004820152602a60248201527f746f6b656e4964735f20616e6420746f6b656e4861736865735f206c656e67746044820152690d040dad2e6dac2e8c6d60b31b6064820152608401610bbd565b82612a0e5760405162461bcd60e51b815260206004820152600a6024820152691b9bc81d1bdad95b925960b21b6044820152606401610bbd565b60005b83811015612a6557612a53858583818110612a2e57612a2e613e78565b90506020020135848484818110612a4757612a47613e78565b90506020020135610dfe565b80612a5d81613e8e565b915050612a11565b5050505050565b6000546001600160a01b03163314612a965760405162461bcd60e51b8152600401610bbd90613d1f565b612aa2600983836137a9565b507f638b2296aed59fe9e4f72c7536065ba3e36cb7690c2d130f66334da9cc2406cf8282604051610f54929190613dcd565b6000908152600560205260409020546001600160a01b0316151590565b600081815260076020526040902080546001600160a01b0319166001600160a01b0384169081179091558190612b26826116dc565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612b6a82612ad4565b612bcb5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610bbd565b6000612bd6836116dc565b9050806001600160a01b0316846001600160a01b03161480612c1d57506001600160a01b0380821660009081526008602090815260408083209388168352929052205460ff165b806124695750836001600160a01b0316612c3684610b55565b6001600160a01b031614949350505050565b826001600160a01b0316612c5b826116dc565b6001600160a01b031614612cbf5760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610bbd565b6001600160a01b038216612d215760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610bbd565b612d2c8383836133ca565b612d37600082612af1565b6001600160a01b0383166000908152600660205260408120805460019290612d60908490613e49565b90915550506001600160a01b0382166000908152600660205260408120805460019290612d8e908490613e60565b909155505060008181526005602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60025460ff16612e385760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610bbd565b6002805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b60025460ff1615612ec85760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610bbd565b6002805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612e653390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b816001600160a01b0316836001600160a01b031603612fae5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610bbd565b6001600160a01b03838116600081815260086020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6060600c8054610ad290613ce5565b60008161ffff16116130745760405162461bcd60e51b81526020600482015260136024820152726d696e7420616d6f756e74206973207a65726f60681b6044820152606401610bbd565b6010546104576001600160401b0391821661ffff84160190911611156130e75760405162461bcd60e51b815260206004820152602260248201527f6d696e746564206e756d626572206973206f7574206f66204d41585f535550506044820152614c5960f01b6064820152608401610bbd565b60006130f1613484565b90506130fd8382613536565b50601080546001600160401b038082166001011667ffffffffffffffff199091161790556000190161ffff81166130e7575050565b600061313d826116dc565b905061314b816000846133ca565b613156600083612af1565b6001600160a01b038116600090815260066020526040812080546001929061317f908490613e49565b909155505060008281526005602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b6131e4848484612c48565b6131f084848484613675565b6122295760405162461bcd60e51b8152600401610bbd906140b0565b6060816000036132335750506040805180820190915260018152600360fc1b602082015290565b8160005b811561325d578061324781613e8e565b91506132569050600a83613edc565b9150613237565b6000816001600160401b0381111561327757613277613a39565b6040519080825280601f01601f1916602001820160405280156132a1576020820181803683370190505b5090505b8415612469576132b6600183613e49565b91506132c3600a86614102565b6132ce906030613e60565b60f81b8183815181106132e3576132e3613e78565b60200101906001600160f81b031916908160001a905350613305600a86613edc565b94506132a5565b600080601183610457811061332357613323613e78565b01541561334557601183610457811061333e5761333e613e78565b0154613350565b613350836001613e60565b9050601184610457811061336657613366613e78565b01541561338857601184610457811061338157613381613e78565b0154613393565b613393846001613e60565b60118461045781106133a7576133a7613e78565b01559392505050565b610f5d828260405180602001604052806000815250613776565b60025460ff16156134155760405162461bcd60e51b81526020600482015260156024820152741d1bdad95b881d1c985b9cd9995c881c185d5cd959605a1b6044820152606401610bbd565b600081815261046a602052604090206002015460ff16610d6b57600081815261046a602052604090205415610d6b5760405162461bcd60e51b8152602060048201526015602482015274746f6b656e206973206265616b2072616973696e6760581b6044820152606401610bbd565b6010546000906001600160401b03166104570361353060001982018261351d601054604080514360001901406020808301919091524482840152426060808401919091526bffffffffffffffffffffffff1941821b811660808501526001600160c01b031960c09690961b95909516609484015232901b909316609c8201528151609081830301815260b0909101909152805191012090565b8161352a5761352a613ec6565b0661330c565b91505090565b6001600160a01b03821661358c5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610bbd565b61359581612ad4565b156135e25760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610bbd565b6135ee600083836133ca565b6001600160a01b0382166000908152600660205260408120805460019290613617908490613e60565b909155505060008181526005602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006001600160a01b0384163b1561376b57604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906136b9903390899088908890600401614116565b6020604051808303816000875af19250505080156136f4575060408051601f3d908101601f191682019092526136f191810190614153565b60015b613751573d808015613722576040519150601f19603f3d011682016040523d82523d6000602084013e613727565b606091505b5080516000036137495760405162461bcd60e51b8152600401610bbd906140b0565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612469565b506001949350505050565b6137808383613536565b61378d6000848484613675565b610d6b5760405162461bcd60e51b8152600401610bbd906140b0565b8280546137b590613ce5565b90600052602060002090601f0160209004810192826137d7576000855561381d565b82601f106137f05782800160ff1982351617855561381d565b8280016001018555821561381d579182015b8281111561381d578235825591602001919060010190613802565b5061382992915061382d565b5090565b5b80821115613829576000815560010161382e565b6001600160e01b03198116811461291b57600080fd5b60006020828403121561386a57600080fd5b8135611ba981613842565b60005b83811015613890578181015183820152602001613878565b838111156122295750506000910152565b600081518084526138b9816020860160208601613875565b601f01601f19169290920160200192915050565b602081526000611ba960208301846138a1565b6000602082840312156138f257600080fd5b5035919050565b8035801515811461390957600080fd5b919050565b60006020828403121561392057600080fd5b611ba9826138f9565b80356001600160a01b038116811461390957600080fd5b6000806040838503121561395357600080fd5b61395c83613929565b946020939093013593505050565b6000806040838503121561397d57600080fd5b50508035926020909101359150565b6000806000606084860312156139a157600080fd5b6139aa84613929565b92506139b860208501613929565b9150604084013590509250925092565b600080602083850312156139db57600080fd5b82356001600160401b03808211156139f257600080fd5b818501915085601f830112613a0657600080fd5b813581811115613a1557600080fd5b866020828501011115613a2757600080fd5b60209290920196919550909350505050565b634e487b7160e01b600052604160045260246000fd5b600082601f830112613a6057600080fd5b81356001600160401b0380821115613a7a57613a7a613a39565b604051601f8301601f19908116603f01168101908282118183101715613aa257613aa2613a39565b81604052838152866020858801011115613abb57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600060208284031215613aed57600080fd5b81356001600160401b03811115613b0357600080fd5b61246984828501613a4f565b600060208284031215613b2157600080fd5b611ba982613929565b60008083601f840112613b3c57600080fd5b5081356001600160401b03811115613b5357600080fd5b6020830191508360208260051b8501011115613b6e57600080fd5b9250929050565b60008060208385031215613b8857600080fd5b82356001600160401b03811115613b9e57600080fd5b613baa85828601613b2a565b90969095509350505050565b60008060408385031215613bc957600080fd5b613bd283613929565b9150613be0602084016138f9565b90509250929050565b60008060008060408587031215613bff57600080fd5b84356001600160401b0380821115613c1657600080fd5b613c2288838901613b2a565b90965094506020870135915080821115613c3b57600080fd5b50613c4887828801613b2a565b95989497509550505050565b60008060008060808587031215613c6a57600080fd5b613c7385613929565b9350613c8160208601613929565b92506040850135915060608501356001600160401b03811115613ca357600080fd5b613caf87828801613a4f565b91505092959194509250565b60008060408385031215613cce57600080fd5b613cd783613929565b9150613be060208401613929565b600181811c90821680613cf957607f821691505b602082108103613d1957634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252600e908201526d1b9bdd08185d5d1a1bdc9a5e995960921b604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600082821015613e5b57613e5b613e33565b500390565b60008219821115613e7357613e73613e33565b500190565b634e487b7160e01b600052603260045260246000fd5b600060018201613ea057613ea0613e33565b5060010190565b6000816000190483118215151615613ec157613ec1613e33565b500290565b634e487b7160e01b600052601260045260246000fd5b600082613eeb57613eeb613ec6565b500490565b60008083128015600160ff1b850184121615613f0e57613f0e613e33565b6001600160ff1b0384018313811615613f2957613f29613e33565b50500390565b600061ffff80831681851681830481118215151615613f5057613f50613e33565b02949350505050565b600063ffffffff808316818516808303821115613f7857613f78613e33565b01949350505050565b600063ffffffff80841680613f9857613f98613ec6565b92169190910692915050565b600063ffffffff80841680613fbb57613fbb613ec6565b92169190910492915050565b6000600160ff1b8201613fdc57613fdc613e33565b506000190190565b600060208284031215613ff657600080fd5b813561ffff81168114611ba957600080fd5b60208082526013908201527231b0b63632b91034b9903737ba1037bbb732b960691b604082015260600190565b60008351614047818460208801613875565b835190830190613f78818360208801613875565b66697066733a2f2f60c81b81526000825161407d816007850160208701613875565b9190910160070192915050565b60006001600160401b038083168181036140a6576140a6613e33565b6001019392505050565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60008261411157614111613ec6565b500690565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090614149908301846138a1565b9695505050505050565b60006020828403121561416557600080fd5b8151611ba98161384256fe31323334353637383941424344454647484a4b4c4d4e505152535455565758595a6162636465666768696a6b6d6e6f707172737475767778797aa26469706673582212209f427d2a7096f41da6228473470e12dd552fc37f39861fe96770b88a9327ef9c64736f6c634300080e0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000004f68747470733a2f2f697066732e696e667572612d697066732e696f2f697066732f516d615a337554485a475243717864653237373238314c367636325665564d78636d734d7654504c7659634574720000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : placeholderURI_ (string): https://ipfs.infura-ipfs.io/ipfs/QmaZ3uTHZGRCqxde277281L6v62VeVMxcmsMvTPLvYcEtr
-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 000000000000000000000000000000000000000000000000000000000000004f
Arg [2] : 68747470733a2f2f697066732e696e667572612d697066732e696f2f69706673
Arg [3] : 2f516d615a337554485a475243717864653237373238314c367636325665564d
Arg [4] : 78636d734d7654504c7659634574720000000000000000000000000000000000
Deployed Bytecode Sourcemap
6854:18416:12:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1570:300:3;;;;;;;;;;-1:-1:-1;1570:300:3;;;;;:::i;:::-;;:::i;:::-;;;565:14:13;;558:22;540:41;;528:2;513:18;1570:300:3;;;;;;;;2488:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;4000:217::-;;;;;;;;;;-1:-1:-1;4000:217:3;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1692:32:13;;;1674:51;;1662:2;1647:18;4000:217:3;1528:203:13;17914:207:12;;;;;;;;;;-1:-1:-1;17914:207:12;;;;;:::i;:::-;;:::i;:::-;;3538:401:3;;;;;;;;;;-1:-1:-1;3538:401:3;;;;;:::i;:::-;;:::i;7635:24:12:-;;;;;;;;;;;;;:::i;11292:259::-;;;;;;;;;;-1:-1:-1;11292:259:12;;;;;:::i;:::-;;:::i;4727:330:3:-;;;;;;;;;;-1:-1:-1;4727:330:3;;;;;:::i;:::-;;:::i;9997:178:12:-;;;;;;;;;;-1:-1:-1;9997:178:12;;;;;:::i;:::-;;:::i;7587:41::-;;;;;;;;;;;;7624:4;7587:41;;;;;3852:25:13;;;3840:2;3825:18;7587:41:12;3706:177:13;9658:219:12;;;;;;;;;;-1:-1:-1;9658:219:12;;;;;:::i;:::-;;:::i;7771:32::-;;;;;;;;;;-1:-1:-1;7771:32:12;;;;-1:-1:-1;;;;;7771:32:12;;;14492:203;;;;;;;;;;;;;:::i;24020:108::-;;;;;;;;;;;;;:::i;17478:40::-;;;;;;;;;;-1:-1:-1;17478:40:12;;;;;;;;;;;5123:179:3;;;;;;;;;;-1:-1:-1;5123:179:3;;;;;:::i;:::-;;:::i;8006:28:12:-;;;;;;;;;;-1:-1:-1;8006:28:12;;;;-1:-1:-1;;;8006:28:12;;;;;;23851:111;;;;;;;;;;;;;:::i;18126:255::-;;;;;;;;;;-1:-1:-1;18126:255:12;;;;;:::i;:::-;;:::i;1098:84:1:-;;;;;;;;;;-1:-1:-1;1168:7:1;;;;1098:84;;19823:470:12;;;;;;;;;;-1:-1:-1;19823:470:12;;;;;:::i;:::-;;:::i;:::-;;;;4109:14:13;;4102:22;4084:41;;4156:2;4141:18;;4134:34;;;;4184:18;;;4177:34;4072:2;4057:18;19823:470:12;3888:329:13;5117:1116:12;;;;;;;;;;-1:-1:-1;5117:1116:12;;;;;:::i;:::-;;:::i;2191:235:3:-;;;;;;;;;;-1:-1:-1;2191:235:3;;;;;:::i;:::-;;:::i;24303:112:12:-;;;;;;;;;;;;;:::i;1929:205:3:-;;;;;;;;;;-1:-1:-1;1929:205:3;;;;;:::i;:::-;;:::i;1668:101:0:-;;;;;;;;;;;;;:::i;10989:148:12:-;;;;;;;;;;-1:-1:-1;10989:148:12;;;;;:::i;:::-;;:::i;9029:155::-;;;;;;;;;;-1:-1:-1;9029:155:12;;;;;:::i;:::-;;:::i;22272:705::-;;;;;;;;;;-1:-1:-1;22272:705:12;;;;;:::i;:::-;;:::i;17440:32::-;;;;;;;;;;-1:-1:-1;17440:32:12;;;;;;;;6456:346;;;;;;;;;;-1:-1:-1;6456:346:12;;;;;:::i;:::-;;:::i;9190:127::-;;;;;;;;;;;;;:::i;1036:85:0:-;;;;;;;;;;-1:-1:-1;1082:7:0;1108:6;-1:-1:-1;;;;;1108:6:0;1036:85;;2650:102:3;;;;;;;;;;;;;:::i;7665:28:12:-;;;;;;;;;;;;;:::i;4284:153:3:-;;;;;;;;;;-1:-1:-1;4284:153:3;;;;;:::i;:::-;;:::i;13834:333:12:-;;;;;;;;;;;;;:::i;9528:124::-;;;;;;;;;;;;;:::i;12238:607::-;;;;;;;;;;-1:-1:-1;12238:607:12;;;;;:::i;:::-;;:::i;20506:673::-;;;;;;;;;;-1:-1:-1;20506:673:12;;;;;:::i;:::-;;:::i;7966:34::-;;;;;;;;;;-1:-1:-1;7966:34:12;;;;-1:-1:-1;;;7966:34:12;;;;;;14809:301;;;;;;;;;;-1:-1:-1;14809:301:12;;;;;:::i;:::-;;:::i;5368:320:3:-;;;;;;;;;;-1:-1:-1;5368:320:3;;;;;:::i;:::-;;:::i;7871:29:12:-;;;;;;;;;;;;;;;;8833:191;;;;;;;;;;-1:-1:-1;8833:191:12;;;;;:::i;:::-;;:::i;9323:149::-;;;;;;;;;;-1:-1:-1;9323:149:12;;;;;:::i;:::-;;:::i;7809:30::-;;;;;;;;;;;;;;;;10360:534;;;;;;;;;;-1:-1:-1;10360:534:12;;;;;:::i;:::-;;:::i;14270:113::-;;;:::i;18812:598::-;;;;;;;;;;-1:-1:-1;18812:598:12;;;;;:::i;:::-;;:::i;21184:711::-;;;;;;;;;;-1:-1:-1;21184:711:12;;;;;:::i;:::-;;:::i;7930:30::-;;;;;;;;;;-1:-1:-1;7930:30:12;;;;-1:-1:-1;;;;;7930:30:12;;;;;;-1:-1:-1;;;;;8555:31:13;;;8537:50;;8525:2;8510:18;7930:30:12;8393:200:13;13467:228:12;;;;;;;;;;;;;:::i;4503:162:3:-;;;;;;;;;;-1:-1:-1;4503:162:3;;;;;:::i;:::-;-1:-1:-1;;;;;4623:25:3;;;4600:4;4623:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;4503:162;1918:198:0;;;;;;;;;;-1:-1:-1;1918:198:0;;;;;:::i;:::-;;:::i;11625:405:12:-;;;;;;;;;;-1:-1:-1;11625:405:12;;;;;:::i;:::-;;:::i;8432:157::-;;;;;;;;;;-1:-1:-1;8432:157:12;;;;;:::i;:::-;;:::i;1570:300:3:-;1672:4;-1:-1:-1;;;;;;1707:40:3;;-1:-1:-1;;;1707:40:3;;:104;;-1:-1:-1;;;;;;;1763:48:3;;-1:-1:-1;;;1763:48:3;1707:104;:156;;;-1:-1:-1;;;;;;;;;;937:40:10;;;1827:36:3;1688:175;1570:300;-1:-1:-1;;1570:300:3:o;2488:98::-;2542:13;2574:5;2567:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2488:98;:::o;4000:217::-;4076:7;4103:16;4111:7;4103;:16::i;:::-;4095:73;;;;-1:-1:-1;;;4095:73:3;;10228:2:13;4095:73:3;;;10210:21:13;10267:2;10247:18;;;10240:30;10306:34;10286:18;;;10279:62;-1:-1:-1;;;10357:18:13;;;10350:42;10409:19;;4095:73:3;;;;;;;;;-1:-1:-1;4186:24:3;;;;:15;:24;;;;;;-1:-1:-1;;;;;4186:24:3;;4000:217::o;17914:207:12:-;1082:7:0;1108:6;-1:-1:-1;;;;;1108:6:0;719:10:8;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;;;;;;:::i;:::-;18004:20:12::1;:44:::0;;-1:-1:-1;;18004:44:12::1;::::0;::::1;;::::0;;::::1;::::0;;;18063:51:::1;::::0;18004:44:::1;18093:20:::0;;;565:14:13;558:22;540:41;;18063:51:12::1;::::0;528:2:13;513:18;18063:51:12::1;;;;;;;;17914:207:::0;:::o;3538:401:3:-;3618:13;3634:23;3649:7;3634:14;:23::i;:::-;3618:39;;3681:5;-1:-1:-1;;;;;3675:11:3;:2;-1:-1:-1;;;;;3675:11:3;;3667:57;;;;-1:-1:-1;;;3667:57:3;;11002:2:13;3667:57:3;;;10984:21:13;11041:2;11021:18;;;11014:30;11080:34;11060:18;;;11053:62;-1:-1:-1;;;11131:18:13;;;11124:31;11172:19;;3667:57:3;10800:397:13;3667:57:3;719:10:8;-1:-1:-1;;;;;3756:21:3;;;;:62;;-1:-1:-1;3781:37:3;3798:5;719:10:8;4503:162:3;:::i;3781:37::-;3735:165;;;;-1:-1:-1;;;3735:165:3;;11404:2:13;3735:165:3;;;11386:21:13;11443:2;11423:18;;;11416:30;11482:34;11462:18;;;11455:62;11553:26;11533:18;;;11526:54;11597:19;;3735:165:3;11202:420:13;3735:165:3;3911:21;3920:2;3924:7;3911:8;:21::i;:::-;3608:331;3538:401;;:::o;7635:24:12:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;11292:259::-;1082:7:0;1108:6;-1:-1:-1;;;;;1108:6:0;719:10:8;25108:23:12;;:110;;-1:-1:-1;25149:17:12;;-1:-1:-1;;;;;25149:17:12;:31;;;;:68;;-1:-1:-1;25184:17:12;;-1:-1:-1;;;;;25184:17:12;719:10:8;25184:33:12;25149:68;25100:150;;;;-1:-1:-1;;;25100:150:12;;;;;;;:::i;:::-;11387:20:::1;11410:22:::0;;;:12:::1;:22;::::0;;;;;;;;;;11442:35;;;;11492:52;;12144:25:13;;;12185:18;;;12178:34;;;11410:22:12;;;11492:52:::1;::::0;12117:18:13;11492:52:12::1;;;;;;;11377:174;11292:259:::0;;:::o;4727:330:3:-;4916:41;719:10:8;4949:7:3;4916:18;:41::i;:::-;4908:103;;;;-1:-1:-1;;;4908:103:3;;;;;;;:::i;:::-;5022:28;5032:4;5038:2;5042:7;5022:9;:28::i;9997:178:12:-;1082:7:0;1108:6;-1:-1:-1;;;;;1108:6:0;719:10:8;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;;;;;;:::i;:::-;10074:21:12::1;:14;10091:4:::0;;10074:21:::1;:::i;:::-;-1:-1:-1::0;10109:8:12::1;::::0;-1:-1:-1;;;10109:8:12;::::1;;;10105:64;;;10138:20;10153:4;;10138:20;;;;;;;:::i;:::-;;;;;;;;10105:64;9997:178:::0;;:::o;9658:219::-;1082:7:0;1108:6;-1:-1:-1;;;;;1108:6:0;719:10:8;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;;;;;;:::i;:::-;9745:8:12::1;::::0;-1:-1:-1;;;9745:8:12;::::1;;;9744:9;9736:67;;;::::0;-1:-1:-1;;;9736:67:12;;13238:2:13;9736:67:12::1;::::0;::::1;13220:21:13::0;13277:2;13257:18;;;13250:30;13316:34;13296:18;;;13289:62;-1:-1:-1;;;13367:18:13;;;13360:43;13420:19;;9736:67:12::1;13036:409:13::0;9736:67:12::1;9813:22;:15;9831:4:::0;;9813:22:::1;:::i;:::-;;9850:20;9865:4;;9850:20;;;;;;;:::i;14492:203::-:0;1082:7:0;1108:6;-1:-1:-1;;;;;1108:6:0;719:10:8;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;;;;;;:::i;:::-;1744:1:2::1;2325:7;;:19:::0;2317:63:::1;;;;-1:-1:-1::0;;;2317:63:2::1;;;;;;;:::i;:::-;1744:1;2455:7;:18:::0;14603:39:12::2;::::0;14572:21:::2;::::0;719:10:8;;14603:39:12;::::2;;;::::0;14572:21;;14603:39:::2;::::0;;;14572:21;719:10:8;14603:39:12;::::2;;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;14657:31:12::2;::::0;3852:25:13;;;719:10:8;;14657:31:12::2;::::0;3840:2:13;3825:18;14657:31:12::2;;;;;;;-1:-1:-1::0;1701:1:2::1;2628:22:::0;;14492:203:12:o;24020:108::-;1082:7:0;1108:6;-1:-1:-1;;;;;1108:6:0;719:10:8;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;;;;;;:::i;:::-;24909:14:12::1;::::0;-1:-1:-1;;;24909:14:12;::::1;;;24908:15;24900:43;;;::::0;-1:-1:-1;;;24900:43:12;;14012:2:13;24900:43:12::1;::::0;::::1;13994:21:13::0;14051:2;14031:18;;;14024:30;-1:-1:-1;;;14070:18:13;;;14063:45;14125:18;;24900:43:12::1;13810:339:13::0;24900:43:12::1;24078:10:::2;:8;:10::i;:::-;24103:18;::::0;::::2;::::0;;;::::2;24020:108::o:0;5123:179:3:-;5256:39;5273:4;5279:2;5283:7;5256:39;;;;;;;;;;;;:16;:39::i;23851:111:12:-;1082:7:0;1108:6;-1:-1:-1;;;;;1108:6:0;719:10:8;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;;;;;;:::i;:::-;24909:14:12::1;::::0;-1:-1:-1;;;24909:14:12;::::1;;;24908:15;24900:43;;;::::0;-1:-1:-1;;;24900:43:12;;14012:2:13;24900:43:12::1;::::0;::::1;13994:21:13::0;14051:2;14031:18;;;14024:30;-1:-1:-1;;;14070:18:13;;;14063:45;14125:18;;24900:43:12::1;13810:339:13::0;24900:43:12::1;23916:8:::2;:6;:8::i;:::-;23939:16;::::0;::::2;::::0;;;::::2;23851:111::o:0;18126:255::-;1082:7:0;1108:6;-1:-1:-1;;;;;1108:6:0;719:10:8;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;;;;;;:::i;:::-;18232:28:12::1;:60:::0;;-1:-1:-1;;18232:60:12::1;;::::0;::::1;;::::0;::::1;::::0;;;::::1;::::0;;;;18307:67:::1;::::0;18232:60:::1;18345:28:::0;;;::::1;;565:14:13::0;558:22;540:41;;18307:67:12::1;::::0;528:2:13;513:18;18307:67:12::1;400:187:13::0;19823:470:12;19899:19;19920:16;19938:14;19972:17;19980:8;19972:7;:17::i;:::-;19964:57;;;;-1:-1:-1;;;19964:57:12;;14356:2:13;19964:57:12;;;14338:21:13;14395:2;14375:18;;;14368:30;14434:29;14414:18;;;14407:57;14481:18;;19964:57:12;14154:351:13;19964:57:12;20031:31;20065:30;;;:20;:30;;;;;;;;;20031:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20109:25;20105:140;;20214:20;;20167:4;;-1:-1:-1;20196:38:12;;:15;:38;:::i;:::-;20185:49;;20105:140;20278:8;20263:6;:12;;;:23;;;;:::i;:::-;19823:470;;;;-1:-1:-1;;;19823:470:12:o;5117:1116::-;5212:12;;5174;;5197;5261:86;5280:4;5268:9;:16;:41;;;;;5288:5;5294:9;5288:16;;;;;;;;:::i;:::-;;;;;-1:-1:-1;;;;;;5288:16:12;:21;5268:41;5261:86;;;5325:11;;;;:::i;:::-;;;;5261:86;;;5399:4;5376:16;5383:9;5376:4;:16;:::i;:::-;5375:23;;5394:4;5375:23;:::i;:::-;:28;;;;:::i;:::-;5363:40;;:9;:40;:::i;:::-;:42;;5404:1;5363:42;:::i;:::-;5356:49;;5415:17;5445:4;-1:-1:-1;;;;;5435:15:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5435:15:12;-1:-1:-1;5415:35:12;-1:-1:-1;5460:12:12;;;5514:16;5529:1;5521:4;5514:16;:::i;:::-;5500:30;;5545:9;5540:351;5564:5;:12;5560:1;:16;5540:351;;;5608:8;5615:1;5608:4;:8;:::i;:::-;5597:20;;5650:5;5656:1;5650:8;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;5631:228:12;5665:4;5661:1;:8;:22;;;-1:-1:-1;5673:10:12;;;;;5661:22;5631:228;;;5736:4;5749:1;5736:16;;;;;;;;:::i;:::-;;;;;5724:29;;5736:16;;5724:3;:29;:::i;:::-;5716:37;;;;:5;:37;:::i;:::-;5708:45;-1:-1:-1;5803:10:12;5811:2;5708:45;5803:10;:::i;:::-;5790:25;;5771:4;5784:1;5771:16;;;;;;;;:::i;:::-;;;;:44;-1:-1:-1;;;;;5771:44:12;;;;;;;;-1:-1:-1;5833:11:12;5842:2;5833:11;;:::i;:::-;;-1:-1:-1;5685:3:12;;;;:::i;:::-;;;;5631:228;;;5879:1;;-1:-1:-1;5578:3:12;;;;:::i;:::-;;;;5540:351;;;-1:-1:-1;5928:9:12;5919:53;5943:4;5939:1;:8;:24;;;;;5951:4;5956:1;5951:7;;;;;;;;:::i;:::-;;;;;-1:-1:-1;;;;;;5951:7:12;:12;5939:24;5919:53;;;5965:3;;;;:::i;:::-;;;;5919:53;;;6003:13;6007:9;6003:1;:13;:::i;:::-;5988:4;:11;:29;;;;:::i;:::-;5981:36;;6027:16;6056:4;-1:-1:-1;;;;;6046:15:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6046:15:12;;6027:34;;6076:9;6071:136;6095:4;6091:1;:8;6071:136;;;6120:9;6140;6132:5;6136:1;6132;:5;:::i;:::-;:17;;;;:::i;:::-;6120:29;;6172:8;;;;;;;;;;;;;;;;;6187:4;6192:1;6187:7;;;;;;;;:::i;:::-;;;;;6172:24;;6187:7;;;;;;6172:24;;;;;;:::i;:::-;;;;;;;;;6163:3;6167:1;6163:6;;;;;;;;:::i;:::-;;;;:33;-1:-1:-1;;;;;6163:33:12;;;;;;;;;6106:101;6101:3;;;;;:::i;:::-;;;;6071:136;;;-1:-1:-1;6223:3:12;5117:1116;-1:-1:-1;;;;;;;;;5117:1116:12:o;2191:235:3:-;2263:7;2298:16;;;:7;:16;;;;;;-1:-1:-1;;;;;2298:16:3;;2324:73;;;;-1:-1:-1;;;2324:73:3;;17110:2:13;2324:73:3;;;17092:21:13;17149:2;17129:18;;;17122:30;17188:34;17168:18;;;17161:62;-1:-1:-1;;;17239:18:13;;;17232:39;17288:19;;2324:73:3;16908:405:13;24303:112:12;1082:7:0;1108:6;-1:-1:-1;;;;;1108:6:0;719:10:8;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;;;;;;:::i;:::-;24356:14:12::1;:21:::0;;-1:-1:-1;;24356:21:12::1;-1:-1:-1::0;;;24356:21:12::1;::::0;;24392:16:::1;::::0;::::1;::::0;24356:21;;24392:16:::1;24303:112::o:0;1929:205:3:-;2001:7;-1:-1:-1;;;;;2028:19:3;;2020:74;;;;-1:-1:-1;;;2020:74:3;;17520:2:13;2020:74:3;;;17502:21:13;17559:2;17539:18;;;17532:30;17598:34;17578:18;;;17571:62;-1:-1:-1;;;17649:18:13;;;17642:40;17699:19;;2020:74:3;17318:406:13;2020:74:3;-1:-1:-1;;;;;;2111:16:3;;;;;:9;:16;;;;;;;1929:205::o;1668:101:0:-;1082:7;1108:6;-1:-1:-1;;;;;1108:6:0;719:10:8;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;;;;;;:::i;:::-;1732:30:::1;1759:1;1732:18;:30::i;:::-;1668:101::o:0;10989:148:12:-;1082:7:0;1108:6;-1:-1:-1;;;;;1108:6:0;719:10:8;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;;;;;;:::i;:::-;11067:21:12::1;:14;11084:4:::0;;11067:21:::1;:::i;:::-;;11103:27;11125:4;;11103:27;;;;;;;:::i;9029:155::-:0;1082:7:0;1108:6;-1:-1:-1;;;;;1108:6:0;719:10:8;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;;;;;;:::i;:::-;9104:11:12::1;:26:::0;;;9145:32:::1;::::0;3852:25:13;;;9145:32:12::1;::::0;3840:2:13;3825:18;9145:32:12::1;3706:177:13::0;22272:705:12;1082:7:0;1108:6;-1:-1:-1;;;;;1108:6:0;719:10:8;25108:23:12;;:110;;-1:-1:-1;25149:17:12;;-1:-1:-1;;;;;25149:17:12;:31;;;;:68;;-1:-1:-1;25184:17:12;;-1:-1:-1;;;;;25184:17:12;719:10:8;25184:33:12;25149:68;25100:150;;;;-1:-1:-1;;;25100:150:12;;;;;;;:::i;:::-;22379:9:::1;22374:597;22394:20:::0;;::::1;22374:597;;;22435:15;22453:9;;22463:1;22453:12;;;;;;;:::i;:::-;;;;;;;22435:30;;22487:16;22495:7;22487;:16::i;:::-;22479:58;;;::::0;-1:-1:-1;;;22479:58:12;;17931:2:13;22479:58:12::1;::::0;::::1;17913:21:13::0;17970:2;17950:18;;;17943:30;18009:31;17989:18;;;17982:59;18058:18;;22479:58:12::1;17729:353:13::0;22479:58:12::1;22551:32;22586:29:::0;;;:20:::1;:29;::::0;;;;22632:20;;22586:29;;22632:25;22629:70:::1;;22676:8;;;;22629:70;22774:20:::0;;22740:12:::1;::::0;::::1;:54:::0;;22756:15:::1;:38:::0;;;::::1;22740:54:::0;;::::1;::::0;;-1:-1:-1;22812:24:12;;;22869:41:::1;::::0;719:10:8;;22888:7:12;;22869:41:::1;::::0;-1:-1:-1;22869:41:12::1;22929:31;::::0;22952:7;;22929:31:::1;::::0;;;::::1;22421:550;;22374:597;22416:3:::0;::::1;::::0;::::1;:::i;:::-;;;;22374:597;;6456:346:::0;6564:13;;;6574:2;6564:13;;;6513;6564;;;;;;6538:23;;6564:13;;;;;;;;;;;-1:-1:-1;6564:13:12;6538:39;;6603:4;6587:20;;:10;6598:1;6587:13;;;;;;;;:::i;:::-;;;;:20;-1:-1:-1;;;;;6587:20:12;;;;;;;;;6633:4;6617:20;;:10;6628:1;6617:13;;;;;;;;:::i;:::-;;;;:20;-1:-1:-1;;;;;6617:20:12;;;;;;;;;6652:9;6647:106;6671:18;6667:22;;6647:106;;;6728:11;6740:1;6728:14;;;;;;;:::i;:::-;;;;6710:10;6721:3;:1;6723;6721:3;:::i;:::-;6710:15;;;;;;;;:::i;:::-;;;;:32;-1:-1:-1;;;;;6710:32:12;;;;;;;;-1:-1:-1;6691:3:12;;;;:::i;:::-;;;;6647:106;;;;6776:18;6783:10;6776:6;:18::i;:::-;6762:33;6456:346;-1:-1:-1;;;6456:346:12:o;9190:127::-;9239:4;9276:1;9262:11;;:15;:48;;;;;9299:11;;9281:15;:29;9262:48;9255:55;;9190:127;:::o;2650:102:3:-;2706:13;2738:7;2731:14;;;;;:::i;7665:28:12:-;;;;;;;:::i;4284:153:3:-;4378:52;719:10:8;4411:8:3;4421;4378:18;:52::i;13834:333:12:-;1082:7:0;1108:6;-1:-1:-1;;;;;1108:6:0;719:10:8;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;;;;;;:::i;:::-;1744:1:2::1;2325:7;;:19:::0;2317:63:::1;;;;-1:-1:-1::0;;;2317:63:2::1;;;;;;;:::i;:::-;1744:1;2455:7;:18:::0;13903:8:12::2;::::0;-1:-1:-1;;;13903:8:12;::::2;;;13902:9;13894:38;;;::::0;-1:-1:-1;;;13894:38:12;;18289:2:13;13894:38:12::2;::::0;::::2;18271:21:13::0;18328:2;18308:18;;;18301:30;-1:-1:-1;;;18347:18:13;;;18340:46;18403:18;;13894:38:12::2;18087:340:13::0;13894:38:12::2;13950:12;::::0;-1:-1:-1;;;;;13950:12:12::2;7624:4;13950:26;13942:66;;;::::0;-1:-1:-1;;;13942:66:12;;18634:2:13;13942:66:12::2;::::0;::::2;18616:21:13::0;18673:2;18653:18;;;18646:30;18712:29;18692:18;;;18685:57;18759:18;;13942:66:12::2;18432:351:13::0;13942:66:12::2;14026:17;:15;:17::i;:::-;14018:51;;;::::0;-1:-1:-1;;;14018:51:12;;18990:2:13;14018:51:12::2;::::0;::::2;18972:21:13::0;19029:2;19009:18;;;19002:30;-1:-1:-1;;;19048:18:13;;;19041:51;19109:18;;14018:51:12::2;18788:345:13::0;14018:51:12::2;14079:8;:15:::0;;-1:-1:-1;;14079:15:12::2;-1:-1:-1::0;;;14079:15:12::2;::::0;;14109:26:::2;14124:10;:8;:10::i;:::-;14109:26;;;;;;:::i;:::-;;;;;;;;14150:10;::::0;::::2;::::0;;;::::2;1701:1:2::1;2628:22:::0;;13834:333:12:o;9528:124::-;9576:4;9612:1;9599:10;;:14;:46;;;;-1:-1:-1;;9635:10:12;;9617:15;:28;;9528:124::o;12238:607::-;1082:7:0;1108:6;-1:-1:-1;;;;;1108:6:0;719:10:8;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;;;;;;:::i;:::-;1744:1:2::1;2325:7;;:19:::0;2317:63:::1;;;;-1:-1:-1::0;;;2317:63:2::1;;;;;;;:::i;:::-;1744:1;2455:7;:18:::0;12399:36:12;;::::2;12378:155;;;::::0;-1:-1:-1;;;12378:155:12;;19340:2:13;12378:155:12::2;::::0;::::2;19322:21:13::0;19379:2;19359:18;;;19352:30;19418:34;19398:18;;;19391:62;19489:34;19469:18;;;19462:62;-1:-1:-1;;;19540:19:13;;;19533:39;19589:19;;12378:155:12::2;19138:476:13::0;12378:155:12::2;12551:18;:16;:18::i;:::-;12543:53;;;::::0;-1:-1:-1;;;12543:53:12;;19821:2:13;12543:53:12::2;::::0;::::2;19803:21:13::0;19860:2;19840:18;;;19833:30;-1:-1:-1;;;19879:18:13;;;19872:52;19941:18;;12543:53:12::2;19619:346:13::0;12543:53:12::2;12614:12;::::0;7624:4:::2;-1:-1:-1::0;;;;;12614:12:12;;::::2;:25;12606:66;;;::::0;-1:-1:-1;;;12606:66:12;;20172:2:13;12606:66:12::2;::::0;::::2;20154:21:13::0;20211:2;20191:18;;;20184:30;20250;20230:18;;;20223:58;20298:18;;12606:66:12::2;19970:352:13::0;12606:66:12::2;12711:8;12706:123;-1:-1:-1::0;;;;;12723:21:12;::::2;::::0;-1:-1:-1;12706:123:12::2;;;12769:45;12787:10;;12798:1;-1:-1:-1::0;;;;;12787:13:12::2;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;12802:8;;12811:1;-1:-1:-1::0;;;;;12802:11:12::2;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;12769:17;:45::i;:::-;12746:3;;12706:123;;;-1:-1:-1::0;;1701:1:2::1;2628:22:::0;;-1:-1:-1;;;12238:607:12:o;20506:673::-;1744:1:2;2325:7;;:19;2317:63;;;;-1:-1:-1;;;2317:63:2;;;;;;;:::i;:::-;1744:1;2455:7;:18;20607:20:12::1;::::0;::::1;;20599:60;;;::::0;-1:-1:-1;;;20599:60:12;;20806:2:13;20599:60:12::1;::::0;::::1;20788:21:13::0;20845:2;20825:18;;;20818:30;20884:29;20864:18;;;20857:57;20931:18;;20599:60:12::1;20604:351:13::0;20599:60:12::1;20698:9;20693:470;20713:20:::0;;::::1;20693:470;;;20758:15;20776:9;;20786:1;20776:12;;;;;;;:::i;:::-;;;;;;;20758:30;;20834:12;719:10:8::0;;640:96;20834:12:12::1;-1:-1:-1::0;;;;;20814:32:12::1;:16;20822:7;20814;:16::i;:::-;-1:-1:-1::0;;;;;20814:32:12::1;;20806:64;;;;-1:-1:-1::0;;;20806:64:12::1;;;;;;;:::i;:::-;20889:32;20924:29:::0;;;:20:::1;:29;::::0;;;;20975:20;;20924:29;;20975:25;20971:178:::1;;21047:15;21024:38:::0;;21089:41:::1;::::0;719:10:8;;21108:7:12;;21089:41:::1;::::0;;;::::1;20971:178;-1:-1:-1::0;;20735:3:12::1;;20693:470;;;-1:-1:-1::0;;1701:1:2;2628:22;;-1:-1:-1;20506:673:12:o;14809:301::-;1082:7:0;1108:6;-1:-1:-1;;;;;1108:6:0;719:10:8;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;;;;;;:::i;:::-;1744:1:2::1;2325:7;;:19:::0;2317:63:::1;;;;-1:-1:-1::0;;;2317:63:2::1;;;;;;;:::i;:::-;1744:1;2455:7;:18:::0;14901:9:12::2;14896:208;14916:20:::0;;::::2;14896:208;;;14957:15;14975:9;;14985:1;14975:12;;;;;;;:::i;:::-;;;;;;;14957:30;;15029:12;719:10:8::0;;640:96;15029:12:12::2;-1:-1:-1::0;;;;;15009:32:12::2;:16;15017:7;15009;:16::i;:::-;-1:-1:-1::0;;;;;15009:32:12::2;;15001:64;;;;-1:-1:-1::0;;;15001:64:12::2;;;;;;;:::i;:::-;15079:14;15085:7;15079:5;:14::i;:::-;-1:-1:-1::0;14938:3:12;::::2;::::0;::::2;:::i;:::-;;;;14896:208;;5368:320:3::0;5537:41;719:10:8;5570:7:3;5537:18;:41::i;:::-;5529:103;;;;-1:-1:-1;;;5529:103:3;;;;;;;:::i;:::-;5642:39;5656:4;5662:2;5666:7;5675:5;5642:13;:39::i;:::-;5368:320;;;;:::o;8833:191:12:-;1082:7:0;1108:6;-1:-1:-1;;;;;1108:6:0;719:10:8;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;;;;;;:::i;:::-;8920:17:12::1;:38:::0;;-1:-1:-1;;;;;;8920:38:12::1;-1:-1:-1::0;;;;;8920:38:12;::::1;::::0;;::::1;::::0;;;8973:44:::1;::::0;::::1;::::0;-1:-1:-1;;8973:44:12::1;8833:191:::0;:::o;9323:149::-;1082:7:0;1108:6;-1:-1:-1;;;;;1108:6:0;719:10:8;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;;;;;;:::i;:::-;9396:10:12::1;:24:::0;;;9435:30:::1;::::0;3852:25:13;;;9435:30:12::1;::::0;3840:2:13;3825:18;9435:30:12::1;3706:177:13::0;10360:534:12;10433:13;10466:16;10474:7;10466;:16::i;:::-;10458:56;;;;-1:-1:-1;;;10458:56:12;;14356:2:13;10458:56:12;;;14338:21:13;14395:2;14375:18;;;14368:30;14434:29;14414:18;;;14407:57;14481:18;;10458:56:12;14154:351:13;10458:56:12;10529:8;;-1:-1:-1;;;10529:8:12;;;;10524:62;;10560:15;10553:22;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10360:534;;;:::o;10524:62::-;10595:12;10610:21;;;:12;:21;;;;;;;10645:10;;;10641:182;;10671:21;10695:10;:8;:10::i;:::-;10671:34;;10750:1;10732:7;10726:21;:25;:86;;;;;;;;;;;;;;;;;10778:7;10787:18;:7;:16;:18::i;:::-;10761:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;10726:86;10719:93;10360:534;-1:-1:-1;;;;10360:534:12:o;10641:182::-;10874:11;10880:4;10874:5;:11::i;:::-;10846:40;;;;;;;;:::i;:::-;;;;;;;;;;;;;10832:55;;;10360:534;;;:::o;14270:113::-;1082:7:0;1108:6;-1:-1:-1;;;;;1108:6:0;719:10:8;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;;;;;;:::i;:::-;1744:1:2::1;2325:7;;:19:::0;2317:63:::1;;;;-1:-1:-1::0;;;2317:63:2::1;;;;;;;:::i;:::-;1744:1;2455:7;:18:::0;14344:32:12::2;::::0;14366:9:::2;3852:25:13::0;;719:10:8;;14344:32:12::2;::::0;3840:2:13;3825:18;14344:32:12::2;;;;;;;1701:1:2::1;2628:22:::0;;14270:113:12:o;18812:598::-;1744:1:2;2325:7;;:19;2317:63;;;;-1:-1:-1;;;2317:63:2;;;;;;;:::i;:::-;1744:1;2455:7;:18;719:10:8;18936:17:12::1;18944:8:::0;18936:7:::1;:17::i;:::-;-1:-1:-1::0;;;;;18936:33:12::1;;18928:65;;;;-1:-1:-1::0;;;18928:65:12::1;;;;;;;:::i;:::-;19011:28;::::0;::::1;::::0;::::1;;;19003:83;;;::::0;-1:-1:-1;;;19003:83:12;;22414:2:13;19003:83:12::1;::::0;::::1;22396:21:13::0;22453:2;22433:18;;;22426:30;22492:34;22472:18;;;22465:62;-1:-1:-1;;;22543:18:13;;;22536:40;22593:19;;19003:83:12::1;22212:406:13::0;19003:83:12::1;19096:30;::::0;;;:20:::1;:30;::::0;;;;:46:::1;;:53:::0;;-1:-1:-1;;19096:53:12::1;19145:4;19096:53;::::0;;19159:38:::1;19176:5:::0;19183:3;19117:8;19159:16:::1;:38::i;:::-;19256:5;19207:30:::0;;;:20:::1;:30;::::0;;;;:46:::1;::::0;::::1;:54:::0;;-1:-1:-1;;19207:54:12::1;::::0;;19275:44;:49;19271:133:::1;;19384:8;19379:3;-1:-1:-1::0;;;;;19345:48:12::1;19372:5;-1:-1:-1::0;;;;;19345:48:12::1;;;;;;;;;;;-1:-1:-1::0;;1701:1:2;2628:22;;-1:-1:-1;18812:598:12:o;21184:711::-;1744:1:2;2325:7;;:19;2317:63;;;;-1:-1:-1;;;2317:63:2;;;;;;;:::i;:::-;1744:1;2455:7;:18;21305:9:12::1;21300:579;21320:20:::0;;::::1;21300:579;;;21365:15;21383:9;;21393:1;21383:12;;;;;;;:::i;:::-;;;;;;;21365:30;;21441:12;719:10:8::0;;640:96;21441:12:12::1;-1:-1:-1::0;;;;;21421:32:12::1;:16;21429:7;21421;:16::i;:::-;-1:-1:-1::0;;;;;21421:32:12::1;;21413:64;;;;-1:-1:-1::0;;;21413:64:12::1;;;;;;;:::i;:::-;21496:32;21531:29:::0;;;:20:::1;:29;::::0;;;;21602:20;;21644:17;;21640:225:::1;;21685:12;::::0;::::1;:47:::0;;21701:15:::1;:31:::0;;::::1;21685:47;::::0;;-1:-1:-1;21754:24:12;;;21805:41:::1;::::0;719:10:8;;21824:7:12;;21805:41:::1;::::0;-1:-1:-1;21805:41:12::1;21640:225;-1:-1:-1::0;;;21342:3:12::1;;21300:579;;13467:228:::0;1082:7:0;1108:6;-1:-1:-1;;;;;1108:6:0;719:10:8;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;;;;;;:::i;:::-;1744:1:2::1;2325:7;;:19:::0;2317:63:::1;;;;-1:-1:-1::0;;;2317:63:2::1;;;;;;;:::i;:::-;1744:1;2455:7;:18:::0;13544:12:12::2;::::0;-1:-1:-1;;;;;13544:12:12::2;:15:::0;13536:56:::2;;;::::0;-1:-1:-1;;;13536:56:12;;22825:2:13;13536:56:12::2;::::0;::::2;22807:21:13::0;22864:2;22844:18;;;22837:30;22903;22883:18;;;22876:58;22951:18;;13536:56:12::2;22623:352:13::0;13536:56:12::2;13602:26;13612:12;13623:1;7624:4;13612:12;:::i;:::-;13626:1;13602:9;:26::i;:::-;-1:-1:-1::0;13638:26:12::2;719:10:8::0;13662:1:12::2;13638:9;:26::i;:::-;13676:12;13674:14:::0;;13676:12:::2;::::0;13674:14:::2;::::0;-1:-1:-1;;;;;13674:14:12::2;;:::i;:::-;;;;;;;;-1:-1:-1::0;;;;;13674:14:12::2;;;;;-1:-1:-1::0;;;;;13674:14:12::2;;;;;;1701:1:2::1;2628:7:::0;:22:::1;;;;13467:228:12:o:0;1918:198:0:-;1082:7;1108:6;-1:-1:-1;;;;;1108:6:0;719:10:8;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;2006:22:0;::::1;1998:73;;;::::0;-1:-1:-1;;;1998:73:0;;23396:2:13;1998:73:0::1;::::0;::::1;23378:21:13::0;23435:2;23415:18;;;23408:30;23474:34;23454:18;;;23447:62;-1:-1:-1;;;23525:18:13;;;23518:36;23571:19;;1998:73:0::1;23194:402:13::0;1998:73:0::1;2081:28;2100:8;2081:18;:28::i;:::-;1918:198:::0;:::o;11625:405:12:-;1082:7:0;1108:6;-1:-1:-1;;;;;1108:6:0;719:10:8;25108:23:12;;:110;;-1:-1:-1;25149:17:12;;-1:-1:-1;;;;;25149:17:12;:31;;;;:68;;-1:-1:-1;25184:17:12;;-1:-1:-1;;;;;25184:17:12;719:10:8;25184:33:12;25149:68;25100:150;;;;-1:-1:-1;;;25100:150:12;;;;;;;:::i;:::-;11760:39;;::::1;11752:94;;;::::0;-1:-1:-1;;;11752:94:12;;23803:2:13;11752:94:12::1;::::0;::::1;23785:21:13::0;23842:2;23822:18;;;23815:30;23881:34;23861:18;;;23854:62;-1:-1:-1;;;23932:18:13;;;23925:40;23982:19;;11752:94:12::1;23601:406:13::0;11752:94:12::1;11864:20:::0;11856:43:::1;;;::::0;-1:-1:-1;;;11856:43:12;;24214:2:13;11856:43:12::1;::::0;::::1;24196:21:13::0;24253:2;24233:18;;;24226:30;-1:-1:-1;;;24272:18:13;;;24265:40;24322:18;;11856:43:12::1;24012:334:13::0;11856:43:12::1;11914:9;11909:115;11929:20:::0;;::::1;11909:115;;;11970:43;11983:9;;11993:1;11983:12;;;;;;;:::i;:::-;;;;;;;11997;;12010:1;11997:15;;;;;;;:::i;:::-;;;;;;;11970:12;:43::i;:::-;11951:3:::0;::::1;::::0;::::1;:::i;:::-;;;;11909:115;;;;11625:405:::0;;;;:::o;8432:157::-;1082:7:0;1108:6;-1:-1:-1;;;;;1108:6:0;719:10:8;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;;;;;;:::i;:::-;8513:24:12::1;:10;8526:11:::0;;8513:24:::1;:::i;:::-;;8552:30;8570:11;;8552:30;;;;;;;:::i;7160:125:3:-:0;7225:4;7248:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7248:16:3;:30;;;7160:125::o;11169:171::-;11243:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;11243:29:3;-1:-1:-1;;;;;11243:29:3;;;;;;;;:24;;11296:23;11243:24;11296:14;:23::i;:::-;-1:-1:-1;;;;;11287:46:3;;;;;;;;;;;11169:171;;:::o;7443:344::-;7536:4;7560:16;7568:7;7560;:16::i;:::-;7552:73;;;;-1:-1:-1;;;7552:73:3;;24553:2:13;7552:73:3;;;24535:21:13;24592:2;24572:18;;;24565:30;24631:34;24611:18;;;24604:62;-1:-1:-1;;;24682:18:13;;;24675:42;24734:19;;7552:73:3;24351:408:13;7552:73:3;7635:13;7651:23;7666:7;7651:14;:23::i;:::-;7635:39;;7703:5;-1:-1:-1;;;;;7692:16:3;:7;-1:-1:-1;;;;;7692:16:3;;:52;;;-1:-1:-1;;;;;;4623:25:3;;;4600:4;4623:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;7712:32;7692:87;;;;7772:7;-1:-1:-1;;;;;7748:31:3;:20;7760:7;7748:11;:20::i;:::-;-1:-1:-1;;;;;7748:31:3;;7684:96;7443:344;-1:-1:-1;;;;7443:344:3:o;10453:605::-;10607:4;-1:-1:-1;;;;;10580:31:3;:23;10595:7;10580:14;:23::i;:::-;-1:-1:-1;;;;;10580:31:3;;10572:81;;;;-1:-1:-1;;;10572:81:3;;24966:2:13;10572:81:3;;;24948:21:13;25005:2;24985:18;;;24978:30;25044:34;25024:18;;;25017:62;-1:-1:-1;;;25095:18:13;;;25088:35;25140:19;;10572:81:3;24764:401:13;10572:81:3;-1:-1:-1;;;;;10671:16:3;;10663:65;;;;-1:-1:-1;;;10663:65:3;;25372:2:13;10663:65:3;;;25354:21:13;25411:2;25391:18;;;25384:30;25450:34;25430:18;;;25423:62;-1:-1:-1;;;25501:18:13;;;25494:34;25545:19;;10663:65:3;25170:400:13;10663:65:3;10739:39;10760:4;10766:2;10770:7;10739:20;:39::i;:::-;10840:29;10857:1;10861:7;10840:8;:29::i;:::-;-1:-1:-1;;;;;10880:15:3;;;;;;:9;:15;;;;;:20;;10899:1;;10880:15;:20;;10899:1;;10880:20;:::i;:::-;;;;-1:-1:-1;;;;;;;10910:13:3;;;;;;:9;:13;;;;;:18;;10927:1;;10910:13;:18;;10927:1;;10910:18;:::i;:::-;;;;-1:-1:-1;;10938:16:3;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;10938:21:3;-1:-1:-1;;;;;10938:21:3;;;;;;;;;10975:27;;10938:16;;10975:27;;;;;;;3608:331;3538:401;;:::o;2110:117:1:-;1168:7;;;;1669:41;;;;-1:-1:-1;;;1669:41:1;;25777:2:13;1669:41:1;;;25759:21:13;25816:2;25796:18;;;25789:30;-1:-1:-1;;;25835:18:13;;;25828:50;25895:18;;1669:41:1;25575:344:13;1669:41:1;2168:7:::1;:15:::0;;-1:-1:-1;;2168:15:1::1;::::0;;2198:22:::1;719:10:8::0;2207:12:1::1;2198:22;::::0;-1:-1:-1;;;;;1692:32:13;;;1674:51;;1662:2;1647:18;2198:22:1::1;;;;;;;2110:117::o:0;1863:115::-;1168:7;;;;1411:9;1403:38;;;;-1:-1:-1;;;1403:38:1;;26126:2:13;1403:38:1;;;26108:21:13;26165:2;26145:18;;;26138:30;-1:-1:-1;;;26184:18:13;;;26177:46;26240:18;;1403:38:1;25924:340:13;1403:38:1;1922:7:::1;:14:::0;;-1:-1:-1;;1922:14:1::1;1932:4;1922:14;::::0;;1951:20:::1;1958:12;719:10:8::0;;640:96;2270:187:0;2343:16;2362:6;;-1:-1:-1;;;;;2378:17:0;;;-1:-1:-1;;;;;;2378:17:0;;;;;;2410:40;;2362:6;;;;;;;2410:40;;2343:16;2410:40;2333:124;2270:187;:::o;11475:307:3:-;11625:8;-1:-1:-1;;;;;11616:17:3;:5;-1:-1:-1;;;;;11616:17:3;;11608:55;;;;-1:-1:-1;;;11608:55:3;;26471:2:13;11608:55:3;;;26453:21:13;26510:2;26490:18;;;26483:30;26549:27;26529:18;;;26522:55;26594:18;;11608:55:3;26269:349:13;11608:55:3;-1:-1:-1;;;;;11673:25:3;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;11673:46:3;;;;;;;;;;11734:41;;540::13;;;11734::3;;513:18:13;11734:41:3;;;;;;;11475:307;;;:::o;10181:113:12:-;10241:13;10273:14;10266:21;;;;;:::i;12850:520::-;12953:1;12943:7;:11;;;12935:43;;;;-1:-1:-1;;;12935:43:12;;26825:2:13;12935:43:12;;;26807:21:13;26864:2;26844:18;;;26837:30;-1:-1:-1;;;26883:18:13;;;26876:49;26942:18;;12935:43:12;26623:343:13;12935:43:12;13037:12;;7624:4;-1:-1:-1;;;;;13037:12:12;;;:22;;;;:36;;;;;13012:129;;;;-1:-1:-1;;;13012:129:12;;27173:2:13;13012:129:12;;;27155:21:13;27212:2;27192:18;;;27185:30;27251:34;27231:18;;;27224:62;-1:-1:-1;;;27302:18:13;;;27295:32;27344:19;;13012:129:12;26971:398:13;13012:129:12;13176:15;13194:18;:16;:18::i;:::-;13176:36;;13230:29;13236:13;13251:7;13230:5;:29::i;:::-;-1:-1:-1;13306:12:12;13304:14;;-1:-1:-1;;;;;13304:14:12;;;13277:9;13304:14;;-1:-1:-1;;13304:14:12;;;;;;-1:-1:-1;;13277:9:12;13341:11;;;13155:199;;12850:520;;:::o;9723:406:3:-;9782:13;9798:23;9813:7;9798:14;:23::i;:::-;9782:39;;9832:48;9853:5;9868:1;9872:7;9832:20;:48::i;:::-;9918:29;9935:1;9939:7;9918:8;:29::i;:::-;-1:-1:-1;;;;;9958:16:3;;;;;;:9;:16;;;;;:21;;9978:1;;9958:16;:21;;9978:1;;9958:21;:::i;:::-;;;;-1:-1:-1;;9996:16:3;;;;:7;:16;;;;;;9989:23;;-1:-1:-1;;;;;;9989:23:3;;;10028:36;10004:7;;9996:16;-1:-1:-1;;;;;10028:36:3;;;;;9996:16;;10028:36;9997:178:12;;:::o;6550:307:3:-;6701:28;6711:4;6717:2;6721:7;6701:9;:28::i;:::-;6747:48;6770:4;6776:2;6780:7;6789:5;6747:22;:48::i;:::-;6739:111;;;;-1:-1:-1;;;6739:111:3;;;;;;;:::i;328:703:9:-;384:13;601:5;610:1;601:10;597:51;;-1:-1:-1;;627:10:9;;;;;;;;;;;;-1:-1:-1;;;627:10:9;;;;;328:703::o;597:51::-;672:5;657:12;711:75;718:9;;711:75;;743:8;;;;:::i;:::-;;-1:-1:-1;765:10:9;;-1:-1:-1;773:2:9;765:10;;:::i;:::-;;;711:75;;;795:19;827:6;-1:-1:-1;;;;;817:17:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;817:17:9;;795:39;;844:150;851:10;;844:150;;877:11;887:1;877:11;;:::i;:::-;;-1:-1:-1;945:10:9;953:2;945:5;:10;:::i;:::-;932:24;;:2;:24;:::i;:::-;919:39;;902:6;909;902:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;902:56:9;;;;;;;;-1:-1:-1;972:11:9;981:2;972:11;;:::i;:::-;;;844:150;;15460:309:12;15530:7;15549:11;15563:12;15576:3;15563:17;;;;;;;:::i;:::-;;;:22;:52;;15598:12;15611:3;15598:17;;;;;;;:::i;:::-;;;15563:52;;;15588:7;:3;15594:1;15588:7;:::i;:::-;15549:66;;15645:12;15658:10;15645:24;;;;;;;:::i;:::-;;;:29;:97;;15718:12;15731:10;15718:24;;;;;;;:::i;:::-;;;15645:97;;;15689:14;:10;15702:1;15689:14;:::i;:::-;15625:12;15638:3;15625:17;;;;;;;:::i;:::-;;:117;15759:3;15460:309;-1:-1:-1;;;15460:309:12:o;8117:108:3:-;8192:26;8202:2;8206:7;8192:26;;;;;;;;;;;;:9;:26::i;23197:412:12:-;1168:7:1;;;;23344:9:12;23336:43;;;;-1:-1:-1;;;23336:43:12;;28112:2:13;23336:43:12;;;28094:21:13;28151:2;28131:18;;;28124:30;-1:-1:-1;;;28170:18:13;;;28163:51;28231:18;;23336:43:12;27910:345:13;23336:43:12;23394:29;;;;:20;:29;;;;;:45;;;;;23389:159;;23463:29;;;;:20;:29;;;;;:43;:48;23455:82;;;;-1:-1:-1;;;23455:82:12;;28462:2:13;23455:82:12;;;28444:21:13;28501:2;28481:18;;;28474:30;-1:-1:-1;;;28520:18:13;;;28513:51;28581:18;;23455:82:12;28260:345:13;15242:213:12;15361:12;;15288:7;;-1:-1:-1;;;;;15361:12:12;7624:4;15348:25;15394:44;-1:-1:-1;;15404:8:12;;15348:25;15414:14;16577:12;;16339:315;;;16395:12;-1:-1:-1;;16395:16:12;16385:27;16339:315;;;;30359:19:13;;;;16442:16:12;30394:12:13;;;30387:28;16488:15:12;30431:12:13;;;;30424:28;;;;-1:-1:-1;;16533:14:12;30536:15:13;;30532:24;;30518:12;;;30511:46;-1:-1:-1;;;;;;30614:3:13;30592:16;;;;;;;;30573:13;;;30566:74;16619:9:12;30675:15:13;;30671:24;;;30656:13;;;30649:47;16339:315:12;;;;;;;;;30712:13:13;;;;16339:315:12;;;16304:372;;;;;;16162:549;15414:14;:23;;;;;:::i;:::-;;15394:9;:44::i;:::-;15387:51;;;15242:213;:::o;9079:427:3:-;-1:-1:-1;;;;;9158:16:3;;9150:61;;;;-1:-1:-1;;;9150:61:3;;28812:2:13;9150:61:3;;;28794:21:13;;;28831:18;;;28824:30;28890:34;28870:18;;;28863:62;28942:18;;9150:61:3;28610:356:13;9150:61:3;9230:16;9238:7;9230;:16::i;:::-;9229:17;9221:58;;;;-1:-1:-1;;;9221:58:3;;29173:2:13;9221:58:3;;;29155:21:13;29212:2;29192:18;;;29185:30;29251;29231:18;;;29224:58;29299:18;;9221:58:3;28971:352:13;9221:58:3;9290:45;9319:1;9323:2;9327:7;9290:20;:45::i;:::-;-1:-1:-1;;;;;9346:13:3;;;;;;:9;:13;;;;;:18;;9363:1;;9346:13;:18;;9363:1;;9346:18;:::i;:::-;;;;-1:-1:-1;;9374:16:3;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;9374:21:3;-1:-1:-1;;;;;9374:21:3;;;;;;;;9411:33;;9374:16;;;9411:33;;9374:16;;9411:33;9997:178:12;;:::o;12335:778:3:-;12485:4;-1:-1:-1;;;;;12505:13:3;;1465:19:7;:23;12501:606:3;;12540:72;;-1:-1:-1;;;12540:72:3;;-1:-1:-1;;;;;12540:36:3;;;;;:72;;719:10:8;;12591:4:3;;12597:7;;12606:5;;12540:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12540:72:3;;;;;;;;-1:-1:-1;;12540:72:3;;;;;;;;;;;;:::i;:::-;;;12536:519;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12779:6;:13;12796:1;12779:18;12775:266;;12821:60;;-1:-1:-1;;;12821:60:3;;;;;;;:::i;12775:266::-;12993:6;12987:13;12978:6;12974:2;12970:15;12963:38;12536:519;-1:-1:-1;;;;;;12662:51:3;-1:-1:-1;;;12662:51:3;;-1:-1:-1;12655:58:3;;12501:606;-1:-1:-1;13092:4:3;12335:778;;;;;;:::o;8446:311::-;8571:18;8577:2;8581:7;8571:5;:18::i;:::-;8620:54;8651:1;8655:2;8659:7;8668:5;8620:22;:54::i;:::-;8599:151;;;;-1:-1:-1;;;8599:151:3;;;;;;;:::i;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:131:13;-1:-1:-1;;;;;;88:32:13;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:258::-;664:1;674:113;688:6;685:1;682:13;674:113;;;764:11;;;758:18;745:11;;;738:39;710:2;703:10;674:113;;;805:6;802:1;799:13;796:48;;;-1:-1:-1;;840:1:13;822:16;;815:27;592:258::o;855:::-;897:3;935:5;929:12;962:6;957:3;950:19;978:63;1034:6;1027:4;1022:3;1018:14;1011:4;1004:5;1000:16;978:63;:::i;:::-;1095:2;1074:15;-1:-1:-1;;1070:29:13;1061:39;;;;1102:4;1057:50;;855:258;-1:-1:-1;;855:258:13:o;1118:220::-;1267:2;1256:9;1249:21;1230:4;1287:45;1328:2;1317:9;1313:18;1305:6;1287:45;:::i;1343:180::-;1402:6;1455:2;1443:9;1434:7;1430:23;1426:32;1423:52;;;1471:1;1468;1461:12;1423:52;-1:-1:-1;1494:23:13;;1343:180;-1:-1:-1;1343:180:13:o;1736:160::-;1801:20;;1857:13;;1850:21;1840:32;;1830:60;;1886:1;1883;1876:12;1830:60;1736:160;;;:::o;1901:180::-;1957:6;2010:2;1998:9;1989:7;1985:23;1981:32;1978:52;;;2026:1;2023;2016:12;1978:52;2049:26;2065:9;2049:26;:::i;2086:173::-;2154:20;;-1:-1:-1;;;;;2203:31:13;;2193:42;;2183:70;;2249:1;2246;2239:12;2264:254;2332:6;2340;2393:2;2381:9;2372:7;2368:23;2364:32;2361:52;;;2409:1;2406;2399:12;2361:52;2432:29;2451:9;2432:29;:::i;:::-;2422:39;2508:2;2493:18;;;;2480:32;;-1:-1:-1;;;2264:254:13:o;2523:248::-;2591:6;2599;2652:2;2640:9;2631:7;2627:23;2623:32;2620:52;;;2668:1;2665;2658:12;2620:52;-1:-1:-1;;2691:23:13;;;2761:2;2746:18;;;2733:32;;-1:-1:-1;2523:248:13:o;2776:328::-;2853:6;2861;2869;2922:2;2910:9;2901:7;2897:23;2893:32;2890:52;;;2938:1;2935;2928:12;2890:52;2961:29;2980:9;2961:29;:::i;:::-;2951:39;;3009:38;3043:2;3032:9;3028:18;3009:38;:::i;:::-;2999:48;;3094:2;3083:9;3079:18;3066:32;3056:42;;2776:328;;;;;:::o;3109:592::-;3180:6;3188;3241:2;3229:9;3220:7;3216:23;3212:32;3209:52;;;3257:1;3254;3247:12;3209:52;3297:9;3284:23;-1:-1:-1;;;;;3367:2:13;3359:6;3356:14;3353:34;;;3383:1;3380;3373:12;3353:34;3421:6;3410:9;3406:22;3396:32;;3466:7;3459:4;3455:2;3451:13;3447:27;3437:55;;3488:1;3485;3478:12;3437:55;3528:2;3515:16;3554:2;3546:6;3543:14;3540:34;;;3570:1;3567;3560:12;3540:34;3615:7;3610:2;3601:6;3597:2;3593:15;3589:24;3586:37;3583:57;;;3636:1;3633;3626:12;3583:57;3667:2;3659:11;;;;;3689:6;;-1:-1:-1;3109:592:13;;-1:-1:-1;;;;3109:592:13:o;4222:127::-;4283:10;4278:3;4274:20;4271:1;4264:31;4314:4;4311:1;4304:15;4338:4;4335:1;4328:15;4354:718;4396:5;4449:3;4442:4;4434:6;4430:17;4426:27;4416:55;;4467:1;4464;4457:12;4416:55;4503:6;4490:20;-1:-1:-1;;;;;4566:2:13;4562;4559:10;4556:36;;;4572:18;;:::i;:::-;4647:2;4641:9;4615:2;4701:13;;-1:-1:-1;;4697:22:13;;;4721:2;4693:31;4689:40;4677:53;;;4745:18;;;4765:22;;;4742:46;4739:72;;;4791:18;;:::i;:::-;4831:10;4827:2;4820:22;4866:2;4858:6;4851:18;4912:3;4905:4;4900:2;4892:6;4888:15;4884:26;4881:35;4878:55;;;4929:1;4926;4919:12;4878:55;4993:2;4986:4;4978:6;4974:17;4967:4;4959:6;4955:17;4942:54;5040:1;5033:4;5028:2;5020:6;5016:15;5012:26;5005:37;5060:6;5051:15;;;;;;4354:718;;;;:::o;5077:320::-;5145:6;5198:2;5186:9;5177:7;5173:23;5169:32;5166:52;;;5214:1;5211;5204:12;5166:52;5254:9;5241:23;-1:-1:-1;;;;;5279:6:13;5276:30;5273:50;;;5319:1;5316;5309:12;5273:50;5342:49;5383:7;5374:6;5363:9;5359:22;5342:49;:::i;5625:186::-;5684:6;5737:2;5725:9;5716:7;5712:23;5708:32;5705:52;;;5753:1;5750;5743:12;5705:52;5776:29;5795:9;5776:29;:::i;5816:367::-;5879:8;5889:6;5943:3;5936:4;5928:6;5924:17;5920:27;5910:55;;5961:1;5958;5951:12;5910:55;-1:-1:-1;5984:20:13;;-1:-1:-1;;;;;6016:30:13;;6013:50;;;6059:1;6056;6049:12;6013:50;6096:4;6088:6;6084:17;6072:29;;6156:3;6149:4;6139:6;6136:1;6132:14;6124:6;6120:27;6116:38;6113:47;6110:67;;;6173:1;6170;6163:12;6110:67;5816:367;;;;;:::o;6188:437::-;6274:6;6282;6335:2;6323:9;6314:7;6310:23;6306:32;6303:52;;;6351:1;6348;6341:12;6303:52;6391:9;6378:23;-1:-1:-1;;;;;6416:6:13;6413:30;6410:50;;;6456:1;6453;6446:12;6410:50;6495:70;6557:7;6548:6;6537:9;6533:22;6495:70;:::i;:::-;6584:8;;6469:96;;-1:-1:-1;6188:437:13;-1:-1:-1;;;;6188:437:13:o;6815:254::-;6880:6;6888;6941:2;6929:9;6920:7;6916:23;6912:32;6909:52;;;6957:1;6954;6947:12;6909:52;6980:29;6999:9;6980:29;:::i;:::-;6970:39;;7028:35;7059:2;7048:9;7044:18;7028:35;:::i;:::-;7018:45;;6815:254;;;;;:::o;7074:772::-;7195:6;7203;7211;7219;7272:2;7260:9;7251:7;7247:23;7243:32;7240:52;;;7288:1;7285;7278:12;7240:52;7328:9;7315:23;-1:-1:-1;;;;;7398:2:13;7390:6;7387:14;7384:34;;;7414:1;7411;7404:12;7384:34;7453:70;7515:7;7506:6;7495:9;7491:22;7453:70;:::i;:::-;7542:8;;-1:-1:-1;7427:96:13;-1:-1:-1;7630:2:13;7615:18;;7602:32;;-1:-1:-1;7646:16:13;;;7643:36;;;7675:1;7672;7665:12;7643:36;;7714:72;7778:7;7767:8;7756:9;7752:24;7714:72;:::i;:::-;7074:772;;;;-1:-1:-1;7805:8:13;-1:-1:-1;;;;7074:772:13:o;7851:537::-;7946:6;7954;7962;7970;8023:3;8011:9;8002:7;7998:23;7994:33;7991:53;;;8040:1;8037;8030:12;7991:53;8063:29;8082:9;8063:29;:::i;:::-;8053:39;;8111:38;8145:2;8134:9;8130:18;8111:38;:::i;:::-;8101:48;;8196:2;8185:9;8181:18;8168:32;8158:42;;8251:2;8240:9;8236:18;8223:32;-1:-1:-1;;;;;8270:6:13;8267:30;8264:50;;;8310:1;8307;8300:12;8264:50;8333:49;8374:7;8365:6;8354:9;8350:22;8333:49;:::i;:::-;8323:59;;;7851:537;;;;;;;:::o;8598:260::-;8666:6;8674;8727:2;8715:9;8706:7;8702:23;8698:32;8695:52;;;8743:1;8740;8733:12;8695:52;8766:29;8785:9;8766:29;:::i;:::-;8756:39;;8814:38;8848:2;8837:9;8833:18;8814:38;:::i;9641:380::-;9720:1;9716:12;;;;9763;;;9784:61;;9838:4;9830:6;9826:17;9816:27;;9784:61;9891:2;9883:6;9880:14;9860:18;9857:38;9854:161;;9937:10;9932:3;9928:20;9925:1;9918:31;9972:4;9969:1;9962:15;10000:4;9997:1;9990:15;9854:161;;9641:380;;;:::o;10439:356::-;10641:2;10623:21;;;10660:18;;;10653:30;10719:34;10714:2;10699:18;;10692:62;10786:2;10771:18;;10439:356::o;11627:338::-;11829:2;11811:21;;;11868:2;11848:18;;;11841:30;-1:-1:-1;;;11902:2:13;11887:18;;11880:44;11956:2;11941:18;;11627:338::o;12223:413::-;12425:2;12407:21;;;12464:2;12444:18;;;12437:30;12503:34;12498:2;12483:18;;12476:62;-1:-1:-1;;;12569:2:13;12554:18;;12547:47;12626:3;12611:19;;12223:413::o;12641:390::-;12800:2;12789:9;12782:21;12839:6;12834:2;12823:9;12819:18;12812:34;12896:6;12888;12883:2;12872:9;12868:18;12855:48;12952:1;12923:22;;;12947:2;12919:31;;;12912:42;;;;13015:2;12994:15;;;-1:-1:-1;;12990:29:13;12975:45;12971:54;;12641:390;-1:-1:-1;12641:390:13:o;13450:355::-;13652:2;13634:21;;;13691:2;13671:18;;;13664:30;13730:33;13725:2;13710:18;;13703:61;13796:2;13781:18;;13450:355::o;14510:127::-;14571:10;14566:3;14562:20;14559:1;14552:31;14602:4;14599:1;14592:15;14626:4;14623:1;14616:15;14642:125;14682:4;14710:1;14707;14704:8;14701:34;;;14715:18;;:::i;:::-;-1:-1:-1;14752:9:13;;14642:125::o;14772:128::-;14812:3;14843:1;14839:6;14836:1;14833:13;14830:39;;;14849:18;;:::i;:::-;-1:-1:-1;14885:9:13;;14772:128::o;14905:127::-;14966:10;14961:3;14957:20;14954:1;14947:31;14997:4;14994:1;14987:15;15021:4;15018:1;15011:15;15037:135;15076:3;15097:17;;;15094:43;;15117:18;;:::i;:::-;-1:-1:-1;15164:1:13;15153:13;;15037:135::o;15177:168::-;15217:7;15283:1;15279;15275:6;15271:14;15268:1;15265:21;15260:1;15253:9;15246:17;15242:45;15239:71;;;15290:18;;:::i;:::-;-1:-1:-1;15330:9:13;;15177:168::o;15350:127::-;15411:10;15406:3;15402:20;15399:1;15392:31;15442:4;15439:1;15432:15;15466:4;15463:1;15456:15;15482:120;15522:1;15548;15538:35;;15553:18;;:::i;:::-;-1:-1:-1;15587:9:13;;15482:120::o;15607:267::-;15646:4;15675:9;;;15700:10;;-1:-1:-1;;;15719:19:13;;15712:27;;15696:44;15693:70;;;15743:18;;:::i;:::-;-1:-1:-1;;;;;15790:27:13;;15783:35;;15775:44;;15772:70;;;15822:18;;:::i;:::-;-1:-1:-1;;15859:9:13;;15607:267::o;15879:258::-;15918:7;15950:6;15983:2;15980:1;15976:10;16013:2;16010:1;16006:10;16069:3;16065:2;16061:12;16056:3;16053:21;16046:3;16039:11;16032:19;16028:47;16025:73;;;16078:18;;:::i;:::-;16118:13;;15879:258;-1:-1:-1;;;;15879:258:13:o;16142:228::-;16181:3;16209:10;16246:2;16243:1;16239:10;16276:2;16273:1;16269:10;16307:3;16303:2;16299:12;16294:3;16291:21;16288:47;;;16315:18;;:::i;:::-;16351:13;;16142:228;-1:-1:-1;;;;16142:228:13:o;16375:183::-;16406:1;16432:10;16469:2;16466:1;16462:10;16491:3;16481:37;;16498:18;;:::i;:::-;16536:10;;16532:20;;;;;16375:183;-1:-1:-1;;16375:183:13:o;16563:191::-;16602:1;16628:10;16665:2;16662:1;16658:10;16687:3;16677:37;;16694:18;;:::i;:::-;16732:10;;16728:20;;;;;16563:191;-1:-1:-1;;16563:191:13:o;16759:144::-;16797:3;-1:-1:-1;;;16818:22:13;;16815:48;;16843:18;;:::i;:::-;-1:-1:-1;;;16879:18:13;;16759:144::o;20327:272::-;20385:6;20438:2;20426:9;20417:7;20413:23;20409:32;20406:52;;;20454:1;20451;20444:12;20406:52;20493:9;20480:23;20543:6;20536:5;20532:18;20525:5;20522:29;20512:57;;20565:1;20562;20555:12;20960:343;21162:2;21144:21;;;21201:2;21181:18;;;21174:30;-1:-1:-1;;;21235:2:13;21220:18;;21213:49;21294:2;21279:18;;20960:343::o;21308:470::-;21487:3;21525:6;21519:13;21541:53;21587:6;21582:3;21575:4;21567:6;21563:17;21541:53;:::i;:::-;21657:13;;21616:16;;;;21679:57;21657:13;21616:16;21713:4;21701:17;;21679:57;:::i;21783:424::-;-1:-1:-1;;;22040:3:13;22033:22;22015:3;22084:6;22078:13;22100:61;22154:6;22150:1;22145:3;22141:11;22134:4;22126:6;22122:17;22100:61;:::i;:::-;22181:16;;;;22199:1;22177:24;;21783:424;-1:-1:-1;;21783:424:13:o;22980:209::-;23018:3;-1:-1:-1;;;;;23099:2:13;23092:5;23088:14;23126:2;23117:7;23114:15;23111:41;;23132:18;;:::i;:::-;23181:1;23168:15;;22980:209;-1:-1:-1;;;22980:209:13:o;27374:414::-;27576:2;27558:21;;;27615:2;27595:18;;;27588:30;27654:34;27649:2;27634:18;;27627:62;-1:-1:-1;;;27720:2:13;27705:18;;27698:48;27778:3;27763:19;;27374:414::o;27793:112::-;27825:1;27851;27841:35;;27856:18;;:::i;:::-;-1:-1:-1;27890:9:13;;27793:112::o;29328:489::-;-1:-1:-1;;;;;29597:15:13;;;29579:34;;29649:15;;29644:2;29629:18;;29622:43;29696:2;29681:18;;29674:34;;;29744:3;29739:2;29724:18;;29717:31;;;29522:4;;29765:46;;29791:19;;29783:6;29765:46;:::i;:::-;29757:54;29328:489;-1:-1:-1;;;;;;29328:489:13:o;29822:249::-;29891:6;29944:2;29932:9;29923:7;29919:23;29915:32;29912:52;;;29960:1;29957;29950:12;29912:52;29992:9;29986:16;30011:30;30035:5;30011:30;:::i
Swarm Source
ipfs://9f427d2a7096f41da6228473470e12dd552fc37f39861fe96770b88a9327ef9c
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.