Source Code
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
PreSale
Compiler Version
v0.8.25+commit.b61c2a91
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2024-04-18
*/
// SPDX-License-Identifier: UNLICENSED
// File: @openzeppelin/contracts/interfaces/draft-IERC6093.sol
// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/draft-IERC6093.sol)
pragma solidity ^0.8.20;
/**
* @dev Standard ERC20 Errors
* Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC20 tokens.
*/
interface IERC20Errors {
/**
* @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.
* @param sender Address whose tokens are being transferred.
* @param balance Current balance for the interacting account.
* @param needed Minimum amount required to perform a transfer.
*/
error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed);
/**
* @dev Indicates a failure with the token `sender`. Used in transfers.
* @param sender Address whose tokens are being transferred.
*/
error ERC20InvalidSender(address sender);
/**
* @dev Indicates a failure with the token `receiver`. Used in transfers.
* @param receiver Address to which tokens are being transferred.
*/
error ERC20InvalidReceiver(address receiver);
/**
* @dev Indicates a failure with the `spender`’s `allowance`. Used in transfers.
* @param spender Address that may be allowed to operate on tokens without being their owner.
* @param allowance Amount of tokens a `spender` is allowed to operate with.
* @param needed Minimum amount required to perform a transfer.
*/
error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed);
/**
* @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
* @param approver Address initiating an approval operation.
*/
error ERC20InvalidApprover(address approver);
/**
* @dev Indicates a failure with the `spender` to be approved. Used in approvals.
* @param spender Address that may be allowed to operate on tokens without being their owner.
*/
error ERC20InvalidSpender(address spender);
}
/**
* @dev Standard ERC721 Errors
* Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC721 tokens.
*/
interface IERC721Errors {
/**
* @dev Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in EIP-20.
* Used in balance queries.
* @param owner Address of the current owner of a token.
*/
error ERC721InvalidOwner(address owner);
/**
* @dev Indicates a `tokenId` whose `owner` is the zero address.
* @param tokenId Identifier number of a token.
*/
error ERC721NonexistentToken(uint256 tokenId);
/**
* @dev Indicates an error related to the ownership over a particular token. Used in transfers.
* @param sender Address whose tokens are being transferred.
* @param tokenId Identifier number of a token.
* @param owner Address of the current owner of a token.
*/
error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner);
/**
* @dev Indicates a failure with the token `sender`. Used in transfers.
* @param sender Address whose tokens are being transferred.
*/
error ERC721InvalidSender(address sender);
/**
* @dev Indicates a failure with the token `receiver`. Used in transfers.
* @param receiver Address to which tokens are being transferred.
*/
error ERC721InvalidReceiver(address receiver);
/**
* @dev Indicates a failure with the `operator`’s approval. Used in transfers.
* @param operator Address that may be allowed to operate on tokens without being their owner.
* @param tokenId Identifier number of a token.
*/
error ERC721InsufficientApproval(address operator, uint256 tokenId);
/**
* @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
* @param approver Address initiating an approval operation.
*/
error ERC721InvalidApprover(address approver);
/**
* @dev Indicates a failure with the `operator` to be approved. Used in approvals.
* @param operator Address that may be allowed to operate on tokens without being their owner.
*/
error ERC721InvalidOperator(address operator);
}
/**
* @dev Standard ERC1155 Errors
* Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC1155 tokens.
*/
interface IERC1155Errors {
/**
* @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.
* @param sender Address whose tokens are being transferred.
* @param balance Current balance for the interacting account.
* @param needed Minimum amount required to perform a transfer.
* @param tokenId Identifier number of a token.
*/
error ERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId);
/**
* @dev Indicates a failure with the token `sender`. Used in transfers.
* @param sender Address whose tokens are being transferred.
*/
error ERC1155InvalidSender(address sender);
/**
* @dev Indicates a failure with the token `receiver`. Used in transfers.
* @param receiver Address to which tokens are being transferred.
*/
error ERC1155InvalidReceiver(address receiver);
/**
* @dev Indicates a failure with the `operator`’s approval. Used in transfers.
* @param operator Address that may be allowed to operate on tokens without being their owner.
* @param owner Address of the current owner of a token.
*/
error ERC1155MissingApprovalForAll(address operator, address owner);
/**
* @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
* @param approver Address initiating an approval operation.
*/
error ERC1155InvalidApprover(address approver);
/**
* @dev Indicates a failure with the `operator` to be approved. Used in approvals.
* @param operator Address that may be allowed to operate on tokens without being their owner.
*/
error ERC1155InvalidOperator(address operator);
/**
* @dev Indicates an array length mismatch between ids and values in a safeBatchTransferFrom operation.
* Used in batch transfers.
* @param idsLength Length of the array of token identifiers
* @param valuesLength Length of the array of token amounts
*/
error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength);
}
// File: @openzeppelin/contracts/utils/ReentrancyGuard.sol
// OpenZeppelin Contracts (last updated v5.0.0) (utils/ReentrancyGuard.sol)
pragma solidity ^0.8.20;
/**
* @dev Contract module that helps prevent reentrant calls to a function.
*
* Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
* available, which can be applied to functions to make sure there are no nested
* (reentrant) calls to them.
*
* Note that because there is a single `nonReentrant` guard, functions marked as
* `nonReentrant` may not call one another. This can be worked around by making
* those functions `private`, and then adding `external` `nonReentrant` entry
* points to them.
*
* TIP: If you would like to learn more about reentrancy and alternative ways
* to protect against it, check out our blog post
* https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
*/
abstract contract ReentrancyGuard {
// Booleans are more expensive than uint256 or any type that takes up a full
// word because each write operation emits an extra SLOAD to first read the
// slot's contents, replace the bits taken up by the boolean, and then write
// back. This is the compiler's defense against contract upgrades and
// pointer aliasing, and it cannot be disabled.
// The values being non-zero value makes deployment a bit more expensive,
// but in exchange the refund on every call to nonReentrant will be lower in
// amount. Since refunds are capped to a percentage of the total
// transaction's gas, it is best to keep them low in cases like this one, to
// increase the likelihood of the full refund coming into effect.
uint256 private constant NOT_ENTERED = 1;
uint256 private constant ENTERED = 2;
uint256 private _status;
/**
* @dev Unauthorized reentrant call.
*/
error ReentrancyGuardReentrantCall();
constructor() {
_status = NOT_ENTERED;
}
/**
* @dev Prevents a contract from calling itself, directly or indirectly.
* Calling a `nonReentrant` function from another `nonReentrant`
* function is not supported. It is possible to prevent this from happening
* by making the `nonReentrant` function external, and making it call a
* `private` function that does the actual work.
*/
modifier nonReentrant() {
_nonReentrantBefore();
_;
_nonReentrantAfter();
}
function _nonReentrantBefore() private {
// On the first call to nonReentrant, _status will be NOT_ENTERED
if (_status == ENTERED) {
revert ReentrancyGuardReentrantCall();
}
// Any calls to nonReentrant after this point will fail
_status = ENTERED;
}
function _nonReentrantAfter() private {
// By storing the original value once again, a refund is triggered (see
// https://eips.ethereum.org/EIPS/eip-2200)
_status = NOT_ENTERED;
}
/**
* @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a
* `nonReentrant` function in the call stack.
*/
function _reentrancyGuardEntered() internal view returns (bool) {
return _status == ENTERED;
}
}
// File: @openzeppelin/contracts/utils/Context.sol
// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)
pragma solidity ^0.8.20;
/**
* @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;
}
function _contextSuffixLength() internal view virtual returns (uint256) {
return 0;
}
}
// File: @openzeppelin/contracts/access/Ownable.sol
// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)
pragma solidity ^0.8.20;
/**
* @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.
*
* The initial owner is set to the address provided by the deployer. 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;
/**
* @dev The caller account is not authorized to perform an operation.
*/
error OwnableUnauthorizedAccount(address account);
/**
* @dev The owner is not a valid owner account. (eg. `address(0)`)
*/
error OwnableInvalidOwner(address owner);
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the address provided by the deployer as the initial owner.
*/
constructor(address initialOwner) {
if (initialOwner == address(0)) {
revert OwnableInvalidOwner(address(0));
}
_transferOwnership(initialOwner);
}
/**
* @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 {
if (owner() != _msgSender()) {
revert OwnableUnauthorizedAccount(_msgSender());
}
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby disabling 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 {
if (newOwner == address(0)) {
revert OwnableInvalidOwner(address(0));
}
_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: @openzeppelin/contracts/token/ERC20/IERC20.sol
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol)
pragma solidity ^0.8.20;
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
/**
* @dev Returns the value of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the value of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves a `value` amount of tokens from the caller's account to `to`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address to, uint256 value) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets a `value` amount of tokens as the allowance of `spender` over the
* caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 value) external returns (bool);
/**
* @dev Moves a `value` amount of tokens from `from` to `to` using the
* allowance mechanism. `value` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(address from, address to, uint256 value) external returns (bool);
}
// File: @openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/IERC20Metadata.sol)
pragma solidity ^0.8.20;
/**
* @dev Interface for the optional metadata functions from the ERC20 standard.
*/
interface IERC20Metadata is IERC20 {
/**
* @dev Returns the name of the token.
*/
function name() external view returns (string memory);
/**
* @dev Returns the symbol of the token.
*/
function symbol() external view returns (string memory);
/**
* @dev Returns the decimals places of the token.
*/
function decimals() external view returns (uint8);
}
// File: @openzeppelin/contracts/token/ERC20/ERC20.sol
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/ERC20.sol)
pragma solidity ^0.8.20;
/**
* @dev Implementation of the {IERC20} interface.
*
* This implementation is agnostic to the way tokens are created. This means
* that a supply mechanism has to be added in a derived contract using {_mint}.
*
* TIP: For a detailed writeup see our guide
* https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How
* to implement supply mechanisms].
*
* The default value of {decimals} is 18. To change this, you should override
* this function so it returns a different value.
*
* We have followed general OpenZeppelin Contracts guidelines: functions revert
* instead returning `false` on failure. This behavior is nonetheless
* conventional and does not conflict with the expectations of ERC20
* applications.
*
* Additionally, an {Approval} event is emitted on calls to {transferFrom}.
* This allows applications to reconstruct the allowance for all accounts just
* by listening to said events. Other implementations of the EIP may not emit
* these events, as it isn't required by the specification.
*/
abstract contract ERC20 is Context, IERC20, IERC20Metadata, IERC20Errors {
mapping(address account => uint256) private _balances;
mapping(address account => mapping(address spender => uint256)) private _allowances;
uint256 private _totalSupply;
string private _name;
string private _symbol;
/**
* @dev Sets the values for {name} and {symbol}.
*
* All two of these values are immutable: they can only be set once during
* construction.
*/
constructor(string memory name_, string memory symbol_) {
_name = name_;
_symbol = symbol_;
}
/**
* @dev Returns the name of the token.
*/
function name() public view virtual returns (string memory) {
return _name;
}
/**
* @dev Returns the symbol of the token, usually a shorter version of the
* name.
*/
function symbol() public view virtual returns (string memory) {
return _symbol;
}
/**
* @dev Returns the number of decimals used to get its user representation.
* For example, if `decimals` equals `2`, a balance of `505` tokens should
* be displayed to a user as `5.05` (`505 / 10 ** 2`).
*
* Tokens usually opt for a value of 18, imitating the relationship between
* Ether and Wei. This is the default value returned by this function, unless
* it's overridden.
*
* NOTE: This information is only used for _display_ purposes: it in
* no way affects any of the arithmetic of the contract, including
* {IERC20-balanceOf} and {IERC20-transfer}.
*/
function decimals() public view virtual returns (uint8) {
return 18;
}
/**
* @dev See {IERC20-totalSupply}.
*/
function totalSupply() public view virtual returns (uint256) {
return _totalSupply;
}
/**
* @dev See {IERC20-balanceOf}.
*/
function balanceOf(address account) public view virtual returns (uint256) {
return _balances[account];
}
/**
* @dev See {IERC20-transfer}.
*
* Requirements:
*
* - `to` cannot be the zero address.
* - the caller must have a balance of at least `value`.
*/
function transfer(address to, uint256 value) public virtual returns (bool) {
address owner = _msgSender();
_transfer(owner, to, value);
return true;
}
/**
* @dev See {IERC20-allowance}.
*/
function allowance(address owner, address spender) public view virtual returns (uint256) {
return _allowances[owner][spender];
}
/**
* @dev See {IERC20-approve}.
*
* NOTE: If `value` is the maximum `uint256`, the allowance is not updated on
* `transferFrom`. This is semantically equivalent to an infinite approval.
*
* Requirements:
*
* - `spender` cannot be the zero address.
*/
function approve(address spender, uint256 value) public virtual returns (bool) {
address owner = _msgSender();
_approve(owner, spender, value);
return true;
}
/**
* @dev See {IERC20-transferFrom}.
*
* Emits an {Approval} event indicating the updated allowance. This is not
* required by the EIP. See the note at the beginning of {ERC20}.
*
* NOTE: Does not update the allowance if the current allowance
* is the maximum `uint256`.
*
* Requirements:
*
* - `from` and `to` cannot be the zero address.
* - `from` must have a balance of at least `value`.
* - the caller must have allowance for ``from``'s tokens of at least
* `value`.
*/
function transferFrom(address from, address to, uint256 value) public virtual returns (bool) {
address spender = _msgSender();
_spendAllowance(from, spender, value);
_transfer(from, to, value);
return true;
}
/**
* @dev Moves a `value` amount of tokens from `from` to `to`.
*
* This internal function is equivalent to {transfer}, and can be used to
* e.g. implement automatic token fees, slashing mechanisms, etc.
*
* Emits a {Transfer} event.
*
* NOTE: This function is not virtual, {_update} should be overridden instead.
*/
function _transfer(address from, address to, uint256 value) internal {
if (from == address(0)) {
revert ERC20InvalidSender(address(0));
}
if (to == address(0)) {
revert ERC20InvalidReceiver(address(0));
}
_update(from, to, value);
}
/**
* @dev Transfers a `value` amount of tokens from `from` to `to`, or alternatively mints (or burns) if `from`
* (or `to`) is the zero address. All customizations to transfers, mints, and burns should be done by overriding
* this function.
*
* Emits a {Transfer} event.
*/
function _update(address from, address to, uint256 value) internal virtual {
if (from == address(0)) {
// Overflow check required: The rest of the code assumes that totalSupply never overflows
_totalSupply += value;
} else {
uint256 fromBalance = _balances[from];
if (fromBalance < value) {
revert ERC20InsufficientBalance(from, fromBalance, value);
}
unchecked {
// Overflow not possible: value <= fromBalance <= totalSupply.
_balances[from] = fromBalance - value;
}
}
if (to == address(0)) {
unchecked {
// Overflow not possible: value <= totalSupply or value <= fromBalance <= totalSupply.
_totalSupply -= value;
}
} else {
unchecked {
// Overflow not possible: balance + value is at most totalSupply, which we know fits into a uint256.
_balances[to] += value;
}
}
emit Transfer(from, to, value);
}
/**
* @dev Creates a `value` amount of tokens and assigns them to `account`, by transferring it from address(0).
* Relies on the `_update` mechanism
*
* Emits a {Transfer} event with `from` set to the zero address.
*
* NOTE: This function is not virtual, {_update} should be overridden instead.
*/
function _mint(address account, uint256 value) internal {
if (account == address(0)) {
revert ERC20InvalidReceiver(address(0));
}
_update(address(0), account, value);
}
/**
* @dev Destroys a `value` amount of tokens from `account`, lowering the total supply.
* Relies on the `_update` mechanism.
*
* Emits a {Transfer} event with `to` set to the zero address.
*
* NOTE: This function is not virtual, {_update} should be overridden instead
*/
function _burn(address account, uint256 value) internal {
if (account == address(0)) {
revert ERC20InvalidSender(address(0));
}
_update(account, address(0), value);
}
/**
* @dev Sets `value` as the allowance of `spender` over the `owner` s tokens.
*
* This internal function is equivalent to `approve`, and can be used to
* e.g. set automatic allowances for certain subsystems, etc.
*
* Emits an {Approval} event.
*
* Requirements:
*
* - `owner` cannot be the zero address.
* - `spender` cannot be the zero address.
*
* Overrides to this logic should be done to the variant with an additional `bool emitEvent` argument.
*/
function _approve(address owner, address spender, uint256 value) internal {
_approve(owner, spender, value, true);
}
/**
* @dev Variant of {_approve} with an optional flag to enable or disable the {Approval} event.
*
* By default (when calling {_approve}) the flag is set to true. On the other hand, approval changes made by
* `_spendAllowance` during the `transferFrom` operation set the flag to false. This saves gas by not emitting any
* `Approval` event during `transferFrom` operations.
*
* Anyone who wishes to continue emitting `Approval` events on the`transferFrom` operation can force the flag to
* true using the following override:
* ```
* function _approve(address owner, address spender, uint256 value, bool) internal virtual override {
* super._approve(owner, spender, value, true);
* }
* ```
*
* Requirements are the same as {_approve}.
*/
function _approve(address owner, address spender, uint256 value, bool emitEvent) internal virtual {
if (owner == address(0)) {
revert ERC20InvalidApprover(address(0));
}
if (spender == address(0)) {
revert ERC20InvalidSpender(address(0));
}
_allowances[owner][spender] = value;
if (emitEvent) {
emit Approval(owner, spender, value);
}
}
/**
* @dev Updates `owner` s allowance for `spender` based on spent `value`.
*
* Does not update the allowance value in case of infinite allowance.
* Revert if not enough allowance is available.
*
* Does not emit an {Approval} event.
*/
function _spendAllowance(address owner, address spender, uint256 value) internal virtual {
uint256 currentAllowance = allowance(owner, spender);
if (currentAllowance != type(uint256).max) {
if (currentAllowance < value) {
revert ERC20InsufficientAllowance(spender, currentAllowance, value);
}
unchecked {
_approve(owner, spender, currentAllowance - value, false);
}
}
}
}
// File: LikeBit/LikeBit.sol
pragma solidity ^0.8.19;
/**
* @title LikeBitToken
* @dev ERC20 token implementation with additional functionalities.
*/
contract LikeBit is ERC20, Ownable {
uint public PRIVATE_SALE_ALLOCATION = 1000000 * 10 ** 18;
uint public PRESALE_ALLOCATION = 1000000 * 10 ** 18;
uint public EXCHANGES_ALLOCATION = 5500000 * 10 ** 18;
uint public COMPANY_ALLOCATION = 2000000 * 10 ** 18;
uint public ADVERTISEMENTS_ALLOCATION = 500000 * 10 ** 18;
address public preSale;
/**
* @dev Constructor function to initialize the LikeBitToken contract.
* @param _preSale Address of the pre-sale.
* @param owner Address of the contract owner.
*/
constructor(
address _preSale,
address owner
) Ownable(owner) ERC20("LikeBitToken", "LBT") {
preSale = _preSale;
_mint(preSale, PRESALE_ALLOCATION + PRIVATE_SALE_ALLOCATION);
_mint(
address(this),
COMPANY_ALLOCATION +
EXCHANGES_ALLOCATION +
ADVERTISEMENTS_ALLOCATION
);
}
/**
* @dev Function to withdraw mistakenly sent ERC20 tokens.
* @param _token Address of the ERC20 token to withdraw.
*/
function withdrawTokens(address _token) external onlyOwner {
require(_token != address(0), "Invalid token address");
IERC20(_token).transfer(
msg.sender,
IERC20(_token).balanceOf(address(this))
);
}
}
// File: LikeBit/PreSale.sol
pragma solidity ^0.8.19;
/**
* @title PreSale
* @dev Contract for managing pre-sale of LikeBit tokens.
*/
contract PreSale is Ownable, ReentrancyGuard {
IERC20 private usdt;
IERC20 private LBT;
uint private totalTokenSold;
uint private totalTokenRemaining;
uint private activePhaseId;
uint public totalPhases;
address private adminWallet;
struct Phase {
uint phaseId;
uint tokenAvailableForSale;
uint tokenPrice;
uint tokenSold;
uint soldTokenValue;
bool airdrop;
bool buying;
}
struct TokenPurchase {
uint usdtDeposited;
uint tokensBought;
uint tokenPrice;
uint phaseId;
uint date;
bool claimed;
}
mapping(address => uint) private usdtReceived;
mapping(address => mapping(uint => uint)) private tokenToSend;
mapping(uint => Phase) private phases;
mapping(address => TokenPurchase[]) private tokenPurchase;
mapping(address => bool) private blacklisted;
modifier notBlacklisted() {
require(
!blacklisted[msg.sender],
"Address is blacklisted. Contact Admin"
);
_;
}
event ClaimedTokens(
address indexed _user,
uint usdtDeposited,
uint tokenAmount,
uint tokenPrice,
uint PhaseID
);
event NewPhaseSet(
uint PhaseID,
uint tokenAvailableForSell,
uint tokenPrice
);
event Buy(
address indexed _user,
uint usdtDeposited,
uint tokenAmount,
uint tokenPrice,
uint PhaseID
);
/**
* @dev Constructor to initialize the pre-sale contract.
* @param _usdt Address of the USDT token contract.
* @param _admin Address of the admin wallet.
*/
constructor(address _usdt, address _admin) Ownable(_admin) {
usdt = IERC20(_usdt);
totalTokenSold = 0;
totalTokenRemaining = 2000000 * 10 ** 18;
adminWallet = _admin;
phases[1] = Phase({
phaseId: 1,
tokenAvailableForSale: 500000 * 10 ** 18,
tokenPrice: 1250000,
tokenSold: 0,
soldTokenValue: 0,
airdrop: false,
buying: true
});
activePhaseId = 1;
totalPhases++;
}
//View Functions
/**
* @dev Returns the address of the USDT token contract.
*/
function getUsdtAddress() external view returns (address) {
return address(usdt);
}
/**
* @dev Returns the address of the LikeBit token contract.
*/
function getTokenAddress() external view returns (address) {
return address(LBT);
}
/**
* @dev Returns the current token price for the active phase.
*/
function getTokenPrice() public view returns (uint) {
return phases[activePhaseId].tokenPrice;
}
/**
* @dev Returns the address of the admin wallet.
*/
function getAdminAddress() external view returns (address) {
return adminWallet;
}
/**
* @dev Returns the ID of the active sale phase.
*/
function getActivePhase() external view returns (uint) {
return activePhaseId;
}
/**
* @dev Returns the total number of tokens sold.
*/
function getTotalTokenSold() external view returns (uint) {
return totalTokenSold;
}
function getOwner() external view returns (address) {
return owner();
}
/**
* @dev Checks if an address is blacklisted.
* @param _user Address to check.
* @return True if the address is blacklisted, otherwise false.
*/
function isBlacklisted(address _user) external view returns (bool) {
return blacklisted[_user];
}
/**
* @dev Returns details of the purchases made by a user.
* @param _user Address of the user.
* @return tokensBought Array of token amounts bought.
* @return phaseId Array of phase IDs for each purchase.
* @return date Array of purchase dates.
* @return claimed Array indicating whether tokens are claimed for each purchase.
*/
function getUserPurchaseDetails(
address _user
)
external
view
returns (
uint[] memory tokensBought,
uint[] memory phaseId,
uint[] memory date,
bool[] memory claimed
)
{
TokenPurchase[] storage purchase = tokenPurchase[_user];
uint length = purchase.length;
tokensBought = new uint[](length);
phaseId = new uint[](length);
date = new uint[](length);
claimed = new bool[](length);
for (uint i = 0; i < length; i++) {
tokensBought[i] = purchase[i].tokensBought;
phaseId[i] = purchase[i].phaseId;
date[i] = purchase[i].date;
claimed[i] = purchase[i].claimed;
}
return (tokensBought, phaseId, date, claimed);
}
/**
* @dev Checks if airdrop is active for a given phase.
* @param _phaseId ID of the phase to check.
* @return True if airdrop is active for the phase, otherwise false.
*/
function isAirdropActive(uint _phaseId) external view returns (bool) {
require(_phaseId > 0 && _phaseId <= totalPhases, "Invalid phase ID");
Phase storage phase = phases[_phaseId];
return phase.airdrop;
}
/**
* @dev Checks if buying is active for a given phase.
* @param _phaseId ID of the phase to check.
* @return True if buying is active for the phase, otherwise false.
*/
function isBuyActive(uint _phaseId) external view returns (bool) {
require(_phaseId > 0 && _phaseId <= totalPhases, "Invalid phase ID");
Phase storage phase = phases[_phaseId];
return phase.buying;
}
/**
* @dev Returns information about a sale phase.
* @param _phaseId ID of the phase.
* @return phaseId Phase ID.
* @return _tokenAvailableForSale Total tokens available for sale.
* @return _tokenPrice Token price.
* @return _tokenSold Total tokens sold.
* @return _soldTokenValue Total value of tokens sold.
* @return _tokenRemaining Remaining tokens for sale in the phase.
* @return isActivePhase True if the phase is active, otherwise false.
* @return airdrop True if airdrop is active for the phase, otherwise false.
* @return buying True if buying is active for the phase, otherwise false.
*/
function getPhaseInfo(
uint _phaseId
)
public
view
returns (
uint phaseId,
uint _tokenAvailableForSale,
uint _tokenPrice,
uint _tokenSold,
uint _soldTokenValue,
uint _tokenRemaining,
bool isActivePhase,
bool airdrop,
bool buying
)
{
require(_phaseId > 0);
Phase storage phase = phases[_phaseId];
return (
phase.phaseId,
phase.tokenAvailableForSale,
phase.tokenPrice,
phase.tokenSold,
phase.soldTokenValue,
phase.tokenAvailableForSale - phase.tokenSold,
activePhaseId == phase.phaseId,
phase.airdrop,
phase.buying
);
}
function addToBlacklist(address _user) external onlyOwner {
require(_user != address(0), "Invalid address");
blacklisted[_user] = true;
}
function removeFromBlacklist(address _user) external onlyOwner {
blacklisted[_user] = false;
}
/**
* @dev Sets a new sale phase with the given parameters.
* @param _amount Amount of tokens available for sale in the new phase.
* @param _tokenPrice Price of one token in the new phase.
*/
function setPhase(uint _amount, uint _tokenPrice) external onlyOwner {
uint _phaseId = totalPhases + 1;
require(_amount > 0, "Amount cannot be zero");
require(
_amount <= totalTokenRemaining,
"Amount cannot exceed sale allocation"
);
require(_tokenPrice > 0, "token price cannot be zero");
Phase storage newPhase = phases[_phaseId];
newPhase.phaseId = _phaseId;
newPhase.tokenAvailableForSale = _amount;
newPhase.tokenPrice = _tokenPrice;
newPhase.tokenSold = 0;
newPhase.soldTokenValue = 0;
newPhase.airdrop = false;
newPhase.buying = false;
totalPhases++;
emit NewPhaseSet(_phaseId, _amount, _tokenPrice);
}
function stopBuy(uint _phaseId) external onlyOwner {
require(_phaseId > 0 && _phaseId <= totalPhases, "Invalid phase ID");
Phase storage phase = phases[_phaseId];
require(phase.phaseId == _phaseId, "Phase does not exist");
require(phase.buying == true, "Buy not active");
phase.buying = false;
}
function startBuy(uint _phaseId) external onlyOwner {
require(_phaseId > 0 && _phaseId <= totalPhases, "Invalid phase ID");
Phase storage phase = phases[_phaseId];
require(phase.phaseId == _phaseId, "Phase does not exist");
require(phase.buying == false, "Buy already active");
phase.buying = true;
}
function estimatedToken(
uint _usdtAmount
) public view returns (uint tokenAmount) {
tokenAmount = (_usdtAmount * 10 ** 18) / getTokenPrice();
}
function getUSDTDepositedByUser(
address _user
) external view returns (uint) {
return usdtReceived[_user];
}
function getTokenToSendToUser(address _user) external view returns (uint) {
return tokenToSend[_user][activePhaseId];
}
function setTokenAddress(address _LBT) external onlyOwner {
require(_LBT != address(0), "Address cannot be zero address");
require(
IERC20(_LBT).balanceOf(address(this)) > 0,
"Invalid LBT contract"
);
LBT = IERC20(_LBT);
}
function setActivePhase(uint _phaseId) external onlyOwner {
require(_phaseId > 0 && totalPhases >= _phaseId, "Inavlid phase id");
require(_phaseId != activePhaseId, "Phase already active");
activePhaseId = _phaseId;
}
function setAdminWallet(address _admin) external onlyOwner {
require(_admin != address(0), "Address cannot be zero address");
adminWallet = _admin;
}
/**
* @dev Starts the airdrop for the specified phase.
* @param _phaseId ID of the phase to start the airdrop for.
*/
function startAirDrop(uint _phaseId) external onlyOwner {
require(_phaseId > 0 && _phaseId <= totalPhases, "Invalid phase ID");
Phase storage phase = phases[_phaseId];
require(phase.phaseId == _phaseId, "Phase id does not exist");
require(phase.airdrop == false, "Air drop already active");
phase.airdrop = true;
}
/**
* @dev Stops the airdrop for the specified phase.
* @param _phaseId ID of the phase to stop the airdrop for.
*/
function stopAirDrop(uint _phaseId) external onlyOwner {
require(_phaseId > 0 && _phaseId <= totalPhases, "Invalid phase ID");
Phase storage phase = phases[_phaseId];
require(phase.phaseId == _phaseId, "Phase id does not exist");
require(phase.airdrop == true, "Air drop not active");
phase.airdrop = false;
}
//User Functions
/**
* @dev Allows a user to buy tokens with USDT.
* @param _usdtAmount Amount of USDT to spend for buying tokens.
*/
function buy(uint _usdtAmount) external nonReentrant notBlacklisted {
require(_usdtAmount > 0, "Invalid Amount");
require(
usdt.allowance(msg.sender, address(this)) >= _usdtAmount,
"Insufficient Allowance"
);
require(
usdt.balanceOf(msg.sender) >= _usdtAmount,
"Not enough balance"
);
Phase storage currentPhase = phases[activePhaseId];
require(
currentPhase.buying == true,
"Buying not active for this phase"
);
uint tokenAmount = ((_usdtAmount * (10 ** 18)) /
currentPhase.tokenPrice);
require(
tokenAmount <=
currentPhase.tokenAvailableForSale - currentPhase.tokenSold,
"Not enough token amount for buying"
);
currentPhase.tokenSold += tokenAmount;
currentPhase.soldTokenValue =
(currentPhase.tokenPrice * currentPhase.tokenSold) /
10 ** 18;
totalTokenSold += tokenAmount;
totalTokenRemaining -= totalTokenSold;
usdtReceived[msg.sender] += _usdtAmount;
tokenToSend[msg.sender][activePhaseId] += tokenAmount;
usdt.transferFrom(msg.sender, adminWallet, _usdtAmount);
TokenPurchase[] storage purchase = tokenPurchase[msg.sender];
purchase.push(
TokenPurchase({
usdtDeposited: _usdtAmount,
tokensBought: tokenAmount,
tokenPrice: currentPhase.tokenPrice,
phaseId: activePhaseId,
date: block.timestamp,
claimed: false
})
);
emit Buy(
msg.sender,
_usdtAmount,
tokenAmount,
currentPhase.tokenPrice,
activePhaseId
);
}
/**
* @dev Allows a user to claim tokens from an ongoing airdrop.
* @param _phaseId ID of the phase from which tokens are claimed.
* @param _index Index of the token purchase to claim from the user's purchase history.
*/
function claimToken(
uint _phaseId,
uint _index
) external nonReentrant notBlacklisted {
require(_phaseId > 0 && totalPhases >= _phaseId, "Inavlid phase id");
Phase storage phase = phases[_phaseId];
require(phase.airdrop, "Airdrop not started");
TokenPurchase[] storage purchase = tokenPurchase[msg.sender];
uint totalTokensClaimed;
require(_index < purchase.length, "Invalid index");
for (uint i = _index; i < purchase.length; i++) {
if (purchase[i].phaseId == _phaseId && !purchase[i].claimed) {
uint tokensToClaim = purchase[i].tokensBought;
LBT.transfer(msg.sender, tokensToClaim);
purchase[i].claimed = true;
totalTokensClaimed += tokensToClaim;
emit ClaimedTokens(
msg.sender,
purchase[i].usdtDeposited,
tokensToClaim,
purchase[i].tokenPrice,
_phaseId
);
return;
}
}
require(totalTokensClaimed > 0, "No tokens to claim in this phase");
}
/**
* @dev Function to withdraw mistakenly sent ERC20 tokens.
* @param _token Address of the ERC20 token to withdraw.
*/
function withdrawTokens(address _token) external onlyOwner {
require(_token != address(0), "Invalid token address");
IERC20(_token).transfer(
msg.sender,
IERC20(_token).balanceOf(address(this))
);
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_usdt","type":"address"},{"internalType":"address","name":"_admin","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_user","type":"address"},{"indexed":false,"internalType":"uint256","name":"usdtDeposited","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokenAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokenPrice","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"PhaseID","type":"uint256"}],"name":"Buy","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_user","type":"address"},{"indexed":false,"internalType":"uint256","name":"usdtDeposited","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokenAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokenPrice","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"PhaseID","type":"uint256"}],"name":"ClaimedTokens","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"PhaseID","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokenAvailableForSell","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokenPrice","type":"uint256"}],"name":"NewPhaseSet","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"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"addToBlacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_usdtAmount","type":"uint256"}],"name":"buy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_phaseId","type":"uint256"},{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"claimToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_usdtAmount","type":"uint256"}],"name":"estimatedToken","outputs":[{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getActivePhase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAdminAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_phaseId","type":"uint256"}],"name":"getPhaseInfo","outputs":[{"internalType":"uint256","name":"phaseId","type":"uint256"},{"internalType":"uint256","name":"_tokenAvailableForSale","type":"uint256"},{"internalType":"uint256","name":"_tokenPrice","type":"uint256"},{"internalType":"uint256","name":"_tokenSold","type":"uint256"},{"internalType":"uint256","name":"_soldTokenValue","type":"uint256"},{"internalType":"uint256","name":"_tokenRemaining","type":"uint256"},{"internalType":"bool","name":"isActivePhase","type":"bool"},{"internalType":"bool","name":"airdrop","type":"bool"},{"internalType":"bool","name":"buying","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTokenAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTokenPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"getTokenToSendToUser","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalTokenSold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"getUSDTDepositedByUser","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getUsdtAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"getUserPurchaseDetails","outputs":[{"internalType":"uint256[]","name":"tokensBought","type":"uint256[]"},{"internalType":"uint256[]","name":"phaseId","type":"uint256[]"},{"internalType":"uint256[]","name":"date","type":"uint256[]"},{"internalType":"bool[]","name":"claimed","type":"bool[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_phaseId","type":"uint256"}],"name":"isAirdropActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"isBlacklisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_phaseId","type":"uint256"}],"name":"isBuyActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"removeFromBlacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_phaseId","type":"uint256"}],"name":"setActivePhase","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_admin","type":"address"}],"name":"setAdminWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_tokenPrice","type":"uint256"}],"name":"setPhase","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_LBT","type":"address"}],"name":"setTokenAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_phaseId","type":"uint256"}],"name":"startAirDrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_phaseId","type":"uint256"}],"name":"startBuy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_phaseId","type":"uint256"}],"name":"stopAirDrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_phaseId","type":"uint256"}],"name":"stopBuy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalPhases","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"withdrawTokens","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
608060405234801561000f575f80fd5b50604051613bf9380380613bf983398181016040528101906100319190610361565b805f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036100a2575f6040517f1e4fbdf700000000000000000000000000000000000000000000000000000000815260040161009991906103ae565b60405180910390fd5b6100b18161024260201b60201c565b50600180819055508160025f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505f6004819055506a01a784379d99db420000006005819055508060085f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040518060e00160405280600181526020016969e10de76676d08000008152602001621312d081526020015f81526020015f81526020015f1515815260200160011515815250600b5f600181526020019081526020015f205f820151815f01556020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015f6101000a81548160ff02191690831515021790555060c08201518160050160016101000a81548160ff021916908315150217905550905050600160068190555060075f815480929190610236906103fd565b91905055505050610444565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61033082610307565b9050919050565b61034081610326565b811461034a575f80fd5b50565b5f8151905061035b81610337565b92915050565b5f806040838503121561037757610376610303565b5b5f6103848582860161034d565b92505060206103958582860161034d565b9150509250929050565b6103a881610326565b82525050565b5f6020820190506103c15f83018461039f565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f819050919050565b5f610407826103f4565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203610439576104386103c7565b5b600182019050919050565b6137a8806104515f395ff3fe608060405234801561000f575f80fd5b50600436106101ee575f3560e01c80636e8d65221161010d578063af683bb5116100a0578063f2fde38b1161006f578063f2fde38b14610582578063f39414921461059e578063f9df4056146105d1578063fe575a87146105ed576101ee565b8063af683bb5146104fc578063b2e6b91214610518578063ced134ab14610536578063d96a094a14610566576101ee565b8063893d20e8116100dc578063893d20e81461046c5780638da5cb5b1461048a57806398c2fa07146104a8578063ac6ea9b8146104e0576101ee565b80636e8d6522146103fa578063715018a61461042a5780637f63ab9414610434578063886c9ad014610450576101ee565b80633c5d1812116101855780634b7dd8e6116101545780634b7dd8e6146103725780634b94f50e14610390578063537df3b6146103ae5780635bc2942d146103ca576101ee565b80633c5d1812146103005780633d992def1461031e57806344337ea11461033a57806349df728c14610356576101ee565b80632746f98f116101c15780632746f98f1461027a5780632bc4ca93146102aa5780632ecd7020146102c657806335082933146102e4576101ee565b806310fe9ae8146101f25780631ce97fd1146102105780631e1a52a51461022e57806326a4e8d21461025e575b5f80fd5b6101fa61061d565b60405161020791906125a6565b60405180910390f35b610218610645565b60405161022591906125d7565b60405180910390f35b6102486004803603810190610243919061261e565b61064e565b60405161025591906125d7565b60405180910390f35b6102786004803603810190610273919061261e565b6106a5565b005b610294600480360381019061028f9190612673565b610817565b6040516102a191906126b8565b60405180910390f35b6102c460048036038101906102bf9190612673565b610895565b005b6102ce61093b565b6040516102db91906125d7565b60405180910390f35b6102fe60048036038101906102f9919061261e565b610944565b005b6103086109fd565b60405161031591906125d7565b60405180910390f35b61033860048036038101906103339190612673565b610a03565b005b610354600480360381019061034f919061261e565b610b2a565b005b610370600480360381019061036b919061261e565b610bf8565b005b61037a610d64565b60405161038791906125a6565b60405180910390f35b610398610d8c565b6040516103a591906125d7565b60405180910390f35b6103c860048036038101906103c3919061261e565b610da9565b005b6103e460048036038101906103df9190612673565b610e08565b6040516103f191906125d7565b60405180910390f35b610414600480360381019061040f9190612673565b610e36565b60405161042191906126b8565b60405180910390f35b610432610eb5565b005b61044e600480360381019061044991906126d1565b610ec8565b005b61046a60048036038101906104659190612673565b611314565b005b61047461143d565b60405161048191906125a6565b60405180910390f35b61049261144b565b60405161049f91906125a6565b60405180910390f35b6104c260048036038101906104bd9190612673565b611472565b6040516104d79998979695949392919061270f565b60405180910390f35b6104fa60048036038101906104f59190612673565b611511565b005b61051660048036038101906105119190612673565b611638565b005b610520611761565b60405161052d91906125a6565b60405180910390f35b610550600480360381019061054b919061261e565b611789565b60405161055d91906125d7565b60405180910390f35b610580600480360381019061057b9190612673565b6117cf565b005b61059c6004803603810190610597919061261e565b611e8c565b005b6105b860048036038101906105b3919061261e565b611f10565b6040516105c89493929190612908565b60405180910390f35b6105eb60048036038101906105e691906126d1565b6121c5565b005b6106076004803603810190610602919061261e565b612377565b60405161061491906126b8565b60405180910390f35b5f60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b5f600654905090565b5f600a5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f60065481526020019081526020015f20549050919050565b6106ad6123c9565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361071b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610712906129c1565b60405180910390fd5b5f8173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161075591906125a6565b602060405180830381865afa158015610770573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061079491906129f3565b116107d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107cb90612a68565b60405180910390fd5b8060035f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b5f808211801561082957506007548211155b610868576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085f90612ad0565b60405180910390fd5b5f600b5f8481526020019081526020015f209050806005015f9054906101000a900460ff16915050919050565b61089d6123c9565b5f811180156108ae57508060075410155b6108ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108e490612b38565b60405180910390fd5b6006548103610931576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161092890612ba0565b60405180910390fd5b8060068190555050565b5f600454905090565b61094c6123c9565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036109ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109b1906129c1565b60405180910390fd5b8060085f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60075481565b610a0b6123c9565b5f81118015610a1c57506007548111155b610a5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5290612ad0565b60405180910390fd5b5f600b5f8381526020019081526020015f20905081815f015414610ab4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aab90612c08565b60405180910390fd5b5f1515816005015f9054906101000a900460ff16151514610b0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0190612c70565b60405180910390fd5b6001816005015f6101000a81548160ff0219169083151502179055505050565b610b326123c9565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610ba0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9790612cd8565b60405180910390fd5b6001600d5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555050565b610c006123c9565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610c6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6590612d40565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb338373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610cc491906125a6565b602060405180830381865afa158015610cdf573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d0391906129f3565b6040518363ffffffff1660e01b8152600401610d20929190612d5e565b6020604051808303815f875af1158015610d3c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d609190612daf565b5050565b5f60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b5f600b5f60065481526020019081526020015f2060020154905090565b610db16123c9565b5f600d5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555050565b5f610e11610d8c565b670de0b6b3a764000083610e259190612e07565b610e2f9190612e75565b9050919050565b5f8082118015610e4857506007548211155b610e87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7e90612ad0565b60405180910390fd5b5f600b5f8481526020019081526020015f2090508060050160019054906101000a900460ff16915050919050565b610ebd6123c9565b610ec65f612450565b565b610ed0612511565b600d5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1615610f5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5190612f15565b60405180910390fd5b5f82118015610f6b57508160075410155b610faa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa190612b38565b60405180910390fd5b5f600b5f8481526020019081526020015f209050806005015f9054906101000a900460ff1661100e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100590612f7d565b60405180910390fd5b5f600c5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2090505f81805490508410611095576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108c90612fe5565b60405180910390fd5b5f8490505b82805490508110156112c157858382815481106110ba576110b9613003565b5b905f5260205f2090600602016003015414801561110357508281815481106110e5576110e4613003565b5b905f5260205f2090600602016005015f9054906101000a900460ff16155b156112b4575f83828154811061111c5761111b613003565b5b905f5260205f20906006020160010154905060035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b815260040161118a929190612d5e565b6020604051808303815f875af11580156111a6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111ca9190612daf565b5060018483815481106111e0576111df613003565b5b905f5260205f2090600602016005015f6101000a81548160ff02191690831515021790555080836112119190613030565b92503373ffffffffffffffffffffffffffffffffffffffff167f37344d70badbfa3622c1a97707028d03962bbf14366677b67edf630b9f76409b85848154811061125e5761125d613003565b5b905f5260205f2090600602015f01548387868154811061128157611280613003565b5b905f5260205f209060060201600201548b6040516112a29493929190613063565b60405180910390a25050505050611308565b808060010191505061109a565b505f8111611304576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112fb906130f0565b60405180910390fd5b5050505b611310612557565b5050565b61131c6123c9565b5f8111801561132d57506007548111155b61136c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136390612ad0565b60405180910390fd5b5f600b5f8381526020019081526020015f20905081815f0154146113c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113bc90613158565b60405180910390fd5b600115158160050160019054906101000a900460ff1615151461141d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611414906131c0565b60405180910390fd5b5f8160050160016101000a81548160ff0219169083151502179055505050565b5f61144661144b565b905090565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b5f805f805f805f805f808a11611486575f80fd5b5f600b5f8c81526020019081526020015f209050805f01548160010154826002015483600301548460040154856003015486600101546114c691906131de565b865f015460065414876005015f9054906101000a900460ff168860050160019054906101000a900460ff16995099509950995099509950995099509950509193959799909294969850565b6115196123c9565b5f8111801561152a57506007548111155b611569576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156090612ad0565b60405180910390fd5b5f600b5f8381526020019081526020015f20905081815f0154146115c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b990612c08565b60405180910390fd5b60011515816005015f9054906101000a900460ff16151514611619576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116109061325b565b60405180910390fd5b5f816005015f6101000a81548160ff0219169083151502179055505050565b6116406123c9565b5f8111801561165157506007548111155b611690576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168790612ad0565b60405180910390fd5b5f600b5f8381526020019081526020015f20905081815f0154146116e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e090613158565b60405180910390fd5b5f15158160050160019054906101000a900460ff16151514611740576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611737906132c3565b60405180910390fd5b60018160050160016101000a81548160ff0219169083151502179055505050565b5f60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b5f60095f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b6117d7612511565b600d5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1615611861576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185890612f15565b60405180910390fd5b5f81116118a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189a9061332b565b60405180910390fd5b8060025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b8152600401611900929190613349565b602060405180830381865afa15801561191b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061193f91906129f3565b1015611980576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611977906133ba565b60405180910390fd5b8060025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b81526004016119db91906125a6565b602060405180830381865afa1580156119f6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a1a91906129f3565b1015611a5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5290613422565b60405180910390fd5b5f600b5f60065481526020019081526020015f209050600115158160050160019054906101000a900460ff16151514611ac9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ac09061348a565b60405180910390fd5b5f8160020154670de0b6b3a764000084611ae39190612e07565b611aed9190612e75565b905081600301548260010154611b0391906131de565b811115611b45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3c90613518565b60405180910390fd5b80826003015f828254611b589190613030565b92505081905550670de0b6b3a764000082600301548360020154611b7c9190612e07565b611b869190612e75565b82600401819055508060045f828254611b9f9190613030565b9250508190555060045460055f828254611bb991906131de565b925050819055508260095f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254611c0c9190613030565b9250508190555080600a5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f60065481526020019081526020015f205f828254611c709190613030565b9250508190555060025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3360085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16866040518463ffffffff1660e01b8152600401611cf693929190613536565b6020604051808303815f875af1158015611d12573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d369190612daf565b505f600c5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f209050806040518060c001604052808681526020018481526020018560020154815260200160065481526020014281526020015f1515815250908060018154018082558091505060019003905f5260205f2090600602015f909190919091505f820151815f01556020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015f6101000a81548160ff02191690831515021790555050503373ffffffffffffffffffffffffffffffffffffffff167f064fb1933e186be0b289a87e98518dc18cc9856ecbc9f1353d1a138ddf733ec585848660020154600654604051611e769493929190613063565b60405180910390a2505050611e89612557565b50565b611e946123c9565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611f04575f6040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401611efb91906125a6565b60405180910390fd5b611f0d81612450565b50565b6060806060805f600c5f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2090505f818054905090508067ffffffffffffffff811115611f7857611f7761356b565b5b604051908082528060200260200182016040528015611fa65781602001602082028036833780820191505090505b5095508067ffffffffffffffff811115611fc357611fc261356b565b5b604051908082528060200260200182016040528015611ff15781602001602082028036833780820191505090505b5094508067ffffffffffffffff81111561200e5761200d61356b565b5b60405190808252806020026020018201604052801561203c5781602001602082028036833780820191505090505b5093508067ffffffffffffffff8111156120595761205861356b565b5b6040519080825280602002602001820160405280156120875781602001602082028036833780820191505090505b5092505f5b818110156121bb578281815481106120a7576120a6613003565b5b905f5260205f209060060201600101548782815181106120ca576120c9613003565b5b6020026020010181815250508281815481106120e9576120e8613003565b5b905f5260205f2090600602016003015486828151811061210c5761210b613003565b5b60200260200101818152505082818154811061212b5761212a613003565b5b905f5260205f2090600602016004015485828151811061214e5761214d613003565b5b60200260200101818152505082818154811061216d5761216c613003565b5b905f5260205f2090600602016005015f9054906101000a900460ff1684828151811061219c5761219b613003565b5b602002602001019015159081151581525050808060010191505061208c565b5050509193509193565b6121cd6123c9565b5f60016007546121dd9190613030565b90505f8311612221576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612218906135e2565b60405180910390fd5b600554831115612266576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161225d90613670565b60405180910390fd5b5f82116122a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229f906136d8565b60405180910390fd5b5f600b5f8381526020019081526020015f20905081815f01819055508381600101819055508281600201819055505f81600301819055505f81600401819055505f816005015f6101000a81548160ff0219169083151502179055505f8160050160016101000a81548160ff02191690831515021790555060075f815480929190612331906136f6565b91905055507fd5531d5f1fd5e4ff652e0f5888cc4715ed2b84af88b98dc718ad1491439abb9d8285856040516123699392919061373d565b60405180910390a150505050565b5f600d5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff169050919050565b6123d1612560565b73ffffffffffffffffffffffffffffffffffffffff166123ef61144b565b73ffffffffffffffffffffffffffffffffffffffff161461244e57612412612560565b6040517f118cdaa700000000000000000000000000000000000000000000000000000000815260040161244591906125a6565b60405180910390fd5b565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60026001540361254d576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600181905550565b60018081905550565b5f33905090565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61259082612567565b9050919050565b6125a081612586565b82525050565b5f6020820190506125b95f830184612597565b92915050565b5f819050919050565b6125d1816125bf565b82525050565b5f6020820190506125ea5f8301846125c8565b92915050565b5f80fd5b6125fd81612586565b8114612607575f80fd5b50565b5f81359050612618816125f4565b92915050565b5f60208284031215612633576126326125f0565b5b5f6126408482850161260a565b91505092915050565b612652816125bf565b811461265c575f80fd5b50565b5f8135905061266d81612649565b92915050565b5f60208284031215612688576126876125f0565b5b5f6126958482850161265f565b91505092915050565b5f8115159050919050565b6126b28161269e565b82525050565b5f6020820190506126cb5f8301846126a9565b92915050565b5f80604083850312156126e7576126e66125f0565b5b5f6126f48582860161265f565b92505060206127058582860161265f565b9150509250929050565b5f610120820190506127235f83018c6125c8565b612730602083018b6125c8565b61273d604083018a6125c8565b61274a60608301896125c8565b61275760808301886125c8565b61276460a08301876125c8565b61277160c08301866126a9565b61277e60e08301856126a9565b61278c6101008301846126a9565b9a9950505050505050505050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b6127cc816125bf565b82525050565b5f6127dd83836127c3565b60208301905092915050565b5f602082019050919050565b5f6127ff8261279a565b61280981856127a4565b9350612814836127b4565b805f5b8381101561284457815161282b88826127d2565b9750612836836127e9565b925050600181019050612817565b5085935050505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b6128838161269e565b82525050565b5f612894838361287a565b60208301905092915050565b5f602082019050919050565b5f6128b682612851565b6128c0818561285b565b93506128cb8361286b565b805f5b838110156128fb5781516128e28882612889565b97506128ed836128a0565b9250506001810190506128ce565b5085935050505092915050565b5f6080820190508181035f83015261292081876127f5565b9050818103602083015261293481866127f5565b9050818103604083015261294881856127f5565b9050818103606083015261295c81846128ac565b905095945050505050565b5f82825260208201905092915050565b7f416464726573732063616e6e6f74206265207a65726f206164647265737300005f82015250565b5f6129ab601e83612967565b91506129b682612977565b602082019050919050565b5f6020820190508181035f8301526129d88161299f565b9050919050565b5f815190506129ed81612649565b92915050565b5f60208284031215612a0857612a076125f0565b5b5f612a15848285016129df565b91505092915050565b7f496e76616c6964204c425420636f6e74726163740000000000000000000000005f82015250565b5f612a52601483612967565b9150612a5d82612a1e565b602082019050919050565b5f6020820190508181035f830152612a7f81612a46565b9050919050565b7f496e76616c6964207068617365204944000000000000000000000000000000005f82015250565b5f612aba601083612967565b9150612ac582612a86565b602082019050919050565b5f6020820190508181035f830152612ae781612aae565b9050919050565b7f496e61766c6964207068617365206964000000000000000000000000000000005f82015250565b5f612b22601083612967565b9150612b2d82612aee565b602082019050919050565b5f6020820190508181035f830152612b4f81612b16565b9050919050565b7f506861736520616c7265616479206163746976650000000000000000000000005f82015250565b5f612b8a601483612967565b9150612b9582612b56565b602082019050919050565b5f6020820190508181035f830152612bb781612b7e565b9050919050565b7f506861736520696420646f6573206e6f742065786973740000000000000000005f82015250565b5f612bf2601783612967565b9150612bfd82612bbe565b602082019050919050565b5f6020820190508181035f830152612c1f81612be6565b9050919050565b7f4169722064726f7020616c7265616479206163746976650000000000000000005f82015250565b5f612c5a601783612967565b9150612c6582612c26565b602082019050919050565b5f6020820190508181035f830152612c8781612c4e565b9050919050565b7f496e76616c6964206164647265737300000000000000000000000000000000005f82015250565b5f612cc2600f83612967565b9150612ccd82612c8e565b602082019050919050565b5f6020820190508181035f830152612cef81612cb6565b9050919050565b7f496e76616c696420746f6b656e206164647265737300000000000000000000005f82015250565b5f612d2a601583612967565b9150612d3582612cf6565b602082019050919050565b5f6020820190508181035f830152612d5781612d1e565b9050919050565b5f604082019050612d715f830185612597565b612d7e60208301846125c8565b9392505050565b612d8e8161269e565b8114612d98575f80fd5b50565b5f81519050612da981612d85565b92915050565b5f60208284031215612dc457612dc36125f0565b5b5f612dd184828501612d9b565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f612e11826125bf565b9150612e1c836125bf565b9250828202612e2a816125bf565b91508282048414831517612e4157612e40612dda565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f612e7f826125bf565b9150612e8a836125bf565b925082612e9a57612e99612e48565b5b828204905092915050565b7f4164647265737320697320626c61636b6c69737465642e20436f6e74616374205f8201527f41646d696e000000000000000000000000000000000000000000000000000000602082015250565b5f612eff602583612967565b9150612f0a82612ea5565b604082019050919050565b5f6020820190508181035f830152612f2c81612ef3565b9050919050565b7f41697264726f70206e6f742073746172746564000000000000000000000000005f82015250565b5f612f67601383612967565b9150612f7282612f33565b602082019050919050565b5f6020820190508181035f830152612f9481612f5b565b9050919050565b7f496e76616c696420696e646578000000000000000000000000000000000000005f82015250565b5f612fcf600d83612967565b9150612fda82612f9b565b602082019050919050565b5f6020820190508181035f830152612ffc81612fc3565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f61303a826125bf565b9150613045836125bf565b925082820190508082111561305d5761305c612dda565b5b92915050565b5f6080820190506130765f8301876125c8565b61308360208301866125c8565b61309060408301856125c8565b61309d60608301846125c8565b95945050505050565b7f4e6f20746f6b656e7320746f20636c61696d20696e20746869732070686173655f82015250565b5f6130da602083612967565b91506130e5826130a6565b602082019050919050565b5f6020820190508181035f830152613107816130ce565b9050919050565b7f506861736520646f6573206e6f742065786973740000000000000000000000005f82015250565b5f613142601483612967565b915061314d8261310e565b602082019050919050565b5f6020820190508181035f83015261316f81613136565b9050919050565b7f427579206e6f74206163746976650000000000000000000000000000000000005f82015250565b5f6131aa600e83612967565b91506131b582613176565b602082019050919050565b5f6020820190508181035f8301526131d78161319e565b9050919050565b5f6131e8826125bf565b91506131f3836125bf565b925082820390508181111561320b5761320a612dda565b5b92915050565b7f4169722064726f70206e6f7420616374697665000000000000000000000000005f82015250565b5f613245601383612967565b915061325082613211565b602082019050919050565b5f6020820190508181035f83015261327281613239565b9050919050565b7f42757920616c72656164792061637469766500000000000000000000000000005f82015250565b5f6132ad601283612967565b91506132b882613279565b602082019050919050565b5f6020820190508181035f8301526132da816132a1565b9050919050565b7f496e76616c696420416d6f756e740000000000000000000000000000000000005f82015250565b5f613315600e83612967565b9150613320826132e1565b602082019050919050565b5f6020820190508181035f83015261334281613309565b9050919050565b5f60408201905061335c5f830185612597565b6133696020830184612597565b9392505050565b7f496e73756666696369656e7420416c6c6f77616e6365000000000000000000005f82015250565b5f6133a4601683612967565b91506133af82613370565b602082019050919050565b5f6020820190508181035f8301526133d181613398565b9050919050565b7f4e6f7420656e6f7567682062616c616e636500000000000000000000000000005f82015250565b5f61340c601283612967565b9150613417826133d8565b602082019050919050565b5f6020820190508181035f83015261343981613400565b9050919050565b7f427579696e67206e6f742061637469766520666f7220746869732070686173655f82015250565b5f613474602083612967565b915061347f82613440565b602082019050919050565b5f6020820190508181035f8301526134a181613468565b9050919050565b7f4e6f7420656e6f75676820746f6b656e20616d6f756e7420666f7220627579695f8201527f6e67000000000000000000000000000000000000000000000000000000000000602082015250565b5f613502602283612967565b915061350d826134a8565b604082019050919050565b5f6020820190508181035f83015261352f816134f6565b9050919050565b5f6060820190506135495f830186612597565b6135566020830185612597565b61356360408301846125c8565b949350505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f416d6f756e742063616e6e6f74206265207a65726f00000000000000000000005f82015250565b5f6135cc601583612967565b91506135d782613598565b602082019050919050565b5f6020820190508181035f8301526135f9816135c0565b9050919050565b7f416d6f756e742063616e6e6f74206578636565642073616c6520616c6c6f63615f8201527f74696f6e00000000000000000000000000000000000000000000000000000000602082015250565b5f61365a602483612967565b915061366582613600565b604082019050919050565b5f6020820190508181035f8301526136878161364e565b9050919050565b7f746f6b656e2070726963652063616e6e6f74206265207a65726f0000000000005f82015250565b5f6136c2601a83612967565b91506136cd8261368e565b602082019050919050565b5f6020820190508181035f8301526136ef816136b6565b9050919050565b5f613700826125bf565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361373257613731612dda565b5b600182019050919050565b5f6060820190506137505f8301866125c8565b61375d60208301856125c8565b61376a60408301846125c8565b94935050505056fea26469706673582212205fbe2c595ebaf60a79427915ac8ceae1f087535d25aaffaa910b72cb2f0fcce764736f6c63430008190033000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec7000000000000000000000000854ddc5df10464d3d9463318a4fb2751909b8770
Deployed Bytecode
0x608060405234801561000f575f80fd5b50600436106101ee575f3560e01c80636e8d65221161010d578063af683bb5116100a0578063f2fde38b1161006f578063f2fde38b14610582578063f39414921461059e578063f9df4056146105d1578063fe575a87146105ed576101ee565b8063af683bb5146104fc578063b2e6b91214610518578063ced134ab14610536578063d96a094a14610566576101ee565b8063893d20e8116100dc578063893d20e81461046c5780638da5cb5b1461048a57806398c2fa07146104a8578063ac6ea9b8146104e0576101ee565b80636e8d6522146103fa578063715018a61461042a5780637f63ab9414610434578063886c9ad014610450576101ee565b80633c5d1812116101855780634b7dd8e6116101545780634b7dd8e6146103725780634b94f50e14610390578063537df3b6146103ae5780635bc2942d146103ca576101ee565b80633c5d1812146103005780633d992def1461031e57806344337ea11461033a57806349df728c14610356576101ee565b80632746f98f116101c15780632746f98f1461027a5780632bc4ca93146102aa5780632ecd7020146102c657806335082933146102e4576101ee565b806310fe9ae8146101f25780631ce97fd1146102105780631e1a52a51461022e57806326a4e8d21461025e575b5f80fd5b6101fa61061d565b60405161020791906125a6565b60405180910390f35b610218610645565b60405161022591906125d7565b60405180910390f35b6102486004803603810190610243919061261e565b61064e565b60405161025591906125d7565b60405180910390f35b6102786004803603810190610273919061261e565b6106a5565b005b610294600480360381019061028f9190612673565b610817565b6040516102a191906126b8565b60405180910390f35b6102c460048036038101906102bf9190612673565b610895565b005b6102ce61093b565b6040516102db91906125d7565b60405180910390f35b6102fe60048036038101906102f9919061261e565b610944565b005b6103086109fd565b60405161031591906125d7565b60405180910390f35b61033860048036038101906103339190612673565b610a03565b005b610354600480360381019061034f919061261e565b610b2a565b005b610370600480360381019061036b919061261e565b610bf8565b005b61037a610d64565b60405161038791906125a6565b60405180910390f35b610398610d8c565b6040516103a591906125d7565b60405180910390f35b6103c860048036038101906103c3919061261e565b610da9565b005b6103e460048036038101906103df9190612673565b610e08565b6040516103f191906125d7565b60405180910390f35b610414600480360381019061040f9190612673565b610e36565b60405161042191906126b8565b60405180910390f35b610432610eb5565b005b61044e600480360381019061044991906126d1565b610ec8565b005b61046a60048036038101906104659190612673565b611314565b005b61047461143d565b60405161048191906125a6565b60405180910390f35b61049261144b565b60405161049f91906125a6565b60405180910390f35b6104c260048036038101906104bd9190612673565b611472565b6040516104d79998979695949392919061270f565b60405180910390f35b6104fa60048036038101906104f59190612673565b611511565b005b61051660048036038101906105119190612673565b611638565b005b610520611761565b60405161052d91906125a6565b60405180910390f35b610550600480360381019061054b919061261e565b611789565b60405161055d91906125d7565b60405180910390f35b610580600480360381019061057b9190612673565b6117cf565b005b61059c6004803603810190610597919061261e565b611e8c565b005b6105b860048036038101906105b3919061261e565b611f10565b6040516105c89493929190612908565b60405180910390f35b6105eb60048036038101906105e691906126d1565b6121c5565b005b6106076004803603810190610602919061261e565b612377565b60405161061491906126b8565b60405180910390f35b5f60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b5f600654905090565b5f600a5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f60065481526020019081526020015f20549050919050565b6106ad6123c9565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361071b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610712906129c1565b60405180910390fd5b5f8173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161075591906125a6565b602060405180830381865afa158015610770573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061079491906129f3565b116107d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107cb90612a68565b60405180910390fd5b8060035f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b5f808211801561082957506007548211155b610868576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085f90612ad0565b60405180910390fd5b5f600b5f8481526020019081526020015f209050806005015f9054906101000a900460ff16915050919050565b61089d6123c9565b5f811180156108ae57508060075410155b6108ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108e490612b38565b60405180910390fd5b6006548103610931576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161092890612ba0565b60405180910390fd5b8060068190555050565b5f600454905090565b61094c6123c9565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036109ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109b1906129c1565b60405180910390fd5b8060085f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60075481565b610a0b6123c9565b5f81118015610a1c57506007548111155b610a5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5290612ad0565b60405180910390fd5b5f600b5f8381526020019081526020015f20905081815f015414610ab4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aab90612c08565b60405180910390fd5b5f1515816005015f9054906101000a900460ff16151514610b0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0190612c70565b60405180910390fd5b6001816005015f6101000a81548160ff0219169083151502179055505050565b610b326123c9565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610ba0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9790612cd8565b60405180910390fd5b6001600d5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555050565b610c006123c9565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610c6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6590612d40565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb338373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610cc491906125a6565b602060405180830381865afa158015610cdf573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d0391906129f3565b6040518363ffffffff1660e01b8152600401610d20929190612d5e565b6020604051808303815f875af1158015610d3c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d609190612daf565b5050565b5f60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b5f600b5f60065481526020019081526020015f2060020154905090565b610db16123c9565b5f600d5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555050565b5f610e11610d8c565b670de0b6b3a764000083610e259190612e07565b610e2f9190612e75565b9050919050565b5f8082118015610e4857506007548211155b610e87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7e90612ad0565b60405180910390fd5b5f600b5f8481526020019081526020015f2090508060050160019054906101000a900460ff16915050919050565b610ebd6123c9565b610ec65f612450565b565b610ed0612511565b600d5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1615610f5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5190612f15565b60405180910390fd5b5f82118015610f6b57508160075410155b610faa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa190612b38565b60405180910390fd5b5f600b5f8481526020019081526020015f209050806005015f9054906101000a900460ff1661100e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100590612f7d565b60405180910390fd5b5f600c5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2090505f81805490508410611095576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108c90612fe5565b60405180910390fd5b5f8490505b82805490508110156112c157858382815481106110ba576110b9613003565b5b905f5260205f2090600602016003015414801561110357508281815481106110e5576110e4613003565b5b905f5260205f2090600602016005015f9054906101000a900460ff16155b156112b4575f83828154811061111c5761111b613003565b5b905f5260205f20906006020160010154905060035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b815260040161118a929190612d5e565b6020604051808303815f875af11580156111a6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111ca9190612daf565b5060018483815481106111e0576111df613003565b5b905f5260205f2090600602016005015f6101000a81548160ff02191690831515021790555080836112119190613030565b92503373ffffffffffffffffffffffffffffffffffffffff167f37344d70badbfa3622c1a97707028d03962bbf14366677b67edf630b9f76409b85848154811061125e5761125d613003565b5b905f5260205f2090600602015f01548387868154811061128157611280613003565b5b905f5260205f209060060201600201548b6040516112a29493929190613063565b60405180910390a25050505050611308565b808060010191505061109a565b505f8111611304576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112fb906130f0565b60405180910390fd5b5050505b611310612557565b5050565b61131c6123c9565b5f8111801561132d57506007548111155b61136c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136390612ad0565b60405180910390fd5b5f600b5f8381526020019081526020015f20905081815f0154146113c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113bc90613158565b60405180910390fd5b600115158160050160019054906101000a900460ff1615151461141d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611414906131c0565b60405180910390fd5b5f8160050160016101000a81548160ff0219169083151502179055505050565b5f61144661144b565b905090565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b5f805f805f805f805f808a11611486575f80fd5b5f600b5f8c81526020019081526020015f209050805f01548160010154826002015483600301548460040154856003015486600101546114c691906131de565b865f015460065414876005015f9054906101000a900460ff168860050160019054906101000a900460ff16995099509950995099509950995099509950509193959799909294969850565b6115196123c9565b5f8111801561152a57506007548111155b611569576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156090612ad0565b60405180910390fd5b5f600b5f8381526020019081526020015f20905081815f0154146115c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b990612c08565b60405180910390fd5b60011515816005015f9054906101000a900460ff16151514611619576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116109061325b565b60405180910390fd5b5f816005015f6101000a81548160ff0219169083151502179055505050565b6116406123c9565b5f8111801561165157506007548111155b611690576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168790612ad0565b60405180910390fd5b5f600b5f8381526020019081526020015f20905081815f0154146116e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e090613158565b60405180910390fd5b5f15158160050160019054906101000a900460ff16151514611740576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611737906132c3565b60405180910390fd5b60018160050160016101000a81548160ff0219169083151502179055505050565b5f60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b5f60095f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b6117d7612511565b600d5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1615611861576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185890612f15565b60405180910390fd5b5f81116118a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189a9061332b565b60405180910390fd5b8060025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b8152600401611900929190613349565b602060405180830381865afa15801561191b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061193f91906129f3565b1015611980576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611977906133ba565b60405180910390fd5b8060025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b81526004016119db91906125a6565b602060405180830381865afa1580156119f6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a1a91906129f3565b1015611a5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5290613422565b60405180910390fd5b5f600b5f60065481526020019081526020015f209050600115158160050160019054906101000a900460ff16151514611ac9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ac09061348a565b60405180910390fd5b5f8160020154670de0b6b3a764000084611ae39190612e07565b611aed9190612e75565b905081600301548260010154611b0391906131de565b811115611b45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3c90613518565b60405180910390fd5b80826003015f828254611b589190613030565b92505081905550670de0b6b3a764000082600301548360020154611b7c9190612e07565b611b869190612e75565b82600401819055508060045f828254611b9f9190613030565b9250508190555060045460055f828254611bb991906131de565b925050819055508260095f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254611c0c9190613030565b9250508190555080600a5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f60065481526020019081526020015f205f828254611c709190613030565b9250508190555060025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3360085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16866040518463ffffffff1660e01b8152600401611cf693929190613536565b6020604051808303815f875af1158015611d12573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d369190612daf565b505f600c5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f209050806040518060c001604052808681526020018481526020018560020154815260200160065481526020014281526020015f1515815250908060018154018082558091505060019003905f5260205f2090600602015f909190919091505f820151815f01556020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015f6101000a81548160ff02191690831515021790555050503373ffffffffffffffffffffffffffffffffffffffff167f064fb1933e186be0b289a87e98518dc18cc9856ecbc9f1353d1a138ddf733ec585848660020154600654604051611e769493929190613063565b60405180910390a2505050611e89612557565b50565b611e946123c9565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611f04575f6040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401611efb91906125a6565b60405180910390fd5b611f0d81612450565b50565b6060806060805f600c5f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2090505f818054905090508067ffffffffffffffff811115611f7857611f7761356b565b5b604051908082528060200260200182016040528015611fa65781602001602082028036833780820191505090505b5095508067ffffffffffffffff811115611fc357611fc261356b565b5b604051908082528060200260200182016040528015611ff15781602001602082028036833780820191505090505b5094508067ffffffffffffffff81111561200e5761200d61356b565b5b60405190808252806020026020018201604052801561203c5781602001602082028036833780820191505090505b5093508067ffffffffffffffff8111156120595761205861356b565b5b6040519080825280602002602001820160405280156120875781602001602082028036833780820191505090505b5092505f5b818110156121bb578281815481106120a7576120a6613003565b5b905f5260205f209060060201600101548782815181106120ca576120c9613003565b5b6020026020010181815250508281815481106120e9576120e8613003565b5b905f5260205f2090600602016003015486828151811061210c5761210b613003565b5b60200260200101818152505082818154811061212b5761212a613003565b5b905f5260205f2090600602016004015485828151811061214e5761214d613003565b5b60200260200101818152505082818154811061216d5761216c613003565b5b905f5260205f2090600602016005015f9054906101000a900460ff1684828151811061219c5761219b613003565b5b602002602001019015159081151581525050808060010191505061208c565b5050509193509193565b6121cd6123c9565b5f60016007546121dd9190613030565b90505f8311612221576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612218906135e2565b60405180910390fd5b600554831115612266576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161225d90613670565b60405180910390fd5b5f82116122a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229f906136d8565b60405180910390fd5b5f600b5f8381526020019081526020015f20905081815f01819055508381600101819055508281600201819055505f81600301819055505f81600401819055505f816005015f6101000a81548160ff0219169083151502179055505f8160050160016101000a81548160ff02191690831515021790555060075f815480929190612331906136f6565b91905055507fd5531d5f1fd5e4ff652e0f5888cc4715ed2b84af88b98dc718ad1491439abb9d8285856040516123699392919061373d565b60405180910390a150505050565b5f600d5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff169050919050565b6123d1612560565b73ffffffffffffffffffffffffffffffffffffffff166123ef61144b565b73ffffffffffffffffffffffffffffffffffffffff161461244e57612412612560565b6040517f118cdaa700000000000000000000000000000000000000000000000000000000815260040161244591906125a6565b60405180910390fd5b565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60026001540361254d576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600181905550565b60018081905550565b5f33905090565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61259082612567565b9050919050565b6125a081612586565b82525050565b5f6020820190506125b95f830184612597565b92915050565b5f819050919050565b6125d1816125bf565b82525050565b5f6020820190506125ea5f8301846125c8565b92915050565b5f80fd5b6125fd81612586565b8114612607575f80fd5b50565b5f81359050612618816125f4565b92915050565b5f60208284031215612633576126326125f0565b5b5f6126408482850161260a565b91505092915050565b612652816125bf565b811461265c575f80fd5b50565b5f8135905061266d81612649565b92915050565b5f60208284031215612688576126876125f0565b5b5f6126958482850161265f565b91505092915050565b5f8115159050919050565b6126b28161269e565b82525050565b5f6020820190506126cb5f8301846126a9565b92915050565b5f80604083850312156126e7576126e66125f0565b5b5f6126f48582860161265f565b92505060206127058582860161265f565b9150509250929050565b5f610120820190506127235f83018c6125c8565b612730602083018b6125c8565b61273d604083018a6125c8565b61274a60608301896125c8565b61275760808301886125c8565b61276460a08301876125c8565b61277160c08301866126a9565b61277e60e08301856126a9565b61278c6101008301846126a9565b9a9950505050505050505050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b6127cc816125bf565b82525050565b5f6127dd83836127c3565b60208301905092915050565b5f602082019050919050565b5f6127ff8261279a565b61280981856127a4565b9350612814836127b4565b805f5b8381101561284457815161282b88826127d2565b9750612836836127e9565b925050600181019050612817565b5085935050505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b6128838161269e565b82525050565b5f612894838361287a565b60208301905092915050565b5f602082019050919050565b5f6128b682612851565b6128c0818561285b565b93506128cb8361286b565b805f5b838110156128fb5781516128e28882612889565b97506128ed836128a0565b9250506001810190506128ce565b5085935050505092915050565b5f6080820190508181035f83015261292081876127f5565b9050818103602083015261293481866127f5565b9050818103604083015261294881856127f5565b9050818103606083015261295c81846128ac565b905095945050505050565b5f82825260208201905092915050565b7f416464726573732063616e6e6f74206265207a65726f206164647265737300005f82015250565b5f6129ab601e83612967565b91506129b682612977565b602082019050919050565b5f6020820190508181035f8301526129d88161299f565b9050919050565b5f815190506129ed81612649565b92915050565b5f60208284031215612a0857612a076125f0565b5b5f612a15848285016129df565b91505092915050565b7f496e76616c6964204c425420636f6e74726163740000000000000000000000005f82015250565b5f612a52601483612967565b9150612a5d82612a1e565b602082019050919050565b5f6020820190508181035f830152612a7f81612a46565b9050919050565b7f496e76616c6964207068617365204944000000000000000000000000000000005f82015250565b5f612aba601083612967565b9150612ac582612a86565b602082019050919050565b5f6020820190508181035f830152612ae781612aae565b9050919050565b7f496e61766c6964207068617365206964000000000000000000000000000000005f82015250565b5f612b22601083612967565b9150612b2d82612aee565b602082019050919050565b5f6020820190508181035f830152612b4f81612b16565b9050919050565b7f506861736520616c7265616479206163746976650000000000000000000000005f82015250565b5f612b8a601483612967565b9150612b9582612b56565b602082019050919050565b5f6020820190508181035f830152612bb781612b7e565b9050919050565b7f506861736520696420646f6573206e6f742065786973740000000000000000005f82015250565b5f612bf2601783612967565b9150612bfd82612bbe565b602082019050919050565b5f6020820190508181035f830152612c1f81612be6565b9050919050565b7f4169722064726f7020616c7265616479206163746976650000000000000000005f82015250565b5f612c5a601783612967565b9150612c6582612c26565b602082019050919050565b5f6020820190508181035f830152612c8781612c4e565b9050919050565b7f496e76616c6964206164647265737300000000000000000000000000000000005f82015250565b5f612cc2600f83612967565b9150612ccd82612c8e565b602082019050919050565b5f6020820190508181035f830152612cef81612cb6565b9050919050565b7f496e76616c696420746f6b656e206164647265737300000000000000000000005f82015250565b5f612d2a601583612967565b9150612d3582612cf6565b602082019050919050565b5f6020820190508181035f830152612d5781612d1e565b9050919050565b5f604082019050612d715f830185612597565b612d7e60208301846125c8565b9392505050565b612d8e8161269e565b8114612d98575f80fd5b50565b5f81519050612da981612d85565b92915050565b5f60208284031215612dc457612dc36125f0565b5b5f612dd184828501612d9b565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f612e11826125bf565b9150612e1c836125bf565b9250828202612e2a816125bf565b91508282048414831517612e4157612e40612dda565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f612e7f826125bf565b9150612e8a836125bf565b925082612e9a57612e99612e48565b5b828204905092915050565b7f4164647265737320697320626c61636b6c69737465642e20436f6e74616374205f8201527f41646d696e000000000000000000000000000000000000000000000000000000602082015250565b5f612eff602583612967565b9150612f0a82612ea5565b604082019050919050565b5f6020820190508181035f830152612f2c81612ef3565b9050919050565b7f41697264726f70206e6f742073746172746564000000000000000000000000005f82015250565b5f612f67601383612967565b9150612f7282612f33565b602082019050919050565b5f6020820190508181035f830152612f9481612f5b565b9050919050565b7f496e76616c696420696e646578000000000000000000000000000000000000005f82015250565b5f612fcf600d83612967565b9150612fda82612f9b565b602082019050919050565b5f6020820190508181035f830152612ffc81612fc3565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f61303a826125bf565b9150613045836125bf565b925082820190508082111561305d5761305c612dda565b5b92915050565b5f6080820190506130765f8301876125c8565b61308360208301866125c8565b61309060408301856125c8565b61309d60608301846125c8565b95945050505050565b7f4e6f20746f6b656e7320746f20636c61696d20696e20746869732070686173655f82015250565b5f6130da602083612967565b91506130e5826130a6565b602082019050919050565b5f6020820190508181035f830152613107816130ce565b9050919050565b7f506861736520646f6573206e6f742065786973740000000000000000000000005f82015250565b5f613142601483612967565b915061314d8261310e565b602082019050919050565b5f6020820190508181035f83015261316f81613136565b9050919050565b7f427579206e6f74206163746976650000000000000000000000000000000000005f82015250565b5f6131aa600e83612967565b91506131b582613176565b602082019050919050565b5f6020820190508181035f8301526131d78161319e565b9050919050565b5f6131e8826125bf565b91506131f3836125bf565b925082820390508181111561320b5761320a612dda565b5b92915050565b7f4169722064726f70206e6f7420616374697665000000000000000000000000005f82015250565b5f613245601383612967565b915061325082613211565b602082019050919050565b5f6020820190508181035f83015261327281613239565b9050919050565b7f42757920616c72656164792061637469766500000000000000000000000000005f82015250565b5f6132ad601283612967565b91506132b882613279565b602082019050919050565b5f6020820190508181035f8301526132da816132a1565b9050919050565b7f496e76616c696420416d6f756e740000000000000000000000000000000000005f82015250565b5f613315600e83612967565b9150613320826132e1565b602082019050919050565b5f6020820190508181035f83015261334281613309565b9050919050565b5f60408201905061335c5f830185612597565b6133696020830184612597565b9392505050565b7f496e73756666696369656e7420416c6c6f77616e6365000000000000000000005f82015250565b5f6133a4601683612967565b91506133af82613370565b602082019050919050565b5f6020820190508181035f8301526133d181613398565b9050919050565b7f4e6f7420656e6f7567682062616c616e636500000000000000000000000000005f82015250565b5f61340c601283612967565b9150613417826133d8565b602082019050919050565b5f6020820190508181035f83015261343981613400565b9050919050565b7f427579696e67206e6f742061637469766520666f7220746869732070686173655f82015250565b5f613474602083612967565b915061347f82613440565b602082019050919050565b5f6020820190508181035f8301526134a181613468565b9050919050565b7f4e6f7420656e6f75676820746f6b656e20616d6f756e7420666f7220627579695f8201527f6e67000000000000000000000000000000000000000000000000000000000000602082015250565b5f613502602283612967565b915061350d826134a8565b604082019050919050565b5f6020820190508181035f83015261352f816134f6565b9050919050565b5f6060820190506135495f830186612597565b6135566020830185612597565b61356360408301846125c8565b949350505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f416d6f756e742063616e6e6f74206265207a65726f00000000000000000000005f82015250565b5f6135cc601583612967565b91506135d782613598565b602082019050919050565b5f6020820190508181035f8301526135f9816135c0565b9050919050565b7f416d6f756e742063616e6e6f74206578636565642073616c6520616c6c6f63615f8201527f74696f6e00000000000000000000000000000000000000000000000000000000602082015250565b5f61365a602483612967565b915061366582613600565b604082019050919050565b5f6020820190508181035f8301526136878161364e565b9050919050565b7f746f6b656e2070726963652063616e6e6f74206265207a65726f0000000000005f82015250565b5f6136c2601a83612967565b91506136cd8261368e565b602082019050919050565b5f6020820190508181035f8301526136ef816136b6565b9050919050565b5f613700826125bf565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361373257613731612dda565b5b600182019050919050565b5f6060820190506137505f8301866125c8565b61375d60208301856125c8565b61376a60408301846125c8565b94935050505056fea26469706673582212205fbe2c595ebaf60a79427915ac8ceae1f087535d25aaffaa910b72cb2f0fcce764736f6c63430008190033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec7000000000000000000000000854ddc5df10464d3d9463318a4fb2751909b8770
-----Decoded View---------------
Arg [0] : _usdt (address): 0xdAC17F958D2ee523a2206206994597C13D831ec7
Arg [1] : _admin (address): 0x854ddC5dF10464d3d9463318A4fb2751909B8770
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec7
Arg [1] : 000000000000000000000000854ddc5df10464d3d9463318a4fb2751909b8770
Deployed Bytecode Sourcemap
30920:15648:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33527:97;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34085:94;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40740:133;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40881:289;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36195:236;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41178:249;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34259:98;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41435:172;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31129:23;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41758:364;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38410:160;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46309:256;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33340:97;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33715:110;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38578:108;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40415:172;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36641:231;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13488:103;;;:::i;:::-;;44949:1206;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39704:345;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34365:85;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12813:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37555:847;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;42269:359;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40057:350;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33907:96;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40595:137;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42798:1891;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;13746:220;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35132:853;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;38917:779;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34634:111;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33527:97;33577:7;33612:3;;;;;;;;;;;33597:19;;33527:97;:::o;34085:94::-;34134:4;34158:13;;34151:20;;34085:94;:::o;40740:133::-;40808:4;40832:11;:18;40844:5;40832:18;;;;;;;;;;;;;;;:33;40851:13;;40832:33;;;;;;;;;;;;40825:40;;40740:133;;;:::o;40881:289::-;12699:13;:11;:13::i;:::-;40974:1:::1;40958:18;;:4;:18;;::::0;40950:61:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;41084:1;41051:4;41044:22;;;41075:4;41044:37;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:41;41022:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;41157:4;41144:3;;:18;;;;;;;;;;;;;;;;;;40881:289:::0;:::o;36195:236::-;36258:4;36294:1;36283:8;:12;:39;;;;;36311:11;;36299:8;:23;;36283:39;36275:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;36354:19;36376:6;:16;36383:8;36376:16;;;;;;;;;;;36354:38;;36410:5;:13;;;;;;;;;;;;36403:20;;;36195:236;;;:::o;41178:249::-;12699:13;:11;:13::i;:::-;41266:1:::1;41255:8;:12;:39;;;;;41286:8;41271:11;;:23;;41255:39;41247:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41346:13;;41334:8;:25:::0;41326:58:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;41411:8;41395:13;:24;;;;41178:249:::0;:::o;34259:98::-;34311:4;34335:14;;34328:21;;34259:98;:::o;41435:172::-;12699:13;:11;:13::i;:::-;41531:1:::1;41513:20;;:6;:20;;::::0;41505:63:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;41593:6;41579:11;;:20;;;;;;;;;;;;;;;;;;41435:172:::0;:::o;31129:23::-;;;;:::o;41758:364::-;12699:13;:11;:13::i;:::-;41844:1:::1;41833:8;:12;:39;;;;;41861:11;;41849:8;:23;;41833:39;41825:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41904:19;41926:6;:16;41933:8;41926:16;;;;;;;;;;;41904:38;;41978:8;41961:5;:13;;;:25;41953:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;42050:5;42033:22;;:5;:13;;;;;;;;;;;;:22;;;42025:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;42110:4;42094:5;:13;;;:20;;;;;;;;;;;;;;;;;;41814:308;41758:364:::0;:::o;38410:160::-;12699:13;:11;:13::i;:::-;38504:1:::1;38487:19;;:5;:19;;::::0;38479:47:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;38558:4;38537:11;:18;38549:5;38537:18;;;;;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;38410:160:::0;:::o;46309:256::-;12699:13;:11;:13::i;:::-;46405:1:::1;46387:20;;:6;:20;;::::0;46379:54:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;46451:6;46444:23;;;46482:10;46514:6;46507:24;;;46540:4;46507:39;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46444:113;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;46309:256:::0;:::o;33340:97::-;33389:7;33424:4;;;;;;;;;;;33409:20;;33340:97;:::o;33715:110::-;33761:4;33785:6;:21;33792:13;;33785:21;;;;;;;;;;;:32;;;33778:39;;33715:110;:::o;38578:108::-;12699:13;:11;:13::i;:::-;38673:5:::1;38652:11;:18;38664:5;38652:18;;;;;;;;;;;;;;;;:26;;;;;;;;;;;;;;;;;;38578:108:::0;:::o;40415:172::-;40494:16;40564:15;:13;:15::i;:::-;40552:8;40538:11;:22;;;;:::i;:::-;40537:42;;;;:::i;:::-;40523:56;;40415:172;;;:::o;36641:231::-;36700:4;36736:1;36725:8;:12;:39;;;;;36753:11;;36741:8;:23;;36725:39;36717:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;36796:19;36818:6;:16;36825:8;36818:16;;;;;;;;;;;36796:38;;36852:5;:12;;;;;;;;;;;;36845:19;;;36641:231;;;:::o;13488:103::-;12699:13;:11;:13::i;:::-;13553:30:::1;13580:1;13553:18;:30::i;:::-;13488:103::o:0;44949:1206::-;9212:21;:19;:21::i;:::-;31937:11:::1;:23;31949:10;31937:23;;;;;;;;;;;;;;;;;;;;;;;;;31936:24;31914:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;45089:1:::2;45078:8;:12;:39;;;;;45109:8;45094:11;;:23;;45078:39;45070:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45149:19;45171:6;:16;45178:8;45171:16;;;;;;;;;;;45149:38;;45206:5;:13;;;;;;;;;;;;45198:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;45254:32;45289:13;:25;45303:10;45289:25;;;;;;;;;;;;;;;45254:60;;45325:23;45378:8;:15;;;;45369:6;:24;45361:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;45429:6;45438;45429:15;;45424:646;45450:8;:15;;;;45446:1;:19;45424:646;;;45514:8;45491;45500:1;45491:11;;;;;;;;:::i;:::-;;;;;;;;;;;;:19;;;:31;:55;;;;;45527:8;45536:1;45527:11;;;;;;;;:::i;:::-;;;;;;;;;;;;:19;;;;;;;;;;;;45526:20;45491:55;45487:572;;;45567:18;45588:8;45597:1;45588:11;;;;;;;;:::i;:::-;;;;;;;;;;;;:24;;;45567:45;;45631:3;;;;;;;;;;;:12;;;45644:10;45656:13;45631:39;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;45711:4;45689:8;45698:1;45689:11;;;;;;;;:::i;:::-;;;;;;;;;;;;:19;;;:26;;;;;;;;;;;;;;;;;;45756:13;45734:35;;;;;:::i;:::-;;;45829:10;45793:225;;;45862:8;45871:1;45862:11;;;;;;;;:::i;:::-;;;;;;;;;;;;:25;;;45910:13;45946:8;45955:1;45946:11;;;;;;;;:::i;:::-;;;;;;;;;;;;:22;;;45991:8;45793:225;;;;;;;;;:::i;:::-;;;;;;;;46037:7;;;;;;;45487:572;45467:3;;;;;;;45424:646;;;;46109:1;46088:18;:22;46080:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;45059:1096;;;32036:1;9256:20:::0;:18;:20::i;:::-;44949:1206;;:::o;39704:345::-;12699:13;:11;:13::i;:::-;39785:1:::1;39774:8;:12;:39;;;;;39802:11;;39790:8;:23;;39774:39;39766:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39845:19;39867:6;:16;39874:8;39867:16;;;;;;;;;;;39845:38;;39919:8;39902:5;:13;;;:25;39894:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;39987:4;39971:20;;:5;:12;;;;;;;;;;;;:20;;;39963:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;40036:5;40021;:12;;;:20;;;;;;;;;;;;;;;;;;39755:294;39704:345:::0;:::o;34365:85::-;34408:7;34435;:5;:7::i;:::-;34428:14;;34365:85;:::o;12813:87::-;12859:7;12886:6;;;;;;;;;;;12879:13;;12813:87;:::o;37555:847::-;37670:12;37697:27;37739:16;37770:15;37800:20;37835;37870:18;37903:12;37930:11;37988:1;37977:8;:12;37969:21;;;;;;38001:19;38023:6;:16;38030:8;38023:16;;;;;;;;;;;38001:38;;38072:5;:13;;;38100:5;:27;;;38142:5;:16;;;38173:5;:15;;;38203:5;:20;;;38268:5;:15;;;38238:5;:27;;;:45;;;;:::i;:::-;38315:5;:13;;;38298;;:30;38343:5;:13;;;;;;;;;;;;38371:5;:12;;;;;;;;;;;;38050:344;;;;;;;;;;;;;;;;;;;37555:847;;;;;;;;;;;:::o;42269:359::-;12699:13;:11;:13::i;:::-;42354:1:::1;42343:8;:12;:39;;;;;42371:11;;42359:8;:23;;42343:39;42335:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42414:19;42436:6;:16;42443:8;42436:16;;;;;;;;;;;42414:38;;42488:8;42471:5;:13;;;:25;42463:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;42560:4;42543:21;;:5;:13;;;;;;;;;;;;:21;;;42535:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;42615:5;42599;:13;;;:21;;;;;;;;;;;;;;;;;;42324:304;42269:359:::0;:::o;40057:350::-;12699:13;:11;:13::i;:::-;40139:1:::1;40128:8;:12;:39;;;;;40156:11;;40144:8;:23;;40128:39;40120:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40199:19;40221:6;:16;40228:8;40221:16;;;;;;;;;;;40199:38;;40273:8;40256:5;:13;;;:25;40248:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;40341:5;40325:21;;:5;:12;;;;;;;;;;;;:21;;;40317:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;40395:4;40380:5;:12;;;:19;;;;;;;;;;;;;;;;;;40109:298;40057:350:::0;:::o;33907:96::-;33957:7;33984:11;;;;;;;;;;;33977:18;;33907:96;:::o;40595:137::-;40681:4;40705:12;:19;40718:5;40705:19;;;;;;;;;;;;;;;;40698:26;;40595:137;;;:::o;42798:1891::-;9212:21;:19;:21::i;:::-;31937:11:::1;:23;31949:10;31937:23;;;;;;;;;;;;;;;;;;;;;;;;;31936:24;31914:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;42899:1:::2;42885:11;:15;42877:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;42997:11;42952:4;;;;;;;;;;;:14;;;42967:10;42987:4;42952:41;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:56;;42930:128;;;;;;;;;;;;:::i;:::-;;;;;;;;;43121:11;43091:4;;;;;;;;;;;:14;;;43106:10;43091:26;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:41;;43069:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;43191:26;43220:6;:21;43227:13;;43220:21;;;;;;;;;;;43191:50;;43297:4;43274:27;;:12;:19;;;;;;;;;;;;:27;;;43252:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;43372:16;43434:12;:23;;;43408:8;43393:11;:24;;;;:::i;:::-;43392:65;;;;:::i;:::-;43372:86;;43562:12;:22;;;43525:12;:34;;;:59;;;;:::i;:::-;43493:11;:91;;43471:175;;;;;;;;;;;;:::i;:::-;;;;;;;;;43685:11;43659:12;:22;;;:37;;;;;;;:::i;:::-;;;;;;;;43816:8;43777:12;:22;;;43751:12;:23;;;:48;;;;:::i;:::-;43750:74;;;;:::i;:::-;43707:12;:27;;:117;;;;43853:11;43835:14;;:29;;;;;;;:::i;:::-;;;;;;;;43898:14;;43875:19;;:37;;;;;;;:::i;:::-;;;;;;;;43953:11;43925:12;:24;43938:10;43925:24;;;;;;;;;;;;;;;;:39;;;;;;;:::i;:::-;;;;;;;;44017:11;43975;:23;43987:10;43975:23;;;;;;;;;;;;;;;:38;43999:13;;43975:38;;;;;;;;;;;;:53;;;;;;;:::i;:::-;;;;;;;;44041:4;;;;;;;;;;;:17;;;44059:10;44071:11;;;;;;;;;;;44084;44041:55;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;44109:32;44144:13;:25;44158:10;44144:25;;;;;;;;;;;;;;;44109:60;;44180:8;44208:287;;;;;;;;44256:11;44208:287;;;;44300:11;44208:287;;;;44342:12;:23;;;44208:287;;;;44393:13;;44208:287;;;;44431:15;44208:287;;;;44474:5;44208:287;;;;::::0;44180:326:::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44542:10;44524:157;;;44567:11;44593;44619:12;:23;;;44657:13;;44524:157;;;;;;;;;:::i;:::-;;;;;;;;42866:1823;;;9256:20:::0;:18;:20::i;:::-;42798:1891;:::o;13746:220::-;12699:13;:11;:13::i;:::-;13851:1:::1;13831:22;;:8;:22;;::::0;13827:93:::1;;13905:1;13877:31;;;;;;;;;;;:::i;:::-;;;;;;;;13827:93;13930:28;13949:8;13930:18;:28::i;:::-;13746:220:::0;:::o;35132:853::-;35259:26;35300:21;35336:18;35369:21;35418:32;35453:13;:20;35467:5;35453:20;;;;;;;;;;;;;;;35418:55;;35484:11;35498:8;:15;;;;35484:29;;35550:6;35539:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35524:33;;35589:6;35578:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35568:28;;35625:6;35614:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35607:25;;35664:6;35653:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35643:28;;35689:6;35684:238;35705:6;35701:1;:10;35684:238;;;35751:8;35760:1;35751:11;;;;;;;;:::i;:::-;;;;;;;;;;;;:24;;;35733:12;35746:1;35733:15;;;;;;;;:::i;:::-;;;;;;;:42;;;;;35803:8;35812:1;35803:11;;;;;;;;:::i;:::-;;;;;;;;;;;;:19;;;35790:7;35798:1;35790:10;;;;;;;;:::i;:::-;;;;;;;:32;;;;;35847:8;35856:1;35847:11;;;;;;;;:::i;:::-;;;;;;;;;;;;:16;;;35837:4;35842:1;35837:7;;;;;;;;:::i;:::-;;;;;;;:26;;;;;35891:8;35900:1;35891:11;;;;;;;;:::i;:::-;;;;;;;;;;;;:19;;;;;;;;;;;;35878:7;35886:1;35878:10;;;;;;;;:::i;:::-;;;;;;;:32;;;;;;;;;;;35713:3;;;;;;;35684:238;;;;35932:45;;35132:853;;;;;:::o;38917:779::-;12699:13;:11;:13::i;:::-;38997::::1;39027:1;39013:11;;:15;;;;:::i;:::-;38997:31;;39057:1;39047:7;:11;39039:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;39128:19;;39117:7;:30;;39095:116;;;;;;;;;;;;:::i;:::-;;;;;;;;;39244:1;39230:11;:15;39222:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;39289:22;39314:6;:16;39321:8;39314:16;;;;;;;;;;;39289:41;;39360:8;39341;:16;;:27;;;;39412:7;39379:8;:30;;:40;;;;39452:11;39430:8;:19;;:33;;;;39495:1;39474:8;:18;;:22;;;;39533:1;39507:8;:23;;:27;;;;39564:5;39545:8;:16;;;:24;;;;;;;;;;;;;;;;;;39598:5;39580:8;:15;;;:23;;;;;;;;;;;;;;;;;;39614:11;;:13;;;;;;;;;:::i;:::-;;;;;;39645:43;39657:8;39667:7;39676:11;39645:43;;;;;;;;:::i;:::-;;;;;;;;38986:710;;38917:779:::0;;:::o;34634:111::-;34695:4;34719:11;:18;34731:5;34719:18;;;;;;;;;;;;;;;;;;;;;;;;;34712:25;;34634:111;;;:::o;12978:166::-;13049:12;:10;:12::i;:::-;13038:23;;:7;:5;:7::i;:::-;:23;;;13034:103;;13112:12;:10;:12::i;:::-;13085:40;;;;;;;;;;;:::i;:::-;;;;;;;;13034:103;12978:166::o;14126:191::-;14200:16;14219:6;;;;;;;;;;;14200:25;;14245:8;14236:6;;:17;;;;;;;;;;;;;;;;;;14300:8;14269:40;;14290:8;14269:40;;;;;;;;;;;;14189:128;14126:191;:::o;9292:315::-;8590:1;9421:7;;:18;9417:88;;9463:30;;;;;;;;;;;;;;9417:88;8590:1;9582:7;:17;;;;9292:315::o;9615:212::-;8547:1;9798:7;:21;;;;9615:212::o;10822:98::-;10875:7;10902:10;10895:17;;10822:98;:::o;7:126:1:-;44:7;84:42;77:5;73:54;62:65;;7:126;;;:::o;139:96::-;176:7;205:24;223:5;205:24;:::i;:::-;194:35;;139:96;;;:::o;241:118::-;328:24;346:5;328:24;:::i;:::-;323:3;316:37;241:118;;:::o;365:222::-;458:4;496:2;485:9;481:18;473:26;;509:71;577:1;566:9;562:17;553:6;509:71;:::i;:::-;365:222;;;;:::o;593:77::-;630:7;659:5;648:16;;593:77;;;:::o;676:118::-;763:24;781:5;763:24;:::i;:::-;758:3;751:37;676:118;;:::o;800:222::-;893:4;931:2;920:9;916:18;908:26;;944:71;1012:1;1001:9;997:17;988:6;944:71;:::i;:::-;800:222;;;;:::o;1109:117::-;1218:1;1215;1208:12;1355:122;1428:24;1446:5;1428:24;:::i;:::-;1421:5;1418:35;1408:63;;1467:1;1464;1457:12;1408:63;1355:122;:::o;1483:139::-;1529:5;1567:6;1554:20;1545:29;;1583:33;1610:5;1583:33;:::i;:::-;1483:139;;;;:::o;1628:329::-;1687:6;1736:2;1724:9;1715:7;1711:23;1707:32;1704:119;;;1742:79;;:::i;:::-;1704:119;1862:1;1887:53;1932:7;1923:6;1912:9;1908:22;1887:53;:::i;:::-;1877:63;;1833:117;1628:329;;;;:::o;1963:122::-;2036:24;2054:5;2036:24;:::i;:::-;2029:5;2026:35;2016:63;;2075:1;2072;2065:12;2016:63;1963:122;:::o;2091:139::-;2137:5;2175:6;2162:20;2153:29;;2191:33;2218:5;2191:33;:::i;:::-;2091:139;;;;:::o;2236:329::-;2295:6;2344:2;2332:9;2323:7;2319:23;2315:32;2312:119;;;2350:79;;:::i;:::-;2312:119;2470:1;2495:53;2540:7;2531:6;2520:9;2516:22;2495:53;:::i;:::-;2485:63;;2441:117;2236:329;;;;:::o;2571:90::-;2605:7;2648:5;2641:13;2634:21;2623:32;;2571:90;;;:::o;2667:109::-;2748:21;2763:5;2748:21;:::i;:::-;2743:3;2736:34;2667:109;;:::o;2782:210::-;2869:4;2907:2;2896:9;2892:18;2884:26;;2920:65;2982:1;2971:9;2967:17;2958:6;2920:65;:::i;:::-;2782:210;;;;:::o;2998:474::-;3066:6;3074;3123:2;3111:9;3102:7;3098:23;3094:32;3091:119;;;3129:79;;:::i;:::-;3091:119;3249:1;3274:53;3319:7;3310:6;3299:9;3295:22;3274:53;:::i;:::-;3264:63;;3220:117;3376:2;3402:53;3447:7;3438:6;3427:9;3423:22;3402:53;:::i;:::-;3392:63;;3347:118;2998:474;;;;;:::o;3478:1072::-;3777:4;3815:3;3804:9;3800:19;3792:27;;3829:71;3897:1;3886:9;3882:17;3873:6;3829:71;:::i;:::-;3910:72;3978:2;3967:9;3963:18;3954:6;3910:72;:::i;:::-;3992;4060:2;4049:9;4045:18;4036:6;3992:72;:::i;:::-;4074;4142:2;4131:9;4127:18;4118:6;4074:72;:::i;:::-;4156:73;4224:3;4213:9;4209:19;4200:6;4156:73;:::i;:::-;4239;4307:3;4296:9;4292:19;4283:6;4239:73;:::i;:::-;4322:67;4384:3;4373:9;4369:19;4360:6;4322:67;:::i;:::-;4399;4461:3;4450:9;4446:19;4437:6;4399:67;:::i;:::-;4476;4538:3;4527:9;4523:19;4514:6;4476:67;:::i;:::-;3478:1072;;;;;;;;;;;;:::o;4556:114::-;4623:6;4657:5;4651:12;4641:22;;4556:114;;;:::o;4676:184::-;4775:11;4809:6;4804:3;4797:19;4849:4;4844:3;4840:14;4825:29;;4676:184;;;;:::o;4866:132::-;4933:4;4956:3;4948:11;;4986:4;4981:3;4977:14;4969:22;;4866:132;;;:::o;5004:108::-;5081:24;5099:5;5081:24;:::i;:::-;5076:3;5069:37;5004:108;;:::o;5118:179::-;5187:10;5208:46;5250:3;5242:6;5208:46;:::i;:::-;5286:4;5281:3;5277:14;5263:28;;5118:179;;;;:::o;5303:113::-;5373:4;5405;5400:3;5396:14;5388:22;;5303:113;;;:::o;5452:732::-;5571:3;5600:54;5648:5;5600:54;:::i;:::-;5670:86;5749:6;5744:3;5670:86;:::i;:::-;5663:93;;5780:56;5830:5;5780:56;:::i;:::-;5859:7;5890:1;5875:284;5900:6;5897:1;5894:13;5875:284;;;5976:6;5970:13;6003:63;6062:3;6047:13;6003:63;:::i;:::-;5996:70;;6089:60;6142:6;6089:60;:::i;:::-;6079:70;;5935:224;5922:1;5919;5915:9;5910:14;;5875:284;;;5879:14;6175:3;6168:10;;5576:608;;;5452:732;;;;:::o;6190:111::-;6254:6;6288:5;6282:12;6272:22;;6190:111;;;:::o;6307:181::-;6403:11;6437:6;6432:3;6425:19;6477:4;6472:3;6468:14;6453:29;;6307:181;;;;:::o;6494:129::-;6558:4;6581:3;6573:11;;6611:4;6606:3;6602:14;6594:22;;6494:129;;;:::o;6629:99::-;6700:21;6715:5;6700:21;:::i;:::-;6695:3;6688:34;6629:99;;:::o;6734:167::-;6797:10;6818:40;6854:3;6846:6;6818:40;:::i;:::-;6890:4;6885:3;6881:14;6867:28;;6734:167;;;;:::o;6907:110::-;6974:4;7006;7001:3;6997:14;6989:22;;6907:110;;;:::o;7047:708::-;7160:3;7189:51;7234:5;7189:51;:::i;:::-;7256:83;7332:6;7327:3;7256:83;:::i;:::-;7249:90;;7363:53;7410:5;7363:53;:::i;:::-;7439:7;7470:1;7455:275;7480:6;7477:1;7474:13;7455:275;;;7556:6;7550:13;7583:57;7636:3;7621:13;7583:57;:::i;:::-;7576:64;;7663:57;7713:6;7663:57;:::i;:::-;7653:67;;7515:215;7502:1;7499;7495:9;7490:14;;7455:275;;;7459:14;7746:3;7739:10;;7165:590;;;7047:708;;;;:::o;7761:1145::-;8132:4;8170:3;8159:9;8155:19;8147:27;;8220:9;8214:4;8210:20;8206:1;8195:9;8191:17;8184:47;8248:108;8351:4;8342:6;8248:108;:::i;:::-;8240:116;;8403:9;8397:4;8393:20;8388:2;8377:9;8373:18;8366:48;8431:108;8534:4;8525:6;8431:108;:::i;:::-;8423:116;;8586:9;8580:4;8576:20;8571:2;8560:9;8556:18;8549:48;8614:108;8717:4;8708:6;8614:108;:::i;:::-;8606:116;;8769:9;8763:4;8759:20;8754:2;8743:9;8739:18;8732:48;8797:102;8894:4;8885:6;8797:102;:::i;:::-;8789:110;;7761:1145;;;;;;;:::o;8912:169::-;8996:11;9030:6;9025:3;9018:19;9070:4;9065:3;9061:14;9046:29;;8912:169;;;;:::o;9087:180::-;9227:32;9223:1;9215:6;9211:14;9204:56;9087:180;:::o;9273:366::-;9415:3;9436:67;9500:2;9495:3;9436:67;:::i;:::-;9429:74;;9512:93;9601:3;9512:93;:::i;:::-;9630:2;9625:3;9621:12;9614:19;;9273:366;;;:::o;9645:419::-;9811:4;9849:2;9838:9;9834:18;9826:26;;9898:9;9892:4;9888:20;9884:1;9873:9;9869:17;9862:47;9926:131;10052:4;9926:131;:::i;:::-;9918:139;;9645:419;;;:::o;10070:143::-;10127:5;10158:6;10152:13;10143:22;;10174:33;10201:5;10174:33;:::i;:::-;10070:143;;;;:::o;10219:351::-;10289:6;10338:2;10326:9;10317:7;10313:23;10309:32;10306:119;;;10344:79;;:::i;:::-;10306:119;10464:1;10489:64;10545:7;10536:6;10525:9;10521:22;10489:64;:::i;:::-;10479:74;;10435:128;10219:351;;;;:::o;10576:170::-;10716:22;10712:1;10704:6;10700:14;10693:46;10576:170;:::o;10752:366::-;10894:3;10915:67;10979:2;10974:3;10915:67;:::i;:::-;10908:74;;10991:93;11080:3;10991:93;:::i;:::-;11109:2;11104:3;11100:12;11093:19;;10752:366;;;:::o;11124:419::-;11290:4;11328:2;11317:9;11313:18;11305:26;;11377:9;11371:4;11367:20;11363:1;11352:9;11348:17;11341:47;11405:131;11531:4;11405:131;:::i;:::-;11397:139;;11124:419;;;:::o;11549:166::-;11689:18;11685:1;11677:6;11673:14;11666:42;11549:166;:::o;11721:366::-;11863:3;11884:67;11948:2;11943:3;11884:67;:::i;:::-;11877:74;;11960:93;12049:3;11960:93;:::i;:::-;12078:2;12073:3;12069:12;12062:19;;11721:366;;;:::o;12093:419::-;12259:4;12297:2;12286:9;12282:18;12274:26;;12346:9;12340:4;12336:20;12332:1;12321:9;12317:17;12310:47;12374:131;12500:4;12374:131;:::i;:::-;12366:139;;12093:419;;;:::o;12518:166::-;12658:18;12654:1;12646:6;12642:14;12635:42;12518:166;:::o;12690:366::-;12832:3;12853:67;12917:2;12912:3;12853:67;:::i;:::-;12846:74;;12929:93;13018:3;12929:93;:::i;:::-;13047:2;13042:3;13038:12;13031:19;;12690:366;;;:::o;13062:419::-;13228:4;13266:2;13255:9;13251:18;13243:26;;13315:9;13309:4;13305:20;13301:1;13290:9;13286:17;13279:47;13343:131;13469:4;13343:131;:::i;:::-;13335:139;;13062:419;;;:::o;13487:170::-;13627:22;13623:1;13615:6;13611:14;13604:46;13487:170;:::o;13663:366::-;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:419::-;14201:4;14239:2;14228:9;14224:18;14216:26;;14288:9;14282:4;14278:20;14274:1;14263:9;14259:17;14252:47;14316:131;14442:4;14316:131;:::i;:::-;14308:139;;14035:419;;;:::o;14460:173::-;14600:25;14596:1;14588:6;14584:14;14577:49;14460:173;:::o;14639:366::-;14781:3;14802:67;14866:2;14861:3;14802:67;:::i;:::-;14795:74;;14878:93;14967:3;14878:93;:::i;:::-;14996:2;14991:3;14987:12;14980:19;;14639:366;;;:::o;15011:419::-;15177:4;15215:2;15204:9;15200:18;15192:26;;15264:9;15258:4;15254:20;15250:1;15239:9;15235:17;15228:47;15292:131;15418:4;15292:131;:::i;:::-;15284:139;;15011:419;;;:::o;15436:173::-;15576:25;15572:1;15564:6;15560:14;15553:49;15436:173;:::o;15615:366::-;15757:3;15778:67;15842:2;15837:3;15778:67;:::i;:::-;15771:74;;15854:93;15943:3;15854:93;:::i;:::-;15972:2;15967:3;15963:12;15956:19;;15615:366;;;:::o;15987:419::-;16153:4;16191:2;16180:9;16176:18;16168:26;;16240:9;16234:4;16230:20;16226:1;16215:9;16211:17;16204:47;16268:131;16394:4;16268:131;:::i;:::-;16260:139;;15987:419;;;:::o;16412:165::-;16552:17;16548:1;16540:6;16536:14;16529:41;16412:165;:::o;16583:366::-;16725:3;16746:67;16810:2;16805:3;16746:67;:::i;:::-;16739:74;;16822:93;16911:3;16822:93;:::i;:::-;16940:2;16935:3;16931:12;16924:19;;16583:366;;;:::o;16955:419::-;17121:4;17159:2;17148:9;17144:18;17136:26;;17208:9;17202:4;17198:20;17194:1;17183:9;17179:17;17172:47;17236:131;17362:4;17236:131;:::i;:::-;17228:139;;16955:419;;;:::o;17380:171::-;17520:23;17516:1;17508:6;17504:14;17497:47;17380:171;:::o;17557:366::-;17699:3;17720:67;17784:2;17779:3;17720:67;:::i;:::-;17713:74;;17796:93;17885:3;17796:93;:::i;:::-;17914:2;17909:3;17905:12;17898:19;;17557:366;;;:::o;17929:419::-;18095:4;18133:2;18122:9;18118:18;18110:26;;18182:9;18176:4;18172:20;18168:1;18157:9;18153:17;18146:47;18210:131;18336:4;18210:131;:::i;:::-;18202:139;;17929:419;;;:::o;18354:332::-;18475:4;18513:2;18502:9;18498:18;18490:26;;18526:71;18594:1;18583:9;18579:17;18570:6;18526:71;:::i;:::-;18607:72;18675:2;18664:9;18660:18;18651:6;18607:72;:::i;:::-;18354:332;;;;;:::o;18692:116::-;18762:21;18777:5;18762:21;:::i;:::-;18755:5;18752:32;18742:60;;18798:1;18795;18788:12;18742:60;18692:116;:::o;18814:137::-;18868:5;18899:6;18893:13;18884:22;;18915:30;18939:5;18915:30;:::i;:::-;18814:137;;;;:::o;18957:345::-;19024:6;19073:2;19061:9;19052:7;19048:23;19044:32;19041:119;;;19079:79;;:::i;:::-;19041:119;19199:1;19224:61;19277:7;19268:6;19257:9;19253:22;19224:61;:::i;:::-;19214:71;;19170:125;18957:345;;;;:::o;19308:180::-;19356:77;19353:1;19346:88;19453:4;19450:1;19443:15;19477:4;19474:1;19467:15;19494:410;19534:7;19557:20;19575:1;19557:20;:::i;:::-;19552:25;;19591:20;19609:1;19591:20;:::i;:::-;19586:25;;19646:1;19643;19639:9;19668:30;19686:11;19668:30;:::i;:::-;19657:41;;19847:1;19838:7;19834:15;19831:1;19828:22;19808:1;19801:9;19781:83;19758:139;;19877:18;;:::i;:::-;19758:139;19542:362;19494:410;;;;:::o;19910:180::-;19958:77;19955:1;19948:88;20055:4;20052:1;20045:15;20079:4;20076:1;20069:15;20096:185;20136:1;20153:20;20171:1;20153:20;:::i;:::-;20148:25;;20187:20;20205:1;20187:20;:::i;:::-;20182:25;;20226:1;20216:35;;20231:18;;:::i;:::-;20216:35;20273:1;20270;20266:9;20261:14;;20096:185;;;;:::o;20287:224::-;20427:34;20423:1;20415:6;20411:14;20404:58;20496:7;20491:2;20483:6;20479:15;20472:32;20287:224;:::o;20517:366::-;20659:3;20680:67;20744:2;20739:3;20680:67;:::i;:::-;20673:74;;20756:93;20845:3;20756:93;:::i;:::-;20874:2;20869:3;20865:12;20858:19;;20517:366;;;:::o;20889:419::-;21055:4;21093:2;21082:9;21078:18;21070:26;;21142:9;21136:4;21132:20;21128:1;21117:9;21113:17;21106:47;21170:131;21296:4;21170:131;:::i;:::-;21162:139;;20889:419;;;:::o;21314:169::-;21454:21;21450:1;21442:6;21438:14;21431:45;21314:169;:::o;21489:366::-;21631:3;21652:67;21716:2;21711:3;21652:67;:::i;:::-;21645:74;;21728:93;21817:3;21728:93;:::i;:::-;21846:2;21841:3;21837:12;21830:19;;21489:366;;;:::o;21861:419::-;22027:4;22065:2;22054:9;22050:18;22042:26;;22114:9;22108:4;22104:20;22100:1;22089:9;22085:17;22078:47;22142:131;22268:4;22142:131;:::i;:::-;22134:139;;21861:419;;;:::o;22286:163::-;22426:15;22422:1;22414:6;22410:14;22403:39;22286:163;:::o;22455:366::-;22597:3;22618:67;22682:2;22677:3;22618:67;:::i;:::-;22611:74;;22694:93;22783:3;22694:93;:::i;:::-;22812:2;22807:3;22803:12;22796:19;;22455:366;;;:::o;22827:419::-;22993:4;23031:2;23020:9;23016:18;23008:26;;23080:9;23074:4;23070:20;23066:1;23055:9;23051:17;23044:47;23108:131;23234:4;23108:131;:::i;:::-;23100:139;;22827:419;;;:::o;23252:180::-;23300:77;23297:1;23290:88;23397:4;23394:1;23387:15;23421:4;23418:1;23411:15;23438:191;23478:3;23497:20;23515:1;23497:20;:::i;:::-;23492:25;;23531:20;23549:1;23531:20;:::i;:::-;23526:25;;23574:1;23571;23567:9;23560:16;;23595:3;23592:1;23589:10;23586:36;;;23602:18;;:::i;:::-;23586:36;23438:191;;;;:::o;23635:553::-;23812:4;23850:3;23839:9;23835:19;23827:27;;23864:71;23932:1;23921:9;23917:17;23908:6;23864:71;:::i;:::-;23945:72;24013:2;24002:9;23998:18;23989:6;23945:72;:::i;:::-;24027;24095:2;24084:9;24080:18;24071:6;24027:72;:::i;:::-;24109;24177:2;24166:9;24162:18;24153:6;24109:72;:::i;:::-;23635:553;;;;;;;:::o;24194:182::-;24334:34;24330:1;24322:6;24318:14;24311:58;24194:182;:::o;24382:366::-;24524:3;24545:67;24609:2;24604:3;24545:67;:::i;:::-;24538:74;;24621:93;24710:3;24621:93;:::i;:::-;24739:2;24734:3;24730:12;24723:19;;24382:366;;;:::o;24754:419::-;24920:4;24958:2;24947:9;24943:18;24935:26;;25007:9;25001:4;24997:20;24993:1;24982:9;24978:17;24971:47;25035:131;25161:4;25035:131;:::i;:::-;25027:139;;24754:419;;;:::o;25179:170::-;25319:22;25315:1;25307:6;25303:14;25296:46;25179:170;:::o;25355:366::-;25497:3;25518:67;25582:2;25577:3;25518:67;:::i;:::-;25511:74;;25594:93;25683:3;25594:93;:::i;:::-;25712:2;25707:3;25703:12;25696:19;;25355:366;;;:::o;25727:419::-;25893:4;25931:2;25920:9;25916:18;25908:26;;25980:9;25974:4;25970:20;25966:1;25955:9;25951:17;25944:47;26008:131;26134:4;26008:131;:::i;:::-;26000:139;;25727:419;;;:::o;26152:164::-;26292:16;26288:1;26280:6;26276:14;26269:40;26152:164;:::o;26322:366::-;26464:3;26485:67;26549:2;26544:3;26485:67;:::i;:::-;26478:74;;26561:93;26650:3;26561:93;:::i;:::-;26679:2;26674:3;26670:12;26663:19;;26322:366;;;:::o;26694:419::-;26860:4;26898:2;26887:9;26883:18;26875:26;;26947:9;26941:4;26937:20;26933:1;26922:9;26918:17;26911:47;26975:131;27101:4;26975:131;:::i;:::-;26967:139;;26694:419;;;:::o;27119:194::-;27159:4;27179:20;27197:1;27179:20;:::i;:::-;27174:25;;27213:20;27231:1;27213:20;:::i;:::-;27208:25;;27257:1;27254;27250:9;27242:17;;27281:1;27275:4;27272:11;27269:37;;;27286:18;;:::i;:::-;27269:37;27119:194;;;;:::o;27319:169::-;27459:21;27455:1;27447:6;27443:14;27436:45;27319:169;:::o;27494:366::-;27636:3;27657:67;27721:2;27716:3;27657:67;:::i;:::-;27650:74;;27733:93;27822:3;27733:93;:::i;:::-;27851:2;27846:3;27842:12;27835:19;;27494:366;;;:::o;27866:419::-;28032:4;28070:2;28059:9;28055:18;28047:26;;28119:9;28113:4;28109:20;28105:1;28094:9;28090:17;28083:47;28147:131;28273:4;28147:131;:::i;:::-;28139:139;;27866:419;;;:::o;28291:168::-;28431:20;28427:1;28419:6;28415:14;28408:44;28291:168;:::o;28465:366::-;28607:3;28628:67;28692:2;28687:3;28628:67;:::i;:::-;28621:74;;28704:93;28793:3;28704:93;:::i;:::-;28822:2;28817:3;28813:12;28806:19;;28465:366;;;:::o;28837:419::-;29003:4;29041:2;29030:9;29026:18;29018:26;;29090:9;29084:4;29080:20;29076:1;29065:9;29061:17;29054:47;29118:131;29244:4;29118:131;:::i;:::-;29110:139;;28837:419;;;:::o;29262:164::-;29402:16;29398:1;29390:6;29386:14;29379:40;29262:164;:::o;29432:366::-;29574:3;29595:67;29659:2;29654:3;29595:67;:::i;:::-;29588:74;;29671:93;29760:3;29671:93;:::i;:::-;29789:2;29784:3;29780:12;29773:19;;29432:366;;;:::o;29804:419::-;29970:4;30008:2;29997:9;29993:18;29985:26;;30057:9;30051:4;30047:20;30043:1;30032:9;30028:17;30021:47;30085:131;30211:4;30085:131;:::i;:::-;30077:139;;29804:419;;;:::o;30229:332::-;30350:4;30388:2;30377:9;30373:18;30365:26;;30401:71;30469:1;30458:9;30454:17;30445:6;30401:71;:::i;:::-;30482:72;30550:2;30539:9;30535:18;30526:6;30482:72;:::i;:::-;30229:332;;;;;:::o;30567:172::-;30707:24;30703:1;30695:6;30691:14;30684:48;30567:172;:::o;30745:366::-;30887:3;30908:67;30972:2;30967:3;30908:67;:::i;:::-;30901:74;;30984:93;31073:3;30984:93;:::i;:::-;31102:2;31097:3;31093:12;31086:19;;30745:366;;;:::o;31117:419::-;31283:4;31321:2;31310:9;31306:18;31298:26;;31370:9;31364:4;31360:20;31356:1;31345:9;31341:17;31334:47;31398:131;31524:4;31398:131;:::i;:::-;31390:139;;31117:419;;;:::o;31542:168::-;31682:20;31678:1;31670:6;31666:14;31659:44;31542:168;:::o;31716:366::-;31858:3;31879:67;31943:2;31938:3;31879:67;:::i;:::-;31872:74;;31955:93;32044:3;31955:93;:::i;:::-;32073:2;32068:3;32064:12;32057:19;;31716:366;;;:::o;32088:419::-;32254:4;32292:2;32281:9;32277:18;32269:26;;32341:9;32335:4;32331:20;32327:1;32316:9;32312:17;32305:47;32369:131;32495:4;32369:131;:::i;:::-;32361:139;;32088:419;;;:::o;32513:182::-;32653:34;32649:1;32641:6;32637:14;32630:58;32513:182;:::o;32701:366::-;32843:3;32864:67;32928:2;32923:3;32864:67;:::i;:::-;32857:74;;32940:93;33029:3;32940:93;:::i;:::-;33058:2;33053:3;33049:12;33042:19;;32701:366;;;:::o;33073:419::-;33239:4;33277:2;33266:9;33262:18;33254:26;;33326:9;33320:4;33316:20;33312:1;33301:9;33297:17;33290:47;33354:131;33480:4;33354:131;:::i;:::-;33346:139;;33073:419;;;:::o;33498:221::-;33638:34;33634:1;33626:6;33622:14;33615:58;33707:4;33702:2;33694:6;33690:15;33683:29;33498:221;:::o;33725:366::-;33867:3;33888:67;33952:2;33947:3;33888:67;:::i;:::-;33881:74;;33964:93;34053:3;33964:93;:::i;:::-;34082:2;34077:3;34073:12;34066:19;;33725:366;;;:::o;34097:419::-;34263:4;34301:2;34290:9;34286:18;34278:26;;34350:9;34344:4;34340:20;34336:1;34325:9;34321:17;34314:47;34378:131;34504:4;34378:131;:::i;:::-;34370:139;;34097:419;;;:::o;34522:442::-;34671:4;34709:2;34698:9;34694:18;34686:26;;34722:71;34790:1;34779:9;34775:17;34766:6;34722:71;:::i;:::-;34803:72;34871:2;34860:9;34856:18;34847:6;34803:72;:::i;:::-;34885;34953:2;34942:9;34938:18;34929:6;34885:72;:::i;:::-;34522:442;;;;;;:::o;34970:180::-;35018:77;35015:1;35008:88;35115:4;35112:1;35105:15;35139:4;35136:1;35129:15;35156:171;35296:23;35292:1;35284:6;35280:14;35273:47;35156:171;:::o;35333:366::-;35475:3;35496:67;35560:2;35555:3;35496:67;:::i;:::-;35489:74;;35572:93;35661:3;35572:93;:::i;:::-;35690:2;35685:3;35681:12;35674:19;;35333:366;;;:::o;35705:419::-;35871:4;35909:2;35898:9;35894:18;35886:26;;35958:9;35952:4;35948:20;35944:1;35933:9;35929:17;35922:47;35986:131;36112:4;35986:131;:::i;:::-;35978:139;;35705:419;;;:::o;36130:223::-;36270:34;36266:1;36258:6;36254:14;36247:58;36339:6;36334:2;36326:6;36322:15;36315:31;36130:223;:::o;36359:366::-;36501:3;36522:67;36586:2;36581:3;36522:67;:::i;:::-;36515:74;;36598:93;36687:3;36598:93;:::i;:::-;36716:2;36711:3;36707:12;36700:19;;36359:366;;;:::o;36731:419::-;36897:4;36935:2;36924:9;36920:18;36912:26;;36984:9;36978:4;36974:20;36970:1;36959:9;36955:17;36948:47;37012:131;37138:4;37012:131;:::i;:::-;37004:139;;36731:419;;;:::o;37156:176::-;37296:28;37292:1;37284:6;37280:14;37273:52;37156:176;:::o;37338:366::-;37480:3;37501:67;37565:2;37560:3;37501:67;:::i;:::-;37494:74;;37577:93;37666:3;37577:93;:::i;:::-;37695:2;37690:3;37686:12;37679:19;;37338:366;;;:::o;37710:419::-;37876:4;37914:2;37903:9;37899:18;37891:26;;37963:9;37957:4;37953:20;37949:1;37938:9;37934:17;37927:47;37991:131;38117:4;37991:131;:::i;:::-;37983:139;;37710:419;;;:::o;38135:233::-;38174:3;38197:24;38215:5;38197:24;:::i;:::-;38188:33;;38243:66;38236:5;38233:77;38230:103;;38313:18;;:::i;:::-;38230:103;38360:1;38353:5;38349:13;38342:20;;38135:233;;;:::o;38374:442::-;38523:4;38561:2;38550:9;38546:18;38538:26;;38574:71;38642:1;38631:9;38627:17;38618:6;38574:71;:::i;:::-;38655:72;38723:2;38712:9;38708:18;38699:6;38655:72;:::i;:::-;38737;38805:2;38794:9;38790:18;38781:6;38737:72;:::i;:::-;38374:442;;;;;;:::o
Swarm Source
ipfs://5fbe2c595ebaf60a79427915ac8ceae1f087535d25aaffaa910b72cb2f0fcce7
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 33 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.