More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 930 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Transfer | 23805254 | 42 mins ago | IN | 0 ETH | 0.00094485 | ||||
| Withdraw Marketi... | 23805235 | 46 mins ago | IN | 0 ETH | 0.0000693 | ||||
| Approve | 23800267 | 17 hrs ago | IN | 0 ETH | 0.00005808 | ||||
| Approve | 23800265 | 17 hrs ago | IN | 0 ETH | 0.00006352 | ||||
| Approve | 23771065 | 4 days ago | IN | 0 ETH | 0.00005948 | ||||
| Transfer | 23756795 | 6 days ago | IN | 0 ETH | 0.00123086 | ||||
| Approve | 23725643 | 11 days ago | IN | 0 ETH | 0.00008644 | ||||
| Approve | 23713222 | 12 days ago | IN | 0 ETH | 0.00005241 | ||||
| Approve | 23639814 | 23 days ago | IN | 0 ETH | 0.00000494 | ||||
| Approve | 23635042 | 23 days ago | IN | 0 ETH | 0.00024389 | ||||
| Transfer | 23635038 | 23 days ago | IN | 0 ETH | 0.00028713 | ||||
| Approve | 23634926 | 23 days ago | IN | 0 ETH | 0.00024272 | ||||
| Transfer | 23634923 | 23 days ago | IN | 0 ETH | 0.00011501 | ||||
| Transfer | 23634920 | 23 days ago | IN | 0 ETH | 0.00024433 | ||||
| Approve | 23633715 | 24 days ago | IN | 0 ETH | 0.00004213 | ||||
| Approve | 23612500 | 27 days ago | IN | 0 ETH | 0.00007925 | ||||
| Transfer | 23602362 | 28 days ago | IN | 0 ETH | 0.00076536 | ||||
| Approve | 23600151 | 28 days ago | IN | 0 ETH | 0.00007985 | ||||
| Transfer | 23598554 | 28 days ago | IN | 0 ETH | 0.00383617 | ||||
| Transfer | 23570513 | 32 days ago | IN | 0 ETH | 0.00347651 | ||||
| Approve | 23567758 | 33 days ago | IN | 0 ETH | 0.00004353 | ||||
| Approve | 23559426 | 34 days ago | IN | 0 ETH | 0.00002975 | ||||
| Approve | 23559422 | 34 days ago | IN | 0 ETH | 0.00004055 | ||||
| Approve | 23557382 | 34 days ago | IN | 0 ETH | 0.00002103 | ||||
| Approve | 23536599 | 37 days ago | IN | 0 ETH | 0.00000894 |
Latest 25 internal transactions (View All)
Advanced mode:
| Parent Transaction Hash | Method | Block |
From
|
|
To
|
||
|---|---|---|---|---|---|---|---|
| Transfer | 23805235 | 46 mins ago | 0.01839428 ETH | ||||
| Transfer | 23756657 | 6 days ago | 0.00057192 ETH | ||||
| Transfer | 23725643 | 11 days ago | 0.0009595 ETH | ||||
| Transfer | 23718468 | 12 days ago | 0.00172473 ETH | ||||
| Transfer | 23697697 | 15 days ago | 0.00073851 ETH | ||||
| Transfer | 23635038 | 23 days ago | 0.00072687 ETH | ||||
| Transfer | 23633715 | 24 days ago | 0.00080093 ETH | ||||
| Transfer | 23628159 | 24 days ago | 0.00133829 ETH | ||||
| Transfer | 23602599 | 28 days ago | 0.00107349 ETH | ||||
| Transfer | 23596092 | 29 days ago | 0.00105659 ETH | ||||
| Transfer | 23570513 | 32 days ago | 0.00211175 ETH | ||||
| Transfer | 23536599 | 37 days ago | 0.00074736 ETH | ||||
| Transfer | 23536237 | 37 days ago | 0.00074736 ETH | ||||
| Transfer | 23530442 | 38 days ago | 0.00654427 ETH | ||||
| Transfer | 23516020 | 40 days ago | 0.00649892 ETH | ||||
| Transfer | 23512476 | 40 days ago | 0.0215678 ETH | ||||
| Transfer | 23508828 | 41 days ago | 0.00646231 ETH | ||||
| Transfer | 23504710 | 42 days ago | 0.00533813 ETH | ||||
| Transfer | 23483499 | 45 days ago | 0.00365236 ETH | ||||
| Transfer | 23483474 | 45 days ago | 0.00096466 ETH | ||||
| Transfer | 23477503 | 45 days ago | 0.00492479 ETH | ||||
| Transfer | 23476747 | 45 days ago | 0.00668784 ETH | ||||
| Transfer | 23466785 | 47 days ago | 0.11590469 ETH | ||||
| Transfer | 23466527 | 47 days ago | 0.00170168 ETH | ||||
| Transfer | 23466359 | 47 days ago | 0.114203 ETH |
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
LegalXToken
Compiler Version
v0.8.24+commit.e11b9ed9
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2025-03-19
*/
// SPDX-License-Identifier: MIT
pragma solidity 0.8.24;
// lib/openzeppelin-contracts/contracts/utils/Context.sol
// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)
/**
* @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;
}
}
// src/interfaces/IDividendPayingToken.sol
/// @title Dividend-Paying Token Interface
/// @author Roger Wu (https://github.com/roger-wu)
/// @dev An interface for a dividend-paying token contract.
interface DividendPayingTokenInterface {
/// @notice View the amount of dividend in wei that an address can withdraw.
/// @param _owner The address of a token holder.
/// @return The amount of dividend in wei that `_owner` can withdraw.
function dividendOf(address _owner) external view returns (uint256);
/// @notice Withdraws the ether distributed to the sender.
/// @dev SHOULD transfer `dividendOf(msg.sender)` wei to `msg.sender`, and `dividendOf(msg.sender)` SHOULD be 0 after the transfer.
/// MUST emit a `DividendWithdrawn` event if the amount of ether transferred is greater than 0.
function withdrawDividend() external;
/// @dev This event MUST emit when ether is distributed to token holders.
/// @param from The address which sends ether to this contract.
/// @param weiAmount The amount of distributed ether in wei.
event DividendsDistributed(address indexed from, uint256 weiAmount);
/// @dev This event MUST emit when an address withdraws their dividend.
/// @param to The address which withdraws ether from this contract.
/// @param weiAmount The amount of withdrawn ether in wei.
event DividendWithdrawn(address indexed to, uint256 weiAmount);
}
// src/interfaces/IDividendPayingTokenOptional.sol
/// @title Dividend-Paying Token Optional Interface
/// @author Roger Wu (https://github.com/roger-wu)
/// @dev OPTIONAL functions for a dividend-paying token contract.
interface DividendPayingTokenOptionalInterface {
/// @notice View the amount of dividend in wei that an address can withdraw.
/// @param _owner The address of a token holder.
/// @return The amount of dividend in wei that `_owner` can withdraw.
function withdrawableDividendOf(
address _owner
) external view returns (uint256);
/// @notice View the amount of dividend in wei that an address has withdrawn.
/// @param _owner The address of a token holder.
/// @return The amount of dividend in wei that `_owner` has withdrawn.
function withdrawnDividendOf(
address _owner
) external view returns (uint256);
/// @notice View the amount of dividend in wei that an address has earned in total.
/// @dev accumulativeDividendOf(_owner) = withdrawableDividendOf(_owner) + withdrawnDividendOf(_owner)
/// @param _owner The address of a token holder.
/// @return The amount of dividend in wei that `_owner` has earned in total.
function accumulativeDividendOf(
address _owner
) external view returns (uint256);
}
// lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol)
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(
address indexed owner,
address indexed spender,
uint256 value
);
/**
* @dev Returns the value of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the value of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves a `value` amount of tokens from the caller's account to `to`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address to, uint256 value) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(
address owner,
address spender
) external view returns (uint256);
/**
* @dev Sets a `value` amount of tokens as the allowance of `spender` over the
* caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 value) external returns (bool);
/**
* @dev Moves a `value` amount of tokens from `from` to `to` using the
* allowance mechanism. `value` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(
address from,
address to,
uint256 value
) external returns (bool);
}
// src/interfaces/IUniswapV2.sol
interface IUniswapRouter01 {
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);
}
interface IUniswapRouter02 is IUniswapRouter01 {
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;
}
interface IUniswapPair {
event Approval(address indexed owner, address indexed spender, uint value);
event Transfer(address indexed from, address indexed to, uint value);
function name() external pure returns (string memory);
function symbol() external pure returns (string memory);
function decimals() external pure returns (uint8);
function totalSupply() external view returns (uint);
function balanceOf(address owner) external view returns (uint);
function allowance(
address owner,
address spender
) external view returns (uint);
function approve(address spender, uint value) external returns (bool);
function transfer(address to, uint value) external returns (bool);
function transferFrom(
address from,
address to,
uint value
) external returns (bool);
function DOMAIN_SEPARATOR() external view returns (bytes32);
function PERMIT_TYPEHASH() external pure returns (bytes32);
function nonces(address owner) external view returns (uint);
function permit(
address owner,
address spender,
uint value,
uint deadline,
uint8 v,
bytes32 r,
bytes32 s
) external;
event Mint(address indexed sender, uint amount0, uint amount1);
event Burn(
address indexed sender,
uint amount0,
uint amount1,
address indexed to
);
event Swap(
address indexed sender,
uint amount0In,
uint amount1In,
uint amount0Out,
uint amount1Out,
address indexed to
);
event Sync(uint112 reserve0, uint112 reserve1);
function MINIMUM_LIQUIDITY() external pure returns (uint);
function factory() external view returns (address);
function token0() external view returns (address);
function token1() external view returns (address);
function getReserves()
external
view
returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
function price0CumulativeLast() external view returns (uint);
function price1CumulativeLast() external view returns (uint);
function kLast() external view returns (uint);
function mint(address to) external returns (uint liquidity);
function burn(address to) external returns (uint amount0, uint amount1);
function swap(
uint amount0Out,
uint amount1Out,
address to,
bytes calldata data
) external;
function skim(address to) external;
function sync() external;
function initialize(address, address) external;
}
interface IUniswapFactory {
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;
}
// src/IterableMapping.sol
library IterableMapping {
// Iterable mapping from address to uint;
struct Map {
address[] keys;
mapping(address => uint) values;
mapping(address => uint) indexOf;
mapping(address => bool) inserted;
}
function get(Map storage map, address key) public view returns (uint) {
return map.values[key];
}
function getIndexOfKey(
Map storage map,
address key
) public view returns (int) {
if (!map.inserted[key]) {
return -1;
}
return int(map.indexOf[key]);
}
function getKeyAtIndex(
Map storage map,
uint index
) public view returns (address) {
return map.keys[index];
}
function size(Map storage map) public view returns (uint) {
return map.keys.length;
}
function set(Map storage map, address key, uint val) public {
if (map.inserted[key]) {
map.values[key] = val;
} else {
map.inserted[key] = true;
map.values[key] = val;
map.indexOf[key] = map.keys.length;
map.keys.push(key);
}
}
function remove(Map storage map, address key) public {
if (!map.inserted[key]) {
return;
}
delete map.inserted[key];
delete map.values[key];
uint index = map.indexOf[key];
uint lastIndex = map.keys.length - 1;
address lastKey = map.keys[lastIndex];
map.indexOf[lastKey] = index;
delete map.indexOf[key];
map.keys[index] = lastKey;
map.keys.pop();
}
}
// lib/openzeppelin-contracts/contracts/utils/ReentrancyGuard.sol
// OpenZeppelin Contracts (last updated v5.0.0) (utils/ReentrancyGuard.sol)
/**
* @dev Contract module that helps prevent reentrant calls to a function.
*
* Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
* available, which can be applied to functions to make sure there are no nested
* (reentrant) calls to them.
*
* Note that because there is a single `nonReentrant` guard, functions marked as
* `nonReentrant` may not call one another. This can be worked around by making
* those functions `private`, and then adding `external` `nonReentrant` entry
* points to them.
*
* TIP: If you would like to learn more about reentrancy and alternative ways
* to protect against it, check out our blog post
* https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
*/
abstract contract ReentrancyGuard {
// Booleans are more expensive than uint256 or any type that takes up a full
// word because each write operation emits an extra SLOAD to first read the
// slot's contents, replace the bits taken up by the boolean, and then write
// back. This is the compiler's defense against contract upgrades and
// pointer aliasing, and it cannot be disabled.
// The values being non-zero value makes deployment a bit more expensive,
// but in exchange the refund on every call to nonReentrant will be lower in
// amount. Since refunds are capped to a percentage of the total
// transaction's gas, it is best to keep them low in cases like this one, to
// increase the likelihood of the full refund coming into effect.
uint256 private constant NOT_ENTERED = 1;
uint256 private constant ENTERED = 2;
uint256 private _status;
/**
* @dev Unauthorized reentrant call.
*/
error ReentrancyGuardReentrantCall();
constructor() {
_status = NOT_ENTERED;
}
/**
* @dev Prevents a contract from calling itself, directly or indirectly.
* Calling a `nonReentrant` function from another `nonReentrant`
* function is not supported. It is possible to prevent this from happening
* by making the `nonReentrant` function external, and making it call a
* `private` function that does the actual work.
*/
modifier nonReentrant() {
_nonReentrantBefore();
_;
_nonReentrantAfter();
}
function _nonReentrantBefore() private {
// On the first call to nonReentrant, _status will be NOT_ENTERED
if (_status == ENTERED) {
revert ReentrancyGuardReentrantCall();
}
// Any calls to nonReentrant after this point will fail
_status = ENTERED;
}
function _nonReentrantAfter() private {
// By storing the original value once again, a refund is triggered (see
// https://eips.ethereum.org/EIPS/eip-2200)
_status = NOT_ENTERED;
}
/**
* @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a
* `nonReentrant` function in the call stack.
*/
function _reentrancyGuardEntered() internal view returns (bool) {
return _status == ENTERED;
}
}
// lib/openzeppelin-contracts/contracts/interfaces/draft-IERC6093.sol
// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/draft-IERC6093.sol)
/**
* @dev Standard ERC20 Errors
* Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC20 tokens.
*/
interface IERC20Errors {
/**
* @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.
* @param sender Address whose tokens are being transferred.
* @param balance Current balance for the interacting account.
* @param needed Minimum amount required to perform a transfer.
*/
error ERC20InsufficientBalance(
address sender,
uint256 balance,
uint256 needed
);
/**
* @dev Indicates a failure with the token `sender`. Used in transfers.
* @param sender Address whose tokens are being transferred.
*/
error ERC20InvalidSender(address sender);
/**
* @dev Indicates a failure with the token `receiver`. Used in transfers.
* @param receiver Address to which tokens are being transferred.
*/
error ERC20InvalidReceiver(address receiver);
/**
* @dev Indicates a failure with the `spender`’s `allowance`. Used in transfers.
* @param spender Address that may be allowed to operate on tokens without being their owner.
* @param allowance Amount of tokens a `spender` is allowed to operate with.
* @param needed Minimum amount required to perform a transfer.
*/
error ERC20InsufficientAllowance(
address spender,
uint256 allowance,
uint256 needed
);
/**
* @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
* @param approver Address initiating an approval operation.
*/
error ERC20InvalidApprover(address approver);
/**
* @dev Indicates a failure with the `spender` to be approved. Used in approvals.
* @param spender Address that may be allowed to operate on tokens without being their owner.
*/
error ERC20InvalidSpender(address spender);
}
// lib/openzeppelin-contracts/contracts/token/ERC20/extensions/IERC20Metadata.sol
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/IERC20Metadata.sol)
/**
* @dev Interface for the optional metadata functions from the ERC20 standard.
*/
interface IERC20Metadata is IERC20 {
/**
* @dev Returns the name of the token.
*/
function name() external view returns (string memory);
/**
* @dev Returns the symbol of the token.
*/
function symbol() external view returns (string memory);
/**
* @dev Returns the decimals places of the token.
*/
function decimals() external view returns (uint8);
}
// lib/openzeppelin-contracts/contracts/access/Ownable.sol
// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.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);
}
}
// lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/ERC20.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 ERC20
* applications.
*
* Additionally, an {Approval} event is emitted on calls to {transferFrom}.
* This allows applications to reconstruct the allowance for all accounts just
* by listening to said events. Other implementations of the EIP may not emit
* these events, as it isn't required by the specification.
*/
abstract contract ERC20 is Context, IERC20, IERC20Metadata, IERC20Errors {
mapping(address account => uint256) private _balances;
mapping(address account => mapping(address spender => uint256))
private _allowances;
uint256 private _totalSupply;
string private _name;
string private _symbol;
/**
* @dev Sets the values for {name} and {symbol}.
*
* All two of these values are immutable: they can only be set once during
* construction.
*/
constructor(string memory name_, string memory symbol_) {
_name = name_;
_symbol = symbol_;
}
/**
* @dev Returns the name of the token.
*/
function name() public view virtual returns (string memory) {
return _name;
}
/**
* @dev Returns the symbol of the token, usually a shorter version of the
* name.
*/
function symbol() public view virtual returns (string memory) {
return _symbol;
}
/**
* @dev Returns the number of decimals used to get its user representation.
* For example, if `decimals` equals `2`, a balance of `505` tokens should
* be displayed to a user as `5.05` (`505 / 10 ** 2`).
*
* Tokens usually opt for a value of 18, imitating the relationship between
* Ether and Wei. This is the default value returned by this function, unless
* it's overridden.
*
* NOTE: This information is only used for _display_ purposes: it in
* no way affects any of the arithmetic of the contract, including
* {IERC20-balanceOf} and {IERC20-transfer}.
*/
function decimals() public view virtual returns (uint8) {
return 18;
}
/**
* @dev See {IERC20-totalSupply}.
*/
function totalSupply() public view virtual returns (uint256) {
return _totalSupply;
}
/**
* @dev See {IERC20-balanceOf}.
*/
function balanceOf(address account) public view virtual returns (uint256) {
return _balances[account];
}
/**
* @dev See {IERC20-transfer}.
*
* Requirements:
*
* - `to` cannot be the zero address.
* - the caller must have a balance of at least `value`.
*/
function transfer(address to, uint256 value) public virtual returns (bool) {
address owner = _msgSender();
_transfer(owner, to, value);
return true;
}
/**
* @dev See {IERC20-allowance}.
*/
function allowance(
address owner,
address spender
) public view virtual returns (uint256) {
return _allowances[owner][spender];
}
/**
* @dev See {IERC20-approve}.
*
* NOTE: If `value` is the maximum `uint256`, the allowance is not updated on
* `transferFrom`. This is semantically equivalent to an infinite approval.
*
* Requirements:
*
* - `spender` cannot be the zero address.
*/
function approve(
address spender,
uint256 value
) public virtual returns (bool) {
address owner = _msgSender();
_approve(owner, spender, value);
return true;
}
/**
* @dev See {IERC20-transferFrom}.
*
* Emits an {Approval} event indicating the updated allowance. This is not
* required by the EIP. See the note at the beginning of {ERC20}.
*
* NOTE: Does not update the allowance if the current allowance
* is the maximum `uint256`.
*
* Requirements:
*
* - `from` and `to` cannot be the zero address.
* - `from` must have a balance of at least `value`.
* - the caller must have allowance for ``from``'s tokens of at least
* `value`.
*/
function transferFrom(
address from,
address to,
uint256 value
) public virtual returns (bool) {
address spender = _msgSender();
_spendAllowance(from, spender, value);
_transfer(from, to, value);
return true;
}
/**
* @dev Moves a `value` amount of tokens from `from` to `to`.
*
* This internal function is equivalent to {transfer}, and can be used to
* e.g. implement automatic token fees, slashing mechanisms, etc.
*
* Emits a {Transfer} event.
*
* NOTE: This function is not virtual, {_update} should be overridden instead.
*/
function _transfer(address from, address to, uint256 value) internal {
if (from == address(0)) {
revert ERC20InvalidSender(address(0));
}
if (to == address(0)) {
revert ERC20InvalidReceiver(address(0));
}
_update(from, to, value);
}
/**
* @dev Transfers a `value` amount of tokens from `from` to `to`, or alternatively mints (or burns) if `from`
* (or `to`) is the zero address. All customizations to transfers, mints, and burns should be done by overriding
* this function.
*
* Emits a {Transfer} event.
*/
function _update(address from, address to, uint256 value) internal virtual {
if (from == address(0)) {
// Overflow check required: The rest of the code assumes that totalSupply never overflows
_totalSupply += value;
} else {
uint256 fromBalance = _balances[from];
if (fromBalance < value) {
revert ERC20InsufficientBalance(from, fromBalance, value);
}
unchecked {
// Overflow not possible: value <= fromBalance <= totalSupply.
_balances[from] = fromBalance - value;
}
}
if (to == address(0)) {
unchecked {
// Overflow not possible: value <= totalSupply or value <= fromBalance <= totalSupply.
_totalSupply -= value;
}
} else {
unchecked {
// Overflow not possible: balance + value is at most totalSupply, which we know fits into a uint256.
_balances[to] += value;
}
}
emit Transfer(from, to, value);
}
/**
* @dev Creates a `value` amount of tokens and assigns them to `account`, by transferring it from address(0).
* Relies on the `_update` mechanism
*
* Emits a {Transfer} event with `from` set to the zero address.
*
* NOTE: This function is not virtual, {_update} should be overridden instead.
*/
function _mint(address account, uint256 value) internal {
if (account == address(0)) {
revert ERC20InvalidReceiver(address(0));
}
_update(address(0), account, value);
}
/**
* @dev Destroys a `value` amount of tokens from `account`, lowering the total supply.
* Relies on the `_update` mechanism.
*
* Emits a {Transfer} event with `to` set to the zero address.
*
* NOTE: This function is not virtual, {_update} should be overridden instead
*/
function _burn(address account, uint256 value) internal {
if (account == address(0)) {
revert ERC20InvalidSender(address(0));
}
_update(account, address(0), value);
}
/**
* @dev Sets `value` as the allowance of `spender` over the `owner` s tokens.
*
* This internal function is equivalent to `approve`, and can be used to
* e.g. set automatic allowances for certain subsystems, etc.
*
* Emits an {Approval} event.
*
* Requirements:
*
* - `owner` cannot be the zero address.
* - `spender` cannot be the zero address.
*
* Overrides to this logic should be done to the variant with an additional `bool emitEvent` argument.
*/
function _approve(address owner, address spender, uint256 value) internal {
_approve(owner, spender, value, true);
}
/**
* @dev Variant of {_approve} with an optional flag to enable or disable the {Approval} event.
*
* By default (when calling {_approve}) the flag is set to true. On the other hand, approval changes made by
* `_spendAllowance` during the `transferFrom` operation set the flag to false. This saves gas by not emitting any
* `Approval` event during `transferFrom` operations.
*
* Anyone who wishes to continue emitting `Approval` events on the`transferFrom` operation can force the flag to
* true using the following override:
* ```
* function _approve(address owner, address spender, uint256 value, bool) internal virtual override {
* super._approve(owner, spender, value, true);
* }
* ```
*
* Requirements are the same as {_approve}.
*/
function _approve(
address owner,
address spender,
uint256 value,
bool emitEvent
) internal virtual {
if (owner == address(0)) {
revert ERC20InvalidApprover(address(0));
}
if (spender == address(0)) {
revert ERC20InvalidSpender(address(0));
}
_allowances[owner][spender] = value;
if (emitEvent) {
emit Approval(owner, spender, value);
}
}
/**
* @dev Updates `owner` s allowance for `spender` based on spent `value`.
*
* Does not update the allowance value in case of infinite allowance.
* Revert if not enough allowance is available.
*
* Does not emit an {Approval} event.
*/
function _spendAllowance(
address owner,
address spender,
uint256 value
) internal virtual {
uint256 currentAllowance = allowance(owner, spender);
if (currentAllowance != type(uint256).max) {
if (currentAllowance < value) {
revert ERC20InsufficientAllowance(
spender,
currentAllowance,
value
);
}
unchecked {
_approve(owner, spender, currentAllowance - value, false);
}
}
}
}
// src/DividendPayingToken.sol
/// @title Dividend-Paying Token
/// @author Roger Wu (https://github.com/roger-wu)
/// @dev A mintable ERC20 token that allows anyone to pay and distribute ether
/// to token holders as dividends and allows token holders to withdraw their dividends.
contract DividendPayingToken is
ERC20,
Ownable,
DividendPayingTokenInterface,
DividendPayingTokenOptionalInterface
{
//------------------------------------------------------
// ERRORS
//------------------------------------------------------
error DividendTracker__NoSupply();
error DividendTracker__DividendCorrectionOverflow();
error DividendTracker__InvalidRewardToken();
error DividendTracker__DividendCorrectionUnderflow();
error DividendTracker__ClaimWaitOutOfRange();
error DividendTracker__InvalidAccount();
//------------------------------------------------------
// State Variables
//------------------------------------------------------
// About dividendCorrection:
// If the token balance of a `_user` is never changed, the dividend of `_user` can be computed with:
// `dividendOf(_user) = dividendPerShare * balanceOf(_user)`.
// When `balanceOf(_user)` is changed (via minting/burning/transferring tokens),
// `dividendOf(_user)` should not be changed,
// but the computed value of `dividendPerShare * balanceOf(_user)` is changed.
// To keep the `dividendOf(_user)` unchanged, we add a correction term:
// `dividendOf(_user) = dividendPerShare * balanceOf(_user) + dividendCorrectionOf(_user)`,
// where `dividendCorrectionOf(_user)` is updated whenever `balanceOf(_user)` is changed:
// `dividendCorrectionOf(_user) = dividendPerShare * (old balanceOf(_user)) - (new balanceOf(_user))`.
// So now `dividendOf(_user)` returns the same value before and after `balanceOf(_user)` is changed.
mapping(address => int256) internal magnifiedDividendCorrections;
mapping(address => uint256) internal withdrawnDividends;
uint256 public totalDividendsDistributed;
// With `magnitude`, we can properly distribute dividends even if the amount of received ether is small.
// For more discussion about choosing the value of `magnitude`,
// see https://github.com/ethereum/EIPs/issues/1726#issuecomment-472352728
uint256 internal constant magnitude = 2 ** 128;
uint256 internal magnifiedDividendPerShare;
// Addresses 160 bits
address public immutable RewardToken;
constructor(
string memory _name,
string memory _symbol,
address _rewardToken
) ERC20(_name, _symbol) Ownable(msg.sender) {
RewardToken = _rewardToken;
}
receive() external payable {
if (RewardToken != address(0))
revert DividendTracker__InvalidRewardToken();
}
function distributeDividends(uint256 amount) public onlyOwner {
if (totalSupply() == 0) {
revert DividendTracker__NoSupply();
}
if (amount > 0) {
magnifiedDividendPerShare += (amount * magnitude) / totalSupply();
emit DividendsDistributed(msg.sender, amount);
totalDividendsDistributed += amount;
}
}
/// @notice Withdraws the ether distributed to the sender.
/// @dev It emits a `DividendWithdrawn` event if the amount of withdrawn ether is greater than 0.
function withdrawDividend() public virtual override {
_withdrawDividendOfUser(payable(msg.sender));
}
/// @notice Withdraws the ether distributed to the sender.
/// @dev It emits a `DividendWithdrawn` event if the amount of withdrawn ether is greater than 0.
function _withdrawDividendOfUser(
address payable user
) internal returns (uint256) {
uint256 _withdrawableDividend = withdrawableDividendOf(user);
if (_withdrawableDividend > 0) {
withdrawnDividends[user] += _withdrawableDividend;
if (RewardToken == address(0)) {
(bool success, ) = user.call{value: _withdrawableDividend}("");
if (!success) {
withdrawnDividends[user] -= _withdrawableDividend;
return 0;
}
} else {
IERC20(RewardToken).transfer(user, _withdrawableDividend);
}
emit DividendWithdrawn(user, _withdrawableDividend);
return _withdrawableDividend;
}
return 0;
}
/// @notice View the amount of dividend in wei that an address can withdraw.
/// @param _owner The address of a token holder.
/// @return The amount of dividend in wei that `_owner` can withdraw.
function dividendOf(address _owner) public view override returns (uint256) {
return withdrawableDividendOf(_owner);
}
/// @notice View the amount of dividend in wei that an address can withdraw.
/// @param _owner The address of a token holder.
/// @return The amount of dividend in wei that `_owner` can withdraw.
function withdrawableDividendOf(
address _owner
) public view override returns (uint256) {
return accumulativeDividendOf(_owner) - withdrawnDividends[_owner];
}
/// @notice View the amount of dividend in wei that an address has withdrawn.
/// @param _owner The address of a token holder.
/// @return The amount of dividend in wei that `_owner` has withdrawn.
function withdrawnDividendOf(
address _owner
) public view override returns (uint256) {
return withdrawnDividends[_owner];
}
/// @notice View the amount of dividend in wei that an address has earned in total.
/// @dev accumulativeDividendOf(_owner) = withdrawableDividendOf(_owner) + withdrawnDividendOf(_owner)
/// = (magnifiedDividendPerShare * balanceOf(_owner) + magnifiedDividendCorrections[_owner]) / magnitude
/// @param _owner The address of a token holder.
/// @return The amount of dividend in wei that `_owner` has earned in total.
function accumulativeDividendOf(
address _owner
) public view override returns (uint256) {
int256 valCorrection = int256(
magnifiedDividendPerShare * balanceOf(_owner)
);
if (valCorrection < 0) {
revert DividendTracker__DividendCorrectionOverflow();
}
valCorrection += magnifiedDividendCorrections[_owner];
if (valCorrection < 0) {
revert DividendTracker__DividendCorrectionUnderflow();
}
uint256 fullCorrection = uint256(valCorrection);
return fullCorrection / magnitude;
}
/// @dev Internal function that mints tokens to an account.
/// Update magnifiedDividendCorrections to keep dividends unchanged.
/// @param account The account that will receive the created tokens.
/// @param value The amount that will be created.
function mintBalance(address account, uint256 value) internal {
if (account == address(0)) {
revert DividendTracker__InvalidAccount();
}
super._update(address(0), account, value);
int256 magVal = int256(magnifiedDividendPerShare * value);
if (magVal < 0) {
revert DividendTracker__DividendCorrectionOverflow();
}
magnifiedDividendCorrections[account] -= magVal;
}
/// @dev Internal function that burns an amount of the token of a given account.
/// Update magnifiedDividendCorrections to keep dividends unchanged.
/// @param account The account whose tokens will be burnt.
/// @param value The amount that will be burnt.
function burnBalance(address account, uint256 value) internal {
if (account == address(0)) {
revert DividendTracker__InvalidAccount();
}
super._update(account, address(0), value);
int256 magVal = int256(magnifiedDividendPerShare * value);
if (magVal < 0) {
revert DividendTracker__DividendCorrectionOverflow();
}
magnifiedDividendCorrections[account] += magVal;
}
function _setBalance(address account, uint256 newBalance) internal {
uint256 currentBalance = balanceOf(account);
if (newBalance > currentBalance) {
uint256 mintAmount = newBalance - currentBalance;
mintBalance(account, mintAmount);
} else if (newBalance < currentBalance) {
uint256 burnAmount = currentBalance - newBalance;
burnBalance(account, burnAmount);
}
}
}
// src/DividendTracker.sol
contract DividendTracker is Ownable, DividendPayingToken {
//---------------------------------------------------------------
// Errors
//---------------------------------------------------------------
error DividendTracker__TransferNotAllowed();
error DividendTracker__WithdrawDisabled();
//---------------------------------------------------------------
// State Variables
//---------------------------------------------------------------
using IterableMapping for IterableMapping.Map;
IterableMapping.Map private tokenHoldersMap;
mapping(address => bool) public excludedFromDividends;
mapping(address => uint256) public lastClaimTimes;
uint256 public lastProcessedIndex;
uint256 public claimWait;
uint256 public immutable minimumTokenBalanceForDividends;
//---------------------------------------------------------------
// Events
//---------------------------------------------------------------
event ExcludeFromDividends(address indexed account);
event ClaimWaitUpdated(uint256 indexed newValue, uint256 indexed oldValue);
event Claim(
address indexed account,
uint256 amount,
bool indexed automatic
);
//---------------------------------------------------------------
// Constructor
//---------------------------------------------------------------
constructor(
string memory allName,
uint minTokenHold,
address _rewardToken
) DividendPayingToken(allName, allName, _rewardToken) {
claimWait = 300;
minimumTokenBalanceForDividends = minTokenHold;
}
function withdrawDividend() public pure override {
revert DividendTracker__WithdrawDisabled();
}
function excludeFromDividends(address account) external onlyOwner {
excludedFromDividends[account] = true;
_setBalance(account, 0);
tokenHoldersMap.remove(account);
emit ExcludeFromDividends(account);
}
function updateClaimWait(uint256 newClaimWait) external onlyOwner {
if (newClaimWait < 1 minutes || newClaimWait > 1 days) {
revert DividendTracker__ClaimWaitOutOfRange();
}
emit ClaimWaitUpdated(newClaimWait, claimWait);
claimWait = newClaimWait;
}
function getLastProcessedIndex() external view returns (uint256) {
return lastProcessedIndex;
}
function getNumberOfTokenHolders() external view returns (uint256) {
return tokenHoldersMap.keys.length;
}
function getAccount(
address _account
)
public
view
returns (
address account,
int256 index,
int256 iterationsUntilProcessed,
uint256 withdrawableDividends,
uint256 totalDividends,
uint256 lastClaimTime,
uint256 nextClaimTime,
uint256 secondsUntilAutoClaimAvailable
)
{
account = _account;
index = tokenHoldersMap.getIndexOfKey(account);
iterationsUntilProcessed = -1;
if (index >= 0) {
if (uint256(index) > lastProcessedIndex) {
iterationsUntilProcessed = index - int256(lastProcessedIndex);
} else {
uint256 processesUntilEndOfArray = tokenHoldersMap.keys.length >
lastProcessedIndex
? tokenHoldersMap.keys.length - lastProcessedIndex
: 0;
iterationsUntilProcessed =
index +
int256(processesUntilEndOfArray);
}
}
withdrawableDividends = withdrawableDividendOf(account);
totalDividends = accumulativeDividendOf(account);
lastClaimTime = lastClaimTimes[account];
nextClaimTime = lastClaimTime > 0 ? lastClaimTime + claimWait : 0;
secondsUntilAutoClaimAvailable = nextClaimTime > block.timestamp
? nextClaimTime - block.timestamp
: 0;
}
function getAccountAtIndex(
uint256 index
)
public
view
returns (
address,
int256,
int256,
uint256,
uint256,
uint256,
uint256,
uint256
)
{
if (index >= tokenHoldersMap.size()) {
return (
0x0000000000000000000000000000000000000000,
-1,
-1,
0,
0,
0,
0,
0
);
}
address account = tokenHoldersMap.getKeyAtIndex(index);
return getAccount(account);
}
function canAutoClaim(uint256 lastClaimTime) private view returns (bool) {
if (lastClaimTime > block.timestamp) {
return false;
}
return block.timestamp - (lastClaimTime) >= claimWait;
}
function setBalance(
address payable account,
uint256 newBalance,
bool autoDistribute
) external onlyOwner {
if (excludedFromDividends[account]) {
return;
}
if (newBalance >= minimumTokenBalanceForDividends) {
_setBalance(account, newBalance);
tokenHoldersMap.set(account, newBalance);
} else {
_setBalance(account, 0);
tokenHoldersMap.remove(account);
}
if (autoDistribute) {
processAccount(account, true);
}
}
function process(uint256 gas) public returns (uint256, uint256, uint256) {
uint256 numberOfTokenHolders = tokenHoldersMap.keys.length;
if (numberOfTokenHolders == 0) {
return (0, 0, lastProcessedIndex);
}
uint256 _lastProcessedIndex = lastProcessedIndex;
uint256 gasUsed = 0;
uint256 gasLeft = gasleft();
uint256 iterations = 0;
uint256 claims = 0;
while (gasUsed < gas && iterations < numberOfTokenHolders) {
_lastProcessedIndex++;
if (_lastProcessedIndex >= tokenHoldersMap.keys.length) {
_lastProcessedIndex = 0;
}
address account = tokenHoldersMap.keys[_lastProcessedIndex];
if (canAutoClaim(lastClaimTimes[account])) {
if (processAccount(payable(account), true)) {
claims++;
}
}
iterations++;
uint256 newGasLeft = gasleft();
if (gasLeft > newGasLeft) {
gasUsed += gasLeft - newGasLeft;
}
gasLeft = newGasLeft;
}
lastProcessedIndex = _lastProcessedIndex;
return (iterations, claims, lastProcessedIndex);
}
function processAccount(
address payable account,
bool automatic
) public onlyOwner returns (bool) {
uint256 amount = _withdrawDividendOfUser(account);
if (amount > 0) {
lastClaimTimes[account] = block.timestamp;
emit Claim(account, amount, automatic);
return true;
}
return false;
}
}
// src/LegalXToken.sol
/**
* @title LegalXToken
* @dev ERC20 token with dividend distribution capabilities
* Holders receive dividends in the form of the token itself
* Includes fee mechanism for marketing and rewards
*/
contract LegalXToken is ERC20, Ownable, ReentrancyGuard {
//----------------------------------------------
// ERRORS
//----------------------------------------------
error LEGALX__DividendTrackerOwnerMismatch();
error LEGALX__InvalidMarketingWallet();
error LEGALX__CannotRemoveMainUniswapPair();
error LEGALX__GasForProcessingOutOfRange();
error LEGALX__SwapTokensAmountTooHigh();
//----------------------------------------------
// State Variables
//----------------------------------------------
// Mappings
mapping(address => bool) public lpPairs;
mapping(address => bool) private _isExcludedFromFees;
// Public High Variables
// 256 bits
// Amount of Tokens before a swap occurs
uint256 public swapTokensAtAmount;
// 5% taxes
uint256 public rewardTokenFee = 2;
uint256 public marketingFee = 3;
uint256 public totalFees = 5;
// use by default 300,000 gas to process auto-claiming dividends
uint256 public gasForProcessing = 300_000;
// 160 bits
IUniswapRouter02 public uniswapV2Router;
address public uniswapV2Pair;
DividendTracker public dividendTracker;
address public deadWallet = 0x000000000000000000000000000000000000dEaD;
address public _marketingWalletAddress;
address public WETH;
// Private and others
uint8 private swapping = 1;
//CONSTANTS
uint256 private constant PERCENTAGE = 100;
uint256 private constant MAX_SWAP_PERCENTAGE = 1;
//----------------------------------------------
// Events
//----------------------------------------------
event UpdateDividendTracker(
address indexed newAddress,
address indexed oldAddress
);
event UpdateUniswapV2Router(
address indexed newAddress,
address indexed oldAddress
);
event ExcludeFromFees(address indexed account, bool isExcluded);
event ExcludeMultipleAccountsFromFees(address[] accounts, bool isExcluded);
event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value);
event GasForProcessingUpdated(
uint256 indexed newValue,
uint256 indexed oldValue
);
event SendDividends(uint256 tokensSwapped, uint256 amount);
event ProcessedDividendTracker(
uint256 iterations,
uint256 claims,
uint256 lastProcessedIndex,
bool indexed automatic,
uint256 gas,
address indexed processor
);
event SwapTokensAtAmountUpdated(
uint256 indexed newValue,
uint256 indexed oldValue
);
//----------------------------------------------
// Constructor
//----------------------------------------------
/**
* @notice Initializes the LegalXToken contract
* @dev Sets up the token with initial supply, dividend tracker, and Uniswap integration
* @param _marketingWallet Address where marketing fees will be sent
*/
constructor(
address _marketingWallet
) ERC20("LegalX", "LEGAL") Ownable((msg.sender)) {
_marketingWalletAddress = _marketingWallet;
uint TOTAL_SUPPLY = 1_000_000_000 ether;
dividendTracker = new DividendTracker(
"LEGALX_Tracker",
TOTAL_SUPPLY / 100_000, // 0.001%,
address(this)
);
swapTokensAtAmount = TOTAL_SUPPLY / 100_00; // 0.01%
//IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(0xD99D1c33F9fC3444f8101754aBC46c52416550D1); // TestNet
IUniswapRouter02 _uniswapV2Router = IUniswapRouter02(
0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
); // MainNet
WETH = _uniswapV2Router.WETH();
// Create a uniswap pair for this new token
address _uniswapV2Pair = IUniswapFactory(_uniswapV2Router.factory())
.createPair(address(this), _uniswapV2Router.WETH());
uniswapV2Router = _uniswapV2Router;
uniswapV2Pair = _uniswapV2Pair;
_setAutomatedMarketMakerPair(_uniswapV2Pair, true);
// exclude from receiving dividends
dividendTracker.excludeFromDividends(address(dividendTracker));
dividendTracker.excludeFromDividends(address(this));
dividendTracker.excludeFromDividends(deadWallet);
dividendTracker.excludeFromDividends(address(_uniswapV2Router));
// exclude from paying fees
excludeFromFees(owner(), true);
excludeFromFees(_marketingWalletAddress, true);
excludeFromFees(address(this), true);
_mint(owner(), TOTAL_SUPPLY);
}
/**
* @notice Fallback function to receive ETH
* @dev Required for receiving ETH from Uniswap router when swapping tokens
*/
receive() external payable {}
/**
* @notice Updates the dividend tracker contract
* @dev Replaces the current dividend tracker with a new one
* @param newAddress Address of the new dividend tracker contract
*/
function updateDividendTracker(address newAddress) public onlyOwner {
DividendTracker newDividendTracker = DividendTracker(
payable(newAddress)
);
if (newDividendTracker.owner() != address(this)) {
revert LEGALX__DividendTrackerOwnerMismatch();
}
newDividendTracker.excludeFromDividends(address(newDividendTracker));
newDividendTracker.excludeFromDividends(address(this));
newDividendTracker.excludeFromDividends(owner());
newDividendTracker.excludeFromDividends(address(uniswapV2Router));
emit UpdateDividendTracker(newAddress, address(dividendTracker));
dividendTracker = newDividendTracker;
}
/**
* @notice Excludes or includes an account from fees
* @dev Allows owner to set fee exemption status for an address
* @param account Address to modify fee exemption status
* @param excluded True to exclude from fees, false to include
*/
function excludeFromFees(address account, bool excluded) public onlyOwner {
_isExcludedFromFees[account] = excluded;
emit ExcludeFromFees(account, excluded);
}
/**
* @notice Excludes or includes multiple accounts from fees
* @dev Batch operation to set fee exemption status for multiple addresses
* @param accounts Array of addresses to modify fee exemption status
* @param excluded True to exclude from fees, false to include
*/
function excludeMultipleAccountsFromFees(
address[] calldata accounts,
bool excluded
) public onlyOwner {
for (uint256 i = 0; i < accounts.length; i++) {
_isExcludedFromFees[accounts[i]] = excluded;
}
emit ExcludeMultipleAccountsFromFees(accounts, excluded);
}
/**
* @notice Sets the marketing wallet address
* @dev Updates the address where marketing fees are sent
* @param wallet New marketing wallet address
*/
function setMarketingWallet(address payable wallet) external onlyOwner {
if (wallet == address(0)) {
revert LEGALX__InvalidMarketingWallet();
}
_marketingWalletAddress = wallet;
}
/**
* @notice Sets the reward token fee percentage
* @dev Updates the percentage of fees allocated to rewards
* @param value New reward token fee percentage
*/
function setRewardTokenFee(uint256 value) external onlyOwner {
rewardTokenFee = value;
totalFees = rewardTokenFee + marketingFee;
}
/**
* @notice Sets the marketing fee percentage
* @dev Updates the percentage of fees allocated to marketing
* @param value New marketing fee percentage
*/
function setMarketingFee(uint256 value) external onlyOwner {
marketingFee = value;
totalFees = rewardTokenFee + marketingFee;
}
/**
* @notice Sets an address as an automated market maker pair
* @dev Marks or unmarks an address as a liquidity pair
* @param pair Address of the liquidity pair
* @param value True to mark as LP, false to unmark
*/
function setAutomatedMarketMakerPair(
address pair,
bool value
) public onlyOwner {
if (pair == uniswapV2Pair) revert LEGALX__CannotRemoveMainUniswapPair();
_setAutomatedMarketMakerPair(pair, value);
}
/**
* @notice Internal function to set an address as an automated market maker pair
* @dev Updates the lpPairs mapping and excludes the pair from dividends if marked as LP
* @param pair Address of the liquidity pair
* @param value True to mark as LP, false to unmark
*/
function _setAutomatedMarketMakerPair(address pair, bool value) private {
lpPairs[pair] = value;
if (value) {
dividendTracker.excludeFromDividends(pair);
}
emit SetAutomatedMarketMakerPair(pair, value);
}
/**
* @notice Updates the gas limit for processing dividends
* @dev Sets how much gas can be used for dividend processing
* @param newValue New gas limit for processing dividends
*/
function updateGasForProcessing(uint256 newValue) public onlyOwner {
if (newValue < 200000 || newValue > 500000) {
revert LEGALX__GasForProcessingOutOfRange();
}
emit GasForProcessingUpdated(newValue, gasForProcessing);
gasForProcessing = newValue;
}
/**
* @notice Updates the claim wait time in the dividend tracker
* @dev Sets how long users must wait between dividend claims
* @param claimWait New wait time in seconds
*/
function updateClaimWait(uint256 claimWait) external onlyOwner {
dividendTracker.updateClaimWait(claimWait);
}
/**
* @notice Gets the current claim wait time
* @dev Returns how long users must wait between dividend claims
* @return Current wait time in seconds
*/
function getClaimWait() external view returns (uint256) {
return dividendTracker.claimWait();
}
/**
* @notice Gets the total amount of dividends distributed
* @dev Returns the cumulative amount of dividends paid out
* @return Total dividends distributed
*/
function getTotalDividendsDistributed() external view returns (uint256) {
return dividendTracker.totalDividendsDistributed();
}
/**
* @notice Checks if an account is excluded from fees
* @dev Returns the fee exemption status of an address
* @param account Address to check
* @return True if excluded from fees, false otherwise
*/
function isExcludedFromFees(address account) public view returns (bool) {
return _isExcludedFromFees[account];
}
/**
* @notice Gets the withdrawable dividend amount for an account
* @dev Returns how many dividends an address can claim
* @param account Address to check
* @return Amount of withdrawable dividends
*/
function withdrawableDividendOf(
address account
) public view returns (uint256) {
return dividendTracker.withdrawableDividendOf(account);
}
/**
* @notice Gets the dividend token balance of an account
* @dev Returns the balance used for dividend calculations
* @param account Address to check
* @return Dividend token balance
*/
function dividendTokenBalanceOf(
address account
) public view returns (uint256) {
return dividendTracker.balanceOf(account);
}
/**
* @notice Excludes an account from receiving dividends
* @dev Prevents an address from receiving dividends
* @param account Address to exclude
*/
function excludeFromDividends(address account) external onlyOwner {
dividendTracker.excludeFromDividends(account);
}
/**
* @notice Gets detailed dividend information for an account
* @dev Returns comprehensive dividend data for an address
* @param account Address to get information for
* @return Tuple containing dividend account information
*/
function getAccountDividendsInfo(
address account
)
external
view
returns (
address,
int256,
int256,
uint256,
uint256,
uint256,
uint256,
uint256
)
{
return dividendTracker.getAccount(account);
}
/**
* @notice Gets dividend information for an account by index
* @dev Returns dividend data for an address at a specific index
* @param index Index in the dividend tracker's array
* @return Tuple containing dividend account information
*/
function getAccountDividendsInfoAtIndex(
uint256 index
)
external
view
returns (
address,
int256,
int256,
uint256,
uint256,
uint256,
uint256,
uint256
)
{
return dividendTracker.getAccountAtIndex(index);
}
/**
* @notice Processes dividend distributions manually
* @dev Allows external triggering of dividend processing
* @param gas Amount of gas to use for processing
*/
function processDividendTracker(uint256 gas) external {
(
uint256 iterations,
uint256 claims,
uint256 lastProcessedIndex
) = dividendTracker.process(gas);
emit ProcessedDividendTracker(
iterations,
claims,
lastProcessedIndex,
false,
gas,
msg.sender
);
}
/**
* @notice Claims dividends for the caller
* @dev Processes dividend account for the message sender
*/
function claim() external {
dividendTracker.processAccount(payable(msg.sender), false);
}
/**
* @notice Gets the last processed index in the dividend tracker
* @dev Returns the index of the last account processed for dividends
* @return Last processed index
*/
function getLastProcessedIndex() external view returns (uint256) {
return dividendTracker.getLastProcessedIndex();
}
/**
* @notice Gets the number of dividend token holders
* @dev Returns the count of accounts eligible for dividends
* @return Number of dividend token holders
*/
function getNumberOfDividendTokenHolders() external view returns (uint256) {
return dividendTracker.getNumberOfTokenHolders();
}
/**
* @notice Overrides the ERC20 _update function to implement fees and dividend tracking
* @dev Handles fee collection, swapping, and dividend distribution during transfers
* @param from Address sending tokens
* @param to Address receiving tokens
* @param amount Amount of tokens being transferred
*/
function _update(
address from,
address to,
uint256 amount
) internal override {
if (amount == 0) {
super._update(from, to, 0);
return;
}
uint256 contractTokenBalance = balanceOf(address(this));
bool canSwap = contractTokenBalance >= swapTokensAtAmount;
bool takeFee = swapping == 1;
bool isSwap = lpPairs[from] || lpPairs[to];
if (
canSwap &&
takeFee &&
!lpPairs[from] &&
from != owner() &&
to != owner() &&
from != address(dividendTracker) &&
to != address(dividendTracker)
) {
swapping <<= 1;
// Swap and send to Dividends & Marketing
swapAndProcessTokens(contractTokenBalance);
swapping >>= 1;
}
// if any account belongs to _isExcludedFromFee account then remove the fee
if (_isExcludedFromFees[from] || _isExcludedFromFees[to] || !isSwap) {
takeFee = false;
}
if (takeFee) {
uint256 allFees = (amount * totalFees) / PERCENTAGE;
amount -= allFees;
super._update(from, address(this), allFees);
}
super._update(from, to, amount);
try
dividendTracker.setBalance(payable(from), balanceOf(from), true)
{} catch {}
try
dividendTracker.setBalance(payable(to), balanceOf(to), true)
{} catch {}
if (swapping == 1) {
uint256 gas = gasForProcessing;
swapping <<= 1;
try dividendTracker.process(gas) returns (
uint256 iterations,
uint256 claims,
uint256 lastProcessedIndex
) {
emit ProcessedDividendTracker(
iterations,
claims,
lastProcessedIndex,
true,
gas,
tx.origin
);
} catch {}
swapping >>= 1;
}
}
/**
* @notice Processes collected fees by swapping tokens and distributing rewards
* @dev Splits fees between marketing and rewards, swaps tokens for ETH, and distributes dividends
* @param contractBalance Amount of tokens to process
*/
function swapAndProcessTokens(
uint256 contractBalance
) private nonReentrant {
// Calculate the amounts for marketing and rewards
uint mktAmount = (contractBalance * marketingFee) /
(marketingFee + rewardTokenFee);
uint rewardAmount = contractBalance - mktAmount;
// Send the reward amount directly to the dividend tracker
_transfer(address(this), address(dividendTracker), rewardAmount);
// Only swap the marketing amount to ETH
swapTokensForETH(mktAmount);
// Distribute dividends
dividendTracker.distributeDividends(rewardAmount);
emit SendDividends(contractBalance, rewardAmount);
}
/**
* @notice Swaps tokens for ETH using Uniswap
* @dev Uses Uniswap router to exchange tokens for ETH
* @param tokenAmount Amount of tokens to swap
*/
function swapTokensForETH(uint256 tokenAmount) private {
// generate the uniswap pair path of token -> weth
address[] memory path = new address[](2);
path[0] = address(this);
path[1] = WETH;
_approve(address(this), address(uniswapV2Router), tokenAmount);
// make the swap
uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
tokenAmount,
0, // accept any amount of ETH
path,
address(this),
block.timestamp
);
}
/**
* @notice Updates the swapTokensAtAmount value
* @dev The new value cannot exceed 1% of the total supply
* @param newAmount The new amount to set for swapTokensAtAmount
*/
function updateSwapTokensAtAmount(uint256 newAmount) external onlyOwner {
uint256 maxAmount = totalSupply() / 100; // 1% of total supply
if (newAmount > maxAmount) {
revert LEGALX__SwapTokensAmountTooHigh();
}
emit SwapTokensAtAmountUpdated(newAmount, swapTokensAtAmount);
swapTokensAtAmount = newAmount;
}
function withdrawMarketingFunds() external nonReentrant {
if (msg.sender != _marketingWalletAddress && msg.sender != owner()) {
revert LEGALX__InvalidMarketingWallet();
}
uint256 amount = address(this).balance;
require(amount > 0, "No funds to withdraw");
// Transfer the funds
(bool success, ) = payable(_marketingWalletAddress).call{value: amount}(
""
);
require(success, "ETH transfer failed");
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_marketingWallet","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":[],"name":"LEGALX__CannotRemoveMainUniswapPair","type":"error"},{"inputs":[],"name":"LEGALX__DividendTrackerOwnerMismatch","type":"error"},{"inputs":[],"name":"LEGALX__GasForProcessingOutOfRange","type":"error"},{"inputs":[],"name":"LEGALX__InvalidMarketingWallet","type":"error"},{"inputs":[],"name":"LEGALX__SwapTokensAmountTooHigh","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"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":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address[]","name":"accounts","type":"address[]"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeMultipleAccountsFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"newValue","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"oldValue","type":"uint256"}],"name":"GasForProcessingUpdated","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":false,"internalType":"uint256","name":"iterations","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"claims","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lastProcessedIndex","type":"uint256"},{"indexed":true,"internalType":"bool","name":"automatic","type":"bool"},{"indexed":false,"internalType":"uint256","name":"gas","type":"uint256"},{"indexed":true,"internalType":"address","name":"processor","type":"address"}],"name":"ProcessedDividendTracker","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"SendDividends","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pair","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"SetAutomatedMarketMakerPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"newValue","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"oldValue","type":"uint256"}],"name":"SwapTokensAtAmountUpdated","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"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdateDividendTracker","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdateUniswapV2Router","type":"event"},{"inputs":[],"name":"WETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_marketingWalletAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"deadWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"dividendTokenBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dividendTracker","outputs":[{"internalType":"contract DividendTracker","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeMultipleAccountsFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"gasForProcessing","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getAccountDividendsInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getAccountDividendsInfoAtIndex","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getClaimWait","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLastProcessedIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNumberOfDividendTokenHolders","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalDividendsDistributed","outputs":[{"internalType":"uint256","name":"","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":"","type":"address"}],"name":"lpPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingFee","outputs":[{"internalType":"uint256","name":"","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":[{"internalType":"uint256","name":"gas","type":"uint256"}],"name":"processDividendTracker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardTokenFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"setMarketingFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"wallet","type":"address"}],"name":"setMarketingWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"setRewardTokenFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapTokensAtAmount","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":"totalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapRouter02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"claimWait","type":"uint256"}],"name":"updateClaimWait","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"updateDividendTracker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"updateGasForProcessing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"updateSwapTokensAtAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawMarketingFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"withdrawableDividendOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]Contract Creation Code
60806040526002600a556003600b556005600c55620493e0600d5561dead60115f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001601360146101000a81548160ff021916908360ff16021790555034801562000084575f80fd5b5060405162009d9938038062009d998339818101604052810190620000aa919062001cd6565b336040518060400160405280600681526020017f4c6567616c5800000000000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f4c4547414c000000000000000000000000000000000000000000000000000000815250816003908162000128919062001f6a565b5080600490816200013a919062001f6a565b5050505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603620001b0575f6040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401620001a791906200205f565b60405180910390fd5b620001c1816200087460201b60201c565b5060016006819055508060125f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505f6b033b2e3c9fd0803ce80000009050620186a0816200022b9190620020d4565b306040516200023a9062001c63565b620002479291906200217a565b604051809103905ff08015801562000261573d5f803e3d5ffd5b5060105f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061271081620002b19190620020d4565b6009819055505f737a250d5630b4cf539739df2c5dacb4c659f2488d90508073ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000319573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200033f919062001cd6565b60135f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505f8173ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015620003c9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620003ef919062001cd6565b73ffffffffffffffffffffffffffffffffffffffff1663c9c65396308473ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000455573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200047b919062001cd6565b6040518363ffffffff1660e01b81526004016200049a929190620021ba565b6020604051808303815f875af1158015620004b7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620004dd919062001cd6565b905081600e5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600f5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620005728160016200093760201b60201c565b60105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166331e79db060105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b8152600401620005ef91906200205f565b5f604051808303815f87803b15801562000607575f80fd5b505af11580156200061a573d5f803e3d5ffd5b5050505060105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166331e79db0306040518263ffffffff1660e01b81526004016200067a91906200205f565b5f604051808303815f87803b15801562000692575f80fd5b505af1158015620006a5573d5f803e3d5ffd5b5050505060105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166331e79db060115f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b81526004016200072691906200205f565b5f604051808303815f87803b1580156200073e575f80fd5b505af115801562000751573d5f803e3d5ffd5b5050505060105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166331e79db0836040518263ffffffff1660e01b8152600401620007b191906200205f565b5f604051808303815f87803b158015620007c9575f80fd5b505af1158015620007dc573d5f803e3d5ffd5b5050505062000802620007f462000a6860201b60201c565b600162000a9060201b60201c565b6200083660125f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600162000a9060201b60201c565b6200084930600162000a9060201b60201c565b6200086a6200085d62000a6860201b60201c565b8462000b4860201b60201c565b5050505062002624565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8060075f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550801562000a1e5760105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166331e79db0836040518263ffffffff1660e01b8152600401620009ee91906200205f565b5f604051808303815f87803b15801562000a06575f80fd5b505af115801562000a19573d5f803e3d5ffd5b505050505b8015158273ffffffffffffffffffffffffffffffffffffffff167fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab60405160405180910390a35050565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b62000aa062000bd260201b60201c565b8060085f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df78260405162000b3c919062002201565b60405180910390a25050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160362000bbb575f6040517fec442f0500000000000000000000000000000000000000000000000000000000815260040162000bb291906200205f565b60405180910390fd5b62000bce5f838362000c7460201b60201c565b5050565b62000be26200136060201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1662000c0862000a6860201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000c725762000c346200136060201b60201c565b6040517f118cdaa700000000000000000000000000000000000000000000000000000000815260040162000c6991906200205f565b60405180910390fd5b565b5f810362000c955762000c8f83835f6200136760201b60201c565b6200135b565b5f62000ca7306200158b60201b60201c565b90505f60095482101590505f6001601360149054906101000a900460ff1660ff161490505f60075f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff168062000d68575060075f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b905082801562000d755750815b801562000dc9575060075f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b801562000e11575062000de162000a6860201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614155b801562000e59575062000e2962000a6860201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614155b801562000eb3575060105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614155b801562000f0d575060105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614155b1562000f89576001601360148282829054906101000a900460ff1660ff16901b92506101000a81548160ff021916908360ff16021790555062000f5684620015d060201b60201c565b6001601360148282829054906101000a900460ff1660ff16901c92506101000a81548160ff021916908360ff1602179055505b60085f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff168062001025575060085f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b806200102f575080155b1562001039575f91505b811562001086575f6064600c54876200105391906200221c565b6200105f9190620020d4565b905080866200106f919062002266565b9550620010848830836200136760201b60201c565b505b620010998787876200136760201b60201c565b60105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663059ef8d788620010e88a6200158b60201b60201c565b60016040518463ffffffff1660e01b81526004016200110a93929190620022c4565b5f604051808303815f87803b15801562001122575f80fd5b505af192505050801562001134575060015b5060105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663059ef8d78762001184896200158b60201b60201c565b60016040518463ffffffff1660e01b8152600401620011a693929190620022c4565b5f604051808303815f87803b158015620011be575f80fd5b505af1925050508015620011d0575060015b506001601360149054906101000a900460ff1660ff160362001356575f600d5490506001601360148282829054906101000a900460ff1660ff16901b92506101000a81548160ff021916908360ff16021790555060105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ffb2c479826040518263ffffffff1660e01b8152600401620012809190620022ff565b6060604051808303815f875af1925050508015620012be57506040513d601f19601f82011682018060405250810190620012bb919062002349565b60015b1562001322573273ffffffffffffffffffffffffffffffffffffffff16600115157fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a9885858589604051620013169493929190620023a2565b60405180910390a35050505b6001601360148282829054906101000a900460ff1660ff16901c92506101000a81548160ff021916908360ff160217905550505b505050505b505050565b5f33905090565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603620013bb578060025f828254620013ae9190620023ed565b925050819055506200148c565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490508181101562001447578381836040517fe450d38c0000000000000000000000000000000000000000000000000000000081526004016200143e9392919062002427565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603620014d5578060025f82825403925050819055506200151f565b805f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516200157e9190620022ff565b60405180910390a3505050565b5f805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b620015e06200174260201b60201c565b5f600a54600b54620015f39190620023ed565b600b54836200160391906200221c565b6200160f9190620020d4565b90505f818362001620919062002266565b9050620016563060105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836200178960201b60201c565b62001667826200188760201b60201c565b60105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633243c791826040518263ffffffff1660e01b8152600401620016c39190620022ff565b5f604051808303815f87803b158015620016db575f80fd5b505af1158015620016ee573d5f803e3d5ffd5b505050507f80195cc573b02cc48460cbca6e6e4cc85ddb91959d946e1c3025ea3d87942dc383826040516200172592919062002462565b60405180910390a150506200173f62001a6760201b60201c565b50565b6002600654036200177f576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600681905550565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603620017fc575f6040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600401620017f391906200205f565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036200186f575f6040517fec442f050000000000000000000000000000000000000000000000000000000081526004016200186691906200205f565b60405180910390fd5b6200188283838362000c7460201b60201c565b505050565b5f600267ffffffffffffffff811115620018a657620018a562001d10565b5b604051908082528060200260200182016040528015620018d55781602001602082028036833780820191505090505b50905030815f81518110620018ef57620018ee6200248d565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060135f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16816001815181106200196257620019616200248d565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050620019d030600e5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff168462001a7160201b60201c565b600e5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac947835f8430426040518663ffffffff1660e01b815260040162001a34959493929190620025c2565b5f604051808303815f87803b15801562001a4c575f80fd5b505af115801562001a5f573d5f803e3d5ffd5b505050505050565b6001600681905550565b62001a86838383600162001a8b60201b60201c565b505050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160362001afe575f6040517fe602df0500000000000000000000000000000000000000000000000000000000815260040162001af591906200205f565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160362001b71575f6040517f94280d6200000000000000000000000000000000000000000000000000000000815260040162001b6891906200205f565b60405180910390fd5b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550801562001c5d578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405162001c549190620022ff565b60405180910390a35b50505050565b6136c180620066d883390190565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f62001ca08262001c75565b9050919050565b62001cb28162001c94565b811462001cbd575f80fd5b50565b5f8151905062001cd08162001ca7565b92915050565b5f6020828403121562001cee5762001ced62001c71565b5b5f62001cfd8482850162001cc0565b91505092915050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168062001d8257607f821691505b60208210810362001d985762001d9762001d3d565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f6008830262001dfc7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262001dbf565b62001e08868362001dbf565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f62001e5262001e4c62001e468462001e20565b62001e29565b62001e20565b9050919050565b5f819050919050565b62001e6d8362001e32565b62001e8562001e7c8262001e59565b84845462001dcb565b825550505050565b5f90565b62001e9b62001e8d565b62001ea881848462001e62565b505050565b5b8181101562001ecf5762001ec35f8262001e91565b60018101905062001eae565b5050565b601f82111562001f1e5762001ee88162001d9e565b62001ef38462001db0565b8101602085101562001f03578190505b62001f1b62001f128562001db0565b83018262001ead565b50505b505050565b5f82821c905092915050565b5f62001f405f198460080262001f23565b1980831691505092915050565b5f62001f5a838362001f2f565b9150826002028217905092915050565b62001f758262001d06565b67ffffffffffffffff81111562001f915762001f9062001d10565b5b62001f9d825462001d6a565b62001faa82828562001ed3565b5f60209050601f83116001811462001fe0575f841562001fcb578287015190505b62001fd7858262001f4d565b86555062002046565b601f19841662001ff08662001d9e565b5f5b82811015620020195784890151825560018201915060208501945060208101905062001ff2565b8683101562002039578489015162002035601f89168262001f2f565b8355505b6001600288020188555050505b505050505050565b620020598162001c94565b82525050565b5f602082019050620020745f8301846200204e565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f620020e08262001e20565b9150620020ed8362001e20565b9250826200210057620020ff6200207a565b5b828204905092915050565b5f82825260208201905092915050565b7f4c4547414c585f547261636b65720000000000000000000000000000000000005f82015250565b5f62002151600e836200210b565b91506200215e826200211b565b602082019050919050565b620021748162001e20565b82525050565b5f6060820190508181035f830152620021938162002143565b9050620021a4602083018562002169565b620021b360408301846200204e565b9392505050565b5f604082019050620021cf5f8301856200204e565b620021de60208301846200204e565b9392505050565b5f8115159050919050565b620021fb81620021e5565b82525050565b5f602082019050620022165f830184620021f0565b92915050565b5f620022288262001e20565b9150620022358362001e20565b9250828202620022458162001e20565b915082820484148315176200225f576200225e620020a7565b5b5092915050565b5f620022728262001e20565b91506200227f8362001e20565b92508282039050818111156200229a5762002299620020a7565b5b92915050565b5f620022ac8262001c75565b9050919050565b620022be81620022a0565b82525050565b5f606082019050620022d95f830186620022b3565b620022e8602083018562002169565b620022f76040830184620021f0565b949350505050565b5f602082019050620023145f83018462002169565b92915050565b620023258162001e20565b811462002330575f80fd5b50565b5f8151905062002343816200231a565b92915050565b5f805f6060848603121562002363576200236262001c71565b5b5f620023728682870162002333565b9350506020620023858682870162002333565b9250506040620023988682870162002333565b9150509250925092565b5f608082019050620023b75f83018762002169565b620023c6602083018662002169565b620023d5604083018562002169565b620023e4606083018462002169565b95945050505050565b5f620023f98262001e20565b9150620024068362001e20565b9250828201905080821115620024215762002420620020a7565b5b92915050565b5f6060820190506200243c5f8301866200204e565b6200244b602083018562002169565b6200245a604083018462002169565b949350505050565b5f604082019050620024775f83018562002169565b62002486602083018462002169565b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f819050919050565b5f620024e3620024dd620024d784620024ba565b62001e29565b62001e20565b9050919050565b620024f581620024c3565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b6200252f8162001c94565b82525050565b5f62002542838362002524565b60208301905092915050565b5f602082019050919050565b5f6200256682620024fb565b62002572818562002505565b93506200257f8362002515565b805f5b83811015620025b557815162002599888262002535565b9750620025a6836200254e565b92505060018101905062002582565b5085935050505092915050565b5f60a082019050620025d75f83018862002169565b620025e66020830187620024ea565b8181036040830152620025fa81866200255a565b90506200260b60608301856200204e565b6200261a608083018462002169565b9695505050505050565b6140a680620026325f395ff3fe60806040526004361061028b575f3560e01c806370a0823111610159578063a9059cbb116100c0578063dd62ed3e11610079578063dd62ed3e146109a7578063e2f45605146109e3578063e7841ec014610a0d578063e98030c714610a37578063f27fd25414610a5f578063f2fde38b14610aa257610292565b8063a9059cbb14610886578063ad56c13c146108c2578063ad5c464814610905578063c02466681461092f578063c492f04614610957578063d257b34f1461097f57610292565b80638da5cb5b116101125780638da5cb5b1461077a57806395d89b41146107a45780639a7a23d6146107ce5780639c1b8af5146107f6578063a26579ad14610820578063a8b9d2401461084a57610292565b806370a0823114610686578063715018a6146106c257806381c79ec2146106d857806385141a7714610700578063871c128d1461072a57806388bdd9be1461075257610292565b806331e79db0116101fd5780635d098b38116101b65780635d098b381461057e578063625e764c146105a657806364b0f653146105ce5780636843cd84146105f85780636b67c4df14610634578063700bb1911461065e57610292565b806331e79db0146104745780634144d9e41461049c57806343cc8c2a146104c657806349bd5a5e146105025780634e71d92d1461052c5780634fbee1931461054257610292565b806318160ddd1161024f57806318160ddd1461037a57806323b872dd146103a45780632b72c4c0146103e05780632c1f5216146103f657806330bb4cff14610420578063313ce5671461044a57610292565b806306fdde0314610296578063095ea7b3146102c057806313114a9d146102fc578063167bcf71146103265780631694505e1461035057610292565b3661029257005b5f80fd5b3480156102a1575f80fd5b506102aa610aca565b6040516102b7919061331b565b60405180910390f35b3480156102cb575f80fd5b506102e660048036038101906102e191906133d0565b610b5a565b6040516102f39190613428565b60405180910390f35b348015610307575f80fd5b50610310610b7c565b60405161031d9190613450565b60405180910390f35b348015610331575f80fd5b5061033a610b82565b6040516103479190613450565b60405180910390f35b34801561035b575f80fd5b50610364610b88565b60405161037191906134c4565b60405180910390f35b348015610385575f80fd5b5061038e610bad565b60405161039b9190613450565b60405180910390f35b3480156103af575f80fd5b506103ca60048036038101906103c591906134dd565b610bb6565b6040516103d79190613428565b60405180910390f35b3480156103eb575f80fd5b506103f4610be4565b005b348015610401575f80fd5b5061040a610dce565b604051610417919061355e565b60405180910390f35b34801561042b575f80fd5b50610434610df3565b6040516104419190613450565b60405180910390f35b348015610455575f80fd5b5061045e610e87565b60405161046b9190613592565b60405180910390f35b34801561047f575f80fd5b5061049a600480360381019061049591906135ab565b610e8f565b005b3480156104a7575f80fd5b506104b0610f21565b6040516104bd91906135e5565b60405180910390f35b3480156104d1575f80fd5b506104ec60048036038101906104e791906135ab565b610f46565b6040516104f99190613428565b60405180910390f35b34801561050d575f80fd5b50610516610f63565b60405161052391906135e5565b60405180910390f35b348015610537575f80fd5b50610540610f88565b005b34801561054d575f80fd5b50610568600480360381019061056391906135ab565b611027565b6040516105759190613428565b60405180910390f35b348015610589575f80fd5b506105a4600480360381019061059f9190613639565b611079565b005b3480156105b1575f80fd5b506105cc60048036038101906105c79190613664565b611129565b005b3480156105d9575f80fd5b506105e2611151565b6040516105ef9190613450565b60405180910390f35b348015610603575f80fd5b5061061e600480360381019061061991906135ab565b6111e5565b60405161062b9190613450565b60405180910390f35b34801561063f575f80fd5b50610648611286565b6040516106559190613450565b60405180910390f35b348015610669575f80fd5b50610684600480360381019061067f9190613664565b61128c565b005b348015610691575f80fd5b506106ac60048036038101906106a791906135ab565b61138c565b6040516106b99190613450565b60405180910390f35b3480156106cd575f80fd5b506106d66113d1565b005b3480156106e3575f80fd5b506106fe60048036038101906106f99190613664565b6113e4565b005b34801561070b575f80fd5b5061071461140c565b60405161072191906135e5565b60405180910390f35b348015610735575f80fd5b50610750600480360381019061074b9190613664565b611431565b005b34801561075d575f80fd5b50610778600480360381019061077391906135ab565b6114bd565b005b348015610785575f80fd5b5061078e611819565b60405161079b91906135e5565b60405180910390f35b3480156107af575f80fd5b506107b8611841565b6040516107c5919061331b565b60405180910390f35b3480156107d9575f80fd5b506107f460048036038101906107ef91906136b9565b6118d1565b005b348015610801575f80fd5b5061080a61196d565b6040516108179190613450565b60405180910390f35b34801561082b575f80fd5b50610834611973565b6040516108419190613450565b60405180910390f35b348015610855575f80fd5b50610870600480360381019061086b91906135ab565b611a07565b60405161087d9190613450565b60405180910390f35b348015610891575f80fd5b506108ac60048036038101906108a791906133d0565b611aa8565b6040516108b99190613428565b60405180910390f35b3480156108cd575f80fd5b506108e860048036038101906108e391906135ab565b611aca565b6040516108fc98979695949392919061370f565b60405180910390f35b348015610910575f80fd5b50610919611b87565b60405161092691906135e5565b60405180910390f35b34801561093a575f80fd5b50610955600480360381019061095091906136b9565b611bac565b005b348015610962575f80fd5b5061097d600480360381019061097891906137ec565b611c5a565b005b34801561098a575f80fd5b506109a560048036038101906109a09190613664565b611d38565b005b3480156109b2575f80fd5b506109cd60048036038101906109c89190613849565b611dcc565b6040516109da9190613450565b60405180910390f35b3480156109ee575f80fd5b506109f7611e4e565b604051610a049190613450565b60405180910390f35b348015610a18575f80fd5b50610a21611e54565b604051610a2e9190613450565b60405180910390f35b348015610a42575f80fd5b50610a5d6004803603810190610a589190613664565b611ee8565b005b348015610a6a575f80fd5b50610a856004803603810190610a809190613664565b611f7a565b604051610a9998979695949392919061370f565b60405180910390f35b348015610aad575f80fd5b50610ac86004803603810190610ac391906135ab565b612037565b005b606060038054610ad9906138b4565b80601f0160208091040260200160405190810160405280929190818152602001828054610b05906138b4565b8015610b505780601f10610b2757610100808354040283529160200191610b50565b820191905f5260205f20905b815481529060010190602001808311610b3357829003601f168201915b5050505050905090565b5f80610b646120bb565b9050610b718185856120c2565b600191505092915050565b600c5481565b600a5481565b600e5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f600254905090565b5f80610bc06120bb565b9050610bcd8582856120d4565b610bd8858585612166565b60019150509392505050565b610bec612256565b60125f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614158015610c7c5750610c4c611819565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614155b15610cb3576040517f9f8969f300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f4790505f8111610cf9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf09061392e565b60405180910390fd5b5f60125f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1682604051610d3f90613979565b5f6040518083038185875af1925050503d805f8114610d79576040519150601f19603f3d011682016040523d82523d5f602084013e610d7e565b606091505b5050905080610dc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db9906139d7565b60405180910390fd5b5050610dcc61229c565b565b60105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f60105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166385a6b3ae6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e5e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e829190613a09565b905090565b5f6012905090565b610e976122a6565b60105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166331e79db0826040518263ffffffff1660e01b8152600401610ef191906135e5565b5f604051808303815f87803b158015610f08575f80fd5b505af1158015610f1a573d5f803e3d5ffd5b5050505050565b60125f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6007602052805f5260405f205f915054906101000a900460ff1681565b600f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bc4c4b37335f6040518363ffffffff1660e01b8152600401610fe4929190613a43565b6020604051808303815f875af1158015611000573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110249190613a7e565b50565b5f60085f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff169050919050565b6110816122a6565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036110e6576040517f9f8969f300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060125f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6111316122a6565b80600b81905550600b54600a546111489190613ad6565b600c8190555050565b5f60105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166309bbedde6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111bc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111e09190613a09565b905090565b5f60105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231836040518263ffffffff1660e01b815260040161124091906135e5565b602060405180830381865afa15801561125b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061127f9190613a09565b9050919050565b600b5481565b5f805f60105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ffb2c479856040518263ffffffff1660e01b81526004016112e99190613450565b6060604051808303815f875af1158015611305573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113299190613b09565b9250925092503373ffffffffffffffffffffffffffffffffffffffff165f15157fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a988585858960405161137e9493929190613b59565b60405180910390a350505050565b5f805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b6113d96122a6565b6113e25f61232d565b565b6113ec6122a6565b80600a81905550600b54600a546114039190613ad6565b600c8190555050565b60115f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6114396122a6565b62030d4081108061144c57506207a12081115b15611483576040517fe64da64400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600d54817f40d7e40e79af4e8e5a9b3c57030d8ea93f13d669c06d448c4d631d4ae7d23db760405160405180910390a380600d8190555050565b6114c56122a6565b5f8190503073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611529573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061154d9190613bb0565b73ffffffffffffffffffffffffffffffffffffffff161461159a576040517f214b982800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166331e79db0826040518263ffffffff1660e01b81526004016115d391906135e5565b5f604051808303815f87803b1580156115ea575f80fd5b505af11580156115fc573d5f803e3d5ffd5b505050508073ffffffffffffffffffffffffffffffffffffffff166331e79db0306040518263ffffffff1660e01b815260040161163991906135e5565b5f604051808303815f87803b158015611650575f80fd5b505af1158015611662573d5f803e3d5ffd5b505050508073ffffffffffffffffffffffffffffffffffffffff166331e79db061168a611819565b6040518263ffffffff1660e01b81526004016116a691906135e5565b5f604051808303815f87803b1580156116bd575f80fd5b505af11580156116cf573d5f803e3d5ffd5b505050508073ffffffffffffffffffffffffffffffffffffffff166331e79db0600e5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b815260040161172d91906135e5565b5f604051808303815f87803b158015611744575f80fd5b505af1158015611756573d5f803e3d5ffd5b5050505060105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f90c7d74461c613da5efa97d90740869367d74ab3aa5837aa4ae9a975f954b7a860405160405180910390a38060105f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060048054611850906138b4565b80601f016020809104026020016040519081016040528092919081815260200182805461187c906138b4565b80156118c75780601f1061189e576101008083540402835291602001916118c7565b820191905f5260205f20905b8154815290600101906020018083116118aa57829003601f168201915b5050505050905090565b6118d96122a6565b600f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361195f576040517f50ccb09600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61196982826123f0565b5050565b600d5481565b5f60105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636f2789ec6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156119de573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a029190613a09565b905090565b5f60105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a8b9d240836040518263ffffffff1660e01b8152600401611a6291906135e5565b602060405180830381865afa158015611a7d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611aa19190613a09565b9050919050565b5f80611ab26120bb565b9050611abf818585612166565b600191505092915050565b5f805f805f805f8060105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fbcbc0f18a6040518263ffffffff1660e01b8152600401611b2c91906135e5565b61010060405180830381865afa158015611b48573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b6c9190613c05565b97509750975097509750975097509750919395975091939597565b60135f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611bb46122a6565b8060085f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df782604051611c4e9190613428565b60405180910390a25050565b611c626122a6565b5f5b83839050811015611cf7578160085f868685818110611c8657611c85613cb6565b5b9050602002016020810190611c9b91906135ab565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508080600101915050611c64565b507f7fdaf542373fa84f4ee8d662c642f44e4c2276a217d7d29e548b6eb29a233b35838383604051611d2b93929190613d9f565b60405180910390a1505050565b611d406122a6565b5f6064611d4b610bad565b611d559190613dfc565b905080821115611d91576040517f220eae8600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600954827febb96427ceba6a46f9f71146db5c30bc7e2fe31285e9bf34b38bbdede7cd5ea160405160405180910390a3816009819055505050565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b60095481565b5f60105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e7841ec06040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ebf573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ee39190613a09565b905090565b611ef06122a6565b60105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e98030c7826040518263ffffffff1660e01b8152600401611f4a9190613450565b5f604051808303815f87803b158015611f61575f80fd5b505af1158015611f73573d5f803e3d5ffd5b5050505050565b5f805f805f805f8060105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635183d6fd8a6040518263ffffffff1660e01b8152600401611fdc9190613450565b61010060405180830381865afa158015611ff8573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061201c9190613c05565b97509750975097509750975097509750919395975091939597565b61203f6122a6565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036120af575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016120a691906135e5565b60405180910390fd5b6120b88161232d565b50565b5f33905090565b6120cf838383600161251c565b505050565b5f6120df8484611dcc565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146121605781811015612151578281836040517ffb8f41b200000000000000000000000000000000000000000000000000000000815260040161214893929190613e2c565b60405180910390fd5b61215f84848484035f61251c565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036121d6575f6040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081526004016121cd91906135e5565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612246575f6040517fec442f0500000000000000000000000000000000000000000000000000000000815260040161223d91906135e5565b60405180910390fd5b6122518383836126eb565b505050565b600260065403612292576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600681905550565b6001600681905550565b6122ae6120bb565b73ffffffffffffffffffffffffffffffffffffffff166122cc611819565b73ffffffffffffffffffffffffffffffffffffffff161461232b576122ef6120bb565b6040517f118cdaa700000000000000000000000000000000000000000000000000000000815260040161232291906135e5565b60405180910390fd5b565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8060075f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555080156124d25760105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166331e79db0836040518263ffffffff1660e01b81526004016124a491906135e5565b5f604051808303815f87803b1580156124bb575f80fd5b505af11580156124cd573d5f803e3d5ffd5b505050505b8015158273ffffffffffffffffffffffffffffffffffffffff167fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab60405160405180910390a35050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361258c575f6040517fe602df0500000000000000000000000000000000000000000000000000000000815260040161258391906135e5565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036125fc575f6040517f94280d620000000000000000000000000000000000000000000000000000000081526004016125f391906135e5565b60405180910390fd5b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208190555080156126e5578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516126dc9190613450565b60405180910390a35b50505050565b5f8103612702576126fd83835f612d6a565b612d65565b5f61270c3061138c565b90505f60095482101590505f6001601360149054906101000a900460ff1660ff161490505f60075f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16806127cc575060075f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b90508280156127d85750815b801561282b575060075f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b801561286a575061283a611819565b73ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614155b80156128a95750612879611819565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614155b8015612902575060105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614155b801561295b575060105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614155b156129ce576001601360148282829054906101000a900460ff1660ff16901b92506101000a81548160ff021916908360ff16021790555061299b84612f83565b6001601360148282829054906101000a900460ff1660ff16901c92506101000a81548160ff021916908360ff1602179055505b60085f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1680612a69575060085f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b80612a72575080155b15612a7b575f91505b8115612ab9575f6064600c5487612a929190613e61565b612a9c9190613dfc565b90508086612aaa9190613ea2565b9550612ab7883083612d6a565b505b612ac4878787612d6a565b60105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663059ef8d788612b0b8a61138c565b60016040518463ffffffff1660e01b8152600401612b2b93929190613ed5565b5f604051808303815f87803b158015612b42575f80fd5b505af1925050508015612b53575060015b5060105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663059ef8d787612b9b8961138c565b60016040518463ffffffff1660e01b8152600401612bbb93929190613ed5565b5f604051808303815f87803b158015612bd2575f80fd5b505af1925050508015612be3575060015b506001601360149054906101000a900460ff1660ff1603612d60575f600d5490506001601360148282829054906101000a900460ff1660ff16901b92506101000a81548160ff021916908360ff16021790555060105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ffb2c479826040518263ffffffff1660e01b8152600401612c909190613450565b6060604051808303815f875af1925050508015612ccb57506040513d601f19601f82011682018060405250810190612cc89190613b09565b60015b15612d2c573273ffffffffffffffffffffffffffffffffffffffff16600115157fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a9885858589604051612d209493929190613b59565b60405180910390a35050505b6001601360148282829054906101000a900460ff1660ff16901c92506101000a81548160ff021916908360ff160217905550505b505050505b505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612dba578060025f828254612dae9190613ad6565b92505081905550612e88565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015612e43578381836040517fe450d38c000000000000000000000000000000000000000000000000000000008152600401612e3a93929190613e2c565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612ecf578060025f8282540392505081905550612f19565b805f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612f769190613450565b60405180910390a3505050565b612f8b612256565b5f600a54600b54612f9c9190613ad6565b600b5483612faa9190613e61565b612fb49190613dfc565b90505f8183612fc39190613ea2565b9050612ff13060105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683612166565b612ffa826130c7565b60105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633243c791826040518263ffffffff1660e01b81526004016130549190613450565b5f604051808303815f87803b15801561306b575f80fd5b505af115801561307d573d5f803e3d5ffd5b505050507f80195cc573b02cc48460cbca6e6e4cc85ddb91959d946e1c3025ea3d87942dc383826040516130b2929190613f0a565b60405180910390a150506130c461229c565b50565b5f600267ffffffffffffffff8111156130e3576130e2613f31565b5b6040519080825280602002602001820160405280156131115781602001602082028036833780820191505090505b50905030815f8151811061312857613127613cb6565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060135f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff168160018151811061319857613197613cb6565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506131fe30600e5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846120c2565b600e5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac947835f8430426040518663ffffffff1660e01b8152600401613260959493929190614018565b5f604051808303815f87803b158015613277575f80fd5b505af1158015613289573d5f803e3d5ffd5b505050505050565b5f81519050919050565b5f82825260208201905092915050565b5f5b838110156132c85780820151818401526020810190506132ad565b5f8484015250505050565b5f601f19601f8301169050919050565b5f6132ed82613291565b6132f7818561329b565b93506133078185602086016132ab565b613310816132d3565b840191505092915050565b5f6020820190508181035f83015261333381846132e3565b905092915050565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61336c82613343565b9050919050565b61337c81613362565b8114613386575f80fd5b50565b5f8135905061339781613373565b92915050565b5f819050919050565b6133af8161339d565b81146133b9575f80fd5b50565b5f813590506133ca816133a6565b92915050565b5f80604083850312156133e6576133e561333b565b5b5f6133f385828601613389565b9250506020613404858286016133bc565b9150509250929050565b5f8115159050919050565b6134228161340e565b82525050565b5f60208201905061343b5f830184613419565b92915050565b61344a8161339d565b82525050565b5f6020820190506134635f830184613441565b92915050565b5f819050919050565b5f61348c61348761348284613343565b613469565b613343565b9050919050565b5f61349d82613472565b9050919050565b5f6134ae82613493565b9050919050565b6134be816134a4565b82525050565b5f6020820190506134d75f8301846134b5565b92915050565b5f805f606084860312156134f4576134f361333b565b5b5f61350186828701613389565b935050602061351286828701613389565b9250506040613523868287016133bc565b9150509250925092565b5f61353782613472565b9050919050565b5f6135488261352d565b9050919050565b6135588161353e565b82525050565b5f6020820190506135715f83018461354f565b92915050565b5f60ff82169050919050565b61358c81613577565b82525050565b5f6020820190506135a55f830184613583565b92915050565b5f602082840312156135c0576135bf61333b565b5b5f6135cd84828501613389565b91505092915050565b6135df81613362565b82525050565b5f6020820190506135f85f8301846135d6565b92915050565b5f61360882613343565b9050919050565b613618816135fe565b8114613622575f80fd5b50565b5f813590506136338161360f565b92915050565b5f6020828403121561364e5761364d61333b565b5b5f61365b84828501613625565b91505092915050565b5f602082840312156136795761367861333b565b5b5f613686848285016133bc565b91505092915050565b6136988161340e565b81146136a2575f80fd5b50565b5f813590506136b38161368f565b92915050565b5f80604083850312156136cf576136ce61333b565b5b5f6136dc85828601613389565b92505060206136ed858286016136a5565b9150509250929050565b5f819050919050565b613709816136f7565b82525050565b5f610100820190506137235f83018b6135d6565b613730602083018a613700565b61373d6040830189613700565b61374a6060830188613441565b6137576080830187613441565b61376460a0830186613441565b61377160c0830185613441565b61377e60e0830184613441565b9998505050505050505050565b5f80fd5b5f80fd5b5f80fd5b5f8083601f8401126137ac576137ab61378b565b5b8235905067ffffffffffffffff8111156137c9576137c861378f565b5b6020830191508360208202830111156137e5576137e4613793565b5b9250929050565b5f805f604084860312156138035761380261333b565b5b5f84013567ffffffffffffffff8111156138205761381f61333f565b5b61382c86828701613797565b9350935050602061383f868287016136a5565b9150509250925092565b5f806040838503121561385f5761385e61333b565b5b5f61386c85828601613389565b925050602061387d85828601613389565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806138cb57607f821691505b6020821081036138de576138dd613887565b5b50919050565b7f4e6f2066756e647320746f2077697468647261770000000000000000000000005f82015250565b5f61391860148361329b565b9150613923826138e4565b602082019050919050565b5f6020820190508181035f8301526139458161390c565b9050919050565b5f81905092915050565b50565b5f6139645f8361394c565b915061396f82613956565b5f82019050919050565b5f61398382613959565b9150819050919050565b7f455448207472616e73666572206661696c6564000000000000000000000000005f82015250565b5f6139c160138361329b565b91506139cc8261398d565b602082019050919050565b5f6020820190508181035f8301526139ee816139b5565b9050919050565b5f81519050613a03816133a6565b92915050565b5f60208284031215613a1e57613a1d61333b565b5b5f613a2b848285016139f5565b91505092915050565b613a3d816135fe565b82525050565b5f604082019050613a565f830185613a34565b613a636020830184613419565b9392505050565b5f81519050613a788161368f565b92915050565b5f60208284031215613a9357613a9261333b565b5b5f613aa084828501613a6a565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f613ae08261339d565b9150613aeb8361339d565b9250828201905080821115613b0357613b02613aa9565b5b92915050565b5f805f60608486031215613b2057613b1f61333b565b5b5f613b2d868287016139f5565b9350506020613b3e868287016139f5565b9250506040613b4f868287016139f5565b9150509250925092565b5f608082019050613b6c5f830187613441565b613b796020830186613441565b613b866040830185613441565b613b936060830184613441565b95945050505050565b5f81519050613baa81613373565b92915050565b5f60208284031215613bc557613bc461333b565b5b5f613bd284828501613b9c565b91505092915050565b613be4816136f7565b8114613bee575f80fd5b50565b5f81519050613bff81613bdb565b92915050565b5f805f805f805f80610100898b031215613c2257613c2161333b565b5b5f613c2f8b828c01613b9c565b9850506020613c408b828c01613bf1565b9750506040613c518b828c01613bf1565b9650506060613c628b828c016139f5565b9550506080613c738b828c016139f5565b94505060a0613c848b828c016139f5565b93505060c0613c958b828c016139f5565b92505060e0613ca68b828c016139f5565b9150509295985092959890939650565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f82825260208201905092915050565b5f819050919050565b613d0581613362565b82525050565b5f613d168383613cfc565b60208301905092915050565b5f613d306020840184613389565b905092915050565b5f602082019050919050565b5f613d4f8385613ce3565b9350613d5a82613cf3565b805f5b85811015613d9257613d6f8284613d22565b613d798882613d0b565b9750613d8483613d38565b925050600181019050613d5d565b5085925050509392505050565b5f6040820190508181035f830152613db8818587613d44565b9050613dc76020830184613419565b949350505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f613e068261339d565b9150613e118361339d565b925082613e2157613e20613dcf565b5b828204905092915050565b5f606082019050613e3f5f8301866135d6565b613e4c6020830185613441565b613e596040830184613441565b949350505050565b5f613e6b8261339d565b9150613e768361339d565b9250828202613e848161339d565b91508282048414831517613e9b57613e9a613aa9565b5b5092915050565b5f613eac8261339d565b9150613eb78361339d565b9250828203905081811115613ecf57613ece613aa9565b5b92915050565b5f606082019050613ee85f830186613a34565b613ef56020830185613441565b613f026040830184613419565b949350505050565b5f604082019050613f1d5f830185613441565b613f2a6020830184613441565b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f819050919050565b5f613f81613f7c613f7784613f5e565b613469565b61339d565b9050919050565b613f9181613f67565b82525050565b5f81519050919050565b5f819050602082019050919050565b5f602082019050919050565b5f613fc682613f97565b613fd08185613ce3565b9350613fdb83613fa1565b805f5b8381101561400b578151613ff28882613d0b565b9750613ffd83613fb0565b925050600181019050613fde565b5085935050505092915050565b5f60a08201905061402b5f830188613441565b6140386020830187613f88565b818103604083015261404a8186613fbc565b905061405960608301856135d6565b6140666080830184613441565b969550505050505056fea264697066735822122084072c1f1bfa994f5bee962c9abc6060594816e8814d8cf6208cab14c1f7138b64736f6c6343000818003360c060405234801562000010575f80fd5b50604051620036c1380380620036c1833981810160405281019062000036919062000419565b82838233838381600390816200004d9190620006bf565b5080600490816200005f9190620006bf565b5050505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603620000d5575f6040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401620000cc9190620007b4565b60405180910390fd5b620000e6816200013860201b60201c565b508073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff168152505050505061012c6011819055508160a08181525050505050620007cf565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6200025c8262000214565b810181811067ffffffffffffffff821117156200027e576200027d62000224565b5b80604052505050565b5f62000292620001fb565b9050620002a0828262000251565b919050565b5f67ffffffffffffffff821115620002c257620002c162000224565b5b620002cd8262000214565b9050602081019050919050565b5f5b83811015620002f9578082015181840152602081019050620002dc565b5f8484015250505050565b5f6200031a6200031484620002a5565b62000287565b90508281526020810184848401111562000339576200033862000210565b5b62000346848285620002da565b509392505050565b5f82601f8301126200036557620003646200020c565b5b81516200037784826020860162000304565b91505092915050565b5f819050919050565b620003948162000380565b81146200039f575f80fd5b50565b5f81519050620003b28162000389565b92915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f620003e382620003b8565b9050919050565b620003f581620003d7565b811462000400575f80fd5b50565b5f815190506200041381620003ea565b92915050565b5f805f6060848603121562000433576200043262000204565b5b5f84015167ffffffffffffffff81111562000453576200045262000208565b5b62000461868287016200034e565b93505060206200047486828701620003a2565b9250506040620004878682870162000403565b9150509250925092565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680620004e057607f821691505b602082108103620004f657620004f56200049b565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026200055a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200051d565b6200056686836200051d565b95508019841693508086168417925050509392505050565b5f819050919050565b5f620005a7620005a16200059b8462000380565b6200057e565b62000380565b9050919050565b5f819050919050565b620005c28362000587565b620005da620005d182620005ae565b84845462000529565b825550505050565b5f90565b620005f0620005e2565b620005fd818484620005b7565b505050565b5b818110156200062457620006185f82620005e6565b60018101905062000603565b5050565b601f82111562000673576200063d81620004fc565b62000648846200050e565b8101602085101562000658578190505b6200067062000667856200050e565b83018262000602565b50505b505050565b5f82821c905092915050565b5f620006955f198460080262000678565b1980831691505092915050565b5f620006af838362000684565b9150826002028217905092915050565b620006ca8262000491565b67ffffffffffffffff811115620006e657620006e562000224565b5b620006f28254620004c8565b620006ff82828562000628565b5f60209050601f83116001811462000735575f841562000720578287015190505b6200072c8582620006a2565b8655506200079b565b601f1984166200074586620004fc565b5f5b828110156200076e5784890151825560018201915060208501945060208101905062000747565b868310156200078e57848901516200078a601f89168262000684565b8355505b6001600288020188555050505b505050505050565b620007ae81620003d7565b82525050565b5f602082019050620007c95f830184620007a3565b92915050565b60805160a051612eb46200080d5f395f8181610964015261132c01525f818161021a0152818161146501528181611bea0152611cf60152612eb45ff3fe6080604052600436106101fc575f3560e01c8063715018a61161010c578063bc4c4b371161009f578063e98030c71161006e578063e98030c714610811578063f1e9f1e514610839578063f2fde38b14610863578063fbcbc0f11461088b578063ffb2c479146108ce57610288565b8063bc4c4b3714610745578063be10b61414610781578063dd62ed3e146107ab578063e7841ec0146107e757610288565b806395d89b41116100db57806395d89b4114610667578063a8b9d24014610691578063a9059cbb146106cd578063aafd847a1461070957610288565b8063715018a6146105c157806385a6b3ae146105d75780638da5cb5b1461060157806391b89fba1461062b57610288565b80633009a6091161018f5780634e7b827f1161015e5780634e7b827f146104c65780635183d6fd146105025780636a474002146105455780636f2789ec1461055b57806370a082311461058557610288565b80633009a60914610422578063313ce5671461044c57806331e79db0146104765780633243c7911461049e57610288565b806318160ddd116101cb57806318160ddd14610344578063226cfa3d1461036e57806323b872dd146103aa57806327ce0147146103e657610288565b8063059ef8d71461028c57806306fdde03146102b4578063095ea7b3146102de57806309bbedde1461031a57610288565b36610288575f73ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1614610286576040517fc032a57100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b005b5f80fd5b348015610297575f80fd5b506102b260048036038101906102ad91906124f0565b61090c565b005b3480156102bf575f80fd5b506102c8610a8e565b6040516102d591906125ca565b60405180910390f35b3480156102e9575f80fd5b5061030460048036038101906102ff9190612625565b610b1e565b6040516103119190612672565b60405180910390f35b348015610325575f80fd5b5061032e610b40565b60405161033b919061269a565b60405180910390f35b34801561034f575f80fd5b50610358610b4e565b604051610365919061269a565b60405180910390f35b348015610379575f80fd5b50610394600480360381019061038f91906126b3565b610b57565b6040516103a1919061269a565b60405180910390f35b3480156103b5575f80fd5b506103d060048036038101906103cb91906126de565b610b6c565b6040516103dd9190612672565b60405180910390f35b3480156103f1575f80fd5b5061040c600480360381019061040791906126b3565b610b9a565b604051610419919061269a565b60405180910390f35b34801561042d575f80fd5b50610436610c9d565b604051610443919061269a565b60405180910390f35b348015610457575f80fd5b50610460610ca3565b60405161046d9190612749565b60405180910390f35b348015610481575f80fd5b5061049c600480360381019061049791906126b3565b610cab565b005b3480156104a9575f80fd5b506104c460048036038101906104bf9190612762565b610dc0565b005b3480156104d1575f80fd5b506104ec60048036038101906104e791906126b3565b610ec0565b6040516104f99190612672565b60405180910390f35b34801561050d575f80fd5b5061052860048036038101906105239190612762565b610edd565b60405161053c9897969594939291906127b4565b60405180910390f35b348015610550575f80fd5b50610559611045565b005b348015610566575f80fd5b5061056f611077565b60405161057c919061269a565b60405180910390f35b348015610590575f80fd5b506105ab60048036038101906105a691906126b3565b61107d565b6040516105b8919061269a565b60405180910390f35b3480156105cc575f80fd5b506105d56110c2565b005b3480156105e2575f80fd5b506105eb6110d5565b6040516105f8919061269a565b60405180910390f35b34801561060c575f80fd5b506106156110db565b6040516106229190612830565b60405180910390f35b348015610636575f80fd5b50610651600480360381019061064c91906126b3565b611103565b60405161065e919061269a565b60405180910390f35b348015610672575f80fd5b5061067b611114565b60405161068891906125ca565b60405180910390f35b34801561069c575f80fd5b506106b760048036038101906106b291906126b3565b6111a4565b6040516106c4919061269a565b60405180910390f35b3480156106d8575f80fd5b506106f360048036038101906106ee9190612625565b6111fd565b6040516107009190612672565b60405180910390f35b348015610714575f80fd5b5061072f600480360381019061072a91906126b3565b61121f565b60405161073c919061269a565b60405180910390f35b348015610750575f80fd5b5061076b60048036038101906107669190612849565b611265565b6040516107789190612672565b60405180910390f35b34801561078c575f80fd5b5061079561132a565b6040516107a2919061269a565b60405180910390f35b3480156107b6575f80fd5b506107d160048036038101906107cc9190612887565b61134e565b6040516107de919061269a565b60405180910390f35b3480156107f2575f80fd5b506107fb6113d0565b604051610808919061269a565b60405180910390f35b34801561081c575f80fd5b5061083760048036038101906108329190612762565b6113d9565b005b348015610844575f80fd5b5061084d611463565b60405161085a9190612830565b60405180910390f35b34801561086e575f80fd5b50610889600480360381019061088491906126b3565b611487565b005b348015610896575f80fd5b506108b160048036038101906108ac91906126b3565b61150b565b6040516108c59897969594939291906127b4565b60405180910390f35b3480156108d9575f80fd5b506108f460048036038101906108ef9190612762565b6116b7565b604051610903939291906128c5565b60405180910390f35b610914611828565b600e5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16610a89577f00000000000000000000000000000000000000000000000000000000000000008210610a025761099383836118af565b600a7355fe708a5242a930b1587b93972d29da1e52722e63bc2b405c909185856040518463ffffffff1660e01b81526004016109d19392919061296b565b5f6040518083038186803b1580156109e7575f80fd5b505af41580156109f9573d5f803e3d5ffd5b50505050610a75565b610a0c835f6118af565b600a7355fe708a5242a930b1587b93972d29da1e52722e634c60db9c9091856040518363ffffffff1660e01b8152600401610a489291906129a0565b5f6040518083038186803b158015610a5e575f80fd5b505af4158015610a70573d5f803e3d5ffd5b505050505b8015610a8857610a86836001611265565b505b5b505050565b606060038054610a9d906129f4565b80601f0160208091040260200160405190810160405280929190818152602001828054610ac9906129f4565b8015610b145780601f10610aeb57610100808354040283529160200191610b14565b820191905f5260205f20905b815481529060010190602001808311610af757829003601f168201915b5050505050905090565b5f80610b2861190b565b9050610b35818585611912565b600191505092915050565b5f600a5f0180549050905090565b5f600254905090565b600f602052805f5260405f205f915090505481565b5f80610b7661190b565b9050610b83858285611924565b610b8e8585856119b6565b60019150509392505050565b5f80610ba58361107d565b600954610bb29190612a51565b90505f811215610bee576040517fce3d3a8a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60065f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205481610c379190612a92565b90505f811215610c73576040517fe05407ee00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f81905070010000000000000000000000000000000081610c949190612b00565b92505050919050565b60105481565b5f6012905090565b610cb3611828565b6001600e5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550610d12815f6118af565b600a7355fe708a5242a930b1587b93972d29da1e52722e634c60db9c9091836040518363ffffffff1660e01b8152600401610d4e929190612b3f565b5f6040518083038186803b158015610d64575f80fd5b505af4158015610d76573d5f803e3d5ffd5b505050508073ffffffffffffffffffffffffffffffffffffffff167fa878b31040b2e6d0a9a3d3361209db3908ba62014b0dca52adbaee451d128b2560405160405180910390a250565b610dc8611828565b5f610dd1610b4e565b03610e08576040517ff1916dce00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f811115610ebd57610e18610b4e565b70010000000000000000000000000000000082610e359190612a51565b610e3f9190612b00565b60095f828254610e4f9190612b66565b925050819055503373ffffffffffffffffffffffffffffffffffffffff167fa493a9229478c3fcd73f66d2cdeb7f94fd0f341da924d1054236d7845411651182604051610e9c919061269a565b60405180910390a28060085f828254610eb59190612b66565b925050819055505b50565b600e602052805f5260405f205f915054906101000a900460ff1681565b5f805f805f805f80600a7355fe708a5242a930b1587b93972d29da1e52722e63deb3d89690916040518263ffffffff1660e01b8152600401610f1f9190612b99565b602060405180830381865af4158015610f3a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f5e9190612bc6565b8910610fa1575f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff805f805f805f9750975097509750975097509750975061103a565b5f600a7355fe708a5242a930b1587b93972d29da1e52722e63d1aa9e7e90918c6040518363ffffffff1660e01b8152600401610fde929190612bf1565b602060405180830381865af4158015610ff9573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061101d9190612c2c565b90506110288161150b565b98509850985098509850985098509850505b919395975091939597565b6040517f1d68ac9200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60115481565b5f805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b6110ca611828565b6110d35f611aa6565b565b60085481565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b5f61110d826111a4565b9050919050565b606060048054611123906129f4565b80601f016020809104026020016040519081016040528092919081815260200182805461114f906129f4565b801561119a5780601f106111715761010080835404028352916020019161119a565b820191905f5260205f20905b81548152906001019060200180831161117d57829003601f168201915b5050505050905090565b5f60075f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20546111ec83610b9a565b6111f69190612c57565b9050919050565b5f8061120761190b565b90506112148185856119b6565b600191505092915050565b5f60075f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b5f61126e611828565b5f61127884611b69565b90505f81111561131f5742600f5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508215158473ffffffffffffffffffffffffffffffffffffffff167fa2c38e2d2fb7e3e1912d937fd1ca11ed6d51864dee4cfa7a7bf02becd7acf0928360405161130d919061269a565b60405180910390a36001915050611324565b5f9150505b92915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b5f601054905090565b6113e1611828565b603c8110806113f257506201518081115b15611429576040517fbf5275b000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601154817f474ea64804364a1e29a4487ddb63c3342a2dd826ccd8acf48825e680a0e6f20f60405160405180910390a38060118190555050565b7f000000000000000000000000000000000000000000000000000000000000000081565b61148f611828565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036114ff575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016114f69190612830565b60405180910390fd5b61150881611aa6565b50565b5f805f805f805f80889750600a7355fe708a5242a930b1587b93972d29da1e52722e6317e142d190918a6040518363ffffffff1660e01b8152600401611552929190612b3f565b602060405180830381865af415801561156d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115919190612cb4565b96507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff95505f871261161c576010548711156115dc57601054876115d59190612cdf565b955061161b565b5f601054600a5f0180549050116115f3575f611609565b601054600a5f01805490506116089190612c57565b5b905080886116179190612a92565b9650505b5b611625886111a4565b945061163088610b9a565b9350600f5f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205492505f831161167f575f61168e565b6011548361168d9190612b66565b5b915042821161169d575f6116aa565b42826116a99190612c57565b5b9050919395975091939597565b5f805f80600a5f018054905090505f81036116dd575f8060105493509350935050611821565b5f60105490505f805a90505f805b89841080156116f957508582105b1561180857848061170990612d1f565b955050600a5f0180549050851061171e575f94505b5f600a5f01868154811061173557611734612d66565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506117a5600f5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054611df2565b156117ca576117b5816001611265565b156117c95781806117c590612d1f565b9250505b5b82806117d590612d1f565b9350505f5a9050808511156117fe5780856117f09190612c57565b866117fb9190612b66565b95505b80945050506116eb565b8460108190555081816010549850985098505050505050505b9193909250565b61183061190b565b73ffffffffffffffffffffffffffffffffffffffff1661184e6110db565b73ffffffffffffffffffffffffffffffffffffffff16146118ad5761187161190b565b6040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016118a49190612830565b60405180910390fd5b565b5f6118b98361107d565b9050808211156118e2575f81836118d09190612c57565b90506118dc8482611e1c565b50611906565b80821015611905575f82826118f79190612c57565b90506119038482611f2f565b505b5b505050565b5f33905090565b61191f8383836001612042565b505050565b5f61192f848461134e565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146119b057818110156119a1578281836040517ffb8f41b200000000000000000000000000000000000000000000000000000000815260040161199893929190612d93565b60405180910390fd5b6119af84848484035f612042565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611a26575f6040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600401611a1d9190612830565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611a96575f6040517fec442f05000000000000000000000000000000000000000000000000000000008152600401611a8d9190612830565b60405180910390fd5b611aa1838383612211565b505050565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f80611b74836111a4565b90505f811115611de8578060075f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254611bca9190612b66565b925050819055505f73ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1603611cf4575f8373ffffffffffffffffffffffffffffffffffffffff1682604051611c4990612df5565b5f6040518083038185875af1925050503d805f8114611c83576040519150601f19603f3d011682016040523d82523d5f602084013e611c88565b606091505b5050905080611cee578160075f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254611cdd9190612c57565b925050819055505f92505050611ded565b50611d91565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84836040518363ffffffff1660e01b8152600401611d4f929190612e18565b6020604051808303815f875af1158015611d6b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d8f9190612e53565b505b8273ffffffffffffffffffffffffffffffffffffffff167fee503bee2bb6a87e57bc57db795f98137327401a0e7b7ce42e37926cc1a9ca4d82604051611dd7919061269a565b60405180910390a280915050611ded565b5f9150505b919050565b5f42821115611e03575f9050611e17565b6011548242611e129190612c57565b101590505b919050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611e81576040517f35a8b31000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611e8c5f8383612211565b5f81600954611e9b9190612a51565b90505f811215611ed7576040517fce3d3a8a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060065f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254611f239190612cdf565b92505081905550505050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611f94576040517f35a8b31000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611f9f825f83612211565b5f81600954611fae9190612a51565b90505f811215611fea576040517fce3d3a8a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060065f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546120369190612a92565b92505081905550505050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036120b2575f6040517fe602df050000000000000000000000000000000000000000000000000000000081526004016120a99190612830565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612122575f6040517f94280d620000000000000000000000000000000000000000000000000000000081526004016121199190612830565b60405180910390fd5b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550801561220b578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051612202919061269a565b60405180910390a35b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612261578060025f8282546122559190612b66565b9250508190555061232f565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050818110156122ea578381836040517fe450d38c0000000000000000000000000000000000000000000000000000000081526004016122e193929190612d93565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612376578060025f82825403925050819055506123c0565b805f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161241d919061269a565b60405180910390a3505050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6124578261242e565b9050919050565b6124678161244d565b8114612471575f80fd5b50565b5f813590506124828161245e565b92915050565b5f819050919050565b61249a81612488565b81146124a4575f80fd5b50565b5f813590506124b581612491565b92915050565b5f8115159050919050565b6124cf816124bb565b81146124d9575f80fd5b50565b5f813590506124ea816124c6565b92915050565b5f805f606084860312156125075761250661242a565b5b5f61251486828701612474565b9350506020612525868287016124a7565b9250506040612536868287016124dc565b9150509250925092565b5f81519050919050565b5f82825260208201905092915050565b5f5b8381101561257757808201518184015260208101905061255c565b5f8484015250505050565b5f601f19601f8301169050919050565b5f61259c82612540565b6125a6818561254a565b93506125b681856020860161255a565b6125bf81612582565b840191505092915050565b5f6020820190508181035f8301526125e28184612592565b905092915050565b5f6125f48261242e565b9050919050565b612604816125ea565b811461260e575f80fd5b50565b5f8135905061261f816125fb565b92915050565b5f806040838503121561263b5761263a61242a565b5b5f61264885828601612611565b9250506020612659858286016124a7565b9150509250929050565b61266c816124bb565b82525050565b5f6020820190506126855f830184612663565b92915050565b61269481612488565b82525050565b5f6020820190506126ad5f83018461268b565b92915050565b5f602082840312156126c8576126c761242a565b5b5f6126d584828501612611565b91505092915050565b5f805f606084860312156126f5576126f461242a565b5b5f61270286828701612611565b935050602061271386828701612611565b9250506040612724868287016124a7565b9150509250925092565b5f60ff82169050919050565b6127438161272e565b82525050565b5f60208201905061275c5f83018461273a565b92915050565b5f602082840312156127775761277661242a565b5b5f612784848285016124a7565b91505092915050565b612796816125ea565b82525050565b5f819050919050565b6127ae8161279c565b82525050565b5f610100820190506127c85f83018b61278d565b6127d5602083018a6127a5565b6127e260408301896127a5565b6127ef606083018861268b565b6127fc608083018761268b565b61280960a083018661268b565b61281660c083018561268b565b61282360e083018461268b565b9998505050505050505050565b5f6020820190506128435f83018461278d565b92915050565b5f806040838503121561285f5761285e61242a565b5b5f61286c85828601612474565b925050602061287d858286016124dc565b9150509250929050565b5f806040838503121561289d5761289c61242a565b5b5f6128aa85828601612611565b92505060206128bb85828601612611565b9150509250929050565b5f6060820190506128d85f83018661268b565b6128e5602083018561268b565b6128f2604083018461268b565b949350505050565b8082525050565b5f819050919050565b5f61292461291f61291a8461242e565b612901565b61242e565b9050919050565b5f6129358261290a565b9050919050565b5f6129468261292b565b9050919050565b6129568161293c565b82525050565b61296581612488565b82525050565b5f60608201905061297e5f8301866128fa565b61298b602083018561294d565b612998604083018461295c565b949350505050565b5f6040820190506129b35f8301856128fa565b6129c0602083018461294d565b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680612a0b57607f821691505b602082108103612a1e57612a1d6129c7565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f612a5b82612488565b9150612a6683612488565b9250828202612a7481612488565b91508282048414831517612a8b57612a8a612a24565b5b5092915050565b5f612a9c8261279c565b9150612aa78361279c565b92508282019050828112155f8312168382125f841215161715612acd57612acc612a24565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f612b0a82612488565b9150612b1583612488565b925082612b2557612b24612ad3565b5b828204905092915050565b612b39816125ea565b82525050565b5f604082019050612b525f8301856128fa565b612b5f6020830184612b30565b9392505050565b5f612b7082612488565b9150612b7b83612488565b9250828201905080821115612b9357612b92612a24565b5b92915050565b5f602082019050612bac5f8301846128fa565b92915050565b5f81519050612bc081612491565b92915050565b5f60208284031215612bdb57612bda61242a565b5b5f612be884828501612bb2565b91505092915050565b5f604082019050612c045f8301856128fa565b612c11602083018461295c565b9392505050565b5f81519050612c26816125fb565b92915050565b5f60208284031215612c4157612c4061242a565b5b5f612c4e84828501612c18565b91505092915050565b5f612c6182612488565b9150612c6c83612488565b9250828203905081811115612c8457612c83612a24565b5b92915050565b612c938161279c565b8114612c9d575f80fd5b50565b5f81519050612cae81612c8a565b92915050565b5f60208284031215612cc957612cc861242a565b5b5f612cd684828501612ca0565b91505092915050565b5f612ce98261279c565b9150612cf48361279c565b925082820390508181125f8412168282135f851215161715612d1957612d18612a24565b5b92915050565b5f612d2982612488565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612d5b57612d5a612a24565b5b600182019050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f606082019050612da65f83018661278d565b612db3602083018561268b565b612dc0604083018461268b565b949350505050565b5f81905092915050565b50565b5f612de05f83612dc8565b9150612deb82612dd2565b5f82019050919050565b5f612dff82612dd5565b9150819050919050565b612e128161293c565b82525050565b5f604082019050612e2b5f830185612e09565b612e38602083018461268b565b9392505050565b5f81519050612e4d816124c6565b92915050565b5f60208284031215612e6857612e6761242a565b5b5f612e7584828501612e3f565b9150509291505056fea2646970667358221220ce8781d879bc63ac6ab506fda875e8cc22eaeb6b022fa2b643f9f532e269631964736f6c634300081800330000000000000000000000008fa3717c33d826397dd66402670f8c50463da666
Deployed Bytecode
0x60806040526004361061028b575f3560e01c806370a0823111610159578063a9059cbb116100c0578063dd62ed3e11610079578063dd62ed3e146109a7578063e2f45605146109e3578063e7841ec014610a0d578063e98030c714610a37578063f27fd25414610a5f578063f2fde38b14610aa257610292565b8063a9059cbb14610886578063ad56c13c146108c2578063ad5c464814610905578063c02466681461092f578063c492f04614610957578063d257b34f1461097f57610292565b80638da5cb5b116101125780638da5cb5b1461077a57806395d89b41146107a45780639a7a23d6146107ce5780639c1b8af5146107f6578063a26579ad14610820578063a8b9d2401461084a57610292565b806370a0823114610686578063715018a6146106c257806381c79ec2146106d857806385141a7714610700578063871c128d1461072a57806388bdd9be1461075257610292565b806331e79db0116101fd5780635d098b38116101b65780635d098b381461057e578063625e764c146105a657806364b0f653146105ce5780636843cd84146105f85780636b67c4df14610634578063700bb1911461065e57610292565b806331e79db0146104745780634144d9e41461049c57806343cc8c2a146104c657806349bd5a5e146105025780634e71d92d1461052c5780634fbee1931461054257610292565b806318160ddd1161024f57806318160ddd1461037a57806323b872dd146103a45780632b72c4c0146103e05780632c1f5216146103f657806330bb4cff14610420578063313ce5671461044a57610292565b806306fdde0314610296578063095ea7b3146102c057806313114a9d146102fc578063167bcf71146103265780631694505e1461035057610292565b3661029257005b5f80fd5b3480156102a1575f80fd5b506102aa610aca565b6040516102b7919061331b565b60405180910390f35b3480156102cb575f80fd5b506102e660048036038101906102e191906133d0565b610b5a565b6040516102f39190613428565b60405180910390f35b348015610307575f80fd5b50610310610b7c565b60405161031d9190613450565b60405180910390f35b348015610331575f80fd5b5061033a610b82565b6040516103479190613450565b60405180910390f35b34801561035b575f80fd5b50610364610b88565b60405161037191906134c4565b60405180910390f35b348015610385575f80fd5b5061038e610bad565b60405161039b9190613450565b60405180910390f35b3480156103af575f80fd5b506103ca60048036038101906103c591906134dd565b610bb6565b6040516103d79190613428565b60405180910390f35b3480156103eb575f80fd5b506103f4610be4565b005b348015610401575f80fd5b5061040a610dce565b604051610417919061355e565b60405180910390f35b34801561042b575f80fd5b50610434610df3565b6040516104419190613450565b60405180910390f35b348015610455575f80fd5b5061045e610e87565b60405161046b9190613592565b60405180910390f35b34801561047f575f80fd5b5061049a600480360381019061049591906135ab565b610e8f565b005b3480156104a7575f80fd5b506104b0610f21565b6040516104bd91906135e5565b60405180910390f35b3480156104d1575f80fd5b506104ec60048036038101906104e791906135ab565b610f46565b6040516104f99190613428565b60405180910390f35b34801561050d575f80fd5b50610516610f63565b60405161052391906135e5565b60405180910390f35b348015610537575f80fd5b50610540610f88565b005b34801561054d575f80fd5b50610568600480360381019061056391906135ab565b611027565b6040516105759190613428565b60405180910390f35b348015610589575f80fd5b506105a4600480360381019061059f9190613639565b611079565b005b3480156105b1575f80fd5b506105cc60048036038101906105c79190613664565b611129565b005b3480156105d9575f80fd5b506105e2611151565b6040516105ef9190613450565b60405180910390f35b348015610603575f80fd5b5061061e600480360381019061061991906135ab565b6111e5565b60405161062b9190613450565b60405180910390f35b34801561063f575f80fd5b50610648611286565b6040516106559190613450565b60405180910390f35b348015610669575f80fd5b50610684600480360381019061067f9190613664565b61128c565b005b348015610691575f80fd5b506106ac60048036038101906106a791906135ab565b61138c565b6040516106b99190613450565b60405180910390f35b3480156106cd575f80fd5b506106d66113d1565b005b3480156106e3575f80fd5b506106fe60048036038101906106f99190613664565b6113e4565b005b34801561070b575f80fd5b5061071461140c565b60405161072191906135e5565b60405180910390f35b348015610735575f80fd5b50610750600480360381019061074b9190613664565b611431565b005b34801561075d575f80fd5b50610778600480360381019061077391906135ab565b6114bd565b005b348015610785575f80fd5b5061078e611819565b60405161079b91906135e5565b60405180910390f35b3480156107af575f80fd5b506107b8611841565b6040516107c5919061331b565b60405180910390f35b3480156107d9575f80fd5b506107f460048036038101906107ef91906136b9565b6118d1565b005b348015610801575f80fd5b5061080a61196d565b6040516108179190613450565b60405180910390f35b34801561082b575f80fd5b50610834611973565b6040516108419190613450565b60405180910390f35b348015610855575f80fd5b50610870600480360381019061086b91906135ab565b611a07565b60405161087d9190613450565b60405180910390f35b348015610891575f80fd5b506108ac60048036038101906108a791906133d0565b611aa8565b6040516108b99190613428565b60405180910390f35b3480156108cd575f80fd5b506108e860048036038101906108e391906135ab565b611aca565b6040516108fc98979695949392919061370f565b60405180910390f35b348015610910575f80fd5b50610919611b87565b60405161092691906135e5565b60405180910390f35b34801561093a575f80fd5b50610955600480360381019061095091906136b9565b611bac565b005b348015610962575f80fd5b5061097d600480360381019061097891906137ec565b611c5a565b005b34801561098a575f80fd5b506109a560048036038101906109a09190613664565b611d38565b005b3480156109b2575f80fd5b506109cd60048036038101906109c89190613849565b611dcc565b6040516109da9190613450565b60405180910390f35b3480156109ee575f80fd5b506109f7611e4e565b604051610a049190613450565b60405180910390f35b348015610a18575f80fd5b50610a21611e54565b604051610a2e9190613450565b60405180910390f35b348015610a42575f80fd5b50610a5d6004803603810190610a589190613664565b611ee8565b005b348015610a6a575f80fd5b50610a856004803603810190610a809190613664565b611f7a565b604051610a9998979695949392919061370f565b60405180910390f35b348015610aad575f80fd5b50610ac86004803603810190610ac391906135ab565b612037565b005b606060038054610ad9906138b4565b80601f0160208091040260200160405190810160405280929190818152602001828054610b05906138b4565b8015610b505780601f10610b2757610100808354040283529160200191610b50565b820191905f5260205f20905b815481529060010190602001808311610b3357829003601f168201915b5050505050905090565b5f80610b646120bb565b9050610b718185856120c2565b600191505092915050565b600c5481565b600a5481565b600e5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f600254905090565b5f80610bc06120bb565b9050610bcd8582856120d4565b610bd8858585612166565b60019150509392505050565b610bec612256565b60125f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614158015610c7c5750610c4c611819565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614155b15610cb3576040517f9f8969f300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f4790505f8111610cf9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf09061392e565b60405180910390fd5b5f60125f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1682604051610d3f90613979565b5f6040518083038185875af1925050503d805f8114610d79576040519150601f19603f3d011682016040523d82523d5f602084013e610d7e565b606091505b5050905080610dc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db9906139d7565b60405180910390fd5b5050610dcc61229c565b565b60105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f60105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166385a6b3ae6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e5e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e829190613a09565b905090565b5f6012905090565b610e976122a6565b60105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166331e79db0826040518263ffffffff1660e01b8152600401610ef191906135e5565b5f604051808303815f87803b158015610f08575f80fd5b505af1158015610f1a573d5f803e3d5ffd5b5050505050565b60125f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6007602052805f5260405f205f915054906101000a900460ff1681565b600f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bc4c4b37335f6040518363ffffffff1660e01b8152600401610fe4929190613a43565b6020604051808303815f875af1158015611000573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110249190613a7e565b50565b5f60085f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff169050919050565b6110816122a6565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036110e6576040517f9f8969f300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060125f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6111316122a6565b80600b81905550600b54600a546111489190613ad6565b600c8190555050565b5f60105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166309bbedde6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111bc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111e09190613a09565b905090565b5f60105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231836040518263ffffffff1660e01b815260040161124091906135e5565b602060405180830381865afa15801561125b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061127f9190613a09565b9050919050565b600b5481565b5f805f60105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ffb2c479856040518263ffffffff1660e01b81526004016112e99190613450565b6060604051808303815f875af1158015611305573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113299190613b09565b9250925092503373ffffffffffffffffffffffffffffffffffffffff165f15157fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a988585858960405161137e9493929190613b59565b60405180910390a350505050565b5f805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b6113d96122a6565b6113e25f61232d565b565b6113ec6122a6565b80600a81905550600b54600a546114039190613ad6565b600c8190555050565b60115f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6114396122a6565b62030d4081108061144c57506207a12081115b15611483576040517fe64da64400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600d54817f40d7e40e79af4e8e5a9b3c57030d8ea93f13d669c06d448c4d631d4ae7d23db760405160405180910390a380600d8190555050565b6114c56122a6565b5f8190503073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611529573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061154d9190613bb0565b73ffffffffffffffffffffffffffffffffffffffff161461159a576040517f214b982800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166331e79db0826040518263ffffffff1660e01b81526004016115d391906135e5565b5f604051808303815f87803b1580156115ea575f80fd5b505af11580156115fc573d5f803e3d5ffd5b505050508073ffffffffffffffffffffffffffffffffffffffff166331e79db0306040518263ffffffff1660e01b815260040161163991906135e5565b5f604051808303815f87803b158015611650575f80fd5b505af1158015611662573d5f803e3d5ffd5b505050508073ffffffffffffffffffffffffffffffffffffffff166331e79db061168a611819565b6040518263ffffffff1660e01b81526004016116a691906135e5565b5f604051808303815f87803b1580156116bd575f80fd5b505af11580156116cf573d5f803e3d5ffd5b505050508073ffffffffffffffffffffffffffffffffffffffff166331e79db0600e5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b815260040161172d91906135e5565b5f604051808303815f87803b158015611744575f80fd5b505af1158015611756573d5f803e3d5ffd5b5050505060105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f90c7d74461c613da5efa97d90740869367d74ab3aa5837aa4ae9a975f954b7a860405160405180910390a38060105f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060048054611850906138b4565b80601f016020809104026020016040519081016040528092919081815260200182805461187c906138b4565b80156118c75780601f1061189e576101008083540402835291602001916118c7565b820191905f5260205f20905b8154815290600101906020018083116118aa57829003601f168201915b5050505050905090565b6118d96122a6565b600f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361195f576040517f50ccb09600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61196982826123f0565b5050565b600d5481565b5f60105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636f2789ec6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156119de573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a029190613a09565b905090565b5f60105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a8b9d240836040518263ffffffff1660e01b8152600401611a6291906135e5565b602060405180830381865afa158015611a7d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611aa19190613a09565b9050919050565b5f80611ab26120bb565b9050611abf818585612166565b600191505092915050565b5f805f805f805f8060105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fbcbc0f18a6040518263ffffffff1660e01b8152600401611b2c91906135e5565b61010060405180830381865afa158015611b48573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b6c9190613c05565b97509750975097509750975097509750919395975091939597565b60135f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611bb46122a6565b8060085f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df782604051611c4e9190613428565b60405180910390a25050565b611c626122a6565b5f5b83839050811015611cf7578160085f868685818110611c8657611c85613cb6565b5b9050602002016020810190611c9b91906135ab565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508080600101915050611c64565b507f7fdaf542373fa84f4ee8d662c642f44e4c2276a217d7d29e548b6eb29a233b35838383604051611d2b93929190613d9f565b60405180910390a1505050565b611d406122a6565b5f6064611d4b610bad565b611d559190613dfc565b905080821115611d91576040517f220eae8600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600954827febb96427ceba6a46f9f71146db5c30bc7e2fe31285e9bf34b38bbdede7cd5ea160405160405180910390a3816009819055505050565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b60095481565b5f60105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e7841ec06040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ebf573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ee39190613a09565b905090565b611ef06122a6565b60105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e98030c7826040518263ffffffff1660e01b8152600401611f4a9190613450565b5f604051808303815f87803b158015611f61575f80fd5b505af1158015611f73573d5f803e3d5ffd5b5050505050565b5f805f805f805f8060105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635183d6fd8a6040518263ffffffff1660e01b8152600401611fdc9190613450565b61010060405180830381865afa158015611ff8573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061201c9190613c05565b97509750975097509750975097509750919395975091939597565b61203f6122a6565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036120af575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016120a691906135e5565b60405180910390fd5b6120b88161232d565b50565b5f33905090565b6120cf838383600161251c565b505050565b5f6120df8484611dcc565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146121605781811015612151578281836040517ffb8f41b200000000000000000000000000000000000000000000000000000000815260040161214893929190613e2c565b60405180910390fd5b61215f84848484035f61251c565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036121d6575f6040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081526004016121cd91906135e5565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612246575f6040517fec442f0500000000000000000000000000000000000000000000000000000000815260040161223d91906135e5565b60405180910390fd5b6122518383836126eb565b505050565b600260065403612292576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600681905550565b6001600681905550565b6122ae6120bb565b73ffffffffffffffffffffffffffffffffffffffff166122cc611819565b73ffffffffffffffffffffffffffffffffffffffff161461232b576122ef6120bb565b6040517f118cdaa700000000000000000000000000000000000000000000000000000000815260040161232291906135e5565b60405180910390fd5b565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8060075f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555080156124d25760105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166331e79db0836040518263ffffffff1660e01b81526004016124a491906135e5565b5f604051808303815f87803b1580156124bb575f80fd5b505af11580156124cd573d5f803e3d5ffd5b505050505b8015158273ffffffffffffffffffffffffffffffffffffffff167fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab60405160405180910390a35050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361258c575f6040517fe602df0500000000000000000000000000000000000000000000000000000000815260040161258391906135e5565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036125fc575f6040517f94280d620000000000000000000000000000000000000000000000000000000081526004016125f391906135e5565b60405180910390fd5b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208190555080156126e5578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516126dc9190613450565b60405180910390a35b50505050565b5f8103612702576126fd83835f612d6a565b612d65565b5f61270c3061138c565b90505f60095482101590505f6001601360149054906101000a900460ff1660ff161490505f60075f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16806127cc575060075f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b90508280156127d85750815b801561282b575060075f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b801561286a575061283a611819565b73ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614155b80156128a95750612879611819565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614155b8015612902575060105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614155b801561295b575060105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614155b156129ce576001601360148282829054906101000a900460ff1660ff16901b92506101000a81548160ff021916908360ff16021790555061299b84612f83565b6001601360148282829054906101000a900460ff1660ff16901c92506101000a81548160ff021916908360ff1602179055505b60085f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1680612a69575060085f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b80612a72575080155b15612a7b575f91505b8115612ab9575f6064600c5487612a929190613e61565b612a9c9190613dfc565b90508086612aaa9190613ea2565b9550612ab7883083612d6a565b505b612ac4878787612d6a565b60105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663059ef8d788612b0b8a61138c565b60016040518463ffffffff1660e01b8152600401612b2b93929190613ed5565b5f604051808303815f87803b158015612b42575f80fd5b505af1925050508015612b53575060015b5060105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663059ef8d787612b9b8961138c565b60016040518463ffffffff1660e01b8152600401612bbb93929190613ed5565b5f604051808303815f87803b158015612bd2575f80fd5b505af1925050508015612be3575060015b506001601360149054906101000a900460ff1660ff1603612d60575f600d5490506001601360148282829054906101000a900460ff1660ff16901b92506101000a81548160ff021916908360ff16021790555060105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ffb2c479826040518263ffffffff1660e01b8152600401612c909190613450565b6060604051808303815f875af1925050508015612ccb57506040513d601f19601f82011682018060405250810190612cc89190613b09565b60015b15612d2c573273ffffffffffffffffffffffffffffffffffffffff16600115157fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a9885858589604051612d209493929190613b59565b60405180910390a35050505b6001601360148282829054906101000a900460ff1660ff16901c92506101000a81548160ff021916908360ff160217905550505b505050505b505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612dba578060025f828254612dae9190613ad6565b92505081905550612e88565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015612e43578381836040517fe450d38c000000000000000000000000000000000000000000000000000000008152600401612e3a93929190613e2c565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612ecf578060025f8282540392505081905550612f19565b805f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612f769190613450565b60405180910390a3505050565b612f8b612256565b5f600a54600b54612f9c9190613ad6565b600b5483612faa9190613e61565b612fb49190613dfc565b90505f8183612fc39190613ea2565b9050612ff13060105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683612166565b612ffa826130c7565b60105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633243c791826040518263ffffffff1660e01b81526004016130549190613450565b5f604051808303815f87803b15801561306b575f80fd5b505af115801561307d573d5f803e3d5ffd5b505050507f80195cc573b02cc48460cbca6e6e4cc85ddb91959d946e1c3025ea3d87942dc383826040516130b2929190613f0a565b60405180910390a150506130c461229c565b50565b5f600267ffffffffffffffff8111156130e3576130e2613f31565b5b6040519080825280602002602001820160405280156131115781602001602082028036833780820191505090505b50905030815f8151811061312857613127613cb6565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060135f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff168160018151811061319857613197613cb6565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506131fe30600e5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846120c2565b600e5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac947835f8430426040518663ffffffff1660e01b8152600401613260959493929190614018565b5f604051808303815f87803b158015613277575f80fd5b505af1158015613289573d5f803e3d5ffd5b505050505050565b5f81519050919050565b5f82825260208201905092915050565b5f5b838110156132c85780820151818401526020810190506132ad565b5f8484015250505050565b5f601f19601f8301169050919050565b5f6132ed82613291565b6132f7818561329b565b93506133078185602086016132ab565b613310816132d3565b840191505092915050565b5f6020820190508181035f83015261333381846132e3565b905092915050565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61336c82613343565b9050919050565b61337c81613362565b8114613386575f80fd5b50565b5f8135905061339781613373565b92915050565b5f819050919050565b6133af8161339d565b81146133b9575f80fd5b50565b5f813590506133ca816133a6565b92915050565b5f80604083850312156133e6576133e561333b565b5b5f6133f385828601613389565b9250506020613404858286016133bc565b9150509250929050565b5f8115159050919050565b6134228161340e565b82525050565b5f60208201905061343b5f830184613419565b92915050565b61344a8161339d565b82525050565b5f6020820190506134635f830184613441565b92915050565b5f819050919050565b5f61348c61348761348284613343565b613469565b613343565b9050919050565b5f61349d82613472565b9050919050565b5f6134ae82613493565b9050919050565b6134be816134a4565b82525050565b5f6020820190506134d75f8301846134b5565b92915050565b5f805f606084860312156134f4576134f361333b565b5b5f61350186828701613389565b935050602061351286828701613389565b9250506040613523868287016133bc565b9150509250925092565b5f61353782613472565b9050919050565b5f6135488261352d565b9050919050565b6135588161353e565b82525050565b5f6020820190506135715f83018461354f565b92915050565b5f60ff82169050919050565b61358c81613577565b82525050565b5f6020820190506135a55f830184613583565b92915050565b5f602082840312156135c0576135bf61333b565b5b5f6135cd84828501613389565b91505092915050565b6135df81613362565b82525050565b5f6020820190506135f85f8301846135d6565b92915050565b5f61360882613343565b9050919050565b613618816135fe565b8114613622575f80fd5b50565b5f813590506136338161360f565b92915050565b5f6020828403121561364e5761364d61333b565b5b5f61365b84828501613625565b91505092915050565b5f602082840312156136795761367861333b565b5b5f613686848285016133bc565b91505092915050565b6136988161340e565b81146136a2575f80fd5b50565b5f813590506136b38161368f565b92915050565b5f80604083850312156136cf576136ce61333b565b5b5f6136dc85828601613389565b92505060206136ed858286016136a5565b9150509250929050565b5f819050919050565b613709816136f7565b82525050565b5f610100820190506137235f83018b6135d6565b613730602083018a613700565b61373d6040830189613700565b61374a6060830188613441565b6137576080830187613441565b61376460a0830186613441565b61377160c0830185613441565b61377e60e0830184613441565b9998505050505050505050565b5f80fd5b5f80fd5b5f80fd5b5f8083601f8401126137ac576137ab61378b565b5b8235905067ffffffffffffffff8111156137c9576137c861378f565b5b6020830191508360208202830111156137e5576137e4613793565b5b9250929050565b5f805f604084860312156138035761380261333b565b5b5f84013567ffffffffffffffff8111156138205761381f61333f565b5b61382c86828701613797565b9350935050602061383f868287016136a5565b9150509250925092565b5f806040838503121561385f5761385e61333b565b5b5f61386c85828601613389565b925050602061387d85828601613389565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806138cb57607f821691505b6020821081036138de576138dd613887565b5b50919050565b7f4e6f2066756e647320746f2077697468647261770000000000000000000000005f82015250565b5f61391860148361329b565b9150613923826138e4565b602082019050919050565b5f6020820190508181035f8301526139458161390c565b9050919050565b5f81905092915050565b50565b5f6139645f8361394c565b915061396f82613956565b5f82019050919050565b5f61398382613959565b9150819050919050565b7f455448207472616e73666572206661696c6564000000000000000000000000005f82015250565b5f6139c160138361329b565b91506139cc8261398d565b602082019050919050565b5f6020820190508181035f8301526139ee816139b5565b9050919050565b5f81519050613a03816133a6565b92915050565b5f60208284031215613a1e57613a1d61333b565b5b5f613a2b848285016139f5565b91505092915050565b613a3d816135fe565b82525050565b5f604082019050613a565f830185613a34565b613a636020830184613419565b9392505050565b5f81519050613a788161368f565b92915050565b5f60208284031215613a9357613a9261333b565b5b5f613aa084828501613a6a565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f613ae08261339d565b9150613aeb8361339d565b9250828201905080821115613b0357613b02613aa9565b5b92915050565b5f805f60608486031215613b2057613b1f61333b565b5b5f613b2d868287016139f5565b9350506020613b3e868287016139f5565b9250506040613b4f868287016139f5565b9150509250925092565b5f608082019050613b6c5f830187613441565b613b796020830186613441565b613b866040830185613441565b613b936060830184613441565b95945050505050565b5f81519050613baa81613373565b92915050565b5f60208284031215613bc557613bc461333b565b5b5f613bd284828501613b9c565b91505092915050565b613be4816136f7565b8114613bee575f80fd5b50565b5f81519050613bff81613bdb565b92915050565b5f805f805f805f80610100898b031215613c2257613c2161333b565b5b5f613c2f8b828c01613b9c565b9850506020613c408b828c01613bf1565b9750506040613c518b828c01613bf1565b9650506060613c628b828c016139f5565b9550506080613c738b828c016139f5565b94505060a0613c848b828c016139f5565b93505060c0613c958b828c016139f5565b92505060e0613ca68b828c016139f5565b9150509295985092959890939650565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f82825260208201905092915050565b5f819050919050565b613d0581613362565b82525050565b5f613d168383613cfc565b60208301905092915050565b5f613d306020840184613389565b905092915050565b5f602082019050919050565b5f613d4f8385613ce3565b9350613d5a82613cf3565b805f5b85811015613d9257613d6f8284613d22565b613d798882613d0b565b9750613d8483613d38565b925050600181019050613d5d565b5085925050509392505050565b5f6040820190508181035f830152613db8818587613d44565b9050613dc76020830184613419565b949350505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f613e068261339d565b9150613e118361339d565b925082613e2157613e20613dcf565b5b828204905092915050565b5f606082019050613e3f5f8301866135d6565b613e4c6020830185613441565b613e596040830184613441565b949350505050565b5f613e6b8261339d565b9150613e768361339d565b9250828202613e848161339d565b91508282048414831517613e9b57613e9a613aa9565b5b5092915050565b5f613eac8261339d565b9150613eb78361339d565b9250828203905081811115613ecf57613ece613aa9565b5b92915050565b5f606082019050613ee85f830186613a34565b613ef56020830185613441565b613f026040830184613419565b949350505050565b5f604082019050613f1d5f830185613441565b613f2a6020830184613441565b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f819050919050565b5f613f81613f7c613f7784613f5e565b613469565b61339d565b9050919050565b613f9181613f67565b82525050565b5f81519050919050565b5f819050602082019050919050565b5f602082019050919050565b5f613fc682613f97565b613fd08185613ce3565b9350613fdb83613fa1565b805f5b8381101561400b578151613ff28882613d0b565b9750613ffd83613fb0565b925050600181019050613fde565b5085935050505092915050565b5f60a08201905061402b5f830188613441565b6140386020830187613f88565b818103604083015261404a8186613fbc565b905061405960608301856135d6565b6140666080830184613441565b969550505050505056fea264697066735822122084072c1f1bfa994f5bee962c9abc6060594816e8814d8cf6208cab14c1f7138b64736f6c63430008180033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000008fa3717c33d826397dd66402670f8c50463da666
-----Decoded View---------------
Arg [0] : _marketingWallet (address): 0x8fa3717c33d826397DD66402670F8c50463da666
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000008fa3717c33d826397dd66402670f8c50463da666
Deployed Bytecode Sourcemap
54582:20287:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28603:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30921:215;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55495:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55417:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55667:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29705:99;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31714:283;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74360:506;;;;;;;;;;;;;:::i;:::-;;55748:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65029:141;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29556:84;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66527:130;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55870:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55160:39;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55713:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68706:103;;;;;;;;;;;;;:::i;:::-;;65415:126;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61670:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62438:150;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69346:142;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66185:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55457:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68158:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29867:118;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25845:103;;;;;;;;;;;;;:::i;:::-;;62091:154;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55793:70;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63891:306;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59646:724;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25170:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28813:95;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62848:249;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55600:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64722:109;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65786:168;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30190:182;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66929:367;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;;;;;;55915:19;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60653:184;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61150:330;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73979:373;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30435:167;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55360:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69017:130;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64408:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67579:377;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;;;;;;26103:220;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28603:91;28648:13;28681:5;28674:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28603:91;:::o;30921:215::-;31019:4;31036:13;31052:12;:10;:12::i;:::-;31036:28;;31075:31;31084:5;31091:7;31100:5;31075:8;:31::i;:::-;31124:4;31117:11;;;30921:215;;;;:::o;55495:28::-;;;;:::o;55417:33::-;;;;:::o;55667:39::-;;;;;;;;;;;;;:::o;29705:99::-;29757:7;29784:12;;29777:19;;29705:99;:::o;31714:283::-;31835:4;31852:15;31870:12;:10;:12::i;:::-;31852:30;;31893:37;31909:4;31915:7;31924:5;31893:15;:37::i;:::-;31941:26;31951:4;31957:2;31961:5;31941:9;:26::i;:::-;31985:4;31978:11;;;31714:283;;;;;:::o;74360:506::-;19715:21;:19;:21::i;:::-;74445:23:::1;;;;;;;;;;;74431:37;;:10;:37;;;;:62;;;;;74486:7;:5;:7::i;:::-;74472:21;;:10;:21;;;;74431:62;74427:134;;;74517:32;;;;;;;;;;;;;;74427:134;74573:14;74590:21;74573:38;;74639:1;74630:6;:10;74622:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;74710:12;74736:23;;;;;;;;;;;74728:37;;74773:6;74728:80;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;74709:99;;;74827:7;74819:39;;;;;;;;;;;;:::i;:::-;;;;;;;;;74416:450;;19759:20:::0;:18;:20::i;:::-;74360:506::o;55748:38::-;;;;;;;;;;;;;:::o;65029:141::-;65092:7;65119:15;;;;;;;;;;;:41;;;:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;65112:50;;65029:141;:::o;29556:84::-;29605:5;29630:2;29623:9;;29556:84;:::o;66527:130::-;25056:13;:11;:13::i;:::-;66604:15:::1;;;;;;;;;;;:36;;;66641:7;66604:45;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;66527:130:::0;:::o;55870:38::-;;;;;;;;;;;;;:::o;55160:39::-;;;;;;;;;;;;;;;;;;;;;;:::o;55713:28::-;;;;;;;;;;;;;:::o;68706:103::-;68743:15;;;;;;;;;;;:30;;;68782:10;68795:5;68743:58;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;68706:103::o;65415:126::-;65481:4;65505:19;:28;65525:7;65505:28;;;;;;;;;;;;;;;;;;;;;;;;;65498:35;;65415:126;;;:::o;61670:224::-;25056:13;:11;:13::i;:::-;61774:1:::1;61756:20;;:6;:20;;::::0;61752:92:::1;;61800:32;;;;;;;;;;;;;;61752:92;61880:6;61854:23;;:32;;;;;;;;;;;;;;;;;;61670:224:::0;:::o;62438:150::-;25056:13;:11;:13::i;:::-;62523:5:::1;62508:12;:20;;;;62568:12;;62551:14;;:29;;;;:::i;:::-;62539:9;:41;;;;62438:150:::0;:::o;69346:142::-;69412:7;69439:15;;;;;;;;;;;:39;;;:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;69432:48;;69346:142;:::o;66185:155::-;66271:7;66298:15;;;;;;;;;;;:25;;;66324:7;66298:34;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;66291:41;;66185:155;;;:::o;55457:31::-;;;;:::o;68158:411::-;68238:18;68271:14;68300:26;68340:15;;;;;;;;;;;:23;;;68364:3;68340:28;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;68223:145;;;;;;68540:10;68384:177;;68502:5;68384:177;;;68423:10;68448:6;68469:18;68522:3;68384:177;;;;;;;;;:::i;:::-;;;;;;;;68212:357;;;68158:411;:::o;29867:118::-;29932:7;29959:9;:18;29969:7;29959:18;;;;;;;;;;;;;;;;29952:25;;29867:118;;;:::o;25845:103::-;25056:13;:11;:13::i;:::-;25910:30:::1;25937:1;25910:18;:30::i;:::-;25845:103::o:0;62091:154::-;25056:13;:11;:13::i;:::-;62180:5:::1;62163:14;:22;;;;62225:12;;62208:14;;:29;;;;:::i;:::-;62196:9;:41;;;;62091:154:::0;:::o;55793:70::-;;;;;;;;;;;;;:::o;63891:306::-;25056:13;:11;:13::i;:::-;63984:6:::1;63973:8;:17;:38;;;;64005:6;63994:8;:17;63973:38;63969:114;;;64035:36;;;;;;;;;;;;;;63969:114;64134:16;;64124:8;64100:51;;;;;;;;;;64181:8;64162:16;:27;;;;63891:306:::0;:::o;59646:724::-;25056:13;:11;:13::i;:::-;59725:34:::1;59800:10;59725:97;;59877:4;59839:43;;:18;:24;;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:43;;;59835:121;;59906:38;;;;;;;;;;;;;;59835:121;59968:18;:39;;;60016:18;59968:68;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;60047:18;:39;;;60095:4;60047:54;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;60112:18;:39;;;60152:7;:5;:7::i;:::-;60112:48;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;60171:18;:39;;;60219:15;;;;;;;;;;;60171:65;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;60296:15;;;;;;;;;;;60254:59;;60276:10;60254:59;;;;;;;;;;;;60344:18;60326:15;;:36;;;;;;;;;;;;;;;;;;59714:656;59646:724:::0;:::o;25170:87::-;25216:7;25243:6;;;;;;;;;;;25236:13;;25170:87;:::o;28813:95::-;28860:13;28893:7;28886:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28813:95;:::o;62848:249::-;25056:13;:11;:13::i;:::-;62976::::1;;;;;;;;;;;62968:21;;:4;:21;;::::0;62964:71:::1;;62998:37;;;;;;;;;;;;;;62964:71;63048:41;63077:4;63083:5;63048:28;:41::i;:::-;62848:249:::0;;:::o;55600:41::-;;;;:::o;64722:109::-;64769:7;64796:15;;;;;;;;;;;:25;;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;64789:34;;64722:109;:::o;65786:168::-;65872:7;65899:15;;;;;;;;;;;:38;;;65938:7;65899:47;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;65892:54;;65786:168;;;:::o;30190:182::-;30259:4;30276:13;30292:12;:10;:12::i;:::-;30276:28;;30315:27;30325:5;30332:2;30336:5;30315:9;:27::i;:::-;30360:4;30353:11;;;30190:182;;;;:::o;66929:367::-;67059:7;67081:6;67102;67123:7;67145;67167;67189;67211;67253:15;;;;;;;;;;;:26;;;67280:7;67253:35;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;67246:42;;;;;;;;;;;;;;;;66929:367;;;;;;;;;:::o;55915:19::-;;;;;;;;;;;;;:::o;60653:184::-;25056:13;:11;:13::i;:::-;60769:8:::1;60738:19;:28;60758:7;60738:28;;;;;;;;;;;;;;;;:39;;;;;;;;;;;;;;;;;;60811:7;60795:34;;;60820:8;60795:34;;;;;;:::i;:::-;;;;;;;;60653:184:::0;;:::o;61150:330::-;25056:13;:11;:13::i;:::-;61293:9:::1;61288:116;61312:8;;:15;;61308:1;:19;61288:116;;;61384:8;61349:19;:32;61369:8;;61378:1;61369:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;61349:32;;;;;;;;;;;;;;;;:43;;;;;;;;;;;;;;;;;;61329:3;;;;;;;61288:116;;;;61421:51;61453:8;;61463;61421:51;;;;;;;;:::i;:::-;;;;;;;;61150:330:::0;;;:::o;73979:373::-;25056:13;:11;:13::i;:::-;74062:17:::1;74098:3;74082:13;:11;:13::i;:::-;:19;;;;:::i;:::-;74062:39;;74152:9;74140;:21;74136:94;;;74185:33;;;;;;;;;;;;;;74136:94;74284:18;;74273:9;74247:56;;;;;;;;;;74335:9;74314:18;:30;;;;74051:301;73979:373:::0;:::o;30435:167::-;30540:7;30567:11;:18;30579:5;30567:18;;;;;;;;;;;;;;;:27;30586:7;30567:27;;;;;;;;;;;;;;;;30560:34;;30435:167;;;;:::o;55360:33::-;;;;:::o;69017:130::-;69073:7;69100:15;;;;;;;;;;;:37;;;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;69093:46;;69017:130;:::o;64408:124::-;25056:13;:11;:13::i;:::-;64482:15:::1;;;;;;;;;;;:31;;;64514:9;64482:42;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;64408:124:::0;:::o;67579:377::-;67714:7;67736:6;67757;67778:7;67800;67822;67844;67866;67908:15;;;;;;;;;;;:33;;;67942:5;67908:40;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;67901:47;;;;;;;;;;;;;;;;67579:377;;;;;;;;;:::o;26103:220::-;25056:13;:11;:13::i;:::-;26208:1:::1;26188:22;;:8;:22;;::::0;26184:93:::1;;26262:1;26234:31;;;;;;;;;;;:::i;:::-;;;;;;;;26184:93;26287:28;26306:8;26287:18;:28::i;:::-;26103:220:::0;:::o;732:98::-;785:7;812:10;805:17;;732:98;:::o;35807:130::-;35892:37;35901:5;35908:7;35917:5;35924:4;35892:8;:37::i;:::-;35807:130;;;:::o;37566:603::-;37700:24;37727:25;37737:5;37744:7;37727:9;:25::i;:::-;37700:52;;37787:17;37767:16;:37;37763:399;;37844:5;37825:16;:24;37821:214;;;37926:7;37956:16;37995:5;37877:142;;;;;;;;;;;;;:::i;:::-;;;;;;;;37821:214;38078:57;38087:5;38094:7;38122:5;38103:16;:24;38129:5;38078:8;:57::i;:::-;37763:399;37689:480;37566:603;;;:::o;32382:308::-;32482:1;32466:18;;:4;:18;;;32462:88;;32535:1;32508:30;;;;;;;;;;;:::i;:::-;;;;;;;;32462:88;32578:1;32564:16;;:2;:16;;;32560:88;;32633:1;32604:32;;;;;;;;;;;:::i;:::-;;;;;;;;32560:88;32658:24;32666:4;32672:2;32676:5;32658:7;:24::i;:::-;32382:308;;;:::o;19795:315::-;19093:1;19924:7;;:18;19920:88;;19966:30;;;;;;;;;;;;;;19920:88;19093:1;20085:7;:17;;;;19795:315::o;20118:212::-;19050:1;20301:7;:21;;;;20118:212::o;25335:166::-;25406:12;:10;:12::i;:::-;25395:23;;:7;:5;:7::i;:::-;:23;;;25391:103;;25469:12;:10;:12::i;:::-;25442:40;;;;;;;;;;;:::i;:::-;;;;;;;;25391:103;25335:166::o;26483:191::-;26557:16;26576:6;;;;;;;;;;;26557:25;;26602:8;26593:6;;:17;;;;;;;;;;;;;;;;;;26657:8;26626:40;;26647:8;26626:40;;;;;;;;;;;;26546:128;26483:191;:::o;63410:262::-;63509:5;63493:7;:13;63501:4;63493:13;;;;;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;63531:5;63527:80;;;63553:15;;;;;;;;;;;:36;;;63590:4;63553:42;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63527:80;63658:5;63624:40;;63652:4;63624:40;;;;;;;;;;;;63410:262;;:::o;36788:486::-;36961:1;36944:19;;:5;:19;;;36940:91;;37016:1;36987:32;;;;;;;;;;;:::i;:::-;;;;;;;;36940:91;37064:1;37045:21;;:7;:21;;;37041:92;;37118:1;37090:31;;;;;;;;;;;:::i;:::-;;;;;;;;37041:92;37173:5;37143:11;:18;37155:5;37143:18;;;;;;;;;;;;;;;:27;37162:7;37143:27;;;;;;;;;;;;;;;:35;;;;37193:9;37189:78;;;37240:7;37224:31;;37233:5;37224:31;;;37249:5;37224:31;;;;;;:::i;:::-;;;;;;;;37189:78;36788:486;;;;:::o;69840:2179::-;69976:1;69966:6;:11;69962:91;;69994:26;70008:4;70014:2;70018:1;69994:13;:26::i;:::-;70035:7;;69962:91;70065:28;70096:24;70114:4;70096:9;:24::i;:::-;70065:55;;70133:12;70172:18;;70148:20;:42;;70133:57;;70201:12;70228:1;70216:8;;;;;;;;;;;:13;;;70201:28;;70240:11;70254:7;:13;70262:4;70254:13;;;;;;;;;;;;;;;;;;;;;;;;;:28;;;;70271:7;:11;70279:2;70271:11;;;;;;;;;;;;;;;;;;;;;;;;;70254:28;70240:42;;70313:7;:31;;;;;70337:7;70313:31;:62;;;;;70362:7;:13;70370:4;70362:13;;;;;;;;;;;;;;;;;;;;;;;;;70361:14;70313:62;:94;;;;;70400:7;:5;:7::i;:::-;70392:15;;:4;:15;;;;70313:94;:124;;;;;70430:7;:5;:7::i;:::-;70424:13;;:2;:13;;;;70313:124;:173;;;;;70470:15;;;;;;;;;;;70454:32;;:4;:32;;;;70313:173;:220;;;;;70517:15;;;;;;;;;;;70503:30;;:2;:30;;;;70313:220;70295:436;;;70573:1;70560:8;;:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70646:42;70667:20;70646;:42::i;:::-;70718:1;70705:8;;:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70295:436;70832:19;:25;70852:4;70832:25;;;;;;;;;;;;;;;;;;;;;;;;;:52;;;;70861:19;:23;70881:2;70861:23;;;;;;;;;;;;;;;;;;;;;;;;;70832:52;:63;;;;70889:6;70888:7;70832:63;70828:111;;;70922:5;70912:15;;70828:111;70955:7;70951:183;;;70979:15;56060:3;71007:9;;70998:6;:18;;;;:::i;:::-;70997:33;;;;:::i;:::-;70979:51;;71055:7;71045:17;;;;;:::i;:::-;;;71079:43;71093:4;71107;71114:7;71079:13;:43::i;:::-;70964:170;70951:183;71146:31;71160:4;71166:2;71170:6;71146:13;:31::i;:::-;71207:15;;;;;;;;;;;:26;;;71242:4;71249:15;71259:4;71249:9;:15::i;:::-;71266:4;71207:64;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71190:102;71319:15;;;;;;;;;;;:26;;;71354:2;71359:13;71369:2;71359:9;:13::i;:::-;71374:4;71319:60;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71302:98;71428:1;71416:8;;;;;;;;;;;:13;;;71412:600;;71446:11;71460:16;;71446:30;;71504:1;71491:8;;:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71524:15;;;;;;;;;;;:23;;;71548:3;71524:28;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;71520:452;;;71919:9;71716:231;;71866:4;71716:231;;;71763:10;71796:6;71825:18;71893:3;71716:231;;;;;;;;;:::i;:::-;;;;;;;;71553:410;;;71520:452;71999:1;71986:8;;:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71431:581;71412:600;69951:2068;;;;69840:2179;;;;:::o;33014:1135::-;33120:1;33104:18;;:4;:18;;;33100:552;;33258:5;33242:12;;:21;;;;;;;:::i;:::-;;;;;;;;33100:552;;;33296:19;33318:9;:15;33328:4;33318:15;;;;;;;;;;;;;;;;33296:37;;33366:5;33352:11;:19;33348:117;;;33424:4;33430:11;33443:5;33399:50;;;;;;;;;;;;;:::i;:::-;;;;;;;;33348:117;33620:5;33606:11;:19;33588:9;:15;33598:4;33588:15;;;;;;;;;;;;;;;:37;;;;33281:371;33100:552;33682:1;33668:16;;:2;:16;;;33664:435;;33850:5;33834:12;;:21;;;;;;;;;;;33664:435;;;34067:5;34050:9;:13;34060:2;34050:13;;;;;;;;;;;;;;;;:22;;;;;;;;;;;33664:435;34131:2;34116:25;;34125:4;34116:25;;;34135:5;34116:25;;;;;;:::i;:::-;;;;;;;;33014:1135;;;:::o;72293:713::-;19715:21;:19;:21::i;:::-;72456:14:::1;72537;;72522:12;;:29;;;;:::i;:::-;72492:12;;72474:15;:30;;;;:::i;:::-;72473:79;;;;:::i;:::-;72456:96;;72563:17;72601:9;72583:15;:27;;;;:::i;:::-;72563:47;;72689:64;72707:4;72722:15;;;;;;;;;;;72740:12;72689:9;:64::i;:::-;72816:27;72833:9;72816:16;:27::i;:::-;72889:15;;;;;;;;;;;:35;;;72925:12;72889:49;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;72954:44;72968:15;72985:12;72954:44;;;;;;;:::i;:::-;;;;;;;;72385:621;;19759:20:::0;:18;:20::i;:::-;72293:713;:::o;73195:571::-;73321:21;73359:1;73345:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;73321:40;;73390:4;73372;73377:1;73372:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;;;73416:4;;;;;;;;;;;73406;73411:1;73406:7;;;;;;;;:::i;:::-;;;;;;;:14;;;;;;;;;;;73433:62;73450:4;73465:15;;;;;;;;;;;73483:11;73433:8;:62::i;:::-;73534:15;;;;;;;;;;;:66;;;73615:11;73641:1;73685:4;73712;73732:15;73534:224;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;73250:516;73195:571;:::o;7:99:1:-;59:6;93:5;87:12;77:22;;7:99;;;:::o;112:169::-;196:11;230:6;225:3;218:19;270:4;265:3;261:14;246:29;;112:169;;;;:::o;287:246::-;368:1;378:113;392:6;389:1;386:13;378:113;;;477:1;472:3;468:11;462:18;458:1;453:3;449:11;442:39;414:2;411:1;407:10;402:15;;378:113;;;525:1;516:6;511:3;507:16;500:27;349:184;287:246;;;:::o;539:102::-;580:6;631:2;627:7;622:2;615:5;611:14;607:28;597:38;;539:102;;;:::o;647:377::-;735:3;763:39;796:5;763:39;:::i;:::-;818:71;882:6;877:3;818:71;:::i;:::-;811:78;;898:65;956:6;951:3;944:4;937:5;933:16;898:65;:::i;:::-;988:29;1010:6;988:29;:::i;:::-;983:3;979:39;972:46;;739:285;647:377;;;;:::o;1030:313::-;1143:4;1181:2;1170:9;1166:18;1158:26;;1230:9;1224:4;1220:20;1216:1;1205:9;1201:17;1194:47;1258:78;1331:4;1322:6;1258:78;:::i;:::-;1250:86;;1030:313;;;;:::o;1430:117::-;1539:1;1536;1529:12;1553:117;1662:1;1659;1652:12;1676:126;1713:7;1753:42;1746:5;1742:54;1731:65;;1676:126;;;:::o;1808:96::-;1845:7;1874:24;1892:5;1874:24;:::i;:::-;1863:35;;1808:96;;;:::o;1910:122::-;1983:24;2001:5;1983:24;:::i;:::-;1976:5;1973:35;1963:63;;2022:1;2019;2012:12;1963:63;1910:122;:::o;2038:139::-;2084:5;2122:6;2109:20;2100:29;;2138:33;2165:5;2138:33;:::i;:::-;2038:139;;;;:::o;2183:77::-;2220:7;2249:5;2238:16;;2183:77;;;:::o;2266:122::-;2339:24;2357:5;2339:24;:::i;:::-;2332:5;2329:35;2319:63;;2378:1;2375;2368:12;2319:63;2266:122;:::o;2394:139::-;2440:5;2478:6;2465:20;2456:29;;2494:33;2521:5;2494:33;:::i;:::-;2394:139;;;;:::o;2539:474::-;2607:6;2615;2664:2;2652:9;2643:7;2639:23;2635:32;2632:119;;;2670:79;;:::i;:::-;2632:119;2790:1;2815:53;2860:7;2851:6;2840:9;2836:22;2815:53;:::i;:::-;2805:63;;2761:117;2917:2;2943:53;2988:7;2979:6;2968:9;2964:22;2943:53;:::i;:::-;2933:63;;2888:118;2539:474;;;;;:::o;3019:90::-;3053:7;3096:5;3089:13;3082:21;3071:32;;3019:90;;;:::o;3115:109::-;3196:21;3211:5;3196:21;:::i;:::-;3191:3;3184:34;3115:109;;:::o;3230:210::-;3317:4;3355:2;3344:9;3340:18;3332:26;;3368:65;3430:1;3419:9;3415:17;3406:6;3368:65;:::i;:::-;3230:210;;;;:::o;3446:118::-;3533:24;3551:5;3533:24;:::i;:::-;3528:3;3521:37;3446:118;;:::o;3570:222::-;3663:4;3701:2;3690:9;3686:18;3678:26;;3714:71;3782:1;3771:9;3767:17;3758:6;3714:71;:::i;:::-;3570:222;;;;:::o;3798:60::-;3826:3;3847:5;3840:12;;3798:60;;;:::o;3864:142::-;3914:9;3947:53;3965:34;3974:24;3992:5;3974:24;:::i;:::-;3965:34;:::i;:::-;3947:53;:::i;:::-;3934:66;;3864:142;;;:::o;4012:126::-;4062:9;4095:37;4126:5;4095:37;:::i;:::-;4082:50;;4012:126;;;:::o;4144:150::-;4218:9;4251:37;4282:5;4251:37;:::i;:::-;4238:50;;4144:150;;;:::o;4300:179::-;4411:61;4466:5;4411:61;:::i;:::-;4406:3;4399:74;4300:179;;:::o;4485:270::-;4602:4;4640:2;4629:9;4625:18;4617:26;;4653:95;4745:1;4734:9;4730:17;4721:6;4653:95;:::i;:::-;4485:270;;;;:::o;4761:619::-;4838:6;4846;4854;4903:2;4891:9;4882:7;4878:23;4874:32;4871:119;;;4909:79;;:::i;:::-;4871:119;5029:1;5054:53;5099:7;5090:6;5079:9;5075:22;5054:53;:::i;:::-;5044:63;;5000:117;5156:2;5182:53;5227:7;5218:6;5207:9;5203:22;5182:53;:::i;:::-;5172:63;;5127:118;5284:2;5310:53;5355:7;5346:6;5335:9;5331:22;5310:53;:::i;:::-;5300:63;;5255:118;4761:619;;;;;:::o;5386:134::-;5444:9;5477:37;5508:5;5477:37;:::i;:::-;5464:50;;5386:134;;;:::o;5526:166::-;5608:9;5641:45;5680:5;5641:45;:::i;:::-;5628:58;;5526:166;;;:::o;5698:195::-;5817:69;5880:5;5817:69;:::i;:::-;5812:3;5805:82;5698:195;;:::o;5899:286::-;6024:4;6062:2;6051:9;6047:18;6039:26;;6075:103;6175:1;6164:9;6160:17;6151:6;6075:103;:::i;:::-;5899:286;;;;:::o;6191:86::-;6226:7;6266:4;6259:5;6255:16;6244:27;;6191:86;;;:::o;6283:112::-;6366:22;6382:5;6366:22;:::i;:::-;6361:3;6354:35;6283:112;;:::o;6401:214::-;6490:4;6528:2;6517:9;6513:18;6505:26;;6541:67;6605:1;6594:9;6590:17;6581:6;6541:67;:::i;:::-;6401:214;;;;:::o;6621:329::-;6680:6;6729:2;6717:9;6708:7;6704:23;6700:32;6697:119;;;6735:79;;:::i;:::-;6697:119;6855:1;6880:53;6925:7;6916:6;6905:9;6901:22;6880:53;:::i;:::-;6870:63;;6826:117;6621:329;;;;:::o;6956:118::-;7043:24;7061:5;7043:24;:::i;:::-;7038:3;7031:37;6956:118;;:::o;7080:222::-;7173:4;7211:2;7200:9;7196:18;7188:26;;7224:71;7292:1;7281:9;7277:17;7268:6;7224:71;:::i;:::-;7080:222;;;;:::o;7308:104::-;7353:7;7382:24;7400:5;7382:24;:::i;:::-;7371:35;;7308:104;;;:::o;7418:138::-;7499:32;7525:5;7499:32;:::i;:::-;7492:5;7489:43;7479:71;;7546:1;7543;7536:12;7479:71;7418:138;:::o;7562:155::-;7616:5;7654:6;7641:20;7632:29;;7670:41;7705:5;7670:41;:::i;:::-;7562:155;;;;:::o;7723:345::-;7790:6;7839:2;7827:9;7818:7;7814:23;7810:32;7807:119;;;7845:79;;:::i;:::-;7807:119;7965:1;7990:61;8043:7;8034:6;8023:9;8019:22;7990:61;:::i;:::-;7980:71;;7936:125;7723:345;;;;:::o;8074:329::-;8133:6;8182:2;8170:9;8161:7;8157:23;8153:32;8150:119;;;8188:79;;:::i;:::-;8150:119;8308:1;8333:53;8378:7;8369:6;8358:9;8354:22;8333:53;:::i;:::-;8323:63;;8279:117;8074:329;;;;:::o;8409:116::-;8479:21;8494:5;8479:21;:::i;:::-;8472:5;8469:32;8459:60;;8515:1;8512;8505:12;8459:60;8409:116;:::o;8531:133::-;8574:5;8612:6;8599:20;8590:29;;8628:30;8652:5;8628:30;:::i;:::-;8531:133;;;;:::o;8670:468::-;8735:6;8743;8792:2;8780:9;8771:7;8767:23;8763:32;8760:119;;;8798:79;;:::i;:::-;8760:119;8918:1;8943:53;8988:7;8979:6;8968:9;8964:22;8943:53;:::i;:::-;8933:63;;8889:117;9045:2;9071:50;9113:7;9104:6;9093:9;9089:22;9071:50;:::i;:::-;9061:60;;9016:115;8670:468;;;;;:::o;9144:76::-;9180:7;9209:5;9198:16;;9144:76;;;:::o;9226:115::-;9311:23;9328:5;9311:23;:::i;:::-;9306:3;9299:36;9226:115;;:::o;9347:989::-;9632:4;9670:3;9659:9;9655:19;9647:27;;9684:71;9752:1;9741:9;9737:17;9728:6;9684:71;:::i;:::-;9765:70;9831:2;9820:9;9816:18;9807:6;9765:70;:::i;:::-;9845;9911:2;9900:9;9896:18;9887:6;9845:70;:::i;:::-;9925:72;9993:2;9982:9;9978:18;9969:6;9925:72;:::i;:::-;10007:73;10075:3;10064:9;10060:19;10051:6;10007:73;:::i;:::-;10090;10158:3;10147:9;10143:19;10134:6;10090:73;:::i;:::-;10173;10241:3;10230:9;10226:19;10217:6;10173:73;:::i;:::-;10256;10324:3;10313:9;10309:19;10300:6;10256:73;:::i;:::-;9347:989;;;;;;;;;;;:::o;10342:117::-;10451:1;10448;10441:12;10465:117;10574:1;10571;10564:12;10588:117;10697:1;10694;10687:12;10728:568;10801:8;10811:6;10861:3;10854:4;10846:6;10842:17;10838:27;10828:122;;10869:79;;:::i;:::-;10828:122;10982:6;10969:20;10959:30;;11012:18;11004:6;11001:30;10998:117;;;11034:79;;:::i;:::-;10998:117;11148:4;11140:6;11136:17;11124:29;;11202:3;11194:4;11186:6;11182:17;11172:8;11168:32;11165:41;11162:128;;;11209:79;;:::i;:::-;11162:128;10728:568;;;;;:::o;11302:698::-;11394:6;11402;11410;11459:2;11447:9;11438:7;11434:23;11430:32;11427:119;;;11465:79;;:::i;:::-;11427:119;11613:1;11602:9;11598:17;11585:31;11643:18;11635:6;11632:30;11629:117;;;11665:79;;:::i;:::-;11629:117;11778:80;11850:7;11841:6;11830:9;11826:22;11778:80;:::i;:::-;11760:98;;;;11556:312;11907:2;11933:50;11975:7;11966:6;11955:9;11951:22;11933:50;:::i;:::-;11923:60;;11878:115;11302:698;;;;;:::o;12006:474::-;12074:6;12082;12131:2;12119:9;12110:7;12106:23;12102:32;12099:119;;;12137:79;;:::i;:::-;12099:119;12257:1;12282:53;12327:7;12318:6;12307:9;12303:22;12282:53;:::i;:::-;12272:63;;12228:117;12384:2;12410:53;12455:7;12446:6;12435:9;12431:22;12410:53;:::i;:::-;12400:63;;12355:118;12006:474;;;;;:::o;12486:180::-;12534:77;12531:1;12524:88;12631:4;12628:1;12621:15;12655:4;12652:1;12645:15;12672:320;12716:6;12753:1;12747:4;12743:12;12733:22;;12800:1;12794:4;12790:12;12821:18;12811:81;;12877:4;12869:6;12865:17;12855:27;;12811:81;12939:2;12931:6;12928:14;12908:18;12905:38;12902:84;;12958:18;;:::i;:::-;12902:84;12723:269;12672:320;;;:::o;12998:170::-;13138:22;13134:1;13126:6;13122:14;13115:46;12998:170;:::o;13174:366::-;13316:3;13337:67;13401:2;13396:3;13337:67;:::i;:::-;13330:74;;13413:93;13502:3;13413:93;:::i;:::-;13531:2;13526:3;13522:12;13515:19;;13174:366;;;:::o;13546:419::-;13712:4;13750:2;13739:9;13735:18;13727:26;;13799:9;13793:4;13789:20;13785:1;13774:9;13770:17;13763:47;13827:131;13953:4;13827:131;:::i;:::-;13819:139;;13546:419;;;:::o;13971:147::-;14072:11;14109:3;14094:18;;13971:147;;;;:::o;14124:114::-;;:::o;14244:398::-;14403:3;14424:83;14505:1;14500:3;14424:83;:::i;:::-;14417:90;;14516:93;14605:3;14516:93;:::i;:::-;14634:1;14629:3;14625:11;14618:18;;14244:398;;;:::o;14648:379::-;14832:3;14854:147;14997:3;14854:147;:::i;:::-;14847:154;;15018:3;15011:10;;14648:379;;;:::o;15033:169::-;15173:21;15169:1;15161:6;15157:14;15150:45;15033:169;:::o;15208:366::-;15350:3;15371:67;15435:2;15430:3;15371:67;:::i;:::-;15364:74;;15447:93;15536:3;15447:93;:::i;:::-;15565:2;15560:3;15556:12;15549:19;;15208:366;;;:::o;15580:419::-;15746:4;15784:2;15773:9;15769:18;15761:26;;15833:9;15827:4;15823:20;15819:1;15808:9;15804:17;15797:47;15861:131;15987:4;15861:131;:::i;:::-;15853:139;;15580:419;;;:::o;16005:143::-;16062:5;16093:6;16087:13;16078:22;;16109:33;16136:5;16109:33;:::i;:::-;16005:143;;;;:::o;16154:351::-;16224:6;16273:2;16261:9;16252:7;16248:23;16244:32;16241:119;;;16279:79;;:::i;:::-;16241:119;16399:1;16424:64;16480:7;16471:6;16460:9;16456:22;16424:64;:::i;:::-;16414:74;;16370:128;16154:351;;;;:::o;16511:142::-;16614:32;16640:5;16614:32;:::i;:::-;16609:3;16602:45;16511:142;;:::o;16659:352::-;16790:4;16828:2;16817:9;16813:18;16805:26;;16841:87;16925:1;16914:9;16910:17;16901:6;16841:87;:::i;:::-;16938:66;17000:2;16989:9;16985:18;16976:6;16938:66;:::i;:::-;16659:352;;;;;:::o;17017:137::-;17071:5;17102:6;17096:13;17087:22;;17118:30;17142:5;17118:30;:::i;:::-;17017:137;;;;:::o;17160:345::-;17227:6;17276:2;17264:9;17255:7;17251:23;17247:32;17244:119;;;17282:79;;:::i;:::-;17244:119;17402:1;17427:61;17480:7;17471:6;17460:9;17456:22;17427:61;:::i;:::-;17417:71;;17373:125;17160:345;;;;:::o;17511:180::-;17559:77;17556:1;17549:88;17656:4;17653:1;17646:15;17680:4;17677:1;17670:15;17697:191;17737:3;17756:20;17774:1;17756:20;:::i;:::-;17751:25;;17790:20;17808:1;17790:20;:::i;:::-;17785:25;;17833:1;17830;17826:9;17819:16;;17854:3;17851:1;17848:10;17845:36;;;17861:18;;:::i;:::-;17845:36;17697:191;;;;:::o;17894:663::-;17982:6;17990;17998;18047:2;18035:9;18026:7;18022:23;18018:32;18015:119;;;18053:79;;:::i;:::-;18015:119;18173:1;18198:64;18254:7;18245:6;18234:9;18230:22;18198:64;:::i;:::-;18188:74;;18144:128;18311:2;18337:64;18393:7;18384:6;18373:9;18369:22;18337:64;:::i;:::-;18327:74;;18282:129;18450:2;18476:64;18532:7;18523:6;18512:9;18508:22;18476:64;:::i;:::-;18466:74;;18421:129;17894:663;;;;;:::o;18563:553::-;18740:4;18778:3;18767:9;18763:19;18755:27;;18792:71;18860:1;18849:9;18845:17;18836:6;18792:71;:::i;:::-;18873:72;18941:2;18930:9;18926:18;18917:6;18873:72;:::i;:::-;18955;19023:2;19012:9;19008:18;18999:6;18955:72;:::i;:::-;19037;19105:2;19094:9;19090:18;19081:6;19037:72;:::i;:::-;18563:553;;;;;;;:::o;19122:143::-;19179:5;19210:6;19204:13;19195:22;;19226:33;19253:5;19226:33;:::i;:::-;19122:143;;;;:::o;19271:351::-;19341:6;19390:2;19378:9;19369:7;19365:23;19361:32;19358:119;;;19396:79;;:::i;:::-;19358:119;19516:1;19541:64;19597:7;19588:6;19577:9;19573:22;19541:64;:::i;:::-;19531:74;;19487:128;19271:351;;;;:::o;19628:120::-;19700:23;19717:5;19700:23;:::i;:::-;19693:5;19690:34;19680:62;;19738:1;19735;19728:12;19680:62;19628:120;:::o;19754:141::-;19810:5;19841:6;19835:13;19826:22;;19857:32;19883:5;19857:32;:::i;:::-;19754:141;;;;:::o;19901:1444::-;20032:6;20040;20048;20056;20064;20072;20080;20088;20137:3;20125:9;20116:7;20112:23;20108:33;20105:120;;;20144:79;;:::i;:::-;20105:120;20264:1;20289:64;20345:7;20336:6;20325:9;20321:22;20289:64;:::i;:::-;20279:74;;20235:128;20402:2;20428:63;20483:7;20474:6;20463:9;20459:22;20428:63;:::i;:::-;20418:73;;20373:128;20540:2;20566:63;20621:7;20612:6;20601:9;20597:22;20566:63;:::i;:::-;20556:73;;20511:128;20678:2;20704:64;20760:7;20751:6;20740:9;20736:22;20704:64;:::i;:::-;20694:74;;20649:129;20817:3;20844:64;20900:7;20891:6;20880:9;20876:22;20844:64;:::i;:::-;20834:74;;20788:130;20957:3;20984:64;21040:7;21031:6;21020:9;21016:22;20984:64;:::i;:::-;20974:74;;20928:130;21097:3;21124:64;21180:7;21171:6;21160:9;21156:22;21124:64;:::i;:::-;21114:74;;21068:130;21237:3;21264:64;21320:7;21311:6;21300:9;21296:22;21264:64;:::i;:::-;21254:74;;21208:130;19901:1444;;;;;;;;;;;:::o;21351:180::-;21399:77;21396:1;21389:88;21496:4;21493:1;21486:15;21520:4;21517:1;21510:15;21537:184;21636:11;21670:6;21665:3;21658:19;21710:4;21705:3;21701:14;21686:29;;21537:184;;;;:::o;21727:102::-;21796:4;21819:3;21811:11;;21727:102;;;:::o;21835:108::-;21912:24;21930:5;21912:24;:::i;:::-;21907:3;21900:37;21835:108;;:::o;21949:179::-;22018:10;22039:46;22081:3;22073:6;22039:46;:::i;:::-;22117:4;22112:3;22108:14;22094:28;;21949:179;;;;:::o;22134:122::-;22186:5;22211:39;22246:2;22241:3;22237:12;22232:3;22211:39;:::i;:::-;22202:48;;22134:122;;;;:::o;22262:115::-;22334:4;22366;22361:3;22357:14;22349:22;;22262:115;;;:::o;22413:699::-;22542:3;22565:86;22644:6;22639:3;22565:86;:::i;:::-;22558:93;;22675:58;22727:5;22675:58;:::i;:::-;22756:7;22787:1;22772:315;22797:6;22794:1;22791:13;22772:315;;;22867:42;22902:6;22893:7;22867:42;:::i;:::-;22929:63;22988:3;22973:13;22929:63;:::i;:::-;22922:70;;23015:62;23070:6;23015:62;:::i;:::-;23005:72;;22832:255;22819:1;22816;22812:9;22807:14;;22772:315;;;22776:14;23103:3;23096:10;;22547:565;;22413:699;;;;;:::o;23118:491::-;23293:4;23331:2;23320:9;23316:18;23308:26;;23380:9;23374:4;23370:20;23366:1;23355:9;23351:17;23344:47;23408:118;23521:4;23512:6;23504;23408:118;:::i;:::-;23400:126;;23536:66;23598:2;23587:9;23583:18;23574:6;23536:66;:::i;:::-;23118:491;;;;;;:::o;23615:180::-;23663:77;23660:1;23653:88;23760:4;23757:1;23750:15;23784:4;23781:1;23774:15;23801:185;23841:1;23858:20;23876:1;23858:20;:::i;:::-;23853:25;;23892:20;23910:1;23892:20;:::i;:::-;23887:25;;23931:1;23921:35;;23936:18;;:::i;:::-;23921:35;23978:1;23975;23971:9;23966:14;;23801:185;;;;:::o;23992:442::-;24141:4;24179:2;24168:9;24164:18;24156:26;;24192:71;24260:1;24249:9;24245:17;24236:6;24192:71;:::i;:::-;24273:72;24341:2;24330:9;24326:18;24317:6;24273:72;:::i;:::-;24355;24423:2;24412:9;24408:18;24399:6;24355:72;:::i;:::-;23992:442;;;;;;:::o;24440:410::-;24480:7;24503:20;24521:1;24503:20;:::i;:::-;24498:25;;24537:20;24555:1;24537:20;:::i;:::-;24532:25;;24592:1;24589;24585:9;24614:30;24632:11;24614:30;:::i;:::-;24603:41;;24793:1;24784:7;24780:15;24777:1;24774:22;24754:1;24747:9;24727:83;24704:139;;24823:18;;:::i;:::-;24704:139;24488:362;24440:410;;;;:::o;24856:194::-;24896:4;24916:20;24934:1;24916:20;:::i;:::-;24911:25;;24950:20;24968:1;24950:20;:::i;:::-;24945:25;;24994:1;24991;24987:9;24979:17;;25018:1;25012:4;25009:11;25006:37;;;25023:18;;:::i;:::-;25006:37;24856:194;;;;:::o;25056:462::-;25215:4;25253:2;25242:9;25238:18;25230:26;;25266:87;25350:1;25339:9;25335:17;25326:6;25266:87;:::i;:::-;25363:72;25431:2;25420:9;25416:18;25407:6;25363:72;:::i;:::-;25445:66;25507:2;25496:9;25492:18;25483:6;25445:66;:::i;:::-;25056:462;;;;;;:::o;25524:332::-;25645:4;25683:2;25672:9;25668:18;25660:26;;25696:71;25764:1;25753:9;25749:17;25740:6;25696:71;:::i;:::-;25777:72;25845:2;25834:9;25830:18;25821:6;25777:72;:::i;:::-;25524:332;;;;;:::o;25862:180::-;25910:77;25907:1;25900:88;26007:4;26004:1;25997:15;26031:4;26028:1;26021:15;26048:85;26093:7;26122:5;26111:16;;26048:85;;;:::o;26139:158::-;26197:9;26230:61;26248:42;26257:32;26283:5;26257:32;:::i;:::-;26248:42;:::i;:::-;26230:61;:::i;:::-;26217:74;;26139:158;;;:::o;26303:147::-;26398:45;26437:5;26398:45;:::i;:::-;26393:3;26386:58;26303:147;;:::o;26456:114::-;26523:6;26557:5;26551:12;26541:22;;26456:114;;;:::o;26576:132::-;26643:4;26666:3;26658:11;;26696:4;26691:3;26687:14;26679:22;;26576:132;;;:::o;26714:113::-;26784:4;26816;26811:3;26807:14;26799:22;;26714:113;;;:::o;26863:732::-;26982:3;27011:54;27059:5;27011:54;:::i;:::-;27081:86;27160:6;27155:3;27081:86;:::i;:::-;27074:93;;27191:56;27241:5;27191:56;:::i;:::-;27270:7;27301:1;27286:284;27311:6;27308:1;27305:13;27286:284;;;27387:6;27381:13;27414:63;27473:3;27458:13;27414:63;:::i;:::-;27407:70;;27500:60;27553:6;27500:60;:::i;:::-;27490:70;;27346:224;27333:1;27330;27326:9;27321:14;;27286:284;;;27290:14;27586:3;27579:10;;26987:608;;;26863:732;;;;:::o;27601:831::-;27864:4;27902:3;27891:9;27887:19;27879:27;;27916:71;27984:1;27973:9;27969:17;27960:6;27916:71;:::i;:::-;27997:80;28073:2;28062:9;28058:18;28049:6;27997:80;:::i;:::-;28124:9;28118:4;28114:20;28109:2;28098:9;28094:18;28087:48;28152:108;28255:4;28246:6;28152:108;:::i;:::-;28144:116;;28270:72;28338:2;28327:9;28323:18;28314:6;28270:72;:::i;:::-;28352:73;28420:3;28409:9;28405:19;28396:6;28352:73;:::i;:::-;27601:831;;;;;;;;:::o
Swarm Source
ipfs://ce8781d879bc63ac6ab506fda875e8cc22eaeb6b022fa2b643f9f532e2696319
Loading...
Loading
Loading...
Loading
OVERVIEW
LegalX are prepared to take legal action against any individuals or entities within the cryptocurrency sector, including founders, developers, and influencers.Multichain Portfolio | 34 Chains
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ 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.