ERC-721
Overview
Max Total Supply
10,000 BAGC
Holders
505
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
3 BAGCLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
ApeGalacticClubMint
Compiler Version
v0.8.15+commit.e14f2714
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-08-26 */ // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts (last updated v4.7.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`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/contracts/token/ERC721/ERC721.sol // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: address zero is not a valid owner"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: invalid token ID"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { _requireMinted(tokenId); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not token owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { _requireMinted(tokenId); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner nor approved"); _safeTransfer(from, to, tokenId, data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { address owner = ERC721.ownerOf(tokenId); return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits an {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits an {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Reverts if the `tokenId` has not been minted yet. */ function _requireMinted(uint256 tokenId) internal view virtual { require(_exists(tokenId), "ERC721: invalid token ID"); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { /// @solidity memory-safe-assembly assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } // File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } // File: erc721a/contracts/ERC721A.sol pragma solidity ^0.8.10; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata and Enumerable extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at 0 (e.g. 0, 1, 2, 3..). * * Assumes the number of issuable tokens (collection size) is capped and fits in a uint128. * * Does not support burning tokens to address(0). */ contract ERC721A is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable { using Address for address; using Strings for uint256; struct TokenOwnership { address addr; uint64 startTimestamp; } struct AddressData { uint128 balance; uint128 numberMinted; } uint256 private currentIndex = 0; uint256 internal immutable collectionSize; uint256 internal immutable maxBatchSize; // 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 ownershipOf implementation for details. mapping(uint256 => TokenOwnership) private _ownerships; // Mapping owner address to address data mapping(address => AddressData) private _addressData; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev * `maxBatchSize` refers to how much a minter can mint at a time. * `collectionSize_` refers to how many tokens are in the collection. */ constructor( string memory name_, string memory symbol_, uint256 maxBatchSize_, uint256 collectionSize_ ) { require( collectionSize_ > 0, "ERC721A: collection must have a nonzero supply" ); require(maxBatchSize_ > 0, "ERC721A: max batch size must be nonzero"); _name = name_; _symbol = symbol_; maxBatchSize = maxBatchSize_; collectionSize = collectionSize_; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view override returns (uint256) { return currentIndex; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view override returns (uint256) { require(index < totalSupply(), "ERC721A: global index out of bounds"); return index; } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. * This read function is O(collectionSize). If calling from a separate contract, be sure to test gas first. * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256) { require(index < balanceOf(owner), "ERC721A: owner index out of bounds"); uint256 numMintedSoFar = totalSupply(); uint256 tokenIdsIdx = 0; address currOwnershipAddr = address(0); for (uint256 i = 0; i < numMintedSoFar; i++) { TokenOwnership memory ownership = _ownerships[i]; if (ownership.addr != address(0)) { currOwnershipAddr = ownership.addr; } if (currOwnershipAddr == owner) { if (tokenIdsIdx == index) { return i; } tokenIdsIdx++; } } revert("ERC721A: unable to get token of owner by index"); } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view override returns (uint256) { require(owner != address(0), "ERC721A: balance query for the zero address"); return uint256(_addressData[owner].balance); } function _numberMinted(address owner) internal view returns (uint256) { require( owner != address(0), "ERC721A: number minted query for the zero address" ); return uint256(_addressData[owner].numberMinted); } function ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { require(_exists(tokenId), "ERC721A: owner query for nonexistent token"); uint256 lowestTokenToCheck; if (tokenId >= maxBatchSize) { lowestTokenToCheck = tokenId - maxBatchSize + 1; } for (uint256 curr = tokenId; curr >= lowestTokenToCheck; curr--) { TokenOwnership memory ownership = _ownerships[curr]; if (ownership.addr != address(0)) { return ownership; } } revert("ERC721A: unable to determine the owner of token"); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return ownershipOf(tokenId).addr; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require( _exists(tokenId), "ERC721Metadata: URI query for nonexistent token" ); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public override { address owner = ERC721A.ownerOf(tokenId); require(to != owner, "ERC721A: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721A: approve caller is not owner nor approved for all" ); _approve(to, tokenId, owner); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { require(_exists(tokenId), "ERC721A: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public override { require(operator != _msgSender(), "ERC721A: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public override { _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public override { _transfer(from, to, tokenId); require( _checkOnERC721Received(from, to, tokenId, _data), "ERC721A: transfer to non ERC721Receiver implementer" ); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), */ function _exists(uint256 tokenId) internal view returns (bool) { return tokenId < currentIndex; } function _safeMint(address to, uint256 quantity) internal { _safeMint(to, quantity, ""); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - there must be `quantity` tokens remaining unminted in the total collection. * - `to` cannot be the zero address. * - `quantity` cannot be larger than the max batch size. * * Emits a {Transfer} event. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { uint256 startTokenId = currentIndex; require(to != address(0), "ERC721A: mint to the zero address"); // We know if the first token in the batch doesn't exist, the other ones don't as well, because of serial ordering. require(!_exists(startTokenId), "ERC721A: token already minted"); require(quantity <= maxBatchSize, "ERC721A: quantity to mint too high"); _beforeTokenTransfers(address(0), to, startTokenId, quantity); AddressData memory addressData = _addressData[to]; _addressData[to] = AddressData( addressData.balance + uint128(quantity), addressData.numberMinted + uint128(quantity) ); _ownerships[startTokenId] = TokenOwnership(to, uint64(block.timestamp)); uint256 updatedIndex = startTokenId; for (uint256 i = 0; i < quantity; i++) { emit Transfer(address(0), to, updatedIndex); require( _checkOnERC721Received(address(0), to, updatedIndex, _data), "ERC721A: transfer to non ERC721Receiver implementer" ); updatedIndex++; } currentIndex = updatedIndex; _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) private { TokenOwnership memory prevOwnership = ownershipOf(tokenId); bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr || getApproved(tokenId) == _msgSender() || isApprovedForAll(prevOwnership.addr, _msgSender())); require( isApprovedOrOwner, "ERC721A: transfer caller is not owner nor approved" ); require( prevOwnership.addr == from, "ERC721A: transfer from incorrect owner" ); require(to != address(0), "ERC721A: transfer to the zero address"); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, prevOwnership.addr); _addressData[from].balance -= 1; _addressData[to].balance += 1; _ownerships[tokenId] = TokenOwnership(to, uint64(block.timestamp)); // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; if (_ownerships[nextTokenId].addr == address(0)) { if (_exists(nextTokenId)) { _ownerships[nextTokenId] = TokenOwnership( prevOwnership.addr, prevOwnership.startTimestamp ); } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve( address to, uint256 tokenId, address owner ) private { _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } uint256 public nextOwnerToExplicitlySet = 0; /** * @dev Explicitly set `owners` to eliminate loops in future calls of ownerOf(). */ function _setOwnersExplicit(uint256 quantity) internal { uint256 oldNextOwnerToSet = nextOwnerToExplicitlySet; require(quantity > 0, "quantity must be nonzero"); uint256 endIndex = oldNextOwnerToSet + quantity - 1; if (endIndex > collectionSize - 1) { endIndex = collectionSize - 1; } // We know if the last one in the group exists, all in the group exist, due to serial ordering. require(_exists(endIndex), "not enough minted yet for this cleanup"); for (uint256 i = oldNextOwnerToSet; i <= endIndex; i++) { if (_ownerships[i].addr == address(0)) { TokenOwnership memory ownership = ownershipOf(i); _ownerships[i] = TokenOwnership( ownership.addr, ownership.startTimestamp ); } } nextOwnerToExplicitlySet = endIndex + 1; } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721A: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting. * * 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`. */ 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. * * 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` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} } // File: ApeGalacticClubMint.sol pragma solidity 0.8.15; contract ApeGalacticClubMint is ERC721A, Ownable { using Strings for uint256; string private baseURI; string public baseExtension = ".json"; uint256 public cost = 5000000000000000 wei; /// 0.005 eth uint256 public maxFreeMintAmount = 10; uint256 public maxPayMintAmount = 50; uint256 public teamMintAmount = 100; uint256 constant public MAX_BATCH_SIZE = 100; uint256 constant public MAX_SUPPLY = 10000; uint256 public freeSupply = 2500; uint256 public contributorProfit = 75; // 7.5% uint256 public developerProfit = 15; // 1.5% address public ownerAddress = 0xEe2Cf9b7A9B97BF9FE8d9aD32F8e498d3257Fc4F; address public contributorAddress = 0xc3C891b96AFa15ABa58b7D91359f76DCA77fc427; address public developerAddress = 0x0c04Cb6BB940ed395B4C69e4f5CA9b2Ad3A8e57B; bool public paused = false; bool public teamMinted = false; uint public preSaleDate = 1661561700; uint public publicSaleDate = preSaleDate + 300; mapping(address => uint256) public freeMintPerWallet; mapping(address => bool) public whitelisted; constructor(string memory _initBaseURI) ERC721A("Bored Ape Galactic Club", "BAGC", MAX_BATCH_SIZE, MAX_SUPPLY) { setBaseURI(_initBaseURI); } // internal function _baseURI() internal view virtual override returns (string memory) { return baseURI; } function teamMint() public payable onlyOwner { require(!paused, "Paused"); require(!teamMinted, "Already minted"); uint256 supply = totalSupply(); require(supply + teamMintAmount <= freeSupply, "Max free supply exceeded"); _safeMint(msg.sender, teamMintAmount); teamMinted = true; } function freeMint() public payable { require(!paused, "Paused"); uint currentTime = block.timestamp; require(currentTime >= publicSaleDate || (currentTime >= preSaleDate && whitelisted[msg.sender]), "Not allowed to mint"); require(freeMintPerWallet[msg.sender] <= maxFreeMintAmount, "Amount exceeded"); uint256 supply = totalSupply(); require(supply < freeSupply, "Max free supply exceeded"); uint256 mintAmount = (supply + maxFreeMintAmount <= freeSupply ? maxFreeMintAmount : freeSupply - supply); _safeMint(msg.sender, mintAmount); freeMintPerWallet[msg.sender] += mintAmount; } function mint(uint256 amount) public payable { require(!paused, "Paused"); uint currentTime = block.timestamp; require(currentTime >= publicSaleDate || (currentTime >= preSaleDate && whitelisted[msg.sender]), "Not allowed to mint"); require(amount > 0, "Amount can't be zero"); require(amount <= maxPayMintAmount, "Amount exceeded"); uint256 supply = totalSupply(); require(supply >= freeSupply, "Free mint isn't finished"); require(supply + amount <= MAX_SUPPLY, "Max supply exceeded"); require(msg.value >= cost * amount, "Insufficient funds"); _safeMint(msg.sender, amount); uint256 contributorFee = address(this).balance * contributorProfit / 1000; uint256 developerFee = address(this).balance * developerProfit / 1000; payable(contributorAddress).transfer(contributorFee); payable(developerAddress).transfer(developerFee); payable(ownerAddress).transfer(address(this).balance); } function walletOfOwner(address _owner) public view returns (uint256[] memory) { uint256 ownerTokenCount = balanceOf(_owner); uint256[] memory tokenIds = new uint256[](ownerTokenCount); for (uint256 i; i < ownerTokenCount; i++) { tokenIds[i] = tokenOfOwnerByIndex(_owner, i); } return tokenIds; } function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require( _exists(tokenId), "Does not exist." ); string memory currentBaseURI = _baseURI(); return bytes(currentBaseURI).length > 0 ? string( abi.encodePacked( currentBaseURI, tokenId.toString(), baseExtension ) ) : ""; } function setCost(uint256 _newCost) public onlyOwner { cost = _newCost; } function getMintCost() external view returns (uint256) { return cost; } function setMaxFreeMintAmount(uint256 _newAmount) public onlyOwner { maxFreeMintAmount = _newAmount; } function setMaxPayMintAmount(uint256 _newAmount) public onlyOwner { maxPayMintAmount = _newAmount; } function setFreeSupply(uint256 _newSupply) public onlyOwner { freeSupply = _newSupply; } function setContributorProfit(uint256 _newProfit) public onlyOwner { contributorProfit = _newProfit; } function setDeveloperProfit(uint256 _newProfit) public onlyOwner { developerProfit = _newProfit; } function setOwnerAddress(address _newAddress) public onlyOwner { ownerAddress = _newAddress; } function setContributorAddress(address _newAddress) public onlyOwner { contributorAddress = _newAddress; } function setDeveloperAddress(address _newAddress) public onlyOwner { developerAddress = _newAddress; } function setBaseURI(string memory _newURI) public onlyOwner { baseURI = _newURI; } function setPaused(bool _newPaused) public onlyOwner { paused = _newPaused; } function getPaused() external view returns (bool) { return paused; } function setWhitelistAddresses(address[] memory addresses) public onlyOwner { for (uint i = 0; i < addresses.length; i++) { whitelisted[addresses[i]] = true; } } function setWhitelisted(address _address, bool _whitelisted) public onlyOwner { whitelisted[_address] = _whitelisted; } function getPreSaleDate() external view returns (uint) { return preSaleDate; } function setPreSaleDate(uint _newDate) public onlyOwner { preSaleDate = _newDate; } function getPublicSaleDate() external view returns (uint) { return publicSaleDate; } function setPublicSaleDate(uint _newDate) public onlyOwner { publicSaleDate = _newDate; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"_initBaseURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_BATCH_SIZE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contributorAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contributorProfit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"developerAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"developerProfit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"freeMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"freeMintPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"freeSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMintCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPreSaleDate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPublicSaleDate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"maxFreeMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPayMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextOwnerToExplicitlySet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ownerAddress","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":"preSaleDate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSaleDate","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":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newAddress","type":"address"}],"name":"setContributorAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newProfit","type":"uint256"}],"name":"setContributorProfit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newAddress","type":"address"}],"name":"setDeveloperAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newProfit","type":"uint256"}],"name":"setDeveloperProfit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newSupply","type":"uint256"}],"name":"setFreeSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newAmount","type":"uint256"}],"name":"setMaxFreeMintAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newAmount","type":"uint256"}],"name":"setMaxPayMintAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newAddress","type":"address"}],"name":"setOwnerAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_newPaused","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newDate","type":"uint256"}],"name":"setPreSaleDate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newDate","type":"uint256"}],"name":"setPublicSaleDate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"setWhitelistAddresses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"bool","name":"_whitelisted","type":"bool"}],"name":"setWhitelisted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"teamMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"teamMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"teamMinted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60c06040526000805560006007556040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600a908162000053919062000797565b506611c37937e08000600b55600a600c556032600d556064600e556109c4600f55604b601055600f60115573ee2cf9b7a9b97bf9fe8d9ad32f8e498d3257fc4f601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073c3c891b96afa15aba58b7d91359f76dca77fc427601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550730c04cb6bb940ed395b4c69e4f5ca9b2ad3a8e57b601460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060006014806101000a81548160ff0219169083151502179055506000601460156101000a81548160ff0219169083151502179055506363096b6460155561012c601554620001cc9190620008ad565b601655348015620001dc57600080fd5b506040516200656838038062006568833981810160405281019062000202919062000a78565b6040518060400160405280601781526020017f426f726564204170652047616c616374696320436c75620000000000000000008152506040518060400160405280600481526020017f4241474300000000000000000000000000000000000000000000000000000000815250606461271060008111620002b9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002b09062000b50565b60405180910390fd5b60008211620002ff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002f69062000be8565b60405180910390fd5b836001908162000310919062000797565b50826002908162000322919062000797565b508160a08181525050806080818152505050505050620003576200034b6200036f60201b60201c565b6200037760201b60201c565b62000368816200043d60201b60201c565b5062000c7c565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6200044d6200046260201b60201c565b80600990816200045e919062000797565b5050565b620004726200036f60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1662000498620004f360201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620004f1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004e89062000c5a565b60405180910390fd5b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200059f57607f821691505b602082108103620005b557620005b462000557565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026200061f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620005e0565b6200062b8683620005e0565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000678620006726200066c8462000643565b6200064d565b62000643565b9050919050565b6000819050919050565b620006948362000657565b620006ac620006a3826200067f565b848454620005ed565b825550505050565b600090565b620006c3620006b4565b620006d081848462000689565b505050565b5b81811015620006f857620006ec600082620006b9565b600181019050620006d6565b5050565b601f82111562000747576200071181620005bb565b6200071c84620005d0565b810160208510156200072c578190505b620007446200073b85620005d0565b830182620006d5565b50505b505050565b600082821c905092915050565b60006200076c600019846008026200074c565b1980831691505092915050565b600062000787838362000759565b9150826002028217905092915050565b620007a2826200051d565b67ffffffffffffffff811115620007be57620007bd62000528565b5b620007ca825462000586565b620007d7828285620006fc565b600060209050601f8311600181146200080f5760008415620007fa578287015190505b62000806858262000779565b86555062000876565b601f1984166200081f86620005bb565b60005b82811015620008495784890151825560018201915060208501945060208101905062000822565b8683101562000869578489015162000865601f89168262000759565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000620008ba8262000643565b9150620008c78362000643565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115620008ff57620008fe6200087e565b5b828201905092915050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b620009448262000928565b810181811067ffffffffffffffff8211171562000966576200096562000528565b5b80604052505050565b60006200097b6200090a565b905062000989828262000939565b919050565b600067ffffffffffffffff821115620009ac57620009ab62000528565b5b620009b78262000928565b9050602081019050919050565b60005b83811015620009e4578082015181840152602081019050620009c7565b83811115620009f4576000848401525b50505050565b600062000a1162000a0b846200098e565b6200096f565b90508281526020810184848401111562000a305762000a2f62000923565b5b62000a3d848285620009c4565b509392505050565b600082601f83011262000a5d5762000a5c6200091e565b5b815162000a6f848260208601620009fa565b91505092915050565b60006020828403121562000a915762000a9062000914565b5b600082015167ffffffffffffffff81111562000ab25762000ab162000919565b5b62000ac08482850162000a45565b91505092915050565b600082825260208201905092915050565b7f455243373231413a20636f6c6c656374696f6e206d757374206861766520612060008201527f6e6f6e7a65726f20737570706c79000000000000000000000000000000000000602082015250565b600062000b38602e8362000ac9565b915062000b458262000ada565b604082019050919050565b6000602082019050818103600083015262000b6b8162000b29565b9050919050565b7f455243373231413a206d61782062617463682073697a65206d7573742062652060008201527f6e6f6e7a65726f00000000000000000000000000000000000000000000000000602082015250565b600062000bd060278362000ac9565b915062000bdd8262000b72565b604082019050919050565b6000602082019050818103600083015262000c038162000bc1565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600062000c4260208362000ac9565b915062000c4f8262000c0a565b602082019050919050565b6000602082019050818103600083015262000c758162000c33565b9050919050565b60805160a0516158bb62000cad60003960008181612e5e01528181612e8701526135180152600050506158bb6000f3fe6080604052600436106103ad5760003560e01c8063743c7f6b116101e7578063c66828621161010d578063e69e59dc116100a0578063eced38731161006f578063eced387314610dad578063f2fde38b14610dd8578063f52ccc2d14610e01578063f676308a14610e2a576103ad565b8063e69e59dc14610cf1578063e8b5498d14610d1a578063e985e9c514610d45578063e98abde014610d82576103ad565b8063cfdbf254116100dc578063cfdbf25414610c35578063d7224ba014610c60578063d936547e14610c8b578063dcc345f214610cc8576103ad565b8063c668286214610b77578063c87b56dd14610ba2578063caccd7f714610bdf578063cde5b4e114610c0a576103ad565b80639f9dbac511610185578063b4e4f3c811610154578063b4e4f3c814610af2578063b74c379b14610b1b578063b88d4fde14610b44578063ba7a86b814610b6d576103ad565b80639f9dbac514610a57578063a0712d6814610a82578063a22cb46514610a9e578063b4bc159a14610ac7576103ad565b80638f84aa09116101c15780638f84aa09146109ad5780639281aa0b146109d857806395d89b4114610a015780639d3d41de14610a2c576103ad565b8063743c7f6b1461091c57806384c2f89f146109455780638da5cb5b14610982576103ad565b806332cb6b0c116102d757806355f804b31161026a57806364505d6b1161023957806364505d6b146108725780636805b84b1461089d57806370a08231146108c8578063715018a614610905576103ad565b806355f804b3146107d75780635b70ea9f146108005780635c975abb1461080a5780636352211e14610835576103ad565b8063438b6300116102a6578063438b63001461070b57806344a0d68a1461074857806346474c65146107715780634f6ccce71461079a576103ad565b806332cb6b0c14610663578063331a6bf51461068e57806341525261146106b757806342842e0e146106e2576103ad565b806313faede61161034f57806323b872dd1161031e57806323b872dd146105a957806324a6ab0c146105d25780632aba3832146105fd5780632f745c5914610626576103ad565b806313faede6146104ff57806316c38b3c1461052a57806318160ddd146105535780631985cc651461057e576103ad565b8063081812fc1161038b578063081812fc14610445578063095ea7b3146104825780630e54a883146104ab57806313c738f0146104d4576103ad565b806301ffc9a7146103b257806304470194146103ef57806306fdde031461041a575b600080fd5b3480156103be57600080fd5b506103d960048036038101906103d491906139ff565b610e53565b6040516103e69190613a47565b60405180910390f35b3480156103fb57600080fd5b50610404610f9d565b6040516104119190613a7b565b60405180910390f35b34801561042657600080fd5b5061042f610fa3565b60405161043c9190613b2f565b60405180910390f35b34801561045157600080fd5b5061046c60048036038101906104679190613b7d565b611035565b6040516104799190613beb565b60405180910390f35b34801561048e57600080fd5b506104a960048036038101906104a49190613c32565b6110ba565b005b3480156104b757600080fd5b506104d260048036038101906104cd9190613b7d565b6111d2565b005b3480156104e057600080fd5b506104e96111e4565b6040516104f69190613a7b565b60405180910390f35b34801561050b57600080fd5b506105146111ee565b6040516105219190613a7b565b60405180910390f35b34801561053657600080fd5b50610551600480360381019061054c9190613c9e565b6111f4565b005b34801561055f57600080fd5b50610568611218565b6040516105759190613a7b565b60405180910390f35b34801561058a57600080fd5b50610593611221565b6040516105a09190613a7b565b60405180910390f35b3480156105b557600080fd5b506105d060048036038101906105cb9190613ccb565b611227565b005b3480156105de57600080fd5b506105e7611237565b6040516105f49190613a7b565b60405180910390f35b34801561060957600080fd5b50610624600480360381019061061f9190613b7d565b61123d565b005b34801561063257600080fd5b5061064d60048036038101906106489190613c32565b61124f565b60405161065a9190613a7b565b60405180910390f35b34801561066f57600080fd5b5061067861144b565b6040516106859190613a7b565b60405180910390f35b34801561069a57600080fd5b506106b560048036038101906106b09190613d1e565b611451565b005b3480156106c357600080fd5b506106cc61149d565b6040516106d99190613a7b565b60405180910390f35b3480156106ee57600080fd5b5061070960048036038101906107049190613ccb565b6114a3565b005b34801561071757600080fd5b50610732600480360381019061072d9190613d1e565b6114c3565b60405161073f9190613e09565b60405180910390f35b34801561075457600080fd5b5061076f600480360381019061076a9190613b7d565b611571565b005b34801561077d57600080fd5b5061079860048036038101906107939190613b7d565b611583565b005b3480156107a657600080fd5b506107c160048036038101906107bc9190613b7d565b611595565b6040516107ce9190613a7b565b60405180910390f35b3480156107e357600080fd5b506107fe60048036038101906107f99190613f60565b6115e8565b005b610808611603565b005b34801561081657600080fd5b5061081f611868565b60405161082c9190613a47565b60405180910390f35b34801561084157600080fd5b5061085c60048036038101906108579190613b7d565b611879565b6040516108699190613beb565b60405180910390f35b34801561087e57600080fd5b5061088761188f565b6040516108949190613a7b565b60405180910390f35b3480156108a957600080fd5b506108b2611899565b6040516108bf9190613a47565b60405180910390f35b3480156108d457600080fd5b506108ef60048036038101906108ea9190613d1e565b6118ae565b6040516108fc9190613a7b565b60405180910390f35b34801561091157600080fd5b5061091a611996565b005b34801561092857600080fd5b50610943600480360381019061093e9190613b7d565b6119aa565b005b34801561095157600080fd5b5061096c60048036038101906109679190613d1e565b6119bc565b6040516109799190613a7b565b60405180910390f35b34801561098e57600080fd5b506109976119d4565b6040516109a49190613beb565b60405180910390f35b3480156109b957600080fd5b506109c26119fe565b6040516109cf9190613beb565b60405180910390f35b3480156109e457600080fd5b506109ff60048036038101906109fa9190613fa9565b611a24565b005b348015610a0d57600080fd5b50610a16611a87565b604051610a239190613b2f565b60405180910390f35b348015610a3857600080fd5b50610a41611b19565b604051610a4e9190613a7b565b60405180910390f35b348015610a6357600080fd5b50610a6c611b1f565b604051610a799190613a7b565b60405180910390f35b610a9c6004803603810190610a979190613b7d565b611b25565b005b348015610aaa57600080fd5b50610ac56004803603810190610ac09190613fa9565b611f22565b005b348015610ad357600080fd5b50610adc6120a2565b604051610ae99190613a7b565b60405180910390f35b348015610afe57600080fd5b50610b196004803603810190610b149190613b7d565b6120a8565b005b348015610b2757600080fd5b50610b426004803603810190610b3d9190613d1e565b6120ba565b005b348015610b5057600080fd5b50610b6b6004803603810190610b66919061408a565b612106565b005b610b75612162565b005b348015610b8357600080fd5b50610b8c612290565b604051610b999190613b2f565b60405180910390f35b348015610bae57600080fd5b50610bc96004803603810190610bc49190613b7d565b61231e565b604051610bd69190613b2f565b60405180910390f35b348015610beb57600080fd5b50610bf46123c8565b604051610c019190613beb565b60405180910390f35b348015610c1657600080fd5b50610c1f6123ee565b604051610c2c9190613beb565b60405180910390f35b348015610c4157600080fd5b50610c4a612414565b604051610c579190613a7b565b60405180910390f35b348015610c6c57600080fd5b50610c75612419565b604051610c829190613a7b565b60405180910390f35b348015610c9757600080fd5b50610cb26004803603810190610cad9190613d1e565b61241f565b604051610cbf9190613a47565b60405180910390f35b348015610cd457600080fd5b50610cef6004803603810190610cea9190613d1e565b61243f565b005b348015610cfd57600080fd5b50610d186004803603810190610d139190613b7d565b61248b565b005b348015610d2657600080fd5b50610d2f61249d565b604051610d3c9190613a47565b60405180910390f35b348015610d5157600080fd5b50610d6c6004803603810190610d67919061410d565b6124b0565b604051610d799190613a47565b60405180910390f35b348015610d8e57600080fd5b50610d97612544565b604051610da49190613a7b565b60405180910390f35b348015610db957600080fd5b50610dc261254e565b604051610dcf9190613a7b565b60405180910390f35b348015610de457600080fd5b50610dff6004803603810190610dfa9190613d1e565b612554565b005b348015610e0d57600080fd5b50610e286004803603810190610e239190614215565b6125d7565b005b348015610e3657600080fd5b50610e516004803603810190610e4c9190613b7d565b612674565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610f1e57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610f8657507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610f965750610f9582612686565b5b9050919050565b60115481565b606060018054610fb29061428d565b80601f0160208091040260200160405190810160405280929190818152602001828054610fde9061428d565b801561102b5780601f106110005761010080835404028352916020019161102b565b820191906000526020600020905b81548152906001019060200180831161100e57829003601f168201915b5050505050905090565b6000611040826126f0565b61107f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107690614330565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006110c582611879565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611135576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112c906143c2565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166111546126fd565b73ffffffffffffffffffffffffffffffffffffffff16148061118357506111828161117d6126fd565b6124b0565b5b6111c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b990614454565b60405180910390fd5b6111cd838383612705565b505050565b6111da6127b7565b8060168190555050565b6000600b54905090565b600b5481565b6111fc6127b7565b806014806101000a81548160ff02191690831515021790555050565b60008054905090565b60155481565b611232838383612835565b505050565b600f5481565b6112456127b7565b80600c8190555050565b600061125a836118ae565b821061129b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611292906144e6565b60405180910390fd5b60006112a5611218565b905060008060005b83811015611409576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461139f57806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036113f5578684036113e6578195505050505050611445565b83806113f190614535565b9450505b50808061140190614535565b9150506112ad565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143c906145ef565b60405180910390fd5b92915050565b61271081565b6114596127b7565b80601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600d5481565b6114be83838360405180602001604052806000815250612106565b505050565b606060006114d0836118ae565b905060008167ffffffffffffffff8111156114ee576114ed613e35565b5b60405190808252806020026020018201604052801561151c5781602001602082028036833780820191505090505b50905060005b8281101561156657611534858261124f565b8282815181106115475761154661460f565b5b602002602001018181525050808061155e90614535565b915050611522565b508092505050919050565b6115796127b7565b80600b8190555050565b61158b6127b7565b8060118190555050565b600061159f611218565b82106115e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d7906146b0565b60405180910390fd5b819050919050565b6115f06127b7565b80600990816115ff919061487c565b5050565b60148054906101000a900460ff1615611651576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116489061499a565b60405180910390fd5b6000429050601654811015806116be575060155481101580156116bd5750601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b5b6116fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f490614a06565b60405180910390fd5b600c54601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115611781576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177890614a72565b60405180910390fd5b600061178b611218565b9050600f5481106117d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117c890614ade565b60405180910390fd5b6000600f54600c54836117e49190614afe565b11156117fd5781600f546117f89190614b54565b611801565b600c545b905061180d3382612dec565b80601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461185c9190614afe565b92505081905550505050565b60148054906101000a900460ff1681565b600061188482612e0a565b600001519050919050565b6000601654905090565b600060148054906101000a900460ff16905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361191e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191590614bfa565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b61199e6127b7565b6119a8600061300d565b565b6119b26127b7565b8060158190555050565b60176020528060005260406000206000915090505481565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611a2c6127b7565b80601860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b606060028054611a969061428d565b80601f0160208091040260200160405190810160405280929190818152602001828054611ac29061428d565b8015611b0f5780601f10611ae457610100808354040283529160200191611b0f565b820191906000526020600020905b815481529060010190602001808311611af257829003601f168201915b5050505050905090565b600c5481565b60105481565b60148054906101000a900460ff1615611b73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6a9061499a565b60405180910390fd5b600042905060165481101580611be057506015548110158015611bdf5750601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b5b611c1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1690614a06565b60405180910390fd5b60008211611c62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5990614c66565b60405180910390fd5b600d54821115611ca7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c9e90614a72565b60405180910390fd5b6000611cb1611218565b9050600f54811015611cf8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cef90614cd2565b60405180910390fd5b6127108382611d079190614afe565b1115611d48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3f90614d3e565b60405180910390fd5b82600b54611d569190614d5e565b341015611d98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d8f90614e04565b60405180910390fd5b611da23384612dec565b60006103e860105447611db59190614d5e565b611dbf9190614e53565b905060006103e860115447611dd49190614d5e565b611dde9190614e53565b9050601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050158015611e48573d6000803e3d6000fd5b50601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611eb1573d6000803e3d6000fd5b50601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015611f1a573d6000803e3d6000fd5b505050505050565b611f2a6126fd565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611f97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8e90614ed0565b60405180910390fd5b8060066000611fa46126fd565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166120516126fd565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516120969190613a47565b60405180910390a35050565b600e5481565b6120b06127b7565b8060108190555050565b6120c26127b7565b80601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b612111848484612835565b61211d848484846130d3565b61215c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161215390614f62565b60405180910390fd5b50505050565b61216a6127b7565b60148054906101000a900460ff16156121b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121af9061499a565b60405180910390fd5b601460159054906101000a900460ff1615612208576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121ff90614fce565b60405180910390fd5b6000612212611218565b9050600f54600e54826122259190614afe565b1115612266576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161225d90614ade565b60405180910390fd5b61227233600e54612dec565b6001601460156101000a81548160ff02191690831515021790555050565b600a805461229d9061428d565b80601f01602080910402602001604051908101604052809291908181526020018280546122c99061428d565b80156123165780601f106122eb57610100808354040283529160200191612316565b820191906000526020600020905b8154815290600101906020018083116122f957829003601f168201915b505050505081565b6060612329826126f0565b612368576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161235f9061503a565b60405180910390fd5b600061237261325a565b9050600081511161239257604051806020016040528060008152506123c0565b8061239c846132ec565b600a6040516020016123b093929190615119565b6040516020818303038152906040525b915050919050565b601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606481565b60075481565b60186020528060005260406000206000915054906101000a900460ff1681565b6124476127b7565b80601460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6124936127b7565b80600d8190555050565b601460159054906101000a900460ff1681565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000601554905090565b60165481565b61255c6127b7565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036125cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125c2906151bc565b60405180910390fd5b6125d48161300d565b50565b6125df6127b7565b60005b8151811015612670576001601860008484815181106126045761260361460f565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550808061266890614535565b9150506125e2565b5050565b61267c6127b7565b80600f8190555050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000805482109050919050565b600033905090565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6127bf6126fd565b73ffffffffffffffffffffffffffffffffffffffff166127dd6119d4565b73ffffffffffffffffffffffffffffffffffffffff1614612833576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161282a90615228565b60405180910390fd5b565b600061284082612e0a565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff166128676126fd565b73ffffffffffffffffffffffffffffffffffffffff1614806128c3575061288c6126fd565b73ffffffffffffffffffffffffffffffffffffffff166128ab84611035565b73ffffffffffffffffffffffffffffffffffffffff16145b806128df57506128de82600001516128d96126fd565b6124b0565b5b905080612921576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612918906152ba565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614612993576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161298a9061534c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612a02576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129f9906153de565b60405180910390fd5b612a0f858585600161344c565b612a1f6000848460000151612705565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff16612a8d919061541a565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff16612b31919061544e565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060405180604001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050506000600184612c379190614afe565b9050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603612d7c57612cac816126f0565b15612d7b576040518060400160405280846000015173ffffffffffffffffffffffffffffffffffffffff168152602001846020015167ffffffffffffffff168152506003600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050505b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612de48686866001613452565b505050505050565b612e06828260405180602001604052806000815250613458565b5050565b612e12613959565b612e1b826126f0565b612e5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e5190615506565b60405180910390fd5b60007f00000000000000000000000000000000000000000000000000000000000000008310612ebe5760017f000000000000000000000000000000000000000000000000000000000000000084612eb19190614b54565b612ebb9190614afe565b90505b60008390505b818110612fcc576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612fb857809350505050613008565b508080612fc490615526565b915050612ec4565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fff906155c1565b60405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006130f48473ffffffffffffffffffffffffffffffffffffffff16613936565b1561324d578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261311d6126fd565b8786866040518563ffffffff1660e01b815260040161313f9493929190615636565b6020604051808303816000875af192505050801561317b57506040513d601f19601f820116820180604052508101906131789190615697565b60015b6131fd573d80600081146131ab576040519150601f19603f3d011682016040523d82523d6000602084013e6131b0565b606091505b5060008151036131f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131ec90614f62565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613252565b600190505b949350505050565b6060600980546132699061428d565b80601f01602080910402602001604051908101604052809291908181526020018280546132959061428d565b80156132e25780601f106132b7576101008083540402835291602001916132e2565b820191906000526020600020905b8154815290600101906020018083116132c557829003601f168201915b5050505050905090565b606060008203613333576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613447565b600082905060005b6000821461336557808061334e90614535565b915050600a8261335e9190614e53565b915061333b565b60008167ffffffffffffffff81111561338157613380613e35565b5b6040519080825280601f01601f1916602001820160405280156133b35781602001600182028036833780820191505090505b5090505b60008514613440576001826133cc9190614b54565b9150600a856133db91906156c4565b60306133e79190614afe565b60f81b8183815181106133fd576133fc61460f565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856134399190614e53565b94506133b7565b8093505050505b919050565b50505050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036134cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134c490615767565b60405180910390fd5b6134d6816126f0565b15613516576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161350d906157d3565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000831115613579576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161357090615865565b60405180910390fd5b613586600085838661344c565b6000600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168152505090506040518060400160405280858360000151613683919061544e565b6fffffffffffffffffffffffffffffffff1681526020018583602001516136aa919061544e565b6fffffffffffffffffffffffffffffffff16815250600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555090505060405180604001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600082905060005b8581101561391957818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46138b960008884886130d3565b6138f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138ef90614f62565b60405180910390fd5b818061390390614535565b925050808061391190614535565b915050613848565b508060008190555061392e6000878588613452565b505050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6139dc816139a7565b81146139e757600080fd5b50565b6000813590506139f9816139d3565b92915050565b600060208284031215613a1557613a1461399d565b5b6000613a23848285016139ea565b91505092915050565b60008115159050919050565b613a4181613a2c565b82525050565b6000602082019050613a5c6000830184613a38565b92915050565b6000819050919050565b613a7581613a62565b82525050565b6000602082019050613a906000830184613a6c565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613ad0578082015181840152602081019050613ab5565b83811115613adf576000848401525b50505050565b6000601f19601f8301169050919050565b6000613b0182613a96565b613b0b8185613aa1565b9350613b1b818560208601613ab2565b613b2481613ae5565b840191505092915050565b60006020820190508181036000830152613b498184613af6565b905092915050565b613b5a81613a62565b8114613b6557600080fd5b50565b600081359050613b7781613b51565b92915050565b600060208284031215613b9357613b9261399d565b5b6000613ba184828501613b68565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613bd582613baa565b9050919050565b613be581613bca565b82525050565b6000602082019050613c006000830184613bdc565b92915050565b613c0f81613bca565b8114613c1a57600080fd5b50565b600081359050613c2c81613c06565b92915050565b60008060408385031215613c4957613c4861399d565b5b6000613c5785828601613c1d565b9250506020613c6885828601613b68565b9150509250929050565b613c7b81613a2c565b8114613c8657600080fd5b50565b600081359050613c9881613c72565b92915050565b600060208284031215613cb457613cb361399d565b5b6000613cc284828501613c89565b91505092915050565b600080600060608486031215613ce457613ce361399d565b5b6000613cf286828701613c1d565b9350506020613d0386828701613c1d565b9250506040613d1486828701613b68565b9150509250925092565b600060208284031215613d3457613d3361399d565b5b6000613d4284828501613c1d565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613d8081613a62565b82525050565b6000613d928383613d77565b60208301905092915050565b6000602082019050919050565b6000613db682613d4b565b613dc08185613d56565b9350613dcb83613d67565b8060005b83811015613dfc578151613de38882613d86565b9750613dee83613d9e565b925050600181019050613dcf565b5085935050505092915050565b60006020820190508181036000830152613e238184613dab565b905092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613e6d82613ae5565b810181811067ffffffffffffffff82111715613e8c57613e8b613e35565b5b80604052505050565b6000613e9f613993565b9050613eab8282613e64565b919050565b600067ffffffffffffffff821115613ecb57613eca613e35565b5b613ed482613ae5565b9050602081019050919050565b82818337600083830152505050565b6000613f03613efe84613eb0565b613e95565b905082815260208101848484011115613f1f57613f1e613e30565b5b613f2a848285613ee1565b509392505050565b600082601f830112613f4757613f46613e2b565b5b8135613f57848260208601613ef0565b91505092915050565b600060208284031215613f7657613f7561399d565b5b600082013567ffffffffffffffff811115613f9457613f936139a2565b5b613fa084828501613f32565b91505092915050565b60008060408385031215613fc057613fbf61399d565b5b6000613fce85828601613c1d565b9250506020613fdf85828601613c89565b9150509250929050565b600067ffffffffffffffff82111561400457614003613e35565b5b61400d82613ae5565b9050602081019050919050565b600061402d61402884613fe9565b613e95565b90508281526020810184848401111561404957614048613e30565b5b614054848285613ee1565b509392505050565b600082601f83011261407157614070613e2b565b5b813561408184826020860161401a565b91505092915050565b600080600080608085870312156140a4576140a361399d565b5b60006140b287828801613c1d565b94505060206140c387828801613c1d565b93505060406140d487828801613b68565b925050606085013567ffffffffffffffff8111156140f5576140f46139a2565b5b6141018782880161405c565b91505092959194509250565b600080604083850312156141245761412361399d565b5b600061413285828601613c1d565b925050602061414385828601613c1d565b9150509250929050565b600067ffffffffffffffff82111561416857614167613e35565b5b602082029050602081019050919050565b600080fd5b600061419161418c8461414d565b613e95565b905080838252602082019050602084028301858111156141b4576141b3614179565b5b835b818110156141dd57806141c98882613c1d565b8452602084019350506020810190506141b6565b5050509392505050565b600082601f8301126141fc576141fb613e2b565b5b813561420c84826020860161417e565b91505092915050565b60006020828403121561422b5761422a61399d565b5b600082013567ffffffffffffffff811115614249576142486139a2565b5b614255848285016141e7565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806142a557607f821691505b6020821081036142b8576142b761425e565b5b50919050565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b600061431a602d83613aa1565b9150614325826142be565b604082019050919050565b600060208201905081810360008301526143498161430d565b9050919050565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b60006143ac602283613aa1565b91506143b782614350565b604082019050919050565b600060208201905081810360008301526143db8161439f565b9050919050565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b600061443e603983613aa1565b9150614449826143e2565b604082019050919050565b6000602082019050818103600083015261446d81614431565b9050919050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b60006144d0602283613aa1565b91506144db82614474565b604082019050919050565b600060208201905081810360008301526144ff816144c3565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061454082613a62565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361457257614571614506565b5b600182019050919050565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b60006145d9602e83613aa1565b91506145e48261457d565b604082019050919050565b60006020820190508181036000830152614608816145cc565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b600061469a602383613aa1565b91506146a58261463e565b604082019050919050565b600060208201905081810360008301526146c98161468d565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026147327fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826146f5565b61473c86836146f5565b95508019841693508086168417925050509392505050565b6000819050919050565b600061477961477461476f84613a62565b614754565b613a62565b9050919050565b6000819050919050565b6147938361475e565b6147a761479f82614780565b848454614702565b825550505050565b600090565b6147bc6147af565b6147c781848461478a565b505050565b5b818110156147eb576147e06000826147b4565b6001810190506147cd565b5050565b601f82111561483057614801816146d0565b61480a846146e5565b81016020851015614819578190505b61482d614825856146e5565b8301826147cc565b50505b505050565b600082821c905092915050565b600061485360001984600802614835565b1980831691505092915050565b600061486c8383614842565b9150826002028217905092915050565b61488582613a96565b67ffffffffffffffff81111561489e5761489d613e35565b5b6148a8825461428d565b6148b38282856147ef565b600060209050601f8311600181146148e657600084156148d4578287015190505b6148de8582614860565b865550614946565b601f1984166148f4866146d0565b60005b8281101561491c578489015182556001820191506020850194506020810190506148f7565b868310156149395784890151614935601f891682614842565b8355505b6001600288020188555050505b505050505050565b7f5061757365640000000000000000000000000000000000000000000000000000600082015250565b6000614984600683613aa1565b915061498f8261494e565b602082019050919050565b600060208201905081810360008301526149b381614977565b9050919050565b7f4e6f7420616c6c6f77656420746f206d696e7400000000000000000000000000600082015250565b60006149f0601383613aa1565b91506149fb826149ba565b602082019050919050565b60006020820190508181036000830152614a1f816149e3565b9050919050565b7f416d6f756e742065786365656465640000000000000000000000000000000000600082015250565b6000614a5c600f83613aa1565b9150614a6782614a26565b602082019050919050565b60006020820190508181036000830152614a8b81614a4f565b9050919050565b7f4d6178206672656520737570706c792065786365656465640000000000000000600082015250565b6000614ac8601883613aa1565b9150614ad382614a92565b602082019050919050565b60006020820190508181036000830152614af781614abb565b9050919050565b6000614b0982613a62565b9150614b1483613a62565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614b4957614b48614506565b5b828201905092915050565b6000614b5f82613a62565b9150614b6a83613a62565b925082821015614b7d57614b7c614506565b5b828203905092915050565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b6000614be4602b83613aa1565b9150614bef82614b88565b604082019050919050565b60006020820190508181036000830152614c1381614bd7565b9050919050565b7f416d6f756e742063616e2774206265207a65726f000000000000000000000000600082015250565b6000614c50601483613aa1565b9150614c5b82614c1a565b602082019050919050565b60006020820190508181036000830152614c7f81614c43565b9050919050565b7f46726565206d696e742069736e27742066696e69736865640000000000000000600082015250565b6000614cbc601883613aa1565b9150614cc782614c86565b602082019050919050565b60006020820190508181036000830152614ceb81614caf565b9050919050565b7f4d617820737570706c7920657863656564656400000000000000000000000000600082015250565b6000614d28601383613aa1565b9150614d3382614cf2565b602082019050919050565b60006020820190508181036000830152614d5781614d1b565b9050919050565b6000614d6982613a62565b9150614d7483613a62565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614dad57614dac614506565b5b828202905092915050565b7f496e73756666696369656e742066756e64730000000000000000000000000000600082015250565b6000614dee601283613aa1565b9150614df982614db8565b602082019050919050565b60006020820190508181036000830152614e1d81614de1565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614e5e82613a62565b9150614e6983613a62565b925082614e7957614e78614e24565b5b828204905092915050565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b6000614eba601a83613aa1565b9150614ec582614e84565b602082019050919050565b60006020820190508181036000830152614ee981614ead565b9050919050565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b6000614f4c603383613aa1565b9150614f5782614ef0565b604082019050919050565b60006020820190508181036000830152614f7b81614f3f565b9050919050565b7f416c7265616479206d696e746564000000000000000000000000000000000000600082015250565b6000614fb8600e83613aa1565b9150614fc382614f82565b602082019050919050565b60006020820190508181036000830152614fe781614fab565b9050919050565b7f446f6573206e6f742065786973742e0000000000000000000000000000000000600082015250565b6000615024600f83613aa1565b915061502f82614fee565b602082019050919050565b6000602082019050818103600083015261505381615017565b9050919050565b600081905092915050565b600061507082613a96565b61507a818561505a565b935061508a818560208601613ab2565b80840191505092915050565b600081546150a38161428d565b6150ad818661505a565b945060018216600081146150c857600181146150dd57615110565b60ff1983168652811515820286019350615110565b6150e6856146d0565b60005b83811015615108578154818901526001820191506020810190506150e9565b838801955050505b50505092915050565b60006151258286615065565b91506151318285615065565b915061513d8284615096565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006151a6602683613aa1565b91506151b18261514a565b604082019050919050565b600060208201905081810360008301526151d581615199565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000615212602083613aa1565b915061521d826151dc565b602082019050919050565b6000602082019050818103600083015261524181615205565b9050919050565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b60006152a4603283613aa1565b91506152af82615248565b604082019050919050565b600060208201905081810360008301526152d381615297565b9050919050565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b6000615336602683613aa1565b9150615341826152da565b604082019050919050565b6000602082019050818103600083015261536581615329565b9050919050565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006153c8602583613aa1565b91506153d38261536c565b604082019050919050565b600060208201905081810360008301526153f7816153bb565b9050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b6000615425826153fe565b9150615430836153fe565b92508282101561544357615442614506565b5b828203905092915050565b6000615459826153fe565b9150615464836153fe565b9250826fffffffffffffffffffffffffffffffff0382111561548957615488614506565b5b828201905092915050565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b60006154f0602a83613aa1565b91506154fb82615494565b604082019050919050565b6000602082019050818103600083015261551f816154e3565b9050919050565b600061553182613a62565b91506000820361554457615543614506565b5b600182039050919050565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b60006155ab602f83613aa1565b91506155b68261554f565b604082019050919050565b600060208201905081810360008301526155da8161559e565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000615608826155e1565b61561281856155ec565b9350615622818560208601613ab2565b61562b81613ae5565b840191505092915050565b600060808201905061564b6000830187613bdc565b6156586020830186613bdc565b6156656040830185613a6c565b818103606083015261567781846155fd565b905095945050505050565b600081519050615691816139d3565b92915050565b6000602082840312156156ad576156ac61399d565b5b60006156bb84828501615682565b91505092915050565b60006156cf82613a62565b91506156da83613a62565b9250826156ea576156e9614e24565b5b828206905092915050565b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000615751602183613aa1565b915061575c826156f5565b604082019050919050565b6000602082019050818103600083015261578081615744565b9050919050565b7f455243373231413a20746f6b656e20616c7265616479206d696e746564000000600082015250565b60006157bd601d83613aa1565b91506157c882615787565b602082019050919050565b600060208201905081810360008301526157ec816157b0565b9050919050565b7f455243373231413a207175616e7469747920746f206d696e7420746f6f20686960008201527f6768000000000000000000000000000000000000000000000000000000000000602082015250565b600061584f602283613aa1565b915061585a826157f3565b604082019050919050565b6000602082019050818103600083015261587e81615842565b905091905056fea26469706673582212208dda497d8db85ba008eda86a23e645aa1ffede282932d4119672678600fbbcd964736f6c634300080f00330000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000005168747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f516d6331453839696f5565574139565239706d784e786954367a6436574a634e67686259485970656e46686d37412f000000000000000000000000000000
Deployed Bytecode
0x6080604052600436106103ad5760003560e01c8063743c7f6b116101e7578063c66828621161010d578063e69e59dc116100a0578063eced38731161006f578063eced387314610dad578063f2fde38b14610dd8578063f52ccc2d14610e01578063f676308a14610e2a576103ad565b8063e69e59dc14610cf1578063e8b5498d14610d1a578063e985e9c514610d45578063e98abde014610d82576103ad565b8063cfdbf254116100dc578063cfdbf25414610c35578063d7224ba014610c60578063d936547e14610c8b578063dcc345f214610cc8576103ad565b8063c668286214610b77578063c87b56dd14610ba2578063caccd7f714610bdf578063cde5b4e114610c0a576103ad565b80639f9dbac511610185578063b4e4f3c811610154578063b4e4f3c814610af2578063b74c379b14610b1b578063b88d4fde14610b44578063ba7a86b814610b6d576103ad565b80639f9dbac514610a57578063a0712d6814610a82578063a22cb46514610a9e578063b4bc159a14610ac7576103ad565b80638f84aa09116101c15780638f84aa09146109ad5780639281aa0b146109d857806395d89b4114610a015780639d3d41de14610a2c576103ad565b8063743c7f6b1461091c57806384c2f89f146109455780638da5cb5b14610982576103ad565b806332cb6b0c116102d757806355f804b31161026a57806364505d6b1161023957806364505d6b146108725780636805b84b1461089d57806370a08231146108c8578063715018a614610905576103ad565b806355f804b3146107d75780635b70ea9f146108005780635c975abb1461080a5780636352211e14610835576103ad565b8063438b6300116102a6578063438b63001461070b57806344a0d68a1461074857806346474c65146107715780634f6ccce71461079a576103ad565b806332cb6b0c14610663578063331a6bf51461068e57806341525261146106b757806342842e0e146106e2576103ad565b806313faede61161034f57806323b872dd1161031e57806323b872dd146105a957806324a6ab0c146105d25780632aba3832146105fd5780632f745c5914610626576103ad565b806313faede6146104ff57806316c38b3c1461052a57806318160ddd146105535780631985cc651461057e576103ad565b8063081812fc1161038b578063081812fc14610445578063095ea7b3146104825780630e54a883146104ab57806313c738f0146104d4576103ad565b806301ffc9a7146103b257806304470194146103ef57806306fdde031461041a575b600080fd5b3480156103be57600080fd5b506103d960048036038101906103d491906139ff565b610e53565b6040516103e69190613a47565b60405180910390f35b3480156103fb57600080fd5b50610404610f9d565b6040516104119190613a7b565b60405180910390f35b34801561042657600080fd5b5061042f610fa3565b60405161043c9190613b2f565b60405180910390f35b34801561045157600080fd5b5061046c60048036038101906104679190613b7d565b611035565b6040516104799190613beb565b60405180910390f35b34801561048e57600080fd5b506104a960048036038101906104a49190613c32565b6110ba565b005b3480156104b757600080fd5b506104d260048036038101906104cd9190613b7d565b6111d2565b005b3480156104e057600080fd5b506104e96111e4565b6040516104f69190613a7b565b60405180910390f35b34801561050b57600080fd5b506105146111ee565b6040516105219190613a7b565b60405180910390f35b34801561053657600080fd5b50610551600480360381019061054c9190613c9e565b6111f4565b005b34801561055f57600080fd5b50610568611218565b6040516105759190613a7b565b60405180910390f35b34801561058a57600080fd5b50610593611221565b6040516105a09190613a7b565b60405180910390f35b3480156105b557600080fd5b506105d060048036038101906105cb9190613ccb565b611227565b005b3480156105de57600080fd5b506105e7611237565b6040516105f49190613a7b565b60405180910390f35b34801561060957600080fd5b50610624600480360381019061061f9190613b7d565b61123d565b005b34801561063257600080fd5b5061064d60048036038101906106489190613c32565b61124f565b60405161065a9190613a7b565b60405180910390f35b34801561066f57600080fd5b5061067861144b565b6040516106859190613a7b565b60405180910390f35b34801561069a57600080fd5b506106b560048036038101906106b09190613d1e565b611451565b005b3480156106c357600080fd5b506106cc61149d565b6040516106d99190613a7b565b60405180910390f35b3480156106ee57600080fd5b5061070960048036038101906107049190613ccb565b6114a3565b005b34801561071757600080fd5b50610732600480360381019061072d9190613d1e565b6114c3565b60405161073f9190613e09565b60405180910390f35b34801561075457600080fd5b5061076f600480360381019061076a9190613b7d565b611571565b005b34801561077d57600080fd5b5061079860048036038101906107939190613b7d565b611583565b005b3480156107a657600080fd5b506107c160048036038101906107bc9190613b7d565b611595565b6040516107ce9190613a7b565b60405180910390f35b3480156107e357600080fd5b506107fe60048036038101906107f99190613f60565b6115e8565b005b610808611603565b005b34801561081657600080fd5b5061081f611868565b60405161082c9190613a47565b60405180910390f35b34801561084157600080fd5b5061085c60048036038101906108579190613b7d565b611879565b6040516108699190613beb565b60405180910390f35b34801561087e57600080fd5b5061088761188f565b6040516108949190613a7b565b60405180910390f35b3480156108a957600080fd5b506108b2611899565b6040516108bf9190613a47565b60405180910390f35b3480156108d457600080fd5b506108ef60048036038101906108ea9190613d1e565b6118ae565b6040516108fc9190613a7b565b60405180910390f35b34801561091157600080fd5b5061091a611996565b005b34801561092857600080fd5b50610943600480360381019061093e9190613b7d565b6119aa565b005b34801561095157600080fd5b5061096c60048036038101906109679190613d1e565b6119bc565b6040516109799190613a7b565b60405180910390f35b34801561098e57600080fd5b506109976119d4565b6040516109a49190613beb565b60405180910390f35b3480156109b957600080fd5b506109c26119fe565b6040516109cf9190613beb565b60405180910390f35b3480156109e457600080fd5b506109ff60048036038101906109fa9190613fa9565b611a24565b005b348015610a0d57600080fd5b50610a16611a87565b604051610a239190613b2f565b60405180910390f35b348015610a3857600080fd5b50610a41611b19565b604051610a4e9190613a7b565b60405180910390f35b348015610a6357600080fd5b50610a6c611b1f565b604051610a799190613a7b565b60405180910390f35b610a9c6004803603810190610a979190613b7d565b611b25565b005b348015610aaa57600080fd5b50610ac56004803603810190610ac09190613fa9565b611f22565b005b348015610ad357600080fd5b50610adc6120a2565b604051610ae99190613a7b565b60405180910390f35b348015610afe57600080fd5b50610b196004803603810190610b149190613b7d565b6120a8565b005b348015610b2757600080fd5b50610b426004803603810190610b3d9190613d1e565b6120ba565b005b348015610b5057600080fd5b50610b6b6004803603810190610b66919061408a565b612106565b005b610b75612162565b005b348015610b8357600080fd5b50610b8c612290565b604051610b999190613b2f565b60405180910390f35b348015610bae57600080fd5b50610bc96004803603810190610bc49190613b7d565b61231e565b604051610bd69190613b2f565b60405180910390f35b348015610beb57600080fd5b50610bf46123c8565b604051610c019190613beb565b60405180910390f35b348015610c1657600080fd5b50610c1f6123ee565b604051610c2c9190613beb565b60405180910390f35b348015610c4157600080fd5b50610c4a612414565b604051610c579190613a7b565b60405180910390f35b348015610c6c57600080fd5b50610c75612419565b604051610c829190613a7b565b60405180910390f35b348015610c9757600080fd5b50610cb26004803603810190610cad9190613d1e565b61241f565b604051610cbf9190613a47565b60405180910390f35b348015610cd457600080fd5b50610cef6004803603810190610cea9190613d1e565b61243f565b005b348015610cfd57600080fd5b50610d186004803603810190610d139190613b7d565b61248b565b005b348015610d2657600080fd5b50610d2f61249d565b604051610d3c9190613a47565b60405180910390f35b348015610d5157600080fd5b50610d6c6004803603810190610d67919061410d565b6124b0565b604051610d799190613a47565b60405180910390f35b348015610d8e57600080fd5b50610d97612544565b604051610da49190613a7b565b60405180910390f35b348015610db957600080fd5b50610dc261254e565b604051610dcf9190613a7b565b60405180910390f35b348015610de457600080fd5b50610dff6004803603810190610dfa9190613d1e565b612554565b005b348015610e0d57600080fd5b50610e286004803603810190610e239190614215565b6125d7565b005b348015610e3657600080fd5b50610e516004803603810190610e4c9190613b7d565b612674565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610f1e57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610f8657507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610f965750610f9582612686565b5b9050919050565b60115481565b606060018054610fb29061428d565b80601f0160208091040260200160405190810160405280929190818152602001828054610fde9061428d565b801561102b5780601f106110005761010080835404028352916020019161102b565b820191906000526020600020905b81548152906001019060200180831161100e57829003601f168201915b5050505050905090565b6000611040826126f0565b61107f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107690614330565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006110c582611879565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611135576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112c906143c2565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166111546126fd565b73ffffffffffffffffffffffffffffffffffffffff16148061118357506111828161117d6126fd565b6124b0565b5b6111c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b990614454565b60405180910390fd5b6111cd838383612705565b505050565b6111da6127b7565b8060168190555050565b6000600b54905090565b600b5481565b6111fc6127b7565b806014806101000a81548160ff02191690831515021790555050565b60008054905090565b60155481565b611232838383612835565b505050565b600f5481565b6112456127b7565b80600c8190555050565b600061125a836118ae565b821061129b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611292906144e6565b60405180910390fd5b60006112a5611218565b905060008060005b83811015611409576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461139f57806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036113f5578684036113e6578195505050505050611445565b83806113f190614535565b9450505b50808061140190614535565b9150506112ad565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143c906145ef565b60405180910390fd5b92915050565b61271081565b6114596127b7565b80601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600d5481565b6114be83838360405180602001604052806000815250612106565b505050565b606060006114d0836118ae565b905060008167ffffffffffffffff8111156114ee576114ed613e35565b5b60405190808252806020026020018201604052801561151c5781602001602082028036833780820191505090505b50905060005b8281101561156657611534858261124f565b8282815181106115475761154661460f565b5b602002602001018181525050808061155e90614535565b915050611522565b508092505050919050565b6115796127b7565b80600b8190555050565b61158b6127b7565b8060118190555050565b600061159f611218565b82106115e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d7906146b0565b60405180910390fd5b819050919050565b6115f06127b7565b80600990816115ff919061487c565b5050565b60148054906101000a900460ff1615611651576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116489061499a565b60405180910390fd5b6000429050601654811015806116be575060155481101580156116bd5750601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b5b6116fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f490614a06565b60405180910390fd5b600c54601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115611781576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177890614a72565b60405180910390fd5b600061178b611218565b9050600f5481106117d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117c890614ade565b60405180910390fd5b6000600f54600c54836117e49190614afe565b11156117fd5781600f546117f89190614b54565b611801565b600c545b905061180d3382612dec565b80601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461185c9190614afe565b92505081905550505050565b60148054906101000a900460ff1681565b600061188482612e0a565b600001519050919050565b6000601654905090565b600060148054906101000a900460ff16905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361191e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191590614bfa565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b61199e6127b7565b6119a8600061300d565b565b6119b26127b7565b8060158190555050565b60176020528060005260406000206000915090505481565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611a2c6127b7565b80601860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b606060028054611a969061428d565b80601f0160208091040260200160405190810160405280929190818152602001828054611ac29061428d565b8015611b0f5780601f10611ae457610100808354040283529160200191611b0f565b820191906000526020600020905b815481529060010190602001808311611af257829003601f168201915b5050505050905090565b600c5481565b60105481565b60148054906101000a900460ff1615611b73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6a9061499a565b60405180910390fd5b600042905060165481101580611be057506015548110158015611bdf5750601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b5b611c1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1690614a06565b60405180910390fd5b60008211611c62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5990614c66565b60405180910390fd5b600d54821115611ca7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c9e90614a72565b60405180910390fd5b6000611cb1611218565b9050600f54811015611cf8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cef90614cd2565b60405180910390fd5b6127108382611d079190614afe565b1115611d48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3f90614d3e565b60405180910390fd5b82600b54611d569190614d5e565b341015611d98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d8f90614e04565b60405180910390fd5b611da23384612dec565b60006103e860105447611db59190614d5e565b611dbf9190614e53565b905060006103e860115447611dd49190614d5e565b611dde9190614e53565b9050601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050158015611e48573d6000803e3d6000fd5b50601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611eb1573d6000803e3d6000fd5b50601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015611f1a573d6000803e3d6000fd5b505050505050565b611f2a6126fd565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611f97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8e90614ed0565b60405180910390fd5b8060066000611fa46126fd565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166120516126fd565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516120969190613a47565b60405180910390a35050565b600e5481565b6120b06127b7565b8060108190555050565b6120c26127b7565b80601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b612111848484612835565b61211d848484846130d3565b61215c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161215390614f62565b60405180910390fd5b50505050565b61216a6127b7565b60148054906101000a900460ff16156121b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121af9061499a565b60405180910390fd5b601460159054906101000a900460ff1615612208576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121ff90614fce565b60405180910390fd5b6000612212611218565b9050600f54600e54826122259190614afe565b1115612266576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161225d90614ade565b60405180910390fd5b61227233600e54612dec565b6001601460156101000a81548160ff02191690831515021790555050565b600a805461229d9061428d565b80601f01602080910402602001604051908101604052809291908181526020018280546122c99061428d565b80156123165780601f106122eb57610100808354040283529160200191612316565b820191906000526020600020905b8154815290600101906020018083116122f957829003601f168201915b505050505081565b6060612329826126f0565b612368576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161235f9061503a565b60405180910390fd5b600061237261325a565b9050600081511161239257604051806020016040528060008152506123c0565b8061239c846132ec565b600a6040516020016123b093929190615119565b6040516020818303038152906040525b915050919050565b601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606481565b60075481565b60186020528060005260406000206000915054906101000a900460ff1681565b6124476127b7565b80601460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6124936127b7565b80600d8190555050565b601460159054906101000a900460ff1681565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000601554905090565b60165481565b61255c6127b7565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036125cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125c2906151bc565b60405180910390fd5b6125d48161300d565b50565b6125df6127b7565b60005b8151811015612670576001601860008484815181106126045761260361460f565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550808061266890614535565b9150506125e2565b5050565b61267c6127b7565b80600f8190555050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000805482109050919050565b600033905090565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6127bf6126fd565b73ffffffffffffffffffffffffffffffffffffffff166127dd6119d4565b73ffffffffffffffffffffffffffffffffffffffff1614612833576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161282a90615228565b60405180910390fd5b565b600061284082612e0a565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff166128676126fd565b73ffffffffffffffffffffffffffffffffffffffff1614806128c3575061288c6126fd565b73ffffffffffffffffffffffffffffffffffffffff166128ab84611035565b73ffffffffffffffffffffffffffffffffffffffff16145b806128df57506128de82600001516128d96126fd565b6124b0565b5b905080612921576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612918906152ba565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614612993576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161298a9061534c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612a02576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129f9906153de565b60405180910390fd5b612a0f858585600161344c565b612a1f6000848460000151612705565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff16612a8d919061541a565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff16612b31919061544e565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060405180604001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050506000600184612c379190614afe565b9050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603612d7c57612cac816126f0565b15612d7b576040518060400160405280846000015173ffffffffffffffffffffffffffffffffffffffff168152602001846020015167ffffffffffffffff168152506003600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050505b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612de48686866001613452565b505050505050565b612e06828260405180602001604052806000815250613458565b5050565b612e12613959565b612e1b826126f0565b612e5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e5190615506565b60405180910390fd5b60007f00000000000000000000000000000000000000000000000000000000000000648310612ebe5760017f000000000000000000000000000000000000000000000000000000000000006484612eb19190614b54565b612ebb9190614afe565b90505b60008390505b818110612fcc576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612fb857809350505050613008565b508080612fc490615526565b915050612ec4565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fff906155c1565b60405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006130f48473ffffffffffffffffffffffffffffffffffffffff16613936565b1561324d578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261311d6126fd565b8786866040518563ffffffff1660e01b815260040161313f9493929190615636565b6020604051808303816000875af192505050801561317b57506040513d601f19601f820116820180604052508101906131789190615697565b60015b6131fd573d80600081146131ab576040519150601f19603f3d011682016040523d82523d6000602084013e6131b0565b606091505b5060008151036131f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131ec90614f62565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613252565b600190505b949350505050565b6060600980546132699061428d565b80601f01602080910402602001604051908101604052809291908181526020018280546132959061428d565b80156132e25780601f106132b7576101008083540402835291602001916132e2565b820191906000526020600020905b8154815290600101906020018083116132c557829003601f168201915b5050505050905090565b606060008203613333576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613447565b600082905060005b6000821461336557808061334e90614535565b915050600a8261335e9190614e53565b915061333b565b60008167ffffffffffffffff81111561338157613380613e35565b5b6040519080825280601f01601f1916602001820160405280156133b35781602001600182028036833780820191505090505b5090505b60008514613440576001826133cc9190614b54565b9150600a856133db91906156c4565b60306133e79190614afe565b60f81b8183815181106133fd576133fc61460f565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856134399190614e53565b94506133b7565b8093505050505b919050565b50505050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036134cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134c490615767565b60405180910390fd5b6134d6816126f0565b15613516576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161350d906157d3565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000064831115613579576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161357090615865565b60405180910390fd5b613586600085838661344c565b6000600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168152505090506040518060400160405280858360000151613683919061544e565b6fffffffffffffffffffffffffffffffff1681526020018583602001516136aa919061544e565b6fffffffffffffffffffffffffffffffff16815250600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555090505060405180604001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600082905060005b8581101561391957818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46138b960008884886130d3565b6138f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138ef90614f62565b60405180910390fd5b818061390390614535565b925050808061391190614535565b915050613848565b508060008190555061392e6000878588613452565b505050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6139dc816139a7565b81146139e757600080fd5b50565b6000813590506139f9816139d3565b92915050565b600060208284031215613a1557613a1461399d565b5b6000613a23848285016139ea565b91505092915050565b60008115159050919050565b613a4181613a2c565b82525050565b6000602082019050613a5c6000830184613a38565b92915050565b6000819050919050565b613a7581613a62565b82525050565b6000602082019050613a906000830184613a6c565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613ad0578082015181840152602081019050613ab5565b83811115613adf576000848401525b50505050565b6000601f19601f8301169050919050565b6000613b0182613a96565b613b0b8185613aa1565b9350613b1b818560208601613ab2565b613b2481613ae5565b840191505092915050565b60006020820190508181036000830152613b498184613af6565b905092915050565b613b5a81613a62565b8114613b6557600080fd5b50565b600081359050613b7781613b51565b92915050565b600060208284031215613b9357613b9261399d565b5b6000613ba184828501613b68565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613bd582613baa565b9050919050565b613be581613bca565b82525050565b6000602082019050613c006000830184613bdc565b92915050565b613c0f81613bca565b8114613c1a57600080fd5b50565b600081359050613c2c81613c06565b92915050565b60008060408385031215613c4957613c4861399d565b5b6000613c5785828601613c1d565b9250506020613c6885828601613b68565b9150509250929050565b613c7b81613a2c565b8114613c8657600080fd5b50565b600081359050613c9881613c72565b92915050565b600060208284031215613cb457613cb361399d565b5b6000613cc284828501613c89565b91505092915050565b600080600060608486031215613ce457613ce361399d565b5b6000613cf286828701613c1d565b9350506020613d0386828701613c1d565b9250506040613d1486828701613b68565b9150509250925092565b600060208284031215613d3457613d3361399d565b5b6000613d4284828501613c1d565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613d8081613a62565b82525050565b6000613d928383613d77565b60208301905092915050565b6000602082019050919050565b6000613db682613d4b565b613dc08185613d56565b9350613dcb83613d67565b8060005b83811015613dfc578151613de38882613d86565b9750613dee83613d9e565b925050600181019050613dcf565b5085935050505092915050565b60006020820190508181036000830152613e238184613dab565b905092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613e6d82613ae5565b810181811067ffffffffffffffff82111715613e8c57613e8b613e35565b5b80604052505050565b6000613e9f613993565b9050613eab8282613e64565b919050565b600067ffffffffffffffff821115613ecb57613eca613e35565b5b613ed482613ae5565b9050602081019050919050565b82818337600083830152505050565b6000613f03613efe84613eb0565b613e95565b905082815260208101848484011115613f1f57613f1e613e30565b5b613f2a848285613ee1565b509392505050565b600082601f830112613f4757613f46613e2b565b5b8135613f57848260208601613ef0565b91505092915050565b600060208284031215613f7657613f7561399d565b5b600082013567ffffffffffffffff811115613f9457613f936139a2565b5b613fa084828501613f32565b91505092915050565b60008060408385031215613fc057613fbf61399d565b5b6000613fce85828601613c1d565b9250506020613fdf85828601613c89565b9150509250929050565b600067ffffffffffffffff82111561400457614003613e35565b5b61400d82613ae5565b9050602081019050919050565b600061402d61402884613fe9565b613e95565b90508281526020810184848401111561404957614048613e30565b5b614054848285613ee1565b509392505050565b600082601f83011261407157614070613e2b565b5b813561408184826020860161401a565b91505092915050565b600080600080608085870312156140a4576140a361399d565b5b60006140b287828801613c1d565b94505060206140c387828801613c1d565b93505060406140d487828801613b68565b925050606085013567ffffffffffffffff8111156140f5576140f46139a2565b5b6141018782880161405c565b91505092959194509250565b600080604083850312156141245761412361399d565b5b600061413285828601613c1d565b925050602061414385828601613c1d565b9150509250929050565b600067ffffffffffffffff82111561416857614167613e35565b5b602082029050602081019050919050565b600080fd5b600061419161418c8461414d565b613e95565b905080838252602082019050602084028301858111156141b4576141b3614179565b5b835b818110156141dd57806141c98882613c1d565b8452602084019350506020810190506141b6565b5050509392505050565b600082601f8301126141fc576141fb613e2b565b5b813561420c84826020860161417e565b91505092915050565b60006020828403121561422b5761422a61399d565b5b600082013567ffffffffffffffff811115614249576142486139a2565b5b614255848285016141e7565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806142a557607f821691505b6020821081036142b8576142b761425e565b5b50919050565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b600061431a602d83613aa1565b9150614325826142be565b604082019050919050565b600060208201905081810360008301526143498161430d565b9050919050565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b60006143ac602283613aa1565b91506143b782614350565b604082019050919050565b600060208201905081810360008301526143db8161439f565b9050919050565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b600061443e603983613aa1565b9150614449826143e2565b604082019050919050565b6000602082019050818103600083015261446d81614431565b9050919050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b60006144d0602283613aa1565b91506144db82614474565b604082019050919050565b600060208201905081810360008301526144ff816144c3565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061454082613a62565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361457257614571614506565b5b600182019050919050565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b60006145d9602e83613aa1565b91506145e48261457d565b604082019050919050565b60006020820190508181036000830152614608816145cc565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b600061469a602383613aa1565b91506146a58261463e565b604082019050919050565b600060208201905081810360008301526146c98161468d565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026147327fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826146f5565b61473c86836146f5565b95508019841693508086168417925050509392505050565b6000819050919050565b600061477961477461476f84613a62565b614754565b613a62565b9050919050565b6000819050919050565b6147938361475e565b6147a761479f82614780565b848454614702565b825550505050565b600090565b6147bc6147af565b6147c781848461478a565b505050565b5b818110156147eb576147e06000826147b4565b6001810190506147cd565b5050565b601f82111561483057614801816146d0565b61480a846146e5565b81016020851015614819578190505b61482d614825856146e5565b8301826147cc565b50505b505050565b600082821c905092915050565b600061485360001984600802614835565b1980831691505092915050565b600061486c8383614842565b9150826002028217905092915050565b61488582613a96565b67ffffffffffffffff81111561489e5761489d613e35565b5b6148a8825461428d565b6148b38282856147ef565b600060209050601f8311600181146148e657600084156148d4578287015190505b6148de8582614860565b865550614946565b601f1984166148f4866146d0565b60005b8281101561491c578489015182556001820191506020850194506020810190506148f7565b868310156149395784890151614935601f891682614842565b8355505b6001600288020188555050505b505050505050565b7f5061757365640000000000000000000000000000000000000000000000000000600082015250565b6000614984600683613aa1565b915061498f8261494e565b602082019050919050565b600060208201905081810360008301526149b381614977565b9050919050565b7f4e6f7420616c6c6f77656420746f206d696e7400000000000000000000000000600082015250565b60006149f0601383613aa1565b91506149fb826149ba565b602082019050919050565b60006020820190508181036000830152614a1f816149e3565b9050919050565b7f416d6f756e742065786365656465640000000000000000000000000000000000600082015250565b6000614a5c600f83613aa1565b9150614a6782614a26565b602082019050919050565b60006020820190508181036000830152614a8b81614a4f565b9050919050565b7f4d6178206672656520737570706c792065786365656465640000000000000000600082015250565b6000614ac8601883613aa1565b9150614ad382614a92565b602082019050919050565b60006020820190508181036000830152614af781614abb565b9050919050565b6000614b0982613a62565b9150614b1483613a62565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614b4957614b48614506565b5b828201905092915050565b6000614b5f82613a62565b9150614b6a83613a62565b925082821015614b7d57614b7c614506565b5b828203905092915050565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b6000614be4602b83613aa1565b9150614bef82614b88565b604082019050919050565b60006020820190508181036000830152614c1381614bd7565b9050919050565b7f416d6f756e742063616e2774206265207a65726f000000000000000000000000600082015250565b6000614c50601483613aa1565b9150614c5b82614c1a565b602082019050919050565b60006020820190508181036000830152614c7f81614c43565b9050919050565b7f46726565206d696e742069736e27742066696e69736865640000000000000000600082015250565b6000614cbc601883613aa1565b9150614cc782614c86565b602082019050919050565b60006020820190508181036000830152614ceb81614caf565b9050919050565b7f4d617820737570706c7920657863656564656400000000000000000000000000600082015250565b6000614d28601383613aa1565b9150614d3382614cf2565b602082019050919050565b60006020820190508181036000830152614d5781614d1b565b9050919050565b6000614d6982613a62565b9150614d7483613a62565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614dad57614dac614506565b5b828202905092915050565b7f496e73756666696369656e742066756e64730000000000000000000000000000600082015250565b6000614dee601283613aa1565b9150614df982614db8565b602082019050919050565b60006020820190508181036000830152614e1d81614de1565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614e5e82613a62565b9150614e6983613a62565b925082614e7957614e78614e24565b5b828204905092915050565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b6000614eba601a83613aa1565b9150614ec582614e84565b602082019050919050565b60006020820190508181036000830152614ee981614ead565b9050919050565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b6000614f4c603383613aa1565b9150614f5782614ef0565b604082019050919050565b60006020820190508181036000830152614f7b81614f3f565b9050919050565b7f416c7265616479206d696e746564000000000000000000000000000000000000600082015250565b6000614fb8600e83613aa1565b9150614fc382614f82565b602082019050919050565b60006020820190508181036000830152614fe781614fab565b9050919050565b7f446f6573206e6f742065786973742e0000000000000000000000000000000000600082015250565b6000615024600f83613aa1565b915061502f82614fee565b602082019050919050565b6000602082019050818103600083015261505381615017565b9050919050565b600081905092915050565b600061507082613a96565b61507a818561505a565b935061508a818560208601613ab2565b80840191505092915050565b600081546150a38161428d565b6150ad818661505a565b945060018216600081146150c857600181146150dd57615110565b60ff1983168652811515820286019350615110565b6150e6856146d0565b60005b83811015615108578154818901526001820191506020810190506150e9565b838801955050505b50505092915050565b60006151258286615065565b91506151318285615065565b915061513d8284615096565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006151a6602683613aa1565b91506151b18261514a565b604082019050919050565b600060208201905081810360008301526151d581615199565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000615212602083613aa1565b915061521d826151dc565b602082019050919050565b6000602082019050818103600083015261524181615205565b9050919050565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b60006152a4603283613aa1565b91506152af82615248565b604082019050919050565b600060208201905081810360008301526152d381615297565b9050919050565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b6000615336602683613aa1565b9150615341826152da565b604082019050919050565b6000602082019050818103600083015261536581615329565b9050919050565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006153c8602583613aa1565b91506153d38261536c565b604082019050919050565b600060208201905081810360008301526153f7816153bb565b9050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b6000615425826153fe565b9150615430836153fe565b92508282101561544357615442614506565b5b828203905092915050565b6000615459826153fe565b9150615464836153fe565b9250826fffffffffffffffffffffffffffffffff0382111561548957615488614506565b5b828201905092915050565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b60006154f0602a83613aa1565b91506154fb82615494565b604082019050919050565b6000602082019050818103600083015261551f816154e3565b9050919050565b600061553182613a62565b91506000820361554457615543614506565b5b600182039050919050565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b60006155ab602f83613aa1565b91506155b68261554f565b604082019050919050565b600060208201905081810360008301526155da8161559e565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000615608826155e1565b61561281856155ec565b9350615622818560208601613ab2565b61562b81613ae5565b840191505092915050565b600060808201905061564b6000830187613bdc565b6156586020830186613bdc565b6156656040830185613a6c565b818103606083015261567781846155fd565b905095945050505050565b600081519050615691816139d3565b92915050565b6000602082840312156156ad576156ac61399d565b5b60006156bb84828501615682565b91505092915050565b60006156cf82613a62565b91506156da83613a62565b9250826156ea576156e9614e24565b5b828206905092915050565b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000615751602183613aa1565b915061575c826156f5565b604082019050919050565b6000602082019050818103600083015261578081615744565b9050919050565b7f455243373231413a20746f6b656e20616c7265616479206d696e746564000000600082015250565b60006157bd601d83613aa1565b91506157c882615787565b602082019050919050565b600060208201905081810360008301526157ec816157b0565b9050919050565b7f455243373231413a207175616e7469747920746f206d696e7420746f6f20686960008201527f6768000000000000000000000000000000000000000000000000000000000000602082015250565b600061584f602283613aa1565b915061585a826157f3565b604082019050919050565b6000602082019050818103600083015261587e81615842565b905091905056fea26469706673582212208dda497d8db85ba008eda86a23e645aa1ffede282932d4119672678600fbbcd964736f6c634300080f0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000005168747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f516d6331453839696f5565574139565239706d784e786954367a6436574a634e67686259485970656e46686d37412f000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _initBaseURI (string): https://gateway.pinata.cloud/ipfs/Qmc1E89ioUeWA9VR9pmxNxiT6zd6WJcNghbYHYpenFhm7A/
-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000051
Arg [2] : 68747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066
Arg [3] : 732f516d6331453839696f5565574139565239706d784e786954367a6436574a
Arg [4] : 634e67686259485970656e46686d37412f000000000000000000000000000000
Deployed Bytecode Sourcemap
62299:6849:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49922:370;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62849:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51648:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53173:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52736:379;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69042:103;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66906:117;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62462:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68105:91;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48483:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63226:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54023:142;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62756:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67031:116;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49114:744;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62707:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67631:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62569:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54228:157;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65796:390;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66812:86;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67511:112;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48646:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68001:96;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64079:667;;;:::i;:::-;;63154:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51471:118;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68904:130;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68204:109;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50348:211;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5273:103;;;;;;;;;;;;;:::i;:::-;;68799:97;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63322:52;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4625:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62905:72;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68526:133;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51803:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62525:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62797;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64754:1034;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53441:274;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62612:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67387:116;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67747:120;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54448:311;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63728:343;;;:::i;:::-;;62418:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66194:610;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63069:76;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62984:78;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62656:44;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58863:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63381;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67877:116;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67155:114;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63187:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53778:186;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68667:124;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63269:46;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5531:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68321:197;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67277:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49922:370;50049:4;50094:25;50079:40;;;:11;:40;;;;:99;;;;50145:33;50130:48;;;:11;:48;;;;50079:99;:160;;;;50204:35;50189:50;;;:11;:50;;;;50079:160;:207;;;;50250:36;50274:11;50250:23;:36::i;:::-;50079:207;50065:221;;49922:370;;;:::o;62849:35::-;;;;:::o;51648:94::-;51702:13;51731:5;51724:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51648:94;:::o;53173:204::-;53241:7;53265:16;53273:7;53265;:16::i;:::-;53257:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;53347:15;:24;53363:7;53347:24;;;;;;;;;;;;;;;;;;;;;53340:31;;53173:204;;;:::o;52736:379::-;52805:13;52821:24;52837:7;52821:15;:24::i;:::-;52805:40;;52866:5;52860:11;;:2;:11;;;52852:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;52951:5;52935:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;52960:37;52977:5;52984:12;:10;:12::i;:::-;52960:16;:37::i;:::-;52935:62;52919:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;53081:28;53090:2;53094:7;53103:5;53081:8;:28::i;:::-;52798:317;52736:379;;:::o;69042:103::-;4511:13;:11;:13::i;:::-;69129:8:::1;69112:14;:25;;;;69042:103:::0;:::o;66906:117::-;66979:7;67011:4;;67004:11;;66906:117;:::o;62462:42::-;;;;:::o;68105:91::-;4511:13;:11;:13::i;:::-;68178:10:::1;68169:6;::::0;:19:::1;;;;;;;;;;;;;;;;;;68105:91:::0;:::o;48483:94::-;48536:7;48559:12;;48552:19;;48483:94;:::o;63226:36::-;;;;:::o;54023:142::-;54131:28;54141:4;54147:2;54151:7;54131:9;:28::i;:::-;54023:142;;;:::o;62756:32::-;;;;:::o;67031:116::-;4511:13;:11;:13::i;:::-;67129:10:::1;67109:17;:30;;;;67031:116:::0;:::o;49114:744::-;49223:7;49258:16;49268:5;49258:9;:16::i;:::-;49250:5;:24;49242:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;49320:22;49345:13;:11;:13::i;:::-;49320:38;;49365:19;49395:25;49445:9;49440:350;49464:14;49460:1;:18;49440:350;;;49494:31;49528:11;:14;49540:1;49528:14;;;;;;;;;;;49494:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49581:1;49555:28;;:9;:14;;;:28;;;49551:89;;49616:9;:14;;;49596:34;;49551:89;49673:5;49652:26;;:17;:26;;;49648:135;;49710:5;49695:11;:20;49691:59;;49737:1;49730:8;;;;;;;;;49691:59;49760:13;;;;;:::i;:::-;;;;49648:135;49485:305;49480:3;;;;;:::i;:::-;;;;49440:350;;;;49796:56;;;;;;;;;;:::i;:::-;;;;;;;;49114:744;;;;;:::o;62707:42::-;62744:5;62707:42;:::o;67631:108::-;4511:13;:11;:13::i;:::-;67720:11:::1;67705:12;;:26;;;;;;;;;;;;;;;;;;67631:108:::0;:::o;62569:36::-;;;;:::o;54228:157::-;54340:39;54357:4;54363:2;54367:7;54340:39;;;;;;;;;;;;:16;:39::i;:::-;54228:157;;;:::o;65796:390::-;65883:16;65917:23;65943:17;65953:6;65943:9;:17::i;:::-;65917:43;;65971:25;66013:15;65999:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65971:58;;66045:9;66040:113;66060:15;66056:1;:19;66040:113;;;66111:30;66131:6;66139:1;66111:19;:30::i;:::-;66097:8;66106:1;66097:11;;;;;;;;:::i;:::-;;;;;;;:44;;;;;66077:3;;;;;:::i;:::-;;;;66040:113;;;;66170:8;66163:15;;;;65796:390;;;:::o;66812:86::-;4511:13;:11;:13::i;:::-;66882:8:::1;66875:4;:15;;;;66812:86:::0;:::o;67511:112::-;4511:13;:11;:13::i;:::-;67605:10:::1;67587:15;:28;;;;67511:112:::0;:::o;48646:177::-;48713:7;48745:13;:11;:13::i;:::-;48737:5;:21;48729:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;48812:5;48805:12;;48646:177;;;:::o;68001:96::-;4511:13;:11;:13::i;:::-;68082:7:::1;68072;:17;;;;;;:::i;:::-;;68001:96:::0;:::o;64079:667::-;64134:6;;;;;;;;;;64133:7;64125:26;;;;;;;;;;;;:::i;:::-;;;;;;;;;64162:16;64181:15;64162:34;;64230:14;;64215:11;:29;;:88;;;;64264:11;;64249;:26;;:53;;;;;64279:11;:23;64291:10;64279:23;;;;;;;;;;;;;;;;;;;;;;;;;64249:53;64215:88;64207:120;;;;;;;;;;;;:::i;:::-;;;;;;;;;64379:17;;64346;:29;64364:10;64346:29;;;;;;;;;;;;;;;;:50;;64338:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;64427:14;64444:13;:11;:13::i;:::-;64427:30;;64485:10;;64476:6;:19;64468:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;64535:18;64587:10;;64566:17;;64557:6;:26;;;;:::i;:::-;:40;;:82;;64633:6;64620:10;;:19;;;;:::i;:::-;64557:82;;;64600:17;;64557:82;64535:105;;64651:33;64661:10;64673;64651:9;:33::i;:::-;64728:10;64695:17;:29;64713:10;64695:29;;;;;;;;;;;;;;;;:43;;;;;;;:::i;:::-;;;;;;;;64114:632;;;64079:667::o;63154:26::-;;;;;;;;;;;;:::o;51471:118::-;51535:7;51558:20;51570:7;51558:11;:20::i;:::-;:25;;;51551:32;;51471:118;;;:::o;68904:130::-;68983:4;69012:14;;69005:21;;68904:130;:::o;68204:109::-;68275:4;68299:6;;;;;;;;;;68292:13;;68204:109;:::o;50348:211::-;50412:7;50453:1;50436:19;;:5;:19;;;50428:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;50525:12;:19;50538:5;50525:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;50517:36;;50510:43;;50348:211;;;:::o;5273:103::-;4511:13;:11;:13::i;:::-;5338:30:::1;5365:1;5338:18;:30::i;:::-;5273:103::o:0;68799:97::-;4511:13;:11;:13::i;:::-;68880:8:::1;68866:11;:22;;;;68799:97:::0;:::o;63322:52::-;;;;;;;;;;;;;;;;;:::o;4625:87::-;4671:7;4698:6;;;;;;;;;;;4691:13;;4625:87;:::o;62905:72::-;;;;;;;;;;;;;:::o;68526:133::-;4511:13;:11;:13::i;:::-;68639:12:::1;68615:11;:21;68627:8;68615:21;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;68526:133:::0;;:::o;51803:98::-;51859:13;51888:7;51881:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51803:98;:::o;62525:37::-;;;;:::o;62797:::-;;;;:::o;64754:1034::-;64819:6;;;;;;;;;;64818:7;64810:26;;;;;;;;;;;;:::i;:::-;;;;;;;;;64847:16;64866:15;64847:34;;64915:14;;64900:11;:29;;:88;;;;64949:11;;64934;:26;;:53;;;;;64964:11;:23;64976:10;64964:23;;;;;;;;;;;;;;;;;;;;;;;;;64934:53;64900:88;64892:120;;;;;;;;;;;;:::i;:::-;;;;;;;;;65040:1;65031:6;:10;65023:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;65095:16;;65085:6;:26;;65077:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;65142:14;65159:13;:11;:13::i;:::-;65142:30;;65201:10;;65191:6;:20;;65183:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;62744:5;65268:6;65259;:15;;;;:::i;:::-;:29;;65251:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;65351:6;65344:4;;:13;;;;:::i;:::-;65331:9;:26;;65323:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;65391:29;65401:10;65413:6;65391:9;:29::i;:::-;65441:22;65510:4;65490:17;;65466:21;:41;;;;:::i;:::-;:48;;;;:::i;:::-;65441:73;;65525:20;65590:4;65572:15;;65548:21;:39;;;;:::i;:::-;:46;;;;:::i;:::-;65525:69;;65613:18;;;;;;;;;;;65605:36;;:52;65642:14;65605:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65676:16;;;;;;;;;;;65668:34;;:48;65703:12;65668:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65735:12;;;;;;;;;;;65727:30;;:53;65758:21;65727:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64799:989;;;;64754:1034;:::o;53441:274::-;53544:12;:10;:12::i;:::-;53532:24;;:8;:24;;;53524:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;53641:8;53596:18;:32;53615:12;:10;:12::i;:::-;53596:32;;;;;;;;;;;;;;;:42;53629:8;53596:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;53690:8;53661:48;;53676:12;:10;:12::i;:::-;53661:48;;;53700:8;53661:48;;;;;;:::i;:::-;;;;;;;;53441:274;;:::o;62612:35::-;;;;:::o;67387:116::-;4511:13;:11;:13::i;:::-;67485:10:::1;67465:17;:30;;;;67387:116:::0;:::o;67747:120::-;4511:13;:11;:13::i;:::-;67848:11:::1;67827:18;;:32;;;;;;;;;;;;;;;;;;67747:120:::0;:::o;54448:311::-;54585:28;54595:4;54601:2;54605:7;54585:9;:28::i;:::-;54636:48;54659:4;54665:2;54669:7;54678:5;54636:22;:48::i;:::-;54620:133;;;;;;;;;;;;:::i;:::-;;;;;;;;;54448:311;;;;:::o;63728:343::-;4511:13;:11;:13::i;:::-;63793:6:::1;::::0;::::1;;;;;;;;63792:7;63784:26;;;;;;;;;;;;:::i;:::-;;;;;;;;;63830:10;;;;;;;;;;;63829:11;63821:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;63872:14;63889:13;:11;:13::i;:::-;63872:30;;63948:10;;63930:14;;63921:6;:23;;;;:::i;:::-;:37;;63913:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;63998:37;64008:10;64020:14;;63998:9;:37::i;:::-;64059:4;64046:10;;:17;;;;;;;;;;;;;;;;;;63773:298;63728:343::o:0;62418:37::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;66194:610::-;66312:13;66365:16;66373:7;66365;:16::i;:::-;66343:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;66437:28;66468:10;:8;:10::i;:::-;66437:41;;66540:1;66515:14;66509:28;:32;:287;;;;;;;;;;;;;;;;;66633:14;66674:18;:7;:16;:18::i;:::-;66719:13;66590:165;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;66509:287;66489:307;;;66194:610;;;:::o;63069:76::-;;;;;;;;;;;;;:::o;62984:78::-;;;;;;;;;;;;;:::o;62656:44::-;62697:3;62656:44;:::o;58863:43::-;;;;:::o;63381:::-;;;;;;;;;;;;;;;;;;;;;;:::o;67877:116::-;4511:13;:11;:13::i;:::-;67974:11:::1;67955:16;;:30;;;;;;;;;;;;;;;;;;67877:116:::0;:::o;67155:114::-;4511:13;:11;:13::i;:::-;67251:10:::1;67232:16;:29;;;;67155:114:::0;:::o;63187:30::-;;;;;;;;;;;;;:::o;53778:186::-;53900:4;53923:18;:25;53942:5;53923:25;;;;;;;;;;;;;;;:35;53949:8;53923:35;;;;;;;;;;;;;;;;;;;;;;;;;53916:42;;53778:186;;;;:::o;68667:124::-;68743:4;68772:11;;68765:18;;68667:124;:::o;63269:46::-;;;;:::o;5531:201::-;4511:13;:11;:13::i;:::-;5640:1:::1;5620:22;;:8;:22;;::::0;5612:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;5696:28;5715:8;5696:18;:28::i;:::-;5531:201:::0;:::o;68321:197::-;4511:13;:11;:13::i;:::-;68413:6:::1;68408:103;68429:9;:16;68425:1;:20;68408:103;;;68495:4;68467:11;:25;68479:9;68489:1;68479:12;;;;;;;;:::i;:::-;;;;;;;;68467:25;;;;;;;;;;;;;;;;:32;;;;;;;;;;;;;;;;;;68447:3;;;;;:::i;:::-;;;;68408:103;;;;68321:197:::0;:::o;67277:102::-;4511:13;:11;:13::i;:::-;67361:10:::1;67348;:23;;;;67277:102:::0;:::o;17479:157::-;17564:4;17603:25;17588:40;;;:11;:40;;;;17581:47;;17479:157;;;:::o;54998:105::-;55055:4;55085:12;;55075:7;:22;55068:29;;54998:105;;;:::o;3176:98::-;3229:7;3256:10;3249:17;;3176:98;:::o;58685:172::-;58809:2;58782:15;:24;58798:7;58782:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;58843:7;58839:2;58823:28;;58832:5;58823:28;;;;;;;;;;;;58685:172;;;:::o;4790:132::-;4865:12;:10;:12::i;:::-;4854:23;;:7;:5;:7::i;:::-;:23;;;4846:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4790:132::o;57050:1529::-;57147:35;57185:20;57197:7;57185:11;:20::i;:::-;57147:58;;57214:22;57256:13;:18;;;57240:34;;:12;:10;:12::i;:::-;:34;;;:81;;;;57309:12;:10;:12::i;:::-;57285:36;;:20;57297:7;57285:11;:20::i;:::-;:36;;;57240:81;:142;;;;57332:50;57349:13;:18;;;57369:12;:10;:12::i;:::-;57332:16;:50::i;:::-;57240:142;57214:169;;57408:17;57392:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;57540:4;57518:26;;:13;:18;;;:26;;;57502:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;57629:1;57615:16;;:2;:16;;;57607:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;57682:43;57704:4;57710:2;57714:7;57723:1;57682:21;:43::i;:::-;57782:49;57799:1;57803:7;57812:13;:18;;;57782:8;:49::i;:::-;57870:1;57840:12;:18;57853:4;57840:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;57906:1;57878:12;:16;57891:2;57878:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;57937:43;;;;;;;;57952:2;57937:43;;;;;;57963:15;57937:43;;;;;57914:11;:20;57926:7;57914:20;;;;;;;;;;;:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58208:19;58240:1;58230:7;:11;;;;:::i;:::-;58208:33;;58293:1;58252:43;;:11;:24;58264:11;58252:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;58248:236;;58310:20;58318:11;58310:7;:20::i;:::-;58306:171;;;58370:97;;;;;;;;58397:13;:18;;;58370:97;;;;;;58428:13;:28;;;58370:97;;;;;58343:11;:24;58355:11;58343:24;;;;;;;;;;;:124;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58306:171;58248:236;58516:7;58512:2;58497:27;;58506:4;58497:27;;;;;;;;;;;;58531:42;58552:4;58558:2;58562:7;58571:1;58531:20;:42::i;:::-;57140:1439;;;57050:1529;;;:::o;55109:98::-;55174:27;55184:2;55188:8;55174:27;;;;;;;;;;;;:9;:27::i;:::-;55109:98;;:::o;50811:606::-;50887:21;;:::i;:::-;50928:16;50936:7;50928;:16::i;:::-;50920:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;51000:26;51048:12;51037:7;:23;51033:93;;51117:1;51102:12;51092:7;:22;;;;:::i;:::-;:26;;;;:::i;:::-;51071:47;;51033:93;51139:12;51154:7;51139:22;;51134:212;51171:18;51163:4;:26;51134:212;;51208:31;51242:11;:17;51254:4;51242:17;;;;;;;;;;;51208:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51298:1;51272:28;;:9;:14;;;:28;;;51268:71;;51320:9;51313:16;;;;;;;51268:71;51199:147;51191:6;;;;;:::i;:::-;;;;51134:212;;;;51354:57;;;;;;;;;;:::i;:::-;;;;;;;;50811:606;;;;:::o;5892:191::-;5966:16;5985:6;;;;;;;;;;;5966:25;;6011:8;6002:6;;:17;;;;;;;;;;;;;;;;;;6066:8;6035:40;;6056:8;6035:40;;;;;;;;;;;;5955:128;5892:191;:::o;60400:690::-;60537:4;60554:15;:2;:13;;;:15::i;:::-;60550:535;;;60609:2;60593:36;;;60630:12;:10;:12::i;:::-;60644:4;60650:7;60659:5;60593:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;60580:464;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60841:1;60824:6;:13;:18;60820:215;;60857:61;;;;;;;;;;:::i;:::-;;;;;;;;60820:215;61003:6;60997:13;60988:6;60984:2;60980:15;60973:38;60580:464;60725:45;;;60715:55;;;:6;:55;;;;60708:62;;;;;60550:535;61073:4;61066:11;;60400:690;;;;;;;:::o;63612:108::-;63672:13;63705:7;63698:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63612:108;:::o;430:723::-;486:13;716:1;707:5;:10;703:53;;734:10;;;;;;;;;;;;;;;;;;;;;703:53;766:12;781:5;766:20;;797:14;822:78;837:1;829:4;:9;822:78;;855:8;;;;;:::i;:::-;;;;886:2;878:10;;;;;:::i;:::-;;;822:78;;;910:19;942:6;932:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;910:39;;960:154;976:1;967:5;:10;960:154;;1004:1;994:11;;;;;:::i;:::-;;;1071:2;1063:5;:10;;;;:::i;:::-;1050:2;:24;;;;:::i;:::-;1037:39;;1020:6;1027;1020:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1100:2;1091:11;;;;;:::i;:::-;;;960:154;;;1138:6;1124:21;;;;;430:723;;;;:::o;61552:141::-;;;;;:::o;62079:140::-;;;;;:::o;55546:1272::-;55651:20;55674:12;;55651:35;;55715:1;55701:16;;:2;:16;;;55693:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;55892:21;55900:12;55892:7;:21::i;:::-;55891:22;55883:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;55974:12;55962:8;:24;;55954:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;56034:61;56064:1;56068:2;56072:12;56086:8;56034:21;:61::i;:::-;56104:30;56137:12;:16;56150:2;56137:16;;;;;;;;;;;;;;;56104:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56179:119;;;;;;;;56229:8;56199:11;:19;;;:39;;;;:::i;:::-;56179:119;;;;;;56282:8;56247:11;:24;;;:44;;;;:::i;:::-;56179:119;;;;;56160:12;:16;56173:2;56160:16;;;;;;;;;;;;;;;:138;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56333:43;;;;;;;;56348:2;56333:43;;;;;;56359:15;56333:43;;;;;56305:11;:25;56317:12;56305:25;;;;;;;;;;;:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56385:20;56408:12;56385:35;;56434:9;56429:281;56453:8;56449:1;:12;56429:281;;;56507:12;56503:2;56482:38;;56499:1;56482:38;;;;;;;;;;;;56547:59;56578:1;56582:2;56586:12;56600:5;56547:22;:59::i;:::-;56529:150;;;;;;;;;;;;:::i;:::-;;;;;;;;;56688:14;;;;;:::i;:::-;;;;56463:3;;;;;:::i;:::-;;;;56429:281;;;;56733:12;56718;:27;;;;56752:60;56781:1;56785:2;56789:12;56803:8;56752:20;:60::i;:::-;55644:1174;;;55546:1272;;;:::o;7323:326::-;7383:4;7640:1;7618:7;:19;;;:23;7611:30;;7323:326;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;:::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:77::-;1555:7;1584:5;1573:16;;1518:77;;;:::o;1601:118::-;1688:24;1706:5;1688:24;:::i;:::-;1683:3;1676:37;1601:118;;:::o;1725:222::-;1818:4;1856:2;1845:9;1841:18;1833:26;;1869:71;1937:1;1926:9;1922:17;1913:6;1869:71;:::i;:::-;1725:222;;;;:::o;1953:99::-;2005:6;2039:5;2033:12;2023:22;;1953:99;;;:::o;2058:169::-;2142:11;2176:6;2171:3;2164:19;2216:4;2211:3;2207:14;2192:29;;2058:169;;;;:::o;2233:307::-;2301:1;2311:113;2325:6;2322:1;2319:13;2311:113;;;2410:1;2405:3;2401:11;2395:18;2391:1;2386:3;2382:11;2375:39;2347:2;2344:1;2340:10;2335:15;;2311:113;;;2442:6;2439:1;2436:13;2433:101;;;2522:1;2513:6;2508:3;2504:16;2497:27;2433:101;2282:258;2233:307;;;:::o;2546:102::-;2587:6;2638:2;2634:7;2629:2;2622:5;2618:14;2614:28;2604:38;;2546:102;;;:::o;2654:364::-;2742:3;2770:39;2803:5;2770:39;:::i;:::-;2825:71;2889:6;2884:3;2825:71;:::i;:::-;2818:78;;2905:52;2950:6;2945:3;2938:4;2931:5;2927:16;2905:52;:::i;:::-;2982:29;3004:6;2982:29;:::i;:::-;2977:3;2973:39;2966:46;;2746:272;2654:364;;;;:::o;3024:313::-;3137:4;3175:2;3164:9;3160:18;3152:26;;3224:9;3218:4;3214:20;3210:1;3199:9;3195:17;3188:47;3252:78;3325:4;3316:6;3252:78;:::i;:::-;3244:86;;3024:313;;;;:::o;3343:122::-;3416:24;3434:5;3416:24;:::i;:::-;3409:5;3406:35;3396:63;;3455:1;3452;3445:12;3396:63;3343:122;:::o;3471:139::-;3517:5;3555:6;3542:20;3533:29;;3571:33;3598:5;3571:33;:::i;:::-;3471:139;;;;:::o;3616:329::-;3675:6;3724:2;3712:9;3703:7;3699:23;3695:32;3692:119;;;3730:79;;:::i;:::-;3692:119;3850:1;3875:53;3920:7;3911:6;3900:9;3896:22;3875:53;:::i;:::-;3865:63;;3821:117;3616:329;;;;:::o;3951:126::-;3988:7;4028:42;4021:5;4017:54;4006:65;;3951:126;;;:::o;4083:96::-;4120:7;4149:24;4167:5;4149:24;:::i;:::-;4138:35;;4083:96;;;:::o;4185:118::-;4272:24;4290:5;4272:24;:::i;:::-;4267:3;4260:37;4185:118;;:::o;4309:222::-;4402:4;4440:2;4429:9;4425:18;4417:26;;4453:71;4521:1;4510:9;4506:17;4497:6;4453:71;:::i;:::-;4309:222;;;;:::o;4537:122::-;4610:24;4628:5;4610:24;:::i;:::-;4603:5;4600:35;4590:63;;4649:1;4646;4639:12;4590:63;4537:122;:::o;4665:139::-;4711:5;4749:6;4736:20;4727:29;;4765:33;4792:5;4765:33;:::i;:::-;4665:139;;;;:::o;4810:474::-;4878:6;4886;4935:2;4923:9;4914:7;4910:23;4906:32;4903:119;;;4941:79;;:::i;:::-;4903:119;5061:1;5086:53;5131:7;5122:6;5111:9;5107:22;5086:53;:::i;:::-;5076:63;;5032:117;5188:2;5214:53;5259:7;5250:6;5239:9;5235:22;5214:53;:::i;:::-;5204:63;;5159:118;4810:474;;;;;:::o;5290:116::-;5360:21;5375:5;5360:21;:::i;:::-;5353:5;5350:32;5340:60;;5396:1;5393;5386:12;5340:60;5290:116;:::o;5412:133::-;5455:5;5493:6;5480:20;5471:29;;5509:30;5533:5;5509:30;:::i;:::-;5412:133;;;;:::o;5551:323::-;5607:6;5656:2;5644:9;5635:7;5631:23;5627:32;5624:119;;;5662:79;;:::i;:::-;5624:119;5782:1;5807:50;5849:7;5840:6;5829:9;5825:22;5807:50;:::i;:::-;5797:60;;5753:114;5551:323;;;;:::o;5880:619::-;5957:6;5965;5973;6022:2;6010:9;6001:7;5997:23;5993:32;5990:119;;;6028:79;;:::i;:::-;5990:119;6148:1;6173:53;6218:7;6209:6;6198:9;6194:22;6173:53;:::i;:::-;6163:63;;6119:117;6275:2;6301:53;6346:7;6337:6;6326:9;6322:22;6301:53;:::i;:::-;6291:63;;6246:118;6403:2;6429:53;6474:7;6465:6;6454:9;6450:22;6429:53;:::i;:::-;6419:63;;6374:118;5880:619;;;;;:::o;6505:329::-;6564:6;6613:2;6601:9;6592:7;6588:23;6584:32;6581:119;;;6619:79;;:::i;:::-;6581:119;6739:1;6764:53;6809:7;6800:6;6789:9;6785:22;6764:53;:::i;:::-;6754:63;;6710:117;6505:329;;;;:::o;6840:114::-;6907:6;6941:5;6935:12;6925:22;;6840:114;;;:::o;6960:184::-;7059:11;7093:6;7088:3;7081:19;7133:4;7128:3;7124:14;7109:29;;6960:184;;;;:::o;7150:132::-;7217:4;7240:3;7232:11;;7270:4;7265:3;7261:14;7253:22;;7150:132;;;:::o;7288:108::-;7365:24;7383:5;7365:24;:::i;:::-;7360:3;7353:37;7288:108;;:::o;7402:179::-;7471:10;7492:46;7534:3;7526:6;7492:46;:::i;:::-;7570:4;7565:3;7561:14;7547:28;;7402:179;;;;:::o;7587:113::-;7657:4;7689;7684:3;7680:14;7672:22;;7587:113;;;:::o;7736:732::-;7855:3;7884:54;7932:5;7884:54;:::i;:::-;7954:86;8033:6;8028:3;7954:86;:::i;:::-;7947:93;;8064:56;8114:5;8064:56;:::i;:::-;8143:7;8174:1;8159:284;8184:6;8181:1;8178:13;8159:284;;;8260:6;8254:13;8287:63;8346:3;8331:13;8287:63;:::i;:::-;8280:70;;8373:60;8426:6;8373:60;:::i;:::-;8363:70;;8219:224;8206:1;8203;8199:9;8194:14;;8159:284;;;8163:14;8459:3;8452:10;;7860:608;;;7736:732;;;;:::o;8474:373::-;8617:4;8655:2;8644:9;8640:18;8632:26;;8704:9;8698:4;8694:20;8690:1;8679:9;8675:17;8668:47;8732:108;8835:4;8826:6;8732:108;:::i;:::-;8724:116;;8474:373;;;;:::o;8853:117::-;8962:1;8959;8952:12;8976:117;9085:1;9082;9075:12;9099:180;9147:77;9144:1;9137:88;9244:4;9241:1;9234:15;9268:4;9265:1;9258:15;9285:281;9368:27;9390:4;9368:27;:::i;:::-;9360:6;9356:40;9498:6;9486:10;9483:22;9462:18;9450:10;9447:34;9444:62;9441:88;;;9509:18;;:::i;:::-;9441:88;9549:10;9545:2;9538:22;9328:238;9285:281;;:::o;9572:129::-;9606:6;9633:20;;:::i;:::-;9623:30;;9662:33;9690:4;9682:6;9662:33;:::i;:::-;9572:129;;;:::o;9707:308::-;9769:4;9859:18;9851:6;9848:30;9845:56;;;9881:18;;:::i;:::-;9845:56;9919:29;9941:6;9919:29;:::i;:::-;9911:37;;10003:4;9997;9993:15;9985:23;;9707:308;;;:::o;10021:154::-;10105:6;10100:3;10095;10082:30;10167:1;10158:6;10153:3;10149:16;10142:27;10021:154;;;:::o;10181:412::-;10259:5;10284:66;10300:49;10342:6;10300:49;:::i;:::-;10284:66;:::i;:::-;10275:75;;10373:6;10366:5;10359:21;10411:4;10404:5;10400:16;10449:3;10440:6;10435:3;10431:16;10428:25;10425:112;;;10456:79;;:::i;:::-;10425:112;10546:41;10580:6;10575:3;10570;10546:41;:::i;:::-;10265:328;10181:412;;;;;:::o;10613:340::-;10669:5;10718:3;10711:4;10703:6;10699:17;10695:27;10685:122;;10726:79;;:::i;:::-;10685:122;10843:6;10830:20;10868:79;10943:3;10935:6;10928:4;10920:6;10916:17;10868:79;:::i;:::-;10859:88;;10675:278;10613:340;;;;:::o;10959:509::-;11028:6;11077:2;11065:9;11056:7;11052:23;11048:32;11045:119;;;11083:79;;:::i;:::-;11045:119;11231:1;11220:9;11216:17;11203:31;11261:18;11253:6;11250:30;11247:117;;;11283:79;;:::i;:::-;11247:117;11388:63;11443:7;11434:6;11423:9;11419:22;11388:63;:::i;:::-;11378:73;;11174:287;10959:509;;;;:::o;11474:468::-;11539:6;11547;11596:2;11584:9;11575:7;11571:23;11567:32;11564:119;;;11602:79;;:::i;:::-;11564:119;11722:1;11747:53;11792:7;11783:6;11772:9;11768:22;11747:53;:::i;:::-;11737:63;;11693:117;11849:2;11875:50;11917:7;11908:6;11897:9;11893:22;11875:50;:::i;:::-;11865:60;;11820:115;11474:468;;;;;:::o;11948:307::-;12009:4;12099:18;12091:6;12088:30;12085:56;;;12121:18;;:::i;:::-;12085:56;12159:29;12181:6;12159:29;:::i;:::-;12151:37;;12243:4;12237;12233:15;12225:23;;11948:307;;;:::o;12261:410::-;12338:5;12363:65;12379:48;12420:6;12379:48;:::i;:::-;12363:65;:::i;:::-;12354:74;;12451:6;12444:5;12437:21;12489:4;12482:5;12478:16;12527:3;12518:6;12513:3;12509:16;12506:25;12503:112;;;12534:79;;:::i;:::-;12503:112;12624:41;12658:6;12653:3;12648;12624:41;:::i;:::-;12344:327;12261:410;;;;;:::o;12690:338::-;12745:5;12794:3;12787:4;12779:6;12775:17;12771:27;12761:122;;12802:79;;:::i;:::-;12761:122;12919:6;12906:20;12944:78;13018:3;13010:6;13003:4;12995:6;12991:17;12944:78;:::i;:::-;12935:87;;12751:277;12690:338;;;;:::o;13034:943::-;13129:6;13137;13145;13153;13202:3;13190:9;13181:7;13177:23;13173:33;13170:120;;;13209:79;;:::i;:::-;13170:120;13329:1;13354:53;13399:7;13390:6;13379:9;13375:22;13354:53;:::i;:::-;13344:63;;13300:117;13456:2;13482:53;13527:7;13518:6;13507:9;13503:22;13482:53;:::i;:::-;13472:63;;13427:118;13584:2;13610:53;13655:7;13646:6;13635:9;13631:22;13610:53;:::i;:::-;13600:63;;13555:118;13740:2;13729:9;13725:18;13712:32;13771:18;13763:6;13760:30;13757:117;;;13793:79;;:::i;:::-;13757:117;13898:62;13952:7;13943:6;13932:9;13928:22;13898:62;:::i;:::-;13888:72;;13683:287;13034:943;;;;;;;:::o;13983:474::-;14051:6;14059;14108:2;14096:9;14087:7;14083:23;14079:32;14076:119;;;14114:79;;:::i;:::-;14076:119;14234:1;14259:53;14304:7;14295:6;14284:9;14280:22;14259:53;:::i;:::-;14249:63;;14205:117;14361:2;14387:53;14432:7;14423:6;14412:9;14408:22;14387:53;:::i;:::-;14377:63;;14332:118;13983:474;;;;;:::o;14463:311::-;14540:4;14630:18;14622:6;14619:30;14616:56;;;14652:18;;:::i;:::-;14616:56;14702:4;14694:6;14690:17;14682:25;;14762:4;14756;14752:15;14744:23;;14463:311;;;:::o;14780:117::-;14889:1;14886;14879:12;14920:710;15016:5;15041:81;15057:64;15114:6;15057:64;:::i;:::-;15041:81;:::i;:::-;15032:90;;15142:5;15171:6;15164:5;15157:21;15205:4;15198:5;15194:16;15187:23;;15258:4;15250:6;15246:17;15238:6;15234:30;15287:3;15279:6;15276:15;15273:122;;;15306:79;;:::i;:::-;15273:122;15421:6;15404:220;15438:6;15433:3;15430:15;15404:220;;;15513:3;15542:37;15575:3;15563:10;15542:37;:::i;:::-;15537:3;15530:50;15609:4;15604:3;15600:14;15593:21;;15480:144;15464:4;15459:3;15455:14;15448:21;;15404:220;;;15408:21;15022:608;;14920:710;;;;;:::o;15653:370::-;15724:5;15773:3;15766:4;15758:6;15754:17;15750:27;15740:122;;15781:79;;:::i;:::-;15740:122;15898:6;15885:20;15923:94;16013:3;16005:6;15998:4;15990:6;15986:17;15923:94;:::i;:::-;15914:103;;15730:293;15653:370;;;;:::o;16029:539::-;16113:6;16162:2;16150:9;16141:7;16137:23;16133:32;16130:119;;;16168:79;;:::i;:::-;16130:119;16316:1;16305:9;16301:17;16288:31;16346:18;16338:6;16335:30;16332:117;;;16368:79;;:::i;:::-;16332:117;16473:78;16543:7;16534:6;16523:9;16519:22;16473:78;:::i;:::-;16463:88;;16259:302;16029:539;;;;:::o;16574:180::-;16622:77;16619:1;16612:88;16719:4;16716:1;16709:15;16743:4;16740:1;16733:15;16760:320;16804:6;16841:1;16835:4;16831:12;16821:22;;16888:1;16882:4;16878:12;16909:18;16899:81;;16965:4;16957:6;16953:17;16943:27;;16899:81;17027:2;17019:6;17016:14;16996:18;16993:38;16990:84;;17046:18;;:::i;:::-;16990:84;16811:269;16760:320;;;:::o;17086:232::-;17226:34;17222:1;17214:6;17210:14;17203:58;17295:15;17290:2;17282:6;17278:15;17271:40;17086:232;:::o;17324:366::-;17466:3;17487:67;17551:2;17546:3;17487:67;:::i;:::-;17480:74;;17563:93;17652:3;17563:93;:::i;:::-;17681:2;17676:3;17672:12;17665:19;;17324:366;;;:::o;17696:419::-;17862:4;17900:2;17889:9;17885:18;17877:26;;17949:9;17943:4;17939:20;17935:1;17924:9;17920:17;17913:47;17977:131;18103:4;17977:131;:::i;:::-;17969:139;;17696:419;;;:::o;18121:221::-;18261:34;18257:1;18249:6;18245:14;18238:58;18330:4;18325:2;18317:6;18313:15;18306:29;18121:221;:::o;18348:366::-;18490:3;18511:67;18575:2;18570:3;18511:67;:::i;:::-;18504:74;;18587:93;18676:3;18587:93;:::i;:::-;18705:2;18700:3;18696:12;18689:19;;18348:366;;;:::o;18720:419::-;18886:4;18924:2;18913:9;18909:18;18901:26;;18973:9;18967:4;18963:20;18959:1;18948:9;18944:17;18937:47;19001:131;19127:4;19001:131;:::i;:::-;18993:139;;18720:419;;;:::o;19145:244::-;19285:34;19281:1;19273:6;19269:14;19262:58;19354:27;19349:2;19341:6;19337:15;19330:52;19145:244;:::o;19395:366::-;19537:3;19558:67;19622:2;19617:3;19558:67;:::i;:::-;19551:74;;19634:93;19723:3;19634:93;:::i;:::-;19752:2;19747:3;19743:12;19736:19;;19395:366;;;:::o;19767:419::-;19933:4;19971:2;19960:9;19956:18;19948:26;;20020:9;20014:4;20010:20;20006:1;19995:9;19991:17;19984:47;20048:131;20174:4;20048:131;:::i;:::-;20040:139;;19767:419;;;:::o;20192:221::-;20332:34;20328:1;20320:6;20316:14;20309:58;20401:4;20396:2;20388:6;20384:15;20377:29;20192:221;:::o;20419:366::-;20561:3;20582:67;20646:2;20641:3;20582:67;:::i;:::-;20575:74;;20658:93;20747:3;20658:93;:::i;:::-;20776:2;20771:3;20767:12;20760:19;;20419:366;;;:::o;20791:419::-;20957:4;20995:2;20984:9;20980:18;20972:26;;21044:9;21038:4;21034:20;21030:1;21019:9;21015:17;21008:47;21072:131;21198:4;21072:131;:::i;:::-;21064:139;;20791:419;;;:::o;21216:180::-;21264:77;21261:1;21254:88;21361:4;21358:1;21351:15;21385:4;21382:1;21375:15;21402:233;21441:3;21464:24;21482:5;21464:24;:::i;:::-;21455:33;;21510:66;21503:5;21500:77;21497:103;;21580:18;;:::i;:::-;21497:103;21627:1;21620:5;21616:13;21609:20;;21402:233;;;:::o;21641:::-;21781:34;21777:1;21769:6;21765:14;21758:58;21850:16;21845:2;21837:6;21833:15;21826:41;21641:233;:::o;21880:366::-;22022:3;22043:67;22107:2;22102:3;22043:67;:::i;:::-;22036:74;;22119:93;22208:3;22119:93;:::i;:::-;22237:2;22232:3;22228:12;22221:19;;21880:366;;;:::o;22252:419::-;22418:4;22456:2;22445:9;22441:18;22433:26;;22505:9;22499:4;22495:20;22491:1;22480:9;22476:17;22469:47;22533:131;22659:4;22533:131;:::i;:::-;22525:139;;22252:419;;;:::o;22677:180::-;22725:77;22722:1;22715:88;22822:4;22819:1;22812:15;22846:4;22843:1;22836:15;22863:222;23003:34;22999:1;22991:6;22987:14;22980:58;23072:5;23067:2;23059:6;23055:15;23048:30;22863:222;:::o;23091:366::-;23233:3;23254:67;23318:2;23313:3;23254:67;:::i;:::-;23247:74;;23330:93;23419:3;23330:93;:::i;:::-;23448:2;23443:3;23439:12;23432:19;;23091:366;;;:::o;23463:419::-;23629:4;23667:2;23656:9;23652:18;23644:26;;23716:9;23710:4;23706:20;23702:1;23691:9;23687:17;23680:47;23744:131;23870:4;23744:131;:::i;:::-;23736:139;;23463:419;;;:::o;23888:141::-;23937:4;23960:3;23952:11;;23983:3;23980:1;23973:14;24017:4;24014:1;24004:18;23996:26;;23888:141;;;:::o;24035:93::-;24072:6;24119:2;24114;24107:5;24103:14;24099:23;24089:33;;24035:93;;;:::o;24134:107::-;24178:8;24228:5;24222:4;24218:16;24197:37;;24134:107;;;;:::o;24247:393::-;24316:6;24366:1;24354:10;24350:18;24389:97;24419:66;24408:9;24389:97;:::i;:::-;24507:39;24537:8;24526:9;24507:39;:::i;:::-;24495:51;;24579:4;24575:9;24568:5;24564:21;24555:30;;24628:4;24618:8;24614:19;24607:5;24604:30;24594:40;;24323:317;;24247:393;;;;;:::o;24646:60::-;24674:3;24695:5;24688:12;;24646:60;;;:::o;24712:142::-;24762:9;24795:53;24813:34;24822:24;24840:5;24822:24;:::i;:::-;24813:34;:::i;:::-;24795:53;:::i;:::-;24782:66;;24712:142;;;:::o;24860:75::-;24903:3;24924:5;24917:12;;24860:75;;;:::o;24941:269::-;25051:39;25082:7;25051:39;:::i;:::-;25112:91;25161:41;25185:16;25161:41;:::i;:::-;25153:6;25146:4;25140:11;25112:91;:::i;:::-;25106:4;25099:105;25017:193;24941:269;;;:::o;25216:73::-;25261:3;25216:73;:::o;25295:189::-;25372:32;;:::i;:::-;25413:65;25471:6;25463;25457:4;25413:65;:::i;:::-;25348:136;25295:189;;:::o;25490:186::-;25550:120;25567:3;25560:5;25557:14;25550:120;;;25621:39;25658:1;25651:5;25621:39;:::i;:::-;25594:1;25587:5;25583:13;25574:22;;25550:120;;;25490:186;;:::o;25682:543::-;25783:2;25778:3;25775:11;25772:446;;;25817:38;25849:5;25817:38;:::i;:::-;25901:29;25919:10;25901:29;:::i;:::-;25891:8;25887:44;26084:2;26072:10;26069:18;26066:49;;;26105:8;26090:23;;26066:49;26128:80;26184:22;26202:3;26184:22;:::i;:::-;26174:8;26170:37;26157:11;26128:80;:::i;:::-;25787:431;;25772:446;25682:543;;;:::o;26231:117::-;26285:8;26335:5;26329:4;26325:16;26304:37;;26231:117;;;;:::o;26354:169::-;26398:6;26431:51;26479:1;26475:6;26467:5;26464:1;26460:13;26431:51;:::i;:::-;26427:56;26512:4;26506;26502:15;26492:25;;26405:118;26354:169;;;;:::o;26528:295::-;26604:4;26750:29;26775:3;26769:4;26750:29;:::i;:::-;26742:37;;26812:3;26809:1;26805:11;26799:4;26796:21;26788:29;;26528:295;;;;:::o;26828:1395::-;26945:37;26978:3;26945:37;:::i;:::-;27047:18;27039:6;27036:30;27033:56;;;27069:18;;:::i;:::-;27033:56;27113:38;27145:4;27139:11;27113:38;:::i;:::-;27198:67;27258:6;27250;27244:4;27198:67;:::i;:::-;27292:1;27316:4;27303:17;;27348:2;27340:6;27337:14;27365:1;27360:618;;;;28022:1;28039:6;28036:77;;;28088:9;28083:3;28079:19;28073:26;28064:35;;28036:77;28139:67;28199:6;28192:5;28139:67;:::i;:::-;28133:4;28126:81;27995:222;27330:887;;27360:618;27412:4;27408:9;27400:6;27396:22;27446:37;27478:4;27446:37;:::i;:::-;27505:1;27519:208;27533:7;27530:1;27527:14;27519:208;;;27612:9;27607:3;27603:19;27597:26;27589:6;27582:42;27663:1;27655:6;27651:14;27641:24;;27710:2;27699:9;27695:18;27682:31;;27556:4;27553:1;27549:12;27544:17;;27519:208;;;27755:6;27746:7;27743:19;27740:179;;;27813:9;27808:3;27804:19;27798:26;27856:48;27898:4;27890:6;27886:17;27875:9;27856:48;:::i;:::-;27848:6;27841:64;27763:156;27740:179;27965:1;27961;27953:6;27949:14;27945:22;27939:4;27932:36;27367:611;;;27330:887;;26920:1303;;;26828:1395;;:::o;28229:156::-;28369:8;28365:1;28357:6;28353:14;28346:32;28229:156;:::o;28391:365::-;28533:3;28554:66;28618:1;28613:3;28554:66;:::i;:::-;28547:73;;28629:93;28718:3;28629:93;:::i;:::-;28747:2;28742:3;28738:12;28731:19;;28391:365;;;:::o;28762:419::-;28928:4;28966:2;28955:9;28951:18;28943:26;;29015:9;29009:4;29005:20;29001:1;28990:9;28986:17;28979:47;29043:131;29169:4;29043:131;:::i;:::-;29035:139;;28762:419;;;:::o;29187:169::-;29327:21;29323:1;29315:6;29311:14;29304:45;29187:169;:::o;29362:366::-;29504:3;29525:67;29589:2;29584:3;29525:67;:::i;:::-;29518:74;;29601:93;29690:3;29601:93;:::i;:::-;29719:2;29714:3;29710:12;29703:19;;29362:366;;;:::o;29734:419::-;29900:4;29938:2;29927:9;29923:18;29915:26;;29987:9;29981:4;29977:20;29973:1;29962:9;29958:17;29951:47;30015:131;30141:4;30015:131;:::i;:::-;30007:139;;29734:419;;;:::o;30159:165::-;30299:17;30295:1;30287:6;30283:14;30276:41;30159:165;:::o;30330:366::-;30472:3;30493:67;30557:2;30552:3;30493:67;:::i;:::-;30486:74;;30569:93;30658:3;30569:93;:::i;:::-;30687:2;30682:3;30678:12;30671:19;;30330:366;;;:::o;30702:419::-;30868:4;30906:2;30895:9;30891:18;30883:26;;30955:9;30949:4;30945:20;30941:1;30930:9;30926:17;30919:47;30983:131;31109:4;30983:131;:::i;:::-;30975:139;;30702:419;;;:::o;31127:174::-;31267:26;31263:1;31255:6;31251:14;31244:50;31127:174;:::o;31307:366::-;31449:3;31470:67;31534:2;31529:3;31470:67;:::i;:::-;31463:74;;31546:93;31635:3;31546:93;:::i;:::-;31664:2;31659:3;31655:12;31648:19;;31307:366;;;:::o;31679:419::-;31845:4;31883:2;31872:9;31868:18;31860:26;;31932:9;31926:4;31922:20;31918:1;31907:9;31903:17;31896:47;31960:131;32086:4;31960:131;:::i;:::-;31952:139;;31679:419;;;:::o;32104:305::-;32144:3;32163:20;32181:1;32163:20;:::i;:::-;32158:25;;32197:20;32215:1;32197:20;:::i;:::-;32192:25;;32351:1;32283:66;32279:74;32276:1;32273:81;32270:107;;;32357:18;;:::i;:::-;32270:107;32401:1;32398;32394:9;32387:16;;32104:305;;;;:::o;32415:191::-;32455:4;32475:20;32493:1;32475:20;:::i;:::-;32470:25;;32509:20;32527:1;32509:20;:::i;:::-;32504:25;;32548:1;32545;32542:8;32539:34;;;32553:18;;:::i;:::-;32539:34;32598:1;32595;32591:9;32583:17;;32415:191;;;;:::o;32612:230::-;32752:34;32748:1;32740:6;32736:14;32729:58;32821:13;32816:2;32808:6;32804:15;32797:38;32612:230;:::o;32848:366::-;32990:3;33011:67;33075:2;33070:3;33011:67;:::i;:::-;33004:74;;33087:93;33176:3;33087:93;:::i;:::-;33205:2;33200:3;33196:12;33189:19;;32848:366;;;:::o;33220:419::-;33386:4;33424:2;33413:9;33409:18;33401:26;;33473:9;33467:4;33463:20;33459:1;33448:9;33444:17;33437:47;33501:131;33627:4;33501:131;:::i;:::-;33493:139;;33220:419;;;:::o;33645:170::-;33785:22;33781:1;33773:6;33769:14;33762:46;33645:170;:::o;33821:366::-;33963:3;33984:67;34048:2;34043:3;33984:67;:::i;:::-;33977:74;;34060:93;34149:3;34060:93;:::i;:::-;34178:2;34173:3;34169:12;34162:19;;33821:366;;;:::o;34193:419::-;34359:4;34397:2;34386:9;34382:18;34374:26;;34446:9;34440:4;34436:20;34432:1;34421:9;34417:17;34410:47;34474:131;34600:4;34474:131;:::i;:::-;34466:139;;34193:419;;;:::o;34618:174::-;34758:26;34754:1;34746:6;34742:14;34735:50;34618:174;:::o;34798:366::-;34940:3;34961:67;35025:2;35020:3;34961:67;:::i;:::-;34954:74;;35037:93;35126:3;35037:93;:::i;:::-;35155:2;35150:3;35146:12;35139:19;;34798:366;;;:::o;35170:419::-;35336:4;35374:2;35363:9;35359:18;35351:26;;35423:9;35417:4;35413:20;35409:1;35398:9;35394:17;35387:47;35451:131;35577:4;35451:131;:::i;:::-;35443:139;;35170:419;;;:::o;35595:169::-;35735:21;35731:1;35723:6;35719:14;35712:45;35595:169;:::o;35770:366::-;35912:3;35933:67;35997:2;35992:3;35933:67;:::i;:::-;35926:74;;36009:93;36098:3;36009:93;:::i;:::-;36127:2;36122:3;36118:12;36111:19;;35770:366;;;:::o;36142:419::-;36308:4;36346:2;36335:9;36331:18;36323:26;;36395:9;36389:4;36385:20;36381:1;36370:9;36366:17;36359:47;36423:131;36549:4;36423:131;:::i;:::-;36415:139;;36142:419;;;:::o;36567:348::-;36607:7;36630:20;36648:1;36630:20;:::i;:::-;36625:25;;36664:20;36682:1;36664:20;:::i;:::-;36659:25;;36852:1;36784:66;36780:74;36777:1;36774:81;36769:1;36762:9;36755:17;36751:105;36748:131;;;36859:18;;:::i;:::-;36748:131;36907:1;36904;36900:9;36889:20;;36567:348;;;;:::o;36921:168::-;37061:20;37057:1;37049:6;37045:14;37038:44;36921:168;:::o;37095:366::-;37237:3;37258:67;37322:2;37317:3;37258:67;:::i;:::-;37251:74;;37334:93;37423:3;37334:93;:::i;:::-;37452:2;37447:3;37443:12;37436:19;;37095:366;;;:::o;37467:419::-;37633:4;37671:2;37660:9;37656:18;37648:26;;37720:9;37714:4;37710:20;37706:1;37695:9;37691:17;37684:47;37748:131;37874:4;37748:131;:::i;:::-;37740:139;;37467:419;;;:::o;37892:180::-;37940:77;37937:1;37930:88;38037:4;38034:1;38027:15;38061:4;38058:1;38051:15;38078:185;38118:1;38135:20;38153:1;38135:20;:::i;:::-;38130:25;;38169:20;38187:1;38169:20;:::i;:::-;38164:25;;38208:1;38198:35;;38213:18;;:::i;:::-;38198:35;38255:1;38252;38248:9;38243:14;;38078:185;;;;:::o;38269:176::-;38409:28;38405:1;38397:6;38393:14;38386:52;38269:176;:::o;38451:366::-;38593:3;38614:67;38678:2;38673:3;38614:67;:::i;:::-;38607:74;;38690:93;38779:3;38690:93;:::i;:::-;38808:2;38803:3;38799:12;38792:19;;38451:366;;;:::o;38823:419::-;38989:4;39027:2;39016:9;39012:18;39004:26;;39076:9;39070:4;39066:20;39062:1;39051:9;39047:17;39040:47;39104:131;39230:4;39104:131;:::i;:::-;39096:139;;38823:419;;;:::o;39248:238::-;39388:34;39384:1;39376:6;39372:14;39365:58;39457:21;39452:2;39444:6;39440:15;39433:46;39248:238;:::o;39492:366::-;39634:3;39655:67;39719:2;39714:3;39655:67;:::i;:::-;39648:74;;39731:93;39820:3;39731:93;:::i;:::-;39849:2;39844:3;39840:12;39833:19;;39492:366;;;:::o;39864:419::-;40030:4;40068:2;40057:9;40053:18;40045:26;;40117:9;40111:4;40107:20;40103:1;40092:9;40088:17;40081:47;40145:131;40271:4;40145:131;:::i;:::-;40137:139;;39864:419;;;:::o;40289:164::-;40429:16;40425:1;40417:6;40413:14;40406:40;40289:164;:::o;40459:366::-;40601:3;40622:67;40686:2;40681:3;40622:67;:::i;:::-;40615:74;;40698:93;40787:3;40698:93;:::i;:::-;40816:2;40811:3;40807:12;40800:19;;40459:366;;;:::o;40831:419::-;40997:4;41035:2;41024:9;41020:18;41012:26;;41084:9;41078:4;41074:20;41070:1;41059:9;41055:17;41048:47;41112:131;41238:4;41112:131;:::i;:::-;41104:139;;40831:419;;;:::o;41256:165::-;41396:17;41392:1;41384:6;41380:14;41373:41;41256:165;:::o;41427:366::-;41569:3;41590:67;41654:2;41649:3;41590:67;:::i;:::-;41583:74;;41666:93;41755:3;41666:93;:::i;:::-;41784:2;41779:3;41775:12;41768:19;;41427:366;;;:::o;41799:419::-;41965:4;42003:2;41992:9;41988:18;41980:26;;42052:9;42046:4;42042:20;42038:1;42027:9;42023:17;42016:47;42080:131;42206:4;42080:131;:::i;:::-;42072:139;;41799:419;;;:::o;42224:148::-;42326:11;42363:3;42348:18;;42224:148;;;;:::o;42378:377::-;42484:3;42512:39;42545:5;42512:39;:::i;:::-;42567:89;42649:6;42644:3;42567:89;:::i;:::-;42560:96;;42665:52;42710:6;42705:3;42698:4;42691:5;42687:16;42665:52;:::i;:::-;42742:6;42737:3;42733:16;42726:23;;42488:267;42378:377;;;;:::o;42785:874::-;42888:3;42925:5;42919:12;42954:36;42980:9;42954:36;:::i;:::-;43006:89;43088:6;43083:3;43006:89;:::i;:::-;42999:96;;43126:1;43115:9;43111:17;43142:1;43137:166;;;;43317:1;43312:341;;;;43104:549;;43137:166;43221:4;43217:9;43206;43202:25;43197:3;43190:38;43283:6;43276:14;43269:22;43261:6;43257:35;43252:3;43248:45;43241:52;;43137:166;;43312:341;43379:38;43411:5;43379:38;:::i;:::-;43439:1;43453:154;43467:6;43464:1;43461:13;43453:154;;;43541:7;43535:14;43531:1;43526:3;43522:11;43515:35;43591:1;43582:7;43578:15;43567:26;;43489:4;43486:1;43482:12;43477:17;;43453:154;;;43636:6;43631:3;43627:16;43620:23;;43319:334;;43104:549;;42892:767;;42785:874;;;;:::o;43665:589::-;43890:3;43912:95;44003:3;43994:6;43912:95;:::i;:::-;43905:102;;44024:95;44115:3;44106:6;44024:95;:::i;:::-;44017:102;;44136:92;44224:3;44215:6;44136:92;:::i;:::-;44129:99;;44245:3;44238:10;;43665:589;;;;;;:::o;44260:225::-;44400:34;44396:1;44388:6;44384:14;44377:58;44469:8;44464:2;44456:6;44452:15;44445:33;44260:225;:::o;44491:366::-;44633:3;44654:67;44718:2;44713:3;44654:67;:::i;:::-;44647:74;;44730:93;44819:3;44730:93;:::i;:::-;44848:2;44843:3;44839:12;44832:19;;44491:366;;;:::o;44863:419::-;45029:4;45067:2;45056:9;45052:18;45044:26;;45116:9;45110:4;45106:20;45102:1;45091:9;45087:17;45080:47;45144:131;45270:4;45144:131;:::i;:::-;45136:139;;44863:419;;;:::o;45288:182::-;45428:34;45424:1;45416:6;45412:14;45405:58;45288:182;:::o;45476:366::-;45618:3;45639:67;45703:2;45698:3;45639:67;:::i;:::-;45632:74;;45715:93;45804:3;45715:93;:::i;:::-;45833:2;45828:3;45824:12;45817:19;;45476:366;;;:::o;45848:419::-;46014:4;46052:2;46041:9;46037:18;46029:26;;46101:9;46095:4;46091:20;46087:1;46076:9;46072:17;46065:47;46129:131;46255:4;46129:131;:::i;:::-;46121:139;;45848:419;;;:::o;46273:237::-;46413:34;46409:1;46401:6;46397:14;46390:58;46482:20;46477:2;46469:6;46465:15;46458:45;46273:237;:::o;46516:366::-;46658:3;46679:67;46743:2;46738:3;46679:67;:::i;:::-;46672:74;;46755:93;46844:3;46755:93;:::i;:::-;46873:2;46868:3;46864:12;46857:19;;46516:366;;;:::o;46888:419::-;47054:4;47092:2;47081:9;47077:18;47069:26;;47141:9;47135:4;47131:20;47127:1;47116:9;47112:17;47105:47;47169:131;47295:4;47169:131;:::i;:::-;47161:139;;46888:419;;;:::o;47313:225::-;47453:34;47449:1;47441:6;47437:14;47430:58;47522:8;47517:2;47509:6;47505:15;47498:33;47313:225;:::o;47544:366::-;47686:3;47707:67;47771:2;47766:3;47707:67;:::i;:::-;47700:74;;47783:93;47872:3;47783:93;:::i;:::-;47901:2;47896:3;47892:12;47885:19;;47544:366;;;:::o;47916:419::-;48082:4;48120:2;48109:9;48105:18;48097:26;;48169:9;48163:4;48159:20;48155:1;48144:9;48140:17;48133:47;48197:131;48323:4;48197:131;:::i;:::-;48189:139;;47916:419;;;:::o;48341:224::-;48481:34;48477:1;48469:6;48465:14;48458:58;48550:7;48545:2;48537:6;48533:15;48526:32;48341:224;:::o;48571:366::-;48713:3;48734:67;48798:2;48793:3;48734:67;:::i;:::-;48727:74;;48810:93;48899:3;48810:93;:::i;:::-;48928:2;48923:3;48919:12;48912:19;;48571:366;;;:::o;48943:419::-;49109:4;49147:2;49136:9;49132:18;49124:26;;49196:9;49190:4;49186:20;49182:1;49171:9;49167:17;49160:47;49224:131;49350:4;49224:131;:::i;:::-;49216:139;;48943:419;;;:::o;49368:118::-;49405:7;49445:34;49438:5;49434:46;49423:57;;49368:118;;;:::o;49492:191::-;49532:4;49552:20;49570:1;49552:20;:::i;:::-;49547:25;;49586:20;49604:1;49586:20;:::i;:::-;49581:25;;49625:1;49622;49619:8;49616:34;;;49630:18;;:::i;:::-;49616:34;49675:1;49672;49668:9;49660:17;;49492:191;;;;:::o;49689:273::-;49729:3;49748:20;49766:1;49748:20;:::i;:::-;49743:25;;49782:20;49800:1;49782:20;:::i;:::-;49777:25;;49904:1;49868:34;49864:42;49861:1;49858:49;49855:75;;;49910:18;;:::i;:::-;49855:75;49954:1;49951;49947:9;49940:16;;49689:273;;;;:::o;49968:229::-;50108:34;50104:1;50096:6;50092:14;50085:58;50177:12;50172:2;50164:6;50160:15;50153:37;49968:229;:::o;50203:366::-;50345:3;50366:67;50430:2;50425:3;50366:67;:::i;:::-;50359:74;;50442:93;50531:3;50442:93;:::i;:::-;50560:2;50555:3;50551:12;50544:19;;50203:366;;;:::o;50575:419::-;50741:4;50779:2;50768:9;50764:18;50756:26;;50828:9;50822:4;50818:20;50814:1;50803:9;50799:17;50792:47;50856:131;50982:4;50856:131;:::i;:::-;50848:139;;50575:419;;;:::o;51000:171::-;51039:3;51062:24;51080:5;51062:24;:::i;:::-;51053:33;;51108:4;51101:5;51098:15;51095:41;;51116:18;;:::i;:::-;51095:41;51163:1;51156:5;51152:13;51145:20;;51000:171;;;:::o;51177:234::-;51317:34;51313:1;51305:6;51301:14;51294:58;51386:17;51381:2;51373:6;51369:15;51362:42;51177:234;:::o;51417:366::-;51559:3;51580:67;51644:2;51639:3;51580:67;:::i;:::-;51573:74;;51656:93;51745:3;51656:93;:::i;:::-;51774:2;51769:3;51765:12;51758:19;;51417:366;;;:::o;51789:419::-;51955:4;51993:2;51982:9;51978:18;51970:26;;52042:9;52036:4;52032:20;52028:1;52017:9;52013:17;52006:47;52070:131;52196:4;52070:131;:::i;:::-;52062:139;;51789:419;;;:::o;52214:98::-;52265:6;52299:5;52293:12;52283:22;;52214:98;;;:::o;52318:168::-;52401:11;52435:6;52430:3;52423:19;52475:4;52470:3;52466:14;52451:29;;52318:168;;;;:::o;52492:360::-;52578:3;52606:38;52638:5;52606:38;:::i;:::-;52660:70;52723:6;52718:3;52660:70;:::i;:::-;52653:77;;52739:52;52784:6;52779:3;52772:4;52765:5;52761:16;52739:52;:::i;:::-;52816:29;52838:6;52816:29;:::i;:::-;52811:3;52807:39;52800:46;;52582:270;52492:360;;;;:::o;52858:640::-;53053:4;53091:3;53080:9;53076:19;53068:27;;53105:71;53173:1;53162:9;53158:17;53149:6;53105:71;:::i;:::-;53186:72;53254:2;53243:9;53239:18;53230:6;53186:72;:::i;:::-;53268;53336:2;53325:9;53321:18;53312:6;53268:72;:::i;:::-;53387:9;53381:4;53377:20;53372:2;53361:9;53357:18;53350:48;53415:76;53486:4;53477:6;53415:76;:::i;:::-;53407:84;;52858:640;;;;;;;:::o;53504:141::-;53560:5;53591:6;53585:13;53576:22;;53607:32;53633:5;53607:32;:::i;:::-;53504:141;;;;:::o;53651:349::-;53720:6;53769:2;53757:9;53748:7;53744:23;53740:32;53737:119;;;53775:79;;:::i;:::-;53737:119;53895:1;53920:63;53975:7;53966:6;53955:9;53951:22;53920:63;:::i;:::-;53910:73;;53866:127;53651:349;;;;:::o;54006:176::-;54038:1;54055:20;54073:1;54055:20;:::i;:::-;54050:25;;54089:20;54107:1;54089:20;:::i;:::-;54084:25;;54128:1;54118:35;;54133:18;;:::i;:::-;54118:35;54174:1;54171;54167:9;54162:14;;54006:176;;;;:::o;54188:220::-;54328:34;54324:1;54316:6;54312:14;54305:58;54397:3;54392:2;54384:6;54380:15;54373:28;54188:220;:::o;54414:366::-;54556:3;54577:67;54641:2;54636:3;54577:67;:::i;:::-;54570:74;;54653:93;54742:3;54653:93;:::i;:::-;54771:2;54766:3;54762:12;54755:19;;54414:366;;;:::o;54786:419::-;54952:4;54990:2;54979:9;54975:18;54967:26;;55039:9;55033:4;55029:20;55025:1;55014:9;55010:17;55003:47;55067:131;55193:4;55067:131;:::i;:::-;55059:139;;54786:419;;;:::o;55211:179::-;55351:31;55347:1;55339:6;55335:14;55328:55;55211:179;:::o;55396:366::-;55538:3;55559:67;55623:2;55618:3;55559:67;:::i;:::-;55552:74;;55635:93;55724:3;55635:93;:::i;:::-;55753:2;55748:3;55744:12;55737:19;;55396:366;;;:::o;55768:419::-;55934:4;55972:2;55961:9;55957:18;55949:26;;56021:9;56015:4;56011:20;56007:1;55996:9;55992:17;55985:47;56049:131;56175:4;56049:131;:::i;:::-;56041:139;;55768:419;;;:::o;56193:221::-;56333:34;56329:1;56321:6;56317:14;56310:58;56402:4;56397:2;56389:6;56385:15;56378:29;56193:221;:::o;56420:366::-;56562:3;56583:67;56647:2;56642:3;56583:67;:::i;:::-;56576:74;;56659:93;56748:3;56659:93;:::i;:::-;56777:2;56772:3;56768:12;56761:19;;56420:366;;;:::o;56792:419::-;56958:4;56996:2;56985:9;56981:18;56973:26;;57045:9;57039:4;57035:20;57031:1;57020:9;57016:17;57009:47;57073:131;57199:4;57073:131;:::i;:::-;57065:139;;56792:419;;;:::o
Swarm Source
ipfs://8dda497d8db85ba008eda86a23e645aa1ffede282932d4119672678600fbbcd9
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.