Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 1,321 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Transfer | 24271724 | 45 days ago | IN | 0.00334445 ETH | 0.00002196 | ||||
| Approve | 23800589 | 111 days ago | IN | 0 ETH | 0.0001053 | ||||
| Approve | 23585681 | 141 days ago | IN | 0 ETH | 0.0000551 | ||||
| Approve | 23390664 | 169 days ago | IN | 0 ETH | 0.00019084 | ||||
| Transfer | 23337933 | 176 days ago | IN | 0 ETH | 0.00006925 | ||||
| Transfer | 23328662 | 177 days ago | IN | 0 ETH | 0.00004794 | ||||
| Approve | 23320598 | 178 days ago | IN | 0 ETH | 0.00000908 | ||||
| Approve | 23320596 | 178 days ago | IN | 0 ETH | 0.00000922 | ||||
| Approve | 23302692 | 181 days ago | IN | 0 ETH | 0.00002878 | ||||
| Transfer | 23300489 | 181 days ago | IN | 0 ETH | 0.000013 | ||||
| Transfer | 23300460 | 181 days ago | IN | 0 ETH | 0.00001266 | ||||
| Approve | 23298014 | 182 days ago | IN | 0 ETH | 0.00007583 | ||||
| Transfer | 23291282 | 182 days ago | IN | 0 ETH | 0.00011942 | ||||
| Transfer | 23288240 | 183 days ago | IN | 0 ETH | 0.00007427 | ||||
| Approve | 23277714 | 184 days ago | IN | 0 ETH | 0.00003976 | ||||
| Transfer | 23276625 | 185 days ago | IN | 0 ETH | 0.00009548 | ||||
| Approve | 23276179 | 185 days ago | IN | 0 ETH | 0.00006462 | ||||
| Transfer | 23275738 | 185 days ago | IN | 0 ETH | 0.0000622 | ||||
| Transfer | 23275722 | 185 days ago | IN | 0 ETH | 0.00008584 | ||||
| Transfer | 23275187 | 185 days ago | IN | 0 ETH | 0.00005049 | ||||
| Transfer | 23273280 | 185 days ago | IN | 0 ETH | 0.00005001 | ||||
| Transfer | 23271369 | 185 days ago | IN | 0 ETH | 0.00003817 | ||||
| Transfer | 23269206 | 186 days ago | IN | 0 ETH | 0.00037573 | ||||
| Transfer | 23268995 | 186 days ago | IN | 0 ETH | 0.00043567 | ||||
| Transfer | 23267780 | 186 days ago | IN | 0 ETH | 0.00006978 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
Vocalad
Compiler Version
v0.8.28+commit.7893614a
Optimization Enabled:
No with 200 runs
Other Settings:
paris EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
/*
Telegram: https://t.me/VocaladAI
Twitter: https://x.com/VocaladAI
website: https://vocalad.ai/
*/
pragma solidity ^0.8.28;
import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";
import {IUniswapV2Router02} from "@uniswap/v2-periphery/contracts/interfaces/IUniswapV2Router02.sol";
import {IUniswapV2Factory} from "@uniswap/v2-core/contracts/interfaces/IUniswapV2Factory.sol";
contract Vocalad is ERC20, Ownable {
uint256 public immutable MAX_SUPPLY;
address public immutable pair;
address public treasury;
IUniswapV2Router02 private constant _router =
IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
address private immutable _weth;
address private immutable _deployer;
bool public permanentlyTaxFree = false;
uint256 public startBlock;
uint256 public startBlockTime;
uint256 private raiseAmount;
mapping(address account => bool) public isExcludedFromFees;
mapping(address account => bool) public isExcludedFromMaxWallet;
mapping(address origin => mapping(uint256 blockNumber => uint256 txCount))
public maxBuyTxsPerBlockPerOrigin;
uint256 private _maxBuyTxsPerBlockPerOrigin = 10;
mapping(uint256 blockNumber => uint256 txCount) public maxBuyTxsPerBlock;
uint256 private _maxBuyTxsPerBlock = 100;
constructor(
string memory name,
string memory symbol,
uint256 maxSupply,
address _treasury
) ERC20(name, symbol) Ownable(msg.sender) {
MAX_SUPPLY = maxSupply;
_weth = _router.WETH();
pair = IUniswapV2Factory(_router.factory()).createPair(
address(this),
_weth
);
isExcludedFromFees[msg.sender] = true;
isExcludedFromFees[address(this)] = true;
isExcludedFromFees[pair] = true;
isExcludedFromFees[treasury] = true;
isExcludedFromMaxWallet[msg.sender] = true;
isExcludedFromMaxWallet[address(this)] = true;
isExcludedFromMaxWallet[pair] = true;
isExcludedFromMaxWallet[treasury] = true;
_mint(msg.sender, maxSupply);
_approve(msg.sender, address(_router), type(uint256).max);
treasury = _treasury;
_deployer = msg.sender;
_approve(address(this), address(_router), type(uint256).max);
}
function setTreasury(address newTreasury) external {
require(newTreasury != address(0), "treasury-is-0");
require(
msg.sender == _deployer || msg.sender == owner(),
"only-deployer"
);
treasury = newTreasury;
}
function enableTrading() external onlyOwner {
require(startBlock == 0, "trading-already-enabled");
startBlock = block.number;
startBlockTime = block.timestamp;
}
function setExcludedFromFees(
address account,
bool excluded
) external onlyOwner {
isExcludedFromFees[account] = excluded;
}
function setExcludedFromMaxWallet(
address account,
bool excluded
) external onlyOwner {
isExcludedFromMaxWallet[account] = excluded;
}
function feesAndMaxWallet()
external
view
returns (uint256 _feeBps, uint256 _maxWallet)
{
return _feesAndMaxWallet();
}
function _feesAndMaxWallet()
internal
view
returns (uint256 _feeBps, uint256 _maxWallet)
{
if (permanentlyTaxFree) {
_feeBps = 0;
_maxWallet = MAX_SUPPLY;
return (_feeBps, _maxWallet);
}
if (startBlockTime == 0) {
return (0, 0);
}
uint256 _diffSeconds = block.timestamp - startBlockTime;
if (_diffSeconds < 3600) {
// 1 min
if (_diffSeconds < 60) {
_feeBps = 4000; // 40%
_maxWallet = MAX_SUPPLY / 1000; // 0.1%
return (_feeBps, _maxWallet);
}
// 2-5 min
if (_diffSeconds < 300) {
_feeBps = 3000; // 30%
_maxWallet = MAX_SUPPLY / 666; // 0.15%
return (_feeBps, _maxWallet);
}
// 6-8 min
if (_diffSeconds < 480) {
_feeBps = 2000; // 20%
_maxWallet = MAX_SUPPLY / 500; // 0.2%
return (_feeBps, _maxWallet);
}
if (_diffSeconds < 1500) {
// 9-15 min
_feeBps = 1000; // 10%
_maxWallet = MAX_SUPPLY / 333; // 0.3%
return (_feeBps, _maxWallet);
}
_feeBps = 400; // 4%
_maxWallet = MAX_SUPPLY / 200; // 0.5%
return (_feeBps, _maxWallet);
}
if (raiseAmount < 500 ether) {
_feeBps = 400; // 4%;
} else if (raiseAmount < 700 ether) {
_feeBps = 300; // 3%;
} else if (raiseAmount < 900 ether) {
_feeBps = 200; // 2%;
} else {
_feeBps = 0; // 0%;
}
_maxWallet = MAX_SUPPLY; // no limit
return (_feeBps, _maxWallet);
}
function _update(
address from,
address to,
uint256 value
) internal override {
// ✅ Only allow the owner to add liquidity before trading is enabled
if (startBlock == 0 && from == owner() && to == pair) {
super._update(from, to, value);
return;
}
(uint256 _feeBps, uint256 _maxWallet) = _feesAndMaxWallet();
bool isBuy = from == pair;
if (isBuy || to == pair) {
require(startBlock > 0, "trading-not-enabled");
// Block 0 only allows excluded wallets to buy
if (block.number == startBlock) {
require(isExcludedFromFees[to], "only-excluded-buy-in-block-0");
}
if (_feeBps != 0) {
if (isBuy && !isExcludedFromFees[to]) {
if (
startBlockTime > 0 &&
block.timestamp - startBlockTime < 180
) {
require(
maxBuyTxsPerBlockPerOrigin[tx.origin][block.number] < _maxBuyTxsPerBlockPerOrigin,
"max-buy-txs-per-block-per-origin-exceeded"
);
maxBuyTxsPerBlockPerOrigin[tx.origin][block.number]++;
require(
maxBuyTxsPerBlock[block.number] < _maxBuyTxsPerBlock,
"max-buy-txs-per-block-exceeded"
);
maxBuyTxsPerBlock[block.number]++;
}
uint256 fee = (value * _feeBps) / 10000;
value -= fee;
super._update(from, address(this), fee);
}
if (!isBuy && !isExcludedFromFees[from]) {
uint256 fee = (value * _feeBps) / 10000;
value -= fee;
super._update(from, address(this), fee);
_swapTokensForEth();
}
} else {
if (!isBuy && !isExcludedFromFees[from]) {
_swapTokensForEth();
}
}
}
require(
isExcludedFromMaxWallet[to] || value + balanceOf(to) <= _maxWallet,
"max-wallet-size-exceeded"
);
super._update(from, to, value);
}
function _swapTokensForEth() internal {
uint256 startDiff = block.timestamp - startBlockTime;
if (startDiff < 300) {
return;
}
uint256 _tokenAmount = balanceOf(address(this));
if (_tokenAmount == 0) {
return;
}
address[] memory _path = new address[](2);
_path[0] = _weth;
_path[1] = address(this);
// sell max 1 eth worth of tokens
uint256 _maxTokenAmount = _router.getAmountsOut(1 ether, _path)[1];
if (_tokenAmount > _maxTokenAmount) {
_tokenAmount = _maxTokenAmount;
}
_path[0] = address(this);
_path[1] = _weth;
uint256 _treasuryBalanceBefore = address(treasury).balance;
_router.swapExactTokensForETHSupportingFeeOnTransferTokens(
_tokenAmount,
0,
_path,
treasury,
block.timestamp
);
uint256 _treasuryBalanceAfter = address(treasury).balance;
raiseAmount += _treasuryBalanceAfter - _treasuryBalanceBefore;
}
function excludeFromFeesBatch(address[] calldata accounts, bool excluded) external onlyOwner {
for (uint256 i = 0; i < accounts.length; i++) {
isExcludedFromFees[accounts[i]] = excluded;
isExcludedFromMaxWallet[accounts[i]] = excluded;
}
}
function withdrawStuckETH() external {
require(msg.sender == treasury, "only-treasury");
uint256 amount = address(this).balance;
require(amount > 0, "no-eth");
payable(treasury).transfer(amount);
}
function withdrawAnyToken(address tokenAddress) external {
require(msg.sender == treasury, "only-treasury");
require(tokenAddress != address(0), "invalid-token");
uint256 balance = IERC20(tokenAddress).balanceOf(address(this));
require(balance > 0, "no-tokens");
IERC20(tokenAddress).transfer(treasury, balance);
}
function makeTaxFreeForever() external {
require(msg.sender == treasury, "only-treasury");
require(!permanentlyTaxFree, "already-tax-free");
permanentlyTaxFree = true;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)
pragma solidity ^0.8.20;
import {Context} from "../utils/Context.sol";
/**
* @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);
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/draft-IERC6093.sol)
pragma solidity >=0.8.4;
/**
* @dev Standard ERC-20 Errors
* Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-20 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 ERC-721 Errors
* Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-721 tokens.
*/
interface IERC721Errors {
/**
* @dev Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in ERC-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 ERC-1155 Errors
* Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-1155 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);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/ERC20.sol)
pragma solidity ^0.8.20;
import {IERC20} from "./IERC20.sol";
import {IERC20Metadata} from "./extensions/IERC20Metadata.sol";
import {Context} from "../../utils/Context.sol";
import {IERC20Errors} from "../../interfaces/draft-IERC6093.sol";
/**
* @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 ERC-20
* applications.
*/
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}.
*
* Both 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;
}
/// @inheritdoc IERC20
function totalSupply() public view virtual returns (uint256) {
return _totalSupply;
}
/// @inheritdoc IERC20
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;
}
/// @inheritdoc IERC20
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}.
*
* Skips emitting an {Approval} event indicating an allowance update. This is not
* required by the ERC. See {xref-ERC20-_approve-address-address-uint256-bool-}[_approve].
*
* 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:
*
* ```solidity
* 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);
}
}
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/extensions/IERC20Metadata.sol)
pragma solidity >=0.6.2;
import {IERC20} from "../IERC20.sol";
/**
* @dev Interface for the optional metadata functions from the ERC-20 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);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/IERC20.sol)
pragma solidity >=0.4.16;
/**
* @dev Interface of the ERC-20 standard as defined in the ERC.
*/
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);
}// SPDX-License-Identifier: MIT
// 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;
}
}pragma solidity >=0.5.0;
interface IUniswapV2Factory {
event PairCreated(address indexed token0, address indexed token1, address pair, uint);
function feeTo() external view returns (address);
function feeToSetter() external view returns (address);
function getPair(address tokenA, address tokenB) external view returns (address pair);
function allPairs(uint) external view returns (address pair);
function allPairsLength() external view returns (uint);
function createPair(address tokenA, address tokenB) external returns (address pair);
function setFeeTo(address) external;
function setFeeToSetter(address) external;
}pragma solidity >=0.6.2;
interface IUniswapV2Router01 {
function factory() external pure returns (address);
function WETH() external pure returns (address);
function addLiquidity(
address tokenA,
address tokenB,
uint amountADesired,
uint amountBDesired,
uint amountAMin,
uint amountBMin,
address to,
uint deadline
) external returns (uint amountA, uint amountB, uint liquidity);
function addLiquidityETH(
address token,
uint amountTokenDesired,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external payable returns (uint amountToken, uint amountETH, uint liquidity);
function removeLiquidity(
address tokenA,
address tokenB,
uint liquidity,
uint amountAMin,
uint amountBMin,
address to,
uint deadline
) external returns (uint amountA, uint amountB);
function removeLiquidityETH(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external returns (uint amountToken, uint amountETH);
function removeLiquidityWithPermit(
address tokenA,
address tokenB,
uint liquidity,
uint amountAMin,
uint amountBMin,
address to,
uint deadline,
bool approveMax, uint8 v, bytes32 r, bytes32 s
) external returns (uint amountA, uint amountB);
function removeLiquidityETHWithPermit(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline,
bool approveMax, uint8 v, bytes32 r, bytes32 s
) external returns (uint amountToken, uint amountETH);
function swapExactTokensForTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external returns (uint[] memory amounts);
function swapTokensForExactTokens(
uint amountOut,
uint amountInMax,
address[] calldata path,
address to,
uint deadline
) external returns (uint[] memory amounts);
function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
external
payable
returns (uint[] memory amounts);
function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
external
returns (uint[] memory amounts);
function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
external
returns (uint[] memory amounts);
function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
external
payable
returns (uint[] memory amounts);
function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}pragma solidity >=0.6.2;
import './IUniswapV2Router01.sol';
interface IUniswapV2Router02 is IUniswapV2Router01 {
function removeLiquidityETHSupportingFeeOnTransferTokens(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external returns (uint amountETH);
function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline,
bool approveMax, uint8 v, bytes32 r, bytes32 s
) external returns (uint amountETH);
function swapExactTokensForTokensSupportingFeeOnTransferTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external;
function swapExactETHForTokensSupportingFeeOnTransferTokens(
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external payable;
function swapExactTokensForETHSupportingFeeOnTransferTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external;
}{
"evmVersion": "paris",
"optimizer": {
"enabled": false,
"runs": 200
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"libraries": {}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"uint256","name":"maxSupply","type":"uint256"},{"internalType":"address","name":"_treasury","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC20InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC20InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC20InvalidSender","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"}],"name":"ERC20InvalidSpender","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromFeesBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feesAndMaxWallet","outputs":[{"internalType":"uint256","name":"_feeBps","type":"uint256"},{"internalType":"uint256","name":"_maxWallet","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromMaxWallet","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"makeTaxFreeForever","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"maxBuyTxsPerBlock","outputs":[{"internalType":"uint256","name":"txCount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"origin","type":"address"},{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"maxBuyTxsPerBlockPerOrigin","outputs":[{"internalType":"uint256","name":"txCount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"permanentlyTaxFree","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"setExcludedFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"setExcludedFromMaxWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newTreasury","type":"address"}],"name":"setTreasury","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startBlockTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasury","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"withdrawAnyToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawStuckETH","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
6101006040526000600660146101000a81548160ff021916908315150217905550600a600d556064600f5534801561003657600080fd5b50604051615d38380380615d3883398181016040528101906100589190611a7b565b338484816003908161006a9190611d31565b50806004908161007a9190611d31565b505050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036100ef5760006040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016100e69190611e12565b60405180910390fd5b6100fe8161071260201b60201c565b508160808181525050737a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610166573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061018a9190611e2d565b73ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff1681525050737a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa15801561021c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102409190611e2d565b73ffffffffffffffffffffffffffffffffffffffff1663c9c653963060c0516040518363ffffffff1660e01b815260040161027c929190611e5a565b6020604051808303816000875af115801561029b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102bf9190611e2d565b73ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff16815250506001600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600a60003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600a600060a05173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600a6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600b60003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600b600060a05173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061060a33836107d860201b60201c565b61064f33737a250d5630b4cf539739df2c5dacb4c659f2488d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61086060201b60201c565b80600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503373ffffffffffffffffffffffffffffffffffffffff1660e08173ffffffffffffffffffffffffffffffffffffffff168152505061070930737a250d5630b4cf539739df2c5dacb4c659f2488d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61086060201b60201c565b505050506125b6565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361084a5760006040517fec442f050000000000000000000000000000000000000000000000000000000081526004016108419190611e12565b60405180910390fd5b61085c6000838361087860201b60201c565b5050565b6108738383836001610ea060201b60201c565b505050565b60006007541480156108c2575061089361107760201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b80156108fb575060a05173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b15610916576109118383836110a160201b60201c565b610e9b565b6000806109276112c660201b60201c565b91509150600060a05173ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161490508080610999575060a05173ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16145b15610dd6576000600754116109e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109da90611ee0565b60405180910390fd5b6007544303610a7957600a60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610a78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6f90611f4c565b60405180910390fd5b5b60008314610d6857808015610ad85750600a60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15610cba576000600854118015610afc575060b460085442610afa9190611f9b565b105b15610c7c57600d54600c60003273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060004381526020019081526020016000205410610b95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8c90612041565b60405180910390fd5b600c60003273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060004381526020019081526020016000206000815480929190610bf690612061565b9190505550600f54600e60004381526020019081526020016000205410610c52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c49906120f5565b60405180910390fd5b600e60004381526020019081526020016000206000815480929190610c7690612061565b91905055505b60006127108486610c8d9190612115565b610c979190612186565b90508085610ca59190611f9b565b9450610cb88730836110a160201b60201c565b505b80158015610d125750600a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15610d635760006127108486610d289190612115565b610d329190612186565b90508085610d409190611f9b565b9450610d538730836110a160201b60201c565b610d6161143d60201b60201c565b505b610dd5565b80158015610dc05750600a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15610dd457610dd361143d60201b60201c565b5b5b5b600b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680610e47575081610e398661182a60201b60201c565b85610e4491906121b7565b11155b610e86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7d90612237565b60405180910390fd5b610e978686866110a160201b60201c565b5050505b505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603610f125760006040517fe602df05000000000000000000000000000000000000000000000000000000008152600401610f099190611e12565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610f845760006040517f94280d62000000000000000000000000000000000000000000000000000000008152600401610f7b9190611e12565b60405180910390fd5b81600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508015611071578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516110689190612266565b60405180910390a35b50505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036110f35780600260008282546110e791906121b7565b925050819055506111c6565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561117f578381836040517fe450d38c00000000000000000000000000000000000000000000000000000000815260040161117693929190612281565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361120f578060026000828254039250508190555061125c565b806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516112b99190612266565b60405180910390a3505050565b600080600660149054906101000a900460ff16156112ec57600091506080519050611439565b6000600854036113025760008091509150611439565b6000600854426113129190611f9b565b9050610e108110156113d557603c81101561134457610fa092506103e860805161133c9190612186565b915050611439565b61012c81101561136b57610bb8925061029a6080516113639190612186565b915050611439565b6101e0811015611392576107d092506101f460805161138a9190612186565b915050611439565b6105dc8110156113b9576103e8925061014d6080516113b19190612186565b915050611439565b610190925060c86080516113cd9190612186565b915050611439565b681b1ae4d6e2ef50000060095410156113f2576101909250611432565b6825f273933db5700000600954101561140f5761012c9250611431565b6830ca024f987b900000600954101561142b5760c89250611430565b600092505b5b5b6080519150505b9091565b60006008544261144d9190611f9b565b905061012c81101561145f5750611828565b60006114703061182a60201b60201c565b905060008103611481575050611828565b6000600267ffffffffffffffff81111561149e5761149d6118a1565b5b6040519080825280602002602001820160405280156114cc5781602001602082028036833780820191505090505b50905060c051816000815181106114e6576114e56122b8565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250503081600181518110611535576115346122b8565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506000737a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663d06ca61f670de0b6b3a7640000846040518363ffffffff1660e01b81526004016115c89291906123e0565b600060405180830381865afa1580156115e5573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061160e91906124d8565b600181518110611621576116206122b8565b5b6020026020010151905080831115611637578092505b308260008151811061164c5761164b6122b8565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060c0518260018151811061169d5761169c6122b8565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16319050737a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663791ac94785600086600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16426040518663ffffffff1660e01b815260040161178d95949392919061255c565b600060405180830381600087803b1580156117a757600080fd5b505af11580156117bb573d6000803e3d6000fd5b505050506000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1631905081816118099190611f9b565b6009600082825461181a91906121b7565b925050819055505050505050505b565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6118d982611890565b810181811067ffffffffffffffff821117156118f8576118f76118a1565b5b80604052505050565b600061190b611872565b905061191782826118d0565b919050565b600067ffffffffffffffff821115611937576119366118a1565b5b61194082611890565b9050602081019050919050565b60005b8381101561196b578082015181840152602081019050611950565b60008484015250505050565b600061198a6119858461191c565b611901565b9050828152602081018484840111156119a6576119a561188b565b5b6119b184828561194d565b509392505050565b600082601f8301126119ce576119cd611886565b5b81516119de848260208601611977565b91505092915050565b6000819050919050565b6119fa816119e7565b8114611a0557600080fd5b50565b600081519050611a17816119f1565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611a4882611a1d565b9050919050565b611a5881611a3d565b8114611a6357600080fd5b50565b600081519050611a7581611a4f565b92915050565b60008060008060808587031215611a9557611a9461187c565b5b600085015167ffffffffffffffff811115611ab357611ab2611881565b5b611abf878288016119b9565b945050602085015167ffffffffffffffff811115611ae057611adf611881565b5b611aec878288016119b9565b9350506040611afd87828801611a08565b9250506060611b0e87828801611a66565b91505092959194509250565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680611b6c57607f821691505b602082108103611b7f57611b7e611b25565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302611be77fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82611baa565b611bf18683611baa565b95508019841693508086168417925050509392505050565b6000819050919050565b6000611c2e611c29611c24846119e7565b611c09565b6119e7565b9050919050565b6000819050919050565b611c4883611c13565b611c5c611c5482611c35565b848454611bb7565b825550505050565b600090565b611c71611c64565b611c7c818484611c3f565b505050565b5b81811015611ca057611c95600082611c69565b600181019050611c82565b5050565b601f821115611ce557611cb681611b85565b611cbf84611b9a565b81016020851015611cce578190505b611ce2611cda85611b9a565b830182611c81565b50505b505050565b600082821c905092915050565b6000611d0860001984600802611cea565b1980831691505092915050565b6000611d218383611cf7565b9150826002028217905092915050565b611d3a82611b1a565b67ffffffffffffffff811115611d5357611d526118a1565b5b611d5d8254611b54565b611d68828285611ca4565b600060209050601f831160018114611d9b5760008415611d89578287015190505b611d938582611d15565b865550611dfb565b601f198416611da986611b85565b60005b82811015611dd157848901518255600182019150602085019450602081019050611dac565b86831015611dee5784890151611dea601f891682611cf7565b8355505b6001600288020188555050505b505050505050565b611e0c81611a3d565b82525050565b6000602082019050611e276000830184611e03565b92915050565b600060208284031215611e4357611e4261187c565b5b6000611e5184828501611a66565b91505092915050565b6000604082019050611e6f6000830185611e03565b611e7c6020830184611e03565b9392505050565b600082825260208201905092915050565b7f74726164696e672d6e6f742d656e61626c656400000000000000000000000000600082015250565b6000611eca601383611e83565b9150611ed582611e94565b602082019050919050565b60006020820190508181036000830152611ef981611ebd565b9050919050565b7f6f6e6c792d6578636c756465642d6275792d696e2d626c6f636b2d3000000000600082015250565b6000611f36601c83611e83565b9150611f4182611f00565b602082019050919050565b60006020820190508181036000830152611f6581611f29565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000611fa6826119e7565b9150611fb1836119e7565b9250828203905081811115611fc957611fc8611f6c565b5b92915050565b7f6d61782d6275792d7478732d7065722d626c6f636b2d7065722d6f726967696e60008201527f2d65786365656465640000000000000000000000000000000000000000000000602082015250565b600061202b602983611e83565b915061203682611fcf565b604082019050919050565b6000602082019050818103600083015261205a8161201e565b9050919050565b600061206c826119e7565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361209e5761209d611f6c565b5b600182019050919050565b7f6d61782d6275792d7478732d7065722d626c6f636b2d65786365656465640000600082015250565b60006120df601e83611e83565b91506120ea826120a9565b602082019050919050565b6000602082019050818103600083015261210e816120d2565b9050919050565b6000612120826119e7565b915061212b836119e7565b9250828202612139816119e7565b915082820484148315176121505761214f611f6c565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612191826119e7565b915061219c836119e7565b9250826121ac576121ab612157565b5b828204905092915050565b60006121c2826119e7565b91506121cd836119e7565b92508282019050808211156121e5576121e4611f6c565b5b92915050565b7f6d61782d77616c6c65742d73697a652d65786365656465640000000000000000600082015250565b6000612221601883611e83565b915061222c826121eb565b602082019050919050565b6000602082019050818103600083015261225081612214565b9050919050565b612260816119e7565b82525050565b600060208201905061227b6000830184612257565b92915050565b60006060820190506122966000830186611e03565b6122a36020830185612257565b6122b06040830184612257565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000819050919050565b600061230c612307612302846122e7565b611c09565b6119e7565b9050919050565b61231c816122f1565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61235781611a3d565b82525050565b6000612369838361234e565b60208301905092915050565b6000602082019050919050565b600061238d82612322565b612397818561232d565b93506123a28361233e565b8060005b838110156123d35781516123ba888261235d565b97506123c583612375565b9250506001810190506123a6565b5085935050505092915050565b60006040820190506123f56000830185612313565b81810360208301526124078184612382565b90509392505050565b600067ffffffffffffffff82111561242b5761242a6118a1565b5b602082029050602081019050919050565b600080fd5b600061245461244f84612410565b611901565b905080838252602082019050602084028301858111156124775761247661243c565b5b835b818110156124a0578061248c8882611a08565b845260208401935050602081019050612479565b5050509392505050565b600082601f8301126124bf576124be611886565b5b81516124cf848260208601612441565b91505092915050565b6000602082840312156124ee576124ed61187c565b5b600082015167ffffffffffffffff81111561250c5761250b611881565b5b612518848285016124aa565b91505092915050565b6000819050919050565b600061254661254161253c84612521565b611c09565b6119e7565b9050919050565b6125568161252b565b82525050565b600060a0820190506125716000830188612257565b61257e602083018761254d565b81810360408301526125908186612382565b905061259f6060830185611e03565b6125ac6080830184612257565b9695505050505050565b60805160a05160c05160e0516136fc61263c6000396000610fc40152600081816122aa015261247f015260008181610d4f015281816119f801528181611a6e0152611ac601526000818161080c015281816115a901528181611614015281816116590152818161169e015281816116e30152818161171d01526117ad01526136fc6000f3fe608060405234801561001057600080fd5b50600436106101e55760003560e01c80636dd3d39f1161010f578063a8aa1b31116100a2578063e6762d2011610071578063e6762d2014610575578063f0f4426014610591578063f2fde38b146105ad578063f5648a4f146105c9576101e5565b8063a8aa1b31146104d9578063a9059cbb146104f7578063c6f9b4a614610527578063dd62ed3e14610545576101e5565b80638a8c523c116100de5780638a8c523c146104745780638da5cb5b1461047e57806395d89b411461049c578063a25ba183146104ba576101e5565b80636dd3d39f146103ee57806370a082311461041e578063715018a61461044e5780637892766c14610458576101e5565b806323b872dd1161018757806348cd4cb11161015657806348cd4cb1146103665780634fbee19314610384578063590ffdce146103b457806361d027b3146103d0576101e5565b806323b872dd146102de578063313ce5671461030e57806332cb6b0c1461032c578063412201041461034a576101e5565b80630fe3fe7d116101c35780630fe3fe7d1461025657806318160ddd1461028657806320e96920146102a457806321b02486146102ae576101e5565b806306fdde03146101ea578063095ea7b3146102085780630c18d4ce14610238575b600080fd5b6101f26105d3565b6040516101ff91906126cf565b60405180910390f35b610222600480360381019061021d9190612799565b610665565b60405161022f91906127f4565b60405180910390f35b610240610688565b60405161024d919061281e565b60405180910390f35b610270600480360381019061026b9190612799565b61068e565b60405161027d919061281e565b60405180910390f35b61028e6106b3565b60405161029b919061281e565b60405180910390f35b6102ac6106bd565b005b6102c860048036038101906102c39190612839565b6107ba565b6040516102d5919061281e565b60405180910390f35b6102f860048036038101906102f39190612866565b6107d2565b60405161030591906127f4565b60405180910390f35b610316610801565b60405161032391906128d5565b60405180910390f35b61033461080a565b604051610341919061281e565b60405180910390f35b610364600480360381019061035f919061291c565b61082e565b005b61036e610891565b60405161037b919061281e565b60405180910390f35b61039e6004803603810190610399919061295c565b610897565b6040516103ab91906127f4565b60405180910390f35b6103ce60048036038101906103c9919061291c565b6108b7565b005b6103d861091a565b6040516103e59190612998565b60405180910390f35b6104086004803603810190610403919061295c565b610940565b60405161041591906127f4565b60405180910390f35b6104386004803603810190610433919061295c565b610960565b604051610445919061281e565b60405180910390f35b6104566109a8565b005b610472600480360381019061046d919061295c565b6109bc565b005b61047c610c21565b005b610486610c7e565b6040516104939190612998565b60405180910390f35b6104a4610ca8565b6040516104b191906126cf565b60405180910390f35b6104c2610d3a565b6040516104d09291906129b3565b60405180910390f35b6104e1610d4d565b6040516104ee9190612998565b60405180910390f35b610511600480360381019061050c9190612799565b610d71565b60405161051e91906127f4565b60405180910390f35b61052f610d94565b60405161053c91906127f4565b60405180910390f35b61055f600480360381019061055a91906129dc565b610da7565b60405161056c919061281e565b60405180910390f35b61058f600480360381019061058a9190612a81565b610e2e565b005b6105ab60048036038101906105a6919061295c565b610f53565b005b6105c760048036038101906105c2919061295c565b6110d1565b005b6105d1611157565b005b6060600380546105e290612b10565b80601f016020809104026020016040519081016040528092919081815260200182805461060e90612b10565b801561065b5780601f106106305761010080835404028352916020019161065b565b820191906000526020600020905b81548152906001019060200180831161063e57829003601f168201915b5050505050905090565b60008061067061129b565b905061067d8185856112a3565b600191505092915050565b60085481565b600c602052816000526040600020602052806000526040600020600091509150505481565b6000600254905090565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461074d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161074490612b8d565b60405180910390fd5b600660149054906101000a900460ff161561079d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079490612bf9565b60405180910390fd5b6001600660146101000a81548160ff021916908315150217905550565b600e6020528060005260406000206000915090505481565b6000806107dd61129b565b90506107ea8582856112b5565b6107f585858561134a565b60019150509392505050565b60006012905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b61083661143e565b80600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60075481565b600a6020528060005260406000206000915054906101000a900460ff1681565b6108bf61143e565b80600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600b6020528060005260406000206000915054906101000a900460ff1681565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6109b061143e565b6109ba60006114c5565b565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4390612b8d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610abb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab290612c65565b60405180910390fd5b60008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610af69190612998565b602060405180830381865afa158015610b13573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b379190612c9a565b905060008111610b7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7390612d13565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836040518363ffffffff1660e01b8152600401610bd9929190612d33565b6020604051808303816000875af1158015610bf8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c1c9190612d71565b505050565b610c2961143e565b600060075414610c6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6590612dea565b60405180910390fd5b4360078190555042600881905550565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060048054610cb790612b10565b80601f0160208091040260200160405190810160405280929190818152602001828054610ce390612b10565b8015610d305780601f10610d0557610100808354040283529160200191610d30565b820191906000526020600020905b815481529060010190602001808311610d1357829003601f168201915b5050505050905090565b600080610d4561158b565b915091509091565b7f000000000000000000000000000000000000000000000000000000000000000081565b600080610d7c61129b565b9050610d8981858561134a565b600191505092915050565b600660149054906101000a900460ff1681565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b610e3661143e565b60005b83839050811015610f4d5781600a6000868685818110610e5c57610e5b612e0a565b5b9050602002016020810190610e71919061295c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555081600b6000868685818110610eda57610ed9612e0a565b5b9050602002016020810190610eef919061295c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080600101915050610e39565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610fc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb990612e85565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061104e575061101f610c7e565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b61108d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108490612ef1565b60405180910390fd5b80600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6110d961143e565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361114b5760006040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016111429190612998565b60405180910390fd5b611154816114c5565b50565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146111e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111de90612b8d565b60405180910390fd5b60004790506000811161122f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122690612f5d565b60405180910390fd5b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611297573d6000803e3d6000fd5b5050565b600033905090565b6112b083838360016117d4565b505050565b60006112c18484610da7565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8110156113445781811015611334578281836040517ffb8f41b200000000000000000000000000000000000000000000000000000000815260040161132b93929190612f7d565b60405180910390fd5b611343848484840360006117d4565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036113bc5760006040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081526004016113b39190612998565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361142e5760006040517fec442f050000000000000000000000000000000000000000000000000000000081526004016114259190612998565b60405180910390fd5b6114398383836119ab565b505050565b61144661129b565b73ffffffffffffffffffffffffffffffffffffffff16611464610c7e565b73ffffffffffffffffffffffffffffffffffffffff16146114c35761148761129b565b6040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016114ba9190612998565b60405180910390fd5b565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080600660149054906101000a900460ff16156115cf57600091507f000000000000000000000000000000000000000000000000000000000000000090506117d0565b6000600854036115e557600080915091506117d0565b6000600854426115f59190612fe3565b9050610e1081101561174e57603c81101561164557610fa092506103e87f000000000000000000000000000000000000000000000000000000000000000061163d9190613046565b9150506117d0565b61012c81101561168a57610bb8925061029a7f00000000000000000000000000000000000000000000000000000000000000006116829190613046565b9150506117d0565b6101e08110156116cf576107d092506101f47f00000000000000000000000000000000000000000000000000000000000000006116c79190613046565b9150506117d0565b6105dc811015611714576103e8925061014d7f000000000000000000000000000000000000000000000000000000000000000061170c9190613046565b9150506117d0565b610190925060c87f00000000000000000000000000000000000000000000000000000000000000006117469190613046565b9150506117d0565b681b1ae4d6e2ef500000600954101561176b5761019092506117ab565b6825f273933db570000060095410156117885761012c92506117aa565b6830ca024f987b90000060095410156117a45760c892506117a9565b600092505b5b5b7f00000000000000000000000000000000000000000000000000000000000000009150505b9091565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036118465760006040517fe602df0500000000000000000000000000000000000000000000000000000000815260040161183d9190612998565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036118b85760006040517f94280d620000000000000000000000000000000000000000000000000000000081526004016118af9190612998565b60405180910390fd5b81600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080156119a5578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161199c919061281e565b60405180910390a35b50505050565b60006007541480156119ef57506119c0610c7e565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b8015611a4657507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b15611a5b57611a56838383611ff7565b611ff2565b600080611a6661158b565b9150915060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161490508080611b1457507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16145b15611f3957600060075411611b5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b55906130c3565b60405180910390fd5b6007544303611bf457600a60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611bf3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bea9061312f565b60405180910390fd5b5b60008314611ed157808015611c535750600a60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15611e2f576000600854118015611c77575060b460085442611c759190612fe3565b105b15611df757600d54600c60003273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060004381526020019081526020016000205410611d10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d07906131c1565b60405180910390fd5b600c60003273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060004381526020019081526020016000206000815480929190611d71906131e1565b9190505550600f54600e60004381526020019081526020016000205410611dcd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dc490613275565b60405180910390fd5b600e60004381526020019081526020016000206000815480929190611df1906131e1565b91905055505b60006127108486611e089190613295565b611e129190613046565b90508085611e209190612fe3565b9450611e2d873083611ff7565b505b80158015611e875750600a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15611ecc5760006127108486611e9d9190613295565b611ea79190613046565b90508085611eb59190612fe3565b9450611ec2873083611ff7565b611eca61221c565b505b611f38565b80158015611f295750600a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15611f3757611f3661221c565b5b5b5b600b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680611fa4575081611f9686610960565b85611fa191906132d7565b11155b611fe3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fda90613357565b60405180910390fd5b611fee868686611ff7565b5050505b505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361204957806002600082825461203d91906132d7565b9250508190555061211c565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156120d5578381836040517fe450d38c0000000000000000000000000000000000000000000000000000000081526004016120cc93929190612f7d565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361216557806002600082825403925050819055506121b2565b806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161220f919061281e565b60405180910390a3505050565b60006008544261222c9190612fe3565b905061012c81101561223e575061263d565b600061224930610960565b90506000810361225a57505061263d565b6000600267ffffffffffffffff81111561227757612276613377565b5b6040519080825280602002602001820160405280156122a55781602001602082028036833780820191505090505b5090507f0000000000000000000000000000000000000000000000000000000000000000816000815181106122dd576122dc612e0a565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050308160018151811061232c5761232b612e0a565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506000737a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663d06ca61f670de0b6b3a7640000846040518363ffffffff1660e01b81526004016123bf9291906134a9565b600060405180830381865afa1580156123dc573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061240591906135e8565b60018151811061241857612417612e0a565b5b602002602001015190508083111561242e578092505b308260008151811061244357612442612e0a565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f0000000000000000000000000000000000000000000000000000000000000000826001815181106124b2576124b1612e0a565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16319050737a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663791ac94785600086600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16426040518663ffffffff1660e01b81526004016125a295949392919061366c565b600060405180830381600087803b1580156125bc57600080fd5b505af11580156125d0573d6000803e3d6000fd5b505050506000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16319050818161261e9190612fe3565b6009600082825461262f91906132d7565b925050819055505050505050505b565b600081519050919050565b600082825260208201905092915050565b60005b8381101561267957808201518184015260208101905061265e565b60008484015250505050565b6000601f19601f8301169050919050565b60006126a18261263f565b6126ab818561264a565b93506126bb81856020860161265b565b6126c481612685565b840191505092915050565b600060208201905081810360008301526126e98184612696565b905092915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061273082612705565b9050919050565b61274081612725565b811461274b57600080fd5b50565b60008135905061275d81612737565b92915050565b6000819050919050565b61277681612763565b811461278157600080fd5b50565b6000813590506127938161276d565b92915050565b600080604083850312156127b0576127af6126fb565b5b60006127be8582860161274e565b92505060206127cf85828601612784565b9150509250929050565b60008115159050919050565b6127ee816127d9565b82525050565b600060208201905061280960008301846127e5565b92915050565b61281881612763565b82525050565b6000602082019050612833600083018461280f565b92915050565b60006020828403121561284f5761284e6126fb565b5b600061285d84828501612784565b91505092915050565b60008060006060848603121561287f5761287e6126fb565b5b600061288d8682870161274e565b935050602061289e8682870161274e565b92505060406128af86828701612784565b9150509250925092565b600060ff82169050919050565b6128cf816128b9565b82525050565b60006020820190506128ea60008301846128c6565b92915050565b6128f9816127d9565b811461290457600080fd5b50565b600081359050612916816128f0565b92915050565b60008060408385031215612933576129326126fb565b5b60006129418582860161274e565b925050602061295285828601612907565b9150509250929050565b600060208284031215612972576129716126fb565b5b60006129808482850161274e565b91505092915050565b61299281612725565b82525050565b60006020820190506129ad6000830184612989565b92915050565b60006040820190506129c8600083018561280f565b6129d5602083018461280f565b9392505050565b600080604083850312156129f3576129f26126fb565b5b6000612a018582860161274e565b9250506020612a128582860161274e565b9150509250929050565b600080fd5b600080fd5b600080fd5b60008083601f840112612a4157612a40612a1c565b5b8235905067ffffffffffffffff811115612a5e57612a5d612a21565b5b602083019150836020820283011115612a7a57612a79612a26565b5b9250929050565b600080600060408486031215612a9a57612a996126fb565b5b600084013567ffffffffffffffff811115612ab857612ab7612700565b5b612ac486828701612a2b565b93509350506020612ad786828701612907565b9150509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612b2857607f821691505b602082108103612b3b57612b3a612ae1565b5b50919050565b7f6f6e6c792d747265617375727900000000000000000000000000000000000000600082015250565b6000612b77600d8361264a565b9150612b8282612b41565b602082019050919050565b60006020820190508181036000830152612ba681612b6a565b9050919050565b7f616c72656164792d7461782d6672656500000000000000000000000000000000600082015250565b6000612be360108361264a565b9150612bee82612bad565b602082019050919050565b60006020820190508181036000830152612c1281612bd6565b9050919050565b7f696e76616c69642d746f6b656e00000000000000000000000000000000000000600082015250565b6000612c4f600d8361264a565b9150612c5a82612c19565b602082019050919050565b60006020820190508181036000830152612c7e81612c42565b9050919050565b600081519050612c948161276d565b92915050565b600060208284031215612cb057612caf6126fb565b5b6000612cbe84828501612c85565b91505092915050565b7f6e6f2d746f6b656e730000000000000000000000000000000000000000000000600082015250565b6000612cfd60098361264a565b9150612d0882612cc7565b602082019050919050565b60006020820190508181036000830152612d2c81612cf0565b9050919050565b6000604082019050612d486000830185612989565b612d55602083018461280f565b9392505050565b600081519050612d6b816128f0565b92915050565b600060208284031215612d8757612d866126fb565b5b6000612d9584828501612d5c565b91505092915050565b7f74726164696e672d616c72656164792d656e61626c6564000000000000000000600082015250565b6000612dd460178361264a565b9150612ddf82612d9e565b602082019050919050565b60006020820190508181036000830152612e0381612dc7565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f74726561737572792d69732d3000000000000000000000000000000000000000600082015250565b6000612e6f600d8361264a565b9150612e7a82612e39565b602082019050919050565b60006020820190508181036000830152612e9e81612e62565b9050919050565b7f6f6e6c792d6465706c6f79657200000000000000000000000000000000000000600082015250565b6000612edb600d8361264a565b9150612ee682612ea5565b602082019050919050565b60006020820190508181036000830152612f0a81612ece565b9050919050565b7f6e6f2d6574680000000000000000000000000000000000000000000000000000600082015250565b6000612f4760068361264a565b9150612f5282612f11565b602082019050919050565b60006020820190508181036000830152612f7681612f3a565b9050919050565b6000606082019050612f926000830186612989565b612f9f602083018561280f565b612fac604083018461280f565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612fee82612763565b9150612ff983612763565b925082820390508181111561301157613010612fb4565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061305182612763565b915061305c83612763565b92508261306c5761306b613017565b5b828204905092915050565b7f74726164696e672d6e6f742d656e61626c656400000000000000000000000000600082015250565b60006130ad60138361264a565b91506130b882613077565b602082019050919050565b600060208201905081810360008301526130dc816130a0565b9050919050565b7f6f6e6c792d6578636c756465642d6275792d696e2d626c6f636b2d3000000000600082015250565b6000613119601c8361264a565b9150613124826130e3565b602082019050919050565b600060208201905081810360008301526131488161310c565b9050919050565b7f6d61782d6275792d7478732d7065722d626c6f636b2d7065722d6f726967696e60008201527f2d65786365656465640000000000000000000000000000000000000000000000602082015250565b60006131ab60298361264a565b91506131b68261314f565b604082019050919050565b600060208201905081810360008301526131da8161319e565b9050919050565b60006131ec82612763565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361321e5761321d612fb4565b5b600182019050919050565b7f6d61782d6275792d7478732d7065722d626c6f636b2d65786365656465640000600082015250565b600061325f601e8361264a565b915061326a82613229565b602082019050919050565b6000602082019050818103600083015261328e81613252565b9050919050565b60006132a082612763565b91506132ab83612763565b92508282026132b981612763565b915082820484148315176132d0576132cf612fb4565b5b5092915050565b60006132e282612763565b91506132ed83612763565b925082820190508082111561330557613304612fb4565b5b92915050565b7f6d61782d77616c6c65742d73697a652d65786365656465640000000000000000600082015250565b600061334160188361264a565b915061334c8261330b565b602082019050919050565b6000602082019050818103600083015261337081613334565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000819050919050565b6000819050919050565b60006133d56133d06133cb846133a6565b6133b0565b612763565b9050919050565b6133e5816133ba565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61342081612725565b82525050565b60006134328383613417565b60208301905092915050565b6000602082019050919050565b6000613456826133eb565b61346081856133f6565b935061346b83613407565b8060005b8381101561349c5781516134838882613426565b975061348e8361343e565b92505060018101905061346f565b5085935050505092915050565b60006040820190506134be60008301856133dc565b81810360208301526134d0818461344b565b90509392505050565b6134e282612685565b810181811067ffffffffffffffff8211171561350157613500613377565b5b80604052505050565b60006135146126f1565b905061352082826134d9565b919050565b600067ffffffffffffffff8211156135405761353f613377565b5b602082029050602081019050919050565b600061356461355f84613525565b61350a565b9050808382526020820190506020840283018581111561358757613586612a26565b5b835b818110156135b0578061359c8882612c85565b845260208401935050602081019050613589565b5050509392505050565b600082601f8301126135cf576135ce612a1c565b5b81516135df848260208601613551565b91505092915050565b6000602082840312156135fe576135fd6126fb565b5b600082015167ffffffffffffffff81111561361c5761361b612700565b5b613628848285016135ba565b91505092915050565b6000819050919050565b600061365661365161364c84613631565b6133b0565b612763565b9050919050565b6136668161363b565b82525050565b600060a082019050613681600083018861280f565b61368e602083018761365d565b81810360408301526136a0818661344b565b90506136af6060830185612989565b6136bc608083018461280f565b969550505050505056fea26469706673582212209a64a949a703f9ce603434cf1531c427f292a43cfca34f9e4e56e6a3513318a064736f6c634300081c0033000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000052b7d2dcc80cd2e4000000000000000000000000000000bd53a06c1fcb54af708e78bd3fbde46be9cc1b1d0000000000000000000000000000000000000000000000000000000000000007566f63616c6164000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004564f434c00000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101e55760003560e01c80636dd3d39f1161010f578063a8aa1b31116100a2578063e6762d2011610071578063e6762d2014610575578063f0f4426014610591578063f2fde38b146105ad578063f5648a4f146105c9576101e5565b8063a8aa1b31146104d9578063a9059cbb146104f7578063c6f9b4a614610527578063dd62ed3e14610545576101e5565b80638a8c523c116100de5780638a8c523c146104745780638da5cb5b1461047e57806395d89b411461049c578063a25ba183146104ba576101e5565b80636dd3d39f146103ee57806370a082311461041e578063715018a61461044e5780637892766c14610458576101e5565b806323b872dd1161018757806348cd4cb11161015657806348cd4cb1146103665780634fbee19314610384578063590ffdce146103b457806361d027b3146103d0576101e5565b806323b872dd146102de578063313ce5671461030e57806332cb6b0c1461032c578063412201041461034a576101e5565b80630fe3fe7d116101c35780630fe3fe7d1461025657806318160ddd1461028657806320e96920146102a457806321b02486146102ae576101e5565b806306fdde03146101ea578063095ea7b3146102085780630c18d4ce14610238575b600080fd5b6101f26105d3565b6040516101ff91906126cf565b60405180910390f35b610222600480360381019061021d9190612799565b610665565b60405161022f91906127f4565b60405180910390f35b610240610688565b60405161024d919061281e565b60405180910390f35b610270600480360381019061026b9190612799565b61068e565b60405161027d919061281e565b60405180910390f35b61028e6106b3565b60405161029b919061281e565b60405180910390f35b6102ac6106bd565b005b6102c860048036038101906102c39190612839565b6107ba565b6040516102d5919061281e565b60405180910390f35b6102f860048036038101906102f39190612866565b6107d2565b60405161030591906127f4565b60405180910390f35b610316610801565b60405161032391906128d5565b60405180910390f35b61033461080a565b604051610341919061281e565b60405180910390f35b610364600480360381019061035f919061291c565b61082e565b005b61036e610891565b60405161037b919061281e565b60405180910390f35b61039e6004803603810190610399919061295c565b610897565b6040516103ab91906127f4565b60405180910390f35b6103ce60048036038101906103c9919061291c565b6108b7565b005b6103d861091a565b6040516103e59190612998565b60405180910390f35b6104086004803603810190610403919061295c565b610940565b60405161041591906127f4565b60405180910390f35b6104386004803603810190610433919061295c565b610960565b604051610445919061281e565b60405180910390f35b6104566109a8565b005b610472600480360381019061046d919061295c565b6109bc565b005b61047c610c21565b005b610486610c7e565b6040516104939190612998565b60405180910390f35b6104a4610ca8565b6040516104b191906126cf565b60405180910390f35b6104c2610d3a565b6040516104d09291906129b3565b60405180910390f35b6104e1610d4d565b6040516104ee9190612998565b60405180910390f35b610511600480360381019061050c9190612799565b610d71565b60405161051e91906127f4565b60405180910390f35b61052f610d94565b60405161053c91906127f4565b60405180910390f35b61055f600480360381019061055a91906129dc565b610da7565b60405161056c919061281e565b60405180910390f35b61058f600480360381019061058a9190612a81565b610e2e565b005b6105ab60048036038101906105a6919061295c565b610f53565b005b6105c760048036038101906105c2919061295c565b6110d1565b005b6105d1611157565b005b6060600380546105e290612b10565b80601f016020809104026020016040519081016040528092919081815260200182805461060e90612b10565b801561065b5780601f106106305761010080835404028352916020019161065b565b820191906000526020600020905b81548152906001019060200180831161063e57829003601f168201915b5050505050905090565b60008061067061129b565b905061067d8185856112a3565b600191505092915050565b60085481565b600c602052816000526040600020602052806000526040600020600091509150505481565b6000600254905090565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461074d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161074490612b8d565b60405180910390fd5b600660149054906101000a900460ff161561079d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079490612bf9565b60405180910390fd5b6001600660146101000a81548160ff021916908315150217905550565b600e6020528060005260406000206000915090505481565b6000806107dd61129b565b90506107ea8582856112b5565b6107f585858561134a565b60019150509392505050565b60006012905090565b7f00000000000000000000000000000000000000000052b7d2dcc80cd2e400000081565b61083661143e565b80600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60075481565b600a6020528060005260406000206000915054906101000a900460ff1681565b6108bf61143e565b80600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600b6020528060005260406000206000915054906101000a900460ff1681565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6109b061143e565b6109ba60006114c5565b565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4390612b8d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610abb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab290612c65565b60405180910390fd5b60008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610af69190612998565b602060405180830381865afa158015610b13573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b379190612c9a565b905060008111610b7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7390612d13565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836040518363ffffffff1660e01b8152600401610bd9929190612d33565b6020604051808303816000875af1158015610bf8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c1c9190612d71565b505050565b610c2961143e565b600060075414610c6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6590612dea565b60405180910390fd5b4360078190555042600881905550565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060048054610cb790612b10565b80601f0160208091040260200160405190810160405280929190818152602001828054610ce390612b10565b8015610d305780601f10610d0557610100808354040283529160200191610d30565b820191906000526020600020905b815481529060010190602001808311610d1357829003601f168201915b5050505050905090565b600080610d4561158b565b915091509091565b7f00000000000000000000000075f802225060a136a24c6738d679bd5c94620d6381565b600080610d7c61129b565b9050610d8981858561134a565b600191505092915050565b600660149054906101000a900460ff1681565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b610e3661143e565b60005b83839050811015610f4d5781600a6000868685818110610e5c57610e5b612e0a565b5b9050602002016020810190610e71919061295c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555081600b6000868685818110610eda57610ed9612e0a565b5b9050602002016020810190610eef919061295c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080600101915050610e39565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610fc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb990612e85565b60405180910390fd5b7f000000000000000000000000f5b884322d31a8ed07a93560bfde4a55445ca2e373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061104e575061101f610c7e565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b61108d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108490612ef1565b60405180910390fd5b80600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6110d961143e565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361114b5760006040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016111429190612998565b60405180910390fd5b611154816114c5565b50565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146111e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111de90612b8d565b60405180910390fd5b60004790506000811161122f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122690612f5d565b60405180910390fd5b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611297573d6000803e3d6000fd5b5050565b600033905090565b6112b083838360016117d4565b505050565b60006112c18484610da7565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8110156113445781811015611334578281836040517ffb8f41b200000000000000000000000000000000000000000000000000000000815260040161132b93929190612f7d565b60405180910390fd5b611343848484840360006117d4565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036113bc5760006040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081526004016113b39190612998565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361142e5760006040517fec442f050000000000000000000000000000000000000000000000000000000081526004016114259190612998565b60405180910390fd5b6114398383836119ab565b505050565b61144661129b565b73ffffffffffffffffffffffffffffffffffffffff16611464610c7e565b73ffffffffffffffffffffffffffffffffffffffff16146114c35761148761129b565b6040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016114ba9190612998565b60405180910390fd5b565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080600660149054906101000a900460ff16156115cf57600091507f00000000000000000000000000000000000000000052b7d2dcc80cd2e400000090506117d0565b6000600854036115e557600080915091506117d0565b6000600854426115f59190612fe3565b9050610e1081101561174e57603c81101561164557610fa092506103e87f00000000000000000000000000000000000000000052b7d2dcc80cd2e400000061163d9190613046565b9150506117d0565b61012c81101561168a57610bb8925061029a7f00000000000000000000000000000000000000000052b7d2dcc80cd2e40000006116829190613046565b9150506117d0565b6101e08110156116cf576107d092506101f47f00000000000000000000000000000000000000000052b7d2dcc80cd2e40000006116c79190613046565b9150506117d0565b6105dc811015611714576103e8925061014d7f00000000000000000000000000000000000000000052b7d2dcc80cd2e400000061170c9190613046565b9150506117d0565b610190925060c87f00000000000000000000000000000000000000000052b7d2dcc80cd2e40000006117469190613046565b9150506117d0565b681b1ae4d6e2ef500000600954101561176b5761019092506117ab565b6825f273933db570000060095410156117885761012c92506117aa565b6830ca024f987b90000060095410156117a45760c892506117a9565b600092505b5b5b7f00000000000000000000000000000000000000000052b7d2dcc80cd2e40000009150505b9091565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036118465760006040517fe602df0500000000000000000000000000000000000000000000000000000000815260040161183d9190612998565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036118b85760006040517f94280d620000000000000000000000000000000000000000000000000000000081526004016118af9190612998565b60405180910390fd5b81600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080156119a5578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161199c919061281e565b60405180910390a35b50505050565b60006007541480156119ef57506119c0610c7e565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b8015611a4657507f00000000000000000000000075f802225060a136a24c6738d679bd5c94620d6373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b15611a5b57611a56838383611ff7565b611ff2565b600080611a6661158b565b9150915060007f00000000000000000000000075f802225060a136a24c6738d679bd5c94620d6373ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161490508080611b1457507f00000000000000000000000075f802225060a136a24c6738d679bd5c94620d6373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16145b15611f3957600060075411611b5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b55906130c3565b60405180910390fd5b6007544303611bf457600a60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611bf3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bea9061312f565b60405180910390fd5b5b60008314611ed157808015611c535750600a60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15611e2f576000600854118015611c77575060b460085442611c759190612fe3565b105b15611df757600d54600c60003273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060004381526020019081526020016000205410611d10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d07906131c1565b60405180910390fd5b600c60003273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060004381526020019081526020016000206000815480929190611d71906131e1565b9190505550600f54600e60004381526020019081526020016000205410611dcd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dc490613275565b60405180910390fd5b600e60004381526020019081526020016000206000815480929190611df1906131e1565b91905055505b60006127108486611e089190613295565b611e129190613046565b90508085611e209190612fe3565b9450611e2d873083611ff7565b505b80158015611e875750600a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15611ecc5760006127108486611e9d9190613295565b611ea79190613046565b90508085611eb59190612fe3565b9450611ec2873083611ff7565b611eca61221c565b505b611f38565b80158015611f295750600a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15611f3757611f3661221c565b5b5b5b600b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680611fa4575081611f9686610960565b85611fa191906132d7565b11155b611fe3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fda90613357565b60405180910390fd5b611fee868686611ff7565b5050505b505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361204957806002600082825461203d91906132d7565b9250508190555061211c565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156120d5578381836040517fe450d38c0000000000000000000000000000000000000000000000000000000081526004016120cc93929190612f7d565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361216557806002600082825403925050819055506121b2565b806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161220f919061281e565b60405180910390a3505050565b60006008544261222c9190612fe3565b905061012c81101561223e575061263d565b600061224930610960565b90506000810361225a57505061263d565b6000600267ffffffffffffffff81111561227757612276613377565b5b6040519080825280602002602001820160405280156122a55781602001602082028036833780820191505090505b5090507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2816000815181106122dd576122dc612e0a565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050308160018151811061232c5761232b612e0a565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506000737a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663d06ca61f670de0b6b3a7640000846040518363ffffffff1660e01b81526004016123bf9291906134a9565b600060405180830381865afa1580156123dc573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061240591906135e8565b60018151811061241857612417612e0a565b5b602002602001015190508083111561242e578092505b308260008151811061244357612442612e0a565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2826001815181106124b2576124b1612e0a565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16319050737a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663791ac94785600086600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16426040518663ffffffff1660e01b81526004016125a295949392919061366c565b600060405180830381600087803b1580156125bc57600080fd5b505af11580156125d0573d6000803e3d6000fd5b505050506000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16319050818161261e9190612fe3565b6009600082825461262f91906132d7565b925050819055505050505050505b565b600081519050919050565b600082825260208201905092915050565b60005b8381101561267957808201518184015260208101905061265e565b60008484015250505050565b6000601f19601f8301169050919050565b60006126a18261263f565b6126ab818561264a565b93506126bb81856020860161265b565b6126c481612685565b840191505092915050565b600060208201905081810360008301526126e98184612696565b905092915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061273082612705565b9050919050565b61274081612725565b811461274b57600080fd5b50565b60008135905061275d81612737565b92915050565b6000819050919050565b61277681612763565b811461278157600080fd5b50565b6000813590506127938161276d565b92915050565b600080604083850312156127b0576127af6126fb565b5b60006127be8582860161274e565b92505060206127cf85828601612784565b9150509250929050565b60008115159050919050565b6127ee816127d9565b82525050565b600060208201905061280960008301846127e5565b92915050565b61281881612763565b82525050565b6000602082019050612833600083018461280f565b92915050565b60006020828403121561284f5761284e6126fb565b5b600061285d84828501612784565b91505092915050565b60008060006060848603121561287f5761287e6126fb565b5b600061288d8682870161274e565b935050602061289e8682870161274e565b92505060406128af86828701612784565b9150509250925092565b600060ff82169050919050565b6128cf816128b9565b82525050565b60006020820190506128ea60008301846128c6565b92915050565b6128f9816127d9565b811461290457600080fd5b50565b600081359050612916816128f0565b92915050565b60008060408385031215612933576129326126fb565b5b60006129418582860161274e565b925050602061295285828601612907565b9150509250929050565b600060208284031215612972576129716126fb565b5b60006129808482850161274e565b91505092915050565b61299281612725565b82525050565b60006020820190506129ad6000830184612989565b92915050565b60006040820190506129c8600083018561280f565b6129d5602083018461280f565b9392505050565b600080604083850312156129f3576129f26126fb565b5b6000612a018582860161274e565b9250506020612a128582860161274e565b9150509250929050565b600080fd5b600080fd5b600080fd5b60008083601f840112612a4157612a40612a1c565b5b8235905067ffffffffffffffff811115612a5e57612a5d612a21565b5b602083019150836020820283011115612a7a57612a79612a26565b5b9250929050565b600080600060408486031215612a9a57612a996126fb565b5b600084013567ffffffffffffffff811115612ab857612ab7612700565b5b612ac486828701612a2b565b93509350506020612ad786828701612907565b9150509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612b2857607f821691505b602082108103612b3b57612b3a612ae1565b5b50919050565b7f6f6e6c792d747265617375727900000000000000000000000000000000000000600082015250565b6000612b77600d8361264a565b9150612b8282612b41565b602082019050919050565b60006020820190508181036000830152612ba681612b6a565b9050919050565b7f616c72656164792d7461782d6672656500000000000000000000000000000000600082015250565b6000612be360108361264a565b9150612bee82612bad565b602082019050919050565b60006020820190508181036000830152612c1281612bd6565b9050919050565b7f696e76616c69642d746f6b656e00000000000000000000000000000000000000600082015250565b6000612c4f600d8361264a565b9150612c5a82612c19565b602082019050919050565b60006020820190508181036000830152612c7e81612c42565b9050919050565b600081519050612c948161276d565b92915050565b600060208284031215612cb057612caf6126fb565b5b6000612cbe84828501612c85565b91505092915050565b7f6e6f2d746f6b656e730000000000000000000000000000000000000000000000600082015250565b6000612cfd60098361264a565b9150612d0882612cc7565b602082019050919050565b60006020820190508181036000830152612d2c81612cf0565b9050919050565b6000604082019050612d486000830185612989565b612d55602083018461280f565b9392505050565b600081519050612d6b816128f0565b92915050565b600060208284031215612d8757612d866126fb565b5b6000612d9584828501612d5c565b91505092915050565b7f74726164696e672d616c72656164792d656e61626c6564000000000000000000600082015250565b6000612dd460178361264a565b9150612ddf82612d9e565b602082019050919050565b60006020820190508181036000830152612e0381612dc7565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f74726561737572792d69732d3000000000000000000000000000000000000000600082015250565b6000612e6f600d8361264a565b9150612e7a82612e39565b602082019050919050565b60006020820190508181036000830152612e9e81612e62565b9050919050565b7f6f6e6c792d6465706c6f79657200000000000000000000000000000000000000600082015250565b6000612edb600d8361264a565b9150612ee682612ea5565b602082019050919050565b60006020820190508181036000830152612f0a81612ece565b9050919050565b7f6e6f2d6574680000000000000000000000000000000000000000000000000000600082015250565b6000612f4760068361264a565b9150612f5282612f11565b602082019050919050565b60006020820190508181036000830152612f7681612f3a565b9050919050565b6000606082019050612f926000830186612989565b612f9f602083018561280f565b612fac604083018461280f565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612fee82612763565b9150612ff983612763565b925082820390508181111561301157613010612fb4565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061305182612763565b915061305c83612763565b92508261306c5761306b613017565b5b828204905092915050565b7f74726164696e672d6e6f742d656e61626c656400000000000000000000000000600082015250565b60006130ad60138361264a565b91506130b882613077565b602082019050919050565b600060208201905081810360008301526130dc816130a0565b9050919050565b7f6f6e6c792d6578636c756465642d6275792d696e2d626c6f636b2d3000000000600082015250565b6000613119601c8361264a565b9150613124826130e3565b602082019050919050565b600060208201905081810360008301526131488161310c565b9050919050565b7f6d61782d6275792d7478732d7065722d626c6f636b2d7065722d6f726967696e60008201527f2d65786365656465640000000000000000000000000000000000000000000000602082015250565b60006131ab60298361264a565b91506131b68261314f565b604082019050919050565b600060208201905081810360008301526131da8161319e565b9050919050565b60006131ec82612763565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361321e5761321d612fb4565b5b600182019050919050565b7f6d61782d6275792d7478732d7065722d626c6f636b2d65786365656465640000600082015250565b600061325f601e8361264a565b915061326a82613229565b602082019050919050565b6000602082019050818103600083015261328e81613252565b9050919050565b60006132a082612763565b91506132ab83612763565b92508282026132b981612763565b915082820484148315176132d0576132cf612fb4565b5b5092915050565b60006132e282612763565b91506132ed83612763565b925082820190508082111561330557613304612fb4565b5b92915050565b7f6d61782d77616c6c65742d73697a652d65786365656465640000000000000000600082015250565b600061334160188361264a565b915061334c8261330b565b602082019050919050565b6000602082019050818103600083015261337081613334565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000819050919050565b6000819050919050565b60006133d56133d06133cb846133a6565b6133b0565b612763565b9050919050565b6133e5816133ba565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61342081612725565b82525050565b60006134328383613417565b60208301905092915050565b6000602082019050919050565b6000613456826133eb565b61346081856133f6565b935061346b83613407565b8060005b8381101561349c5781516134838882613426565b975061348e8361343e565b92505060018101905061346f565b5085935050505092915050565b60006040820190506134be60008301856133dc565b81810360208301526134d0818461344b565b90509392505050565b6134e282612685565b810181811067ffffffffffffffff8211171561350157613500613377565b5b80604052505050565b60006135146126f1565b905061352082826134d9565b919050565b600067ffffffffffffffff8211156135405761353f613377565b5b602082029050602081019050919050565b600061356461355f84613525565b61350a565b9050808382526020820190506020840283018581111561358757613586612a26565b5b835b818110156135b0578061359c8882612c85565b845260208401935050602081019050613589565b5050509392505050565b600082601f8301126135cf576135ce612a1c565b5b81516135df848260208601613551565b91505092915050565b6000602082840312156135fe576135fd6126fb565b5b600082015167ffffffffffffffff81111561361c5761361b612700565b5b613628848285016135ba565b91505092915050565b6000819050919050565b600061365661365161364c84613631565b6133b0565b612763565b9050919050565b6136668161363b565b82525050565b600060a082019050613681600083018861280f565b61368e602083018761365d565b81810360408301526136a0818661344b565b90506136af6060830185612989565b6136bc608083018461280f565b969550505050505056fea26469706673582212209a64a949a703f9ce603434cf1531c427f292a43cfca34f9e4e56e6a3513318a064736f6c634300081c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000052b7d2dcc80cd2e4000000000000000000000000000000bd53a06c1fcb54af708e78bd3fbde46be9cc1b1d0000000000000000000000000000000000000000000000000000000000000007566f63616c6164000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004564f434c00000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : name (string): Vocalad
Arg [1] : symbol (string): VOCL
Arg [2] : maxSupply (uint256): 100000000000000000000000000
Arg [3] : _treasury (address): 0xbD53A06c1Fcb54AF708e78Bd3FbDe46Be9CC1b1d
-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [2] : 00000000000000000000000000000000000000000052b7d2dcc80cd2e4000000
Arg [3] : 000000000000000000000000bd53a06c1fcb54af708e78bd3fbde46be9cc1b1d
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [5] : 566f63616c616400000000000000000000000000000000000000000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [7] : 564f434c00000000000000000000000000000000000000000000000000000000
Loading...
Loading
Loading...
Loading
Net Worth in USD
$23.44
Net Worth in ETH
0.011847
Token Allocations
ETH
100.00%
Multichain Portfolio | 33 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|---|---|---|---|---|
| BASE | 100.00% | $1,976.57 | 0.0119 | $23.44 |
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.