ERC-721
NFT
Overview
Max Total Supply
447 GFG
Holders
323
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 GFGLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
NFT
Compiler Version
v0.8.6+commit.11564f7e
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-11-04 */ // Sources flattened with hardhat v2.6.6 https://hardhat.org // File @openzeppelin/contracts/access/[email protected] // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControl { /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. * * _Available since v3.1._ */ event RoleAdminChanged( bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole ); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {AccessControl-_setupRole}. */ event RoleGranted( bytes32 indexed role, address indexed account, address indexed sender ); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked( bytes32 indexed role, address indexed account, address indexed sender ); /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) external view returns (bool); /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {AccessControl-_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) external view returns (bytes32); /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) external; /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) external; /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) external; } // File @openzeppelin/contracts/utils/[email protected] 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/utils/[email protected] 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/introspection/[email protected] pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File @openzeppelin/contracts/utils/introspection/[email protected] 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/access/[email protected] pragma solidity ^0.8.0; /** * @dev Contract module that allows children to implement role-based access * control mechanisms. This is a lightweight version that doesn't allow enumerating role * members except through off-chain means by accessing the contract event logs. Some * applications may benefit from on-chain enumerability, for those cases see * {AccessControlEnumerable}. * * Roles are referred to by their `bytes32` identifier. These should be exposed * in the external API and be unique. The best way to achieve this is by * using `public constant` hash digests: * * ``` * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); * ``` * * Roles can be used to represent a set of permissions. To restrict access to a * function call, use {hasRole}: * * ``` * function foo() public { * require(hasRole(MY_ROLE, msg.sender)); * ... * } * ``` * * Roles can be granted and revoked dynamically via the {grantRole} and * {revokeRole} functions. Each role has an associated admin role, and only * accounts that have a role's admin role can call {grantRole} and {revokeRole}. * * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means * that only accounts with this role will be able to grant or revoke other * roles. More complex role relationships can be created by using * {_setRoleAdmin}. * * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to * grant and revoke this role. Extra precautions should be taken to secure * accounts that have been granted it. */ abstract contract AccessControl is Context, IAccessControl, ERC165 { struct RoleData { mapping(address => bool) members; bytes32 adminRole; } mapping(bytes32 => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Modifier that checks that an account has a specific role. Reverts * with a standardized message including the required role. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ * * _Available since v4.1._ */ modifier onlyRole(bytes32 role) { _checkRole(role, _msgSender()); _; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view override returns (bool) { return _roles[role].members[account]; } /** * @dev Revert with a standard message if `account` is missing `role`. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ */ function _checkRole(bytes32 role, address account) internal view { if (!hasRole(role, account)) { revert( string( abi.encodePacked( "AccessControl: account ", Strings.toHexString(uint160(account), 20), " is missing role ", Strings.toHexString(uint256(role), 32) ) ) ); } } /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) public view override returns (bytes32) { return _roles[role].adminRole; } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _grantRole(role, account); } /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _revokeRole(role, account); } /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) public virtual override { require( account == _msgSender(), "AccessControl: can only renounce roles for self" ); _revokeRole(role, account); } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. Note that unlike {grantRole}, this function doesn't perform any * checks on the calling account. * * [WARNING] * ==== * This function should only be called from the constructor when setting * up the initial roles for the system. * * Using this function in any other way is effectively circumventing the admin * system imposed by {AccessControl}. * ==== */ function _setupRole(bytes32 role, address account) internal virtual { _grantRole(role, account); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { bytes32 previousAdminRole = getRoleAdmin(role); _roles[role].adminRole = adminRole; emit RoleAdminChanged(role, previousAdminRole, adminRole); } function _grantRole(bytes32 role, address account) private { if (!hasRole(role, account)) { _roles[role].members[account] = true; emit RoleGranted(role, account, _msgSender()); } } function _revokeRole(bytes32 role, address account) private { if (hasRole(role, account)) { _roles[role].members[account] = false; emit RoleRevoked(role, account, _msgSender()); } } } // File @openzeppelin/contracts/token/ERC721/[email protected] 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/[email protected] 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/token/ERC721/extensions/[email protected] 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/utils/[email protected] 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/[email protected] 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/[email protected] 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/[email protected] 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 @openzeppelin/contracts/token/ERC721/extensions/[email protected] pragma solidity ^0.8.0; /** * @title ERC721 Burnable Token * @dev ERC721 Token that can be irreversibly burned (destroyed). */ abstract contract ERC721Burnable is Context, ERC721 { /** * @dev Burns `tokenId`. See {ERC721-_burn}. * * Requirements: * * - The caller must own `tokenId` or be an approved operator. */ function burn(uint256 tokenId) public virtual { //solhint-disable-next-line max-line-length require( _isApprovedOrOwner(_msgSender(), tokenId), "ERC721Burnable: caller is not owner nor approved" ); _burn(tokenId); } } // File @openzeppelin/contracts/security/[email protected] pragma solidity ^0.8.0; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { require(!paused(), "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { require(paused(), "Pausable: not paused"); _; } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } // File @openzeppelin/contracts/token/ERC721/extensions/[email protected] pragma solidity ^0.8.0; /** * @dev ERC721 token with pausable token transfers, minting and burning. * * Useful for scenarios such as preventing trades until the end of an evaluation * period, or having an emergency switch for freezing all token transfers in the * event of a large bug. */ abstract contract ERC721Pausable is ERC721, Pausable { /** * @dev See {ERC721-_beforeTokenTransfer}. * * Requirements: * * - the contract must not be paused. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); require(!paused(), "ERC721Pausable: token transfer while paused"); } } // File contracts/IERC2981.sol // https://eips.ethereum.org/EIPS/eip-2981 /// @dev Interface for the NFT Royalty Standard interface IERC2981 { /** * @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 value - 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 _value sale price */ function royaltyInfo(uint256 tokenId, uint256 value) external returns (address receiver, uint256 royaltyAmount); } // File contracts/ERC2981.sol abstract contract ERC2981 is ERC165, IERC2981 { function royaltyInfo(uint256 _tokenId, uint256 _value) external virtual override returns (address _receiver, uint256 _royaltyAmount); function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165) returns (bool) { return interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId); } } // File contracts/NFT.sol contract NFT is AccessControl, ERC2981, ERC721Enumerable, ERC721Burnable, ERC721Pausable { event RoyaltyWalletChanged( address indexed previousWallet, address indexed newWallet ); event RoyaltyFeeChanged(uint256 previousFee, uint256 newFee); event BaseURIChanged(string previousURI, string newURI); bytes32 public constant OWNER_ROLE = keccak256("OWNER_ROLE"); bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE"); uint256 public constant ROYALTY_FEE_DENOMINATOR = 100000; uint256 public royaltyFee; address public royaltyWallet; string private _baseTokenURI; /** * @param _name ERC721 token name * @param _symbol ERC721 token symbol * @param _uri Base token uri * @param _royaltyWallet Wallet where royalties should be sent * @param _royaltyFee Fee numerator to be used for fees */ constructor( string memory _name, string memory _symbol, string memory _uri, address _royaltyWallet, uint256 _royaltyFee ) ERC721(_name, _symbol) { _setBaseTokenURI(_uri); _setRoyaltyWallet(_royaltyWallet); _setRoyaltyFee(_royaltyFee); _setupRole(DEFAULT_ADMIN_ROLE, msg.sender); _setupRole(OWNER_ROLE, msg.sender); _setupRole(MINTER_ROLE, msg.sender); } /** * @dev Throws if called by any account other than owners. Implemented using the underlying AccessControl methods. */ modifier onlyOwners() { require( hasRole(OWNER_ROLE, _msgSender()), "Caller does not have the OWNER_ROLE" ); _; } /** * @dev Throws if called by any account other than minters. Implemented using the underlying AccessControl methods. */ modifier onlyMinters() { require( hasRole(MINTER_ROLE, _msgSender()), "Caller does not have the MINTER_ROLE" ); _; } /** * @dev Mints the specified token ids to the recipient addresses * @param recipient Address that will receive the tokens * @param tokenIds Array of tokenIds to be minted */ function mint(address recipient, uint256[] calldata tokenIds) external onlyMinters { for (uint256 i = 0; i < tokenIds.length; i++) { _mint(recipient, tokenIds[i]); } } /** * @dev Mints the specified token id to the recipient addresses * @dev The unused string parameter exists to support the API used by ChainBridge. * @param recipient Address that will receive the tokens * @param tokenId tokenId to be minted */ function mint( address recipient, uint256 tokenId, string calldata ) external onlyMinters { _mint(recipient, tokenId); } /** * @dev Pauses token transfers */ function pause() external onlyOwners { _pause(); } /** * @dev Unpauses token transfers */ function unpause() external onlyOwners { _unpause(); } /** * @dev Sets the base token URI * @param uri Base token URI */ function setBaseTokenURI(string calldata uri) external onlyOwners { _setBaseTokenURI(uri); } /** * @dev Sets the wallet to which royalties should be sent * @param _royaltyWallet Address that should receive the royalties */ function setRoyaltyWallet(address _royaltyWallet) external onlyOwners { _setRoyaltyWallet(_royaltyWallet); } /** * @dev Sets the fee percentage for royalties * @param _royaltyFee Basis points to compute royalty percentage */ function setRoyaltyFee(uint256 _royaltyFee) external onlyOwners { _setRoyaltyFee(_royaltyFee); } /** * @dev Function defined by ERC2981, which provides information about fees. * @param value Price being paid for the token (in base units) */ function royaltyInfo( uint256, // tokenId is not used in this case as all tokens take the same fee uint256 value ) external view override returns ( address, // receiver uint256 // royaltyAmount ) { return (royaltyWallet, (value * royaltyFee) / ROYALTY_FEE_DENOMINATOR); } /** * @dev For each existing tokenId, it returns the URI where metadata is stored * @param tokenId Token id */ function tokenURI(uint256 tokenId) public view override returns (string memory) { string memory uri = super.tokenURI(tokenId); return bytes(uri).length > 0 ? string(abi.encodePacked(uri, ".json")) : ""; } function supportsInterface(bytes4 interfaceId) public view override(AccessControl, ERC2981, ERC721, ERC721Enumerable) returns (bool) { return super.supportsInterface(interfaceId); } function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal override(ERC721, ERC721Enumerable, ERC721Pausable) { super._beforeTokenTransfer(from, to, tokenId); } function _setBaseTokenURI(string memory newURI) internal { emit BaseURIChanged(_baseTokenURI, newURI); _baseTokenURI = newURI; } function _setRoyaltyWallet(address _royaltyWallet) internal { require(_royaltyWallet != address(0), "INVALID_WALLET"); emit RoyaltyWalletChanged(royaltyWallet, _royaltyWallet); royaltyWallet = _royaltyWallet; } function _setRoyaltyFee(uint256 _royaltyFee) internal { require(_royaltyFee <= ROYALTY_FEE_DENOMINATOR, "INVALID_FEE"); emit RoyaltyFeeChanged(royaltyFee, _royaltyFee); royaltyFee = _royaltyFee; } function _baseURI() internal view override returns (string memory) { return _baseTokenURI; } }
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":"string","name":"_uri","type":"string"},{"internalType":"address","name":"_royaltyWallet","type":"address"},{"internalType":"uint256","name":"_royaltyFee","type":"uint256"}],"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":false,"internalType":"string","name":"previousURI","type":"string"},{"indexed":false,"internalType":"string","name":"newURI","type":"string"}],"name":"BaseURIChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"previousFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newFee","type":"uint256"}],"name":"RoyaltyFeeChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousWallet","type":"address"},{"indexed":true,"internalType":"address","name":"newWallet","type":"address"}],"name":"RoyaltyWalletChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OWNER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROYALTY_FEE_DENOMINATOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","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":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"","type":"string"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"royaltyFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"royaltyWallet","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":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setBaseTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_royaltyFee","type":"uint256"}],"name":"setRoyaltyFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_royaltyWallet","type":"address"}],"name":"setRoyaltyWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b5060405162005a5e38038062005a5e83398181016040528101906200003791906200062f565b8484816001908051906020019062000051929190620004d3565b5080600290805190602001906200006a929190620004d3565b5050506000600b60006101000a81548160ff02191690831515021790555062000099836200013f60201b60201c565b620000aa826200019760201b60201c565b620000bb81620002ca60201b60201c565b620000d06000801b336200035a60201b60201c565b620001027fb19546dff01e856fb3f010c267a7b1c60363cf8a4664e21cc89c26224620214e336200035a60201b60201c565b620001347f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6336200035a60201b60201c565b505050505062000b65565b7fc41b7cb64e5be01af4afc2641afc861432136270f4206b7773f229b658b96699600e826040516200017392919062000840565b60405180910390a180600e908051906020019062000193929190620004d3565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156200020a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000201906200089d565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fa09dff055f1734e95d92880fc90368fd52bf88c41786aa2e24e2b34ae075452660405160405180910390a380600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b620186a081111562000313576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200030a906200087b565b60405180910390fd5b7fc6e980a116c671cc344b1ed002b6f0c3454692ecb6cc881f3ce59366368cde4f600c548260405162000348929190620008bf565b60405180910390a180600c8190555050565b6200036c82826200037060201b60201c565b5050565b6200038282826200046160201b60201c565b6200045d57600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555062000402620004cb60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600033905090565b828054620004e190620009f0565b90600052602060002090601f01602090048101928262000505576000855562000551565b82601f106200052057805160ff191683800117855562000551565b8280016001018555821562000551579182015b828111156200055057825182559160200191906001019062000533565b5b50905062000560919062000564565b5090565b5b808211156200057f57600081600090555060010162000565565b5090565b60006200059a620005948462000915565b620008ec565b905082815260208101848484011115620005b957620005b862000abf565b5b620005c6848285620009ba565b509392505050565b600081519050620005df8162000b31565b92915050565b600082601f830112620005fd57620005fc62000aba565b5b81516200060f84826020860162000583565b91505092915050565b600081519050620006298162000b4b565b92915050565b600080600080600060a086880312156200064e576200064d62000ac9565b5b600086015167ffffffffffffffff8111156200066f576200066e62000ac4565b5b6200067d88828901620005e5565b955050602086015167ffffffffffffffff811115620006a157620006a062000ac4565b5b620006af88828901620005e5565b945050604086015167ffffffffffffffff811115620006d357620006d262000ac4565b5b620006e188828901620005e5565b9350506060620006f488828901620005ce565b9250506080620007078882890162000618565b9150509295509295909350565b6000620007218262000960565b6200072d81856200096b565b93506200073f818560208601620009ba565b6200074a8162000ace565b840191505092915050565b600081546200076481620009f0565b6200077081866200096b565b945060018216600081146200078e5760018114620007a157620007d8565b60ff1983168652602086019350620007d8565b620007ac856200094b565b60005b83811015620007d057815481890152600182019150602081019050620007af565b808801955050505b50505092915050565b6000620007f0600b836200096b565b9150620007fd8262000adf565b602082019050919050565b600062000817600e836200096b565b9150620008248262000b08565b602082019050919050565b6200083a81620009b0565b82525050565b600060408201905081810360008301526200085c818562000755565b9050818103602083015262000872818462000714565b90509392505050565b600060208201905081810360008301526200089681620007e1565b9050919050565b60006020820190508181036000830152620008b88162000808565b9050919050565b6000604082019050620008d660008301856200082f565b620008e560208301846200082f565b9392505050565b6000620008f86200090b565b905062000906828262000a26565b919050565b6000604051905090565b600067ffffffffffffffff82111562000933576200093262000a8b565b5b6200093e8262000ace565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600082825260208201905092915050565b6000620009898262000990565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b83811015620009da578082015181840152602081019050620009bd565b83811115620009ea576000848401525b50505050565b6000600282049050600182168062000a0957607f821691505b6020821081141562000a205762000a1f62000a5c565b5b50919050565b62000a318262000ace565b810181811067ffffffffffffffff8211171562000a535762000a5262000a8b565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f494e56414c49445f464545000000000000000000000000000000000000000000600082015250565b7f494e56414c49445f57414c4c4554000000000000000000000000000000000000600082015250565b62000b3c816200097c565b811462000b4857600080fd5b50565b62000b5681620009b0565b811462000b6257600080fd5b50565b614ee98062000b756000396000f3fe608060405234801561001057600080fd5b50600436106102275760003560e01c80635c975abb11610130578063b8997a97116100b8578063d547741f1161007c578063d547741f14610661578063de836ebd1461067d578063e1a8bf2c14610699578063e58378bb146106b7578063e985e9c5146106d557610227565b8063b8997a97146105bd578063c87b56dd146105db578063cdeee6371461060b578063d3fc986414610627578063d53913931461064357610227565b806391d14854116100ff57806391d148541461051957806395d89b4114610549578063a217fddf14610567578063a22cb46514610585578063b88d4fde146105a157610227565b80635c975abb146104915780636352211e146104af57806370a08231146104df5780638456cb591461050f57610227565b80632f745c59116101b35780633f0d2ec1116101825780633f0d2ec1146104015780633f4ba83a1461041f57806342842e0e1461042957806342966c68146104455780634f6ccce71461046157610227565b80632f745c591461037d57806330176e13146103ad57806336568abe146103c95780633e4086e5146103e557610227565b806318160ddd116101fa57806318160ddd146102c657806323b872dd146102e4578063248a9ca3146103005780632a55205a146103305780632f2ff15d1461036157610227565b806301ffc9a71461022c57806306fdde031461025c578063081812fc1461027a578063095ea7b3146102aa575b600080fd5b6102466004803603810190610241919061368f565b610705565b6040516102539190613e09565b60405180910390f35b610264610717565b6040516102719190613e3f565b60405180910390f35b610294600480360381019061028f9190613736565b6107a9565b6040516102a19190613d79565b60405180910390f35b6102c460048036038101906102bf919061356e565b61082e565b005b6102ce610946565b6040516102db91906141d8565b60405180910390f35b6102fe60048036038101906102f991906133f8565b610953565b005b61031a60048036038101906103159190613622565b6109b3565b6040516103279190613e24565b60405180910390f35b61034a60048036038101906103459190613763565b6109d2565b604051610358929190613de0565b60405180910390f35b61037b6004803603810190610376919061364f565b610a1f565b005b6103976004803603810190610392919061356e565b610a48565b6040516103a491906141d8565b60405180910390f35b6103c760048036038101906103c291906136e9565b610aed565b005b6103e360048036038101906103de919061364f565b610bae565b005b6103ff60048036038101906103fa9190613736565b610c31565b005b610409610cad565b6040516104169190613d79565b60405180910390f35b610427610cd3565b005b610443600480360381019061043e91906133f8565b610d4d565b005b61045f600480360381019061045a9190613736565b610d6d565b005b61047b60048036038101906104769190613736565b610dc9565b60405161048891906141d8565b60405180910390f35b610499610e3a565b6040516104a69190613e09565b60405180910390f35b6104c960048036038101906104c49190613736565b610e51565b6040516104d69190613d79565b60405180910390f35b6104f960048036038101906104f4919061338b565b610f03565b60405161050691906141d8565b60405180910390f35b610517610fbb565b005b610533600480360381019061052e919061364f565b611035565b6040516105409190613e09565b60405180910390f35b61055161109f565b60405161055e9190613e3f565b60405180910390f35b61056f611131565b60405161057c9190613e24565b60405180910390f35b61059f600480360381019061059a919061352e565b611138565b005b6105bb60048036038101906105b6919061344b565b6112b9565b005b6105c561131b565b6040516105d291906141d8565b60405180910390f35b6105f560048036038101906105f09190613736565b611321565b6040516106029190613e3f565b60405180910390f35b6106256004803603810190610620919061338b565b611377565b005b610641600480360381019061063c91906135ae565b6113f3565b005b61064b611473565b6040516106589190613e24565b60405180910390f35b61067b6004803603810190610676919061364f565b611497565b005b610697600480360381019061069291906134ce565b6114c0565b005b6106a161157a565b6040516106ae91906141d8565b60405180910390f35b6106bf611581565b6040516106cc9190613e24565b60405180910390f35b6106ef60048036038101906106ea91906133b8565b6115a5565b6040516106fc9190613e09565b60405180910390f35b600061071082611639565b9050919050565b606060018054610726906144c9565b80601f0160208091040260200160405190810160405280929190818152602001828054610752906144c9565b801561079f5780601f106107745761010080835404028352916020019161079f565b820191906000526020600020905b81548152906001019060200180831161078257829003601f168201915b5050505050905090565b60006107b4826116b3565b6107f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107ea90614098565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061083982610e51565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156108aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108a190614118565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108c961171f565b73ffffffffffffffffffffffffffffffffffffffff1614806108f857506108f7816108f261171f565b6115a5565b5b610937576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161092e90613ff8565b60405180910390fd5b6109418383611727565b505050565b6000600980549050905090565b61096461095e61171f565b826117e0565b6109a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099a90614138565b60405180910390fd5b6109ae8383836118be565b505050565b6000806000838152602001908152602001600020600101549050919050565b600080600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16620186a0600c5485610a0a9190614351565b610a149190614320565b915091509250929050565b610a28826109b3565b610a3981610a3461171f565b611b1a565b610a438383611bb7565b505050565b6000610a5383610f03565b8210610a94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8b90613f18565b60405180910390fd5b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610b1e7fb19546dff01e856fb3f010c267a7b1c60363cf8a4664e21cc89c26224620214e610b1961171f565b611035565b610b5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5490613ef8565b60405180910390fd5b610baa82828080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611c97565b5050565b610bb661171f565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610c23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1a906141b8565b60405180910390fd5b610c2d8282611ceb565b5050565b610c627fb19546dff01e856fb3f010c267a7b1c60363cf8a4664e21cc89c26224620214e610c5d61171f565b611035565b610ca1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9890613ef8565b60405180910390fd5b610caa81611dcc565b50565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610d047fb19546dff01e856fb3f010c267a7b1c60363cf8a4664e21cc89c26224620214e610cff61171f565b611035565b610d43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3a90613ef8565b60405180910390fd5b610d4b611e57565b565b610d68838383604051806020016040528060008152506112b9565b505050565b610d7e610d7861171f565b826117e0565b610dbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db490614198565b60405180910390fd5b610dc681611ef9565b50565b6000610dd3610946565b8210610e14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0b90614158565b60405180910390fd5b60098281548110610e2857610e27614662565b5b90600052602060002001549050919050565b6000600b60009054906101000a900460ff16905090565b6000806003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610efa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef190614058565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610f74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6b90614018565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610fec7fb19546dff01e856fb3f010c267a7b1c60363cf8a4664e21cc89c26224620214e610fe761171f565b611035565b61102b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102290613ef8565b60405180910390fd5b61103361200a565b565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6060600280546110ae906144c9565b80601f01602080910402602001604051908101604052809291908181526020018280546110da906144c9565b80156111275780601f106110fc57610100808354040283529160200191611127565b820191906000526020600020905b81548152906001019060200180831161110a57829003601f168201915b5050505050905090565b6000801b81565b61114061171f565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156111ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a590613f98565b60405180910390fd5b80600660006111bb61171f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661126861171f565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516112ad9190613e09565b60405180910390a35050565b6112ca6112c461171f565b836117e0565b611309576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130090614138565b60405180910390fd5b611315848484846120ad565b50505050565b600c5481565b6060600061132e83612109565b9050600081511161134e576040518060200160405280600081525061136f565b8060405160200161135f9190613d1d565b6040516020818303038152906040525b915050919050565b6113a87fb19546dff01e856fb3f010c267a7b1c60363cf8a4664e21cc89c26224620214e6113a361171f565b611035565b6113e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113de90613ef8565b60405180910390fd5b6113f0816121b0565b50565b6114247f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a661141f61171f565b611035565b611463576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145a90614178565b60405180910390fd5b61146d84846122e0565b50505050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b6114a0826109b3565b6114b1816114ac61171f565b611b1a565b6114bb8383611ceb565b505050565b6114f17f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a66114ec61171f565b611035565b611530576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152790614178565b60405180910390fd5b60005b82829050811015611574576115618484848481811061155557611554614662565b5b905060200201356122e0565b808061156c9061452c565b915050611533565b50505050565b620186a081565b7fb19546dff01e856fb3f010c267a7b1c60363cf8a4664e21cc89c26224620214e81565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806116ac57506116ab826124ae565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661179a83610e51565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006117eb826116b3565b61182a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182190613fb8565b60405180910390fd5b600061183583610e51565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806118a457508373ffffffffffffffffffffffffffffffffffffffff1661188c846107a9565b73ffffffffffffffffffffffffffffffffffffffff16145b806118b557506118b481856115a5565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166118de82610e51565b73ffffffffffffffffffffffffffffffffffffffff1614611934576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192b906140d8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156119a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199b90613f78565b60405180910390fd5b6119af838383612590565b6119ba600082611727565b6001600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611a0a91906143ab565b925050819055506001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611a6191906142ca565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b611b248282611035565b611bb357611b498173ffffffffffffffffffffffffffffffffffffffff1660146125a0565b611b578360001c60206125a0565b604051602001611b68929190613d3f565b6040516020818303038152906040526040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611baa9190613e3f565b60405180910390fd5b5050565b611bc18282611035565b611c9357600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611c3861171f565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b7fc41b7cb64e5be01af4afc2641afc861432136270f4206b7773f229b658b96699600e82604051611cc9929190613e61565b60405180910390a180600e9080519060200190611ce792919061314e565b5050565b611cf58282611035565b15611dc857600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611d6d61171f565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b620186a0811115611e12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0990614038565b60405180910390fd5b7fc6e980a116c671cc344b1ed002b6f0c3454692ecb6cc881f3ce59366368cde4f600c5482604051611e459291906141f3565b60405180910390a180600c8190555050565b611e5f610e3a565b611e9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9590613ed8565b60405180910390fd5b6000600b60006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611ee261171f565b604051611eef9190613d79565b60405180910390a1565b6000611f0482610e51565b9050611f1281600084612590565b611f1d600083611727565b6001600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611f6d91906143ab565b925050819055506003600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b612012610e3a565b15612052576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204990613fd8565b60405180910390fd5b6001600b60006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861209661171f565b6040516120a39190613d79565b60405180910390a1565b6120b88484846118be565b6120c4848484846127dc565b612103576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120fa90613f38565b60405180910390fd5b50505050565b6060612114826116b3565b612153576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161214a906140f8565b60405180910390fd5b600061215d612973565b9050600081511161217d57604051806020016040528060008152506121a8565b8061218784612a05565b604051602001612198929190613cf9565b6040516020818303038152906040525b915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612220576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612217906140b8565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fa09dff055f1734e95d92880fc90368fd52bf88c41786aa2e24e2b34ae075452660405160405180910390a380600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612350576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161234790614078565b60405180910390fd5b612359816116b3565b15612399576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161239090613f58565b60405180910390fd5b6123a560008383612590565b6001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546123f591906142ca565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061257957507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612589575061258882612b66565b5b9050919050565b61259b838383612be0565b505050565b6060600060028360026125b39190614351565b6125bd91906142ca565b67ffffffffffffffff8111156125d6576125d5614691565b5b6040519080825280601f01601f1916602001820160405280156126085781602001600182028036833780820191505090505b5090507f3000000000000000000000000000000000000000000000000000000000000000816000815181106126405761263f614662565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f7800000000000000000000000000000000000000000000000000000000000000816001815181106126a4576126a3614662565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600060018460026126e49190614351565b6126ee91906142ca565b90505b600181111561278e577f3031323334353637383961626364656600000000000000000000000000000000600f8616601081106127305761272f614662565b5b1a60f81b82828151811061274757612746614662565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c9450806127879061449f565b90506126f1565b50600084146127d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127c990613e98565b60405180910390fd5b8091505092915050565b60006127fd8473ffffffffffffffffffffffffffffffffffffffff16612c38565b15612966578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261282661171f565b8786866040518563ffffffff1660e01b81526004016128489493929190613d94565b602060405180830381600087803b15801561286257600080fd5b505af192505050801561289357506040513d601f19601f8201168201806040525081019061289091906136bc565b60015b612916573d80600081146128c3576040519150601f19603f3d011682016040523d82523d6000602084013e6128c8565b606091505b5060008151141561290e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161290590613f38565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061296b565b600190505b949350505050565b6060600e8054612982906144c9565b80601f01602080910402602001604051908101604052809291908181526020018280546129ae906144c9565b80156129fb5780601f106129d0576101008083540402835291602001916129fb565b820191906000526020600020905b8154815290600101906020018083116129de57829003601f168201915b5050505050905090565b60606000821415612a4d576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612b61565b600082905060005b60008214612a7f578080612a689061452c565b915050600a82612a789190614320565b9150612a55565b60008167ffffffffffffffff811115612a9b57612a9a614691565b5b6040519080825280601f01601f191660200182016040528015612acd5781602001600182028036833780820191505090505b5090505b60008514612b5a57600182612ae691906143ab565b9150600a85612af59190614575565b6030612b0191906142ca565b60f81b818381518110612b1757612b16614662565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612b539190614320565b9450612ad1565b8093505050505b919050565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612bd95750612bd882612c4b565b5b9050919050565b612beb838383612cc5565b612bf3610e3a565b15612c33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c2a90613eb8565b60405180910390fd5b505050565b600080823b905060008111915050919050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612cbe5750612cbd82612dd9565b5b9050919050565b612cd0838383612e43565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612d1357612d0e81612e48565b612d52565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612d5157612d508382612e91565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612d9557612d9081612ffe565b612dd4565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612dd357612dd282826130cf565b5b5b505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b505050565b600980549050600a600083815260200190815260200160002081905550600981908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612e9e84610f03565b612ea891906143ab565b9050600060086000848152602001908152602001600020549050818114612f8d576000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816008600083815260200190815260200160002081905550505b6008600084815260200190815260200160002060009055600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160098054905061301291906143ab565b90506000600a600084815260200190815260200160002054905060006009838154811061304257613041614662565b5b90600052602060002001549050806009838154811061306457613063614662565b5b906000526020600020018190555081600a600083815260200190815260200160002081905550600a60008581526020019081526020016000206000905560098054806130b3576130b2614633565b5b6001900381819060005260206000200160009055905550505050565b60006130da83610f03565b905081600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806008600084815260200190815260200160002081905550505050565b82805461315a906144c9565b90600052602060002090601f01602090048101928261317c57600085556131c3565b82601f1061319557805160ff19168380011785556131c3565b828001600101855582156131c3579182015b828111156131c25782518255916020019190600101906131a7565b5b5090506131d091906131d4565b5090565b5b808211156131ed5760008160009055506001016131d5565b5090565b60006132046131ff84614241565b61421c565b9050828152602081018484840111156132205761321f6146cf565b5b61322b84828561445d565b509392505050565b60008135905061324281614e40565b92915050565b60008083601f84011261325e5761325d6146c5565b5b8235905067ffffffffffffffff81111561327b5761327a6146c0565b5b602083019150836020820283011115613297576132966146ca565b5b9250929050565b6000813590506132ad81614e57565b92915050565b6000813590506132c281614e6e565b92915050565b6000813590506132d781614e85565b92915050565b6000815190506132ec81614e85565b92915050565b600082601f830112613307576133066146c5565b5b81356133178482602086016131f1565b91505092915050565b60008083601f840112613336576133356146c5565b5b8235905067ffffffffffffffff811115613353576133526146c0565b5b60208301915083600182028301111561336f5761336e6146ca565b5b9250929050565b60008135905061338581614e9c565b92915050565b6000602082840312156133a1576133a06146d9565b5b60006133af84828501613233565b91505092915050565b600080604083850312156133cf576133ce6146d9565b5b60006133dd85828601613233565b92505060206133ee85828601613233565b9150509250929050565b600080600060608486031215613411576134106146d9565b5b600061341f86828701613233565b935050602061343086828701613233565b925050604061344186828701613376565b9150509250925092565b60008060008060808587031215613465576134646146d9565b5b600061347387828801613233565b945050602061348487828801613233565b935050604061349587828801613376565b925050606085013567ffffffffffffffff8111156134b6576134b56146d4565b5b6134c2878288016132f2565b91505092959194509250565b6000806000604084860312156134e7576134e66146d9565b5b60006134f586828701613233565b935050602084013567ffffffffffffffff811115613516576135156146d4565b5b61352286828701613248565b92509250509250925092565b60008060408385031215613545576135446146d9565b5b600061355385828601613233565b92505060206135648582860161329e565b9150509250929050565b60008060408385031215613585576135846146d9565b5b600061359385828601613233565b92505060206135a485828601613376565b9150509250929050565b600080600080606085870312156135c8576135c76146d9565b5b60006135d687828801613233565b94505060206135e787828801613376565b935050604085013567ffffffffffffffff811115613608576136076146d4565b5b61361487828801613320565b925092505092959194509250565b600060208284031215613638576136376146d9565b5b6000613646848285016132b3565b91505092915050565b60008060408385031215613666576136656146d9565b5b6000613674858286016132b3565b925050602061368585828601613233565b9150509250929050565b6000602082840312156136a5576136a46146d9565b5b60006136b3848285016132c8565b91505092915050565b6000602082840312156136d2576136d16146d9565b5b60006136e0848285016132dd565b91505092915050565b60008060208385031215613700576136ff6146d9565b5b600083013567ffffffffffffffff81111561371e5761371d6146d4565b5b61372a85828601613320565b92509250509250929050565b60006020828403121561374c5761374b6146d9565b5b600061375a84828501613376565b91505092915050565b6000806040838503121561377a576137796146d9565b5b600061378885828601613376565b925050602061379985828601613376565b9150509250929050565b6137ac816143df565b82525050565b6137bb816143f1565b82525050565b6137ca816143fd565b82525050565b60006137db82614287565b6137e5818561429d565b93506137f581856020860161446c565b6137fe816146de565b840191505092915050565b600061381482614292565b61381e81856142ae565b935061382e81856020860161446c565b613837816146de565b840191505092915050565b600061384d82614292565b61385781856142bf565b935061386781856020860161446c565b80840191505092915050565b60008154613880816144c9565b61388a81866142ae565b945060018216600081146138a557600181146138b7576138ea565b60ff19831686526020860193506138ea565b6138c085614272565b60005b838110156138e2578154818901526001820191506020810190506138c3565b808801955050505b50505092915050565b60006139006020836142ae565b915061390b826146ef565b602082019050919050565b6000613923602b836142ae565b915061392e82614718565b604082019050919050565b60006139466014836142ae565b915061395182614767565b602082019050919050565b60006139696023836142ae565b915061397482614790565b604082019050919050565b600061398c602b836142ae565b9150613997826147df565b604082019050919050565b60006139af6032836142ae565b91506139ba8261482e565b604082019050919050565b60006139d2601c836142ae565b91506139dd8261487d565b602082019050919050565b60006139f56024836142ae565b9150613a00826148a6565b604082019050919050565b6000613a186019836142ae565b9150613a23826148f5565b602082019050919050565b6000613a3b602c836142ae565b9150613a468261491e565b604082019050919050565b6000613a5e6010836142ae565b9150613a698261496d565b602082019050919050565b6000613a816038836142ae565b9150613a8c82614996565b604082019050919050565b6000613aa4602a836142ae565b9150613aaf826149e5565b604082019050919050565b6000613ac7600b836142ae565b9150613ad282614a34565b602082019050919050565b6000613aea6029836142ae565b9150613af582614a5d565b604082019050919050565b6000613b0d6020836142ae565b9150613b1882614aac565b602082019050919050565b6000613b30602c836142ae565b9150613b3b82614ad5565b604082019050919050565b6000613b536005836142bf565b9150613b5e82614b24565b600582019050919050565b6000613b76600e836142ae565b9150613b8182614b4d565b602082019050919050565b6000613b996029836142ae565b9150613ba482614b76565b604082019050919050565b6000613bbc602f836142ae565b9150613bc782614bc5565b604082019050919050565b6000613bdf6021836142ae565b9150613bea82614c14565b604082019050919050565b6000613c026031836142ae565b9150613c0d82614c63565b604082019050919050565b6000613c25602c836142ae565b9150613c3082614cb2565b604082019050919050565b6000613c486024836142ae565b9150613c5382614d01565b604082019050919050565b6000613c6b6017836142bf565b9150613c7682614d50565b601782019050919050565b6000613c8e6030836142ae565b9150613c9982614d79565b604082019050919050565b6000613cb16011836142bf565b9150613cbc82614dc8565b601182019050919050565b6000613cd4602f836142ae565b9150613cdf82614df1565b604082019050919050565b613cf381614453565b82525050565b6000613d058285613842565b9150613d118284613842565b91508190509392505050565b6000613d298284613842565b9150613d3482613b46565b915081905092915050565b6000613d4a82613c5e565b9150613d568285613842565b9150613d6182613ca4565b9150613d6d8284613842565b91508190509392505050565b6000602082019050613d8e60008301846137a3565b92915050565b6000608082019050613da960008301876137a3565b613db660208301866137a3565b613dc36040830185613cea565b8181036060830152613dd581846137d0565b905095945050505050565b6000604082019050613df560008301856137a3565b613e026020830184613cea565b9392505050565b6000602082019050613e1e60008301846137b2565b92915050565b6000602082019050613e3960008301846137c1565b92915050565b60006020820190508181036000830152613e598184613809565b905092915050565b60006040820190508181036000830152613e7b8185613873565b90508181036020830152613e8f8184613809565b90509392505050565b60006020820190508181036000830152613eb1816138f3565b9050919050565b60006020820190508181036000830152613ed181613916565b9050919050565b60006020820190508181036000830152613ef181613939565b9050919050565b60006020820190508181036000830152613f118161395c565b9050919050565b60006020820190508181036000830152613f318161397f565b9050919050565b60006020820190508181036000830152613f51816139a2565b9050919050565b60006020820190508181036000830152613f71816139c5565b9050919050565b60006020820190508181036000830152613f91816139e8565b9050919050565b60006020820190508181036000830152613fb181613a0b565b9050919050565b60006020820190508181036000830152613fd181613a2e565b9050919050565b60006020820190508181036000830152613ff181613a51565b9050919050565b6000602082019050818103600083015261401181613a74565b9050919050565b6000602082019050818103600083015261403181613a97565b9050919050565b6000602082019050818103600083015261405181613aba565b9050919050565b6000602082019050818103600083015261407181613add565b9050919050565b6000602082019050818103600083015261409181613b00565b9050919050565b600060208201905081810360008301526140b181613b23565b9050919050565b600060208201905081810360008301526140d181613b69565b9050919050565b600060208201905081810360008301526140f181613b8c565b9050919050565b6000602082019050818103600083015261411181613baf565b9050919050565b6000602082019050818103600083015261413181613bd2565b9050919050565b6000602082019050818103600083015261415181613bf5565b9050919050565b6000602082019050818103600083015261417181613c18565b9050919050565b6000602082019050818103600083015261419181613c3b565b9050919050565b600060208201905081810360008301526141b181613c81565b9050919050565b600060208201905081810360008301526141d181613cc7565b9050919050565b60006020820190506141ed6000830184613cea565b92915050565b60006040820190506142086000830185613cea565b6142156020830184613cea565b9392505050565b6000614226614237565b905061423282826144fb565b919050565b6000604051905090565b600067ffffffffffffffff82111561425c5761425b614691565b5b614265826146de565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006142d582614453565b91506142e083614453565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614315576143146145a6565b5b828201905092915050565b600061432b82614453565b915061433683614453565b925082614346576143456145d5565b5b828204905092915050565b600061435c82614453565b915061436783614453565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156143a05761439f6145a6565b5b828202905092915050565b60006143b682614453565b91506143c183614453565b9250828210156143d4576143d36145a6565b5b828203905092915050565b60006143ea82614433565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561448a57808201518184015260208101905061446f565b83811115614499576000848401525b50505050565b60006144aa82614453565b915060008214156144be576144bd6145a6565b5b600182039050919050565b600060028204905060018216806144e157607f821691505b602082108114156144f5576144f4614604565b5b50919050565b614504826146de565b810181811067ffffffffffffffff8211171561452357614522614691565b5b80604052505050565b600061453782614453565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561456a576145696145a6565b5b600182019050919050565b600061458082614453565b915061458b83614453565b92508261459b5761459a6145d5565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b7f4552433732315061757361626c653a20746f6b656e207472616e73666572207760008201527f68696c6520706175736564000000000000000000000000000000000000000000602082015250565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f43616c6c657220646f6573206e6f74206861766520746865204f574e45525f5260008201527f4f4c450000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f494e56414c49445f464545000000000000000000000000000000000000000000600082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f494e56414c49445f57414c4c4554000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f43616c6c657220646f6573206e6f74206861766520746865204d494e5445525f60008201527f524f4c4500000000000000000000000000000000000000000000000000000000602082015250565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b7f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656400000000000000000000000000000000602082015250565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b614e49816143df565b8114614e5457600080fd5b50565b614e60816143f1565b8114614e6b57600080fd5b50565b614e77816143fd565b8114614e8257600080fd5b50565b614e8e81614407565b8114614e9957600080fd5b50565b614ea581614453565b8114614eb057600080fd5b5056fea26469706673582212204762e828ee3a17a8b54626f8d8df3a0933a77f9f5cb5ef7af79e8a15447567af64736f6c6343000806003300000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000001200000000000000000000000002b885c6236f346716f4021663fa6e95d50a0f214000000000000000000000000000000000000000000000000000000000000138800000000000000000000000000000000000000000000000000000000000000134772656574696e67732066726f6d2047697a6100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000347464700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d54386b57356b316e456b4774647234466b766338364d416b6b555579584b5175777763396d4c6d46427753762f00000000000000000000
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102275760003560e01c80635c975abb11610130578063b8997a97116100b8578063d547741f1161007c578063d547741f14610661578063de836ebd1461067d578063e1a8bf2c14610699578063e58378bb146106b7578063e985e9c5146106d557610227565b8063b8997a97146105bd578063c87b56dd146105db578063cdeee6371461060b578063d3fc986414610627578063d53913931461064357610227565b806391d14854116100ff57806391d148541461051957806395d89b4114610549578063a217fddf14610567578063a22cb46514610585578063b88d4fde146105a157610227565b80635c975abb146104915780636352211e146104af57806370a08231146104df5780638456cb591461050f57610227565b80632f745c59116101b35780633f0d2ec1116101825780633f0d2ec1146104015780633f4ba83a1461041f57806342842e0e1461042957806342966c68146104455780634f6ccce71461046157610227565b80632f745c591461037d57806330176e13146103ad57806336568abe146103c95780633e4086e5146103e557610227565b806318160ddd116101fa57806318160ddd146102c657806323b872dd146102e4578063248a9ca3146103005780632a55205a146103305780632f2ff15d1461036157610227565b806301ffc9a71461022c57806306fdde031461025c578063081812fc1461027a578063095ea7b3146102aa575b600080fd5b6102466004803603810190610241919061368f565b610705565b6040516102539190613e09565b60405180910390f35b610264610717565b6040516102719190613e3f565b60405180910390f35b610294600480360381019061028f9190613736565b6107a9565b6040516102a19190613d79565b60405180910390f35b6102c460048036038101906102bf919061356e565b61082e565b005b6102ce610946565b6040516102db91906141d8565b60405180910390f35b6102fe60048036038101906102f991906133f8565b610953565b005b61031a60048036038101906103159190613622565b6109b3565b6040516103279190613e24565b60405180910390f35b61034a60048036038101906103459190613763565b6109d2565b604051610358929190613de0565b60405180910390f35b61037b6004803603810190610376919061364f565b610a1f565b005b6103976004803603810190610392919061356e565b610a48565b6040516103a491906141d8565b60405180910390f35b6103c760048036038101906103c291906136e9565b610aed565b005b6103e360048036038101906103de919061364f565b610bae565b005b6103ff60048036038101906103fa9190613736565b610c31565b005b610409610cad565b6040516104169190613d79565b60405180910390f35b610427610cd3565b005b610443600480360381019061043e91906133f8565b610d4d565b005b61045f600480360381019061045a9190613736565b610d6d565b005b61047b60048036038101906104769190613736565b610dc9565b60405161048891906141d8565b60405180910390f35b610499610e3a565b6040516104a69190613e09565b60405180910390f35b6104c960048036038101906104c49190613736565b610e51565b6040516104d69190613d79565b60405180910390f35b6104f960048036038101906104f4919061338b565b610f03565b60405161050691906141d8565b60405180910390f35b610517610fbb565b005b610533600480360381019061052e919061364f565b611035565b6040516105409190613e09565b60405180910390f35b61055161109f565b60405161055e9190613e3f565b60405180910390f35b61056f611131565b60405161057c9190613e24565b60405180910390f35b61059f600480360381019061059a919061352e565b611138565b005b6105bb60048036038101906105b6919061344b565b6112b9565b005b6105c561131b565b6040516105d291906141d8565b60405180910390f35b6105f560048036038101906105f09190613736565b611321565b6040516106029190613e3f565b60405180910390f35b6106256004803603810190610620919061338b565b611377565b005b610641600480360381019061063c91906135ae565b6113f3565b005b61064b611473565b6040516106589190613e24565b60405180910390f35b61067b6004803603810190610676919061364f565b611497565b005b610697600480360381019061069291906134ce565b6114c0565b005b6106a161157a565b6040516106ae91906141d8565b60405180910390f35b6106bf611581565b6040516106cc9190613e24565b60405180910390f35b6106ef60048036038101906106ea91906133b8565b6115a5565b6040516106fc9190613e09565b60405180910390f35b600061071082611639565b9050919050565b606060018054610726906144c9565b80601f0160208091040260200160405190810160405280929190818152602001828054610752906144c9565b801561079f5780601f106107745761010080835404028352916020019161079f565b820191906000526020600020905b81548152906001019060200180831161078257829003601f168201915b5050505050905090565b60006107b4826116b3565b6107f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107ea90614098565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061083982610e51565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156108aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108a190614118565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108c961171f565b73ffffffffffffffffffffffffffffffffffffffff1614806108f857506108f7816108f261171f565b6115a5565b5b610937576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161092e90613ff8565b60405180910390fd5b6109418383611727565b505050565b6000600980549050905090565b61096461095e61171f565b826117e0565b6109a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099a90614138565b60405180910390fd5b6109ae8383836118be565b505050565b6000806000838152602001908152602001600020600101549050919050565b600080600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16620186a0600c5485610a0a9190614351565b610a149190614320565b915091509250929050565b610a28826109b3565b610a3981610a3461171f565b611b1a565b610a438383611bb7565b505050565b6000610a5383610f03565b8210610a94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8b90613f18565b60405180910390fd5b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610b1e7fb19546dff01e856fb3f010c267a7b1c60363cf8a4664e21cc89c26224620214e610b1961171f565b611035565b610b5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5490613ef8565b60405180910390fd5b610baa82828080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611c97565b5050565b610bb661171f565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610c23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1a906141b8565b60405180910390fd5b610c2d8282611ceb565b5050565b610c627fb19546dff01e856fb3f010c267a7b1c60363cf8a4664e21cc89c26224620214e610c5d61171f565b611035565b610ca1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9890613ef8565b60405180910390fd5b610caa81611dcc565b50565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610d047fb19546dff01e856fb3f010c267a7b1c60363cf8a4664e21cc89c26224620214e610cff61171f565b611035565b610d43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3a90613ef8565b60405180910390fd5b610d4b611e57565b565b610d68838383604051806020016040528060008152506112b9565b505050565b610d7e610d7861171f565b826117e0565b610dbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db490614198565b60405180910390fd5b610dc681611ef9565b50565b6000610dd3610946565b8210610e14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0b90614158565b60405180910390fd5b60098281548110610e2857610e27614662565b5b90600052602060002001549050919050565b6000600b60009054906101000a900460ff16905090565b6000806003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610efa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef190614058565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610f74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6b90614018565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610fec7fb19546dff01e856fb3f010c267a7b1c60363cf8a4664e21cc89c26224620214e610fe761171f565b611035565b61102b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102290613ef8565b60405180910390fd5b61103361200a565b565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6060600280546110ae906144c9565b80601f01602080910402602001604051908101604052809291908181526020018280546110da906144c9565b80156111275780601f106110fc57610100808354040283529160200191611127565b820191906000526020600020905b81548152906001019060200180831161110a57829003601f168201915b5050505050905090565b6000801b81565b61114061171f565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156111ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a590613f98565b60405180910390fd5b80600660006111bb61171f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661126861171f565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516112ad9190613e09565b60405180910390a35050565b6112ca6112c461171f565b836117e0565b611309576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130090614138565b60405180910390fd5b611315848484846120ad565b50505050565b600c5481565b6060600061132e83612109565b9050600081511161134e576040518060200160405280600081525061136f565b8060405160200161135f9190613d1d565b6040516020818303038152906040525b915050919050565b6113a87fb19546dff01e856fb3f010c267a7b1c60363cf8a4664e21cc89c26224620214e6113a361171f565b611035565b6113e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113de90613ef8565b60405180910390fd5b6113f0816121b0565b50565b6114247f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a661141f61171f565b611035565b611463576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145a90614178565b60405180910390fd5b61146d84846122e0565b50505050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b6114a0826109b3565b6114b1816114ac61171f565b611b1a565b6114bb8383611ceb565b505050565b6114f17f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a66114ec61171f565b611035565b611530576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152790614178565b60405180910390fd5b60005b82829050811015611574576115618484848481811061155557611554614662565b5b905060200201356122e0565b808061156c9061452c565b915050611533565b50505050565b620186a081565b7fb19546dff01e856fb3f010c267a7b1c60363cf8a4664e21cc89c26224620214e81565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806116ac57506116ab826124ae565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661179a83610e51565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006117eb826116b3565b61182a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182190613fb8565b60405180910390fd5b600061183583610e51565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806118a457508373ffffffffffffffffffffffffffffffffffffffff1661188c846107a9565b73ffffffffffffffffffffffffffffffffffffffff16145b806118b557506118b481856115a5565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166118de82610e51565b73ffffffffffffffffffffffffffffffffffffffff1614611934576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192b906140d8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156119a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199b90613f78565b60405180910390fd5b6119af838383612590565b6119ba600082611727565b6001600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611a0a91906143ab565b925050819055506001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611a6191906142ca565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b611b248282611035565b611bb357611b498173ffffffffffffffffffffffffffffffffffffffff1660146125a0565b611b578360001c60206125a0565b604051602001611b68929190613d3f565b6040516020818303038152906040526040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611baa9190613e3f565b60405180910390fd5b5050565b611bc18282611035565b611c9357600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611c3861171f565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b7fc41b7cb64e5be01af4afc2641afc861432136270f4206b7773f229b658b96699600e82604051611cc9929190613e61565b60405180910390a180600e9080519060200190611ce792919061314e565b5050565b611cf58282611035565b15611dc857600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611d6d61171f565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b620186a0811115611e12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0990614038565b60405180910390fd5b7fc6e980a116c671cc344b1ed002b6f0c3454692ecb6cc881f3ce59366368cde4f600c5482604051611e459291906141f3565b60405180910390a180600c8190555050565b611e5f610e3a565b611e9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9590613ed8565b60405180910390fd5b6000600b60006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611ee261171f565b604051611eef9190613d79565b60405180910390a1565b6000611f0482610e51565b9050611f1281600084612590565b611f1d600083611727565b6001600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611f6d91906143ab565b925050819055506003600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b612012610e3a565b15612052576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204990613fd8565b60405180910390fd5b6001600b60006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861209661171f565b6040516120a39190613d79565b60405180910390a1565b6120b88484846118be565b6120c4848484846127dc565b612103576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120fa90613f38565b60405180910390fd5b50505050565b6060612114826116b3565b612153576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161214a906140f8565b60405180910390fd5b600061215d612973565b9050600081511161217d57604051806020016040528060008152506121a8565b8061218784612a05565b604051602001612198929190613cf9565b6040516020818303038152906040525b915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612220576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612217906140b8565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fa09dff055f1734e95d92880fc90368fd52bf88c41786aa2e24e2b34ae075452660405160405180910390a380600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612350576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161234790614078565b60405180910390fd5b612359816116b3565b15612399576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161239090613f58565b60405180910390fd5b6123a560008383612590565b6001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546123f591906142ca565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061257957507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612589575061258882612b66565b5b9050919050565b61259b838383612be0565b505050565b6060600060028360026125b39190614351565b6125bd91906142ca565b67ffffffffffffffff8111156125d6576125d5614691565b5b6040519080825280601f01601f1916602001820160405280156126085781602001600182028036833780820191505090505b5090507f3000000000000000000000000000000000000000000000000000000000000000816000815181106126405761263f614662565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f7800000000000000000000000000000000000000000000000000000000000000816001815181106126a4576126a3614662565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600060018460026126e49190614351565b6126ee91906142ca565b90505b600181111561278e577f3031323334353637383961626364656600000000000000000000000000000000600f8616601081106127305761272f614662565b5b1a60f81b82828151811061274757612746614662565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c9450806127879061449f565b90506126f1565b50600084146127d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127c990613e98565b60405180910390fd5b8091505092915050565b60006127fd8473ffffffffffffffffffffffffffffffffffffffff16612c38565b15612966578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261282661171f565b8786866040518563ffffffff1660e01b81526004016128489493929190613d94565b602060405180830381600087803b15801561286257600080fd5b505af192505050801561289357506040513d601f19601f8201168201806040525081019061289091906136bc565b60015b612916573d80600081146128c3576040519150601f19603f3d011682016040523d82523d6000602084013e6128c8565b606091505b5060008151141561290e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161290590613f38565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061296b565b600190505b949350505050565b6060600e8054612982906144c9565b80601f01602080910402602001604051908101604052809291908181526020018280546129ae906144c9565b80156129fb5780601f106129d0576101008083540402835291602001916129fb565b820191906000526020600020905b8154815290600101906020018083116129de57829003601f168201915b5050505050905090565b60606000821415612a4d576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612b61565b600082905060005b60008214612a7f578080612a689061452c565b915050600a82612a789190614320565b9150612a55565b60008167ffffffffffffffff811115612a9b57612a9a614691565b5b6040519080825280601f01601f191660200182016040528015612acd5781602001600182028036833780820191505090505b5090505b60008514612b5a57600182612ae691906143ab565b9150600a85612af59190614575565b6030612b0191906142ca565b60f81b818381518110612b1757612b16614662565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612b539190614320565b9450612ad1565b8093505050505b919050565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612bd95750612bd882612c4b565b5b9050919050565b612beb838383612cc5565b612bf3610e3a565b15612c33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c2a90613eb8565b60405180910390fd5b505050565b600080823b905060008111915050919050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612cbe5750612cbd82612dd9565b5b9050919050565b612cd0838383612e43565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612d1357612d0e81612e48565b612d52565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612d5157612d508382612e91565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612d9557612d9081612ffe565b612dd4565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612dd357612dd282826130cf565b5b5b505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b505050565b600980549050600a600083815260200190815260200160002081905550600981908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612e9e84610f03565b612ea891906143ab565b9050600060086000848152602001908152602001600020549050818114612f8d576000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816008600083815260200190815260200160002081905550505b6008600084815260200190815260200160002060009055600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160098054905061301291906143ab565b90506000600a600084815260200190815260200160002054905060006009838154811061304257613041614662565b5b90600052602060002001549050806009838154811061306457613063614662565b5b906000526020600020018190555081600a600083815260200190815260200160002081905550600a60008581526020019081526020016000206000905560098054806130b3576130b2614633565b5b6001900381819060005260206000200160009055905550505050565b60006130da83610f03565b905081600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806008600084815260200190815260200160002081905550505050565b82805461315a906144c9565b90600052602060002090601f01602090048101928261317c57600085556131c3565b82601f1061319557805160ff19168380011785556131c3565b828001600101855582156131c3579182015b828111156131c25782518255916020019190600101906131a7565b5b5090506131d091906131d4565b5090565b5b808211156131ed5760008160009055506001016131d5565b5090565b60006132046131ff84614241565b61421c565b9050828152602081018484840111156132205761321f6146cf565b5b61322b84828561445d565b509392505050565b60008135905061324281614e40565b92915050565b60008083601f84011261325e5761325d6146c5565b5b8235905067ffffffffffffffff81111561327b5761327a6146c0565b5b602083019150836020820283011115613297576132966146ca565b5b9250929050565b6000813590506132ad81614e57565b92915050565b6000813590506132c281614e6e565b92915050565b6000813590506132d781614e85565b92915050565b6000815190506132ec81614e85565b92915050565b600082601f830112613307576133066146c5565b5b81356133178482602086016131f1565b91505092915050565b60008083601f840112613336576133356146c5565b5b8235905067ffffffffffffffff811115613353576133526146c0565b5b60208301915083600182028301111561336f5761336e6146ca565b5b9250929050565b60008135905061338581614e9c565b92915050565b6000602082840312156133a1576133a06146d9565b5b60006133af84828501613233565b91505092915050565b600080604083850312156133cf576133ce6146d9565b5b60006133dd85828601613233565b92505060206133ee85828601613233565b9150509250929050565b600080600060608486031215613411576134106146d9565b5b600061341f86828701613233565b935050602061343086828701613233565b925050604061344186828701613376565b9150509250925092565b60008060008060808587031215613465576134646146d9565b5b600061347387828801613233565b945050602061348487828801613233565b935050604061349587828801613376565b925050606085013567ffffffffffffffff8111156134b6576134b56146d4565b5b6134c2878288016132f2565b91505092959194509250565b6000806000604084860312156134e7576134e66146d9565b5b60006134f586828701613233565b935050602084013567ffffffffffffffff811115613516576135156146d4565b5b61352286828701613248565b92509250509250925092565b60008060408385031215613545576135446146d9565b5b600061355385828601613233565b92505060206135648582860161329e565b9150509250929050565b60008060408385031215613585576135846146d9565b5b600061359385828601613233565b92505060206135a485828601613376565b9150509250929050565b600080600080606085870312156135c8576135c76146d9565b5b60006135d687828801613233565b94505060206135e787828801613376565b935050604085013567ffffffffffffffff811115613608576136076146d4565b5b61361487828801613320565b925092505092959194509250565b600060208284031215613638576136376146d9565b5b6000613646848285016132b3565b91505092915050565b60008060408385031215613666576136656146d9565b5b6000613674858286016132b3565b925050602061368585828601613233565b9150509250929050565b6000602082840312156136a5576136a46146d9565b5b60006136b3848285016132c8565b91505092915050565b6000602082840312156136d2576136d16146d9565b5b60006136e0848285016132dd565b91505092915050565b60008060208385031215613700576136ff6146d9565b5b600083013567ffffffffffffffff81111561371e5761371d6146d4565b5b61372a85828601613320565b92509250509250929050565b60006020828403121561374c5761374b6146d9565b5b600061375a84828501613376565b91505092915050565b6000806040838503121561377a576137796146d9565b5b600061378885828601613376565b925050602061379985828601613376565b9150509250929050565b6137ac816143df565b82525050565b6137bb816143f1565b82525050565b6137ca816143fd565b82525050565b60006137db82614287565b6137e5818561429d565b93506137f581856020860161446c565b6137fe816146de565b840191505092915050565b600061381482614292565b61381e81856142ae565b935061382e81856020860161446c565b613837816146de565b840191505092915050565b600061384d82614292565b61385781856142bf565b935061386781856020860161446c565b80840191505092915050565b60008154613880816144c9565b61388a81866142ae565b945060018216600081146138a557600181146138b7576138ea565b60ff19831686526020860193506138ea565b6138c085614272565b60005b838110156138e2578154818901526001820191506020810190506138c3565b808801955050505b50505092915050565b60006139006020836142ae565b915061390b826146ef565b602082019050919050565b6000613923602b836142ae565b915061392e82614718565b604082019050919050565b60006139466014836142ae565b915061395182614767565b602082019050919050565b60006139696023836142ae565b915061397482614790565b604082019050919050565b600061398c602b836142ae565b9150613997826147df565b604082019050919050565b60006139af6032836142ae565b91506139ba8261482e565b604082019050919050565b60006139d2601c836142ae565b91506139dd8261487d565b602082019050919050565b60006139f56024836142ae565b9150613a00826148a6565b604082019050919050565b6000613a186019836142ae565b9150613a23826148f5565b602082019050919050565b6000613a3b602c836142ae565b9150613a468261491e565b604082019050919050565b6000613a5e6010836142ae565b9150613a698261496d565b602082019050919050565b6000613a816038836142ae565b9150613a8c82614996565b604082019050919050565b6000613aa4602a836142ae565b9150613aaf826149e5565b604082019050919050565b6000613ac7600b836142ae565b9150613ad282614a34565b602082019050919050565b6000613aea6029836142ae565b9150613af582614a5d565b604082019050919050565b6000613b0d6020836142ae565b9150613b1882614aac565b602082019050919050565b6000613b30602c836142ae565b9150613b3b82614ad5565b604082019050919050565b6000613b536005836142bf565b9150613b5e82614b24565b600582019050919050565b6000613b76600e836142ae565b9150613b8182614b4d565b602082019050919050565b6000613b996029836142ae565b9150613ba482614b76565b604082019050919050565b6000613bbc602f836142ae565b9150613bc782614bc5565b604082019050919050565b6000613bdf6021836142ae565b9150613bea82614c14565b604082019050919050565b6000613c026031836142ae565b9150613c0d82614c63565b604082019050919050565b6000613c25602c836142ae565b9150613c3082614cb2565b604082019050919050565b6000613c486024836142ae565b9150613c5382614d01565b604082019050919050565b6000613c6b6017836142bf565b9150613c7682614d50565b601782019050919050565b6000613c8e6030836142ae565b9150613c9982614d79565b604082019050919050565b6000613cb16011836142bf565b9150613cbc82614dc8565b601182019050919050565b6000613cd4602f836142ae565b9150613cdf82614df1565b604082019050919050565b613cf381614453565b82525050565b6000613d058285613842565b9150613d118284613842565b91508190509392505050565b6000613d298284613842565b9150613d3482613b46565b915081905092915050565b6000613d4a82613c5e565b9150613d568285613842565b9150613d6182613ca4565b9150613d6d8284613842565b91508190509392505050565b6000602082019050613d8e60008301846137a3565b92915050565b6000608082019050613da960008301876137a3565b613db660208301866137a3565b613dc36040830185613cea565b8181036060830152613dd581846137d0565b905095945050505050565b6000604082019050613df560008301856137a3565b613e026020830184613cea565b9392505050565b6000602082019050613e1e60008301846137b2565b92915050565b6000602082019050613e3960008301846137c1565b92915050565b60006020820190508181036000830152613e598184613809565b905092915050565b60006040820190508181036000830152613e7b8185613873565b90508181036020830152613e8f8184613809565b90509392505050565b60006020820190508181036000830152613eb1816138f3565b9050919050565b60006020820190508181036000830152613ed181613916565b9050919050565b60006020820190508181036000830152613ef181613939565b9050919050565b60006020820190508181036000830152613f118161395c565b9050919050565b60006020820190508181036000830152613f318161397f565b9050919050565b60006020820190508181036000830152613f51816139a2565b9050919050565b60006020820190508181036000830152613f71816139c5565b9050919050565b60006020820190508181036000830152613f91816139e8565b9050919050565b60006020820190508181036000830152613fb181613a0b565b9050919050565b60006020820190508181036000830152613fd181613a2e565b9050919050565b60006020820190508181036000830152613ff181613a51565b9050919050565b6000602082019050818103600083015261401181613a74565b9050919050565b6000602082019050818103600083015261403181613a97565b9050919050565b6000602082019050818103600083015261405181613aba565b9050919050565b6000602082019050818103600083015261407181613add565b9050919050565b6000602082019050818103600083015261409181613b00565b9050919050565b600060208201905081810360008301526140b181613b23565b9050919050565b600060208201905081810360008301526140d181613b69565b9050919050565b600060208201905081810360008301526140f181613b8c565b9050919050565b6000602082019050818103600083015261411181613baf565b9050919050565b6000602082019050818103600083015261413181613bd2565b9050919050565b6000602082019050818103600083015261415181613bf5565b9050919050565b6000602082019050818103600083015261417181613c18565b9050919050565b6000602082019050818103600083015261419181613c3b565b9050919050565b600060208201905081810360008301526141b181613c81565b9050919050565b600060208201905081810360008301526141d181613cc7565b9050919050565b60006020820190506141ed6000830184613cea565b92915050565b60006040820190506142086000830185613cea565b6142156020830184613cea565b9392505050565b6000614226614237565b905061423282826144fb565b919050565b6000604051905090565b600067ffffffffffffffff82111561425c5761425b614691565b5b614265826146de565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006142d582614453565b91506142e083614453565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614315576143146145a6565b5b828201905092915050565b600061432b82614453565b915061433683614453565b925082614346576143456145d5565b5b828204905092915050565b600061435c82614453565b915061436783614453565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156143a05761439f6145a6565b5b828202905092915050565b60006143b682614453565b91506143c183614453565b9250828210156143d4576143d36145a6565b5b828203905092915050565b60006143ea82614433565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561448a57808201518184015260208101905061446f565b83811115614499576000848401525b50505050565b60006144aa82614453565b915060008214156144be576144bd6145a6565b5b600182039050919050565b600060028204905060018216806144e157607f821691505b602082108114156144f5576144f4614604565b5b50919050565b614504826146de565b810181811067ffffffffffffffff8211171561452357614522614691565b5b80604052505050565b600061453782614453565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561456a576145696145a6565b5b600182019050919050565b600061458082614453565b915061458b83614453565b92508261459b5761459a6145d5565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b7f4552433732315061757361626c653a20746f6b656e207472616e73666572207760008201527f68696c6520706175736564000000000000000000000000000000000000000000602082015250565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f43616c6c657220646f6573206e6f74206861766520746865204f574e45525f5260008201527f4f4c450000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f494e56414c49445f464545000000000000000000000000000000000000000000600082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f494e56414c49445f57414c4c4554000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f43616c6c657220646f6573206e6f74206861766520746865204d494e5445525f60008201527f524f4c4500000000000000000000000000000000000000000000000000000000602082015250565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b7f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656400000000000000000000000000000000602082015250565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b614e49816143df565b8114614e5457600080fd5b50565b614e60816143f1565b8114614e6b57600080fd5b50565b614e77816143fd565b8114614e8257600080fd5b50565b614e8e81614407565b8114614e9957600080fd5b50565b614ea581614453565b8114614eb057600080fd5b5056fea26469706673582212204762e828ee3a17a8b54626f8d8df3a0933a77f9f5cb5ef7af79e8a15447567af64736f6c63430008060033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000001200000000000000000000000002b885c6236f346716f4021663fa6e95d50a0f214000000000000000000000000000000000000000000000000000000000000138800000000000000000000000000000000000000000000000000000000000000134772656574696e67732066726f6d2047697a6100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000347464700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d54386b57356b316e456b4774647234466b766338364d416b6b555579584b5175777763396d4c6d46427753762f00000000000000000000
-----Decoded View---------------
Arg [0] : _name (string): Greetings from Giza
Arg [1] : _symbol (string): GFG
Arg [2] : _uri (string): ipfs://QmT8kW5k1nEkGtdr4Fkvc86MAkkUUyXKQuwwc9mLmFBwSv/
Arg [3] : _royaltyWallet (address): 0x2B885c6236f346716f4021663Fa6E95d50A0F214
Arg [4] : _royaltyFee (uint256): 5000
-----Encoded View---------------
12 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [3] : 0000000000000000000000002b885c6236f346716f4021663fa6e95d50a0f214
Arg [4] : 0000000000000000000000000000000000000000000000000000000000001388
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000013
Arg [6] : 4772656574696e67732066726f6d2047697a6100000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [8] : 4746470000000000000000000000000000000000000000000000000000000000
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000036
Arg [10] : 697066733a2f2f516d54386b57356b316e456b4774647234466b766338364d41
Arg [11] : 6b6b555579584b5175777763396d4c6d46427753762f00000000000000000000
Deployed Bytecode Sourcemap
53908:5635:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58404:212;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30597:94;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32120:239;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31685:377;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43789:107;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33030:332;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;11293:117;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57692:334;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;11650:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43426:295;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56919:100;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;12682:229;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57423:104;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54475:28;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56770:62;;;:::i;:::-;;33425:165;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49479:252;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43965:272;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50772:80;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30285:253;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30005:226;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56656:58;;;:::i;:::-;;10297:156;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30752:98;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9400:49;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32423:299;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33653:321;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54445:25;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58158:240;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57170:116;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56456:146;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54315:62;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12039:166;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55981:200;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54384:56;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54250:60;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32785:186;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58404:212;58551:4;58574:36;58598:11;58574:23;:36::i;:::-;58567:43;;58404:212;;;:::o;30597:94::-;30651:13;30680:5;30673:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30597:94;:::o;32120:239::-;32221:7;32248:16;32256:7;32248;:16::i;:::-;32240:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;32329:15;:24;32345:7;32329:24;;;;;;;;;;;;;;;;;;;;;32322:31;;32120:239;;;:::o;31685:377::-;31762:13;31778:23;31793:7;31778:14;:23::i;:::-;31762:39;;31822:5;31816:11;;:2;:11;;;;31808:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;31906:5;31890:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;31915:37;31932:5;31939:12;:10;:12::i;:::-;31915:16;:37::i;:::-;31890:62;31874:152;;;;;;;;;;;;:::i;:::-;;;;;;;;;32035:21;32044:2;32048:7;32035:8;:21::i;:::-;31755:307;31685:377;;:::o;43789:107::-;43850:7;43873:10;:17;;;;43866:24;;43789:107;:::o;33030:332::-;33211:41;33230:12;:10;:12::i;:::-;33244:7;33211:18;:41::i;:::-;33195:124;;;;;;;;;;;;:::i;:::-;;;;;;;;;33328:28;33338:4;33344:2;33348:7;33328:9;:28::i;:::-;33030:332;;;:::o;11293:117::-;11359:7;11382:6;:12;11389:4;11382:12;;;;;;;;;;;:22;;;11375:29;;11293:117;;;:::o;57692:334::-;57880:7;57908;57958:13;;;;;;;;;;;54434:6;57982:10;;57974:5;:18;;;;:::i;:::-;57973:46;;;;:::i;:::-;57950:70;;;;57692:334;;;;;:::o;11650:164::-;11753:18;11766:4;11753:12;:18::i;:::-;9865:30;9876:4;9882:12;:10;:12::i;:::-;9865:10;:30::i;:::-;11783:25:::1;11794:4;11800:7;11783:10;:25::i;:::-;11650:164:::0;;;:::o;43426:295::-;43548:7;43591:23;43608:5;43591:16;:23::i;:::-;43583:5;:31;43567:108;;;;;;;;;;;;:::i;:::-;;;;;;;;;43689:12;:19;43702:5;43689:19;;;;;;;;;;;;;;;:26;43709:5;43689:26;;;;;;;;;;;;43682:33;;43426:295;;;;:::o;56919:100::-;55393:33;54287:23;55413:12;:10;:12::i;:::-;55393:7;:33::i;:::-;55377:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;56992:21:::1;57009:3;;56992:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:16;:21::i;:::-;56919:100:::0;;:::o;12682:229::-;12793:12;:10;:12::i;:::-;12782:23;;:7;:23;;;12766:104;;;;;;;;;;;;:::i;:::-;;;;;;;;;12879:26;12891:4;12897:7;12879:11;:26::i;:::-;12682:229;;:::o;57423:104::-;55393:33;54287:23;55413:12;:10;:12::i;:::-;55393:7;:33::i;:::-;55377:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;57494:27:::1;57509:11;57494:14;:27::i;:::-;57423:104:::0;:::o;54475:28::-;;;;;;;;;;;;;:::o;56770:62::-;55393:33;54287:23;55413:12;:10;:12::i;:::-;55393:7;:33::i;:::-;55377:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;56816:10:::1;:8;:10::i;:::-;56770:62::o:0;33425:165::-;33545:39;33562:4;33568:2;33572:7;33545:39;;;;;;;;;;;;:16;:39::i;:::-;33425:165;;;:::o;49479:252::-;49597:41;49616:12;:10;:12::i;:::-;49630:7;49597:18;:41::i;:::-;49581:123;;;;;;;;;;;;:::i;:::-;;;;;;;;;49711:14;49717:7;49711:5;:14::i;:::-;49479:252;:::o;43965:272::-;44065:7;44108:30;:28;:30::i;:::-;44100:5;:38;44084:116;;;;;;;;;;;;:::i;:::-;;;;;;;;;44214:10;44225:5;44214:17;;;;;;;;:::i;:::-;;;;;;;;;;44207:24;;43965:272;;;:::o;50772:80::-;50819:4;50839:7;;;;;;;;;;;50832:14;;50772:80;:::o;30285:253::-;30382:7;30401:13;30417:7;:16;30425:7;30417:16;;;;;;;;;;;;;;;;;;;;;30401:32;;30465:1;30448:19;;:5;:19;;;;30440:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;30527:5;30520:12;;;30285:253;;;:::o;30005:226::-;30102:7;30146:1;30129:19;;:5;:19;;;;30121:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;30209:9;:16;30219:5;30209:16;;;;;;;;;;;;;;;;30202:23;;30005:226;;;:::o;56656:58::-;55393:33;54287:23;55413:12;:10;:12::i;:::-;55393:7;:33::i;:::-;55377:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;56700:8:::1;:6;:8::i;:::-;56656:58::o:0;10297:156::-;10395:4;10418:6;:12;10425:4;10418:12;;;;;;;;;;;:20;;:29;10439:7;10418:29;;;;;;;;;;;;;;;;;;;;;;;;;10411:36;;10297:156;;;;:::o;30752:98::-;30808:13;30837:7;30830:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30752:98;:::o;9400:49::-;9445:4;9400:49;;;:::o;32423:299::-;32552:12;:10;:12::i;:::-;32540:24;;:8;:24;;;;32532:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;32648:8;32603:18;:32;32622:12;:10;:12::i;:::-;32603:32;;;;;;;;;;;;;;;:42;32636:8;32603:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;32697:8;32668:48;;32683:12;:10;:12::i;:::-;32668:48;;;32707:8;32668:48;;;;;;:::i;:::-;;;;;;;;32423:299;;:::o;33653:321::-;33814:41;33833:12;:10;:12::i;:::-;33847:7;33814:18;:41::i;:::-;33798:124;;;;;;;;;;;;:::i;:::-;;;;;;;;;33929:39;33943:4;33949:2;33953:7;33962:5;33929:13;:39::i;:::-;33653:321;;;;:::o;54445:25::-;;;;:::o;58158:240::-;58243:13;58268:17;58288:23;58303:7;58288:14;:23::i;:::-;58268:43;;58345:1;58331:3;58325:17;:21;:67;;;;;;;;;;;;;;;;;58373:3;58356:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;58325:67;58318:74;;;58158:240;;;:::o;57170:116::-;55393:33;54287:23;55413:12;:10;:12::i;:::-;55393:7;:33::i;:::-;55377:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;57247:33:::1;57265:14;57247:17;:33::i;:::-;57170:116:::0;:::o;56456:146::-;55678:34;54353:24;55699:12;:10;:12::i;:::-;55678:7;:34::i;:::-;55662:104;;;;;;;;;;;;:::i;:::-;;;;;;;;;56571:25:::1;56577:9;56588:7;56571:5;:25::i;:::-;56456:146:::0;;;;:::o;54315:62::-;54353:24;54315:62;:::o;12039:166::-;12143:18;12156:4;12143:12;:18::i;:::-;9865:30;9876:4;9882:12;:10;:12::i;:::-;9865:10;:30::i;:::-;12173:26:::1;12185:4;12191:7;12173:11;:26::i;:::-;12039:166:::0;;;:::o;55981:200::-;55678:34;54353:24;55699:12;:10;:12::i;:::-;55678:7;:34::i;:::-;55662:104;;;;;;;;;;;;:::i;:::-;;;;;;;;;56089:9:::1;56084:92;56108:8;;:15;;56104:1;:19;56084:92;;;56139:29;56145:9;56156:8;;56165:1;56156:11;;;;;;;:::i;:::-;;;;;;;;56139:5;:29::i;:::-;56125:3;;;;;:::i;:::-;;;;56084:92;;;;55981:200:::0;;;:::o;54384:56::-;54434:6;54384:56;:::o;54250:60::-;54287:23;54250:60;:::o;32785:186::-;32907:4;32930:18;:25;32949:5;32930:25;;;;;;;;;;;;;;;:35;32956:8;32930:35;;;;;;;;;;;;;;;;;;;;;;;;;32923:42;;32785:186;;;;:::o;43090:260::-;43217:4;43262:35;43247:50;;;:11;:50;;;;:97;;;;43308:36;43332:11;43308:23;:36::i;:::-;43247:97;43233:111;;43090:260;;;:::o;35421:121::-;35486:4;35534:1;35506:30;;:7;:16;35514:7;35506:16;;;;;;;;;;;;;;;;;;;;;:30;;;;35499:37;;35421:121;;;:::o;3623:92::-;3676:7;3699:10;3692:17;;3623:92;:::o;39155:164::-;39253:2;39226:15;:24;39242:7;39226:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;39305:7;39301:2;39267:46;;39276:23;39291:7;39276:14;:23::i;:::-;39267:46;;;;;;;;;;;;39155:164;;:::o;35693:371::-;35806:4;35830:16;35838:7;35830;:16::i;:::-;35822:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;35902:13;35918:23;35933:7;35918:14;:23::i;:::-;35902:39;;35967:5;35956:16;;:7;:16;;;:58;;;;36007:7;35983:31;;:20;35995:7;35983:11;:20::i;:::-;:31;;;35956:58;:101;;;;36025:32;36042:5;36049:7;36025:16;:32::i;:::-;35956:101;35948:110;;;35693:371;;;;:::o;38502:547::-;38651:4;38624:31;;:23;38639:7;38624:14;:23::i;:::-;:31;;;38608:106;;;;;;;;;;;;:::i;:::-;;;;;;;;;38743:1;38729:16;;:2;:16;;;;38721:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;38795:39;38816:4;38822:2;38826:7;38795:20;:39::i;:::-;38891:29;38908:1;38912:7;38891:8;:29::i;:::-;38948:1;38929:9;:15;38939:4;38929:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;38973:1;38956:9;:13;38966:2;38956:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;39000:2;38981:7;:16;38989:7;38981:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;39035:7;39031:2;39016:27;;39025:4;39016:27;;;;;;;;;;;;38502:547;;;:::o;10727:391::-;10804:22;10812:4;10818:7;10804;:22::i;:::-;10799:314;;10944:41;10972:7;10944:41;;10982:2;10944:19;:41::i;:::-;11034:38;11062:4;11054:13;;11069:2;11034:19;:38::i;:::-;10873:212;;;;;;;;;:::i;:::-;;;;;;;;;;;;;10837:268;;;;;;;;;;;:::i;:::-;;;;;;;;10799:314;10727:391;;:::o;13929:207::-;14000:22;14008:4;14014:7;14000;:22::i;:::-;13995:136;;14065:4;14033:6;:12;14040:4;14033:12;;;;;;;;;;;:20;;:29;14054:7;14033:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;14110:12;:10;:12::i;:::-;14083:40;;14101:7;14083:40;;14095:4;14083:40;;;;;;;;;;13995:136;13929:207;;:::o;58839:141::-;58908:37;58923:13;58938:6;58908:37;;;;;;;:::i;:::-;;;;;;;;58968:6;58952:13;:22;;;;;;;;;;;;:::i;:::-;;58839:141;:::o;14142:208::-;14213:22;14221:4;14227:7;14213;:22::i;:::-;14209:136;;;14278:5;14246:6;:12;14253:4;14246:12;;;;;;;;;;;:20;;:29;14267:7;14246:29;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;14324:12;:10;:12::i;:::-;14297:40;;14315:7;14297:40;;14309:4;14297:40;;;;;;;;;;14209:136;14142:208;;:::o;59220:214::-;54434:6;59289:11;:38;;59281:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;59355:42;59373:10;;59385:11;59355:42;;;;;;;:::i;:::-;;;;;;;;59417:11;59404:10;:24;;;;59220:214;:::o;51731:110::-;51323:8;:6;:8::i;:::-;51315:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;51796:5:::1;51786:7;;:15;;;;;;;;;;;;;;;;;;51813:22;51822:12;:10;:12::i;:::-;51813:22;;;;;;:::i;:::-;;;;;;;;51731:110::o:0;37859:330::-;37915:13;37931:23;37946:7;37931:14;:23::i;:::-;37915:39;;37963:48;37984:5;37999:1;38003:7;37963:20;:48::i;:::-;38044:29;38061:1;38065:7;38044:8;:29::i;:::-;38102:1;38082:9;:16;38092:5;38082:16;;;;;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;38117:7;:16;38125:7;38117:16;;;;;;;;;;;;38110:23;;;;;;;;;;;38175:7;38171:1;38147:36;;38156:5;38147:36;;;;;;;;;;;;37908:281;37859:330;:::o;51498:108::-;51072:8;:6;:8::i;:::-;51071:9;51063:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;51564:4:::1;51554:7;;:14;;;;;;;;;;;;;;;;;;51580:20;51587:12;:10;:12::i;:::-;51580:20;;;;;;:::i;:::-;;;;;;;;51498:108::o:0;34818:308::-;34953:28;34963:4;34969:2;34973:7;34953:9;:28::i;:::-;35004:48;35027:4;35033:2;35037:7;35046:5;35004:22;:48::i;:::-;34988:132;;;;;;;;;;;;:::i;:::-;;;;;;;;;34818:308;;;;:::o;30913:394::-;31011:13;31052:16;31060:7;31052;:16::i;:::-;31036:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;31142:21;31166:10;:8;:10::i;:::-;31142:34;;31221:1;31203:7;31197:21;:25;:104;;;;;;;;;;;;;;;;;31258:7;31267:18;:7;:16;:18::i;:::-;31241:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;31197:104;31183:118;;;30913:394;;;:::o;58986:228::-;59087:1;59061:28;;:14;:28;;;;59053:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;59156:14;59120:51;;59141:13;;;;;;;;;;;59120:51;;;;;;;;;;;;59194:14;59178:13;;:30;;;;;;;;;;;;;;;;;;58986:228;:::o;37296:356::-;37386:1;37372:16;;:2;:16;;;;37364:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;37441:16;37449:7;37441;:16::i;:::-;37440:17;37432:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;37499:45;37528:1;37532:2;37536:7;37499:20;:45::i;:::-;37570:1;37553:9;:13;37563:2;37553:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;37597:2;37578:7;:16;37586:7;37578:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;37638:7;37634:2;37613:33;;37630:1;37613:33;;;;;;;;;;;;37296:356;;:::o;29640:309::-;29767:4;29812:25;29797:40;;;:11;:40;;;;:99;;;;29863:33;29848:48;;;:11;:48;;;;29797:99;:146;;;;29907:36;29931:11;29907:23;:36::i;:::-;29797:146;29783:160;;29640:309;;;:::o;58622:211::-;58782:45;58809:4;58815:2;58819:7;58782:26;:45::i;:::-;58622:211;;;:::o;5277:427::-;5367:13;5392:19;5437:1;5428:6;5424:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;5414:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5392:47;;5446:15;:6;5453:1;5446:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;5468;:6;5475:1;5468:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;5495:9;5520:1;5511:6;5507:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;5495:26;;5490:119;5527:1;5523;:5;5490:119;;;5556:12;5577:3;5569:5;:11;5556:25;;;;;;;:::i;:::-;;;;;5544:6;5551:1;5544:9;;;;;;;;:::i;:::-;;;;;:37;;;;;;;;;;;5600:1;5590:11;;;;;5530:3;;;;:::i;:::-;;;5490:119;;;;5632:1;5623:5;:10;5615:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;5691:6;5677:21;;;5277:427;;;;:::o;39862:685::-;39999:4;40016:15;:2;:13;;;:15::i;:::-;40012:530;;;40071:2;40055:36;;;40092:12;:10;:12::i;:::-;40106:4;40112:7;40121:5;40055:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;40042:459;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40299:1;40282:6;:13;:18;40278:214;;;40315:60;;;;;;;;;;:::i;:::-;;;;;;;;40278:214;40460:6;40454:13;40445:6;40441:2;40437:15;40430:38;40042:459;40187:41;;;40177:51;;;:6;:51;;;;40170:58;;;;;40012:530;40530:4;40523:11;;39862:685;;;;;;;:::o;59440:100::-;59492:13;59521;59514:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59440:100;:::o;4126:637::-;4182:13;4400:1;4391:5;:10;4387:43;;;4412:10;;;;;;;;;;;;;;;;;;;;;4387:43;4436:12;4451:5;4436:20;;4463:14;4484:62;4499:1;4491:4;:9;4484:62;;4511:8;;;;;:::i;:::-;;;;4536:2;4528:10;;;;;:::i;:::-;;;4484:62;;;4552:19;4584:6;4574:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4552:39;;4598:132;4614:1;4605:5;:10;4598:132;;4636:1;4626:11;;;;;:::i;:::-;;;4697:2;4689:5;:10;;;;:::i;:::-;4676:2;:24;;;;:::i;:::-;4663:39;;4646:6;4653;4646:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;4720:2;4711:11;;;;;:::i;:::-;;;4598:132;;;4750:6;4736:21;;;;;4126:637;;;;:::o;53630:242::-;53748:4;53793:26;53778:41;;;:11;:41;;;;:88;;;;53830:36;53854:11;53830:23;:36::i;:::-;53778:88;53764:102;;53630:242;;;:::o;52429:251::-;52555:45;52582:4;52588:2;52592:7;52555:26;:45::i;:::-;52618:8;:6;:8::i;:::-;52617:9;52609:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;52429:251;;;:::o;21355:351::-;21415:4;21607:12;21664:7;21652:20;21644:28;;21699:1;21692:4;:8;21685:15;;;21355:351;;;:::o;9973:240::-;10083:4;10128:32;10113:47;;;:11;:47;;;;:94;;;;10171:36;10195:11;10171:23;:36::i;:::-;10113:94;10099:108;;9973:240;;;:::o;44818:521::-;44944:45;44971:4;44977:2;44981:7;44944:26;:45::i;:::-;45018:1;45002:18;;:4;:18;;;44998:167;;;45031:40;45063:7;45031:31;:40::i;:::-;44998:167;;;45097:2;45089:10;;:4;:10;;;45085:80;;45110:47;45143:4;45149:7;45110:32;:47::i;:::-;45085:80;44998:167;45189:1;45175:16;;:2;:16;;;45171:163;;;45202:45;45239:7;45202:36;:45::i;:::-;45171:163;;;45271:4;45265:10;;:2;:10;;;45261:73;;45286:40;45314:2;45318:7;45286:27;:40::i;:::-;45261:73;45171:163;44818:521;;;:::o;7334:179::-;7444:4;7482:25;7467:40;;;:11;:40;;;;7460:47;;7334:179;;;:::o;41089:112::-;;;;:::o;46026:154::-;46126:10;:17;;;;46099:15;:24;46115:7;46099:24;;;;;;;;;;;:44;;;;46150:10;46166:7;46150:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46026:154;:::o;46789:936::-;47051:22;47101:1;47076:22;47093:4;47076:16;:22::i;:::-;:26;;;;:::i;:::-;47051:51;;47109:18;47130:17;:26;47148:7;47130:26;;;;;;;;;;;;47109:47;;47269:14;47255:10;:28;47251:306;;47294:19;47316:12;:18;47329:4;47316:18;;;;;;;;;;;;;;;:34;47335:14;47316:34;;;;;;;;;;;;47294:56;;47394:11;47361:12;:18;47374:4;47361:18;;;;;;;;;;;;;;;:30;47380:10;47361:30;;;;;;;;;;;:44;;;;47505:10;47472:17;:30;47490:11;47472:30;;;;;;;;;;;:43;;;;47285:272;47251:306;47645:17;:26;47663:7;47645:26;;;;;;;;;;;47638:33;;;47685:12;:18;47698:4;47685:18;;;;;;;;;;;;;;;:34;47704:14;47685:34;;;;;;;;;;;47678:41;;;46878:847;;46789:936;;:::o;48008:1025::-;48249:22;48294:1;48274:10;:17;;;;:21;;;;:::i;:::-;48249:46;;48302:18;48323:15;:24;48339:7;48323:24;;;;;;;;;;;;48302:45;;48658:19;48680:10;48691:14;48680:26;;;;;;;;:::i;:::-;;;;;;;;;;48658:48;;48740:11;48715:10;48726;48715:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;48847:10;48816:15;:28;48832:11;48816:28;;;;;;;;;;;:41;;;;48980:15;:24;48996:7;48980:24;;;;;;;;;;;48973:31;;;49011:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;48079:954;;;48008:1025;:::o;45628:207::-;45709:14;45726:20;45743:2;45726:16;:20::i;:::-;45709:37;;45780:7;45753:12;:16;45766:2;45753:16;;;;;;;;;;;;;;;:24;45770:6;45753:24;;;;;;;;;;;:34;;;;45823:6;45794:17;:26;45812:7;45794:26;;;;;;;;;;;:35;;;;45702:133;45628:207;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:2;;;280:79;;:::i;:::-;249:2;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;;;;;;:::o;423:139::-;469:5;507:6;494:20;485:29;;523:33;550:5;523:33;:::i;:::-;475:87;;;;:::o;585:568::-;658:8;668:6;718:3;711:4;703:6;699:17;695:27;685:2;;726:79;;:::i;:::-;685:2;839:6;826:20;816:30;;869:18;861:6;858:30;855:2;;;891:79;;:::i;:::-;855:2;1005:4;997:6;993:17;981:29;;1059:3;1051:4;1043:6;1039:17;1029:8;1025:32;1022:41;1019:2;;;1066:79;;:::i;:::-;1019:2;675:478;;;;;:::o;1159:133::-;1202:5;1240:6;1227:20;1218:29;;1256:30;1280:5;1256:30;:::i;:::-;1208:84;;;;:::o;1298:139::-;1344:5;1382:6;1369:20;1360:29;;1398:33;1425:5;1398:33;:::i;:::-;1350:87;;;;:::o;1443:137::-;1488:5;1526:6;1513:20;1504:29;;1542:32;1568:5;1542:32;:::i;:::-;1494:86;;;;:::o;1586:141::-;1642:5;1673:6;1667:13;1658:22;;1689:32;1715:5;1689:32;:::i;:::-;1648:79;;;;:::o;1746:338::-;1801:5;1850:3;1843:4;1835:6;1831:17;1827:27;1817:2;;1858:79;;:::i;:::-;1817:2;1975:6;1962:20;2000:78;2074:3;2066:6;2059:4;2051:6;2047:17;2000:78;:::i;:::-;1991:87;;1807:277;;;;;:::o;2104:553::-;2162:8;2172:6;2222:3;2215:4;2207:6;2203:17;2199:27;2189:2;;2230:79;;:::i;:::-;2189:2;2343:6;2330:20;2320:30;;2373:18;2365:6;2362:30;2359:2;;;2395:79;;:::i;:::-;2359:2;2509:4;2501:6;2497:17;2485:29;;2563:3;2555:4;2547:6;2543:17;2533:8;2529:32;2526:41;2523:2;;;2570:79;;:::i;:::-;2523:2;2179:478;;;;;:::o;2663:139::-;2709:5;2747:6;2734:20;2725:29;;2763:33;2790:5;2763:33;:::i;:::-;2715:87;;;;:::o;2808:329::-;2867:6;2916:2;2904:9;2895:7;2891:23;2887:32;2884:2;;;2922:79;;:::i;:::-;2884:2;3042:1;3067:53;3112:7;3103:6;3092:9;3088:22;3067:53;:::i;:::-;3057:63;;3013:117;2874:263;;;;:::o;3143:474::-;3211:6;3219;3268:2;3256:9;3247:7;3243:23;3239:32;3236:2;;;3274:79;;:::i;:::-;3236:2;3394:1;3419:53;3464:7;3455:6;3444:9;3440:22;3419:53;:::i;:::-;3409:63;;3365:117;3521:2;3547:53;3592:7;3583:6;3572:9;3568:22;3547:53;:::i;:::-;3537:63;;3492:118;3226:391;;;;;:::o;3623:619::-;3700:6;3708;3716;3765:2;3753:9;3744:7;3740:23;3736:32;3733:2;;;3771:79;;:::i;:::-;3733:2;3891:1;3916:53;3961:7;3952:6;3941:9;3937:22;3916:53;:::i;:::-;3906:63;;3862:117;4018:2;4044:53;4089:7;4080:6;4069:9;4065:22;4044:53;:::i;:::-;4034:63;;3989:118;4146:2;4172:53;4217:7;4208:6;4197:9;4193:22;4172:53;:::i;:::-;4162:63;;4117:118;3723:519;;;;;:::o;4248:943::-;4343:6;4351;4359;4367;4416:3;4404:9;4395:7;4391:23;4387:33;4384:2;;;4423:79;;:::i;:::-;4384:2;4543:1;4568:53;4613:7;4604:6;4593:9;4589:22;4568:53;:::i;:::-;4558:63;;4514:117;4670:2;4696:53;4741:7;4732:6;4721:9;4717:22;4696:53;:::i;:::-;4686:63;;4641:118;4798:2;4824:53;4869:7;4860:6;4849:9;4845:22;4824:53;:::i;:::-;4814:63;;4769:118;4954:2;4943:9;4939:18;4926:32;4985:18;4977:6;4974:30;4971:2;;;5007:79;;:::i;:::-;4971:2;5112:62;5166:7;5157:6;5146:9;5142:22;5112:62;:::i;:::-;5102:72;;4897:287;4374:817;;;;;;;:::o;5197:704::-;5292:6;5300;5308;5357:2;5345:9;5336:7;5332:23;5328:32;5325:2;;;5363:79;;:::i;:::-;5325:2;5483:1;5508:53;5553:7;5544:6;5533:9;5529:22;5508:53;:::i;:::-;5498:63;;5454:117;5638:2;5627:9;5623:18;5610:32;5669:18;5661:6;5658:30;5655:2;;;5691:79;;:::i;:::-;5655:2;5804:80;5876:7;5867:6;5856:9;5852:22;5804:80;:::i;:::-;5786:98;;;;5581:313;5315:586;;;;;:::o;5907:468::-;5972:6;5980;6029:2;6017:9;6008:7;6004:23;6000:32;5997:2;;;6035:79;;:::i;:::-;5997:2;6155:1;6180:53;6225:7;6216:6;6205:9;6201:22;6180:53;:::i;:::-;6170:63;;6126:117;6282:2;6308:50;6350:7;6341:6;6330:9;6326:22;6308:50;:::i;:::-;6298:60;;6253:115;5987:388;;;;;:::o;6381:474::-;6449:6;6457;6506:2;6494:9;6485:7;6481:23;6477:32;6474:2;;;6512:79;;:::i;:::-;6474:2;6632:1;6657:53;6702:7;6693:6;6682:9;6678:22;6657:53;:::i;:::-;6647:63;;6603:117;6759:2;6785:53;6830:7;6821:6;6810:9;6806:22;6785:53;:::i;:::-;6775:63;;6730:118;6464:391;;;;;:::o;6861:819::-;6950:6;6958;6966;6974;7023:2;7011:9;7002:7;6998:23;6994:32;6991:2;;;7029:79;;:::i;:::-;6991:2;7149:1;7174:53;7219:7;7210:6;7199:9;7195:22;7174:53;:::i;:::-;7164:63;;7120:117;7276:2;7302:53;7347:7;7338:6;7327:9;7323:22;7302:53;:::i;:::-;7292:63;;7247:118;7432:2;7421:9;7417:18;7404:32;7463:18;7455:6;7452:30;7449:2;;;7485:79;;:::i;:::-;7449:2;7598:65;7655:7;7646:6;7635:9;7631:22;7598:65;:::i;:::-;7580:83;;;;7375:298;6981:699;;;;;;;:::o;7686:329::-;7745:6;7794:2;7782:9;7773:7;7769:23;7765:32;7762:2;;;7800:79;;:::i;:::-;7762:2;7920:1;7945:53;7990:7;7981:6;7970:9;7966:22;7945:53;:::i;:::-;7935:63;;7891:117;7752:263;;;;:::o;8021:474::-;8089:6;8097;8146:2;8134:9;8125:7;8121:23;8117:32;8114:2;;;8152:79;;:::i;:::-;8114:2;8272:1;8297:53;8342:7;8333:6;8322:9;8318:22;8297:53;:::i;:::-;8287:63;;8243:117;8399:2;8425:53;8470:7;8461:6;8450:9;8446:22;8425:53;:::i;:::-;8415:63;;8370:118;8104:391;;;;;:::o;8501:327::-;8559:6;8608:2;8596:9;8587:7;8583:23;8579:32;8576:2;;;8614:79;;:::i;:::-;8576:2;8734:1;8759:52;8803:7;8794:6;8783:9;8779:22;8759:52;:::i;:::-;8749:62;;8705:116;8566:262;;;;:::o;8834:349::-;8903:6;8952:2;8940:9;8931:7;8927:23;8923:32;8920:2;;;8958:79;;:::i;:::-;8920:2;9078:1;9103:63;9158:7;9149:6;9138:9;9134:22;9103:63;:::i;:::-;9093:73;;9049:127;8910:273;;;;:::o;9189:529::-;9260:6;9268;9317:2;9305:9;9296:7;9292:23;9288:32;9285:2;;;9323:79;;:::i;:::-;9285:2;9471:1;9460:9;9456:17;9443:31;9501:18;9493:6;9490:30;9487:2;;;9523:79;;:::i;:::-;9487:2;9636:65;9693:7;9684:6;9673:9;9669:22;9636:65;:::i;:::-;9618:83;;;;9414:297;9275:443;;;;;:::o;9724:329::-;9783:6;9832:2;9820:9;9811:7;9807:23;9803:32;9800:2;;;9838:79;;:::i;:::-;9800:2;9958:1;9983:53;10028:7;10019:6;10008:9;10004:22;9983:53;:::i;:::-;9973:63;;9929:117;9790:263;;;;:::o;10059:474::-;10127:6;10135;10184:2;10172:9;10163:7;10159:23;10155:32;10152:2;;;10190:79;;:::i;:::-;10152:2;10310:1;10335:53;10380:7;10371:6;10360:9;10356:22;10335:53;:::i;:::-;10325:63;;10281:117;10437:2;10463:53;10508:7;10499:6;10488:9;10484:22;10463:53;:::i;:::-;10453:63;;10408:118;10142:391;;;;;:::o;10539:118::-;10626:24;10644:5;10626:24;:::i;:::-;10621:3;10614:37;10604:53;;:::o;10663:109::-;10744:21;10759:5;10744:21;:::i;:::-;10739:3;10732:34;10722:50;;:::o;10778:118::-;10865:24;10883:5;10865:24;:::i;:::-;10860:3;10853:37;10843:53;;:::o;10902:360::-;10988:3;11016:38;11048:5;11016:38;:::i;:::-;11070:70;11133:6;11128:3;11070:70;:::i;:::-;11063:77;;11149:52;11194:6;11189:3;11182:4;11175:5;11171:16;11149:52;:::i;:::-;11226:29;11248:6;11226:29;:::i;:::-;11221:3;11217:39;11210:46;;10992:270;;;;;:::o;11268:364::-;11356:3;11384:39;11417:5;11384:39;:::i;:::-;11439:71;11503:6;11498:3;11439:71;:::i;:::-;11432:78;;11519:52;11564:6;11559:3;11552:4;11545:5;11541:16;11519:52;:::i;:::-;11596:29;11618:6;11596:29;:::i;:::-;11591:3;11587:39;11580:46;;11360:272;;;;;:::o;11638:377::-;11744:3;11772:39;11805:5;11772:39;:::i;:::-;11827:89;11909:6;11904:3;11827:89;:::i;:::-;11820:96;;11925:52;11970:6;11965:3;11958:4;11951:5;11947:16;11925:52;:::i;:::-;12002:6;11997:3;11993:16;11986:23;;11748:267;;;;;:::o;12045:802::-;12130:3;12167:5;12161:12;12196:36;12222:9;12196:36;:::i;:::-;12248:71;12312:6;12307:3;12248:71;:::i;:::-;12241:78;;12350:1;12339:9;12335:17;12366:1;12361:135;;;;12510:1;12505:336;;;;12328:513;;12361:135;12445:4;12441:9;12430;12426:25;12421:3;12414:38;12481:4;12476:3;12472:14;12465:21;;12361:135;;12505:336;12572:38;12604:5;12572:38;:::i;:::-;12632:1;12646:154;12660:6;12657:1;12654:13;12646:154;;;12734:7;12728:14;12724:1;12719:3;12715:11;12708:35;12784:1;12775:7;12771:15;12760:26;;12682:4;12679:1;12675:12;12670:17;;12646:154;;;12829:1;12824:3;12820:11;12813:18;;12512:329;;12328:513;;12134:713;;;;;;:::o;12853:366::-;12995:3;13016:67;13080:2;13075:3;13016:67;:::i;:::-;13009:74;;13092:93;13181:3;13092:93;:::i;:::-;13210:2;13205:3;13201:12;13194:19;;12999:220;;;:::o;13225:366::-;13367:3;13388:67;13452:2;13447:3;13388:67;:::i;:::-;13381:74;;13464:93;13553:3;13464:93;:::i;:::-;13582:2;13577:3;13573:12;13566:19;;13371:220;;;:::o;13597:366::-;13739:3;13760:67;13824:2;13819:3;13760:67;:::i;:::-;13753:74;;13836:93;13925:3;13836:93;:::i;:::-;13954:2;13949:3;13945:12;13938:19;;13743:220;;;:::o;13969:366::-;14111:3;14132:67;14196:2;14191:3;14132:67;:::i;:::-;14125:74;;14208:93;14297:3;14208:93;:::i;:::-;14326:2;14321:3;14317:12;14310:19;;14115:220;;;:::o;14341:366::-;14483:3;14504:67;14568:2;14563:3;14504:67;:::i;:::-;14497:74;;14580:93;14669:3;14580:93;:::i;:::-;14698:2;14693:3;14689:12;14682:19;;14487:220;;;:::o;14713:366::-;14855:3;14876:67;14940:2;14935:3;14876:67;:::i;:::-;14869:74;;14952:93;15041:3;14952:93;:::i;:::-;15070:2;15065:3;15061:12;15054:19;;14859:220;;;:::o;15085:366::-;15227:3;15248:67;15312:2;15307:3;15248:67;:::i;:::-;15241:74;;15324:93;15413:3;15324:93;:::i;:::-;15442:2;15437:3;15433:12;15426:19;;15231:220;;;:::o;15457:366::-;15599:3;15620:67;15684:2;15679:3;15620:67;:::i;:::-;15613:74;;15696:93;15785:3;15696:93;:::i;:::-;15814:2;15809:3;15805:12;15798:19;;15603:220;;;:::o;15829:366::-;15971:3;15992:67;16056:2;16051:3;15992:67;:::i;:::-;15985:74;;16068:93;16157:3;16068:93;:::i;:::-;16186:2;16181:3;16177:12;16170:19;;15975:220;;;:::o;16201:366::-;16343:3;16364:67;16428:2;16423:3;16364:67;:::i;:::-;16357:74;;16440:93;16529:3;16440:93;:::i;:::-;16558:2;16553:3;16549:12;16542:19;;16347:220;;;:::o;16573:366::-;16715:3;16736:67;16800:2;16795:3;16736:67;:::i;:::-;16729:74;;16812:93;16901:3;16812:93;:::i;:::-;16930:2;16925:3;16921:12;16914:19;;16719:220;;;:::o;16945:366::-;17087:3;17108:67;17172:2;17167:3;17108:67;:::i;:::-;17101:74;;17184:93;17273:3;17184:93;:::i;:::-;17302:2;17297:3;17293:12;17286:19;;17091:220;;;:::o;17317:366::-;17459:3;17480:67;17544:2;17539:3;17480:67;:::i;:::-;17473:74;;17556:93;17645:3;17556:93;:::i;:::-;17674:2;17669:3;17665:12;17658:19;;17463:220;;;:::o;17689:366::-;17831:3;17852:67;17916:2;17911:3;17852:67;:::i;:::-;17845:74;;17928:93;18017:3;17928:93;:::i;:::-;18046:2;18041:3;18037:12;18030:19;;17835:220;;;:::o;18061:366::-;18203:3;18224:67;18288:2;18283:3;18224:67;:::i;:::-;18217:74;;18300:93;18389:3;18300:93;:::i;:::-;18418:2;18413:3;18409:12;18402:19;;18207:220;;;:::o;18433:366::-;18575:3;18596:67;18660:2;18655:3;18596:67;:::i;:::-;18589:74;;18672:93;18761:3;18672:93;:::i;:::-;18790:2;18785:3;18781:12;18774:19;;18579:220;;;:::o;18805:366::-;18947:3;18968:67;19032:2;19027:3;18968:67;:::i;:::-;18961:74;;19044:93;19133:3;19044:93;:::i;:::-;19162:2;19157:3;19153:12;19146:19;;18951:220;;;:::o;19177:400::-;19337:3;19358:84;19440:1;19435:3;19358:84;:::i;:::-;19351:91;;19451:93;19540:3;19451:93;:::i;:::-;19569:1;19564:3;19560:11;19553:18;;19341:236;;;:::o;19583:366::-;19725:3;19746:67;19810:2;19805:3;19746:67;:::i;:::-;19739:74;;19822:93;19911:3;19822:93;:::i;:::-;19940:2;19935:3;19931:12;19924:19;;19729:220;;;:::o;19955:366::-;20097:3;20118:67;20182:2;20177:3;20118:67;:::i;:::-;20111:74;;20194:93;20283:3;20194:93;:::i;:::-;20312:2;20307:3;20303:12;20296:19;;20101:220;;;:::o;20327:366::-;20469:3;20490:67;20554:2;20549:3;20490:67;:::i;:::-;20483:74;;20566:93;20655:3;20566:93;:::i;:::-;20684:2;20679:3;20675:12;20668:19;;20473:220;;;:::o;20699:366::-;20841:3;20862:67;20926:2;20921:3;20862:67;:::i;:::-;20855:74;;20938:93;21027:3;20938:93;:::i;:::-;21056:2;21051:3;21047:12;21040:19;;20845:220;;;:::o;21071:366::-;21213:3;21234:67;21298:2;21293:3;21234:67;:::i;:::-;21227:74;;21310:93;21399:3;21310:93;:::i;:::-;21428:2;21423:3;21419:12;21412:19;;21217:220;;;:::o;21443:366::-;21585:3;21606:67;21670:2;21665:3;21606:67;:::i;:::-;21599:74;;21682:93;21771:3;21682:93;:::i;:::-;21800:2;21795:3;21791:12;21784:19;;21589:220;;;:::o;21815:366::-;21957:3;21978:67;22042:2;22037:3;21978:67;:::i;:::-;21971:74;;22054:93;22143:3;22054:93;:::i;:::-;22172:2;22167:3;22163:12;22156:19;;21961:220;;;:::o;22187:402::-;22347:3;22368:85;22450:2;22445:3;22368:85;:::i;:::-;22361:92;;22462:93;22551:3;22462:93;:::i;:::-;22580:2;22575:3;22571:12;22564:19;;22351:238;;;:::o;22595:366::-;22737:3;22758:67;22822:2;22817:3;22758:67;:::i;:::-;22751:74;;22834:93;22923:3;22834:93;:::i;:::-;22952:2;22947:3;22943:12;22936:19;;22741:220;;;:::o;22967:402::-;23127:3;23148:85;23230:2;23225:3;23148:85;:::i;:::-;23141:92;;23242:93;23331:3;23242:93;:::i;:::-;23360:2;23355:3;23351:12;23344:19;;23131:238;;;:::o;23375:366::-;23517:3;23538:67;23602:2;23597:3;23538:67;:::i;:::-;23531:74;;23614:93;23703:3;23614:93;:::i;:::-;23732:2;23727:3;23723:12;23716:19;;23521:220;;;:::o;23747:118::-;23834:24;23852:5;23834:24;:::i;:::-;23829:3;23822:37;23812:53;;:::o;23871:435::-;24051:3;24073:95;24164:3;24155:6;24073:95;:::i;:::-;24066:102;;24185:95;24276:3;24267:6;24185:95;:::i;:::-;24178:102;;24297:3;24290:10;;24055:251;;;;;:::o;24312:541::-;24545:3;24567:95;24658:3;24649:6;24567:95;:::i;:::-;24560:102;;24679:148;24823:3;24679:148;:::i;:::-;24672:155;;24844:3;24837:10;;24549:304;;;;:::o;24859:967::-;25241:3;25263:148;25407:3;25263:148;:::i;:::-;25256:155;;25428:95;25519:3;25510:6;25428:95;:::i;:::-;25421:102;;25540:148;25684:3;25540:148;:::i;:::-;25533:155;;25705:95;25796:3;25787:6;25705:95;:::i;:::-;25698:102;;25817:3;25810:10;;25245:581;;;;;:::o;25832:222::-;25925:4;25963:2;25952:9;25948:18;25940:26;;25976:71;26044:1;26033:9;26029:17;26020:6;25976:71;:::i;:::-;25930:124;;;;:::o;26060:640::-;26255:4;26293:3;26282:9;26278:19;26270:27;;26307:71;26375:1;26364:9;26360:17;26351:6;26307:71;:::i;:::-;26388:72;26456:2;26445:9;26441:18;26432:6;26388:72;:::i;:::-;26470;26538:2;26527:9;26523:18;26514:6;26470:72;:::i;:::-;26589:9;26583:4;26579:20;26574:2;26563:9;26559:18;26552:48;26617:76;26688:4;26679:6;26617:76;:::i;:::-;26609:84;;26260:440;;;;;;;:::o;26706:332::-;26827:4;26865:2;26854:9;26850:18;26842:26;;26878:71;26946:1;26935:9;26931:17;26922:6;26878:71;:::i;:::-;26959:72;27027:2;27016:9;27012:18;27003:6;26959:72;:::i;:::-;26832:206;;;;;:::o;27044:210::-;27131:4;27169:2;27158:9;27154:18;27146:26;;27182:65;27244:1;27233:9;27229:17;27220:6;27182:65;:::i;:::-;27136:118;;;;:::o;27260:222::-;27353:4;27391:2;27380:9;27376:18;27368:26;;27404:71;27472:1;27461:9;27457:17;27448:6;27404:71;:::i;:::-;27358:124;;;;:::o;27488:313::-;27601:4;27639:2;27628:9;27624:18;27616:26;;27688:9;27682:4;27678:20;27674:1;27663:9;27659:17;27652:47;27716:78;27789:4;27780:6;27716:78;:::i;:::-;27708:86;;27606:195;;;;:::o;27807:508::-;27965:4;28003:2;27992:9;27988:18;27980:26;;28052:9;28046:4;28042:20;28038:1;28027:9;28023:17;28016:47;28080:75;28150:4;28141:6;28080:75;:::i;:::-;28072:83;;28202:9;28196:4;28192:20;28187:2;28176:9;28172:18;28165:48;28230:78;28303:4;28294:6;28230:78;:::i;:::-;28222:86;;27970:345;;;;;:::o;28321:419::-;28487:4;28525:2;28514:9;28510:18;28502:26;;28574:9;28568:4;28564:20;28560:1;28549:9;28545:17;28538:47;28602:131;28728:4;28602:131;:::i;:::-;28594:139;;28492:248;;;:::o;28746:419::-;28912:4;28950:2;28939:9;28935:18;28927:26;;28999:9;28993:4;28989:20;28985:1;28974:9;28970:17;28963:47;29027:131;29153:4;29027:131;:::i;:::-;29019:139;;28917:248;;;:::o;29171:419::-;29337:4;29375:2;29364:9;29360:18;29352:26;;29424:9;29418:4;29414:20;29410:1;29399:9;29395:17;29388:47;29452:131;29578:4;29452:131;:::i;:::-;29444:139;;29342:248;;;:::o;29596:419::-;29762:4;29800:2;29789:9;29785:18;29777:26;;29849:9;29843:4;29839:20;29835:1;29824:9;29820:17;29813:47;29877:131;30003:4;29877:131;:::i;:::-;29869:139;;29767:248;;;:::o;30021:419::-;30187:4;30225:2;30214:9;30210:18;30202:26;;30274:9;30268:4;30264:20;30260:1;30249:9;30245:17;30238:47;30302:131;30428:4;30302:131;:::i;:::-;30294:139;;30192:248;;;:::o;30446:419::-;30612:4;30650:2;30639:9;30635:18;30627:26;;30699:9;30693:4;30689:20;30685:1;30674:9;30670:17;30663:47;30727:131;30853:4;30727:131;:::i;:::-;30719:139;;30617:248;;;:::o;30871:419::-;31037:4;31075:2;31064:9;31060:18;31052:26;;31124:9;31118:4;31114:20;31110:1;31099:9;31095:17;31088:47;31152:131;31278:4;31152:131;:::i;:::-;31144:139;;31042:248;;;:::o;31296:419::-;31462:4;31500:2;31489:9;31485:18;31477:26;;31549:9;31543:4;31539:20;31535:1;31524:9;31520:17;31513:47;31577:131;31703:4;31577:131;:::i;:::-;31569:139;;31467:248;;;:::o;31721:419::-;31887:4;31925:2;31914:9;31910:18;31902:26;;31974:9;31968:4;31964:20;31960:1;31949:9;31945:17;31938:47;32002:131;32128:4;32002:131;:::i;:::-;31994:139;;31892:248;;;:::o;32146:419::-;32312:4;32350:2;32339:9;32335:18;32327:26;;32399:9;32393:4;32389:20;32385:1;32374:9;32370:17;32363:47;32427:131;32553:4;32427:131;:::i;:::-;32419:139;;32317:248;;;:::o;32571:419::-;32737:4;32775:2;32764:9;32760:18;32752:26;;32824:9;32818:4;32814:20;32810:1;32799:9;32795:17;32788:47;32852:131;32978:4;32852:131;:::i;:::-;32844:139;;32742:248;;;:::o;32996:419::-;33162:4;33200:2;33189:9;33185:18;33177:26;;33249:9;33243:4;33239:20;33235:1;33224:9;33220:17;33213:47;33277:131;33403:4;33277:131;:::i;:::-;33269:139;;33167:248;;;:::o;33421:419::-;33587:4;33625:2;33614:9;33610:18;33602:26;;33674:9;33668:4;33664:20;33660:1;33649:9;33645:17;33638:47;33702:131;33828:4;33702:131;:::i;:::-;33694:139;;33592:248;;;:::o;33846:419::-;34012:4;34050:2;34039:9;34035:18;34027:26;;34099:9;34093:4;34089:20;34085:1;34074:9;34070:17;34063:47;34127:131;34253:4;34127:131;:::i;:::-;34119:139;;34017:248;;;:::o;34271:419::-;34437:4;34475:2;34464:9;34460:18;34452:26;;34524:9;34518:4;34514:20;34510:1;34499:9;34495:17;34488:47;34552:131;34678:4;34552:131;:::i;:::-;34544:139;;34442:248;;;:::o;34696:419::-;34862:4;34900:2;34889:9;34885:18;34877:26;;34949:9;34943:4;34939:20;34935:1;34924:9;34920:17;34913:47;34977:131;35103:4;34977:131;:::i;:::-;34969:139;;34867:248;;;:::o;35121:419::-;35287:4;35325:2;35314:9;35310:18;35302:26;;35374:9;35368:4;35364:20;35360:1;35349:9;35345:17;35338:47;35402:131;35528:4;35402:131;:::i;:::-;35394:139;;35292:248;;;:::o;35546:419::-;35712:4;35750:2;35739:9;35735:18;35727:26;;35799:9;35793:4;35789:20;35785:1;35774:9;35770:17;35763:47;35827:131;35953:4;35827:131;:::i;:::-;35819:139;;35717:248;;;:::o;35971:419::-;36137:4;36175:2;36164:9;36160:18;36152:26;;36224:9;36218:4;36214:20;36210:1;36199:9;36195:17;36188:47;36252:131;36378:4;36252:131;:::i;:::-;36244:139;;36142:248;;;:::o;36396:419::-;36562:4;36600:2;36589:9;36585:18;36577:26;;36649:9;36643:4;36639:20;36635:1;36624:9;36620:17;36613:47;36677:131;36803:4;36677:131;:::i;:::-;36669:139;;36567:248;;;:::o;36821:419::-;36987:4;37025:2;37014:9;37010:18;37002:26;;37074:9;37068:4;37064:20;37060:1;37049:9;37045:17;37038:47;37102:131;37228:4;37102:131;:::i;:::-;37094:139;;36992:248;;;:::o;37246:419::-;37412:4;37450:2;37439:9;37435:18;37427:26;;37499:9;37493:4;37489:20;37485:1;37474:9;37470:17;37463:47;37527:131;37653:4;37527:131;:::i;:::-;37519:139;;37417:248;;;:::o;37671:419::-;37837:4;37875:2;37864:9;37860:18;37852:26;;37924:9;37918:4;37914:20;37910:1;37899:9;37895:17;37888:47;37952:131;38078:4;37952:131;:::i;:::-;37944:139;;37842:248;;;:::o;38096:419::-;38262:4;38300:2;38289:9;38285:18;38277:26;;38349:9;38343:4;38339:20;38335:1;38324:9;38320:17;38313:47;38377:131;38503:4;38377:131;:::i;:::-;38369:139;;38267:248;;;:::o;38521:419::-;38687:4;38725:2;38714:9;38710:18;38702:26;;38774:9;38768:4;38764:20;38760:1;38749:9;38745:17;38738:47;38802:131;38928:4;38802:131;:::i;:::-;38794:139;;38692:248;;;:::o;38946:419::-;39112:4;39150:2;39139:9;39135:18;39127:26;;39199:9;39193:4;39189:20;39185:1;39174:9;39170:17;39163:47;39227:131;39353:4;39227:131;:::i;:::-;39219:139;;39117:248;;;:::o;39371:222::-;39464:4;39502:2;39491:9;39487:18;39479:26;;39515:71;39583:1;39572:9;39568:17;39559:6;39515:71;:::i;:::-;39469:124;;;;:::o;39599:332::-;39720:4;39758:2;39747:9;39743:18;39735:26;;39771:71;39839:1;39828:9;39824:17;39815:6;39771:71;:::i;:::-;39852:72;39920:2;39909:9;39905:18;39896:6;39852:72;:::i;:::-;39725:206;;;;;:::o;39937:129::-;39971:6;39998:20;;:::i;:::-;39988:30;;40027:33;40055:4;40047:6;40027:33;:::i;:::-;39978:88;;;:::o;40072:75::-;40105:6;40138:2;40132:9;40122:19;;40112:35;:::o;40153:307::-;40214:4;40304:18;40296:6;40293:30;40290:2;;;40326:18;;:::i;:::-;40290:2;40364:29;40386:6;40364:29;:::i;:::-;40356:37;;40448:4;40442;40438:15;40430:23;;40219:241;;;:::o;40466:141::-;40515:4;40538:3;40530:11;;40561:3;40558:1;40551:14;40595:4;40592:1;40582:18;40574:26;;40520:87;;;:::o;40613:98::-;40664:6;40698:5;40692:12;40682:22;;40671:40;;;:::o;40717:99::-;40769:6;40803:5;40797:12;40787:22;;40776:40;;;:::o;40822:168::-;40905:11;40939:6;40934:3;40927:19;40979:4;40974:3;40970:14;40955:29;;40917:73;;;;:::o;40996:169::-;41080:11;41114:6;41109:3;41102:19;41154:4;41149:3;41145:14;41130:29;;41092:73;;;;:::o;41171:148::-;41273:11;41310:3;41295:18;;41285:34;;;;:::o;41325:305::-;41365:3;41384:20;41402:1;41384:20;:::i;:::-;41379:25;;41418:20;41436:1;41418:20;:::i;:::-;41413:25;;41572:1;41504:66;41500:74;41497:1;41494:81;41491:2;;;41578:18;;:::i;:::-;41491:2;41622:1;41619;41615:9;41608:16;;41369:261;;;;:::o;41636:185::-;41676:1;41693:20;41711:1;41693:20;:::i;:::-;41688:25;;41727:20;41745:1;41727:20;:::i;:::-;41722:25;;41766:1;41756:2;;41771:18;;:::i;:::-;41756:2;41813:1;41810;41806:9;41801:14;;41678:143;;;;:::o;41827:348::-;41867:7;41890:20;41908:1;41890:20;:::i;:::-;41885:25;;41924:20;41942:1;41924:20;:::i;:::-;41919:25;;42112:1;42044:66;42040:74;42037:1;42034:81;42029:1;42022:9;42015:17;42011:105;42008:2;;;42119:18;;:::i;:::-;42008:2;42167:1;42164;42160:9;42149:20;;41875:300;;;;:::o;42181:191::-;42221:4;42241:20;42259:1;42241:20;:::i;:::-;42236:25;;42275:20;42293:1;42275:20;:::i;:::-;42270:25;;42314:1;42311;42308:8;42305:2;;;42319:18;;:::i;:::-;42305:2;42364:1;42361;42357:9;42349:17;;42226:146;;;;:::o;42378:96::-;42415:7;42444:24;42462:5;42444:24;:::i;:::-;42433:35;;42423:51;;;:::o;42480:90::-;42514:7;42557:5;42550:13;42543:21;42532:32;;42522:48;;;:::o;42576:77::-;42613:7;42642:5;42631:16;;42621:32;;;:::o;42659:149::-;42695:7;42735:66;42728:5;42724:78;42713:89;;42703:105;;;:::o;42814:126::-;42851:7;42891:42;42884:5;42880:54;42869:65;;42859:81;;;:::o;42946:77::-;42983:7;43012:5;43001:16;;42991:32;;;:::o;43029:154::-;43113:6;43108:3;43103;43090:30;43175:1;43166:6;43161:3;43157:16;43150:27;43080:103;;;:::o;43189:307::-;43257:1;43267:113;43281:6;43278:1;43275:13;43267:113;;;43366:1;43361:3;43357:11;43351:18;43347:1;43342:3;43338:11;43331:39;43303:2;43300:1;43296:10;43291:15;;43267:113;;;43398:6;43395:1;43392:13;43389:2;;;43478:1;43469:6;43464:3;43460:16;43453:27;43389:2;43238:258;;;;:::o;43502:171::-;43541:3;43564:24;43582:5;43564:24;:::i;:::-;43555:33;;43610:4;43603:5;43600:15;43597:2;;;43618:18;;:::i;:::-;43597:2;43665:1;43658:5;43654:13;43647:20;;43545:128;;;:::o;43679:320::-;43723:6;43760:1;43754:4;43750:12;43740:22;;43807:1;43801:4;43797:12;43828:18;43818:2;;43884:4;43876:6;43872:17;43862:27;;43818:2;43946;43938:6;43935:14;43915:18;43912:38;43909:2;;;43965:18;;:::i;:::-;43909:2;43730:269;;;;:::o;44005:281::-;44088:27;44110:4;44088:27;:::i;:::-;44080:6;44076:40;44218:6;44206:10;44203:22;44182:18;44170:10;44167:34;44164:62;44161:2;;;44229:18;;:::i;:::-;44161:2;44269:10;44265:2;44258:22;44048:238;;;:::o;44292:233::-;44331:3;44354:24;44372:5;44354:24;:::i;:::-;44345:33;;44400:66;44393:5;44390:77;44387:2;;;44470:18;;:::i;:::-;44387:2;44517:1;44510:5;44506:13;44499:20;;44335:190;;;:::o;44531:176::-;44563:1;44580:20;44598:1;44580:20;:::i;:::-;44575:25;;44614:20;44632:1;44614:20;:::i;:::-;44609:25;;44653:1;44643:2;;44658:18;;:::i;:::-;44643:2;44699:1;44696;44692:9;44687:14;;44565:142;;;;:::o;44713:180::-;44761:77;44758:1;44751:88;44858:4;44855:1;44848:15;44882:4;44879:1;44872:15;44899:180;44947:77;44944:1;44937:88;45044:4;45041:1;45034:15;45068:4;45065:1;45058:15;45085:180;45133:77;45130:1;45123:88;45230:4;45227:1;45220:15;45254:4;45251:1;45244:15;45271:180;45319:77;45316:1;45309:88;45416:4;45413:1;45406:15;45440:4;45437:1;45430:15;45457:180;45505:77;45502:1;45495:88;45602:4;45599:1;45592:15;45626:4;45623:1;45616:15;45643:180;45691:77;45688:1;45681:88;45788:4;45785:1;45778:15;45812:4;45809:1;45802:15;45829:117;45938:1;45935;45928:12;45952:117;46061:1;46058;46051:12;46075:117;46184:1;46181;46174:12;46198:117;46307:1;46304;46297:12;46321:117;46430:1;46427;46420:12;46444:117;46553:1;46550;46543:12;46567:102;46608:6;46659:2;46655:7;46650:2;46643:5;46639:14;46635:28;46625:38;;46615:54;;;:::o;46675:182::-;46815:34;46811:1;46803:6;46799:14;46792:58;46781:76;:::o;46863:230::-;47003:34;46999:1;46991:6;46987:14;46980:58;47072:13;47067:2;47059:6;47055:15;47048:38;46969:124;:::o;47099:170::-;47239:22;47235:1;47227:6;47223:14;47216:46;47205:64;:::o;47275:222::-;47415:34;47411:1;47403:6;47399:14;47392:58;47484:5;47479:2;47471:6;47467:15;47460:30;47381:116;:::o;47503:230::-;47643:34;47639:1;47631:6;47627:14;47620:58;47712:13;47707:2;47699:6;47695:15;47688:38;47609:124;:::o;47739:237::-;47879:34;47875:1;47867:6;47863:14;47856:58;47948:20;47943:2;47935:6;47931:15;47924:45;47845:131;:::o;47982:178::-;48122:30;48118:1;48110:6;48106:14;48099:54;48088:72;:::o;48166:223::-;48306:34;48302:1;48294:6;48290:14;48283:58;48375:6;48370:2;48362:6;48358:15;48351:31;48272:117;:::o;48395:175::-;48535:27;48531:1;48523:6;48519:14;48512:51;48501:69;:::o;48576:231::-;48716:34;48712:1;48704:6;48700:14;48693:58;48785:14;48780:2;48772:6;48768:15;48761:39;48682:125;:::o;48813:166::-;48953:18;48949:1;48941:6;48937:14;48930:42;48919:60;:::o;48985:243::-;49125:34;49121:1;49113:6;49109:14;49102:58;49194:26;49189:2;49181:6;49177:15;49170:51;49091:137;:::o;49234:229::-;49374:34;49370:1;49362:6;49358:14;49351:58;49443:12;49438:2;49430:6;49426:15;49419:37;49340:123;:::o;49469:161::-;49609:13;49605:1;49597:6;49593:14;49586:37;49575:55;:::o;49636:228::-;49776:34;49772:1;49764:6;49760:14;49753:58;49845:11;49840:2;49832:6;49828:15;49821:36;49742:122;:::o;49870:182::-;50010:34;50006:1;49998:6;49994:14;49987:58;49976:76;:::o;50058:231::-;50198:34;50194:1;50186:6;50182:14;50175:58;50267:14;50262:2;50254:6;50250:15;50243:39;50164:125;:::o;50295:155::-;50435:7;50431:1;50423:6;50419:14;50412:31;50401:49;:::o;50456:164::-;50596:16;50592:1;50584:6;50580:14;50573:40;50562:58;:::o;50626:228::-;50766:34;50762:1;50754:6;50750:14;50743:58;50835:11;50830:2;50822:6;50818:15;50811:36;50732:122;:::o;50860:234::-;51000:34;50996:1;50988:6;50984:14;50977:58;51069:17;51064:2;51056:6;51052:15;51045:42;50966:128;:::o;51100:220::-;51240:34;51236:1;51228:6;51224:14;51217:58;51309:3;51304:2;51296:6;51292:15;51285:28;51206:114;:::o;51326:236::-;51466:34;51462:1;51454:6;51450:14;51443:58;51535:19;51530:2;51522:6;51518:15;51511:44;51432:130;:::o;51568:231::-;51708:34;51704:1;51696:6;51692:14;51685:58;51777:14;51772:2;51764:6;51760:15;51753:39;51674:125;:::o;51805:223::-;51945:34;51941:1;51933:6;51929:14;51922:58;52014:6;52009:2;52001:6;51997:15;51990:31;51911:117;:::o;52034:173::-;52174:25;52170:1;52162:6;52158:14;52151:49;52140:67;:::o;52213:235::-;52353:34;52349:1;52341:6;52337:14;52330:58;52422:18;52417:2;52409:6;52405:15;52398:43;52319:129;:::o;52454:167::-;52594:19;52590:1;52582:6;52578:14;52571:43;52560:61;:::o;52627:234::-;52767:34;52763:1;52755:6;52751:14;52744:58;52836:17;52831:2;52823:6;52819:15;52812:42;52733:128;:::o;52867:122::-;52940:24;52958:5;52940:24;:::i;:::-;52933:5;52930:35;52920:2;;52979:1;52976;52969:12;52920:2;52910:79;:::o;52995:116::-;53065:21;53080:5;53065:21;:::i;:::-;53058:5;53055:32;53045:2;;53101:1;53098;53091:12;53045:2;53035:76;:::o;53117:122::-;53190:24;53208:5;53190:24;:::i;:::-;53183:5;53180:35;53170:2;;53229:1;53226;53219:12;53170:2;53160:79;:::o;53245:120::-;53317:23;53334:5;53317:23;:::i;:::-;53310:5;53307:34;53297:2;;53355:1;53352;53345:12;53297:2;53287:78;:::o;53371:122::-;53444:24;53462:5;53444:24;:::i;:::-;53437:5;53434:35;53424:2;;53483:1;53480;53473:12;53424:2;53414:79;:::o
Swarm Source
ipfs://4762e828ee3a17a8b54626f8d8df3a0933a77f9f5cb5ef7af79e8a15447567af
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.