Token NFT2
Overview ERC-721
Total Supply:
100 NFT2
Holders:
1 addresses
Profile Summary
Contract:
Balance
100 NFT2
[ Download CSV Export ]
[ Download CSV Export ]
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Similar Match Source Code
Note: This contract matches the deployed ByteCode of the Source Code for Contract 0x88013483733cd3e00b0645ab3647e17a17072891
Contract Name:
Vivid721v2
Compiler Version
v0.8.11+commit.d7f03943
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-10-16 */ // File: @openzeppelin/contracts/access/IAccessControl.sol // SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol) 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/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/access/AccessControl.sol // OpenZeppelin Contracts (last updated v4.7.0) (access/AccessControl.sol) 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); _; } /** * @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 virtual override returns (bool) { return _roles[role].members[account]; } /** * @dev Revert with a standard message if `_msgSender()` is missing `role`. * Overriding this function changes the behavior of the {onlyRole} modifier. * * Format of the revert message is described in {_checkRole}. * * _Available since v4.6._ */ function _checkRole(bytes32 role) internal view virtual { _checkRole(role, _msgSender()); } /** * @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 virtual { 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 virtual 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. * * May emit a {RoleGranted} event. */ 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. * * May emit a {RoleRevoked} event. */ 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 revoked `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. * * May emit a {RoleRevoked} event. */ 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. * * May emit a {RoleGranted} event. * * [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}. * ==== * * NOTE: This function is deprecated in favor of {_grantRole}. */ 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); } /** * @dev Grants `role` to `account`. * * Internal function without access restriction. * * May emit a {RoleGranted} event. */ function _grantRole(bytes32 role, address account) internal virtual { if (!hasRole(role, account)) { _roles[role].members[account] = true; emit RoleGranted(role, account, _msgSender()); } } /** * @dev Revokes `role` from `account`. * * Internal function without access restriction. * * May emit a {RoleRevoked} event. */ function _revokeRole(bytes32 role, address account) internal virtual { if (hasRole(role, account)) { _roles[role].members[account] = false; emit RoleRevoked(role, account, _msgSender()); } } } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC721/ERC721.sol // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: address zero is not a valid owner"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: invalid token ID"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { _requireMinted(tokenId); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not token owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { _requireMinted(tokenId); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner nor approved"); _safeTransfer(from, to, tokenId, data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { address owner = ERC721.ownerOf(tokenId); return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits an {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits an {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Reverts if the `tokenId` has not been minted yet. */ function _requireMinted(uint256 tokenId) internal view virtual { require(_exists(tokenId), "ERC721: invalid token ID"); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { /// @solidity memory-safe-assembly assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } // File: @openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/extensions/ERC721URIStorage.sol) pragma solidity ^0.8.0; /** * @dev ERC721 token with storage based token URI management. */ abstract contract ERC721URIStorage is ERC721 { using Strings for uint256; // Optional mapping for token URIs mapping(uint256 => string) private _tokenURIs; /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { _requireMinted(tokenId); string memory _tokenURI = _tokenURIs[tokenId]; string memory base = _baseURI(); // If there is no base URI, return the token URI. if (bytes(base).length == 0) { return _tokenURI; } // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked). if (bytes(_tokenURI).length > 0) { return string(abi.encodePacked(base, _tokenURI)); } return super.tokenURI(tokenId); } /** * @dev Sets `_tokenURI` as the tokenURI of `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual { require(_exists(tokenId), "ERC721URIStorage: URI set of nonexistent token"); _tokenURIs[tokenId] = _tokenURI; } /** * @dev See {ERC721-_burn}. This override additionally checks to see if a * token-specific URI was set for the token, and if so, it deletes the token URI from * the storage mapping. */ function _burn(uint256 tokenId) internal virtual override { super._burn(tokenId); if (bytes(_tokenURIs[tokenId]).length != 0) { delete _tokenURIs[tokenId]; } } } // File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Burnable.sol // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/extensions/ERC721Burnable.sol) pragma solidity ^0.8.0; /** * @title ERC721 Burnable Token * @dev ERC721 Token that can be 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), "ERC721: caller is not token owner nor approved"); _burn(tokenId); } } // File: contracts/Vivid721v2.sol pragma solidity ^0.8.11; contract Vivid721v2 is ERC721, ERC721Enumerable, ERC721URIStorage, ERC721Burnable, AccessControl { bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE"); bytes32 public constant UPDATER_ROLE = keccak256("UPDATER_ROLE"); constructor(string memory name, string memory symbol) ERC721(name, symbol) { _grantRole(DEFAULT_ADMIN_ROLE, msg.sender); _grantRole(MINTER_ROLE, msg.sender); _grantRole(UPDATER_ROLE, msg.sender); } function mint(address to, uint256 tokenId, string memory uri) public onlyRole(MINTER_ROLE) { _safeMint(to, tokenId); _setTokenURI(tokenId, uri); } function updateTokenURI(uint256 tokenId, string memory uri) public onlyRole(UPDATER_ROLE) { _setTokenURI(tokenId, uri); } function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal override(ERC721, ERC721Enumerable) { super._beforeTokenTransfer(from, to, tokenId); } function _burn(uint256 tokenId) internal override(ERC721, ERC721URIStorage) { super._burn(tokenId); } function tokenURI(uint256 tokenId) public view override(ERC721, ERC721URIStorage) returns (string memory) { return super.tokenURI(tokenId); } function supportsInterface(bytes4 interfaceId) public view override(ERC721, ERC721Enumerable, AccessControl) returns (bool) { return super.supportsInterface(interfaceId); } }
[{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"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":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"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":"UPDATER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"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":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"uri","type":"string"}],"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":[{"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":[{"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":"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":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"uri","type":"string"}],"name":"updateTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b50604051620044eb380380620044eb8339818101604052810190620000379190620004a0565b818181600090805190602001906200005192919062000253565b5080600190805190602001906200006a92919062000253565b505050620000826000801b33620000ee60201b60201c565b620000b47f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a633620000ee60201b60201c565b620000e67f73e573f9566d61418a34d5de3ff49360f9c51fec37f7486551670290f6285dab33620000ee60201b60201c565b50506200058a565b620001008282620001e060201b60201c565b620001dc576001600b600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550620001816200024b60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6000600b600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600033905090565b828054620002619062000554565b90600052602060002090601f016020900481019282620002855760008555620002d1565b82601f10620002a057805160ff1916838001178555620002d1565b82800160010185558215620002d1579182015b82811115620002d0578251825591602001919060010190620002b3565b5b509050620002e09190620002e4565b5090565b5b80821115620002ff576000816000905550600101620002e5565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200036c8262000321565b810181811067ffffffffffffffff821117156200038e576200038d62000332565b5b80604052505050565b6000620003a362000303565b9050620003b1828262000361565b919050565b600067ffffffffffffffff821115620003d457620003d362000332565b5b620003df8262000321565b9050602081019050919050565b60005b838110156200040c578082015181840152602081019050620003ef565b838111156200041c576000848401525b50505050565b6000620004396200043384620003b6565b62000397565b9050828152602081018484840111156200045857620004576200031c565b5b62000465848285620003ec565b509392505050565b600082601f83011262000485576200048462000317565b5b81516200049784826020860162000422565b91505092915050565b60008060408385031215620004ba57620004b96200030d565b5b600083015167ffffffffffffffff811115620004db57620004da62000312565b5b620004e9858286016200046d565b925050602083015167ffffffffffffffff8111156200050d576200050c62000312565b5b6200051b858286016200046d565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200056d57607f821691505b6020821081141562000584576200058362000525565b5b50919050565b613f51806200059a6000396000f3fe608060405234801561001057600080fd5b50600436106101a95760003560e01c806347e63380116100f9578063a22cb46511610097578063d3fc986411610071578063d3fc9864146104f0578063d53913931461050c578063d547741f1461052a578063e985e9c514610546576101a9565b8063a22cb46514610488578063b88d4fde146104a4578063c87b56dd146104c0576101a9565b806370a08231116100d357806370a08231146103ec57806391d148541461041c57806395d89b411461044c578063a217fddf1461046a576101a9565b806347e633801461036e5780634f6ccce71461038c5780636352211e146103bc576101a9565b806323b872dd116101665780632f745c59116101405780632f745c59146102ea57806336568abe1461031a57806342842e0e1461033657806342966c6814610352576101a9565b806323b872dd14610282578063248a9ca31461029e5780632f2ff15d146102ce576101a9565b806301ffc9a7146101ae57806306fdde03146101de578063081812fc146101fc578063095ea7b31461022c57806318160ddd1461024857806318e97fd114610266575b600080fd5b6101c860048036038101906101c39190612a3e565b610576565b6040516101d59190612a86565b60405180910390f35b6101e6610588565b6040516101f39190612b3a565b60405180910390f35b61021660048036038101906102119190612b92565b61061a565b6040516102239190612c00565b60405180910390f35b61024660048036038101906102419190612c47565b610660565b005b610250610778565b60405161025d9190612c96565b60405180910390f35b610280600480360381019061027b9190612de6565b610785565b005b61029c60048036038101906102979190612e42565b6107be565b005b6102b860048036038101906102b39190612ecb565b61081e565b6040516102c59190612f07565b60405180910390f35b6102e860048036038101906102e39190612f22565b61083e565b005b61030460048036038101906102ff9190612c47565b61085f565b6040516103119190612c96565b60405180910390f35b610334600480360381019061032f9190612f22565b610904565b005b610350600480360381019061034b9190612e42565b610987565b005b61036c60048036038101906103679190612b92565b6109a7565b005b610376610a03565b6040516103839190612f07565b60405180910390f35b6103a660048036038101906103a19190612b92565b610a27565b6040516103b39190612c96565b60405180910390f35b6103d660048036038101906103d19190612b92565b610a98565b6040516103e39190612c00565b60405180910390f35b61040660048036038101906104019190612f62565b610b4a565b6040516104139190612c96565b60405180910390f35b61043660048036038101906104319190612f22565b610c02565b6040516104439190612a86565b60405180910390f35b610454610c6d565b6040516104619190612b3a565b60405180910390f35b610472610cff565b60405161047f9190612f07565b60405180910390f35b6104a2600480360381019061049d9190612fbb565b610d06565b005b6104be60048036038101906104b9919061309c565b610d1c565b005b6104da60048036038101906104d59190612b92565b610d7e565b6040516104e79190612b3a565b60405180910390f35b61050a6004803603810190610505919061311f565b610d90565b005b610514610dd4565b6040516105219190612f07565b60405180910390f35b610544600480360381019061053f9190612f22565b610df8565b005b610560600480360381019061055b919061318e565b610e19565b60405161056d9190612a86565b60405180910390f35b600061058182610ead565b9050919050565b606060008054610597906131fd565b80601f01602080910402602001604051908101604052809291908181526020018280546105c3906131fd565b80156106105780601f106105e557610100808354040283529160200191610610565b820191906000526020600020905b8154815290600101906020018083116105f357829003601f168201915b5050505050905090565b600061062582610f27565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061066b82610a98565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156106dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106d3906132a1565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166106fb610f72565b73ffffffffffffffffffffffffffffffffffffffff16148061072a575061072981610724610f72565b610e19565b5b610769576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161076090613333565b60405180910390fd5b6107738383610f7a565b505050565b6000600880549050905090565b7f73e573f9566d61418a34d5de3ff49360f9c51fec37f7486551670290f6285dab6107af81611033565b6107b98383611047565b505050565b6107cf6107c9610f72565b826110bb565b61080e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610805906133c5565b60405180910390fd5b610819838383611150565b505050565b6000600b6000838152602001908152602001600020600101549050919050565b6108478261081e565b61085081611033565b61085a83836113b7565b505050565b600061086a83610b4a565b82106108ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108a290613457565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b61090c610f72565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610979576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610970906134e9565b60405180910390fd5b6109838282611498565b5050565b6109a283838360405180602001604052806000815250610d1c565b505050565b6109b86109b2610f72565b826110bb565b6109f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109ee906133c5565b60405180910390fd5b610a008161157a565b50565b7f73e573f9566d61418a34d5de3ff49360f9c51fec37f7486551670290f6285dab81565b6000610a31610778565b8210610a72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a699061357b565b60405180910390fd5b60088281548110610a8657610a8561359b565b5b90600052602060002001549050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610b41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3890613616565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610bbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb2906136a8565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600b600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b606060018054610c7c906131fd565b80601f0160208091040260200160405190810160405280929190818152602001828054610ca8906131fd565b8015610cf55780601f10610cca57610100808354040283529160200191610cf5565b820191906000526020600020905b815481529060010190602001808311610cd857829003601f168201915b5050505050905090565b6000801b81565b610d18610d11610f72565b8383611586565b5050565b610d2d610d27610f72565b836110bb565b610d6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d63906133c5565b60405180910390fd5b610d78848484846116f3565b50505050565b6060610d898261174f565b9050919050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6610dba81611033565b610dc48484611862565b610dce8383611047565b50505050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b610e018261081e565b610e0a81611033565b610e148383611498565b505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610f205750610f1f82611880565b5b9050919050565b610f30816118fa565b610f6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6690613616565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16610fed83610a98565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6110448161103f610f72565b611966565b50565b611050826118fa565b61108f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110869061373a565b60405180910390fd5b80600a600084815260200190815260200160002090805190602001906110b69291906128ef565b505050565b6000806110c783610a98565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061110957506111088185610e19565b5b8061114757508373ffffffffffffffffffffffffffffffffffffffff1661112f8461061a565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661117082610a98565b73ffffffffffffffffffffffffffffffffffffffff16146111c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111bd906137cc565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611236576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122d9061385e565b60405180910390fd5b611241838383611a03565b61124c600082610f7a565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461129c91906138ad565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546112f391906138e1565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46113b2838383611a13565b505050565b6113c18282610c02565b611494576001600b600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611439610f72565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6114a28282610c02565b15611576576000600b600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061151b610f72565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b61158381611a18565b50565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156115f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ec90613983565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516116e69190612a86565b60405180910390a3505050565b6116fe848484611150565b61170a84848484611a6b565b611749576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174090613a15565b60405180910390fd5b50505050565b606061175a82610f27565b6000600a6000848152602001908152602001600020805461177a906131fd565b80601f01602080910402602001604051908101604052809291908181526020018280546117a6906131fd565b80156117f35780601f106117c8576101008083540402835291602001916117f3565b820191906000526020600020905b8154815290600101906020018083116117d657829003601f168201915b505050505090506000611804611bf3565b905060008151141561181a57819250505061185d565b60008251111561184f578082604051602001611837929190613a71565b6040516020818303038152906040529250505061185d565b61185884611c0a565b925050505b919050565b61187c828260405180602001604052806000815250611c72565b5050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806118f357506118f282611ccd565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6119708282610c02565b6119ff576119958173ffffffffffffffffffffffffffffffffffffffff166014611daf565b6119a38360001c6020611daf565b6040516020016119b4929190613b2d565b6040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f69190612b3a565b60405180910390fd5b5050565b611a0e838383611feb565b505050565b505050565b611a21816120ff565b6000600a60008381526020019081526020016000208054611a41906131fd565b905014611a6857600a60008281526020019081526020016000206000611a679190612975565b5b50565b6000611a8c8473ffffffffffffffffffffffffffffffffffffffff1661221c565b15611be6578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611ab5610f72565b8786866040518563ffffffff1660e01b8152600401611ad79493929190613bbc565b6020604051808303816000875af1925050508015611b1357506040513d601f19601f82011682018060405250810190611b109190613c1d565b60015b611b96573d8060008114611b43576040519150601f19603f3d011682016040523d82523d6000602084013e611b48565b606091505b50600081511415611b8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8590613a15565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611beb565b600190505b949350505050565b606060405180602001604052806000815250905090565b6060611c1582610f27565b6000611c1f611bf3565b90506000815111611c3f5760405180602001604052806000815250611c6a565b80611c498461223f565b604051602001611c5a929190613a71565b6040516020818303038152906040525b915050919050565b611c7c83836123a0565b611c896000848484611a6b565b611cc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cbf90613a15565b60405180910390fd5b505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611d9857507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611da85750611da78261257a565b5b9050919050565b606060006002836002611dc29190613c4a565b611dcc91906138e1565b67ffffffffffffffff811115611de557611de4612cbb565b5b6040519080825280601f01601f191660200182016040528015611e175781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110611e4f57611e4e61359b565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611eb357611eb261359b565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002611ef39190613c4a565b611efd91906138e1565b90505b6001811115611f9d577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110611f3f57611f3e61359b565b5b1a60f81b828281518110611f5657611f5561359b565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c945080611f9690613ca4565b9050611f00565b5060008414611fe1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd890613d1a565b60405180910390fd5b8091505092915050565b611ff68383836125e4565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561203957612034816125e9565b612078565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612077576120768382612632565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156120bb576120b68161279f565b6120fa565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146120f9576120f88282612870565b5b5b505050565b600061210a82610a98565b905061211881600084611a03565b612123600083610f7a565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461217391906138ad565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461221881600084611a13565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60606000821415612287576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061239b565b600082905060005b600082146122b95780806122a290613d3a565b915050600a826122b29190613db2565b915061228f565b60008167ffffffffffffffff8111156122d5576122d4612cbb565b5b6040519080825280601f01601f1916602001820160405280156123075781602001600182028036833780820191505090505b5090505b600085146123945760018261232091906138ad565b9150600a8561232f9190613de3565b603061233b91906138e1565b60f81b8183815181106123515761235061359b565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561238d9190613db2565b945061230b565b8093505050505b919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612410576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240790613e60565b60405180910390fd5b612419816118fa565b15612459576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161245090613ecc565b60405180910390fd5b61246560008383611a03565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124b591906138e1565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461257660008383611a13565b5050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161263f84610b4a565b61264991906138ad565b905060006007600084815260200190815260200160002054905081811461272e576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506127b391906138ad565b90506000600960008481526020019081526020016000205490506000600883815481106127e3576127e261359b565b5b9060005260206000200154905080600883815481106128055761280461359b565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061285457612853613eec565b5b6001900381819060005260206000200160009055905550505050565b600061287b83610b4a565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b8280546128fb906131fd565b90600052602060002090601f01602090048101928261291d5760008555612964565b82601f1061293657805160ff1916838001178555612964565b82800160010185558215612964579182015b82811115612963578251825591602001919060010190612948565b5b50905061297191906129b5565b5090565b508054612981906131fd565b6000825580601f1061299357506129b2565b601f0160209004906000526020600020908101906129b191906129b5565b5b50565b5b808211156129ce5760008160009055506001016129b6565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612a1b816129e6565b8114612a2657600080fd5b50565b600081359050612a3881612a12565b92915050565b600060208284031215612a5457612a536129dc565b5b6000612a6284828501612a29565b91505092915050565b60008115159050919050565b612a8081612a6b565b82525050565b6000602082019050612a9b6000830184612a77565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612adb578082015181840152602081019050612ac0565b83811115612aea576000848401525b50505050565b6000601f19601f8301169050919050565b6000612b0c82612aa1565b612b168185612aac565b9350612b26818560208601612abd565b612b2f81612af0565b840191505092915050565b60006020820190508181036000830152612b548184612b01565b905092915050565b6000819050919050565b612b6f81612b5c565b8114612b7a57600080fd5b50565b600081359050612b8c81612b66565b92915050565b600060208284031215612ba857612ba76129dc565b5b6000612bb684828501612b7d565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612bea82612bbf565b9050919050565b612bfa81612bdf565b82525050565b6000602082019050612c156000830184612bf1565b92915050565b612c2481612bdf565b8114612c2f57600080fd5b50565b600081359050612c4181612c1b565b92915050565b60008060408385031215612c5e57612c5d6129dc565b5b6000612c6c85828601612c32565b9250506020612c7d85828601612b7d565b9150509250929050565b612c9081612b5c565b82525050565b6000602082019050612cab6000830184612c87565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612cf382612af0565b810181811067ffffffffffffffff82111715612d1257612d11612cbb565b5b80604052505050565b6000612d256129d2565b9050612d318282612cea565b919050565b600067ffffffffffffffff821115612d5157612d50612cbb565b5b612d5a82612af0565b9050602081019050919050565b82818337600083830152505050565b6000612d89612d8484612d36565b612d1b565b905082815260208101848484011115612da557612da4612cb6565b5b612db0848285612d67565b509392505050565b600082601f830112612dcd57612dcc612cb1565b5b8135612ddd848260208601612d76565b91505092915050565b60008060408385031215612dfd57612dfc6129dc565b5b6000612e0b85828601612b7d565b925050602083013567ffffffffffffffff811115612e2c57612e2b6129e1565b5b612e3885828601612db8565b9150509250929050565b600080600060608486031215612e5b57612e5a6129dc565b5b6000612e6986828701612c32565b9350506020612e7a86828701612c32565b9250506040612e8b86828701612b7d565b9150509250925092565b6000819050919050565b612ea881612e95565b8114612eb357600080fd5b50565b600081359050612ec581612e9f565b92915050565b600060208284031215612ee157612ee06129dc565b5b6000612eef84828501612eb6565b91505092915050565b612f0181612e95565b82525050565b6000602082019050612f1c6000830184612ef8565b92915050565b60008060408385031215612f3957612f386129dc565b5b6000612f4785828601612eb6565b9250506020612f5885828601612c32565b9150509250929050565b600060208284031215612f7857612f776129dc565b5b6000612f8684828501612c32565b91505092915050565b612f9881612a6b565b8114612fa357600080fd5b50565b600081359050612fb581612f8f565b92915050565b60008060408385031215612fd257612fd16129dc565b5b6000612fe085828601612c32565b9250506020612ff185828601612fa6565b9150509250929050565b600067ffffffffffffffff82111561301657613015612cbb565b5b61301f82612af0565b9050602081019050919050565b600061303f61303a84612ffb565b612d1b565b90508281526020810184848401111561305b5761305a612cb6565b5b613066848285612d67565b509392505050565b600082601f83011261308357613082612cb1565b5b813561309384826020860161302c565b91505092915050565b600080600080608085870312156130b6576130b56129dc565b5b60006130c487828801612c32565b94505060206130d587828801612c32565b93505060406130e687828801612b7d565b925050606085013567ffffffffffffffff811115613107576131066129e1565b5b6131138782880161306e565b91505092959194509250565b600080600060608486031215613138576131376129dc565b5b600061314686828701612c32565b935050602061315786828701612b7d565b925050604084013567ffffffffffffffff811115613178576131776129e1565b5b61318486828701612db8565b9150509250925092565b600080604083850312156131a5576131a46129dc565b5b60006131b385828601612c32565b92505060206131c485828601612c32565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061321557607f821691505b60208210811415613229576132286131ce565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b600061328b602183612aac565b91506132968261322f565b604082019050919050565b600060208201905081810360008301526132ba8161327e565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b600061331d603e83612aac565b9150613328826132c1565b604082019050919050565b6000602082019050818103600083015261334c81613310565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b60006133af602e83612aac565b91506133ba82613353565b604082019050919050565b600060208201905081810360008301526133de816133a2565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000613441602b83612aac565b915061344c826133e5565b604082019050919050565b6000602082019050818103600083015261347081613434565b9050919050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b60006134d3602f83612aac565b91506134de82613477565b604082019050919050565b60006020820190508181036000830152613502816134c6565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000613565602c83612aac565b915061357082613509565b604082019050919050565b6000602082019050818103600083015261359481613558565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000613600601883612aac565b915061360b826135ca565b602082019050919050565b6000602082019050818103600083015261362f816135f3565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000613692602983612aac565b915061369d82613636565b604082019050919050565b600060208201905081810360008301526136c181613685565b9050919050565b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008201527f6578697374656e7420746f6b656e000000000000000000000000000000000000602082015250565b6000613724602e83612aac565b915061372f826136c8565b604082019050919050565b6000602082019050818103600083015261375381613717565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b60006137b6602583612aac565b91506137c18261375a565b604082019050919050565b600060208201905081810360008301526137e5816137a9565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000613848602483612aac565b9150613853826137ec565b604082019050919050565b600060208201905081810360008301526138778161383b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006138b882612b5c565b91506138c383612b5c565b9250828210156138d6576138d561387e565b5b828203905092915050565b60006138ec82612b5c565b91506138f783612b5c565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561392c5761392b61387e565b5b828201905092915050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b600061396d601983612aac565b915061397882613937565b602082019050919050565b6000602082019050818103600083015261399c81613960565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006139ff603283612aac565b9150613a0a826139a3565b604082019050919050565b60006020820190508181036000830152613a2e816139f2565b9050919050565b600081905092915050565b6000613a4b82612aa1565b613a558185613a35565b9350613a65818560208601612abd565b80840191505092915050565b6000613a7d8285613a40565b9150613a898284613a40565b91508190509392505050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b6000613acb601783613a35565b9150613ad682613a95565b601782019050919050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b6000613b17601183613a35565b9150613b2282613ae1565b601182019050919050565b6000613b3882613abe565b9150613b448285613a40565b9150613b4f82613b0a565b9150613b5b8284613a40565b91508190509392505050565b600081519050919050565b600082825260208201905092915050565b6000613b8e82613b67565b613b988185613b72565b9350613ba8818560208601612abd565b613bb181612af0565b840191505092915050565b6000608082019050613bd16000830187612bf1565b613bde6020830186612bf1565b613beb6040830185612c87565b8181036060830152613bfd8184613b83565b905095945050505050565b600081519050613c1781612a12565b92915050565b600060208284031215613c3357613c326129dc565b5b6000613c4184828501613c08565b91505092915050565b6000613c5582612b5c565b9150613c6083612b5c565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613c9957613c9861387e565b5b828202905092915050565b6000613caf82612b5c565b91506000821415613cc357613cc261387e565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b6000613d04602083612aac565b9150613d0f82613cce565b602082019050919050565b60006020820190508181036000830152613d3381613cf7565b9050919050565b6000613d4582612b5c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613d7857613d7761387e565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613dbd82612b5c565b9150613dc883612b5c565b925082613dd857613dd7613d83565b5b828204905092915050565b6000613dee82612b5c565b9150613df983612b5c565b925082613e0957613e08613d83565b5b828206905092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000613e4a602083612aac565b9150613e5582613e14565b602082019050919050565b60006020820190508181036000830152613e7981613e3d565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000613eb6601c83612aac565b9150613ec182613e80565b602082019050919050565b60006020820190508181036000830152613ee581613ea9565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea2646970667358221220fc64b4570ecd6eefbc504335b4550986c643b47c9ad9da44a932fb6e572b7b2b64736f6c634300080b003300000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000c41706f63616c6970746963610000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000341504f0000000000000000000000000000000000000000000000000000000000
Deployed ByteCode Sourcemap
57615:1653:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59038:227;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34295:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35808:171;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35325:417;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49281:113;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58315:151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36508:336;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;12821:131;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13262:147;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48949:256;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14406:218;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36915:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57288:243;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57788:64;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49471:233;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34006:222;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33737:207;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11281:147;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34464:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10386:49;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36051:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37171:323;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58834:196;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58113:194;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57719:62;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13702:149;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36277:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59038:227;59192:4;59221:36;59245:11;59221:23;:36::i;:::-;59214:43;;59038:227;;;:::o;34295:100::-;34349:13;34382:5;34375:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34295:100;:::o;35808:171::-;35884:7;35904:23;35919:7;35904:14;:23::i;:::-;35947:15;:24;35963:7;35947:24;;;;;;;;;;;;;;;;;;;;;35940:31;;35808:171;;;:::o;35325:417::-;35406:13;35422:23;35437:7;35422:14;:23::i;:::-;35406:39;;35470:5;35464:11;;:2;:11;;;;35456:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;35564:5;35548:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;35573:37;35590:5;35597:12;:10;:12::i;:::-;35573:16;:37::i;:::-;35548:62;35526:174;;;;;;;;;;;;:::i;:::-;;;;;;;;;35713:21;35722:2;35726:7;35713:8;:21::i;:::-;35395:347;35325:417;;:::o;49281:113::-;49342:7;49369:10;:17;;;;49362:24;;49281:113;:::o;58315:151::-;57827:25;10877:16;10888:4;10877:10;:16::i;:::-;58435:26:::1;58448:7;58457:3;58435:12;:26::i;:::-;58315:151:::0;;;:::o;36508:336::-;36703:41;36722:12;:10;:12::i;:::-;36736:7;36703:18;:41::i;:::-;36695:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;36808:28;36818:4;36824:2;36828:7;36808:9;:28::i;:::-;36508:336;;;:::o;12821:131::-;12895:7;12922:6;:12;12929:4;12922:12;;;;;;;;;;;:22;;;12915:29;;12821:131;;;:::o;13262:147::-;13345:18;13358:4;13345:12;:18::i;:::-;10877:16;10888:4;10877:10;:16::i;:::-;13376:25:::1;13387:4;13393:7;13376:10;:25::i;:::-;13262:147:::0;;;:::o;48949:256::-;49046:7;49082:23;49099:5;49082:16;:23::i;:::-;49074:5;:31;49066:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;49171:12;:19;49184:5;49171:19;;;;;;;;;;;;;;;:26;49191:5;49171:26;;;;;;;;;;;;49164:33;;48949:256;;;;:::o;14406:218::-;14513:12;:10;:12::i;:::-;14502:23;;:7;:23;;;14494:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;14590:26;14602:4;14608:7;14590:11;:26::i;:::-;14406:218;;:::o;36915:185::-;37053:39;37070:4;37076:2;37080:7;37053:39;;;;;;;;;;;;:16;:39::i;:::-;36915:185;;;:::o;57288:243::-;57406:41;57425:12;:10;:12::i;:::-;57439:7;57406:18;:41::i;:::-;57398:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;57509:14;57515:7;57509:5;:14::i;:::-;57288:243;:::o;57788:64::-;57827:25;57788:64;:::o;49471:233::-;49546:7;49582:30;:28;:30::i;:::-;49574:5;:38;49566:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;49679:10;49690:5;49679:17;;;;;;;;:::i;:::-;;;;;;;;;;49672:24;;49471:233;;;:::o;34006:222::-;34078:7;34098:13;34114:7;:16;34122:7;34114:16;;;;;;;;;;;;;;;;;;;;;34098:32;;34166:1;34149:19;;:5;:19;;;;34141:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;34215:5;34208:12;;;34006:222;;;:::o;33737:207::-;33809:7;33854:1;33837:19;;:5;:19;;;;33829:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;33920:9;:16;33930:5;33920:16;;;;;;;;;;;;;;;;33913:23;;33737:207;;;:::o;11281:147::-;11367:4;11391:6;:12;11398:4;11391:12;;;;;;;;;;;:20;;:29;11412:7;11391:29;;;;;;;;;;;;;;;;;;;;;;;;;11384:36;;11281:147;;;;:::o;34464:104::-;34520:13;34553:7;34546:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34464:104;:::o;10386:49::-;10431:4;10386:49;;;:::o;36051:155::-;36146:52;36165:12;:10;:12::i;:::-;36179:8;36189;36146:18;:52::i;:::-;36051:155;;:::o;37171:323::-;37345:41;37364:12;:10;:12::i;:::-;37378:7;37345:18;:41::i;:::-;37337:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;37448:38;37462:4;37468:2;37472:7;37481:4;37448:13;:38::i;:::-;37171:323;;;;:::o;58834:196::-;58961:13;58999:23;59014:7;58999:14;:23::i;:::-;58992:30;;58834:196;;;:::o;58113:194::-;57757:24;10877:16;10888:4;10877:10;:16::i;:::-;58240:22:::1;58250:2;58254:7;58240:9;:22::i;:::-;58273:26;58286:7;58295:3;58273:12;:26::i;:::-;58113:194:::0;;;;:::o;57719:62::-;57757:24;57719:62;:::o;13702:149::-;13786:18;13799:4;13786:12;:18::i;:::-;10877:16;10888:4;10877:10;:16::i;:::-;13817:26:::1;13829:4;13835:7;13817:11;:26::i;:::-;13702:149:::0;;;:::o;36277:164::-;36374:4;36398:18;:25;36417:5;36398:25;;;;;;;;;;;;;;;:35;36424:8;36398:35;;;;;;;;;;;;;;;;;;;;;;;;;36391:42;;36277:164;;;;:::o;10985:204::-;11070:4;11109:32;11094:47;;;:11;:47;;;;:87;;;;11145:36;11169:11;11145:23;:36::i;:::-;11094:87;11087:94;;10985:204;;;:::o;43783:135::-;43865:16;43873:7;43865;:16::i;:::-;43857:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;43783:135;:::o;3751:98::-;3804:7;3831:10;3824:17;;3751:98;:::o;43062:174::-;43164:2;43137:15;:24;43153:7;43137:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;43220:7;43216:2;43182:46;;43191:23;43206:7;43191:14;:23::i;:::-;43182:46;;;;;;;;;;;;43062:174;;:::o;11732:105::-;11799:30;11810:4;11816:12;:10;:12::i;:::-;11799:10;:30::i;:::-;11732:105;:::o;56095:217::-;56195:16;56203:7;56195;:16::i;:::-;56187:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;56295:9;56273:10;:19;56284:7;56273:19;;;;;;;;;;;:31;;;;;;;;;;;;:::i;:::-;;56095:217;;:::o;39295:264::-;39388:4;39405:13;39421:23;39436:7;39421:14;:23::i;:::-;39405:39;;39474:5;39463:16;;:7;:16;;;:52;;;;39483:32;39500:5;39507:7;39483:16;:32::i;:::-;39463:52;:87;;;;39543:7;39519:31;;:20;39531:7;39519:11;:20::i;:::-;:31;;;39463:87;39455:96;;;39295:264;;;;:::o;42318:625::-;42477:4;42450:31;;:23;42465:7;42450:14;:23::i;:::-;:31;;;42442:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;42556:1;42542:16;;:2;:16;;;;42534:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;42612:39;42633:4;42639:2;42643:7;42612:20;:39::i;:::-;42716:29;42733:1;42737:7;42716:8;:29::i;:::-;42777:1;42758:9;:15;42768:4;42758:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;42806:1;42789:9;:13;42799:2;42789:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;42837:2;42818:7;:16;42826:7;42818:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;42876:7;42872:2;42857:27;;42866:4;42857:27;;;;;;;;;;;;42897:38;42917:4;42923:2;42927:7;42897:19;:38::i;:::-;42318:625;;;:::o;16003:238::-;16087:22;16095:4;16101:7;16087;:22::i;:::-;16082:152;;16158:4;16126:6;:12;16133:4;16126:12;;;;;;;;;;;:20;;:29;16147:7;16126:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;16209:12;:10;:12::i;:::-;16182:40;;16200:7;16182:40;;16194:4;16182:40;;;;;;;;;;16082:152;16003:238;;:::o;16421:239::-;16505:22;16513:4;16519:7;16505;:22::i;:::-;16501:152;;;16576:5;16544:6;:12;16551:4;16544:12;;;;;;;;;;;:20;;:29;16565:7;16544:29;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;16628:12;:10;:12::i;:::-;16601:40;;16619:7;16601:40;;16613:4;16601:40;;;;;;;;;;16501:152;16421:239;;:::o;58687:139::-;58798:20;58810:7;58798:11;:20::i;:::-;58687:139;:::o;43379:315::-;43534:8;43525:17;;:5;:17;;;;43517:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;43621:8;43583:18;:25;43602:5;43583:25;;;;;;;;;;;;;;;:35;43609:8;43583:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;43667:8;43645:41;;43660:5;43645:41;;;43677:8;43645:41;;;;;;:::i;:::-;;;;;;;;43379:315;;;:::o;38375:313::-;38531:28;38541:4;38547:2;38551:7;38531:9;:28::i;:::-;38578:47;38601:4;38607:2;38611:7;38620:4;38578:22;:47::i;:::-;38570:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;38375:313;;;;:::o;55315:624::-;55388:13;55414:23;55429:7;55414:14;:23::i;:::-;55450;55476:10;:19;55487:7;55476:19;;;;;;;;;;;55450:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55506:18;55527:10;:8;:10::i;:::-;55506:31;;55635:1;55619:4;55613:18;:23;55609:72;;;55660:9;55653:16;;;;;;55609:72;55811:1;55791:9;55785:23;:27;55781:108;;;55860:4;55866:9;55843:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;55829:48;;;;;;55781:108;55908:23;55923:7;55908:14;:23::i;:::-;55901:30;;;;55315:624;;;;:::o;39901:110::-;39977:26;39987:2;39991:7;39977:26;;;;;;;;;;;;:9;:26::i;:::-;39901:110;;:::o;48641:224::-;48743:4;48782:35;48767:50;;;:11;:50;;;;:90;;;;48821:36;48845:11;48821:23;:36::i;:::-;48767:90;48760:97;;48641:224;;;:::o;39001:127::-;39066:4;39118:1;39090:30;;:7;:16;39098:7;39090:16;;;;;;;;;;;;;;;;;;;;;:30;;;;39083:37;;39001:127;;;:::o;12127:505::-;12216:22;12224:4;12230:7;12216;:22::i;:::-;12211:414;;12404:41;12432:7;12404:41;;12442:2;12404:19;:41::i;:::-;12518:38;12546:4;12538:13;;12553:2;12518:19;:38::i;:::-;12309:270;;;;;;;;;:::i;:::-;;;;;;;;;;;;;12255:358;;;;;;;;;;;:::i;:::-;;;;;;;;12211:414;12127:505;;:::o;58474:205::-;58626:45;58653:4;58659:2;58663:7;58626:26;:45::i;:::-;58474:205;;;:::o;46418:125::-;;;;:::o;56537:206::-;56606:20;56618:7;56606:11;:20::i;:::-;56680:1;56649:10;:19;56660:7;56649:19;;;;;;;;;;;56643:33;;;;;:::i;:::-;;;:38;56639:97;;56705:10;:19;56716:7;56705:19;;;;;;;;;;;;56698:26;;;;:::i;:::-;56639:97;56537:206;:::o;44482:853::-;44636:4;44657:15;:2;:13;;;:15::i;:::-;44653:675;;;44709:2;44693:36;;;44730:12;:10;:12::i;:::-;44744:4;44750:7;44759:4;44693:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;44689:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44951:1;44934:6;:13;:18;44930:328;;;44977:60;;;;;;;;;;:::i;:::-;;;;;;;;44930:328;45208:6;45202:13;45193:6;45189:2;45185:15;45178:38;44689:584;44825:41;;;44815:51;;;:6;:51;;;;44808:58;;;;;44653:675;45312:4;45305:11;;44482:853;;;;;;;:::o;35169:94::-;35220:13;35246:9;;;;;;;;;;;;;;35169:94;:::o;34639:281::-;34712:13;34738:23;34753:7;34738:14;:23::i;:::-;34774:21;34798:10;:8;:10::i;:::-;34774:34;;34850:1;34832:7;34826:21;:25;:86;;;;;;;;;;;;;;;;;34878:7;34887:18;:7;:16;:18::i;:::-;34861:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;34826:86;34819:93;;;34639:281;;;:::o;40238:319::-;40367:18;40373:2;40377:7;40367:5;:18::i;:::-;40418:53;40449:1;40453:2;40457:7;40466:4;40418:22;:53::i;:::-;40396:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;40238:319;;;:::o;33368:305::-;33470:4;33522:25;33507:40;;;:11;:40;;;;:105;;;;33579:33;33564:48;;;:11;:48;;;;33507:105;:158;;;;33629:36;33653:11;33629:23;:36::i;:::-;33507:158;33487:178;;33368:305;;;:::o;5696:451::-;5771:13;5797:19;5842:1;5833:6;5829:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;5819:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5797:47;;5855:15;:6;5862:1;5855:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;5881;:6;5888:1;5881:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;5912:9;5937:1;5928:6;5924:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;5912:26;;5907:135;5944:1;5940;:5;5907:135;;;5979:12;6000:3;5992:5;:11;5979:25;;;;;;;:::i;:::-;;;;;5967:6;5974:1;5967:9;;;;;;;;:::i;:::-;;;;;:37;;;;;;;;;;;6029:1;6019:11;;;;;5947:3;;;;:::i;:::-;;;5907:135;;;;6069:1;6060:5;:10;6052:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;6132:6;6118:21;;;5696:451;;;;:::o;50317:589::-;50461:45;50488:4;50494:2;50498:7;50461:26;:45::i;:::-;50539:1;50523:18;;:4;:18;;;50519:187;;;50558:40;50590:7;50558:31;:40::i;:::-;50519:187;;;50628:2;50620:10;;:4;:10;;;50616:90;;50647:47;50680:4;50686:7;50647:32;:47::i;:::-;50616:90;50519:187;50734:1;50720:16;;:2;:16;;;50716:183;;;50753:45;50790:7;50753:36;:45::i;:::-;50716:183;;;50826:4;50820:10;;:2;:10;;;50816:83;;50847:40;50875:2;50879:7;50847:27;:40::i;:::-;50816:83;50716:183;50317:589;;;:::o;41561:420::-;41621:13;41637:23;41652:7;41637:14;:23::i;:::-;41621:39;;41673:48;41694:5;41709:1;41713:7;41673:20;:48::i;:::-;41762:29;41779:1;41783:7;41762:8;:29::i;:::-;41824:1;41804:9;:16;41814:5;41804:16;;;;;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;41843:7;:16;41851:7;41843:16;;;;;;;;;;;;41836:23;;;;;;;;;;;41905:7;41901:1;41877:36;;41886:5;41877:36;;;;;;;;;;;;41926:47;41946:5;41961:1;41965:7;41926:19;:47::i;:::-;41610:371;41561:420;:::o;24641:326::-;24701:4;24958:1;24936:7;:19;;;:23;24929:30;;24641:326;;;:::o;4395:723::-;4451:13;4681:1;4672:5;:10;4668:53;;;4699:10;;;;;;;;;;;;;;;;;;;;;4668:53;4731:12;4746:5;4731:20;;4762:14;4787:78;4802:1;4794:4;:9;4787:78;;4820:8;;;;;:::i;:::-;;;;4851:2;4843:10;;;;;:::i;:::-;;;4787:78;;;4875:19;4907:6;4897:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4875:39;;4925:154;4941:1;4932:5;:10;4925:154;;4969:1;4959:11;;;;;:::i;:::-;;;5036:2;5028:5;:10;;;;:::i;:::-;5015:2;:24;;;;:::i;:::-;5002:39;;4985:6;4992;4985:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;5065:2;5056:11;;;;;:::i;:::-;;;4925:154;;;5103:6;5089:21;;;;;4395:723;;;;:::o;40893:439::-;40987:1;40973:16;;:2;:16;;;;40965:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;41046:16;41054:7;41046;:16::i;:::-;41045:17;41037:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;41108:45;41137:1;41141:2;41145:7;41108:20;:45::i;:::-;41183:1;41166:9;:13;41176:2;41166:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;41214:2;41195:7;:16;41203:7;41195:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;41259:7;41255:2;41234:33;;41251:1;41234:33;;;;;;;;;;;;41280:44;41308:1;41312:2;41316:7;41280:19;:44::i;:::-;40893:439;;:::o;8244:157::-;8329:4;8368:25;8353:40;;;:11;:40;;;;8346:47;;8244:157;;;:::o;45907:126::-;;;;:::o;51629:164::-;51733:10;:17;;;;51706:15;:24;51722:7;51706:24;;;;;;;;;;;:44;;;;51761:10;51777:7;51761:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51629:164;:::o;52420:988::-;52686:22;52736:1;52711:22;52728:4;52711:16;:22::i;:::-;:26;;;;:::i;:::-;52686:51;;52748:18;52769:17;:26;52787:7;52769:26;;;;;;;;;;;;52748:47;;52916:14;52902:10;:28;52898:328;;52947:19;52969:12;:18;52982:4;52969:18;;;;;;;;;;;;;;;:34;52988:14;52969:34;;;;;;;;;;;;52947:56;;53053:11;53020:12;:18;53033:4;53020:18;;;;;;;;;;;;;;;:30;53039:10;53020:30;;;;;;;;;;;:44;;;;53170:10;53137:17;:30;53155:11;53137:30;;;;;;;;;;;:43;;;;52932:294;52898:328;53322:17;:26;53340:7;53322:26;;;;;;;;;;;53315:33;;;53366:12;:18;53379:4;53366:18;;;;;;;;;;;;;;;:34;53385:14;53366:34;;;;;;;;;;;53359:41;;;52501:907;;52420:988;;:::o;53703:1079::-;53956:22;54001:1;53981:10;:17;;;;:21;;;;:::i;:::-;53956:46;;54013:18;54034:15;:24;54050:7;54034:24;;;;;;;;;;;;54013:45;;54385:19;54407:10;54418:14;54407:26;;;;;;;;:::i;:::-;;;;;;;;;;54385:48;;54471:11;54446:10;54457;54446:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;54582:10;54551:15;:28;54567:11;54551:28;;;;;;;;;;;:41;;;;54723:15;:24;54739:7;54723:24;;;;;;;;;;;54716:31;;;54758:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;53774:1008;;;53703:1079;:::o;51207:221::-;51292:14;51309:20;51326:2;51309:16;:20::i;:::-;51292:37;;51367:7;51340:12;:16;51353:2;51340:16;;;;;;;;;;;;;;;:24;51357:6;51340:24;;;;;;;;;;;:34;;;;51414:6;51385:17;:26;51403:7;51385:26;;;;;;;;;;;:35;;;;51281:147;51207:221;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:118::-;5025:24;5043:5;5025:24;:::i;:::-;5020:3;5013:37;4938:118;;:::o;5062:222::-;5155:4;5193:2;5182:9;5178:18;5170:26;;5206:71;5274:1;5263:9;5259:17;5250:6;5206:71;:::i;:::-;5062:222;;;;:::o;5290:117::-;5399:1;5396;5389:12;5413:117;5522:1;5519;5512:12;5536:180;5584:77;5581:1;5574:88;5681:4;5678:1;5671:15;5705:4;5702:1;5695:15;5722:281;5805:27;5827:4;5805:27;:::i;:::-;5797:6;5793:40;5935:6;5923:10;5920:22;5899:18;5887:10;5884:34;5881:62;5878:88;;;5946:18;;:::i;:::-;5878:88;5986:10;5982:2;5975:22;5765:238;5722:281;;:::o;6009:129::-;6043:6;6070:20;;:::i;:::-;6060:30;;6099:33;6127:4;6119:6;6099:33;:::i;:::-;6009:129;;;:::o;6144:308::-;6206:4;6296:18;6288:6;6285:30;6282:56;;;6318:18;;:::i;:::-;6282:56;6356:29;6378:6;6356:29;:::i;:::-;6348:37;;6440:4;6434;6430:15;6422:23;;6144:308;;;:::o;6458:154::-;6542:6;6537:3;6532;6519:30;6604:1;6595:6;6590:3;6586:16;6579:27;6458:154;;;:::o;6618:412::-;6696:5;6721:66;6737:49;6779:6;6737:49;:::i;:::-;6721:66;:::i;:::-;6712:75;;6810:6;6803:5;6796:21;6848:4;6841:5;6837:16;6886:3;6877:6;6872:3;6868:16;6865:25;6862:112;;;6893:79;;:::i;:::-;6862:112;6983:41;7017:6;7012:3;7007;6983:41;:::i;:::-;6702:328;6618:412;;;;;:::o;7050:340::-;7106:5;7155:3;7148:4;7140:6;7136:17;7132:27;7122:122;;7163:79;;:::i;:::-;7122:122;7280:6;7267:20;7305:79;7380:3;7372:6;7365:4;7357:6;7353:17;7305:79;:::i;:::-;7296:88;;7112:278;7050:340;;;;:::o;7396:654::-;7474:6;7482;7531:2;7519:9;7510:7;7506:23;7502:32;7499:119;;;7537:79;;:::i;:::-;7499:119;7657:1;7682:53;7727:7;7718:6;7707:9;7703:22;7682:53;:::i;:::-;7672:63;;7628:117;7812:2;7801:9;7797:18;7784:32;7843:18;7835:6;7832:30;7829:117;;;7865:79;;:::i;:::-;7829:117;7970:63;8025:7;8016:6;8005:9;8001:22;7970:63;:::i;:::-;7960:73;;7755:288;7396:654;;;;;:::o;8056:619::-;8133:6;8141;8149;8198:2;8186:9;8177:7;8173:23;8169:32;8166:119;;;8204:79;;:::i;:::-;8166:119;8324:1;8349:53;8394:7;8385:6;8374:9;8370:22;8349:53;:::i;:::-;8339:63;;8295:117;8451:2;8477:53;8522:7;8513:6;8502:9;8498:22;8477:53;:::i;:::-;8467:63;;8422:118;8579:2;8605:53;8650:7;8641:6;8630:9;8626:22;8605:53;:::i;:::-;8595:63;;8550:118;8056:619;;;;;:::o;8681:77::-;8718:7;8747:5;8736:16;;8681:77;;;:::o;8764:122::-;8837:24;8855:5;8837:24;:::i;:::-;8830:5;8827:35;8817:63;;8876:1;8873;8866:12;8817:63;8764:122;:::o;8892:139::-;8938:5;8976:6;8963:20;8954:29;;8992:33;9019:5;8992:33;:::i;:::-;8892:139;;;;:::o;9037:329::-;9096:6;9145:2;9133:9;9124:7;9120:23;9116:32;9113:119;;;9151:79;;:::i;:::-;9113:119;9271:1;9296:53;9341:7;9332:6;9321:9;9317:22;9296:53;:::i;:::-;9286:63;;9242:117;9037:329;;;;:::o;9372:118::-;9459:24;9477:5;9459:24;:::i;:::-;9454:3;9447:37;9372:118;;:::o;9496:222::-;9589:4;9627:2;9616:9;9612:18;9604:26;;9640:71;9708:1;9697:9;9693:17;9684:6;9640:71;:::i;:::-;9496:222;;;;:::o;9724:474::-;9792:6;9800;9849:2;9837:9;9828:7;9824:23;9820:32;9817:119;;;9855:79;;:::i;:::-;9817:119;9975:1;10000:53;10045:7;10036:6;10025:9;10021:22;10000:53;:::i;:::-;9990:63;;9946:117;10102:2;10128:53;10173:7;10164:6;10153:9;10149:22;10128:53;:::i;:::-;10118:63;;10073:118;9724:474;;;;;:::o;10204:329::-;10263:6;10312:2;10300:9;10291:7;10287:23;10283:32;10280:119;;;10318:79;;:::i;:::-;10280:119;10438:1;10463:53;10508:7;10499:6;10488:9;10484:22;10463:53;:::i;:::-;10453:63;;10409:117;10204:329;;;;:::o;10539:116::-;10609:21;10624:5;10609:21;:::i;:::-;10602:5;10599:32;10589:60;;10645:1;10642;10635:12;10589:60;10539:116;:::o;10661:133::-;10704:5;10742:6;10729:20;10720:29;;10758:30;10782:5;10758:30;:::i;:::-;10661:133;;;;:::o;10800:468::-;10865:6;10873;10922:2;10910:9;10901:7;10897:23;10893:32;10890:119;;;10928:79;;:::i;:::-;10890:119;11048:1;11073:53;11118:7;11109:6;11098:9;11094:22;11073:53;:::i;:::-;11063:63;;11019:117;11175:2;11201:50;11243:7;11234:6;11223:9;11219:22;11201:50;:::i;:::-;11191:60;;11146:115;10800:468;;;;;:::o;11274:307::-;11335:4;11425:18;11417:6;11414:30;11411:56;;;11447:18;;:::i;:::-;11411:56;11485:29;11507:6;11485:29;:::i;:::-;11477:37;;11569:4;11563;11559:15;11551:23;;11274:307;;;:::o;11587:410::-;11664:5;11689:65;11705:48;11746:6;11705:48;:::i;:::-;11689:65;:::i;:::-;11680:74;;11777:6;11770:5;11763:21;11815:4;11808:5;11804:16;11853:3;11844:6;11839:3;11835:16;11832:25;11829:112;;;11860:79;;:::i;:::-;11829:112;11950:41;11984:6;11979:3;11974;11950:41;:::i;:::-;11670:327;11587:410;;;;;:::o;12016:338::-;12071:5;12120:3;12113:4;12105:6;12101:17;12097:27;12087:122;;12128:79;;:::i;:::-;12087:122;12245:6;12232:20;12270:78;12344:3;12336:6;12329:4;12321:6;12317:17;12270:78;:::i;:::-;12261:87;;12077:277;12016:338;;;;:::o;12360:943::-;12455:6;12463;12471;12479;12528:3;12516:9;12507:7;12503:23;12499:33;12496:120;;;12535:79;;:::i;:::-;12496:120;12655:1;12680:53;12725:7;12716:6;12705:9;12701:22;12680:53;:::i;:::-;12670:63;;12626:117;12782:2;12808:53;12853:7;12844:6;12833:9;12829:22;12808:53;:::i;:::-;12798:63;;12753:118;12910:2;12936:53;12981:7;12972:6;12961:9;12957:22;12936:53;:::i;:::-;12926:63;;12881:118;13066:2;13055:9;13051:18;13038:32;13097:18;13089:6;13086:30;13083:117;;;13119:79;;:::i;:::-;13083:117;13224:62;13278:7;13269:6;13258:9;13254:22;13224:62;:::i;:::-;13214:72;;13009:287;12360:943;;;;;;;:::o;13309:799::-;13396:6;13404;13412;13461:2;13449:9;13440:7;13436:23;13432:32;13429:119;;;13467:79;;:::i;:::-;13429:119;13587:1;13612:53;13657:7;13648:6;13637:9;13633:22;13612:53;:::i;:::-;13602:63;;13558:117;13714:2;13740:53;13785:7;13776:6;13765:9;13761:22;13740:53;:::i;:::-;13730:63;;13685:118;13870:2;13859:9;13855:18;13842:32;13901:18;13893:6;13890:30;13887:117;;;13923:79;;:::i;:::-;13887:117;14028:63;14083:7;14074:6;14063:9;14059:22;14028:63;:::i;:::-;14018:73;;13813:288;13309:799;;;;;:::o;14114:474::-;14182:6;14190;14239:2;14227:9;14218:7;14214:23;14210:32;14207:119;;;14245:79;;:::i;:::-;14207:119;14365:1;14390:53;14435:7;14426:6;14415:9;14411:22;14390:53;:::i;:::-;14380:63;;14336:117;14492:2;14518:53;14563:7;14554:6;14543:9;14539:22;14518:53;:::i;:::-;14508:63;;14463:118;14114:474;;;;;:::o;14594:180::-;14642:77;14639:1;14632:88;14739:4;14736:1;14729:15;14763:4;14760:1;14753:15;14780:320;14824:6;14861:1;14855:4;14851:12;14841:22;;14908:1;14902:4;14898:12;14929:18;14919:81;;14985:4;14977:6;14973:17;14963:27;;14919:81;15047:2;15039:6;15036:14;15016:18;15013:38;15010:84;;;15066:18;;:::i;:::-;15010:84;14831:269;14780:320;;;:::o;15106:220::-;15246:34;15242:1;15234:6;15230:14;15223:58;15315:3;15310:2;15302:6;15298:15;15291:28;15106:220;:::o;15332:366::-;15474:3;15495:67;15559:2;15554:3;15495:67;:::i;:::-;15488:74;;15571:93;15660:3;15571:93;:::i;:::-;15689:2;15684:3;15680:12;15673:19;;15332:366;;;:::o;15704:419::-;15870:4;15908:2;15897:9;15893:18;15885:26;;15957:9;15951:4;15947:20;15943:1;15932:9;15928:17;15921:47;15985:131;16111:4;15985:131;:::i;:::-;15977:139;;15704:419;;;:::o;16129:249::-;16269:34;16265:1;16257:6;16253:14;16246:58;16338:32;16333:2;16325:6;16321:15;16314:57;16129:249;:::o;16384:366::-;16526:3;16547:67;16611:2;16606:3;16547:67;:::i;:::-;16540:74;;16623:93;16712:3;16623:93;:::i;:::-;16741:2;16736:3;16732:12;16725:19;;16384:366;;;:::o;16756:419::-;16922:4;16960:2;16949:9;16945:18;16937:26;;17009:9;17003:4;16999:20;16995:1;16984:9;16980:17;16973:47;17037:131;17163:4;17037:131;:::i;:::-;17029:139;;16756:419;;;:::o;17181:233::-;17321:34;17317:1;17309:6;17305:14;17298:58;17390:16;17385:2;17377:6;17373:15;17366:41;17181:233;:::o;17420:366::-;17562:3;17583:67;17647:2;17642:3;17583:67;:::i;:::-;17576:74;;17659:93;17748:3;17659:93;:::i;:::-;17777:2;17772:3;17768:12;17761:19;;17420:366;;;:::o;17792:419::-;17958:4;17996:2;17985:9;17981:18;17973:26;;18045:9;18039:4;18035:20;18031:1;18020:9;18016:17;18009:47;18073:131;18199:4;18073:131;:::i;:::-;18065:139;;17792:419;;;:::o;18217:230::-;18357:34;18353:1;18345:6;18341:14;18334:58;18426:13;18421:2;18413:6;18409:15;18402:38;18217:230;:::o;18453:366::-;18595:3;18616:67;18680:2;18675:3;18616:67;:::i;:::-;18609:74;;18692:93;18781:3;18692:93;:::i;:::-;18810:2;18805:3;18801:12;18794:19;;18453:366;;;:::o;18825:419::-;18991:4;19029:2;19018:9;19014:18;19006:26;;19078:9;19072:4;19068:20;19064:1;19053:9;19049:17;19042:47;19106:131;19232:4;19106:131;:::i;:::-;19098:139;;18825:419;;;:::o;19250:234::-;19390:34;19386:1;19378:6;19374:14;19367:58;19459:17;19454:2;19446:6;19442:15;19435:42;19250:234;:::o;19490:366::-;19632:3;19653:67;19717:2;19712:3;19653:67;:::i;:::-;19646:74;;19729:93;19818:3;19729:93;:::i;:::-;19847:2;19842:3;19838:12;19831:19;;19490:366;;;:::o;19862:419::-;20028:4;20066:2;20055:9;20051:18;20043:26;;20115:9;20109:4;20105:20;20101:1;20090:9;20086:17;20079:47;20143:131;20269:4;20143:131;:::i;:::-;20135:139;;19862:419;;;:::o;20287:231::-;20427:34;20423:1;20415:6;20411:14;20404:58;20496:14;20491:2;20483:6;20479:15;20472:39;20287:231;:::o;20524:366::-;20666:3;20687:67;20751:2;20746:3;20687:67;:::i;:::-;20680:74;;20763:93;20852:3;20763:93;:::i;:::-;20881:2;20876:3;20872:12;20865:19;;20524:366;;;:::o;20896:419::-;21062:4;21100:2;21089:9;21085:18;21077:26;;21149:9;21143:4;21139:20;21135:1;21124:9;21120:17;21113:47;21177:131;21303:4;21177:131;:::i;:::-;21169:139;;20896:419;;;:::o;21321:180::-;21369:77;21366:1;21359:88;21466:4;21463:1;21456:15;21490:4;21487:1;21480:15;21507:174;21647:26;21643:1;21635:6;21631:14;21624:50;21507:174;:::o;21687:366::-;21829:3;21850:67;21914:2;21909:3;21850:67;:::i;:::-;21843:74;;21926:93;22015:3;21926:93;:::i;:::-;22044:2;22039:3;22035:12;22028:19;;21687:366;;;:::o;22059:419::-;22225:4;22263:2;22252:9;22248:18;22240:26;;22312:9;22306:4;22302:20;22298:1;22287:9;22283:17;22276:47;22340:131;22466:4;22340:131;:::i;:::-;22332:139;;22059:419;;;:::o;22484:228::-;22624:34;22620:1;22612:6;22608:14;22601:58;22693:11;22688:2;22680:6;22676:15;22669:36;22484:228;:::o;22718:366::-;22860:3;22881:67;22945:2;22940:3;22881:67;:::i;:::-;22874:74;;22957:93;23046:3;22957:93;:::i;:::-;23075:2;23070:3;23066:12;23059:19;;22718:366;;;:::o;23090:419::-;23256:4;23294:2;23283:9;23279:18;23271:26;;23343:9;23337:4;23333:20;23329:1;23318:9;23314:17;23307:47;23371:131;23497:4;23371:131;:::i;:::-;23363:139;;23090:419;;;:::o;23515:233::-;23655:34;23651:1;23643:6;23639:14;23632:58;23724:16;23719:2;23711:6;23707:15;23700:41;23515:233;:::o;23754:366::-;23896:3;23917:67;23981:2;23976:3;23917:67;:::i;:::-;23910:74;;23993:93;24082:3;23993:93;:::i;:::-;24111:2;24106:3;24102:12;24095:19;;23754:366;;;:::o;24126:419::-;24292:4;24330:2;24319:9;24315:18;24307:26;;24379:9;24373:4;24369:20;24365:1;24354:9;24350:17;24343:47;24407:131;24533:4;24407:131;:::i;:::-;24399:139;;24126:419;;;:::o;24551:224::-;24691:34;24687:1;24679:6;24675:14;24668:58;24760:7;24755:2;24747:6;24743:15;24736:32;24551:224;:::o;24781:366::-;24923:3;24944:67;25008:2;25003:3;24944:67;:::i;:::-;24937:74;;25020:93;25109:3;25020:93;:::i;:::-;25138:2;25133:3;25129:12;25122:19;;24781:366;;;:::o;25153:419::-;25319:4;25357:2;25346:9;25342:18;25334:26;;25406:9;25400:4;25396:20;25392:1;25381:9;25377:17;25370:47;25434:131;25560:4;25434:131;:::i;:::-;25426:139;;25153:419;;;:::o;25578:223::-;25718:34;25714:1;25706:6;25702:14;25695:58;25787:6;25782:2;25774:6;25770:15;25763:31;25578:223;:::o;25807:366::-;25949:3;25970:67;26034:2;26029:3;25970:67;:::i;:::-;25963:74;;26046:93;26135:3;26046:93;:::i;:::-;26164:2;26159:3;26155:12;26148:19;;25807:366;;;:::o;26179:419::-;26345:4;26383:2;26372:9;26368:18;26360:26;;26432:9;26426:4;26422:20;26418:1;26407:9;26403:17;26396:47;26460:131;26586:4;26460:131;:::i;:::-;26452:139;;26179:419;;;:::o;26604:180::-;26652:77;26649:1;26642:88;26749:4;26746:1;26739:15;26773:4;26770:1;26763:15;26790:191;26830:4;26850:20;26868:1;26850:20;:::i;:::-;26845:25;;26884:20;26902:1;26884:20;:::i;:::-;26879:25;;26923:1;26920;26917:8;26914:34;;;26928:18;;:::i;:::-;26914:34;26973:1;26970;26966:9;26958:17;;26790:191;;;;:::o;26987:305::-;27027:3;27046:20;27064:1;27046:20;:::i;:::-;27041:25;;27080:20;27098:1;27080:20;:::i;:::-;27075:25;;27234:1;27166:66;27162:74;27159:1;27156:81;27153:107;;;27240:18;;:::i;:::-;27153:107;27284:1;27281;27277:9;27270:16;;26987:305;;;;:::o;27298:175::-;27438:27;27434:1;27426:6;27422:14;27415:51;27298:175;:::o;27479:366::-;27621:3;27642:67;27706:2;27701:3;27642:67;:::i;:::-;27635:74;;27718:93;27807:3;27718:93;:::i;:::-;27836:2;27831:3;27827:12;27820:19;;27479:366;;;:::o;27851:419::-;28017:4;28055:2;28044:9;28040:18;28032:26;;28104:9;28098:4;28094:20;28090:1;28079:9;28075:17;28068:47;28132:131;28258:4;28132:131;:::i;:::-;28124:139;;27851:419;;;:::o;28276:237::-;28416:34;28412:1;28404:6;28400:14;28393:58;28485:20;28480:2;28472:6;28468:15;28461:45;28276:237;:::o;28519:366::-;28661:3;28682:67;28746:2;28741:3;28682:67;:::i;:::-;28675:74;;28758:93;28847:3;28758:93;:::i;:::-;28876:2;28871:3;28867:12;28860:19;;28519:366;;;:::o;28891:419::-;29057:4;29095:2;29084:9;29080:18;29072:26;;29144:9;29138:4;29134:20;29130:1;29119:9;29115:17;29108:47;29172:131;29298:4;29172:131;:::i;:::-;29164:139;;28891:419;;;:::o;29316:148::-;29418:11;29455:3;29440:18;;29316:148;;;;:::o;29470:377::-;29576:3;29604:39;29637:5;29604:39;:::i;:::-;29659:89;29741:6;29736:3;29659:89;:::i;:::-;29652:96;;29757:52;29802:6;29797:3;29790:4;29783:5;29779:16;29757:52;:::i;:::-;29834:6;29829:3;29825:16;29818:23;;29580:267;29470:377;;;;:::o;29853:435::-;30033:3;30055:95;30146:3;30137:6;30055:95;:::i;:::-;30048:102;;30167:95;30258:3;30249:6;30167:95;:::i;:::-;30160:102;;30279:3;30272:10;;29853:435;;;;;:::o;30294:173::-;30434:25;30430:1;30422:6;30418:14;30411:49;30294:173;:::o;30473:402::-;30633:3;30654:85;30736:2;30731:3;30654:85;:::i;:::-;30647:92;;30748:93;30837:3;30748:93;:::i;:::-;30866:2;30861:3;30857:12;30850:19;;30473:402;;;:::o;30881:167::-;31021:19;31017:1;31009:6;31005:14;30998:43;30881:167;:::o;31054:402::-;31214:3;31235:85;31317:2;31312:3;31235:85;:::i;:::-;31228:92;;31329:93;31418:3;31329:93;:::i;:::-;31447:2;31442:3;31438:12;31431:19;;31054:402;;;:::o;31462:967::-;31844:3;31866:148;32010:3;31866:148;:::i;:::-;31859:155;;32031:95;32122:3;32113:6;32031:95;:::i;:::-;32024:102;;32143:148;32287:3;32143:148;:::i;:::-;32136:155;;32308:95;32399:3;32390:6;32308:95;:::i;:::-;32301:102;;32420:3;32413:10;;31462:967;;;;;:::o;32435:98::-;32486:6;32520:5;32514:12;32504:22;;32435:98;;;:::o;32539:168::-;32622:11;32656:6;32651:3;32644:19;32696:4;32691:3;32687:14;32672:29;;32539:168;;;;:::o;32713:360::-;32799:3;32827:38;32859:5;32827:38;:::i;:::-;32881:70;32944:6;32939:3;32881:70;:::i;:::-;32874:77;;32960:52;33005:6;33000:3;32993:4;32986:5;32982:16;32960:52;:::i;:::-;33037:29;33059:6;33037:29;:::i;:::-;33032:3;33028:39;33021:46;;32803:270;32713:360;;;;:::o;33079:640::-;33274:4;33312:3;33301:9;33297:19;33289:27;;33326:71;33394:1;33383:9;33379:17;33370:6;33326:71;:::i;:::-;33407:72;33475:2;33464:9;33460:18;33451:6;33407:72;:::i;:::-;33489;33557:2;33546:9;33542:18;33533:6;33489:72;:::i;:::-;33608:9;33602:4;33598:20;33593:2;33582:9;33578:18;33571:48;33636:76;33707:4;33698:6;33636:76;:::i;:::-;33628:84;;33079:640;;;;;;;:::o;33725:141::-;33781:5;33812:6;33806:13;33797:22;;33828:32;33854:5;33828:32;:::i;:::-;33725:141;;;;:::o;33872:349::-;33941:6;33990:2;33978:9;33969:7;33965:23;33961:32;33958:119;;;33996:79;;:::i;:::-;33958:119;34116:1;34141:63;34196:7;34187:6;34176:9;34172:22;34141:63;:::i;:::-;34131:73;;34087:127;33872:349;;;;:::o;34227:348::-;34267:7;34290:20;34308:1;34290:20;:::i;:::-;34285:25;;34324:20;34342:1;34324:20;:::i;:::-;34319:25;;34512:1;34444:66;34440:74;34437:1;34434:81;34429:1;34422:9;34415:17;34411:105;34408:131;;;34519:18;;:::i;:::-;34408:131;34567:1;34564;34560:9;34549:20;;34227:348;;;;:::o;34581:171::-;34620:3;34643:24;34661:5;34643:24;:::i;:::-;34634:33;;34689:4;34682:5;34679:15;34676:41;;;34697:18;;:::i;:::-;34676:41;34744:1;34737:5;34733:13;34726:20;;34581:171;;;:::o;34758:182::-;34898:34;34894:1;34886:6;34882:14;34875:58;34758:182;:::o;34946:366::-;35088:3;35109:67;35173:2;35168:3;35109:67;:::i;:::-;35102:74;;35185:93;35274:3;35185:93;:::i;:::-;35303:2;35298:3;35294:12;35287:19;;34946:366;;;:::o;35318:419::-;35484:4;35522:2;35511:9;35507:18;35499:26;;35571:9;35565:4;35561:20;35557:1;35546:9;35542:17;35535:47;35599:131;35725:4;35599:131;:::i;:::-;35591:139;;35318:419;;;:::o;35743:233::-;35782:3;35805:24;35823:5;35805:24;:::i;:::-;35796:33;;35851:66;35844:5;35841:77;35838:103;;;35921:18;;:::i;:::-;35838:103;35968:1;35961:5;35957:13;35950:20;;35743:233;;;:::o;35982:180::-;36030:77;36027:1;36020:88;36127:4;36124:1;36117:15;36151:4;36148:1;36141:15;36168:185;36208:1;36225:20;36243:1;36225:20;:::i;:::-;36220:25;;36259:20;36277:1;36259:20;:::i;:::-;36254:25;;36298:1;36288:35;;36303:18;;:::i;:::-;36288:35;36345:1;36342;36338:9;36333:14;;36168:185;;;;:::o;36359:176::-;36391:1;36408:20;36426:1;36408:20;:::i;:::-;36403:25;;36442:20;36460:1;36442:20;:::i;:::-;36437:25;;36481:1;36471:35;;36486:18;;:::i;:::-;36471:35;36527:1;36524;36520:9;36515:14;;36359:176;;;;:::o;36541:182::-;36681:34;36677:1;36669:6;36665:14;36658:58;36541:182;:::o;36729:366::-;36871:3;36892:67;36956:2;36951:3;36892:67;:::i;:::-;36885:74;;36968:93;37057:3;36968:93;:::i;:::-;37086:2;37081:3;37077:12;37070:19;;36729:366;;;:::o;37101:419::-;37267:4;37305:2;37294:9;37290:18;37282:26;;37354:9;37348:4;37344:20;37340:1;37329:9;37325:17;37318:47;37382:131;37508:4;37382:131;:::i;:::-;37374:139;;37101:419;;;:::o;37526:178::-;37666:30;37662:1;37654:6;37650:14;37643:54;37526:178;:::o;37710:366::-;37852:3;37873:67;37937:2;37932:3;37873:67;:::i;:::-;37866:74;;37949:93;38038:3;37949:93;:::i;:::-;38067:2;38062:3;38058:12;38051:19;;37710:366;;;:::o;38082:419::-;38248:4;38286:2;38275:9;38271:18;38263:26;;38335:9;38329:4;38325:20;38321:1;38310:9;38306:17;38299:47;38363:131;38489:4;38363:131;:::i;:::-;38355:139;;38082:419;;;:::o;38507:180::-;38555:77;38552:1;38545:88;38652:4;38649:1;38642:15;38676:4;38673:1;38666:15
Swarm Source
ipfs://fc64b4570ecd6eefbc504335b4550986c643b47c9ad9da44a932fb6e572b7b2b