Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 63 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Swap Artwork Fro... | 20746203 | 142 days ago | IN | 0 ETH | 0.00040033 | ||||
Swap Artwork Fro... | 18288846 | 486 days ago | IN | 0 ETH | 0.00207863 | ||||
Safe Transfer Fr... | 17401515 | 610 days ago | IN | 0 ETH | 0.00334158 | ||||
Swap Artwork Fro... | 17350645 | 617 days ago | IN | 0 ETH | 0.00857428 | ||||
Swap Artwork Fro... | 17300538 | 624 days ago | IN | 0 ETH | 0.01035315 | ||||
Swap Artwork Fro... | 17300537 | 624 days ago | IN | 0 ETH | 0.01052201 | ||||
Swap Artwork Fro... | 17260257 | 630 days ago | IN | 0 ETH | 0.01191432 | ||||
Swap Artwork Fro... | 17256430 | 631 days ago | IN | 0 ETH | 0.01267799 | ||||
Swap Artwork Fro... | 17053390 | 659 days ago | IN | 0 ETH | 0.00804922 | ||||
Swap Artwork Fro... | 16997574 | 667 days ago | IN | 0 ETH | 0.00948016 | ||||
Set Approval For... | 16856496 | 687 days ago | IN | 0 ETH | 0.00071218 | ||||
Set Approval For... | 16854592 | 687 days ago | IN | 0 ETH | 0.00063488 | ||||
Set Approval For... | 16661794 | 715 days ago | IN | 0 ETH | 0.00101934 | ||||
Swap Artwork Fro... | 16661702 | 715 days ago | IN | 0 ETH | 0.00712934 | ||||
Swap Artwork Fro... | 16661679 | 715 days ago | IN | 0 ETH | 0.00635894 | ||||
Set Approval For... | 16491597 | 738 days ago | IN | 0 ETH | 0.00043574 | ||||
Set Approval For... | 16386391 | 753 days ago | IN | 0 ETH | 0.00097985 | ||||
Set Approval For... | 15821387 | 832 days ago | IN | 0 ETH | 0.00064875 | ||||
Swap Artwork Fro... | 15740653 | 843 days ago | IN | 0 ETH | 0.00746514 | ||||
Safe Transfer Fr... | 15670984 | 853 days ago | IN | 0 ETH | 0.0010917 | ||||
Swap Artwork Fro... | 15635430 | 858 days ago | IN | 0 ETH | 0.00274155 | ||||
Swap Artwork Fro... | 15559015 | 869 days ago | IN | 0 ETH | 0.00083656 | ||||
Set Approval For... | 15107766 | 939 days ago | IN | 0 ETH | 0.00079295 | ||||
Safe Transfer Fr... | 15107759 | 939 days ago | IN | 0 ETH | 0.00170668 | ||||
Swap Artwork Fro... | 14785927 | 993 days ago | IN | 0 ETH | 0.00454897 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
FeralfileExhibitionV2
Compiler Version
v0.8.12+commit.f00d7308
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-03-23 */ // File: @openzeppelin/contracts/utils/Strings.sol pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: @openzeppelin/contracts/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 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() { _setOwner(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _setOwner(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"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: github/bitmark-inc/feralfile-exhibition-smart-contract/contracts/Authorizable.sol pragma solidity >=0.4.22 <0.9.0; contract Authorizable is Ownable { address public trustee; constructor() { trustee = address(0x0); } modifier onlyAuthorized() { require(msg.sender == trustee || msg.sender == owner()); _; } function setTrustee(address _newTrustee) public onlyOwner { trustee = _newTrustee; } } // File: @openzeppelin/contracts/utils/Address.sol pragma solidity ^0.8.0; /** * @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 * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/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 `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/interfaces/IERC165.sol pragma solidity ^0.8.0; // File: @openzeppelin/contracts/interfaces/IERC2981.sol pragma solidity ^0.8.0; /** * @dev Interface for the NFT Royalty Standard */ interface IERC2981 is IERC165 { /** * @dev Called with the sale price to determine how much royalty is owed and to whom. * @param tokenId - the NFT asset queried for royalty information * @param salePrice - the sale price of the NFT asset specified by `tokenId` * @return receiver - address of who should be sent the royalty payment * @return royaltyAmount - the royalty payment amount for `salePrice` */ function royaltyInfo(uint256 tokenId, uint256 salePrice) external view returns (address receiver, uint256 royaltyAmount); } // File: @openzeppelin/contracts/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 pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // File: @openzeppelin/contracts/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 tokenId); /** * @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 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 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: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { require(operator != _msgSender(), "ERC721: 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 virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, 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); } /** * @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); } /** * @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 of token that is not own"); 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); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } // File: @openzeppelin/contracts/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: github/bitmark-inc/feralfile-exhibition-smart-contract/contracts/FeralfileArtworkV2.sol pragma solidity ^0.8.0; contract FeralfileExhibitionV2 is ERC721Enumerable, Authorizable, IERC2981 { using Strings for uint256; // royalty payout address address public royaltyPayoutAddress; // The maximum limit of edition size for each exhibitions uint256 public immutable maxEditionPerArtwork; // the basis points of royalty payments for each secondary sales uint256 public immutable secondarySaleRoyaltyBPS; // the maximum basis points of royalty payments uint256 public constant MAX_ROYALITY_BPS = 100_00; // token base URI string private _tokenBaseURI; // contract URI string private _contractURI; /// @notice A structure for Feral File artwork struct Artwork { string title; string artistName; string fingerprint; uint256 editionSize; } struct ArtworkEdition { uint256 editionID; string ipfsCID; } uint256[] private _allArtworks; mapping(uint256 => Artwork) public artworks; // artworkID => Artwork mapping(uint256 => ArtworkEdition) public artworkEditions; // artworkEditionID => ArtworkEdition mapping(uint256 => uint256[]) internal allArtworkEditions; // artworkID => []ArtworkEditionID mapping(uint256 => bool) internal registeredBitmarks; // bitmarkID => bool mapping(string => bool) internal registeredIPFSCIDs; // ipfsCID => bool constructor( string memory name_, string memory symbol_, uint256 maxEditionPerArtwork_, uint256 secondarySaleRoyaltyBPS_, address royaltyPayoutAddress_, string memory contractURI_, string memory tokenBaseURI_ ) ERC721(name_, symbol_) { require( maxEditionPerArtwork_ > 0, "maxEdition of each artwork in an exhibition needs to be greater than zero" ); require( secondarySaleRoyaltyBPS_ <= MAX_ROYALITY_BPS, "royalty BPS for secondary sales can not be greater than the maximum royalty BPS" ); require( royaltyPayoutAddress_ != address(0), "invalid royalty payout address" ); maxEditionPerArtwork = maxEditionPerArtwork_; secondarySaleRoyaltyBPS = secondarySaleRoyaltyBPS_; royaltyPayoutAddress = royaltyPayoutAddress_; _contractURI = contractURI_; _tokenBaseURI = tokenBaseURI_; } function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721Enumerable, IERC165) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /// @notice Call to create an artwork in the exhibition /// @param fingerprint - the fingerprint of an artwork /// @param title - the title of an artwork /// @param artistName - the artist of an artwork /// @param editionSize - the maximum edition size of an artwork function createArtwork( string memory fingerprint, string memory title, string memory artistName, uint256 editionSize ) external onlyAuthorized { require(bytes(title).length != 0, "title can not be empty"); require(bytes(artistName).length != 0, "artist can not be empty"); require(bytes(fingerprint).length != 0, "fingerprint can not be empty"); require(editionSize > 0, "edition size needs to be at least 1"); require( editionSize <= maxEditionPerArtwork, "artwork edition size exceeds the maximum edition size of the exhibition" ); uint256 artworkID = uint256(keccak256(abi.encode(fingerprint))); /// @notice make sure the artwork have not been registered require( bytes(artworks[artworkID].fingerprint).length == 0, "an artwork with the same fingerprint has already registered" ); Artwork memory artwork = Artwork( title = title, artistName = artistName, fingerprint = fingerprint, editionSize = editionSize ); _allArtworks.push(artworkID); artworks[artworkID] = artwork; emit NewArtwork(artworkID); } /// @notice Return a count of artworks registered in this exhibition function totalArtworks() public view virtual returns (uint256) { return _allArtworks.length; } /// @notice Return the token identifier for the `index`th artwork function getArtworkByIndex(uint256 index) public view virtual returns (uint256) { require( index < totalArtworks(), "artworks: global index out of bounds" ); return _allArtworks[index]; } /// @notice Swap an existent artwork from bitmark to ERC721 /// @param artworkID - the artwork id where the new edition is referenced to /// @param bitmarkID - the bitmark id of artwork edition before swapped /// @param editionNumber - the edition number of the artwork edition /// @param owner - the owner address of the new minted token /// @param ipfsCID - the IPFS cid for the new token function swapArtworkFromBitmark( uint256 artworkID, uint256 bitmarkID, uint256 editionNumber, address owner, string memory ipfsCID ) external onlyAuthorized { /// @notice the edition size is not set implies the artwork is not created require(artworks[artworkID].editionSize > 0, "artwork is not found"); /// @notice The range of editionNumber should be between 0 (AP) ~ artwork.editionSize require( editionNumber <= artworks[artworkID].editionSize, "edition number exceed the edition size of the artwork" ); require(owner != address(0), "invalid owner address"); require(!registeredBitmarks[bitmarkID], "bitmark id has registered"); require(!registeredIPFSCIDs[ipfsCID], "ipfs id has registered"); uint256 editionID = artworkID + editionNumber; require( artworkEditions[editionID].editionID == 0, "the edition is existent" ); ArtworkEdition memory edition = ArtworkEdition( editionID = editionID, ipfsCID = ipfsCID ); artworkEditions[editionID] = edition; allArtworkEditions[artworkID].push(editionID); registeredBitmarks[bitmarkID] = true; registeredIPFSCIDs[ipfsCID] = true; _safeMint(owner, editionID); emit NewArtworkEdition(owner, artworkID, editionID); } /// @notice Update the IPFS cid of an edition to a new value function updateArtworkEditionIPFSCid(uint256 tokenId, string memory ipfsCID) external onlyAuthorized { require(_exists(tokenId), "artwork edition is not found"); require(!registeredIPFSCIDs[ipfsCID], "ipfs id has registered"); ArtworkEdition storage edition = artworkEditions[tokenId]; delete registeredIPFSCIDs[edition.ipfsCID]; registeredIPFSCIDs[ipfsCID] = true; edition.ipfsCID = ipfsCID; } /// @notice setRoyaltyPayoutAddress assigns a payout address so // that we can split the royalty. /// @param royaltyPayoutAddress_ - the new royalty payout address function setRoyaltyPayoutAddress(address royaltyPayoutAddress_) external onlyAuthorized { require( royaltyPayoutAddress_ != address(0), "invalid royalty payout address" ); royaltyPayoutAddress = royaltyPayoutAddress_; } /// @notice Return the edition counts for an artwork function totalEditionOfArtwork(uint256 artworkID) public view returns (uint256) { return allArtworkEditions[artworkID].length; } /// @notice Return the edition id of an artwork by index function getArtworkEditionByIndex(uint256 artworkID, uint256 index) public view returns (uint256) { require(index < totalEditionOfArtwork(artworkID)); return allArtworkEditions[artworkID][index]; } /// @notice A distinct Uniform Resource Identifier (URI) for a given asset. function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require( _exists(tokenId), "ERC721Metadata: URI query for nonexistent token" ); string memory baseURI = _tokenBaseURI; if (bytes(baseURI).length == 0) { baseURI = "ipfs://"; } return string( abi.encodePacked( baseURI, artworkEditions[tokenId].ipfsCID, "/metadata.json" ) ); } /// @notice Update the base URI for all tokens function setTokenBaseURI(string memory baseURI_) external onlyAuthorized { _tokenBaseURI = baseURI_; } /// @notice A URL for the opensea storefront-level metadata function contractURI() public view returns (string memory) { return _contractURI; } /// @notice Called with the sale price to determine how much royalty // is owed and to whom. /// @param tokenId - the NFT asset queried for royalty information /// @param salePrice - the sale price of the NFT asset specified by tokenId /// @return receiver - address of who should be sent the royalty payment /// @return royaltyAmount - the royalty payment amount for salePrice function royaltyInfo(uint256 tokenId, uint256 salePrice) external view override returns (address receiver, uint256 royaltyAmount) { require( _exists(tokenId), "ERC2981: query royalty info for nonexistent token" ); receiver = royaltyPayoutAddress; royaltyAmount = (salePrice * secondarySaleRoyaltyBPS) / MAX_ROYALITY_BPS; } event NewArtwork(uint256 indexed artworkID); event NewArtworkEdition( address indexed owner, uint256 indexed artworkID, uint256 indexed editionID ); }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"uint256","name":"maxEditionPerArtwork_","type":"uint256"},{"internalType":"uint256","name":"secondarySaleRoyaltyBPS_","type":"uint256"},{"internalType":"address","name":"royaltyPayoutAddress_","type":"address"},{"internalType":"string","name":"contractURI_","type":"string"},{"internalType":"string","name":"tokenBaseURI_","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":"uint256","name":"artworkID","type":"uint256"}],"name":"NewArtwork","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"uint256","name":"artworkID","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"editionID","type":"uint256"}],"name":"NewArtworkEdition","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_ROYALITY_BPS","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":"uint256","name":"","type":"uint256"}],"name":"artworkEditions","outputs":[{"internalType":"uint256","name":"editionID","type":"uint256"},{"internalType":"string","name":"ipfsCID","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"artworks","outputs":[{"internalType":"string","name":"title","type":"string"},{"internalType":"string","name":"artistName","type":"string"},{"internalType":"string","name":"fingerprint","type":"string"},{"internalType":"uint256","name":"editionSize","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"fingerprint","type":"string"},{"internalType":"string","name":"title","type":"string"},{"internalType":"string","name":"artistName","type":"string"},{"internalType":"uint256","name":"editionSize","type":"uint256"}],"name":"createArtwork","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getArtworkByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"artworkID","type":"uint256"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getArtworkEditionByIndex","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":"maxEditionPerArtwork","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"royaltyPayoutAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"secondarySaleRoyaltyBPS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"royaltyPayoutAddress_","type":"address"}],"name":"setRoyaltyPayoutAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"setTokenBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newTrustee","type":"address"}],"name":"setTrustee","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":[{"internalType":"uint256","name":"artworkID","type":"uint256"},{"internalType":"uint256","name":"bitmarkID","type":"uint256"},{"internalType":"uint256","name":"editionNumber","type":"uint256"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"string","name":"ipfsCID","type":"string"}],"name":"swapArtworkFromBitmark","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"totalArtworks","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"artworkID","type":"uint256"}],"name":"totalEditionOfArtwork","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"trustee","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"ipfsCID","type":"string"}],"name":"updateArtworkEditionIPFSCid","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60c06040523480156200001157600080fd5b5060405162005e5838038062005e5883398181016040528101906200003791906200061b565b86868160009080519060200190620000519291906200032e565b5080600190805190602001906200006a9291906200032e565b5050506200008d620000816200026060201b60201c565b6200026860201b60201c565b6000600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000851162000115576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200010c90620007f7565b60405180910390fd5b6127108411156200015d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200015490620008b5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415620001d0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001c79062000927565b60405180910390fd5b84608081815250508360a0818152505082600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600e9080519060200190620002399291906200032e565b5080600d9080519060200190620002529291906200032e565b5050505050505050620009ae565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200033c9062000978565b90600052602060002090601f016020900481019282620003605760008555620003ac565b82601f106200037b57805160ff1916838001178555620003ac565b82800160010185558215620003ac579182015b82811115620003ab5782518255916020019190600101906200038e565b5b509050620003bb9190620003bf565b5090565b5b80821115620003da576000816000905550600101620003c0565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200044782620003fc565b810181811067ffffffffffffffff821117156200046957620004686200040d565b5b80604052505050565b60006200047e620003de565b90506200048c82826200043c565b919050565b600067ffffffffffffffff821115620004af57620004ae6200040d565b5b620004ba82620003fc565b9050602081019050919050565b60005b83811015620004e7578082015181840152602081019050620004ca565b83811115620004f7576000848401525b50505050565b6000620005146200050e8462000491565b62000472565b905082815260208101848484011115620005335762000532620003f7565b5b62000540848285620004c7565b509392505050565b600082601f83011262000560576200055f620003f2565b5b815162000572848260208601620004fd565b91505092915050565b6000819050919050565b62000590816200057b565b81146200059c57600080fd5b50565b600081519050620005b08162000585565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620005e382620005b6565b9050919050565b620005f581620005d6565b81146200060157600080fd5b50565b6000815190506200061581620005ea565b92915050565b600080600080600080600060e0888a0312156200063d576200063c620003e8565b5b600088015167ffffffffffffffff8111156200065e576200065d620003ed565b5b6200066c8a828b0162000548565b975050602088015167ffffffffffffffff81111562000690576200068f620003ed565b5b6200069e8a828b0162000548565b9650506040620006b18a828b016200059f565b9550506060620006c48a828b016200059f565b9450506080620006d78a828b0162000604565b93505060a088015167ffffffffffffffff811115620006fb57620006fa620003ed565b5b620007098a828b0162000548565b92505060c088015167ffffffffffffffff8111156200072d576200072c620003ed565b5b6200073b8a828b0162000548565b91505092959891949750929550565b600082825260208201905092915050565b7f6d617845646974696f6e206f66206561636820617274776f726b20696e20616e60008201527f2065786869626974696f6e206e6565647320746f20626520677265617465722060208201527f7468616e207a65726f0000000000000000000000000000000000000000000000604082015250565b6000620007df6049836200074a565b9150620007ec826200075b565b606082019050919050565b600060208201905081810360008301526200081281620007d0565b9050919050565b7f726f79616c74792042505320666f72207365636f6e646172792073616c65732060008201527f63616e206e6f742062652067726561746572207468616e20746865206d61786960208201527f6d756d20726f79616c7479204250530000000000000000000000000000000000604082015250565b60006200089d604f836200074a565b9150620008aa8262000819565b606082019050919050565b60006020820190508181036000830152620008d0816200088e565b9050919050565b7f696e76616c696420726f79616c7479207061796f757420616464726573730000600082015250565b60006200090f601e836200074a565b91506200091c82620008d7565b602082019050919050565b60006020820190508181036000830152620009428162000900565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200099157607f821691505b60208210811415620009a857620009a762000949565b5b50919050565b60805160a051615476620009e260003960008181610cf30152612395015260008181610f800152611c6201526154766000f3fe608060405234801561001057600080fd5b50600436106102325760003560e01c8063715018a611610130578063c87b56dd116100b8578063ea211d7c1161007c578063ea211d7c146106da578063ec9cbb44146106f8578063f2fde38b14610716578063fdf97cb214610732578063fe2a3bf31461075057610232565b8063c87b56dd14610622578063d0d1ea7014610652578063e4a233e11461066e578063e8a3d4851461068c578063e985e9c5146106aa57610232565b80638ef79e91116100ff5780638ef79e911461058057806395d89b411461059c578063a22cb465146105ba578063b4883703146105d6578063b88d4fde1461060657610232565b8063715018a61461051e5780637f34c0dd1461052857806384ad61af146105445780638da5cb5b1461056257610232565b80633afb021a116101be5780634f6ccce7116101825780634f6ccce71461042d57806362fe21311461045d5780636352211e1461048e578063641b18e9146104be57806370a08231146104ee57610232565b80633afb021a146103885780633f6805ba146103a457806342842e0e146103c257806345aeefde146103de5780634b602673146103fa57610232565b80630cfcb5f1116102055780630cfcb5f1146102d157806318160ddd146102ed57806323b872dd1461030b5780632a55205a146103275780632f745c591461035857610232565b806301ffc9a71461023757806306fdde0314610267578063081812fc14610285578063095ea7b3146102b5575b600080fd5b610251600480360381019061024c919061355a565b610780565b60405161025e91906135a2565b60405180910390f35b61026f6107fa565b60405161027c9190613656565b60405180910390f35b61029f600480360381019061029a91906136ae565b61088c565b6040516102ac919061371c565b60405180910390f35b6102cf60048036038101906102ca9190613763565b610911565b005b6102eb60048036038101906102e691906138d8565b610a29565b005b6102f5610c11565b6040516103029190613943565b60405180910390f35b6103256004803603810190610320919061395e565b610c1e565b005b610341600480360381019061033c91906139b1565b610c7e565b60405161034f9291906139f1565b60405180910390f35b610372600480360381019061036d9190613763565b610d30565b60405161037f9190613943565b60405180910390f35b6103a2600480360381019061039d9190613a1a565b610dd5565b005b6103ac61116f565b6040516103b9919061371c565b60405180910390f35b6103dc60048036038101906103d7919061395e565b611195565b005b6103f860048036038101906103f39190613ad5565b6111b5565b005b610414600480360381019061040f91906136ae565b611300565b6040516104249493929190613b02565b60405180910390f35b610447600480360381019061044291906136ae565b6114c8565b6040516104549190613943565b60405180910390f35b610477600480360381019061047291906136ae565b611539565b604051610485929190613b5c565b60405180910390f35b6104a860048036038101906104a391906136ae565b6115e5565b6040516104b5919061371c565b60405180910390f35b6104d860048036038101906104d391906139b1565b611697565b6040516104e59190613943565b60405180910390f35b61050860048036038101906105039190613ad5565b6116e5565b6040516105159190613943565b60405180910390f35b61052661179d565b005b610542600480360381019061053d9190613b8c565b611825565b005b61054c611c60565b6040516105599190613943565b60405180910390f35b61056a611c84565b604051610577919061371c565b60405180910390f35b61059a60048036038101906105959190613c23565b611cae565b005b6105a4611d5f565b6040516105b19190613656565b60405180910390f35b6105d460048036038101906105cf9190613c98565b611df1565b005b6105f060048036038101906105eb91906136ae565b611f72565b6040516105fd9190613943565b60405180910390f35b610620600480360381019061061b9190613d79565b611fe3565b005b61063c600480360381019061063791906136ae565b612045565b6040516106499190613656565b60405180910390f35b61066c60048036038101906106679190613ad5565b6121a0565b005b610676612260565b6040516106839190613943565b60405180910390f35b61069461226d565b6040516106a19190613656565b60405180910390f35b6106c460048036038101906106bf9190613dfc565b6122ff565b6040516106d191906135a2565b60405180910390f35b6106e2612393565b6040516106ef9190613943565b60405180910390f35b6107006123b7565b60405161070d9190613943565b60405180910390f35b610730600480360381019061072b9190613ad5565b6123bd565b005b61073a6124b5565b604051610747919061371c565b60405180910390f35b61076a600480360381019061076591906136ae565b6124db565b6040516107779190613943565b60405180910390f35b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107f357506107f2826124fb565b5b9050919050565b60606000805461080990613e6b565b80601f016020809104026020016040519081016040528092919081815260200182805461083590613e6b565b80156108825780601f1061085757610100808354040283529160200191610882565b820191906000526020600020905b81548152906001019060200180831161086557829003601f168201915b5050505050905090565b600061089782612575565b6108d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108cd90613f0f565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061091c826115e5565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561098d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161098490613fa1565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109ac6125e1565b73ffffffffffffffffffffffffffffffffffffffff1614806109db57506109da816109d56125e1565b6122ff565b5b610a1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1190614033565b60405180910390fd5b610a2483836125e9565b505050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610ab75750610a88611c84565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b610ac057600080fd5b610ac982612575565b610b08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aff9061409f565b60405180910390fd5b601481604051610b1891906140fb565b908152602001604051809103902060009054906101000a900460ff1615610b74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6b9061415e565b60405180910390fd5b6000601160008481526020019081526020016000209050601481600101604051610b9e9190614212565b908152602001604051809103902060006101000a81549060ff02191690556001601483604051610bce91906140fb565b908152602001604051809103902060006101000a81548160ff02191690831515021790555081816001019080519060200190610c0b92919061344b565b50505050565b6000600880549050905090565b610c2f610c296125e1565b826126a2565b610c6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c659061429b565b60405180910390fd5b610c79838383612780565b505050565b600080610c8a84612575565b610cc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc09061432d565b60405180910390fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691506127107f000000000000000000000000000000000000000000000000000000000000000084610d1d919061437c565b610d279190614405565b90509250929050565b6000610d3b836116e5565b8210610d7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d73906144a8565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610e635750610e34611c84565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b610e6c57600080fd5b600083511415610eb1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea890614514565b60405180910390fd5b600082511415610ef6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eed90614580565b60405180910390fd5b600084511415610f3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f32906145ec565b60405180910390fd5b60008111610f7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f759061467e565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000811115610fe1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd890614736565b60405180910390fd5b600084604051602001610ff49190613656565b6040516020818303038152906040528051906020012060001c9050600060106000838152602001908152602001600020600201805461103290613e6b565b905014611074576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106b906147c8565b60405180910390fd5b60006040518060800160405280868152602001858152602001878152602001848152509050600f829080600181540180825580915050600190039060005260206000200160009091909190915055806010600084815260200190815260200160002060008201518160000190805190602001906110f292919061344b565b50602082015181600101908051906020019061110f92919061344b565b50604082015181600201908051906020019061112c92919061344b565b5060608201518160030155905050817f22350b25f1b72bb3621199a79abefeb4fcd77bb1e65638cd09350666e4db089160405160405180910390a2505050505050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6111b083838360405180602001604052806000815250611fe3565b505050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806112435750611214611c84565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b61124c57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156112bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b390614834565b60405180910390fd5b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b601060205280600052604060002060009150905080600001805461132390613e6b565b80601f016020809104026020016040519081016040528092919081815260200182805461134f90613e6b565b801561139c5780601f106113715761010080835404028352916020019161139c565b820191906000526020600020905b81548152906001019060200180831161137f57829003601f168201915b5050505050908060010180546113b190613e6b565b80601f01602080910402602001604051908101604052809291908181526020018280546113dd90613e6b565b801561142a5780601f106113ff5761010080835404028352916020019161142a565b820191906000526020600020905b81548152906001019060200180831161140d57829003601f168201915b50505050509080600201805461143f90613e6b565b80601f016020809104026020016040519081016040528092919081815260200182805461146b90613e6b565b80156114b85780601f1061148d576101008083540402835291602001916114b8565b820191906000526020600020905b81548152906001019060200180831161149b57829003601f168201915b5050505050908060030154905084565b60006114d2610c11565b8210611513576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150a906148c6565b60405180910390fd5b60088281548110611527576115266148e6565b5b90600052602060002001549050919050565b601160205280600052604060002060009150905080600001549080600101805461156290613e6b565b80601f016020809104026020016040519081016040528092919081815260200182805461158e90613e6b565b80156115db5780601f106115b0576101008083540402835291602001916115db565b820191906000526020600020905b8154815290600101906020018083116115be57829003601f168201915b5050505050905082565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561168e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168590614987565b60405180910390fd5b80915050919050565b60006116a2836124db565b82106116ad57600080fd5b6012600084815260200190815260200160002082815481106116d2576116d16148e6565b5b9060005260206000200154905092915050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611756576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174d90614a19565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6117a56125e1565b73ffffffffffffffffffffffffffffffffffffffff166117c3611c84565b73ffffffffffffffffffffffffffffffffffffffff1614611819576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181090614a85565b60405180910390fd5b61182360006129dc565b565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806118b35750611884611c84565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6118bc57600080fd5b6000601060008781526020019081526020016000206003015411611915576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190c90614af1565b60405180910390fd5b601060008681526020019081526020016000206003015483111561196e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196590614b83565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156119de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119d590614bef565b60405180910390fd5b6013600085815260200190815260200160002060009054906101000a900460ff1615611a3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3690614c5b565b60405180910390fd5b601481604051611a4f91906140fb565b908152602001604051809103902060009054906101000a900460ff1615611aab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aa29061415e565b60405180910390fd5b60008386611ab99190614c7b565b90506000601160008381526020019081526020016000206000015414611b14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0b90614d1d565b60405180910390fd5b600060405180604001604052808381526020018481525090508060116000848152602001908152602001600020600082015181600001556020820151816001019080519060200190611b6792919061344b565b509050506012600088815260200190815260200160002082908060018154018082558091505060019003906000526020600020016000909190919091505560016013600088815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601484604051611be391906140fb565b908152602001604051809103902060006101000a81548160ff021916908315150217905550611c128483612aa2565b81878573ffffffffffffffffffffffffffffffffffffffff167f4f21e8cd53f1df1da42ec94ba03f881c1185607b26e4dcb81941535157d73dd460405160405180910390a450505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611d3c5750611d0d611c84565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611d4557600080fd5b80600d9080519060200190611d5b92919061344b565b5050565b606060018054611d6e90613e6b565b80601f0160208091040260200160405190810160405280929190818152602001828054611d9a90613e6b565b8015611de75780601f10611dbc57610100808354040283529160200191611de7565b820191906000526020600020905b815481529060010190602001808311611dca57829003601f168201915b5050505050905090565b611df96125e1565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611e67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5e90614d89565b60405180910390fd5b8060056000611e746125e1565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611f216125e1565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611f6691906135a2565b60405180910390a35050565b6000611f7c612260565b8210611fbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fb490614e1b565b60405180910390fd5b600f8281548110611fd157611fd06148e6565b5b90600052602060002001549050919050565b611ff4611fee6125e1565b836126a2565b612033576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161202a9061429b565b60405180910390fd5b61203f84848484612ac0565b50505050565b606061205082612575565b61208f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208690614ead565b60405180910390fd5b6000600d805461209e90613e6b565b80601f01602080910402602001604051908101604052809291908181526020018280546120ca90613e6b565b80156121175780601f106120ec57610100808354040283529160200191612117565b820191906000526020600020905b8154815290600101906020018083116120fa57829003601f168201915b50505050509050600081511415612161576040518060400160405280600781526020017f697066733a2f2f0000000000000000000000000000000000000000000000000081525090505b8060116000858152602001908152602001600020600101604051602001612189929190614f19565b604051602081830303815290604052915050919050565b6121a86125e1565b73ffffffffffffffffffffffffffffffffffffffff166121c6611c84565b73ffffffffffffffffffffffffffffffffffffffff161461221c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221390614a85565b60405180910390fd5b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600f80549050905090565b6060600e805461227c90613e6b565b80601f01602080910402602001604051908101604052809291908181526020018280546122a890613e6b565b80156122f55780601f106122ca576101008083540402835291602001916122f5565b820191906000526020600020905b8154815290600101906020018083116122d857829003601f168201915b5050505050905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b61271081565b6123c56125e1565b73ffffffffffffffffffffffffffffffffffffffff166123e3611c84565b73ffffffffffffffffffffffffffffffffffffffff1614612439576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161243090614a85565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156124a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124a090614fba565b60405180910390fd5b6124b2816129dc565b50565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600060126000838152602001908152602001600020805490509050919050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061256e575061256d82612b1c565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661265c836115e5565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006126ad82612575565b6126ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126e39061504c565b60405180910390fd5b60006126f7836115e5565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061276657508373ffffffffffffffffffffffffffffffffffffffff1661274e8461088c565b73ffffffffffffffffffffffffffffffffffffffff16145b80612777575061277681856122ff565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166127a0826115e5565b73ffffffffffffffffffffffffffffffffffffffff16146127f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127ed906150de565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612866576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161285d90615170565b60405180910390fd5b612871838383612bfe565b61287c6000826125e9565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128cc9190615190565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129239190614c7b565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612abc828260405180602001604052806000815250612d12565b5050565b612acb848484612780565b612ad784848484612d6d565b612b16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b0d90615236565b60405180910390fd5b50505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612be757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612bf75750612bf682612ef5565b5b9050919050565b612c09838383612f5f565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612c4c57612c4781612f64565b612c8b565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612c8a57612c898382612fad565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612cce57612cc98161311a565b612d0d565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612d0c57612d0b82826131eb565b5b5b505050565b612d1c838361326a565b612d296000848484612d6d565b612d68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d5f90615236565b60405180910390fd5b505050565b6000612d8e8473ffffffffffffffffffffffffffffffffffffffff16613438565b15612ee8578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612db76125e1565b8786866040518563ffffffff1660e01b8152600401612dd994939291906152ab565b6020604051808303816000875af1925050508015612e1557506040513d601f19601f82011682018060405250810190612e12919061530c565b60015b612e98573d8060008114612e45576040519150601f19603f3d011682016040523d82523d6000602084013e612e4a565b606091505b50600081511415612e90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e8790615236565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612eed565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612fba846116e5565b612fc49190615190565b90506000600760008481526020019081526020016000205490508181146130a9576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061312e9190615190565b905060006009600084815260200190815260200160002054905060006008838154811061315e5761315d6148e6565b5b9060005260206000200154905080600883815481106131805761317f6148e6565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806131cf576131ce615339565b5b6001900381819060005260206000200160009055905550505050565b60006131f6836116e5565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156132da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132d1906153b4565b60405180910390fd5b6132e381612575565b15613323576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161331a90615420565b60405180910390fd5b61332f60008383612bfe565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461337f9190614c7b565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b82805461345790613e6b565b90600052602060002090601f01602090048101928261347957600085556134c0565b82601f1061349257805160ff19168380011785556134c0565b828001600101855582156134c0579182015b828111156134bf5782518255916020019190600101906134a4565b5b5090506134cd91906134d1565b5090565b5b808211156134ea5760008160009055506001016134d2565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61353781613502565b811461354257600080fd5b50565b6000813590506135548161352e565b92915050565b6000602082840312156135705761356f6134f8565b5b600061357e84828501613545565b91505092915050565b60008115159050919050565b61359c81613587565b82525050565b60006020820190506135b76000830184613593565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156135f75780820151818401526020810190506135dc565b83811115613606576000848401525b50505050565b6000601f19601f8301169050919050565b6000613628826135bd565b61363281856135c8565b93506136428185602086016135d9565b61364b8161360c565b840191505092915050565b60006020820190508181036000830152613670818461361d565b905092915050565b6000819050919050565b61368b81613678565b811461369657600080fd5b50565b6000813590506136a881613682565b92915050565b6000602082840312156136c4576136c36134f8565b5b60006136d284828501613699565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613706826136db565b9050919050565b613716816136fb565b82525050565b6000602082019050613731600083018461370d565b92915050565b613740816136fb565b811461374b57600080fd5b50565b60008135905061375d81613737565b92915050565b6000806040838503121561377a576137796134f8565b5b60006137888582860161374e565b925050602061379985828601613699565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6137e58261360c565b810181811067ffffffffffffffff82111715613804576138036137ad565b5b80604052505050565b60006138176134ee565b905061382382826137dc565b919050565b600067ffffffffffffffff821115613843576138426137ad565b5b61384c8261360c565b9050602081019050919050565b82818337600083830152505050565b600061387b61387684613828565b61380d565b905082815260208101848484011115613897576138966137a8565b5b6138a2848285613859565b509392505050565b600082601f8301126138bf576138be6137a3565b5b81356138cf848260208601613868565b91505092915050565b600080604083850312156138ef576138ee6134f8565b5b60006138fd85828601613699565b925050602083013567ffffffffffffffff81111561391e5761391d6134fd565b5b61392a858286016138aa565b9150509250929050565b61393d81613678565b82525050565b60006020820190506139586000830184613934565b92915050565b600080600060608486031215613977576139766134f8565b5b60006139858682870161374e565b93505060206139968682870161374e565b92505060406139a786828701613699565b9150509250925092565b600080604083850312156139c8576139c76134f8565b5b60006139d685828601613699565b92505060206139e785828601613699565b9150509250929050565b6000604082019050613a06600083018561370d565b613a136020830184613934565b9392505050565b60008060008060808587031215613a3457613a336134f8565b5b600085013567ffffffffffffffff811115613a5257613a516134fd565b5b613a5e878288016138aa565b945050602085013567ffffffffffffffff811115613a7f57613a7e6134fd565b5b613a8b878288016138aa565b935050604085013567ffffffffffffffff811115613aac57613aab6134fd565b5b613ab8878288016138aa565b9250506060613ac987828801613699565b91505092959194509250565b600060208284031215613aeb57613aea6134f8565b5b6000613af98482850161374e565b91505092915050565b60006080820190508181036000830152613b1c818761361d565b90508181036020830152613b30818661361d565b90508181036040830152613b44818561361d565b9050613b536060830184613934565b95945050505050565b6000604082019050613b716000830185613934565b8181036020830152613b83818461361d565b90509392505050565b600080600080600060a08688031215613ba857613ba76134f8565b5b6000613bb688828901613699565b9550506020613bc788828901613699565b9450506040613bd888828901613699565b9350506060613be98882890161374e565b925050608086013567ffffffffffffffff811115613c0a57613c096134fd565b5b613c16888289016138aa565b9150509295509295909350565b600060208284031215613c3957613c386134f8565b5b600082013567ffffffffffffffff811115613c5757613c566134fd565b5b613c63848285016138aa565b91505092915050565b613c7581613587565b8114613c8057600080fd5b50565b600081359050613c9281613c6c565b92915050565b60008060408385031215613caf57613cae6134f8565b5b6000613cbd8582860161374e565b9250506020613cce85828601613c83565b9150509250929050565b600067ffffffffffffffff821115613cf357613cf26137ad565b5b613cfc8261360c565b9050602081019050919050565b6000613d1c613d1784613cd8565b61380d565b905082815260208101848484011115613d3857613d376137a8565b5b613d43848285613859565b509392505050565b600082601f830112613d6057613d5f6137a3565b5b8135613d70848260208601613d09565b91505092915050565b60008060008060808587031215613d9357613d926134f8565b5b6000613da18782880161374e565b9450506020613db28782880161374e565b9350506040613dc387828801613699565b925050606085013567ffffffffffffffff811115613de457613de36134fd565b5b613df087828801613d4b565b91505092959194509250565b60008060408385031215613e1357613e126134f8565b5b6000613e218582860161374e565b9250506020613e328582860161374e565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613e8357607f821691505b60208210811415613e9757613e96613e3c565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613ef9602c836135c8565b9150613f0482613e9d565b604082019050919050565b60006020820190508181036000830152613f2881613eec565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613f8b6021836135c8565b9150613f9682613f2f565b604082019050919050565b60006020820190508181036000830152613fba81613f7e565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b600061401d6038836135c8565b915061402882613fc1565b604082019050919050565b6000602082019050818103600083015261404c81614010565b9050919050565b7f617274776f726b2065646974696f6e206973206e6f7420666f756e6400000000600082015250565b6000614089601c836135c8565b915061409482614053565b602082019050919050565b600060208201905081810360008301526140b88161407c565b9050919050565b600081905092915050565b60006140d5826135bd565b6140df81856140bf565b93506140ef8185602086016135d9565b80840191505092915050565b600061410782846140ca565b915081905092915050565b7f6970667320696420686173207265676973746572656400000000000000000000600082015250565b60006141486016836135c8565b915061415382614112565b602082019050919050565b600060208201905081810360008301526141778161413b565b9050919050565b60008190508160005260206000209050919050565b600081546141a081613e6b565b6141aa81866140bf565b945060018216600081146141c557600181146141d657614209565b60ff19831686528186019350614209565b6141df8561417e565b60005b83811015614201578154818901526001820191506020810190506141e2565b838801955050505b50505092915050565b600061421e8284614193565b915081905092915050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b60006142856031836135c8565b915061429082614229565b604082019050919050565b600060208201905081810360008301526142b481614278565b9050919050565b7f455243323938313a20717565727920726f79616c747920696e666f20666f722060008201527f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000602082015250565b60006143176031836135c8565b9150614322826142bb565b604082019050919050565b600060208201905081810360008301526143468161430a565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061438782613678565b915061439283613678565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156143cb576143ca61434d565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061441082613678565b915061441b83613678565b92508261442b5761442a6143d6565b5b828204905092915050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000614492602b836135c8565b915061449d82614436565b604082019050919050565b600060208201905081810360008301526144c181614485565b9050919050565b7f7469746c652063616e206e6f7420626520656d70747900000000000000000000600082015250565b60006144fe6016836135c8565b9150614509826144c8565b602082019050919050565b6000602082019050818103600083015261452d816144f1565b9050919050565b7f6172746973742063616e206e6f7420626520656d707479000000000000000000600082015250565b600061456a6017836135c8565b915061457582614534565b602082019050919050565b600060208201905081810360008301526145998161455d565b9050919050565b7f66696e6765727072696e742063616e206e6f7420626520656d70747900000000600082015250565b60006145d6601c836135c8565b91506145e1826145a0565b602082019050919050565b60006020820190508181036000830152614605816145c9565b9050919050565b7f65646974696f6e2073697a65206e6565647320746f206265206174206c65617360008201527f7420310000000000000000000000000000000000000000000000000000000000602082015250565b60006146686023836135c8565b91506146738261460c565b604082019050919050565b600060208201905081810360008301526146978161465b565b9050919050565b7f617274776f726b2065646974696f6e2073697a6520657863656564732074686560008201527f206d6178696d756d2065646974696f6e2073697a65206f66207468652065786860208201527f69626974696f6e00000000000000000000000000000000000000000000000000604082015250565b60006147206047836135c8565b915061472b8261469e565b606082019050919050565b6000602082019050818103600083015261474f81614713565b9050919050565b7f616e20617274776f726b2077697468207468652073616d652066696e6765727060008201527f72696e742068617320616c726561647920726567697374657265640000000000602082015250565b60006147b2603b836135c8565b91506147bd82614756565b604082019050919050565b600060208201905081810360008301526147e1816147a5565b9050919050565b7f696e76616c696420726f79616c7479207061796f757420616464726573730000600082015250565b600061481e601e836135c8565b9150614829826147e8565b602082019050919050565b6000602082019050818103600083015261484d81614811565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b60006148b0602c836135c8565b91506148bb82614854565b604082019050919050565b600060208201905081810360008301526148df816148a3565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b60006149716029836135c8565b915061497c82614915565b604082019050919050565b600060208201905081810360008301526149a081614964565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000614a03602a836135c8565b9150614a0e826149a7565b604082019050919050565b60006020820190508181036000830152614a32816149f6565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614a6f6020836135c8565b9150614a7a82614a39565b602082019050919050565b60006020820190508181036000830152614a9e81614a62565b9050919050565b7f617274776f726b206973206e6f7420666f756e64000000000000000000000000600082015250565b6000614adb6014836135c8565b9150614ae682614aa5565b602082019050919050565b60006020820190508181036000830152614b0a81614ace565b9050919050565b7f65646974696f6e206e756d62657220657863656564207468652065646974696f60008201527f6e2073697a65206f662074686520617274776f726b0000000000000000000000602082015250565b6000614b6d6035836135c8565b9150614b7882614b11565b604082019050919050565b60006020820190508181036000830152614b9c81614b60565b9050919050565b7f696e76616c6964206f776e657220616464726573730000000000000000000000600082015250565b6000614bd96015836135c8565b9150614be482614ba3565b602082019050919050565b60006020820190508181036000830152614c0881614bcc565b9050919050565b7f6269746d61726b20696420686173207265676973746572656400000000000000600082015250565b6000614c456019836135c8565b9150614c5082614c0f565b602082019050919050565b60006020820190508181036000830152614c7481614c38565b9050919050565b6000614c8682613678565b9150614c9183613678565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614cc657614cc561434d565b5b828201905092915050565b7f7468652065646974696f6e206973206578697374656e74000000000000000000600082015250565b6000614d076017836135c8565b9150614d1282614cd1565b602082019050919050565b60006020820190508181036000830152614d3681614cfa565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000614d736019836135c8565b9150614d7e82614d3d565b602082019050919050565b60006020820190508181036000830152614da281614d66565b9050919050565b7f617274776f726b733a20676c6f62616c20696e646578206f7574206f6620626f60008201527f756e647300000000000000000000000000000000000000000000000000000000602082015250565b6000614e056024836135c8565b9150614e1082614da9565b604082019050919050565b60006020820190508181036000830152614e3481614df8565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000614e97602f836135c8565b9150614ea282614e3b565b604082019050919050565b60006020820190508181036000830152614ec681614e8a565b9050919050565b7f2f6d657461646174612e6a736f6e000000000000000000000000000000000000600082015250565b6000614f03600e836140bf565b9150614f0e82614ecd565b600e82019050919050565b6000614f2582856140ca565b9150614f318284614193565b9150614f3c82614ef6565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614fa46026836135c8565b9150614faf82614f48565b604082019050919050565b60006020820190508181036000830152614fd381614f97565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000615036602c836135c8565b915061504182614fda565b604082019050919050565b6000602082019050818103600083015261506581615029565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b60006150c86029836135c8565b91506150d38261506c565b604082019050919050565b600060208201905081810360008301526150f7816150bb565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061515a6024836135c8565b9150615165826150fe565b604082019050919050565b600060208201905081810360008301526151898161514d565b9050919050565b600061519b82613678565b91506151a683613678565b9250828210156151b9576151b861434d565b5b828203905092915050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006152206032836135c8565b915061522b826151c4565b604082019050919050565b6000602082019050818103600083015261524f81615213565b9050919050565b600081519050919050565b600082825260208201905092915050565b600061527d82615256565b6152878185615261565b93506152978185602086016135d9565b6152a08161360c565b840191505092915050565b60006080820190506152c0600083018761370d565b6152cd602083018661370d565b6152da6040830185613934565b81810360608301526152ec8184615272565b905095945050505050565b6000815190506153068161352e565b92915050565b600060208284031215615322576153216134f8565b5b6000615330848285016152f7565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b600061539e6020836135c8565b91506153a982615368565b602082019050919050565b600060208201905081810360008301526153cd81615391565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b600061540a601c836135c8565b9150615415826153d4565b602082019050919050565b60006020820190508181036000830152615439816153fd565b905091905056fea2646970667358221220c5778364b0cb5313c391843165218fd269bf148c2bde28d0f2f971cb0938e5b164736f6c634300080c003300000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000005dc000000000000000000000000f6d099037df564a32237705e5005f4450b0eb6c3000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000001e0000000000000000000000000000000000000000000000000000000000000001f466572616c2046696c6520e2809420496e66696e69746520456e74726f70790000000000000000000000000000000000000000000000000000000000000000054646303134000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004c68747470733a2f2f697066732e6269746d61726b2e636f6d2f697066732f516d6374416464416a6256557063436a65733548724542664d757a4d393532746e4371665032634b66506459616d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001e68747470733a2f2f697066732e6269746d61726b2e636f6d2f697066732f0000
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102325760003560e01c8063715018a611610130578063c87b56dd116100b8578063ea211d7c1161007c578063ea211d7c146106da578063ec9cbb44146106f8578063f2fde38b14610716578063fdf97cb214610732578063fe2a3bf31461075057610232565b8063c87b56dd14610622578063d0d1ea7014610652578063e4a233e11461066e578063e8a3d4851461068c578063e985e9c5146106aa57610232565b80638ef79e91116100ff5780638ef79e911461058057806395d89b411461059c578063a22cb465146105ba578063b4883703146105d6578063b88d4fde1461060657610232565b8063715018a61461051e5780637f34c0dd1461052857806384ad61af146105445780638da5cb5b1461056257610232565b80633afb021a116101be5780634f6ccce7116101825780634f6ccce71461042d57806362fe21311461045d5780636352211e1461048e578063641b18e9146104be57806370a08231146104ee57610232565b80633afb021a146103885780633f6805ba146103a457806342842e0e146103c257806345aeefde146103de5780634b602673146103fa57610232565b80630cfcb5f1116102055780630cfcb5f1146102d157806318160ddd146102ed57806323b872dd1461030b5780632a55205a146103275780632f745c591461035857610232565b806301ffc9a71461023757806306fdde0314610267578063081812fc14610285578063095ea7b3146102b5575b600080fd5b610251600480360381019061024c919061355a565b610780565b60405161025e91906135a2565b60405180910390f35b61026f6107fa565b60405161027c9190613656565b60405180910390f35b61029f600480360381019061029a91906136ae565b61088c565b6040516102ac919061371c565b60405180910390f35b6102cf60048036038101906102ca9190613763565b610911565b005b6102eb60048036038101906102e691906138d8565b610a29565b005b6102f5610c11565b6040516103029190613943565b60405180910390f35b6103256004803603810190610320919061395e565b610c1e565b005b610341600480360381019061033c91906139b1565b610c7e565b60405161034f9291906139f1565b60405180910390f35b610372600480360381019061036d9190613763565b610d30565b60405161037f9190613943565b60405180910390f35b6103a2600480360381019061039d9190613a1a565b610dd5565b005b6103ac61116f565b6040516103b9919061371c565b60405180910390f35b6103dc60048036038101906103d7919061395e565b611195565b005b6103f860048036038101906103f39190613ad5565b6111b5565b005b610414600480360381019061040f91906136ae565b611300565b6040516104249493929190613b02565b60405180910390f35b610447600480360381019061044291906136ae565b6114c8565b6040516104549190613943565b60405180910390f35b610477600480360381019061047291906136ae565b611539565b604051610485929190613b5c565b60405180910390f35b6104a860048036038101906104a391906136ae565b6115e5565b6040516104b5919061371c565b60405180910390f35b6104d860048036038101906104d391906139b1565b611697565b6040516104e59190613943565b60405180910390f35b61050860048036038101906105039190613ad5565b6116e5565b6040516105159190613943565b60405180910390f35b61052661179d565b005b610542600480360381019061053d9190613b8c565b611825565b005b61054c611c60565b6040516105599190613943565b60405180910390f35b61056a611c84565b604051610577919061371c565b60405180910390f35b61059a60048036038101906105959190613c23565b611cae565b005b6105a4611d5f565b6040516105b19190613656565b60405180910390f35b6105d460048036038101906105cf9190613c98565b611df1565b005b6105f060048036038101906105eb91906136ae565b611f72565b6040516105fd9190613943565b60405180910390f35b610620600480360381019061061b9190613d79565b611fe3565b005b61063c600480360381019061063791906136ae565b612045565b6040516106499190613656565b60405180910390f35b61066c60048036038101906106679190613ad5565b6121a0565b005b610676612260565b6040516106839190613943565b60405180910390f35b61069461226d565b6040516106a19190613656565b60405180910390f35b6106c460048036038101906106bf9190613dfc565b6122ff565b6040516106d191906135a2565b60405180910390f35b6106e2612393565b6040516106ef9190613943565b60405180910390f35b6107006123b7565b60405161070d9190613943565b60405180910390f35b610730600480360381019061072b9190613ad5565b6123bd565b005b61073a6124b5565b604051610747919061371c565b60405180910390f35b61076a600480360381019061076591906136ae565b6124db565b6040516107779190613943565b60405180910390f35b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107f357506107f2826124fb565b5b9050919050565b60606000805461080990613e6b565b80601f016020809104026020016040519081016040528092919081815260200182805461083590613e6b565b80156108825780601f1061085757610100808354040283529160200191610882565b820191906000526020600020905b81548152906001019060200180831161086557829003601f168201915b5050505050905090565b600061089782612575565b6108d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108cd90613f0f565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061091c826115e5565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561098d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161098490613fa1565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109ac6125e1565b73ffffffffffffffffffffffffffffffffffffffff1614806109db57506109da816109d56125e1565b6122ff565b5b610a1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1190614033565b60405180910390fd5b610a2483836125e9565b505050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610ab75750610a88611c84565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b610ac057600080fd5b610ac982612575565b610b08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aff9061409f565b60405180910390fd5b601481604051610b1891906140fb565b908152602001604051809103902060009054906101000a900460ff1615610b74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6b9061415e565b60405180910390fd5b6000601160008481526020019081526020016000209050601481600101604051610b9e9190614212565b908152602001604051809103902060006101000a81549060ff02191690556001601483604051610bce91906140fb565b908152602001604051809103902060006101000a81548160ff02191690831515021790555081816001019080519060200190610c0b92919061344b565b50505050565b6000600880549050905090565b610c2f610c296125e1565b826126a2565b610c6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c659061429b565b60405180910390fd5b610c79838383612780565b505050565b600080610c8a84612575565b610cc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc09061432d565b60405180910390fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691506127107f00000000000000000000000000000000000000000000000000000000000005dc84610d1d919061437c565b610d279190614405565b90509250929050565b6000610d3b836116e5565b8210610d7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d73906144a8565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610e635750610e34611c84565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b610e6c57600080fd5b600083511415610eb1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea890614514565b60405180910390fd5b600082511415610ef6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eed90614580565b60405180910390fd5b600084511415610f3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f32906145ec565b60405180910390fd5b60008111610f7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f759061467e565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000001811115610fe1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd890614736565b60405180910390fd5b600084604051602001610ff49190613656565b6040516020818303038152906040528051906020012060001c9050600060106000838152602001908152602001600020600201805461103290613e6b565b905014611074576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106b906147c8565b60405180910390fd5b60006040518060800160405280868152602001858152602001878152602001848152509050600f829080600181540180825580915050600190039060005260206000200160009091909190915055806010600084815260200190815260200160002060008201518160000190805190602001906110f292919061344b565b50602082015181600101908051906020019061110f92919061344b565b50604082015181600201908051906020019061112c92919061344b565b5060608201518160030155905050817f22350b25f1b72bb3621199a79abefeb4fcd77bb1e65638cd09350666e4db089160405160405180910390a2505050505050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6111b083838360405180602001604052806000815250611fe3565b505050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806112435750611214611c84565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b61124c57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156112bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b390614834565b60405180910390fd5b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b601060205280600052604060002060009150905080600001805461132390613e6b565b80601f016020809104026020016040519081016040528092919081815260200182805461134f90613e6b565b801561139c5780601f106113715761010080835404028352916020019161139c565b820191906000526020600020905b81548152906001019060200180831161137f57829003601f168201915b5050505050908060010180546113b190613e6b565b80601f01602080910402602001604051908101604052809291908181526020018280546113dd90613e6b565b801561142a5780601f106113ff5761010080835404028352916020019161142a565b820191906000526020600020905b81548152906001019060200180831161140d57829003601f168201915b50505050509080600201805461143f90613e6b565b80601f016020809104026020016040519081016040528092919081815260200182805461146b90613e6b565b80156114b85780601f1061148d576101008083540402835291602001916114b8565b820191906000526020600020905b81548152906001019060200180831161149b57829003601f168201915b5050505050908060030154905084565b60006114d2610c11565b8210611513576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150a906148c6565b60405180910390fd5b60088281548110611527576115266148e6565b5b90600052602060002001549050919050565b601160205280600052604060002060009150905080600001549080600101805461156290613e6b565b80601f016020809104026020016040519081016040528092919081815260200182805461158e90613e6b565b80156115db5780601f106115b0576101008083540402835291602001916115db565b820191906000526020600020905b8154815290600101906020018083116115be57829003601f168201915b5050505050905082565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561168e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168590614987565b60405180910390fd5b80915050919050565b60006116a2836124db565b82106116ad57600080fd5b6012600084815260200190815260200160002082815481106116d2576116d16148e6565b5b9060005260206000200154905092915050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611756576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174d90614a19565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6117a56125e1565b73ffffffffffffffffffffffffffffffffffffffff166117c3611c84565b73ffffffffffffffffffffffffffffffffffffffff1614611819576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181090614a85565b60405180910390fd5b61182360006129dc565b565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806118b35750611884611c84565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6118bc57600080fd5b6000601060008781526020019081526020016000206003015411611915576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190c90614af1565b60405180910390fd5b601060008681526020019081526020016000206003015483111561196e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196590614b83565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156119de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119d590614bef565b60405180910390fd5b6013600085815260200190815260200160002060009054906101000a900460ff1615611a3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3690614c5b565b60405180910390fd5b601481604051611a4f91906140fb565b908152602001604051809103902060009054906101000a900460ff1615611aab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aa29061415e565b60405180910390fd5b60008386611ab99190614c7b565b90506000601160008381526020019081526020016000206000015414611b14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0b90614d1d565b60405180910390fd5b600060405180604001604052808381526020018481525090508060116000848152602001908152602001600020600082015181600001556020820151816001019080519060200190611b6792919061344b565b509050506012600088815260200190815260200160002082908060018154018082558091505060019003906000526020600020016000909190919091505560016013600088815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601484604051611be391906140fb565b908152602001604051809103902060006101000a81548160ff021916908315150217905550611c128483612aa2565b81878573ffffffffffffffffffffffffffffffffffffffff167f4f21e8cd53f1df1da42ec94ba03f881c1185607b26e4dcb81941535157d73dd460405160405180910390a450505050505050565b7f000000000000000000000000000000000000000000000000000000000000000181565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611d3c5750611d0d611c84565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611d4557600080fd5b80600d9080519060200190611d5b92919061344b565b5050565b606060018054611d6e90613e6b565b80601f0160208091040260200160405190810160405280929190818152602001828054611d9a90613e6b565b8015611de75780601f10611dbc57610100808354040283529160200191611de7565b820191906000526020600020905b815481529060010190602001808311611dca57829003601f168201915b5050505050905090565b611df96125e1565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611e67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5e90614d89565b60405180910390fd5b8060056000611e746125e1565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611f216125e1565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611f6691906135a2565b60405180910390a35050565b6000611f7c612260565b8210611fbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fb490614e1b565b60405180910390fd5b600f8281548110611fd157611fd06148e6565b5b90600052602060002001549050919050565b611ff4611fee6125e1565b836126a2565b612033576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161202a9061429b565b60405180910390fd5b61203f84848484612ac0565b50505050565b606061205082612575565b61208f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208690614ead565b60405180910390fd5b6000600d805461209e90613e6b565b80601f01602080910402602001604051908101604052809291908181526020018280546120ca90613e6b565b80156121175780601f106120ec57610100808354040283529160200191612117565b820191906000526020600020905b8154815290600101906020018083116120fa57829003601f168201915b50505050509050600081511415612161576040518060400160405280600781526020017f697066733a2f2f0000000000000000000000000000000000000000000000000081525090505b8060116000858152602001908152602001600020600101604051602001612189929190614f19565b604051602081830303815290604052915050919050565b6121a86125e1565b73ffffffffffffffffffffffffffffffffffffffff166121c6611c84565b73ffffffffffffffffffffffffffffffffffffffff161461221c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221390614a85565b60405180910390fd5b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600f80549050905090565b6060600e805461227c90613e6b565b80601f01602080910402602001604051908101604052809291908181526020018280546122a890613e6b565b80156122f55780601f106122ca576101008083540402835291602001916122f5565b820191906000526020600020905b8154815290600101906020018083116122d857829003601f168201915b5050505050905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b7f00000000000000000000000000000000000000000000000000000000000005dc81565b61271081565b6123c56125e1565b73ffffffffffffffffffffffffffffffffffffffff166123e3611c84565b73ffffffffffffffffffffffffffffffffffffffff1614612439576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161243090614a85565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156124a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124a090614fba565b60405180910390fd5b6124b2816129dc565b50565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600060126000838152602001908152602001600020805490509050919050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061256e575061256d82612b1c565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661265c836115e5565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006126ad82612575565b6126ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126e39061504c565b60405180910390fd5b60006126f7836115e5565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061276657508373ffffffffffffffffffffffffffffffffffffffff1661274e8461088c565b73ffffffffffffffffffffffffffffffffffffffff16145b80612777575061277681856122ff565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166127a0826115e5565b73ffffffffffffffffffffffffffffffffffffffff16146127f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127ed906150de565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612866576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161285d90615170565b60405180910390fd5b612871838383612bfe565b61287c6000826125e9565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128cc9190615190565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129239190614c7b565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612abc828260405180602001604052806000815250612d12565b5050565b612acb848484612780565b612ad784848484612d6d565b612b16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b0d90615236565b60405180910390fd5b50505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612be757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612bf75750612bf682612ef5565b5b9050919050565b612c09838383612f5f565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612c4c57612c4781612f64565b612c8b565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612c8a57612c898382612fad565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612cce57612cc98161311a565b612d0d565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612d0c57612d0b82826131eb565b5b5b505050565b612d1c838361326a565b612d296000848484612d6d565b612d68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d5f90615236565b60405180910390fd5b505050565b6000612d8e8473ffffffffffffffffffffffffffffffffffffffff16613438565b15612ee8578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612db76125e1565b8786866040518563ffffffff1660e01b8152600401612dd994939291906152ab565b6020604051808303816000875af1925050508015612e1557506040513d601f19601f82011682018060405250810190612e12919061530c565b60015b612e98573d8060008114612e45576040519150601f19603f3d011682016040523d82523d6000602084013e612e4a565b606091505b50600081511415612e90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e8790615236565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612eed565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612fba846116e5565b612fc49190615190565b90506000600760008481526020019081526020016000205490508181146130a9576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061312e9190615190565b905060006009600084815260200190815260200160002054905060006008838154811061315e5761315d6148e6565b5b9060005260206000200154905080600883815481106131805761317f6148e6565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806131cf576131ce615339565b5b6001900381819060005260206000200160009055905550505050565b60006131f6836116e5565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156132da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132d1906153b4565b60405180910390fd5b6132e381612575565b15613323576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161331a90615420565b60405180910390fd5b61332f60008383612bfe565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461337f9190614c7b565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b82805461345790613e6b565b90600052602060002090601f01602090048101928261347957600085556134c0565b82601f1061349257805160ff19168380011785556134c0565b828001600101855582156134c0579182015b828111156134bf5782518255916020019190600101906134a4565b5b5090506134cd91906134d1565b5090565b5b808211156134ea5760008160009055506001016134d2565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61353781613502565b811461354257600080fd5b50565b6000813590506135548161352e565b92915050565b6000602082840312156135705761356f6134f8565b5b600061357e84828501613545565b91505092915050565b60008115159050919050565b61359c81613587565b82525050565b60006020820190506135b76000830184613593565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156135f75780820151818401526020810190506135dc565b83811115613606576000848401525b50505050565b6000601f19601f8301169050919050565b6000613628826135bd565b61363281856135c8565b93506136428185602086016135d9565b61364b8161360c565b840191505092915050565b60006020820190508181036000830152613670818461361d565b905092915050565b6000819050919050565b61368b81613678565b811461369657600080fd5b50565b6000813590506136a881613682565b92915050565b6000602082840312156136c4576136c36134f8565b5b60006136d284828501613699565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613706826136db565b9050919050565b613716816136fb565b82525050565b6000602082019050613731600083018461370d565b92915050565b613740816136fb565b811461374b57600080fd5b50565b60008135905061375d81613737565b92915050565b6000806040838503121561377a576137796134f8565b5b60006137888582860161374e565b925050602061379985828601613699565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6137e58261360c565b810181811067ffffffffffffffff82111715613804576138036137ad565b5b80604052505050565b60006138176134ee565b905061382382826137dc565b919050565b600067ffffffffffffffff821115613843576138426137ad565b5b61384c8261360c565b9050602081019050919050565b82818337600083830152505050565b600061387b61387684613828565b61380d565b905082815260208101848484011115613897576138966137a8565b5b6138a2848285613859565b509392505050565b600082601f8301126138bf576138be6137a3565b5b81356138cf848260208601613868565b91505092915050565b600080604083850312156138ef576138ee6134f8565b5b60006138fd85828601613699565b925050602083013567ffffffffffffffff81111561391e5761391d6134fd565b5b61392a858286016138aa565b9150509250929050565b61393d81613678565b82525050565b60006020820190506139586000830184613934565b92915050565b600080600060608486031215613977576139766134f8565b5b60006139858682870161374e565b93505060206139968682870161374e565b92505060406139a786828701613699565b9150509250925092565b600080604083850312156139c8576139c76134f8565b5b60006139d685828601613699565b92505060206139e785828601613699565b9150509250929050565b6000604082019050613a06600083018561370d565b613a136020830184613934565b9392505050565b60008060008060808587031215613a3457613a336134f8565b5b600085013567ffffffffffffffff811115613a5257613a516134fd565b5b613a5e878288016138aa565b945050602085013567ffffffffffffffff811115613a7f57613a7e6134fd565b5b613a8b878288016138aa565b935050604085013567ffffffffffffffff811115613aac57613aab6134fd565b5b613ab8878288016138aa565b9250506060613ac987828801613699565b91505092959194509250565b600060208284031215613aeb57613aea6134f8565b5b6000613af98482850161374e565b91505092915050565b60006080820190508181036000830152613b1c818761361d565b90508181036020830152613b30818661361d565b90508181036040830152613b44818561361d565b9050613b536060830184613934565b95945050505050565b6000604082019050613b716000830185613934565b8181036020830152613b83818461361d565b90509392505050565b600080600080600060a08688031215613ba857613ba76134f8565b5b6000613bb688828901613699565b9550506020613bc788828901613699565b9450506040613bd888828901613699565b9350506060613be98882890161374e565b925050608086013567ffffffffffffffff811115613c0a57613c096134fd565b5b613c16888289016138aa565b9150509295509295909350565b600060208284031215613c3957613c386134f8565b5b600082013567ffffffffffffffff811115613c5757613c566134fd565b5b613c63848285016138aa565b91505092915050565b613c7581613587565b8114613c8057600080fd5b50565b600081359050613c9281613c6c565b92915050565b60008060408385031215613caf57613cae6134f8565b5b6000613cbd8582860161374e565b9250506020613cce85828601613c83565b9150509250929050565b600067ffffffffffffffff821115613cf357613cf26137ad565b5b613cfc8261360c565b9050602081019050919050565b6000613d1c613d1784613cd8565b61380d565b905082815260208101848484011115613d3857613d376137a8565b5b613d43848285613859565b509392505050565b600082601f830112613d6057613d5f6137a3565b5b8135613d70848260208601613d09565b91505092915050565b60008060008060808587031215613d9357613d926134f8565b5b6000613da18782880161374e565b9450506020613db28782880161374e565b9350506040613dc387828801613699565b925050606085013567ffffffffffffffff811115613de457613de36134fd565b5b613df087828801613d4b565b91505092959194509250565b60008060408385031215613e1357613e126134f8565b5b6000613e218582860161374e565b9250506020613e328582860161374e565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613e8357607f821691505b60208210811415613e9757613e96613e3c565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613ef9602c836135c8565b9150613f0482613e9d565b604082019050919050565b60006020820190508181036000830152613f2881613eec565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613f8b6021836135c8565b9150613f9682613f2f565b604082019050919050565b60006020820190508181036000830152613fba81613f7e565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b600061401d6038836135c8565b915061402882613fc1565b604082019050919050565b6000602082019050818103600083015261404c81614010565b9050919050565b7f617274776f726b2065646974696f6e206973206e6f7420666f756e6400000000600082015250565b6000614089601c836135c8565b915061409482614053565b602082019050919050565b600060208201905081810360008301526140b88161407c565b9050919050565b600081905092915050565b60006140d5826135bd565b6140df81856140bf565b93506140ef8185602086016135d9565b80840191505092915050565b600061410782846140ca565b915081905092915050565b7f6970667320696420686173207265676973746572656400000000000000000000600082015250565b60006141486016836135c8565b915061415382614112565b602082019050919050565b600060208201905081810360008301526141778161413b565b9050919050565b60008190508160005260206000209050919050565b600081546141a081613e6b565b6141aa81866140bf565b945060018216600081146141c557600181146141d657614209565b60ff19831686528186019350614209565b6141df8561417e565b60005b83811015614201578154818901526001820191506020810190506141e2565b838801955050505b50505092915050565b600061421e8284614193565b915081905092915050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b60006142856031836135c8565b915061429082614229565b604082019050919050565b600060208201905081810360008301526142b481614278565b9050919050565b7f455243323938313a20717565727920726f79616c747920696e666f20666f722060008201527f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000602082015250565b60006143176031836135c8565b9150614322826142bb565b604082019050919050565b600060208201905081810360008301526143468161430a565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061438782613678565b915061439283613678565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156143cb576143ca61434d565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061441082613678565b915061441b83613678565b92508261442b5761442a6143d6565b5b828204905092915050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000614492602b836135c8565b915061449d82614436565b604082019050919050565b600060208201905081810360008301526144c181614485565b9050919050565b7f7469746c652063616e206e6f7420626520656d70747900000000000000000000600082015250565b60006144fe6016836135c8565b9150614509826144c8565b602082019050919050565b6000602082019050818103600083015261452d816144f1565b9050919050565b7f6172746973742063616e206e6f7420626520656d707479000000000000000000600082015250565b600061456a6017836135c8565b915061457582614534565b602082019050919050565b600060208201905081810360008301526145998161455d565b9050919050565b7f66696e6765727072696e742063616e206e6f7420626520656d70747900000000600082015250565b60006145d6601c836135c8565b91506145e1826145a0565b602082019050919050565b60006020820190508181036000830152614605816145c9565b9050919050565b7f65646974696f6e2073697a65206e6565647320746f206265206174206c65617360008201527f7420310000000000000000000000000000000000000000000000000000000000602082015250565b60006146686023836135c8565b91506146738261460c565b604082019050919050565b600060208201905081810360008301526146978161465b565b9050919050565b7f617274776f726b2065646974696f6e2073697a6520657863656564732074686560008201527f206d6178696d756d2065646974696f6e2073697a65206f66207468652065786860208201527f69626974696f6e00000000000000000000000000000000000000000000000000604082015250565b60006147206047836135c8565b915061472b8261469e565b606082019050919050565b6000602082019050818103600083015261474f81614713565b9050919050565b7f616e20617274776f726b2077697468207468652073616d652066696e6765727060008201527f72696e742068617320616c726561647920726567697374657265640000000000602082015250565b60006147b2603b836135c8565b91506147bd82614756565b604082019050919050565b600060208201905081810360008301526147e1816147a5565b9050919050565b7f696e76616c696420726f79616c7479207061796f757420616464726573730000600082015250565b600061481e601e836135c8565b9150614829826147e8565b602082019050919050565b6000602082019050818103600083015261484d81614811565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b60006148b0602c836135c8565b91506148bb82614854565b604082019050919050565b600060208201905081810360008301526148df816148a3565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b60006149716029836135c8565b915061497c82614915565b604082019050919050565b600060208201905081810360008301526149a081614964565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000614a03602a836135c8565b9150614a0e826149a7565b604082019050919050565b60006020820190508181036000830152614a32816149f6565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614a6f6020836135c8565b9150614a7a82614a39565b602082019050919050565b60006020820190508181036000830152614a9e81614a62565b9050919050565b7f617274776f726b206973206e6f7420666f756e64000000000000000000000000600082015250565b6000614adb6014836135c8565b9150614ae682614aa5565b602082019050919050565b60006020820190508181036000830152614b0a81614ace565b9050919050565b7f65646974696f6e206e756d62657220657863656564207468652065646974696f60008201527f6e2073697a65206f662074686520617274776f726b0000000000000000000000602082015250565b6000614b6d6035836135c8565b9150614b7882614b11565b604082019050919050565b60006020820190508181036000830152614b9c81614b60565b9050919050565b7f696e76616c6964206f776e657220616464726573730000000000000000000000600082015250565b6000614bd96015836135c8565b9150614be482614ba3565b602082019050919050565b60006020820190508181036000830152614c0881614bcc565b9050919050565b7f6269746d61726b20696420686173207265676973746572656400000000000000600082015250565b6000614c456019836135c8565b9150614c5082614c0f565b602082019050919050565b60006020820190508181036000830152614c7481614c38565b9050919050565b6000614c8682613678565b9150614c9183613678565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614cc657614cc561434d565b5b828201905092915050565b7f7468652065646974696f6e206973206578697374656e74000000000000000000600082015250565b6000614d076017836135c8565b9150614d1282614cd1565b602082019050919050565b60006020820190508181036000830152614d3681614cfa565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000614d736019836135c8565b9150614d7e82614d3d565b602082019050919050565b60006020820190508181036000830152614da281614d66565b9050919050565b7f617274776f726b733a20676c6f62616c20696e646578206f7574206f6620626f60008201527f756e647300000000000000000000000000000000000000000000000000000000602082015250565b6000614e056024836135c8565b9150614e1082614da9565b604082019050919050565b60006020820190508181036000830152614e3481614df8565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000614e97602f836135c8565b9150614ea282614e3b565b604082019050919050565b60006020820190508181036000830152614ec681614e8a565b9050919050565b7f2f6d657461646174612e6a736f6e000000000000000000000000000000000000600082015250565b6000614f03600e836140bf565b9150614f0e82614ecd565b600e82019050919050565b6000614f2582856140ca565b9150614f318284614193565b9150614f3c82614ef6565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614fa46026836135c8565b9150614faf82614f48565b604082019050919050565b60006020820190508181036000830152614fd381614f97565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000615036602c836135c8565b915061504182614fda565b604082019050919050565b6000602082019050818103600083015261506581615029565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b60006150c86029836135c8565b91506150d38261506c565b604082019050919050565b600060208201905081810360008301526150f7816150bb565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061515a6024836135c8565b9150615165826150fe565b604082019050919050565b600060208201905081810360008301526151898161514d565b9050919050565b600061519b82613678565b91506151a683613678565b9250828210156151b9576151b861434d565b5b828203905092915050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006152206032836135c8565b915061522b826151c4565b604082019050919050565b6000602082019050818103600083015261524f81615213565b9050919050565b600081519050919050565b600082825260208201905092915050565b600061527d82615256565b6152878185615261565b93506152978185602086016135d9565b6152a08161360c565b840191505092915050565b60006080820190506152c0600083018761370d565b6152cd602083018661370d565b6152da6040830185613934565b81810360608301526152ec8184615272565b905095945050505050565b6000815190506153068161352e565b92915050565b600060208284031215615322576153216134f8565b5b6000615330848285016152f7565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b600061539e6020836135c8565b91506153a982615368565b602082019050919050565b600060208201905081810360008301526153cd81615391565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b600061540a601c836135c8565b9150615415826153d4565b602082019050919050565b60006020820190508181036000830152615439816153fd565b905091905056fea2646970667358221220c5778364b0cb5313c391843165218fd269bf148c2bde28d0f2f971cb0938e5b164736f6c634300080c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000005dc000000000000000000000000f6d099037df564a32237705e5005f4450b0eb6c3000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000001e0000000000000000000000000000000000000000000000000000000000000001f466572616c2046696c6520e2809420496e66696e69746520456e74726f70790000000000000000000000000000000000000000000000000000000000000000054646303134000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004c68747470733a2f2f697066732e6269746d61726b2e636f6d2f697066732f516d6374416464416a6256557063436a65733548724542664d757a4d393532746e4371665032634b66506459616d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001e68747470733a2f2f697066732e6269746d61726b2e636f6d2f697066732f0000
-----Decoded View---------------
Arg [0] : name_ (string): Feral File — Infinite Entropy
Arg [1] : symbol_ (string): FF014
Arg [2] : maxEditionPerArtwork_ (uint256): 1
Arg [3] : secondarySaleRoyaltyBPS_ (uint256): 1500
Arg [4] : royaltyPayoutAddress_ (address): 0xf6d099037Df564a32237705e5005F4450b0EB6c3
Arg [5] : contractURI_ (string): https://ipfs.bitmark.com/ipfs/QmctAddAjbVUpcCjes5HrEBfMuzM952tnCqfP2cKfPdYam
Arg [6] : tokenBaseURI_ (string): https://ipfs.bitmark.com/ipfs/
-----Encoded View---------------
17 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [3] : 00000000000000000000000000000000000000000000000000000000000005dc
Arg [4] : 000000000000000000000000f6d099037df564a32237705e5005f4450b0eb6c3
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000160
Arg [6] : 00000000000000000000000000000000000000000000000000000000000001e0
Arg [7] : 000000000000000000000000000000000000000000000000000000000000001f
Arg [8] : 466572616c2046696c6520e2809420496e66696e69746520456e74726f707900
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [10] : 4646303134000000000000000000000000000000000000000000000000000000
Arg [11] : 000000000000000000000000000000000000000000000000000000000000004c
Arg [12] : 68747470733a2f2f697066732e6269746d61726b2e636f6d2f697066732f516d
Arg [13] : 6374416464416a6256557063436a65733548724542664d757a4d393532746e43
Arg [14] : 71665032634b66506459616d0000000000000000000000000000000000000000
Arg [15] : 000000000000000000000000000000000000000000000000000000000000001e
Arg [16] : 68747470733a2f2f697066732e6269746d61726b2e636f6d2f697066732f0000
Deployed Bytecode Sourcemap
44594:10590:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47050:310;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26201:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27760:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27283:411;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51492:478;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38949:113;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28650:339;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54528:460;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;38617:256;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47660:1300;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44741:35;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29060:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52166:300;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45578:43;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;39139:233;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45652:57;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;25895:239;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52776:252;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25625:208;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4558:94;;;:::i;:::-;;49944:1474;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44848:45;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3907:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53817:116;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26370:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28053:295;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49229:286;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29316:328;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53117:640;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5575:98;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49042:108;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54006:97;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28419:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44972:48;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45082:49;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4807:192;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5361:22;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52532:174;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47050:310;47207:4;47264:35;47249:50;;;:11;:50;;;;:103;;;;47316:36;47340:11;47316:23;:36::i;:::-;47249:103;47229:123;;47050:310;;;:::o;26201:100::-;26255:13;26288:5;26281:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26201:100;:::o;27760:221::-;27836:7;27864:16;27872:7;27864;:16::i;:::-;27856:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27949:15;:24;27965:7;27949:24;;;;;;;;;;;;;;;;;;;;;27942:31;;27760:221;;;:::o;27283:411::-;27364:13;27380:23;27395:7;27380:14;:23::i;:::-;27364:39;;27428:5;27422:11;;:2;:11;;;;27414:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;27522:5;27506:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;27531:37;27548:5;27555:12;:10;:12::i;:::-;27531:16;:37::i;:::-;27506:62;27484:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;27665:21;27674:2;27678:7;27665:8;:21::i;:::-;27353:341;27283:411;;:::o;51492:478::-;5514:7;;;;;;;;;;;5500:21;;:10;:21;;;:46;;;;5539:7;:5;:7::i;:::-;5525:21;;:10;:21;;;5500:46;5492:55;;;;;;51635:16:::1;51643:7;51635;:16::i;:::-;51627:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;51704:18;51723:7;51704:27;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;51703:28;51695:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;51771:30;51804:15;:24;51820:7;51804:24;;;;;;;;;;;51771:57;;51846:18;51865:7;:15;;51846:35;;;;;;:::i;:::-;;;;;;;;;;;;;;51839:42;;;;;;;;;;;51922:4;51892:18;51911:7;51892:27;;;;;;:::i;:::-;;;;;;;;;;;;;;:34;;;;;;;;;;;;;;;;;;51955:7;51937;:15;;:25;;;;;;;;;;;;:::i;:::-;;51616:354;51492:478:::0;;:::o;38949:113::-;39010:7;39037:10;:17;;;;39030:24;;38949:113;:::o;28650:339::-;28845:41;28864:12;:10;:12::i;:::-;28878:7;28845:18;:41::i;:::-;28837:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;28953:28;28963:4;28969:2;28973:7;28953:9;:28::i;:::-;28650:339;;;:::o;54528:460::-;54653:16;54671:21;54732:16;54740:7;54732;:16::i;:::-;54710:115;;;;;;;;;;;;:::i;:::-;;;;;;;;;54849:20;;;;;;;;;;;54838:31;;45125:6;54924:23;54912:9;:35;;;;:::i;:::-;54911:69;;;;:::i;:::-;54882:98;;54528:460;;;;;:::o;38617:256::-;38714:7;38750:23;38767:5;38750:16;:23::i;:::-;38742:5;:31;38734:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;38839:12;:19;38852:5;38839:19;;;;;;;;;;;;;;;:26;38859:5;38839:26;;;;;;;;;;;;38832:33;;38617:256;;;;:::o;47660:1300::-;5514:7;;;;;;;;;;;5500:21;;:10;:21;;;:46;;;;5539:7;:5;:7::i;:::-;5525:21;;:10;:21;;;5500:46;5492:55;;;;;;47887:1:::1;47870:5;47864:19;:24;;47856:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;47962:1;47940:10;47934:24;:29;;47926:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;48039:1;48016:11;48010:25;:30;;48002:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;48106:1;48092:11;:15;48084:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;48195:20;48180:11;:35;;48158:156;;;;;;;;;;;;:::i;:::-;;;;;;;;;48327:17;48376:11;48365:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;48355:34;;;;;;48347:43;;48327:63;;48542:1;48499:8;:19;48508:9;48499:19;;;;;;;;;;;:31;;48493:45;;;;;:::i;:::-;;;:50;48471:159;;;;;;;;;;;;:::i;:::-;;;;;;;;;48643:22;48668:164;;;;;;;;48690:13;48668:164;;;;48718:23;48668:164;;;;48756:25;48668:164;;;;48796:25;48668:164;;::::0;48643:189:::1;;48845:12;48863:9;48845:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48906:7;48884:8;:19;48893:9;48884:19;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;48942:9;48931:21;;;;;;;;;;47845:1115;;47660:1300:::0;;;;:::o;44741:35::-;;;;;;;;;;;;;:::o;29060:185::-;29198:39;29215:4;29221:2;29225:7;29198:39;;;;;;;;;;;;:16;:39::i;:::-;29060:185;;;:::o;52166:300::-;5514:7;;;;;;;;;;;5500:21;;:10;:21;;;:46;;;;5539:7;:5;:7::i;:::-;5525:21;;:10;:21;;;5500:46;5492:55;;;;;;52343:1:::1;52310:35;;:21;:35;;;;52288:115;;;;;;;;;;;;:::i;:::-;;;;;;;;;52437:21;52414:20;;:44;;;;;;;;;;;;;;;;;;52166:300:::0;:::o;45578:43::-;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;39139:233::-;39214:7;39250:30;:28;:30::i;:::-;39242:5;:38;39234:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;39347:10;39358:5;39347:17;;;;;;;;:::i;:::-;;;;;;;;;;39340:24;;39139:233;;;:::o;45652:57::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;25895:239::-;25967:7;25987:13;26003:7;:16;26011:7;26003:16;;;;;;;;;;;;;;;;;;;;;25987:32;;26055:1;26038:19;;:5;:19;;;;26030:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26121:5;26114:12;;;25895:239;;;:::o;52776:252::-;52892:7;52933:32;52955:9;52933:21;:32::i;:::-;52925:5;:40;52917:49;;;;;;52984:18;:29;53003:9;52984:29;;;;;;;;;;;53014:5;52984:36;;;;;;;;:::i;:::-;;;;;;;;;;52977:43;;52776:252;;;;:::o;25625:208::-;25697:7;25742:1;25725:19;;:5;:19;;;;25717:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;25809:9;:16;25819:5;25809:16;;;;;;;;;;;;;;;;25802:23;;25625:208;;;:::o;4558:94::-;4138:12;:10;:12::i;:::-;4127:23;;:7;:5;:7::i;:::-;:23;;;4119:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4623:21:::1;4641:1;4623:9;:21::i;:::-;4558:94::o:0;49944:1474::-;5514:7;;;;;;;;;;;5500:21;;:10;:21;;;:46;;;;5539:7;:5;:7::i;:::-;5525:21;;:10;:21;;;5500:46;5492:55;;;;;;50288:1:::1;50254:8;:19;50263:9;50254:19;;;;;;;;;;;:31;;;:35;50246:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50459:8;:19;50468:9;50459:19;;;;;;;;;;;:31;;;50442:13;:48;;50420:151;;;;;;;;;;;;:::i;:::-;;;;;;;;;50607:1;50590:19;;:5;:19;;;;50582:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;50655:18;:29;50674:9;50655:29;;;;;;;;;;;;;;;;;;;;;50654:30;50646:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50734:18;50753:7;50734:27;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;50733:28;50725:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;50801:17;50833:13;50821:9;:25;;;;:::i;:::-;50801:45;;50919:1;50879:15;:26;50895:9;50879:26;;;;;;;;;;;:36;;;:41;50857:114;;;;;;;;;;;;:::i;:::-;;;;;;;;;50984:29;51016:93;;;;;;;;51045:21;51016:93;;;;51081:17;51016:93;;::::0;50984:125:::1;;51151:7;51122:15;:26;51138:9;51122:26;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;51169:18;:29;51188:9;51169:29;;;;;;;;;;;51204:9;51169:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51259:4;51227:18;:29;51246:9;51227:29;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;51304:4;51274:18;51293:7;51274:27;;;;;;:::i;:::-;;;;;;;;;;;;;;:34;;;;;;;;;;;;;;;;;;51321:27;51331:5;51338:9;51321;:27::i;:::-;51400:9;51389;51382:5;51364:46;;;;;;;;;;;;50151:1267;;49944:1474:::0;;;;;:::o;44848:45::-;;;:::o;3907:87::-;3953:7;3980:6;;;;;;;;;;;3973:13;;3907:87;:::o;53817:116::-;5514:7;;;;;;;;;;;5500:21;;:10;:21;;;:46;;;;5539:7;:5;:7::i;:::-;5525:21;;:10;:21;;;5500:46;5492:55;;;;;;53917:8:::1;53901:13;:24;;;;;;;;;;;;:::i;:::-;;53817:116:::0;:::o;26370:104::-;26426:13;26459:7;26452:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26370:104;:::o;28053:295::-;28168:12;:10;:12::i;:::-;28156:24;;:8;:24;;;;28148:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;28268:8;28223:18;:32;28242:12;:10;:12::i;:::-;28223:32;;;;;;;;;;;;;;;:42;28256:8;28223:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;28321:8;28292:48;;28307:12;:10;:12::i;:::-;28292:48;;;28331:8;28292:48;;;;;;:::i;:::-;;;;;;;;28053:295;;:::o;49229:286::-;49336:7;49391:15;:13;:15::i;:::-;49383:5;:23;49361:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;49488:12;49501:5;49488:19;;;;;;;;:::i;:::-;;;;;;;;;;49481:26;;49229:286;;;:::o;29316:328::-;29491:41;29510:12;:10;:12::i;:::-;29524:7;29491:18;:41::i;:::-;29483:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;29597:39;29611:4;29617:2;29621:7;29630:5;29597:13;:39::i;:::-;29316:328;;;;:::o;53117:640::-;53235:13;53288:16;53296:7;53288;:16::i;:::-;53266:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;53392:21;53416:13;53392:37;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53469:1;53450:7;53444:21;:26;53440:78;;;53487:19;;;;;;;;;;;;;;;;;;;53440:78;53614:7;53644:15;:24;53660:7;53644:24;;;;;;;;;;;:32;;53575:159;;;;;;;;;:::i;:::-;;;;;;;;;;;;;53530:219;;;53117:640;;;:::o;5575:98::-;4138:12;:10;:12::i;:::-;4127:23;;:7;:5;:7::i;:::-;:23;;;4119:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5654:11:::1;5644:7;;:21;;;;;;;;;;;;;;;;;;5575:98:::0;:::o;49042:108::-;49096:7;49123:12;:19;;;;49116:26;;49042:108;:::o;54006:97::-;54050:13;54083:12;54076:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54006:97;:::o;28419:164::-;28516:4;28540:18;:25;28559:5;28540:25;;;;;;;;;;;;;;;:35;28566:8;28540:35;;;;;;;;;;;;;;;;;;;;;;;;;28533:42;;28419:164;;;;:::o;44972:48::-;;;:::o;45082:49::-;45125:6;45082:49;:::o;4807:192::-;4138:12;:10;:12::i;:::-;4127:23;;:7;:5;:7::i;:::-;:23;;;4119:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4916:1:::1;4896:22;;:8;:22;;;;4888:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;4972:19;4982:8;4972:9;:19::i;:::-;4807:192:::0;:::o;5361:22::-;;;;;;;;;;;;;:::o;52532:174::-;52630:7;52662:18;:29;52681:9;52662:29;;;;;;;;;;;:36;;;;52655:43;;52532:174;;;:::o;38309:224::-;38411:4;38450:35;38435:50;;;:11;:50;;;;:90;;;;38489:36;38513:11;38489:23;:36::i;:::-;38435:90;38428:97;;38309:224;;;:::o;31154:127::-;31219:4;31271:1;31243:30;;:7;:16;31251:7;31243:16;;;;;;;;;;;;;;;;;;;;;:30;;;;31236:37;;31154:127;;;:::o;2695:98::-;2748:7;2775:10;2768:17;;2695:98;:::o;35136:174::-;35238:2;35211:15;:24;35227:7;35211:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;35294:7;35290:2;35256:46;;35265:23;35280:7;35265:14;:23::i;:::-;35256:46;;;;;;;;;;;;35136:174;;:::o;31448:348::-;31541:4;31566:16;31574:7;31566;:16::i;:::-;31558:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;31642:13;31658:23;31673:7;31658:14;:23::i;:::-;31642:39;;31711:5;31700:16;;:7;:16;;;:51;;;;31744:7;31720:31;;:20;31732:7;31720:11;:20::i;:::-;:31;;;31700:51;:87;;;;31755:32;31772:5;31779:7;31755:16;:32::i;:::-;31700:87;31692:96;;;31448:348;;;;:::o;34440:578::-;34599:4;34572:31;;:23;34587:7;34572:14;:23::i;:::-;:31;;;34564:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;34682:1;34668:16;;:2;:16;;;;34660:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;34738:39;34759:4;34765:2;34769:7;34738:20;:39::i;:::-;34842:29;34859:1;34863:7;34842:8;:29::i;:::-;34903:1;34884:9;:15;34894:4;34884:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;34932:1;34915:9;:13;34925:2;34915:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;34963:2;34944:7;:16;34952:7;34944:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;35002:7;34998:2;34983:27;;34992:4;34983:27;;;;;;;;;;;;34440:578;;;:::o;5007:173::-;5063:16;5082:6;;;;;;;;;;;5063:25;;5108:8;5099:6;;:17;;;;;;;;;;;;;;;;;;5163:8;5132:40;;5153:8;5132:40;;;;;;;;;;;;5052:128;5007:173;:::o;32138:110::-;32214:26;32224:2;32228:7;32214:26;;;;;;;;;;;;:9;:26::i;:::-;32138:110;;:::o;30526:315::-;30683:28;30693:4;30699:2;30703:7;30683:9;:28::i;:::-;30730:48;30753:4;30759:2;30763:7;30772:5;30730:22;:48::i;:::-;30722:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;30526:315;;;;:::o;25256:305::-;25358:4;25410:25;25395:40;;;:11;:40;;;;:105;;;;25467:33;25452:48;;;:11;:48;;;;25395:105;:158;;;;25517:36;25541:11;25517:23;:36::i;:::-;25395:158;25375:178;;25256:305;;;:::o;39985:589::-;40129:45;40156:4;40162:2;40166:7;40129:26;:45::i;:::-;40207:1;40191:18;;:4;:18;;;40187:187;;;40226:40;40258:7;40226:31;:40::i;:::-;40187:187;;;40296:2;40288:10;;:4;:10;;;40284:90;;40315:47;40348:4;40354:7;40315:32;:47::i;:::-;40284:90;40187:187;40402:1;40388:16;;:2;:16;;;40384:183;;;40421:45;40458:7;40421:36;:45::i;:::-;40384:183;;;40494:4;40488:10;;:2;:10;;;40484:83;;40515:40;40543:2;40547:7;40515:27;:40::i;:::-;40484:83;40384:183;39985:589;;;:::o;32475:321::-;32605:18;32611:2;32615:7;32605:5;:18::i;:::-;32656:54;32687:1;32691:2;32695:7;32704:5;32656:22;:54::i;:::-;32634:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;32475:321;;;:::o;35875:799::-;36030:4;36051:15;:2;:13;;;:15::i;:::-;36047:620;;;36103:2;36087:36;;;36124:12;:10;:12::i;:::-;36138:4;36144:7;36153:5;36087:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;36083:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36346:1;36329:6;:13;:18;36325:272;;;36372:60;;;;;;;;;;:::i;:::-;;;;;;;;36325:272;36547:6;36541:13;36532:6;36528:2;36524:15;36517:38;36083:529;36220:41;;;36210:51;;;:6;:51;;;;36203:58;;;;;36047:620;36651:4;36644:11;;35875:799;;;;;;;:::o;17235:157::-;17320:4;17359:25;17344:40;;;:11;:40;;;;17337:47;;17235:157;;;:::o;37246:126::-;;;;:::o;41297:164::-;41401:10;:17;;;;41374:15;:24;41390:7;41374:24;;;;;;;;;;;:44;;;;41429:10;41445:7;41429:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41297:164;:::o;42088:988::-;42354:22;42404:1;42379:22;42396:4;42379:16;:22::i;:::-;:26;;;;:::i;:::-;42354:51;;42416:18;42437:17;:26;42455:7;42437:26;;;;;;;;;;;;42416:47;;42584:14;42570:10;:28;42566:328;;42615:19;42637:12;:18;42650:4;42637:18;;;;;;;;;;;;;;;:34;42656:14;42637:34;;;;;;;;;;;;42615:56;;42721:11;42688:12;:18;42701:4;42688:18;;;;;;;;;;;;;;;:30;42707:10;42688:30;;;;;;;;;;;:44;;;;42838:10;42805:17;:30;42823:11;42805:30;;;;;;;;;;;:43;;;;42600:294;42566:328;42990:17;:26;43008:7;42990:26;;;;;;;;;;;42983:33;;;43034:12;:18;43047:4;43034:18;;;;;;;;;;;;;;;:34;43053:14;43034:34;;;;;;;;;;;43027:41;;;42169:907;;42088:988;;:::o;43371:1079::-;43624:22;43669:1;43649:10;:17;;;;:21;;;;:::i;:::-;43624:46;;43681:18;43702:15;:24;43718:7;43702:24;;;;;;;;;;;;43681:45;;44053:19;44075:10;44086:14;44075:26;;;;;;;;:::i;:::-;;;;;;;;;;44053:48;;44139:11;44114:10;44125;44114:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;44250:10;44219:15;:28;44235:11;44219:28;;;;;;;;;;;:41;;;;44391:15;:24;44407:7;44391:24;;;;;;;;;;;44384:31;;;44426:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;43442:1008;;;43371:1079;:::o;40875:221::-;40960:14;40977:20;40994:2;40977:16;:20::i;:::-;40960:37;;41035:7;41008:12;:16;41021:2;41008:16;;;;;;;;;;;;;;;:24;41025:6;41008:24;;;;;;;;;;;:34;;;;41082:6;41053:17;:26;41071:7;41053:26;;;;;;;;;;;:35;;;;40949:147;40875:221;;:::o;33132:382::-;33226:1;33212:16;;:2;:16;;;;33204:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;33285:16;33293:7;33285;:16::i;:::-;33284:17;33276:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;33347:45;33376:1;33380:2;33384:7;33347:20;:45::i;:::-;33422:1;33405:9;:13;33415:2;33405:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;33453:2;33434:7;:16;33442:7;33434:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;33498:7;33494:2;33473:33;;33490:1;33473:33;;;;;;;;;;;;33132:382;;:::o;6446:387::-;6506:4;6714:12;6781:7;6769:20;6761:28;;6824:1;6817:4;:8;6810:15;;;6446:387;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:117::-;5047:1;5044;5037:12;5061:117;5170:1;5167;5160:12;5184:180;5232:77;5229:1;5222:88;5329:4;5326:1;5319:15;5353:4;5350:1;5343:15;5370:281;5453:27;5475:4;5453:27;:::i;:::-;5445:6;5441:40;5583:6;5571:10;5568:22;5547:18;5535:10;5532:34;5529:62;5526:88;;;5594:18;;:::i;:::-;5526:88;5634:10;5630:2;5623:22;5413:238;5370:281;;:::o;5657:129::-;5691:6;5718:20;;:::i;:::-;5708:30;;5747:33;5775:4;5767:6;5747:33;:::i;:::-;5657:129;;;:::o;5792:308::-;5854:4;5944:18;5936:6;5933:30;5930:56;;;5966:18;;:::i;:::-;5930:56;6004:29;6026:6;6004:29;:::i;:::-;5996:37;;6088:4;6082;6078:15;6070:23;;5792:308;;;:::o;6106:154::-;6190:6;6185:3;6180;6167:30;6252:1;6243:6;6238:3;6234:16;6227:27;6106:154;;;:::o;6266:412::-;6344:5;6369:66;6385:49;6427:6;6385:49;:::i;:::-;6369:66;:::i;:::-;6360:75;;6458:6;6451:5;6444:21;6496:4;6489:5;6485:16;6534:3;6525:6;6520:3;6516:16;6513:25;6510:112;;;6541:79;;:::i;:::-;6510:112;6631:41;6665:6;6660:3;6655;6631:41;:::i;:::-;6350:328;6266:412;;;;;:::o;6698:340::-;6754:5;6803:3;6796:4;6788:6;6784:17;6780:27;6770:122;;6811:79;;:::i;:::-;6770:122;6928:6;6915:20;6953:79;7028:3;7020:6;7013:4;7005:6;7001:17;6953:79;:::i;:::-;6944:88;;6760:278;6698:340;;;;:::o;7044:654::-;7122:6;7130;7179:2;7167:9;7158:7;7154:23;7150:32;7147:119;;;7185:79;;:::i;:::-;7147:119;7305:1;7330:53;7375:7;7366:6;7355:9;7351:22;7330:53;:::i;:::-;7320:63;;7276:117;7460:2;7449:9;7445:18;7432:32;7491:18;7483:6;7480:30;7477:117;;;7513:79;;:::i;:::-;7477:117;7618:63;7673:7;7664:6;7653:9;7649:22;7618:63;:::i;:::-;7608:73;;7403:288;7044:654;;;;;:::o;7704:118::-;7791:24;7809:5;7791:24;:::i;:::-;7786:3;7779:37;7704:118;;:::o;7828:222::-;7921:4;7959:2;7948:9;7944:18;7936:26;;7972:71;8040:1;8029:9;8025:17;8016:6;7972:71;:::i;:::-;7828:222;;;;:::o;8056:619::-;8133:6;8141;8149;8198:2;8186:9;8177:7;8173:23;8169:32;8166:119;;;8204:79;;:::i;:::-;8166:119;8324:1;8349:53;8394:7;8385:6;8374:9;8370:22;8349:53;:::i;:::-;8339:63;;8295:117;8451:2;8477:53;8522:7;8513:6;8502:9;8498:22;8477:53;:::i;:::-;8467:63;;8422:118;8579:2;8605:53;8650:7;8641:6;8630:9;8626:22;8605:53;:::i;:::-;8595:63;;8550:118;8056:619;;;;;:::o;8681:474::-;8749:6;8757;8806:2;8794:9;8785:7;8781:23;8777:32;8774:119;;;8812:79;;:::i;:::-;8774:119;8932:1;8957:53;9002:7;8993:6;8982:9;8978:22;8957:53;:::i;:::-;8947:63;;8903:117;9059:2;9085:53;9130:7;9121:6;9110:9;9106:22;9085:53;:::i;:::-;9075:63;;9030:118;8681:474;;;;;:::o;9161:332::-;9282:4;9320:2;9309:9;9305:18;9297:26;;9333:71;9401:1;9390:9;9386:17;9377:6;9333:71;:::i;:::-;9414:72;9482:2;9471:9;9467:18;9458:6;9414:72;:::i;:::-;9161:332;;;;;:::o;9499:1305::-;9615:6;9623;9631;9639;9688:3;9676:9;9667:7;9663:23;9659:33;9656:120;;;9695:79;;:::i;:::-;9656:120;9843:1;9832:9;9828:17;9815:31;9873:18;9865:6;9862:30;9859:117;;;9895:79;;:::i;:::-;9859:117;10000:63;10055:7;10046:6;10035:9;10031:22;10000:63;:::i;:::-;9990:73;;9786:287;10140:2;10129:9;10125:18;10112:32;10171:18;10163:6;10160:30;10157:117;;;10193:79;;:::i;:::-;10157:117;10298:63;10353:7;10344:6;10333:9;10329:22;10298:63;:::i;:::-;10288:73;;10083:288;10438:2;10427:9;10423:18;10410:32;10469:18;10461:6;10458:30;10455:117;;;10491:79;;:::i;:::-;10455:117;10596:63;10651:7;10642:6;10631:9;10627:22;10596:63;:::i;:::-;10586:73;;10381:288;10708:2;10734:53;10779:7;10770:6;10759:9;10755:22;10734:53;:::i;:::-;10724:63;;10679:118;9499:1305;;;;;;;:::o;10810:329::-;10869:6;10918:2;10906:9;10897:7;10893:23;10889:32;10886:119;;;10924:79;;:::i;:::-;10886:119;11044:1;11069:53;11114:7;11105:6;11094:9;11090:22;11069:53;:::i;:::-;11059:63;;11015:117;10810:329;;;;:::o;11145:826::-;11382:4;11420:3;11409:9;11405:19;11397:27;;11470:9;11464:4;11460:20;11456:1;11445:9;11441:17;11434:47;11498:78;11571:4;11562:6;11498:78;:::i;:::-;11490:86;;11623:9;11617:4;11613:20;11608:2;11597:9;11593:18;11586:48;11651:78;11724:4;11715:6;11651:78;:::i;:::-;11643:86;;11776:9;11770:4;11766:20;11761:2;11750:9;11746:18;11739:48;11804:78;11877:4;11868:6;11804:78;:::i;:::-;11796:86;;11892:72;11960:2;11949:9;11945:18;11936:6;11892:72;:::i;:::-;11145:826;;;;;;;:::o;11977:423::-;12118:4;12156:2;12145:9;12141:18;12133:26;;12169:71;12237:1;12226:9;12222:17;12213:6;12169:71;:::i;:::-;12287:9;12281:4;12277:20;12272:2;12261:9;12257:18;12250:48;12315:78;12388:4;12379:6;12315:78;:::i;:::-;12307:86;;11977:423;;;;;:::o;12406:1091::-;12511:6;12519;12527;12535;12543;12592:3;12580:9;12571:7;12567:23;12563:33;12560:120;;;12599:79;;:::i;:::-;12560:120;12719:1;12744:53;12789:7;12780:6;12769:9;12765:22;12744:53;:::i;:::-;12734:63;;12690:117;12846:2;12872:53;12917:7;12908:6;12897:9;12893:22;12872:53;:::i;:::-;12862:63;;12817:118;12974:2;13000:53;13045:7;13036:6;13025:9;13021:22;13000:53;:::i;:::-;12990:63;;12945:118;13102:2;13128:53;13173:7;13164:6;13153:9;13149:22;13128:53;:::i;:::-;13118:63;;13073:118;13258:3;13247:9;13243:19;13230:33;13290:18;13282:6;13279:30;13276:117;;;13312:79;;:::i;:::-;13276:117;13417:63;13472:7;13463:6;13452:9;13448:22;13417:63;:::i;:::-;13407:73;;13201:289;12406:1091;;;;;;;;:::o;13503:509::-;13572:6;13621:2;13609:9;13600:7;13596:23;13592:32;13589:119;;;13627:79;;:::i;:::-;13589:119;13775:1;13764:9;13760:17;13747:31;13805:18;13797:6;13794:30;13791:117;;;13827:79;;:::i;:::-;13791:117;13932:63;13987:7;13978:6;13967:9;13963:22;13932:63;:::i;:::-;13922:73;;13718:287;13503:509;;;;:::o;14018:116::-;14088:21;14103:5;14088:21;:::i;:::-;14081:5;14078:32;14068:60;;14124:1;14121;14114:12;14068:60;14018:116;:::o;14140:133::-;14183:5;14221:6;14208:20;14199:29;;14237:30;14261:5;14237:30;:::i;:::-;14140:133;;;;:::o;14279:468::-;14344:6;14352;14401:2;14389:9;14380:7;14376:23;14372:32;14369:119;;;14407:79;;:::i;:::-;14369:119;14527:1;14552:53;14597:7;14588:6;14577:9;14573:22;14552:53;:::i;:::-;14542:63;;14498:117;14654:2;14680:50;14722:7;14713:6;14702:9;14698:22;14680:50;:::i;:::-;14670:60;;14625:115;14279:468;;;;;:::o;14753:307::-;14814:4;14904:18;14896:6;14893:30;14890:56;;;14926:18;;:::i;:::-;14890:56;14964:29;14986:6;14964:29;:::i;:::-;14956:37;;15048:4;15042;15038:15;15030:23;;14753:307;;;:::o;15066:410::-;15143:5;15168:65;15184:48;15225:6;15184:48;:::i;:::-;15168:65;:::i;:::-;15159:74;;15256:6;15249:5;15242:21;15294:4;15287:5;15283:16;15332:3;15323:6;15318:3;15314:16;15311:25;15308:112;;;15339:79;;:::i;:::-;15308:112;15429:41;15463:6;15458:3;15453;15429:41;:::i;:::-;15149:327;15066:410;;;;;:::o;15495:338::-;15550:5;15599:3;15592:4;15584:6;15580:17;15576:27;15566:122;;15607:79;;:::i;:::-;15566:122;15724:6;15711:20;15749:78;15823:3;15815:6;15808:4;15800:6;15796:17;15749:78;:::i;:::-;15740:87;;15556:277;15495:338;;;;:::o;15839:943::-;15934:6;15942;15950;15958;16007:3;15995:9;15986:7;15982:23;15978:33;15975:120;;;16014:79;;:::i;:::-;15975:120;16134:1;16159:53;16204:7;16195:6;16184:9;16180:22;16159:53;:::i;:::-;16149:63;;16105:117;16261:2;16287:53;16332:7;16323:6;16312:9;16308:22;16287:53;:::i;:::-;16277:63;;16232:118;16389:2;16415:53;16460:7;16451:6;16440:9;16436:22;16415:53;:::i;:::-;16405:63;;16360:118;16545:2;16534:9;16530:18;16517:32;16576:18;16568:6;16565:30;16562:117;;;16598:79;;:::i;:::-;16562:117;16703:62;16757:7;16748:6;16737:9;16733:22;16703:62;:::i;:::-;16693:72;;16488:287;15839:943;;;;;;;:::o;16788:474::-;16856:6;16864;16913:2;16901:9;16892:7;16888:23;16884:32;16881:119;;;16919:79;;:::i;:::-;16881:119;17039:1;17064:53;17109:7;17100:6;17089:9;17085:22;17064:53;:::i;:::-;17054:63;;17010:117;17166:2;17192:53;17237:7;17228:6;17217:9;17213:22;17192:53;:::i;:::-;17182:63;;17137:118;16788:474;;;;;:::o;17268:180::-;17316:77;17313:1;17306:88;17413:4;17410:1;17403:15;17437:4;17434:1;17427:15;17454:320;17498:6;17535:1;17529:4;17525:12;17515:22;;17582:1;17576:4;17572:12;17603:18;17593:81;;17659:4;17651:6;17647:17;17637:27;;17593:81;17721:2;17713:6;17710:14;17690:18;17687:38;17684:84;;;17740:18;;:::i;:::-;17684:84;17505:269;17454:320;;;:::o;17780:231::-;17920:34;17916:1;17908:6;17904:14;17897:58;17989:14;17984:2;17976:6;17972:15;17965:39;17780:231;:::o;18017:366::-;18159:3;18180:67;18244:2;18239:3;18180:67;:::i;:::-;18173:74;;18256:93;18345:3;18256:93;:::i;:::-;18374:2;18369:3;18365:12;18358:19;;18017:366;;;:::o;18389:419::-;18555:4;18593:2;18582:9;18578:18;18570:26;;18642:9;18636:4;18632:20;18628:1;18617:9;18613:17;18606:47;18670:131;18796:4;18670:131;:::i;:::-;18662:139;;18389:419;;;:::o;18814:220::-;18954:34;18950:1;18942:6;18938:14;18931:58;19023:3;19018:2;19010:6;19006:15;18999:28;18814:220;:::o;19040:366::-;19182:3;19203:67;19267:2;19262:3;19203:67;:::i;:::-;19196:74;;19279:93;19368:3;19279:93;:::i;:::-;19397:2;19392:3;19388:12;19381:19;;19040:366;;;:::o;19412:419::-;19578:4;19616:2;19605:9;19601:18;19593:26;;19665:9;19659:4;19655:20;19651:1;19640:9;19636:17;19629:47;19693:131;19819:4;19693:131;:::i;:::-;19685:139;;19412:419;;;:::o;19837:243::-;19977:34;19973:1;19965:6;19961:14;19954:58;20046:26;20041:2;20033:6;20029:15;20022:51;19837:243;:::o;20086:366::-;20228:3;20249:67;20313:2;20308:3;20249:67;:::i;:::-;20242:74;;20325:93;20414:3;20325:93;:::i;:::-;20443:2;20438:3;20434:12;20427:19;;20086:366;;;:::o;20458:419::-;20624:4;20662:2;20651:9;20647:18;20639:26;;20711:9;20705:4;20701:20;20697:1;20686:9;20682:17;20675:47;20739:131;20865:4;20739:131;:::i;:::-;20731:139;;20458:419;;;:::o;20883:178::-;21023:30;21019:1;21011:6;21007:14;21000:54;20883:178;:::o;21067:366::-;21209:3;21230:67;21294:2;21289:3;21230:67;:::i;:::-;21223:74;;21306:93;21395:3;21306:93;:::i;:::-;21424:2;21419:3;21415:12;21408:19;;21067:366;;;:::o;21439:419::-;21605:4;21643:2;21632:9;21628:18;21620:26;;21692:9;21686:4;21682:20;21678:1;21667:9;21663:17;21656:47;21720:131;21846:4;21720:131;:::i;:::-;21712:139;;21439:419;;;:::o;21864:148::-;21966:11;22003:3;21988:18;;21864:148;;;;:::o;22018:377::-;22124:3;22152:39;22185:5;22152:39;:::i;:::-;22207:89;22289:6;22284:3;22207:89;:::i;:::-;22200:96;;22305:52;22350:6;22345:3;22338:4;22331:5;22327:16;22305:52;:::i;:::-;22382:6;22377:3;22373:16;22366:23;;22128:267;22018:377;;;;:::o;22401:275::-;22533:3;22555:95;22646:3;22637:6;22555:95;:::i;:::-;22548:102;;22667:3;22660:10;;22401:275;;;;:::o;22682:172::-;22822:24;22818:1;22810:6;22806:14;22799:48;22682:172;:::o;22860:366::-;23002:3;23023:67;23087:2;23082:3;23023:67;:::i;:::-;23016:74;;23099:93;23188:3;23099:93;:::i;:::-;23217:2;23212:3;23208:12;23201:19;;22860:366;;;:::o;23232:419::-;23398:4;23436:2;23425:9;23421:18;23413:26;;23485:9;23479:4;23475:20;23471:1;23460:9;23456:17;23449:47;23513:131;23639:4;23513:131;:::i;:::-;23505:139;;23232:419;;;:::o;23657:141::-;23706:4;23729:3;23721:11;;23752:3;23749:1;23742:14;23786:4;23783:1;23773:18;23765:26;;23657:141;;;:::o;23828:845::-;23931:3;23968:5;23962:12;23997:36;24023:9;23997:36;:::i;:::-;24049:89;24131:6;24126:3;24049:89;:::i;:::-;24042:96;;24169:1;24158:9;24154:17;24185:1;24180:137;;;;24331:1;24326:341;;;;24147:520;;24180:137;24264:4;24260:9;24249;24245:25;24240:3;24233:38;24300:6;24295:3;24291:16;24284:23;;24180:137;;24326:341;24393:38;24425:5;24393:38;:::i;:::-;24453:1;24467:154;24481:6;24478:1;24475:13;24467:154;;;24555:7;24549:14;24545:1;24540:3;24536:11;24529:35;24605:1;24596:7;24592:15;24581:26;;24503:4;24500:1;24496:12;24491:17;;24467:154;;;24650:6;24645:3;24641:16;24634:23;;24333:334;;24147:520;;23935:738;;23828:845;;;;:::o;24679:269::-;24808:3;24830:92;24918:3;24909:6;24830:92;:::i;:::-;24823:99;;24939:3;24932:10;;24679:269;;;;:::o;24954:236::-;25094:34;25090:1;25082:6;25078:14;25071:58;25163:19;25158:2;25150:6;25146:15;25139:44;24954:236;:::o;25196:366::-;25338:3;25359:67;25423:2;25418:3;25359:67;:::i;:::-;25352:74;;25435:93;25524:3;25435:93;:::i;:::-;25553:2;25548:3;25544:12;25537:19;;25196:366;;;:::o;25568:419::-;25734:4;25772:2;25761:9;25757:18;25749:26;;25821:9;25815:4;25811:20;25807:1;25796:9;25792:17;25785:47;25849:131;25975:4;25849:131;:::i;:::-;25841:139;;25568:419;;;:::o;25993:236::-;26133:34;26129:1;26121:6;26117:14;26110:58;26202:19;26197:2;26189:6;26185:15;26178:44;25993:236;:::o;26235:366::-;26377:3;26398:67;26462:2;26457:3;26398:67;:::i;:::-;26391:74;;26474:93;26563:3;26474:93;:::i;:::-;26592:2;26587:3;26583:12;26576:19;;26235:366;;;:::o;26607:419::-;26773:4;26811:2;26800:9;26796:18;26788:26;;26860:9;26854:4;26850:20;26846:1;26835:9;26831:17;26824:47;26888:131;27014:4;26888:131;:::i;:::-;26880:139;;26607:419;;;:::o;27032:180::-;27080:77;27077:1;27070:88;27177:4;27174:1;27167:15;27201:4;27198:1;27191:15;27218:348;27258:7;27281:20;27299:1;27281:20;:::i;:::-;27276:25;;27315:20;27333:1;27315:20;:::i;:::-;27310:25;;27503:1;27435:66;27431:74;27428:1;27425:81;27420:1;27413:9;27406:17;27402:105;27399:131;;;27510:18;;:::i;:::-;27399:131;27558:1;27555;27551:9;27540:20;;27218:348;;;;:::o;27572:180::-;27620:77;27617:1;27610:88;27717:4;27714:1;27707:15;27741:4;27738:1;27731:15;27758:185;27798:1;27815:20;27833:1;27815:20;:::i;:::-;27810:25;;27849:20;27867:1;27849:20;:::i;:::-;27844:25;;27888:1;27878:35;;27893:18;;:::i;:::-;27878:35;27935:1;27932;27928:9;27923:14;;27758:185;;;;:::o;27949:230::-;28089:34;28085:1;28077:6;28073:14;28066:58;28158:13;28153:2;28145:6;28141:15;28134:38;27949:230;:::o;28185:366::-;28327:3;28348:67;28412:2;28407:3;28348:67;:::i;:::-;28341:74;;28424:93;28513:3;28424:93;:::i;:::-;28542:2;28537:3;28533:12;28526:19;;28185:366;;;:::o;28557:419::-;28723:4;28761:2;28750:9;28746:18;28738:26;;28810:9;28804:4;28800:20;28796:1;28785:9;28781:17;28774:47;28838:131;28964:4;28838:131;:::i;:::-;28830:139;;28557:419;;;:::o;28982:172::-;29122:24;29118:1;29110:6;29106:14;29099:48;28982:172;:::o;29160:366::-;29302:3;29323:67;29387:2;29382:3;29323:67;:::i;:::-;29316:74;;29399:93;29488:3;29399:93;:::i;:::-;29517:2;29512:3;29508:12;29501:19;;29160:366;;;:::o;29532:419::-;29698:4;29736:2;29725:9;29721:18;29713:26;;29785:9;29779:4;29775:20;29771:1;29760:9;29756:17;29749:47;29813:131;29939:4;29813:131;:::i;:::-;29805:139;;29532:419;;;:::o;29957:173::-;30097:25;30093:1;30085:6;30081:14;30074:49;29957:173;:::o;30136:366::-;30278:3;30299:67;30363:2;30358:3;30299:67;:::i;:::-;30292:74;;30375:93;30464:3;30375:93;:::i;:::-;30493:2;30488:3;30484:12;30477:19;;30136:366;;;:::o;30508:419::-;30674:4;30712:2;30701:9;30697:18;30689:26;;30761:9;30755:4;30751:20;30747:1;30736:9;30732:17;30725:47;30789:131;30915:4;30789:131;:::i;:::-;30781:139;;30508:419;;;:::o;30933:178::-;31073:30;31069:1;31061:6;31057:14;31050:54;30933:178;:::o;31117:366::-;31259:3;31280:67;31344:2;31339:3;31280:67;:::i;:::-;31273:74;;31356:93;31445:3;31356:93;:::i;:::-;31474:2;31469:3;31465:12;31458:19;;31117:366;;;:::o;31489:419::-;31655:4;31693:2;31682:9;31678:18;31670:26;;31742:9;31736:4;31732:20;31728:1;31717:9;31713:17;31706:47;31770:131;31896:4;31770:131;:::i;:::-;31762:139;;31489:419;;;:::o;31914:222::-;32054:34;32050:1;32042:6;32038:14;32031:58;32123:5;32118:2;32110:6;32106:15;32099:30;31914:222;:::o;32142:366::-;32284:3;32305:67;32369:2;32364:3;32305:67;:::i;:::-;32298:74;;32381:93;32470:3;32381:93;:::i;:::-;32499:2;32494:3;32490:12;32483:19;;32142:366;;;:::o;32514:419::-;32680:4;32718:2;32707:9;32703:18;32695:26;;32767:9;32761:4;32757:20;32753:1;32742:9;32738:17;32731:47;32795:131;32921:4;32795:131;:::i;:::-;32787:139;;32514:419;;;:::o;32939:295::-;33079:34;33075:1;33067:6;33063:14;33056:58;33148:34;33143:2;33135:6;33131:15;33124:59;33217:9;33212:2;33204:6;33200:15;33193:34;32939:295;:::o;33240:366::-;33382:3;33403:67;33467:2;33462:3;33403:67;:::i;:::-;33396:74;;33479:93;33568:3;33479:93;:::i;:::-;33597:2;33592:3;33588:12;33581:19;;33240:366;;;:::o;33612:419::-;33778:4;33816:2;33805:9;33801:18;33793:26;;33865:9;33859:4;33855:20;33851:1;33840:9;33836:17;33829:47;33893:131;34019:4;33893:131;:::i;:::-;33885:139;;33612:419;;;:::o;34037:246::-;34177:34;34173:1;34165:6;34161:14;34154:58;34246:29;34241:2;34233:6;34229:15;34222:54;34037:246;:::o;34289:366::-;34431:3;34452:67;34516:2;34511:3;34452:67;:::i;:::-;34445:74;;34528:93;34617:3;34528:93;:::i;:::-;34646:2;34641:3;34637:12;34630:19;;34289:366;;;:::o;34661:419::-;34827:4;34865:2;34854:9;34850:18;34842:26;;34914:9;34908:4;34904:20;34900:1;34889:9;34885:17;34878:47;34942:131;35068:4;34942:131;:::i;:::-;34934:139;;34661:419;;;:::o;35086:180::-;35226:32;35222:1;35214:6;35210:14;35203:56;35086:180;:::o;35272:366::-;35414:3;35435:67;35499:2;35494:3;35435:67;:::i;:::-;35428:74;;35511:93;35600:3;35511:93;:::i;:::-;35629:2;35624:3;35620:12;35613:19;;35272:366;;;:::o;35644:419::-;35810:4;35848:2;35837:9;35833:18;35825:26;;35897:9;35891:4;35887:20;35883:1;35872:9;35868:17;35861:47;35925:131;36051:4;35925:131;:::i;:::-;35917:139;;35644:419;;;:::o;36069:231::-;36209:34;36205:1;36197:6;36193:14;36186:58;36278:14;36273:2;36265:6;36261:15;36254:39;36069:231;:::o;36306:366::-;36448:3;36469:67;36533:2;36528:3;36469:67;:::i;:::-;36462:74;;36545:93;36634:3;36545:93;:::i;:::-;36663:2;36658:3;36654:12;36647:19;;36306:366;;;:::o;36678:419::-;36844:4;36882:2;36871:9;36867:18;36859:26;;36931:9;36925:4;36921:20;36917:1;36906:9;36902:17;36895:47;36959:131;37085:4;36959:131;:::i;:::-;36951:139;;36678:419;;;:::o;37103:180::-;37151:77;37148:1;37141:88;37248:4;37245:1;37238:15;37272:4;37269:1;37262:15;37289:228;37429:34;37425:1;37417:6;37413:14;37406:58;37498:11;37493:2;37485:6;37481:15;37474:36;37289:228;:::o;37523:366::-;37665:3;37686:67;37750:2;37745:3;37686:67;:::i;:::-;37679:74;;37762:93;37851:3;37762:93;:::i;:::-;37880:2;37875:3;37871:12;37864:19;;37523:366;;;:::o;37895:419::-;38061:4;38099:2;38088:9;38084:18;38076:26;;38148:9;38142:4;38138:20;38134:1;38123:9;38119:17;38112:47;38176:131;38302:4;38176:131;:::i;:::-;38168:139;;37895:419;;;:::o;38320:229::-;38460:34;38456:1;38448:6;38444:14;38437:58;38529:12;38524:2;38516:6;38512:15;38505:37;38320:229;:::o;38555:366::-;38697:3;38718:67;38782:2;38777:3;38718:67;:::i;:::-;38711:74;;38794:93;38883:3;38794:93;:::i;:::-;38912:2;38907:3;38903:12;38896:19;;38555:366;;;:::o;38927:419::-;39093:4;39131:2;39120:9;39116:18;39108:26;;39180:9;39174:4;39170:20;39166:1;39155:9;39151:17;39144:47;39208:131;39334:4;39208:131;:::i;:::-;39200:139;;38927:419;;;:::o;39352:182::-;39492:34;39488:1;39480:6;39476:14;39469:58;39352:182;:::o;39540:366::-;39682:3;39703:67;39767:2;39762:3;39703:67;:::i;:::-;39696:74;;39779:93;39868:3;39779:93;:::i;:::-;39897:2;39892:3;39888:12;39881:19;;39540:366;;;:::o;39912:419::-;40078:4;40116:2;40105:9;40101:18;40093:26;;40165:9;40159:4;40155:20;40151:1;40140:9;40136:17;40129:47;40193:131;40319:4;40193:131;:::i;:::-;40185:139;;39912:419;;;:::o;40337:170::-;40477:22;40473:1;40465:6;40461:14;40454:46;40337:170;:::o;40513:366::-;40655:3;40676:67;40740:2;40735:3;40676:67;:::i;:::-;40669:74;;40752:93;40841:3;40752:93;:::i;:::-;40870:2;40865:3;40861:12;40854:19;;40513:366;;;:::o;40885:419::-;41051:4;41089:2;41078:9;41074:18;41066:26;;41138:9;41132:4;41128:20;41124:1;41113:9;41109:17;41102:47;41166:131;41292:4;41166:131;:::i;:::-;41158:139;;40885:419;;;:::o;41310:240::-;41450:34;41446:1;41438:6;41434:14;41427:58;41519:23;41514:2;41506:6;41502:15;41495:48;41310:240;:::o;41556:366::-;41698:3;41719:67;41783:2;41778:3;41719:67;:::i;:::-;41712:74;;41795:93;41884:3;41795:93;:::i;:::-;41913:2;41908:3;41904:12;41897:19;;41556:366;;;:::o;41928:419::-;42094:4;42132:2;42121:9;42117:18;42109:26;;42181:9;42175:4;42171:20;42167:1;42156:9;42152:17;42145:47;42209:131;42335:4;42209:131;:::i;:::-;42201:139;;41928:419;;;:::o;42353:171::-;42493:23;42489:1;42481:6;42477:14;42470:47;42353:171;:::o;42530:366::-;42672:3;42693:67;42757:2;42752:3;42693:67;:::i;:::-;42686:74;;42769:93;42858:3;42769:93;:::i;:::-;42887:2;42882:3;42878:12;42871:19;;42530:366;;;:::o;42902:419::-;43068:4;43106:2;43095:9;43091:18;43083:26;;43155:9;43149:4;43145:20;43141:1;43130:9;43126:17;43119:47;43183:131;43309:4;43183:131;:::i;:::-;43175:139;;42902:419;;;:::o;43327:175::-;43467:27;43463:1;43455:6;43451:14;43444:51;43327:175;:::o;43508:366::-;43650:3;43671:67;43735:2;43730:3;43671:67;:::i;:::-;43664:74;;43747:93;43836:3;43747:93;:::i;:::-;43865:2;43860:3;43856:12;43849:19;;43508:366;;;:::o;43880:419::-;44046:4;44084:2;44073:9;44069:18;44061:26;;44133:9;44127:4;44123:20;44119:1;44108:9;44104:17;44097:47;44161:131;44287:4;44161:131;:::i;:::-;44153:139;;43880:419;;;:::o;44305:305::-;44345:3;44364:20;44382:1;44364:20;:::i;:::-;44359:25;;44398:20;44416:1;44398:20;:::i;:::-;44393:25;;44552:1;44484:66;44480:74;44477:1;44474:81;44471:107;;;44558:18;;:::i;:::-;44471:107;44602:1;44599;44595:9;44588:16;;44305:305;;;;:::o;44616:173::-;44756:25;44752:1;44744:6;44740:14;44733:49;44616:173;:::o;44795:366::-;44937:3;44958:67;45022:2;45017:3;44958:67;:::i;:::-;44951:74;;45034:93;45123:3;45034:93;:::i;:::-;45152:2;45147:3;45143:12;45136:19;;44795:366;;;:::o;45167:419::-;45333:4;45371:2;45360:9;45356:18;45348:26;;45420:9;45414:4;45410:20;45406:1;45395:9;45391:17;45384:47;45448:131;45574:4;45448:131;:::i;:::-;45440:139;;45167:419;;;:::o;45592:175::-;45732:27;45728:1;45720:6;45716:14;45709:51;45592:175;:::o;45773:366::-;45915:3;45936:67;46000:2;45995:3;45936:67;:::i;:::-;45929:74;;46012:93;46101:3;46012:93;:::i;:::-;46130:2;46125:3;46121:12;46114:19;;45773:366;;;:::o;46145:419::-;46311:4;46349:2;46338:9;46334:18;46326:26;;46398:9;46392:4;46388:20;46384:1;46373:9;46369:17;46362:47;46426:131;46552:4;46426:131;:::i;:::-;46418:139;;46145:419;;;:::o;46570:223::-;46710:34;46706:1;46698:6;46694:14;46687:58;46779:6;46774:2;46766:6;46762:15;46755:31;46570:223;:::o;46799:366::-;46941:3;46962:67;47026:2;47021:3;46962:67;:::i;:::-;46955:74;;47038:93;47127:3;47038:93;:::i;:::-;47156:2;47151:3;47147:12;47140:19;;46799:366;;;:::o;47171:419::-;47337:4;47375:2;47364:9;47360:18;47352:26;;47424:9;47418:4;47414:20;47410:1;47399:9;47395:17;47388:47;47452:131;47578:4;47452:131;:::i;:::-;47444:139;;47171:419;;;:::o;47596:234::-;47736:34;47732:1;47724:6;47720:14;47713:58;47805:17;47800:2;47792:6;47788:15;47781:42;47596:234;:::o;47836:366::-;47978:3;47999:67;48063:2;48058:3;47999:67;:::i;:::-;47992:74;;48075:93;48164:3;48075:93;:::i;:::-;48193:2;48188:3;48184:12;48177:19;;47836:366;;;:::o;48208:419::-;48374:4;48412:2;48401:9;48397:18;48389:26;;48461:9;48455:4;48451:20;48447:1;48436:9;48432:17;48425:47;48489:131;48615:4;48489:131;:::i;:::-;48481:139;;48208:419;;;:::o;48633:164::-;48773:16;48769:1;48761:6;48757:14;48750:40;48633:164;:::o;48803:402::-;48963:3;48984:85;49066:2;49061:3;48984:85;:::i;:::-;48977:92;;49078:93;49167:3;49078:93;:::i;:::-;49196:2;49191:3;49187:12;49180:19;;48803:402;;;:::o;49211:695::-;49489:3;49511:95;49602:3;49593:6;49511:95;:::i;:::-;49504:102;;49623:92;49711:3;49702:6;49623:92;:::i;:::-;49616:99;;49732:148;49876:3;49732:148;:::i;:::-;49725:155;;49897:3;49890:10;;49211:695;;;;;:::o;49912:225::-;50052:34;50048:1;50040:6;50036:14;50029:58;50121:8;50116:2;50108:6;50104:15;50097:33;49912:225;:::o;50143:366::-;50285:3;50306:67;50370:2;50365:3;50306:67;:::i;:::-;50299:74;;50382:93;50471:3;50382:93;:::i;:::-;50500:2;50495:3;50491:12;50484:19;;50143:366;;;:::o;50515:419::-;50681:4;50719:2;50708:9;50704:18;50696:26;;50768:9;50762:4;50758:20;50754:1;50743:9;50739:17;50732:47;50796:131;50922:4;50796:131;:::i;:::-;50788:139;;50515:419;;;:::o;50940:231::-;51080:34;51076:1;51068:6;51064:14;51057:58;51149:14;51144:2;51136:6;51132:15;51125:39;50940:231;:::o;51177:366::-;51319:3;51340:67;51404:2;51399:3;51340:67;:::i;:::-;51333:74;;51416:93;51505:3;51416:93;:::i;:::-;51534:2;51529:3;51525:12;51518:19;;51177:366;;;:::o;51549:419::-;51715:4;51753:2;51742:9;51738:18;51730:26;;51802:9;51796:4;51792:20;51788:1;51777:9;51773:17;51766:47;51830:131;51956:4;51830:131;:::i;:::-;51822:139;;51549:419;;;:::o;51974:228::-;52114:34;52110:1;52102:6;52098:14;52091:58;52183:11;52178:2;52170:6;52166:15;52159:36;51974:228;:::o;52208:366::-;52350:3;52371:67;52435:2;52430:3;52371:67;:::i;:::-;52364:74;;52447:93;52536:3;52447:93;:::i;:::-;52565:2;52560:3;52556:12;52549:19;;52208:366;;;:::o;52580:419::-;52746:4;52784:2;52773:9;52769:18;52761:26;;52833:9;52827:4;52823:20;52819:1;52808:9;52804:17;52797:47;52861:131;52987:4;52861:131;:::i;:::-;52853:139;;52580:419;;;:::o;53005:223::-;53145:34;53141:1;53133:6;53129:14;53122:58;53214:6;53209:2;53201:6;53197:15;53190:31;53005:223;:::o;53234:366::-;53376:3;53397:67;53461:2;53456:3;53397:67;:::i;:::-;53390:74;;53473:93;53562:3;53473:93;:::i;:::-;53591:2;53586:3;53582:12;53575:19;;53234:366;;;:::o;53606:419::-;53772:4;53810:2;53799:9;53795:18;53787:26;;53859:9;53853:4;53849:20;53845:1;53834:9;53830:17;53823:47;53887:131;54013:4;53887:131;:::i;:::-;53879:139;;53606:419;;;:::o;54031:191::-;54071:4;54091:20;54109:1;54091:20;:::i;:::-;54086:25;;54125:20;54143:1;54125:20;:::i;:::-;54120:25;;54164:1;54161;54158:8;54155:34;;;54169:18;;:::i;:::-;54155:34;54214:1;54211;54207:9;54199:17;;54031:191;;;;:::o;54228:237::-;54368:34;54364:1;54356:6;54352:14;54345:58;54437:20;54432:2;54424:6;54420:15;54413:45;54228:237;:::o;54471:366::-;54613:3;54634:67;54698:2;54693:3;54634:67;:::i;:::-;54627:74;;54710:93;54799:3;54710:93;:::i;:::-;54828:2;54823:3;54819:12;54812:19;;54471:366;;;:::o;54843:419::-;55009:4;55047:2;55036:9;55032:18;55024:26;;55096:9;55090:4;55086:20;55082:1;55071:9;55067:17;55060:47;55124:131;55250:4;55124:131;:::i;:::-;55116:139;;54843:419;;;:::o;55268:98::-;55319:6;55353:5;55347:12;55337:22;;55268:98;;;:::o;55372:168::-;55455:11;55489:6;55484:3;55477:19;55529:4;55524:3;55520:14;55505:29;;55372:168;;;;:::o;55546:360::-;55632:3;55660:38;55692:5;55660:38;:::i;:::-;55714:70;55777:6;55772:3;55714:70;:::i;:::-;55707:77;;55793:52;55838:6;55833:3;55826:4;55819:5;55815:16;55793:52;:::i;:::-;55870:29;55892:6;55870:29;:::i;:::-;55865:3;55861:39;55854:46;;55636:270;55546:360;;;;:::o;55912:640::-;56107:4;56145:3;56134:9;56130:19;56122:27;;56159:71;56227:1;56216:9;56212:17;56203:6;56159:71;:::i;:::-;56240:72;56308:2;56297:9;56293:18;56284:6;56240:72;:::i;:::-;56322;56390:2;56379:9;56375:18;56366:6;56322:72;:::i;:::-;56441:9;56435:4;56431:20;56426:2;56415:9;56411:18;56404:48;56469:76;56540:4;56531:6;56469:76;:::i;:::-;56461:84;;55912:640;;;;;;;:::o;56558:141::-;56614:5;56645:6;56639:13;56630:22;;56661:32;56687:5;56661:32;:::i;:::-;56558:141;;;;:::o;56705:349::-;56774:6;56823:2;56811:9;56802:7;56798:23;56794:32;56791:119;;;56829:79;;:::i;:::-;56791:119;56949:1;56974:63;57029:7;57020:6;57009:9;57005:22;56974:63;:::i;:::-;56964:73;;56920:127;56705:349;;;;:::o;57060:180::-;57108:77;57105:1;57098:88;57205:4;57202:1;57195:15;57229:4;57226:1;57219:15;57246:182;57386:34;57382:1;57374:6;57370:14;57363:58;57246:182;:::o;57434:366::-;57576:3;57597:67;57661:2;57656:3;57597:67;:::i;:::-;57590:74;;57673:93;57762:3;57673:93;:::i;:::-;57791:2;57786:3;57782:12;57775:19;;57434:366;;;:::o;57806:419::-;57972:4;58010:2;57999:9;57995:18;57987:26;;58059:9;58053:4;58049:20;58045:1;58034:9;58030:17;58023:47;58087:131;58213:4;58087:131;:::i;:::-;58079:139;;57806:419;;;:::o;58231:178::-;58371:30;58367:1;58359:6;58355:14;58348:54;58231:178;:::o;58415:366::-;58557:3;58578:67;58642:2;58637:3;58578:67;:::i;:::-;58571:74;;58654:93;58743:3;58654:93;:::i;:::-;58772:2;58767:3;58763:12;58756:19;;58415:366;;;:::o;58787:419::-;58953:4;58991:2;58980:9;58976:18;58968:26;;59040:9;59034:4;59030:20;59026:1;59015:9;59011:17;59004:47;59068:131;59194:4;59068:131;:::i;:::-;59060:139;;58787:419;;;:::o
Swarm Source
ipfs://c5778364b0cb5313c391843165218fd269bf148c2bde28d0f2f971cb0938e5b1
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.