Source Code
Overview
GLMR Balance
GLMR Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 74 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Set Approval For... | 3460656 | 1001 days ago | IN | 0 GLMR | 0.01602932 | ||||
| Set Approval For... | 3318802 | 1022 days ago | IN | 0 GLMR | 0.00474187 | ||||
| Set Approval For... | 3318623 | 1022 days ago | IN | 0 GLMR | 0.00474187 | ||||
| Set Approval For... | 3029551 | 1065 days ago | IN | 0 GLMR | 0.00474187 | ||||
| Set Approval For... | 2169860 | 1186 days ago | IN | 0 GLMR | 0.00474187 | ||||
| Transfer From | 2038380 | 1205 days ago | IN | 0 GLMR | 0.00678913 | ||||
| Set Approval For... | 2028327 | 1206 days ago | IN | 0 GLMR | 0.00474187 | ||||
| Set Approval For... | 2006914 | 1209 days ago | IN | 0 GLMR | 0.00474187 | ||||
| Set Approval For... | 2001841 | 1210 days ago | IN | 0 GLMR | 0.00474187 | ||||
| Transfer From | 1957224 | 1216 days ago | IN | 0 GLMR | 0.00675659 | ||||
| Transfer From | 1949312 | 1217 days ago | IN | 0 GLMR | 0.00675659 | ||||
| Transfer From | 1949295 | 1217 days ago | IN | 0 GLMR | 0.00675659 | ||||
| Transfer From | 1949269 | 1217 days ago | IN | 0 GLMR | 0.00749246 | ||||
| Set Approval For... | 1899898 | 1224 days ago | IN | 0 GLMR | 0.00474187 | ||||
| Set Approval For... | 1882103 | 1227 days ago | IN | 0 GLMR | 0.00474187 | ||||
| Transfer From | 1861358 | 1230 days ago | IN | 0 GLMR | 0.00679004 | ||||
| Set Approval For... | 1858232 | 1230 days ago | IN | 0 GLMR | 0.00481256 | ||||
| Set Approval For... | 1858021 | 1230 days ago | IN | 0 GLMR | 0.00471851 | ||||
| Safe Mint | 1838772 | 1233 days ago | IN | 0 GLMR | 1.26886451 | ||||
| Safe Mint | 1838771 | 1233 days ago | IN | 0 GLMR | 1.26886451 | ||||
| Safe Mint | 1838770 | 1233 days ago | IN | 0 GLMR | 1.26886451 | ||||
| Safe Mint | 1838769 | 1233 days ago | IN | 0 GLMR | 1.26886574 | ||||
| Safe Mint | 1838768 | 1233 days ago | IN | 0 GLMR | 1.26886574 | ||||
| Safe Mint | 1838766 | 1233 days ago | IN | 0 GLMR | 1.26886574 | ||||
| Safe Mint | 1838763 | 1233 days ago | IN | 0 GLMR | 1.26886697 |
View more zero value Internal Transactions in Advanced View mode
Cross-Chain Transactions
Loading...
Loading
Contract Name:
BasicBronce
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/**
*Submitted for verification at moonbeam.moonscan.io on 2022-09-18
*/
// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Counters.sol
// OpenZeppelin Contracts v4.4.1 (utils/Counters.sol)
pragma solidity ^0.8.0;
/**
* @title Counters
* @author Matt Condon (@shrugs)
* @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
* of elements in a mapping, issuing ERC721 ids, or counting request ids.
*
* Include with `using Counters for Counters.Counter;`
*/
library Counters {
struct Counter {
// This variable should never be directly accessed by users of the library: interactions must be restricted to
// the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
// this feature: see https://github.com/ethereum/solidity/issues/4637
uint256 _value; // default: 0
}
function current(Counter storage counter) internal view returns (uint256) {
return counter._value;
}
function increment(Counter storage counter) internal {
unchecked {
counter._value += 1;
}
}
function decrement(Counter storage counter) internal {
uint256 value = counter._value;
require(value > 0, "Counter: decrement overflow");
unchecked {
counter._value = value - 1;
}
}
function reset(Counter storage counter) internal {
counter._value = 0;
}
}
// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Strings.sol
// OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol)
pragma solidity ^0.8.0;
/**
* @dev String operations.
*/
library Strings {
bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";
uint8 private constant _ADDRESS_LENGTH = 20;
/**
* @dev Converts a `uint256` to its ASCII `string` decimal representation.
*/
function toString(uint256 value) internal pure returns (string memory) {
// Inspired by OraclizeAPI's implementation - MIT licence
// https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol
if (value == 0) {
return "0";
}
uint256 temp = value;
uint256 digits;
while (temp != 0) {
digits++;
temp /= 10;
}
bytes memory buffer = new bytes(digits);
while (value != 0) {
digits -= 1;
buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
value /= 10;
}
return string(buffer);
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
*/
function toHexString(uint256 value) internal pure returns (string memory) {
if (value == 0) {
return "0x00";
}
uint256 temp = value;
uint256 length = 0;
while (temp != 0) {
length++;
temp >>= 8;
}
return toHexString(value, length);
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
*/
function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
bytes memory buffer = new bytes(2 * length + 2);
buffer[0] = "0";
buffer[1] = "x";
for (uint256 i = 2 * length + 1; i > 1; --i) {
buffer[i] = _HEX_SYMBOLS[value & 0xf];
value >>= 4;
}
require(value == 0, "Strings: hex length insufficient");
return string(buffer);
}
/**
* @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
*/
function toHexString(address addr) internal pure returns (string memory) {
return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
}
}
// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Context.sol
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)
pragma solidity ^0.8.0;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}
// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol
// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)
pragma solidity ^0.8.0;
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* By default, the owner account will be the one that deploys the contract. This
* can later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
constructor() {
_transferOwnership(_msgSender());
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
_checkOwner();
_;
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if the sender is not the owner.
*/
function _checkOwner() internal view virtual {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions anymore. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby removing any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}
// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Address.sol
// OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol)
pragma solidity ^0.8.1;
/**
* @dev Collection of functions related to the address type
*/
library Address {
/**
* @dev Returns true if `account` is a contract.
*
* [IMPORTANT]
* ====
* It is unsafe to assume that an address for which this function returns
* false is an externally-owned account (EOA) and not a contract.
*
* Among others, `isContract` will return false for the following
* types of addresses:
*
* - an externally-owned account
* - a contract in construction
* - an address where a contract will be created
* - an address where a contract lived, but was destroyed
* ====
*
* [IMPORTANT]
* ====
* You shouldn't rely on `isContract` to protect against flash loan attacks!
*
* Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
* like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
* constructor.
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize/address.code.length, which returns 0
// for contracts in construction, since the code is only stored at the end
// of the constructor execution.
return account.code.length > 0;
}
/**
* @dev Replacement for Solidity's `transfer`: sends `amount` wei to
* `recipient`, forwarding all available gas and reverting on errors.
*
* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
* of certain opcodes, possibly making contracts go over the 2300 gas limit
* imposed by `transfer`, making them unable to receive funds via
* `transfer`. {sendValue} removes this limitation.
*
* https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
*
* IMPORTANT: because control is transferred to `recipient`, care must be
* taken to not create reentrancy vulnerabilities. Consider using
* {ReentrancyGuard} or the
* https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
(bool success, ) = recipient.call{value: amount}("");
require(success, "Address: unable to send value, recipient may have reverted");
}
/**
* @dev Performs a Solidity function call using a low level `call`. A
* plain `call` is an unsafe replacement for a function call: use this
* function instead.
*
* If `target` reverts with a revert reason, it is bubbled up by this
* function (like regular Solidity function calls).
*
* Returns the raw returned data. To convert to the expected return value,
* use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
*
* Requirements:
*
* - `target` must be a contract.
* - calling `target` with `data` must not revert.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return 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 Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
return functionDelegateCall(target, data, "Address: low-level delegate call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
(bool success, bytes memory returndata) = target.delegatecall(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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/IERC721Receiver.sol
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)
pragma solidity ^0.8.0;
/**
* @title ERC721 token receiver interface
* @dev Interface for any contract that wants to support safeTransfers
* from ERC721 asset contracts.
*/
interface IERC721Receiver {
/**
* @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
* by `operator` from `from`, this function is called.
*
* It must return its Solidity selector to confirm the token transfer.
* If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
*
* The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.
*/
function onERC721Received(
address operator,
address from,
uint256 tokenId,
bytes calldata data
) external returns (bytes4);
}
// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/introspection/IERC165.sol
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC165 standard, as defined in the
* https://eips.ethereum.org/EIPS/eip-165[EIP].
*
* Implementers can declare support of contract interfaces, which can then be
* queried by others ({ERC165Checker}).
*
* For an implementation, see {ERC165}.
*/
interface IERC165 {
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
* to learn more about how these ids are created.
*
* This function call must use less than 30 000 gas.
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/interfaces/IERC2981.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 IERC2981 is IERC165 {
/**
* @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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/introspection/ERC165.sol
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)
pragma solidity ^0.8.0;
/**
* @dev Implementation of the {IERC165} interface.
*
* Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
* for the additional interface id that will be supported. For example:
*
* ```solidity
* function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
* return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
* }
* ```
*
* Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
*/
abstract contract ERC165 is IERC165 {
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return interfaceId == type(IERC165).interfaceId;
}
}
// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/common/ERC2981.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 ERC2981 is IERC2981, ERC165 {
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(IERC165, ERC165) returns (bool) {
return interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId);
}
/**
* @inheritdoc IERC2981
*/
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];
}
}
// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/IERC721.sol
// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol)
pragma solidity ^0.8.0;
/**
* @dev Required interface of an ERC721 compliant contract.
*/
interface IERC721 is IERC165 {
/**
* @dev Emitted when `tokenId` token is transferred from `from` to `to`.
*/
event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
*/
event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
*/
event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
/**
* @dev Returns the number of tokens in ``owner``'s account.
*/
function balanceOf(address owner) external view returns (uint256 balance);
/**
* @dev Returns the owner of the `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function ownerOf(uint256 tokenId) external view returns (address owner);
/**
* @dev Safely transfers `tokenId` token from `from` to `to`.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId,
bytes calldata data
) external;
/**
* @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
* are aware of the ERC721 protocol to prevent tokens from being forever locked.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId
) external;
/**
* @dev Transfers `tokenId` token from `from` to `to`.
*
* WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
*
* Emits a {Transfer} event.
*/
function transferFrom(
address from,
address to,
uint256 tokenId
) external;
/**
* @dev Gives permission to `to` to transfer `tokenId` token to another account.
* The approval is cleared when the token is transferred.
*
* Only a single account can be approved at a time, so approving the zero address clears previous approvals.
*
* Requirements:
*
* - The caller must own the token or be an approved operator.
* - `tokenId` must exist.
*
* Emits an {Approval} event.
*/
function approve(address to, uint256 tokenId) external;
/**
* @dev Approve or remove `operator` as an operator for the caller.
* Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
*
* Requirements:
*
* - The `operator` cannot be the caller.
*
* Emits an {ApprovalForAll} event.
*/
function setApprovalForAll(address operator, bool _approved) external;
/**
* @dev Returns the account approved for `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function getApproved(uint256 tokenId) external view returns (address operator);
/**
* @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
*
* See {setApprovalForAll}
*/
function isApprovedForAll(address owner, address operator) external view returns (bool);
}
// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/extensions/IERC721Enumerable.sol
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)
pragma solidity ^0.8.0;
/**
* @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
* @dev See https://eips.ethereum.org/EIPS/eip-721
*/
interface IERC721Enumerable is IERC721 {
/**
* @dev Returns the total amount of tokens stored by the contract.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns a token ID owned by `owner` at a given `index` of its token list.
* Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
*/
function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256);
/**
* @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
* Use along with {totalSupply} to enumerate all tokens.
*/
function tokenByIndex(uint256 index) external view returns (uint256);
}
// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/extensions/IERC721Metadata.sol
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)
pragma solidity ^0.8.0;
/**
* @title ERC-721 Non-Fungible Token Standard, optional metadata extension
* @dev See https://eips.ethereum.org/EIPS/eip-721
*/
interface IERC721Metadata is IERC721 {
/**
* @dev Returns the token collection name.
*/
function name() external view returns (string memory);
/**
* @dev Returns the token collection symbol.
*/
function symbol() external view returns (string memory);
/**
* @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
*/
function tokenURI(uint256 tokenId) external view returns (string memory);
}
// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/ERC721.sol
// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/ERC721.sol)
pragma solidity ^0.8.0;
/**
* @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
* the Metadata extension, but not including the Enumerable extension, which is available separately as
* {ERC721Enumerable}.
*/
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
using Address for address;
using Strings for uint256;
// Token name
string private _name;
// Token symbol
string private _symbol;
// Mapping from token ID to owner address
mapping(uint256 => address) private _owners;
// Mapping owner address to token count
mapping(address => uint256) private _balances;
// Mapping from token ID to approved address
mapping(uint256 => address) private _tokenApprovals;
// Mapping from owner to operator approvals
mapping(address => mapping(address => bool)) private _operatorApprovals;
/**
* @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
*/
constructor(string memory name_, string memory symbol_) {
_name = name_;
_symbol = symbol_;
}
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
return
interfaceId == type(IERC721).interfaceId ||
interfaceId == type(IERC721Metadata).interfaceId ||
super.supportsInterface(interfaceId);
}
/**
* @dev See {IERC721-balanceOf}.
*/
function balanceOf(address owner) public view virtual override returns (uint256) {
require(owner != address(0), "ERC721: address zero is not a valid owner");
return _balances[owner];
}
/**
* @dev See {IERC721-ownerOf}.
*/
function ownerOf(uint256 tokenId) public view virtual override returns (address) {
address owner = _owners[tokenId];
require(owner != address(0), "ERC721: invalid token ID");
return owner;
}
/**
* @dev See {IERC721Metadata-name}.
*/
function name() public view virtual override returns (string memory) {
return _name;
}
/**
* @dev See {IERC721Metadata-symbol}.
*/
function symbol() public view virtual override returns (string memory) {
return _symbol;
}
/**
* @dev See {IERC721Metadata-tokenURI}.
*/
function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
_requireMinted(tokenId);
string memory baseURI = _baseURI();
return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
}
/**
* @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
* token will be the concatenation of the `baseURI` and the `tokenId`. Empty
* by default, can be overridden in child contracts.
*/
function _baseURI() internal view virtual returns (string memory) {
return "";
}
/**
* @dev See {IERC721-approve}.
*/
function approve(address to, uint256 tokenId) public virtual override {
address owner = ERC721.ownerOf(tokenId);
require(to != owner, "ERC721: approval to current owner");
require(
_msgSender() == owner || isApprovedForAll(owner, _msgSender()),
"ERC721: approve caller is not token owner nor approved for all"
);
_approve(to, tokenId);
}
/**
* @dev See {IERC721-getApproved}.
*/
function getApproved(uint256 tokenId) public view virtual override returns (address) {
_requireMinted(tokenId);
return _tokenApprovals[tokenId];
}
/**
* @dev See {IERC721-setApprovalForAll}.
*/
function setApprovalForAll(address operator, bool approved) public virtual override {
_setApprovalForAll(_msgSender(), operator, approved);
}
/**
* @dev See {IERC721-isApprovedForAll}.
*/
function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
return _operatorApprovals[owner][operator];
}
/**
* @dev See {IERC721-transferFrom}.
*/
function transferFrom(
address from,
address to,
uint256 tokenId
) public virtual override {
//solhint-disable-next-line max-line-length
require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner nor approved");
_transfer(from, to, tokenId);
}
/**
* @dev See {IERC721-safeTransferFrom}.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId
) public virtual override {
safeTransferFrom(from, to, tokenId, "");
}
/**
* @dev See {IERC721-safeTransferFrom}.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId,
bytes memory data
) public virtual override {
require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner nor approved");
_safeTransfer(from, to, tokenId, data);
}
/**
* @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
* are aware of the ERC721 protocol to prevent tokens from being forever locked.
*
* `data` is additional data, it has no specified format and it is sent in call to `to`.
*
* This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
* implement alternative mechanisms to perform token transfer, such as signature-based.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function _safeTransfer(
address from,
address to,
uint256 tokenId,
bytes memory data
) internal virtual {
_transfer(from, to, tokenId);
require(_checkOnERC721Received(from, to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer");
}
/**
* @dev Returns whether `tokenId` exists.
*
* Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
*
* Tokens start existing when they are minted (`_mint`),
* and stop existing when they are burned (`_burn`).
*/
function _exists(uint256 tokenId) internal view virtual returns (bool) {
return _owners[tokenId] != address(0);
}
/**
* @dev Returns whether `spender` is allowed to manage `tokenId`.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
address owner = ERC721.ownerOf(tokenId);
return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender);
}
/**
* @dev Safely mints `tokenId` and transfers it to `to`.
*
* Requirements:
*
* - `tokenId` must not exist.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function _safeMint(address to, uint256 tokenId) internal virtual {
_safeMint(to, tokenId, "");
}
/**
* @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
* forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
*/
function _safeMint(
address to,
uint256 tokenId,
bytes memory data
) internal virtual {
_mint(to, tokenId);
require(
_checkOnERC721Received(address(0), to, tokenId, data),
"ERC721: transfer to non ERC721Receiver implementer"
);
}
/**
* @dev Mints `tokenId` and transfers it to `to`.
*
* WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
*
* Requirements:
*
* - `tokenId` must not exist.
* - `to` cannot be the zero address.
*
* Emits a {Transfer} event.
*/
function _mint(address to, uint256 tokenId) internal virtual {
require(to != address(0), "ERC721: mint to the zero address");
require(!_exists(tokenId), "ERC721: token already minted");
_beforeTokenTransfer(address(0), to, tokenId);
_balances[to] += 1;
_owners[tokenId] = to;
emit Transfer(address(0), to, tokenId);
_afterTokenTransfer(address(0), to, tokenId);
}
/**
* @dev Destroys `tokenId`.
* The approval is cleared when the token is burned.
*
* Requirements:
*
* - `tokenId` must exist.
*
* Emits a {Transfer} event.
*/
function _burn(uint256 tokenId) internal virtual {
address owner = ERC721.ownerOf(tokenId);
_beforeTokenTransfer(owner, address(0), tokenId);
// Clear approvals
delete _tokenApprovals[tokenId];
_balances[owner] -= 1;
delete _owners[tokenId];
emit Transfer(owner, address(0), tokenId);
_afterTokenTransfer(owner, address(0), tokenId);
}
/**
* @dev Transfers `tokenId` from `from` to `to`.
* As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
*
* Requirements:
*
* - `to` cannot be the zero address.
* - `tokenId` token must be owned by `from`.
*
* Emits a {Transfer} event.
*/
function _transfer(
address from,
address to,
uint256 tokenId
) internal virtual {
require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");
require(to != address(0), "ERC721: transfer to the zero address");
_beforeTokenTransfer(from, to, tokenId);
// Clear approvals from the previous owner
delete _tokenApprovals[tokenId];
_balances[from] -= 1;
_balances[to] += 1;
_owners[tokenId] = to;
emit Transfer(from, to, tokenId);
_afterTokenTransfer(from, to, tokenId);
}
/**
* @dev Approve `to` to operate on `tokenId`
*
* Emits an {Approval} event.
*/
function _approve(address to, uint256 tokenId) internal virtual {
_tokenApprovals[tokenId] = to;
emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
}
/**
* @dev Approve `operator` to operate on all of `owner` tokens
*
* Emits an {ApprovalForAll} event.
*/
function _setApprovalForAll(
address owner,
address operator,
bool approved
) internal virtual {
require(owner != operator, "ERC721: approve to caller");
_operatorApprovals[owner][operator] = approved;
emit ApprovalForAll(owner, operator, approved);
}
/**
* @dev Reverts if the `tokenId` has not been minted yet.
*/
function _requireMinted(uint256 tokenId) internal view virtual {
require(_exists(tokenId), "ERC721: invalid token ID");
}
/**
* @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
* The call is not executed if the target address is not a contract.
*
* @param from address representing the previous owner of the given token ID
* @param to target address that will receive the tokens
* @param tokenId uint256 ID of the token to be transferred
* @param data bytes optional data to send along with the call
* @return bool whether the call correctly returned the expected magic value
*/
function _checkOnERC721Received(
address from,
address to,
uint256 tokenId,
bytes memory data
) private returns (bool) {
if (to.isContract()) {
try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) {
return retval == IERC721Receiver.onERC721Received.selector;
} catch (bytes memory reason) {
if (reason.length == 0) {
revert("ERC721: transfer to non ERC721Receiver implementer");
} else {
/// @solidity memory-safe-assembly
assembly {
revert(add(32, reason), mload(reason))
}
}
}
} else {
return true;
}
}
/**
* @dev Hook that is called before any token transfer. This includes minting
* and burning.
*
* Calling conditions:
*
* - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
* transferred to `to`.
* - When `from` is zero, `tokenId` will be minted for `to`.
* - When `to` is zero, ``from``'s `tokenId` will be burned.
* - `from` and `to` are never both zero.
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _beforeTokenTransfer(
address from,
address to,
uint256 tokenId
) internal virtual {}
/**
* @dev Hook that is called after any transfer of tokens. This includes
* minting and burning.
*
* Calling conditions:
*
* - when `from` and `to` are both non-zero.
* - `from` and `to` are never both zero.
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _afterTokenTransfer(
address from,
address to,
uint256 tokenId
) internal virtual {}
}
// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/extensions/ERC721Enumerable.sol
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol)
pragma solidity ^0.8.0;
/**
* @dev This implements an optional extension of {ERC721} defined in the EIP that adds
* enumerability of all the token ids in the contract as well as all token ids owned by each
* account.
*/
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
// Mapping from owner to list of owned token IDs
mapping(address => mapping(uint256 => uint256)) private _ownedTokens;
// Mapping from token ID to index of the owner tokens list
mapping(uint256 => uint256) private _ownedTokensIndex;
// Array with all token ids, used for enumeration
uint256[] private _allTokens;
// Mapping from token id to position in the allTokens array
mapping(uint256 => uint256) private _allTokensIndex;
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) {
return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId);
}
/**
* @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
*/
function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
return _ownedTokens[owner][index];
}
/**
* @dev See {IERC721Enumerable-totalSupply}.
*/
function totalSupply() public view virtual override returns (uint256) {
return _allTokens.length;
}
/**
* @dev See {IERC721Enumerable-tokenByIndex}.
*/
function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
return _allTokens[index];
}
/**
* @dev Hook that is called before any token transfer. This includes minting
* and burning.
*
* Calling conditions:
*
* - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
* transferred to `to`.
* - When `from` is zero, `tokenId` will be minted for `to`.
* - When `to` is zero, ``from``'s `tokenId` will be burned.
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _beforeTokenTransfer(
address from,
address to,
uint256 tokenId
) internal virtual override {
super._beforeTokenTransfer(from, to, tokenId);
if (from == address(0)) {
_addTokenToAllTokensEnumeration(tokenId);
} else if (from != to) {
_removeTokenFromOwnerEnumeration(from, tokenId);
}
if (to == address(0)) {
_removeTokenFromAllTokensEnumeration(tokenId);
} else if (to != from) {
_addTokenToOwnerEnumeration(to, tokenId);
}
}
/**
* @dev Private function to add a token to this extension's ownership-tracking data structures.
* @param to address representing the new owner of the given token ID
* @param tokenId uint256 ID of the token to be added to the tokens list of the given address
*/
function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
uint256 length = ERC721.balanceOf(to);
_ownedTokens[to][length] = tokenId;
_ownedTokensIndex[tokenId] = length;
}
/**
* @dev Private function to add a token to this extension's token tracking data structures.
* @param tokenId uint256 ID of the token to be added to the tokens list
*/
function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
_allTokensIndex[tokenId] = _allTokens.length;
_allTokens.push(tokenId);
}
/**
* @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
* while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
* gas optimizations e.g. when performing a transfer operation (avoiding double writes).
* This has O(1) time complexity, but alters the order of the _ownedTokens array.
* @param from address representing the previous owner of the given token ID
* @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
*/
function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
// To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
// then delete the last slot (swap and pop).
uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
uint256 tokenIndex = _ownedTokensIndex[tokenId];
// When the token to delete is the last token, the swap operation is unnecessary
if (tokenIndex != lastTokenIndex) {
uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];
_ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
_ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
}
// This also deletes the contents at the last position of the array
delete _ownedTokensIndex[tokenId];
delete _ownedTokens[from][lastTokenIndex];
}
/**
* @dev Private function to remove a token from this extension's token tracking data structures.
* This has O(1) time complexity, but alters the order of the _allTokens array.
* @param tokenId uint256 ID of the token to be removed from the tokens list
*/
function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
// To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
// then delete the last slot (swap and pop).
uint256 lastTokenIndex = _allTokens.length - 1;
uint256 tokenIndex = _allTokensIndex[tokenId];
// When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
// rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
// an 'if' statement (like in _removeTokenFromOwnerEnumeration)
uint256 lastTokenId = _allTokens[lastTokenIndex];
_allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
_allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
// This also deletes the contents at the last position of the array
delete _allTokensIndex[tokenId];
_allTokens.pop();
}
}
// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/extensions/ERC721URIStorage.sol
// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/extensions/ERC721URIStorage.sol)
pragma solidity ^0.8.0;
/**
* @dev ERC721 token with storage based token URI management.
*/
abstract contract ERC721URIStorage is ERC721 {
using Strings for uint256;
// Optional mapping for token URIs
mapping(uint256 => string) private _tokenURIs;
/**
* @dev See {IERC721Metadata-tokenURI}.
*/
function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
_requireMinted(tokenId);
string memory _tokenURI = _tokenURIs[tokenId];
string memory base = _baseURI();
// If there is no base URI, return the token URI.
if (bytes(base).length == 0) {
return _tokenURI;
}
// If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked).
if (bytes(_tokenURI).length > 0) {
return string(abi.encodePacked(base, _tokenURI));
}
return super.tokenURI(tokenId);
}
/**
* @dev Sets `_tokenURI` as the tokenURI of `tokenId`.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {
require(_exists(tokenId), "ERC721URIStorage: URI set of nonexistent token");
_tokenURIs[tokenId] = _tokenURI;
}
/**
* @dev See {ERC721-_burn}. This override additionally checks to see if a
* token-specific URI was set for the token, and if so, it deletes the token URI from
* the storage mapping.
*/
function _burn(uint256 tokenId) internal virtual override {
super._burn(tokenId);
if (bytes(_tokenURIs[tokenId]).length != 0) {
delete _tokenURIs[tokenId];
}
}
}
// File: contracts/BasicBronce.sol
pragma solidity ^0.8.0;
contract BasicBronce is ERC721URIStorage, ERC721Enumerable, ERC2981, Ownable
{
using Counters for Counters.Counter;
Counters.Counter private _tokenIdCounter;
uint256 MAX_SUPPLY = 25000;
//string public contractURI;
address blacksmith;
bool contractStatus;
constructor(uint96 _royaltyFeesInBips, address artist) ERC721("Cookie Lemon Basic Bronce", "LMNBB")
{
setRoyaltyInfo(artist, _royaltyFeesInBips);
contractStatus = true;
}
function safeMint(address to, uint16 cuantos, string calldata contractURI, uint16 number) public onlyOwner
{
require(contractStatus == true , "Contract Disabled");
uint256 newItemId = _tokenIdCounter.current();
require((newItemId+number) <= MAX_SUPPLY, "not enough supply left");
for(uint i=0; i<cuantos ; i++)
{
require(newItemId <= MAX_SUPPLY, "I'm sorry we reached the cap");
_tokenIdCounter.increment();
_safeMint(to, newItemId);
_setTokenURI(newItemId, contractURI);
newItemId = _tokenIdCounter.current();
}
}
function blackSmithMint(address to, string calldata contractURI) public returns(string memory)
{
require(contractStatus == true , "Contract Disabled");
require(msg.sender == blacksmith , "NOT ALLOWED");
uint256 newItemId = _tokenIdCounter.current();
require(newItemId <= MAX_SUPPLY, "not enough supply left");
_tokenIdCounter.increment();
_safeMint(to, newItemId);
_setTokenURI(newItemId, contractURI);
newItemId = _tokenIdCounter.current();
return "sended";
}
function setBlackSmith(address _blacksmith) public onlyOwner returns(string memory)
{
blacksmith = _blacksmith;
return "Blacksmith addres updated";
}
function checkBlackSmith() public view returns(address)
{
return blacksmith;
}
function getContractStatus() public view returns(bool)
{
return contractStatus;
}
function switchContractStatus() public onlyOwner returns(string memory)
{
if(contractStatus)
{
contractStatus = false;
return "contract status disabled";
}
else
{
contractStatus = true;
return "contract status enabled";
}
}
function supplyLeft() public view onlyOwner returns(uint256)
{
return MAX_SUPPLY - _tokenIdCounter.current();
}
function setRoyaltyInfo(address _receiver, uint96 _royaltyFeesInBips) public onlyOwner {
_setDefaultRoyalty(_receiver, _royaltyFeesInBips);
}
function currentID() public view onlyOwner returns(uint256)
{
return _tokenIdCounter.current();
}
function _beforeTokenTransfer(address from, address to, uint256 tokenId)
internal
override(ERC721, ERC721Enumerable)
{
super._beforeTokenTransfer(from, to, tokenId);
}
function _burn(uint256 tokenId) internal override(ERC721, ERC721URIStorage) {
super._burn(tokenId);
}
function tokenURI(uint256 tokenId)
public
view
override(ERC721, ERC721URIStorage)
returns (string memory)
{
return super.tokenURI(tokenId);
}
function supportsInterface(bytes4 interfaceId)
public
view
override(ERC721, ERC721Enumerable, ERC2981)
returns (bool)
{
return super.supportsInterface(interfaceId);
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"uint96","name":"_royaltyFeesInBips","type":"uint96"},{"internalType":"address","name":"artist","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"string","name":"contractURI","type":"string"}],"name":"blackSmithMint","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"checkBlackSmith","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getContractStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint16","name":"cuantos","type":"uint16"},{"internalType":"string","name":"contractURI","type":"string"},{"internalType":"uint16","name":"number","type":"uint16"}],"name":"safeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_blacksmith","type":"address"}],"name":"setBlackSmith","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"uint96","name":"_royaltyFeesInBips","type":"uint96"}],"name":"setRoyaltyInfo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"supplyLeft","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":"switchContractStatus","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
60806040526161a8600f553480156200001757600080fd5b5060405162004c5938038062004c5983398181016040528101906200003d91906200056d565b6040518060400160405280601981526020017f436f6f6b6965204c656d6f6e2042617369632042726f6e6365000000000000008152506040518060400160405280600581526020017f4c4d4e42420000000000000000000000000000000000000000000000000000008152508160009080519060200190620000c19291906200048f565b508060019080519060200190620000da9291906200048f565b505050620000fd620000f16200013260201b60201c565b6200013a60201b60201c565b6200010f81836200020060201b60201c565b6001601060146101000a81548160ff02191690831515021790555050506200082b565b600033905090565b6000600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002106200022660201b60201c565b620002228282620002b760201b60201c565b5050565b620002366200013260201b60201c565b73ffffffffffffffffffffffffffffffffffffffff166200025c6200045b60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620002b5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002ac9062000629565b60405180910390fd5b565b620002c76200048560201b60201c565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff16111562000328576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200031f906200064b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156200039b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000392906200066d565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250600b60008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b6000600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000612710905090565b8280546200049d90620006ec565b90600052602060002090601f016020900481019282620004c157600085556200050d565b82601f10620004dc57805160ff19168380011785556200050d565b828001600101855582156200050d579182015b828111156200050c578251825591602001919060010190620004ef565b5b5090506200051c919062000520565b5090565b5b808211156200053b57600081600090555060010162000521565b5090565b6000815190506200055081620007f7565b92915050565b600081519050620005678162000811565b92915050565b6000806040838503121562000587576200058662000751565b5b6000620005978582860162000556565b9250506020620005aa858286016200053f565b9150509250929050565b6000620005c36020836200068f565b9150620005d08262000756565b602082019050919050565b6000620005ea602a836200068f565b9150620005f7826200077f565b604082019050919050565b6000620006116019836200068f565b91506200061e82620007ce565b602082019050919050565b600060208201905081810360008301526200064481620005b4565b9050919050565b600060208201905081810360008301526200066681620005db565b9050919050565b60006020820190508181036000830152620006888162000602565b9050919050565b600082825260208201905092915050565b6000620006ad82620006b4565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006bffffffffffffffffffffffff82169050919050565b600060028204905060018216806200070557607f821691505b602082108114156200071c576200071b62000722565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600080fd5b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b6200080281620006a0565b81146200080e57600080fd5b50565b6200081c81620006d4565b81146200082857600080fd5b50565b61441e806200083b6000396000f3fe608060405234801561001057600080fd5b50600436106101cf5760003560e01c806370a0823111610104578063c032846b116100a2578063e985e9c511610071578063e985e9c514610557578063f100a05e14610587578063f2fde38b146105a3578063fdcf9d07146105bf576101cf565b8063c032846b146104bb578063c87b56dd146104d9578063c979f13214610509578063d117396414610527576101cf565b806395d89b41116100de57806395d89b41146104475780639a3bba9e14610465578063a22cb46514610483578063b88d4fde1461049f576101cf565b806370a08231146103ef578063715018a61461041f5780638da5cb5b14610429576101cf565b806323b872dd1161017157806342842e0e1161014b57806342842e0e146103435780634f6ccce71461035f57806360a18c881461038f5780636352211e146103bf576101cf565b806323b872dd146102c65780632a55205a146102e25780632f745c5914610313576101cf565b8063081812fc116101ad578063081812fc1461023e578063095ea7b31461026e57806318160ddd1461028a5780631c75cfb4146102a8576101cf565b806301ffc9a7146101d457806302fa7c471461020457806306fdde0314610220575b600080fd5b6101ee60048036038101906101e991906130fb565b6105dd565b6040516101fb9190613648565b60405180910390f35b61021e600480360381019061021991906130bb565b6105ef565b005b610228610605565b6040516102359190613663565b60405180910390f35b61025860048036038101906102539190613155565b610697565b60405161026591906135b8565b60405180910390f35b6102886004803603810190610283919061307b565b6106dd565b005b6102926107f5565b60405161029f9190613945565b60405180910390f35b6102b0610802565b6040516102bd9190613945565b60405180910390f35b6102e060048036038101906102db9190612e7d565b61081b565b005b6102fc60048036038101906102f79190613182565b61087b565b60405161030a92919061361f565b60405180910390f35b61032d6004803603810190610328919061307b565b610a66565b60405161033a9190613945565b60405180910390f35b61035d60048036038101906103589190612e7d565b610b0b565b005b61037960048036038101906103749190613155565b610b2b565b6040516103869190613945565b60405180910390f35b6103a960048036038101906103a49190612f93565b610b9c565b6040516103b69190613663565b60405180910390f35b6103d960048036038101906103d49190613155565b610d85565b6040516103e691906135b8565b60405180910390f35b61040960048036038101906104049190612e10565b610e37565b6040516104169190613945565b60405180910390f35b610427610eef565b005b610431610f03565b60405161043e91906135b8565b60405180910390f35b61044f610f2d565b60405161045c9190613663565b60405180910390f35b61046d610fbf565b60405161047a9190613663565b60405180910390f35b61049d60048036038101906104989190612f53565b61108d565b005b6104b960048036038101906104b49190612ed0565b6110a3565b005b6104c3611105565b6040516104d09190613648565b60405180910390f35b6104f360048036038101906104ee9190613155565b61111c565b6040516105009190613663565b60405180910390f35b61051161112e565b60405161051e91906135b8565b60405180910390f35b610541600480360381019061053c9190612e10565b611158565b60405161054e9190613663565b60405180910390f35b610571600480360381019061056c9190612e3d565b6111e0565b60405161057e9190613648565b60405180910390f35b6105a1600480360381019061059c9190612ff3565b611274565b005b6105bd60048036038101906105b89190612e10565b611412565b005b6105c7611496565b6040516105d49190613945565b60405180910390f35b60006105e8826114bc565b9050919050565b6105f7611536565b61060182826115b4565b5050565b60606000805461061490613bea565b80601f016020809104026020016040519081016040528092919081815260200182805461064090613bea565b801561068d5780601f106106625761010080835404028352916020019161068d565b820191906000526020600020905b81548152906001019060200180831161067057829003601f168201915b5050505050905090565b60006106a28261174a565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006106e882610d85565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610759576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161075090613885565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610778611795565b73ffffffffffffffffffffffffffffffffffffffff1614806107a757506107a6816107a1611795565b6111e0565b5b6107e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107dd90613805565b60405180910390fd5b6107f0838361179d565b505050565b6000600980549050905090565b600061080c611536565b610816600e611856565b905090565b61082c610826611795565b82611864565b61086b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161086290613905565b60405180910390fd5b6108768383836118f9565b505050565b6000806000600c60008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161415610a1157600b6040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b6000610a1b611b8b565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff1686610a479190613a80565b610a519190613a4f565b90508160000151819350935050509250929050565b6000610a7183610e37565b8210610ab2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aa9906136c5565b60405180910390fd5b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610b26838383604051806020016040528060008152506110a3565b505050565b6000610b356107f5565b8210610b76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6d906138a5565b60405180910390fd5b60098281548110610b8a57610b89613d83565b5b90600052602060002001549050919050565b606060011515601060149054906101000a900460ff16151514610bf4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610beb90613685565b60405180910390fd5b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610c84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7b906138c5565b60405180910390fd5b6000610c90600e611856565b9050600f54811115610cd7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cce906136a5565b60405180910390fd5b610ce1600e611b95565b610ceb8582611bab565b610d398185858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611bc9565b610d43600e611856565b90506040518060400160405280600681526020017f73656e64656400000000000000000000000000000000000000000000000000008152509150509392505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610e2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2590613865565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610ea8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9f906137a5565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610ef7611536565b610f016000611c3d565b565b6000600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610f3c90613bea565b80601f0160208091040260200160405190810160405280929190818152602001828054610f6890613bea565b8015610fb55780601f10610f8a57610100808354040283529160200191610fb5565b820191906000526020600020905b815481529060010190602001808311610f9857829003601f168201915b5050505050905090565b6060610fc9611536565b601060149054906101000a900460ff1615611036576000601060146101000a81548160ff0219169083151502179055506040518060400160405280601881526020017f636f6e7472616374207374617475732064697361626c65640000000000000000815250905061108a565b6001601060146101000a81548160ff0219169083151502179055506040518060400160405280601781526020017f636f6e74726163742073746174757320656e61626c656400000000000000000081525090505b90565b61109f611098611795565b8383611d03565b5050565b6110b46110ae611795565b83611864565b6110f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ea90613905565b60405180910390fd5b6110ff84848484611e70565b50505050565b6000601060149054906101000a900460ff16905090565b606061112782611ecc565b9050919050565b6000601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060611162611536565b81601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040518060400160405280601981526020017f426c61636b736d697468206164647265732075706461746564000000000000008152509050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61127c611536565b60011515601060149054906101000a900460ff161515146112d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c990613685565b60405180910390fd5b60006112de600e611856565b9050600f548261ffff16826112f391906139f9565b1115611334576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132b906136a5565b60405180910390fd5b60005b8561ffff1681101561140957600f54821115611388576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137f906137e5565b60405180910390fd5b611392600e611b95565b61139c8783611bab565b6113ea8286868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611bc9565b6113f4600e611856565b9150808061140190613c4d565b915050611337565b50505050505050565b61141a611536565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561148a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148190613705565b60405180910390fd5b61149381611c3d565b50565b60006114a0611536565b6114aa600e611856565b600f546114b79190613ada565b905090565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061152f575061152e82611fdf565b5b9050919050565b61153e611795565b73ffffffffffffffffffffffffffffffffffffffff1661155c610f03565b73ffffffffffffffffffffffffffffffffffffffff16146115b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a990613845565b60405180910390fd5b565b6115bc611b8b565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff16111561161a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611611906138e5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561168a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168190613925565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250600b60008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b61175381612059565b611792576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178990613865565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661181083610d85565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b60008061187083610d85565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806118b257506118b181856111e0565b5b806118f057508373ffffffffffffffffffffffffffffffffffffffff166118d884610697565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661191982610d85565b73ffffffffffffffffffffffffffffffffffffffff161461196f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196690613725565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156119df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119d690613765565b60405180910390fd5b6119ea8383836120c5565b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611a709190613ada565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ac791906139f9565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611b868383836120d5565b505050565b6000612710905090565b6001816000016000828254019250508190555050565b611bc58282604051806020016040528060008152506120da565b5050565b611bd282612059565b611c11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c08906137c5565b60405180910390fd5b80600660008481526020019081526020016000209080519060200190611c38929190612c14565b505050565b6000600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611d72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6990613785565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611e639190613648565b60405180910390a3505050565b611e7b8484846118f9565b611e8784848484612135565b611ec6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ebd906136e5565b60405180910390fd5b50505050565b6060611ed78261174a565b6000600660008481526020019081526020016000208054611ef790613bea565b80601f0160208091040260200160405190810160405280929190818152602001828054611f2390613bea565b8015611f705780601f10611f4557610100808354040283529160200191611f70565b820191906000526020600020905b815481529060010190602001808311611f5357829003601f168201915b505050505090506000611f816122cc565b9050600081511415611f97578192505050611fda565b600082511115611fcc578082604051602001611fb4929190613594565b60405160208183030381529060405292505050611fda565b611fd5846122e3565b925050505b919050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061205257506120518261234b565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6120d083838361242d565b505050565b505050565b6120e48383612541565b6120f16000848484612135565b612130576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612127906136e5565b60405180910390fd5b505050565b60006121568473ffffffffffffffffffffffffffffffffffffffff1661271b565b156122bf578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261217f611795565b8786866040518563ffffffff1660e01b81526004016121a194939291906135d3565b602060405180830381600087803b1580156121bb57600080fd5b505af19250505080156121ec57506040513d601f19601f820116820180604052508101906121e99190613128565b60015b61226f573d806000811461221c576040519150601f19603f3d011682016040523d82523d6000602084013e612221565b606091505b50600081511415612267576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161225e906136e5565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506122c4565b600190505b949350505050565b606060405180602001604052806000815250905090565b60606122ee8261174a565b60006122f86122cc565b905060008151116123185760405180602001604052806000815250612343565b806123228461273e565b604051602001612333929190613594565b6040516020818303038152906040525b915050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061241657507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061242657506124258261289f565b5b9050919050565b612438838383612909565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561247b576124768161290e565b6124ba565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146124b9576124b88382612957565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156124fd576124f881612ac4565b61253c565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461253b5761253a8282612b95565b5b5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156125b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125a890613825565b60405180910390fd5b6125ba81612059565b156125fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125f190613745565b60405180910390fd5b612606600083836120c5565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461265691906139f9565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612717600083836120d5565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60606000821415612786576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061289a565b600082905060005b600082146127b85780806127a190613c4d565b915050600a826127b19190613a4f565b915061278e565b60008167ffffffffffffffff8111156127d4576127d3613db2565b5b6040519080825280601f01601f1916602001820160405280156128065781602001600182028036833780820191505090505b5090505b600085146128935760018261281f9190613ada565b9150600a8561282e9190613c96565b603061283a91906139f9565b60f81b8183815181106128505761284f613d83565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561288c9190613a4f565b945061280a565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b505050565b600980549050600a600083815260200190815260200160002081905550600981908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161296484610e37565b61296e9190613ada565b9050600060086000848152602001908152602001600020549050818114612a53576000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816008600083815260200190815260200160002081905550505b6008600084815260200190815260200160002060009055600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600980549050612ad89190613ada565b90506000600a6000848152602001908152602001600020549050600060098381548110612b0857612b07613d83565b5b906000526020600020015490508060098381548110612b2a57612b29613d83565b5b906000526020600020018190555081600a600083815260200190815260200160002081905550600a6000858152602001908152602001600020600090556009805480612b7957612b78613d54565b5b6001900381819060005260206000200160009055905550505050565b6000612ba083610e37565b905081600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806008600084815260200190815260200160002081905550505050565b828054612c2090613bea565b90600052602060002090601f016020900481019282612c425760008555612c89565b82601f10612c5b57805160ff1916838001178555612c89565b82800160010185558215612c89579182015b82811115612c88578251825591602001919060010190612c6d565b5b509050612c969190612c9a565b5090565b5b80821115612cb3576000816000905550600101612c9b565b5090565b6000612cca612cc584613985565b613960565b905082815260208101848484011115612ce657612ce5613df0565b5b612cf1848285613ba8565b509392505050565b600081359050612d088161435e565b92915050565b600081359050612d1d81614375565b92915050565b600081359050612d328161438c565b92915050565b600081519050612d478161438c565b92915050565b600082601f830112612d6257612d61613de6565b5b8135612d72848260208601612cb7565b91505092915050565b60008083601f840112612d9157612d90613de6565b5b8235905067ffffffffffffffff811115612dae57612dad613de1565b5b602083019150836001820283011115612dca57612dc9613deb565b5b9250929050565b600081359050612de0816143a3565b92915050565b600081359050612df5816143ba565b92915050565b600081359050612e0a816143d1565b92915050565b600060208284031215612e2657612e25613dfa565b5b6000612e3484828501612cf9565b91505092915050565b60008060408385031215612e5457612e53613dfa565b5b6000612e6285828601612cf9565b9250506020612e7385828601612cf9565b9150509250929050565b600080600060608486031215612e9657612e95613dfa565b5b6000612ea486828701612cf9565b9350506020612eb586828701612cf9565b9250506040612ec686828701612de6565b9150509250925092565b60008060008060808587031215612eea57612ee9613dfa565b5b6000612ef887828801612cf9565b9450506020612f0987828801612cf9565b9350506040612f1a87828801612de6565b925050606085013567ffffffffffffffff811115612f3b57612f3a613df5565b5b612f4787828801612d4d565b91505092959194509250565b60008060408385031215612f6a57612f69613dfa565b5b6000612f7885828601612cf9565b9250506020612f8985828601612d0e565b9150509250929050565b600080600060408486031215612fac57612fab613dfa565b5b6000612fba86828701612cf9565b935050602084013567ffffffffffffffff811115612fdb57612fda613df5565b5b612fe786828701612d7b565b92509250509250925092565b60008060008060006080868803121561300f5761300e613dfa565b5b600061301d88828901612cf9565b955050602061302e88828901612dd1565b945050604086013567ffffffffffffffff81111561304f5761304e613df5565b5b61305b88828901612d7b565b9350935050606061306e88828901612dd1565b9150509295509295909350565b6000806040838503121561309257613091613dfa565b5b60006130a085828601612cf9565b92505060206130b185828601612de6565b9150509250929050565b600080604083850312156130d2576130d1613dfa565b5b60006130e085828601612cf9565b92505060206130f185828601612dfb565b9150509250929050565b60006020828403121561311157613110613dfa565b5b600061311f84828501612d23565b91505092915050565b60006020828403121561313e5761313d613dfa565b5b600061314c84828501612d38565b91505092915050565b60006020828403121561316b5761316a613dfa565b5b600061317984828501612de6565b91505092915050565b6000806040838503121561319957613198613dfa565b5b60006131a785828601612de6565b92505060206131b885828601612de6565b9150509250929050565b6131cb81613b0e565b82525050565b6131da81613b20565b82525050565b60006131eb826139b6565b6131f581856139cc565b9350613205818560208601613bb7565b61320e81613dff565b840191505092915050565b6000613224826139c1565b61322e81856139dd565b935061323e818560208601613bb7565b61324781613dff565b840191505092915050565b600061325d826139c1565b61326781856139ee565b9350613277818560208601613bb7565b80840191505092915050565b60006132906011836139dd565b915061329b82613e10565b602082019050919050565b60006132b36016836139dd565b91506132be82613e39565b602082019050919050565b60006132d6602b836139dd565b91506132e182613e62565b604082019050919050565b60006132f96032836139dd565b915061330482613eb1565b604082019050919050565b600061331c6026836139dd565b915061332782613f00565b604082019050919050565b600061333f6025836139dd565b915061334a82613f4f565b604082019050919050565b6000613362601c836139dd565b915061336d82613f9e565b602082019050919050565b60006133856024836139dd565b915061339082613fc7565b604082019050919050565b60006133a86019836139dd565b91506133b382614016565b602082019050919050565b60006133cb6029836139dd565b91506133d68261403f565b604082019050919050565b60006133ee602e836139dd565b91506133f98261408e565b604082019050919050565b6000613411601c836139dd565b915061341c826140dd565b602082019050919050565b6000613434603e836139dd565b915061343f82614106565b604082019050919050565b60006134576020836139dd565b915061346282614155565b602082019050919050565b600061347a6020836139dd565b91506134858261417e565b602082019050919050565b600061349d6018836139dd565b91506134a8826141a7565b602082019050919050565b60006134c06021836139dd565b91506134cb826141d0565b604082019050919050565b60006134e3602c836139dd565b91506134ee8261421f565b604082019050919050565b6000613506600b836139dd565b91506135118261426e565b602082019050919050565b6000613529602a836139dd565b915061353482614297565b604082019050919050565b600061354c602e836139dd565b9150613557826142e6565b604082019050919050565b600061356f6019836139dd565b915061357a82614335565b602082019050919050565b61358e81613b86565b82525050565b60006135a08285613252565b91506135ac8284613252565b91508190509392505050565b60006020820190506135cd60008301846131c2565b92915050565b60006080820190506135e860008301876131c2565b6135f560208301866131c2565b6136026040830185613585565b818103606083015261361481846131e0565b905095945050505050565b600060408201905061363460008301856131c2565b6136416020830184613585565b9392505050565b600060208201905061365d60008301846131d1565b92915050565b6000602082019050818103600083015261367d8184613219565b905092915050565b6000602082019050818103600083015261369e81613283565b9050919050565b600060208201905081810360008301526136be816132a6565b9050919050565b600060208201905081810360008301526136de816132c9565b9050919050565b600060208201905081810360008301526136fe816132ec565b9050919050565b6000602082019050818103600083015261371e8161330f565b9050919050565b6000602082019050818103600083015261373e81613332565b9050919050565b6000602082019050818103600083015261375e81613355565b9050919050565b6000602082019050818103600083015261377e81613378565b9050919050565b6000602082019050818103600083015261379e8161339b565b9050919050565b600060208201905081810360008301526137be816133be565b9050919050565b600060208201905081810360008301526137de816133e1565b9050919050565b600060208201905081810360008301526137fe81613404565b9050919050565b6000602082019050818103600083015261381e81613427565b9050919050565b6000602082019050818103600083015261383e8161344a565b9050919050565b6000602082019050818103600083015261385e8161346d565b9050919050565b6000602082019050818103600083015261387e81613490565b9050919050565b6000602082019050818103600083015261389e816134b3565b9050919050565b600060208201905081810360008301526138be816134d6565b9050919050565b600060208201905081810360008301526138de816134f9565b9050919050565b600060208201905081810360008301526138fe8161351c565b9050919050565b6000602082019050818103600083015261391e8161353f565b9050919050565b6000602082019050818103600083015261393e81613562565b9050919050565b600060208201905061395a6000830184613585565b92915050565b600061396a61397b565b90506139768282613c1c565b919050565b6000604051905090565b600067ffffffffffffffff8211156139a05761399f613db2565b5b6139a982613dff565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613a0482613b86565b9150613a0f83613b86565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613a4457613a43613cc7565b5b828201905092915050565b6000613a5a82613b86565b9150613a6583613b86565b925082613a7557613a74613cf6565b5b828204905092915050565b6000613a8b82613b86565b9150613a9683613b86565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613acf57613ace613cc7565b5b828202905092915050565b6000613ae582613b86565b9150613af083613b86565b925082821015613b0357613b02613cc7565b5b828203905092915050565b6000613b1982613b66565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006bffffffffffffffffffffffff82169050919050565b82818337600083830152505050565b60005b83811015613bd5578082015181840152602081019050613bba565b83811115613be4576000848401525b50505050565b60006002820490506001821680613c0257607f821691505b60208210811415613c1657613c15613d25565b5b50919050565b613c2582613dff565b810181811067ffffffffffffffff82111715613c4457613c43613db2565b5b80604052505050565b6000613c5882613b86565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613c8b57613c8a613cc7565b5b600182019050919050565b6000613ca182613b86565b9150613cac83613b86565b925082613cbc57613cbb613cf6565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f436f6e74726163742044697361626c6564000000000000000000000000000000600082015250565b7f6e6f7420656e6f75676820737570706c79206c65667400000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008201527f6578697374656e7420746f6b656e000000000000000000000000000000000000602082015250565b7f49276d20736f7272792077652072656163686564207468652063617000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4e4f5420414c4c4f574544000000000000000000000000000000000000000000600082015250565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b61436781613b0e565b811461437257600080fd5b50565b61437e81613b20565b811461438957600080fd5b50565b61439581613b2c565b81146143a057600080fd5b50565b6143ac81613b58565b81146143b757600080fd5b50565b6143c381613b86565b81146143ce57600080fd5b50565b6143da81613b90565b81146143e557600080fd5b5056fea2646970667358221220f9170e3bf23905cc28088649c1d6eb6085baff965a3f7a9f0c707e1a38ffa62e64736f6c6343000807003300000000000000000000000000000000000000000000000000000000000001f4000000000000000000000000e60970361d4ed85e1641642c2d323ec8129b6b9c
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101cf5760003560e01c806370a0823111610104578063c032846b116100a2578063e985e9c511610071578063e985e9c514610557578063f100a05e14610587578063f2fde38b146105a3578063fdcf9d07146105bf576101cf565b8063c032846b146104bb578063c87b56dd146104d9578063c979f13214610509578063d117396414610527576101cf565b806395d89b41116100de57806395d89b41146104475780639a3bba9e14610465578063a22cb46514610483578063b88d4fde1461049f576101cf565b806370a08231146103ef578063715018a61461041f5780638da5cb5b14610429576101cf565b806323b872dd1161017157806342842e0e1161014b57806342842e0e146103435780634f6ccce71461035f57806360a18c881461038f5780636352211e146103bf576101cf565b806323b872dd146102c65780632a55205a146102e25780632f745c5914610313576101cf565b8063081812fc116101ad578063081812fc1461023e578063095ea7b31461026e57806318160ddd1461028a5780631c75cfb4146102a8576101cf565b806301ffc9a7146101d457806302fa7c471461020457806306fdde0314610220575b600080fd5b6101ee60048036038101906101e991906130fb565b6105dd565b6040516101fb9190613648565b60405180910390f35b61021e600480360381019061021991906130bb565b6105ef565b005b610228610605565b6040516102359190613663565b60405180910390f35b61025860048036038101906102539190613155565b610697565b60405161026591906135b8565b60405180910390f35b6102886004803603810190610283919061307b565b6106dd565b005b6102926107f5565b60405161029f9190613945565b60405180910390f35b6102b0610802565b6040516102bd9190613945565b60405180910390f35b6102e060048036038101906102db9190612e7d565b61081b565b005b6102fc60048036038101906102f79190613182565b61087b565b60405161030a92919061361f565b60405180910390f35b61032d6004803603810190610328919061307b565b610a66565b60405161033a9190613945565b60405180910390f35b61035d60048036038101906103589190612e7d565b610b0b565b005b61037960048036038101906103749190613155565b610b2b565b6040516103869190613945565b60405180910390f35b6103a960048036038101906103a49190612f93565b610b9c565b6040516103b69190613663565b60405180910390f35b6103d960048036038101906103d49190613155565b610d85565b6040516103e691906135b8565b60405180910390f35b61040960048036038101906104049190612e10565b610e37565b6040516104169190613945565b60405180910390f35b610427610eef565b005b610431610f03565b60405161043e91906135b8565b60405180910390f35b61044f610f2d565b60405161045c9190613663565b60405180910390f35b61046d610fbf565b60405161047a9190613663565b60405180910390f35b61049d60048036038101906104989190612f53565b61108d565b005b6104b960048036038101906104b49190612ed0565b6110a3565b005b6104c3611105565b6040516104d09190613648565b60405180910390f35b6104f360048036038101906104ee9190613155565b61111c565b6040516105009190613663565b60405180910390f35b61051161112e565b60405161051e91906135b8565b60405180910390f35b610541600480360381019061053c9190612e10565b611158565b60405161054e9190613663565b60405180910390f35b610571600480360381019061056c9190612e3d565b6111e0565b60405161057e9190613648565b60405180910390f35b6105a1600480360381019061059c9190612ff3565b611274565b005b6105bd60048036038101906105b89190612e10565b611412565b005b6105c7611496565b6040516105d49190613945565b60405180910390f35b60006105e8826114bc565b9050919050565b6105f7611536565b61060182826115b4565b5050565b60606000805461061490613bea565b80601f016020809104026020016040519081016040528092919081815260200182805461064090613bea565b801561068d5780601f106106625761010080835404028352916020019161068d565b820191906000526020600020905b81548152906001019060200180831161067057829003601f168201915b5050505050905090565b60006106a28261174a565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006106e882610d85565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610759576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161075090613885565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610778611795565b73ffffffffffffffffffffffffffffffffffffffff1614806107a757506107a6816107a1611795565b6111e0565b5b6107e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107dd90613805565b60405180910390fd5b6107f0838361179d565b505050565b6000600980549050905090565b600061080c611536565b610816600e611856565b905090565b61082c610826611795565b82611864565b61086b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161086290613905565b60405180910390fd5b6108768383836118f9565b505050565b6000806000600c60008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161415610a1157600b6040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b6000610a1b611b8b565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff1686610a479190613a80565b610a519190613a4f565b90508160000151819350935050509250929050565b6000610a7183610e37565b8210610ab2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aa9906136c5565b60405180910390fd5b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610b26838383604051806020016040528060008152506110a3565b505050565b6000610b356107f5565b8210610b76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6d906138a5565b60405180910390fd5b60098281548110610b8a57610b89613d83565b5b90600052602060002001549050919050565b606060011515601060149054906101000a900460ff16151514610bf4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610beb90613685565b60405180910390fd5b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610c84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7b906138c5565b60405180910390fd5b6000610c90600e611856565b9050600f54811115610cd7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cce906136a5565b60405180910390fd5b610ce1600e611b95565b610ceb8582611bab565b610d398185858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611bc9565b610d43600e611856565b90506040518060400160405280600681526020017f73656e64656400000000000000000000000000000000000000000000000000008152509150509392505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610e2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2590613865565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610ea8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9f906137a5565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610ef7611536565b610f016000611c3d565b565b6000600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610f3c90613bea565b80601f0160208091040260200160405190810160405280929190818152602001828054610f6890613bea565b8015610fb55780601f10610f8a57610100808354040283529160200191610fb5565b820191906000526020600020905b815481529060010190602001808311610f9857829003601f168201915b5050505050905090565b6060610fc9611536565b601060149054906101000a900460ff1615611036576000601060146101000a81548160ff0219169083151502179055506040518060400160405280601881526020017f636f6e7472616374207374617475732064697361626c65640000000000000000815250905061108a565b6001601060146101000a81548160ff0219169083151502179055506040518060400160405280601781526020017f636f6e74726163742073746174757320656e61626c656400000000000000000081525090505b90565b61109f611098611795565b8383611d03565b5050565b6110b46110ae611795565b83611864565b6110f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ea90613905565b60405180910390fd5b6110ff84848484611e70565b50505050565b6000601060149054906101000a900460ff16905090565b606061112782611ecc565b9050919050565b6000601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060611162611536565b81601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040518060400160405280601981526020017f426c61636b736d697468206164647265732075706461746564000000000000008152509050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61127c611536565b60011515601060149054906101000a900460ff161515146112d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c990613685565b60405180910390fd5b60006112de600e611856565b9050600f548261ffff16826112f391906139f9565b1115611334576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132b906136a5565b60405180910390fd5b60005b8561ffff1681101561140957600f54821115611388576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137f906137e5565b60405180910390fd5b611392600e611b95565b61139c8783611bab565b6113ea8286868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611bc9565b6113f4600e611856565b9150808061140190613c4d565b915050611337565b50505050505050565b61141a611536565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561148a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148190613705565b60405180910390fd5b61149381611c3d565b50565b60006114a0611536565b6114aa600e611856565b600f546114b79190613ada565b905090565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061152f575061152e82611fdf565b5b9050919050565b61153e611795565b73ffffffffffffffffffffffffffffffffffffffff1661155c610f03565b73ffffffffffffffffffffffffffffffffffffffff16146115b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a990613845565b60405180910390fd5b565b6115bc611b8b565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff16111561161a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611611906138e5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561168a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168190613925565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250600b60008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b61175381612059565b611792576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178990613865565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661181083610d85565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b60008061187083610d85565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806118b257506118b181856111e0565b5b806118f057508373ffffffffffffffffffffffffffffffffffffffff166118d884610697565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661191982610d85565b73ffffffffffffffffffffffffffffffffffffffff161461196f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196690613725565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156119df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119d690613765565b60405180910390fd5b6119ea8383836120c5565b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611a709190613ada565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ac791906139f9565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611b868383836120d5565b505050565b6000612710905090565b6001816000016000828254019250508190555050565b611bc58282604051806020016040528060008152506120da565b5050565b611bd282612059565b611c11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c08906137c5565b60405180910390fd5b80600660008481526020019081526020016000209080519060200190611c38929190612c14565b505050565b6000600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611d72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6990613785565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611e639190613648565b60405180910390a3505050565b611e7b8484846118f9565b611e8784848484612135565b611ec6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ebd906136e5565b60405180910390fd5b50505050565b6060611ed78261174a565b6000600660008481526020019081526020016000208054611ef790613bea565b80601f0160208091040260200160405190810160405280929190818152602001828054611f2390613bea565b8015611f705780601f10611f4557610100808354040283529160200191611f70565b820191906000526020600020905b815481529060010190602001808311611f5357829003601f168201915b505050505090506000611f816122cc565b9050600081511415611f97578192505050611fda565b600082511115611fcc578082604051602001611fb4929190613594565b60405160208183030381529060405292505050611fda565b611fd5846122e3565b925050505b919050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061205257506120518261234b565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6120d083838361242d565b505050565b505050565b6120e48383612541565b6120f16000848484612135565b612130576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612127906136e5565b60405180910390fd5b505050565b60006121568473ffffffffffffffffffffffffffffffffffffffff1661271b565b156122bf578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261217f611795565b8786866040518563ffffffff1660e01b81526004016121a194939291906135d3565b602060405180830381600087803b1580156121bb57600080fd5b505af19250505080156121ec57506040513d601f19601f820116820180604052508101906121e99190613128565b60015b61226f573d806000811461221c576040519150601f19603f3d011682016040523d82523d6000602084013e612221565b606091505b50600081511415612267576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161225e906136e5565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506122c4565b600190505b949350505050565b606060405180602001604052806000815250905090565b60606122ee8261174a565b60006122f86122cc565b905060008151116123185760405180602001604052806000815250612343565b806123228461273e565b604051602001612333929190613594565b6040516020818303038152906040525b915050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061241657507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061242657506124258261289f565b5b9050919050565b612438838383612909565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561247b576124768161290e565b6124ba565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146124b9576124b88382612957565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156124fd576124f881612ac4565b61253c565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461253b5761253a8282612b95565b5b5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156125b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125a890613825565b60405180910390fd5b6125ba81612059565b156125fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125f190613745565b60405180910390fd5b612606600083836120c5565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461265691906139f9565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612717600083836120d5565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60606000821415612786576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061289a565b600082905060005b600082146127b85780806127a190613c4d565b915050600a826127b19190613a4f565b915061278e565b60008167ffffffffffffffff8111156127d4576127d3613db2565b5b6040519080825280601f01601f1916602001820160405280156128065781602001600182028036833780820191505090505b5090505b600085146128935760018261281f9190613ada565b9150600a8561282e9190613c96565b603061283a91906139f9565b60f81b8183815181106128505761284f613d83565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561288c9190613a4f565b945061280a565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b505050565b600980549050600a600083815260200190815260200160002081905550600981908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161296484610e37565b61296e9190613ada565b9050600060086000848152602001908152602001600020549050818114612a53576000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816008600083815260200190815260200160002081905550505b6008600084815260200190815260200160002060009055600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600980549050612ad89190613ada565b90506000600a6000848152602001908152602001600020549050600060098381548110612b0857612b07613d83565b5b906000526020600020015490508060098381548110612b2a57612b29613d83565b5b906000526020600020018190555081600a600083815260200190815260200160002081905550600a6000858152602001908152602001600020600090556009805480612b7957612b78613d54565b5b6001900381819060005260206000200160009055905550505050565b6000612ba083610e37565b905081600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806008600084815260200190815260200160002081905550505050565b828054612c2090613bea565b90600052602060002090601f016020900481019282612c425760008555612c89565b82601f10612c5b57805160ff1916838001178555612c89565b82800160010185558215612c89579182015b82811115612c88578251825591602001919060010190612c6d565b5b509050612c969190612c9a565b5090565b5b80821115612cb3576000816000905550600101612c9b565b5090565b6000612cca612cc584613985565b613960565b905082815260208101848484011115612ce657612ce5613df0565b5b612cf1848285613ba8565b509392505050565b600081359050612d088161435e565b92915050565b600081359050612d1d81614375565b92915050565b600081359050612d328161438c565b92915050565b600081519050612d478161438c565b92915050565b600082601f830112612d6257612d61613de6565b5b8135612d72848260208601612cb7565b91505092915050565b60008083601f840112612d9157612d90613de6565b5b8235905067ffffffffffffffff811115612dae57612dad613de1565b5b602083019150836001820283011115612dca57612dc9613deb565b5b9250929050565b600081359050612de0816143a3565b92915050565b600081359050612df5816143ba565b92915050565b600081359050612e0a816143d1565b92915050565b600060208284031215612e2657612e25613dfa565b5b6000612e3484828501612cf9565b91505092915050565b60008060408385031215612e5457612e53613dfa565b5b6000612e6285828601612cf9565b9250506020612e7385828601612cf9565b9150509250929050565b600080600060608486031215612e9657612e95613dfa565b5b6000612ea486828701612cf9565b9350506020612eb586828701612cf9565b9250506040612ec686828701612de6565b9150509250925092565b60008060008060808587031215612eea57612ee9613dfa565b5b6000612ef887828801612cf9565b9450506020612f0987828801612cf9565b9350506040612f1a87828801612de6565b925050606085013567ffffffffffffffff811115612f3b57612f3a613df5565b5b612f4787828801612d4d565b91505092959194509250565b60008060408385031215612f6a57612f69613dfa565b5b6000612f7885828601612cf9565b9250506020612f8985828601612d0e565b9150509250929050565b600080600060408486031215612fac57612fab613dfa565b5b6000612fba86828701612cf9565b935050602084013567ffffffffffffffff811115612fdb57612fda613df5565b5b612fe786828701612d7b565b92509250509250925092565b60008060008060006080868803121561300f5761300e613dfa565b5b600061301d88828901612cf9565b955050602061302e88828901612dd1565b945050604086013567ffffffffffffffff81111561304f5761304e613df5565b5b61305b88828901612d7b565b9350935050606061306e88828901612dd1565b9150509295509295909350565b6000806040838503121561309257613091613dfa565b5b60006130a085828601612cf9565b92505060206130b185828601612de6565b9150509250929050565b600080604083850312156130d2576130d1613dfa565b5b60006130e085828601612cf9565b92505060206130f185828601612dfb565b9150509250929050565b60006020828403121561311157613110613dfa565b5b600061311f84828501612d23565b91505092915050565b60006020828403121561313e5761313d613dfa565b5b600061314c84828501612d38565b91505092915050565b60006020828403121561316b5761316a613dfa565b5b600061317984828501612de6565b91505092915050565b6000806040838503121561319957613198613dfa565b5b60006131a785828601612de6565b92505060206131b885828601612de6565b9150509250929050565b6131cb81613b0e565b82525050565b6131da81613b20565b82525050565b60006131eb826139b6565b6131f581856139cc565b9350613205818560208601613bb7565b61320e81613dff565b840191505092915050565b6000613224826139c1565b61322e81856139dd565b935061323e818560208601613bb7565b61324781613dff565b840191505092915050565b600061325d826139c1565b61326781856139ee565b9350613277818560208601613bb7565b80840191505092915050565b60006132906011836139dd565b915061329b82613e10565b602082019050919050565b60006132b36016836139dd565b91506132be82613e39565b602082019050919050565b60006132d6602b836139dd565b91506132e182613e62565b604082019050919050565b60006132f96032836139dd565b915061330482613eb1565b604082019050919050565b600061331c6026836139dd565b915061332782613f00565b604082019050919050565b600061333f6025836139dd565b915061334a82613f4f565b604082019050919050565b6000613362601c836139dd565b915061336d82613f9e565b602082019050919050565b60006133856024836139dd565b915061339082613fc7565b604082019050919050565b60006133a86019836139dd565b91506133b382614016565b602082019050919050565b60006133cb6029836139dd565b91506133d68261403f565b604082019050919050565b60006133ee602e836139dd565b91506133f98261408e565b604082019050919050565b6000613411601c836139dd565b915061341c826140dd565b602082019050919050565b6000613434603e836139dd565b915061343f82614106565b604082019050919050565b60006134576020836139dd565b915061346282614155565b602082019050919050565b600061347a6020836139dd565b91506134858261417e565b602082019050919050565b600061349d6018836139dd565b91506134a8826141a7565b602082019050919050565b60006134c06021836139dd565b91506134cb826141d0565b604082019050919050565b60006134e3602c836139dd565b91506134ee8261421f565b604082019050919050565b6000613506600b836139dd565b91506135118261426e565b602082019050919050565b6000613529602a836139dd565b915061353482614297565b604082019050919050565b600061354c602e836139dd565b9150613557826142e6565b604082019050919050565b600061356f6019836139dd565b915061357a82614335565b602082019050919050565b61358e81613b86565b82525050565b60006135a08285613252565b91506135ac8284613252565b91508190509392505050565b60006020820190506135cd60008301846131c2565b92915050565b60006080820190506135e860008301876131c2565b6135f560208301866131c2565b6136026040830185613585565b818103606083015261361481846131e0565b905095945050505050565b600060408201905061363460008301856131c2565b6136416020830184613585565b9392505050565b600060208201905061365d60008301846131d1565b92915050565b6000602082019050818103600083015261367d8184613219565b905092915050565b6000602082019050818103600083015261369e81613283565b9050919050565b600060208201905081810360008301526136be816132a6565b9050919050565b600060208201905081810360008301526136de816132c9565b9050919050565b600060208201905081810360008301526136fe816132ec565b9050919050565b6000602082019050818103600083015261371e8161330f565b9050919050565b6000602082019050818103600083015261373e81613332565b9050919050565b6000602082019050818103600083015261375e81613355565b9050919050565b6000602082019050818103600083015261377e81613378565b9050919050565b6000602082019050818103600083015261379e8161339b565b9050919050565b600060208201905081810360008301526137be816133be565b9050919050565b600060208201905081810360008301526137de816133e1565b9050919050565b600060208201905081810360008301526137fe81613404565b9050919050565b6000602082019050818103600083015261381e81613427565b9050919050565b6000602082019050818103600083015261383e8161344a565b9050919050565b6000602082019050818103600083015261385e8161346d565b9050919050565b6000602082019050818103600083015261387e81613490565b9050919050565b6000602082019050818103600083015261389e816134b3565b9050919050565b600060208201905081810360008301526138be816134d6565b9050919050565b600060208201905081810360008301526138de816134f9565b9050919050565b600060208201905081810360008301526138fe8161351c565b9050919050565b6000602082019050818103600083015261391e8161353f565b9050919050565b6000602082019050818103600083015261393e81613562565b9050919050565b600060208201905061395a6000830184613585565b92915050565b600061396a61397b565b90506139768282613c1c565b919050565b6000604051905090565b600067ffffffffffffffff8211156139a05761399f613db2565b5b6139a982613dff565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613a0482613b86565b9150613a0f83613b86565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613a4457613a43613cc7565b5b828201905092915050565b6000613a5a82613b86565b9150613a6583613b86565b925082613a7557613a74613cf6565b5b828204905092915050565b6000613a8b82613b86565b9150613a9683613b86565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613acf57613ace613cc7565b5b828202905092915050565b6000613ae582613b86565b9150613af083613b86565b925082821015613b0357613b02613cc7565b5b828203905092915050565b6000613b1982613b66565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006bffffffffffffffffffffffff82169050919050565b82818337600083830152505050565b60005b83811015613bd5578082015181840152602081019050613bba565b83811115613be4576000848401525b50505050565b60006002820490506001821680613c0257607f821691505b60208210811415613c1657613c15613d25565b5b50919050565b613c2582613dff565b810181811067ffffffffffffffff82111715613c4457613c43613db2565b5b80604052505050565b6000613c5882613b86565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613c8b57613c8a613cc7565b5b600182019050919050565b6000613ca182613b86565b9150613cac83613b86565b925082613cbc57613cbb613cf6565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f436f6e74726163742044697361626c6564000000000000000000000000000000600082015250565b7f6e6f7420656e6f75676820737570706c79206c65667400000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008201527f6578697374656e7420746f6b656e000000000000000000000000000000000000602082015250565b7f49276d20736f7272792077652072656163686564207468652063617000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4e4f5420414c4c4f574544000000000000000000000000000000000000000000600082015250565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b61436781613b0e565b811461437257600080fd5b50565b61437e81613b20565b811461438957600080fd5b50565b61439581613b2c565b81146143a057600080fd5b50565b6143ac81613b58565b81146143b757600080fd5b50565b6143c381613b86565b81146143ce57600080fd5b50565b6143da81613b90565b81146143e557600080fd5b5056fea2646970667358221220f9170e3bf23905cc28088649c1d6eb6085baff965a3f7a9f0c707e1a38ffa62e64736f6c63430008070033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000001f4000000000000000000000000e60970361d4ed85e1641642c2d323ec8129b6b9c
-----Decoded View---------------
Arg [0] : _royaltyFeesInBips (uint96): 500
Arg [1] : artist (address): 0xe60970361D4ed85e1641642c2d323ec8129b6B9C
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000001f4
Arg [1] : 000000000000000000000000e60970361d4ed85e1641642c2d323ec8129b6b9c
Deployed Bytecode Sourcemap
56439:3625:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59840:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59018:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34877:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36390:171;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35907:417;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48840:113;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59185:116;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37090:336;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23067:442;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;48508:256;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37497:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49030:233;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57588:551;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34588:222;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34319:207;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6950:103;;;:::i;:::-;;6302:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35046:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58537:339;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36633:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37753:323;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58431:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59638:196;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58328:97;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58145:177;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36859:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56939:643;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7208:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58882:130;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59840:221;59988:4;60017:36;60041:11;60017:23;:36::i;:::-;60010:43;;59840:221;;;:::o;59018:155::-;6188:13;:11;:13::i;:::-;59116:49:::1;59135:9;59146:18;59116;:49::i;:::-;59018:155:::0;;:::o;34877:100::-;34931:13;34964:5;34957:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34877:100;:::o;36390:171::-;36466:7;36486:23;36501:7;36486:14;:23::i;:::-;36529:15;:24;36545:7;36529:24;;;;;;;;;;;;;;;;;;;;;36522:31;;36390:171;;;:::o;35907:417::-;35988:13;36004:23;36019:7;36004:14;:23::i;:::-;35988:39;;36052:5;36046:11;;:2;:11;;;;36038:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;36146:5;36130:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;36155:37;36172:5;36179:12;:10;:12::i;:::-;36155:16;:37::i;:::-;36130:62;36108:174;;;;;;;;;;;;:::i;:::-;;;;;;;;;36295:21;36304:2;36308:7;36295:8;:21::i;:::-;35977:347;35907:417;;:::o;48840:113::-;48901:7;48928:10;:17;;;;48921:24;;48840:113;:::o;59185:116::-;59236:7;6188:13;:11;:13::i;:::-;59268:25:::1;:15;:23;:25::i;:::-;59261:32;;59185:116:::0;:::o;37090:336::-;37285:41;37304:12;:10;:12::i;:::-;37318:7;37285:18;:41::i;:::-;37277:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;37390:28;37400:4;37406:2;37410:7;37390:9;:28::i;:::-;37090:336;;;:::o;23067:442::-;23164:7;23173;23193:26;23222:17;:27;23240:8;23222:27;;;;;;;;;;;23193:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23294:1;23266:30;;:7;:16;;;:30;;;23262:92;;;23323:19;23313:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23262:92;23366:21;23431:17;:15;:17::i;:::-;23390:58;;23404:7;:23;;;23391:36;;:10;:36;;;;:::i;:::-;23390:58;;;;:::i;:::-;23366:82;;23469:7;:16;;;23487:13;23461:40;;;;;;23067:442;;;;;:::o;48508:256::-;48605:7;48641:23;48658:5;48641:16;:23::i;:::-;48633:5;:31;48625:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;48730:12;:19;48743:5;48730:19;;;;;;;;;;;;;;;:26;48750:5;48730:26;;;;;;;;;;;;48723:33;;48508:256;;;;:::o;37497:185::-;37635:39;37652:4;37658:2;37662:7;37635:39;;;;;;;;;;;;:16;:39::i;:::-;37497:185;;;:::o;49030:233::-;49105:7;49141:30;:28;:30::i;:::-;49133:5;:38;49125:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;49238:10;49249:5;49238:17;;;;;;;;:::i;:::-;;;;;;;;;;49231:24;;49030:233;;;:::o;57588:551::-;57668:13;57725:4;57707:22;;:14;;;;;;;;;;;:22;;;57699:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;57785:10;;;;;;;;;;;57771:24;;:10;:24;;;57763:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;57823:17;57843:25;:15;:23;:25::i;:::-;57823:45;;57900:10;;57887:9;:23;;57879:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;57948:27;:15;:25;:27::i;:::-;57986:24;57996:2;58000:9;57986;:24::i;:::-;58021:36;58034:9;58045:11;;58021:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:12;:36::i;:::-;58080:25;:15;:23;:25::i;:::-;58068:37;;58116:15;;;;;;;;;;;;;;;;;;;;57588:551;;;;;:::o;34588:222::-;34660:7;34680:13;34696:7;:16;34704:7;34696:16;;;;;;;;;;;;;;;;;;;;;34680:32;;34748:1;34731:19;;:5;:19;;;;34723:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;34797:5;34790:12;;;34588:222;;;:::o;34319:207::-;34391:7;34436:1;34419:19;;:5;:19;;;;34411:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;34502:9;:16;34512:5;34502:16;;;;;;;;;;;;;;;;34495:23;;34319:207;;;:::o;6950:103::-;6188:13;:11;:13::i;:::-;7015:30:::1;7042:1;7015:18;:30::i;:::-;6950:103::o:0;6302:87::-;6348:7;6375:6;;;;;;;;;;;6368:13;;6302:87;:::o;35046:104::-;35102:13;35135:7;35128:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35046:104;:::o;58537:339::-;58594:13;6188;:11;:13::i;:::-;58628:14:::1;;;;;;;;;;;58625:244;;;58685:5;58668:14;;:22;;;;;;;;;;;;;;;;;;58705:33;;;;;;;;;;;;;;;;::::0;::::1;;;;58625:244;58806:4;58789:14;;:21;;;;;;;;;;;;;;;;;;58825:32;;;;;;;;;;;;;;;;::::0;::::1;;6212:1;58537:339:::0;:::o;36633:155::-;36728:52;36747:12;:10;:12::i;:::-;36761:8;36771;36728:18;:52::i;:::-;36633:155;;:::o;37753:323::-;37927:41;37946:12;:10;:12::i;:::-;37960:7;37927:18;:41::i;:::-;37919:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;38030:38;38044:4;38050:2;38054:7;38063:4;38030:13;:38::i;:::-;37753:323;;;;:::o;58431:100::-;58480:4;58509:14;;;;;;;;;;;58502:21;;58431:100;:::o;59638:196::-;59765:13;59803:23;59818:7;59803:14;:23::i;:::-;59796:30;;59638:196;;;:::o;58328:97::-;58375:7;58407:10;;;;;;;;;;;58400:17;;58328:97;:::o;58145:177::-;58214:13;6188;:11;:13::i;:::-;58258:11:::1;58245:10;;:24;;;;;;;;;;;;;;;;;;58280:34;;;;;;;;;;;;;;;;::::0;::::1;;58145:177:::0;;;:::o;36859:164::-;36956:4;36980:18;:25;36999:5;36980:25;;;;;;;;;;;;;;;:35;37006:8;36980:35;;;;;;;;;;;;;;;;;;;;;;;;;36973:42;;36859:164;;;;:::o;56939:643::-;6188:13;:11;:13::i;:::-;57088:4:::1;57070:22;;:14;;;;;;;;;;;:22;;;57062:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;57126:17;57146:25;:15;:23;:25::i;:::-;57126:45;;57212:10;;57201:6;57191:16;;:9;:16;;;;:::i;:::-;57190:32;;57182:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;57264:6;57260:315;57276:7;57274:9;;:1;:9;57260:315;;;57336:10;;57323:9;:23;;57315:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;57394:27;:15;:25;:27::i;:::-;57436:24;57446:2;57450:9;57436;:24::i;:::-;57475:36;57488:9;57499:11;;57475:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:12;:36::i;:::-;57538:25;:15;:23;:25::i;:::-;57526:37;;57286:3;;;;;:::i;:::-;;;;57260:315;;;;57051:531;56939:643:::0;;;;;:::o;7208:201::-;6188:13;:11;:13::i;:::-;7317:1:::1;7297:22;;:8;:22;;;;7289:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;7373:28;7392:8;7373:18;:28::i;:::-;7208:201:::0;:::o;58882:130::-;58934:7;6188:13;:11;:13::i;:::-;58979:25:::1;:15;:23;:25::i;:::-;58966:10;;:38;;;;:::i;:::-;58959:45;;58882:130:::0;:::o;22797:215::-;22899:4;22938:26;22923:41;;;:11;:41;;;;:81;;;;22968:36;22992:11;22968:23;:36::i;:::-;22923:81;22916:88;;22797:215;;;:::o;6467:132::-;6542:12;:10;:12::i;:::-;6531:23;;:7;:5;:7::i;:::-;:23;;;6523:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6467:132::o;24159:332::-;24278:17;:15;:17::i;:::-;24262:33;;:12;:33;;;;24254:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;24381:1;24361:22;;:8;:22;;;;24353:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;24448:35;;;;;;;;24460:8;24448:35;;;;;;24470:12;24448:35;;;;;24426:19;:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24159:332;;:::o;44369:135::-;44451:16;44459:7;44451;:16::i;:::-;44443:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;44369:135;:::o;4800:98::-;4853:7;4880:10;4873:17;;4800:98;:::o;43648:174::-;43750:2;43723:15;:24;43739:7;43723:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;43806:7;43802:2;43768:46;;43777:23;43792:7;43777:14;:23::i;:::-;43768:46;;;;;;;;;;;;43648:174;;:::o;925:114::-;990:7;1017;:14;;;1010:21;;925:114;;;:::o;39877:264::-;39970:4;39987:13;40003:23;40018:7;40003:14;:23::i;:::-;39987:39;;40056:5;40045:16;;:7;:16;;;:52;;;;40065:32;40082:5;40089:7;40065:16;:32::i;:::-;40045:52;:87;;;;40125:7;40101:31;;:20;40113:7;40101:11;:20::i;:::-;:31;;;40045:87;40037:96;;;39877:264;;;;:::o;42902:627::-;43061:4;43034:31;;:23;43049:7;43034:14;:23::i;:::-;:31;;;43026:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;43140:1;43126:16;;:2;:16;;;;43118:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;43196:39;43217:4;43223:2;43227:7;43196:20;:39::i;:::-;43307:15;:24;43323:7;43307:24;;;;;;;;;;;;43300:31;;;;;;;;;;;43363:1;43344:9;:15;43354:4;43344:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;43392:1;43375:9;:13;43385:2;43375:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;43423:2;43404:7;:16;43412:7;43404:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;43462:7;43458:2;43443:27;;43452:4;43443:27;;;;;;;;;;;;43483:38;43503:4;43509:2;43513:7;43483:19;:38::i;:::-;42902:627;;;:::o;23791:97::-;23849:6;23875:5;23868:12;;23791:97;:::o;1047:127::-;1154:1;1136:7;:14;;;:19;;;;;;;;;;;1047:127;:::o;40483:110::-;40559:26;40569:2;40573:7;40559:26;;;;;;;;;;;;:9;:26::i;:::-;40483:110;;:::o;55707:217::-;55807:16;55815:7;55807;:16::i;:::-;55799:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;55907:9;55885:10;:19;55896:7;55885:19;;;;;;;;;;;:31;;;;;;;;;;;;:::i;:::-;;55707:217;;:::o;7569:191::-;7643:16;7662:6;;;;;;;;;;;7643:25;;7688:8;7679:6;;:17;;;;;;;;;;;;;;;;;;7743:8;7712:40;;7733:8;7712:40;;;;;;;;;;;;7632:128;7569:191;:::o;43965:315::-;44120:8;44111:17;;:5;:17;;;;44103:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;44207:8;44169:18;:25;44188:5;44169:25;;;;;;;;;;;;;;;:35;44195:8;44169:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;44253:8;44231:41;;44246:5;44231:41;;;44263:8;44231:41;;;;;;:::i;:::-;;;;;;;;43965:315;;;:::o;38957:313::-;39113:28;39123:4;39129:2;39133:7;39113:9;:28::i;:::-;39160:47;39183:4;39189:2;39193:7;39202:4;39160:22;:47::i;:::-;39152:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;38957:313;;;;:::o;54927:624::-;55000:13;55026:23;55041:7;55026:14;:23::i;:::-;55062;55088:10;:19;55099:7;55088:19;;;;;;;;;;;55062:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55118:18;55139:10;:8;:10::i;:::-;55118:31;;55247:1;55231:4;55225:18;:23;55221:72;;;55272:9;55265:16;;;;;;55221:72;55423:1;55403:9;55397:23;:27;55393:108;;;55472:4;55478:9;55455:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;55441:48;;;;;;55393:108;55520:23;55535:7;55520:14;:23::i;:::-;55513:30;;;;54927:624;;;;:::o;48200:224::-;48302:4;48341:35;48326:50;;;:11;:50;;;;:90;;;;48380:36;48404:11;48380:23;:36::i;:::-;48326:90;48319:97;;48200:224;;;:::o;39583:127::-;39648:4;39700:1;39672:30;;:7;:16;39680:7;39672:16;;;;;;;;;;;;;;;;;;;;;:30;;;;39665:37;;39583:127;;;:::o;59307:204::-;59458:45;59485:4;59491:2;59495:7;59458:26;:45::i;:::-;59307:204;;;:::o;47004:125::-;;;;:::o;40820:319::-;40949:18;40955:2;40959:7;40949:5;:18::i;:::-;41000:53;41031:1;41035:2;41039:7;41048:4;41000:22;:53::i;:::-;40978:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;40820:319;;;:::o;45068:853::-;45222:4;45243:15;:2;:13;;;:15::i;:::-;45239:675;;;45295:2;45279:36;;;45316:12;:10;:12::i;:::-;45330:4;45336:7;45345:4;45279:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;45275:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45537:1;45520:6;:13;:18;45516:328;;;45563:60;;;;;;;;;;:::i;:::-;;;;;;;;45516:328;45794:6;45788:13;45779:6;45775:2;45771:15;45764:38;45275:584;45411:41;;;45401:51;;;:6;:51;;;;45394:58;;;;;45239:675;45898:4;45891:11;;45068:853;;;;;;;:::o;35751:94::-;35802:13;35828:9;;;;;;;;;;;;;;35751:94;:::o;35221:281::-;35294:13;35320:23;35335:7;35320:14;:23::i;:::-;35356:21;35380:10;:8;:10::i;:::-;35356:34;;35432:1;35414:7;35408:21;:25;:86;;;;;;;;;;;;;;;;;35460:7;35469:18;:7;:16;:18::i;:::-;35443:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;35408:86;35401:93;;;35221:281;;;:::o;33950:305::-;34052:4;34104:25;34089:40;;;:11;:40;;;;:105;;;;34161:33;34146:48;;;:11;:48;;;;34089:105;:158;;;;34211:36;34235:11;34211:23;:36::i;:::-;34089:158;34069:178;;33950:305;;;:::o;49876:589::-;50020:45;50047:4;50053:2;50057:7;50020:26;:45::i;:::-;50098:1;50082:18;;:4;:18;;;50078:187;;;50117:40;50149:7;50117:31;:40::i;:::-;50078:187;;;50187:2;50179:10;;:4;:10;;;50175:90;;50206:47;50239:4;50245:7;50206:32;:47::i;:::-;50175:90;50078:187;50293:1;50279:16;;:2;:16;;;50275:183;;;50312:45;50349:7;50312:36;:45::i;:::-;50275:183;;;50385:4;50379:10;;:2;:10;;;50375:83;;50406:40;50434:2;50438:7;50406:27;:40::i;:::-;50375:83;50275:183;49876:589;;;:::o;41475:439::-;41569:1;41555:16;;:2;:16;;;;41547:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;41628:16;41636:7;41628;:16::i;:::-;41627:17;41619:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;41690:45;41719:1;41723:2;41727:7;41690:20;:45::i;:::-;41765:1;41748:9;:13;41758:2;41748:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;41796:2;41777:7;:16;41785:7;41777:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;41841:7;41837:2;41816:33;;41833:1;41816:33;;;;;;;;;;;;41862:44;41890:1;41894:2;41898:7;41862:19;:44::i;:::-;41475:439;;:::o;9053:326::-;9113:4;9370:1;9348:7;:19;;;:23;9341:30;;9053:326;;;:::o;2001:723::-;2057:13;2287:1;2278:5;:10;2274:53;;;2305:10;;;;;;;;;;;;;;;;;;;;;2274:53;2337:12;2352:5;2337:20;;2368:14;2393:78;2408:1;2400:4;:9;2393:78;;2426:8;;;;;:::i;:::-;;;;2457:2;2449:10;;;;;:::i;:::-;;;2393:78;;;2481:19;2513:6;2503:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2481:39;;2531:154;2547:1;2538:5;:10;2531:154;;2575:1;2565:11;;;;;:::i;:::-;;;2642:2;2634:5;:10;;;;:::i;:::-;2621:2;:24;;;;:::i;:::-;2608:39;;2591:6;2598;2591:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;2671:2;2662:11;;;;;:::i;:::-;;;2531:154;;;2709:6;2695:21;;;;;2001:723;;;;:::o;21194:157::-;21279:4;21318:25;21303:40;;;:11;:40;;;;21296:47;;21194:157;;;:::o;46493:126::-;;;;:::o;51188:164::-;51292:10;:17;;;;51265:15;:24;51281:7;51265:24;;;;;;;;;;;:44;;;;51320:10;51336:7;51320:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51188:164;:::o;51979:988::-;52245:22;52295:1;52270:22;52287:4;52270:16;:22::i;:::-;:26;;;;:::i;:::-;52245:51;;52307:18;52328:17;:26;52346:7;52328:26;;;;;;;;;;;;52307:47;;52475:14;52461:10;:28;52457:328;;52506:19;52528:12;:18;52541:4;52528:18;;;;;;;;;;;;;;;:34;52547:14;52528:34;;;;;;;;;;;;52506:56;;52612:11;52579:12;:18;52592:4;52579:18;;;;;;;;;;;;;;;:30;52598:10;52579:30;;;;;;;;;;;:44;;;;52729:10;52696:17;:30;52714:11;52696:30;;;;;;;;;;;:43;;;;52491:294;52457:328;52881:17;:26;52899:7;52881:26;;;;;;;;;;;52874:33;;;52925:12;:18;52938:4;52925:18;;;;;;;;;;;;;;;:34;52944:14;52925:34;;;;;;;;;;;52918:41;;;52060:907;;51979:988;;:::o;53262:1079::-;53515:22;53560:1;53540:10;:17;;;;:21;;;;:::i;:::-;53515:46;;53572:18;53593:15;:24;53609:7;53593:24;;;;;;;;;;;;53572:45;;53944:19;53966:10;53977:14;53966:26;;;;;;;;:::i;:::-;;;;;;;;;;53944:48;;54030:11;54005:10;54016;54005:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;54141:10;54110:15;:28;54126:11;54110:28;;;;;;;;;;;:41;;;;54282:15;:24;54298:7;54282:24;;;;;;;;;;;54275:31;;;54317:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;53333:1008;;;53262:1079;:::o;50766:221::-;50851:14;50868:20;50885:2;50868:16;:20::i;:::-;50851:37;;50926:7;50899:12;:16;50912:2;50899:16;;;;;;;;;;;;;;;:24;50916:6;50899:24;;;;;;;;;;;:34;;;;50973:6;50944:17;:26;50962:7;50944:26;;;;;;;;;;;:35;;;;50840:147;50766:221;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:139::-;469:5;507:6;494:20;485:29;;523:33;550:5;523:33;:::i;:::-;423:139;;;;:::o;568:133::-;611:5;649:6;636:20;627:29;;665:30;689:5;665:30;:::i;:::-;568:133;;;;:::o;707:137::-;752:5;790:6;777:20;768:29;;806:32;832:5;806:32;:::i;:::-;707:137;;;;:::o;850:141::-;906:5;937:6;931:13;922:22;;953:32;979:5;953:32;:::i;:::-;850:141;;;;:::o;1010:338::-;1065:5;1114:3;1107:4;1099:6;1095:17;1091:27;1081:122;;1122:79;;:::i;:::-;1081:122;1239:6;1226:20;1264:78;1338:3;1330:6;1323:4;1315:6;1311:17;1264:78;:::i;:::-;1255:87;;1071:277;1010:338;;;;:::o;1368:553::-;1426:8;1436:6;1486:3;1479:4;1471:6;1467:17;1463:27;1453:122;;1494:79;;:::i;:::-;1453:122;1607:6;1594:20;1584:30;;1637:18;1629:6;1626:30;1623:117;;;1659:79;;:::i;:::-;1623:117;1773:4;1765:6;1761:17;1749:29;;1827:3;1819:4;1811:6;1807:17;1797:8;1793:32;1790:41;1787:128;;;1834:79;;:::i;:::-;1787:128;1368:553;;;;;:::o;1927:137::-;1972:5;2010:6;1997:20;1988:29;;2026:32;2052:5;2026:32;:::i;:::-;1927:137;;;;:::o;2070:139::-;2116:5;2154:6;2141:20;2132:29;;2170:33;2197:5;2170:33;:::i;:::-;2070:139;;;;:::o;2215:137::-;2260:5;2298:6;2285:20;2276:29;;2314:32;2340:5;2314:32;:::i;:::-;2215:137;;;;:::o;2358:329::-;2417:6;2466:2;2454:9;2445:7;2441:23;2437:32;2434:119;;;2472:79;;:::i;:::-;2434:119;2592:1;2617:53;2662:7;2653:6;2642:9;2638:22;2617:53;:::i;:::-;2607:63;;2563:117;2358:329;;;;:::o;2693:474::-;2761:6;2769;2818:2;2806:9;2797:7;2793:23;2789:32;2786:119;;;2824:79;;:::i;:::-;2786:119;2944:1;2969:53;3014:7;3005:6;2994:9;2990:22;2969:53;:::i;:::-;2959:63;;2915:117;3071:2;3097:53;3142:7;3133:6;3122:9;3118:22;3097:53;:::i;:::-;3087:63;;3042:118;2693:474;;;;;:::o;3173:619::-;3250:6;3258;3266;3315:2;3303:9;3294:7;3290:23;3286:32;3283:119;;;3321:79;;:::i;:::-;3283:119;3441:1;3466:53;3511:7;3502:6;3491:9;3487:22;3466:53;:::i;:::-;3456:63;;3412:117;3568:2;3594:53;3639:7;3630:6;3619:9;3615:22;3594:53;:::i;:::-;3584:63;;3539:118;3696:2;3722:53;3767:7;3758:6;3747:9;3743:22;3722:53;:::i;:::-;3712:63;;3667:118;3173:619;;;;;:::o;3798:943::-;3893:6;3901;3909;3917;3966:3;3954:9;3945:7;3941:23;3937:33;3934:120;;;3973:79;;:::i;:::-;3934:120;4093:1;4118:53;4163:7;4154:6;4143:9;4139:22;4118:53;:::i;:::-;4108:63;;4064:117;4220:2;4246:53;4291:7;4282:6;4271:9;4267:22;4246:53;:::i;:::-;4236:63;;4191:118;4348:2;4374:53;4419:7;4410:6;4399:9;4395:22;4374:53;:::i;:::-;4364:63;;4319:118;4504:2;4493:9;4489:18;4476:32;4535:18;4527:6;4524:30;4521:117;;;4557:79;;:::i;:::-;4521:117;4662:62;4716:7;4707:6;4696:9;4692:22;4662:62;:::i;:::-;4652:72;;4447:287;3798:943;;;;;;;:::o;4747:468::-;4812:6;4820;4869:2;4857:9;4848:7;4844:23;4840:32;4837:119;;;4875:79;;:::i;:::-;4837:119;4995:1;5020:53;5065:7;5056:6;5045:9;5041:22;5020:53;:::i;:::-;5010:63;;4966:117;5122:2;5148:50;5190:7;5181:6;5170:9;5166:22;5148:50;:::i;:::-;5138:60;;5093:115;4747:468;;;;;:::o;5221:674::-;5301:6;5309;5317;5366:2;5354:9;5345:7;5341:23;5337:32;5334:119;;;5372:79;;:::i;:::-;5334:119;5492:1;5517:53;5562:7;5553:6;5542:9;5538:22;5517:53;:::i;:::-;5507:63;;5463:117;5647:2;5636:9;5632:18;5619:32;5678:18;5670:6;5667:30;5664:117;;;5700:79;;:::i;:::-;5664:117;5813:65;5870:7;5861:6;5850:9;5846:22;5813:65;:::i;:::-;5795:83;;;;5590:298;5221:674;;;;;:::o;5901:961::-;5997:6;6005;6013;6021;6029;6078:3;6066:9;6057:7;6053:23;6049:33;6046:120;;;6085:79;;:::i;:::-;6046:120;6205:1;6230:53;6275:7;6266:6;6255:9;6251:22;6230:53;:::i;:::-;6220:63;;6176:117;6332:2;6358:52;6402:7;6393:6;6382:9;6378:22;6358:52;:::i;:::-;6348:62;;6303:117;6487:2;6476:9;6472:18;6459:32;6518:18;6510:6;6507:30;6504:117;;;6540:79;;:::i;:::-;6504:117;6653:65;6710:7;6701:6;6690:9;6686:22;6653:65;:::i;:::-;6635:83;;;;6430:298;6767:2;6793:52;6837:7;6828:6;6817:9;6813:22;6793:52;:::i;:::-;6783:62;;6738:117;5901:961;;;;;;;;:::o;6868:474::-;6936:6;6944;6993:2;6981:9;6972:7;6968:23;6964:32;6961:119;;;6999:79;;:::i;:::-;6961:119;7119:1;7144:53;7189:7;7180:6;7169:9;7165:22;7144:53;:::i;:::-;7134:63;;7090:117;7246:2;7272:53;7317:7;7308:6;7297:9;7293:22;7272:53;:::i;:::-;7262:63;;7217:118;6868:474;;;;;:::o;7348:472::-;7415:6;7423;7472:2;7460:9;7451:7;7447:23;7443:32;7440:119;;;7478:79;;:::i;:::-;7440:119;7598:1;7623:53;7668:7;7659:6;7648:9;7644:22;7623:53;:::i;:::-;7613:63;;7569:117;7725:2;7751:52;7795:7;7786:6;7775:9;7771:22;7751:52;:::i;:::-;7741:62;;7696:117;7348:472;;;;;:::o;7826:327::-;7884:6;7933:2;7921:9;7912:7;7908:23;7904:32;7901:119;;;7939:79;;:::i;:::-;7901:119;8059:1;8084:52;8128:7;8119:6;8108:9;8104:22;8084:52;:::i;:::-;8074:62;;8030:116;7826:327;;;;:::o;8159:349::-;8228:6;8277:2;8265:9;8256:7;8252:23;8248:32;8245:119;;;8283:79;;:::i;:::-;8245:119;8403:1;8428:63;8483:7;8474:6;8463:9;8459:22;8428:63;:::i;:::-;8418:73;;8374:127;8159:349;;;;:::o;8514:329::-;8573:6;8622:2;8610:9;8601:7;8597:23;8593:32;8590:119;;;8628:79;;:::i;:::-;8590:119;8748:1;8773:53;8818:7;8809:6;8798:9;8794:22;8773:53;:::i;:::-;8763:63;;8719:117;8514:329;;;;:::o;8849:474::-;8917:6;8925;8974:2;8962:9;8953:7;8949:23;8945:32;8942:119;;;8980:79;;:::i;:::-;8942:119;9100:1;9125:53;9170:7;9161:6;9150:9;9146:22;9125:53;:::i;:::-;9115:63;;9071:117;9227:2;9253:53;9298:7;9289:6;9278:9;9274:22;9253:53;:::i;:::-;9243:63;;9198:118;8849:474;;;;;:::o;9329:118::-;9416:24;9434:5;9416:24;:::i;:::-;9411:3;9404:37;9329:118;;:::o;9453:109::-;9534:21;9549:5;9534:21;:::i;:::-;9529:3;9522:34;9453:109;;:::o;9568:360::-;9654:3;9682:38;9714:5;9682:38;:::i;:::-;9736:70;9799:6;9794:3;9736:70;:::i;:::-;9729:77;;9815:52;9860:6;9855:3;9848:4;9841:5;9837:16;9815:52;:::i;:::-;9892:29;9914:6;9892:29;:::i;:::-;9887:3;9883:39;9876:46;;9658:270;9568:360;;;;:::o;9934:364::-;10022:3;10050:39;10083:5;10050:39;:::i;:::-;10105:71;10169:6;10164:3;10105:71;:::i;:::-;10098:78;;10185:52;10230:6;10225:3;10218:4;10211:5;10207:16;10185:52;:::i;:::-;10262:29;10284:6;10262:29;:::i;:::-;10257:3;10253:39;10246:46;;10026:272;9934:364;;;;:::o;10304:377::-;10410:3;10438:39;10471:5;10438:39;:::i;:::-;10493:89;10575:6;10570:3;10493:89;:::i;:::-;10486:96;;10591:52;10636:6;10631:3;10624:4;10617:5;10613:16;10591:52;:::i;:::-;10668:6;10663:3;10659:16;10652:23;;10414:267;10304:377;;;;:::o;10687:366::-;10829:3;10850:67;10914:2;10909:3;10850:67;:::i;:::-;10843:74;;10926:93;11015:3;10926:93;:::i;:::-;11044:2;11039:3;11035:12;11028:19;;10687:366;;;:::o;11059:::-;11201:3;11222:67;11286:2;11281:3;11222:67;:::i;:::-;11215:74;;11298:93;11387:3;11298:93;:::i;:::-;11416:2;11411:3;11407:12;11400:19;;11059:366;;;:::o;11431:::-;11573:3;11594:67;11658:2;11653:3;11594:67;:::i;:::-;11587:74;;11670:93;11759:3;11670:93;:::i;:::-;11788:2;11783:3;11779:12;11772:19;;11431:366;;;:::o;11803:::-;11945:3;11966:67;12030:2;12025:3;11966:67;:::i;:::-;11959:74;;12042:93;12131:3;12042:93;:::i;:::-;12160:2;12155:3;12151:12;12144:19;;11803:366;;;:::o;12175:::-;12317:3;12338:67;12402:2;12397:3;12338:67;:::i;:::-;12331:74;;12414:93;12503:3;12414:93;:::i;:::-;12532:2;12527:3;12523:12;12516:19;;12175:366;;;:::o;12547:::-;12689:3;12710:67;12774:2;12769:3;12710:67;:::i;:::-;12703:74;;12786:93;12875:3;12786:93;:::i;:::-;12904:2;12899:3;12895:12;12888:19;;12547:366;;;:::o;12919:::-;13061:3;13082:67;13146:2;13141:3;13082:67;:::i;:::-;13075:74;;13158:93;13247:3;13158:93;:::i;:::-;13276:2;13271:3;13267:12;13260:19;;12919:366;;;:::o;13291:::-;13433:3;13454:67;13518:2;13513:3;13454:67;:::i;:::-;13447:74;;13530:93;13619:3;13530:93;:::i;:::-;13648:2;13643:3;13639:12;13632:19;;13291:366;;;:::o;13663:::-;13805:3;13826:67;13890:2;13885:3;13826:67;:::i;:::-;13819:74;;13902:93;13991:3;13902:93;:::i;:::-;14020:2;14015:3;14011:12;14004:19;;13663:366;;;:::o;14035:::-;14177:3;14198:67;14262:2;14257:3;14198:67;:::i;:::-;14191:74;;14274:93;14363:3;14274:93;:::i;:::-;14392:2;14387:3;14383:12;14376:19;;14035:366;;;:::o;14407:::-;14549:3;14570:67;14634:2;14629:3;14570:67;:::i;:::-;14563:74;;14646:93;14735:3;14646:93;:::i;:::-;14764:2;14759:3;14755:12;14748:19;;14407:366;;;:::o;14779:::-;14921:3;14942:67;15006:2;15001:3;14942:67;:::i;:::-;14935:74;;15018:93;15107:3;15018:93;:::i;:::-;15136:2;15131:3;15127:12;15120:19;;14779:366;;;:::o;15151:::-;15293:3;15314:67;15378:2;15373:3;15314:67;:::i;:::-;15307:74;;15390:93;15479:3;15390:93;:::i;:::-;15508:2;15503:3;15499:12;15492:19;;15151:366;;;:::o;15523:::-;15665:3;15686:67;15750:2;15745:3;15686:67;:::i;:::-;15679:74;;15762:93;15851:3;15762:93;:::i;:::-;15880:2;15875:3;15871:12;15864:19;;15523:366;;;:::o;15895:::-;16037:3;16058:67;16122:2;16117:3;16058:67;:::i;:::-;16051:74;;16134:93;16223:3;16134:93;:::i;:::-;16252:2;16247:3;16243:12;16236:19;;15895:366;;;:::o;16267:::-;16409:3;16430:67;16494:2;16489:3;16430:67;:::i;:::-;16423:74;;16506:93;16595:3;16506:93;:::i;:::-;16624:2;16619:3;16615:12;16608:19;;16267:366;;;:::o;16639:::-;16781:3;16802:67;16866:2;16861:3;16802:67;:::i;:::-;16795:74;;16878:93;16967:3;16878:93;:::i;:::-;16996:2;16991:3;16987:12;16980:19;;16639:366;;;:::o;17011:::-;17153:3;17174:67;17238:2;17233:3;17174:67;:::i;:::-;17167:74;;17250:93;17339:3;17250:93;:::i;:::-;17368:2;17363:3;17359:12;17352:19;;17011:366;;;:::o;17383:::-;17525:3;17546:67;17610:2;17605:3;17546:67;:::i;:::-;17539:74;;17622:93;17711:3;17622:93;:::i;:::-;17740:2;17735:3;17731:12;17724:19;;17383:366;;;:::o;17755:::-;17897:3;17918:67;17982:2;17977:3;17918:67;:::i;:::-;17911:74;;17994:93;18083:3;17994:93;:::i;:::-;18112:2;18107:3;18103:12;18096:19;;17755:366;;;:::o;18127:::-;18269:3;18290:67;18354:2;18349:3;18290:67;:::i;:::-;18283:74;;18366:93;18455:3;18366:93;:::i;:::-;18484:2;18479:3;18475:12;18468:19;;18127:366;;;:::o;18499:::-;18641:3;18662:67;18726:2;18721:3;18662:67;:::i;:::-;18655:74;;18738:93;18827:3;18738:93;:::i;:::-;18856:2;18851:3;18847:12;18840:19;;18499:366;;;:::o;18871:118::-;18958:24;18976:5;18958:24;:::i;:::-;18953:3;18946:37;18871:118;;:::o;18995:435::-;19175:3;19197:95;19288:3;19279:6;19197:95;:::i;:::-;19190:102;;19309:95;19400:3;19391:6;19309:95;:::i;:::-;19302:102;;19421:3;19414:10;;18995:435;;;;;:::o;19436:222::-;19529:4;19567:2;19556:9;19552:18;19544:26;;19580:71;19648:1;19637:9;19633:17;19624:6;19580:71;:::i;:::-;19436:222;;;;:::o;19664:640::-;19859:4;19897:3;19886:9;19882:19;19874:27;;19911:71;19979:1;19968:9;19964:17;19955:6;19911:71;:::i;:::-;19992:72;20060:2;20049:9;20045:18;20036:6;19992:72;:::i;:::-;20074;20142:2;20131:9;20127:18;20118:6;20074:72;:::i;:::-;20193:9;20187:4;20183:20;20178:2;20167:9;20163:18;20156:48;20221:76;20292:4;20283:6;20221:76;:::i;:::-;20213:84;;19664:640;;;;;;;:::o;20310:332::-;20431:4;20469:2;20458:9;20454:18;20446:26;;20482:71;20550:1;20539:9;20535:17;20526:6;20482:71;:::i;:::-;20563:72;20631:2;20620:9;20616:18;20607:6;20563:72;:::i;:::-;20310:332;;;;;:::o;20648:210::-;20735:4;20773:2;20762:9;20758:18;20750:26;;20786:65;20848:1;20837:9;20833:17;20824:6;20786:65;:::i;:::-;20648:210;;;;:::o;20864:313::-;20977:4;21015:2;21004:9;21000:18;20992:26;;21064:9;21058:4;21054:20;21050:1;21039:9;21035:17;21028:47;21092:78;21165:4;21156:6;21092:78;:::i;:::-;21084:86;;20864:313;;;;:::o;21183:419::-;21349:4;21387:2;21376:9;21372:18;21364:26;;21436:9;21430:4;21426:20;21422:1;21411:9;21407:17;21400:47;21464:131;21590:4;21464:131;:::i;:::-;21456:139;;21183:419;;;:::o;21608:::-;21774:4;21812:2;21801:9;21797:18;21789:26;;21861:9;21855:4;21851:20;21847:1;21836:9;21832:17;21825:47;21889:131;22015:4;21889:131;:::i;:::-;21881:139;;21608:419;;;:::o;22033:::-;22199:4;22237:2;22226:9;22222:18;22214:26;;22286:9;22280:4;22276:20;22272:1;22261:9;22257:17;22250:47;22314:131;22440:4;22314:131;:::i;:::-;22306:139;;22033:419;;;:::o;22458:::-;22624:4;22662:2;22651:9;22647:18;22639:26;;22711:9;22705:4;22701:20;22697:1;22686:9;22682:17;22675:47;22739:131;22865:4;22739:131;:::i;:::-;22731:139;;22458:419;;;:::o;22883:::-;23049:4;23087:2;23076:9;23072:18;23064:26;;23136:9;23130:4;23126:20;23122:1;23111:9;23107:17;23100:47;23164:131;23290:4;23164:131;:::i;:::-;23156:139;;22883:419;;;:::o;23308:::-;23474:4;23512:2;23501:9;23497:18;23489:26;;23561:9;23555:4;23551:20;23547:1;23536:9;23532:17;23525:47;23589:131;23715:4;23589:131;:::i;:::-;23581:139;;23308:419;;;:::o;23733:::-;23899:4;23937:2;23926:9;23922:18;23914:26;;23986:9;23980:4;23976:20;23972:1;23961:9;23957:17;23950:47;24014:131;24140:4;24014:131;:::i;:::-;24006:139;;23733:419;;;:::o;24158:::-;24324:4;24362:2;24351:9;24347:18;24339:26;;24411:9;24405:4;24401:20;24397:1;24386:9;24382:17;24375:47;24439:131;24565:4;24439:131;:::i;:::-;24431:139;;24158:419;;;:::o;24583:::-;24749:4;24787:2;24776:9;24772:18;24764:26;;24836:9;24830:4;24826:20;24822:1;24811:9;24807:17;24800:47;24864:131;24990:4;24864:131;:::i;:::-;24856:139;;24583:419;;;:::o;25008:::-;25174:4;25212:2;25201:9;25197:18;25189:26;;25261:9;25255:4;25251:20;25247:1;25236:9;25232:17;25225:47;25289:131;25415:4;25289:131;:::i;:::-;25281:139;;25008:419;;;:::o;25433:::-;25599:4;25637:2;25626:9;25622:18;25614:26;;25686:9;25680:4;25676:20;25672:1;25661:9;25657:17;25650:47;25714:131;25840:4;25714:131;:::i;:::-;25706:139;;25433:419;;;:::o;25858:::-;26024:4;26062:2;26051:9;26047:18;26039:26;;26111:9;26105:4;26101:20;26097:1;26086:9;26082:17;26075:47;26139:131;26265:4;26139:131;:::i;:::-;26131:139;;25858:419;;;:::o;26283:::-;26449:4;26487:2;26476:9;26472:18;26464:26;;26536:9;26530:4;26526:20;26522:1;26511:9;26507:17;26500:47;26564:131;26690:4;26564:131;:::i;:::-;26556:139;;26283:419;;;:::o;26708:::-;26874:4;26912:2;26901:9;26897:18;26889:26;;26961:9;26955:4;26951:20;26947:1;26936:9;26932:17;26925:47;26989:131;27115:4;26989:131;:::i;:::-;26981:139;;26708:419;;;:::o;27133:::-;27299:4;27337:2;27326:9;27322:18;27314:26;;27386:9;27380:4;27376:20;27372:1;27361:9;27357:17;27350:47;27414:131;27540:4;27414:131;:::i;:::-;27406:139;;27133:419;;;:::o;27558:::-;27724:4;27762:2;27751:9;27747:18;27739:26;;27811:9;27805:4;27801:20;27797:1;27786:9;27782:17;27775:47;27839:131;27965:4;27839:131;:::i;:::-;27831:139;;27558:419;;;:::o;27983:::-;28149:4;28187:2;28176:9;28172:18;28164:26;;28236:9;28230:4;28226:20;28222:1;28211:9;28207:17;28200:47;28264:131;28390:4;28264:131;:::i;:::-;28256:139;;27983:419;;;:::o;28408:::-;28574:4;28612:2;28601:9;28597:18;28589:26;;28661:9;28655:4;28651:20;28647:1;28636:9;28632:17;28625:47;28689:131;28815:4;28689:131;:::i;:::-;28681:139;;28408:419;;;:::o;28833:::-;28999:4;29037:2;29026:9;29022:18;29014:26;;29086:9;29080:4;29076:20;29072:1;29061:9;29057:17;29050:47;29114:131;29240:4;29114:131;:::i;:::-;29106:139;;28833:419;;;:::o;29258:::-;29424:4;29462:2;29451:9;29447:18;29439:26;;29511:9;29505:4;29501:20;29497:1;29486:9;29482:17;29475:47;29539:131;29665:4;29539:131;:::i;:::-;29531:139;;29258:419;;;:::o;29683:::-;29849:4;29887:2;29876:9;29872:18;29864:26;;29936:9;29930:4;29926:20;29922:1;29911:9;29907:17;29900:47;29964:131;30090:4;29964:131;:::i;:::-;29956:139;;29683:419;;;:::o;30108:::-;30274:4;30312:2;30301:9;30297:18;30289:26;;30361:9;30355:4;30351:20;30347:1;30336:9;30332:17;30325:47;30389:131;30515:4;30389:131;:::i;:::-;30381:139;;30108:419;;;:::o;30533:222::-;30626:4;30664:2;30653:9;30649:18;30641:26;;30677:71;30745:1;30734:9;30730:17;30721:6;30677:71;:::i;:::-;30533:222;;;;:::o;30761:129::-;30795:6;30822:20;;:::i;:::-;30812:30;;30851:33;30879:4;30871:6;30851:33;:::i;:::-;30761:129;;;:::o;30896:75::-;30929:6;30962:2;30956:9;30946:19;;30896:75;:::o;30977:307::-;31038:4;31128:18;31120:6;31117:30;31114:56;;;31150:18;;:::i;:::-;31114:56;31188:29;31210:6;31188:29;:::i;:::-;31180:37;;31272:4;31266;31262:15;31254:23;;30977:307;;;:::o;31290:98::-;31341:6;31375:5;31369:12;31359:22;;31290:98;;;:::o;31394:99::-;31446:6;31480:5;31474:12;31464:22;;31394:99;;;:::o;31499:168::-;31582:11;31616:6;31611:3;31604:19;31656:4;31651:3;31647:14;31632:29;;31499:168;;;;:::o;31673:169::-;31757:11;31791:6;31786:3;31779:19;31831:4;31826:3;31822:14;31807:29;;31673:169;;;;:::o;31848:148::-;31950:11;31987:3;31972:18;;31848:148;;;;:::o;32002:305::-;32042:3;32061:20;32079:1;32061:20;:::i;:::-;32056:25;;32095:20;32113:1;32095:20;:::i;:::-;32090:25;;32249:1;32181:66;32177:74;32174:1;32171:81;32168:107;;;32255:18;;:::i;:::-;32168:107;32299:1;32296;32292:9;32285:16;;32002:305;;;;:::o;32313:185::-;32353:1;32370:20;32388:1;32370:20;:::i;:::-;32365:25;;32404:20;32422:1;32404:20;:::i;:::-;32399:25;;32443:1;32433:35;;32448:18;;:::i;:::-;32433:35;32490:1;32487;32483:9;32478:14;;32313:185;;;;:::o;32504:348::-;32544:7;32567:20;32585:1;32567:20;:::i;:::-;32562:25;;32601:20;32619:1;32601:20;:::i;:::-;32596:25;;32789:1;32721:66;32717:74;32714:1;32711:81;32706:1;32699:9;32692:17;32688:105;32685:131;;;32796:18;;:::i;:::-;32685:131;32844:1;32841;32837:9;32826:20;;32504:348;;;;:::o;32858:191::-;32898:4;32918:20;32936:1;32918:20;:::i;:::-;32913:25;;32952:20;32970:1;32952:20;:::i;:::-;32947:25;;32991:1;32988;32985:8;32982:34;;;32996:18;;:::i;:::-;32982:34;33041:1;33038;33034:9;33026:17;;32858:191;;;;:::o;33055:96::-;33092:7;33121:24;33139:5;33121:24;:::i;:::-;33110:35;;33055:96;;;:::o;33157:90::-;33191:7;33234:5;33227:13;33220:21;33209:32;;33157:90;;;:::o;33253:149::-;33289:7;33329:66;33322:5;33318:78;33307:89;;33253:149;;;:::o;33408:89::-;33444:7;33484:6;33477:5;33473:18;33462:29;;33408:89;;;:::o;33503:126::-;33540:7;33580:42;33573:5;33569:54;33558:65;;33503:126;;;:::o;33635:77::-;33672:7;33701:5;33690:16;;33635:77;;;:::o;33718:109::-;33754:7;33794:26;33787:5;33783:38;33772:49;;33718:109;;;:::o;33833:154::-;33917:6;33912:3;33907;33894:30;33979:1;33970:6;33965:3;33961:16;33954:27;33833:154;;;:::o;33993:307::-;34061:1;34071:113;34085:6;34082:1;34079:13;34071:113;;;34170:1;34165:3;34161:11;34155:18;34151:1;34146:3;34142:11;34135:39;34107:2;34104:1;34100:10;34095:15;;34071:113;;;34202:6;34199:1;34196:13;34193:101;;;34282:1;34273:6;34268:3;34264:16;34257:27;34193:101;34042:258;33993:307;;;:::o;34306:320::-;34350:6;34387:1;34381:4;34377:12;34367:22;;34434:1;34428:4;34424:12;34455:18;34445:81;;34511:4;34503:6;34499:17;34489:27;;34445:81;34573:2;34565:6;34562:14;34542:18;34539:38;34536:84;;;34592:18;;:::i;:::-;34536:84;34357:269;34306:320;;;:::o;34632:281::-;34715:27;34737:4;34715:27;:::i;:::-;34707:6;34703:40;34845:6;34833:10;34830:22;34809:18;34797:10;34794:34;34791:62;34788:88;;;34856:18;;:::i;:::-;34788:88;34896:10;34892:2;34885:22;34675:238;34632:281;;:::o;34919:233::-;34958:3;34981:24;34999:5;34981:24;:::i;:::-;34972:33;;35027:66;35020:5;35017:77;35014:103;;;35097:18;;:::i;:::-;35014:103;35144:1;35137:5;35133:13;35126:20;;34919:233;;;:::o;35158:176::-;35190:1;35207:20;35225:1;35207:20;:::i;:::-;35202:25;;35241:20;35259:1;35241:20;:::i;:::-;35236:25;;35280:1;35270:35;;35285:18;;:::i;:::-;35270:35;35326:1;35323;35319:9;35314:14;;35158:176;;;;:::o;35340:180::-;35388:77;35385:1;35378:88;35485:4;35482:1;35475:15;35509:4;35506:1;35499:15;35526:180;35574:77;35571:1;35564:88;35671:4;35668:1;35661:15;35695:4;35692:1;35685:15;35712:180;35760:77;35757:1;35750:88;35857:4;35854:1;35847:15;35881:4;35878:1;35871:15;35898:180;35946:77;35943:1;35936:88;36043:4;36040:1;36033:15;36067:4;36064:1;36057:15;36084:180;36132:77;36129:1;36122:88;36229:4;36226:1;36219:15;36253:4;36250:1;36243:15;36270:180;36318:77;36315:1;36308:88;36415:4;36412:1;36405:15;36439:4;36436:1;36429:15;36456:117;36565:1;36562;36555:12;36579:117;36688:1;36685;36678:12;36702:117;36811:1;36808;36801:12;36825:117;36934:1;36931;36924:12;36948:117;37057:1;37054;37047:12;37071:117;37180:1;37177;37170:12;37194:102;37235:6;37286:2;37282:7;37277:2;37270:5;37266:14;37262:28;37252:38;;37194:102;;;:::o;37302:167::-;37442:19;37438:1;37430:6;37426:14;37419:43;37302:167;:::o;37475:172::-;37615:24;37611:1;37603:6;37599:14;37592:48;37475:172;:::o;37653:230::-;37793:34;37789:1;37781:6;37777:14;37770:58;37862:13;37857:2;37849:6;37845:15;37838:38;37653:230;:::o;37889:237::-;38029:34;38025:1;38017:6;38013:14;38006:58;38098:20;38093:2;38085:6;38081:15;38074:45;37889:237;:::o;38132:225::-;38272:34;38268:1;38260:6;38256:14;38249:58;38341:8;38336:2;38328:6;38324:15;38317:33;38132:225;:::o;38363:224::-;38503:34;38499:1;38491:6;38487:14;38480:58;38572:7;38567:2;38559:6;38555:15;38548:32;38363:224;:::o;38593:178::-;38733:30;38729:1;38721:6;38717:14;38710:54;38593:178;:::o;38777:223::-;38917:34;38913:1;38905:6;38901:14;38894:58;38986:6;38981:2;38973:6;38969:15;38962:31;38777:223;:::o;39006:175::-;39146:27;39142:1;39134:6;39130:14;39123:51;39006:175;:::o;39187:228::-;39327:34;39323:1;39315:6;39311:14;39304:58;39396:11;39391:2;39383:6;39379:15;39372:36;39187:228;:::o;39421:233::-;39561:34;39557:1;39549:6;39545:14;39538:58;39630:16;39625:2;39617:6;39613:15;39606:41;39421:233;:::o;39660:178::-;39800:30;39796:1;39788:6;39784:14;39777:54;39660:178;:::o;39844:249::-;39984:34;39980:1;39972:6;39968:14;39961:58;40053:32;40048:2;40040:6;40036:15;40029:57;39844:249;:::o;40099:182::-;40239:34;40235:1;40227:6;40223:14;40216:58;40099:182;:::o;40287:::-;40427:34;40423:1;40415:6;40411:14;40404:58;40287:182;:::o;40475:174::-;40615:26;40611:1;40603:6;40599:14;40592:50;40475:174;:::o;40655:220::-;40795:34;40791:1;40783:6;40779:14;40772:58;40864:3;40859:2;40851:6;40847:15;40840:28;40655:220;:::o;40881:231::-;41021:34;41017:1;41009:6;41005:14;40998:58;41090:14;41085:2;41077:6;41073:15;41066:39;40881:231;:::o;41118:161::-;41258:13;41254:1;41246:6;41242:14;41235:37;41118:161;:::o;41285:229::-;41425:34;41421:1;41413:6;41409:14;41402:58;41494:12;41489:2;41481:6;41477:15;41470:37;41285:229;:::o;41520:233::-;41660:34;41656:1;41648:6;41644:14;41637:58;41729:16;41724:2;41716:6;41712:15;41705:41;41520:233;:::o;41759:175::-;41899:27;41895:1;41887:6;41883:14;41876:51;41759:175;:::o;41940:122::-;42013:24;42031:5;42013:24;:::i;:::-;42006:5;42003:35;41993:63;;42052:1;42049;42042:12;41993:63;41940:122;:::o;42068:116::-;42138:21;42153:5;42138:21;:::i;:::-;42131:5;42128:32;42118:60;;42174:1;42171;42164:12;42118:60;42068:116;:::o;42190:120::-;42262:23;42279:5;42262:23;:::i;:::-;42255:5;42252:34;42242:62;;42300:1;42297;42290:12;42242:62;42190:120;:::o;42316:::-;42388:23;42405:5;42388:23;:::i;:::-;42381:5;42378:34;42368:62;;42426:1;42423;42416:12;42368:62;42316:120;:::o;42442:122::-;42515:24;42533:5;42515:24;:::i;:::-;42508:5;42505:35;42495:63;;42554:1;42551;42544:12;42495:63;42442:122;:::o;42570:120::-;42642:23;42659:5;42642:23;:::i;:::-;42635:5;42632:34;42622:62;;42680:1;42677;42670:12;42622:62;42570:120;:::o
Swarm Source
ipfs://f9170e3bf23905cc28088649c1d6eb6085baff965a3f7a9f0c707e1a38ffa62e
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in GLMR
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.