Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Source Code Verified (Exact Match)
Contract Name:
Matr1xKuku
Compiler Version
v0.8.13+commit.abaa5c0e
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-12-11 */ // SPDX-License-Identifier: MIT // File: operator-filter-registry/src/lib/Constants.sol pragma solidity ^0.8.13; address constant CANONICAL_OPERATOR_FILTER_REGISTRY_ADDRESS = 0x000000000000AAeB6D7670E522A718067333cd4E; address constant CANONICAL_CORI_SUBSCRIPTION = 0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6; // File: operator-filter-registry/src/IOperatorFilterRegistry.sol pragma solidity ^0.8.13; interface IOperatorFilterRegistry { /** * @notice Returns true if operator is not filtered for a given token, either by address or codeHash. Also returns * true if supplied registrant address is not registered. */ function isOperatorAllowed(address registrant, address operator) external view returns (bool); /** * @notice Registers an address with the registry. May be called by address itself or by EIP-173 owner. */ function register(address registrant) external; /** * @notice Registers an address with the registry and "subscribes" to another address's filtered operators and codeHashes. */ function registerAndSubscribe(address registrant, address subscription) external; /** * @notice Registers an address with the registry and copies the filtered operators and codeHashes from another * address without subscribing. */ function registerAndCopyEntries(address registrant, address registrantToCopy) external; /** * @notice Unregisters an address with the registry and removes its subscription. May be called by address itself or by EIP-173 owner. * Note that this does not remove any filtered addresses or codeHashes. * Also note that any subscriptions to this registrant will still be active and follow the existing filtered addresses and codehashes. */ function unregister(address addr) external; /** * @notice Update an operator address for a registered address - when filtered is true, the operator is filtered. */ function updateOperator(address registrant, address operator, bool filtered) external; /** * @notice Update multiple operators for a registered address - when filtered is true, the operators will be filtered. Reverts on duplicates. */ function updateOperators(address registrant, address[] calldata operators, bool filtered) external; /** * @notice Update a codeHash for a registered address - when filtered is true, the codeHash is filtered. */ function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external; /** * @notice Update multiple codeHashes for a registered address - when filtered is true, the codeHashes will be filtered. Reverts on duplicates. */ function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external; /** * @notice Subscribe an address to another registrant's filtered operators and codeHashes. Will remove previous * subscription if present. * Note that accounts with subscriptions may go on to subscribe to other accounts - in this case, * subscriptions will not be forwarded. Instead the former subscription's existing entries will still be * used. */ function subscribe(address registrant, address registrantToSubscribe) external; /** * @notice Unsubscribe an address from its current subscribed registrant, and optionally copy its filtered operators and codeHashes. */ function unsubscribe(address registrant, bool copyExistingEntries) external; /** * @notice Get the subscription address of a given registrant, if any. */ function subscriptionOf(address addr) external returns (address registrant); /** * @notice Get the set of addresses subscribed to a given registrant. * Note that order is not guaranteed as updates are made. */ function subscribers(address registrant) external returns (address[] memory); /** * @notice Get the subscriber at a given index in the set of addresses subscribed to a given registrant. * Note that order is not guaranteed as updates are made. */ function subscriberAt(address registrant, uint256 index) external returns (address); /** * @notice Copy filtered operators and codeHashes from a different registrantToCopy to addr. */ function copyEntriesOf(address registrant, address registrantToCopy) external; /** * @notice Returns true if operator is filtered by a given address or its subscription. */ function isOperatorFiltered(address registrant, address operator) external returns (bool); /** * @notice Returns true if the hash of an address's code is filtered by a given address or its subscription. */ function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool); /** * @notice Returns true if a codeHash is filtered by a given address or its subscription. */ function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool); /** * @notice Returns a list of filtered operators for a given address or its subscription. */ function filteredOperators(address addr) external returns (address[] memory); /** * @notice Returns the set of filtered codeHashes for a given address or its subscription. * Note that order is not guaranteed as updates are made. */ function filteredCodeHashes(address addr) external returns (bytes32[] memory); /** * @notice Returns the filtered operator at the given index of the set of filtered operators for a given address or * its subscription. * Note that order is not guaranteed as updates are made. */ function filteredOperatorAt(address registrant, uint256 index) external returns (address); /** * @notice Returns the filtered codeHash at the given index of the list of filtered codeHashes for a given address or * its subscription. * Note that order is not guaranteed as updates are made. */ function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32); /** * @notice Returns true if an address has registered */ function isRegistered(address addr) external returns (bool); /** * @dev Convenience method to compute the code hash of an arbitrary contract */ function codeHashOf(address addr) external returns (bytes32); } // File: @openzeppelin/contracts-upgradeable/utils/StorageSlotUpgradeable.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/StorageSlot.sol) pragma solidity ^0.8.0; /** * @dev Library for reading and writing primitive types to specific storage slots. * * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts. * This library helps with reading and writing to such slots without the need for inline assembly. * * The functions in this library return Slot structs that contain a `value` member that can be used to read or write. * * Example usage to set ERC1967 implementation slot: * ``` * contract ERC1967 { * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; * * function _getImplementation() internal view returns (address) { * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value; * } * * function _setImplementation(address newImplementation) internal { * require(Address.isContract(newImplementation), "ERC1967: new implementation is not a contract"); * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation; * } * } * ``` * * _Available since v4.1 for `address`, `bool`, `bytes32`, and `uint256`._ */ library StorageSlotUpgradeable { struct AddressSlot { address value; } struct BooleanSlot { bool value; } struct Bytes32Slot { bytes32 value; } struct Uint256Slot { uint256 value; } /** * @dev Returns an `AddressSlot` with member `value` located at `slot`. */ function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `BooleanSlot` with member `value` located at `slot`. */ function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `Bytes32Slot` with member `value` located at `slot`. */ function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `Uint256Slot` with member `value` located at `slot`. */ function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } } // File: @openzeppelin/contracts-upgradeable/proxy/beacon/IBeaconUpgradeable.sol // OpenZeppelin Contracts v4.4.1 (proxy/beacon/IBeacon.sol) pragma solidity ^0.8.0; /** * @dev This is the interface that {BeaconProxy} expects of its beacon. */ interface IBeaconUpgradeable { /** * @dev Must return an address that can be used as a delegate call target. * * {BeaconProxy} will check that this address is a contract. */ function implementation() external view returns (address); } // File: @openzeppelin/contracts-upgradeable/interfaces/draft-IERC1822Upgradeable.sol // OpenZeppelin Contracts (last updated v4.5.0) (interfaces/draft-IERC1822.sol) pragma solidity ^0.8.0; /** * @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified * proxy whose upgrades are fully controlled by the current implementation. */ interface IERC1822ProxiableUpgradeable { /** * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation * address. * * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this * function revert if invoked through a proxy. */ function proxiableUUID() external view returns (bytes32); } // File: @openzeppelin/contracts-upgradeable/access/IAccessControlUpgradeable.sol // OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol) pragma solidity ^0.8.0; /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControlUpgradeable { /** * @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-upgradeable/token/ERC721/IERC721ReceiverUpgradeable.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 IERC721ReceiverUpgradeable { /** * @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-upgradeable/utils/introspection/IERC165Upgradeable.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 IERC165Upgradeable { /** * @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-upgradeable/interfaces/IERC2981Upgradeable.sol // OpenZeppelin Contracts (last updated v4.6.0) (interfaces/IERC2981.sol) pragma solidity ^0.8.0; /** * @dev Interface for the NFT Royalty Standard. * * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal * support for royalty payments across all NFT marketplaces and ecosystem participants. * * _Available since v4.5._ */ interface IERC2981Upgradeable is IERC165Upgradeable { /** * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of * exchange. The royalty amount is denominated and should be paid in that same unit of exchange. */ function royaltyInfo(uint256 tokenId, uint256 salePrice) external view returns (address receiver, uint256 royaltyAmount); } // File: @openzeppelin/contracts-upgradeable/token/ERC721/IERC721Upgradeable.sol // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721Upgradeable is IERC165Upgradeable { /** * @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: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721 * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must * understand this adds an external call which potentially creates a reentrancy vulnerability. * * 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-upgradeable/token/ERC721/extensions/IERC721MetadataUpgradeable.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 IERC721MetadataUpgradeable is IERC721Upgradeable { /** * @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-upgradeable/utils/AddressUpgradeable.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library AddressUpgradeable { /** * @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 functionCallWithValue(target, data, 0, "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"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, 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) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or 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 { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // 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-upgradeable/proxy/utils/Initializable.sol // OpenZeppelin Contracts (last updated v4.8.1) (proxy/utils/Initializable.sol) pragma solidity ^0.8.2; /** * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be * reused. This mechanism prevents re-execution of each "step" but allows the creation of new initialization steps in * case an upgrade adds a module that needs to be initialized. * * For example: * * [.hljs-theme-light.nopadding] * ``` * contract MyToken is ERC20Upgradeable { * function initialize() initializer public { * __ERC20_init("MyToken", "MTK"); * } * } * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable { * function initializeV2() reinitializer(2) public { * __ERC20Permit_init("MyToken"); * } * } * ``` * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. * * [CAUTION] * ==== * Avoid leaving a contract uninitialized. * * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed: * * [.hljs-theme-light.nopadding] * ``` * /// @custom:oz-upgrades-unsafe-allow constructor * constructor() { * _disableInitializers(); * } * ``` * ==== */ abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. * @custom:oz-retyped-from bool */ uint8 private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Triggered when the contract has been initialized or reinitialized. */ event Initialized(uint8 version); /** * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope, * `onlyInitializing` functions can be used to initialize parent contracts. * * Similar to `reinitializer(1)`, except that functions marked with `initializer` can be nested in the context of a * constructor. * * Emits an {Initialized} event. */ modifier initializer() { bool isTopLevelCall = !_initializing; require( (isTopLevelCall && _initialized < 1) || (!AddressUpgradeable.isContract(address(this)) && _initialized == 1), "Initializable: contract is already initialized" ); _initialized = 1; if (isTopLevelCall) { _initializing = true; } _; if (isTopLevelCall) { _initializing = false; emit Initialized(1); } } /** * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be * used to initialize parent contracts. * * A reinitializer may be used after the original initialization step. This is essential to configure modules that * are added through upgrades and that require initialization. * * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer` * cannot be nested. If one is invoked in the context of another, execution will revert. * * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in * a contract, executing them in the right order is up to the developer or operator. * * WARNING: setting the version to 255 will prevent any future reinitialization. * * Emits an {Initialized} event. */ modifier reinitializer(uint8 version) { require(!_initializing && _initialized < version, "Initializable: contract is already initialized"); _initialized = version; _initializing = true; _; _initializing = false; emit Initialized(version); } /** * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the * {initializer} and {reinitializer} modifiers, directly or indirectly. */ modifier onlyInitializing() { require(_initializing, "Initializable: contract is not initializing"); _; } /** * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call. * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized * to any version. It is recommended to use this to lock implementation contracts that are designed to be called * through proxies. * * Emits an {Initialized} event the first time it is successfully executed. */ function _disableInitializers() internal virtual { require(!_initializing, "Initializable: contract is initializing"); if (_initialized < type(uint8).max) { _initialized = type(uint8).max; emit Initialized(type(uint8).max); } } /** * @dev Returns the highest version that has been initialized. See {reinitializer}. */ function _getInitializedVersion() internal view returns (uint8) { return _initialized; } /** * @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}. */ function _isInitializing() internal view returns (bool) { return _initializing; } } // File: operator-filter-registry/src/upgradeable/OperatorFiltererUpgradeable.sol pragma solidity ^0.8.13; /** * @title OperatorFiltererUpgradeable * @notice Abstract contract whose constructor automatically registers and optionally subscribes to or copies another * registrant's entries in the OperatorFilterRegistry when the init function is called. * @dev This smart contract is meant to be inherited by token contracts so they can use the following: * - `onlyAllowedOperator` modifier for `transferFrom` and `safeTransferFrom` methods. * - `onlyAllowedOperatorApproval` modifier for `approve` and `setApprovalForAll` methods. */ abstract contract OperatorFiltererUpgradeable is Initializable { /// @notice Emitted when an operator is not allowed. error OperatorNotAllowed(address operator); IOperatorFilterRegistry constant OPERATOR_FILTER_REGISTRY = IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E); /// @dev The upgradeable initialize function that should be called when the contract is being upgraded. function __OperatorFilterer_init(address subscriptionOrRegistrantToCopy, bool subscribe) internal onlyInitializing { // If an inheriting token contract is deployed to a network without the registry deployed, the modifier // will not revert, but the contract will need to be registered with the registry once it is deployed in // order for the modifier to filter addresses. if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) { if (!OPERATOR_FILTER_REGISTRY.isRegistered(address(this))) { if (subscribe) { OPERATOR_FILTER_REGISTRY.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy); } else { if (subscriptionOrRegistrantToCopy != address(0)) { OPERATOR_FILTER_REGISTRY.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy); } else { OPERATOR_FILTER_REGISTRY.register(address(this)); } } } } } /** * @dev A helper modifier to check if the operator is allowed. */ modifier onlyAllowedOperator(address from) virtual { // Allow spending tokens from addresses with balance // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred // from an EOA. if (from != msg.sender) { _checkFilterOperator(msg.sender); } _; } /** * @dev A helper modifier to check if the operator approval is allowed. */ modifier onlyAllowedOperatorApproval(address operator) virtual { _checkFilterOperator(operator); _; } /** * @dev A helper function to check if the operator is allowed. */ function _checkFilterOperator(address operator) internal view virtual { // Check registry code length to facilitate testing in environments without a deployed registry. if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) { // under normal circumstances, this function will revert rather than return false, but inheriting or // upgraded contracts may specify their own OperatorFilterRegistry implementations, which may behave // differently if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), operator)) { revert OperatorNotAllowed(operator); } } } } // File: operator-filter-registry/src/upgradeable/DefaultOperatorFiltererUpgradeable.sol pragma solidity ^0.8.13; /** * @title DefaultOperatorFiltererUpgradeable * @notice Inherits from OperatorFiltererUpgradeable and automatically subscribes to the default OpenSea subscription * when the init function is called. */ abstract contract DefaultOperatorFiltererUpgradeable is OperatorFiltererUpgradeable { /// @dev The upgradeable initialize function that should be called when the contract is being deployed. function __DefaultOperatorFilterer_init() internal onlyInitializing { OperatorFiltererUpgradeable.__OperatorFilterer_init(CANONICAL_CORI_SUBSCRIPTION, true); } } // File: @openzeppelin/contracts-upgradeable/proxy/ERC1967/ERC1967UpgradeUpgradeable.sol // OpenZeppelin Contracts (last updated v4.5.0) (proxy/ERC1967/ERC1967Upgrade.sol) pragma solidity ^0.8.2; /** * @dev This abstract contract provides getters and event emitting update functions for * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots. * * _Available since v4.1._ * * @custom:oz-upgrades-unsafe-allow delegatecall */ abstract contract ERC1967UpgradeUpgradeable is Initializable { function __ERC1967Upgrade_init() internal onlyInitializing { } function __ERC1967Upgrade_init_unchained() internal onlyInitializing { } // This is the keccak-256 hash of "eip1967.proxy.rollback" subtracted by 1 bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143; /** * @dev Storage slot with the address of the current implementation. * This is the keccak-256 hash of "eip1967.proxy.implementation" subtracted by 1, and is * validated in the constructor. */ bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; /** * @dev Emitted when the implementation is upgraded. */ event Upgraded(address indexed implementation); /** * @dev Returns the current implementation address. */ function _getImplementation() internal view returns (address) { return StorageSlotUpgradeable.getAddressSlot(_IMPLEMENTATION_SLOT).value; } /** * @dev Stores a new address in the EIP1967 implementation slot. */ function _setImplementation(address newImplementation) private { require(AddressUpgradeable.isContract(newImplementation), "ERC1967: new implementation is not a contract"); StorageSlotUpgradeable.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation; } /** * @dev Perform implementation upgrade * * Emits an {Upgraded} event. */ function _upgradeTo(address newImplementation) internal { _setImplementation(newImplementation); emit Upgraded(newImplementation); } /** * @dev Perform implementation upgrade with additional setup call. * * Emits an {Upgraded} event. */ function _upgradeToAndCall( address newImplementation, bytes memory data, bool forceCall ) internal { _upgradeTo(newImplementation); if (data.length > 0 || forceCall) { _functionDelegateCall(newImplementation, data); } } /** * @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call. * * Emits an {Upgraded} event. */ function _upgradeToAndCallUUPS( address newImplementation, bytes memory data, bool forceCall ) internal { // Upgrades from old implementations will perform a rollback test. This test requires the new // implementation to upgrade back to the old, non-ERC1822 compliant, implementation. Removing // this special case will break upgrade paths from old UUPS implementation to new ones. if (StorageSlotUpgradeable.getBooleanSlot(_ROLLBACK_SLOT).value) { _setImplementation(newImplementation); } else { try IERC1822ProxiableUpgradeable(newImplementation).proxiableUUID() returns (bytes32 slot) { require(slot == _IMPLEMENTATION_SLOT, "ERC1967Upgrade: unsupported proxiableUUID"); } catch { revert("ERC1967Upgrade: new implementation is not UUPS"); } _upgradeToAndCall(newImplementation, data, forceCall); } } /** * @dev Storage slot with the admin of the contract. * This is the keccak-256 hash of "eip1967.proxy.admin" subtracted by 1, and is * validated in the constructor. */ bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103; /** * @dev Emitted when the admin account has changed. */ event AdminChanged(address previousAdmin, address newAdmin); /** * @dev Returns the current admin. */ function _getAdmin() internal view returns (address) { return StorageSlotUpgradeable.getAddressSlot(_ADMIN_SLOT).value; } /** * @dev Stores a new address in the EIP1967 admin slot. */ function _setAdmin(address newAdmin) private { require(newAdmin != address(0), "ERC1967: new admin is the zero address"); StorageSlotUpgradeable.getAddressSlot(_ADMIN_SLOT).value = newAdmin; } /** * @dev Changes the admin of the proxy. * * Emits an {AdminChanged} event. */ function _changeAdmin(address newAdmin) internal { emit AdminChanged(_getAdmin(), newAdmin); _setAdmin(newAdmin); } /** * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy. * This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor. */ bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50; /** * @dev Emitted when the beacon is upgraded. */ event BeaconUpgraded(address indexed beacon); /** * @dev Returns the current beacon. */ function _getBeacon() internal view returns (address) { return StorageSlotUpgradeable.getAddressSlot(_BEACON_SLOT).value; } /** * @dev Stores a new beacon in the EIP1967 beacon slot. */ function _setBeacon(address newBeacon) private { require(AddressUpgradeable.isContract(newBeacon), "ERC1967: new beacon is not a contract"); require( AddressUpgradeable.isContract(IBeaconUpgradeable(newBeacon).implementation()), "ERC1967: beacon implementation is not a contract" ); StorageSlotUpgradeable.getAddressSlot(_BEACON_SLOT).value = newBeacon; } /** * @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does * not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that). * * Emits a {BeaconUpgraded} event. */ function _upgradeBeaconToAndCall( address newBeacon, bytes memory data, bool forceCall ) internal { _setBeacon(newBeacon); emit BeaconUpgraded(newBeacon); if (data.length > 0 || forceCall) { _functionDelegateCall(IBeaconUpgradeable(newBeacon).implementation(), data); } } /** * @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) private returns (bytes memory) { require(AddressUpgradeable.isContract(target), "Address: delegate call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return AddressUpgradeable.verifyCallResult(success, returndata, "Address: low-level delegate call failed"); } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; } // File: @openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol // OpenZeppelin Contracts (last updated v4.8.0) (proxy/utils/UUPSUpgradeable.sol) pragma solidity ^0.8.0; /** * @dev An upgradeability mechanism designed for UUPS proxies. The functions included here can perform an upgrade of an * {ERC1967Proxy}, when this contract is set as the implementation behind such a proxy. * * A security mechanism ensures that an upgrade does not turn off upgradeability accidentally, although this risk is * reinstated if the upgrade retains upgradeability but removes the security mechanism, e.g. by replacing * `UUPSUpgradeable` with a custom implementation of upgrades. * * The {_authorizeUpgrade} function must be overridden to include access restriction to the upgrade mechanism. * * _Available since v4.1._ */ abstract contract UUPSUpgradeable is Initializable, IERC1822ProxiableUpgradeable, ERC1967UpgradeUpgradeable { function __UUPSUpgradeable_init() internal onlyInitializing { } function __UUPSUpgradeable_init_unchained() internal onlyInitializing { } /// @custom:oz-upgrades-unsafe-allow state-variable-immutable state-variable-assignment address private immutable __self = address(this); /** * @dev Check that the execution is being performed through a delegatecall call and that the execution context is * a proxy contract with an implementation (as defined in ERC1967) pointing to self. This should only be the case * for UUPS and transparent proxies that are using the current contract as their implementation. Execution of a * function through ERC1167 minimal proxies (clones) would not normally pass this test, but is not guaranteed to * fail. */ modifier onlyProxy() { require(address(this) != __self, "Function must be called through delegatecall"); require(_getImplementation() == __self, "Function must be called through active proxy"); _; } /** * @dev Check that the execution is not being performed through a delegate call. This allows a function to be * callable on the implementing contract but not through proxies. */ modifier notDelegated() { require(address(this) == __self, "UUPSUpgradeable: must not be called through delegatecall"); _; } /** * @dev Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the * implementation. It is used to validate the implementation's compatibility when performing an upgrade. * * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this * function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier. */ function proxiableUUID() external view virtual override notDelegated returns (bytes32) { return _IMPLEMENTATION_SLOT; } /** * @dev Upgrade the implementation of the proxy to `newImplementation`. * * Calls {_authorizeUpgrade}. * * Emits an {Upgraded} event. */ function upgradeTo(address newImplementation) external virtual onlyProxy { _authorizeUpgrade(newImplementation); _upgradeToAndCallUUPS(newImplementation, new bytes(0), false); } /** * @dev Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call * encoded in `data`. * * Calls {_authorizeUpgrade}. * * Emits an {Upgraded} event. */ function upgradeToAndCall(address newImplementation, bytes memory data) external payable virtual onlyProxy { _authorizeUpgrade(newImplementation); _upgradeToAndCallUUPS(newImplementation, data, true); } /** * @dev Function that should revert when `msg.sender` is not authorized to upgrade the contract. Called by * {upgradeTo} and {upgradeToAndCall}. * * Normally, this function will use an xref:access.adoc[access control] modifier such as {Ownable-onlyOwner}. * * ```solidity * function _authorizeUpgrade(address) internal override onlyOwner {} * ``` */ function _authorizeUpgrade(address newImplementation) internal virtual; /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; } // File: @openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.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 ERC165Upgradeable is Initializable, IERC165Upgradeable { function __ERC165_init() internal onlyInitializing { } function __ERC165_init_unchained() internal onlyInitializing { } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165Upgradeable).interfaceId; } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; } // File: @openzeppelin/contracts-upgradeable/token/common/ERC2981Upgradeable.sol // OpenZeppelin Contracts (last updated v4.7.0) (token/common/ERC2981.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information. * * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first. * * Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the * fee is specified in basis points by default. * * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported. * * _Available since v4.5._ */ abstract contract ERC2981Upgradeable is Initializable, IERC2981Upgradeable, ERC165Upgradeable { function __ERC2981_init() internal onlyInitializing { } function __ERC2981_init_unchained() internal onlyInitializing { } struct RoyaltyInfo { address receiver; uint96 royaltyFraction; } RoyaltyInfo private _defaultRoyaltyInfo; mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165Upgradeable, ERC165Upgradeable) returns (bool) { return interfaceId == type(IERC2981Upgradeable).interfaceId || super.supportsInterface(interfaceId); } /** * @inheritdoc IERC2981Upgradeable */ function royaltyInfo(uint256 _tokenId, uint256 _salePrice) public view virtual override returns (address, uint256) { RoyaltyInfo memory royalty = _tokenRoyaltyInfo[_tokenId]; if (royalty.receiver == address(0)) { royalty = _defaultRoyaltyInfo; } uint256 royaltyAmount = (_salePrice * royalty.royaltyFraction) / _feeDenominator(); return (royalty.receiver, royaltyAmount); } /** * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an * override. */ function _feeDenominator() internal pure virtual returns (uint96) { return 10000; } /** * @dev Sets the royalty information that all ids in this contract will default to. * * Requirements: * * - `receiver` cannot be the zero address. * - `feeNumerator` cannot be greater than the fee denominator. */ function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual { require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice"); require(receiver != address(0), "ERC2981: invalid receiver"); _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator); } /** * @dev Removes default royalty information. */ function _deleteDefaultRoyalty() internal virtual { delete _defaultRoyaltyInfo; } /** * @dev Sets the royalty information for a specific token id, overriding the global default. * * Requirements: * * - `receiver` cannot be the zero address. * - `feeNumerator` cannot be greater than the fee denominator. */ function _setTokenRoyalty( uint256 tokenId, address receiver, uint96 feeNumerator ) internal virtual { require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice"); require(receiver != address(0), "ERC2981: Invalid parameters"); _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator); } /** * @dev Resets royalty information for the token id back to the global default. */ function _resetTokenRoyalty(uint256 tokenId) internal virtual { delete _tokenRoyaltyInfo[tokenId]; } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[48] private __gap; } // File: @openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.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 ContextUpgradeable is Initializable { function __Context_init() internal onlyInitializing { } function __Context_init_unchained() internal onlyInitializing { } function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; } // File: @openzeppelin/contracts-upgradeable/utils/math/MathUpgradeable.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol) pragma solidity ^0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library MathUpgradeable { enum Rounding { Down, // Toward negative infinity Up, // Toward infinity Zero // Toward zero } /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0 * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) * with further edits by Uniswap Labs also under MIT license. */ function mulDiv( uint256 x, uint256 y, uint256 denominator ) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod0 := mul(x, y) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1); /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1. // See https://cs.stackexchange.com/q/138556/92363. // Does not overflow because the denominator cannot be zero at this stage in the function. uint256 twos = denominator & (~denominator + 1); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works // in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv( uint256 x, uint256 y, uint256 denominator, Rounding rounding ) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. // // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` // // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1 << (log2(a) >> 1); // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = sqrt(a); return result + (rounding == Rounding.Up && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2, rounded down, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 128; } if (value >> 64 > 0) { value >>= 64; result += 64; } if (value >> 32 > 0) { value >>= 32; result += 32; } if (value >> 16 > 0) { value >>= 16; result += 16; } if (value >> 8 > 0) { value >>= 8; result += 8; } if (value >> 4 > 0) { value >>= 4; result += 4; } if (value >> 2 > 0) { value >>= 2; result += 2; } if (value >> 1 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 2, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log2(value); return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10, rounded down, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >= 10**64) { value /= 10**64; result += 64; } if (value >= 10**32) { value /= 10**32; result += 32; } if (value >= 10**16) { value /= 10**16; result += 16; } if (value >= 10**8) { value /= 10**8; result += 8; } if (value >= 10**4) { value /= 10**4; result += 4; } if (value >= 10**2) { value /= 10**2; result += 2; } if (value >= 10**1) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log10(value); return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0); } } /** * @dev Return the log in base 256, rounded down, of a positive value. * Returns 0 if given 0. * * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. */ function log256(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 16; } if (value >> 64 > 0) { value >>= 64; result += 8; } if (value >> 32 > 0) { value >>= 32; result += 4; } if (value >> 16 > 0) { value >>= 16; result += 2; } if (value >> 8 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log256(value); return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0); } } } // File: @openzeppelin/contracts-upgradeable/utils/StringsUpgradeable.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library StringsUpgradeable { bytes16 private constant _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) { unchecked { uint256 length = MathUpgradeable.log10(value) + 1; string memory buffer = new string(length); uint256 ptr; /// @solidity memory-safe-assembly assembly { ptr := add(buffer, add(32, length)) } while (true) { ptr--; /// @solidity memory-safe-assembly assembly { mstore8(ptr, byte(mod(value, 10), _SYMBOLS)) } value /= 10; if (value == 0) break; } return buffer; } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { unchecked { return toHexString(value, MathUpgradeable.log256(value) + 1); } } /** * @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] = _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-upgradeable/access/AccessControlUpgradeable.sol // OpenZeppelin Contracts (last updated v4.8.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 AccessControlUpgradeable is Initializable, ContextUpgradeable, IAccessControlUpgradeable, ERC165Upgradeable { function __AccessControl_init() internal onlyInitializing { } function __AccessControl_init_unchained() internal onlyInitializing { } 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(IAccessControlUpgradeable).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 ", StringsUpgradeable.toHexString(account), " is missing role ", StringsUpgradeable.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()); } } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[49] private __gap; } // File: @openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol // OpenZeppelin Contracts (last updated v4.8.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 ERC721Upgradeable is Initializable, ContextUpgradeable, ERC165Upgradeable, IERC721Upgradeable, IERC721MetadataUpgradeable { using AddressUpgradeable for address; using StringsUpgradeable 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. */ function __ERC721_init(string memory name_, string memory symbol_) internal onlyInitializing { __ERC721_init_unchained(name_, symbol_); } function __ERC721_init_unchained(string memory name_, string memory symbol_) internal onlyInitializing { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165Upgradeable, IERC165Upgradeable) returns (bool) { return interfaceId == type(IERC721Upgradeable).interfaceId || interfaceId == type(IERC721MetadataUpgradeable).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 = _ownerOf(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 = ERC721Upgradeable.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not token owner or 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 or 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 or 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 the owner of the `tokenId`. Does NOT revert if token doesn't exist */ function _ownerOf(uint256 tokenId) internal view virtual returns (address) { return _owners[tokenId]; } /** * @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 _ownerOf(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 = ERC721Upgradeable.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, 1); // Check that tokenId was not minted by `_beforeTokenTransfer` hook require(!_exists(tokenId), "ERC721: token already minted"); unchecked { // Will not overflow unless all 2**256 token ids are minted to the same owner. // Given that tokens are minted one by one, it is impossible in practice that // this ever happens. Might change if we allow batch minting. // The ERC fails to describe this case. _balances[to] += 1; } _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId, 1); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * This is an internal function that does not check if the sender is authorized to operate on the token. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721Upgradeable.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId, 1); // Update ownership in case tokenId was transferred by `_beforeTokenTransfer` hook owner = ERC721Upgradeable.ownerOf(tokenId); // Clear approvals delete _tokenApprovals[tokenId]; unchecked { // Cannot overflow, as that would require more tokens to be burned/transferred // out than the owner initially received through minting and transferring in. _balances[owner] -= 1; } delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId, 1); } /** * @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(ERC721Upgradeable.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId, 1); // Check that tokenId was not transferred by `_beforeTokenTransfer` hook require(ERC721Upgradeable.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); // Clear approvals from the previous owner delete _tokenApprovals[tokenId]; unchecked { // `_balances[from]` cannot overflow for the same reason as described in `_burn`: // `from`'s balance is the number of token held, which is at least one before the current // transfer. // `_balances[to]` could overflow in the conditions described in `_mint`. That would require // all 2**256 token ids to be minted, which in practice is impossible. _balances[from] -= 1; _balances[to] += 1; } _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId, 1); } /** * @dev Approve `to` to operate on `tokenId` * * Emits an {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721Upgradeable.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 IERC721ReceiverUpgradeable(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) { return retval == IERC721ReceiverUpgradeable.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. If {ERC721Consecutive} is * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s tokens will be transferred to `to`. * - When `from` is zero, the tokens will be minted for `to`. * - When `to` is zero, ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * - `batchSize` is non-zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256, /* firstTokenId */ uint256 batchSize ) internal virtual { if (batchSize > 1) { if (from != address(0)) { _balances[from] -= batchSize; } if (to != address(0)) { _balances[to] += batchSize; } } } /** * @dev Hook that is called after any token transfer. This includes minting and burning. If {ERC721Consecutive} is * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s tokens were transferred to `to`. * - When `from` is zero, the tokens were minted for `to`. * - When `to` is zero, ``from``'s tokens were burned. * - `from` and `to` are never both zero. * - `batchSize` is non-zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 firstTokenId, uint256 batchSize ) internal virtual {} /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[44] private __gap; } // File: @openzeppelin/contracts-upgradeable/utils/cryptography/ECDSAUpgradeable.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/ECDSA.sol) pragma solidity ^0.8.0; /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * * These functions can be used to verify that a message was signed by the holder * of the private keys of a given address. */ library ECDSAUpgradeable { enum RecoverError { NoError, InvalidSignature, InvalidSignatureLength, InvalidSignatureS, InvalidSignatureV // Deprecated in v4.8 } function _throwError(RecoverError error) private pure { if (error == RecoverError.NoError) { return; // no error: do nothing } else if (error == RecoverError.InvalidSignature) { revert("ECDSA: invalid signature"); } else if (error == RecoverError.InvalidSignatureLength) { revert("ECDSA: invalid signature length"); } else if (error == RecoverError.InvalidSignatureS) { revert("ECDSA: invalid signature 's' value"); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature` or error string. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. * * Documentation for signature generation: * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js] * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers] * * _Available since v4.3._ */ function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) { if (signature.length == 65) { bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. /// @solidity memory-safe-assembly assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } return tryRecover(hash, v, r, s); } else { return (address(0), RecoverError.InvalidSignatureLength); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, signature); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately. * * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures] * * _Available since v4.3._ */ function tryRecover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address, RecoverError) { bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff); uint8 v = uint8((uint256(vs) >> 255) + 27); return tryRecover(hash, v, r, s); } /** * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately. * * _Available since v4.2._ */ function recover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, r, vs); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `v`, * `r` and `s` signature fields separately. * * _Available since v4.3._ */ function tryRecover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address, RecoverError) { // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { return (address(0), RecoverError.InvalidSignatureS); } // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(hash, v, r, s); if (signer == address(0)) { return (address(0), RecoverError.InvalidSignature); } return (signer, RecoverError.NoError); } /** * @dev Overload of {ECDSA-recover} that receives the `v`, * `r` and `s` signature fields separately. */ function recover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, v, r, s); _throwError(error); return recovered; } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) { // 32 is the length in bytes of hash, // enforced by the type signature above return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); } /** * @dev Returns an Ethereum Signed Message, created from `s`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", StringsUpgradeable.toString(s.length), s)); } /** * @dev Returns an Ethereum Signed Typed Data, created from a * `domainSeparator` and a `structHash`. This produces hash corresponding * to the one signed with the * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] * JSON-RPC method as part of EIP-712. * * See {recover}. */ function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash)); } } // File: @openzeppelin/contracts-upgradeable/utils/math/SafeMathUpgradeable.sol // OpenZeppelin Contracts (last updated v4.6.0) (utils/math/SafeMath.sol) pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */ library SafeMathUpgradeable { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the subtraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } // File: contracts/Matr1xKuku.sol pragma solidity ^0.8.13; contract Matr1xKuku is Initializable, ERC721Upgradeable, AccessControlUpgradeable, ERC2981Upgradeable, DefaultOperatorFiltererUpgradeable, UUPSUpgradeable { using SafeMathUpgradeable for uint256; bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE"); bytes32 public constant UPGRADER_ROLE = keccak256("UPGRADER_ROLE"); uint256 private constant MAX_OWNER_NUM = 2000; uint256 private constant MAX_AIRDROP_NUM = 524; uint256 private constant MAX_KUKULIST_NUM = 3492; uint256 private constant MAX_KUKU_NUM = 6666; uint256 private _burnCounter; address private _owner; string private _buri; //========== mint start ========== address private _walletAddr; address public mintSigner; uint256 public mintCost; // 0-close 1-airdrop/kukuList 2-luckyList uint256 public state; uint256 private _nextTokenId; uint256 private _ownerTokenId; uint256 private _airdropMinted; uint256 private _kukulistMinted; // Id -> 0/1 ( 0 - not minted, 1 - minted) mapping(string => uint256) private _adMinted; mapping(string => uint256) private _llMinted; // Id -> kukuListNum mapping(string => uint256) private _kukuListNum; // Id -> mintedNumber mapping(string => uint256) private _mintedNumber; event ContractStateEvent(uint256 saleState); event KukuMint(string id, string lable, address wallet, uint256 number, uint256 mintTime); // ============ mint end =========== // ============ stake start =========== // eventId => state, state: 0- not open, 1- open mapping(string => uint256) private _lockEventState; //tokenId => lock counts mapping(uint256 => uint256) private _lockCounts; //eventId => ( tokenId=> lockState),lockState: 0-unlock, 1-lock mapping(string => mapping(uint256 => uint256)) private _eventTokenLock; mapping(address => bool) public checkers; event Lock(string eventId, uint256[] tokenId, address by, uint256 lockAt); event Unlock(string eventId, uint256[] tokenId, address by, uint256 unlockAt); // ============ stake end =========== /// @custom:oz-upgrades-unsafe-allow constructor constructor() { _disableInitializers(); } function initialize() initializer public { __ERC721_init("MATR1X KUKU", "KUKU"); __AccessControl_init(); __ERC2981_init(); __DefaultOperatorFilterer_init(); __UUPSUpgradeable_init(); _burnCounter = 0; state = 0; mintCost = 0.398 ether; _ownerTokenId = 1; _nextTokenId = 2001; _buri = "https://metadata.matr1x.io/metadata/kuku/"; _walletAddr = 0x869Cb8fE8f7E0b1A483FEe1200e9F36176539f59; mintSigner = 0x8066c737B2c0c035255CDec0D1928Fa30026aF33; _owner = _msgSender(); _setupRole(DEFAULT_ADMIN_ROLE, _msgSender()); _setupRole(MINTER_ROLE, _msgSender()); _setupRole(UPGRADER_ROLE, _msgSender()); } function _authorizeUpgrade(address newImplementation) internal onlyRole(UPGRADER_ROLE) override {} function _baseURI() internal view override returns (string memory) { return _buri; } function setBaseURI(string memory buri) external onlyRole(MINTER_ROLE) { require(bytes(buri).length > 0, "Wrong base uri"); _buri = buri; } function burn(uint256 tokenId) public { require( _isApprovedOrOwner(_msgSender(), tokenId), "burn caller is not owner nor approved" ); ++_burnCounter; _burn(tokenId); } modifier checkState(uint8 saleState_) { require(state == saleState_, "Invalid Sale State"); _; } modifier isEoaWallet() { require(tx.origin == msg.sender, "Must from real wallet address"); _; } // mint nft and increment tokenId function _mintBatch(address _to, uint256 _num) private { uint256 tokenId = _nextTokenId; for (uint256 i = 0; i < _num;) { _mint(_to, tokenId); unchecked { ++i; ++tokenId; } } _nextTokenId = tokenId; } /** * owner mint */ function ownerMint(uint256 num, address to) public onlyRole(MINTER_ROLE) { uint256 tokenId = _ownerTokenId; require(tokenId - 1 + num <= MAX_OWNER_NUM, "Not enough tokens left to mint"); for (uint256 i = 0; i < num;) { _mint(to, tokenId); unchecked { ++i; ++tokenId; } } _ownerTokenId = tokenId; } /** * airdrop mint */ function adMint(string calldata _id, uint256 _accNum, bytes memory _signature) external checkState(1) isEoaWallet { address _signerOwner = signatureWallet(_msgSender(), _accNum, _accNum, _id, "kkadMint", _signature); // check signerOwner require(_signerOwner == mintSigner, "Not authorized to mint"); require(_adMinted[_id] == 0, "Have been minted"); unchecked{ _airdropMinted += _accNum; } require(_airdropMinted <= MAX_AIRDROP_NUM, "Reached airdrop mint maximum limit"); _adMinted[_id] = 1; _mintBatch(_msgSender(), _accNum); emit KukuMint(_id, "kkadMint", _msgSender(), _accNum, block.timestamp); } /** * kukulist mint */ function kkwlMint(string calldata _id, uint256 _accNum, uint256 _accTotalNum, bytes memory _signature) external payable checkState(1) isEoaWallet { require(_accNum > 0 && _accTotalNum > 0, "The number must be greater than zero"); address _signerOwner = signatureWallet(_msgSender(), _accNum, _accTotalNum, _id, "kkwlMint", _signature); // check signerOwner require(_signerOwner == mintSigner, "Not authorized to mint"); if (_kukuListNum[_id] == 0) { _kukuListNum[_id] = _accTotalNum; } uint256 _num = _kukuListNum[_id] - _mintedNumber[_id]; require(_num > 0, "You have reached your mint limit"); if (_num > _accNum) { _num = _accNum; } unchecked{ _kukulistMinted += _num; } require(_kukulistMinted <= MAX_KUKULIST_NUM, "Reached kuku list maximum limit"); unchecked{ _mintedNumber[_id] += _num; } uint256 _totalAmount = price(mintCost, _num); require(msg.value >= _totalAmount, "Value below price"); uint256 _change; unchecked{ _change = msg.value - _totalAmount; } if (_change > 0) { payable(msg.sender).transfer(_change); } _mintBatch(_msgSender(), _num); emit KukuMint(_id, "kkwlMint", _msgSender(), _num, block.timestamp); } /** * Lucklist mint */ function kkllMint(string calldata _id, uint256 _accNum, bytes memory _signature) external payable checkState(2) isEoaWallet { address _signerOwner = signatureWallet(_msgSender(), _accNum, _accNum, _id, "kkllMint", _signature); // check signerOwner require(_signerOwner == mintSigner, "Not authorized to mint"); require(_nextTokenId - 1 + _accNum <= MAX_KUKU_NUM, "Reached kuku mint maximum limit"); require(_llMinted[_id] == 0, "Have been minted"); uint256 _totalAmount = price(mintCost, _accNum); require(msg.value >= _totalAmount, "Value below price"); _llMinted[_id] = 1; _mintBatch(_msgSender(), _accNum); emit KukuMint(_id, "kkllMint", _msgSender(), _accNum, block.timestamp); } function price(uint256 _price, uint256 _count) private pure returns (uint256) { return _price.mul(_count); } function setStatus(uint256 _status) external onlyRole(MINTER_ROLE) { state = _status; emit ContractStateEvent(_status); } function setSigner(address _signer) external onlyRole(MINTER_ROLE) { mintSigner = _signer; } /** * event lock */ function lock(string calldata _eventId, uint256[] calldata _tokenIds) external { require(_lockEventState[_eventId] == 1, "Event not open"); require(_tokenIds.length > 0, "TokenIds length must be greater than zero"); require(_tokenIds.length <= 20, "Max limit one call"); for (uint256 i = 0; i < _tokenIds.length;) { uint256 _tokenId = _tokenIds[i]; require(msg.sender == ownerOf(_tokenId) || hasRole(MINTER_ROLE, msg.sender), "Caller must be owner of token or contract owner"); require(_eventTokenLock[_eventId][_tokenId] == 0, "Token already locked by current event"); _eventTokenLock[_eventId][_tokenId] = 1; unchecked { _lockCounts[_tokenId] += 1; ++i; } } emit Lock(_eventId, _tokenIds, msg.sender, block.timestamp); } /** * event unlock */ function unlock(string calldata _eventId, uint256[] calldata _tokenIds) external { require(_tokenIds.length > 0, "TokenIds length must be greater than zero"); require(_tokenIds.length <= 20, "Max limit one call"); for (uint256 i = 0; i < _tokenIds.length;) { uint256 _tokenId = _tokenIds[i]; require(msg.sender == ownerOf(_tokenId) || hasRole(MINTER_ROLE, msg.sender) || checkers[msg.sender], "Caller must be owner of token or contract owner"); require(_eventTokenLock[_eventId][_tokenId] == 1, "Token not locked by current event"); _eventTokenLock[_eventId][_tokenId] = 0; require(_lockCounts[_tokenId] >= 1, "Lock counts error"); unchecked { _lockCounts[_tokenId] -= 1; ++i; } } emit Unlock(_eventId, _tokenIds, msg.sender, block.timestamp); } function setEventState(string calldata _eventId, uint256 _state) external onlyRole(MINTER_ROLE) { _lockEventState[_eventId] = _state; } function queryTokenLockState(string calldata _eventId, uint256[] calldata _tokenIds) public view returns (uint256[] memory){ uint256[] memory _states = new uint256[](_tokenIds.length); for (uint256 i = 0; i < _tokenIds.length;) { _states[i] = _eventTokenLock[_eventId][_tokenIds[i]]; unchecked { ++i; } } return _states; } function queryLockEventState(string calldata _eventId) public view returns (uint256){ return _lockEventState[_eventId]; } function queryLockCounts(uint256 _tokenId) public view returns (uint256){ return _lockCounts[_tokenId]; } function setChecker(address _checker, bool _state) external onlyRole(MINTER_ROLE) { checkers[_checker] = _state; } function currentIndex() public view returns (uint256, uint256, uint256){ return (_airdropMinted, _kukulistMinted, _nextTokenId - 1); } function updateWalletAddress(address _address) external onlyRole(MINTER_ROLE) { _walletAddr = _address; } function withdrawAll() public onlyRole(MINTER_ROLE) { uint256 balance = address(this).balance; require(balance > 0, "Balance must be greater than zero"); _widthdraw(_walletAddr, address(this).balance); } function _widthdraw(address _address, uint256 _amount) private { (bool success,) = _address.call{value: _amount}(""); require(success, "Transfer failed."); } function signatureWallet(address _wallet, uint256 _numberType, uint256 _numberType1, string calldata _stringType, string memory lable, bytes memory _signature) public pure returns (address) { return ECDSAUpgradeable.recover(keccak256(abi.encode(_wallet, _numberType, _numberType1, _stringType, lable)), _signature); } // OpenSea Operator Filter Registry Functions https://github.com/ProjectOpenSea/operator-filter-registry function setApprovalForAll(address operator, bool approved) public override onlyAllowedOperatorApproval(operator) { super.setApprovalForAll(operator, approved); } function approve(address operator, uint256 tokenId) public override onlyAllowedOperatorApproval(operator) { super.approve(operator, tokenId); } function transferFrom(address from, address to, uint256 tokenId) public override onlyAllowedOperator(from) { super.transferFrom(from, to, tokenId); } function safeTransferFrom(address from, address to, uint256 tokenId) public override onlyAllowedOperator(from) { super.safeTransferFrom(from, to, tokenId); } function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public override onlyAllowedOperator(from) { super.safeTransferFrom(from, to, tokenId, data); } // End Opensea Operator Filter Registry function updateOwner(address _address) external onlyRole(MINTER_ROLE) { _owner = _address; } function owner() public view virtual returns (address) { return _owner; } function totalSupply() public view virtual returns (uint256) { return _nextTokenId - 1 - 2000 + _ownerTokenId - 1 - _burnCounter; } function _beforeTokenTransfer(address from, address to, uint256 tokenId, uint256 batchSize) internal override(ERC721Upgradeable) { require(_lockCounts[tokenId] == 0, "Token locked by event"); super._beforeTokenTransfer(from, to, tokenId, batchSize); } function supportsInterface(bytes4 interfaceId) public view override(ERC721Upgradeable, ERC2981Upgradeable, AccessControlUpgradeable) returns (bool) { return super.supportsInterface(interfaceId); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"previousAdmin","type":"address"},{"indexed":false,"internalType":"address","name":"newAdmin","type":"address"}],"name":"AdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"beacon","type":"address"}],"name":"BeaconUpgraded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"saleState","type":"uint256"}],"name":"ContractStateEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"id","type":"string"},{"indexed":false,"internalType":"string","name":"lable","type":"string"},{"indexed":false,"internalType":"address","name":"wallet","type":"address"},{"indexed":false,"internalType":"uint256","name":"number","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"mintTime","type":"uint256"}],"name":"KukuMint","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"eventId","type":"string"},{"indexed":false,"internalType":"uint256[]","name":"tokenId","type":"uint256[]"},{"indexed":false,"internalType":"address","name":"by","type":"address"},{"indexed":false,"internalType":"uint256","name":"lockAt","type":"uint256"}],"name":"Lock","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"eventId","type":"string"},{"indexed":false,"internalType":"uint256[]","name":"tokenId","type":"uint256[]"},{"indexed":false,"internalType":"address","name":"by","type":"address"},{"indexed":false,"internalType":"uint256","name":"unlockAt","type":"uint256"}],"name":"Unlock","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"implementation","type":"address"}],"name":"Upgraded","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":"UPGRADER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_id","type":"string"},{"internalType":"uint256","name":"_accNum","type":"uint256"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"adMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","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":"address","name":"","type":"address"}],"name":"checkers","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"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":[],"name":"initialize","outputs":[],"stateMutability":"nonpayable","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":"string","name":"_id","type":"string"},{"internalType":"uint256","name":"_accNum","type":"uint256"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"kkllMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"string","name":"_id","type":"string"},{"internalType":"uint256","name":"_accNum","type":"uint256"},{"internalType":"uint256","name":"_accTotalNum","type":"uint256"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"kkwlMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"string","name":"_eventId","type":"string"},{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"}],"name":"lock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintSigner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"num","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"ownerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proxiableUUID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"queryLockCounts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_eventId","type":"string"}],"name":"queryLockEventState","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_eventId","type":"string"},{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"}],"name":"queryTokenLockState","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"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":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"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":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"buri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_checker","type":"address"},{"internalType":"bool","name":"_state","type":"bool"}],"name":"setChecker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_eventId","type":"string"},{"internalType":"uint256","name":"_state","type":"uint256"}],"name":"setEventState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_signer","type":"address"}],"name":"setSigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_status","type":"uint256"}],"name":"setStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet","type":"address"},{"internalType":"uint256","name":"_numberType","type":"uint256"},{"internalType":"uint256","name":"_numberType1","type":"uint256"},{"internalType":"string","name":"_stringType","type":"string"},{"internalType":"string","name":"lable","type":"string"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"signatureWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"state","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"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":"string","name":"_eventId","type":"string"},{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"}],"name":"unlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"updateOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"updateWalletAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"}],"name":"upgradeTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"upgradeToAndCall","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60a0604052306080523480156200001557600080fd5b506200002062000026565b620000e8565b600054610100900460ff1615620000935760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff9081161015620000e6576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b608051614db56200012060003960008181611198015281816111d8015281816114350152818161147501526115040152614db56000f3fe6080604052600436106102ff5760003560e01c806370a0823111610190578063bdb4b848116100dc578063d539139311610095578063e985e9c51161006f578063e985e9c514610941578063f17af48d1461098a578063f72c0d8b146109ab578063fa2cf1e1146109df57600080fd5b8063d5391393146108df578063d547741f14610901578063da29bb0b1461092157600080fd5b8063bdb4b84814610831578063c19d93fb14610848578063c87b56dd1461085f578063c93c266e1461087f578063d44bbff71461089f578063d52c57e0146108bf57600080fd5b806391d1485411610149578063a22cb46511610123578063a22cb465146107b0578063a5a1b2ba146107d0578063b88d4fde146107fe578063bc8732c51461081e57600080fd5b806391d148541461076657806395d89b4114610786578063a217fddf1461079b57600080fd5b806370a08231146106bd5780638129fc1c146106dd578063853828b6146106f257806385eaf82814610707578063880cdc31146107275780638da5cb5b1461074757600080fd5b806336568abe1161024f5780634f1ef286116102085780636352211e116101e25780636352211e1461063d57806369ba1a751461065d5780636ba060fb1461067d5780636c19e7831461069d57600080fd5b80634f1ef286146105f557806352d1902d1461060857806355f804b31461061d57600080fd5b806336568abe146105285780633659cfe61461054857806342146e5b1461056857806342842e0e1461058857806342966c68146105a857806342d7f293146105c857600080fd5b8063248a9ca3116102bc5780632a261fb4116102965780632a261fb4146104895780632a55205a146104a95780632f2ff15d146104e8578063319504001461050857600080fd5b8063248a9ca3146103f857806326987b601461042857806329a587be1461045857600080fd5b806301ffc9a71461030457806306fdde0314610339578063081812fc1461035b578063095ea7b31461039357806318160ddd146103b557806323b872dd146103d8575b600080fd5b34801561031057600080fd5b5061032461031f366004613ecc565b6109f2565b60405190151581526020015b60405180910390f35b34801561034557600080fd5b5061034e610a03565b6040516103309190613f41565b34801561036757600080fd5b5061037b610376366004613f54565b610a95565b6040516001600160a01b039091168152602001610330565b34801561039f57600080fd5b506103b36103ae366004613f89565b610abc565b005b3480156103c157600080fd5b506103ca610ad5565b604051908152602001610330565b3480156103e457600080fd5b506103b36103f3366004613fb3565b610b21565b34801561040457600080fd5b506103ca610413366004613f54565b60009081526097602052604090206001015490565b34801561043457600080fd5b5061043d610b4c565b60408051938452602084019290925290820152606001610330565b34801561046457600080fd5b50610324610473366004613fef565b6101716020526000908152604090205460ff1681565b34801561049557600080fd5b506103b36104a436600461404b565b610b74565b3480156104b557600080fd5b506104c96104c43660046140e4565b610dd9565b604080516001600160a01b039093168352602083019190915201610330565b3480156104f457600080fd5b506103b3610503366004614106565b610e87565b34801561051457600080fd5b506103b361052336600461404b565b610eac565b34801561053457600080fd5b506103b3610543366004614106565b611110565b34801561055457600080fd5b506103b3610563366004613fef565b61118e565b34801561057457600080fd5b5061037b6105833660046141d4565b61126d565b34801561059457600080fd5b506103b36105a3366004613fb3565b6112b5565b3480156105b457600080fd5b506103b36105c3366004613f54565b6112da565b3480156105d457600080fd5b506105e86105e336600461404b565b61135c565b6040516103309190614285565b6103b36106033660046142c9565b61142b565b34801561061457600080fd5b506103ca6114f7565b34801561062957600080fd5b506103b3610638366004614316565b6115aa565b34801561064957600080fd5b5061037b610658366004613f54565b611618565b34801561066957600080fd5b506103b3610678366004613f54565b611678565b34801561068957600080fd5b506103b361069836600461434a565b6116cd565b3480156106a957600080fd5b506103b36106b8366004613fef565b61170f565b3480156106c957600080fd5b506103ca6106d8366004613fef565b61174b565b3480156106e957600080fd5b506103b36117d1565b3480156106fe57600080fd5b506103b3611a55565b34801561071357600080fd5b506103b36107223660046143a3565b611adc565b34801561073357600080fd5b506103b3610742366004613fef565b611b21565b34801561075357600080fd5b50610160546001600160a01b031661037b565b34801561077257600080fd5b50610324610781366004614106565b611b5d565b34801561079257600080fd5b5061034e611b88565b3480156107a757600080fd5b506103ca600081565b3480156107bc57600080fd5b506103b36107cb3660046143a3565b611b97565b3480156107dc57600080fd5b506103ca6107eb366004613f54565b600090815261016f602052604090205490565b34801561080a57600080fd5b506103b36108193660046143da565b611bab565b6103b361082c366004614441565b611bd8565b34801561083d57600080fd5b506103ca6101645481565b34801561085457600080fd5b506103ca6101655481565b34801561086b57600080fd5b5061034e61087a366004613f54565b611f4d565b34801561088b57600080fd5b506103b361089a366004613fef565b611fb4565b3480156108ab57600080fd5b506103b36108ba3660046144bd565b611ff0565b3480156108cb57600080fd5b506103b36108da366004614106565b6121dd565b3480156108eb57600080fd5b506103ca600080516020614d6083398151915281565b34801561090d57600080fd5b506103b361091c366004614106565b61228b565b34801561092d57600080fd5b506103ca61093c366004614523565b6122b0565b34801561094d57600080fd5b5061032461095c366004614564565b6001600160a01b039182166000908152606a6020908152604080832093909416825291909152205460ff1690565b34801561099657600080fd5b506101635461037b906001600160a01b031681565b3480156109b757600080fd5b506103ca7f189ab7a9244df0848122154315af71fe140f3db0fe014031783b0946b8c9d2e381565b6103b36109ed3660046144bd565b6122dc565b60006109fd82612524565b92915050565b606060658054610a129061458e565b80601f0160208091040260200160405190810160405280929190818152602001828054610a3e9061458e565b8015610a8b5780601f10610a6057610100808354040283529160200191610a8b565b820191906000526020600020905b815481529060010190602001808311610a6e57829003601f168201915b5050505050905090565b6000610aa082612549565b506000908152606960205260409020546001600160a01b031690565b81610ac6816125a8565b610ad08383612661565b505050565b600061015f546001610167546107d0600161016654610af491906145de565b610afe91906145de565b610b0891906145f5565b610b1291906145de565b610b1c91906145de565b905090565b826001600160a01b0381163314610b3b57610b3b336125a8565b610b46848484612771565b50505050565b60008060006101685461016954600161016654610b6991906145de565b925092509250909192565b61016e8484604051610b8792919061460d565b908152602001604051809103902054600114610bdb5760405162461bcd60e51b815260206004820152600e60248201526d22bb32b73a103737ba1037b832b760911b60448201526064015b60405180910390fd5b80610bf85760405162461bcd60e51b8152600401610bd29061461d565b6014811115610c3e5760405162461bcd60e51b815260206004820152601260248201527113585e081b1a5b5a5d081bdb994818d85b1b60721b6044820152606401610bd2565b60005b81811015610d91576000838383818110610c5d57610c5d614666565b905060200201359050610c6f81611618565b6001600160a01b0316336001600160a01b03161480610ca15750610ca1600080516020614d6083398151915233611b5d565b610cbd5760405162461bcd60e51b8152600401610bd29061467c565b6101708686604051610cd092919061460d565b90815260408051602092819003830190206000848152925290205415610d465760405162461bcd60e51b815260206004820152602560248201527f546f6b656e20616c7265616479206c6f636b65642062792063757272656e7420604482015264195d995b9d60da1b6064820152608401610bd2565b60016101708787604051610d5b92919061460d565b9081526040805160209281900383019020600094855282528084209290925561016f905290208054600190810190915501610c41565b507ffea44eff610c2922d0be033f0d5754e30414842ab51cea561ee1993e2bf25d46848484843342604051610dcb969594939291906146f4565b60405180910390a150505050565b600082815260ca602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046001600160601b0316928201929092528291610e4e57506040805180820190915260c9546001600160a01b0381168252600160a01b90046001600160601b031660208201525b602081015160009061271090610e6d906001600160601b03168761475a565b610e779190614779565b91519350909150505b9250929050565b600082815260976020526040902060010154610ea2816127a1565b610ad083836127ab565b80610ec95760405162461bcd60e51b8152600401610bd29061461d565b6014811115610f0f5760405162461bcd60e51b815260206004820152601260248201527113585e081b1a5b5a5d081bdb994818d85b1b60721b6044820152606401610bd2565b60005b818110156110d6576000838383818110610f2e57610f2e614666565b905060200201359050610f4081611618565b6001600160a01b0316336001600160a01b03161480610f725750610f72600080516020614d6083398151915233611b5d565b80610f8d5750336000908152610171602052604090205460ff165b610fa95760405162461bcd60e51b8152600401610bd29061467c565b6101708686604051610fbc92919061460d565b90815260200160405180910390206000828152602001908152602001600020546001146110355760405162461bcd60e51b815260206004820152602160248201527f546f6b656e206e6f74206c6f636b65642062792063757272656e74206576656e6044820152601d60fa1b6064820152608401610bd2565b6000610170878760405161104a92919061460d565b908152604080516020928190038301902060008581529083528181209390935561016f909152902054600111156110b75760405162461bcd60e51b81526020600482015260116024820152702637b1b59031b7bab73a399032b93937b960791b6044820152606401610bd2565b600090815261016f602052604090208054600019019055600101610f12565b507f0e6a9b542100dff5c1e072c595fc95d46787c6371af93218c380a7dcf53efe4c848484843342604051610dcb969594939291906146f4565b6001600160a01b03811633146111805760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b6064820152608401610bd2565b61118a8282612831565b5050565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036111d65760405162461bcd60e51b8152600401610bd29061479b565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031661121f600080516020614d19833981519152546001600160a01b031690565b6001600160a01b0316146112455760405162461bcd60e51b8152600401610bd2906147e7565b61124e81612898565b6040805160008082526020820190925261126a918391906128c2565b50565b60006112a988888888888860405160200161128d96959493929190614833565b6040516020818303038152906040528051906020012083612a2d565b98975050505050505050565b826001600160a01b03811633146112cf576112cf336125a8565b610b46848484612a51565b6112e5335b82612a6c565b61133f5760405162461bcd60e51b815260206004820152602560248201527f6275726e2063616c6c6572206973206e6f74206f776e6572206e6f72206170706044820152641c9bdd995960da1b6064820152608401610bd2565b61015f6000815461134f90614880565b9091555061126a81612aea565b60606000826001600160401b0381111561137857611378614132565b6040519080825280602002602001820160405280156113a1578160200160208202803683370190505b50905060005b8381101561141f5761017087876040516113c292919061460d565b908152602001604051809103902060008686848181106113e4576113e4614666565b9050602002013581526020019081526020016000205482828151811061140c5761140c614666565b60209081029190910101526001016113a7565b5090505b949350505050565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036114735760405162461bcd60e51b8152600401610bd29061479b565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166114bc600080516020614d19833981519152546001600160a01b031690565b6001600160a01b0316146114e25760405162461bcd60e51b8152600401610bd2906147e7565b6114eb82612898565b61118a828260016128c2565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146115975760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c00000000000000006064820152608401610bd2565b50600080516020614d1983398151915290565b600080516020614d608339815191526115c2816127a1565b60008251116116045760405162461bcd60e51b815260206004820152600e60248201526d57726f6e6720626173652075726960901b6044820152606401610bd2565b8151610ad090610161906020850190613e1d565b6000818152606760205260408120546001600160a01b0316806109fd5760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610bd2565b600080516020614d60833981519152611690816127a1565b6101658290556040518281527f4f120ecdf2c1af515eb9463e6fde36c97fa45c38ea121fb30ffc9ed27ca645009060200160405180910390a15050565b600080516020614d608339815191526116e5816127a1565b8161016e85856040516116f992919061460d565b9081526040519081900360200190205550505050565b600080516020614d60833981519152611727816127a1565b5061016380546001600160a01b0319166001600160a01b0392909216919091179055565b60006001600160a01b0382166117b55760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b6064820152608401610bd2565b506001600160a01b031660009081526068602052604090205490565b600054610100900460ff16158080156117f15750600054600160ff909116105b8061180b5750303b15801561180b575060005460ff166001145b61186e5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610bd2565b6000805460ff191660011790558015611891576000805461ff0019166101001790555b6118da6040518060400160405280600b81526020016a4d4154523158204b554b5560a81b815250604051806040016040528060048152602001634b554b5560e01b815250612b8d565b6118e2612bbe565b6118ea612bbe565b6118f2612be7565b6118fa612bbe565b600061015f81905561016555670585fae42c9b0000610164556001610167556107d16101665560408051606081019091526029808252614cf06020830139805161194d9161016191602090910190613e1d565b5061016280546001600160a01b031990811673869cb8fe8f7e0b1a483fee1200e9f36176539f59179091556101638054909116738066c737b2c0c035255cdec0d1928fa30026af3317905561199f3390565b61016080546001600160a01b0319166001600160a01b03929092169190911790556119cb600033612c2d565b6119e3600080516020614d6083398151915233612c2d565b611a0d7f189ab7a9244df0848122154315af71fe140f3db0fe014031783b0946b8c9d2e333612c2d565b801561126a576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150565b600080516020614d60833981519152611a6d816127a1565b4780611ac55760405162461bcd60e51b815260206004820152602160248201527f42616c616e6365206d7573742062652067726561746572207468616e207a65726044820152606f60f81b6064820152608401610bd2565b6101625461118a906001600160a01b031647612c37565b600080516020614d60833981519152611af4816127a1565b506001600160a01b0391909116600090815261017160205260409020805460ff1916911515919091179055565b600080516020614d60833981519152611b39816127a1565b5061016080546001600160a01b0319166001600160a01b0392909216919091179055565b60009182526097602090815260408084206001600160a01b0393909316845291905290205460ff1690565b606060668054610a129061458e565b81611ba1816125a8565b610ad08383612ccd565b836001600160a01b0381163314611bc557611bc5336125a8565b611bd185858585612cd8565b5050505050565b610165546001908114611bfd5760405162461bcd60e51b8152600401610bd290614899565b323314611c1c5760405162461bcd60e51b8152600401610bd2906148c5565b600084118015611c2c5750600083115b611c845760405162461bcd60e51b8152602060048201526024808201527f546865206e756d626572206d7573742062652067726561746572207468616e206044820152637a65726f60e01b6064820152608401610bd2565b6000611cb53386868a8a604051806040016040528060088152602001671adadddb135a5b9d60c21b8152508961126d565b610163549091506001600160a01b03808316911614611ce65760405162461bcd60e51b8152600401610bd2906148fc565b61016c8787604051611cf992919061460d565b908152602001604051809103902054600003611d34578361016c8888604051611d2392919061460d565b908152604051908190036020019020555b600061016d8888604051611d4992919061460d565b90815260200160405180910390205461016c8989604051611d6b92919061460d565b908152602001604051809103902054611d8491906145de565b905060008111611dd65760405162461bcd60e51b815260206004820181905260248201527f596f752068617665207265616368656420796f7572206d696e74206c696d69746044820152606401610bd2565b85811115611de15750845b6101698054820190819055610da41015611e3d5760405162461bcd60e51b815260206004820152601f60248201527f52656163686564206b756b75206c697374206d6178696d756d206c696d6974006044820152606401610bd2565b8061016d8989604051611e5192919061460d565b9081526040519081900360200190208054909101905561016454600090611e789083612d0a565b905080341015611ebe5760405162461bcd60e51b815260206004820152601160248201527056616c75652062656c6f7720707269636560781b6044820152606401610bd2565b34818103908214611ef857604051339082156108fc029083906000818181858888f19350505050158015611ef6573d6000803e3d6000fd5b505b611f023384612d16565b7f9ebd6f44bf7360a54077d1183f2e1ec61322fe883fd7b7f64d32c69ad40163258a8a338642604051611f3995949392919061492c565b60405180910390a150505050505050505050565b6060611f5882612549565b6000611f62612d44565b90506000815111611f825760405180602001604052806000815250611fad565b80611f8c84612d54565b604051602001611f9d929190614989565b6040516020818303038152906040525b9392505050565b600080516020614d60833981519152611fcc816127a1565b5061016280546001600160a01b0319166001600160a01b0392909216919091179055565b6101655460019081146120155760405162461bcd60e51b8152600401610bd290614899565b3233146120345760405162461bcd60e51b8152600401610bd2906148c5565b60006120653385868989604051806040016040528060088152602001671adad859135a5b9d60c21b8152508961126d565b610163549091506001600160a01b038083169116146120965760405162461bcd60e51b8152600401610bd2906148fc565b61016a86866040516120a992919061460d565b9081526020016040518091039020546000146120fa5760405162461bcd60e51b815260206004820152601060248201526f12185d99481899595b881b5a5b9d195960821b6044820152606401610bd2565b610168805485019081905561020c10156121615760405162461bcd60e51b815260206004820152602260248201527f526561636865642061697264726f70206d696e74206d6178696d756d206c696d6044820152611a5d60f21b6064820152608401610bd2565b600161016a878760405161217692919061460d565b908152604051908190036020019020556121966121903390565b85612d16565b7f9ebd6f44bf7360a54077d1183f2e1ec61322fe883fd7b7f64d32c69ad401632586863387426040516121cd9594939291906149b8565b60405180910390a1505050505050565b600080516020614d608339815191526121f5816127a1565b610167546107d0846122086001846145de565b61221291906145f5565b11156122605760405162461bcd60e51b815260206004820152601e60248201527f4e6f7420656e6f75676820746f6b656e73206c65667420746f206d696e7400006044820152606401610bd2565b60005b84811015612281576122758483612de6565b60019182019101612263565b5061016755505050565b6000828152609760205260409020600101546122a6816127a1565b610ad08383612831565b600061016e83836040516122c592919061460d565b908152602001604051809103902054905092915050565b6101655460029081146123015760405162461bcd60e51b8152600401610bd290614899565b3233146123205760405162461bcd60e51b8152600401610bd2906148c5565b60006123513385868989604051806040016040528060088152602001671adadb1b135a5b9d60c21b8152508961126d565b610163549091506001600160a01b038083169116146123825760405162461bcd60e51b8152600401610bd2906148fc565b611a0a8460016101665461239691906145de565b6123a091906145f5565b11156123ee5760405162461bcd60e51b815260206004820152601f60248201527f52656163686564206b756b75206d696e74206d6178696d756d206c696d6974006044820152606401610bd2565b61016b868660405161240192919061460d565b9081526020016040518091039020546000146124525760405162461bcd60e51b815260206004820152601060248201526f12185d99481899595b881b5a5b9d195960821b6044820152606401610bd2565b60006124616101645486612d0a565b9050803410156124a75760405162461bcd60e51b815260206004820152601160248201527056616c75652062656c6f7720707269636560781b6044820152606401610bd2565b600161016b88886040516124bc92919061460d565b908152604051908190036020019020556124dc6124d63390565b86612d16565b7f9ebd6f44bf7360a54077d1183f2e1ec61322fe883fd7b7f64d32c69ad40163258787338842604051612513959493929190614a15565b60405180910390a150505050505050565b60006001600160e01b0319821663152a902d60e11b14806109fd57506109fd82612f7f565b6000818152606760205260409020546001600160a01b031661126a5760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610bd2565b6daaeb6d7670e522a718067333cd4e3b1561126a57604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015612615573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126399190614a72565b61126a57604051633b79c77360e21b81526001600160a01b0382166004820152602401610bd2565b600061266c82611618565b9050806001600160a01b0316836001600160a01b0316036126d95760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610bd2565b336001600160a01b03821614806126f557506126f5813361095c565b6127675760405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152608401610bd2565b610ad08383612fa4565b61277a336112df565b6127965760405162461bcd60e51b8152600401610bd290614a8f565b610ad0838383613012565b61126a8133613183565b6127b58282611b5d565b61118a5760008281526097602090815260408083206001600160a01b03851684529091529020805460ff191660011790556127ed3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b61283b8282611b5d565b1561118a5760008281526097602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b7f189ab7a9244df0848122154315af71fe140f3db0fe014031783b0946b8c9d2e361118a816127a1565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff16156128f557610ad0836131dc565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa92505050801561294f575060408051601f3d908101601f1916820190925261294c91810190614adc565b60015b6129b25760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b6064820152608401610bd2565b600080516020614d198339815191528114612a215760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b6064820152608401610bd2565b50610ad0838383613278565b6000806000612a3c858561329d565b91509150612a49816132df565b509392505050565b610ad083838360405180602001604052806000815250611bab565b600080612a7883611618565b9050806001600160a01b0316846001600160a01b03161480612abf57506001600160a01b038082166000908152606a602090815260408083209388168352929052205460ff165b806114235750836001600160a01b0316612ad884610a95565b6001600160a01b031614949350505050565b6000612af582611618565b9050612b05816000846001613429565b612b0e82611618565b600083815260696020908152604080832080546001600160a01b03199081169091556001600160a01b0385168085526068845282852080546000190190558785526067909352818420805490911690555192935084927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b600054610100900460ff16612bb45760405162461bcd60e51b8152600401610bd290614af5565b61118a828261348a565b600054610100900460ff16612be55760405162461bcd60e51b8152600401610bd290614af5565b565b600054610100900460ff16612c0e5760405162461bcd60e51b8152600401610bd290614af5565b612be5733cc6cdda760b79bafa08df41ecfa224f810dceb660016134d8565b61118a82826127ab565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612c84576040519150601f19603f3d011682016040523d82523d6000602084013e612c89565b606091505b5050905080610ad05760405162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b6044820152606401610bd2565b61118a33838361367f565b612ce23383612a6c565b612cfe5760405162461bcd60e51b8152600401610bd290614a8f565b610b468484848461374d565b6000611fad8383613780565b6101665460005b82811015612d3b57612d2f8483612de6565b60019182019101612d1d565b50610166555050565b60606101618054610a129061458e565b60606000612d618361378c565b60010190506000816001600160401b03811115612d8057612d80614132565b6040519080825280601f01601f191660200182016040528015612daa576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a8504945084612db457509392505050565b6001600160a01b038216612e3c5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610bd2565b6000818152606760205260409020546001600160a01b031615612ea15760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610bd2565b612eaf600083836001613429565b6000818152606760205260409020546001600160a01b031615612f145760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610bd2565b6001600160a01b038216600081815260686020908152604080832080546001019055848352606790915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006001600160e01b03198216637965db0b60e01b14806109fd57506109fd82613864565b600081815260696020526040902080546001600160a01b0319166001600160a01b0384169081179091558190612fd982611618565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b826001600160a01b031661302582611618565b6001600160a01b03161461304b5760405162461bcd60e51b8152600401610bd290614b40565b6001600160a01b0382166130ad5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610bd2565b6130ba8383836001613429565b826001600160a01b03166130cd82611618565b6001600160a01b0316146130f35760405162461bcd60e51b8152600401610bd290614b40565b600081815260696020908152604080832080546001600160a01b03199081169091556001600160a01b0387811680865260688552838620805460001901905590871680865283862080546001019055868652606790945282852080549092168417909155905184937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b61318d8282611b5d565b61118a5761319a816138b4565b6131a58360206138c6565b6040516020016131b6929190614b85565b60408051601f198184030181529082905262461bcd60e51b8252610bd291600401613f41565b6001600160a01b0381163b6132495760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610bd2565b600080516020614d1983398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b61328183613a61565b60008251118061328e5750805b15610ad057610b468383613aa1565b60008082516041036132d35760208301516040840151606085015160001a6132c787828585613b95565b94509450505050610e80565b50600090506002610e80565b60008160048111156132f3576132f3614bfa565b036132fb5750565b600181600481111561330f5761330f614bfa565b0361335c5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610bd2565b600281600481111561337057613370614bfa565b036133bd5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610bd2565b60038160048111156133d1576133d1614bfa565b0361126a5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610bd2565b600082815261016f60205260409020541561347e5760405162461bcd60e51b8152602060048201526015602482015274151bdad95b881b1bd8dad95908189e48195d995b9d605a1b6044820152606401610bd2565b610b4684848484613c59565b600054610100900460ff166134b15760405162461bcd60e51b8152600401610bd290614af5565b81516134c4906065906020850190613e1d565b508051610ad0906066906020840190613e1d565b600054610100900460ff166134ff5760405162461bcd60e51b8152600401610bd290614af5565b6daaeb6d7670e522a718067333cd4e3b1561118a5760405163c3c5a54760e01b81523060048201526daaeb6d7670e522a718067333cd4e9063c3c5a547906024016020604051808303816000875af115801561355f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135839190614a72565b61118a5780156135ff57604051633e9f1edf60e11b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e90637d3e3dbe906044015b600060405180830381600087803b1580156135e357600080fd5b505af11580156135f7573d6000803e3d6000fd5b505050505050565b6001600160a01b0382161561364e5760405163a0af290360e01b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e9063a0af2903906044016135c9565b604051632210724360e11b81523060048201526daaeb6d7670e522a718067333cd4e90634420e486906024016135c9565b816001600160a01b0316836001600160a01b0316036136e05760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610bd2565b6001600160a01b038381166000818152606a6020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b613758848484613012565b61376484848484613ce1565b610b465760405162461bcd60e51b8152600401610bd290614c10565b6000611fad828461475a565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b83106137cb5772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef810000000083106137f7576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061381557662386f26fc10000830492506010015b6305f5e100831061382d576305f5e100830492506008015b612710831061384157612710830492506004015b60648310613853576064830492506002015b600a83106109fd5760010192915050565b60006001600160e01b031982166380ac58cd60e01b148061389557506001600160e01b03198216635b5e139f60e01b145b806109fd57506301ffc9a760e01b6001600160e01b03198316146109fd565b60606109fd6001600160a01b03831660145b606060006138d583600261475a565b6138e09060026145f5565b6001600160401b038111156138f7576138f7614132565b6040519080825280601f01601f191660200182016040528015613921576020820181803683370190505b509050600360fc1b8160008151811061393c5761393c614666565b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811061396b5761396b614666565b60200101906001600160f81b031916908160001a905350600061398f84600261475a565b61399a9060016145f5565b90505b6001811115613a12576f181899199a1a9b1b9c1cb0b131b232b360811b85600f16601081106139ce576139ce614666565b1a60f81b8282815181106139e4576139e4614666565b60200101906001600160f81b031916908160001a90535060049490941c93613a0b81614c62565b905061399d565b508315611fad5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610bd2565b613a6a816131dc565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606001600160a01b0383163b613b095760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b6064820152608401610bd2565b600080846001600160a01b031684604051613b249190614c79565b600060405180830381855af49150503d8060008114613b5f576040519150601f19603f3d011682016040523d82523d6000602084013e613b64565b606091505b5091509150613b8c8282604051806060016040528060278152602001614d3960279139613ddf565b95945050505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115613bcc5750600090506003613c50565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015613c20573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116613c4957600060019250925050613c50565b9150600090505b94509492505050565b6001811115610b46576001600160a01b03841615613c9f576001600160a01b03841660009081526068602052604081208054839290613c999084906145de565b90915550505b6001600160a01b03831615610b46576001600160a01b03831660009081526068602052604081208054839290613cd69084906145f5565b909155505050505050565b60006001600160a01b0384163b15613dd757604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290613d25903390899088908890600401614c95565b6020604051808303816000875af1925050508015613d60575060408051601f3d908101601f19168201909252613d5d91810190614cd2565b60015b613dbd573d808015613d8e576040519150601f19603f3d011682016040523d82523d6000602084013e613d93565b606091505b508051600003613db55760405162461bcd60e51b8152600401610bd290614c10565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611423565b506001611423565b60608315613dee575081611fad565b611fad8383815115613e035781518083602001fd5b8060405162461bcd60e51b8152600401610bd29190613f41565b828054613e299061458e565b90600052602060002090601f016020900481019282613e4b5760008555613e91565b82601f10613e6457805160ff1916838001178555613e91565b82800160010185558215613e91579182015b82811115613e91578251825591602001919060010190613e76565b50613e9d929150613ea1565b5090565b5b80821115613e9d5760008155600101613ea2565b6001600160e01b03198116811461126a57600080fd5b600060208284031215613ede57600080fd5b8135611fad81613eb6565b60005b83811015613f04578181015183820152602001613eec565b83811115610b465750506000910152565b60008151808452613f2d816020860160208601613ee9565b601f01601f19169290920160200192915050565b602081526000611fad6020830184613f15565b600060208284031215613f6657600080fd5b5035919050565b80356001600160a01b0381168114613f8457600080fd5b919050565b60008060408385031215613f9c57600080fd5b613fa583613f6d565b946020939093013593505050565b600080600060608486031215613fc857600080fd5b613fd184613f6d565b9250613fdf60208501613f6d565b9150604084013590509250925092565b60006020828403121561400157600080fd5b611fad82613f6d565b60008083601f84011261401c57600080fd5b5081356001600160401b0381111561403357600080fd5b602083019150836020828501011115610e8057600080fd5b6000806000806040858703121561406157600080fd5b84356001600160401b038082111561407857600080fd5b6140848883890161400a565b9096509450602087013591508082111561409d57600080fd5b818701915087601f8301126140b157600080fd5b8135818111156140c057600080fd5b8860208260051b85010111156140d557600080fd5b95989497505060200194505050565b600080604083850312156140f757600080fd5b50508035926020909101359150565b6000806040838503121561411957600080fd5b8235915061412960208401613f6d565b90509250929050565b634e487b7160e01b600052604160045260246000fd5b600082601f83011261415957600080fd5b81356001600160401b038082111561417357614173614132565b604051601f8301601f19908116603f0116810190828211818310171561419b5761419b614132565b816040528381528660208588010111156141b457600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600080600080600060c0888a0312156141ef57600080fd5b6141f888613f6d565b9650602088013595506040880135945060608801356001600160401b038082111561422257600080fd5b61422e8b838c0161400a565b909650945060808a013591508082111561424757600080fd5b6142538b838c01614148565b935060a08a013591508082111561426957600080fd5b506142768a828b01614148565b91505092959891949750929550565b6020808252825182820181905260009190848201906040850190845b818110156142bd578351835292840192918401916001016142a1565b50909695505050505050565b600080604083850312156142dc57600080fd5b6142e583613f6d565b915060208301356001600160401b0381111561430057600080fd5b61430c85828601614148565b9150509250929050565b60006020828403121561432857600080fd5b81356001600160401b0381111561433e57600080fd5b61142384828501614148565b60008060006040848603121561435f57600080fd5b83356001600160401b0381111561437557600080fd5b6143818682870161400a565b909790965060209590950135949350505050565b801515811461126a57600080fd5b600080604083850312156143b657600080fd5b6143bf83613f6d565b915060208301356143cf81614395565b809150509250929050565b600080600080608085870312156143f057600080fd5b6143f985613f6d565b935061440760208601613f6d565b92506040850135915060608501356001600160401b0381111561442957600080fd5b61443587828801614148565b91505092959194509250565b60008060008060006080868803121561445957600080fd5b85356001600160401b038082111561447057600080fd5b61447c89838a0161400a565b9097509550602088013594506040880135935060608801359150808211156144a357600080fd5b506144b088828901614148565b9150509295509295909350565b600080600080606085870312156144d357600080fd5b84356001600160401b03808211156144ea57600080fd5b6144f68883890161400a565b909650945060208701359350604087013591508082111561451657600080fd5b5061443587828801614148565b6000806020838503121561453657600080fd5b82356001600160401b0381111561454c57600080fd5b6145588582860161400a565b90969095509350505050565b6000806040838503121561457757600080fd5b61458083613f6d565b915061412960208401613f6d565b600181811c908216806145a257607f821691505b6020821081036145c257634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b6000828210156145f0576145f06145c8565b500390565b60008219821115614608576146086145c8565b500190565b8183823760009101908152919050565b60208082526029908201527f546f6b656e496473206c656e677468206d7573742062652067726561746572206040820152687468616e207a65726f60b81b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b6020808252602f908201527f43616c6c6572206d757374206265206f776e6572206f6620746f6b656e206f7260408201526e1031b7b73a3930b1ba1037bbb732b960891b606082015260800190565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60808152600061470860808301888a6146cb565b82810360208401528581526001600160fb1b0386111561472757600080fd5b8560051b80886020840137600091016020019081526001600160a01b039490941660408301525060600152949350505050565b6000816000190483118215151615614774576147746145c8565b500290565b60008261479657634e487b7160e01b600052601260045260246000fd5b500490565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b60018060a01b038716815285602082015284604082015260a06060820152600061486160a0830185876146cb565b82810360808401526148738185613f15565b9998505050505050505050565b600060018201614892576148926145c8565b5060010190565b602080825260129082015271496e76616c69642053616c6520537461746560701b604082015260600190565b6020808252601d908201527f4d7573742066726f6d207265616c2077616c6c65742061646472657373000000604082015260600190565b602080825260169082015275139bdd08185d5d1a1bdc9a5e9959081d1bc81b5a5b9d60521b604082015260600190565b60a08152600061494060a0830187896146cb565b82810360208085019190915260088252671adadddb135a5b9d60c21b908201526001600160a01b0395909516604080840191909152606083019490945250608001520192915050565b6000835161499b818460208801613ee9565b8351908301906149af818360208801613ee9565b01949350505050565b60a0815260006149cc60a0830187896146cb565b82810360208085019190915260088252671adad859135a5b9d60c21b908201526001600160a01b0395909516604080840191909152606083019490945250608001520192915050565b60a081526000614a2960a0830187896146cb565b82810360208085019190915260088252671adadb1b135a5b9d60c21b908201526001600160a01b0395909516604080840191909152606083019490945250608001520192915050565b600060208284031215614a8457600080fd5b8151611fad81614395565b6020808252602d908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526c1c881bdc88185c1c1c9bdd9959609a1b606082015260800190565b600060208284031215614aee57600080fd5b5051919050565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b60208082526025908201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060408201526437bbb732b960d91b606082015260800190565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351614bbd816017850160208801613ee9565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351614bee816028840160208801613ee9565b01602801949350505050565b634e487b7160e01b600052602160045260246000fd5b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b600081614c7157614c716145c8565b506000190190565b60008251614c8b818460208701613ee9565b9190910192915050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090614cc890830184613f15565b9695505050505050565b600060208284031215614ce457600080fd5b8151611fad81613eb656fe68747470733a2f2f6d657461646174612e6d61747231782e696f2f6d657461646174612f6b756b752f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c65649f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6a2646970667358221220c4bc79cc739d2185bd07c4084dc9cb568556115f64eceec233697271814ff5eb64736f6c634300080d0033
Deployed Bytecode
0x6080604052600436106102ff5760003560e01c806370a0823111610190578063bdb4b848116100dc578063d539139311610095578063e985e9c51161006f578063e985e9c514610941578063f17af48d1461098a578063f72c0d8b146109ab578063fa2cf1e1146109df57600080fd5b8063d5391393146108df578063d547741f14610901578063da29bb0b1461092157600080fd5b8063bdb4b84814610831578063c19d93fb14610848578063c87b56dd1461085f578063c93c266e1461087f578063d44bbff71461089f578063d52c57e0146108bf57600080fd5b806391d1485411610149578063a22cb46511610123578063a22cb465146107b0578063a5a1b2ba146107d0578063b88d4fde146107fe578063bc8732c51461081e57600080fd5b806391d148541461076657806395d89b4114610786578063a217fddf1461079b57600080fd5b806370a08231146106bd5780638129fc1c146106dd578063853828b6146106f257806385eaf82814610707578063880cdc31146107275780638da5cb5b1461074757600080fd5b806336568abe1161024f5780634f1ef286116102085780636352211e116101e25780636352211e1461063d57806369ba1a751461065d5780636ba060fb1461067d5780636c19e7831461069d57600080fd5b80634f1ef286146105f557806352d1902d1461060857806355f804b31461061d57600080fd5b806336568abe146105285780633659cfe61461054857806342146e5b1461056857806342842e0e1461058857806342966c68146105a857806342d7f293146105c857600080fd5b8063248a9ca3116102bc5780632a261fb4116102965780632a261fb4146104895780632a55205a146104a95780632f2ff15d146104e8578063319504001461050857600080fd5b8063248a9ca3146103f857806326987b601461042857806329a587be1461045857600080fd5b806301ffc9a71461030457806306fdde0314610339578063081812fc1461035b578063095ea7b31461039357806318160ddd146103b557806323b872dd146103d8575b600080fd5b34801561031057600080fd5b5061032461031f366004613ecc565b6109f2565b60405190151581526020015b60405180910390f35b34801561034557600080fd5b5061034e610a03565b6040516103309190613f41565b34801561036757600080fd5b5061037b610376366004613f54565b610a95565b6040516001600160a01b039091168152602001610330565b34801561039f57600080fd5b506103b36103ae366004613f89565b610abc565b005b3480156103c157600080fd5b506103ca610ad5565b604051908152602001610330565b3480156103e457600080fd5b506103b36103f3366004613fb3565b610b21565b34801561040457600080fd5b506103ca610413366004613f54565b60009081526097602052604090206001015490565b34801561043457600080fd5b5061043d610b4c565b60408051938452602084019290925290820152606001610330565b34801561046457600080fd5b50610324610473366004613fef565b6101716020526000908152604090205460ff1681565b34801561049557600080fd5b506103b36104a436600461404b565b610b74565b3480156104b557600080fd5b506104c96104c43660046140e4565b610dd9565b604080516001600160a01b039093168352602083019190915201610330565b3480156104f457600080fd5b506103b3610503366004614106565b610e87565b34801561051457600080fd5b506103b361052336600461404b565b610eac565b34801561053457600080fd5b506103b3610543366004614106565b611110565b34801561055457600080fd5b506103b3610563366004613fef565b61118e565b34801561057457600080fd5b5061037b6105833660046141d4565b61126d565b34801561059457600080fd5b506103b36105a3366004613fb3565b6112b5565b3480156105b457600080fd5b506103b36105c3366004613f54565b6112da565b3480156105d457600080fd5b506105e86105e336600461404b565b61135c565b6040516103309190614285565b6103b36106033660046142c9565b61142b565b34801561061457600080fd5b506103ca6114f7565b34801561062957600080fd5b506103b3610638366004614316565b6115aa565b34801561064957600080fd5b5061037b610658366004613f54565b611618565b34801561066957600080fd5b506103b3610678366004613f54565b611678565b34801561068957600080fd5b506103b361069836600461434a565b6116cd565b3480156106a957600080fd5b506103b36106b8366004613fef565b61170f565b3480156106c957600080fd5b506103ca6106d8366004613fef565b61174b565b3480156106e957600080fd5b506103b36117d1565b3480156106fe57600080fd5b506103b3611a55565b34801561071357600080fd5b506103b36107223660046143a3565b611adc565b34801561073357600080fd5b506103b3610742366004613fef565b611b21565b34801561075357600080fd5b50610160546001600160a01b031661037b565b34801561077257600080fd5b50610324610781366004614106565b611b5d565b34801561079257600080fd5b5061034e611b88565b3480156107a757600080fd5b506103ca600081565b3480156107bc57600080fd5b506103b36107cb3660046143a3565b611b97565b3480156107dc57600080fd5b506103ca6107eb366004613f54565b600090815261016f602052604090205490565b34801561080a57600080fd5b506103b36108193660046143da565b611bab565b6103b361082c366004614441565b611bd8565b34801561083d57600080fd5b506103ca6101645481565b34801561085457600080fd5b506103ca6101655481565b34801561086b57600080fd5b5061034e61087a366004613f54565b611f4d565b34801561088b57600080fd5b506103b361089a366004613fef565b611fb4565b3480156108ab57600080fd5b506103b36108ba3660046144bd565b611ff0565b3480156108cb57600080fd5b506103b36108da366004614106565b6121dd565b3480156108eb57600080fd5b506103ca600080516020614d6083398151915281565b34801561090d57600080fd5b506103b361091c366004614106565b61228b565b34801561092d57600080fd5b506103ca61093c366004614523565b6122b0565b34801561094d57600080fd5b5061032461095c366004614564565b6001600160a01b039182166000908152606a6020908152604080832093909416825291909152205460ff1690565b34801561099657600080fd5b506101635461037b906001600160a01b031681565b3480156109b757600080fd5b506103ca7f189ab7a9244df0848122154315af71fe140f3db0fe014031783b0946b8c9d2e381565b6103b36109ed3660046144bd565b6122dc565b60006109fd82612524565b92915050565b606060658054610a129061458e565b80601f0160208091040260200160405190810160405280929190818152602001828054610a3e9061458e565b8015610a8b5780601f10610a6057610100808354040283529160200191610a8b565b820191906000526020600020905b815481529060010190602001808311610a6e57829003601f168201915b5050505050905090565b6000610aa082612549565b506000908152606960205260409020546001600160a01b031690565b81610ac6816125a8565b610ad08383612661565b505050565b600061015f546001610167546107d0600161016654610af491906145de565b610afe91906145de565b610b0891906145f5565b610b1291906145de565b610b1c91906145de565b905090565b826001600160a01b0381163314610b3b57610b3b336125a8565b610b46848484612771565b50505050565b60008060006101685461016954600161016654610b6991906145de565b925092509250909192565b61016e8484604051610b8792919061460d565b908152602001604051809103902054600114610bdb5760405162461bcd60e51b815260206004820152600e60248201526d22bb32b73a103737ba1037b832b760911b60448201526064015b60405180910390fd5b80610bf85760405162461bcd60e51b8152600401610bd29061461d565b6014811115610c3e5760405162461bcd60e51b815260206004820152601260248201527113585e081b1a5b5a5d081bdb994818d85b1b60721b6044820152606401610bd2565b60005b81811015610d91576000838383818110610c5d57610c5d614666565b905060200201359050610c6f81611618565b6001600160a01b0316336001600160a01b03161480610ca15750610ca1600080516020614d6083398151915233611b5d565b610cbd5760405162461bcd60e51b8152600401610bd29061467c565b6101708686604051610cd092919061460d565b90815260408051602092819003830190206000848152925290205415610d465760405162461bcd60e51b815260206004820152602560248201527f546f6b656e20616c7265616479206c6f636b65642062792063757272656e7420604482015264195d995b9d60da1b6064820152608401610bd2565b60016101708787604051610d5b92919061460d565b9081526040805160209281900383019020600094855282528084209290925561016f905290208054600190810190915501610c41565b507ffea44eff610c2922d0be033f0d5754e30414842ab51cea561ee1993e2bf25d46848484843342604051610dcb969594939291906146f4565b60405180910390a150505050565b600082815260ca602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046001600160601b0316928201929092528291610e4e57506040805180820190915260c9546001600160a01b0381168252600160a01b90046001600160601b031660208201525b602081015160009061271090610e6d906001600160601b03168761475a565b610e779190614779565b91519350909150505b9250929050565b600082815260976020526040902060010154610ea2816127a1565b610ad083836127ab565b80610ec95760405162461bcd60e51b8152600401610bd29061461d565b6014811115610f0f5760405162461bcd60e51b815260206004820152601260248201527113585e081b1a5b5a5d081bdb994818d85b1b60721b6044820152606401610bd2565b60005b818110156110d6576000838383818110610f2e57610f2e614666565b905060200201359050610f4081611618565b6001600160a01b0316336001600160a01b03161480610f725750610f72600080516020614d6083398151915233611b5d565b80610f8d5750336000908152610171602052604090205460ff165b610fa95760405162461bcd60e51b8152600401610bd29061467c565b6101708686604051610fbc92919061460d565b90815260200160405180910390206000828152602001908152602001600020546001146110355760405162461bcd60e51b815260206004820152602160248201527f546f6b656e206e6f74206c6f636b65642062792063757272656e74206576656e6044820152601d60fa1b6064820152608401610bd2565b6000610170878760405161104a92919061460d565b908152604080516020928190038301902060008581529083528181209390935561016f909152902054600111156110b75760405162461bcd60e51b81526020600482015260116024820152702637b1b59031b7bab73a399032b93937b960791b6044820152606401610bd2565b600090815261016f602052604090208054600019019055600101610f12565b507f0e6a9b542100dff5c1e072c595fc95d46787c6371af93218c380a7dcf53efe4c848484843342604051610dcb969594939291906146f4565b6001600160a01b03811633146111805760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b6064820152608401610bd2565b61118a8282612831565b5050565b6001600160a01b037f000000000000000000000000d33181330cfc5c475abb223e930009d87762b2701630036111d65760405162461bcd60e51b8152600401610bd29061479b565b7f000000000000000000000000d33181330cfc5c475abb223e930009d87762b2706001600160a01b031661121f600080516020614d19833981519152546001600160a01b031690565b6001600160a01b0316146112455760405162461bcd60e51b8152600401610bd2906147e7565b61124e81612898565b6040805160008082526020820190925261126a918391906128c2565b50565b60006112a988888888888860405160200161128d96959493929190614833565b6040516020818303038152906040528051906020012083612a2d565b98975050505050505050565b826001600160a01b03811633146112cf576112cf336125a8565b610b46848484612a51565b6112e5335b82612a6c565b61133f5760405162461bcd60e51b815260206004820152602560248201527f6275726e2063616c6c6572206973206e6f74206f776e6572206e6f72206170706044820152641c9bdd995960da1b6064820152608401610bd2565b61015f6000815461134f90614880565b9091555061126a81612aea565b60606000826001600160401b0381111561137857611378614132565b6040519080825280602002602001820160405280156113a1578160200160208202803683370190505b50905060005b8381101561141f5761017087876040516113c292919061460d565b908152602001604051809103902060008686848181106113e4576113e4614666565b9050602002013581526020019081526020016000205482828151811061140c5761140c614666565b60209081029190910101526001016113a7565b5090505b949350505050565b6001600160a01b037f000000000000000000000000d33181330cfc5c475abb223e930009d87762b2701630036114735760405162461bcd60e51b8152600401610bd29061479b565b7f000000000000000000000000d33181330cfc5c475abb223e930009d87762b2706001600160a01b03166114bc600080516020614d19833981519152546001600160a01b031690565b6001600160a01b0316146114e25760405162461bcd60e51b8152600401610bd2906147e7565b6114eb82612898565b61118a828260016128c2565b6000306001600160a01b037f000000000000000000000000d33181330cfc5c475abb223e930009d87762b27016146115975760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c00000000000000006064820152608401610bd2565b50600080516020614d1983398151915290565b600080516020614d608339815191526115c2816127a1565b60008251116116045760405162461bcd60e51b815260206004820152600e60248201526d57726f6e6720626173652075726960901b6044820152606401610bd2565b8151610ad090610161906020850190613e1d565b6000818152606760205260408120546001600160a01b0316806109fd5760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610bd2565b600080516020614d60833981519152611690816127a1565b6101658290556040518281527f4f120ecdf2c1af515eb9463e6fde36c97fa45c38ea121fb30ffc9ed27ca645009060200160405180910390a15050565b600080516020614d608339815191526116e5816127a1565b8161016e85856040516116f992919061460d565b9081526040519081900360200190205550505050565b600080516020614d60833981519152611727816127a1565b5061016380546001600160a01b0319166001600160a01b0392909216919091179055565b60006001600160a01b0382166117b55760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b6064820152608401610bd2565b506001600160a01b031660009081526068602052604090205490565b600054610100900460ff16158080156117f15750600054600160ff909116105b8061180b5750303b15801561180b575060005460ff166001145b61186e5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610bd2565b6000805460ff191660011790558015611891576000805461ff0019166101001790555b6118da6040518060400160405280600b81526020016a4d4154523158204b554b5560a81b815250604051806040016040528060048152602001634b554b5560e01b815250612b8d565b6118e2612bbe565b6118ea612bbe565b6118f2612be7565b6118fa612bbe565b600061015f81905561016555670585fae42c9b0000610164556001610167556107d16101665560408051606081019091526029808252614cf06020830139805161194d9161016191602090910190613e1d565b5061016280546001600160a01b031990811673869cb8fe8f7e0b1a483fee1200e9f36176539f59179091556101638054909116738066c737b2c0c035255cdec0d1928fa30026af3317905561199f3390565b61016080546001600160a01b0319166001600160a01b03929092169190911790556119cb600033612c2d565b6119e3600080516020614d6083398151915233612c2d565b611a0d7f189ab7a9244df0848122154315af71fe140f3db0fe014031783b0946b8c9d2e333612c2d565b801561126a576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150565b600080516020614d60833981519152611a6d816127a1565b4780611ac55760405162461bcd60e51b815260206004820152602160248201527f42616c616e6365206d7573742062652067726561746572207468616e207a65726044820152606f60f81b6064820152608401610bd2565b6101625461118a906001600160a01b031647612c37565b600080516020614d60833981519152611af4816127a1565b506001600160a01b0391909116600090815261017160205260409020805460ff1916911515919091179055565b600080516020614d60833981519152611b39816127a1565b5061016080546001600160a01b0319166001600160a01b0392909216919091179055565b60009182526097602090815260408084206001600160a01b0393909316845291905290205460ff1690565b606060668054610a129061458e565b81611ba1816125a8565b610ad08383612ccd565b836001600160a01b0381163314611bc557611bc5336125a8565b611bd185858585612cd8565b5050505050565b610165546001908114611bfd5760405162461bcd60e51b8152600401610bd290614899565b323314611c1c5760405162461bcd60e51b8152600401610bd2906148c5565b600084118015611c2c5750600083115b611c845760405162461bcd60e51b8152602060048201526024808201527f546865206e756d626572206d7573742062652067726561746572207468616e206044820152637a65726f60e01b6064820152608401610bd2565b6000611cb53386868a8a604051806040016040528060088152602001671adadddb135a5b9d60c21b8152508961126d565b610163549091506001600160a01b03808316911614611ce65760405162461bcd60e51b8152600401610bd2906148fc565b61016c8787604051611cf992919061460d565b908152602001604051809103902054600003611d34578361016c8888604051611d2392919061460d565b908152604051908190036020019020555b600061016d8888604051611d4992919061460d565b90815260200160405180910390205461016c8989604051611d6b92919061460d565b908152602001604051809103902054611d8491906145de565b905060008111611dd65760405162461bcd60e51b815260206004820181905260248201527f596f752068617665207265616368656420796f7572206d696e74206c696d69746044820152606401610bd2565b85811115611de15750845b6101698054820190819055610da41015611e3d5760405162461bcd60e51b815260206004820152601f60248201527f52656163686564206b756b75206c697374206d6178696d756d206c696d6974006044820152606401610bd2565b8061016d8989604051611e5192919061460d565b9081526040519081900360200190208054909101905561016454600090611e789083612d0a565b905080341015611ebe5760405162461bcd60e51b815260206004820152601160248201527056616c75652062656c6f7720707269636560781b6044820152606401610bd2565b34818103908214611ef857604051339082156108fc029083906000818181858888f19350505050158015611ef6573d6000803e3d6000fd5b505b611f023384612d16565b7f9ebd6f44bf7360a54077d1183f2e1ec61322fe883fd7b7f64d32c69ad40163258a8a338642604051611f3995949392919061492c565b60405180910390a150505050505050505050565b6060611f5882612549565b6000611f62612d44565b90506000815111611f825760405180602001604052806000815250611fad565b80611f8c84612d54565b604051602001611f9d929190614989565b6040516020818303038152906040525b9392505050565b600080516020614d60833981519152611fcc816127a1565b5061016280546001600160a01b0319166001600160a01b0392909216919091179055565b6101655460019081146120155760405162461bcd60e51b8152600401610bd290614899565b3233146120345760405162461bcd60e51b8152600401610bd2906148c5565b60006120653385868989604051806040016040528060088152602001671adad859135a5b9d60c21b8152508961126d565b610163549091506001600160a01b038083169116146120965760405162461bcd60e51b8152600401610bd2906148fc565b61016a86866040516120a992919061460d565b9081526020016040518091039020546000146120fa5760405162461bcd60e51b815260206004820152601060248201526f12185d99481899595b881b5a5b9d195960821b6044820152606401610bd2565b610168805485019081905561020c10156121615760405162461bcd60e51b815260206004820152602260248201527f526561636865642061697264726f70206d696e74206d6178696d756d206c696d6044820152611a5d60f21b6064820152608401610bd2565b600161016a878760405161217692919061460d565b908152604051908190036020019020556121966121903390565b85612d16565b7f9ebd6f44bf7360a54077d1183f2e1ec61322fe883fd7b7f64d32c69ad401632586863387426040516121cd9594939291906149b8565b60405180910390a1505050505050565b600080516020614d608339815191526121f5816127a1565b610167546107d0846122086001846145de565b61221291906145f5565b11156122605760405162461bcd60e51b815260206004820152601e60248201527f4e6f7420656e6f75676820746f6b656e73206c65667420746f206d696e7400006044820152606401610bd2565b60005b84811015612281576122758483612de6565b60019182019101612263565b5061016755505050565b6000828152609760205260409020600101546122a6816127a1565b610ad08383612831565b600061016e83836040516122c592919061460d565b908152602001604051809103902054905092915050565b6101655460029081146123015760405162461bcd60e51b8152600401610bd290614899565b3233146123205760405162461bcd60e51b8152600401610bd2906148c5565b60006123513385868989604051806040016040528060088152602001671adadb1b135a5b9d60c21b8152508961126d565b610163549091506001600160a01b038083169116146123825760405162461bcd60e51b8152600401610bd2906148fc565b611a0a8460016101665461239691906145de565b6123a091906145f5565b11156123ee5760405162461bcd60e51b815260206004820152601f60248201527f52656163686564206b756b75206d696e74206d6178696d756d206c696d6974006044820152606401610bd2565b61016b868660405161240192919061460d565b9081526020016040518091039020546000146124525760405162461bcd60e51b815260206004820152601060248201526f12185d99481899595b881b5a5b9d195960821b6044820152606401610bd2565b60006124616101645486612d0a565b9050803410156124a75760405162461bcd60e51b815260206004820152601160248201527056616c75652062656c6f7720707269636560781b6044820152606401610bd2565b600161016b88886040516124bc92919061460d565b908152604051908190036020019020556124dc6124d63390565b86612d16565b7f9ebd6f44bf7360a54077d1183f2e1ec61322fe883fd7b7f64d32c69ad40163258787338842604051612513959493929190614a15565b60405180910390a150505050505050565b60006001600160e01b0319821663152a902d60e11b14806109fd57506109fd82612f7f565b6000818152606760205260409020546001600160a01b031661126a5760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610bd2565b6daaeb6d7670e522a718067333cd4e3b1561126a57604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015612615573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126399190614a72565b61126a57604051633b79c77360e21b81526001600160a01b0382166004820152602401610bd2565b600061266c82611618565b9050806001600160a01b0316836001600160a01b0316036126d95760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610bd2565b336001600160a01b03821614806126f557506126f5813361095c565b6127675760405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152608401610bd2565b610ad08383612fa4565b61277a336112df565b6127965760405162461bcd60e51b8152600401610bd290614a8f565b610ad0838383613012565b61126a8133613183565b6127b58282611b5d565b61118a5760008281526097602090815260408083206001600160a01b03851684529091529020805460ff191660011790556127ed3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b61283b8282611b5d565b1561118a5760008281526097602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b7f189ab7a9244df0848122154315af71fe140f3db0fe014031783b0946b8c9d2e361118a816127a1565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff16156128f557610ad0836131dc565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa92505050801561294f575060408051601f3d908101601f1916820190925261294c91810190614adc565b60015b6129b25760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b6064820152608401610bd2565b600080516020614d198339815191528114612a215760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b6064820152608401610bd2565b50610ad0838383613278565b6000806000612a3c858561329d565b91509150612a49816132df565b509392505050565b610ad083838360405180602001604052806000815250611bab565b600080612a7883611618565b9050806001600160a01b0316846001600160a01b03161480612abf57506001600160a01b038082166000908152606a602090815260408083209388168352929052205460ff165b806114235750836001600160a01b0316612ad884610a95565b6001600160a01b031614949350505050565b6000612af582611618565b9050612b05816000846001613429565b612b0e82611618565b600083815260696020908152604080832080546001600160a01b03199081169091556001600160a01b0385168085526068845282852080546000190190558785526067909352818420805490911690555192935084927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b600054610100900460ff16612bb45760405162461bcd60e51b8152600401610bd290614af5565b61118a828261348a565b600054610100900460ff16612be55760405162461bcd60e51b8152600401610bd290614af5565b565b600054610100900460ff16612c0e5760405162461bcd60e51b8152600401610bd290614af5565b612be5733cc6cdda760b79bafa08df41ecfa224f810dceb660016134d8565b61118a82826127ab565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612c84576040519150601f19603f3d011682016040523d82523d6000602084013e612c89565b606091505b5050905080610ad05760405162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b6044820152606401610bd2565b61118a33838361367f565b612ce23383612a6c565b612cfe5760405162461bcd60e51b8152600401610bd290614a8f565b610b468484848461374d565b6000611fad8383613780565b6101665460005b82811015612d3b57612d2f8483612de6565b60019182019101612d1d565b50610166555050565b60606101618054610a129061458e565b60606000612d618361378c565b60010190506000816001600160401b03811115612d8057612d80614132565b6040519080825280601f01601f191660200182016040528015612daa576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a8504945084612db457509392505050565b6001600160a01b038216612e3c5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610bd2565b6000818152606760205260409020546001600160a01b031615612ea15760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610bd2565b612eaf600083836001613429565b6000818152606760205260409020546001600160a01b031615612f145760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610bd2565b6001600160a01b038216600081815260686020908152604080832080546001019055848352606790915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006001600160e01b03198216637965db0b60e01b14806109fd57506109fd82613864565b600081815260696020526040902080546001600160a01b0319166001600160a01b0384169081179091558190612fd982611618565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b826001600160a01b031661302582611618565b6001600160a01b03161461304b5760405162461bcd60e51b8152600401610bd290614b40565b6001600160a01b0382166130ad5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610bd2565b6130ba8383836001613429565b826001600160a01b03166130cd82611618565b6001600160a01b0316146130f35760405162461bcd60e51b8152600401610bd290614b40565b600081815260696020908152604080832080546001600160a01b03199081169091556001600160a01b0387811680865260688552838620805460001901905590871680865283862080546001019055868652606790945282852080549092168417909155905184937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b61318d8282611b5d565b61118a5761319a816138b4565b6131a58360206138c6565b6040516020016131b6929190614b85565b60408051601f198184030181529082905262461bcd60e51b8252610bd291600401613f41565b6001600160a01b0381163b6132495760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610bd2565b600080516020614d1983398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b61328183613a61565b60008251118061328e5750805b15610ad057610b468383613aa1565b60008082516041036132d35760208301516040840151606085015160001a6132c787828585613b95565b94509450505050610e80565b50600090506002610e80565b60008160048111156132f3576132f3614bfa565b036132fb5750565b600181600481111561330f5761330f614bfa565b0361335c5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610bd2565b600281600481111561337057613370614bfa565b036133bd5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610bd2565b60038160048111156133d1576133d1614bfa565b0361126a5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610bd2565b600082815261016f60205260409020541561347e5760405162461bcd60e51b8152602060048201526015602482015274151bdad95b881b1bd8dad95908189e48195d995b9d605a1b6044820152606401610bd2565b610b4684848484613c59565b600054610100900460ff166134b15760405162461bcd60e51b8152600401610bd290614af5565b81516134c4906065906020850190613e1d565b508051610ad0906066906020840190613e1d565b600054610100900460ff166134ff5760405162461bcd60e51b8152600401610bd290614af5565b6daaeb6d7670e522a718067333cd4e3b1561118a5760405163c3c5a54760e01b81523060048201526daaeb6d7670e522a718067333cd4e9063c3c5a547906024016020604051808303816000875af115801561355f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135839190614a72565b61118a5780156135ff57604051633e9f1edf60e11b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e90637d3e3dbe906044015b600060405180830381600087803b1580156135e357600080fd5b505af11580156135f7573d6000803e3d6000fd5b505050505050565b6001600160a01b0382161561364e5760405163a0af290360e01b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e9063a0af2903906044016135c9565b604051632210724360e11b81523060048201526daaeb6d7670e522a718067333cd4e90634420e486906024016135c9565b816001600160a01b0316836001600160a01b0316036136e05760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610bd2565b6001600160a01b038381166000818152606a6020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b613758848484613012565b61376484848484613ce1565b610b465760405162461bcd60e51b8152600401610bd290614c10565b6000611fad828461475a565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b83106137cb5772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef810000000083106137f7576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061381557662386f26fc10000830492506010015b6305f5e100831061382d576305f5e100830492506008015b612710831061384157612710830492506004015b60648310613853576064830492506002015b600a83106109fd5760010192915050565b60006001600160e01b031982166380ac58cd60e01b148061389557506001600160e01b03198216635b5e139f60e01b145b806109fd57506301ffc9a760e01b6001600160e01b03198316146109fd565b60606109fd6001600160a01b03831660145b606060006138d583600261475a565b6138e09060026145f5565b6001600160401b038111156138f7576138f7614132565b6040519080825280601f01601f191660200182016040528015613921576020820181803683370190505b509050600360fc1b8160008151811061393c5761393c614666565b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811061396b5761396b614666565b60200101906001600160f81b031916908160001a905350600061398f84600261475a565b61399a9060016145f5565b90505b6001811115613a12576f181899199a1a9b1b9c1cb0b131b232b360811b85600f16601081106139ce576139ce614666565b1a60f81b8282815181106139e4576139e4614666565b60200101906001600160f81b031916908160001a90535060049490941c93613a0b81614c62565b905061399d565b508315611fad5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610bd2565b613a6a816131dc565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606001600160a01b0383163b613b095760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b6064820152608401610bd2565b600080846001600160a01b031684604051613b249190614c79565b600060405180830381855af49150503d8060008114613b5f576040519150601f19603f3d011682016040523d82523d6000602084013e613b64565b606091505b5091509150613b8c8282604051806060016040528060278152602001614d3960279139613ddf565b95945050505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115613bcc5750600090506003613c50565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015613c20573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116613c4957600060019250925050613c50565b9150600090505b94509492505050565b6001811115610b46576001600160a01b03841615613c9f576001600160a01b03841660009081526068602052604081208054839290613c999084906145de565b90915550505b6001600160a01b03831615610b46576001600160a01b03831660009081526068602052604081208054839290613cd69084906145f5565b909155505050505050565b60006001600160a01b0384163b15613dd757604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290613d25903390899088908890600401614c95565b6020604051808303816000875af1925050508015613d60575060408051601f3d908101601f19168201909252613d5d91810190614cd2565b60015b613dbd573d808015613d8e576040519150601f19603f3d011682016040523d82523d6000602084013e613d93565b606091505b508051600003613db55760405162461bcd60e51b8152600401610bd290614c10565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611423565b506001611423565b60608315613dee575081611fad565b611fad8383815115613e035781518083602001fd5b8060405162461bcd60e51b8152600401610bd29190613f41565b828054613e299061458e565b90600052602060002090601f016020900481019282613e4b5760008555613e91565b82601f10613e6457805160ff1916838001178555613e91565b82800160010185558215613e91579182015b82811115613e91578251825591602001919060010190613e76565b50613e9d929150613ea1565b5090565b5b80821115613e9d5760008155600101613ea2565b6001600160e01b03198116811461126a57600080fd5b600060208284031215613ede57600080fd5b8135611fad81613eb6565b60005b83811015613f04578181015183820152602001613eec565b83811115610b465750506000910152565b60008151808452613f2d816020860160208601613ee9565b601f01601f19169290920160200192915050565b602081526000611fad6020830184613f15565b600060208284031215613f6657600080fd5b5035919050565b80356001600160a01b0381168114613f8457600080fd5b919050565b60008060408385031215613f9c57600080fd5b613fa583613f6d565b946020939093013593505050565b600080600060608486031215613fc857600080fd5b613fd184613f6d565b9250613fdf60208501613f6d565b9150604084013590509250925092565b60006020828403121561400157600080fd5b611fad82613f6d565b60008083601f84011261401c57600080fd5b5081356001600160401b0381111561403357600080fd5b602083019150836020828501011115610e8057600080fd5b6000806000806040858703121561406157600080fd5b84356001600160401b038082111561407857600080fd5b6140848883890161400a565b9096509450602087013591508082111561409d57600080fd5b818701915087601f8301126140b157600080fd5b8135818111156140c057600080fd5b8860208260051b85010111156140d557600080fd5b95989497505060200194505050565b600080604083850312156140f757600080fd5b50508035926020909101359150565b6000806040838503121561411957600080fd5b8235915061412960208401613f6d565b90509250929050565b634e487b7160e01b600052604160045260246000fd5b600082601f83011261415957600080fd5b81356001600160401b038082111561417357614173614132565b604051601f8301601f19908116603f0116810190828211818310171561419b5761419b614132565b816040528381528660208588010111156141b457600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600080600080600060c0888a0312156141ef57600080fd5b6141f888613f6d565b9650602088013595506040880135945060608801356001600160401b038082111561422257600080fd5b61422e8b838c0161400a565b909650945060808a013591508082111561424757600080fd5b6142538b838c01614148565b935060a08a013591508082111561426957600080fd5b506142768a828b01614148565b91505092959891949750929550565b6020808252825182820181905260009190848201906040850190845b818110156142bd578351835292840192918401916001016142a1565b50909695505050505050565b600080604083850312156142dc57600080fd5b6142e583613f6d565b915060208301356001600160401b0381111561430057600080fd5b61430c85828601614148565b9150509250929050565b60006020828403121561432857600080fd5b81356001600160401b0381111561433e57600080fd5b61142384828501614148565b60008060006040848603121561435f57600080fd5b83356001600160401b0381111561437557600080fd5b6143818682870161400a565b909790965060209590950135949350505050565b801515811461126a57600080fd5b600080604083850312156143b657600080fd5b6143bf83613f6d565b915060208301356143cf81614395565b809150509250929050565b600080600080608085870312156143f057600080fd5b6143f985613f6d565b935061440760208601613f6d565b92506040850135915060608501356001600160401b0381111561442957600080fd5b61443587828801614148565b91505092959194509250565b60008060008060006080868803121561445957600080fd5b85356001600160401b038082111561447057600080fd5b61447c89838a0161400a565b9097509550602088013594506040880135935060608801359150808211156144a357600080fd5b506144b088828901614148565b9150509295509295909350565b600080600080606085870312156144d357600080fd5b84356001600160401b03808211156144ea57600080fd5b6144f68883890161400a565b909650945060208701359350604087013591508082111561451657600080fd5b5061443587828801614148565b6000806020838503121561453657600080fd5b82356001600160401b0381111561454c57600080fd5b6145588582860161400a565b90969095509350505050565b6000806040838503121561457757600080fd5b61458083613f6d565b915061412960208401613f6d565b600181811c908216806145a257607f821691505b6020821081036145c257634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b6000828210156145f0576145f06145c8565b500390565b60008219821115614608576146086145c8565b500190565b8183823760009101908152919050565b60208082526029908201527f546f6b656e496473206c656e677468206d7573742062652067726561746572206040820152687468616e207a65726f60b81b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b6020808252602f908201527f43616c6c6572206d757374206265206f776e6572206f6620746f6b656e206f7260408201526e1031b7b73a3930b1ba1037bbb732b960891b606082015260800190565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60808152600061470860808301888a6146cb565b82810360208401528581526001600160fb1b0386111561472757600080fd5b8560051b80886020840137600091016020019081526001600160a01b039490941660408301525060600152949350505050565b6000816000190483118215151615614774576147746145c8565b500290565b60008261479657634e487b7160e01b600052601260045260246000fd5b500490565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b60018060a01b038716815285602082015284604082015260a06060820152600061486160a0830185876146cb565b82810360808401526148738185613f15565b9998505050505050505050565b600060018201614892576148926145c8565b5060010190565b602080825260129082015271496e76616c69642053616c6520537461746560701b604082015260600190565b6020808252601d908201527f4d7573742066726f6d207265616c2077616c6c65742061646472657373000000604082015260600190565b602080825260169082015275139bdd08185d5d1a1bdc9a5e9959081d1bc81b5a5b9d60521b604082015260600190565b60a08152600061494060a0830187896146cb565b82810360208085019190915260088252671adadddb135a5b9d60c21b908201526001600160a01b0395909516604080840191909152606083019490945250608001520192915050565b6000835161499b818460208801613ee9565b8351908301906149af818360208801613ee9565b01949350505050565b60a0815260006149cc60a0830187896146cb565b82810360208085019190915260088252671adad859135a5b9d60c21b908201526001600160a01b0395909516604080840191909152606083019490945250608001520192915050565b60a081526000614a2960a0830187896146cb565b82810360208085019190915260088252671adadb1b135a5b9d60c21b908201526001600160a01b0395909516604080840191909152606083019490945250608001520192915050565b600060208284031215614a8457600080fd5b8151611fad81614395565b6020808252602d908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526c1c881bdc88185c1c1c9bdd9959609a1b606082015260800190565b600060208284031215614aee57600080fd5b5051919050565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b60208082526025908201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060408201526437bbb732b960d91b606082015260800190565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351614bbd816017850160208801613ee9565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351614bee816028840160208801613ee9565b01602801949350505050565b634e487b7160e01b600052602160045260246000fd5b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b600081614c7157614c716145c8565b506000190190565b60008251614c8b818460208701613ee9565b9190910192915050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090614cc890830184613f15565b9695505050505050565b600060208284031215614ce457600080fd5b8151611fad81613eb656fe68747470733a2f2f6d657461646174612e6d61747231782e696f2f6d657461646174612f6b756b752f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c65649f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6a2646970667358221220c4bc79cc739d2185bd07c4084dc9cb568556115f64eceec233697271814ff5eb64736f6c634300080d0033
Deployed Bytecode Sourcemap
121030:14317:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;135107:235;;;;;;;;;;-1:-1:-1;135107:235:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;135107:235:0;;;;;;;;89813:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;91336:171::-;;;;;;;;;;-1:-1:-1;91336:171:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1692:32:1;;;1674:51;;1662:2;1647:18;91336:171:0;1528:203:1;133664:157:0;;;;;;;;;;-1:-1:-1;133664:157:0;;;;;:::i;:::-;;:::i;:::-;;134657:145;;;;;;;;;;;;;:::i;:::-;;;2319:25:1;;;2307:2;2292:18;134657:145:0;2173:177:1;133829:163:0;;;;;;;;;;-1:-1:-1;133829:163:0;;;;;:::i;:::-;;:::i;82967:131::-;;;;;;;;;;-1:-1:-1;82967:131:0;;;;;:::i;:::-;83041:7;83068:12;;;:6;:12;;;;;:22;;;;82967:131;132293:148;;;;;;;;;;;;;:::i;:::-;;;;3257:25:1;;;3313:2;3298:18;;3291:34;;;;3341:18;;;3334:34;3245:2;3230:18;132293:148:0;3055:319:1;122952:40:0;;;;;;;;;;-1:-1:-1;122952:40:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;129397:910;;;;;;;;;;-1:-1:-1;129397:910:0;;;;;:::i;:::-;;:::i;58962:442::-;;;;;;;;;;-1:-1:-1;58962:442:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;5277:32:1;;;5259:51;;5341:2;5326:18;;5319:34;;;;5232:18;58962:442:0;5085:274:1;83408:147:0;;;;;;;;;;-1:-1:-1;83408:147:0;;;;;:::i;:::-;;:::i;130356:937::-;;;;;;;;;;-1:-1:-1;130356:937:0;;;;;:::i;:::-;;:::i;84552:218::-;;;;;;;;;;-1:-1:-1;84552:218:0;;;;;:::i;:::-;;:::i;54023:200::-;;;;;;;;;;-1:-1:-1;54023:200:0;;;;;:::i;:::-;;:::i;133011:351::-;;;;;;;;;;-1:-1:-1;133011:351:0;;;;;:::i;:::-;;:::i;134000:171::-;;;;;;;;;;-1:-1:-1;134000:171:0;;;;;:::i;:::-;;:::i;124475:235::-;;;;;;;;;;-1:-1:-1;124475:235:0;;;;;:::i;:::-;;:::i;131458:419::-;;;;;;;;;;-1:-1:-1;131458:419:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;54482:225::-;;;;;;:::i;:::-;;:::i;53701:133::-;;;;;;;;;;;;;:::i;124305:162::-;;;;;;;;;;-1:-1:-1;124305:162:0;;;;;:::i;:::-;;:::i;89523:223::-;;;;;;;;;;-1:-1:-1;89523:223:0;;;;;:::i;:::-;;:::i;129092:144::-;;;;;;;;;;-1:-1:-1;129092:144:0;;;;;:::i;:::-;;:::i;131301:149::-;;;;;;;;;;-1:-1:-1;131301:149:0;;;;;:::i;:::-;;:::i;129244:106::-;;;;;;;;;;-1:-1:-1;129244:106:0;;;;;:::i;:::-;;:::i;89254:207::-;;;;;;;;;;-1:-1:-1;89254:207:0;;;;;:::i;:::-;;:::i;123327:758::-;;;;;;;;;;;;;:::i;132578:237::-;;;;;;;;;;;;;:::i;132157:128::-;;;;;;;;;;-1:-1:-1;132157:128:0;;;;;:::i;:::-;;:::i;134448:106::-;;;;;;;;;;-1:-1:-1;134448:106:0;;;;;:::i;:::-;;:::i;134562:87::-;;;;;;;;;;-1:-1:-1;134635:6:0;;-1:-1:-1;;;;;134635:6:0;134562:87;;81446:147;;;;;;;;;;-1:-1:-1;81446:147:0;;;;;:::i;:::-;;:::i;89982:104::-;;;;;;;;;;;;;:::i;80540:49::-;;;;;;;;;;-1:-1:-1;80540:49:0;80585:4;80540:49;;133480:176;;;;;;;;;;-1:-1:-1;133480:176:0;;;;;:::i;:::-;;:::i;132028:119::-;;;;;;;;;;-1:-1:-1;132028:119:0;;;;;:::i;:::-;132092:7;132118:21;;;:11;:21;;;;;;;132028:119;134179:216;;;;;;;;;;-1:-1:-1;134179:216:0;;;;;:::i;:::-;;:::i;126622:1473::-;;;;;;:::i;:::-;;:::i;121800:23::-;;;;;;;;;;;;;;;;121879:20;;;;;;;;;;;;;;;;90157:281;;;;;;;;;;-1:-1:-1;90157:281:0;;;;;:::i;:::-;;:::i;132451:119::-;;;;;;;;;;-1:-1:-1;132451:119:0;;;;;:::i;:::-;;:::i;125837:737::-;;;;;;;;;;-1:-1:-1;125837:737:0;;;;;:::i;:::-;;:::i;125370:420::-;;;;;;;;;;-1:-1:-1;125370:420:0;;;;;:::i;:::-;;:::i;121238:62::-;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;121238:62:0;;83848:149;;;;;;;;;;-1:-1:-1;83848:149:0;;;;;:::i;:::-;;:::i;131885:135::-;;;;;;;;;;-1:-1:-1;131885:135:0;;;;;:::i;:::-;;:::i;91805:164::-;;;;;;;;;;-1:-1:-1;91805:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;91926:25:0;;;91902:4;91926:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;91805:164;121766:25;;;;;;;;;;-1:-1:-1;121766:25:0;;;;-1:-1:-1;;;;;121766:25:0;;;121307:66;;;;;;;;;;;;121347:26;121307:66;;128143:809;;;;;;:::i;:::-;;:::i;135107:235::-;135269:4;135298:36;135322:11;135298:23;:36::i;:::-;135291:43;135107:235;-1:-1:-1;;135107:235:0:o;89813:100::-;89867:13;89900:5;89893:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;89813:100;:::o;91336:171::-;91412:7;91432:23;91447:7;91432:14;:23::i;:::-;-1:-1:-1;91475:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;91475:24:0;;91336:171::o;133664:157::-;133760:8;41285:30;41306:8;41285:20;:30::i;:::-;133781:32:::1;133795:8;133805:7;133781:13;:32::i;:::-;133664:157:::0;;;:::o;134657:145::-;134709:7;134782:12;;134778:1;134762:13;;134755:4;134751:1;134736:12;;:16;;;;:::i;:::-;:23;;;;:::i;:::-;:39;;;;:::i;:::-;:43;;;;:::i;:::-;:58;;;;:::i;:::-;134729:65;;134657:145;:::o;133829:163::-;133930:4;-1:-1:-1;;;;;41010:18:0;;41018:10;41010:18;41006:83;;41045:32;41066:10;41045:20;:32::i;:::-;133947:37:::1;133966:4;133972:2;133976:7;133947:18;:37::i;:::-;133829:163:::0;;;;:::o;132293:148::-;132338:7;132347;132356;132383:14;;132399:15;;132431:1;132416:12;;:16;;;;:::i;:::-;132375:58;;;;;;132293:148;;;:::o;129397:910::-;129495:15;129511:8;;129495:25;;;;;;;:::i;:::-;;;;;;;;;;;;;;129524:1;129495:30;129487:57;;;;-1:-1:-1;;;129487:57:0;;14039:2:1;129487:57:0;;;14021:21:1;14078:2;14058:18;;;14051:30;-1:-1:-1;;;14097:18:1;;;14090:44;14151:18;;129487:57:0;;;;;;;;;129563:20;129555:74;;;;-1:-1:-1;;;129555:74:0;;;;;;;:::i;:::-;129668:2;129648:22;;;129640:53;;;;-1:-1:-1;;;129640:53:0;;14792:2:1;129640:53:0;;;14774:21:1;14831:2;14811:18;;;14804:30;-1:-1:-1;;;14850:18:1;;;14843:48;14908:18;;129640:53:0;14590:342:1;129640:53:0;129709:9;129704:526;129724:20;;;129704:526;;;129762:16;129781:9;;129791:1;129781:12;;;;;;;:::i;:::-;;;;;;;129762:31;;129830:17;129838:8;129830:7;:17::i;:::-;-1:-1:-1;;;;;129816:31:0;:10;-1:-1:-1;;;;;129816:31:0;;:67;;;;129851:32;-1:-1:-1;;;;;;;;;;;129872:10:0;129851:7;:32::i;:::-;129808:144;;;;-1:-1:-1;;;129808:144:0;;;;;;;:::i;:::-;129975:15;129991:8;;129975:25;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;:35;;;;;;;;;:40;129967:90;;;;-1:-1:-1;;;129967:90:0;;15687:2:1;129967:90:0;;;15669:21:1;15726:2;15706:18;;;15699:30;15765:34;15745:18;;;15738:62;-1:-1:-1;;;15816:18:1;;;15809:35;15861:19;;129967:90:0;15485:401:1;129967:90:0;130110:1;130072:15;130088:8;;130072:25;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;:35;;;;;;;;;:39;;;;130155:11;:21;;;;:26;;130180:1;130155:26;;;;;;130200:3;129704:526;;;;130245:54;130250:8;;130260:9;;130271:10;130283:15;130245:54;;;;;;;;;;;:::i;:::-;;;;;;;;129397:910;;;;:::o;58962:442::-;59059:7;59117:27;;;:17;:27;;;;;;;;59088:56;;;;;;;;;-1:-1:-1;;;;;59088:56:0;;;;;-1:-1:-1;;;59088:56:0;;;-1:-1:-1;;;;;59088:56:0;;;;;;;;59059:7;;59157:92;;-1:-1:-1;59208:29:0;;;;;;;;;59218:19;59208:29;-1:-1:-1;;;;;59208:29:0;;;;-1:-1:-1;;;59208:29:0;;-1:-1:-1;;;;;59208:29:0;;;;;59157:92;59299:23;;;;59261:21;;59770:5;;59286:36;;-1:-1:-1;;;;;59286:36:0;:10;:36;:::i;:::-;59285:58;;;;:::i;:::-;59364:16;;;-1:-1:-1;59261:82:0;;-1:-1:-1;;58962:442:0;;;;;;:::o;83408:147::-;83041:7;83068:12;;;:6;:12;;;;;:22;;;81031:16;81042:4;81031:10;:16::i;:::-;83522:25:::1;83533:4;83539:7;83522:10;:25::i;130356:937::-:0;130456:20;130448:74;;;;-1:-1:-1;;;130448:74:0;;;;;;;:::i;:::-;130561:2;130541:22;;;130533:53;;;;-1:-1:-1;;;130533:53:0;;14792:2:1;130533:53:0;;;14774:21:1;14831:2;14811:18;;;14804:30;-1:-1:-1;;;14850:18:1;;;14843:48;14908:18;;130533:53:0;14590:342:1;130533:53:0;130602:9;130597:617;130617:20;;;130597:617;;;130655:16;130674:9;;130684:1;130674:12;;;;;;;:::i;:::-;;;;;;;130655:31;;130723:17;130731:8;130723:7;:17::i;:::-;-1:-1:-1;;;;;130709:31:0;:10;-1:-1:-1;;;;;130709:31:0;;:67;;;;130744:32;-1:-1:-1;;;;;;;;;;;130765:10:0;130744:7;:32::i;:::-;130709:91;;;-1:-1:-1;130789:10:0;130780:20;;;;:8;:20;;;;;;;;130709:91;130701:168;;;;-1:-1:-1;;;130701:168:0;;;;;;;:::i;:::-;130892:15;130908:8;;130892:25;;;;;;;:::i;:::-;;;;;;;;;;;;;:35;130918:8;130892:35;;;;;;;;;;;;130931:1;130892:40;130884:86;;;;-1:-1:-1;;;130884:86:0;;17737:2:1;130884:86:0;;;17719:21:1;17776:2;17756:18;;;17749:30;17815:34;17795:18;;;17788:62;-1:-1:-1;;;17866:18:1;;;17859:31;17907:19;;130884:86:0;17535:397:1;130884:86:0;131023:1;130985:15;131001:8;;130985:25;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;:35;;;;;;;;;;:39;;;;131047:11;:21;;;;;;131072:1;-1:-1:-1;131047:26:0;131039:56;;;;-1:-1:-1;;;131039:56:0;;18139:2:1;131039:56:0;;;18121:21:1;18178:2;18158:18;;;18151:30;-1:-1:-1;;;18197:18:1;;;18190:47;18254:18;;131039:56:0;17937:341:1;131039:56:0;131139:21;;;;:11;:21;;;;;:26;;-1:-1:-1;;131139:26:0;;;131164:1;131184:3;130597:617;;;;131229:56;131236:8;;131246:9;;131257:10;131269:15;131229:56;;;;;;;;;;;:::i;84552:218::-;-1:-1:-1;;;;;84648:23:0;;62713:10;84648:23;84640:83;;;;-1:-1:-1;;;84640:83:0;;18485:2:1;84640:83:0;;;18467:21:1;18524:2;18504:18;;;18497:30;18563:34;18543:18;;;18536:62;-1:-1:-1;;;18614:18:1;;;18607:45;18669:19;;84640:83:0;18283:411:1;84640:83:0;84736:26;84748:4;84754:7;84736:11;:26::i;:::-;84552:218;;:::o;54023:200::-;-1:-1:-1;;;;;52571:6:0;52554:23;52562:4;52554:23;52546:80;;;;-1:-1:-1;;;52546:80:0;;;;;;;:::i;:::-;52669:6;-1:-1:-1;;;;;52645:30:0;:20;-1:-1:-1;;;;;;;;;;;44358:65:0;-1:-1:-1;;;;;44358:65:0;;44278:153;52645:20;-1:-1:-1;;;;;52645:30:0;;52637:87;;;;-1:-1:-1;;;52637:87:0;;;;;;;:::i;:::-;54107:36:::1;54125:17;54107;:36::i;:::-;54195:12;::::0;;54205:1:::1;54195:12:::0;;;::::1;::::0;::::1;::::0;;;54154:61:::1;::::0;54176:17;;54195:12;54154:21:::1;:61::i;:::-;54023:200:::0;:::o;133011:351::-;133207:7;133239:115;133285:7;133294:11;133307:12;133321:11;;133334:5;133274:66;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;133264:77;;;;;;133343:10;133239:24;:115::i;:::-;133232:122;133011:351;-1:-1:-1;;;;;;;;133011:351:0:o;134000:171::-;134105:4;-1:-1:-1;;;;;41010:18:0;;41018:10;41010:18;41006:83;;41045:32;41066:10;41045:20;:32::i;:::-;134122:41:::1;134145:4;134151:2;134155:7;134122:22;:41::i;124475:235::-:0;124546:41;62713:10;124565:12;124579:7;124546:18;:41::i;:::-;124524:128;;;;-1:-1:-1;;;124524:128:0;;20384:2:1;124524:128:0;;;20366:21:1;20423:2;20403:18;;;20396:30;20462:34;20442:18;;;20435:62;-1:-1:-1;;;20513:18:1;;;20506:35;20558:19;;124524:128:0;20182:401:1;124524:128:0;124665:12;;124663:14;;;;;:::i;:::-;;;;-1:-1:-1;124688:14:0;124694:7;124688:5;:14::i;131458:419::-;131564:16;131592:24;131633:9;-1:-1:-1;;;;;131619:31:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;131619:31:0;;131592:58;;131666:9;131661:184;131681:20;;;131661:184;;;131732:15;131748:8;;131732:25;;;;;;;:::i;:::-;;;;;;;;;;;;;:39;131758:9;;131768:1;131758:12;;;;;;;:::i;:::-;;;;;;;131732:39;;;;;;;;;;;;131719:7;131727:1;131719:10;;;;;;;;:::i;:::-;;;;;;;;;;:52;131815:3;;131661:184;;;-1:-1:-1;131862:7:0;-1:-1:-1;131458:419:0;;;;;;;:::o;54482:225::-;-1:-1:-1;;;;;52571:6:0;52554:23;52562:4;52554:23;52546:80;;;;-1:-1:-1;;;52546:80:0;;;;;;;:::i;:::-;52669:6;-1:-1:-1;;;;;52645:30:0;:20;-1:-1:-1;;;;;;;;;;;44358:65:0;-1:-1:-1;;;;;44358:65:0;;44278:153;52645:20;-1:-1:-1;;;;;52645:30:0;;52637:87;;;;-1:-1:-1;;;52637:87:0;;;;;;;:::i;:::-;54600:36:::1;54618:17;54600;:36::i;:::-;54647:52;54669:17;54688:4;54694;54647:21;:52::i;53701:133::-:0;53779:7;53007:4;-1:-1:-1;;;;;53016:6:0;52999:23;;52991:92;;;;-1:-1:-1;;;52991:92:0;;20930:2:1;52991:92:0;;;20912:21:1;20969:2;20949:18;;;20942:30;21008:34;20988:18;;;20981:62;21079:26;21059:18;;;21052:54;21123:19;;52991:92:0;20728:420:1;52991:92:0;-1:-1:-1;;;;;;;;;;;;53701:133:0;:::o;124305:162::-;-1:-1:-1;;;;;;;;;;;81031:16:0;81042:4;81031:10;:16::i;:::-;124416:1:::1;124401:4;124395:18;:22;124387:49;;;::::0;-1:-1:-1;;;124387:49:0;;21355:2:1;124387:49:0::1;::::0;::::1;21337:21:1::0;21394:2;21374:18;;;21367:30;-1:-1:-1;;;21413:18:1;;;21406:44;21467:18;;124387:49:0::1;21153:338:1::0;124387:49:0::1;124447:12:::0;;::::1;::::0;:5:::1;::::0;:12:::1;::::0;::::1;::::0;::::1;:::i;89523:223::-:0;89595:7;94421:16;;;:7;:16;;;;;;-1:-1:-1;;;;;94421:16:0;;89659:56;;;;-1:-1:-1;;;89659:56:0;;21698:2:1;89659:56:0;;;21680:21:1;21737:2;21717:18;;;21710:30;-1:-1:-1;;;21756:18:1;;;21749:54;21820:18;;89659:56:0;21496:348:1;129092:144:0;-1:-1:-1;;;;;;;;;;;81031:16:0;81042:4;81031:10;:16::i;:::-;129170:5:::1;:15:::0;;;129201:27:::1;::::0;2319:25:1;;;129201:27:0::1;::::0;2307:2:1;2292:18;129201:27:0::1;;;;;;;129092:144:::0;;:::o;131301:149::-;-1:-1:-1;;;;;;;;;;;81031:16:0;81042:4;81031:10;:16::i;:::-;131436:6:::1;131408:15;131424:8;;131408:25;;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;:34;-1:-1:-1;;;;131301:149:0:o;129244:106::-;-1:-1:-1;;;;;;;;;;;81031:16:0;81042:4;81031:10;:16::i;:::-;-1:-1:-1;129322:10:0::1;:20:::0;;-1:-1:-1;;;;;;129322:20:0::1;-1:-1:-1::0;;;;;129322:20:0;;;::::1;::::0;;;::::1;::::0;;129244:106::o;89254:207::-;89326:7;-1:-1:-1;;;;;89354:19:0;;89346:73;;;;-1:-1:-1;;;89346:73:0;;22051:2:1;89346:73:0;;;22033:21:1;22090:2;22070:18;;;22063:30;22129:34;22109:18;;;22102:62;-1:-1:-1;;;22180:18:1;;;22173:39;22229:19;;89346:73:0;21849:405:1;89346:73:0;-1:-1:-1;;;;;;89437:16:0;;;;;:9;:16;;;;;;;89254:207::o;123327:758::-;34986:19;35009:13;;;;;;35008:14;;35056:34;;;;-1:-1:-1;35074:12:0;;35089:1;35074:12;;;;:16;35056:34;35055:108;;;-1:-1:-1;35135:4:0;24647:19;:23;;;35096:66;;-1:-1:-1;35145:12:0;;;;;:17;35096:66;35033:204;;;;-1:-1:-1;;;35033:204:0;;22461:2:1;35033:204:0;;;22443:21:1;22500:2;22480:18;;;22473:30;22539:34;22519:18;;;22512:62;-1:-1:-1;;;22590:18:1;;;22583:44;22644:19;;35033:204:0;22259:410:1;35033:204:0;35248:12;:16;;-1:-1:-1;;35248:16:0;35263:1;35248:16;;;35275:67;;;;35310:13;:20;;-1:-1:-1;;35310:20:0;;;;;35275:67;123379:36:::1;;;;;;;;;;;;;;-1:-1:-1::0;;;123379:36:0::1;;::::0;::::1;;;;;;;;;;;;;-1:-1:-1::0;;;123379:36:0::1;;::::0;:13:::1;:36::i;:::-;123426:22;:20;:22::i;:::-;123459:16;:14;:16::i;:::-;123486:32;:30;:32::i;:::-;123529:24;:22;:24::i;:::-;123581:1;123566:12;:16:::0;;;123593:5:::1;:9:::0;123624:11:::1;123613:8;:22:::0;-1:-1:-1;123646:13:0::1;:17:::0;123689:4:::1;123674:12;:19:::0;123704:51:::1;::::0;;::::1;::::0;::::1;::::0;;;::::1;::::0;;;::::1;;::::0;::::1;;::::0;;::::1;::::0;:5:::1;::::0;:51:::1;::::0;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;123768:11:0::1;:56:::0;;-1:-1:-1;;;;;;123768:56:0;;::::1;123782:42;123768:56;::::0;;;123835:10:::1;:55:::0;;;;::::1;123848:42;123835:55;::::0;;123912:12:::1;62713:10:::0;;62633:98;123912:12:::1;123903:6;:21:::0;;-1:-1:-1;;;;;;123903:21:0::1;-1:-1:-1::0;;;;;123903:21:0;;;::::1;::::0;;;::::1;::::0;;123935:44:::1;-1:-1:-1::0;62713:10:0;123935::::1;:44::i;:::-;123990:37;-1:-1:-1::0;;;;;;;;;;;62713:10:0;123935::::1;:44::i;123990:37::-;124038:39;121347:26;62713:10:::0;123935::::1;:44::i;124038:39::-;35368:14:::0;35364:102;;;35415:5;35399:21;;-1:-1:-1;;35399:21:0;;;35440:14;;-1:-1:-1;22826:36:1;;35440:14:0;;22814:2:1;22799:18;35440:14:0;;;;;;;34975:498;123327:758::o;132578:237::-;-1:-1:-1;;;;;;;;;;;81031:16:0;81042:4;81031:10;:16::i;:::-;132659:21:::1;132699:11:::0;132691:57:::1;;;::::0;-1:-1:-1;;;132691:57:0;;23075:2:1;132691:57:0::1;::::0;::::1;23057:21:1::0;23114:2;23094:18;;;23087:30;23153:34;23133:18;;;23126:62;-1:-1:-1;;;23204:18:1;;;23197:31;23245:19;;132691:57:0::1;22873:397:1::0;132691:57:0::1;132772:11;::::0;132761:46:::1;::::0;-1:-1:-1;;;;;132772:11:0::1;132785:21;132761:10;:46::i;132157:128::-:0;-1:-1:-1;;;;;;;;;;;81031:16:0;81042:4;81031:10;:16::i;:::-;-1:-1:-1;;;;;;132250:18:0;;;::::1;;::::0;;;:8:::1;:18;::::0;;;;:27;;-1:-1:-1;;132250:27:0::1;::::0;::::1;;::::0;;;::::1;::::0;;132157:128::o;134448:106::-;-1:-1:-1;;;;;;;;;;;81031:16:0;81042:4;81031:10;:16::i;:::-;-1:-1:-1;134529:6:0::1;:17:::0;;-1:-1:-1;;;;;;134529:17:0::1;-1:-1:-1::0;;;;;134529:17:0;;;::::1;::::0;;;::::1;::::0;;134448:106::o;81446:147::-;81532:4;81556:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;81556:29:0;;;;;;;;;;;;;;;81446:147::o;89982:104::-;90038:13;90071:7;90064:14;;;;;:::i;133480:176::-;133584:8;41285:30;41306:8;41285:20;:30::i;:::-;133605:43:::1;133629:8;133639;133605:23;:43::i;134179:216::-:0;134318:4;-1:-1:-1;;;;;41010:18:0;;41018:10;41010:18;41006:83;;41045:32;41066:10;41045:20;:32::i;:::-;134340:47:::1;134363:4;134369:2;134373:7;134382:4;134340:22;:47::i;:::-;134179:216:::0;;;;;:::o;126622:1473::-;124775:5;;126768:1;;124775:19;;124767:50;;;;-1:-1:-1;;;124767:50:0;;;;;;;:::i;:::-;124887:9:::1;124900:10;124887:23;124879:65;;;;-1:-1:-1::0;;;124879:65:0::1;;;;;;;:::i;:::-;126822:1:::2;126812:7;:11;:31;;;;;126842:1;126827:12;:16;126812:31;126804:80;;;::::0;-1:-1:-1;;;126804:80:0;;24182:2:1;126804:80:0::2;::::0;::::2;24164:21:1::0;24221:2;24201:18;;;24194:30;24260:34;24240:18;;;24233:62;-1:-1:-1;;;24311:18:1;;;24304:34;24355:19;;126804:80:0::2;23980:400:1::0;126804:80:0::2;126897:20;126920:81;62713:10:::0;126950:7:::2;126959:12;126973:3;;126920:81;;;;;;;;;;;;;-1:-1:-1::0;;;126920:81:0::2;;::::0;126990:10:::2;126920:15;:81::i;:::-;127066:10;::::0;126897:104;;-1:-1:-1;;;;;;127050:26:0;;::::2;127066:10:::0;::::2;127050:26;127042:61;;;;-1:-1:-1::0;;;127042:61:0::2;;;;;;;:::i;:::-;127120:12;127133:3;;127120:17;;;;;;;:::i;:::-;;;;;;;;;;;;;;127141:1;127120:22:::0;127116:87:::2;;127179:12;127159;127172:3;;127159:17;;;;;;;:::i;:::-;::::0;;;::::2;::::0;;;;;::::2;::::0;;;:32;127116:87:::2;127215:12;127250:13;127264:3;;127250:18;;;;;;;:::i;:::-;;;;;;;;;;;;;;127230:12;127243:3;;127230:17;;;;;;;:::i;:::-;;;;;;;;;;;;;;:38;;;;:::i;:::-;127215:53;;127294:1;127287:4;:8;127279:53;;;::::0;-1:-1:-1;;;127279:53:0;;24938:2:1;127279:53:0::2;::::0;::::2;24920:21:1::0;;;24957:18;;;24950:30;25016:34;24996:18;;;24989:62;25068:18;;127279:53:0::2;24736:356:1::0;127279:53:0::2;127356:7;127349:4;:14;127345:61;;;-1:-1:-1::0;127387:7:0;127345:61:::2;127442:15;:23:::0;;;::::2;::::0;;;;121531:4:::2;-1:-1:-1::0;127495:35:0::2;127487:79;;;::::0;-1:-1:-1;;;127487:79:0;;25299:2:1;127487:79:0::2;::::0;::::2;25281:21:1::0;25338:2;25318:18;;;25311:30;25377:33;25357:18;;;25350:61;25428:18;;127487:79:0::2;25097:355:1::0;127487:79:0::2;127625:4;127603:13;127617:3;;127603:18;;;;;;;:::i;:::-;::::0;;;::::2;::::0;;;;;::::2;::::0;;;:26;;;;::::2;::::0;;127682:8:::2;::::0;127603:18:::2;::::0;127676:21:::2;::::0;127692:4;127676:5:::2;:21::i;:::-;127653:44;;127729:12;127716:9;:25;;127708:55;;;::::0;-1:-1:-1;;;127708:55:0;;25659:2:1;127708:55:0::2;::::0;::::2;25641:21:1::0;25698:2;25678:18;;;25671:30;-1:-1:-1;;;25717:18:1;;;25710:47;25774:18;;127708:55:0::2;25457:341:1::0;127708:55:0::2;127836:9;:24:::0;;::::2;::::0;127888:11;;127884:81:::2;;127916:37;::::0;127924:10:::2;::::0;127916:37;::::2;;;::::0;127945:7;;127916:37:::2;::::0;;;127945:7;127924:10;127916:37;::::2;;;;;;;;;;;;;::::0;::::2;;;;;;127884:81;127977:30;62713:10:::0;128002:4:::2;127977:10;:30::i;:::-;128025:62;128034:3:::0;;62713:10;128065:4:::2;128071:15;128025:62;;;;;;;;;;:::i;:::-;;;;;;;;126793:1302;;;;126622:1473:::0;;;;;;:::o;90157:281::-;90230:13;90256:23;90271:7;90256:14;:23::i;:::-;90292:21;90316:10;:8;:10::i;:::-;90292:34;;90368:1;90350:7;90344:21;:25;:86;;;;;;;;;;;;;;;;;90396:7;90405:18;:7;:16;:18::i;:::-;90379:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;90344:86;90337:93;90157:281;-1:-1:-1;;;90157:281:0:o;132451:119::-;-1:-1:-1;;;;;;;;;;;81031:16:0;81042:4;81031:10;:16::i;:::-;-1:-1:-1;132540:11:0::1;:22:::0;;-1:-1:-1;;;;;;132540:22:0::1;-1:-1:-1::0;;;;;132540:22:0;;;::::1;::::0;;;::::1;::::0;;132451:119::o;125837:737::-;124775:5;;125946:1;;124775:19;;124767:50;;;;-1:-1:-1;;;124767:50:0;;;;;;;:::i;:::-;124887:9:::1;124900:10;124887:23;124879:65;;;;-1:-1:-1::0;;;124879:65:0::1;;;;;;;:::i;:::-;125982:20:::2;126005:76;62713:10:::0;126035:7:::2;126044;126053:3;;126005:76;;;;;;;;;;;;;-1:-1:-1::0;;;126005:76:0::2;;::::0;126070:10:::2;126005:15;:76::i;:::-;126146:10;::::0;125982:99;;-1:-1:-1;;;;;;126130:26:0;;::::2;126146:10:::0;::::2;126130:26;126122:61;;;;-1:-1:-1::0;;;126122:61:0::2;;;;;;;:::i;:::-;126202:9;126212:3;;126202:14;;;;;;;:::i;:::-;;;;;;;;;;;;;;126220:1;126202:19;126194:48;;;::::0;-1:-1:-1;;;126194:48:0;;27242:2:1;126194:48:0::2;::::0;::::2;27224:21:1::0;27281:2;27261:18;;;27254:30;-1:-1:-1;;;27300:18:1;;;27293:46;27356:18;;126194:48:0::2;27040:340:1::0;126194:48:0::2;126279:14;:25:::0;;;::::2;::::0;;;;121477:3:::2;-1:-1:-1::0;126334:33:0::2;126326:80;;;::::0;-1:-1:-1;;;126326:80:0;;27587:2:1;126326:80:0::2;::::0;::::2;27569:21:1::0;27626:2;27606:18;;;27599:30;27665:34;27645:18;;;27638:62;-1:-1:-1;;;27716:18:1;;;27709:32;27758:19;;126326:80:0::2;27385:398:1::0;126326:80:0::2;126436:1;126419:9;126429:3;;126419:14;;;;;;;:::i;:::-;::::0;;;::::2;::::0;;;;;::::2;::::0;;;:18;126450:33:::2;126461:12;62713:10:::0;;62633:98;126461:12:::2;126475:7;126450:10;:33::i;:::-;126501:65;126510:3:::0;;62713:10;126541:7:::2;126550:15;126501:65;;;;;;;;;;:::i;:::-;;;;;;;;125971:603;125837:737:::0;;;;;:::o;125370:420::-;-1:-1:-1;;;;;;;;;;;81031:16:0;81042:4;81031:10;:16::i;:::-;125472:13:::1;::::0;121423:4:::1;125518:3:::0;125504:11:::1;125514:1;125472:13:::0;125504:11:::1;:::i;:::-;:17;;;;:::i;:::-;:34;;125496:77;;;::::0;-1:-1:-1;;;125496:77:0;;28752:2:1;125496:77:0::1;::::0;::::1;28734:21:1::0;28791:2;28771:18;;;28764:30;28830:32;28810:18;;;28803:60;28880:18;;125496:77:0::1;28550:354:1::0;125496:77:0::1;125589:9;125584:165;125608:3;125604:1;:7;125584:165;;;125629:18;125635:2;125639:7;125629:5;:18::i;:::-;125691:3;125713:9:::0;;::::1;::::0;125691:3:::1;125584:165;;;-1:-1:-1::0;125759:13:0::1;:23:::0;-1:-1:-1;;;125370:420:0:o;83848:149::-;83041:7;83068:12;;;:6;:12;;;;;:22;;;81031:16;81042:4;81031:10;:16::i;:::-;83963:26:::1;83975:4;83981:7;83963:11;:26::i;131885:135::-:0;131961:7;131987:15;132003:8;;131987:25;;;;;;;:::i;:::-;;;;;;;;;;;;;;131980:32;;131885:135;;;;:::o;128143:809::-;124775:5;;128267:1;;124775:19;;124767:50;;;;-1:-1:-1;;;124767:50:0;;;;;;;:::i;:::-;124887:9:::1;124900:10;124887:23;124879:65;;;;-1:-1:-1::0;;;124879:65:0::1;;;;;;;:::i;:::-;128303:20:::2;128326:76;62713:10:::0;128356:7:::2;128365;128374:3;;128326:76;;;;;;;;;;;;;-1:-1:-1::0;;;128326:76:0::2;;::::0;128391:10:::2;128326:15;:76::i;:::-;128467:10;::::0;128303:99;;-1:-1:-1;;;;;;128451:26:0;;::::2;128467:10:::0;::::2;128451:26;128443:61;;;;-1:-1:-1::0;;;128443:61:0::2;;;;;;;:::i;:::-;121582:4;128542:7;128538:1;128523:12;;:16;;;;:::i;:::-;:26;;;;:::i;:::-;:42;;128515:86;;;::::0;-1:-1:-1;;;128515:86:0;;29111:2:1;128515:86:0::2;::::0;::::2;29093:21:1::0;29150:2;29130:18;;;29123:30;29189:33;29169:18;;;29162:61;29240:18;;128515:86:0::2;28909:355:1::0;128515:86:0::2;128620:9;128630:3;;128620:14;;;;;;;:::i;:::-;;;;;;;;;;;;;;128638:1;128620:19;128612:48;;;::::0;-1:-1:-1;;;128612:48:0;;27242:2:1;128612:48:0::2;::::0;::::2;27224:21:1::0;27281:2;27261:18;;;27254:30;-1:-1:-1;;;27300:18:1;;;27293:46;27356:18;;128612:48:0::2;27040:340:1::0;128612:48:0::2;128673:20;128696:24;128702:8;;128712:7;128696:5;:24::i;:::-;128673:47;;128752:12;128739:9;:25;;128731:55;;;::::0;-1:-1:-1;;;128731:55:0;;25659:2:1;128731:55:0::2;::::0;::::2;25641:21:1::0;25698:2;25678:18;;;25671:30;-1:-1:-1;;;25717:18:1;;;25710:47;25774:18;;128731:55:0::2;25457:341:1::0;128731:55:0::2;128816:1;128799:9;128809:3;;128799:14;;;;;;;:::i;:::-;::::0;;;::::2;::::0;;;;;::::2;::::0;;;:18;128828:33:::2;128839:12;62713:10:::0;;62633:98;128839:12:::2;128853:7;128828:10;:33::i;:::-;128879:65;128888:3:::0;;62713:10;128919:7:::2;128928:15;128879:65;;;;;;;;;;:::i;:::-;;;;;;;;128292:660;;128143:809:::0;;;;;:::o;58648:248::-;58772:4;-1:-1:-1;;;;;;58796:52:0;;-1:-1:-1;;;58796:52:0;;:92;;;58852:36;58876:11;58852:23;:36::i;101177:135::-;94823:4;94421:16;;;:7;:16;;;;;;-1:-1:-1;;;;;94421:16:0;101251:53;;;;-1:-1:-1;;;101251:53:0;;21698:2:1;101251:53:0;;;21680:21:1;21737:2;21717:18;;;21710:30;-1:-1:-1;;;21756:18:1;;;21749:54;21820:18;;101251:53:0;21496:348:1;41429:675:0;39387:42;41620:45;:49;41616:481;;41947:67;;-1:-1:-1;;;41947:67:0;;41998:4;41947:67;;;30243:34:1;-1:-1:-1;;;;;30313:15:1;;30293:18;;;30286:43;39387:42:0;;41947;;30178:18:1;;41947:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41942:144;;42042:28;;-1:-1:-1;;;42042:28:0;;-1:-1:-1;;;;;1692:32:1;;42042:28:0;;;1674:51:1;1647:18;;42042:28:0;1528:203:1;90843:427:0;90924:13;90940:34;90966:7;90940:25;:34::i;:::-;90924:50;;90999:5;-1:-1:-1;;;;;90993:11:0;:2;-1:-1:-1;;;;;90993:11:0;;90985:57;;;;-1:-1:-1;;;90985:57:0;;30792:2:1;90985:57:0;;;30774:21:1;30831:2;30811:18;;;30804:30;30870:34;30850:18;;;30843:62;-1:-1:-1;;;30921:18:1;;;30914:31;30962:19;;90985:57:0;30590:397:1;90985:57:0;62713:10;-1:-1:-1;;;;;91077:21:0;;;;:62;;-1:-1:-1;91102:37:0;91119:5;62713:10;91805:164;:::i;91102:37::-;91055:173;;;;-1:-1:-1;;;91055:173:0;;31194:2:1;91055:173:0;;;31176:21:1;31233:2;31213:18;;;31206:30;31272:34;31252:18;;;31245:62;31343:31;31323:18;;;31316:59;31392:19;;91055:173:0;30992:425:1;91055:173:0;91241:21;91250:2;91254:7;91241:8;:21::i;92036:335::-;92231:41;62713:10;92250:12;62633:98;92231:41;92223:99;;;;-1:-1:-1;;;92223:99:0;;;;;;;:::i;:::-;92335:28;92345:4;92351:2;92355:7;92335:9;:28::i;81897:105::-;81964:30;81975:4;62713:10;81964;:30::i;86149:238::-;86233:22;86241:4;86247:7;86233;:22::i;:::-;86228:152;;86272:12;;;;:6;:12;;;;;;;;-1:-1:-1;;;;;86272:29:0;;;;;;;;;:36;;-1:-1:-1;;86272:36:0;86304:4;86272:36;;;86355:12;62713:10;;62633:98;86355:12;-1:-1:-1;;;;;86328:40:0;86346:7;-1:-1:-1;;;;;86328:40:0;86340:4;86328:40;;;;;;;;;;86149:238;;:::o;86567:239::-;86651:22;86659:4;86665:7;86651;:22::i;:::-;86647:152;;;86722:5;86690:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;86690:29:0;;;;;;;;;;:37;;-1:-1:-1;;86690:37:0;;;86747:40;62713:10;;86690:12;;86747:40;;86722:5;86747:40;86567:239;;:::o;124093:98::-;121347:26;81031:16;81042:4;81031:10;:16::i;45696:992::-;43649:66;46150:59;;;46146:535;;;46226:37;46245:17;46226:18;:37::i;46146:535::-;46329:17;-1:-1:-1;;;;;46300:61:0;;:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46300:63:0;;;;;;;;-1:-1:-1;;46300:63:0;;;;;;;;;;;;:::i;:::-;;;46296:306;;46530:56;;-1:-1:-1;;;46530:56:0;;32227:2:1;46530:56:0;;;32209:21:1;32266:2;32246:18;;;32239:30;32305:34;32285:18;;;32278:62;-1:-1:-1;;;32356:18:1;;;32349:44;32410:19;;46530:56:0;32025:410:1;46296:306:0;-1:-1:-1;;;;;;;;;;;46414:28:0;;46406:82;;;;-1:-1:-1;;;46406:82:0;;32642:2:1;46406:82:0;;;32624:21:1;32681:2;32661:18;;;32654:30;32720:34;32700:18;;;32693:62;-1:-1:-1;;;32771:18:1;;;32764:39;32820:19;;46406:82:0;32440:405:1;46406:82:0;46364:140;46616:53;46634:17;46653:4;46659:9;46616:17;:53::i;108868:231::-;108946:7;108967:17;108986:18;109008:27;109019:4;109025:9;109008:10;:27::i;:::-;108966:69;;;;109046:18;109058:5;109046:11;:18::i;:::-;-1:-1:-1;109082:9:0;108868:231;-1:-1:-1;;;108868:231:0:o;92442:185::-;92580:39;92597:4;92603:2;92607:7;92580:39;;;;;;;;;;;;:16;:39::i;95053:275::-;95146:4;95163:13;95179:34;95205:7;95179:25;:34::i;:::-;95163:50;;95243:5;-1:-1:-1;;;;;95232:16:0;:7;-1:-1:-1;;;;;95232:16:0;;:52;;;-1:-1:-1;;;;;;91926:25:0;;;91902:4;91926:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;95252:32;95232:87;;;;95312:7;-1:-1:-1;;;;;95288:31:0;:20;95300:7;95288:11;:20::i;:::-;-1:-1:-1;;;;;95288:31:0;;95224:96;95053:275;-1:-1:-1;;;;95053:275:0:o;97927:797::-;97987:13;98003:34;98029:7;98003:25;:34::i;:::-;97987:50;;98050:51;98071:5;98086:1;98090:7;98099:1;98050:20;:51::i;:::-;98214:34;98240:7;98214:25;:34::i;:::-;98296:24;;;;:15;:24;;;;;;;;98289:31;;-1:-1:-1;;;;;;98289:31:0;;;;;;-1:-1:-1;;;;;98533:16:0;;;;;:9;:16;;;;;:21;;-1:-1:-1;;98533:21:0;;;98583:16;;;:7;:16;;;;;;98576:23;;;;;;;98617:36;98206:42;;-1:-1:-1;98312:7:0;;98617:36;;98296:24;;98617:36;84552:218;;:::o;88447:151::-;37129:13;;;;;;;37121:69;;;;-1:-1:-1;;;37121:69:0;;;;;;;:::i;:::-;88551:39:::1;88575:5;88582:7;88551:23;:39::i;80229:66::-:0;37129:13;;;;;;;37121:69;;;;-1:-1:-1;;;37121:69:0;;;;;;;:::i;:::-;80229:66::o;42659:173::-;37129:13;;;;;;;37121:69;;;;-1:-1:-1;;;37121:69:0;;;;;;;:::i;:::-;42738:86:::1;276:42;42819:4;42738:51;:86::i;85477:112::-:0;85556:25;85567:4;85573:7;85556:10;:25::i;132823:180::-;132898:12;132915:8;-1:-1:-1;;;;;132915:13:0;132936:7;132915:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;132897:51;;;132967:7;132959:36;;;;-1:-1:-1;;;132959:36:0;;33674:2:1;132959:36:0;;;33656:21:1;33713:2;33693:18;;;33686:30;-1:-1:-1;;;33732:18:1;;;33725:46;33788:18;;132959:36:0;33472:340:1;91579:155:0;91674:52;62713:10;91707:8;91717;91674:18;:52::i;92698:322::-;92872:41;62713:10;92905:7;92872:18;:41::i;:::-;92864:99;;;;-1:-1:-1;;;92864:99:0;;;;;;;:::i;:::-;92974:38;92988:4;92994:2;92998:7;93007:4;92974:13;:38::i;128962:122::-;129031:7;129058:18;:6;129069;129058:10;:18::i;125011:314::-;125095:12;;125077:15;125118:167;125142:4;125138:1;:8;125118:167;;;125164:19;125170:3;125175:7;125164:5;:19::i;:::-;125227:3;125249:9;;;;125227:3;125118:167;;;-1:-1:-1;125295:12:0;:22;-1:-1:-1;;125011:314:0:o;124199:98::-;124251:13;124284:5;124277:12;;;;;:::i;76410:723::-;76466:13;76517:14;76534:28;76556:5;76534:21;:28::i;:::-;76565:1;76534:32;76517:49;;76581:20;76615:6;-1:-1:-1;;;;;76604:18:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;76604:18:0;-1:-1:-1;76581:41:0;-1:-1:-1;76742:28:0;;;76758:2;76742:28;76799:288;-1:-1:-1;;76831:5:0;-1:-1:-1;;;76968:2:0;76957:14;;76952:30;76831:5;76939:44;77029:2;77020:11;;;-1:-1:-1;77050:21:0;76799:288;77050:21;-1:-1:-1;77108:6:0;76410:723;-1:-1:-1;;;76410:723:0:o;96662:926::-;-1:-1:-1;;;;;96742:16:0;;96734:61;;;;-1:-1:-1;;;96734:61:0;;34019:2:1;96734:61:0;;;34001:21:1;;;34038:18;;;34031:30;34097:34;34077:18;;;34070:62;34149:18;;96734:61:0;33817:356:1;96734:61:0;94823:4;94421:16;;;:7;:16;;;;;;-1:-1:-1;;;;;94421:16:0;94847:31;96806:58;;;;-1:-1:-1;;;96806:58:0;;34380:2:1;96806:58:0;;;34362:21:1;34419:2;34399:18;;;34392:30;34458;34438:18;;;34431:58;34506:18;;96806:58:0;34178:352:1;96806:58:0;96877:48;96906:1;96910:2;96914:7;96923:1;96877:20;:48::i;:::-;94823:4;94421:16;;;:7;:16;;;;;;-1:-1:-1;;;;;94421:16:0;94847:31;97015:58;;;;-1:-1:-1;;;97015:58:0;;34380:2:1;97015:58:0;;;34362:21:1;34419:2;34399:18;;;34392:30;34458;34438:18;;;34431:58;34506:18;;97015:58:0;34178:352:1;97015:58:0;-1:-1:-1;;;;;97406:13:0;;;;;;:9;:13;;;;;;;;:18;;97423:1;97406:18;;;97448:16;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;97448:21:0;;;;;97487:33;97456:7;;97406:13;;97487:33;;97406:13;;97487:33;84552:218;;:::o;81139:215::-;81224:4;-1:-1:-1;;;;;;81248:58:0;;-1:-1:-1;;;81248:58:0;;:98;;;81310:36;81334:11;81310:23;:36::i;100445:185::-;100520:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;100520:29:0;-1:-1:-1;;;;;100520:29:0;;;;;;;;:24;;100574:34;100520:24;100574:25;:34::i;:::-;-1:-1:-1;;;;;100565:57:0;;;;;;;;;;;100445:185;;:::o;99061:1265::-;99231:4;-1:-1:-1;;;;;99193:42:0;:34;99219:7;99193:25;:34::i;:::-;-1:-1:-1;;;;;99193:42:0;;99185:92;;;;-1:-1:-1;;;99185:92:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;99296:16:0;;99288:65;;;;-1:-1:-1;;;99288:65:0;;35143:2:1;99288:65:0;;;35125:21:1;35182:2;35162:18;;;35155:30;35221:34;35201:18;;;35194:62;-1:-1:-1;;;35272:18:1;;;35265:34;35316:19;;99288:65:0;34941:400:1;99288:65:0;99366:42;99387:4;99393:2;99397:7;99406:1;99366:20;:42::i;:::-;99549:4;-1:-1:-1;;;;;99511:42:0;:34;99537:7;99511:25;:34::i;:::-;-1:-1:-1;;;;;99511:42:0;;99503:92;;;;-1:-1:-1;;;99503:92:0;;;;;;;:::i;:::-;99667:24;;;;:15;:24;;;;;;;;99660:31;;-1:-1:-1;;;;;;99660:31:0;;;;;;-1:-1:-1;;;;;100123:15:0;;;;;;:9;:15;;;;;:20;;-1:-1:-1;;100123:20:0;;;100158:13;;;;;;;;;:18;;99660:31;100158:18;;;100198:16;;;:7;:16;;;;;;:21;;;;;;;;;;100237:27;;99683:7;;100237:27;;;133664:157;;;:::o;82292:486::-;82381:22;82389:4;82395:7;82381;:22::i;:::-;82376:395;;82557:39;82588:7;82557:30;:39::i;:::-;82661:49;82700:4;82707:2;82661:30;:49::i;:::-;82470:259;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;82470:259:0;;;;;;;;;;-1:-1:-1;;;82420:339:0;;;;;;;:::i;44527:284::-;-1:-1:-1;;;;;24647:19:0;;;44601:106;;;;-1:-1:-1;;;44601:106:0;;36339:2:1;44601:106:0;;;36321:21:1;36378:2;36358:18;;;36351:30;36417:34;36397:18;;;36390:62;-1:-1:-1;;;36468:18:1;;;36461:43;36521:19;;44601:106:0;36137:409:1;44601:106:0;-1:-1:-1;;;;;;;;;;;44718:85:0;;-1:-1:-1;;;;;;44718:85:0;-1:-1:-1;;;;;44718:85:0;;;;;;;;;;44527:284::o;45220:297::-;45363:29;45374:17;45363:10;:29::i;:::-;45421:1;45407:4;:11;:15;:28;;;;45426:9;45407:28;45403:107;;;45452:46;45474:17;45493:4;45452:21;:46::i;107319:747::-;107400:7;107409:12;107438:9;:16;107458:2;107438:22;107434:625;;107782:4;107767:20;;107761:27;107832:4;107817:20;;107811:27;107890:4;107875:20;;107869:27;107477:9;107861:36;107933:25;107944:4;107861:36;107761:27;107811;107933:10;:25::i;:::-;107926:32;;;;;;;;;107434:625;-1:-1:-1;108007:1:0;;-1:-1:-1;108011:35:0;107991:56;;105712:521;105790:20;105781:5;:29;;;;;;;;:::i;:::-;;105777:449;;105712:521;:::o;105777:449::-;105888:29;105879:5;:38;;;;;;;;:::i;:::-;;105875:351;;105934:34;;-1:-1:-1;;;105934:34:0;;36885:2:1;105934:34:0;;;36867:21:1;36924:2;36904:18;;;36897:30;36963:26;36943:18;;;36936:54;37007:18;;105934:34:0;36683:348:1;105875:351:0;105999:35;105990:5;:44;;;;;;;;:::i;:::-;;105986:240;;106051:41;;-1:-1:-1;;;106051:41:0;;37238:2:1;106051:41:0;;;37220:21:1;37277:2;37257:18;;;37250:30;37316:33;37296:18;;;37289:61;37367:18;;106051:41:0;37036:355:1;105986:240:0;106123:30;106114:5;:39;;;;;;;;:::i;:::-;;106110:116;;106170:44;;-1:-1:-1;;;106170:44:0;;37598:2:1;106170:44:0;;;37580:21:1;37637:2;37617:18;;;37610:30;37676:34;37656:18;;;37649:62;-1:-1:-1;;;37727:18:1;;;37720:32;37769:19;;106170:44:0;37396:398:1;134810:289:0;134973:20;;;;:11;:20;;;;;;:25;134965:59;;;;-1:-1:-1;;;134965:59:0;;38001:2:1;134965:59:0;;;37983:21:1;38040:2;38020:18;;;38013:30;-1:-1:-1;;;38059:18:1;;;38052:51;38120:18;;134965:59:0;37799:345:1;134965:59:0;135035:56;135062:4;135068:2;135072:7;135081:9;135035:26;:56::i;88606:163::-;37129:13;;;;;;;37121:69;;;;-1:-1:-1;;;37121:69:0;;;;;;;:::i;:::-;88720:13;;::::1;::::0;:5:::1;::::0;:13:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;88744:17:0;;::::1;::::0;:7:::1;::::0;:17:::1;::::0;::::1;::::0;::::1;:::i;39548:1103::-:0;37129:13;;;;;;;37121:69;;;;-1:-1:-1;;;37121:69:0;;;;;;;:::i;:::-;39387:42:::1;39976:45;:49:::0;39972:672:::1;;40047:52;::::0;-1:-1:-1;;;40047:52:0;;40093:4:::1;40047:52;::::0;::::1;1674:51:1::0;39387:42:0::1;::::0;40047:37:::1;::::0;1647:18:1;;40047:52:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40042:591;;40124:9;40120:498;;;40158:92;::::0;-1:-1:-1;;;40158:92:0;;40212:4:::1;40158:92;::::0;::::1;30243:34:1::0;-1:-1:-1;;;;;30313:15:1;;30293:18;;;30286:43;39387:42:0::1;::::0;40158:45:::1;::::0;30178:18:1;;40158:92:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;84552:218:::0;;:::o;40120:498::-:1;-1:-1:-1::0;;;;;40303:44:0;::::1;::::0;40299:300:::1;;40376:94;::::0;-1:-1:-1;;;40376:94:0;;40432:4:::1;40376:94;::::0;::::1;30243:34:1::0;-1:-1:-1;;;;;30313:15:1;;30293:18;;;30286:43;39387:42:0::1;::::0;40376:47:::1;::::0;30178:18:1;;40376:94:0::1;30031:304:1::0;40299:300:0::1;40527:48;::::0;-1:-1:-1;;;40527:48:0;;40569:4:::1;40527:48;::::0;::::1;1674:51:1::0;39387:42:0::1;::::0;40527:33:::1;::::0;1647:18:1;;40527:48:0::1;1528:203:1::0;100773:315:0;100928:8;-1:-1:-1;;;;;100919:17:0;:5;-1:-1:-1;;;;;100919:17:0;;100911:55;;;;-1:-1:-1;;;100911:55:0;;38351:2:1;100911:55:0;;;38333:21:1;38390:2;38370:18;;;38363:30;38429:27;38409:18;;;38402:55;38474:18;;100911:55:0;38149:349:1;100911:55:0;-1:-1:-1;;;;;100977:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;100977:46:0;;;;;;;;;;101039:41;;540::1;;;101039::0;;513:18:1;101039:41:0;;;;;;;100773:315;;;:::o;93901:313::-;94057:28;94067:4;94073:2;94077:7;94057:9;:28::i;:::-;94104:47;94127:4;94133:2;94137:7;94146:4;94104:22;:47::i;:::-;94096:110;;;;-1:-1:-1;;;94096:110:0;;;;;;;:::i;117520:98::-;117578:7;117605:5;117609:1;117605;:5;:::i;73242:922::-;73295:7;;-1:-1:-1;;;73373:15:0;;73369:102;;-1:-1:-1;;;73409:15:0;;;-1:-1:-1;73453:2:0;73443:12;73369:102;73498:6;73489:5;:15;73485:102;;73534:6;73525:15;;;-1:-1:-1;73569:2:0;73559:12;73485:102;73614:6;73605:5;:15;73601:102;;73650:6;73641:15;;;-1:-1:-1;73685:2:0;73675:12;73601:102;73730:5;73721;:14;73717:99;;73765:5;73756:14;;;-1:-1:-1;73799:1:0;73789:11;73717:99;73843:5;73834;:14;73830:99;;73878:5;73869:14;;;-1:-1:-1;73912:1:0;73902:11;73830:99;73956:5;73947;:14;73943:99;;73991:5;73982:14;;;-1:-1:-1;74025:1:0;74015:11;73943:99;74069:5;74060;:14;74056:66;;74105:1;74095:11;74150:6;73242:922;-1:-1:-1;;73242:922:0:o;88841:349::-;88965:4;-1:-1:-1;;;;;;89002:51:0;;-1:-1:-1;;;89002:51:0;;:127;;-1:-1:-1;;;;;;;89070:59:0;;-1:-1:-1;;;89070:59:0;89002:127;:180;;;-1:-1:-1;;;;;;;;;;56681:51:0;;;89146:36;56572:168;78164:151;78222:13;78255:52;-1:-1:-1;;;;;78267:22:0;;76301:2;77560:447;77635:13;77661:19;77693:10;77697:6;77693:1;:10;:::i;:::-;:14;;77706:1;77693:14;:::i;:::-;-1:-1:-1;;;;;77683:25:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;77683:25:0;;77661:47;;-1:-1:-1;;;77719:6:0;77726:1;77719:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;77719:15:0;;;;;;;;;-1:-1:-1;;;77745:6:0;77752:1;77745:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;77745:15:0;;;;;;;;-1:-1:-1;77776:9:0;77788:10;77792:6;77788:1;:10;:::i;:::-;:14;;77801:1;77788:14;:::i;:::-;77776:26;;77771:131;77808:1;77804;:5;77771:131;;;-1:-1:-1;;;77852:5:0;77860:3;77852:11;77843:21;;;;;;;:::i;:::-;;;;77831:6;77838:1;77831:9;;;;;;;;:::i;:::-;;;;:33;-1:-1:-1;;;;;77831:33:0;;;;;;;;-1:-1:-1;77889:1:0;77879:11;;;;;77811:3;;;:::i;:::-;;;77771:131;;;-1:-1:-1;77920:10:0;;77912:55;;;;-1:-1:-1;;;77912:55:0;;39265:2:1;77912:55:0;;;39247:21:1;;;39284:18;;;39277:30;39343:34;39323:18;;;39316:62;39395:18;;77912:55:0;39063:356:1;44924:155:0;44991:37;45010:17;44991:18;:37::i;:::-;45044:27;;-1:-1:-1;;;;;45044:27:0;;;;;;;;44924:155;:::o;49957:461::-;50040:12;-1:-1:-1;;;;;24647:19:0;;;50065:88;;;;-1:-1:-1;;;50065:88:0;;39626:2:1;50065:88:0;;;39608:21:1;39665:2;39645:18;;;39638:30;39704:34;39684:18;;;39677:62;-1:-1:-1;;;39755:18:1;;;39748:36;39801:19;;50065:88:0;39424:402:1;50065:88:0;50227:12;50241:23;50268:6;-1:-1:-1;;;;;50268:19:0;50288:4;50268:25;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50226:67;;;;50311:99;50347:7;50356:10;50311:99;;;;;;;;;;;;;;;;;:35;:99::i;:::-;50304:106;49957:461;-1:-1:-1;;;;;49957:461:0:o;110320:1520::-;110451:7;;111385:66;111372:79;;111368:163;;;-1:-1:-1;111484:1:0;;-1:-1:-1;111488:30:0;111468:51;;111368:163;111645:24;;;111628:14;111645:24;;;;;;;;;40337:25:1;;;40410:4;40398:17;;40378:18;;;40371:45;;;;40432:18;;;40425:34;;;40475:18;;;40468:34;;;111645:24:0;;40309:19:1;;111645:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;111645:24:0;;-1:-1:-1;;111645:24:0;;;-1:-1:-1;;;;;;;111684:20:0;;111680:103;;111737:1;111741:29;111721:50;;;;;;;111680:103;111803:6;-1:-1:-1;111811:20:0;;-1:-1:-1;110320:1520:0;;;;;;;;:::o;103483:410::-;103673:1;103661:9;:13;103657:229;;;-1:-1:-1;;;;;103695:18:0;;;103691:87;;-1:-1:-1;;;;;103734:15:0;;;;;;:9;:15;;;;;:28;;103753:9;;103734:15;:28;;103753:9;;103734:28;:::i;:::-;;;;-1:-1:-1;;103691:87:0;-1:-1:-1;;;;;103796:16:0;;;103792:83;;-1:-1:-1;;;;;103833:13:0;;;;;;:9;:13;;;;;:26;;103850:9;;103833:13;:26;;103850:9;;103833:26;:::i;:::-;;;;-1:-1:-1;;103483:410:0;;;;:::o;101876:875::-;102030:4;-1:-1:-1;;;;;102051:13:0;;24647:19;:23;102047:697;;102087:82;;-1:-1:-1;;;102087:82:0;;-1:-1:-1;;;;;102087:47:0;;;;;:82;;62713:10;;102149:4;;102155:7;;102164:4;;102087:82;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;102087:82:0;;;;;;;;-1:-1:-1;;102087:82:0;;;;;;;;;;;;:::i;:::-;;;102083:606;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;102350:6;:13;102367:1;102350:18;102346:328;;102393:60;;-1:-1:-1;;;102393:60:0;;;;;;;:::i;102346:328::-;102624:6;102618:13;102609:6;102605:2;102601:15;102594:38;102083:606;-1:-1:-1;;;;;;102220:62:0;-1:-1:-1;;;102220:62:0;;-1:-1:-1;102213:69:0;;102047:697;-1:-1:-1;102728:4:0;102721:11;;30762:305;30912:12;30941:7;30937:123;;;-1:-1:-1;30972:10:0;30965:17;;30937:123;31015:33;31023:10;31035:12;31236:17;;:21;31232:388;;31468:10;31462:17;31525:15;31512:10;31508:2;31504:19;31497:44;31232:388;31595:12;31588:20;;-1:-1:-1;;;31588:20:0;;;;;;;;:::i;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:131:1;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:258::-;664:1;674:113;688:6;685:1;682:13;674:113;;;764:11;;;758:18;745:11;;;738:39;710:2;703:10;674:113;;;805:6;802:1;799:13;796:48;;;-1:-1:-1;;840:1:1;822:16;;815:27;592:258::o;855:::-;897:3;935:5;929:12;962:6;957:3;950:19;978:63;1034:6;1027:4;1022:3;1018:14;1011:4;1004:5;1000:16;978:63;:::i;:::-;1095:2;1074:15;-1:-1:-1;;1070:29:1;1061:39;;;;1102:4;1057:50;;855:258;-1:-1:-1;;855:258:1:o;1118:220::-;1267:2;1256:9;1249:21;1230:4;1287:45;1328:2;1317:9;1313:18;1305:6;1287:45;:::i;1343:180::-;1402:6;1455:2;1443:9;1434:7;1430:23;1426:32;1423:52;;;1471:1;1468;1461:12;1423:52;-1:-1:-1;1494:23:1;;1343:180;-1:-1:-1;1343:180:1:o;1736:173::-;1804:20;;-1:-1:-1;;;;;1853:31:1;;1843:42;;1833:70;;1899:1;1896;1889:12;1833:70;1736:173;;;:::o;1914:254::-;1982:6;1990;2043:2;2031:9;2022:7;2018:23;2014:32;2011:52;;;2059:1;2056;2049:12;2011:52;2082:29;2101:9;2082:29;:::i;:::-;2072:39;2158:2;2143:18;;;;2130:32;;-1:-1:-1;;;1914:254:1:o;2355:328::-;2432:6;2440;2448;2501:2;2489:9;2480:7;2476:23;2472:32;2469:52;;;2517:1;2514;2507:12;2469:52;2540:29;2559:9;2540:29;:::i;:::-;2530:39;;2588:38;2622:2;2611:9;2607:18;2588:38;:::i;:::-;2578:48;;2673:2;2662:9;2658:18;2645:32;2635:42;;2355:328;;;;;:::o;3379:186::-;3438:6;3491:2;3479:9;3470:7;3466:23;3462:32;3459:52;;;3507:1;3504;3497:12;3459:52;3530:29;3549:9;3530:29;:::i;3570:348::-;3622:8;3632:6;3686:3;3679:4;3671:6;3667:17;3663:27;3653:55;;3704:1;3701;3694:12;3653:55;-1:-1:-1;3727:20:1;;-1:-1:-1;;;;;3759:30:1;;3756:50;;;3802:1;3799;3792:12;3756:50;3839:4;3831:6;3827:17;3815:29;;3891:3;3884:4;3875:6;3867;3863:19;3859:30;3856:39;3853:59;;;3908:1;3905;3898:12;3923:904;4030:6;4038;4046;4054;4107:2;4095:9;4086:7;4082:23;4078:32;4075:52;;;4123:1;4120;4113:12;4075:52;4163:9;4150:23;-1:-1:-1;;;;;4233:2:1;4225:6;4222:14;4219:34;;;4249:1;4246;4239:12;4219:34;4288:59;4339:7;4330:6;4319:9;4315:22;4288:59;:::i;:::-;4366:8;;-1:-1:-1;4262:85:1;-1:-1:-1;4454:2:1;4439:18;;4426:32;;-1:-1:-1;4470:16:1;;;4467:36;;;4499:1;4496;4489:12;4467:36;4537:8;4526:9;4522:24;4512:34;;4584:7;4577:4;4573:2;4569:13;4565:27;4555:55;;4606:1;4603;4596:12;4555:55;4646:2;4633:16;4672:2;4664:6;4661:14;4658:34;;;4688:1;4685;4678:12;4658:34;4741:7;4736:2;4726:6;4723:1;4719:14;4715:2;4711:23;4707:32;4704:45;4701:65;;;4762:1;4759;4752:12;4701:65;3923:904;;;;-1:-1:-1;;4793:2:1;4785:11;;-1:-1:-1;;;3923:904:1:o;4832:248::-;4900:6;4908;4961:2;4949:9;4940:7;4936:23;4932:32;4929:52;;;4977:1;4974;4967:12;4929:52;-1:-1:-1;;5000:23:1;;;5070:2;5055:18;;;5042:32;;-1:-1:-1;4832:248:1:o;5364:254::-;5432:6;5440;5493:2;5481:9;5472:7;5468:23;5464:32;5461:52;;;5509:1;5506;5499:12;5461:52;5545:9;5532:23;5522:33;;5574:38;5608:2;5597:9;5593:18;5574:38;:::i;:::-;5564:48;;5364:254;;;;;:::o;5623:127::-;5684:10;5679:3;5675:20;5672:1;5665:31;5715:4;5712:1;5705:15;5739:4;5736:1;5729:15;5755:719;5798:5;5851:3;5844:4;5836:6;5832:17;5828:27;5818:55;;5869:1;5866;5859:12;5818:55;5905:6;5892:20;-1:-1:-1;;;;;5968:2:1;5964;5961:10;5958:36;;;5974:18;;:::i;:::-;6049:2;6043:9;6017:2;6103:13;;-1:-1:-1;;6099:22:1;;;6123:2;6095:31;6091:40;6079:53;;;6147:18;;;6167:22;;;6144:46;6141:72;;;6193:18;;:::i;:::-;6233:10;6229:2;6222:22;6268:2;6260:6;6253:18;6314:3;6307:4;6302:2;6294:6;6290:15;6286:26;6283:35;6280:55;;;6331:1;6328;6321:12;6280:55;6395:2;6388:4;6380:6;6376:17;6369:4;6361:6;6357:17;6344:54;6442:1;6435:4;6430:2;6422:6;6418:15;6414:26;6407:37;6462:6;6453:15;;;;;;5755:719;;;;:::o;6479:1044::-;6614:6;6622;6630;6638;6646;6654;6662;6715:3;6703:9;6694:7;6690:23;6686:33;6683:53;;;6732:1;6729;6722:12;6683:53;6755:29;6774:9;6755:29;:::i;:::-;6745:39;;6831:2;6820:9;6816:18;6803:32;6793:42;;6882:2;6871:9;6867:18;6854:32;6844:42;;6937:2;6926:9;6922:18;6909:32;-1:-1:-1;;;;;7001:2:1;6993:6;6990:14;6987:34;;;7017:1;7014;7007:12;6987:34;7056:59;7107:7;7098:6;7087:9;7083:22;7056:59;:::i;:::-;7134:8;;-1:-1:-1;7030:85:1;-1:-1:-1;7222:3:1;7207:19;;7194:33;;-1:-1:-1;7239:16:1;;;7236:36;;;7268:1;7265;7258:12;7236:36;7291:52;7335:7;7324:8;7313:9;7309:24;7291:52;:::i;:::-;7281:62;;7396:3;7385:9;7381:19;7368:33;7352:49;;7426:2;7416:8;7413:16;7410:36;;;7442:1;7439;7432:12;7410:36;;7465:52;7509:7;7498:8;7487:9;7483:24;7465:52;:::i;:::-;7455:62;;;6479:1044;;;;;;;;;;:::o;7528:632::-;7699:2;7751:21;;;7821:13;;7724:18;;;7843:22;;;7670:4;;7699:2;7922:15;;;;7896:2;7881:18;;;7670:4;7965:169;7979:6;7976:1;7973:13;7965:169;;;8040:13;;8028:26;;8109:15;;;;8074:12;;;;8001:1;7994:9;7965:169;;;-1:-1:-1;8151:3:1;;7528:632;-1:-1:-1;;;;;;7528:632:1:o;8165:395::-;8242:6;8250;8303:2;8291:9;8282:7;8278:23;8274:32;8271:52;;;8319:1;8316;8309:12;8271:52;8342:29;8361:9;8342:29;:::i;:::-;8332:39;;8422:2;8411:9;8407:18;8394:32;-1:-1:-1;;;;;8441:6:1;8438:30;8435:50;;;8481:1;8478;8471:12;8435:50;8504;8546:7;8537:6;8526:9;8522:22;8504:50;:::i;:::-;8494:60;;;8165:395;;;;;:::o;8565:322::-;8634:6;8687:2;8675:9;8666:7;8662:23;8658:32;8655:52;;;8703:1;8700;8693:12;8655:52;8743:9;8730:23;-1:-1:-1;;;;;8768:6:1;8765:30;8762:50;;;8808:1;8805;8798:12;8762:50;8831;8873:7;8864:6;8853:9;8849:22;8831:50;:::i;8892:479::-;8972:6;8980;8988;9041:2;9029:9;9020:7;9016:23;9012:32;9009:52;;;9057:1;9054;9047:12;9009:52;9097:9;9084:23;-1:-1:-1;;;;;9122:6:1;9119:30;9116:50;;;9162:1;9159;9152:12;9116:50;9201:59;9252:7;9243:6;9232:9;9228:22;9201:59;:::i;:::-;9279:8;;9175:85;;-1:-1:-1;9361:2:1;9346:18;;;;9333:32;;8892:479;-1:-1:-1;;;;8892:479:1:o;9376:118::-;9462:5;9455:13;9448:21;9441:5;9438:32;9428:60;;9484:1;9481;9474:12;9499:315;9564:6;9572;9625:2;9613:9;9604:7;9600:23;9596:32;9593:52;;;9641:1;9638;9631:12;9593:52;9664:29;9683:9;9664:29;:::i;:::-;9654:39;;9743:2;9732:9;9728:18;9715:32;9756:28;9778:5;9756:28;:::i;:::-;9803:5;9793:15;;;9499:315;;;;;:::o;9819:538::-;9914:6;9922;9930;9938;9991:3;9979:9;9970:7;9966:23;9962:33;9959:53;;;10008:1;10005;9998:12;9959:53;10031:29;10050:9;10031:29;:::i;:::-;10021:39;;10079:38;10113:2;10102:9;10098:18;10079:38;:::i;:::-;10069:48;;10164:2;10153:9;10149:18;10136:32;10126:42;;10219:2;10208:9;10204:18;10191:32;-1:-1:-1;;;;;10238:6:1;10235:30;10232:50;;;10278:1;10275;10268:12;10232:50;10301;10343:7;10334:6;10323:9;10319:22;10301:50;:::i;:::-;10291:60;;;9819:538;;;;;;;:::o;10362:768::-;10469:6;10477;10485;10493;10501;10554:3;10542:9;10533:7;10529:23;10525:33;10522:53;;;10571:1;10568;10561:12;10522:53;10611:9;10598:23;-1:-1:-1;;;;;10681:2:1;10673:6;10670:14;10667:34;;;10697:1;10694;10687:12;10667:34;10736:59;10787:7;10778:6;10767:9;10763:22;10736:59;:::i;:::-;10814:8;;-1:-1:-1;10710:85:1;-1:-1:-1;10896:2:1;10881:18;;10868:32;;-1:-1:-1;10947:2:1;10932:18;;10919:32;;-1:-1:-1;11004:2:1;10989:18;;10976:32;;-1:-1:-1;11020:16:1;;;11017:36;;;11049:1;11046;11039:12;11017:36;;11072:52;11116:7;11105:8;11094:9;11090:24;11072:52;:::i;:::-;11062:62;;;10362:768;;;;;;;;:::o;11135:699::-;11233:6;11241;11249;11257;11310:2;11298:9;11289:7;11285:23;11281:32;11278:52;;;11326:1;11323;11316:12;11278:52;11366:9;11353:23;-1:-1:-1;;;;;11436:2:1;11428:6;11425:14;11422:34;;;11452:1;11449;11442:12;11422:34;11491:59;11542:7;11533:6;11522:9;11518:22;11491:59;:::i;:::-;11569:8;;-1:-1:-1;11465:85:1;-1:-1:-1;11651:2:1;11636:18;;11623:32;;-1:-1:-1;11708:2:1;11693:18;;11680:32;;-1:-1:-1;11724:16:1;;;11721:36;;;11753:1;11750;11743:12;11721:36;;11776:52;11820:7;11809:8;11798:9;11794:24;11776:52;:::i;12098:411::-;12169:6;12177;12230:2;12218:9;12209:7;12205:23;12201:32;12198:52;;;12246:1;12243;12236:12;12198:52;12286:9;12273:23;-1:-1:-1;;;;;12311:6:1;12308:30;12305:50;;;12351:1;12348;12341:12;12305:50;12390:59;12441:7;12432:6;12421:9;12417:22;12390:59;:::i;:::-;12468:8;;12364:85;;-1:-1:-1;12098:411:1;-1:-1:-1;;;;12098:411:1:o;12514:260::-;12582:6;12590;12643:2;12631:9;12622:7;12618:23;12614:32;12611:52;;;12659:1;12656;12649:12;12611:52;12682:29;12701:9;12682:29;:::i;:::-;12672:39;;12730:38;12764:2;12753:9;12749:18;12730:38;:::i;12779:380::-;12858:1;12854:12;;;;12901;;;12922:61;;12976:4;12968:6;12964:17;12954:27;;12922:61;13029:2;13021:6;13018:14;12998:18;12995:38;12992:161;;13075:10;13070:3;13066:20;13063:1;13056:31;13110:4;13107:1;13100:15;13138:4;13135:1;13128:15;12992:161;;12779:380;;;:::o;13164:127::-;13225:10;13220:3;13216:20;13213:1;13206:31;13256:4;13253:1;13246:15;13280:4;13277:1;13270:15;13296:125;13336:4;13364:1;13361;13358:8;13355:34;;;13369:18;;:::i;:::-;-1:-1:-1;13406:9:1;;13296:125::o;13426:128::-;13466:3;13497:1;13493:6;13490:1;13487:13;13484:39;;;13503:18;;:::i;:::-;-1:-1:-1;13539:9:1;;13426:128::o;13559:273::-;13744:6;13736;13731:3;13718:33;13700:3;13770:16;;13795:13;;;13770:16;13559:273;-1:-1:-1;13559:273:1:o;14180:405::-;14382:2;14364:21;;;14421:2;14401:18;;;14394:30;14460:34;14455:2;14440:18;;14433:62;-1:-1:-1;;;14526:2:1;14511:18;;14504:39;14575:3;14560:19;;14180:405::o;14937:127::-;14998:10;14993:3;14989:20;14986:1;14979:31;15029:4;15026:1;15019:15;15053:4;15050:1;15043:15;15069:411;15271:2;15253:21;;;15310:2;15290:18;;;15283:30;15349:34;15344:2;15329:18;;15322:62;-1:-1:-1;;;15415:2:1;15400:18;;15393:45;15470:3;15455:19;;15069:411::o;15891:267::-;15980:6;15975:3;15968:19;16032:6;16025:5;16018:4;16013:3;16009:14;15996:43;-1:-1:-1;16084:1:1;16059:16;;;16077:4;16055:27;;;16048:38;;;;16140:2;16119:15;;;-1:-1:-1;;16115:29:1;16106:39;;;16102:50;;15891:267::o;16163:840::-;16466:3;16455:9;16448:22;16429:4;16493:63;16551:3;16540:9;16536:19;16528:6;16520;16493:63;:::i;:::-;16592:22;;;16587:2;16572:18;;16565:50;16624:22;;;-1:-1:-1;;;;;16658:31:1;;16655:51;;;16702:1;16699;16692:12;16655:51;16736:6;16733:1;16729:14;16790:6;16782;16777:2;16769:6;16765:15;16752:45;16864:1;16820:19;;16841:2;16816:28;16853:13;;;-1:-1:-1;;;;;16921:32:1;;;;16916:2;16901:18;;16894:60;-1:-1:-1;16985:2:1;16970:18;16963:34;16816:28;16163:840;-1:-1:-1;;;;16163:840:1:o;17008:168::-;17048:7;17114:1;17110;17106:6;17102:14;17099:1;17096:21;17091:1;17084:9;17077:17;17073:45;17070:71;;;17121:18;;:::i;:::-;-1:-1:-1;17161:9:1;;17008:168::o;17313:217::-;17353:1;17379;17369:132;;17423:10;17418:3;17414:20;17411:1;17404:31;17458:4;17455:1;17448:15;17486:4;17483:1;17476:15;17369:132;-1:-1:-1;17515:9:1;;17313:217::o;18699:408::-;18901:2;18883:21;;;18940:2;18920:18;;;18913:30;18979:34;18974:2;18959:18;;18952:62;-1:-1:-1;;;19045:2:1;19030:18;;19023:42;19097:3;19082:19;;18699:408::o;19112:::-;19314:2;19296:21;;;19353:2;19333:18;;;19326:30;19392:34;19387:2;19372:18;;19365:62;-1:-1:-1;;;19458:2:1;19443:18;;19436:42;19510:3;19495:19;;19112:408::o;19525:652::-;19845:1;19841;19836:3;19832:11;19828:19;19820:6;19816:32;19805:9;19798:51;19885:6;19880:2;19869:9;19865:18;19858:34;19928:6;19923:2;19912:9;19908:18;19901:34;19971:3;19966:2;19955:9;19951:18;19944:31;19779:4;19998:63;20056:3;20045:9;20041:19;20033:6;20025;19998:63;:::i;:::-;20110:9;20102:6;20098:22;20092:3;20081:9;20077:19;20070:51;20138:33;20164:6;20156;20138:33;:::i;:::-;20130:41;19525:652;-1:-1:-1;;;;;;;;;19525:652:1:o;20588:135::-;20627:3;20648:17;;;20645:43;;20668:18;;:::i;:::-;-1:-1:-1;20715:1:1;20704:13;;20588:135::o;23275:342::-;23477:2;23459:21;;;23516:2;23496:18;;;23489:30;-1:-1:-1;;;23550:2:1;23535:18;;23528:48;23608:2;23593:18;;23275:342::o;23622:353::-;23824:2;23806:21;;;23863:2;23843:18;;;23836:30;23902:31;23897:2;23882:18;;23875:59;23966:2;23951:18;;23622:353::o;24385:346::-;24587:2;24569:21;;;24626:2;24606:18;;;24599:30;-1:-1:-1;;;24660:2:1;24645:18;;24638:52;24722:2;24707:18;;24385:346::o;25803:757::-;26147:3;26136:9;26129:22;26110:4;26174:63;26232:3;26221:9;26217:19;26209:6;26201;26174:63;:::i;:::-;26273:22;;;26268:2;26253:18;;;26246:50;;;;26320:1;26305:17;;-1:-1:-1;;;26338:15:1;;;26331:35;-1:-1:-1;;;;;26434:32:1;;;;26395:2;26414:18;;;26407:60;;;;26498:2;26483:18;;26476:34;;;;-1:-1:-1;26541:3:1;26526:19;26519:35;26383:15;;25803:757;-1:-1:-1;;25803:757:1:o;26565:470::-;26744:3;26782:6;26776:13;26798:53;26844:6;26839:3;26832:4;26824:6;26820:17;26798:53;:::i;:::-;26914:13;;26873:16;;;;26936:57;26914:13;26873:16;26970:4;26958:17;;26936:57;:::i;:::-;27009:20;;26565:470;-1:-1:-1;;;;26565:470:1:o;27788:757::-;28132:3;28121:9;28114:22;28095:4;28159:63;28217:3;28206:9;28202:19;28194:6;28186;28159:63;:::i;:::-;28258:22;;;28253:2;28238:18;;;28231:50;;;;28305:1;28290:17;;-1:-1:-1;;;28323:15:1;;;28316:35;-1:-1:-1;;;;;28419:32:1;;;;28380:2;28399:18;;;28392:60;;;;28483:2;28468:18;;28461:34;;;;-1:-1:-1;28526:3:1;28511:19;28504:35;28368:15;;27788:757;-1:-1:-1;;27788:757:1:o;29269:::-;29613:3;29602:9;29595:22;29576:4;29640:63;29698:3;29687:9;29683:19;29675:6;29667;29640:63;:::i;:::-;29739:22;;;29734:2;29719:18;;;29712:50;;;;29786:1;29771:17;;-1:-1:-1;;;29804:15:1;;;29797:35;-1:-1:-1;;;;;29900:32:1;;;;29861:2;29880:18;;;29873:60;;;;29964:2;29949:18;;29942:34;;;;-1:-1:-1;30007:3:1;29992:19;29985:35;29849:15;;29269:757;-1:-1:-1;;29269:757:1:o;30340:245::-;30407:6;30460:2;30448:9;30439:7;30435:23;30431:32;30428:52;;;30476:1;30473;30466:12;30428:52;30508:9;30502:16;30527:28;30549:5;30527:28;:::i;31422:409::-;31624:2;31606:21;;;31663:2;31643:18;;;31636:30;31702:34;31697:2;31682:18;;31675:62;-1:-1:-1;;;31768:2:1;31753:18;;31746:43;31821:3;31806:19;;31422:409::o;31836:184::-;31906:6;31959:2;31947:9;31938:7;31934:23;31930:32;31927:52;;;31975:1;31972;31965:12;31927:52;-1:-1:-1;31998:16:1;;31836:184;-1:-1:-1;31836:184:1:o;32850:407::-;33052:2;33034:21;;;33091:2;33071:18;;;33064:30;33130:34;33125:2;33110:18;;33103:62;-1:-1:-1;;;33196:2:1;33181:18;;33174:41;33247:3;33232:19;;32850:407::o;34535:401::-;34737:2;34719:21;;;34776:2;34756:18;;;34749:30;34815:34;34810:2;34795:18;;34788:62;-1:-1:-1;;;34881:2:1;34866:18;;34859:35;34926:3;34911:19;;34535:401::o;35346:786::-;35757:25;35752:3;35745:38;35727:3;35812:6;35806:13;35828:62;35883:6;35878:2;35873:3;35869:12;35862:4;35854:6;35850:17;35828:62;:::i;:::-;-1:-1:-1;;;35949:2:1;35909:16;;;35941:11;;;35934:40;35999:13;;36021:63;35999:13;36070:2;36062:11;;36055:4;36043:17;;36021:63;:::i;:::-;36104:17;36123:2;36100:26;;35346:786;-1:-1:-1;;;;35346:786:1:o;36551:127::-;36612:10;36607:3;36603:20;36600:1;36593:31;36643:4;36640:1;36633:15;36667:4;36664:1;36657:15;38503:414;38705:2;38687:21;;;38744:2;38724:18;;;38717:30;38783:34;38778:2;38763:18;;38756:62;-1:-1:-1;;;38849:2:1;38834:18;;38827:48;38907:3;38892:19;;38503:414::o;38922:136::-;38961:3;38989:5;38979:39;;38998:18;;:::i;:::-;-1:-1:-1;;;39034:18:1;;38922:136::o;39831:274::-;39960:3;39998:6;39992:13;40014:53;40060:6;40055:3;40048:4;40040:6;40036:17;40014:53;:::i;:::-;40083:16;;;;;39831:274;-1:-1:-1;;39831:274:1:o;40513:489::-;-1:-1:-1;;;;;40782:15:1;;;40764:34;;40834:15;;40829:2;40814:18;;40807:43;40881:2;40866:18;;40859:34;;;40929:3;40924:2;40909:18;;40902:31;;;40707:4;;40950:46;;40976:19;;40968:6;40950:46;:::i;:::-;40942:54;40513:489;-1:-1:-1;;;;;;40513:489:1:o;41007:249::-;41076:6;41129:2;41117:9;41108:7;41104:23;41100:32;41097:52;;;41145:1;41142;41135:12;41097:52;41177:9;41171:16;41196:30;41220:5;41196:30;:::i
Swarm Source
ipfs://c4bc79cc739d2185bd07c4084dc9cb568556115f64eceec233697271814ff5eb
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.