ERC-721
Overview
Max Total Supply
1,500 NOJI
Holders
832
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 NOJILoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Noji
Compiler Version
v0.8.17+commit.8df45f5f
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-09-29 */ pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } } // File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Tree proofs. * * The proofs can be generated using the JavaScript library * https://github.com/miguelmota/merkletreejs[merkletreejs]. * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled. * * See `test/utils/cryptography/MerkleProof.test.js` for some examples. * * WARNING: You should avoid using leaf values that are 64 bytes long prior to * hashing, or use a hash function other than keccak256 for hashing leaves. * This is because the concatenation of a sorted pair of internal nodes in * the merkle tree could be reinterpreted as a leaf value. */ library MerkleProof { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify( bytes32[] memory proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProof(proof, leaf) == root; } /** * @dev Calldata version of {verify} * * _Available since v4.7._ */ function verifyCalldata( bytes32[] calldata proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProofCalldata(proof, leaf) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt * hash matches the root of the tree. When processing the proof, the pairs * of leafs & pre-images are assumed to be sorted. * * _Available since v4.4._ */ function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Calldata version of {processProof} * * _Available since v4.7._ */ function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Returns true if the `leaves` can be proved to be a part of a Merkle tree defined by * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}. * * _Available since v4.7._ */ function multiProofVerify( bytes32[] memory proof, bool[] memory proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProof(proof, proofFlags, leaves) == root; } /** * @dev Calldata version of {multiProofVerify} * * _Available since v4.7._ */ function multiProofVerifyCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProofCalldata(proof, proofFlags, leaves) == root; } /** * @dev Returns the root of a tree reconstructed from `leaves` and the sibling nodes in `proof`, * consuming from one or the other at each step according to the instructions given by * `proofFlags`. * * _Available since v4.7._ */ function processMultiProof( bytes32[] memory proof, bool[] memory proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of // the merkle tree. uint256 leavesLen = leaves.length; uint256 totalHashes = proofFlags.length; // Check proof validity. require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof"); // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop". bytes32[] memory hashes = new bytes32[](totalHashes); uint256 leafPos = 0; uint256 hashPos = 0; uint256 proofPos = 0; // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the // `proof` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++]; hashes[i] = _hashPair(a, b); } if (totalHashes > 0) { return hashes[totalHashes - 1]; } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } /** * @dev Calldata version of {processMultiProof} * * _Available since v4.7._ */ function processMultiProofCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of // the merkle tree. uint256 leavesLen = leaves.length; uint256 totalHashes = proofFlags.length; // Check proof validity. require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof"); // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop". bytes32[] memory hashes = new bytes32[](totalHashes); uint256 leafPos = 0; uint256 hashPos = 0; uint256 proofPos = 0; // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the // `proof` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++]; hashes[i] = _hashPair(a, b); } if (totalHashes > 0) { return hashes[totalHashes - 1]; } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) { return a < b ? _efficientHash(a, b) : _efficientHash(b, a); } function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) { /// @solidity memory-safe-assembly assembly { mstore(0x00, a) mstore(0x20, b) value := keccak256(0x00, 0x40) } } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // 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); } // File: @openzeppelin/contracts/interfaces/IERC2981.sol // OpenZeppelin Contracts (last updated v4.6.0) (interfaces/IERC2981.sol) pragma solidity ^0.8.0; /** * @dev Interface for the NFT Royalty Standard. * * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal * support for royalty payments across all NFT marketplaces and ecosystem participants. * * _Available since v4.5._ */ interface IERC2981 is IERC165 { /** * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of * exchange. The royalty amount is denominated and should be paid in that same unit of exchange. */ function royaltyInfo(uint256 tokenId, uint256 salePrice) external view returns (address receiver, uint256 royaltyAmount); } // File: @openzeppelin/contracts/token/ERC20/IERC20.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); } // File: @openzeppelin/contracts/interfaces/IERC20.sol // OpenZeppelin Contracts v4.4.1 (interfaces/IERC20.sol) pragma solidity ^0.8.0; // File: Noji/IERC721A.sol // ERC721A Contracts v4.2.2 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of ERC721A. */ interface IERC721A { /** * The caller must own the token or be an approved operator. */ error ApprovalCallerNotOwnerNorApproved(); /** * The token does not exist. */ error ApprovalQueryForNonexistentToken(); /** * The caller cannot approve to their own address. */ error ApproveToCaller(); /** * Cannot query the balance for the zero address. */ error BalanceQueryForZeroAddress(); /** * Cannot mint to the zero address. */ error MintToZeroAddress(); /** * The quantity of tokens minted must be more than zero. */ error MintZeroQuantity(); /** * The token does not exist. */ error OwnerQueryForNonexistentToken(); /** * The caller must own the token or be an approved operator. */ error TransferCallerNotOwnerNorApproved(); /** * The token must be owned by `from`. */ error TransferFromIncorrectOwner(); /** * Cannot safely transfer to a contract that does not implement the * ERC721Receiver interface. */ error TransferToNonERC721ReceiverImplementer(); /** * Cannot transfer to the zero address. */ error TransferToZeroAddress(); /** * The token does not exist. */ error URIQueryForNonexistentToken(); /** * The `quantity` minted with ERC2309 exceeds the safety limit. */ error MintERC2309QuantityExceedsLimit(); /** * The `extraData` cannot be set on an unintialized ownership slot. */ error OwnershipNotInitializedForExtraData(); // ============================================================= // STRUCTS // ============================================================= struct TokenOwnership { // The address of the owner. address addr; // Stores the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; // Arbitrary data similar to `startTimestamp` that can be set via {_extraData}. uint24 extraData; } // ============================================================= // TOKEN COUNTERS // ============================================================= /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see {_totalMinted}. */ function totalSupply() external view returns (uint256); // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); // ============================================================= // IERC721 // ============================================================= /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables * (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in `owner`'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, * 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, bytes calldata data ) external; /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} * whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token * by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the * zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} * for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll}. */ function isApprovedForAll(address owner, address operator) external view returns (bool); // ============================================================= // IERC721Metadata // ============================================================= /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); // ============================================================= // IERC2309 // ============================================================= /** * @dev Emitted when tokens in `fromTokenId` to `toTokenId` * (inclusive) is transferred from `from` to `to`, as defined in the * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309) standard. * * See {_mintERC2309} for more details. */ event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to); } // File: Noji/ERC721A.sol // ERC721A Contracts v4.2.2 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of ERC721 token receiver. */ interface ERC721A__IERC721Receiver { function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /** * @title ERC721A * * @dev Implementation of the [ERC721](https://eips.ethereum.org/EIPS/eip-721) * Non-Fungible Token Standard, including the Metadata extension. * Optimized for lower gas during batch mints. * * Token IDs are minted in sequential order (e.g. 0, 1, 2, 3, ...) * starting from `_startTokenId()`. * * Assumptions: * * - An owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * - The maximum token ID cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is IERC721A { // Reference type for token approval. struct TokenApprovalRef { address value; } // ============================================================= // CONSTANTS // ============================================================= // Mask of an entry in packed address data. uint256 private constant _BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1; // The bit position of `numberMinted` in packed address data. uint256 private constant _BITPOS_NUMBER_MINTED = 64; // The bit position of `numberBurned` in packed address data. uint256 private constant _BITPOS_NUMBER_BURNED = 128; // The bit position of `aux` in packed address data. uint256 private constant _BITPOS_AUX = 192; // Mask of all 256 bits in packed address data except the 64 bits for `aux`. uint256 private constant _BITMASK_AUX_COMPLEMENT = (1 << 192) - 1; // The bit position of `startTimestamp` in packed ownership. uint256 private constant _BITPOS_START_TIMESTAMP = 160; // The bit mask of the `burned` bit in packed ownership. uint256 private constant _BITMASK_BURNED = 1 << 224; // The bit position of the `nextInitialized` bit in packed ownership. uint256 private constant _BITPOS_NEXT_INITIALIZED = 225; // The bit mask of the `nextInitialized` bit in packed ownership. uint256 private constant _BITMASK_NEXT_INITIALIZED = 1 << 225; // The bit position of `extraData` in packed ownership. uint256 private constant _BITPOS_EXTRA_DATA = 232; // Mask of all 256 bits in a packed ownership except the 24 bits for `extraData`. uint256 private constant _BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1; // The mask of the lower 160 bits for addresses. uint256 private constant _BITMASK_ADDRESS = (1 << 160) - 1; // The maximum `quantity` that can be minted with {_mintERC2309}. // This limit is to prevent overflows on the address data entries. // For a limit of 5000, a total of 3.689e15 calls to {_mintERC2309} // is required to cause an overflow, which is unrealistic. uint256 private constant _MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000; // The `Transfer` event signature is given by: // `keccak256(bytes("Transfer(address,address,uint256)"))`. bytes32 private constant _TRANSFER_EVENT_SIGNATURE = 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef; // ============================================================= // STORAGE // ============================================================= // The next token ID to be minted. uint256 private _currentIndex; // The number of tokens burned. uint256 private _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. // See {_packedOwnershipOf} implementation for details. // // Bits Layout: // - [0..159] `addr` // - [160..223] `startTimestamp` // - [224] `burned` // - [225] `nextInitialized` // - [232..255] `extraData` mapping(uint256 => uint256) private _packedOwnerships; // Mapping owner address to address data. // // Bits Layout: // - [0..63] `balance` // - [64..127] `numberMinted` // - [128..191] `numberBurned` // - [192..255] `aux` mapping(address => uint256) private _packedAddressData; // Mapping from token ID to approved address. mapping(uint256 => TokenApprovalRef) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; // ============================================================= // CONSTRUCTOR // ============================================================= constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } // ============================================================= // TOKEN COUNTING OPERATIONS // ============================================================= /** * @dev Returns the starting token ID. * To change the starting token ID, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev Returns the next token ID to be minted. */ function _nextTokenId() internal view virtual returns (uint256) { return _currentIndex; } /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see {_totalMinted}. */ function totalSupply() public view virtual override returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than `_currentIndex - _startTokenId()` times. unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * @dev Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view virtual returns (uint256) { // Counter underflow is impossible as `_currentIndex` does not decrement, // and it is initialized to `_startTokenId()`. unchecked { return _currentIndex - _startTokenId(); } } /** * @dev Returns the total number of tokens burned. */ function _totalBurned() internal view virtual returns (uint256) { return _burnCounter; } // ============================================================= // ADDRESS DATA OPERATIONS // ============================================================= /** * @dev Returns the number of tokens in `owner`'s account. */ function balanceOf(address owner) public view virtual override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return _packedAddressData[owner] & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> _BITPOS_NUMBER_MINTED) & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> _BITPOS_NUMBER_BURNED) & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return uint64(_packedAddressData[owner] >> _BITPOS_AUX); } /** * Sets the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal virtual { uint256 packed = _packedAddressData[owner]; uint256 auxCasted; // Cast `aux` with assembly to avoid redundant masking. assembly { auxCasted := aux } packed = (packed & _BITMASK_AUX_COMPLEMENT) | (auxCasted << _BITPOS_AUX); _packedAddressData[owner] = packed; } // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 gas. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { // The interface IDs are constants representing the first 4 bytes // of the XOR of all function selectors in the interface. // See: [ERC165](https://eips.ethereum.org/EIPS/eip-165) // (e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`) return interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165. interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721. interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata. } // ============================================================= // IERC721Metadata // ============================================================= /** * @dev Returns the token collection name. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the token collection symbol. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : ''; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, it can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } // ============================================================= // OWNERSHIPS OPERATIONS // ============================================================= /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { return address(uint160(_packedOwnershipOf(tokenId))); } /** * @dev Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around over time. */ function _ownershipOf(uint256 tokenId) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnershipOf(tokenId)); } /** * @dev Returns the unpacked `TokenOwnership` struct at `index`. */ function _ownershipAt(uint256 index) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnerships[index]); } /** * @dev Initializes the ownership slot minted at `index` for efficiency purposes. */ function _initializeOwnershipAt(uint256 index) internal virtual { if (_packedOwnerships[index] == 0) { _packedOwnerships[index] = _packedOwnershipOf(index); } } /** * Returns the packed ownership data of `tokenId`. */ function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr) if (curr < _currentIndex) { uint256 packed = _packedOwnerships[curr]; // If not burned. if (packed & _BITMASK_BURNED == 0) { // Invariant: // There will always be an initialized ownership slot // (i.e. `ownership.addr != address(0) && ownership.burned == false`) // before an unintialized ownership slot // (i.e. `ownership.addr == address(0) && ownership.burned == false`) // Hence, `curr` will not underflow. // // We can directly compare the packed value. // If the address is zero, packed will be zero. while (packed == 0) { packed = _packedOwnerships[--curr]; } return packed; } } } revert OwnerQueryForNonexistentToken(); } /** * @dev Returns the unpacked `TokenOwnership` struct from `packed`. */ function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) { ownership.addr = address(uint160(packed)); ownership.startTimestamp = uint64(packed >> _BITPOS_START_TIMESTAMP); ownership.burned = packed & _BITMASK_BURNED != 0; ownership.extraData = uint24(packed >> _BITPOS_EXTRA_DATA); } /** * @dev Packs ownership data into a single uint256. */ function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, _BITMASK_ADDRESS) // `owner | (block.timestamp << _BITPOS_START_TIMESTAMP) | flags`. result := or(owner, or(shl(_BITPOS_START_TIMESTAMP, timestamp()), flags)) } } /** * @dev Returns the `nextInitialized` flag set if `quantity` equals 1. */ function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) { // For branchless setting of the `nextInitialized` flag. assembly { // `(quantity == 1) << _BITPOS_NEXT_INITIALIZED`. result := shl(_BITPOS_NEXT_INITIALIZED, eq(quantity, 1)) } } // ============================================================= // APPROVAL OPERATIONS // ============================================================= /** * @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) public virtual override { address owner = ownerOf(tokenId); if (_msgSenderERC721A() != owner) if (!isApprovedForAll(owner, _msgSenderERC721A())) { revert ApprovalCallerNotOwnerNorApproved(); } _tokenApprovals[tokenId].value = to; emit Approval(owner, to, tokenId); } /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId].value; } /** * @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) public virtual override { if (operator == _msgSenderERC721A()) revert ApproveToCaller(); _operatorApprovals[_msgSenderERC721A()][operator] = approved; emit ApprovalForAll(_msgSenderERC721A(), operator, approved); } /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @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. See {_mint}. */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && // If within bounds, _packedOwnerships[tokenId] & _BITMASK_BURNED == 0; // and not burned. } /** * @dev Returns whether `msgSender` is equal to `approvedAddress` or `owner`. */ function _isSenderApprovedOrOwner( address approvedAddress, address owner, address msgSender ) private pure returns (bool result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, _BITMASK_ADDRESS) // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean. msgSender := and(msgSender, _BITMASK_ADDRESS) // `msgSender == owner || msgSender == approvedAddress`. result := or(eq(msgSender, owner), eq(msgSender, approvedAddress)) } } /** * @dev Returns the storage slot and value for the approved address of `tokenId`. */ function _getApprovedSlotAndAddress(uint256 tokenId) private view returns (uint256 approvedAddressSlot, address approvedAddress) { TokenApprovalRef storage tokenApproval = _tokenApprovals[tokenId]; // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId].value`. assembly { approvedAddressSlot := tokenApproval.slot approvedAddress := sload(approvedAddressSlot) } } // ============================================================= // TRANSFER OPERATIONS // ============================================================= /** * @dev Transfers `tokenId` from `from` to `to`. * * 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 ) public virtual override { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner(); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId); // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // We can directly increment and decrement the balances. --_packedAddressData[from]; // Updates: `balance -= 1`. ++_packedAddressData[to]; // Updates: `balance += 1`. // Updates: // - `address` to the next owner. // - `startTimestamp` to the timestamp of transfering. // - `burned` to `false`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( to, _BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ''); } /** * @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 memory _data ) public virtual override { transferFrom(from, to, tokenId); if (to.code.length != 0) if (!_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @dev Hook that is called before a set of serially-ordered token IDs * are about to be transferred. This includes minting. * And also called before burning one token. * * `startTokenId` - the first token ID to be transferred. * `quantity` - the amount to be transferred. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token IDs * have been transferred. This includes minting. * And also called after one token has been burned. * * `startTokenId` - the first token ID to be transferred. * `quantity` - the amount to be transferred. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Private function to invoke {IERC721Receiver-onERC721Received} on a target contract. * * `from` - Previous owner of the given token ID. * `to` - Target address that will receive the token. * `tokenId` - Token ID to be transferred. * `_data` - Optional data to send along with the call. * * Returns whether the call correctly returned the expected magic value. */ function _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns ( bytes4 retval ) { return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } // ============================================================= // MINT OPERATIONS // ============================================================= /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event for each mint. */ function _mint(address to, uint256 quantity) internal virtual { uint256 startTokenId = _currentIndex; if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // `balance` and `numberMinted` have a maximum limit of 2**64. // `tokenId` has a maximum limit of 2**256. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); uint256 toMasked; uint256 end = startTokenId + quantity; // Use assembly to loop and emit the `Transfer` event for gas savings. // The duplicated `log4` removes an extra check and reduces stack juggling. // The assembly, together with the surrounding Solidity code, have been // delicately arranged to nudge the compiler into producing optimized opcodes. assembly { // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean. toMasked := and(to, _BITMASK_ADDRESS) // Emit the `Transfer` event. log4( 0, // Start of data (0, since no data). 0, // End of data (0, since no data). _TRANSFER_EVENT_SIGNATURE, // Signature. 0, // `address(0)`. toMasked, // `to`. startTokenId // `tokenId`. ) for { let tokenId := add(startTokenId, 1) } iszero(eq(tokenId, end)) { tokenId := add(tokenId, 1) } { // Emit the `Transfer` event. Similar to above. log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId) } } if (toMasked == 0) revert MintToZeroAddress(); _currentIndex = end; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * This function is intended for efficient minting only during contract creation. * * It emits only one {ConsecutiveTransfer} as defined in * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309), * instead of a sequence of {Transfer} event(s). * * Calling this function outside of contract creation WILL make your contract * non-compliant with the ERC721 standard. * For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309 * {ConsecutiveTransfer} event is only permissible during contract creation. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {ConsecutiveTransfer} event. */ function _mintERC2309(address to, uint256 quantity) internal virtual { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); if (quantity > _MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are unrealistic due to the above check for `quantity` to be below the limit. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to); _currentIndex = startTokenId + quantity; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * See {_mint}. * * Emits a {Transfer} event for each mint. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal virtual { _mint(to, quantity); unchecked { if (to.code.length != 0) { uint256 end = _currentIndex; uint256 index = end - quantity; do { if (!_checkContractOnERC721Received(address(0), to, index++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (index < end); // Reentrancy protection. if (_currentIndex != end) revert(); } } } /** * @dev Equivalent to `_safeMint(to, quantity, '')`. */ function _safeMint(address to, uint256 quantity) internal virtual { _safeMint(to, quantity, ''); } // ============================================================= // BURN OPERATIONS // ============================================================= /** * @dev Equivalent to `_burn(tokenId, false)`. */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); address from = address(uint160(prevOwnershipPacked)); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId); if (approvalCheck) { // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // Updates: // - `balance -= 1`. // - `numberBurned += 1`. // // We can directly decrement the balance, and increment the number burned. // This is equivalent to `packed -= 1; packed += 1 << _BITPOS_NUMBER_BURNED;`. _packedAddressData[from] += (1 << _BITPOS_NUMBER_BURNED) - 1; // Updates: // - `address` to the last owner. // - `startTimestamp` to the timestamp of burning. // - `burned` to `true`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( from, (_BITMASK_BURNED | _BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } // ============================================================= // EXTRA DATA OPERATIONS // ============================================================= /** * @dev Directly sets the extra data for the ownership data `index`. */ function _setExtraDataAt(uint256 index, uint24 extraData) internal virtual { uint256 packed = _packedOwnerships[index]; if (packed == 0) revert OwnershipNotInitializedForExtraData(); uint256 extraDataCasted; // Cast `extraData` with assembly to avoid redundant masking. assembly { extraDataCasted := extraData } packed = (packed & _BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << _BITPOS_EXTRA_DATA); _packedOwnerships[index] = packed; } /** * @dev Called during each token transfer to set the 24bit `extraData` field. * Intended to be overridden by the cosumer contract. * * `previousExtraData` - the value of `extraData` before transfer. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _extraData( address from, address to, uint24 previousExtraData ) internal view virtual returns (uint24) {} /** * @dev Returns the next extra data for the packed ownership data. * The returned result is shifted into position. */ function _nextExtraData( address from, address to, uint256 prevOwnershipPacked ) private view returns (uint256) { uint24 extraData = uint24(prevOwnershipPacked >> _BITPOS_EXTRA_DATA); return uint256(_extraData(from, to, extraData)) << _BITPOS_EXTRA_DATA; } // ============================================================= // OTHER OPERATIONS // ============================================================= /** * @dev Returns the message sender (defaults to `msg.sender`). * * If you are writing GSN compatible contracts, you need to override this function. */ function _msgSenderERC721A() internal view virtual returns (address) { return msg.sender; } /** * @dev Converts a uint256 to its ASCII string decimal representation. */ function _toString(uint256 value) internal pure virtual returns (string memory str) { assembly { // The maximum value of a uint256 contains 78 digits (1 byte per digit), // but we allocate 0x80 bytes to keep the free memory pointer 32-byte word aligned. // We will need 1 32-byte word to store the length, // and 3 32-byte words to store a maximum of 78 digits. Total: 0x20 + 3 * 0x20 = 0x80. str := add(mload(0x40), 0x80) // Update the free memory pointer to allocate. mstore(0x40, str) // Cache the end of the memory to calculate the length later. let end := str // We write the string from rightmost digit to leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // prettier-ignore for { let temp := value } 1 {} { str := sub(str, 1) // Write the character to the pointer. // The ASCII index of the '0' character is 48. mstore8(str, add(48, mod(temp, 10))) // Keep dividing `temp` until zero. temp := div(temp, 10) // prettier-ignore if iszero(temp) { break } } let length := sub(end, str) // Move the pointer 32 bytes leftwards to make room for the length. str := sub(str, 0x20) // Store the length. mstore(str, length) } } } // File: Noji/Noji.sol pragma solidity ^0.8.4; contract Noji is ERC721A, IERC2981, Ownable { using Strings for uint256; uint256 public MAX_SUPPLY = 1500; uint256 public MAX_SALE_SUPPLY = 1500; uint256 public MAX_NOJI_PER_WALLET = 1; uint256 public OGLIST_SALE_PRICE ; uint256 public WHITELIST_SALE_PRICE ; uint256 public PUBLIC_SALE_PRICE ; uint96 public royaltyFeesInBips = 1000; address public royaltyAddress; string baseURI; string public placeholderTokenUri; bool public isRevealed = false; bool public isPaused = true; bool public isOGListMintActive = false; bool public isWhiteListMintActive = false; bool public isPublicMintActive = false; bool public isTeamMintActive = false; bool public isAirdropClaimActive = false; bytes32 public ogListMerkleRoot; bytes32 public whiteListMerkleRoot; bytes32 public teamListMerkleRoot; struct airdropData { uint256 qty; bool hasClaimed; } mapping(address => bool) public teamListClaimed; mapping(address => uint256) nojiPerAddress; mapping(address => airdropData) airdropList; modifier callerIsUser() { require(tx.origin == msg.sender, "Caller is another contract"); _; } modifier mintIsActive(bool category) { require(!isPaused, "Minting paused"); require(category, "List minting not active"); _; } modifier canAfford(uint256 categoryPrice, uint256 qty) { require(msg.value >= categoryPrice * qty, "Insufficient Funds"); _; } modifier canMint(uint256 qty) { require(qty > 0, "Mint at least 1 Noji"); require( totalSupply() + qty <= MAX_SALE_SUPPLY, "Cannot mint beyound Max Supply" ); require( nojiPerAddress[msg.sender] + qty <= MAX_NOJI_PER_WALLET, "Max Noji per Wallet exceded" ); _; } modifier isValidMerkleProof( bytes32[] calldata merkleProof, bytes32 merkleRoot ) { bytes32 leaf = keccak256(abi.encodePacked(msg.sender)); require( MerkleProof.verify(merkleProof, merkleRoot, leaf), "Address not listed" ); _; } constructor(address _admin,address royaltyAddress_,string memory _placeholderTokenUri) ERC721A("Noji", "NOJI") { royaltyAddress = royaltyAddress_; placeholderTokenUri = _placeholderTokenUri; _safeMint(_admin, 150); } function publicMint(uint256 qty) public payable callerIsUser mintIsActive(isPublicMintActive) canAfford(PUBLIC_SALE_PRICE, qty) canMint(qty) { _safeMint(msg.sender, qty); } function oglistMint(uint256 qty, bytes32[] calldata merkleProof) public payable callerIsUser mintIsActive(isOGListMintActive) canAfford(OGLIST_SALE_PRICE, qty) canMint(qty) isValidMerkleProof(merkleProof, ogListMerkleRoot) { nojiPerAddress[msg.sender] += qty; _safeMint(msg.sender, qty); } function whitelistMint(uint256 qty, bytes32[] calldata merkleProof) public payable callerIsUser mintIsActive(isWhiteListMintActive) canAfford(WHITELIST_SALE_PRICE, qty) canMint(qty) isValidMerkleProof(merkleProof, whiteListMerkleRoot) { nojiPerAddress[msg.sender] += qty; _safeMint(msg.sender, qty); } function teamMint(bytes32[] calldata merkleProof) public callerIsUser mintIsActive(isTeamMintActive) canMint(1) isValidMerkleProof(merkleProof, teamListMerkleRoot) { require(!teamListClaimed[msg.sender], "Noji already claimed"); teamListClaimed[msg.sender] = true; _safeMint(msg.sender, 1); } function togglePause() external onlyOwner { isPaused = !isPaused; } function toggleOGListMint() external onlyOwner { isOGListMintActive = !isOGListMintActive; } function toggleWhiteListMint() external onlyOwner { isWhiteListMintActive = !isWhiteListMintActive; } function togglePublicMint() external onlyOwner { isPublicMintActive = !isPublicMintActive; } function toggleTeamMint() external onlyOwner { isTeamMintActive = !isTeamMintActive; } function _baseURI() internal view override returns (string memory) { return baseURI; } function setBaseURI(string memory uri) public onlyOwner { baseURI = uri; } function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "nonexistent token"); if (!isRevealed) { return placeholderTokenUri; } return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString(), ".json")) : ""; } function setPlaceHolderTokenUri(string memory uri) external onlyOwner { placeholderTokenUri = uri; } function toggleReveal() public onlyOwner { isRevealed = !isRevealed; } function setMaxSupply(uint256 supply) external onlyOwner { MAX_SUPPLY = supply; } function setMaxSaleSupply(uint256 supply) external onlyOwner { MAX_SALE_SUPPLY = supply; } function setOGListMerkleRoot(bytes32 merkleRoot) external onlyOwner { ogListMerkleRoot = merkleRoot; } function setWhiteListMerkleRoot(bytes32 merkleRoot) external onlyOwner { whiteListMerkleRoot = merkleRoot; } function setTeamListMerkleRoot(bytes32 merkleRoot) external onlyOwner { teamListMerkleRoot = merkleRoot; } function setMaxNojiPerWallet(uint256 num) public onlyOwner { MAX_NOJI_PER_WALLET = num; } function royaltyInfo(uint256 tokenId, uint256 salePrice) external view virtual override returns (address receiver, uint256 royaltyAmount) { return (royaltyAddress, (salePrice * royaltyFeesInBips) / 10000); } function setRoyaltyInfo(address receiver, uint8 _royaltyFeesInBips) public onlyOwner { require(_royaltyFeesInBips <= 10000, "Royalty fee high"); royaltyAddress = receiver; royaltyFeesInBips = _royaltyFeesInBips; } function withdraw() external onlyOwner { uint256 balance = address(this).balance; require(balance > 0, "No payout to withdraw"); (bool success, ) = payable(msg.sender).call{value: balance}(""); require(success, "Withdrawal failed"); } function withdrawTokens(IERC20 token) public onlyOwner { uint256 balance = token.balanceOf(address(this)); token.transfer(msg.sender, balance); } function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721A, IERC165) returns (bool) { return interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId); } receive() external payable {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_admin","type":"address"},{"internalType":"address","name":"royaltyAddress_","type":"address"},{"internalType":"string","name":"_placeholderTokenUri","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_NOJI_PER_WALLET","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SALE_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OGLIST_SALE_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PUBLIC_SALE_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WHITELIST_SALE_PRICE","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":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isAirdropClaimActive","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":"isOGListMintActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPublicMintActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isRevealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isTeamMintActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isWhiteListMintActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ogListMerkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"qty","type":"uint256"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"oglistMint","outputs":[],"stateMutability":"payable","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":"placeholderTokenUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"qty","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"royaltyAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"royaltyFeesInBips","outputs":[{"internalType":"uint96","name":"","type":"uint96"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"num","type":"uint256"}],"name":"setMaxNojiPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"supply","type":"uint256"}],"name":"setMaxSaleSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"supply","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"merkleRoot","type":"bytes32"}],"name":"setOGListMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setPlaceHolderTokenUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint8","name":"_royaltyFeesInBips","type":"uint8"}],"name":"setRoyaltyInfo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"merkleRoot","type":"bytes32"}],"name":"setTeamListMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"merkleRoot","type":"bytes32"}],"name":"setWhiteListMerkleRoot","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":"address","name":"","type":"address"}],"name":"teamListClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"teamListMerkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"teamMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleOGListMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"togglePause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"togglePublicMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleReveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleTeamMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleWhiteListMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"whiteListMerkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"qty","type":"uint256"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"}],"name":"withdrawTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60806040526105dc6009556105dc600a556001600b556103e8600f60006101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055506000601260006101000a81548160ff0219169083151502179055506001601260016101000a81548160ff0219169083151502179055506000601260026101000a81548160ff0219169083151502179055506000601260036101000a81548160ff0219169083151502179055506000601260046101000a81548160ff0219169083151502179055506000601260056101000a81548160ff0219169083151502179055506000601260066101000a81548160ff0219169083151502179055503480156200011257600080fd5b5060405162005f4538038062005f458339818101604052810190620001389190620009e1565b6040518060400160405280600481526020017f4e6f6a69000000000000000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f4e4f4a49000000000000000000000000000000000000000000000000000000008152508160029081620001b5919062000ca7565b508060039081620001c7919062000ca7565b50620001d86200026f60201b60201c565b600081905550505062000200620001f46200027460201b60201c565b6200027c60201b60201c565b81600f600c6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550806011908162000252919062000ca7565b50620002668360966200034260201b60201c565b50505062000ef0565b600090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620003648282604051806020016040528060008152506200036860201b60201c565b5050565b6200037a83836200041960201b60201c565b60008373ffffffffffffffffffffffffffffffffffffffff163b146200041457600080549050600083820390505b620003c360008683806001019450866200060060201b60201c565b620003fa576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110620003a85781600054146200041157600080fd5b50505b505050565b600080549050600082036200045a576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200046f60008483856200076160201b60201c565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550620004fe83620004e060008660006200076760201b60201c565b620004f1856200079760201b60201c565b17620007a760201b60201c565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b818114620005a157808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a460018101905062000564565b5060008203620005dd576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000819055505050620005fb6000848385620007d260201b60201c565b505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026200062e620007d860201b60201c565b8786866040518563ffffffff1660e01b815260040162000652949392919062000e0d565b6020604051808303816000875af19250505080156200069157506040513d601f19601f820116820180604052508101906200068e919062000ebe565b60015b6200070e573d8060008114620006c4576040519150601f19603f3d011682016040523d82523d6000602084013e620006c9565b606091505b50600081510362000706576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b50505050565b60008060e883901c905060e862000786868684620007e060201b60201c565b62ffffff16901b9150509392505050565b60006001821460e11b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b600033905090565b60009392505050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200082a82620007fd565b9050919050565b6200083c816200081d565b81146200084857600080fd5b50565b6000815190506200085c8162000831565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620008b7826200086c565b810181811067ffffffffffffffff82111715620008d957620008d86200087d565b5b80604052505050565b6000620008ee620007e9565b9050620008fc8282620008ac565b919050565b600067ffffffffffffffff8211156200091f576200091e6200087d565b5b6200092a826200086c565b9050602081019050919050565b60005b83811015620009575780820151818401526020810190506200093a565b60008484015250505050565b60006200097a620009748462000901565b620008e2565b90508281526020810184848401111562000999576200099862000867565b5b620009a684828562000937565b509392505050565b600082601f830112620009c657620009c562000862565b5b8151620009d884826020860162000963565b91505092915050565b600080600060608486031215620009fd57620009fc620007f3565b5b600062000a0d868287016200084b565b935050602062000a20868287016200084b565b925050604084015167ffffffffffffffff81111562000a445762000a43620007f8565b5b62000a5286828701620009ae565b9150509250925092565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000aaf57607f821691505b60208210810362000ac55762000ac462000a67565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830262000b2f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000af0565b62000b3b868362000af0565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000b8862000b8262000b7c8462000b53565b62000b5d565b62000b53565b9050919050565b6000819050919050565b62000ba48362000b67565b62000bbc62000bb38262000b8f565b84845462000afd565b825550505050565b600090565b62000bd362000bc4565b62000be081848462000b99565b505050565b5b8181101562000c085762000bfc60008262000bc9565b60018101905062000be6565b5050565b601f82111562000c575762000c218162000acb565b62000c2c8462000ae0565b8101602085101562000c3c578190505b62000c5462000c4b8562000ae0565b83018262000be5565b50505b505050565b600082821c905092915050565b600062000c7c6000198460080262000c5c565b1980831691505092915050565b600062000c97838362000c69565b9150826002028217905092915050565b62000cb28262000a5c565b67ffffffffffffffff81111562000cce5762000ccd6200087d565b5b62000cda825462000a96565b62000ce782828562000c0c565b600060209050601f83116001811462000d1f576000841562000d0a578287015190505b62000d16858262000c89565b86555062000d86565b601f19841662000d2f8662000acb565b60005b8281101562000d595784890151825560018201915060208501945060208101905062000d32565b8683101562000d79578489015162000d75601f89168262000c69565b8355505b6001600288020188555050505b505050505050565b62000d99816200081d565b82525050565b62000daa8162000b53565b82525050565b600081519050919050565b600082825260208201905092915050565b600062000dd98262000db0565b62000de5818562000dbb565b935062000df781856020860162000937565b62000e02816200086c565b840191505092915050565b600060808201905062000e24600083018762000d8e565b62000e33602083018662000d8e565b62000e42604083018562000d9f565b818103606083015262000e56818462000dcc565b905095945050505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b62000e988162000e61565b811462000ea457600080fd5b50565b60008151905062000eb88162000e8d565b92915050565b60006020828403121562000ed75762000ed6620007f3565b5b600062000ee78482850162000ea7565b91505092915050565b6150458062000f006000396000f3fe6080604052600436106103905760003560e01c80636f8b44b0116101dc578063b187bd2611610102578063cf0ea25e116100a0578063e985e9c51161006f578063e985e9c514610c59578063ea75127614610c96578063f2fde38b14610cd3578063fb6800d114610cfc57610397565b8063cf0ea25e14610bd2578063d2a87a0014610be9578063d2cab05614610c14578063e08e65ea14610c3057610397565b8063c4ae3168116100dc578063c4ae316814610b2a578063c519ae2b14610b41578063c87b56dd14610b6c578063cb30bc2e14610ba957610397565b8063b187bd2614610aab578063b88d4fde14610ad6578063bc912e1a14610aff57610397565b80638da5cb5b1161017a578063a9a10d8211610149578063a9a10d8214610a03578063aa1906e714610a2c578063ad2f852a14610a55578063b0d5f8a214610a8057610397565b80638da5cb5b1461095b57806395d89b4114610986578063a22cb465146109b1578063a3f832a6146109da57610397565b806373c7400e116101b657806373c7400e146108c55780637a067977146108f0578063836133021461091b5780638c5ccdf61461094457610397565b80636f8b44b01461084857806370a0823114610871578063715018a6146108ae57610397565b80632d6b6224116102c157806349df728c1161025f578063571fe0161161022e578063571fe016146107a057806357a17411146107cb5780635b8ad429146107f45780636352211e1461080b57610397565b806349df728c146106f85780634cf5f7a41461072157806354214f691461074c57806355f804b31461077757610397565b806334b6ab1a1161029b57806334b6ab1a146106765780633ccfd60b146106a15780634047638d146106b857806342842e0e146106cf57610397565b80632d6b6224146106045780632db115441461062f57806332cb6b0c1461064b57610397565b8063106466f31161032e57806318160ddd1161030857806318160ddd1461054757806323b872dd146105725780632a55205a1461059b5780632cb952d3146105d957610397565b8063106466f3146104da5780631113ba58146104f1578063167ae3621461051c57610397565b806307e89ec01161036a57806307e89ec01461042d578063081812fc1461045857806308bac69414610495578063095ea7b3146104b157610397565b806301a217561461039c57806301ffc9a7146103c557806306fdde031461040257610397565b3661039757005b600080fd5b3480156103a857600080fd5b506103c360048036038101906103be919061386a565b610d27565b005b3480156103d157600080fd5b506103ec60048036038101906103e79190613902565b610df0565b6040516103f9919061394a565b60405180910390f35b34801561040e57600080fd5b50610417610e6a565b60405161042491906139f5565b60405180910390f35b34801561043957600080fd5b50610442610efc565b60405161044f9190613a30565b60405180910390f35b34801561046457600080fd5b5061047f600480360381019061047a9190613a77565b610f02565b60405161048c9190613ab3565b60405180910390f35b6104af60048036038101906104aa9190613b33565b610f81565b005b3480156104bd57600080fd5b506104d860048036038101906104d39190613b93565b611333565b005b3480156104e657600080fd5b506104ef611477565b005b3480156104fd57600080fd5b506105066114ab565b6040516105139190613a30565b60405180910390f35b34801561052857600080fd5b506105316114b1565b60405161053e9190613bec565b60405180910390f35b34801561055357600080fd5b5061055c6114b7565b6040516105699190613a30565b60405180910390f35b34801561057e57600080fd5b5061059960048036038101906105949190613c07565b6114ce565b005b3480156105a757600080fd5b506105c260048036038101906105bd9190613c5a565b6117f0565b6040516105d0929190613c9a565b60405180910390f35b3480156105e557600080fd5b506105ee611862565b6040516105fb919061394a565b60405180910390f35b34801561061057600080fd5b50610619611875565b604051610626919061394a565b60405180910390f35b61064960048036038101906106449190613a77565b611888565b005b34801561065757600080fd5b50610660611b23565b60405161066d9190613a30565b60405180910390f35b34801561068257600080fd5b5061068b611b29565b6040516106989190613bec565b60405180910390f35b3480156106ad57600080fd5b506106b6611b2f565b005b3480156106c457600080fd5b506106cd611c2f565b005b3480156106db57600080fd5b506106f660048036038101906106f19190613c07565b611c63565b005b34801561070457600080fd5b5061071f600480360381019061071a9190613d01565b611c83565b005b34801561072d57600080fd5b50610736611d8c565b60405161074391906139f5565b60405180910390f35b34801561075857600080fd5b50610761611e1a565b60405161076e919061394a565b60405180910390f35b34801561078357600080fd5b5061079e60048036038101906107999190613e5e565b611e2d565b005b3480156107ac57600080fd5b506107b5611e48565b6040516107c29190613a30565b60405180910390f35b3480156107d757600080fd5b506107f260048036038101906107ed9190613e5e565b611e4e565b005b34801561080057600080fd5b50610809611e69565b005b34801561081757600080fd5b50610832600480360381019061082d9190613a77565b611e9d565b60405161083f9190613ab3565b60405180910390f35b34801561085457600080fd5b5061086f600480360381019061086a9190613a77565b611eaf565b005b34801561087d57600080fd5b5061089860048036038101906108939190613ea7565b611ec1565b6040516108a59190613a30565b60405180910390f35b3480156108ba57600080fd5b506108c3611f79565b005b3480156108d157600080fd5b506108da611f8d565b6040516108e79190613efb565b60405180910390f35b3480156108fc57600080fd5b50610905611fab565b6040516109129190613a30565b60405180910390f35b34801561092757600080fd5b50610942600480360381019061093d9190613f42565b611fb1565b005b34801561095057600080fd5b50610959611fc3565b005b34801561096757600080fd5b50610970611ff7565b60405161097d9190613ab3565b60405180910390f35b34801561099257600080fd5b5061099b612021565b6040516109a891906139f5565b60405180910390f35b3480156109bd57600080fd5b506109d860048036038101906109d39190613f9b565b6120b3565b005b3480156109e657600080fd5b50610a0160048036038101906109fc9190613a77565b61222a565b005b348015610a0f57600080fd5b50610a2a6004803603810190610a259190613f42565b61223c565b005b348015610a3857600080fd5b50610a536004803603810190610a4e9190613a77565b61224e565b005b348015610a6157600080fd5b50610a6a612260565b604051610a779190613ab3565b60405180910390f35b348015610a8c57600080fd5b50610a95612286565b604051610aa2919061394a565b60405180910390f35b348015610ab757600080fd5b50610ac0612299565b604051610acd919061394a565b60405180910390f35b348015610ae257600080fd5b50610afd6004803603810190610af8919061407c565b6122ac565b005b348015610b0b57600080fd5b50610b1461231f565b604051610b219190613a30565b60405180910390f35b348015610b3657600080fd5b50610b3f612325565b005b348015610b4d57600080fd5b50610b56612359565b604051610b63919061394a565b60405180910390f35b348015610b7857600080fd5b50610b936004803603810190610b8e9190613a77565b61236c565b604051610ba091906139f5565b60405180910390f35b348015610bb557600080fd5b50610bd06004803603810190610bcb91906140ff565b6124bb565b005b348015610bde57600080fd5b50610be76128a9565b005b348015610bf557600080fd5b50610bfe6128dd565b604051610c0b919061394a565b60405180910390f35b610c2e6004803603810190610c299190613b33565b6128f0565b005b348015610c3c57600080fd5b50610c576004803603810190610c529190613f42565b612ca2565b005b348015610c6557600080fd5b50610c806004803603810190610c7b919061414c565b612cb4565b604051610c8d919061394a565b60405180910390f35b348015610ca257600080fd5b50610cbd6004803603810190610cb89190613ea7565b612d48565b604051610cca919061394a565b60405180910390f35b348015610cdf57600080fd5b50610cfa6004803603810190610cf59190613ea7565b612d68565b005b348015610d0857600080fd5b50610d11612deb565b604051610d1e9190613bec565b60405180910390f35b610d2f612df1565b6127108160ff161115610d77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6e906141d8565b60405180910390fd5b81600f600c6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060ff16600f60006101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055505050565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610e635750610e6282612e6f565b5b9050919050565b606060028054610e7990614227565b80601f0160208091040260200160405190810160405280929190818152602001828054610ea590614227565b8015610ef25780601f10610ec757610100808354040283529160200191610ef2565b820191906000526020600020905b815481529060010190602001808311610ed557829003601f168201915b5050505050905090565b600e5481565b6000610f0d82612f01565b610f43576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614610fef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe6906142a4565b60405180910390fd5b601260029054906101000a900460ff16601260019054906101000a900460ff161561104f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104690614310565b60405180910390fd5b8061108f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110869061437c565b60405180910390fd5b600c5484808261109f91906143cb565b3410156110e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d890614459565b60405180910390fd5b8560008111611125576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111c906144c5565b60405180910390fd5b600a54816111316114b7565b61113b91906144e5565b111561117c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117390614565565b60405180910390fd5b600b5481601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546111ca91906144e5565b111561120b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611202906145d1565b60405180910390fd5b85856013546000336040516020016112239190614639565b604051602081830303815290604052805190602001209050611287848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050508383612f60565b6112c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112bd906146a0565b60405180910390fd5b8a601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461131591906144e5565b92505081905550611326338c612f77565b5050505050505050505050565b600061133e82611e9d565b90508073ffffffffffffffffffffffffffffffffffffffff1661135f612f95565b73ffffffffffffffffffffffffffffffffffffffff16146113c25761138b81611386612f95565b612cb4565b6113c1576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b61147f612df1565b601260039054906101000a900460ff1615601260036101000a81548160ff021916908315150217905550565b600c5481565b60155481565b60006114c1612f9d565b6001546000540303905090565b60006114d982612fa2565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611540576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008061154c8461306e565b91509150611562818761155d612f95565b613095565b6115ae5761157786611572612f95565b612cb4565b6115ad576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603611614576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61162186868660016130d9565b801561162c57600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055506116fa856116d68888876130df565b7c020000000000000000000000000000000000000000000000000000000017613107565b600460008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841603611780576000600185019050600060046000838152602001908152602001600020540361177e57600054811461177d578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46117e88686866001613132565b505050505050565b600080600f600c9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16612710600f60009054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff168561184d91906143cb565b61185791906146ef565b915091509250929050565b601260069054906101000a900460ff1681565b601260049054906101000a900460ff1681565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16146118f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ed906142a4565b60405180910390fd5b601260049054906101000a900460ff16601260019054906101000a900460ff1615611956576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194d90614310565b60405180910390fd5b80611996576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198d9061437c565b60405180910390fd5b600e548280826119a691906143cb565b3410156119e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119df90614459565b60405180910390fd5b8360008111611a2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a23906144c5565b60405180910390fd5b600a5481611a386114b7565b611a4291906144e5565b1115611a83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a7a90614565565b60405180910390fd5b600b5481601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611ad191906144e5565b1115611b12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b09906145d1565b60405180910390fd5b611b1c3386612f77565b5050505050565b60095481565b60145481565b611b37612df1565b600047905060008111611b7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b769061476c565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff1682604051611ba5906147bd565b60006040518083038185875af1925050503d8060008114611be2576040519150601f19603f3d011682016040523d82523d6000602084013e611be7565b606091505b5050905080611c2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c229061481e565b60405180910390fd5b5050565b611c37612df1565b601260049054906101000a900460ff1615601260046101000a81548160ff021916908315150217905550565b611c7e838383604051806020016040528060008152506122ac565b505050565b611c8b612df1565b60008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611cc69190613ab3565b602060405180830381865afa158015611ce3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d079190614853565b90508173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401611d44929190613c9a565b6020604051808303816000875af1158015611d63573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d879190614895565b505050565b60118054611d9990614227565b80601f0160208091040260200160405190810160405280929190818152602001828054611dc590614227565b8015611e125780601f10611de757610100808354040283529160200191611e12565b820191906000526020600020905b815481529060010190602001808311611df557829003601f168201915b505050505081565b601260009054906101000a900460ff1681565b611e35612df1565b8060109081611e449190614a6e565b5050565b600a5481565b611e56612df1565b8060119081611e659190614a6e565b5050565b611e71612df1565b601260009054906101000a900460ff1615601260006101000a81548160ff021916908315150217905550565b6000611ea882612fa2565b9050919050565b611eb7612df1565b8060098190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611f28576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611f81612df1565b611f8b6000613138565b565b600f60009054906101000a90046bffffffffffffffffffffffff1681565b600b5481565b611fb9612df1565b8060158190555050565b611fcb612df1565b601260059054906101000a900460ff1615601260056101000a81548160ff021916908315150217905550565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606003805461203090614227565b80601f016020809104026020016040519081016040528092919081815260200182805461205c90614227565b80156120a95780601f1061207e576101008083540402835291602001916120a9565b820191906000526020600020905b81548152906001019060200180831161208c57829003601f168201915b5050505050905090565b6120bb612f95565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361211f576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806007600061212c612f95565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166121d9612f95565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161221e919061394a565b60405180910390a35050565b612232612df1565b80600b8190555050565b612244612df1565b8060138190555050565b612256612df1565b80600a8190555050565b600f600c9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601260029054906101000a900460ff1681565b601260019054906101000a900460ff1681565b6122b78484846114ce565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612319576122e2848484846131fe565b612318576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b600d5481565b61232d612df1565b601260019054906101000a900460ff1615601260016101000a81548160ff021916908315150217905550565b601260039054906101000a900460ff1681565b606061237782612f01565b6123b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ad90614b8c565b60405180910390fd5b601260009054906101000a900460ff1661245c57601180546123d790614227565b80601f016020809104026020016040519081016040528092919081815260200182805461240390614227565b80156124505780601f1061242557610100808354040283529160200191612450565b820191906000526020600020905b81548152906001019060200180831161243357829003601f168201915b505050505090506124b6565b60006010805461246b90614227565b90501161248757604051806020016040528060008152506124b3565b60106124928361334e565b6040516020016124a3929190614cb7565b6040516020818303038152906040525b90505b919050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614612529576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612520906142a4565b60405180910390fd5b601260059054906101000a900460ff16601260019054906101000a900460ff1615612589576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161258090614310565b60405180910390fd5b806125c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125c09061437c565b60405180910390fd5b60016000811161260e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612605906144c5565b60405180910390fd5b600a548161261a6114b7565b61262491906144e5565b1115612665576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161265c90614565565b60405180910390fd5b600b5481601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546126b391906144e5565b11156126f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126eb906145d1565b60405180910390fd5b838360155460003360405160200161270c9190614639565b604051602081830303815290604052805190602001209050612770848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050508383612f60565b6127af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127a6906146a0565b60405180910390fd5b601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561283c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161283390614d32565b60405180910390fd5b6001601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061289f336001612f77565b5050505050505050565b6128b1612df1565b601260029054906101000a900460ff1615601260026101000a81548160ff021916908315150217905550565b601260059054906101000a900460ff1681565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161461295e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612955906142a4565b60405180910390fd5b601260039054906101000a900460ff16601260019054906101000a900460ff16156129be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129b590614310565b60405180910390fd5b806129fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129f59061437c565b60405180910390fd5b600d54848082612a0e91906143cb565b341015612a50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a4790614459565b60405180910390fd5b8560008111612a94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a8b906144c5565b60405180910390fd5b600a5481612aa06114b7565b612aaa91906144e5565b1115612aeb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ae290614565565b60405180910390fd5b600b5481601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612b3991906144e5565b1115612b7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b71906145d1565b60405180910390fd5b8585601454600033604051602001612b929190614639565b604051602081830303815290604052805190602001209050612bf6848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050508383612f60565b612c35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c2c906146a0565b60405180910390fd5b8a601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612c8491906144e5565b92505081905550612c95338c612f77565b5050505050505050505050565b612caa612df1565b8060148190555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60166020528060005260406000206000915054906101000a900460ff1681565b612d70612df1565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612ddf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dd690614dc4565b60405180910390fd5b612de881613138565b50565b60135481565b612df96134ae565b73ffffffffffffffffffffffffffffffffffffffff16612e17611ff7565b73ffffffffffffffffffffffffffffffffffffffff1614612e6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e6490614e30565b60405180910390fd5b565b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612eca57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612efa5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b600081612f0c612f9d565b11158015612f1b575060005482105b8015612f59575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600082612f6d85846134b6565b1490509392505050565b612f9182826040518060200160405280600081525061350c565b5050565b600033905090565b600090565b60008082905080612fb1612f9d565b11613037576000548110156130365760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603613034575b6000810361302a576004600083600190039350838152602001908152602001600020549050613000565b8092505050613069565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e86130f68686846135a9565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613224612f95565b8786866040518563ffffffff1660e01b81526004016132469493929190614ea5565b6020604051808303816000875af192505050801561328257506040513d601f19601f8201168201806040525081019061327f9190614f06565b60015b6132fb573d80600081146132b2576040519150601f19603f3d011682016040523d82523d6000602084013e6132b7565b606091505b5060008151036132f3576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060008203613395576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506134a9565b600082905060005b600082146133c75780806133b090614f33565b915050600a826133c091906146ef565b915061339d565b60008167ffffffffffffffff8111156133e3576133e2613d33565b5b6040519080825280601f01601f1916602001820160405280156134155781602001600182028036833780820191505090505b5090505b600085146134a25760018261342e9190614f7b565b9150600a8561343d9190614faf565b603061344991906144e5565b60f81b81838151811061345f5761345e614fe0565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561349b91906146ef565b9450613419565b8093505050505b919050565b600033905090565b60008082905060005b8451811015613501576134ec828683815181106134df576134de614fe0565b5b60200260200101516135b2565b915080806134f990614f33565b9150506134bf565b508091505092915050565b61351683836135dd565b60008373ffffffffffffffffffffffffffffffffffffffff163b146135a457600080549050600083820390505b61355660008683806001019450866131fe565b61358c576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8181106135435781600054146135a157600080fd5b50505b505050565b60009392505050565b60008183106135ca576135c58284613798565b6135d5565b6135d48383613798565b5b905092915050565b6000805490506000820361361d576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61362a60008483856130d9565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506136a18361369260008660006130df565b61369b856137af565b17613107565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b81811461374257808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050613707565b506000820361377d576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060008190555050506137936000848385613132565b505050565b600082600052816020526040600020905092915050565b60006001821460e11b9050919050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006137fe826137d3565b9050919050565b61380e816137f3565b811461381957600080fd5b50565b60008135905061382b81613805565b92915050565b600060ff82169050919050565b61384781613831565b811461385257600080fd5b50565b6000813590506138648161383e565b92915050565b60008060408385031215613881576138806137c9565b5b600061388f8582860161381c565b92505060206138a085828601613855565b9150509250929050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6138df816138aa565b81146138ea57600080fd5b50565b6000813590506138fc816138d6565b92915050565b600060208284031215613918576139176137c9565b5b6000613926848285016138ed565b91505092915050565b60008115159050919050565b6139448161392f565b82525050565b600060208201905061395f600083018461393b565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561399f578082015181840152602081019050613984565b60008484015250505050565b6000601f19601f8301169050919050565b60006139c782613965565b6139d18185613970565b93506139e1818560208601613981565b6139ea816139ab565b840191505092915050565b60006020820190508181036000830152613a0f81846139bc565b905092915050565b6000819050919050565b613a2a81613a17565b82525050565b6000602082019050613a456000830184613a21565b92915050565b613a5481613a17565b8114613a5f57600080fd5b50565b600081359050613a7181613a4b565b92915050565b600060208284031215613a8d57613a8c6137c9565b5b6000613a9b84828501613a62565b91505092915050565b613aad816137f3565b82525050565b6000602082019050613ac86000830184613aa4565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112613af357613af2613ace565b5b8235905067ffffffffffffffff811115613b1057613b0f613ad3565b5b602083019150836020820283011115613b2c57613b2b613ad8565b5b9250929050565b600080600060408486031215613b4c57613b4b6137c9565b5b6000613b5a86828701613a62565b935050602084013567ffffffffffffffff811115613b7b57613b7a6137ce565b5b613b8786828701613add565b92509250509250925092565b60008060408385031215613baa57613ba96137c9565b5b6000613bb88582860161381c565b9250506020613bc985828601613a62565b9150509250929050565b6000819050919050565b613be681613bd3565b82525050565b6000602082019050613c016000830184613bdd565b92915050565b600080600060608486031215613c2057613c1f6137c9565b5b6000613c2e8682870161381c565b9350506020613c3f8682870161381c565b9250506040613c5086828701613a62565b9150509250925092565b60008060408385031215613c7157613c706137c9565b5b6000613c7f85828601613a62565b9250506020613c9085828601613a62565b9150509250929050565b6000604082019050613caf6000830185613aa4565b613cbc6020830184613a21565b9392505050565b6000613cce826137f3565b9050919050565b613cde81613cc3565b8114613ce957600080fd5b50565b600081359050613cfb81613cd5565b92915050565b600060208284031215613d1757613d166137c9565b5b6000613d2584828501613cec565b91505092915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613d6b826139ab565b810181811067ffffffffffffffff82111715613d8a57613d89613d33565b5b80604052505050565b6000613d9d6137bf565b9050613da98282613d62565b919050565b600067ffffffffffffffff821115613dc957613dc8613d33565b5b613dd2826139ab565b9050602081019050919050565b82818337600083830152505050565b6000613e01613dfc84613dae565b613d93565b905082815260208101848484011115613e1d57613e1c613d2e565b5b613e28848285613ddf565b509392505050565b600082601f830112613e4557613e44613ace565b5b8135613e55848260208601613dee565b91505092915050565b600060208284031215613e7457613e736137c9565b5b600082013567ffffffffffffffff811115613e9257613e916137ce565b5b613e9e84828501613e30565b91505092915050565b600060208284031215613ebd57613ebc6137c9565b5b6000613ecb8482850161381c565b91505092915050565b60006bffffffffffffffffffffffff82169050919050565b613ef581613ed4565b82525050565b6000602082019050613f106000830184613eec565b92915050565b613f1f81613bd3565b8114613f2a57600080fd5b50565b600081359050613f3c81613f16565b92915050565b600060208284031215613f5857613f576137c9565b5b6000613f6684828501613f2d565b91505092915050565b613f788161392f565b8114613f8357600080fd5b50565b600081359050613f9581613f6f565b92915050565b60008060408385031215613fb257613fb16137c9565b5b6000613fc08582860161381c565b9250506020613fd185828601613f86565b9150509250929050565b600067ffffffffffffffff821115613ff657613ff5613d33565b5b613fff826139ab565b9050602081019050919050565b600061401f61401a84613fdb565b613d93565b90508281526020810184848401111561403b5761403a613d2e565b5b614046848285613ddf565b509392505050565b600082601f83011261406357614062613ace565b5b813561407384826020860161400c565b91505092915050565b60008060008060808587031215614096576140956137c9565b5b60006140a48782880161381c565b94505060206140b58782880161381c565b93505060406140c687828801613a62565b925050606085013567ffffffffffffffff8111156140e7576140e66137ce565b5b6140f38782880161404e565b91505092959194509250565b60008060208385031215614116576141156137c9565b5b600083013567ffffffffffffffff811115614134576141336137ce565b5b61414085828601613add565b92509250509250929050565b60008060408385031215614163576141626137c9565b5b60006141718582860161381c565b92505060206141828582860161381c565b9150509250929050565b7f526f79616c747920666565206869676800000000000000000000000000000000600082015250565b60006141c2601083613970565b91506141cd8261418c565b602082019050919050565b600060208201905081810360008301526141f1816141b5565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061423f57607f821691505b602082108103614252576142516141f8565b5b50919050565b7f43616c6c657220697320616e6f7468657220636f6e7472616374000000000000600082015250565b600061428e601a83613970565b915061429982614258565b602082019050919050565b600060208201905081810360008301526142bd81614281565b9050919050565b7f4d696e74696e6720706175736564000000000000000000000000000000000000600082015250565b60006142fa600e83613970565b9150614305826142c4565b602082019050919050565b60006020820190508181036000830152614329816142ed565b9050919050565b7f4c697374206d696e74696e67206e6f7420616374697665000000000000000000600082015250565b6000614366601783613970565b915061437182614330565b602082019050919050565b6000602082019050818103600083015261439581614359565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006143d682613a17565b91506143e183613a17565b92508282026143ef81613a17565b915082820484148315176144065761440561439c565b5b5092915050565b7f496e73756666696369656e742046756e64730000000000000000000000000000600082015250565b6000614443601283613970565b915061444e8261440d565b602082019050919050565b6000602082019050818103600083015261447281614436565b9050919050565b7f4d696e74206174206c656173742031204e6f6a69000000000000000000000000600082015250565b60006144af601483613970565b91506144ba82614479565b602082019050919050565b600060208201905081810360008301526144de816144a2565b9050919050565b60006144f082613a17565b91506144fb83613a17565b92508282019050808211156145135761451261439c565b5b92915050565b7f43616e6e6f74206d696e74206265796f756e64204d617820537570706c790000600082015250565b600061454f601e83613970565b915061455a82614519565b602082019050919050565b6000602082019050818103600083015261457e81614542565b9050919050565b7f4d6178204e6f6a69207065722057616c6c657420657863656465640000000000600082015250565b60006145bb601b83613970565b91506145c682614585565b602082019050919050565b600060208201905081810360008301526145ea816145ae565b9050919050565b60008160601b9050919050565b6000614609826145f1565b9050919050565b600061461b826145fe565b9050919050565b61463361462e826137f3565b614610565b82525050565b60006146458284614622565b60148201915081905092915050565b7f41646472657373206e6f74206c69737465640000000000000000000000000000600082015250565b600061468a601283613970565b915061469582614654565b602082019050919050565b600060208201905081810360008301526146b98161467d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006146fa82613a17565b915061470583613a17565b925082614715576147146146c0565b5b828204905092915050565b7f4e6f207061796f757420746f2077697468647261770000000000000000000000600082015250565b6000614756601583613970565b915061476182614720565b602082019050919050565b6000602082019050818103600083015261478581614749565b9050919050565b600081905092915050565b50565b60006147a760008361478c565b91506147b282614797565b600082019050919050565b60006147c88261479a565b9150819050919050565b7f5769746864726177616c206661696c6564000000000000000000000000000000600082015250565b6000614808601183613970565b9150614813826147d2565b602082019050919050565b60006020820190508181036000830152614837816147fb565b9050919050565b60008151905061484d81613a4b565b92915050565b600060208284031215614869576148686137c9565b5b60006148778482850161483e565b91505092915050565b60008151905061488f81613f6f565b92915050565b6000602082840312156148ab576148aa6137c9565b5b60006148b984828501614880565b91505092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026149247fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826148e7565b61492e86836148e7565b95508019841693508086168417925050509392505050565b6000819050919050565b600061496b61496661496184613a17565b614946565b613a17565b9050919050565b6000819050919050565b61498583614950565b61499961499182614972565b8484546148f4565b825550505050565b600090565b6149ae6149a1565b6149b981848461497c565b505050565b5b818110156149dd576149d26000826149a6565b6001810190506149bf565b5050565b601f821115614a22576149f3816148c2565b6149fc846148d7565b81016020851015614a0b578190505b614a1f614a17856148d7565b8301826149be565b50505b505050565b600082821c905092915050565b6000614a4560001984600802614a27565b1980831691505092915050565b6000614a5e8383614a34565b9150826002028217905092915050565b614a7782613965565b67ffffffffffffffff811115614a9057614a8f613d33565b5b614a9a8254614227565b614aa58282856149e1565b600060209050601f831160018114614ad85760008415614ac6578287015190505b614ad08582614a52565b865550614b38565b601f198416614ae6866148c2565b60005b82811015614b0e57848901518255600182019150602085019450602081019050614ae9565b86831015614b2b5784890151614b27601f891682614a34565b8355505b6001600288020188555050505b505050505050565b7f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000600082015250565b6000614b76601183613970565b9150614b8182614b40565b602082019050919050565b60006020820190508181036000830152614ba581614b69565b9050919050565b600081905092915050565b60008154614bc481614227565b614bce8186614bac565b94506001821660008114614be95760018114614bfe57614c31565b60ff1983168652811515820286019350614c31565b614c07856148c2565b60005b83811015614c2957815481890152600182019150602081019050614c0a565b838801955050505b50505092915050565b6000614c4582613965565b614c4f8185614bac565b9350614c5f818560208601613981565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000614ca1600583614bac565b9150614cac82614c6b565b600582019050919050565b6000614cc38285614bb7565b9150614ccf8284614c3a565b9150614cda82614c94565b91508190509392505050565b7f4e6f6a6920616c726561647920636c61696d6564000000000000000000000000600082015250565b6000614d1c601483613970565b9150614d2782614ce6565b602082019050919050565b60006020820190508181036000830152614d4b81614d0f565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614dae602683613970565b9150614db982614d52565b604082019050919050565b60006020820190508181036000830152614ddd81614da1565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614e1a602083613970565b9150614e2582614de4565b602082019050919050565b60006020820190508181036000830152614e4981614e0d565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000614e7782614e50565b614e818185614e5b565b9350614e91818560208601613981565b614e9a816139ab565b840191505092915050565b6000608082019050614eba6000830187613aa4565b614ec76020830186613aa4565b614ed46040830185613a21565b8181036060830152614ee68184614e6c565b905095945050505050565b600081519050614f00816138d6565b92915050565b600060208284031215614f1c57614f1b6137c9565b5b6000614f2a84828501614ef1565b91505092915050565b6000614f3e82613a17565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614f7057614f6f61439c565b5b600182019050919050565b6000614f8682613a17565b9150614f9183613a17565b9250828203905081811115614fa957614fa861439c565b5b92915050565b6000614fba82613a17565b9150614fc583613a17565b925082614fd557614fd46146c0565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea2646970667358221220ec247605965f6ff315054f7f97eb05f106c8a346898dc779d55736ee156a5c3964736f6c634300081100330000000000000000000000002ed0bf51872c35a26271505b11a0aebe78b12de700000000000000000000000027ea1d065a8c10e22ff313eccac3925da572710d00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000035697066733a2f2f516d6265327a66414c38727747694d3633724b41534651507252737536595354435761797545624a4d68534a6a740000000000000000000000
Deployed Bytecode
0x6080604052600436106103905760003560e01c80636f8b44b0116101dc578063b187bd2611610102578063cf0ea25e116100a0578063e985e9c51161006f578063e985e9c514610c59578063ea75127614610c96578063f2fde38b14610cd3578063fb6800d114610cfc57610397565b8063cf0ea25e14610bd2578063d2a87a0014610be9578063d2cab05614610c14578063e08e65ea14610c3057610397565b8063c4ae3168116100dc578063c4ae316814610b2a578063c519ae2b14610b41578063c87b56dd14610b6c578063cb30bc2e14610ba957610397565b8063b187bd2614610aab578063b88d4fde14610ad6578063bc912e1a14610aff57610397565b80638da5cb5b1161017a578063a9a10d8211610149578063a9a10d8214610a03578063aa1906e714610a2c578063ad2f852a14610a55578063b0d5f8a214610a8057610397565b80638da5cb5b1461095b57806395d89b4114610986578063a22cb465146109b1578063a3f832a6146109da57610397565b806373c7400e116101b657806373c7400e146108c55780637a067977146108f0578063836133021461091b5780638c5ccdf61461094457610397565b80636f8b44b01461084857806370a0823114610871578063715018a6146108ae57610397565b80632d6b6224116102c157806349df728c1161025f578063571fe0161161022e578063571fe016146107a057806357a17411146107cb5780635b8ad429146107f45780636352211e1461080b57610397565b806349df728c146106f85780634cf5f7a41461072157806354214f691461074c57806355f804b31461077757610397565b806334b6ab1a1161029b57806334b6ab1a146106765780633ccfd60b146106a15780634047638d146106b857806342842e0e146106cf57610397565b80632d6b6224146106045780632db115441461062f57806332cb6b0c1461064b57610397565b8063106466f31161032e57806318160ddd1161030857806318160ddd1461054757806323b872dd146105725780632a55205a1461059b5780632cb952d3146105d957610397565b8063106466f3146104da5780631113ba58146104f1578063167ae3621461051c57610397565b806307e89ec01161036a57806307e89ec01461042d578063081812fc1461045857806308bac69414610495578063095ea7b3146104b157610397565b806301a217561461039c57806301ffc9a7146103c557806306fdde031461040257610397565b3661039757005b600080fd5b3480156103a857600080fd5b506103c360048036038101906103be919061386a565b610d27565b005b3480156103d157600080fd5b506103ec60048036038101906103e79190613902565b610df0565b6040516103f9919061394a565b60405180910390f35b34801561040e57600080fd5b50610417610e6a565b60405161042491906139f5565b60405180910390f35b34801561043957600080fd5b50610442610efc565b60405161044f9190613a30565b60405180910390f35b34801561046457600080fd5b5061047f600480360381019061047a9190613a77565b610f02565b60405161048c9190613ab3565b60405180910390f35b6104af60048036038101906104aa9190613b33565b610f81565b005b3480156104bd57600080fd5b506104d860048036038101906104d39190613b93565b611333565b005b3480156104e657600080fd5b506104ef611477565b005b3480156104fd57600080fd5b506105066114ab565b6040516105139190613a30565b60405180910390f35b34801561052857600080fd5b506105316114b1565b60405161053e9190613bec565b60405180910390f35b34801561055357600080fd5b5061055c6114b7565b6040516105699190613a30565b60405180910390f35b34801561057e57600080fd5b5061059960048036038101906105949190613c07565b6114ce565b005b3480156105a757600080fd5b506105c260048036038101906105bd9190613c5a565b6117f0565b6040516105d0929190613c9a565b60405180910390f35b3480156105e557600080fd5b506105ee611862565b6040516105fb919061394a565b60405180910390f35b34801561061057600080fd5b50610619611875565b604051610626919061394a565b60405180910390f35b61064960048036038101906106449190613a77565b611888565b005b34801561065757600080fd5b50610660611b23565b60405161066d9190613a30565b60405180910390f35b34801561068257600080fd5b5061068b611b29565b6040516106989190613bec565b60405180910390f35b3480156106ad57600080fd5b506106b6611b2f565b005b3480156106c457600080fd5b506106cd611c2f565b005b3480156106db57600080fd5b506106f660048036038101906106f19190613c07565b611c63565b005b34801561070457600080fd5b5061071f600480360381019061071a9190613d01565b611c83565b005b34801561072d57600080fd5b50610736611d8c565b60405161074391906139f5565b60405180910390f35b34801561075857600080fd5b50610761611e1a565b60405161076e919061394a565b60405180910390f35b34801561078357600080fd5b5061079e60048036038101906107999190613e5e565b611e2d565b005b3480156107ac57600080fd5b506107b5611e48565b6040516107c29190613a30565b60405180910390f35b3480156107d757600080fd5b506107f260048036038101906107ed9190613e5e565b611e4e565b005b34801561080057600080fd5b50610809611e69565b005b34801561081757600080fd5b50610832600480360381019061082d9190613a77565b611e9d565b60405161083f9190613ab3565b60405180910390f35b34801561085457600080fd5b5061086f600480360381019061086a9190613a77565b611eaf565b005b34801561087d57600080fd5b5061089860048036038101906108939190613ea7565b611ec1565b6040516108a59190613a30565b60405180910390f35b3480156108ba57600080fd5b506108c3611f79565b005b3480156108d157600080fd5b506108da611f8d565b6040516108e79190613efb565b60405180910390f35b3480156108fc57600080fd5b50610905611fab565b6040516109129190613a30565b60405180910390f35b34801561092757600080fd5b50610942600480360381019061093d9190613f42565b611fb1565b005b34801561095057600080fd5b50610959611fc3565b005b34801561096757600080fd5b50610970611ff7565b60405161097d9190613ab3565b60405180910390f35b34801561099257600080fd5b5061099b612021565b6040516109a891906139f5565b60405180910390f35b3480156109bd57600080fd5b506109d860048036038101906109d39190613f9b565b6120b3565b005b3480156109e657600080fd5b50610a0160048036038101906109fc9190613a77565b61222a565b005b348015610a0f57600080fd5b50610a2a6004803603810190610a259190613f42565b61223c565b005b348015610a3857600080fd5b50610a536004803603810190610a4e9190613a77565b61224e565b005b348015610a6157600080fd5b50610a6a612260565b604051610a779190613ab3565b60405180910390f35b348015610a8c57600080fd5b50610a95612286565b604051610aa2919061394a565b60405180910390f35b348015610ab757600080fd5b50610ac0612299565b604051610acd919061394a565b60405180910390f35b348015610ae257600080fd5b50610afd6004803603810190610af8919061407c565b6122ac565b005b348015610b0b57600080fd5b50610b1461231f565b604051610b219190613a30565b60405180910390f35b348015610b3657600080fd5b50610b3f612325565b005b348015610b4d57600080fd5b50610b56612359565b604051610b63919061394a565b60405180910390f35b348015610b7857600080fd5b50610b936004803603810190610b8e9190613a77565b61236c565b604051610ba091906139f5565b60405180910390f35b348015610bb557600080fd5b50610bd06004803603810190610bcb91906140ff565b6124bb565b005b348015610bde57600080fd5b50610be76128a9565b005b348015610bf557600080fd5b50610bfe6128dd565b604051610c0b919061394a565b60405180910390f35b610c2e6004803603810190610c299190613b33565b6128f0565b005b348015610c3c57600080fd5b50610c576004803603810190610c529190613f42565b612ca2565b005b348015610c6557600080fd5b50610c806004803603810190610c7b919061414c565b612cb4565b604051610c8d919061394a565b60405180910390f35b348015610ca257600080fd5b50610cbd6004803603810190610cb89190613ea7565b612d48565b604051610cca919061394a565b60405180910390f35b348015610cdf57600080fd5b50610cfa6004803603810190610cf59190613ea7565b612d68565b005b348015610d0857600080fd5b50610d11612deb565b604051610d1e9190613bec565b60405180910390f35b610d2f612df1565b6127108160ff161115610d77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6e906141d8565b60405180910390fd5b81600f600c6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060ff16600f60006101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055505050565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610e635750610e6282612e6f565b5b9050919050565b606060028054610e7990614227565b80601f0160208091040260200160405190810160405280929190818152602001828054610ea590614227565b8015610ef25780601f10610ec757610100808354040283529160200191610ef2565b820191906000526020600020905b815481529060010190602001808311610ed557829003601f168201915b5050505050905090565b600e5481565b6000610f0d82612f01565b610f43576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614610fef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe6906142a4565b60405180910390fd5b601260029054906101000a900460ff16601260019054906101000a900460ff161561104f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104690614310565b60405180910390fd5b8061108f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110869061437c565b60405180910390fd5b600c5484808261109f91906143cb565b3410156110e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d890614459565b60405180910390fd5b8560008111611125576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111c906144c5565b60405180910390fd5b600a54816111316114b7565b61113b91906144e5565b111561117c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117390614565565b60405180910390fd5b600b5481601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546111ca91906144e5565b111561120b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611202906145d1565b60405180910390fd5b85856013546000336040516020016112239190614639565b604051602081830303815290604052805190602001209050611287848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050508383612f60565b6112c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112bd906146a0565b60405180910390fd5b8a601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461131591906144e5565b92505081905550611326338c612f77565b5050505050505050505050565b600061133e82611e9d565b90508073ffffffffffffffffffffffffffffffffffffffff1661135f612f95565b73ffffffffffffffffffffffffffffffffffffffff16146113c25761138b81611386612f95565b612cb4565b6113c1576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b61147f612df1565b601260039054906101000a900460ff1615601260036101000a81548160ff021916908315150217905550565b600c5481565b60155481565b60006114c1612f9d565b6001546000540303905090565b60006114d982612fa2565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611540576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008061154c8461306e565b91509150611562818761155d612f95565b613095565b6115ae5761157786611572612f95565b612cb4565b6115ad576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603611614576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61162186868660016130d9565b801561162c57600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055506116fa856116d68888876130df565b7c020000000000000000000000000000000000000000000000000000000017613107565b600460008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841603611780576000600185019050600060046000838152602001908152602001600020540361177e57600054811461177d578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46117e88686866001613132565b505050505050565b600080600f600c9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16612710600f60009054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff168561184d91906143cb565b61185791906146ef565b915091509250929050565b601260069054906101000a900460ff1681565b601260049054906101000a900460ff1681565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16146118f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ed906142a4565b60405180910390fd5b601260049054906101000a900460ff16601260019054906101000a900460ff1615611956576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194d90614310565b60405180910390fd5b80611996576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198d9061437c565b60405180910390fd5b600e548280826119a691906143cb565b3410156119e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119df90614459565b60405180910390fd5b8360008111611a2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a23906144c5565b60405180910390fd5b600a5481611a386114b7565b611a4291906144e5565b1115611a83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a7a90614565565b60405180910390fd5b600b5481601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611ad191906144e5565b1115611b12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b09906145d1565b60405180910390fd5b611b1c3386612f77565b5050505050565b60095481565b60145481565b611b37612df1565b600047905060008111611b7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b769061476c565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff1682604051611ba5906147bd565b60006040518083038185875af1925050503d8060008114611be2576040519150601f19603f3d011682016040523d82523d6000602084013e611be7565b606091505b5050905080611c2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c229061481e565b60405180910390fd5b5050565b611c37612df1565b601260049054906101000a900460ff1615601260046101000a81548160ff021916908315150217905550565b611c7e838383604051806020016040528060008152506122ac565b505050565b611c8b612df1565b60008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611cc69190613ab3565b602060405180830381865afa158015611ce3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d079190614853565b90508173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401611d44929190613c9a565b6020604051808303816000875af1158015611d63573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d879190614895565b505050565b60118054611d9990614227565b80601f0160208091040260200160405190810160405280929190818152602001828054611dc590614227565b8015611e125780601f10611de757610100808354040283529160200191611e12565b820191906000526020600020905b815481529060010190602001808311611df557829003601f168201915b505050505081565b601260009054906101000a900460ff1681565b611e35612df1565b8060109081611e449190614a6e565b5050565b600a5481565b611e56612df1565b8060119081611e659190614a6e565b5050565b611e71612df1565b601260009054906101000a900460ff1615601260006101000a81548160ff021916908315150217905550565b6000611ea882612fa2565b9050919050565b611eb7612df1565b8060098190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611f28576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611f81612df1565b611f8b6000613138565b565b600f60009054906101000a90046bffffffffffffffffffffffff1681565b600b5481565b611fb9612df1565b8060158190555050565b611fcb612df1565b601260059054906101000a900460ff1615601260056101000a81548160ff021916908315150217905550565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606003805461203090614227565b80601f016020809104026020016040519081016040528092919081815260200182805461205c90614227565b80156120a95780601f1061207e576101008083540402835291602001916120a9565b820191906000526020600020905b81548152906001019060200180831161208c57829003601f168201915b5050505050905090565b6120bb612f95565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361211f576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806007600061212c612f95565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166121d9612f95565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161221e919061394a565b60405180910390a35050565b612232612df1565b80600b8190555050565b612244612df1565b8060138190555050565b612256612df1565b80600a8190555050565b600f600c9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601260029054906101000a900460ff1681565b601260019054906101000a900460ff1681565b6122b78484846114ce565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612319576122e2848484846131fe565b612318576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b600d5481565b61232d612df1565b601260019054906101000a900460ff1615601260016101000a81548160ff021916908315150217905550565b601260039054906101000a900460ff1681565b606061237782612f01565b6123b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ad90614b8c565b60405180910390fd5b601260009054906101000a900460ff1661245c57601180546123d790614227565b80601f016020809104026020016040519081016040528092919081815260200182805461240390614227565b80156124505780601f1061242557610100808354040283529160200191612450565b820191906000526020600020905b81548152906001019060200180831161243357829003601f168201915b505050505090506124b6565b60006010805461246b90614227565b90501161248757604051806020016040528060008152506124b3565b60106124928361334e565b6040516020016124a3929190614cb7565b6040516020818303038152906040525b90505b919050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614612529576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612520906142a4565b60405180910390fd5b601260059054906101000a900460ff16601260019054906101000a900460ff1615612589576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161258090614310565b60405180910390fd5b806125c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125c09061437c565b60405180910390fd5b60016000811161260e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612605906144c5565b60405180910390fd5b600a548161261a6114b7565b61262491906144e5565b1115612665576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161265c90614565565b60405180910390fd5b600b5481601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546126b391906144e5565b11156126f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126eb906145d1565b60405180910390fd5b838360155460003360405160200161270c9190614639565b604051602081830303815290604052805190602001209050612770848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050508383612f60565b6127af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127a6906146a0565b60405180910390fd5b601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561283c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161283390614d32565b60405180910390fd5b6001601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061289f336001612f77565b5050505050505050565b6128b1612df1565b601260029054906101000a900460ff1615601260026101000a81548160ff021916908315150217905550565b601260059054906101000a900460ff1681565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161461295e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612955906142a4565b60405180910390fd5b601260039054906101000a900460ff16601260019054906101000a900460ff16156129be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129b590614310565b60405180910390fd5b806129fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129f59061437c565b60405180910390fd5b600d54848082612a0e91906143cb565b341015612a50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a4790614459565b60405180910390fd5b8560008111612a94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a8b906144c5565b60405180910390fd5b600a5481612aa06114b7565b612aaa91906144e5565b1115612aeb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ae290614565565b60405180910390fd5b600b5481601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612b3991906144e5565b1115612b7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b71906145d1565b60405180910390fd5b8585601454600033604051602001612b929190614639565b604051602081830303815290604052805190602001209050612bf6848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050508383612f60565b612c35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c2c906146a0565b60405180910390fd5b8a601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612c8491906144e5565b92505081905550612c95338c612f77565b5050505050505050505050565b612caa612df1565b8060148190555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60166020528060005260406000206000915054906101000a900460ff1681565b612d70612df1565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612ddf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dd690614dc4565b60405180910390fd5b612de881613138565b50565b60135481565b612df96134ae565b73ffffffffffffffffffffffffffffffffffffffff16612e17611ff7565b73ffffffffffffffffffffffffffffffffffffffff1614612e6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e6490614e30565b60405180910390fd5b565b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612eca57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612efa5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b600081612f0c612f9d565b11158015612f1b575060005482105b8015612f59575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600082612f6d85846134b6565b1490509392505050565b612f9182826040518060200160405280600081525061350c565b5050565b600033905090565b600090565b60008082905080612fb1612f9d565b11613037576000548110156130365760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603613034575b6000810361302a576004600083600190039350838152602001908152602001600020549050613000565b8092505050613069565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e86130f68686846135a9565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613224612f95565b8786866040518563ffffffff1660e01b81526004016132469493929190614ea5565b6020604051808303816000875af192505050801561328257506040513d601f19601f8201168201806040525081019061327f9190614f06565b60015b6132fb573d80600081146132b2576040519150601f19603f3d011682016040523d82523d6000602084013e6132b7565b606091505b5060008151036132f3576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060008203613395576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506134a9565b600082905060005b600082146133c75780806133b090614f33565b915050600a826133c091906146ef565b915061339d565b60008167ffffffffffffffff8111156133e3576133e2613d33565b5b6040519080825280601f01601f1916602001820160405280156134155781602001600182028036833780820191505090505b5090505b600085146134a25760018261342e9190614f7b565b9150600a8561343d9190614faf565b603061344991906144e5565b60f81b81838151811061345f5761345e614fe0565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561349b91906146ef565b9450613419565b8093505050505b919050565b600033905090565b60008082905060005b8451811015613501576134ec828683815181106134df576134de614fe0565b5b60200260200101516135b2565b915080806134f990614f33565b9150506134bf565b508091505092915050565b61351683836135dd565b60008373ffffffffffffffffffffffffffffffffffffffff163b146135a457600080549050600083820390505b61355660008683806001019450866131fe565b61358c576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8181106135435781600054146135a157600080fd5b50505b505050565b60009392505050565b60008183106135ca576135c58284613798565b6135d5565b6135d48383613798565b5b905092915050565b6000805490506000820361361d576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61362a60008483856130d9565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506136a18361369260008660006130df565b61369b856137af565b17613107565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b81811461374257808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050613707565b506000820361377d576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060008190555050506137936000848385613132565b505050565b600082600052816020526040600020905092915050565b60006001821460e11b9050919050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006137fe826137d3565b9050919050565b61380e816137f3565b811461381957600080fd5b50565b60008135905061382b81613805565b92915050565b600060ff82169050919050565b61384781613831565b811461385257600080fd5b50565b6000813590506138648161383e565b92915050565b60008060408385031215613881576138806137c9565b5b600061388f8582860161381c565b92505060206138a085828601613855565b9150509250929050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6138df816138aa565b81146138ea57600080fd5b50565b6000813590506138fc816138d6565b92915050565b600060208284031215613918576139176137c9565b5b6000613926848285016138ed565b91505092915050565b60008115159050919050565b6139448161392f565b82525050565b600060208201905061395f600083018461393b565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561399f578082015181840152602081019050613984565b60008484015250505050565b6000601f19601f8301169050919050565b60006139c782613965565b6139d18185613970565b93506139e1818560208601613981565b6139ea816139ab565b840191505092915050565b60006020820190508181036000830152613a0f81846139bc565b905092915050565b6000819050919050565b613a2a81613a17565b82525050565b6000602082019050613a456000830184613a21565b92915050565b613a5481613a17565b8114613a5f57600080fd5b50565b600081359050613a7181613a4b565b92915050565b600060208284031215613a8d57613a8c6137c9565b5b6000613a9b84828501613a62565b91505092915050565b613aad816137f3565b82525050565b6000602082019050613ac86000830184613aa4565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112613af357613af2613ace565b5b8235905067ffffffffffffffff811115613b1057613b0f613ad3565b5b602083019150836020820283011115613b2c57613b2b613ad8565b5b9250929050565b600080600060408486031215613b4c57613b4b6137c9565b5b6000613b5a86828701613a62565b935050602084013567ffffffffffffffff811115613b7b57613b7a6137ce565b5b613b8786828701613add565b92509250509250925092565b60008060408385031215613baa57613ba96137c9565b5b6000613bb88582860161381c565b9250506020613bc985828601613a62565b9150509250929050565b6000819050919050565b613be681613bd3565b82525050565b6000602082019050613c016000830184613bdd565b92915050565b600080600060608486031215613c2057613c1f6137c9565b5b6000613c2e8682870161381c565b9350506020613c3f8682870161381c565b9250506040613c5086828701613a62565b9150509250925092565b60008060408385031215613c7157613c706137c9565b5b6000613c7f85828601613a62565b9250506020613c9085828601613a62565b9150509250929050565b6000604082019050613caf6000830185613aa4565b613cbc6020830184613a21565b9392505050565b6000613cce826137f3565b9050919050565b613cde81613cc3565b8114613ce957600080fd5b50565b600081359050613cfb81613cd5565b92915050565b600060208284031215613d1757613d166137c9565b5b6000613d2584828501613cec565b91505092915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613d6b826139ab565b810181811067ffffffffffffffff82111715613d8a57613d89613d33565b5b80604052505050565b6000613d9d6137bf565b9050613da98282613d62565b919050565b600067ffffffffffffffff821115613dc957613dc8613d33565b5b613dd2826139ab565b9050602081019050919050565b82818337600083830152505050565b6000613e01613dfc84613dae565b613d93565b905082815260208101848484011115613e1d57613e1c613d2e565b5b613e28848285613ddf565b509392505050565b600082601f830112613e4557613e44613ace565b5b8135613e55848260208601613dee565b91505092915050565b600060208284031215613e7457613e736137c9565b5b600082013567ffffffffffffffff811115613e9257613e916137ce565b5b613e9e84828501613e30565b91505092915050565b600060208284031215613ebd57613ebc6137c9565b5b6000613ecb8482850161381c565b91505092915050565b60006bffffffffffffffffffffffff82169050919050565b613ef581613ed4565b82525050565b6000602082019050613f106000830184613eec565b92915050565b613f1f81613bd3565b8114613f2a57600080fd5b50565b600081359050613f3c81613f16565b92915050565b600060208284031215613f5857613f576137c9565b5b6000613f6684828501613f2d565b91505092915050565b613f788161392f565b8114613f8357600080fd5b50565b600081359050613f9581613f6f565b92915050565b60008060408385031215613fb257613fb16137c9565b5b6000613fc08582860161381c565b9250506020613fd185828601613f86565b9150509250929050565b600067ffffffffffffffff821115613ff657613ff5613d33565b5b613fff826139ab565b9050602081019050919050565b600061401f61401a84613fdb565b613d93565b90508281526020810184848401111561403b5761403a613d2e565b5b614046848285613ddf565b509392505050565b600082601f83011261406357614062613ace565b5b813561407384826020860161400c565b91505092915050565b60008060008060808587031215614096576140956137c9565b5b60006140a48782880161381c565b94505060206140b58782880161381c565b93505060406140c687828801613a62565b925050606085013567ffffffffffffffff8111156140e7576140e66137ce565b5b6140f38782880161404e565b91505092959194509250565b60008060208385031215614116576141156137c9565b5b600083013567ffffffffffffffff811115614134576141336137ce565b5b61414085828601613add565b92509250509250929050565b60008060408385031215614163576141626137c9565b5b60006141718582860161381c565b92505060206141828582860161381c565b9150509250929050565b7f526f79616c747920666565206869676800000000000000000000000000000000600082015250565b60006141c2601083613970565b91506141cd8261418c565b602082019050919050565b600060208201905081810360008301526141f1816141b5565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061423f57607f821691505b602082108103614252576142516141f8565b5b50919050565b7f43616c6c657220697320616e6f7468657220636f6e7472616374000000000000600082015250565b600061428e601a83613970565b915061429982614258565b602082019050919050565b600060208201905081810360008301526142bd81614281565b9050919050565b7f4d696e74696e6720706175736564000000000000000000000000000000000000600082015250565b60006142fa600e83613970565b9150614305826142c4565b602082019050919050565b60006020820190508181036000830152614329816142ed565b9050919050565b7f4c697374206d696e74696e67206e6f7420616374697665000000000000000000600082015250565b6000614366601783613970565b915061437182614330565b602082019050919050565b6000602082019050818103600083015261439581614359565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006143d682613a17565b91506143e183613a17565b92508282026143ef81613a17565b915082820484148315176144065761440561439c565b5b5092915050565b7f496e73756666696369656e742046756e64730000000000000000000000000000600082015250565b6000614443601283613970565b915061444e8261440d565b602082019050919050565b6000602082019050818103600083015261447281614436565b9050919050565b7f4d696e74206174206c656173742031204e6f6a69000000000000000000000000600082015250565b60006144af601483613970565b91506144ba82614479565b602082019050919050565b600060208201905081810360008301526144de816144a2565b9050919050565b60006144f082613a17565b91506144fb83613a17565b92508282019050808211156145135761451261439c565b5b92915050565b7f43616e6e6f74206d696e74206265796f756e64204d617820537570706c790000600082015250565b600061454f601e83613970565b915061455a82614519565b602082019050919050565b6000602082019050818103600083015261457e81614542565b9050919050565b7f4d6178204e6f6a69207065722057616c6c657420657863656465640000000000600082015250565b60006145bb601b83613970565b91506145c682614585565b602082019050919050565b600060208201905081810360008301526145ea816145ae565b9050919050565b60008160601b9050919050565b6000614609826145f1565b9050919050565b600061461b826145fe565b9050919050565b61463361462e826137f3565b614610565b82525050565b60006146458284614622565b60148201915081905092915050565b7f41646472657373206e6f74206c69737465640000000000000000000000000000600082015250565b600061468a601283613970565b915061469582614654565b602082019050919050565b600060208201905081810360008301526146b98161467d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006146fa82613a17565b915061470583613a17565b925082614715576147146146c0565b5b828204905092915050565b7f4e6f207061796f757420746f2077697468647261770000000000000000000000600082015250565b6000614756601583613970565b915061476182614720565b602082019050919050565b6000602082019050818103600083015261478581614749565b9050919050565b600081905092915050565b50565b60006147a760008361478c565b91506147b282614797565b600082019050919050565b60006147c88261479a565b9150819050919050565b7f5769746864726177616c206661696c6564000000000000000000000000000000600082015250565b6000614808601183613970565b9150614813826147d2565b602082019050919050565b60006020820190508181036000830152614837816147fb565b9050919050565b60008151905061484d81613a4b565b92915050565b600060208284031215614869576148686137c9565b5b60006148778482850161483e565b91505092915050565b60008151905061488f81613f6f565b92915050565b6000602082840312156148ab576148aa6137c9565b5b60006148b984828501614880565b91505092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026149247fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826148e7565b61492e86836148e7565b95508019841693508086168417925050509392505050565b6000819050919050565b600061496b61496661496184613a17565b614946565b613a17565b9050919050565b6000819050919050565b61498583614950565b61499961499182614972565b8484546148f4565b825550505050565b600090565b6149ae6149a1565b6149b981848461497c565b505050565b5b818110156149dd576149d26000826149a6565b6001810190506149bf565b5050565b601f821115614a22576149f3816148c2565b6149fc846148d7565b81016020851015614a0b578190505b614a1f614a17856148d7565b8301826149be565b50505b505050565b600082821c905092915050565b6000614a4560001984600802614a27565b1980831691505092915050565b6000614a5e8383614a34565b9150826002028217905092915050565b614a7782613965565b67ffffffffffffffff811115614a9057614a8f613d33565b5b614a9a8254614227565b614aa58282856149e1565b600060209050601f831160018114614ad85760008415614ac6578287015190505b614ad08582614a52565b865550614b38565b601f198416614ae6866148c2565b60005b82811015614b0e57848901518255600182019150602085019450602081019050614ae9565b86831015614b2b5784890151614b27601f891682614a34565b8355505b6001600288020188555050505b505050505050565b7f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000600082015250565b6000614b76601183613970565b9150614b8182614b40565b602082019050919050565b60006020820190508181036000830152614ba581614b69565b9050919050565b600081905092915050565b60008154614bc481614227565b614bce8186614bac565b94506001821660008114614be95760018114614bfe57614c31565b60ff1983168652811515820286019350614c31565b614c07856148c2565b60005b83811015614c2957815481890152600182019150602081019050614c0a565b838801955050505b50505092915050565b6000614c4582613965565b614c4f8185614bac565b9350614c5f818560208601613981565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000614ca1600583614bac565b9150614cac82614c6b565b600582019050919050565b6000614cc38285614bb7565b9150614ccf8284614c3a565b9150614cda82614c94565b91508190509392505050565b7f4e6f6a6920616c726561647920636c61696d6564000000000000000000000000600082015250565b6000614d1c601483613970565b9150614d2782614ce6565b602082019050919050565b60006020820190508181036000830152614d4b81614d0f565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614dae602683613970565b9150614db982614d52565b604082019050919050565b60006020820190508181036000830152614ddd81614da1565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614e1a602083613970565b9150614e2582614de4565b602082019050919050565b60006020820190508181036000830152614e4981614e0d565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000614e7782614e50565b614e818185614e5b565b9350614e91818560208601613981565b614e9a816139ab565b840191505092915050565b6000608082019050614eba6000830187613aa4565b614ec76020830186613aa4565b614ed46040830185613a21565b8181036060830152614ee68184614e6c565b905095945050505050565b600081519050614f00816138d6565b92915050565b600060208284031215614f1c57614f1b6137c9565b5b6000614f2a84828501614ef1565b91505092915050565b6000614f3e82613a17565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614f7057614f6f61439c565b5b600182019050919050565b6000614f8682613a17565b9150614f9183613a17565b9250828203905081811115614fa957614fa861439c565b5b92915050565b6000614fba82613a17565b9150614fc583613a17565b925082614fd557614fd46146c0565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea2646970667358221220ec247605965f6ff315054f7f97eb05f106c8a346898dc779d55736ee156a5c3964736f6c63430008110033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000002ed0bf51872c35a26271505b11a0aebe78b12de700000000000000000000000027ea1d065a8c10e22ff313eccac3925da572710d00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000035697066733a2f2f516d6265327a66414c38727747694d3633724b41534651507252737536595354435761797545624a4d68534a6a740000000000000000000000
-----Decoded View---------------
Arg [0] : _admin (address): 0x2eD0Bf51872C35A26271505b11A0aEbe78b12De7
Arg [1] : royaltyAddress_ (address): 0x27eA1d065A8C10e22fF313ECcac3925Da572710d
Arg [2] : _placeholderTokenUri (string): ipfs://Qmbe2zfAL8rwGiM63rKASFQPrRsu6YSTCWayuEbJMhSJjt
-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000002ed0bf51872c35a26271505b11a0aebe78b12de7
Arg [1] : 00000000000000000000000027ea1d065a8c10e22ff313eccac3925da572710d
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000035
Arg [4] : 697066733a2f2f516d6265327a66414c38727747694d3633724b415346515072
Arg [5] : 52737536595354435761797545624a4d68534a6a740000000000000000000000
Deployed Bytecode Sourcemap
70669:7473:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77075:268;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;77810:292;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38840:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70965:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45323:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73478:378;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44764:400;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74857:115;;;;;;;;;;;;;:::i;:::-;;70882:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71533:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34591:323;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49036:2817;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76796:271;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;71405:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71317:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73225:245;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70754:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71492:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77351:275;;;;;;;;;;;;;:::i;:::-;;74980:106;;;;;;;;;;;;;:::i;:::-;;51949:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;77634:168;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71111:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71153:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75317:88;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70793:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75872:114;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;75994:84;;;;;;;;;;;;;:::i;:::-;;40233:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76086:95;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35775:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13871:103;;;;;;;;;;;;;:::i;:::-;;71005:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70837;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76555:120;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;75094:100;;;;;;;;;;;;;:::i;:::-;;13223:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39016:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45881:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76683:103;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76301:116;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76189:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71052:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71224:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71190:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52732:399;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70922:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74654:81;;;;;;;;;;;;;:::i;:::-;;71269:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75417:447;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74264:374;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74743:106;;;;;;;;;;;;;:::i;:::-;;71362:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73864:392;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76425:122;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46346:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71658:47;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14129:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71454:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77075:268;13109:13;:11;:13::i;:::-;77224:5:::1;77202:18;:27;;;;77194:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;77278:8;77261:14;;:25;;;;;;;;;;;;;;;;;;77317:18;77297:38;;:17;;:38;;;;;;;;;;;;;;;;;;77075:268:::0;;:::o;77810:292::-;77958:4;78015:26;78000:41;;;:11;:41;;;;:94;;;;78058:36;78082:11;78058:23;:36::i;:::-;78000:94;77980:114;;77810:292;;;:::o;38840:100::-;38894:13;38927:5;38920:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38840:100;:::o;70965:32::-;;;;:::o;45323:218::-;45399:7;45424:16;45432:7;45424;:16::i;:::-;45419:64;;45449:34;;;;;;;;;;;;;;45419:64;45503:15;:24;45519:7;45503:24;;;;;;;;;;;:30;;;;;;;;;;;;45496:37;;45323:218;;;:::o;73478:378::-;71869:10;71856:23;;:9;:23;;;71848:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;73618:18:::1;;;;;;;;;;;71995:8;;;;;;;;;;;71994:9;71986:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;72041:8;72033:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;73656:17:::2;;73675:3;72208;72192:13;:19;;;;:::i;:::-;72179:9;:32;;72171:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;73697:3:::3;72317:1;72311:3;:7;72303:40;;;;;;;;;;;;:::i;:::-;;;;;;;;;72399:15;;72392:3;72376:13;:11;:13::i;:::-;:19;;;;:::i;:::-;:38;;72354:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;72541:19;;72534:3;72505:14;:26;72520:10;72505:26;;;;;;;;;;;;;;;;:32;;;;:::i;:::-;:55;;72483:132;;;;;;;;;;;;:::i;:::-;;;;;;;;;73729:11:::4;;73742:16;;72759:12;72801:10;72784:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;72774:39;;;;;;72759:54;;72846:49;72865:11;;72846:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72878:10;72890:4;72846:18;:49::i;:::-;72824:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;73808:3:::5;73778:14;:26;73793:10;73778:26;;;;;;;;;;;;;;;;:33;;;;;;;:::i;:::-;;;;;;;;73822:26;73832:10;73844:3;73822:9;:26::i;:::-;72748:213:::4;72626:1;;;72245::::3;72088::::2;;71921::::1;73478:378:::0;;;:::o;44764:400::-;44845:13;44861:16;44869:7;44861;:16::i;:::-;44845:32;;44917:5;44894:28;;:19;:17;:19::i;:::-;:28;;;44890:175;;44942:44;44959:5;44966:19;:17;:19::i;:::-;44942:16;:44::i;:::-;44937:128;;45014:35;;;;;;;;;;;;;;44937:128;44890:175;45110:2;45077:15;:24;45093:7;45077:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;45148:7;45144:2;45128:28;;45137:5;45128:28;;;;;;;;;;;;44834:330;44764:400;;:::o;74857:115::-;13109:13;:11;:13::i;:::-;74943:21:::1;;;;;;;;;;;74942:22;74918:21;;:46;;;;;;;;;;;;;;;;;;74857:115::o:0;70882:32::-;;;;:::o;71533:33::-;;;;:::o;34591:323::-;34652:7;34880:15;:13;:15::i;:::-;34865:12;;34849:13;;:28;:46;34842:53;;34591:323;:::o;49036:2817::-;49170:27;49200;49219:7;49200:18;:27::i;:::-;49170:57;;49285:4;49244:45;;49260:19;49244:45;;;49240:86;;49298:28;;;;;;;;;;;;;;49240:86;49340:27;49369:23;49396:35;49423:7;49396:26;:35::i;:::-;49339:92;;;;49531:68;49556:15;49573:4;49579:19;:17;:19::i;:::-;49531:24;:68::i;:::-;49526:180;;49619:43;49636:4;49642:19;:17;:19::i;:::-;49619:16;:43::i;:::-;49614:92;;49671:35;;;;;;;;;;;;;;49614:92;49526:180;49737:1;49723:16;;:2;:16;;;49719:52;;49748:23;;;;;;;;;;;;;;49719:52;49784:43;49806:4;49812:2;49816:7;49825:1;49784:21;:43::i;:::-;49920:15;49917:160;;;50060:1;50039:19;50032:30;49917:160;50457:18;:24;50476:4;50457:24;;;;;;;;;;;;;;;;50455:26;;;;;;;;;;;;50526:18;:22;50545:2;50526:22;;;;;;;;;;;;;;;;50524:24;;;;;;;;;;;50848:146;50885:2;50934:45;50949:4;50955:2;50959:19;50934:14;:45::i;:::-;30990:8;50906:73;50848:18;:146::i;:::-;50819:17;:26;50837:7;50819:26;;;;;;;;;;;:175;;;;51165:1;30990:8;51114:19;:47;:52;51110:627;;51187:19;51219:1;51209:7;:11;51187:33;;51376:1;51342:17;:30;51360:11;51342:30;;;;;;;;;;;;:35;51338:384;;51480:13;;51465:11;:28;51461:242;;51660:19;51627:17;:30;51645:11;51627:30;;;;;;;;;;;:52;;;;51461:242;51338:384;51168:569;51110:627;51784:7;51780:2;51765:27;;51774:4;51765:27;;;;;;;;;;;;51803:42;51824:4;51830:2;51834:7;51843:1;51803:20;:42::i;:::-;49159:2694;;;49036:2817;;;:::o;76796:271::-;76938:16;76956:21;77003:14;;;;;;;;;;;77053:5;77032:17;;;;;;;;;;;77020:29;;:9;:29;;;;:::i;:::-;77019:39;;;;:::i;:::-;76995:64;;;;76796:271;;;;;:::o;71405:40::-;;;;;;;;;;;;;:::o;71317:38::-;;;;;;;;;;;;;:::o;73225:245::-;71869:10;71856:23;;:9;:23;;;71848:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;73335:18:::1;;;;;;;;;;;71995:8;;;;;;;;;;;71994:9;71986:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;72041:8;72033:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;73374:17:::2;;73393:3;72208;72192:13;:19;;;;:::i;:::-;72179:9;:32;;72171:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;73415:3:::3;72317:1;72311:3;:7;72303:40;;;;;;;;;;;;:::i;:::-;;;;;;;;;72399:15;;72392:3;72376:13;:11;:13::i;:::-;:19;;;;:::i;:::-;:38;;72354:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;72541:19;;72534:3;72505:14;:26;72520:10;72505:26;;;;;;;;;;;;;;;;:32;;;;:::i;:::-;:55;;72483:132;;;;;;;;;;;;:::i;:::-;;;;;;;;;73436:26:::4;73446:10;73458:3;73436:9;:26::i;:::-;72245:1:::3;72088::::2;;71921::::1;73225:245:::0;:::o;70754:32::-;;;;:::o;71492:34::-;;;;:::o;77351:275::-;13109:13;:11;:13::i;:::-;77401:15:::1;77419:21;77401:39;;77469:1;77459:7;:11;77451:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;77508:12;77534:10;77526:24;;77558:7;77526:44;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77507:63;;;77589:7;77581:37;;;;;;;;;;;;:::i;:::-;;;;;;;;;77390:236;;77351:275::o:0;74980:106::-;13109:13;:11;:13::i;:::-;75060:18:::1;;;;;;;;;;;75059:19;75038:18;;:40;;;;;;;;;;;;;;;;;;74980:106::o:0;51949:185::-;52087:39;52104:4;52110:2;52114:7;52087:39;;;;;;;;;;;;:16;:39::i;:::-;51949:185;;;:::o;77634:168::-;13109:13;:11;:13::i;:::-;77700:15:::1;77718:5;:15;;;77742:4;77718:30;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;77700:48;;77759:5;:14;;;77774:10;77786:7;77759:35;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;77689:113;77634:168:::0;:::o;71111:33::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;71153:30::-;;;;;;;;;;;;;:::o;75317:88::-;13109:13;:11;:13::i;:::-;75394:3:::1;75384:7;:13;;;;;;:::i;:::-;;75317:88:::0;:::o;70793:37::-;;;;:::o;75872:114::-;13109:13;:11;:13::i;:::-;75975:3:::1;75953:19;:25;;;;;;:::i;:::-;;75872:114:::0;:::o;75994:84::-;13109:13;:11;:13::i;:::-;76060:10:::1;;;;;;;;;;;76059:11;76046:10;;:24;;;;;;;;;;;;;;;;;;75994:84::o:0;40233:152::-;40305:7;40348:27;40367:7;40348:18;:27::i;:::-;40325:52;;40233:152;;;:::o;76086:95::-;13109:13;:11;:13::i;:::-;76167:6:::1;76154:10;:19;;;;76086:95:::0;:::o;35775:233::-;35847:7;35888:1;35871:19;;:5;:19;;;35867:60;;35899:28;;;;;;;;;;;;;;35867:60;29934:13;35945:18;:25;35964:5;35945:25;;;;;;;;;;;;;;;;:55;35938:62;;35775:233;;;:::o;13871:103::-;13109:13;:11;:13::i;:::-;13936:30:::1;13963:1;13936:18;:30::i;:::-;13871:103::o:0;71005:38::-;;;;;;;;;;;;;:::o;70837:::-;;;;:::o;76555:120::-;13109:13;:11;:13::i;:::-;76657:10:::1;76636:18;:31;;;;76555:120:::0;:::o;75094:100::-;13109:13;:11;:13::i;:::-;75170:16:::1;;;;;;;;;;;75169:17;75150:16;;:36;;;;;;;;;;;;;;;;;;75094:100::o:0;13223:87::-;13269:7;13296:6;;;;;;;;;;;13289:13;;13223:87;:::o;39016:104::-;39072:13;39105:7;39098:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39016:104;:::o;45881:308::-;45992:19;:17;:19::i;:::-;45980:31;;:8;:31;;;45976:61;;46020:17;;;;;;;;;;;;;;45976:61;46102:8;46050:18;:39;46069:19;:17;:19::i;:::-;46050:39;;;;;;;;;;;;;;;:49;46090:8;46050:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;46162:8;46126:55;;46141:19;:17;:19::i;:::-;46126:55;;;46172:8;46126:55;;;;;;:::i;:::-;;;;;;;;45881:308;;:::o;76683:103::-;13109:13;:11;:13::i;:::-;76775:3:::1;76753:19;:25;;;;76683:103:::0;:::o;76301:116::-;13109:13;:11;:13::i;:::-;76399:10:::1;76380:16;:29;;;;76301:116:::0;:::o;76189:104::-;13109:13;:11;:13::i;:::-;76279:6:::1;76261:15;:24;;;;76189:104:::0;:::o;71052:29::-;;;;;;;;;;;;;:::o;71224:38::-;;;;;;;;;;;;;:::o;71190:27::-;;;;;;;;;;;;;:::o;52732:399::-;52899:31;52912:4;52918:2;52922:7;52899:12;:31::i;:::-;52963:1;52945:2;:14;;;:19;52941:183;;52984:56;53015:4;53021:2;53025:7;53034:5;52984:30;:56::i;:::-;52979:145;;53068:40;;;;;;;;;;;;;;52979:145;52941:183;52732:399;;;;:::o;70922:35::-;;;;:::o;74654:81::-;13109:13;:11;:13::i;:::-;74719:8:::1;;;;;;;;;;;74718:9;74707:8;;:20;;;;;;;;;;;;;;;;;;74654:81::o:0;71269:41::-;;;;;;;;;;;;;:::o;75417:447::-;75535:13;75574:16;75582:7;75574;:16::i;:::-;75566:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;75630:10;;;;;;;;;;;75625:70;;75664:19;75657:26;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;75625:70;75751:1;75733:7;75727:21;;;;;:::i;:::-;;;:25;:129;;;;;;;;;;;;;;;;;75796:7;75805:18;:7;:16;:18::i;:::-;75779:54;;;;;;;;;:::i;:::-;;;;;;;;;;;;;75727:129;75707:149;;75417:447;;;;:::o;74264:374::-;71869:10;71856:23;;:9;:23;;;71848:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;74374:16:::1;;;;;;;;;;;71995:8;;;;;;;;;;;71994:9;71986:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;72041:8;72033:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;74409:1:::2;72317;72311:3;:7;72303:40;;;;;;;;;;;;:::i;:::-;;;;;;;;;72399:15;;72392:3;72376:13;:11;:13::i;:::-;:19;;;;:::i;:::-;:38;;72354:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;72541:19;;72534:3;72505:14;:26;72520:10;72505:26;;;;;;;;;;;;;;;;:32;;;;:::i;:::-;:55;;72483:132;;;;;;;;;;;;:::i;:::-;;;;;;;;;74440:11:::3;;74453:18;;72759:12;72801:10;72784:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;72774:39;;;;;;72759:54;;72846:49;72865:11;;72846:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72878:10;72890:4;72846:18;:49::i;:::-;72824:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;74498:15:::4;:27;74514:10;74498:27;;;;;;;;;;;;;;;;;;;;;;;;;74497:28;74489:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;74591:4;74561:15;:27;74577:10;74561:27;;;;;;;;;;;;;;;;:34;;;;;;;;;;;;;;;;;;74606:24;74616:10;74628:1;74606:9;:24::i;:::-;72748:213:::3;72626:1;;;72088::::2;71921::::1;74264:374:::0;;:::o;74743:106::-;13109:13;:11;:13::i;:::-;74823:18:::1;;;;;;;;;;;74822:19;74801:18;;:40;;;;;;;;;;;;;;;;;;74743:106::o:0;71362:36::-;;;;;;;;;;;;;:::o;73864:392::-;71869:10;71856:23;;:9;:23;;;71848:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;74009:21:::1;;;;;;;;;;;71995:8;;;;;;;;;;;71994:9;71986:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;72041:8;72033:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;74051:20:::2;;74073:3;72208;72192:13;:19;;;;:::i;:::-;72179:9;:32;;72171:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;74095:3:::3;72317:1;72311:3;:7;72303:40;;;;;;;;;;;;:::i;:::-;;;;;;;;;72399:15;;72392:3;72376:13;:11;:13::i;:::-;:19;;;;:::i;:::-;:38;;72354:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;72541:19;;72534:3;72505:14;:26;72520:10;72505:26;;;;;;;;;;;;;;;;:32;;;;:::i;:::-;:55;;72483:132;;;;;;;;;;;;:::i;:::-;;;;;;;;;74128:11:::4;;74141:19;;72759:12;72801:10;72784:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;72774:39;;;;;;72759:54;;72846:49;72865:11;;72846:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72878:10;72890:4;72846:18;:49::i;:::-;72824:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;74208:3:::5;74178:14;:26;74193:10;74178:26;;;;;;;;;;;;;;;;:33;;;;;;;:::i;:::-;;;;;;;;74222:26;74232:10;74244:3;74222:9;:26::i;:::-;72748:213:::4;72626:1;;;72245::::3;72088::::2;;71921::::1;73864:392:::0;;;:::o;76425:122::-;13109:13;:11;:13::i;:::-;76529:10:::1;76507:19;:32;;;;76425:122:::0;:::o;46346:164::-;46443:4;46467:18;:25;46486:5;46467:25;;;;;;;;;;;;;;;:35;46493:8;46467:35;;;;;;;;;;;;;;;;;;;;;;;;;46460:42;;46346:164;;;;:::o;71658:47::-;;;;;;;;;;;;;;;;;;;;;;:::o;14129:201::-;13109:13;:11;:13::i;:::-;14238:1:::1;14218:22;;:8;:22;;::::0;14210:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;14294:28;14313:8;14294:18;:28::i;:::-;14129:201:::0;:::o;71454:31::-;;;;:::o;13388:132::-;13463:12;:10;:12::i;:::-;13452:23;;:7;:5;:7::i;:::-;:23;;;13444:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;13388:132::o;37938:639::-;38023:4;38362:10;38347:25;;:11;:25;;;;:102;;;;38439:10;38424:25;;:11;:25;;;;38347:102;:179;;;;38516:10;38501:25;;:11;:25;;;;38347:179;38327:199;;37938:639;;;:::o;46768:282::-;46833:4;46889:7;46870:15;:13;:15::i;:::-;:26;;:66;;;;;46923:13;;46913:7;:23;46870:66;:153;;;;;47022:1;30710:8;46974:17;:26;46992:7;46974:26;;;;;;;;;;;;:44;:49;46870:153;46850:173;;46768:282;;;:::o;3589:190::-;3714:4;3767;3738:25;3751:5;3758:4;3738:12;:25::i;:::-;:33;3731:40;;3589:190;;;;;:::o;62638:112::-;62715:27;62725:2;62729:8;62715:27;;;;;;;;;;;;:9;:27::i;:::-;62638:112;;:::o;68806:105::-;68866:7;68893:10;68886:17;;68806:105;:::o;34107:92::-;34163:7;34107:92;:::o;41388:1275::-;41455:7;41475:12;41490:7;41475:22;;41558:4;41539:15;:13;:15::i;:::-;:23;41535:1061;;41592:13;;41585:4;:20;41581:1015;;;41630:14;41647:17;:23;41665:4;41647:23;;;;;;;;;;;;41630:40;;41764:1;30710:8;41736:6;:24;:29;41732:845;;42401:113;42418:1;42408:6;:11;42401:113;;42461:17;:25;42479:6;;;;;;;42461:25;;;;;;;;;;;;42452:34;;42401:113;;;42547:6;42540:13;;;;;;41732:845;41607:989;41581:1015;41535:1061;42624:31;;;;;;;;;;;;;;41388:1275;;;;:::o;47931:485::-;48033:27;48062:23;48103:38;48144:15;:24;48160:7;48144:24;;;;;;;;;;;48103:65;;48321:18;48298:41;;48378:19;48372:26;48353:45;;48283:126;47931:485;;;:::o;47159:659::-;47308:11;47473:16;47466:5;47462:28;47453:37;;47633:16;47622:9;47618:32;47605:45;;47783:15;47772:9;47769:30;47761:5;47750:9;47747:20;47744:56;47734:66;;47159:659;;;;;:::o;53793:159::-;;;;;:::o;68115:311::-;68250:7;68270:16;31114:3;68296:19;:41;;68270:68;;31114:3;68364:31;68375:4;68381:2;68385:9;68364:10;:31::i;:::-;68356:40;;:62;;68349:69;;;68115:311;;;;;:::o;43211:450::-;43291:14;43459:16;43452:5;43448:28;43439:37;;43636:5;43622:11;43597:23;43593:41;43590:52;43583:5;43580:63;43570:73;;43211:450;;;;:::o;54617:158::-;;;;;:::o;14490:191::-;14564:16;14583:6;;;;;;;;;;;14564:25;;14609:8;14600:6;;:17;;;;;;;;;;;;;;;;;;14664:8;14633:40;;14654:8;14633:40;;;;;;;;;;;;14553:128;14490:191;:::o;55215:716::-;55378:4;55424:2;55399:45;;;55445:19;:17;:19::i;:::-;55466:4;55472:7;55481:5;55399:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;55395:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55699:1;55682:6;:13;:18;55678:235;;55728:40;;;;;;;;;;;;;;55678:235;55871:6;55865:13;55856:6;55852:2;55848:15;55841:38;55395:529;55568:54;;;55558:64;;;:6;:64;;;;55551:71;;;55215:716;;;;;;:::o;303:723::-;359:13;589:1;580:5;:10;576:53;;607:10;;;;;;;;;;;;;;;;;;;;;576:53;639:12;654:5;639:20;;670:14;695:78;710:1;702:4;:9;695:78;;728:8;;;;;:::i;:::-;;;;759:2;751:10;;;;;:::i;:::-;;;695:78;;;783:19;815:6;805:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;783:39;;833:154;849:1;840:5;:10;833:154;;877:1;867:11;;;;;:::i;:::-;;;944:2;936:5;:10;;;;:::i;:::-;923:2;:24;;;;:::i;:::-;910:39;;893:6;900;893:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;973:2;964:11;;;;;:::i;:::-;;;833:154;;;1011:6;997:21;;;;;303:723;;;;:::o;11774:98::-;11827:7;11854:10;11847:17;;11774:98;:::o;4456:296::-;4539:7;4559:20;4582:4;4559:27;;4602:9;4597:118;4621:5;:12;4617:1;:16;4597:118;;;4670:33;4680:12;4694:5;4700:1;4694:8;;;;;;;;:::i;:::-;;;;;;;;4670:9;:33::i;:::-;4655:48;;4635:3;;;;;:::i;:::-;;;;4597:118;;;;4732:12;4725:19;;;4456:296;;;;:::o;61865:689::-;61996:19;62002:2;62006:8;61996:5;:19::i;:::-;62075:1;62057:2;:14;;;:19;62053:483;;62097:11;62111:13;;62097:27;;62143:13;62165:8;62159:3;:14;62143:30;;62192:233;62223:62;62262:1;62266:2;62270:7;;;;;;62279:5;62223:30;:62::i;:::-;62218:167;;62321:40;;;;;;;;;;;;;;62218:167;62420:3;62412:5;:11;62192:233;;62507:3;62490:13;;:20;62486:34;;62512:8;;;62486:34;62078:458;;62053:483;61865:689;;;:::o;67816:147::-;67953:6;67816:147;;;;;:::o;10663:149::-;10726:7;10757:1;10753;:5;:51;;10784:20;10799:1;10802;10784:14;:20::i;:::-;10753:51;;;10761:20;10776:1;10779;10761:14;:20::i;:::-;10753:51;10746:58;;10663:149;;;;:::o;56393:2720::-;56466:20;56489:13;;56466:36;;56529:1;56517:8;:13;56513:44;;56539:18;;;;;;;;;;;;;;56513:44;56570:61;56600:1;56604:2;56608:12;56622:8;56570:21;:61::i;:::-;57114:1;30072:2;57084:1;:26;;57083:32;57071:8;:45;57045:18;:22;57064:2;57045:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;57393:139;57430:2;57484:33;57507:1;57511:2;57515:1;57484:14;:33::i;:::-;57451:30;57472:8;57451:20;:30::i;:::-;:66;57393:18;:139::i;:::-;57359:17;:31;57377:12;57359:31;;;;;;;;;;;:173;;;;57549:16;57580:11;57609:8;57594:12;:23;57580:37;;58130:16;58126:2;58122:25;58110:37;;58502:12;58462:8;58421:1;58359:25;58300:1;58239;58212:335;58627:1;58613:12;58609:20;58567:346;58668:3;58659:7;58656:16;58567:346;;58886:7;58876:8;58873:1;58846:25;58843:1;58840;58835:59;58721:1;58712:7;58708:15;58697:26;;58567:346;;;58571:77;58958:1;58946:8;:13;58942:45;;58968:19;;;;;;;;;;;;;;58942:45;59020:3;59004:13;:19;;;;56819:2216;;59045:60;59074:1;59078:2;59082:12;59096:8;59045:20;:60::i;:::-;56455:2658;56393:2720;;:::o;10820:268::-;10888:13;10995:1;10989:4;10982:15;11024:1;11018:4;11011:15;11065:4;11059;11049:21;11040:30;;10820:268;;;;:::o;43763:324::-;43833:14;44066:1;44056:8;44053:15;44027:24;44023:46;44013:56;;43763:324;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:126;371:7;411:42;404:5;400:54;389:65;;334:126;;;:::o;466:96::-;503:7;532:24;550:5;532:24;:::i;:::-;521:35;;466:96;;;:::o;568:122::-;641:24;659:5;641:24;:::i;:::-;634:5;631:35;621:63;;680:1;677;670:12;621:63;568:122;:::o;696:139::-;742:5;780:6;767:20;758:29;;796:33;823:5;796:33;:::i;:::-;696:139;;;;:::o;841:86::-;876:7;916:4;909:5;905:16;894:27;;841:86;;;:::o;933:118::-;1004:22;1020:5;1004:22;:::i;:::-;997:5;994:33;984:61;;1041:1;1038;1031:12;984:61;933:118;:::o;1057:135::-;1101:5;1139:6;1126:20;1117:29;;1155:31;1180:5;1155:31;:::i;:::-;1057:135;;;;:::o;1198:470::-;1264:6;1272;1321:2;1309:9;1300:7;1296:23;1292:32;1289:119;;;1327:79;;:::i;:::-;1289:119;1447:1;1472:53;1517:7;1508:6;1497:9;1493:22;1472:53;:::i;:::-;1462:63;;1418:117;1574:2;1600:51;1643:7;1634:6;1623:9;1619:22;1600:51;:::i;:::-;1590:61;;1545:116;1198:470;;;;;:::o;1674:149::-;1710:7;1750:66;1743:5;1739:78;1728:89;;1674:149;;;:::o;1829:120::-;1901:23;1918:5;1901:23;:::i;:::-;1894:5;1891:34;1881:62;;1939:1;1936;1929:12;1881:62;1829:120;:::o;1955:137::-;2000:5;2038:6;2025:20;2016:29;;2054:32;2080:5;2054:32;:::i;:::-;1955:137;;;;:::o;2098:327::-;2156:6;2205:2;2193:9;2184:7;2180:23;2176:32;2173:119;;;2211:79;;:::i;:::-;2173:119;2331:1;2356:52;2400:7;2391:6;2380:9;2376:22;2356:52;:::i;:::-;2346:62;;2302:116;2098:327;;;;:::o;2431:90::-;2465:7;2508:5;2501:13;2494:21;2483:32;;2431:90;;;:::o;2527:109::-;2608:21;2623:5;2608:21;:::i;:::-;2603:3;2596:34;2527:109;;:::o;2642:210::-;2729:4;2767:2;2756:9;2752:18;2744:26;;2780:65;2842:1;2831:9;2827:17;2818:6;2780:65;:::i;:::-;2642:210;;;;:::o;2858:99::-;2910:6;2944:5;2938:12;2928:22;;2858:99;;;:::o;2963:169::-;3047:11;3081:6;3076:3;3069:19;3121:4;3116:3;3112:14;3097:29;;2963:169;;;;:::o;3138:246::-;3219:1;3229:113;3243:6;3240:1;3237:13;3229:113;;;3328:1;3323:3;3319:11;3313:18;3309:1;3304:3;3300:11;3293:39;3265:2;3262:1;3258:10;3253:15;;3229:113;;;3376:1;3367:6;3362:3;3358:16;3351:27;3200:184;3138:246;;;:::o;3390:102::-;3431:6;3482:2;3478:7;3473:2;3466:5;3462:14;3458:28;3448:38;;3390:102;;;:::o;3498:377::-;3586:3;3614:39;3647:5;3614:39;:::i;:::-;3669:71;3733:6;3728:3;3669:71;:::i;:::-;3662:78;;3749:65;3807:6;3802:3;3795:4;3788:5;3784:16;3749:65;:::i;:::-;3839:29;3861:6;3839:29;:::i;:::-;3834:3;3830:39;3823:46;;3590:285;3498:377;;;;:::o;3881:313::-;3994:4;4032:2;4021:9;4017:18;4009:26;;4081:9;4075:4;4071:20;4067:1;4056:9;4052:17;4045:47;4109:78;4182:4;4173:6;4109:78;:::i;:::-;4101:86;;3881:313;;;;:::o;4200:77::-;4237:7;4266:5;4255:16;;4200:77;;;:::o;4283:118::-;4370:24;4388:5;4370:24;:::i;:::-;4365:3;4358:37;4283:118;;:::o;4407:222::-;4500:4;4538:2;4527:9;4523:18;4515:26;;4551:71;4619:1;4608:9;4604:17;4595:6;4551:71;:::i;:::-;4407:222;;;;:::o;4635:122::-;4708:24;4726:5;4708:24;:::i;:::-;4701:5;4698:35;4688:63;;4747:1;4744;4737:12;4688:63;4635:122;:::o;4763:139::-;4809:5;4847:6;4834:20;4825:29;;4863:33;4890:5;4863:33;:::i;:::-;4763:139;;;;:::o;4908:329::-;4967:6;5016:2;5004:9;4995:7;4991:23;4987:32;4984:119;;;5022:79;;:::i;:::-;4984:119;5142:1;5167:53;5212:7;5203:6;5192:9;5188:22;5167:53;:::i;:::-;5157:63;;5113:117;4908:329;;;;:::o;5243:118::-;5330:24;5348:5;5330:24;:::i;:::-;5325:3;5318:37;5243:118;;:::o;5367:222::-;5460:4;5498:2;5487:9;5483:18;5475:26;;5511:71;5579:1;5568:9;5564:17;5555:6;5511:71;:::i;:::-;5367:222;;;;:::o;5595:117::-;5704:1;5701;5694:12;5718:117;5827:1;5824;5817:12;5841:117;5950:1;5947;5940:12;5981:568;6054:8;6064:6;6114:3;6107:4;6099:6;6095:17;6091:27;6081:122;;6122:79;;:::i;:::-;6081:122;6235:6;6222:20;6212:30;;6265:18;6257:6;6254:30;6251:117;;;6287:79;;:::i;:::-;6251:117;6401:4;6393:6;6389:17;6377:29;;6455:3;6447:4;6439:6;6435:17;6425:8;6421:32;6418:41;6415:128;;;6462:79;;:::i;:::-;6415:128;5981:568;;;;;:::o;6555:704::-;6650:6;6658;6666;6715:2;6703:9;6694:7;6690:23;6686:32;6683:119;;;6721:79;;:::i;:::-;6683:119;6841:1;6866:53;6911:7;6902:6;6891:9;6887:22;6866:53;:::i;:::-;6856:63;;6812:117;6996:2;6985:9;6981:18;6968:32;7027:18;7019:6;7016:30;7013:117;;;7049:79;;:::i;:::-;7013:117;7162:80;7234:7;7225:6;7214:9;7210:22;7162:80;:::i;:::-;7144:98;;;;6939:313;6555:704;;;;;:::o;7265:474::-;7333:6;7341;7390:2;7378:9;7369:7;7365:23;7361:32;7358:119;;;7396:79;;:::i;:::-;7358:119;7516:1;7541:53;7586:7;7577:6;7566:9;7562:22;7541:53;:::i;:::-;7531:63;;7487:117;7643:2;7669:53;7714:7;7705:6;7694:9;7690:22;7669:53;:::i;:::-;7659:63;;7614:118;7265:474;;;;;:::o;7745:77::-;7782:7;7811:5;7800:16;;7745:77;;;:::o;7828:118::-;7915:24;7933:5;7915:24;:::i;:::-;7910:3;7903:37;7828:118;;:::o;7952:222::-;8045:4;8083:2;8072:9;8068:18;8060:26;;8096:71;8164:1;8153:9;8149:17;8140:6;8096:71;:::i;:::-;7952:222;;;;:::o;8180:619::-;8257:6;8265;8273;8322:2;8310:9;8301:7;8297:23;8293:32;8290:119;;;8328:79;;:::i;:::-;8290:119;8448:1;8473:53;8518:7;8509:6;8498:9;8494:22;8473:53;:::i;:::-;8463:63;;8419:117;8575:2;8601:53;8646:7;8637:6;8626:9;8622:22;8601:53;:::i;:::-;8591:63;;8546:118;8703:2;8729:53;8774:7;8765:6;8754:9;8750:22;8729:53;:::i;:::-;8719:63;;8674:118;8180:619;;;;;:::o;8805:474::-;8873:6;8881;8930:2;8918:9;8909:7;8905:23;8901:32;8898:119;;;8936:79;;:::i;:::-;8898:119;9056:1;9081:53;9126:7;9117:6;9106:9;9102:22;9081:53;:::i;:::-;9071:63;;9027:117;9183:2;9209:53;9254:7;9245:6;9234:9;9230:22;9209:53;:::i;:::-;9199:63;;9154:118;8805:474;;;;;:::o;9285:332::-;9406:4;9444:2;9433:9;9429:18;9421:26;;9457:71;9525:1;9514:9;9510:17;9501:6;9457:71;:::i;:::-;9538:72;9606:2;9595:9;9591:18;9582:6;9538:72;:::i;:::-;9285:332;;;;;:::o;9623:110::-;9674:7;9703:24;9721:5;9703:24;:::i;:::-;9692:35;;9623:110;;;:::o;9739:150::-;9826:38;9858:5;9826:38;:::i;:::-;9819:5;9816:49;9806:77;;9879:1;9876;9869:12;9806:77;9739:150;:::o;9895:167::-;9955:5;9993:6;9980:20;9971:29;;10009:47;10050:5;10009:47;:::i;:::-;9895:167;;;;:::o;10068:357::-;10141:6;10190:2;10178:9;10169:7;10165:23;10161:32;10158:119;;;10196:79;;:::i;:::-;10158:119;10316:1;10341:67;10400:7;10391:6;10380:9;10376:22;10341:67;:::i;:::-;10331:77;;10287:131;10068:357;;;;:::o;10431:117::-;10540:1;10537;10530:12;10554:180;10602:77;10599:1;10592:88;10699:4;10696:1;10689:15;10723:4;10720:1;10713:15;10740:281;10823:27;10845:4;10823:27;:::i;:::-;10815:6;10811:40;10953:6;10941:10;10938:22;10917:18;10905:10;10902:34;10899:62;10896:88;;;10964:18;;:::i;:::-;10896:88;11004:10;11000:2;10993:22;10783:238;10740:281;;:::o;11027:129::-;11061:6;11088:20;;:::i;:::-;11078:30;;11117:33;11145:4;11137:6;11117:33;:::i;:::-;11027:129;;;:::o;11162:308::-;11224:4;11314:18;11306:6;11303:30;11300:56;;;11336:18;;:::i;:::-;11300:56;11374:29;11396:6;11374:29;:::i;:::-;11366:37;;11458:4;11452;11448:15;11440:23;;11162:308;;;:::o;11476:146::-;11573:6;11568:3;11563;11550:30;11614:1;11605:6;11600:3;11596:16;11589:27;11476:146;;;:::o;11628:425::-;11706:5;11731:66;11747:49;11789:6;11747:49;:::i;:::-;11731:66;:::i;:::-;11722:75;;11820:6;11813:5;11806:21;11858:4;11851:5;11847:16;11896:3;11887:6;11882:3;11878:16;11875:25;11872:112;;;11903:79;;:::i;:::-;11872:112;11993:54;12040:6;12035:3;12030;11993:54;:::i;:::-;11712:341;11628:425;;;;;:::o;12073:340::-;12129:5;12178:3;12171:4;12163:6;12159:17;12155:27;12145:122;;12186:79;;:::i;:::-;12145:122;12303:6;12290:20;12328:79;12403:3;12395:6;12388:4;12380:6;12376:17;12328:79;:::i;:::-;12319:88;;12135:278;12073:340;;;;:::o;12419:509::-;12488:6;12537:2;12525:9;12516:7;12512:23;12508:32;12505:119;;;12543:79;;:::i;:::-;12505:119;12691:1;12680:9;12676:17;12663:31;12721:18;12713:6;12710:30;12707:117;;;12743:79;;:::i;:::-;12707:117;12848:63;12903:7;12894:6;12883:9;12879:22;12848:63;:::i;:::-;12838:73;;12634:287;12419:509;;;;:::o;12934:329::-;12993:6;13042:2;13030:9;13021:7;13017:23;13013:32;13010:119;;;13048:79;;:::i;:::-;13010:119;13168:1;13193:53;13238:7;13229:6;13218:9;13214:22;13193:53;:::i;:::-;13183:63;;13139:117;12934:329;;;;:::o;13269:109::-;13305:7;13345:26;13338:5;13334:38;13323:49;;13269:109;;;:::o;13384:115::-;13469:23;13486:5;13469:23;:::i;:::-;13464:3;13457:36;13384:115;;:::o;13505:218::-;13596:4;13634:2;13623:9;13619:18;13611:26;;13647:69;13713:1;13702:9;13698:17;13689:6;13647:69;:::i;:::-;13505:218;;;;:::o;13729:122::-;13802:24;13820:5;13802:24;:::i;:::-;13795:5;13792:35;13782:63;;13841:1;13838;13831:12;13782:63;13729:122;:::o;13857:139::-;13903:5;13941:6;13928:20;13919:29;;13957:33;13984:5;13957:33;:::i;:::-;13857:139;;;;:::o;14002:329::-;14061:6;14110:2;14098:9;14089:7;14085:23;14081:32;14078:119;;;14116:79;;:::i;:::-;14078:119;14236:1;14261:53;14306:7;14297:6;14286:9;14282:22;14261:53;:::i;:::-;14251:63;;14207:117;14002:329;;;;:::o;14337:116::-;14407:21;14422:5;14407:21;:::i;:::-;14400:5;14397:32;14387:60;;14443:1;14440;14433:12;14387:60;14337:116;:::o;14459:133::-;14502:5;14540:6;14527:20;14518:29;;14556:30;14580:5;14556:30;:::i;:::-;14459:133;;;;:::o;14598:468::-;14663:6;14671;14720:2;14708:9;14699:7;14695:23;14691:32;14688:119;;;14726:79;;:::i;:::-;14688:119;14846:1;14871:53;14916:7;14907:6;14896:9;14892:22;14871:53;:::i;:::-;14861:63;;14817:117;14973:2;14999:50;15041:7;15032:6;15021:9;15017:22;14999:50;:::i;:::-;14989:60;;14944:115;14598:468;;;;;:::o;15072:307::-;15133:4;15223:18;15215:6;15212:30;15209:56;;;15245:18;;:::i;:::-;15209:56;15283:29;15305:6;15283:29;:::i;:::-;15275:37;;15367:4;15361;15357:15;15349:23;;15072:307;;;:::o;15385:423::-;15462:5;15487:65;15503:48;15544:6;15503:48;:::i;:::-;15487:65;:::i;:::-;15478:74;;15575:6;15568:5;15561:21;15613:4;15606:5;15602:16;15651:3;15642:6;15637:3;15633:16;15630:25;15627:112;;;15658:79;;:::i;:::-;15627:112;15748:54;15795:6;15790:3;15785;15748:54;:::i;:::-;15468:340;15385:423;;;;;:::o;15827:338::-;15882:5;15931:3;15924:4;15916:6;15912:17;15908:27;15898:122;;15939:79;;:::i;:::-;15898:122;16056:6;16043:20;16081:78;16155:3;16147:6;16140:4;16132:6;16128:17;16081:78;:::i;:::-;16072:87;;15888:277;15827:338;;;;:::o;16171:943::-;16266:6;16274;16282;16290;16339:3;16327:9;16318:7;16314:23;16310:33;16307:120;;;16346:79;;:::i;:::-;16307:120;16466:1;16491:53;16536:7;16527:6;16516:9;16512:22;16491:53;:::i;:::-;16481:63;;16437:117;16593:2;16619:53;16664:7;16655:6;16644:9;16640:22;16619:53;:::i;:::-;16609:63;;16564:118;16721:2;16747:53;16792:7;16783:6;16772:9;16768:22;16747:53;:::i;:::-;16737:63;;16692:118;16877:2;16866:9;16862:18;16849:32;16908:18;16900:6;16897:30;16894:117;;;16930:79;;:::i;:::-;16894:117;17035:62;17089:7;17080:6;17069:9;17065:22;17035:62;:::i;:::-;17025:72;;16820:287;16171:943;;;;;;;:::o;17120:559::-;17206:6;17214;17263:2;17251:9;17242:7;17238:23;17234:32;17231:119;;;17269:79;;:::i;:::-;17231:119;17417:1;17406:9;17402:17;17389:31;17447:18;17439:6;17436:30;17433:117;;;17469:79;;:::i;:::-;17433:117;17582:80;17654:7;17645:6;17634:9;17630:22;17582:80;:::i;:::-;17564:98;;;;17360:312;17120:559;;;;;:::o;17685:474::-;17753:6;17761;17810:2;17798:9;17789:7;17785:23;17781:32;17778:119;;;17816:79;;:::i;:::-;17778:119;17936:1;17961:53;18006:7;17997:6;17986:9;17982:22;17961:53;:::i;:::-;17951:63;;17907:117;18063:2;18089:53;18134:7;18125:6;18114:9;18110:22;18089:53;:::i;:::-;18079:63;;18034:118;17685:474;;;;;:::o;18165:166::-;18305:18;18301:1;18293:6;18289:14;18282:42;18165:166;:::o;18337:366::-;18479:3;18500:67;18564:2;18559:3;18500:67;:::i;:::-;18493:74;;18576:93;18665:3;18576:93;:::i;:::-;18694:2;18689:3;18685:12;18678:19;;18337:366;;;:::o;18709:419::-;18875:4;18913:2;18902:9;18898:18;18890:26;;18962:9;18956:4;18952:20;18948:1;18937:9;18933:17;18926:47;18990:131;19116:4;18990:131;:::i;:::-;18982:139;;18709:419;;;:::o;19134:180::-;19182:77;19179:1;19172:88;19279:4;19276:1;19269:15;19303:4;19300:1;19293:15;19320:320;19364:6;19401:1;19395:4;19391:12;19381:22;;19448:1;19442:4;19438:12;19469:18;19459:81;;19525:4;19517:6;19513:17;19503:27;;19459:81;19587:2;19579:6;19576:14;19556:18;19553:38;19550:84;;19606:18;;:::i;:::-;19550:84;19371:269;19320:320;;;:::o;19646:176::-;19786:28;19782:1;19774:6;19770:14;19763:52;19646:176;:::o;19828:366::-;19970:3;19991:67;20055:2;20050:3;19991:67;:::i;:::-;19984:74;;20067:93;20156:3;20067:93;:::i;:::-;20185:2;20180:3;20176:12;20169:19;;19828:366;;;:::o;20200:419::-;20366:4;20404:2;20393:9;20389:18;20381:26;;20453:9;20447:4;20443:20;20439:1;20428:9;20424:17;20417:47;20481:131;20607:4;20481:131;:::i;:::-;20473:139;;20200:419;;;:::o;20625:164::-;20765:16;20761:1;20753:6;20749:14;20742:40;20625:164;:::o;20795:366::-;20937:3;20958:67;21022:2;21017:3;20958:67;:::i;:::-;20951:74;;21034:93;21123:3;21034:93;:::i;:::-;21152:2;21147:3;21143:12;21136:19;;20795:366;;;:::o;21167:419::-;21333:4;21371:2;21360:9;21356:18;21348:26;;21420:9;21414:4;21410:20;21406:1;21395:9;21391:17;21384:47;21448:131;21574:4;21448:131;:::i;:::-;21440:139;;21167:419;;;:::o;21592:173::-;21732:25;21728:1;21720:6;21716:14;21709:49;21592:173;:::o;21771:366::-;21913:3;21934:67;21998:2;21993:3;21934:67;:::i;:::-;21927:74;;22010:93;22099:3;22010:93;:::i;:::-;22128:2;22123:3;22119:12;22112:19;;21771:366;;;:::o;22143:419::-;22309:4;22347:2;22336:9;22332:18;22324:26;;22396:9;22390:4;22386:20;22382:1;22371:9;22367:17;22360:47;22424:131;22550:4;22424:131;:::i;:::-;22416:139;;22143:419;;;:::o;22568:180::-;22616:77;22613:1;22606:88;22713:4;22710:1;22703:15;22737:4;22734:1;22727:15;22754:410;22794:7;22817:20;22835:1;22817:20;:::i;:::-;22812:25;;22851:20;22869:1;22851:20;:::i;:::-;22846:25;;22906:1;22903;22899:9;22928:30;22946:11;22928:30;:::i;:::-;22917:41;;23107:1;23098:7;23094:15;23091:1;23088:22;23068:1;23061:9;23041:83;23018:139;;23137:18;;:::i;:::-;23018:139;22802:362;22754:410;;;;:::o;23170:168::-;23310:20;23306:1;23298:6;23294:14;23287:44;23170:168;:::o;23344:366::-;23486:3;23507:67;23571:2;23566:3;23507:67;:::i;:::-;23500:74;;23583:93;23672:3;23583:93;:::i;:::-;23701:2;23696:3;23692:12;23685:19;;23344:366;;;:::o;23716:419::-;23882:4;23920:2;23909:9;23905:18;23897:26;;23969:9;23963:4;23959:20;23955:1;23944:9;23940:17;23933:47;23997:131;24123:4;23997:131;:::i;:::-;23989:139;;23716:419;;;:::o;24141:170::-;24281:22;24277:1;24269:6;24265:14;24258:46;24141:170;:::o;24317:366::-;24459:3;24480:67;24544:2;24539:3;24480:67;:::i;:::-;24473:74;;24556:93;24645:3;24556:93;:::i;:::-;24674:2;24669:3;24665:12;24658:19;;24317:366;;;:::o;24689:419::-;24855:4;24893:2;24882:9;24878:18;24870:26;;24942:9;24936:4;24932:20;24928:1;24917:9;24913:17;24906:47;24970:131;25096:4;24970:131;:::i;:::-;24962:139;;24689:419;;;:::o;25114:191::-;25154:3;25173:20;25191:1;25173:20;:::i;:::-;25168:25;;25207:20;25225:1;25207:20;:::i;:::-;25202:25;;25250:1;25247;25243:9;25236:16;;25271:3;25268:1;25265:10;25262:36;;;25278:18;;:::i;:::-;25262:36;25114:191;;;;:::o;25311:180::-;25451:32;25447:1;25439:6;25435:14;25428:56;25311:180;:::o;25497:366::-;25639:3;25660:67;25724:2;25719:3;25660:67;:::i;:::-;25653:74;;25736:93;25825:3;25736:93;:::i;:::-;25854:2;25849:3;25845:12;25838:19;;25497:366;;;:::o;25869:419::-;26035:4;26073:2;26062:9;26058:18;26050:26;;26122:9;26116:4;26112:20;26108:1;26097:9;26093:17;26086:47;26150:131;26276:4;26150:131;:::i;:::-;26142:139;;25869:419;;;:::o;26294:177::-;26434:29;26430:1;26422:6;26418:14;26411:53;26294:177;:::o;26477:366::-;26619:3;26640:67;26704:2;26699:3;26640:67;:::i;:::-;26633:74;;26716:93;26805:3;26716:93;:::i;:::-;26834:2;26829:3;26825:12;26818:19;;26477:366;;;:::o;26849:419::-;27015:4;27053:2;27042:9;27038:18;27030:26;;27102:9;27096:4;27092:20;27088:1;27077:9;27073:17;27066:47;27130:131;27256:4;27130:131;:::i;:::-;27122:139;;26849:419;;;:::o;27274:94::-;27307:8;27355:5;27351:2;27347:14;27326:35;;27274:94;;;:::o;27374:::-;27413:7;27442:20;27456:5;27442:20;:::i;:::-;27431:31;;27374:94;;;:::o;27474:100::-;27513:7;27542:26;27562:5;27542:26;:::i;:::-;27531:37;;27474:100;;;:::o;27580:157::-;27685:45;27705:24;27723:5;27705:24;:::i;:::-;27685:45;:::i;:::-;27680:3;27673:58;27580:157;;:::o;27743:256::-;27855:3;27870:75;27941:3;27932:6;27870:75;:::i;:::-;27970:2;27965:3;27961:12;27954:19;;27990:3;27983:10;;27743:256;;;;:::o;28005:168::-;28145:20;28141:1;28133:6;28129:14;28122:44;28005:168;:::o;28179:366::-;28321:3;28342:67;28406:2;28401:3;28342:67;:::i;:::-;28335:74;;28418:93;28507:3;28418:93;:::i;:::-;28536:2;28531:3;28527:12;28520:19;;28179:366;;;:::o;28551:419::-;28717:4;28755:2;28744:9;28740:18;28732:26;;28804:9;28798:4;28794:20;28790:1;28779:9;28775:17;28768:47;28832:131;28958:4;28832:131;:::i;:::-;28824:139;;28551:419;;;:::o;28976:180::-;29024:77;29021:1;29014:88;29121:4;29118:1;29111:15;29145:4;29142:1;29135:15;29162:185;29202:1;29219:20;29237:1;29219:20;:::i;:::-;29214:25;;29253:20;29271:1;29253:20;:::i;:::-;29248:25;;29292:1;29282:35;;29297:18;;:::i;:::-;29282:35;29339:1;29336;29332:9;29327:14;;29162:185;;;;:::o;29353:171::-;29493:23;29489:1;29481:6;29477:14;29470:47;29353:171;:::o;29530:366::-;29672:3;29693:67;29757:2;29752:3;29693:67;:::i;:::-;29686:74;;29769:93;29858:3;29769:93;:::i;:::-;29887:2;29882:3;29878:12;29871:19;;29530:366;;;:::o;29902:419::-;30068:4;30106:2;30095:9;30091:18;30083:26;;30155:9;30149:4;30145:20;30141:1;30130:9;30126:17;30119:47;30183:131;30309:4;30183:131;:::i;:::-;30175:139;;29902:419;;;:::o;30327:147::-;30428:11;30465:3;30450:18;;30327:147;;;;:::o;30480:114::-;;:::o;30600:398::-;30759:3;30780:83;30861:1;30856:3;30780:83;:::i;:::-;30773:90;;30872:93;30961:3;30872:93;:::i;:::-;30990:1;30985:3;30981:11;30974:18;;30600:398;;;:::o;31004:379::-;31188:3;31210:147;31353:3;31210:147;:::i;:::-;31203:154;;31374:3;31367:10;;31004:379;;;:::o;31389:167::-;31529:19;31525:1;31517:6;31513:14;31506:43;31389:167;:::o;31562:366::-;31704:3;31725:67;31789:2;31784:3;31725:67;:::i;:::-;31718:74;;31801:93;31890:3;31801:93;:::i;:::-;31919:2;31914:3;31910:12;31903:19;;31562:366;;;:::o;31934:419::-;32100:4;32138:2;32127:9;32123:18;32115:26;;32187:9;32181:4;32177:20;32173:1;32162:9;32158:17;32151:47;32215:131;32341:4;32215:131;:::i;:::-;32207:139;;31934:419;;;:::o;32359:143::-;32416:5;32447:6;32441:13;32432:22;;32463:33;32490:5;32463:33;:::i;:::-;32359:143;;;;:::o;32508:351::-;32578:6;32627:2;32615:9;32606:7;32602:23;32598:32;32595:119;;;32633:79;;:::i;:::-;32595:119;32753:1;32778:64;32834:7;32825:6;32814:9;32810:22;32778:64;:::i;:::-;32768:74;;32724:128;32508:351;;;;:::o;32865:137::-;32919:5;32950:6;32944:13;32935:22;;32966:30;32990:5;32966:30;:::i;:::-;32865:137;;;;:::o;33008:345::-;33075:6;33124:2;33112:9;33103:7;33099:23;33095:32;33092:119;;;33130:79;;:::i;:::-;33092:119;33250:1;33275:61;33328:7;33319:6;33308:9;33304:22;33275:61;:::i;:::-;33265:71;;33221:125;33008:345;;;;:::o;33359:141::-;33408:4;33431:3;33423:11;;33454:3;33451:1;33444:14;33488:4;33485:1;33475:18;33467:26;;33359:141;;;:::o;33506:93::-;33543:6;33590:2;33585;33578:5;33574:14;33570:23;33560:33;;33506:93;;;:::o;33605:107::-;33649:8;33699:5;33693:4;33689:16;33668:37;;33605:107;;;;:::o;33718:393::-;33787:6;33837:1;33825:10;33821:18;33860:97;33890:66;33879:9;33860:97;:::i;:::-;33978:39;34008:8;33997:9;33978:39;:::i;:::-;33966:51;;34050:4;34046:9;34039:5;34035:21;34026:30;;34099:4;34089:8;34085:19;34078:5;34075:30;34065:40;;33794:317;;33718:393;;;;;:::o;34117:60::-;34145:3;34166:5;34159:12;;34117:60;;;:::o;34183:142::-;34233:9;34266:53;34284:34;34293:24;34311:5;34293:24;:::i;:::-;34284:34;:::i;:::-;34266:53;:::i;:::-;34253:66;;34183:142;;;:::o;34331:75::-;34374:3;34395:5;34388:12;;34331:75;;;:::o;34412:269::-;34522:39;34553:7;34522:39;:::i;:::-;34583:91;34632:41;34656:16;34632:41;:::i;:::-;34624:6;34617:4;34611:11;34583:91;:::i;:::-;34577:4;34570:105;34488:193;34412:269;;;:::o;34687:73::-;34732:3;34687:73;:::o;34766:189::-;34843:32;;:::i;:::-;34884:65;34942:6;34934;34928:4;34884:65;:::i;:::-;34819:136;34766:189;;:::o;34961:186::-;35021:120;35038:3;35031:5;35028:14;35021:120;;;35092:39;35129:1;35122:5;35092:39;:::i;:::-;35065:1;35058:5;35054:13;35045:22;;35021:120;;;34961:186;;:::o;35153:543::-;35254:2;35249:3;35246:11;35243:446;;;35288:38;35320:5;35288:38;:::i;:::-;35372:29;35390:10;35372:29;:::i;:::-;35362:8;35358:44;35555:2;35543:10;35540:18;35537:49;;;35576:8;35561:23;;35537:49;35599:80;35655:22;35673:3;35655:22;:::i;:::-;35645:8;35641:37;35628:11;35599:80;:::i;:::-;35258:431;;35243:446;35153:543;;;:::o;35702:117::-;35756:8;35806:5;35800:4;35796:16;35775:37;;35702:117;;;;:::o;35825:169::-;35869:6;35902:51;35950:1;35946:6;35938:5;35935:1;35931:13;35902:51;:::i;:::-;35898:56;35983:4;35977;35973:15;35963:25;;35876:118;35825:169;;;;:::o;35999:295::-;36075:4;36221:29;36246:3;36240:4;36221:29;:::i;:::-;36213:37;;36283:3;36280:1;36276:11;36270:4;36267:21;36259:29;;35999:295;;;;:::o;36299:1395::-;36416:37;36449:3;36416:37;:::i;:::-;36518:18;36510:6;36507:30;36504:56;;;36540:18;;:::i;:::-;36504:56;36584:38;36616:4;36610:11;36584:38;:::i;:::-;36669:67;36729:6;36721;36715:4;36669:67;:::i;:::-;36763:1;36787:4;36774:17;;36819:2;36811:6;36808:14;36836:1;36831:618;;;;37493:1;37510:6;37507:77;;;37559:9;37554:3;37550:19;37544:26;37535:35;;37507:77;37610:67;37670:6;37663:5;37610:67;:::i;:::-;37604:4;37597:81;37466:222;36801:887;;36831:618;36883:4;36879:9;36871:6;36867:22;36917:37;36949:4;36917:37;:::i;:::-;36976:1;36990:208;37004:7;37001:1;36998:14;36990:208;;;37083:9;37078:3;37074:19;37068:26;37060:6;37053:42;37134:1;37126:6;37122:14;37112:24;;37181:2;37170:9;37166:18;37153:31;;37027:4;37024:1;37020:12;37015:17;;36990:208;;;37226:6;37217:7;37214:19;37211:179;;;37284:9;37279:3;37275:19;37269:26;37327:48;37369:4;37361:6;37357:17;37346:9;37327:48;:::i;:::-;37319:6;37312:64;37234:156;37211:179;37436:1;37432;37424:6;37420:14;37416:22;37410:4;37403:36;36838:611;;;36801:887;;36391:1303;;;36299:1395;;:::o;37700:167::-;37840:19;37836:1;37828:6;37824:14;37817:43;37700:167;:::o;37873:366::-;38015:3;38036:67;38100:2;38095:3;38036:67;:::i;:::-;38029:74;;38112:93;38201:3;38112:93;:::i;:::-;38230:2;38225:3;38221:12;38214:19;;37873:366;;;:::o;38245:419::-;38411:4;38449:2;38438:9;38434:18;38426:26;;38498:9;38492:4;38488:20;38484:1;38473:9;38469:17;38462:47;38526:131;38652:4;38526:131;:::i;:::-;38518:139;;38245:419;;;:::o;38670:148::-;38772:11;38809:3;38794:18;;38670:148;;;;:::o;38848:874::-;38951:3;38988:5;38982:12;39017:36;39043:9;39017:36;:::i;:::-;39069:89;39151:6;39146:3;39069:89;:::i;:::-;39062:96;;39189:1;39178:9;39174:17;39205:1;39200:166;;;;39380:1;39375:341;;;;39167:549;;39200:166;39284:4;39280:9;39269;39265:25;39260:3;39253:38;39346:6;39339:14;39332:22;39324:6;39320:35;39315:3;39311:45;39304:52;;39200:166;;39375:341;39442:38;39474:5;39442:38;:::i;:::-;39502:1;39516:154;39530:6;39527:1;39524:13;39516:154;;;39604:7;39598:14;39594:1;39589:3;39585:11;39578:35;39654:1;39645:7;39641:15;39630:26;;39552:4;39549:1;39545:12;39540:17;;39516:154;;;39699:6;39694:3;39690:16;39683:23;;39382:334;;39167:549;;38955:767;;38848:874;;;;:::o;39728:390::-;39834:3;39862:39;39895:5;39862:39;:::i;:::-;39917:89;39999:6;39994:3;39917:89;:::i;:::-;39910:96;;40015:65;40073:6;40068:3;40061:4;40054:5;40050:16;40015:65;:::i;:::-;40105:6;40100:3;40096:16;40089:23;;39838:280;39728:390;;;;:::o;40124:155::-;40264:7;40260:1;40252:6;40248:14;40241:31;40124:155;:::o;40285:400::-;40445:3;40466:84;40548:1;40543:3;40466:84;:::i;:::-;40459:91;;40559:93;40648:3;40559:93;:::i;:::-;40677:1;40672:3;40668:11;40661:18;;40285:400;;;:::o;40691:695::-;40969:3;40991:92;41079:3;41070:6;40991:92;:::i;:::-;40984:99;;41100:95;41191:3;41182:6;41100:95;:::i;:::-;41093:102;;41212:148;41356:3;41212:148;:::i;:::-;41205:155;;41377:3;41370:10;;40691:695;;;;;:::o;41392:170::-;41532:22;41528:1;41520:6;41516:14;41509:46;41392:170;:::o;41568:366::-;41710:3;41731:67;41795:2;41790:3;41731:67;:::i;:::-;41724:74;;41807:93;41896:3;41807:93;:::i;:::-;41925:2;41920:3;41916:12;41909:19;;41568:366;;;:::o;41940:419::-;42106:4;42144:2;42133:9;42129:18;42121:26;;42193:9;42187:4;42183:20;42179:1;42168:9;42164:17;42157:47;42221:131;42347:4;42221:131;:::i;:::-;42213:139;;41940:419;;;:::o;42365:225::-;42505:34;42501:1;42493:6;42489:14;42482:58;42574:8;42569:2;42561:6;42557:15;42550:33;42365:225;:::o;42596:366::-;42738:3;42759:67;42823:2;42818:3;42759:67;:::i;:::-;42752:74;;42835:93;42924:3;42835:93;:::i;:::-;42953:2;42948:3;42944:12;42937:19;;42596:366;;;:::o;42968:419::-;43134:4;43172:2;43161:9;43157:18;43149:26;;43221:9;43215:4;43211:20;43207:1;43196:9;43192:17;43185:47;43249:131;43375:4;43249:131;:::i;:::-;43241:139;;42968:419;;;:::o;43393:182::-;43533:34;43529:1;43521:6;43517:14;43510:58;43393:182;:::o;43581:366::-;43723:3;43744:67;43808:2;43803:3;43744:67;:::i;:::-;43737:74;;43820:93;43909:3;43820:93;:::i;:::-;43938:2;43933:3;43929:12;43922:19;;43581:366;;;:::o;43953:419::-;44119:4;44157:2;44146:9;44142:18;44134:26;;44206:9;44200:4;44196:20;44192:1;44181:9;44177:17;44170:47;44234:131;44360:4;44234:131;:::i;:::-;44226:139;;43953:419;;;:::o;44378:98::-;44429:6;44463:5;44457:12;44447:22;;44378:98;;;:::o;44482:168::-;44565:11;44599:6;44594:3;44587:19;44639:4;44634:3;44630:14;44615:29;;44482:168;;;;:::o;44656:373::-;44742:3;44770:38;44802:5;44770:38;:::i;:::-;44824:70;44887:6;44882:3;44824:70;:::i;:::-;44817:77;;44903:65;44961:6;44956:3;44949:4;44942:5;44938:16;44903:65;:::i;:::-;44993:29;45015:6;44993:29;:::i;:::-;44988:3;44984:39;44977:46;;44746:283;44656:373;;;;:::o;45035:640::-;45230:4;45268:3;45257:9;45253:19;45245:27;;45282:71;45350:1;45339:9;45335:17;45326:6;45282:71;:::i;:::-;45363:72;45431:2;45420:9;45416:18;45407:6;45363:72;:::i;:::-;45445;45513:2;45502:9;45498:18;45489:6;45445:72;:::i;:::-;45564:9;45558:4;45554:20;45549:2;45538:9;45534:18;45527:48;45592:76;45663:4;45654:6;45592:76;:::i;:::-;45584:84;;45035:640;;;;;;;:::o;45681:141::-;45737:5;45768:6;45762:13;45753:22;;45784:32;45810:5;45784:32;:::i;:::-;45681:141;;;;:::o;45828:349::-;45897:6;45946:2;45934:9;45925:7;45921:23;45917:32;45914:119;;;45952:79;;:::i;:::-;45914:119;46072:1;46097:63;46152:7;46143:6;46132:9;46128:22;46097:63;:::i;:::-;46087:73;;46043:127;45828:349;;;;:::o;46183:233::-;46222:3;46245:24;46263:5;46245:24;:::i;:::-;46236:33;;46291:66;46284:5;46281:77;46278:103;;46361:18;;:::i;:::-;46278:103;46408:1;46401:5;46397:13;46390:20;;46183:233;;;:::o;46422:194::-;46462:4;46482:20;46500:1;46482:20;:::i;:::-;46477:25;;46516:20;46534:1;46516:20;:::i;:::-;46511:25;;46560:1;46557;46553:9;46545:17;;46584:1;46578:4;46575:11;46572:37;;;46589:18;;:::i;:::-;46572:37;46422:194;;;;:::o;46622:176::-;46654:1;46671:20;46689:1;46671:20;:::i;:::-;46666:25;;46705:20;46723:1;46705:20;:::i;:::-;46700:25;;46744:1;46734:35;;46749:18;;:::i;:::-;46734:35;46790:1;46787;46783:9;46778:14;;46622:176;;;;:::o;46804:180::-;46852:77;46849:1;46842:88;46949:4;46946:1;46939:15;46973:4;46970:1;46963:15
Swarm Source
ipfs://ec247605965f6ff315054f7f97eb05f106c8a346898dc779d55736ee156a5c39
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.