ERC-721
NFT
Overview
Max Total Supply
1,000 MCOL
Holders
183
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 MCOLLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
MiladyColombia
Compiler Version
v0.8.9+commit.e5eed63a
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-10-03 */ // SPDX-License-Identifier: MIT // File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.4.0/contracts/utils/Strings.sol // OpenZeppelin Contracts v4.4.0 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.4.0/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.0 (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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.4.0/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts v4.4.0 (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.4.0/contracts/security/ReentrancyGuard.sol // OpenZeppelin Contracts v4.4.0 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.4.0/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.0 (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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.4.0/contracts/access/Ownable.sol // OpenZeppelin Contracts v4.4.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 Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: https://github.com/chiru-labs/ERC721A/blob/main/contracts/IERC721A.sol // ERC721A Contracts v4.2.3 // 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(); /** * 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 payable; /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external payable; /** * @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 payable; /** * @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 payable; /** * @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: https://github.com/chiru-labs/ERC721A/blob/main/contracts/ERC721A.sol // ERC721A Contracts v4.2.3 // 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 { // Bypass for a `--via-ir` bug (https://github.com/chiru-labs/ERC721A/pull/364). 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 payable 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 { _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 payable 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 payable 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 payable 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`. ) // The `iszero(eq(,))` check ensures that large values of `quantity` // that overflows uint256 will make the loop run out of gas. // The compiler will optimize the `iszero` away for performance. 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 0xa0 bytes to keep the free memory pointer 32-byte word aligned. // We will need 1 word for the trailing zeros padding, 1 word for the length, // and 3 words for a maximum of 78 digits. Total: 5 * 0x20 = 0xa0. let m := add(mload(0x40), 0xa0) // Update the free memory pointer to allocate. mstore(0x40, m) // Assign the `str` to the end. str := sub(m, 0x20) // Zeroize the slot after the string. mstore(str, 0) // 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: https://github.com/chiru-labs/ERC721A/blob/main/contracts/extensions/IERC721AQueryable.sol // ERC721A Contracts v4.2.3 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of ERC721AQueryable. */ interface IERC721AQueryable is IERC721A { /** * Invalid query range (`start` >= `stop`). */ error InvalidQueryRange(); /** * @dev Returns the `TokenOwnership` struct at `tokenId` without reverting. * * If the `tokenId` is out of bounds: * * - `addr = address(0)` * - `startTimestamp = 0` * - `burned = false` * - `extraData = 0` * * If the `tokenId` is burned: * * - `addr = <Address of owner before token was burned>` * - `startTimestamp = <Timestamp when token was burned>` * - `burned = true` * - `extraData = <Extra data when token was burned>` * * Otherwise: * * - `addr = <Address of owner>` * - `startTimestamp = <Timestamp of start of ownership>` * - `burned = false` * - `extraData = <Extra data at start of ownership>` */ function explicitOwnershipOf(uint256 tokenId) external view returns (TokenOwnership memory); /** * @dev Returns an array of `TokenOwnership` structs at `tokenIds` in order. * See {ERC721AQueryable-explicitOwnershipOf} */ function explicitOwnershipsOf(uint256[] memory tokenIds) external view returns (TokenOwnership[] memory); /** * @dev Returns an array of token IDs owned by `owner`, * in the range [`start`, `stop`) * (i.e. `start <= tokenId < stop`). * * This function allows for tokens to be queried if the collection * grows too big for a single call of {ERC721AQueryable-tokensOfOwner}. * * Requirements: * * - `start < stop` */ function tokensOfOwnerIn( address owner, uint256 start, uint256 stop ) external view returns (uint256[] memory); /** * @dev Returns an array of token IDs owned by `owner`. * * This function scans the ownership mapping and is O(`totalSupply`) in complexity. * It is meant to be called off-chain. * * See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into * multiple smaller scans if the collection is large enough to cause * an out-of-gas error (10K collections should be fine). */ function tokensOfOwner(address owner) external view returns (uint256[] memory); } // File: https://github.com/chiru-labs/ERC721A/blob/main/contracts/extensions/ERC721AQueryable.sol // ERC721A Contracts v4.2.3 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @title ERC721AQueryable. * * @dev ERC721A subclass with convenience query functions. */ abstract contract ERC721AQueryable is ERC721A, IERC721AQueryable { /** * @dev Returns the `TokenOwnership` struct at `tokenId` without reverting. * * If the `tokenId` is out of bounds: * * - `addr = address(0)` * - `startTimestamp = 0` * - `burned = false` * - `extraData = 0` * * If the `tokenId` is burned: * * - `addr = <Address of owner before token was burned>` * - `startTimestamp = <Timestamp when token was burned>` * - `burned = true` * - `extraData = <Extra data when token was burned>` * * Otherwise: * * - `addr = <Address of owner>` * - `startTimestamp = <Timestamp of start of ownership>` * - `burned = false` * - `extraData = <Extra data at start of ownership>` */ function explicitOwnershipOf(uint256 tokenId) public view virtual override returns (TokenOwnership memory) { TokenOwnership memory ownership; if (tokenId < _startTokenId() || tokenId >= _nextTokenId()) { return ownership; } ownership = _ownershipAt(tokenId); if (ownership.burned) { return ownership; } return _ownershipOf(tokenId); } /** * @dev Returns an array of `TokenOwnership` structs at `tokenIds` in order. * See {ERC721AQueryable-explicitOwnershipOf} */ function explicitOwnershipsOf(uint256[] calldata tokenIds) external view virtual override returns (TokenOwnership[] memory) { unchecked { uint256 tokenIdsLength = tokenIds.length; TokenOwnership[] memory ownerships = new TokenOwnership[](tokenIdsLength); for (uint256 i; i != tokenIdsLength; ++i) { ownerships[i] = explicitOwnershipOf(tokenIds[i]); } return ownerships; } } /** * @dev Returns an array of token IDs owned by `owner`, * in the range [`start`, `stop`) * (i.e. `start <= tokenId < stop`). * * This function allows for tokens to be queried if the collection * grows too big for a single call of {ERC721AQueryable-tokensOfOwner}. * * Requirements: * * - `start < stop` */ function tokensOfOwnerIn( address owner, uint256 start, uint256 stop ) external view virtual override returns (uint256[] memory) { unchecked { if (start >= stop) revert InvalidQueryRange(); uint256 tokenIdsIdx; uint256 stopLimit = _nextTokenId(); // Set `start = max(start, _startTokenId())`. if (start < _startTokenId()) { start = _startTokenId(); } // Set `stop = min(stop, stopLimit)`. if (stop > stopLimit) { stop = stopLimit; } uint256 tokenIdsMaxLength = balanceOf(owner); // Set `tokenIdsMaxLength = min(balanceOf(owner), stop - start)`, // to cater for cases where `balanceOf(owner)` is too big. if (start < stop) { uint256 rangeLength = stop - start; if (rangeLength < tokenIdsMaxLength) { tokenIdsMaxLength = rangeLength; } } else { tokenIdsMaxLength = 0; } uint256[] memory tokenIds = new uint256[](tokenIdsMaxLength); if (tokenIdsMaxLength == 0) { return tokenIds; } // We need to call `explicitOwnershipOf(start)`, // because the slot at `start` may not be initialized. TokenOwnership memory ownership = explicitOwnershipOf(start); address currOwnershipAddr; // If the starting slot exists (i.e. not burned), initialize `currOwnershipAddr`. // `ownership.address` will not be zero, as `start` is clamped to the valid token ID range. if (!ownership.burned) { currOwnershipAddr = ownership.addr; } for (uint256 i = start; i != stop && tokenIdsIdx != tokenIdsMaxLength; ++i) { ownership = _ownershipAt(i); if (ownership.burned) { continue; } if (ownership.addr != address(0)) { currOwnershipAddr = ownership.addr; } if (currOwnershipAddr == owner) { tokenIds[tokenIdsIdx++] = i; } } // Downsize the array to fit. assembly { mstore(tokenIds, tokenIdsIdx) } return tokenIds; } } /** * @dev Returns an array of token IDs owned by `owner`. * * This function scans the ownership mapping and is O(`totalSupply`) in complexity. * It is meant to be called off-chain. * * See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into * multiple smaller scans if the collection is large enough to cause * an out-of-gas error (10K collections should be fine). */ function tokensOfOwner(address owner) external view virtual override returns (uint256[] memory) { unchecked { uint256 tokenIdsIdx; address currOwnershipAddr; uint256 tokenIdsLength = balanceOf(owner); uint256[] memory tokenIds = new uint256[](tokenIdsLength); TokenOwnership memory ownership; for (uint256 i = _startTokenId(); tokenIdsIdx != tokenIdsLength; ++i) { ownership = _ownershipAt(i); if (ownership.burned) { continue; } if (ownership.addr != address(0)) { currOwnershipAddr = ownership.addr; } if (currOwnershipAddr == owner) { tokenIds[tokenIdsIdx++] = i; } } return tokenIds; } } } // File: contracts/miladyColombia.sol pragma solidity >=0.8.9 <0.9.0; contract MiladyColombia is ERC721AQueryable, Ownable, ReentrancyGuard { using Strings for uint256; string public uriPrefix = "ipfs://bafybeiepziae5jpf24ivogvkf6blrwwyxmsq5kdfcmgslvhh6jmrd2m4ee/"; string public uriSuffix = ".json"; uint256 public miladyPrice; uint256 public publicPrice; uint256 public maxSupply; bool public paused = true; bool public whitelistMintEnabled = false; address constant BORED_MILADY = 0xafe12842e3703a3cC3A71d9463389b1bF2c5BC1C; address constant MILADY_RAVE = 0x880a965fAe95f72fe3a3C8e87ED2c9478C8e0a29; address constant MILADY_MAKER = 0x5Af0D9827E0c53E4799BB226655A1de152A425a5; address constant PIXELADY_MAKER = 0x8Fc0D90f2C45a5e7f94904075c952e0943CFCCfd; address constant REDACTED_REMILIO = 0x8Fc0D90f2C45a5e7f94904075c952e0943CFCCfd; constructor( string memory _tokenName, string memory _tokenSymbol, uint256 _publicPrice, uint256 _miladyPrice, uint256 _maxSupply ) ERC721A(_tokenName, _tokenSymbol) { setPublicPrice(_publicPrice); setMiladyPrice(_miladyPrice); maxSupply = _maxSupply; } modifier mintCompliance(uint256 _mintAmount) { require(_mintAmount > 0, 'Invalid mint amount!'); require(totalSupply() + _mintAmount <= maxSupply, 'Max supply exceeded!'); _; } modifier mintPriceCompliance(uint256 _mintAmount) { require(msg.value >= publicPrice * _mintAmount, 'Insufficient funds!'); _; } modifier hasBluechip(address account){ require( IERC721(BORED_MILADY).balanceOf(account) > 0 || IERC721(MILADY_RAVE).balanceOf(account) > 0 || IERC721(MILADY_MAKER).balanceOf(account) > 0 || IERC721(PIXELADY_MAKER).balanceOf(account) > 0 || IERC721(REDACTED_REMILIO).balanceOf(account) > 0, "You dont any Milady's!"); _; } function mintAsHolder(uint256 _mintAmount) public payable mintCompliance(_mintAmount) hasBluechip(msg.sender) { require(whitelistMintEnabled, 'The whitelist sale is not enabled!'); require(msg.value >= miladyPrice * _mintAmount, 'Insufficient funds!'); _safeMint(_msgSender(), _mintAmount); } function mint(uint256 _mintAmount) public payable mintCompliance(_mintAmount) mintPriceCompliance(_mintAmount) { require(!paused, 'The contract is paused!'); _safeMint(_msgSender(), _mintAmount); } function mintForAddress(uint256 _mintAmount, address _receiver) public mintCompliance(_mintAmount) onlyOwner { _safeMint(_receiver, _mintAmount); } function _startTokenId() internal view virtual override returns (uint256) { return 1; } function tokenURI(uint256 _tokenId) public view virtual override returns (string memory) { require(_exists(_tokenId), 'ERC721Metadata: URI query for nonexistent token'); string memory currentBaseURI = _baseURI(); return bytes(currentBaseURI).length > 0 ? string(abi.encodePacked(currentBaseURI, _tokenId.toString(), uriSuffix)) : ''; } function setPublicPrice(uint256 _publicPrice) public onlyOwner { publicPrice = _publicPrice; } function setMiladyPrice(uint256 _miladyPrice) public onlyOwner { miladyPrice = _miladyPrice; } function setUriPrefix(string memory _uriPrefix) public onlyOwner { uriPrefix = _uriPrefix; } function setUriSuffix(string memory _uriSuffix) public onlyOwner { uriSuffix = _uriSuffix; } function setPaused(bool _state) public onlyOwner { paused = _state; } function setWhitelistMintEnabled(bool _state) public onlyOwner { whitelistMintEnabled = _state; } function getIsMiladyHolder(address _account) public view returns (bool) { if ( IERC721(BORED_MILADY).balanceOf(_account) > 0 || IERC721(MILADY_RAVE).balanceOf(_account) > 0 || IERC721(MILADY_MAKER).balanceOf(_account) > 0 || IERC721(PIXELADY_MAKER).balanceOf(_account) > 0 || IERC721(REDACTED_REMILIO).balanceOf(_account) > 0 ) { return true; } else { return false; } } function withdraw() public onlyOwner nonReentrant { (bool os, ) = payable(owner()).call{value: address(this).balance}(''); require(os); } function _baseURI() internal view virtual override returns (string memory) { return uriPrefix; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"_tokenName","type":"string"},{"internalType":"string","name":"_tokenSymbol","type":"string"},{"internalType":"uint256","name":"_publicPrice","type":"uint256"},{"internalType":"uint256","name":"_miladyPrice","type":"uint256"},{"internalType":"uint256","name":"_maxSupply","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"InvalidQueryRange","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":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","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":"explicitOwnershipOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"},{"internalType":"uint24","name":"extraData","type":"uint24"}],"internalType":"struct IERC721A.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"explicitOwnershipsOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"},{"internalType":"uint24","name":"extraData","type":"uint24"}],"internalType":"struct IERC721A.TokenOwnership[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"getIsMiladyHolder","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":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"miladyPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mintAsHolder","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"mintForAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","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":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_miladyPrice","type":"uint256"}],"name":"setMiladyPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_publicPrice","type":"uint256"}],"name":"setPublicPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriPrefix","type":"string"}],"name":"setUriPrefix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriSuffix","type":"string"}],"name":"setUriSuffix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setWhitelistMintEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"stop","type":"uint256"}],"name":"tokensOfOwnerIn","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uriPrefix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uriSuffix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistMintEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6080604052604051806080016040528060438152602001620051aa60439139600a908051906020019062000035929190620003c8565b506040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600b908051906020019062000083929190620003c8565b506001600f60006101000a81548160ff0219169083151502179055506000600f60016101000a81548160ff021916908315150217905550348015620000c757600080fd5b50604051620051ed380380620051ed8339818101604052810190620000ed919062000650565b8484816002908051906020019062000107929190620003c8565b50806003908051906020019062000120929190620003c8565b50620001316200019560201b60201c565b6000819055505050620001596200014d6200019e60201b60201c565b620001a660201b60201c565b600160098190555062000172836200026c60201b60201c565b62000183826200030560201b60201c565b80600e819055505050505050620007fe565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6200027c6200019e60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620002a26200039e60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620002fb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002f29062000777565b60405180910390fd5b80600d8190555050565b620003156200019e60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff166200033b6200039e60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000394576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200038b9062000777565b60405180910390fd5b80600c8190555050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b828054620003d690620007c8565b90600052602060002090601f016020900481019282620003fa576000855562000446565b82601f106200041557805160ff191683800117855562000446565b8280016001018555821562000446579182015b828111156200044557825182559160200191906001019062000428565b5b50905062000455919062000459565b5090565b5b80821115620004745760008160009055506001016200045a565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620004e18262000496565b810181811067ffffffffffffffff82111715620005035762000502620004a7565b5b80604052505050565b60006200051862000478565b9050620005268282620004d6565b919050565b600067ffffffffffffffff821115620005495762000548620004a7565b5b620005548262000496565b9050602081019050919050565b60005b838110156200058157808201518184015260208101905062000564565b8381111562000591576000848401525b50505050565b6000620005ae620005a8846200052b565b6200050c565b905082815260208101848484011115620005cd57620005cc62000491565b5b620005da84828562000561565b509392505050565b600082601f830112620005fa57620005f96200048c565b5b81516200060c84826020860162000597565b91505092915050565b6000819050919050565b6200062a8162000615565b81146200063657600080fd5b50565b6000815190506200064a816200061f565b92915050565b600080600080600060a086880312156200066f576200066e62000482565b5b600086015167ffffffffffffffff81111562000690576200068f62000487565b5b6200069e88828901620005e2565b955050602086015167ffffffffffffffff811115620006c257620006c162000487565b5b620006d088828901620005e2565b9450506040620006e38882890162000639565b9350506060620006f68882890162000639565b9250506080620007098882890162000639565b9150509295509295909350565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006200075f60208362000716565b91506200076c8262000727565b602082019050919050565b60006020820190508181036000830152620007928162000750565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620007e157607f821691505b60208210811415620007f857620007f762000799565b5b50919050565b61499c806200080e6000396000f3fe6080604052600436106102305760003560e01c80637cf8cf3f1161012e578063b767a098116100ab578063c87b56dd1161006f578063c87b56dd146107fd578063d5abeb011461083a578063e985e9c514610865578063efbd73f4146108a2578063f2fde38b146108cb57610230565b8063b767a09814610729578063b88d4fde14610752578063c23dc68f1461076e578063c2d52560146107ab578063c6275255146107d457610230565b806395d89b41116100f257806395d89b411461065157806399a2557a1461067c578063a0712d68146106b9578063a22cb465146106d5578063a945bf80146106fe57610230565b80637cf8cf3f146105795780637ec4a659146105a45780638462151c146105cd5780638da5cb5b1461060a5780638e1568ee1461063557610230565b80633ccfd60b116101bc57806362b99ad41161018057806362b99ad4146104925780636352211e146104bd5780636caede3d146104fa57806370a0823114610525578063715018a61461056257610230565b80633ccfd60b146103cc57806342842e0e146103e35780635503a0e8146103ff5780635bbb21771461042a5780635c975abb1461046757610230565b80630d978785116102035780630d978785146102f657806316ba10e01461033357806316c38b3c1461035c57806318160ddd1461038557806323b872dd146103b057610230565b806301ffc9a71461023557806306fdde0314610272578063081812fc1461029d578063095ea7b3146102da575b600080fd5b34801561024157600080fd5b5061025c60048036038101906102579190613550565b6108f4565b6040516102699190613598565b60405180910390f35b34801561027e57600080fd5b50610287610986565b604051610294919061364c565b60405180910390f35b3480156102a957600080fd5b506102c460048036038101906102bf91906136a4565b610a18565b6040516102d19190613712565b60405180910390f35b6102f460048036038101906102ef9190613759565b610a97565b005b34801561030257600080fd5b5061031d60048036038101906103189190613799565b610bdb565b60405161032a9190613598565b60405180910390f35b34801561033f57600080fd5b5061035a600480360381019061035591906138fb565b610f30565b005b34801561036857600080fd5b50610383600480360381019061037e9190613970565b610fc6565b005b34801561039157600080fd5b5061039a61105f565b6040516103a791906139ac565b60405180910390f35b6103ca60048036038101906103c591906139c7565b611076565b005b3480156103d857600080fd5b506103e161139b565b005b6103fd60048036038101906103f891906139c7565b6114ed565b005b34801561040b57600080fd5b5061041461150d565b604051610421919061364c565b60405180910390f35b34801561043657600080fd5b50610451600480360381019061044c9190613a7a565b61159b565b60405161045e9190613c2a565b60405180910390f35b34801561047357600080fd5b5061047c61165e565b6040516104899190613598565b60405180910390f35b34801561049e57600080fd5b506104a7611671565b6040516104b4919061364c565b60405180910390f35b3480156104c957600080fd5b506104e460048036038101906104df91906136a4565b6116ff565b6040516104f19190613712565b60405180910390f35b34801561050657600080fd5b5061050f611711565b60405161051c9190613598565b60405180910390f35b34801561053157600080fd5b5061054c60048036038101906105479190613799565b611724565b60405161055991906139ac565b60405180910390f35b34801561056e57600080fd5b506105776117dd565b005b34801561058557600080fd5b5061058e611865565b60405161059b91906139ac565b60405180910390f35b3480156105b057600080fd5b506105cb60048036038101906105c691906138fb565b61186b565b005b3480156105d957600080fd5b506105f460048036038101906105ef9190613799565b611901565b6040516106019190613d0a565b60405180910390f35b34801561061657600080fd5b5061061f611a4b565b60405161062c9190613712565b60405180910390f35b61064f600480360381019061064a91906136a4565b611a75565b005b34801561065d57600080fd5b50610666611f41565b604051610673919061364c565b60405180910390f35b34801561068857600080fd5b506106a3600480360381019061069e9190613d2c565b611fd3565b6040516106b09190613d0a565b60405180910390f35b6106d360048036038101906106ce91906136a4565b6121e7565b005b3480156106e157600080fd5b506106fc60048036038101906106f79190613d7f565b612339565b005b34801561070a57600080fd5b50610713612444565b60405161072091906139ac565b60405180910390f35b34801561073557600080fd5b50610750600480360381019061074b9190613970565b61244a565b005b61076c60048036038101906107679190613e60565b6124e3565b005b34801561077a57600080fd5b50610795600480360381019061079091906136a4565b612556565b6040516107a29190613f38565b60405180910390f35b3480156107b757600080fd5b506107d260048036038101906107cd91906136a4565b6125c0565b005b3480156107e057600080fd5b506107fb60048036038101906107f691906136a4565b612646565b005b34801561080957600080fd5b50610824600480360381019061081f91906136a4565b6126cc565b604051610831919061364c565b60405180910390f35b34801561084657600080fd5b5061084f612776565b60405161085c91906139ac565b60405180910390f35b34801561087157600080fd5b5061088c60048036038101906108879190613f53565b61277c565b6040516108999190613598565b60405180910390f35b3480156108ae57600080fd5b506108c960048036038101906108c49190613f93565b612810565b005b3480156108d757600080fd5b506108f260048036038101906108ed9190613799565b612936565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061094f57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061097f5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60606002805461099590614002565b80601f01602080910402602001604051908101604052809291908181526020018280546109c190614002565b8015610a0e5780601f106109e357610100808354040283529160200191610a0e565b820191906000526020600020905b8154815290600101906020018083116109f157829003601f168201915b5050505050905090565b6000610a2382612a2e565b610a59576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610aa2826116ff565b90508073ffffffffffffffffffffffffffffffffffffffff16610ac3612a8d565b73ffffffffffffffffffffffffffffffffffffffff1614610b2657610aef81610aea612a8d565b61277c565b610b25576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60008073afe12842e3703a3cc3a71d9463389b1bf2c5bc1c73ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b8152600401610c2b9190613712565b60206040518083038186803b158015610c4357600080fd5b505afa158015610c57573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c7b9190614049565b1180610d235750600073880a965fae95f72fe3a3c8e87ed2c9478c8e0a2973ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b8152600401610cd19190613712565b60206040518083038186803b158015610ce957600080fd5b505afa158015610cfd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d219190614049565b115b80610dca57506000735af0d9827e0c53e4799bb226655a1de152a425a573ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b8152600401610d789190613712565b60206040518083038186803b158015610d9057600080fd5b505afa158015610da4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dc89190614049565b115b80610e7157506000738fc0d90f2c45a5e7f94904075c952e0943cfccfd73ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b8152600401610e1f9190613712565b60206040518083038186803b158015610e3757600080fd5b505afa158015610e4b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e6f9190614049565b115b80610f1857506000738fc0d90f2c45a5e7f94904075c952e0943cfccfd73ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b8152600401610ec69190613712565b60206040518083038186803b158015610ede57600080fd5b505afa158015610ef2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f169190614049565b115b15610f265760019050610f2b565b600090505b919050565b610f38612a95565b73ffffffffffffffffffffffffffffffffffffffff16610f56611a4b565b73ffffffffffffffffffffffffffffffffffffffff1614610fac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa3906140c2565b60405180910390fd5b80600b9080519060200190610fc29291906133f2565b5050565b610fce612a95565b73ffffffffffffffffffffffffffffffffffffffff16610fec611a4b565b73ffffffffffffffffffffffffffffffffffffffff1614611042576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611039906140c2565b60405180910390fd5b80600f60006101000a81548160ff02191690831515021790555050565b6000611069612a9d565b6001546000540303905090565b600061108182612aa6565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146110e8576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806110f484612b74565b9150915061110a8187611105612a8d565b612b9b565b6111565761111f8661111a612a8d565b61277c565b611155576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156111bd576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6111ca8686866001612bdf565b80156111d557600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055506112a38561127f888887612be5565b7c020000000000000000000000000000000000000000000000000000000017612c0d565b600460008681526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008416141561132b576000600185019050600060046000838152602001908152602001600020541415611329576000548114611328578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46113938686866001612c38565b505050505050565b6113a3612a95565b73ffffffffffffffffffffffffffffffffffffffff166113c1611a4b565b73ffffffffffffffffffffffffffffffffffffffff1614611417576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140e906140c2565b60405180910390fd5b6002600954141561145d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114549061412e565b60405180910390fd5b6002600981905550600061146f611a4b565b73ffffffffffffffffffffffffffffffffffffffff16476040516114929061417f565b60006040518083038185875af1925050503d80600081146114cf576040519150601f19603f3d011682016040523d82523d6000602084013e6114d4565b606091505b50509050806114e257600080fd5b506001600981905550565b611508838383604051806020016040528060008152506124e3565b505050565b600b805461151a90614002565b80601f016020809104026020016040519081016040528092919081815260200182805461154690614002565b80156115935780601f1061156857610100808354040283529160200191611593565b820191906000526020600020905b81548152906001019060200180831161157657829003601f168201915b505050505081565b6060600083839050905060008167ffffffffffffffff8111156115c1576115c06137d0565b5b6040519080825280602002602001820160405280156115fa57816020015b6115e7613478565b8152602001906001900390816115df5790505b50905060005b8281146116525761162986868381811061161d5761161c614194565b5b90506020020135612556565b82828151811061163c5761163b614194565b5b6020026020010181905250806001019050611600565b50809250505092915050565b600f60009054906101000a900460ff1681565b600a805461167e90614002565b80601f01602080910402602001604051908101604052809291908181526020018280546116aa90614002565b80156116f75780601f106116cc576101008083540402835291602001916116f7565b820191906000526020600020905b8154815290600101906020018083116116da57829003601f168201915b505050505081565b600061170a82612aa6565b9050919050565b600f60019054906101000a900460ff1681565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561178c576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6117e5612a95565b73ffffffffffffffffffffffffffffffffffffffff16611803611a4b565b73ffffffffffffffffffffffffffffffffffffffff1614611859576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611850906140c2565b60405180910390fd5b6118636000612c3e565b565b600c5481565b611873612a95565b73ffffffffffffffffffffffffffffffffffffffff16611891611a4b565b73ffffffffffffffffffffffffffffffffffffffff16146118e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118de906140c2565b60405180910390fd5b80600a90805190602001906118fd9291906133f2565b5050565b6060600080600061191185611724565b905060008167ffffffffffffffff81111561192f5761192e6137d0565b5b60405190808252806020026020018201604052801561195d5781602001602082028036833780820191505090505b509050611968613478565b6000611972612a9d565b90505b838614611a3d5761198581612d04565b915081604001511561199657611a32565b600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff16146119d657816000015194505b8773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415611a315780838780600101985081518110611a2457611a23614194565b5b6020026020010181815250505b5b806001019050611975565b508195505050505050919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b8060008111611ab9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ab09061420f565b60405180910390fd5b600e5481611ac561105f565b611acf919061425e565b1115611b10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0790614300565b60405180910390fd5b33600073afe12842e3703a3cc3a71d9463389b1bf2c5bc1c73ffffffffffffffffffffffffffffffffffffffff166370a08231836040518263ffffffff1660e01b8152600401611b609190613712565b60206040518083038186803b158015611b7857600080fd5b505afa158015611b8c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bb09190614049565b1180611c585750600073880a965fae95f72fe3a3c8e87ed2c9478c8e0a2973ffffffffffffffffffffffffffffffffffffffff166370a08231836040518263ffffffff1660e01b8152600401611c069190613712565b60206040518083038186803b158015611c1e57600080fd5b505afa158015611c32573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c569190614049565b115b80611cff57506000735af0d9827e0c53e4799bb226655a1de152a425a573ffffffffffffffffffffffffffffffffffffffff166370a08231836040518263ffffffff1660e01b8152600401611cad9190613712565b60206040518083038186803b158015611cc557600080fd5b505afa158015611cd9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cfd9190614049565b115b80611da657506000738fc0d90f2c45a5e7f94904075c952e0943cfccfd73ffffffffffffffffffffffffffffffffffffffff166370a08231836040518263ffffffff1660e01b8152600401611d549190613712565b60206040518083038186803b158015611d6c57600080fd5b505afa158015611d80573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611da49190614049565b115b80611e4d57506000738fc0d90f2c45a5e7f94904075c952e0943cfccfd73ffffffffffffffffffffffffffffffffffffffff166370a08231836040518263ffffffff1660e01b8152600401611dfb9190613712565b60206040518083038186803b158015611e1357600080fd5b505afa158015611e27573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e4b9190614049565b115b611e8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e839061436c565b60405180910390fd5b600f60019054906101000a900460ff16611edb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ed2906143fe565b60405180910390fd5b82600c54611ee9919061441e565b341015611f2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f22906144c4565b60405180910390fd5b611f3c611f36612a95565b84612d2f565b505050565b606060038054611f5090614002565b80601f0160208091040260200160405190810160405280929190818152602001828054611f7c90614002565b8015611fc95780601f10611f9e57610100808354040283529160200191611fc9565b820191906000526020600020905b815481529060010190602001808311611fac57829003601f168201915b5050505050905090565b606081831061200e576040517f32c1995a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080612019612d4d565b9050612023612a9d565b85101561203557612032612a9d565b94505b80841115612041578093505b600061204c87611724565b90508486101561206f576000868603905081811015612069578091505b50612074565b600090505b60008167ffffffffffffffff8111156120905761208f6137d0565b5b6040519080825280602002602001820160405280156120be5781602001602082028036833780820191505090505b50905060008214156120d657809450505050506121e0565b60006120e188612556565b9050600081604001516120f657816000015190505b60008990505b88811415801561210c5750848714155b156121d25761211a81612d04565b925082604001511561212b576121c7565b600073ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff161461216b57826000015191505b8a73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156121c657808488806001019950815181106121b9576121b8614194565b5b6020026020010181815250505b5b8060010190506120fc565b508583528296505050505050505b9392505050565b806000811161222b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122229061420f565b60405180910390fd5b600e548161223761105f565b612241919061425e565b1115612282576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161227990614300565b60405180910390fd5b8180600d54612291919061441e565b3410156122d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122ca906144c4565b60405180910390fd5b600f60009054906101000a900460ff1615612323576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161231a90614530565b60405180910390fd5b61233461232e612a95565b84612d2f565b505050565b8060076000612346612a8d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166123f3612a8d565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516124389190613598565b60405180910390a35050565b600d5481565b612452612a95565b73ffffffffffffffffffffffffffffffffffffffff16612470611a4b565b73ffffffffffffffffffffffffffffffffffffffff16146124c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124bd906140c2565b60405180910390fd5b80600f60016101000a81548160ff02191690831515021790555050565b6124ee848484611076565b60008373ffffffffffffffffffffffffffffffffffffffff163b146125505761251984848484612d56565b61254f576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b61255e613478565b612566613478565b61256e612a9d565b831080612582575061257e612d4d565b8310155b1561259057809150506125bb565b61259983612d04565b90508060400151156125ae57809150506125bb565b6125b783612eb6565b9150505b919050565b6125c8612a95565b73ffffffffffffffffffffffffffffffffffffffff166125e6611a4b565b73ffffffffffffffffffffffffffffffffffffffff161461263c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612633906140c2565b60405180910390fd5b80600c8190555050565b61264e612a95565b73ffffffffffffffffffffffffffffffffffffffff1661266c611a4b565b73ffffffffffffffffffffffffffffffffffffffff16146126c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126b9906140c2565b60405180910390fd5b80600d8190555050565b60606126d782612a2e565b612716576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161270d906145c2565b60405180910390fd5b6000612720612ed6565b90506000815111612740576040518060200160405280600081525061276e565b8061274a84612f68565b600b60405160200161275e939291906146b2565b6040516020818303038152906040525b915050919050565b600e5481565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b8160008111612854576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161284b9061420f565b60405180910390fd5b600e548161286061105f565b61286a919061425e565b11156128ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128a290614300565b60405180910390fd5b6128b3612a95565b73ffffffffffffffffffffffffffffffffffffffff166128d1611a4b565b73ffffffffffffffffffffffffffffffffffffffff1614612927576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161291e906140c2565b60405180910390fd5b6129318284612d2f565b505050565b61293e612a95565b73ffffffffffffffffffffffffffffffffffffffff1661295c611a4b565b73ffffffffffffffffffffffffffffffffffffffff16146129b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129a9906140c2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612a22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a1990614755565b60405180910390fd5b612a2b81612c3e565b50565b600081612a39612a9d565b11158015612a48575060005482105b8015612a86575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b600033905090565b60006001905090565b60008082905080612ab5612a9d565b11612b3d57600054811015612b3c5760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415612b3a575b6000811415612b30576004600083600190039350838152602001908152602001600020549050612b05565b8092505050612b6f565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8612bfc8686846130c9565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612d0c613478565b612d2860046000848152602001908152602001600020546130d2565b9050919050565b612d49828260405180602001604052806000815250613188565b5050565b60008054905090565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612d7c612a8d565b8786866040518563ffffffff1660e01b8152600401612d9e94939291906147ca565b602060405180830381600087803b158015612db857600080fd5b505af1925050508015612de957506040513d601f19601f82011682018060405250810190612de6919061482b565b60015b612e63573d8060008114612e19576040519150601f19603f3d011682016040523d82523d6000602084013e612e1e565b606091505b50600081511415612e5b576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b612ebe613478565b612ecf612eca83612aa6565b6130d2565b9050919050565b6060600a8054612ee590614002565b80601f0160208091040260200160405190810160405280929190818152602001828054612f1190614002565b8015612f5e5780601f10612f3357610100808354040283529160200191612f5e565b820191906000526020600020905b815481529060010190602001808311612f4157829003601f168201915b5050505050905090565b60606000821415612fb0576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506130c4565b600082905060005b60008214612fe2578080612fcb90614858565b915050600a82612fdb91906148d0565b9150612fb8565b60008167ffffffffffffffff811115612ffe57612ffd6137d0565b5b6040519080825280601f01601f1916602001820160405280156130305781602001600182028036833780820191505090505b5090505b600085146130bd576001826130499190614901565b9150600a856130589190614935565b6030613064919061425e565b60f81b81838151811061307a57613079614194565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856130b691906148d0565b9450613034565b8093505050505b919050565b60009392505050565b6130da613478565b81816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff168152505060007c01000000000000000000000000000000000000000000000000000000008316141581604001901515908115158152505060e882901c816060019062ffffff16908162ffffff1681525050919050565b6131928383613225565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461322057600080549050600083820390505b6131d26000868380600101945086612d56565b613208576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8181106131bf57816000541461321d57600080fd5b50505b505050565b6000805490506000821415613266576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6132736000848385612bdf565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506132ea836132db6000866000612be5565b6132e4856133e2565b17612c0d565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b81811461338b57808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050613350565b5060008214156133c7576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060008190555050506133dd6000848385612c38565b505050565b60006001821460e11b9050919050565b8280546133fe90614002565b90600052602060002090601f0160209004810192826134205760008555613467565b82601f1061343957805160ff1916838001178555613467565b82800160010185558215613467579182015b8281111561346657825182559160200191906001019061344b565b5b50905061347491906134c7565b5090565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600015158152602001600062ffffff1681525090565b5b808211156134e05760008160009055506001016134c8565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61352d816134f8565b811461353857600080fd5b50565b60008135905061354a81613524565b92915050565b600060208284031215613566576135656134ee565b5b60006135748482850161353b565b91505092915050565b60008115159050919050565b6135928161357d565b82525050565b60006020820190506135ad6000830184613589565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156135ed5780820151818401526020810190506135d2565b838111156135fc576000848401525b50505050565b6000601f19601f8301169050919050565b600061361e826135b3565b61362881856135be565b93506136388185602086016135cf565b61364181613602565b840191505092915050565b600060208201905081810360008301526136668184613613565b905092915050565b6000819050919050565b6136818161366e565b811461368c57600080fd5b50565b60008135905061369e81613678565b92915050565b6000602082840312156136ba576136b96134ee565b5b60006136c88482850161368f565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006136fc826136d1565b9050919050565b61370c816136f1565b82525050565b60006020820190506137276000830184613703565b92915050565b613736816136f1565b811461374157600080fd5b50565b6000813590506137538161372d565b92915050565b600080604083850312156137705761376f6134ee565b5b600061377e85828601613744565b925050602061378f8582860161368f565b9150509250929050565b6000602082840312156137af576137ae6134ee565b5b60006137bd84828501613744565b91505092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61380882613602565b810181811067ffffffffffffffff82111715613827576138266137d0565b5b80604052505050565b600061383a6134e4565b905061384682826137ff565b919050565b600067ffffffffffffffff821115613866576138656137d0565b5b61386f82613602565b9050602081019050919050565b82818337600083830152505050565b600061389e6138998461384b565b613830565b9050828152602081018484840111156138ba576138b96137cb565b5b6138c584828561387c565b509392505050565b600082601f8301126138e2576138e16137c6565b5b81356138f284826020860161388b565b91505092915050565b600060208284031215613911576139106134ee565b5b600082013567ffffffffffffffff81111561392f5761392e6134f3565b5b61393b848285016138cd565b91505092915050565b61394d8161357d565b811461395857600080fd5b50565b60008135905061396a81613944565b92915050565b600060208284031215613986576139856134ee565b5b60006139948482850161395b565b91505092915050565b6139a68161366e565b82525050565b60006020820190506139c1600083018461399d565b92915050565b6000806000606084860312156139e0576139df6134ee565b5b60006139ee86828701613744565b93505060206139ff86828701613744565b9250506040613a108682870161368f565b9150509250925092565b600080fd5b600080fd5b60008083601f840112613a3a57613a396137c6565b5b8235905067ffffffffffffffff811115613a5757613a56613a1a565b5b602083019150836020820283011115613a7357613a72613a1f565b5b9250929050565b60008060208385031215613a9157613a906134ee565b5b600083013567ffffffffffffffff811115613aaf57613aae6134f3565b5b613abb85828601613a24565b92509250509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613afc816136f1565b82525050565b600067ffffffffffffffff82169050919050565b613b1f81613b02565b82525050565b613b2e8161357d565b82525050565b600062ffffff82169050919050565b613b4c81613b34565b82525050565b608082016000820151613b686000850182613af3565b506020820151613b7b6020850182613b16565b506040820151613b8e6040850182613b25565b506060820151613ba16060850182613b43565b50505050565b6000613bb38383613b52565b60808301905092915050565b6000602082019050919050565b6000613bd782613ac7565b613be18185613ad2565b9350613bec83613ae3565b8060005b83811015613c1d578151613c048882613ba7565b9750613c0f83613bbf565b925050600181019050613bf0565b5085935050505092915050565b60006020820190508181036000830152613c448184613bcc565b905092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613c818161366e565b82525050565b6000613c938383613c78565b60208301905092915050565b6000602082019050919050565b6000613cb782613c4c565b613cc18185613c57565b9350613ccc83613c68565b8060005b83811015613cfd578151613ce48882613c87565b9750613cef83613c9f565b925050600181019050613cd0565b5085935050505092915050565b60006020820190508181036000830152613d248184613cac565b905092915050565b600080600060608486031215613d4557613d446134ee565b5b6000613d5386828701613744565b9350506020613d648682870161368f565b9250506040613d758682870161368f565b9150509250925092565b60008060408385031215613d9657613d956134ee565b5b6000613da485828601613744565b9250506020613db58582860161395b565b9150509250929050565b600067ffffffffffffffff821115613dda57613dd96137d0565b5b613de382613602565b9050602081019050919050565b6000613e03613dfe84613dbf565b613830565b905082815260208101848484011115613e1f57613e1e6137cb565b5b613e2a84828561387c565b509392505050565b600082601f830112613e4757613e466137c6565b5b8135613e57848260208601613df0565b91505092915050565b60008060008060808587031215613e7a57613e796134ee565b5b6000613e8887828801613744565b9450506020613e9987828801613744565b9350506040613eaa8782880161368f565b925050606085013567ffffffffffffffff811115613ecb57613eca6134f3565b5b613ed787828801613e32565b91505092959194509250565b608082016000820151613ef96000850182613af3565b506020820151613f0c6020850182613b16565b506040820151613f1f6040850182613b25565b506060820151613f326060850182613b43565b50505050565b6000608082019050613f4d6000830184613ee3565b92915050565b60008060408385031215613f6a57613f696134ee565b5b6000613f7885828601613744565b9250506020613f8985828601613744565b9150509250929050565b60008060408385031215613faa57613fa96134ee565b5b6000613fb88582860161368f565b9250506020613fc985828601613744565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061401a57607f821691505b6020821081141561402e5761402d613fd3565b5b50919050565b60008151905061404381613678565b92915050565b60006020828403121561405f5761405e6134ee565b5b600061406d84828501614034565b91505092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006140ac6020836135be565b91506140b782614076565b602082019050919050565b600060208201905081810360008301526140db8161409f565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000614118601f836135be565b9150614123826140e2565b602082019050919050565b600060208201905081810360008301526141478161410b565b9050919050565b600081905092915050565b50565b600061416960008361414e565b915061417482614159565b600082019050919050565b600061418a8261415c565b9150819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f496e76616c6964206d696e7420616d6f756e7421000000000000000000000000600082015250565b60006141f96014836135be565b9150614204826141c3565b602082019050919050565b60006020820190508181036000830152614228816141ec565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006142698261366e565b91506142748361366e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156142a9576142a861422f565b5b828201905092915050565b7f4d617820737570706c7920657863656564656421000000000000000000000000600082015250565b60006142ea6014836135be565b91506142f5826142b4565b602082019050919050565b60006020820190508181036000830152614319816142dd565b9050919050565b7f596f7520646f6e7420616e79204d696c61647927732100000000000000000000600082015250565b60006143566016836135be565b915061436182614320565b602082019050919050565b6000602082019050818103600083015261438581614349565b9050919050565b7f5468652077686974656c6973742073616c65206973206e6f7420656e61626c6560008201527f6421000000000000000000000000000000000000000000000000000000000000602082015250565b60006143e86022836135be565b91506143f38261438c565b604082019050919050565b60006020820190508181036000830152614417816143db565b9050919050565b60006144298261366e565b91506144348361366e565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561446d5761446c61422f565b5b828202905092915050565b7f496e73756666696369656e742066756e64732100000000000000000000000000600082015250565b60006144ae6013836135be565b91506144b982614478565b602082019050919050565b600060208201905081810360008301526144dd816144a1565b9050919050565b7f54686520636f6e74726163742069732070617573656421000000000000000000600082015250565b600061451a6017836135be565b9150614525826144e4565b602082019050919050565b600060208201905081810360008301526145498161450d565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006145ac602f836135be565b91506145b782614550565b604082019050919050565b600060208201905081810360008301526145db8161459f565b9050919050565b600081905092915050565b60006145f8826135b3565b61460281856145e2565b93506146128185602086016135cf565b80840191505092915050565b60008190508160005260206000209050919050565b6000815461464081614002565b61464a81866145e2565b945060018216600081146146655760018114614676576146a9565b60ff198316865281860193506146a9565b61467f8561461e565b60005b838110156146a157815481890152600182019150602081019050614682565b838801955050505b50505092915050565b60006146be82866145ed565b91506146ca82856145ed565b91506146d68284614633565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061473f6026836135be565b915061474a826146e3565b604082019050919050565b6000602082019050818103600083015261476e81614732565b9050919050565b600081519050919050565b600082825260208201905092915050565b600061479c82614775565b6147a68185614780565b93506147b68185602086016135cf565b6147bf81613602565b840191505092915050565b60006080820190506147df6000830187613703565b6147ec6020830186613703565b6147f9604083018561399d565b818103606083015261480b8184614791565b905095945050505050565b60008151905061482581613524565b92915050565b600060208284031215614841576148406134ee565b5b600061484f84828501614816565b91505092915050565b60006148638261366e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156148965761489561422f565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006148db8261366e565b91506148e68361366e565b9250826148f6576148f56148a1565b5b828204905092915050565b600061490c8261366e565b91506149178361366e565b92508282101561492a5761492961422f565b5b828203905092915050565b60006149408261366e565b915061494b8361366e565b92508261495b5761495a6148a1565b5b82820690509291505056fea2646970667358221220dd46f723963a1a271c3c75d34466e0acd16135e30b40eebc4c77efc2fba5ef2664736f6c63430008090033697066733a2f2f6261667962656965707a696165356a7066323469766f67766b6636626c72777779786d7371356b6466636d67736c766868366a6d7264326d3465652f00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000002faf0800000000000000000000000000000000000000000000000000000000001c9c38000000000000000000000000000000000000000000000000000000000000003e8000000000000000000000000000000000000000000000000000000000000000f4d696c61647920436f6c6f6d626961000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044d434f4c00000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x6080604052600436106102305760003560e01c80637cf8cf3f1161012e578063b767a098116100ab578063c87b56dd1161006f578063c87b56dd146107fd578063d5abeb011461083a578063e985e9c514610865578063efbd73f4146108a2578063f2fde38b146108cb57610230565b8063b767a09814610729578063b88d4fde14610752578063c23dc68f1461076e578063c2d52560146107ab578063c6275255146107d457610230565b806395d89b41116100f257806395d89b411461065157806399a2557a1461067c578063a0712d68146106b9578063a22cb465146106d5578063a945bf80146106fe57610230565b80637cf8cf3f146105795780637ec4a659146105a45780638462151c146105cd5780638da5cb5b1461060a5780638e1568ee1461063557610230565b80633ccfd60b116101bc57806362b99ad41161018057806362b99ad4146104925780636352211e146104bd5780636caede3d146104fa57806370a0823114610525578063715018a61461056257610230565b80633ccfd60b146103cc57806342842e0e146103e35780635503a0e8146103ff5780635bbb21771461042a5780635c975abb1461046757610230565b80630d978785116102035780630d978785146102f657806316ba10e01461033357806316c38b3c1461035c57806318160ddd1461038557806323b872dd146103b057610230565b806301ffc9a71461023557806306fdde0314610272578063081812fc1461029d578063095ea7b3146102da575b600080fd5b34801561024157600080fd5b5061025c60048036038101906102579190613550565b6108f4565b6040516102699190613598565b60405180910390f35b34801561027e57600080fd5b50610287610986565b604051610294919061364c565b60405180910390f35b3480156102a957600080fd5b506102c460048036038101906102bf91906136a4565b610a18565b6040516102d19190613712565b60405180910390f35b6102f460048036038101906102ef9190613759565b610a97565b005b34801561030257600080fd5b5061031d60048036038101906103189190613799565b610bdb565b60405161032a9190613598565b60405180910390f35b34801561033f57600080fd5b5061035a600480360381019061035591906138fb565b610f30565b005b34801561036857600080fd5b50610383600480360381019061037e9190613970565b610fc6565b005b34801561039157600080fd5b5061039a61105f565b6040516103a791906139ac565b60405180910390f35b6103ca60048036038101906103c591906139c7565b611076565b005b3480156103d857600080fd5b506103e161139b565b005b6103fd60048036038101906103f891906139c7565b6114ed565b005b34801561040b57600080fd5b5061041461150d565b604051610421919061364c565b60405180910390f35b34801561043657600080fd5b50610451600480360381019061044c9190613a7a565b61159b565b60405161045e9190613c2a565b60405180910390f35b34801561047357600080fd5b5061047c61165e565b6040516104899190613598565b60405180910390f35b34801561049e57600080fd5b506104a7611671565b6040516104b4919061364c565b60405180910390f35b3480156104c957600080fd5b506104e460048036038101906104df91906136a4565b6116ff565b6040516104f19190613712565b60405180910390f35b34801561050657600080fd5b5061050f611711565b60405161051c9190613598565b60405180910390f35b34801561053157600080fd5b5061054c60048036038101906105479190613799565b611724565b60405161055991906139ac565b60405180910390f35b34801561056e57600080fd5b506105776117dd565b005b34801561058557600080fd5b5061058e611865565b60405161059b91906139ac565b60405180910390f35b3480156105b057600080fd5b506105cb60048036038101906105c691906138fb565b61186b565b005b3480156105d957600080fd5b506105f460048036038101906105ef9190613799565b611901565b6040516106019190613d0a565b60405180910390f35b34801561061657600080fd5b5061061f611a4b565b60405161062c9190613712565b60405180910390f35b61064f600480360381019061064a91906136a4565b611a75565b005b34801561065d57600080fd5b50610666611f41565b604051610673919061364c565b60405180910390f35b34801561068857600080fd5b506106a3600480360381019061069e9190613d2c565b611fd3565b6040516106b09190613d0a565b60405180910390f35b6106d360048036038101906106ce91906136a4565b6121e7565b005b3480156106e157600080fd5b506106fc60048036038101906106f79190613d7f565b612339565b005b34801561070a57600080fd5b50610713612444565b60405161072091906139ac565b60405180910390f35b34801561073557600080fd5b50610750600480360381019061074b9190613970565b61244a565b005b61076c60048036038101906107679190613e60565b6124e3565b005b34801561077a57600080fd5b50610795600480360381019061079091906136a4565b612556565b6040516107a29190613f38565b60405180910390f35b3480156107b757600080fd5b506107d260048036038101906107cd91906136a4565b6125c0565b005b3480156107e057600080fd5b506107fb60048036038101906107f691906136a4565b612646565b005b34801561080957600080fd5b50610824600480360381019061081f91906136a4565b6126cc565b604051610831919061364c565b60405180910390f35b34801561084657600080fd5b5061084f612776565b60405161085c91906139ac565b60405180910390f35b34801561087157600080fd5b5061088c60048036038101906108879190613f53565b61277c565b6040516108999190613598565b60405180910390f35b3480156108ae57600080fd5b506108c960048036038101906108c49190613f93565b612810565b005b3480156108d757600080fd5b506108f260048036038101906108ed9190613799565b612936565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061094f57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061097f5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60606002805461099590614002565b80601f01602080910402602001604051908101604052809291908181526020018280546109c190614002565b8015610a0e5780601f106109e357610100808354040283529160200191610a0e565b820191906000526020600020905b8154815290600101906020018083116109f157829003601f168201915b5050505050905090565b6000610a2382612a2e565b610a59576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610aa2826116ff565b90508073ffffffffffffffffffffffffffffffffffffffff16610ac3612a8d565b73ffffffffffffffffffffffffffffffffffffffff1614610b2657610aef81610aea612a8d565b61277c565b610b25576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60008073afe12842e3703a3cc3a71d9463389b1bf2c5bc1c73ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b8152600401610c2b9190613712565b60206040518083038186803b158015610c4357600080fd5b505afa158015610c57573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c7b9190614049565b1180610d235750600073880a965fae95f72fe3a3c8e87ed2c9478c8e0a2973ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b8152600401610cd19190613712565b60206040518083038186803b158015610ce957600080fd5b505afa158015610cfd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d219190614049565b115b80610dca57506000735af0d9827e0c53e4799bb226655a1de152a425a573ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b8152600401610d789190613712565b60206040518083038186803b158015610d9057600080fd5b505afa158015610da4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dc89190614049565b115b80610e7157506000738fc0d90f2c45a5e7f94904075c952e0943cfccfd73ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b8152600401610e1f9190613712565b60206040518083038186803b158015610e3757600080fd5b505afa158015610e4b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e6f9190614049565b115b80610f1857506000738fc0d90f2c45a5e7f94904075c952e0943cfccfd73ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b8152600401610ec69190613712565b60206040518083038186803b158015610ede57600080fd5b505afa158015610ef2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f169190614049565b115b15610f265760019050610f2b565b600090505b919050565b610f38612a95565b73ffffffffffffffffffffffffffffffffffffffff16610f56611a4b565b73ffffffffffffffffffffffffffffffffffffffff1614610fac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa3906140c2565b60405180910390fd5b80600b9080519060200190610fc29291906133f2565b5050565b610fce612a95565b73ffffffffffffffffffffffffffffffffffffffff16610fec611a4b565b73ffffffffffffffffffffffffffffffffffffffff1614611042576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611039906140c2565b60405180910390fd5b80600f60006101000a81548160ff02191690831515021790555050565b6000611069612a9d565b6001546000540303905090565b600061108182612aa6565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146110e8576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806110f484612b74565b9150915061110a8187611105612a8d565b612b9b565b6111565761111f8661111a612a8d565b61277c565b611155576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156111bd576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6111ca8686866001612bdf565b80156111d557600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055506112a38561127f888887612be5565b7c020000000000000000000000000000000000000000000000000000000017612c0d565b600460008681526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008416141561132b576000600185019050600060046000838152602001908152602001600020541415611329576000548114611328578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46113938686866001612c38565b505050505050565b6113a3612a95565b73ffffffffffffffffffffffffffffffffffffffff166113c1611a4b565b73ffffffffffffffffffffffffffffffffffffffff1614611417576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140e906140c2565b60405180910390fd5b6002600954141561145d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114549061412e565b60405180910390fd5b6002600981905550600061146f611a4b565b73ffffffffffffffffffffffffffffffffffffffff16476040516114929061417f565b60006040518083038185875af1925050503d80600081146114cf576040519150601f19603f3d011682016040523d82523d6000602084013e6114d4565b606091505b50509050806114e257600080fd5b506001600981905550565b611508838383604051806020016040528060008152506124e3565b505050565b600b805461151a90614002565b80601f016020809104026020016040519081016040528092919081815260200182805461154690614002565b80156115935780601f1061156857610100808354040283529160200191611593565b820191906000526020600020905b81548152906001019060200180831161157657829003601f168201915b505050505081565b6060600083839050905060008167ffffffffffffffff8111156115c1576115c06137d0565b5b6040519080825280602002602001820160405280156115fa57816020015b6115e7613478565b8152602001906001900390816115df5790505b50905060005b8281146116525761162986868381811061161d5761161c614194565b5b90506020020135612556565b82828151811061163c5761163b614194565b5b6020026020010181905250806001019050611600565b50809250505092915050565b600f60009054906101000a900460ff1681565b600a805461167e90614002565b80601f01602080910402602001604051908101604052809291908181526020018280546116aa90614002565b80156116f75780601f106116cc576101008083540402835291602001916116f7565b820191906000526020600020905b8154815290600101906020018083116116da57829003601f168201915b505050505081565b600061170a82612aa6565b9050919050565b600f60019054906101000a900460ff1681565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561178c576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6117e5612a95565b73ffffffffffffffffffffffffffffffffffffffff16611803611a4b565b73ffffffffffffffffffffffffffffffffffffffff1614611859576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611850906140c2565b60405180910390fd5b6118636000612c3e565b565b600c5481565b611873612a95565b73ffffffffffffffffffffffffffffffffffffffff16611891611a4b565b73ffffffffffffffffffffffffffffffffffffffff16146118e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118de906140c2565b60405180910390fd5b80600a90805190602001906118fd9291906133f2565b5050565b6060600080600061191185611724565b905060008167ffffffffffffffff81111561192f5761192e6137d0565b5b60405190808252806020026020018201604052801561195d5781602001602082028036833780820191505090505b509050611968613478565b6000611972612a9d565b90505b838614611a3d5761198581612d04565b915081604001511561199657611a32565b600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff16146119d657816000015194505b8773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415611a315780838780600101985081518110611a2457611a23614194565b5b6020026020010181815250505b5b806001019050611975565b508195505050505050919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b8060008111611ab9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ab09061420f565b60405180910390fd5b600e5481611ac561105f565b611acf919061425e565b1115611b10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0790614300565b60405180910390fd5b33600073afe12842e3703a3cc3a71d9463389b1bf2c5bc1c73ffffffffffffffffffffffffffffffffffffffff166370a08231836040518263ffffffff1660e01b8152600401611b609190613712565b60206040518083038186803b158015611b7857600080fd5b505afa158015611b8c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bb09190614049565b1180611c585750600073880a965fae95f72fe3a3c8e87ed2c9478c8e0a2973ffffffffffffffffffffffffffffffffffffffff166370a08231836040518263ffffffff1660e01b8152600401611c069190613712565b60206040518083038186803b158015611c1e57600080fd5b505afa158015611c32573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c569190614049565b115b80611cff57506000735af0d9827e0c53e4799bb226655a1de152a425a573ffffffffffffffffffffffffffffffffffffffff166370a08231836040518263ffffffff1660e01b8152600401611cad9190613712565b60206040518083038186803b158015611cc557600080fd5b505afa158015611cd9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cfd9190614049565b115b80611da657506000738fc0d90f2c45a5e7f94904075c952e0943cfccfd73ffffffffffffffffffffffffffffffffffffffff166370a08231836040518263ffffffff1660e01b8152600401611d549190613712565b60206040518083038186803b158015611d6c57600080fd5b505afa158015611d80573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611da49190614049565b115b80611e4d57506000738fc0d90f2c45a5e7f94904075c952e0943cfccfd73ffffffffffffffffffffffffffffffffffffffff166370a08231836040518263ffffffff1660e01b8152600401611dfb9190613712565b60206040518083038186803b158015611e1357600080fd5b505afa158015611e27573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e4b9190614049565b115b611e8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e839061436c565b60405180910390fd5b600f60019054906101000a900460ff16611edb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ed2906143fe565b60405180910390fd5b82600c54611ee9919061441e565b341015611f2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f22906144c4565b60405180910390fd5b611f3c611f36612a95565b84612d2f565b505050565b606060038054611f5090614002565b80601f0160208091040260200160405190810160405280929190818152602001828054611f7c90614002565b8015611fc95780601f10611f9e57610100808354040283529160200191611fc9565b820191906000526020600020905b815481529060010190602001808311611fac57829003601f168201915b5050505050905090565b606081831061200e576040517f32c1995a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080612019612d4d565b9050612023612a9d565b85101561203557612032612a9d565b94505b80841115612041578093505b600061204c87611724565b90508486101561206f576000868603905081811015612069578091505b50612074565b600090505b60008167ffffffffffffffff8111156120905761208f6137d0565b5b6040519080825280602002602001820160405280156120be5781602001602082028036833780820191505090505b50905060008214156120d657809450505050506121e0565b60006120e188612556565b9050600081604001516120f657816000015190505b60008990505b88811415801561210c5750848714155b156121d25761211a81612d04565b925082604001511561212b576121c7565b600073ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff161461216b57826000015191505b8a73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156121c657808488806001019950815181106121b9576121b8614194565b5b6020026020010181815250505b5b8060010190506120fc565b508583528296505050505050505b9392505050565b806000811161222b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122229061420f565b60405180910390fd5b600e548161223761105f565b612241919061425e565b1115612282576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161227990614300565b60405180910390fd5b8180600d54612291919061441e565b3410156122d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122ca906144c4565b60405180910390fd5b600f60009054906101000a900460ff1615612323576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161231a90614530565b60405180910390fd5b61233461232e612a95565b84612d2f565b505050565b8060076000612346612a8d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166123f3612a8d565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516124389190613598565b60405180910390a35050565b600d5481565b612452612a95565b73ffffffffffffffffffffffffffffffffffffffff16612470611a4b565b73ffffffffffffffffffffffffffffffffffffffff16146124c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124bd906140c2565b60405180910390fd5b80600f60016101000a81548160ff02191690831515021790555050565b6124ee848484611076565b60008373ffffffffffffffffffffffffffffffffffffffff163b146125505761251984848484612d56565b61254f576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b61255e613478565b612566613478565b61256e612a9d565b831080612582575061257e612d4d565b8310155b1561259057809150506125bb565b61259983612d04565b90508060400151156125ae57809150506125bb565b6125b783612eb6565b9150505b919050565b6125c8612a95565b73ffffffffffffffffffffffffffffffffffffffff166125e6611a4b565b73ffffffffffffffffffffffffffffffffffffffff161461263c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612633906140c2565b60405180910390fd5b80600c8190555050565b61264e612a95565b73ffffffffffffffffffffffffffffffffffffffff1661266c611a4b565b73ffffffffffffffffffffffffffffffffffffffff16146126c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126b9906140c2565b60405180910390fd5b80600d8190555050565b60606126d782612a2e565b612716576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161270d906145c2565b60405180910390fd5b6000612720612ed6565b90506000815111612740576040518060200160405280600081525061276e565b8061274a84612f68565b600b60405160200161275e939291906146b2565b6040516020818303038152906040525b915050919050565b600e5481565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b8160008111612854576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161284b9061420f565b60405180910390fd5b600e548161286061105f565b61286a919061425e565b11156128ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128a290614300565b60405180910390fd5b6128b3612a95565b73ffffffffffffffffffffffffffffffffffffffff166128d1611a4b565b73ffffffffffffffffffffffffffffffffffffffff1614612927576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161291e906140c2565b60405180910390fd5b6129318284612d2f565b505050565b61293e612a95565b73ffffffffffffffffffffffffffffffffffffffff1661295c611a4b565b73ffffffffffffffffffffffffffffffffffffffff16146129b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129a9906140c2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612a22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a1990614755565b60405180910390fd5b612a2b81612c3e565b50565b600081612a39612a9d565b11158015612a48575060005482105b8015612a86575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b600033905090565b60006001905090565b60008082905080612ab5612a9d565b11612b3d57600054811015612b3c5760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415612b3a575b6000811415612b30576004600083600190039350838152602001908152602001600020549050612b05565b8092505050612b6f565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8612bfc8686846130c9565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612d0c613478565b612d2860046000848152602001908152602001600020546130d2565b9050919050565b612d49828260405180602001604052806000815250613188565b5050565b60008054905090565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612d7c612a8d565b8786866040518563ffffffff1660e01b8152600401612d9e94939291906147ca565b602060405180830381600087803b158015612db857600080fd5b505af1925050508015612de957506040513d601f19601f82011682018060405250810190612de6919061482b565b60015b612e63573d8060008114612e19576040519150601f19603f3d011682016040523d82523d6000602084013e612e1e565b606091505b50600081511415612e5b576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b612ebe613478565b612ecf612eca83612aa6565b6130d2565b9050919050565b6060600a8054612ee590614002565b80601f0160208091040260200160405190810160405280929190818152602001828054612f1190614002565b8015612f5e5780601f10612f3357610100808354040283529160200191612f5e565b820191906000526020600020905b815481529060010190602001808311612f4157829003601f168201915b5050505050905090565b60606000821415612fb0576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506130c4565b600082905060005b60008214612fe2578080612fcb90614858565b915050600a82612fdb91906148d0565b9150612fb8565b60008167ffffffffffffffff811115612ffe57612ffd6137d0565b5b6040519080825280601f01601f1916602001820160405280156130305781602001600182028036833780820191505090505b5090505b600085146130bd576001826130499190614901565b9150600a856130589190614935565b6030613064919061425e565b60f81b81838151811061307a57613079614194565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856130b691906148d0565b9450613034565b8093505050505b919050565b60009392505050565b6130da613478565b81816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff168152505060007c01000000000000000000000000000000000000000000000000000000008316141581604001901515908115158152505060e882901c816060019062ffffff16908162ffffff1681525050919050565b6131928383613225565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461322057600080549050600083820390505b6131d26000868380600101945086612d56565b613208576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8181106131bf57816000541461321d57600080fd5b50505b505050565b6000805490506000821415613266576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6132736000848385612bdf565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506132ea836132db6000866000612be5565b6132e4856133e2565b17612c0d565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b81811461338b57808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050613350565b5060008214156133c7576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060008190555050506133dd6000848385612c38565b505050565b60006001821460e11b9050919050565b8280546133fe90614002565b90600052602060002090601f0160209004810192826134205760008555613467565b82601f1061343957805160ff1916838001178555613467565b82800160010185558215613467579182015b8281111561346657825182559160200191906001019061344b565b5b50905061347491906134c7565b5090565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600015158152602001600062ffffff1681525090565b5b808211156134e05760008160009055506001016134c8565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61352d816134f8565b811461353857600080fd5b50565b60008135905061354a81613524565b92915050565b600060208284031215613566576135656134ee565b5b60006135748482850161353b565b91505092915050565b60008115159050919050565b6135928161357d565b82525050565b60006020820190506135ad6000830184613589565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156135ed5780820151818401526020810190506135d2565b838111156135fc576000848401525b50505050565b6000601f19601f8301169050919050565b600061361e826135b3565b61362881856135be565b93506136388185602086016135cf565b61364181613602565b840191505092915050565b600060208201905081810360008301526136668184613613565b905092915050565b6000819050919050565b6136818161366e565b811461368c57600080fd5b50565b60008135905061369e81613678565b92915050565b6000602082840312156136ba576136b96134ee565b5b60006136c88482850161368f565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006136fc826136d1565b9050919050565b61370c816136f1565b82525050565b60006020820190506137276000830184613703565b92915050565b613736816136f1565b811461374157600080fd5b50565b6000813590506137538161372d565b92915050565b600080604083850312156137705761376f6134ee565b5b600061377e85828601613744565b925050602061378f8582860161368f565b9150509250929050565b6000602082840312156137af576137ae6134ee565b5b60006137bd84828501613744565b91505092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61380882613602565b810181811067ffffffffffffffff82111715613827576138266137d0565b5b80604052505050565b600061383a6134e4565b905061384682826137ff565b919050565b600067ffffffffffffffff821115613866576138656137d0565b5b61386f82613602565b9050602081019050919050565b82818337600083830152505050565b600061389e6138998461384b565b613830565b9050828152602081018484840111156138ba576138b96137cb565b5b6138c584828561387c565b509392505050565b600082601f8301126138e2576138e16137c6565b5b81356138f284826020860161388b565b91505092915050565b600060208284031215613911576139106134ee565b5b600082013567ffffffffffffffff81111561392f5761392e6134f3565b5b61393b848285016138cd565b91505092915050565b61394d8161357d565b811461395857600080fd5b50565b60008135905061396a81613944565b92915050565b600060208284031215613986576139856134ee565b5b60006139948482850161395b565b91505092915050565b6139a68161366e565b82525050565b60006020820190506139c1600083018461399d565b92915050565b6000806000606084860312156139e0576139df6134ee565b5b60006139ee86828701613744565b93505060206139ff86828701613744565b9250506040613a108682870161368f565b9150509250925092565b600080fd5b600080fd5b60008083601f840112613a3a57613a396137c6565b5b8235905067ffffffffffffffff811115613a5757613a56613a1a565b5b602083019150836020820283011115613a7357613a72613a1f565b5b9250929050565b60008060208385031215613a9157613a906134ee565b5b600083013567ffffffffffffffff811115613aaf57613aae6134f3565b5b613abb85828601613a24565b92509250509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613afc816136f1565b82525050565b600067ffffffffffffffff82169050919050565b613b1f81613b02565b82525050565b613b2e8161357d565b82525050565b600062ffffff82169050919050565b613b4c81613b34565b82525050565b608082016000820151613b686000850182613af3565b506020820151613b7b6020850182613b16565b506040820151613b8e6040850182613b25565b506060820151613ba16060850182613b43565b50505050565b6000613bb38383613b52565b60808301905092915050565b6000602082019050919050565b6000613bd782613ac7565b613be18185613ad2565b9350613bec83613ae3565b8060005b83811015613c1d578151613c048882613ba7565b9750613c0f83613bbf565b925050600181019050613bf0565b5085935050505092915050565b60006020820190508181036000830152613c448184613bcc565b905092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613c818161366e565b82525050565b6000613c938383613c78565b60208301905092915050565b6000602082019050919050565b6000613cb782613c4c565b613cc18185613c57565b9350613ccc83613c68565b8060005b83811015613cfd578151613ce48882613c87565b9750613cef83613c9f565b925050600181019050613cd0565b5085935050505092915050565b60006020820190508181036000830152613d248184613cac565b905092915050565b600080600060608486031215613d4557613d446134ee565b5b6000613d5386828701613744565b9350506020613d648682870161368f565b9250506040613d758682870161368f565b9150509250925092565b60008060408385031215613d9657613d956134ee565b5b6000613da485828601613744565b9250506020613db58582860161395b565b9150509250929050565b600067ffffffffffffffff821115613dda57613dd96137d0565b5b613de382613602565b9050602081019050919050565b6000613e03613dfe84613dbf565b613830565b905082815260208101848484011115613e1f57613e1e6137cb565b5b613e2a84828561387c565b509392505050565b600082601f830112613e4757613e466137c6565b5b8135613e57848260208601613df0565b91505092915050565b60008060008060808587031215613e7a57613e796134ee565b5b6000613e8887828801613744565b9450506020613e9987828801613744565b9350506040613eaa8782880161368f565b925050606085013567ffffffffffffffff811115613ecb57613eca6134f3565b5b613ed787828801613e32565b91505092959194509250565b608082016000820151613ef96000850182613af3565b506020820151613f0c6020850182613b16565b506040820151613f1f6040850182613b25565b506060820151613f326060850182613b43565b50505050565b6000608082019050613f4d6000830184613ee3565b92915050565b60008060408385031215613f6a57613f696134ee565b5b6000613f7885828601613744565b9250506020613f8985828601613744565b9150509250929050565b60008060408385031215613faa57613fa96134ee565b5b6000613fb88582860161368f565b9250506020613fc985828601613744565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061401a57607f821691505b6020821081141561402e5761402d613fd3565b5b50919050565b60008151905061404381613678565b92915050565b60006020828403121561405f5761405e6134ee565b5b600061406d84828501614034565b91505092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006140ac6020836135be565b91506140b782614076565b602082019050919050565b600060208201905081810360008301526140db8161409f565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000614118601f836135be565b9150614123826140e2565b602082019050919050565b600060208201905081810360008301526141478161410b565b9050919050565b600081905092915050565b50565b600061416960008361414e565b915061417482614159565b600082019050919050565b600061418a8261415c565b9150819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f496e76616c6964206d696e7420616d6f756e7421000000000000000000000000600082015250565b60006141f96014836135be565b9150614204826141c3565b602082019050919050565b60006020820190508181036000830152614228816141ec565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006142698261366e565b91506142748361366e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156142a9576142a861422f565b5b828201905092915050565b7f4d617820737570706c7920657863656564656421000000000000000000000000600082015250565b60006142ea6014836135be565b91506142f5826142b4565b602082019050919050565b60006020820190508181036000830152614319816142dd565b9050919050565b7f596f7520646f6e7420616e79204d696c61647927732100000000000000000000600082015250565b60006143566016836135be565b915061436182614320565b602082019050919050565b6000602082019050818103600083015261438581614349565b9050919050565b7f5468652077686974656c6973742073616c65206973206e6f7420656e61626c6560008201527f6421000000000000000000000000000000000000000000000000000000000000602082015250565b60006143e86022836135be565b91506143f38261438c565b604082019050919050565b60006020820190508181036000830152614417816143db565b9050919050565b60006144298261366e565b91506144348361366e565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561446d5761446c61422f565b5b828202905092915050565b7f496e73756666696369656e742066756e64732100000000000000000000000000600082015250565b60006144ae6013836135be565b91506144b982614478565b602082019050919050565b600060208201905081810360008301526144dd816144a1565b9050919050565b7f54686520636f6e74726163742069732070617573656421000000000000000000600082015250565b600061451a6017836135be565b9150614525826144e4565b602082019050919050565b600060208201905081810360008301526145498161450d565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006145ac602f836135be565b91506145b782614550565b604082019050919050565b600060208201905081810360008301526145db8161459f565b9050919050565b600081905092915050565b60006145f8826135b3565b61460281856145e2565b93506146128185602086016135cf565b80840191505092915050565b60008190508160005260206000209050919050565b6000815461464081614002565b61464a81866145e2565b945060018216600081146146655760018114614676576146a9565b60ff198316865281860193506146a9565b61467f8561461e565b60005b838110156146a157815481890152600182019150602081019050614682565b838801955050505b50505092915050565b60006146be82866145ed565b91506146ca82856145ed565b91506146d68284614633565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061473f6026836135be565b915061474a826146e3565b604082019050919050565b6000602082019050818103600083015261476e81614732565b9050919050565b600081519050919050565b600082825260208201905092915050565b600061479c82614775565b6147a68185614780565b93506147b68185602086016135cf565b6147bf81613602565b840191505092915050565b60006080820190506147df6000830187613703565b6147ec6020830186613703565b6147f9604083018561399d565b818103606083015261480b8184614791565b905095945050505050565b60008151905061482581613524565b92915050565b600060208284031215614841576148406134ee565b5b600061484f84828501614816565b91505092915050565b60006148638261366e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156148965761489561422f565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006148db8261366e565b91506148e68361366e565b9250826148f6576148f56148a1565b5b828204905092915050565b600061490c8261366e565b91506149178361366e565b92508282101561492a5761492961422f565b5b828203905092915050565b60006149408261366e565b915061494b8361366e565b92508261495b5761495a6148a1565b5b82820690509291505056fea2646970667358221220dd46f723963a1a271c3c75d34466e0acd16135e30b40eebc4c77efc2fba5ef2664736f6c63430008090033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000002faf0800000000000000000000000000000000000000000000000000000000001c9c38000000000000000000000000000000000000000000000000000000000000003e8000000000000000000000000000000000000000000000000000000000000000f4d696c61647920436f6c6f6d626961000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044d434f4c00000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _tokenName (string): Milady Colombia
Arg [1] : _tokenSymbol (string): MCOL
Arg [2] : _publicPrice (uint256): 50000000
Arg [3] : _miladyPrice (uint256): 30000000
Arg [4] : _maxSupply (uint256): 1000
-----Encoded View---------------
9 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [2] : 0000000000000000000000000000000000000000000000000000000002faf080
Arg [3] : 0000000000000000000000000000000000000000000000000000000001c9c380
Arg [4] : 00000000000000000000000000000000000000000000000000000000000003e8
Arg [5] : 000000000000000000000000000000000000000000000000000000000000000f
Arg [6] : 4d696c61647920436f6c6f6d6269610000000000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [8] : 4d434f4c00000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
75094:4376:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32920:639;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33822:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40313:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39746:408;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;78757:444;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;78457:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;78563:77;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29573:323;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43952:2825;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;79207:150;;;;;;;;;;;;;:::i;:::-;;46873:193;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;75305:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70223:528;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75440:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75205:95;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35215:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75470:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30757:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13619:103;;;;;;;;;;;;;:::i;:::-;;75347:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;78351:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74099:900;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12968:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76959:311;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33998:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71139:2513;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77276:210;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40871:234;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;75378:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;78646:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47664:407;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69636:428;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;78243:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;78135;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;77756:373;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75409:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41262:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77494:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;13877:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32920:639;33005:4;33344:10;33329:25;;:11;:25;;;;:102;;;;33421:10;33406:25;;:11;:25;;;;33329:102;:179;;;;33498:10;33483:25;;:11;:25;;;;33329:179;33309:199;;32920:639;;;:::o;33822:100::-;33876:13;33909:5;33902:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33822:100;:::o;40313:218::-;40389:7;40414:16;40422:7;40414;:16::i;:::-;40409:64;;40439:34;;;;;;;;;;;;;;40409:64;40493:15;:24;40509:7;40493:24;;;;;;;;;;;:30;;;;;;;;;;;;40486:37;;40313:218;;;:::o;39746:408::-;39835:13;39851:16;39859:7;39851;:16::i;:::-;39835:32;;39907:5;39884:28;;:19;:17;:19::i;:::-;:28;;;39880:175;;39932:44;39949:5;39956:19;:17;:19::i;:::-;39932:16;:44::i;:::-;39927:128;;40004:35;;;;;;;;;;;;;;39927:128;39880:175;40100:2;40067:15;:24;40083:7;40067:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;40138:7;40134:2;40118:28;;40127:5;40118:28;;;;;;;;;;;;39824:330;39746:408;;:::o;78757:444::-;78823:4;78892:1;75549:42;78848:31;;;78880:8;78848:41;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:45;:101;;;;78948:1;75627:42;78905:30;;;78936:8;78905:40;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44;78848:101;:157;;;;79004:1;75707:42;78960:31;;;78992:8;78960:41;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:45;78848:157;:215;;;;79062:1;75789:42;79016:33;;;79050:8;79016:43;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:47;78848:215;:275;;;;79122:1;75873:42;79074:35;;;79110:8;79074:45;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:49;78848:275;78836:360;;;79149:4;79142:11;;;;78836:360;79183:5;79176:12;;78757:444;;;;:::o;78457:100::-;13199:12;:10;:12::i;:::-;13188:23;;:7;:5;:7::i;:::-;:23;;;13180:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;78541:10:::1;78529:9;:22;;;;;;;;;;;;:::i;:::-;;78457:100:::0;:::o;78563:77::-;13199:12;:10;:12::i;:::-;13188:23;;:7;:5;:7::i;:::-;:23;;;13180:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;78628:6:::1;78619;;:15;;;;;;;;;;;;;;;;;;78563:77:::0;:::o;29573:323::-;29634:7;29862:15;:13;:15::i;:::-;29847:12;;29831:13;;:28;:46;29824:53;;29573:323;:::o;43952:2825::-;44094:27;44124;44143:7;44124:18;:27::i;:::-;44094:57;;44209:4;44168:45;;44184:19;44168:45;;;44164:86;;44222:28;;;;;;;;;;;;;;44164:86;44264:27;44293:23;44320:35;44347:7;44320:26;:35::i;:::-;44263:92;;;;44455:68;44480:15;44497:4;44503:19;:17;:19::i;:::-;44455:24;:68::i;:::-;44450:180;;44543:43;44560:4;44566:19;:17;:19::i;:::-;44543:16;:43::i;:::-;44538:92;;44595:35;;;;;;;;;;;;;;44538:92;44450:180;44661:1;44647:16;;:2;:16;;;44643:52;;;44672:23;;;;;;;;;;;;;;44643:52;44708:43;44730:4;44736:2;44740:7;44749:1;44708:21;:43::i;:::-;44844:15;44841:160;;;44984:1;44963:19;44956:30;44841:160;45381:18;:24;45400:4;45381:24;;;;;;;;;;;;;;;;45379:26;;;;;;;;;;;;45450:18;:22;45469:2;45450:22;;;;;;;;;;;;;;;;45448:24;;;;;;;;;;;45772:146;45809:2;45858:45;45873:4;45879:2;45883:19;45858:14;:45::i;:::-;25972:8;45830:73;45772:18;:146::i;:::-;45743:17;:26;45761:7;45743:26;;;;;;;;;;;:175;;;;46089:1;25972:8;46038:19;:47;:52;46034:627;;;46111:19;46143:1;46133:7;:11;46111:33;;46300:1;46266:17;:30;46284:11;46266:30;;;;;;;;;;;;:35;46262:384;;;46404:13;;46389:11;:28;46385:242;;46584:19;46551:17;:30;46569:11;46551:30;;;;;;;;;;;:52;;;;46385:242;46262:384;46092:569;46034:627;46708:7;46704:2;46689:27;;46698:4;46689:27;;;;;;;;;;;;46727:42;46748:4;46754:2;46758:7;46767:1;46727:20;:42::i;:::-;44083:2694;;;43952:2825;;;:::o;79207:150::-;13199:12;:10;:12::i;:::-;13188:23;;:7;:5;:7::i;:::-;:23;;;13180:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;9960:1:::1;10558:7;;:19;;10550:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;9960:1;10691:7;:18;;;;79265:7:::2;79286;:5;:7::i;:::-;79278:21;;79307;79278:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;79264:69;;;79348:2;79340:11;;;::::0;::::2;;79257:100;9916:1:::1;10870:7;:22;;;;79207:150::o:0;46873:193::-;47019:39;47036:4;47042:2;47046:7;47019:39;;;;;;;;;;;;:16;:39::i;:::-;46873:193;;;:::o;75305:33::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;70223:528::-;70367:23;70433:22;70458:8;;:15;;70433:40;;70488:34;70546:14;70525:36;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;70488:73;;70581:9;70576:125;70597:14;70592:1;:19;70576:125;;70653:32;70673:8;;70682:1;70673:11;;;;;;;:::i;:::-;;;;;;;;70653:19;:32::i;:::-;70637:10;70648:1;70637:13;;;;;;;;:::i;:::-;;;;;;;:48;;;;70613:3;;;;;70576:125;;;;70722:10;70715:17;;;;70223:528;;;;:::o;75440:25::-;;;;;;;;;;;;;:::o;75205:95::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;35215:152::-;35287:7;35330:27;35349:7;35330:18;:27::i;:::-;35307:52;;35215:152;;;:::o;75470:40::-;;;;;;;;;;;;;:::o;30757:233::-;30829:7;30870:1;30853:19;;:5;:19;;;30849:60;;;30881:28;;;;;;;;;;;;;;30849:60;24916:13;30927:18;:25;30946:5;30927:25;;;;;;;;;;;;;;;;:55;30920:62;;30757:233;;;:::o;13619:103::-;13199:12;:10;:12::i;:::-;13188:23;;:7;:5;:7::i;:::-;:23;;;13180:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;13684:30:::1;13711:1;13684:18;:30::i;:::-;13619:103::o:0;75347:26::-;;;;:::o;78351:100::-;13199:12;:10;:12::i;:::-;13188:23;;:7;:5;:7::i;:::-;:23;;;13180:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;78435:10:::1;78423:9;:22;;;;;;;;;;;;:::i;:::-;;78351:100:::0;:::o;74099:900::-;74177:16;74231:19;74265:25;74305:22;74330:16;74340:5;74330:9;:16::i;:::-;74305:41;;74361:25;74403:14;74389:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;74361:57;;74433:31;;:::i;:::-;74484:9;74496:15;:13;:15::i;:::-;74484:27;;74479:472;74528:14;74513:11;:29;74479:472;;74580:15;74593:1;74580:12;:15::i;:::-;74568:27;;74618:9;:16;;;74614:73;;;74659:8;;74614:73;74735:1;74709:28;;:9;:14;;;:28;;;74705:111;;74782:9;:14;;;74762:34;;74705:111;74859:5;74838:26;;:17;:26;;;74834:102;;;74915:1;74889:8;74898:13;;;;;;74889:23;;;;;;;;:::i;:::-;;;;;;;:27;;;;;74834:102;74479:472;74544:3;;;;;74479:472;;;;74972:8;74965:15;;;;;;;74099:900;;;:::o;12968:87::-;13014:7;13041:6;;;;;;;;;;;13034:13;;12968:87;:::o;76959:311::-;77033:11;76306:1;76292:11;:15;76284:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;76378:9;;76363:11;76347:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:40;;76339:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;77058:10:::1;76683:1;75549:42;76640:31;;;76672:7;76640:40;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44;:99;;;;76738:1;75627:42;76696:30;;;76727:7;76696:39;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:43;76640:99;:154;;;;76793:1;75707:42;76750:31;;;76782:7;76750:40;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44;76640:154;:211;;;;76850:1;75789:42;76805:33;;;76839:7;76805:42;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:46;76640:211;:270;;;;76909:1;75873:42;76862:35;;;76898:7;76862:44;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:48;76640:270;76624:313;;;;;;;;;;;;:::i;:::-;;;;;;;;;77085:20:::2;;;;;;;;;;;77077:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;77186:11;77172;;:25;;;;:::i;:::-;77159:9;:38;;77151:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;77228:36;77238:12;:10;:12::i;:::-;77252:11;77228:9;:36::i;:::-;76419:1:::1;76959:311:::0;;:::o;33998:104::-;34054:13;34087:7;34080:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33998:104;:::o;71139:2513::-;71282:16;71349:4;71340:5;:13;71336:45;;71362:19;;;;;;;;;;;;;;71336:45;71396:19;71430:17;71450:14;:12;:14::i;:::-;71430:34;;71550:15;:13;:15::i;:::-;71542:5;:23;71538:87;;;71594:15;:13;:15::i;:::-;71586:23;;71538:87;71701:9;71694:4;:16;71690:73;;;71738:9;71731:16;;71690:73;71777:25;71805:16;71815:5;71805:9;:16::i;:::-;71777:44;;71999:4;71991:5;:12;71987:278;;;72024:19;72053:5;72046:4;:12;72024:34;;72095:17;72081:11;:31;72077:111;;;72157:11;72137:31;;72077:111;72005:198;71987:278;;;72248:1;72228:21;;71987:278;72279:25;72321:17;72307:32;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72279:60;;72379:1;72358:17;:22;72354:78;;;72408:8;72401:15;;;;;;;;72354:78;72576:31;72610:26;72630:5;72610:19;:26::i;:::-;72576:60;;72651:25;72896:9;:16;;;72891:92;;72953:9;:14;;;72933:34;;72891:92;73002:9;73014:5;73002:17;;72997:478;73026:4;73021:1;:9;;:45;;;;;73049:17;73034:11;:32;;73021:45;72997:478;;;73104:15;73117:1;73104:12;:15::i;:::-;73092:27;;73142:9;:16;;;73138:73;;;73183:8;;73138:73;73259:1;73233:28;;:9;:14;;;:28;;;73229:111;;73306:9;:14;;;73286:34;;73229:111;73383:5;73362:26;;:17;:26;;;73358:102;;;73439:1;73413:8;73422:13;;;;;;73413:23;;;;;;;;:::i;:::-;;;;;;;:27;;;;;73358:102;72997:478;73068:3;;;;;72997:478;;;;73577:11;73567:8;73560:29;73625:8;73618:15;;;;;;;;71139:2513;;;;;;:::o;77276:210::-;77341:11;76306:1;76292:11;:15;76284:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;76378:9;;76363:11;76347:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:40;;76339:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;77374:11:::1;76525;76511;;:25;;;;:::i;:::-;76498:9;:38;;76490:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;77403:6:::2;;;;;;;;;;;77402:7;77394:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;77444:36;77454:12;:10;:12::i;:::-;77468:11;77444:9;:36::i;:::-;76419:1:::1;77276:210:::0;;:::o;40871:234::-;41018:8;40966:18;:39;40985:19;:17;:19::i;:::-;40966:39;;;;;;;;;;;;;;;:49;41006:8;40966:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;41078:8;41042:55;;41057:19;:17;:19::i;:::-;41042:55;;;41088:8;41042:55;;;;;;:::i;:::-;;;;;;;;40871:234;;:::o;75378:26::-;;;;:::o;78646:105::-;13199:12;:10;:12::i;:::-;13188:23;;:7;:5;:7::i;:::-;:23;;;13180:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;78739:6:::1;78716:20;;:29;;;;;;;;;;;;;;;;;;78646:105:::0;:::o;47664:407::-;47839:31;47852:4;47858:2;47862:7;47839:12;:31::i;:::-;47903:1;47885:2;:14;;;:19;47881:183;;47924:56;47955:4;47961:2;47965:7;47974:5;47924:30;:56::i;:::-;47919:145;;48008:40;;;;;;;;;;;;;;47919:145;47881:183;47664:407;;;;:::o;69636:428::-;69720:21;;:::i;:::-;69754:31;;:::i;:::-;69810:15;:13;:15::i;:::-;69800:7;:25;:54;;;;69840:14;:12;:14::i;:::-;69829:7;:25;;69800:54;69796:103;;;69878:9;69871:16;;;;;69796:103;69921:21;69934:7;69921:12;:21::i;:::-;69909:33;;69957:9;:16;;;69953:65;;;69997:9;69990:16;;;;;69953:65;70035:21;70048:7;70035:12;:21::i;:::-;70028:28;;;69636:428;;;;:::o;78243:102::-;13199:12;:10;:12::i;:::-;13188:23;;:7;:5;:7::i;:::-;:23;;;13180:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;78327:12:::1;78313:11;:26;;;;78243:102:::0;:::o;78135:::-;13199:12;:10;:12::i;:::-;13188:23;;:7;:5;:7::i;:::-;:23;;;13180:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;78219:12:::1;78205:11;:26;;;;78135:102:::0;:::o;77756:373::-;77830:13;77860:17;77868:8;77860:7;:17::i;:::-;77852:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;77938:28;77969:10;:8;:10::i;:::-;77938:41;;78024:1;77999:14;77993:28;:32;:130;;;;;;;;;;;;;;;;;78061:14;78077:19;:8;:17;:19::i;:::-;78098:9;78044:64;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;77993:130;77986:137;;;77756:373;;;:::o;75409:24::-;;;;:::o;41262:164::-;41359:4;41383:18;:25;41402:5;41383:25;;;;;;;;;;;;;;;:35;41409:8;41383:35;;;;;;;;;;;;;;;;;;;;;;;;;41376:42;;41262:164;;;;:::o;77494:155::-;77580:11;76306:1;76292:11;:15;76284:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;76378:9;;76363:11;76347:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:40;;76339:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;13199:12:::1;:10;:12::i;:::-;13188:23;;:7;:5;:7::i;:::-;:23;;;13180:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;77610:33:::2;77620:9;77631:11;77610:9;:33::i;:::-;77494:155:::0;;;:::o;13877:201::-;13199:12;:10;:12::i;:::-;13188:23;;:7;:5;:7::i;:::-;:23;;;13180:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;13986:1:::1;13966:22;;:8;:22;;;;13958:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;14042:28;14061:8;14042:18;:28::i;:::-;13877:201:::0;:::o;41684:282::-;41749:4;41805:7;41786:15;:13;:15::i;:::-;:26;;:66;;;;;41839:13;;41829:7;:23;41786:66;:153;;;;;41938:1;25692:8;41890:17;:26;41908:7;41890:26;;;;;;;;;;;;:44;:49;41786:153;41766:173;;41684:282;;;:::o;63992:105::-;64052:7;64079:10;64072:17;;63992:105;:::o;11639:98::-;11692:7;11719:10;11712:17;;11639:98;:::o;77655:95::-;77720:7;77743:1;77736:8;;77655:95;:::o;36370:1275::-;36437:7;36457:12;36472:7;36457:22;;36540:4;36521:15;:13;:15::i;:::-;:23;36517:1061;;36574:13;;36567:4;:20;36563:1015;;;36612:14;36629:17;:23;36647:4;36629:23;;;;;;;;;;;;36612:40;;36746:1;25692:8;36718:6;:24;:29;36714:845;;;37383:113;37400:1;37390:6;:11;37383:113;;;37443:17;:25;37461:6;;;;;;;37443:25;;;;;;;;;;;;37434:34;;37383:113;;;37529:6;37522:13;;;;;;36714:845;36589:989;36563:1015;36517:1061;37606:31;;;;;;;;;;;;;;36370:1275;;;;:::o;42847:485::-;42949:27;42978:23;43019:38;43060:15;:24;43076:7;43060:24;;;;;;;;;;;43019:65;;43237:18;43214:41;;43294:19;43288:26;43269:45;;43199:126;42847:485;;;:::o;42075:659::-;42224:11;42389:16;42382:5;42378:28;42369:37;;42549:16;42538:9;42534:32;42521:45;;42699:15;42688:9;42685:30;42677:5;42666:9;42663:20;42660:56;42650:66;;42075:659;;;;;:::o;48733:159::-;;;;;:::o;63301:311::-;63436:7;63456:16;26096:3;63482:19;:41;;63456:68;;26096:3;63550:31;63561:4;63567:2;63571:9;63550:10;:31::i;:::-;63542:40;;:62;;63535:69;;;63301:311;;;;;:::o;38193:450::-;38273:14;38441:16;38434:5;38430:28;38421:37;;38618:5;38604:11;38579:23;38575:41;38572:52;38565:5;38562:63;38552:73;;38193:450;;;;:::o;49557:158::-;;;;;:::o;14238:191::-;14312:16;14331:6;;;;;;;;;;;14312:25;;14357:8;14348:6;;:17;;;;;;;;;;;;;;;;;;14412:8;14381:40;;14402:8;14381:40;;;;;;;;;;;;14301:128;14238:191;:::o;35818:161::-;35886:21;;:::i;:::-;35927:44;35946:17;:24;35964:5;35946:24;;;;;;;;;;;;35927:18;:44::i;:::-;35920:51;;35818:161;;;:::o;57824:112::-;57901:27;57911:2;57915:8;57901:27;;;;;;;;;;;;:9;:27::i;:::-;57824:112;;:::o;29260:103::-;29315:7;29342:13;;29335:20;;29260:103;:::o;50155:716::-;50318:4;50364:2;50339:45;;;50385:19;:17;:19::i;:::-;50406:4;50412:7;50421:5;50339:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;50335:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50639:1;50622:6;:13;:18;50618:235;;;50668:40;;;;;;;;;;;;;;50618:235;50811:6;50805:13;50796:6;50792:2;50788:15;50781:38;50335:529;50508:54;;;50498:64;;;:6;:64;;;;50491:71;;;50155:716;;;;;;:::o;35556:166::-;35626:21;;:::i;:::-;35667:47;35686:27;35705:7;35686:18;:27::i;:::-;35667:18;:47::i;:::-;35660:54;;35556:166;;;:::o;79363:104::-;79423:13;79452:9;79445:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;79363:104;:::o;451:723::-;507:13;737:1;728:5;:10;724:53;;;755:10;;;;;;;;;;;;;;;;;;;;;724:53;787:12;802:5;787:20;;818:14;843:78;858:1;850:4;:9;843:78;;876:8;;;;;:::i;:::-;;;;907:2;899:10;;;;;:::i;:::-;;;843:78;;;931:19;963:6;953:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;931:39;;981:154;997:1;988:5;:10;981:154;;1025:1;1015:11;;;;;:::i;:::-;;;1092:2;1084:5;:10;;;;:::i;:::-;1071:2;:24;;;;:::i;:::-;1058:39;;1041:6;1048;1041:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1121:2;1112:11;;;;;:::i;:::-;;;981:154;;;1159:6;1145:21;;;;;451:723;;;;:::o;63002:147::-;63139:6;63002:147;;;;;:::o;37744:366::-;37810:31;;:::i;:::-;37887:6;37854:9;:14;;:41;;;;;;;;;;;25575:3;37940:6;:33;;37906:9;:24;;:68;;;;;;;;;;;38032:1;25692:8;38004:6;:24;:29;;37985:9;:16;;:48;;;;;;;;;;;26096:3;38073:6;:28;;38044:9;:19;;:58;;;;;;;;;;;37744:366;;;:::o;57051:689::-;57182:19;57188:2;57192:8;57182:5;:19::i;:::-;57261:1;57243:2;:14;;;:19;57239:483;;57283:11;57297:13;;57283:27;;57329:13;57351:8;57345:3;:14;57329:30;;57378:233;57409:62;57448:1;57452:2;57456:7;;;;;;57465:5;57409:30;:62::i;:::-;57404:167;;57507:40;;;;;;;;;;;;;;57404:167;57606:3;57598:5;:11;57378:233;;57693:3;57676:13;;:20;57672:34;;57698:8;;;57672:34;57264:458;;57239:483;57051:689;;;:::o;51333:2966::-;51406:20;51429:13;;51406:36;;51469:1;51457:8;:13;51453:44;;;51479:18;;;;;;;;;;;;;;51453:44;51510:61;51540:1;51544:2;51548:12;51562:8;51510:21;:61::i;:::-;52054:1;25054:2;52024:1;:26;;52023:32;52011:8;:45;51985:18;:22;52004:2;51985:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;52333:139;52370:2;52424:33;52447:1;52451:2;52455:1;52424:14;:33::i;:::-;52391:30;52412:8;52391:20;:30::i;:::-;:66;52333:18;:139::i;:::-;52299:17;:31;52317:12;52299:31;;;;;;;;;;;:173;;;;52489:16;52520:11;52549:8;52534:12;:23;52520:37;;53070:16;53066:2;53062:25;53050:37;;53442:12;53402:8;53361:1;53299:25;53240:1;53179;53152:335;53813:1;53799:12;53795:20;53753:346;53854:3;53845:7;53842:16;53753:346;;54072:7;54062:8;54059:1;54032:25;54029:1;54026;54021:59;53907:1;53898:7;53894:15;53883:26;;53753:346;;;53757:77;54144:1;54132:8;:13;54128:45;;;54154:19;;;;;;;;;;;;;;54128:45;54206:3;54190:13;:19;;;;51759:2462;;54231:60;54260:1;54264:2;54268:12;54282:8;54231:20;:60::i;:::-;51395:2904;51333:2966;;:::o;38745:324::-;38815:14;39048:1;39038:8;39035:15;39009:24;39005:46;38995:56;;38745:324;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:329::-;4997:6;5046:2;5034:9;5025:7;5021:23;5017:32;5014:119;;;5052:79;;:::i;:::-;5014:119;5172:1;5197:53;5242:7;5233:6;5222:9;5218:22;5197:53;:::i;:::-;5187:63;;5143:117;4938:329;;;;:::o;5273:117::-;5382:1;5379;5372:12;5396:117;5505:1;5502;5495:12;5519:180;5567:77;5564:1;5557:88;5664:4;5661:1;5654:15;5688:4;5685:1;5678:15;5705:281;5788:27;5810:4;5788:27;:::i;:::-;5780:6;5776:40;5918:6;5906:10;5903:22;5882:18;5870:10;5867:34;5864:62;5861:88;;;5929:18;;:::i;:::-;5861:88;5969:10;5965:2;5958:22;5748:238;5705:281;;:::o;5992:129::-;6026:6;6053:20;;:::i;:::-;6043:30;;6082:33;6110:4;6102:6;6082:33;:::i;:::-;5992:129;;;:::o;6127:308::-;6189:4;6279:18;6271:6;6268:30;6265:56;;;6301:18;;:::i;:::-;6265:56;6339:29;6361:6;6339:29;:::i;:::-;6331:37;;6423:4;6417;6413:15;6405:23;;6127:308;;;:::o;6441:154::-;6525:6;6520:3;6515;6502:30;6587:1;6578:6;6573:3;6569:16;6562:27;6441:154;;;:::o;6601:412::-;6679:5;6704:66;6720:49;6762:6;6720:49;:::i;:::-;6704:66;:::i;:::-;6695:75;;6793:6;6786:5;6779:21;6831:4;6824:5;6820:16;6869:3;6860:6;6855:3;6851:16;6848:25;6845:112;;;6876:79;;:::i;:::-;6845:112;6966:41;7000:6;6995:3;6990;6966:41;:::i;:::-;6685:328;6601:412;;;;;:::o;7033:340::-;7089:5;7138:3;7131:4;7123:6;7119:17;7115:27;7105:122;;7146:79;;:::i;:::-;7105:122;7263:6;7250:20;7288:79;7363:3;7355:6;7348:4;7340:6;7336:17;7288:79;:::i;:::-;7279:88;;7095:278;7033:340;;;;:::o;7379:509::-;7448:6;7497:2;7485:9;7476:7;7472:23;7468:32;7465:119;;;7503:79;;:::i;:::-;7465:119;7651:1;7640:9;7636:17;7623:31;7681:18;7673:6;7670:30;7667:117;;;7703:79;;:::i;:::-;7667:117;7808:63;7863:7;7854:6;7843:9;7839:22;7808:63;:::i;:::-;7798:73;;7594:287;7379:509;;;;:::o;7894:116::-;7964:21;7979:5;7964:21;:::i;:::-;7957:5;7954:32;7944:60;;8000:1;7997;7990:12;7944:60;7894:116;:::o;8016:133::-;8059:5;8097:6;8084:20;8075:29;;8113:30;8137:5;8113:30;:::i;:::-;8016:133;;;;:::o;8155:323::-;8211:6;8260:2;8248:9;8239:7;8235:23;8231:32;8228:119;;;8266:79;;:::i;:::-;8228:119;8386:1;8411:50;8453:7;8444:6;8433:9;8429:22;8411:50;:::i;:::-;8401:60;;8357:114;8155:323;;;;:::o;8484:118::-;8571:24;8589:5;8571:24;:::i;:::-;8566:3;8559:37;8484:118;;:::o;8608:222::-;8701:4;8739:2;8728:9;8724:18;8716:26;;8752:71;8820:1;8809:9;8805:17;8796:6;8752:71;:::i;:::-;8608:222;;;;:::o;8836:619::-;8913:6;8921;8929;8978:2;8966:9;8957:7;8953:23;8949:32;8946:119;;;8984:79;;:::i;:::-;8946:119;9104:1;9129:53;9174:7;9165:6;9154:9;9150:22;9129:53;:::i;:::-;9119:63;;9075:117;9231:2;9257:53;9302:7;9293:6;9282:9;9278:22;9257:53;:::i;:::-;9247:63;;9202:118;9359:2;9385:53;9430:7;9421:6;9410:9;9406:22;9385:53;:::i;:::-;9375:63;;9330:118;8836:619;;;;;:::o;9461:117::-;9570:1;9567;9560:12;9584:117;9693:1;9690;9683:12;9724:568;9797:8;9807:6;9857:3;9850:4;9842:6;9838:17;9834:27;9824:122;;9865:79;;:::i;:::-;9824:122;9978:6;9965:20;9955:30;;10008:18;10000:6;9997:30;9994:117;;;10030:79;;:::i;:::-;9994:117;10144:4;10136:6;10132:17;10120:29;;10198:3;10190:4;10182:6;10178:17;10168:8;10164:32;10161:41;10158:128;;;10205:79;;:::i;:::-;10158:128;9724:568;;;;;:::o;10298:559::-;10384:6;10392;10441:2;10429:9;10420:7;10416:23;10412:32;10409:119;;;10447:79;;:::i;:::-;10409:119;10595:1;10584:9;10580:17;10567:31;10625:18;10617:6;10614:30;10611:117;;;10647:79;;:::i;:::-;10611:117;10760:80;10832:7;10823:6;10812:9;10808:22;10760:80;:::i;:::-;10742:98;;;;10538:312;10298:559;;;;;:::o;10863:145::-;10961:6;10995:5;10989:12;10979:22;;10863:145;;;:::o;11014:215::-;11144:11;11178:6;11173:3;11166:19;11218:4;11213:3;11209:14;11194:29;;11014:215;;;;:::o;11235:163::-;11333:4;11356:3;11348:11;;11386:4;11381:3;11377:14;11369:22;;11235:163;;;:::o;11404:108::-;11481:24;11499:5;11481:24;:::i;:::-;11476:3;11469:37;11404:108;;:::o;11518:101::-;11554:7;11594:18;11587:5;11583:30;11572:41;;11518:101;;;:::o;11625:105::-;11700:23;11717:5;11700:23;:::i;:::-;11695:3;11688:36;11625:105;;:::o;11736:99::-;11807:21;11822:5;11807:21;:::i;:::-;11802:3;11795:34;11736:99;;:::o;11841:91::-;11877:7;11917:8;11910:5;11906:20;11895:31;;11841:91;;;:::o;11938:105::-;12013:23;12030:5;12013:23;:::i;:::-;12008:3;12001:36;11938:105;;:::o;12121:864::-;12270:4;12265:3;12261:14;12357:4;12350:5;12346:16;12340:23;12376:63;12433:4;12428:3;12424:14;12410:12;12376:63;:::i;:::-;12285:164;12541:4;12534:5;12530:16;12524:23;12560:61;12615:4;12610:3;12606:14;12592:12;12560:61;:::i;:::-;12459:172;12715:4;12708:5;12704:16;12698:23;12734:57;12785:4;12780:3;12776:14;12762:12;12734:57;:::i;:::-;12641:160;12888:4;12881:5;12877:16;12871:23;12907:61;12962:4;12957:3;12953:14;12939:12;12907:61;:::i;:::-;12811:167;12239:746;12121:864;;:::o;12991:303::-;13122:10;13143:108;13247:3;13239:6;13143:108;:::i;:::-;13283:4;13278:3;13274:14;13260:28;;12991:303;;;;:::o;13300:144::-;13401:4;13433;13428:3;13424:14;13416:22;;13300:144;;;:::o;13526:980::-;13707:3;13736:85;13815:5;13736:85;:::i;:::-;13837:117;13947:6;13942:3;13837:117;:::i;:::-;13830:124;;13978:87;14059:5;13978:87;:::i;:::-;14088:7;14119:1;14104:377;14129:6;14126:1;14123:13;14104:377;;;14205:6;14199:13;14232:125;14353:3;14338:13;14232:125;:::i;:::-;14225:132;;14380:91;14464:6;14380:91;:::i;:::-;14370:101;;14164:317;14151:1;14148;14144:9;14139:14;;14104:377;;;14108:14;14497:3;14490:10;;13712:794;;;13526:980;;;;:::o;14512:497::-;14717:4;14755:2;14744:9;14740:18;14732:26;;14804:9;14798:4;14794:20;14790:1;14779:9;14775:17;14768:47;14832:170;14997:4;14988:6;14832:170;:::i;:::-;14824:178;;14512:497;;;;:::o;15015:114::-;15082:6;15116:5;15110:12;15100:22;;15015:114;;;:::o;15135:184::-;15234:11;15268:6;15263:3;15256:19;15308:4;15303:3;15299:14;15284:29;;15135:184;;;;:::o;15325:132::-;15392:4;15415:3;15407:11;;15445:4;15440:3;15436:14;15428:22;;15325:132;;;:::o;15463:108::-;15540:24;15558:5;15540:24;:::i;:::-;15535:3;15528:37;15463:108;;:::o;15577:179::-;15646:10;15667:46;15709:3;15701:6;15667:46;:::i;:::-;15745:4;15740:3;15736:14;15722:28;;15577:179;;;;:::o;15762:113::-;15832:4;15864;15859:3;15855:14;15847:22;;15762:113;;;:::o;15911:732::-;16030:3;16059:54;16107:5;16059:54;:::i;:::-;16129:86;16208:6;16203:3;16129:86;:::i;:::-;16122:93;;16239:56;16289:5;16239:56;:::i;:::-;16318:7;16349:1;16334:284;16359:6;16356:1;16353:13;16334:284;;;16435:6;16429:13;16462:63;16521:3;16506:13;16462:63;:::i;:::-;16455:70;;16548:60;16601:6;16548:60;:::i;:::-;16538:70;;16394:224;16381:1;16378;16374:9;16369:14;;16334:284;;;16338:14;16634:3;16627:10;;16035:608;;;15911:732;;;;:::o;16649:373::-;16792:4;16830:2;16819:9;16815:18;16807:26;;16879:9;16873:4;16869:20;16865:1;16854:9;16850:17;16843:47;16907:108;17010:4;17001:6;16907:108;:::i;:::-;16899:116;;16649:373;;;;:::o;17028:619::-;17105:6;17113;17121;17170:2;17158:9;17149:7;17145:23;17141:32;17138:119;;;17176:79;;:::i;:::-;17138:119;17296:1;17321:53;17366:7;17357:6;17346:9;17342:22;17321:53;:::i;:::-;17311:63;;17267:117;17423:2;17449:53;17494:7;17485:6;17474:9;17470:22;17449:53;:::i;:::-;17439:63;;17394:118;17551:2;17577:53;17622:7;17613:6;17602:9;17598:22;17577:53;:::i;:::-;17567:63;;17522:118;17028:619;;;;;:::o;17653:468::-;17718:6;17726;17775:2;17763:9;17754:7;17750:23;17746:32;17743:119;;;17781:79;;:::i;:::-;17743:119;17901:1;17926:53;17971:7;17962:6;17951:9;17947:22;17926:53;:::i;:::-;17916:63;;17872:117;18028:2;18054:50;18096:7;18087:6;18076:9;18072:22;18054:50;:::i;:::-;18044:60;;17999:115;17653:468;;;;;:::o;18127:307::-;18188:4;18278:18;18270:6;18267:30;18264:56;;;18300:18;;:::i;:::-;18264:56;18338:29;18360:6;18338:29;:::i;:::-;18330:37;;18422:4;18416;18412:15;18404:23;;18127:307;;;:::o;18440:410::-;18517:5;18542:65;18558:48;18599:6;18558:48;:::i;:::-;18542:65;:::i;:::-;18533:74;;18630:6;18623:5;18616:21;18668:4;18661:5;18657:16;18706:3;18697:6;18692:3;18688:16;18685:25;18682:112;;;18713:79;;:::i;:::-;18682:112;18803:41;18837:6;18832:3;18827;18803:41;:::i;:::-;18523:327;18440:410;;;;;:::o;18869:338::-;18924:5;18973:3;18966:4;18958:6;18954:17;18950:27;18940:122;;18981:79;;:::i;:::-;18940:122;19098:6;19085:20;19123:78;19197:3;19189:6;19182:4;19174:6;19170:17;19123:78;:::i;:::-;19114:87;;18930:277;18869:338;;;;:::o;19213:943::-;19308:6;19316;19324;19332;19381:3;19369:9;19360:7;19356:23;19352:33;19349:120;;;19388:79;;:::i;:::-;19349:120;19508:1;19533:53;19578:7;19569:6;19558:9;19554:22;19533:53;:::i;:::-;19523:63;;19479:117;19635:2;19661:53;19706:7;19697:6;19686:9;19682:22;19661:53;:::i;:::-;19651:63;;19606:118;19763:2;19789:53;19834:7;19825:6;19814:9;19810:22;19789:53;:::i;:::-;19779:63;;19734:118;19919:2;19908:9;19904:18;19891:32;19950:18;19942:6;19939:30;19936:117;;;19972:79;;:::i;:::-;19936:117;20077:62;20131:7;20122:6;20111:9;20107:22;20077:62;:::i;:::-;20067:72;;19862:287;19213:943;;;;;;;:::o;20234:874::-;20393:4;20388:3;20384:14;20480:4;20473:5;20469:16;20463:23;20499:63;20556:4;20551:3;20547:14;20533:12;20499:63;:::i;:::-;20408:164;20664:4;20657:5;20653:16;20647:23;20683:61;20738:4;20733:3;20729:14;20715:12;20683:61;:::i;:::-;20582:172;20838:4;20831:5;20827:16;20821:23;20857:57;20908:4;20903:3;20899:14;20885:12;20857:57;:::i;:::-;20764:160;21011:4;21004:5;21000:16;20994:23;21030:61;21085:4;21080:3;21076:14;21062:12;21030:61;:::i;:::-;20934:167;20362:746;20234:874;;:::o;21114:347::-;21269:4;21307:3;21296:9;21292:19;21284:27;;21321:133;21451:1;21440:9;21436:17;21427:6;21321:133;:::i;:::-;21114:347;;;;:::o;21467:474::-;21535:6;21543;21592:2;21580:9;21571:7;21567:23;21563:32;21560:119;;;21598:79;;:::i;:::-;21560:119;21718:1;21743:53;21788:7;21779:6;21768:9;21764:22;21743:53;:::i;:::-;21733:63;;21689:117;21845:2;21871:53;21916:7;21907:6;21896:9;21892:22;21871:53;:::i;:::-;21861:63;;21816:118;21467:474;;;;;:::o;21947:::-;22015:6;22023;22072:2;22060:9;22051:7;22047:23;22043:32;22040:119;;;22078:79;;:::i;:::-;22040:119;22198:1;22223:53;22268:7;22259:6;22248:9;22244:22;22223:53;:::i;:::-;22213:63;;22169:117;22325:2;22351:53;22396:7;22387:6;22376:9;22372:22;22351:53;:::i;:::-;22341:63;;22296:118;21947:474;;;;;:::o;22427:180::-;22475:77;22472:1;22465:88;22572:4;22569:1;22562:15;22596:4;22593:1;22586:15;22613:320;22657:6;22694:1;22688:4;22684:12;22674:22;;22741:1;22735:4;22731:12;22762:18;22752:81;;22818:4;22810:6;22806:17;22796:27;;22752:81;22880:2;22872:6;22869:14;22849:18;22846:38;22843:84;;;22899:18;;:::i;:::-;22843:84;22664:269;22613:320;;;:::o;22939:143::-;22996:5;23027:6;23021:13;23012:22;;23043:33;23070:5;23043:33;:::i;:::-;22939:143;;;;:::o;23088:351::-;23158:6;23207:2;23195:9;23186:7;23182:23;23178:32;23175:119;;;23213:79;;:::i;:::-;23175:119;23333:1;23358:64;23414:7;23405:6;23394:9;23390:22;23358:64;:::i;:::-;23348:74;;23304:128;23088:351;;;;:::o;23445:182::-;23585:34;23581:1;23573:6;23569:14;23562:58;23445:182;:::o;23633:366::-;23775:3;23796:67;23860:2;23855:3;23796:67;:::i;:::-;23789:74;;23872:93;23961:3;23872:93;:::i;:::-;23990:2;23985:3;23981:12;23974:19;;23633:366;;;:::o;24005:419::-;24171:4;24209:2;24198:9;24194:18;24186:26;;24258:9;24252:4;24248:20;24244:1;24233:9;24229:17;24222:47;24286:131;24412:4;24286:131;:::i;:::-;24278:139;;24005:419;;;:::o;24430:181::-;24570:33;24566:1;24558:6;24554:14;24547:57;24430:181;:::o;24617:366::-;24759:3;24780:67;24844:2;24839:3;24780:67;:::i;:::-;24773:74;;24856:93;24945:3;24856:93;:::i;:::-;24974:2;24969:3;24965:12;24958:19;;24617:366;;;:::o;24989:419::-;25155:4;25193:2;25182:9;25178:18;25170:26;;25242:9;25236:4;25232:20;25228:1;25217:9;25213:17;25206:47;25270:131;25396:4;25270:131;:::i;:::-;25262:139;;24989:419;;;:::o;25414:147::-;25515:11;25552:3;25537:18;;25414:147;;;;:::o;25567:114::-;;:::o;25687:398::-;25846:3;25867:83;25948:1;25943:3;25867:83;:::i;:::-;25860:90;;25959:93;26048:3;25959:93;:::i;:::-;26077:1;26072:3;26068:11;26061:18;;25687:398;;;:::o;26091:379::-;26275:3;26297:147;26440:3;26297:147;:::i;:::-;26290:154;;26461:3;26454:10;;26091:379;;;:::o;26476:180::-;26524:77;26521:1;26514:88;26621:4;26618:1;26611:15;26645:4;26642:1;26635:15;26662:170;26802:22;26798:1;26790:6;26786:14;26779:46;26662:170;:::o;26838:366::-;26980:3;27001:67;27065:2;27060:3;27001:67;:::i;:::-;26994:74;;27077:93;27166:3;27077:93;:::i;:::-;27195:2;27190:3;27186:12;27179:19;;26838:366;;;:::o;27210:419::-;27376:4;27414:2;27403:9;27399:18;27391:26;;27463:9;27457:4;27453:20;27449:1;27438:9;27434:17;27427:47;27491:131;27617:4;27491:131;:::i;:::-;27483:139;;27210:419;;;:::o;27635:180::-;27683:77;27680:1;27673:88;27780:4;27777:1;27770:15;27804:4;27801:1;27794:15;27821:305;27861:3;27880:20;27898:1;27880:20;:::i;:::-;27875:25;;27914:20;27932:1;27914:20;:::i;:::-;27909:25;;28068:1;28000:66;27996:74;27993:1;27990:81;27987:107;;;28074:18;;:::i;:::-;27987:107;28118:1;28115;28111:9;28104:16;;27821:305;;;;:::o;28132:170::-;28272:22;28268:1;28260:6;28256:14;28249:46;28132:170;:::o;28308:366::-;28450:3;28471:67;28535:2;28530:3;28471:67;:::i;:::-;28464:74;;28547:93;28636:3;28547:93;:::i;:::-;28665:2;28660:3;28656:12;28649:19;;28308:366;;;:::o;28680:419::-;28846:4;28884:2;28873:9;28869:18;28861:26;;28933:9;28927:4;28923:20;28919:1;28908:9;28904:17;28897:47;28961:131;29087:4;28961:131;:::i;:::-;28953:139;;28680:419;;;:::o;29105:172::-;29245:24;29241:1;29233:6;29229:14;29222:48;29105:172;:::o;29283:366::-;29425:3;29446:67;29510:2;29505:3;29446:67;:::i;:::-;29439:74;;29522:93;29611:3;29522:93;:::i;:::-;29640:2;29635:3;29631:12;29624:19;;29283:366;;;:::o;29655:419::-;29821:4;29859:2;29848:9;29844:18;29836:26;;29908:9;29902:4;29898:20;29894:1;29883:9;29879:17;29872:47;29936:131;30062:4;29936:131;:::i;:::-;29928:139;;29655:419;;;:::o;30080:221::-;30220:34;30216:1;30208:6;30204:14;30197:58;30289:4;30284:2;30276:6;30272:15;30265:29;30080:221;:::o;30307:366::-;30449:3;30470:67;30534:2;30529:3;30470:67;:::i;:::-;30463:74;;30546:93;30635:3;30546:93;:::i;:::-;30664:2;30659:3;30655:12;30648:19;;30307:366;;;:::o;30679:419::-;30845:4;30883:2;30872:9;30868:18;30860:26;;30932:9;30926:4;30922:20;30918:1;30907:9;30903:17;30896:47;30960:131;31086:4;30960:131;:::i;:::-;30952:139;;30679:419;;;:::o;31104:348::-;31144:7;31167:20;31185:1;31167:20;:::i;:::-;31162:25;;31201:20;31219:1;31201:20;:::i;:::-;31196:25;;31389:1;31321:66;31317:74;31314:1;31311:81;31306:1;31299:9;31292:17;31288:105;31285:131;;;31396:18;;:::i;:::-;31285:131;31444:1;31441;31437:9;31426:20;;31104:348;;;;:::o;31458:169::-;31598:21;31594:1;31586:6;31582:14;31575:45;31458:169;:::o;31633:366::-;31775:3;31796:67;31860:2;31855:3;31796:67;:::i;:::-;31789:74;;31872:93;31961:3;31872:93;:::i;:::-;31990:2;31985:3;31981:12;31974:19;;31633:366;;;:::o;32005:419::-;32171:4;32209:2;32198:9;32194:18;32186:26;;32258:9;32252:4;32248:20;32244:1;32233:9;32229:17;32222:47;32286:131;32412:4;32286:131;:::i;:::-;32278:139;;32005:419;;;:::o;32430:173::-;32570:25;32566:1;32558:6;32554:14;32547:49;32430:173;:::o;32609:366::-;32751:3;32772:67;32836:2;32831:3;32772:67;:::i;:::-;32765:74;;32848:93;32937:3;32848:93;:::i;:::-;32966:2;32961:3;32957:12;32950:19;;32609:366;;;:::o;32981:419::-;33147:4;33185:2;33174:9;33170:18;33162:26;;33234:9;33228:4;33224:20;33220:1;33209:9;33205:17;33198:47;33262:131;33388:4;33262:131;:::i;:::-;33254:139;;32981:419;;;:::o;33406:234::-;33546:34;33542:1;33534:6;33530:14;33523:58;33615:17;33610:2;33602:6;33598:15;33591:42;33406:234;:::o;33646:366::-;33788:3;33809:67;33873:2;33868:3;33809:67;:::i;:::-;33802:74;;33885:93;33974:3;33885:93;:::i;:::-;34003:2;33998:3;33994:12;33987:19;;33646:366;;;:::o;34018:419::-;34184:4;34222:2;34211:9;34207:18;34199:26;;34271:9;34265:4;34261:20;34257:1;34246:9;34242:17;34235:47;34299:131;34425:4;34299:131;:::i;:::-;34291:139;;34018:419;;;:::o;34443:148::-;34545:11;34582:3;34567:18;;34443:148;;;;:::o;34597:377::-;34703:3;34731:39;34764:5;34731:39;:::i;:::-;34786:89;34868:6;34863:3;34786:89;:::i;:::-;34779:96;;34884:52;34929:6;34924:3;34917:4;34910:5;34906:16;34884:52;:::i;:::-;34961:6;34956:3;34952:16;34945:23;;34707:267;34597:377;;;;:::o;34980:141::-;35029:4;35052:3;35044:11;;35075:3;35072:1;35065:14;35109:4;35106:1;35096:18;35088:26;;34980:141;;;:::o;35151:845::-;35254:3;35291:5;35285:12;35320:36;35346:9;35320:36;:::i;:::-;35372:89;35454:6;35449:3;35372:89;:::i;:::-;35365:96;;35492:1;35481:9;35477:17;35508:1;35503:137;;;;35654:1;35649:341;;;;35470:520;;35503:137;35587:4;35583:9;35572;35568:25;35563:3;35556:38;35623:6;35618:3;35614:16;35607:23;;35503:137;;35649:341;35716:38;35748:5;35716:38;:::i;:::-;35776:1;35790:154;35804:6;35801:1;35798:13;35790:154;;;35878:7;35872:14;35868:1;35863:3;35859:11;35852:35;35928:1;35919:7;35915:15;35904:26;;35826:4;35823:1;35819:12;35814:17;;35790:154;;;35973:6;35968:3;35964:16;35957:23;;35656:334;;35470:520;;35258:738;;35151:845;;;;:::o;36002:589::-;36227:3;36249:95;36340:3;36331:6;36249:95;:::i;:::-;36242:102;;36361:95;36452:3;36443:6;36361:95;:::i;:::-;36354:102;;36473:92;36561:3;36552:6;36473:92;:::i;:::-;36466:99;;36582:3;36575:10;;36002:589;;;;;;:::o;36597:225::-;36737:34;36733:1;36725:6;36721:14;36714:58;36806:8;36801:2;36793:6;36789:15;36782:33;36597:225;:::o;36828:366::-;36970:3;36991:67;37055:2;37050:3;36991:67;:::i;:::-;36984:74;;37067:93;37156:3;37067:93;:::i;:::-;37185:2;37180:3;37176:12;37169:19;;36828:366;;;:::o;37200:419::-;37366:4;37404:2;37393:9;37389:18;37381:26;;37453:9;37447:4;37443:20;37439:1;37428:9;37424:17;37417:47;37481:131;37607:4;37481:131;:::i;:::-;37473:139;;37200:419;;;:::o;37625:98::-;37676:6;37710:5;37704:12;37694:22;;37625:98;;;:::o;37729:168::-;37812:11;37846:6;37841:3;37834:19;37886:4;37881:3;37877:14;37862:29;;37729:168;;;;:::o;37903:360::-;37989:3;38017:38;38049:5;38017:38;:::i;:::-;38071:70;38134:6;38129:3;38071:70;:::i;:::-;38064:77;;38150:52;38195:6;38190:3;38183:4;38176:5;38172:16;38150:52;:::i;:::-;38227:29;38249:6;38227:29;:::i;:::-;38222:3;38218:39;38211:46;;37993:270;37903:360;;;;:::o;38269:640::-;38464:4;38502:3;38491:9;38487:19;38479:27;;38516:71;38584:1;38573:9;38569:17;38560:6;38516:71;:::i;:::-;38597:72;38665:2;38654:9;38650:18;38641:6;38597:72;:::i;:::-;38679;38747:2;38736:9;38732:18;38723:6;38679:72;:::i;:::-;38798:9;38792:4;38788:20;38783:2;38772:9;38768:18;38761:48;38826:76;38897:4;38888:6;38826:76;:::i;:::-;38818:84;;38269:640;;;;;;;:::o;38915:141::-;38971:5;39002:6;38996:13;38987:22;;39018:32;39044:5;39018:32;:::i;:::-;38915:141;;;;:::o;39062:349::-;39131:6;39180:2;39168:9;39159:7;39155:23;39151:32;39148:119;;;39186:79;;:::i;:::-;39148:119;39306:1;39331:63;39386:7;39377:6;39366:9;39362:22;39331:63;:::i;:::-;39321:73;;39277:127;39062:349;;;;:::o;39417:233::-;39456:3;39479:24;39497:5;39479:24;:::i;:::-;39470:33;;39525:66;39518:5;39515:77;39512:103;;;39595:18;;:::i;:::-;39512:103;39642:1;39635:5;39631:13;39624:20;;39417:233;;;:::o;39656:180::-;39704:77;39701:1;39694:88;39801:4;39798:1;39791:15;39825:4;39822:1;39815:15;39842:185;39882:1;39899:20;39917:1;39899:20;:::i;:::-;39894:25;;39933:20;39951:1;39933:20;:::i;:::-;39928:25;;39972:1;39962:35;;39977:18;;:::i;:::-;39962:35;40019:1;40016;40012:9;40007:14;;39842:185;;;;:::o;40033:191::-;40073:4;40093:20;40111:1;40093:20;:::i;:::-;40088:25;;40127:20;40145:1;40127:20;:::i;:::-;40122:25;;40166:1;40163;40160:8;40157:34;;;40171:18;;:::i;:::-;40157:34;40216:1;40213;40209:9;40201:17;;40033:191;;;;:::o;40230:176::-;40262:1;40279:20;40297:1;40279:20;:::i;:::-;40274:25;;40313:20;40331:1;40313:20;:::i;:::-;40308:25;;40352:1;40342:35;;40357:18;;:::i;:::-;40342:35;40398:1;40395;40391:9;40386:14;;40230:176;;;;:::o
Swarm Source
ipfs://dd46f723963a1a271c3c75d34466e0acd16135e30b40eebc4c77efc2fba5ef26
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.