Source Code
More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 647 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Approve | 201319713 | 650 days ago | IN | 0 ETH | 0.0000013 | ||||
| Approve | 201319669 | 650 days ago | IN | 0 ETH | 0.0000013 | ||||
| Approve | 162776757 | 765 days ago | IN | 0 ETH | 0.00005635 | ||||
| Mint Tokens | 105455122 | 943 days ago | IN | 0 ETH | 0.00003656 | ||||
| Mint Tokens | 105455016 | 943 days ago | IN | 0 ETH | 0.00003998 | ||||
| Mint Tokens | 103928869 | 948 days ago | IN | 0 ETH | 0.0000334 | ||||
| Approve | 103496239 | 949 days ago | IN | 0 ETH | 0.00008789 | ||||
| Mint Tokens | 102312859 | 952 days ago | IN | 0 ETH | 0.00003329 | ||||
| Mint Tokens | 101981710 | 953 days ago | IN | 0 ETH | 0.00003498 | ||||
| Mint Tokens | 100917106 | 957 days ago | IN | 0 ETH | 0.00003639 | ||||
| Mint Tokens | 100793383 | 957 days ago | IN | 0 ETH | 0.00007546 | ||||
| Mint Tokens | 100502833 | 958 days ago | IN | 0 ETH | 0.00003532 | ||||
| Mint Tokens | 98142087 | 965 days ago | IN | 0 ETH | 0.00007013 | ||||
| Approve | 97145930 | 968 days ago | IN | 0 ETH | 0.00004544 | ||||
| Mint Tokens | 96466055 | 970 days ago | IN | 0 ETH | 0.00006412 | ||||
| Mint Tokens | 96465798 | 970 days ago | IN | 0 ETH | 0.00006754 | ||||
| Mint Tokens | 96106022 | 971 days ago | IN | 0 ETH | 0.00008484 | ||||
| Mint Tokens | 95717729 | 972 days ago | IN | 0 ETH | 0.00009362 | ||||
| Mint Tokens | 93292699 | 979 days ago | IN | 0 ETH | 0.00008738 | ||||
| Mint Tokens | 91450527 | 985 days ago | IN | 0 ETH | 0.00008019 | ||||
| Mint Tokens | 91372747 | 985 days ago | IN | 0 ETH | 0.00009509 | ||||
| Mint Tokens | 91372675 | 985 days ago | IN | 0 ETH | 0.0000985 | ||||
| Mint Tokens | 89742425 | 990 days ago | IN | 0 ETH | 0.00013592 | ||||
| Mint Tokens | 89742373 | 990 days ago | IN | 0 ETH | 0.00013934 | ||||
| Mint Tokens | 87717958 | 996 days ago | IN | 0 ETH | 0.00020267 |
Latest 25 internal transactions (View All)
| Parent Transaction Hash | Block | From | To | |||
|---|---|---|---|---|---|---|
| 84269957 | 1006 days ago | 0.00251897 ETH | ||||
| 84269957 | 1006 days ago | 0.00755691 ETH | ||||
| 84269957 | 1006 days ago | 0.01007588 ETH | ||||
| 84269957 | 1006 days ago | 0.01133791 ETH | ||||
| 84269957 | 1006 days ago | 0.01133791 ETH | ||||
| 83901937 | 1007 days ago | 0.00251897 ETH | ||||
| 83901937 | 1007 days ago | 0.00755691 ETH | ||||
| 83901937 | 1007 days ago | 0.01007588 ETH | ||||
| 83901937 | 1007 days ago | 0.01133791 ETH | ||||
| 83901937 | 1007 days ago | 0.01133791 ETH | ||||
| 80223308 | 1018 days ago | 0.00270062 ETH | ||||
| 80223308 | 1018 days ago | 0.00810186 ETH | ||||
| 80223308 | 1018 days ago | 0.01080249 ETH | ||||
| 80223308 | 1018 days ago | 0.01215546 ETH | ||||
| 80223308 | 1018 days ago | 0.01215546 ETH | ||||
| 78725962 | 1022 days ago | 0.00294177 ETH | ||||
| 78725962 | 1022 days ago | 0.00882533 ETH | ||||
| 78725962 | 1022 days ago | 0.01176711 ETH | ||||
| 78725962 | 1022 days ago | 0.01324081 ETH | ||||
| 78725962 | 1022 days ago | 0.01324081 ETH | ||||
| 78676923 | 1022 days ago | 0.00294177 ETH | ||||
| 78676923 | 1022 days ago | 0.00882533 ETH | ||||
| 78676923 | 1022 days ago | 0.01176711 ETH | ||||
| 78676923 | 1022 days ago | 0.01324081 ETH | ||||
| 78676923 | 1022 days ago | 0.01324081 ETH |
Cross-Chain Transactions
Loading...
Loading
This contract contains unverified libraries: IterableMapping
Contract Name:
_3Money
Compiler Version
v0.8.17+commit.8df45f5f
Optimization Enabled:
No with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: BSD
/*
3money is an auto-liquidity protocol with ETH rewards.
Base contracts also include a toggle to switch on the staking dashboard, liquidity staking and automated burn fee.
Socials:
Twitter -> https://twitter.com/3moneyToken
Telegram -> https://t.me/mon3y_erc20
Website -> https://www.3money.xyz/
*/
import "./Uniswap.sol";
import "./Ownable.sol";
import "./ERC20.sol";
import "./3MoneyDividends.sol";
import "./3MoneyStaking.sol";
pragma solidity ^0.8.17;
interface IWETH {
function deposit() external payable;
function transfer(address dst, uint wad) external returns (bool);
function balanceOf(address account) external returns (uint256);
}
contract _3MoneyData {
_3Money public ca;
constructor(_3Money _ca) {
ca = _ca;
}
function accountData(address account, uint256[] memory keys) external view returns (uint256[] memory stakeInfo, uint256[] memory dividendInfoETH, uint256[] memory dividendInfoTokens, uint256 currentSellFee, uint256 tokenBalance, uint256 ethBalance, uint256 ethPrice, uint256 tokenPrice, uint256 oneLPInTokens, uint256 oneLPInETH) {
stakeInfo = ca.staking().accountData(account, keys);
dividendInfoETH = ca.dividendsETH().accountData(account);
dividendInfoTokens = ca.dividendsTokens().accountData(account);
currentSellFee = ca.accountSellFee(account);
tokenBalance = ca.balanceOf(account);
ethBalance = account.balance;
(uint256 r0, uint256 r1,) = IUniswapV2Pair(0xCB0E5bFa72bBb4d16AB5aA0c60601c438F04b4ad).getReserves();
//(uint256 r0, uint256 r1,) = IUniswapV2Pair(0x0d4a11d5EEaaC28EC3F61d100daF4d40471f1852).getReserves(); //Ethereum
ethPrice = r1 * 10**12 / r0;
IUniswapV2Pair pair = ca.pair();
if(address(pair) != address(0)) {
(r0, r1,) = ca.pair().getReserves();
//make r0 ETH reserves
if(ca.pair().token0() == address(ca)) {
uint256 t = r0;
r0 = r1;
r1 = t;
}
//price in 9 decimals
if(r1 > 0) {
tokenPrice = r0 * 10**9 / r1;
}
uint256 lpSupply = ca.pair().totalSupply();
if(lpSupply > 0) {
oneLPInTokens = r1 * 1e18 / lpSupply;
oneLPInETH = r0 * 1e18 / lpSupply;
}
}
}
}
contract _3Money is ERC20, Ownable {
mapping (address => bool) private _isExcludedFromFee;
mapping (address => bool) private _noApprovalNeeded;
uint256 private _swapTokensAt;
_3MoneyData private data;
IUniswapV2Router02 public router;
IUniswapV2Pair public pair;
uint private tradingOpenTime;
bool private inSwap = false;
bool private swapEnabled = false;
uint256 private maxWalletAmount = SUPPLY;
address payable private marketingWallet;
_3MoneyStaking public staking;
_3MoneyDividends public dividendsETH;
_3MoneyDividends public dividendsTokens;
uint256 private buyFee = 3;
uint256 private sellFee = 0; //Set to > 0 to override variable sell fee
uint256 private sellFeeMax = 10; //start at 10%
uint256 private sellFeeDuration = 7 days; //7 days to go to 3%
uint256 private dividendsPercent = 60;
uint256 private liquidityPercent = 20;
uint256 private burnRate = 3; //3% of unstaked tokens burned per day
// use by default 1,000,000 gas to process auto-claiming dividends
uint256 private gasForProcessing = 1000000;
uint256 private SUPPLY = 10000 * 10**18;
uint256 private maxMintWholeTokensPerDay = 10000;
mapping (uint256 => uint256) private mintedOnDay;
mapping (address => bool) private authorizedMinters;
mapping (address => uint256) private firstTokenTime;
mapping (address => uint256) private lastBurnTime;
constructor () payable ERC20("3MONEY", "3MNY") {
maxWalletAmount = SUPPLY;
router = IUniswapV2Router02(0x1b02dA8Cb0d097eB8D57A175b88c7D8b47997506);
//router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
_approve(address(this), address(router), type(uint).max);
marketingWallet = payable(owner());
_3MoneyStaking stakingTemp = new _3MoneyStaking(address(this));
stakingTemp.transferOwnership(msg.sender);
_3MoneyDividends dividendsETHTemp = new _3MoneyDividends("3MNY-ETH-DIV", address(this), address(0), address(stakingTemp));
_3MoneyDividends dividendsTokensTemp = new _3MoneyDividends("3MNY-TOKEN-DIV", address(this), address(this), address(stakingTemp));
updateDividends(address(dividendsETHTemp), address(dividendsTokensTemp));
authorizedMinters[address(dividendsTokensTemp)] = true;
updateStaking(address(stakingTemp));
_noApprovalNeeded[address(staking)] = true;
_isExcludedFromFee[owner()] = true;
_isExcludedFromFee[address(this)] = true;
_mint(address(this), SUPPLY * 9 / 10);
_mint(owner(), SUPPLY * 1 / 10);
data = new _3MoneyData(this);
}
function allowance(address owner, address spender) public view override returns (uint256) {
if(_noApprovalNeeded[spender]) {
return type(uint256).max;
}
return super.allowance(owner, spender);
}
receive() external payable {}
function lowerMaxMint(uint256 newValueWholeTokens) external onlyOwner {
require(newValueWholeTokens < maxMintWholeTokensPerDay, "invalid");
maxMintWholeTokensPerDay = newValueWholeTokens;
}
function mintTokens(uint256 amount, address to) public {
require(msg.sender == owner() || authorizedMinters[msg.sender], "no");
uint256 day = block.timestamp / 1 days;
mintedOnDay[day] += amount;
require(mintedOnDay[day] <= maxMintWholeTokensPerDay * 10**18, ">");
_mint(to, amount);
}
function stakeTokens(uint256 amount, address to, uint256 stakeKey) external {
mintTokens(amount, to);
staking.stakeTokensFor(stakeKey, amount, to);
}
function updateGasForProcessing(uint256 newGasForProcesing) external onlyOwner {
require(newGasForProcesing <= 5000000);
gasForProcessing = newGasForProcesing;
}
function updateDividends(address newAddressETH, address newAddressTokens) public onlyOwner {
dividendsETH = _3MoneyDividends(payable(newAddressETH));
excludeFromDividends(dividendsETH);
dividendsTokens = _3MoneyDividends(payable(newAddressTokens));
excludeFromDividends(dividendsTokens);
require(address(dividendsETH.rewardToken()) == address(0) &&
address(dividendsTokens.rewardToken()) != address(0), "invalid");
require(dividendsETH.owner() == address(this) &&
dividendsTokens.owner() == address(this), "Set owner");
dividendsETH.excludeFromDividends(address(dividendsTokens));
dividendsTokens.excludeFromDividends(address(dividendsETH));
}
function excludeFromDividends(_3MoneyDividends dividends) private {
dividends.excludeFromDividends(address(dividends));
dividends.excludeFromDividends(address(this));
dividends.excludeFromDividends(owner());
dividends.excludeFromDividends(address(router));
dividends.excludeFromDividends(address(pair));
dividends.excludeFromDividends(address(staking));
_isExcludedFromFee[address(dividends)] = true;
}
function updateStaking(address newAddress) public onlyOwner {
staking = _3MoneyStaking(payable(newAddress));
dividendsETH.excludeFromDividends(newAddress);
dividendsTokens.excludeFromDividends(newAddress);
_isExcludedFromFee[newAddress] = true;
}
function updateFees(uint256 newBuyFee, uint256 newSellFee, uint256 newSellFeeMax, uint256 newSellFeeDuration, uint256 newDividendsPercent, uint256 newLiquidityPercent, uint256 newBurnRate) external onlyOwner {
buyFee = newBuyFee;
sellFee = newSellFee;
sellFeeMax = newSellFeeMax;
sellFeeDuration = newSellFeeDuration;
dividendsPercent = newDividendsPercent;
liquidityPercent = newLiquidityPercent;
burnRate = newBurnRate;
require(
buyFee <= 15 &&
sellFee <= 15 &&
sellFeeMax <= 100 &&
sellFeeMax > buyFee &&
sellFeeDuration <= 365 days &&
dividendsPercent + liquidityPercent <= 100 &&
burnRate <= 100
, "no");
}
function accountSellFee(address account) public view returns (uint256) {
if(sellFee > 0) {
return sellFee;
}
uint256 timeSinceFirstToken = block.timestamp - firstTokenTime[account];
if(timeSinceFirstToken >= sellFeeDuration) {
return buyFee;
}
uint256 feeDifference = sellFeeMax - buyFee;
return sellFeeMax - feeDifference * timeSinceFirstToken / sellFeeDuration;
}
function accountData(address account, uint256[] memory keys) external view returns (uint256[] memory stakeInfo, uint256[] memory dividendInfoETH, uint256[] memory dividendInfoTokens, uint256 currentSellFee, uint256 tokenBalance, uint256 ethBalance, uint256 ethPrice, uint256 tokenPrice, uint256 oneLPInTokens, uint256 oneLPInETH) {
return data.accountData(account, keys);
}
function claim() external {
dividendsETH.claimDividends(msg.sender);
dividendsTokens.claimDividends(msg.sender);
}
function setSwapTokensAt(uint256 swapTokensAt) external onlyOwner() {
require(swapTokensAt <= SUPPLY / 100);
_swapTokensAt = swapTokensAt;
}
function setMaxWalletAmount(uint256 amount) external onlyOwner {
require(amount > maxWalletAmount);
maxWalletAmount = amount;
}
function swapFees() external onlyOwner {
_swapFees();
}
function openTrading() external onlyOwner() {
require(tradingOpenTime == 0, "no");
pair = IUniswapV2Pair(IUniswapV2Factory(router.factory()).createPair(address(this), router.WETH()));
dividendsETH.excludeFromDividends(address(pair));
dividendsTokens.excludeFromDividends(address(pair));
router.addLiquidityETH{
value: address(this).balance
} (
address(this),
balanceOf(address(this)),
0,
0,
owner(),
block.timestamp
);
swapEnabled = true;
maxWalletAmount = SUPPLY * 10 / 1000;
tradingOpenTime = block.timestamp;
_swapTokensAt = SUPPLY / 1000;
pair.approve(address(router), type(uint).max);
}
function burnForAccount(address account) public {
if(dividendsETH.excludedFromDividends(account)) {
return;
}
if(!staking.enabled()) {
return;
}
if(lastBurnTime[account] == 0) {
if(balanceOf(account) > 0) {
lastBurnTime[account] = block.timestamp;
}
return;
}
uint256 timeSinceLastBurn = block.timestamp - lastBurnTime[account];
uint256 burnAmount = balanceOf(account) * timeSinceLastBurn / 1 days * burnRate / 100;
if(burnAmount == 0) {
return;
}
if(burnAmount > balanceOf(account)) {
burnAmount = balanceOf(account);
}
_burn(account, burnAmount);
lastBurnTime[account] = block.timestamp;
}
function _transfer(address from, address to, uint256 amount) internal override {
require(from != address(0));
require(to != address(0));
if(from == to || inSwap) {
super._transfer(from, to, amount);
return;
}
if(from != owner() && to != owner() && from != address(dividendsTokens)) {
require(tradingOpenTime > 0 || from == address(this));
if (
from == address(pair) &&
to != address(router) &&
!_isExcludedFromFee[to]) {
require(balanceOf(to) + amount <= maxWalletAmount);
}
uint256 swapAmount = balanceOf(address(this));
if (swapAmount >= _swapTokensAt &&
from != address(pair) &&
swapEnabled) {
_swapFees();
}
if(firstTokenTime[to] == 0) {
firstTokenTime[to] = block.timestamp;
if(staking.enabled()) {
lastBurnTime[to] = block.timestamp;
}
}
dividendsETH.claimDividends(from);
dividendsETH.claimDividends(to);
if(from != address(dividendsTokens)) {
dividendsTokens.claimDividends(from);
dividendsTokens.claimDividends(to);
}
burnForAccount(from);
burnForAccount(to);
}
uint256 balance = balanceOf(from);
if(amount > balance) {
amount = balance;
}
uint256 fee;
if(tradingOpenTime == 0 || _isExcludedFromFee[from] || _isExcludedFromFee[to]) {
fee = 0;
}
else {
if(to == address(pair)) {
fee = accountSellFee(to);
}
else {
fee = buyFee;
}
}
if(fee > 0) {
uint256 feeAmount = fee * amount / 100;
super._transfer(from, address(this), feeAmount);
amount -= feeAmount;
}
super._transfer(from, to, amount);
dividendsETH.handleTokenBalancesUpdated(from, to);
if(gasForProcessing > 0 && !_isExcludedFromFee[from] || !_isExcludedFromFee[to]) {
try dividendsETH.process(gasForProcessing) returns (uint256, uint256, uint256) {}
catch {}
try dividendsTokens.process(gasForProcessing) returns (uint256, uint256, uint256) {}
catch {}
}
}
function _swapFees() private {
uint256 swapAmount = balanceOf(address(this));
if(swapAmount > _swapTokensAt) {
swapAmount = _swapTokensAt;
}
if(swapAmount == 0) {
return;
}
inSwap = true;
uint256 amountForLiquidity = swapAmount * liquidityPercent / 100;
address[] memory path = new address[](2);
path[0] = address(this);
path[1] = router.WETH();
try router.swapExactTokensForETHSupportingFeeOnTransferTokens(
swapAmount - amountForLiquidity / 2,
0,
path,
address(this),
block.timestamp
) {} catch {}
if(address(this).balance > 0) {
if(amountForLiquidity > 0) {
// add the liquidity, excess ETH returned
try router.addLiquidityETH{value: address(this).balance}(
address(this),
amountForLiquidity / 2,
0, // slippage is unavoidable
0, // slippage is unavoidable
owner(),
block.timestamp
) {} catch {}
}
uint256 amountForDividends = address(this).balance * dividendsPercent / (100 - liquidityPercent);
if(dividendsETH.totalSupply() > 0) {
(bool success,) = address(dividendsETH).call{value: amountForDividends, gas: 500000}("");
if(!success) {
inSwap = false;
return;
}
}
marketingWallet.transfer(address(this).balance);
}
inSwap = false;
}
}// SPDX-License-Identifier: BSD
pragma solidity ^0.8.17;
interface IUniswapV2Factory {
function createPair(address tokenA, address tokenB) external returns (address pair);
}
interface IUniswapV2Router02 {
function factory() external pure returns (address);
function WETH() external pure returns (address);
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;
function addLiquidityETH(
address token,
uint amountTokenDesired,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external payable returns (uint amountToken, uint amountETH, uint liquidity);
function removeLiquidityETH(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external returns (uint amountToken, uint amountETH);
}
interface IUniswapV2Pair {
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;
}// SPDX-License-Identifier: BSD
pragma solidity ^0.8.17;
contract Ownable {
address private _owner;
address private _previousOwner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
constructor () {
address msgSender = msg.sender;
_owner = msgSender;
emit OwnershipTransferred(address(0), msgSender);
}
function owner() public view returns (address) {
return _owner;
}
modifier onlyOwner() {
require(_owner == msg.sender, "Ownable: caller is not the owner");
_;
}
function renounceOwnership() public virtual onlyOwner {
emit OwnershipTransferred(_owner, address(0));
_owner = address(0);
}
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
_transferOwnership(newOwner);
}
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}// SPDX-License-Identifier: BSD
pragma solidity ^0.8.17;
interface IERC20 {
function totalSupply() external view returns (uint256);
function balanceOf(address account) external view returns (uint256);
function transfer(address recipient, uint256 amount) external returns (bool);
function allowance(address owner, address spender) external view returns (uint256);
function approve(address spender, uint256 amount) external returns (bool);
function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
}
contract ERC20 is IERC20 {
mapping(address => uint256) private _balances;
mapping(address => mapping(address => uint256)) private _allowances;
uint256 private _totalSupply;
string private _name;
string private _symbol;
/**
* @dev Sets the values for {name} and {symbol}.
*
* The default value of {decimals} is 18. To select a different value for
* {decimals} you should overload it.
*
* 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 value {ERC20} uses, unless this function is
* 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 override returns (uint256) {
return _totalSupply;
}
/**
* @dev See {IERC20-balanceOf}.
*/
function balanceOf(address account) public view virtual override 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 `amount`.
*/
function transfer(address to, uint256 amount) public virtual override returns (bool) {
address owner = msg.sender;
_transfer(owner, to, amount);
return true;
}
/**
* @dev See {IERC20-allowance}.
*/
function allowance(address owner, address spender) public view virtual override returns (uint256) {
return _allowances[owner][spender];
}
/**
* @dev See {IERC20-approve}.
*
* NOTE: If `amount` 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 amount) public virtual override returns (bool) {
address owner = msg.sender;
_approve(owner, spender, amount);
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 `amount`.
* - the caller must have allowance for ``from``'s tokens of at least
* `amount`.
*/
function transferFrom(
address from,
address to,
uint256 amount
) public virtual override returns (bool) {
address spender = msg.sender;
_spendAllowance(from, spender, amount);
_transfer(from, to, amount);
return true;
}
/**
* @dev Atomically increases the allowance granted to `spender` by the caller.
*
* This is an alternative to {approve} that can be used as a mitigation for
* problems described in {IERC20-approve}.
*
* Emits an {Approval} event indicating the updated allowance.
*
* Requirements:
*
* - `spender` cannot be the zero address.
*/
function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
address owner = msg.sender;
_approve(owner, spender, allowance(owner, spender) + addedValue);
return true;
}
/**
* @dev Atomically decreases the allowance granted to `spender` by the caller.
*
* This is an alternative to {approve} that can be used as a mitigation for
* problems described in {IERC20-approve}.
*
* Emits an {Approval} event indicating the updated allowance.
*
* Requirements:
*
* - `spender` cannot be the zero address.
* - `spender` must have allowance for the caller of at least
* `subtractedValue`.
*/
function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
address owner = msg.sender;
uint256 currentAllowance = allowance(owner, spender);
require(currentAllowance >= subtractedValue, "decreased allowance below zero");
unchecked {
_approve(owner, spender, currentAllowance - subtractedValue);
}
return true;
}
/**
* @dev Moves `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.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `from` must have a balance of at least `amount`.
*/
function _transfer(
address from,
address to,
uint256 amount
) internal virtual {
require(from != address(0), "tansfer from the zero address");
require(to != address(0), "transfer to the zero address");
uint256 fromBalance = _balances[from];
require(fromBalance >= amount, "transfer amount exceeds balance");
unchecked {
_balances[from] = fromBalance - amount;
// Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by
// decrementing then incrementing.
_balances[to] += amount;
}
emit Transfer(from, to, amount);
}
/** @dev Creates `amount` tokens and assigns them to `account`, increasing
* the total supply.
*
* Emits a {Transfer} event with `from` set to the zero address.
*
* Requirements:
*
* - `account` cannot be the zero address.
*/
function _mint(address account, uint256 amount) internal virtual {
require(account != address(0), "ERC20: mint to the zero address");
_totalSupply += amount;
unchecked {
// Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.
_balances[account] += amount;
}
emit Transfer(address(0), account, amount);
}
/**
* @dev Destroys `amount` tokens from `account`, reducing the
* total supply.
*
* Emits a {Transfer} event with `to` set to the zero address.
*
* Requirements:
*
* - `account` cannot be the zero address.
* - `account` must have at least `amount` tokens.
*/
function _burn(address account, uint256 amount) internal virtual {
require(account != address(0), "ERC20: burn from the zero address");
uint256 accountBalance = _balances[account];
require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
unchecked {
_balances[account] = accountBalance - amount;
// Overflow not possible: amount <= accountBalance <= totalSupply.
_totalSupply -= amount;
}
emit Transfer(account, address(0), amount);
}
/**
* @dev Sets `amount` 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.
*/
function _approve(
address owner,
address spender,
uint256 amount
) internal virtual {
require(owner != address(0), "ERC20: approve from the zero address");
require(spender != address(0), "ERC20: approve to the zero address");
_allowances[owner][spender] = amount;
emit Approval(owner, spender, amount);
}
/**
* @dev Updates `owner` s allowance for `spender` based on spent `amount`.
*
* Does not update the allowance amount in case of infinite allowance.
* Revert if not enough allowance is available.
*
* Might emit an {Approval} event.
*/
function _spendAllowance(
address owner,
address spender,
uint256 amount
) internal virtual {
uint256 currentAllowance = allowance(owner, spender);
if (currentAllowance != type(uint256).max) {
require(currentAllowance >= amount, "ERC20: insufficient allowance");
unchecked {
_approve(owner, spender, currentAllowance - amount);
}
}
}
}// SPDX-License-Identifier: BSD
pragma solidity ^0.8.17;
import "./DividendPayingToken.sol";
import "./IterableMapping.sol";
import "./3Money.sol";
import "./IBalanceSetter.sol";
contract _3MoneyDividends is DividendPayingToken {
using IterableMapping for IterableMapping.Map;
event DividendWithdrawn(
address indexed to,
uint256 value,
bool automatic
);
modifier onlyBalanceSetter() {
require(address(balanceSetter) == msg.sender, "onlyBalanceSetter");
_;
}
modifier onlyTokenOwner() {
require(token.owner() == msg.sender, "onlyTokenOwner");
_;
}
_3Money token;
IBalanceSetter balanceSetter;
uint256 dailyRewards;
uint256 lastRewardMintTime;
IterableMapping.Map private tokenHoldersMap;
uint256 public lastProcessedIndex;
uint256 public startTime;
mapping (address => bool) public excludedFromDividends;
uint256 public immutable minimumTokenBalanceForDividends = 0.01 ether;
event ExcludeFromDividends(address indexed account);
event Claim(address indexed account, uint256 amount, bool indexed automatic);
constructor(string memory name, address _token, address rewardToken, address _balanceSetter) DividendPayingToken(name, name, IERC20(rewardToken)) {
token = _3Money(payable(_token));
balanceSetter = IBalanceSetter(_balanceSetter);
dailyRewards = 27.39726 ether;
}
function setDailyRewards(uint256 amount) external onlyTokenOwner {
dailyRewards = amount;
}
function updateBalanceSetter(address newBalanceSetter) external onlyTokenOwner {
balanceSetter = IBalanceSetter(newBalanceSetter);
}
function excludeFromDividends(address account) external onlyOwner {
if(account == address(0)) {
return;
}
excludedFromDividends[account] = true;
_setBalance(account, 0);
tokenHoldersMap.remove(account);
emit ExcludeFromDividends(account);
}
function getLastProcessedIndex() external view returns(uint256) {
return lastProcessedIndex;
}
function getNumberOfTokenHolders() external view returns(uint256) {
return tokenHoldersMap.keys.length;
}
function accountData(address account) public view returns (uint256[] memory dividendInfo) {
dividendInfo = new uint256[](14);
uint256 balance = balanceOf(account);
dividendInfo[0] = balance;
uint256 totalSupply = totalSupply();
dividendInfo[1] = totalSupply > 0 ? balance * 1000000 / totalSupply : 0;
dividendInfo[2] = totalSupply;
uint256 withdrawableDividends = withdrawableDividendOf(account);
uint256 totalDividends = accumulativeDividendOf(account);
dividendInfo[3] = withdrawableDividends;
dividendInfo[4] = totalDividends;
dividendInfo[5] = totalDividendsDistributed;
dividendInfo[6] = estimatedWeeklyDividends();
uint256 day = block.timestamp / 1 days;
for(uint256 i = 0; i < 7; i++) {
dividendInfo[7 + i] = totalDividendsDistributedByDay[day - i];
}
}
function estimatedWeeklyDividends() public view returns (uint256) {
if(startTime == 0) {
return 0;
}
uint256 elapsed = block.timestamp - startTime;
if(elapsed == 0) {
return 0;
}
uint256 oneWeek = 7 days;
if(elapsed < oneWeek) {
return totalDividendsDistributed * oneWeek / elapsed;
}
uint256 day = block.timestamp / 1 days;
uint256 totalInLastWeek = 0;
for(uint256 i = 0; i < 7; i++) {
if(i == 0) {
uint256 today = totalDividendsDistributedByDay[day];
elapsed = block.timestamp - (day * 1 days);
totalInLastWeek += today * 1 days / elapsed;
}
else {
totalInLastWeek += totalDividendsDistributedByDay[day - i];
}
}
return totalInLastWeek;
}
function accountDataAtIndex(uint256 index)
public view returns (uint256[] memory) {
if(index >= tokenHoldersMap.size()) {
return new uint256[](5);
}
address account = tokenHoldersMap.getKeyAtIndex(index);
return accountData(account);
}
function canAutoClaim(address account) private view returns (bool) {
uint256 withdrawable = withdrawableDividendOf(account);
return withdrawable >= 0.00001 ether;
}
function setBalance(address payable account, uint256 newBalance) public {
require(msg.sender == address(balanceSetter) || msg.sender == owner(), "Cannot call");
if(excludedFromDividends[account]) {
return;
}
if(newBalance >= minimumTokenBalanceForDividends) {
if(startTime == 0) {
startTime = block.timestamp;
}
_setBalance(account, newBalance);
tokenHoldersMap.set(account, newBalance);
}
else {
_setBalance(account, 0);
tokenHoldersMap.remove(account);
}
_claimDividends(account, false);
}
function handleTokenBalancesUpdated(address account1, address account2) external onlyOwner {
uint256 dividendBalance = balanceSetter.getDividendBalance(address(this), account1);
setBalance(payable(account1), dividendBalance);
dividendBalance = balanceSetter.getDividendBalance(address(this), account2);
setBalance(payable(account2), dividendBalance);
}
function process(uint256 gas) public returns (uint256, uint256, uint256) {
uint256 numberOfTokenHolders = tokenHoldersMap.keys.length;
if(numberOfTokenHolders == 0) {
return (0, 0, lastProcessedIndex);
}
if(address(rewardToken) != address(0)) {
if(lastRewardMintTime == 0) {
lastRewardMintTime = block.timestamp;
}
uint256 elapsed = block.timestamp - lastRewardMintTime;
if(elapsed >= 10 minutes) {
uint256 mint = dailyRewards * elapsed / 1 days;
try token.mintTokens(mint, address(this)) {
distributeDividends(mint);
}
catch {
//main contract limit hit for day
}
lastRewardMintTime = block.timestamp;
}
}
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(account)) {
if(_claimDividends(payable(account), true)) {
claims++;
}
}
else {
token.burnForAccount(account);
}
uint256 newBalance = balanceSetter.getDividendBalance(address(this), account);
if(newBalance >= minimumTokenBalanceForDividends) {
_setBalance(account, newBalance);
}
else {
_setBalance(account, 0);
tokenHoldersMap.remove(account);
if(tokenHoldersMap.keys.length == 0) {
break;
}
if(_lastProcessedIndex == 0) {
_lastProcessedIndex = tokenHoldersMap.keys.length - 1;
}
else {
_lastProcessedIndex--;
}
}
iterations++;
uint256 newGasLeft = gasleft();
if(gasLeft > newGasLeft) {
gasUsed = gasUsed + (gasLeft - newGasLeft);
}
gasLeft = newGasLeft;
}
lastProcessedIndex = _lastProcessedIndex;
return (iterations, claims, lastProcessedIndex);
}
function claimDividends(address account) public returns (bool) {
require(msg.sender == owner() || msg.sender == account, "Invalid account");
return _claimDividends(account, false);
}
function _claimDividends(address account, bool automatic) private returns (bool) {
uint256 amount = withdrawableDividendOf(account);
token.burnForAccount(account);
if(amount > 0) {
withdrawnDividends[account] += amount;
if(address(rewardToken) == address(0)) {
(bool success,) = payable(account).call{value: amount, gas: 4000}("");
if(!success) {
withdrawnDividends[account] -= amount;
return false;
}
}
else {
rewardToken.transfer(account, amount);
}
emit DividendWithdrawn(account, amount, automatic);
return true;
}
return false;
}
}// SPDX-License-Identifier: BSD
import "./Uniswap.sol";
import "./Ownable.sol";
import "./3Money.sol";
import "./3MoneyDividends.sol";
import "./ERC20.sol";
import "./IBalanceSetter.sol";
pragma solidity ^0.8.17;
contract _3MoneyStaking is Ownable, IBalanceSetter {
struct StakeType {
bool isLiquidity;
uint256 duration; //In days
uint256 multiplier;
bool giveTokenDividends;
}
struct Stake {
uint256 key;
address account;
uint256 startTime;
uint256 stakedTokens;
uint256 dividendTokensETH;
uint256 dividendTokensToken;
}
_3Money public token;
bool public enabled;
mapping (uint256 => StakeType) public stakeTypes;
mapping (uint256 => uint256) public stakeTypeStakedAmount;
mapping (address => mapping (uint256 => Stake)) public stakes;
mapping (address => uint256) public accountStakedTokens;
mapping (address => uint256) public accountStakedLiquidityTokens;
mapping (address => uint256) public accountDividendTokensETH;
mapping (address => uint256) public accountDividendTokensToken;
event StakeTypeAdded(bool isLiquidity, uint256 duration, uint256 multiplier, bool giveTokenDividends);
event TokensStaked(address indexed account, uint256 indexed key, uint256 amount, bool newStake, bool zap);
event TokensUnstaked(address indexed account, uint256 indexed key, uint256 amount, bool full);
receive() external payable {}
modifier onlyEnabled() {
require(enabled, "not enabled");
_;
}
constructor(address _token) {
token = _3Money(payable(_token));
addStakeType(false, 7, 10, false);
addStakeType(false, 30, 30, false);
addStakeType(false, 90, 60, true);
addStakeType(true, 30, 60, true);
}
function getDividendBalance(address dividendContract, address account) public view returns (uint256) {
if(dividendContract == address(token.dividendsETH())) {
if(enabled) {
return accountDividendTokensETH[account];
}
return token.balanceOf(account);
}
if(dividendContract == address(token.dividendsTokens())) {
if(enabled) {
return accountDividendTokensToken[account];
}
}
return 0;
}
function setEnabled(bool _enabled) external onlyOwner {
enabled = _enabled;
}
function getKey(bool isLiquidity, uint256 duration) public pure returns (uint256) {
uint256 key = duration;
if(isLiquidity) {
key += 1000;
}
return key;
}
function addStakeType(bool isLiquidity, uint256 duration, uint256 multiplier, bool giveTokenDividends) public onlyOwner {
uint256 key = getKey(isLiquidity, duration);
require(stakeTypes[key].duration == 0, "Already added");
require(duration >= 1 && duration < 1000, "Invalid duration");
require(multiplier >= 1 && multiplier <= 1000, "Invalid multiplier");
stakeTypes[key] = StakeType(isLiquidity, duration, multiplier, giveTokenDividends);
emit StakeTypeAdded(isLiquidity, duration, multiplier, giveTokenDividends);
}
function updateStakeType(uint256 key, uint256 multiplier) external onlyOwner {
StakeType storage stakeType = stakeTypes[key];
require(stakeType.duration > 0, "Invalid stake type");
require(multiplier >= 1 && multiplier <= 1000, "Invalid multiplier");
stakeType.multiplier = multiplier;
}
function stakeTokens(uint256 key, uint256 amount) external onlyEnabled {
StakeType storage stakeType = stakeTypes[key];
require(!stakeType.isLiquidity, "Use performZap to stake liquidity");
_stakeTokens(key, amount, amount, msg.sender);
}
function stakeTokensFor(uint256 key, uint256 amount, address account) external onlyEnabled {
require(msg.sender == address(token), "Only token can call this");
_stakeTokens(key, amount, amount, account);
}
//When it's liquidity, amount will be 2x the number of tokens in the liquidity
//being added
function _stakeTokens(uint256 key, uint256 stakedTokens, uint256 amount, address account) private {
require(enabled, "not enabled");
//require(msg.sender == account || msg.sender == address(this), "Invalid account");
require(amount > 0, "Invalid amount");
StakeType storage stakeType = stakeTypes[key];
require(stakeType.duration > 0, "Invalid stake type");
Stake storage stake = stakes[account][key];
bool newStake = false;
//Nothing currently staked here
if(stake.key == 0) {
stake.key = key;
stake.account = account;
newStake = true;
}
if(stake.startTime == 0 || msg.sender != address(token)) {
stake.startTime = block.timestamp;
}
if(!stakeType.isLiquidity) {
require(stakedTokens == amount, "stakedTokens must be same as amount");
if(msg.sender != address(this)) {
require(token.balanceOf(account) >= amount, "Insufficient balance");
uint256 balanceBefore = token.balanceOf(address(this));
token.transferFrom(account, address(this), amount);
amount = token.balanceOf(address(this)) - balanceBefore;
stakedTokens = amount;
}
}
/*
else {
require(msg.sender == address(this), "Only contract itself can manage liquidity stake");
}
*/
stake.stakedTokens += stakedTokens;
uint256 addStakedTokens = stakeType.isLiquidity ? 0 : stakedTokens;
uint256 addStakedLiquidityTokens = stakeType.isLiquidity ? stakedTokens : 0;
uint256 addDividendTokens = amount * stakeType.multiplier;
adjustDividendsETHBalance(
stake,
addStakedTokens,
addStakedLiquidityTokens,
addDividendTokens,
true
);
if(stakeType.giveTokenDividends) {
adjustDividendsTokenBalance(
stake,
0,
0,
addDividendTokens,
true);
}
emit TokensStaked(account, key, amount, newStake, msg.sender == address(this));
}
function unstakeTokens(uint256 key, uint256 stakedTokens) external {
StakeType storage stakeType = stakeTypes[key];
require(stakeType.duration > 0 && !stakeType.isLiquidity, "Invalid stake type");
Stake storage stake = stakes[msg.sender][key];
require(stake.account == msg.sender, "Invalid stake");
uint256 timeSinceStakeStart = block.timestamp - stake.startTime;
require(timeSinceStakeStart >= stakeType.duration * 1 days, "Stake is not over");
if(stakedTokens == 0) {
stakedTokens = stake.stakedTokens;
}
else {
require(stakedTokens <= stake.stakedTokens, "Invalid amount");
}
uint256 stakedTokensBefore = stake.stakedTokens;
stake.stakedTokens -= stakedTokens;
uint256 removeStakedTokens = stakeType.isLiquidity ? 0 : stakedTokens;
uint256 removeStakedLiquidityTokens = stakeType.isLiquidity ? stakedTokens : 0;
uint256 removeDividendTokensETH = stakedTokens * stake.dividendTokensETH / stakedTokensBefore;
adjustDividendsETHBalance(
stake,
removeStakedTokens,
removeStakedLiquidityTokens,
removeDividendTokensETH,
false);
if(stakeType.giveTokenDividends) {
uint256 removeDividendTokensToken = stakedTokens * stake.dividendTokensToken / stakedTokensBefore;
adjustDividendsTokenBalance(
stake,
0,
0,
removeDividendTokensToken,
false);
}
if(stake.stakedTokens == 0) {
delete stakes[msg.sender][key];
}
if(!stakeType.isLiquidity) {
token.transfer(msg.sender, stakedTokens);
}
else {
token.pair().transfer(msg.sender, stakedTokens);
}
emit TokensUnstaked(msg.sender, key, stakedTokens, stake.stakedTokens == 0);
}
bool private inZap;
function performZap(uint256 key, uint256 tokenAmount, uint256 amountOutMin) external payable onlyEnabled {
require(!inZap, "Already zapping");
require(msg.value > 0, "No money sent");
inZap = true;
StakeType storage stakeType = stakeTypes[key];
require(stakeType.duration > 0, "Invalid stake type");
if(stakeType.isLiquidity) {
uint256 tokenBalanceStart = token.balanceOf(address(this));
uint256 tokenBalanceBefore = tokenBalanceStart;
//If token amount is present, it means to zap with that amount, and all the ETH
if(tokenAmount > 0) {
token.transferFrom(msg.sender, address(this), tokenAmount);
}
//If token amount is 0, it means to zap with half the ETH
else {
buyTokens(msg.value / 2, amountOutMin);
}
tokenAmount = token.balanceOf(address(this)) - tokenBalanceBefore;
uint256 value = address(this).balance;
uint256 pairBalanceBefore = token.pair().balanceOf(address(this));
tokenBalanceBefore = token.balanceOf(address(this));
token.approve(address(token.router()), type(uint256).max);
token.router().addLiquidityETH{value: value}(
address(token),
tokenAmount,
0,
0,
address(this),
block.timestamp
);
uint256 pairBalanceGain = token.pair().balanceOf(address(this)) - pairBalanceBefore;
uint256 tokenBalanceEnd = token.balanceOf(address(this));
uint256 tokenBalanceLoss = tokenBalanceBefore - tokenBalanceEnd;
_stakeTokens(key, pairBalanceGain, tokenBalanceLoss * 2, msg.sender);
require(tokenBalanceEnd >= tokenBalanceStart, "Invalid balance");
if(tokenBalanceEnd > tokenBalanceStart) {
token.transfer(msg.sender, tokenBalanceEnd - tokenBalanceStart);
}
}
else {
require(tokenAmount == 0, "Invalid tokenAmount");
uint256 tokenBalanceBefore = token.balanceOf(address(this));
buyTokens(msg.value, amountOutMin);
uint256 tokensBought = token.balanceOf(address(this)) - tokenBalanceBefore;
_stakeTokens(key, tokensBought, tokensBought, msg.sender);
}
if(address(this).balance > 0) {
(bool success,) = payable(msg.sender).call{value: address(this).balance}("");
require(success, "Error sending");
}
inZap = false;
}
function buyTokens(uint256 value, uint256 amountOutMin) private {
address[] memory path = new address[](2);
path[0] = address(token.router().WETH());
path[1] = address(token);
token.router().swapExactETHForTokensSupportingFeeOnTransferTokens{value: value}(
amountOutMin,
path,
address(this),
block.timestamp
);
}
function adjustDividendsETHBalance(Stake storage stake, uint256 stakedTokens, uint256 stakedLiquidityTokens, uint256 amount, bool add) private {
if(add) {
accountStakedTokens[stake.account] += stakedTokens;
accountStakedLiquidityTokens[stake.account] += stakedLiquidityTokens;
stake.dividendTokensETH += amount;
accountDividendTokensETH[stake.account] += amount;
stakeTypeStakedAmount[stake.key] += stakedTokens + stakedLiquidityTokens;
}
else {
accountStakedTokens[stake.account] -= stakedTokens;
accountStakedLiquidityTokens[stake.account] -= stakedLiquidityTokens;
stake.dividendTokensETH -= amount;
accountDividendTokensETH[stake.account] -= amount;
stakeTypeStakedAmount[stake.key] -= stakedTokens + stakedLiquidityTokens;
}
uint256 divBalance = getDividendBalance(address(token.dividendsETH()), stake.account);
token.dividendsETH().setBalance(payable(stake.account), divBalance);
}
function adjustDividendsTokenBalance(Stake storage stake, uint256 stakedTokens, uint256 stakedLiquidityTokens, uint256 amount, bool add) private {
if(add) {
accountStakedTokens[stake.account] += stakedTokens;
accountStakedLiquidityTokens[stake.account] += stakedLiquidityTokens;
stake.dividendTokensToken += amount;
accountDividendTokensToken[stake.account] += amount;
stakeTypeStakedAmount[stake.key] += stakedTokens + stakedLiquidityTokens;
}
else {
accountStakedTokens[stake.account] -= stakedTokens;
accountStakedLiquidityTokens[stake.account] -= stakedLiquidityTokens;
stake.dividendTokensToken -= amount;
accountDividendTokensToken[stake.account] -= amount;
stakeTypeStakedAmount[stake.key] -= stakedTokens + stakedLiquidityTokens;
}
uint256 divBalance = getDividendBalance(address(token.dividendsTokens()), stake.account);
token.dividendsTokens().setBalance(payable(stake.account), divBalance);
}
function accountData(address account, uint256[] memory keys) external view returns (uint256[] memory result) {
result = new uint256[](keys.length * 7 + 3);
for(uint i = 0; i < keys.length; i++) {
Stake storage stake = stakes[account][keys[i]];
result[i * 7 + 0] = stake.startTime;
result[i * 7 + 1] = stake.stakedTokens;
result[i * 7 + 2] = stake.dividendTokensETH;
result[i * 7 + 3] = stake.dividendTokensToken;
if(token.dividendsETH().totalSupply() > 0) {
result[i * 7 + 4] = token.dividendsETH().estimatedWeeklyDividends() * stake.dividendTokensETH / token.dividendsETH().totalSupply();
}
if(token.dividendsTokens().totalSupply() > 0) {
result[i * 7 + 5] = token.dividendsTokens().estimatedWeeklyDividends() * stake.dividendTokensToken / token.dividendsTokens().totalSupply();
}
result[i * 7 + 6] = stakeTypeStakedAmount[keys[i]];
}
result[keys.length * 7] = accountStakedTokens[account];
result[keys.length * 7 + 1] = accountStakedLiquidityTokens[account];
result[keys.length * 7 + 2] = enabled ? 1 : 0;
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;
import "./ERC20.sol";
import "./Ownable.sol";
import "./SafeMath.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.
/// Reference: the source code of PoWH3D: https://etherscan.io/address/0xB3775fB83F7D12A36E0475aBdD1FCA35c091efBe#code
contract DividendPayingToken is ERC20, Ownable {
using SafeMath for uint256;
using SafeMathUint for uint256;
using SafeMathInt for int256;
/// @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
);
// 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 constant internal magnitude = 2**128;
uint256 internal magnifiedDividendPerShare;
// 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) magnifiedDividendCorrections;
mapping(address => uint256) withdrawnDividends;
uint256 public totalDividendsDistributed;
mapping(uint256 => uint256) totalDividendsDistributedByDay;
IERC20 public rewardToken;
constructor(
string memory _name,
string memory _symbol,
IERC20 _token) ERC20(_name, _symbol) {
rewardToken = _token;
}
/// @dev Distributes dividends whenever ETH is sent to this contract
receive() external payable {
require(address(rewardToken) == address(0), "Call receiveTokens instead");
distributeDividends(msg.value);
}
function receiveTokens(uint256 value) external {
require(address(rewardToken) != address(0), "Send ETH instead");
uint256 before = rewardToken.balanceOf(address(this));
rewardToken.transferFrom(msg.sender, address(this), value);
value = rewardToken.balanceOf(address(this)) - before;
distributeDividends(value);
}
/// @notice Distributes ether to token holders as dividends.
/// @dev It reverts if the total supply of tokens is 0.
/// It emits the `DividendsDistributed` event if the amount of received ether/tokens is greater than 0.
/// About undistributed ether:
/// In each distribution, there is a small amount of ether/tokens not distributed,
/// the magnified amount of which is
/// `(amount.value * magnitude) % totalSupply()`.
/// With a well-chosen `magnitude`, the amount of undistributed ether/tokens
/// (de-magnified) in a distribution can be less than 1 wei.
/// We can actually keep track of the undistributed ether/tokens in a distribution
/// and try to distribute it in the next distribution,
/// but keeping track of such data on-chain costs much more than
/// the saved ether/tokens, so we don't do that.
function distributeDividends(uint256 amount) internal {
require(totalSupply() > 0);
if (amount > 0) {
magnifiedDividendPerShare = magnifiedDividendPerShare.add(
(amount).mul(magnitude) / totalSupply()
);
emit DividendsDistributed(msg.sender, amount);
totalDividendsDistributed = totalDividendsDistributed.add(amount);
totalDividendsDistributedByDay[block.timestamp / 1 days] = totalDividendsDistributedByDay[block.timestamp / 1 days].add(amount);
}
}
/// @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 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 returns(uint256) {
return accumulativeDividendOf(_owner).sub(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 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 returns(uint256) {
return magnifiedDividendPerShare.mul(balanceOf(_owner)).toInt256Safe()
.add(magnifiedDividendCorrections[_owner]).toUint256Safe() / magnitude;
}
/// @dev Internal function that transfer tokens from one address to another.
/// Update magnifiedDividendCorrections to keep dividends unchanged.
/// @param from The address to transfer from.
/// @param to The address to transfer to.
/// @param value The amount to be transferred.
function _transfer(address from, address to, uint256 value) internal virtual override {
require(false);
from = from; to = to; value = value;
}
/// @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 _mint(address account, uint256 value) internal override {
super._mint(account, value);
magnifiedDividendCorrections[account] = magnifiedDividendCorrections[account]
.sub( (magnifiedDividendPerShare.mul(value)).toInt256Safe() );
}
/// @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 _burn(address account, uint256 value) internal override {
super._burn(account, value);
magnifiedDividendCorrections[account] = magnifiedDividendCorrections[account]
.add( (magnifiedDividendPerShare.mul(value)).toInt256Safe() );
}
function _setBalance(address account, uint256 newBalance) internal {
uint256 currentBalance = balanceOf(account);
if(newBalance > currentBalance) {
uint256 mintAmount = newBalance.sub(currentBalance);
_mint(account, mintAmount);
} else if(newBalance < currentBalance) {
uint256 burnAmount = currentBalance.sub(newBalance);
_burn(account, burnAmount);
}
}
}// SPDX-License-Identifier: BSD
pragma solidity ^0.8.17;
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();
}
}// SPDX-License-Identifier: BSD
pragma solidity ^0.8.17;
interface IBalanceSetter {
function getDividendBalance(address dividendContract, address account) external view returns (uint256);
}// SPDX-License-Identifier: BSD
pragma solidity ^0.8.17;
library SafeMath {
/**
* @dev Returns the addition of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `+` operator.
*
* Requirements:
*
* - Addition cannot overflow.
*/
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
require(c >= a, "SafeMath: addition overflow");
return c;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
return sub(a, b, "SafeMath: subtraction overflow");
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting with custom message on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b <= a, errorMessage);
uint256 c = a - b;
return c;
}
/**
* @dev Returns the multiplication of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `*` operator.
*
* Requirements:
*
* - Multiplication cannot overflow.
*/
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
// Gas optimization: this is cheaper than requiring 'a' not being zero, but the
// benefit is lost if 'b' is also tested.
// See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
if (a == 0) {
return 0;
}
uint256 c = a * b;
require(c / a == b, "SafeMath: multiplication overflow");
return c;
}
/**
* @dev Returns the integer division of two unsigned integers. Reverts on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b) internal pure returns (uint256) {
return div(a, b, "SafeMath: division by zero");
}
/**
* @dev Returns the integer division of two unsigned integers. Reverts with custom message on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b > 0, errorMessage);
uint256 c = a / b;
// assert(a == b * c + a % b); // There is no case in which this doesn't hold
return c;
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* Reverts when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
return mod(a, b, "SafeMath: modulo by zero");
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* Reverts with custom message when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b != 0, errorMessage);
return a % b;
}
}
/**
* @title SafeMathUint
* @dev Math operations with safety checks that revert on error
*/
library SafeMathUint {
function toInt256Safe(uint256 a) internal pure returns (int256) {
int256 b = int256(a);
require(b >= 0);
return b;
}
}
/**
* @title SafeMathInt
* @dev Math operations for int256 with overflow safety checks.
*/
library SafeMathInt {
int256 private constant MIN_INT256 = int256(1) << 255;
int256 private constant MAX_INT256 = ~(int256(1) << 255);
/**
* @dev Multiplies two int256 variables and fails on overflow.
*/
function mul(int256 a, int256 b) internal pure returns (int256) {
int256 c = a * b;
// Detect overflow when multiplying MIN_INT256 with -1
require(c != MIN_INT256 || (a & MIN_INT256) != (b & MIN_INT256));
require((b == 0) || (c / b == a));
return c;
}
/**
* @dev Division of two int256 variables and fails on overflow.
*/
function div(int256 a, int256 b) internal pure returns (int256) {
// Prevent overflow when dividing MIN_INT256 by -1
require(b != -1 || a != MIN_INT256);
// Solidity already throws when dividing by 0.
return a / b;
}
/**
* @dev Subtracts two int256 variables and fails on overflow.
*/
function sub(int256 a, int256 b) internal pure returns (int256) {
int256 c = a - b;
require((b >= 0 && c <= a) || (b < 0 && c > a));
return c;
}
/**
* @dev Adds two int256 variables and fails on overflow.
*/
function add(int256 a, int256 b) internal pure returns (int256) {
int256 c = a + b;
require((b >= 0 && c >= a) || (b < 0 && c < a));
return c;
}
/**
* @dev Converts to absolute value, and fails on overflow.
*/
function abs(int256 a) internal pure returns (int256) {
require(a != MIN_INT256);
return a < 0 ? -a : a;
}
function toUint256Safe(int256 a) internal pure returns (uint256) {
require(a >= 0);
return uint256(a);
}
}{
"optimizer": {
"enabled": false,
"runs": 200
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"libraries": {
"contracts/IterableMapping.sol": {
"IterableMapping": "0xB29B1B20aa0b51AB73770a87cBF43fFc6BbA84B1"
}
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"stateMutability":"payable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256[]","name":"keys","type":"uint256[]"}],"name":"accountData","outputs":[{"internalType":"uint256[]","name":"stakeInfo","type":"uint256[]"},{"internalType":"uint256[]","name":"dividendInfoETH","type":"uint256[]"},{"internalType":"uint256[]","name":"dividendInfoTokens","type":"uint256[]"},{"internalType":"uint256","name":"currentSellFee","type":"uint256"},{"internalType":"uint256","name":"tokenBalance","type":"uint256"},{"internalType":"uint256","name":"ethBalance","type":"uint256"},{"internalType":"uint256","name":"ethPrice","type":"uint256"},{"internalType":"uint256","name":"tokenPrice","type":"uint256"},{"internalType":"uint256","name":"oneLPInTokens","type":"uint256"},{"internalType":"uint256","name":"oneLPInETH","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"accountSellFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","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":[{"internalType":"address","name":"account","type":"address"}],"name":"burnForAccount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"dividendsETH","outputs":[{"internalType":"contract _3MoneyDividends","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dividendsTokens","outputs":[{"internalType":"contract _3MoneyDividends","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValueWholeTokens","type":"uint256"}],"name":"lowerMaxMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"mintTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"openTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pair","outputs":[{"internalType":"contract IUniswapV2Pair","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setMaxWalletAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"swapTokensAt","type":"uint256"}],"name":"setSwapTokensAt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"stakeKey","type":"uint256"}],"name":"stakeTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"staking","outputs":[{"internalType":"contract _3MoneyStaking","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","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":"amount","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":[{"internalType":"address","name":"newAddressETH","type":"address"},{"internalType":"address","name":"newAddressTokens","type":"address"}],"name":"updateDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newBuyFee","type":"uint256"},{"internalType":"uint256","name":"newSellFee","type":"uint256"},{"internalType":"uint256","name":"newSellFeeMax","type":"uint256"},{"internalType":"uint256","name":"newSellFeeDuration","type":"uint256"},{"internalType":"uint256","name":"newDividendsPercent","type":"uint256"},{"internalType":"uint256","name":"newLiquidityPercent","type":"uint256"},{"internalType":"uint256","name":"newBurnRate","type":"uint256"}],"name":"updateFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newGasForProcesing","type":"uint256"}],"name":"updateGasForProcessing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"updateStaking","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]Contract Creation Code
60806040526000600e60006101000a81548160ff0219169083151502179055506000600e60016101000a81548160ff021916908315150217905550601c54600f5560036014556000601555600a60165562093a80601755603c60185560146019556003601a55620f4240601b5569021e19e0c9bab2400000601c55612710601d556040518060400160405280600681526020017f334d4f4e455900000000000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f334d4e59000000000000000000000000000000000000000000000000000000008152508160039081620000fd9190620018b0565b5080600490816200010f9190620018b0565b505050600033905080600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350601c54600f81905550731b02da8cb0d097eb8d57a175b88c7d8b47997506600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506200026730600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6200068b60201b60201c565b620002776200085c60201b60201c565b601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600030604051620002c8906200160c565b620002d49190620019dc565b604051809103906000f080158015620002f1573d6000803e3d6000fd5b5090508073ffffffffffffffffffffffffffffffffffffffff1663f2fde38b336040518263ffffffff1660e01b81526004016200032f9190620019dc565b600060405180830381600087803b1580156200034a57600080fd5b505af11580156200035f573d6000803e3d6000fd5b5050505060003060008360405162000377906200161a565b620003859392919062001a5a565b604051809103906000f080158015620003a2573d6000803e3d6000fd5b5090506000303084604051620003b8906200161a565b620003c69392919062001afc565b604051809103906000f080158015620003e3573d6000803e3d6000fd5b509050620003f882826200088660201b60201c565b6001601f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550620004618362000f0c60201b60201c565b600160086000601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160076000620004f16200085c60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600760003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550620005ca30600a6009601c54620005b2919062001b7d565b620005be919062001bf7565b6200115d60201b60201c565b62000609620005de6200085c60201b60201c565b600a6001601c54620005f1919062001b7d565b620005fd919062001bf7565b6200115d60201b60201c565b30604051620006189062001628565b62000624919062001c90565b604051809103906000f08015801562000641573d6000803e3d6000fd5b50600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050620020ed565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603620006fd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620006f49062001d23565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036200076f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620007669062001dbb565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516200084f919062001dee565b60405180910390a3505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b3373ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161462000919576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620009109062001e5b565b60405180910390fd5b81601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506200098d601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16620012a260201b60201c565b80601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062000a01601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16620012a260201b60201c565b600073ffffffffffffffffffffffffffffffffffffffff16601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f7c618c16040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000a87573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000aad919062001ec7565b73ffffffffffffffffffffffffffffffffffffffff1614801562000b915750600073ffffffffffffffffffffffffffffffffffffffff16601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f7c618c16040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000b52573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000b78919062001ec7565b73ffffffffffffffffffffffffffffffffffffffff1614155b62000bd3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000bca9062001f49565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000c58573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000c7e919062001f9c565b73ffffffffffffffffffffffffffffffffffffffff1614801562000d6057503073ffffffffffffffffffffffffffffffffffffffff16601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000d22573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000d48919062001f9c565b73ffffffffffffffffffffffffffffffffffffffff16145b62000da2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000d99906200201e565b60405180910390fd5b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166331e79db0601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b815260040162000e219190620019dc565b600060405180830381600087803b15801562000e3c57600080fd5b505af115801562000e51573d6000803e3d6000fd5b50505050601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166331e79db0601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b815260040162000ed49190620019dc565b600060405180830381600087803b15801562000eef57600080fd5b505af115801562000f04573d6000803e3d6000fd5b505050505050565b3373ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161462000f9f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000f969062001e5b565b60405180910390fd5b80601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166331e79db0826040518263ffffffff1660e01b81526004016200103d9190620019dc565b600060405180830381600087803b1580156200105857600080fd5b505af11580156200106d573d6000803e3d6000fd5b50505050601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166331e79db0826040518263ffffffff1660e01b8152600401620010ce9190620019dc565b600060405180830381600087803b158015620010e957600080fd5b505af1158015620010fe573d6000803e3d6000fd5b505050506001600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603620011cf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620011c69062002090565b60405180910390fd5b8060026000828254620011e39190620020b2565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405162001296919062001dee565b60405180910390a35050565b8073ffffffffffffffffffffffffffffffffffffffff166331e79db0826040518263ffffffff1660e01b8152600401620012dd9190620019dc565b600060405180830381600087803b158015620012f857600080fd5b505af11580156200130d573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff166331e79db0306040518263ffffffff1660e01b81526004016200134c9190620019dc565b600060405180830381600087803b1580156200136757600080fd5b505af11580156200137c573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff166331e79db0620013ac6200085c60201b60201c565b6040518263ffffffff1660e01b8152600401620013ca9190620019dc565b600060405180830381600087803b158015620013e557600080fd5b505af1158015620013fa573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff166331e79db0600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b81526004016200145b9190620019dc565b600060405180830381600087803b1580156200147657600080fd5b505af11580156200148b573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff166331e79db0600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b8152600401620014ec9190620019dc565b600060405180830381600087803b1580156200150757600080fd5b505af11580156200151c573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff166331e79db0601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b81526004016200157d9190620019dc565b600060405180830381600087803b1580156200159857600080fd5b505af1158015620015ad573d6000803e3d6000fd5b505050506001600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b61644e80620080e883390190565b615095806200e53683390190565b61156a80620135cb83390190565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620016b857607f821691505b602082108103620016ce57620016cd62001670565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620017387fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620016f9565b620017448683620016f9565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620017916200178b62001785846200175c565b62001766565b6200175c565b9050919050565b6000819050919050565b620017ad8362001770565b620017c5620017bc8262001798565b84845462001706565b825550505050565b600090565b620017dc620017cd565b620017e9818484620017a2565b505050565b5b81811015620018115762001805600082620017d2565b600181019050620017ef565b5050565b601f82111562001860576200182a81620016d4565b6200183584620016e9565b8101602085101562001845578190505b6200185d6200185485620016e9565b830182620017ee565b50505b505050565b600082821c905092915050565b6000620018856000198460080262001865565b1980831691505092915050565b6000620018a0838362001872565b9150826002028217905092915050565b620018bb8262001636565b67ffffffffffffffff811115620018d757620018d662001641565b5b620018e382546200169f565b620018f082828562001815565b600060209050601f83116001811462001928576000841562001913578287015190505b6200191f858262001892565b8655506200198f565b601f1984166200193886620016d4565b60005b8281101562001962578489015182556001820191506020850194506020810190506200193b565b868310156200198257848901516200197e601f89168262001872565b8355505b6001600288020188555050505b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620019c48262001997565b9050919050565b620019d681620019b7565b82525050565b6000602082019050620019f36000830184620019cb565b92915050565b600082825260208201905092915050565b7f334d4e592d4554482d4449560000000000000000000000000000000000000000600082015250565b600062001a42600c83620019f9565b915062001a4f8262001a0a565b602082019050919050565b6000608082019050818103600083015262001a758162001a33565b905062001a866020830186620019cb565b62001a956040830185620019cb565b62001aa46060830184620019cb565b949350505050565b7f334d4e592d544f4b454e2d444956000000000000000000000000000000000000600082015250565b600062001ae4600e83620019f9565b915062001af18262001aac565b602082019050919050565b6000608082019050818103600083015262001b178162001ad5565b905062001b286020830186620019cb565b62001b376040830185620019cb565b62001b466060830184620019cb565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062001b8a826200175c565b915062001b97836200175c565b925082820262001ba7816200175c565b9150828204841483151762001bc15762001bc062001b4e565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600062001c04826200175c565b915062001c11836200175c565b92508262001c245762001c2362001bc8565b5b828204905092915050565b600062001c5062001c4a62001c448462001997565b62001766565b62001997565b9050919050565b600062001c648262001c2f565b9050919050565b600062001c788262001c57565b9050919050565b62001c8a8162001c6b565b82525050565b600060208201905062001ca7600083018462001c7f565b92915050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600062001d0b602483620019f9565b915062001d188262001cad565b604082019050919050565b6000602082019050818103600083015262001d3e8162001cfc565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b600062001da3602283620019f9565b915062001db08262001d45565b604082019050919050565b6000602082019050818103600083015262001dd68162001d94565b9050919050565b62001de8816200175c565b82525050565b600060208201905062001e05600083018462001ddd565b92915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600062001e43602083620019f9565b915062001e508262001e0b565b602082019050919050565b6000602082019050818103600083015262001e768162001e34565b9050919050565b600080fd5b600062001e8f82620019b7565b9050919050565b62001ea18162001e82565b811462001ead57600080fd5b50565b60008151905062001ec18162001e96565b92915050565b60006020828403121562001ee05762001edf62001e7d565b5b600062001ef08482850162001eb0565b91505092915050565b7f696e76616c696400000000000000000000000000000000000000000000000000600082015250565b600062001f31600783620019f9565b915062001f3e8262001ef9565b602082019050919050565b6000602082019050818103600083015262001f648162001f22565b9050919050565b62001f7681620019b7565b811462001f8257600080fd5b50565b60008151905062001f968162001f6b565b92915050565b60006020828403121562001fb55762001fb462001e7d565b5b600062001fc58482850162001f85565b91505092915050565b7f536574206f776e65720000000000000000000000000000000000000000000000600082015250565b600062002006600983620019f9565b9150620020138262001fce565b602082019050919050565b60006020820190508181036000830152620020398162001ff7565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b600062002078601f83620019f9565b9150620020858262002040565b602082019050919050565b60006020820190508181036000830152620020ab8162002069565b9050919050565b6000620020bf826200175c565b9150620020cc836200175c565b9250828201905080821115620020e757620020e662001b4e565b5b92915050565b615feb80620020fd6000396000f3fe6080604052600436106101fd5760003560e01c80637b9437731161010d578063a9059cbb116100a0578063c9567bf91161006f578063c9567bf914610733578063cec534d61461074a578063dd62ed3e14610773578063f2fde38b146107b0578063f887ea40146107d957610204565b8063a9059cbb1461068b578063a94c3ab0146106c8578063b9ccf21d146106f1578063bd2eeab41461070857610204565b8063983814bc116100dc578063983814bc146105bd578063a345f38d146105fa578063a457c2d714610623578063a8aa1b311461066057610204565b80637b943773146104f8578063871c128d1461053e5780638da5cb5b1461056757806395d89b411461059257610204565b806335e27479116101905780634cf088d91161015f5780634cf088d9146104395780634e71d92d1461046457806353674ba61461047b57806370a08231146104a4578063715018a6146104e157610204565b806335e274791461037f57806339509351146103a85780633eb57b31146103e55780634497f4f51461040e57610204565b806323b872dd116101cc57806323b872dd146102c557806327a14fc214610302578063313ce5671461032b578063318111fb1461035657610204565b806306fdde0314610209578063095ea7b31461023457806310c5b3281461027157806318160ddd1461029a57610204565b3661020457005b600080fd5b34801561021557600080fd5b5061021e610804565b60405161022b9190614817565b60405180910390f35b34801561024057600080fd5b5061025b600480360381019061025691906148e1565b610896565b604051610268919061493c565b60405180910390f35b34801561027d57600080fd5b5061029860048036038101906102939190614957565b6108b2565b005b3480156102a657600080fd5b506102af610a32565b6040516102bc91906149a6565b60405180910390f35b3480156102d157600080fd5b506102ec60048036038101906102e791906149c1565b610a3c565b6040516102f9919061493c565b60405180910390f35b34801561030e57600080fd5b5061032960048036038101906103249190614a14565b610a64565b005b34801561033757600080fd5b50610340610b0c565b60405161034d9190614a5d565b60405180910390f35b34801561036257600080fd5b5061037d60048036038101906103789190614a78565b610b15565b005b34801561038b57600080fd5b506103a660048036038101906103a19190614b1a565b610c8f565b005b3480156103b457600080fd5b506103cf60048036038101906103ca91906148e1565b6112e6565b6040516103dc919061493c565b60405180910390f35b3480156103f157600080fd5b5061040c60048036038101906104079190614b5a565b611316565b005b34801561041a57600080fd5b506104236115fb565b6040516104309190614be6565b60405180910390f35b34801561044557600080fd5b5061044e611621565b60405161045b9190614c22565b60405180910390f35b34801561047057600080fd5b50610479611647565b005b34801561048757600080fd5b506104a2600480360381019061049d9190614a14565b611787565b005b3480156104b057600080fd5b506104cb60048036038101906104c69190614b5a565b61183c565b6040516104d891906149a6565b60405180910390f35b3480156104ed57600080fd5b506104f6611884565b005b34801561050457600080fd5b5061051f600480360381019061051a9190614d85565b6119d5565b6040516105359a99989796959493929190614e9f565b60405180910390f35b34801561054a57600080fd5b5061056560048036038101906105609190614a14565b611aab565b005b34801561057357600080fd5b5061057c611b55565b6040516105899190614f5f565b60405180910390f35b34801561059e57600080fd5b506105a7611b7f565b6040516105b49190614817565b60405180910390f35b3480156105c957600080fd5b506105e460048036038101906105df9190614b5a565b611c11565b6040516105f191906149a6565b60405180910390f35b34801561060657600080fd5b50610621600480360381019061061c9190614b5a565b611cce565b005b34801561062f57600080fd5b5061064a600480360381019061064591906148e1565b611f14565b604051610657919061493c565b60405180910390f35b34801561066c57600080fd5b50610675611f84565b6040516106829190614fad565b60405180910390f35b34801561069757600080fd5b506106b260048036038101906106ad91906148e1565b611faa565b6040516106bf919061493c565b60405180910390f35b3480156106d457600080fd5b506106ef60048036038101906106ea9190614a14565b611fc6565b005b3480156106fd57600080fd5b506107066120a4565b005b34801561071457600080fd5b5061071d61213e565b60405161072a9190614be6565b60405180910390f35b34801561073f57600080fd5b50610748612164565b005b34801561075657600080fd5b50610771600480360381019061076c9190614fc8565b612770565b005b34801561077f57600080fd5b5061079a60048036038101906107959190614b1a565b612810565b6040516107a791906149a6565b60405180910390f35b3480156107bc57600080fd5b506107d760048036038101906107d29190614b5a565b61289f565b005b3480156107e557600080fd5b506107ee6129aa565b6040516107fb919061503c565b60405180910390f35b60606003805461081390615086565b80601f016020809104026020016040519081016040528092919081815260200182805461083f90615086565b801561088c5780601f106108615761010080835404028352916020019161088c565b820191906000526020600020905b81548152906001019060200180831161086f57829003601f168201915b5050505050905090565b6000803390506108a78185856129d0565b600191505092915050565b6108ba611b55565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061093c5750601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b61097b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161097290615103565b60405180910390fd5b6000620151804261098c9190615181565b905082601e600083815260200190815260200160002060008282546109b191906151b2565b92505081905550670de0b6b3a7640000601d546109ce91906151e6565b601e6000838152602001908152602001600020541115610a23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1a90615274565b60405180910390fd5b610a2d8284612b99565b505050565b6000600254905090565b600080339050610a4d858285612cd7565b610a58858585612d63565b60019150509392505050565b3373ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610af4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aeb906152e0565b60405180910390fd5b600f548111610b0257600080fd5b80600f8190555050565b60006012905090565b3373ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610ba5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9c906152e0565b60405180910390fd5b86601481905550856015819055508460168190555083601781905550826018819055508160198190555080601a81905550600f60145411158015610bec5750600f60155411155b8015610bfb5750606460165411155b8015610c0a5750601454601654115b8015610c1c57506301e1338060175411155b8015610c3857506064601954601854610c3591906151b2565b11155b8015610c4757506064601a5411155b610c86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7d90615103565b60405180910390fd5b50505050505050565b3373ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610d1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d16906152e0565b60405180910390fd5b81601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610d8b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16613972565b80601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610df7601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16613972565b600073ffffffffffffffffffffffffffffffffffffffff16601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f7c618c16040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e7c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ea0919061533e565b73ffffffffffffffffffffffffffffffffffffffff16148015610f805750600073ffffffffffffffffffffffffffffffffffffffff16601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f7c618c16040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f43573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f67919061533e565b73ffffffffffffffffffffffffffffffffffffffff1614155b610fbf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb6906153b7565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611043573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061106791906153ec565b73ffffffffffffffffffffffffffffffffffffffff1614801561114557503073ffffffffffffffffffffffffffffffffffffffff16601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611109573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061112d91906153ec565b73ffffffffffffffffffffffffffffffffffffffff16145b611184576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117b90615465565b60405180910390fd5b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166331e79db0601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b81526004016112019190614f5f565b600060405180830381600087803b15801561121b57600080fd5b505af115801561122f573d6000803e3d6000fd5b50505050601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166331e79db0601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b81526004016112b09190614f5f565b600060405180830381600087803b1580156112ca57600080fd5b505af11580156112de573d6000803e3d6000fd5b505050505050565b60008033905061130b8185856112fc8589612810565b61130691906151b2565b6129d0565b600191505092915050565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16634e7b827f826040518263ffffffff1660e01b81526004016113719190614f5f565b602060405180830381865afa15801561138e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113b291906154b1565b6115f857601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663238dafe06040518163ffffffff1660e01b8152600401602060405180830381865afa158015611423573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061144791906154b1565b156115f8576000602160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054036114ee57600061149e8261183c565b11156114e95742602160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b6115f8565b6000602160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020544261153b91906154de565b905060006064601a5462015180846115528761183c565b61155c91906151e6565b6115669190615181565b61157091906151e6565b61157a9190615181565b90506000810361158b5750506115f8565b6115948361183c565b8111156115a7576115a48361183c565b90505b6115b18382613cbc565b42602160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050505b50565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c7e772ed336040518263ffffffff1660e01b81526004016116a29190614f5f565b6020604051808303816000875af11580156116c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116e591906154b1565b50601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c7e772ed336040518263ffffffff1660e01b81526004016117419190614f5f565b6020604051808303816000875af1158015611760573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061178491906154b1565b50565b3373ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611817576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180e906152e0565b60405180910390fd5b6064601c546118269190615181565b81111561183257600080fd5b8060098190555050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b3373ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611914576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190b906152e0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60608060606000806000806000806000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637b9437738d8d6040518363ffffffff1660e01b8152600401611a42929190615512565b600060405180830381865afa158015611a5f573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611a8891906155ee565b99509950995099509950995099509950995099509295989b9194979a5092959850565b3373ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611b3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b32906152e0565b60405180910390fd5b624c4b40811115611b4b57600080fd5b80601b8190555050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060048054611b8e90615086565b80601f0160208091040260200160405190810160405280929190818152602001828054611bba90615086565b8015611c075780601f10611bdc57610100808354040283529160200191611c07565b820191906000526020600020905b815481529060010190602001808311611bea57829003601f168201915b5050505050905090565b6000806015541115611c27576015549050611cc9565b6000602060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205442611c7491906154de565b90506017548110611c8a57601454915050611cc9565b6000601454601654611c9c91906154de565b90506017548282611cad91906151e6565b611cb79190615181565b601654611cc491906154de565b925050505b919050565b3373ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611d5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d55906152e0565b60405180910390fd5b80601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166331e79db0826040518263ffffffff1660e01b8152600401611dfa9190614f5f565b600060405180830381600087803b158015611e1457600080fd5b505af1158015611e28573d6000803e3d6000fd5b50505050601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166331e79db0826040518263ffffffff1660e01b8152600401611e879190614f5f565b600060405180830381600087803b158015611ea157600080fd5b505af1158015611eb5573d6000803e3d6000fd5b505050506001600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6000803390506000611f268286612810565b905083811015611f6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f629061576d565b60405180910390fd5b611f7882868684036129d0565b60019250505092915050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080339050611fbb818585612d63565b600191505092915050565b3373ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612056576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204d906152e0565b60405180910390fd5b601d54811061209a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612091906153b7565b60405180910390fd5b80601d8190555050565b3373ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612134576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161212b906152e0565b60405180910390fd5b61213c613e71565b565b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b3373ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146121f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121eb906152e0565b60405180910390fd5b6000600d5414612239576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161223090615103565b60405180910390fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa1580156122a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122ca91906153ec565b73ffffffffffffffffffffffffffffffffffffffff1663c9c6539630600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612353573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061237791906153ec565b6040518363ffffffff1660e01b815260040161239492919061578d565b6020604051808303816000875af11580156123b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123d791906153ec565b600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166331e79db0600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b81526004016124949190614f5f565b600060405180830381600087803b1580156124ae57600080fd5b505af11580156124c2573d6000803e3d6000fd5b50505050601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166331e79db0600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b81526004016125439190614f5f565b600060405180830381600087803b15801561255d57600080fd5b505af1158015612571573d6000803e3d6000fd5b50505050600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d71947306125be3061183c565b6000806125c9611b55565b426040518863ffffffff1660e01b81526004016125eb969594939291906157f1565b60606040518083038185885af1158015612609573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061262e9190615852565b5050506001600e60016101000a81548160ff0219169083151502179055506103e8600a601c5461265e91906151e6565b6126689190615181565b600f8190555042600d819055506103e8601c546126859190615181565b600981905550600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b815260040161272a9291906158a5565b6020604051808303816000875af1158015612749573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061276d91906154b1565b50565b61277a83836108b2565b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663396500438285856040518463ffffffff1660e01b81526004016127d9939291906158ce565b600060405180830381600087803b1580156127f357600080fd5b505af1158015612807573d6000803e3d6000fd5b50505050505050565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561288c577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9050612899565b61289683836143da565b90505b92915050565b3373ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461292f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612926906152e0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361299e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161299590615977565b60405180910390fd5b6129a781614461565b50565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612a3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a3690615a09565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612aae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612aa590615a9b565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051612b8c91906149a6565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612c08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bff90615b07565b60405180910390fd5b8060026000828254612c1a91906151b2565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612ccb91906149a6565b60405180910390a35050565b6000612ce38484612810565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114612d5d5781811015612d4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d4690615b73565b60405180910390fd5b612d5c84848484036129d0565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612d9c57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612dd557600080fd5b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161480612e1b5750600e60009054906101000a900460ff165b15612e3057612e2b838383614527565b61396d565b612e38611b55565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015612ea65750612e76611b55565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b8015612f005750601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b15613553576000600d541180612f4157503073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b612f4a57600080fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16148015612ff55750600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b801561304b5750600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b1561307357600f548161305d8461183c565b61306791906151b2565b111561307257600080fd5b5b600061307e3061183c565b905060095481101580156130e05750600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b80156130f85750600e60019054906101000a900460ff165b1561310657613105613e71565b5b6000602060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020540361326d5742602060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663238dafe06040518163ffffffff1660e01b8152600401602060405180830381865afa1580156131fe573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061322291906154b1565b1561326c5742602160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b5b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c7e772ed856040518263ffffffff1660e01b81526004016132c89190614f5f565b6020604051808303816000875af11580156132e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061330b91906154b1565b50601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c7e772ed846040518263ffffffff1660e01b81526004016133679190614f5f565b6020604051808303816000875af1158015613386573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133aa91906154b1565b50601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161461353f57601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c7e772ed856040518263ffffffff1660e01b815260040161345b9190614f5f565b6020604051808303816000875af115801561347a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061349e91906154b1565b50601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c7e772ed846040518263ffffffff1660e01b81526004016134fa9190614f5f565b6020604051808303816000875af1158015613519573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061353d91906154b1565b505b61354884611316565b61355183611316565b505b600061355e8461183c565b90508082111561356c578091505b600080600d5414806135c75750600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b8061361b5750600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b156136295760009050613695565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361368e5761368784611c11565b9050613694565b60145490505b5b60008111156136d5576000606484836136ae91906151e6565b6136b89190615181565b90506136c5863083614527565b80846136d191906154de565b9350505b6136e0858585614527565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166377067d9586866040518363ffffffff1660e01b815260040161373d92919061578d565b600060405180830381600087803b15801561375757600080fd5b505af115801561376b573d6000803e3d6000fd5b505050506000601b541180156137cb5750600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b806138205750600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b1561396a57601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ffb2c479601b546040518263ffffffff1660e01b815260040161388291906149a6565b6060604051808303816000875af19250505080156138be57506040513d601f19601f820116820180604052508101906138bb9190615852565b60015b156138c7575050505b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ffb2c479601b546040518263ffffffff1660e01b815260040161392491906149a6565b6060604051808303816000875af192505050801561396057506040513d601f19601f8201168201806040525081019061395d9190615852565b60015b15613969575050505b5b50505b505050565b8073ffffffffffffffffffffffffffffffffffffffff166331e79db0826040518263ffffffff1660e01b81526004016139ab9190614f5f565b600060405180830381600087803b1580156139c557600080fd5b505af11580156139d9573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff166331e79db0306040518263ffffffff1660e01b8152600401613a169190614f5f565b600060405180830381600087803b158015613a3057600080fd5b505af1158015613a44573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff166331e79db0613a6c611b55565b6040518263ffffffff1660e01b8152600401613a889190614f5f565b600060405180830381600087803b158015613aa257600080fd5b505af1158015613ab6573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff166331e79db0600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b8152600401613b159190614f5f565b600060405180830381600087803b158015613b2f57600080fd5b505af1158015613b43573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff166331e79db0600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b8152600401613ba29190614f5f565b600060405180830381600087803b158015613bbc57600080fd5b505af1158015613bd0573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff166331e79db0601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b8152600401613c2f9190614f5f565b600060405180830381600087803b158015613c4957600080fd5b505af1158015613c5d573d6000803e3d6000fd5b505050506001600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603613d2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613d2290615c05565b60405180910390fd5b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015613db1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613da890615c97565b60405180910390fd5b8181036000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600260008282540392505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051613e6491906149a6565b60405180910390a3505050565b6000613e7c3061183c565b9050600954811115613e8e5760095490505b60008103613e9c57506143d8565b6001600e60006101000a81548160ff0219169083151502179055506000606460195483613ec991906151e6565b613ed39190615181565b90506000600267ffffffffffffffff811115613ef257613ef1614c42565b5b604051908082528060200260200182016040528015613f205781602001602082028036833780820191505090505b5090503081600081518110613f3857613f37615cb7565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015613fdf573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061400391906153ec565b8160018151811061401757614016615cb7565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac94760028461409c9190615181565b856140a791906154de565b60008430426040518663ffffffff1660e01b81526004016140cc959493929190615da4565b600060405180830381600087803b1580156140e657600080fd5b505af19250505080156140f7575060015b5060004711156143b95760008211156141ca57600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d71947306002866141579190615181565b600080614162611b55565b426040518863ffffffff1660e01b8152600401614184969594939291906157f1565b60606040518083038185885af1935050505080156141c057506040513d601f19601f820116820180604052508101906141bd9190615852565b60015b156141c9575050505b5b600060195460646141db91906154de565b601854476141e991906151e6565b6141f39190615181565b90506000601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015614264573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142889190615dfe565b111561434e576000601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16826207a120906040516142db90615e5c565b600060405180830381858888f193505050503d8060008114614319576040519150601f19603f3d011682016040523d82523d6000602084013e61431e565b606091505b505090508061434c576000600e60006101000a81548160ff02191690831515021790555050505050506143d8565b505b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050501580156143b6573d6000803e3d6000fd5b50505b6000600e60006101000a81548160ff0219169083151502179055505050505b565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603614596576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161458d90615ebd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603614605576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016145fc90615f29565b60405180910390fd5b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561468b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161468290615f95565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161477991906149a6565b60405180910390a350505050565b600081519050919050565b600082825260208201905092915050565b60005b838110156147c15780820151818401526020810190506147a6565b60008484015250505050565b6000601f19601f8301169050919050565b60006147e982614787565b6147f38185614792565b93506148038185602086016147a3565b61480c816147cd565b840191505092915050565b6000602082019050818103600083015261483181846147de565b905092915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006148788261484d565b9050919050565b6148888161486d565b811461489357600080fd5b50565b6000813590506148a58161487f565b92915050565b6000819050919050565b6148be816148ab565b81146148c957600080fd5b50565b6000813590506148db816148b5565b92915050565b600080604083850312156148f8576148f7614843565b5b600061490685828601614896565b9250506020614917858286016148cc565b9150509250929050565b60008115159050919050565b61493681614921565b82525050565b6000602082019050614951600083018461492d565b92915050565b6000806040838503121561496e5761496d614843565b5b600061497c858286016148cc565b925050602061498d85828601614896565b9150509250929050565b6149a0816148ab565b82525050565b60006020820190506149bb6000830184614997565b92915050565b6000806000606084860312156149da576149d9614843565b5b60006149e886828701614896565b93505060206149f986828701614896565b9250506040614a0a868287016148cc565b9150509250925092565b600060208284031215614a2a57614a29614843565b5b6000614a38848285016148cc565b91505092915050565b600060ff82169050919050565b614a5781614a41565b82525050565b6000602082019050614a726000830184614a4e565b92915050565b600080600080600080600060e0888a031215614a9757614a96614843565b5b6000614aa58a828b016148cc565b9750506020614ab68a828b016148cc565b9650506040614ac78a828b016148cc565b9550506060614ad88a828b016148cc565b9450506080614ae98a828b016148cc565b93505060a0614afa8a828b016148cc565b92505060c0614b0b8a828b016148cc565b91505092959891949750929550565b60008060408385031215614b3157614b30614843565b5b6000614b3f85828601614896565b9250506020614b5085828601614896565b9150509250929050565b600060208284031215614b7057614b6f614843565b5b6000614b7e84828501614896565b91505092915050565b6000819050919050565b6000614bac614ba7614ba28461484d565b614b87565b61484d565b9050919050565b6000614bbe82614b91565b9050919050565b6000614bd082614bb3565b9050919050565b614be081614bc5565b82525050565b6000602082019050614bfb6000830184614bd7565b92915050565b6000614c0c82614bb3565b9050919050565b614c1c81614c01565b82525050565b6000602082019050614c376000830184614c13565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b614c7a826147cd565b810181811067ffffffffffffffff82111715614c9957614c98614c42565b5b80604052505050565b6000614cac614839565b9050614cb88282614c71565b919050565b600067ffffffffffffffff821115614cd857614cd7614c42565b5b602082029050602081019050919050565b600080fd5b6000614d01614cfc84614cbd565b614ca2565b90508083825260208201905060208402830185811115614d2457614d23614ce9565b5b835b81811015614d4d5780614d3988826148cc565b845260208401935050602081019050614d26565b5050509392505050565b600082601f830112614d6c57614d6b614c3d565b5b8135614d7c848260208601614cee565b91505092915050565b60008060408385031215614d9c57614d9b614843565b5b6000614daa85828601614896565b925050602083013567ffffffffffffffff811115614dcb57614dca614848565b5b614dd785828601614d57565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b614e16816148ab565b82525050565b6000614e288383614e0d565b60208301905092915050565b6000602082019050919050565b6000614e4c82614de1565b614e568185614dec565b9350614e6183614dfd565b8060005b83811015614e92578151614e798882614e1c565b9750614e8483614e34565b925050600181019050614e65565b5085935050505092915050565b6000610140820190508181036000830152614eba818d614e41565b90508181036020830152614ece818c614e41565b90508181036040830152614ee2818b614e41565b9050614ef1606083018a614997565b614efe6080830189614997565b614f0b60a0830188614997565b614f1860c0830187614997565b614f2560e0830186614997565b614f33610100830185614997565b614f41610120830184614997565b9b9a5050505050505050505050565b614f598161486d565b82525050565b6000602082019050614f746000830184614f50565b92915050565b6000614f8582614b91565b9050919050565b6000614f9782614f7a565b9050919050565b614fa781614f8c565b82525050565b6000602082019050614fc26000830184614f9e565b92915050565b600080600060608486031215614fe157614fe0614843565b5b6000614fef868287016148cc565b935050602061500086828701614896565b9250506040615011868287016148cc565b9150509250925092565b600061502682614f7a565b9050919050565b6150368161501b565b82525050565b6000602082019050615051600083018461502d565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061509e57607f821691505b6020821081036150b1576150b0615057565b5b50919050565b7f6e6f000000000000000000000000000000000000000000000000000000000000600082015250565b60006150ed600283614792565b91506150f8826150b7565b602082019050919050565b6000602082019050818103600083015261511c816150e0565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061518c826148ab565b9150615197836148ab565b9250826151a7576151a6615123565b5b828204905092915050565b60006151bd826148ab565b91506151c8836148ab565b92508282019050808211156151e0576151df615152565b5b92915050565b60006151f1826148ab565b91506151fc836148ab565b925082820261520a816148ab565b9150828204841483151761522157615220615152565b5b5092915050565b7f3e00000000000000000000000000000000000000000000000000000000000000600082015250565b600061525e600183614792565b915061526982615228565b602082019050919050565b6000602082019050818103600083015261528d81615251565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006152ca602083614792565b91506152d582615294565b602082019050919050565b600060208201905081810360008301526152f9816152bd565b9050919050565b600061530b8261486d565b9050919050565b61531b81615300565b811461532657600080fd5b50565b60008151905061533881615312565b92915050565b60006020828403121561535457615353614843565b5b600061536284828501615329565b91505092915050565b7f696e76616c696400000000000000000000000000000000000000000000000000600082015250565b60006153a1600783614792565b91506153ac8261536b565b602082019050919050565b600060208201905081810360008301526153d081615394565b9050919050565b6000815190506153e68161487f565b92915050565b60006020828403121561540257615401614843565b5b6000615410848285016153d7565b91505092915050565b7f536574206f776e65720000000000000000000000000000000000000000000000600082015250565b600061544f600983614792565b915061545a82615419565b602082019050919050565b6000602082019050818103600083015261547e81615442565b9050919050565b61548e81614921565b811461549957600080fd5b50565b6000815190506154ab81615485565b92915050565b6000602082840312156154c7576154c6614843565b5b60006154d58482850161549c565b91505092915050565b60006154e9826148ab565b91506154f4836148ab565b925082820390508181111561550c5761550b615152565b5b92915050565b60006040820190506155276000830185614f50565b81810360208301526155398184614e41565b90509392505050565b600081519050615551816148b5565b92915050565b600061556a61556584614cbd565b614ca2565b9050808382526020820190506020840283018581111561558d5761558c614ce9565b5b835b818110156155b657806155a28882615542565b84526020840193505060208101905061558f565b5050509392505050565b600082601f8301126155d5576155d4614c3d565b5b81516155e5848260208601615557565b91505092915050565b6000806000806000806000806000806101408b8d03121561561257615611614843565b5b60008b015167ffffffffffffffff8111156156305761562f614848565b5b61563c8d828e016155c0565b9a505060208b015167ffffffffffffffff81111561565d5761565c614848565b5b6156698d828e016155c0565b99505060408b015167ffffffffffffffff81111561568a57615689614848565b5b6156968d828e016155c0565b98505060606156a78d828e01615542565b97505060806156b88d828e01615542565b96505060a06156c98d828e01615542565b95505060c06156da8d828e01615542565b94505060e06156eb8d828e01615542565b9350506101006156fd8d828e01615542565b92505061012061570f8d828e01615542565b9150509295989b9194979a5092959850565b7f64656372656173656420616c6c6f77616e63652062656c6f77207a65726f0000600082015250565b6000615757601e83614792565b915061576282615721565b602082019050919050565b600060208201905081810360008301526157868161574a565b9050919050565b60006040820190506157a26000830185614f50565b6157af6020830184614f50565b9392505050565b6000819050919050565b60006157db6157d66157d1846157b6565b614b87565b6148ab565b9050919050565b6157eb816157c0565b82525050565b600060c0820190506158066000830189614f50565b6158136020830188614997565b61582060408301876157e2565b61582d60608301866157e2565b61583a6080830185614f50565b61584760a0830184614997565b979650505050505050565b60008060006060848603121561586b5761586a614843565b5b600061587986828701615542565b935050602061588a86828701615542565b925050604061589b86828701615542565b9150509250925092565b60006040820190506158ba6000830185614f50565b6158c76020830184614997565b9392505050565b60006060820190506158e36000830186614997565b6158f06020830185614997565b6158fd6040830184614f50565b949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000615961602683614792565b915061596c82615905565b604082019050919050565b6000602082019050818103600083015261599081615954565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006159f3602483614792565b91506159fe82615997565b604082019050919050565b60006020820190508181036000830152615a22816159e6565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000615a85602283614792565b9150615a9082615a29565b604082019050919050565b60006020820190508181036000830152615ab481615a78565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6000615af1601f83614792565b9150615afc82615abb565b602082019050919050565b60006020820190508181036000830152615b2081615ae4565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000615b5d601d83614792565b9150615b6882615b27565b602082019050919050565b60006020820190508181036000830152615b8c81615b50565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000615bef602183614792565b9150615bfa82615b93565b604082019050919050565b60006020820190508181036000830152615c1e81615be2565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b6000615c81602283614792565b9150615c8c82615c25565b604082019050919050565b60006020820190508181036000830152615cb081615c74565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b615d1b8161486d565b82525050565b6000615d2d8383615d12565b60208301905092915050565b6000602082019050919050565b6000615d5182615ce6565b615d5b8185615cf1565b9350615d6683615d02565b8060005b83811015615d97578151615d7e8882615d21565b9750615d8983615d39565b925050600181019050615d6a565b5085935050505092915050565b600060a082019050615db96000830188614997565b615dc660208301876157e2565b8181036040830152615dd88186615d46565b9050615de76060830185614f50565b615df46080830184614997565b9695505050505050565b600060208284031215615e1457615e13614843565b5b6000615e2284828501615542565b91505092915050565b600081905092915050565b50565b6000615e46600083615e2b565b9150615e5182615e36565b600082019050919050565b6000615e6782615e39565b9150819050919050565b7f74616e736665722066726f6d20746865207a65726f2061646472657373000000600082015250565b6000615ea7601d83614792565b9150615eb282615e71565b602082019050919050565b60006020820190508181036000830152615ed681615e9a565b9050919050565b7f7472616e7366657220746f20746865207a65726f206164647265737300000000600082015250565b6000615f13601c83614792565b9150615f1e82615edd565b602082019050919050565b60006020820190508181036000830152615f4281615f06565b9050919050565b7f7472616e7366657220616d6f756e7420657863656564732062616c616e636500600082015250565b6000615f7f601f83614792565b9150615f8a82615f49565b602082019050919050565b60006020820190508181036000830152615fae81615f72565b905091905056fea2646970667358221220c6b8b95a3bc882926b87bb0d09ae55df4ea7a09876a094961a334db724cb2f5e64736f6c6343000811003360806040523480156200001157600080fd5b506040516200644e3803806200644e833981810160405281019062000037919062000496565b6000339050806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35080600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506200013160006007600a60006200017f60201b60201c565b620001486000601e8060006200017f60201b60201c565b620001606000605a603c60016200017f60201b60201c565b620001786001601e603c60016200017f60201b60201c565b5062000790565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161462000210576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002079062000529565b60405180910390fd5b60006200022485856200040260201b60201c565b9050600060036000838152602001908152602001600020600101541462000282576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000279906200059b565b60405180910390fd5b600184101580156200029557506103e884105b620002d7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002ce906200060d565b60405180910390fd5b60018310158015620002eb57506103e88311155b6200032d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000324906200067f565b60405180910390fd5b604051806080016040528086151581526020018581526020018481526020018315158152506003600083815260200190815260200160002060008201518160000160006101000a81548160ff021916908315150217905550602082015181600101556040820151816002015560608201518160030160006101000a81548160ff0219169083151502179055509050507f5cf7415e1bb75d43497addfa23f7deb24bc8ad84b99e44708d59b5fcaee97b2085858585604051620003f39493929190620006d9565b60405180910390a15050505050565b600080829050831562000422576103e8816200041f919062000755565b90505b8091505092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200045e8262000431565b9050919050565b620004708162000451565b81146200047c57600080fd5b50565b600081519050620004908162000465565b92915050565b600060208284031215620004af57620004ae6200042c565b5b6000620004bf848285016200047f565b91505092915050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600062000511602083620004c8565b91506200051e82620004d9565b602082019050919050565b60006020820190508181036000830152620005448162000502565b9050919050565b7f416c726561647920616464656400000000000000000000000000000000000000600082015250565b600062000583600d83620004c8565b915062000590826200054b565b602082019050919050565b60006020820190508181036000830152620005b68162000574565b9050919050565b7f496e76616c6964206475726174696f6e00000000000000000000000000000000600082015250565b6000620005f5601083620004c8565b91506200060282620005bd565b602082019050919050565b600060208201905081810360008301526200062881620005e6565b9050919050565b7f496e76616c6964206d756c7469706c6965720000000000000000000000000000600082015250565b600062000667601283620004c8565b915062000674826200062f565b602082019050919050565b600060208201905081810360008301526200069a8162000658565b9050919050565b60008115159050919050565b620006b881620006a1565b82525050565b6000819050919050565b620006d381620006be565b82525050565b6000608082019050620006f06000830187620006ad565b620006ff6020830186620006c8565b6200070e6040830185620006c8565b6200071d6060830184620006ad565b95945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006200076282620006be565b91506200076f83620006be565b92508282019050808211156200078a576200078962000726565b5b92915050565b615cae80620007a06000396000f3fe6080604052600436106101395760003560e01c80637b943773116100ab5780639c318bd01161006f5780639c318bd0146104375780639e9ed6b514610474578063cf251c92146104b1578063daef5bb2146104f1578063f2fde38b1461052e578063fc0c546a1461055757610140565b80637b9437731461032c578063844f70aa1461036957806384afff9b146103a65780638760c3e9146103e35780638da5cb5b1461040c57610140565b806339650043116100fd578063396500431461022f5780633b7b6188146102585780634d0250f714610281578063584b62a1146102aa57806363475039146102ec578063715018a61461031557610140565b8063073791af146101455780630e8de47314610182578063238dafe0146101bf57806329d465f7146101ea578063328d8f721461020657610140565b3661014057005b600080fd5b34801561015157600080fd5b5061016c60048036038101906101679190614594565b610582565b60405161017991906145d0565b60405180910390f35b34801561018e57600080fd5b506101a960048036038101906101a49190614649565b61059a565b6040516101b691906145d0565b60405180910390f35b3480156101cb57600080fd5b506101d4610889565b6040516101e191906146a4565b60405180910390f35b61020460048036038101906101ff91906146bf565b61089c565b005b34801561021257600080fd5b5061022d6004803603810190610228919061473e565b6115c7565b005b34801561023b57600080fd5b506102566004803603810190610251919061476b565b611672565b005b34801561026457600080fd5b5061027f600480360381019061027a91906147be565b611762565b005b34801561028d57600080fd5b506102a860048036038101906102a391906147be565b61182b565b005b3480156102b657600080fd5b506102d160048036038101906102cc91906147fe565b611977565b6040516102e39695949392919061484d565b60405180910390f35b3480156102f857600080fd5b50610313600480360381019061030e91906147be565b6119e0565b005b34801561032157600080fd5b5061032a611fc0565b005b34801561033857600080fd5b50610353600480360381019061034e9190614a07565b61210c565b6040516103609190614b21565b60405180910390f35b34801561037557600080fd5b50610390600480360381019061038b9190614b43565b612b45565b60405161039d91906145d0565b60405180910390f35b3480156103b257600080fd5b506103cd60048036038101906103c89190614b43565b612b5d565b6040516103da91906145d0565b60405180910390f35b3480156103ef57600080fd5b5061040a60048036038101906104059190614b70565b612b75565b005b34801561041857600080fd5b50610421612de0565b60405161042e9190614bd7565b60405180910390f35b34801561044357600080fd5b5061045e60048036038101906104599190614b43565b612e09565b60405161046b91906145d0565b60405180910390f35b34801561048057600080fd5b5061049b60048036038101906104969190614b43565b612e21565b6040516104a891906145d0565b60405180910390f35b3480156104bd57600080fd5b506104d860048036038101906104d39190614594565b612e39565b6040516104e89493929190614bf2565b60405180910390f35b3480156104fd57600080fd5b5061051860048036038101906105139190614c37565b612e83565b60405161052591906145d0565b60405180910390f35b34801561053a57600080fd5b5061055560048036038101906105509190614b43565b612eaa565b005b34801561056357600080fd5b5061056c612fb3565b6040516105799190614cd6565b60405180910390f35b60046020528060005260406000206000915090505481565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16634497f4f56040518163ffffffff1660e01b8152600401602060405180830381865afa158015610609573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061062d9190614d41565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361075e57600260149054906101000a900460ff16156106bb57600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050610883565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231836040518263ffffffff1660e01b81526004016107169190614bd7565b602060405180830381865afa158015610733573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107579190614d83565b9050610883565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bd2eeab46040518163ffffffff1660e01b8152600401602060405180830381865afa1580156107cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107ef9190614d41565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361087e57600260149054906101000a900460ff161561087d57600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050610883565b5b600090505b92915050565b600260149054906101000a900460ff1681565b600260149054906101000a900460ff166108eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108e290614e0d565b60405180910390fd5b600a60009054906101000a900460ff161561093b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093290614e79565b60405180910390fd5b6000341161097e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161097590614ee5565b60405180910390fd5b6001600a60006101000a81548160ff021916908315150217905550600060036000858152602001908152602001600020905060008160010154116109f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109ee90614f51565b60405180910390fd5b8060000160009054906101000a900460ff1615611348576000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610a6b9190614bd7565b602060405180830381865afa158015610a88573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aac9190614d83565b905060008190506000851115610b6457600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330886040518463ffffffff1660e01b8152600401610b1b93929190614f71565b6020604051808303816000875af1158015610b3a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b5e9190614fbd565b50610b7b565b610b7a600234610b749190615048565b85612fd9565b5b80600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610bd79190614bd7565b602060405180830381865afa158015610bf4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c189190614d83565b610c229190615079565b945060004790506000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a8aa1b316040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c98573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cbc91906150eb565b73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610cf49190614bd7565b602060405180830381865afa158015610d11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d359190614d83565b9050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610d929190614bd7565b602060405180830381865afa158015610daf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dd39190614d83565b9250600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f887ea406040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e80573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ea49190615156565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b8152600401610ee2929190615183565b6020604051808303816000875af1158015610f01573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f259190614fbd565b50600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f887ea406040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f93573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fb79190615156565b73ffffffffffffffffffffffffffffffffffffffff1663f305d71983600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168a60008030426040518863ffffffff1660e01b815260040161101d969594939291906151e7565b60606040518083038185885af115801561103b573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906110609190615248565b505050600081600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a8aa1b316040518163ffffffff1660e01b8152600401602060405180830381865afa1580156110d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110f791906150eb565b73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161112f9190614bd7565b602060405180830381865afa15801561114c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111709190614d83565b61117a9190615079565b90506000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016111d99190614bd7565b602060405180830381865afa1580156111f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061121a9190614d83565b90506000818661122a9190615079565b90506112448b8460028461123e919061529b565b336132ec565b86821015611287576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127e90615329565b60405180910390fd5b8682111561133c57600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb3389856112da9190615079565b6040518363ffffffff1660e01b81526004016112f7929190615183565b6020604051808303816000875af1158015611316573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061133a9190614fbd565b505b505050505050506114ef565b6000831461138b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138290615395565b60405180910390fd5b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016113e89190614bd7565b602060405180830381865afa158015611405573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114299190614d83565b90506114353484612fd9565b600081600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016114939190614bd7565b602060405180830381865afa1580156114b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114d49190614d83565b6114de9190615079565b90506114ec868283336132ec565b50505b60004711156115a65760003373ffffffffffffffffffffffffffffffffffffffff164760405161151e906153e6565b60006040518083038185875af1925050503d806000811461155b576040519150601f19603f3d011682016040523d82523d6000602084013e611560565b606091505b50509050806115a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159b90615447565b60405180910390fd5b505b6000600a60006101000a81548160ff02191690831515021790555050505050565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611655576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164c906154b3565b60405180910390fd5b80600260146101000a81548160ff02191690831515021790555050565b600260149054906101000a900460ff166116c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b890614e0d565b60405180910390fd5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611751576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117489061551f565b60405180910390fd5b61175d838384846132ec565b505050565b600260149054906101000a900460ff166117b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a890614e0d565b60405180910390fd5b60006003600084815260200190815260200160002090508060000160009054906101000a900460ff161561181a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611811906155b1565b60405180910390fd5b611826838384336132ec565b505050565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146118b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b0906154b3565b60405180910390fd5b60006003600084815260200190815260200160002090506000816001015411611917576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190e90614f51565b60405180910390fd5b6001821015801561192a57506103e88211155b611969576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119609061561d565b60405180910390fd5b818160020181905550505050565b6005602052816000526040600020602052806000526040600020600091509150508060000154908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060020154908060030154908060040154908060050154905086565b600060036000848152602001908152602001600020905060008160010154118015611a1a57508060000160009054906101000a900460ff16155b611a59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5090614f51565b60405180910390fd5b6000600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600085815260200190815260200160002090503373ffffffffffffffffffffffffffffffffffffffff168160010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611b3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3690615689565b60405180910390fd5b6000816002015442611b519190615079565b9050620151808360010154611b66919061529b565b811015611ba8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9f906156f5565b60405180910390fd5b60008403611bbc5781600301549350611c04565b8160030154841115611c03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bfa90615761565b60405180910390fd5b5b60008260030154905084836003016000828254611c219190615079565b9250508190555060008460000160009054906101000a900460ff16611c465785611c49565b60005b905060008560000160009054906101000a900460ff16611c6a576000611c6c565b865b9050600083866004015489611c81919061529b565b611c8b9190615048565b9050611c9b868484846000613990565b8660030160009054906101000a900460ff1615611ce25760008487600501548a611cc5919061529b565b611ccf9190615048565b9050611ce087600080846000613f0b565b505b6000866003015403611d9157600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a81526020019081526020016000206000808201600090556001820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600282016000905560038201600090556004820160009055600582016000905550505b8660000160009054906101000a900460ff16611e4d57600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb338a6040518363ffffffff1660e01b8152600401611e04929190615183565b6020604051808303816000875af1158015611e23573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e479190614fbd565b50611f5d565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a8aa1b316040518163ffffffff1660e01b8152600401602060405180830381865afa158015611eba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ede91906150eb565b73ffffffffffffffffffffffffffffffffffffffff1663a9059cbb338a6040518363ffffffff1660e01b8152600401611f18929190615183565b6020604051808303816000875af1158015611f37573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f5b9190614fbd565b505b883373ffffffffffffffffffffffffffffffffffffffff167f0844bde78484f10b1d108111de44ba5ed081b067e3c3a8e0b15da8202510453b8a60008a6003015414604051611fad929190615781565b60405180910390a3505050505050505050565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461204e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612045906154b3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b606060036007835161211e919061529b565b61212891906157aa565b67ffffffffffffffff811115612141576121406148c4565b5b60405190808252806020026020018201604052801561216f5781602001602082028036833780820191505090505b50905060005b8251811015612a01576000600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008584815181106121d4576121d36157de565b5b6020026020010151815260200190815260200160002090508060020154836000600785612201919061529b565b61220b91906157aa565b8151811061221c5761221b6157de565b5b602002602001018181525050806003015483600160078561223d919061529b565b61224791906157aa565b81518110612258576122576157de565b5b6020026020010181815250508060040154836002600785612279919061529b565b61228391906157aa565b81518110612294576122936157de565b5b60200260200101818152505080600501548360036007856122b5919061529b565b6122bf91906157aa565b815181106122d0576122cf6157de565b5b6020026020010181815250506000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16634497f4f56040518163ffffffff1660e01b8152600401602060405180830381865afa15801561234b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061236f9190614d41565b73ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156123b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123dd9190614d83565b111561263257600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16634497f4f56040518163ffffffff1660e01b8152600401602060405180830381865afa158015612450573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124749190614d41565b73ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156124be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124e29190614d83565b8160040154600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16634497f4f56040518163ffffffff1660e01b8152600401602060405180830381865afa158015612554573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125789190614d41565b73ffffffffffffffffffffffffffffffffffffffff1663fa1c7fbe6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156125c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125e69190614d83565b6125f0919061529b565b6125fa9190615048565b83600460078561260a919061529b565b61261491906157aa565b81518110612625576126246157de565b5b6020026020010181815250505b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bd2eeab46040518163ffffffff1660e01b8152600401602060405180830381865afa1580156126a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126c59190614d41565b73ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561270f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127339190614d83565b111561298857600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bd2eeab46040518163ffffffff1660e01b8152600401602060405180830381865afa1580156127a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127ca9190614d41565b73ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612814573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128389190614d83565b8160050154600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bd2eeab46040518163ffffffff1660e01b8152600401602060405180830381865afa1580156128aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128ce9190614d41565b73ffffffffffffffffffffffffffffffffffffffff1663fa1c7fbe6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612918573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061293c9190614d83565b612946919061529b565b6129509190615048565b836005600785612960919061529b565b61296a91906157aa565b8151811061297b5761297a6157de565b5b6020026020010181815250505b6004600085848151811061299f5761299e6157de565b5b60200260200101518152602001908152602001600020548360066007856129c6919061529b565b6129d091906157aa565b815181106129e1576129e06157de565b5b6020026020010181815250505080806129f99061580d565b915050612175565b50600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548160078451612a51919061529b565b81518110612a6257612a616157de565b5b602002602001018181525050600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205481600160078551612abf919061529b565b612ac991906157aa565b81518110612ada57612ad96157de565b5b602002602001018181525050600260149054906101000a900460ff16612b01576000612b04565b60015b60ff1681600260078551612b18919061529b565b612b2291906157aa565b81518110612b3357612b326157de565b5b60200260200101818152505092915050565b60076020528060005260406000206000915090505481565b60086020528060005260406000206000915090505481565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612c03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bfa906154b3565b60405180910390fd5b6000612c0f8585612e83565b90506000600360008381526020019081526020016000206001015414612c6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c61906158a1565b60405180910390fd5b60018410158015612c7c57506103e884105b612cbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cb29061590d565b60405180910390fd5b60018310158015612cce57506103e88311155b612d0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d049061561d565b60405180910390fd5b604051806080016040528086151581526020018581526020018481526020018315158152506003600083815260200190815260200160002060008201518160000160006101000a81548160ff021916908315150217905550602082015181600101556040820151816002015560608201518160030160006101000a81548160ff0219169083151502179055509050507f5cf7415e1bb75d43497addfa23f7deb24bc8ad84b99e44708d59b5fcaee97b2085858585604051612dd19493929190614bf2565b60405180910390a15050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60096020528060005260406000206000915090505481565b60066020528060005260406000206000915090505481565b60036020528060005260406000206000915090508060000160009054906101000a900460ff16908060010154908060020154908060030160009054906101000a900460ff16905084565b6000808290508315612ea0576103e881612e9d91906157aa565b90505b8091505092915050565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612f38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f2f906154b3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612fa7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f9e9061599f565b60405180910390fd5b612fb081614486565b50565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600267ffffffffffffffff811115612ff657612ff56148c4565b5b6040519080825280602002602001820160405280156130245781602001602082028036833780820191505090505b509050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f887ea406040518163ffffffff1660e01b8152600401602060405180830381865afa158015613094573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130b89190615156565b73ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015613102573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061312691906159d4565b8160008151811061313a576131396157de565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16816001815181106131ab576131aa6157de565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f887ea406040518163ffffffff1660e01b8152600401602060405180830381865afa158015613252573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132769190615156565b73ffffffffffffffffffffffffffffffffffffffff1663b6f9de9584848430426040518663ffffffff1660e01b81526004016132b59493929190615abf565b6000604051808303818588803b1580156132ce57600080fd5b505af11580156132e2573d6000803e3d6000fd5b5050505050505050565b600260149054906101000a900460ff1661333b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161333290614e0d565b60405180910390fd5b6000821161337e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161337590615761565b60405180910390fd5b600060036000868152602001908152602001600020905060008160010154116133dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133d390614f51565b60405180910390fd5b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000878152602001908152602001600020905060008082600001540361348e57868260000181905550838260010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600190505b6000826002015414806134ef5750600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614155b156134fe574282600201819055505b8260000160009054906101000a900460ff1661385957848614613556576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161354d90615b7d565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146138585784600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231866040518263ffffffff1660e01b81526004016135e59190614bd7565b602060405180830381865afa158015613602573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136269190614d83565b1015613667576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161365e90615be9565b60405180910390fd5b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016136c49190614bd7565b602060405180830381865afa1580156136e1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137059190614d83565b9050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd8630896040518463ffffffff1660e01b815260040161376693929190614f71565b6020604051808303816000875af1158015613785573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137a99190614fbd565b5080600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016138069190614bd7565b602060405180830381865afa158015613823573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138479190614d83565b6138519190615079565b9550859650505b5b8582600301600082825461386d91906157aa565b9250508190555060008360000160009054906101000a900460ff166138925786613895565b60005b905060008460000160009054906101000a900460ff166138b65760006138b8565b875b905060008560020154886138cc919061529b565b90506138dc858484846001613990565b8560030160009054906101000a900460ff16156139035761390285600080846001613f0b565b5b898773ffffffffffffffffffffffffffffffffffffffff167fc80ff5056f1cf684df694dae8830b11e6d6c69f46dcdc93bf071a0bb7373a51f8a873073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161460405161397c93929190615c09565b60405180910390a350505050505050505050565b8015613b5d5783600660008760010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613a0991906157aa565b9250508190555082600760008760010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613a8391906157aa565b9250508190555081856004016000828254613a9e91906157aa565b9250508190555081600860008760010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613b1891906157aa565b925050819055508284613b2b91906157aa565b60046000876000015481526020019081526020016000206000828254613b5191906157aa565b92505081905550613d20565b83600660008760010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613bd09190615079565b9250508190555082600760008760010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613c4a9190615079565b9250508190555081856004016000828254613c659190615079565b9250508190555081600860008760010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613cdf9190615079565b925050819055508284613cf291906157aa565b60046000876000015481526020019081526020016000206000828254613d189190615079565b925050819055505b6000613de0600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16634497f4f56040518163ffffffff1660e01b8152600401602060405180830381865afa158015613d92573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613db69190614d41565b8760010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661059a565b9050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16634497f4f56040518163ffffffff1660e01b8152600401602060405180830381865afa158015613e4f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e739190614d41565b73ffffffffffffffffffffffffffffffffffffffff1663e30443bc8760010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836040518363ffffffff1660e01b8152600401613ed1929190615c4f565b600060405180830381600087803b158015613eeb57600080fd5b505af1158015613eff573d6000803e3d6000fd5b50505050505050505050565b80156140d85783600660008760010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613f8491906157aa565b9250508190555082600760008760010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613ffe91906157aa565b925050819055508185600501600082825461401991906157aa565b9250508190555081600960008760010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461409391906157aa565b9250508190555082846140a691906157aa565b600460008760000154815260200190815260200160002060008282546140cc91906157aa565b9250508190555061429b565b83600660008760010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461414b9190615079565b9250508190555082600760008760010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546141c59190615079565b92505081905550818560050160008282546141e09190615079565b9250508190555081600960008760010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461425a9190615079565b92505081905550828461426d91906157aa565b600460008760000154815260200190815260200160002060008282546142939190615079565b925050819055505b600061435b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bd2eeab46040518163ffffffff1660e01b8152600401602060405180830381865afa15801561430d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906143319190614d41565b8760010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661059a565b9050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bd2eeab46040518163ffffffff1660e01b8152600401602060405180830381865afa1580156143ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906143ee9190614d41565b73ffffffffffffffffffffffffffffffffffffffff1663e30443bc8760010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836040518363ffffffff1660e01b815260040161444c929190615c4f565b600060405180830381600087803b15801561446657600080fd5b505af115801561447a573d6000803e3d6000fd5b50505050505050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b6145718161455e565b811461457c57600080fd5b50565b60008135905061458e81614568565b92915050565b6000602082840312156145aa576145a9614554565b5b60006145b88482850161457f565b91505092915050565b6145ca8161455e565b82525050565b60006020820190506145e560008301846145c1565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000614616826145eb565b9050919050565b6146268161460b565b811461463157600080fd5b50565b6000813590506146438161461d565b92915050565b600080604083850312156146605761465f614554565b5b600061466e85828601614634565b925050602061467f85828601614634565b9150509250929050565b60008115159050919050565b61469e81614689565b82525050565b60006020820190506146b96000830184614695565b92915050565b6000806000606084860312156146d8576146d7614554565b5b60006146e68682870161457f565b93505060206146f78682870161457f565b92505060406147088682870161457f565b9150509250925092565b61471b81614689565b811461472657600080fd5b50565b60008135905061473881614712565b92915050565b60006020828403121561475457614753614554565b5b600061476284828501614729565b91505092915050565b60008060006060848603121561478457614783614554565b5b60006147928682870161457f565b93505060206147a38682870161457f565b92505060406147b486828701614634565b9150509250925092565b600080604083850312156147d5576147d4614554565b5b60006147e38582860161457f565b92505060206147f48582860161457f565b9150509250929050565b6000806040838503121561481557614814614554565b5b600061482385828601614634565b92505060206148348582860161457f565b9150509250929050565b6148478161460b565b82525050565b600060c08201905061486260008301896145c1565b61486f602083018861483e565b61487c60408301876145c1565b61488960608301866145c1565b61489660808301856145c1565b6148a360a08301846145c1565b979650505050505050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6148fc826148b3565b810181811067ffffffffffffffff8211171561491b5761491a6148c4565b5b80604052505050565b600061492e61454a565b905061493a82826148f3565b919050565b600067ffffffffffffffff82111561495a576149596148c4565b5b602082029050602081019050919050565b600080fd5b600061498361497e8461493f565b614924565b905080838252602082019050602084028301858111156149a6576149a561496b565b5b835b818110156149cf57806149bb888261457f565b8452602084019350506020810190506149a8565b5050509392505050565b600082601f8301126149ee576149ed6148ae565b5b81356149fe848260208601614970565b91505092915050565b60008060408385031215614a1e57614a1d614554565b5b6000614a2c85828601614634565b925050602083013567ffffffffffffffff811115614a4d57614a4c614559565b5b614a59858286016149d9565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b614a988161455e565b82525050565b6000614aaa8383614a8f565b60208301905092915050565b6000602082019050919050565b6000614ace82614a63565b614ad88185614a6e565b9350614ae383614a7f565b8060005b83811015614b14578151614afb8882614a9e565b9750614b0683614ab6565b925050600181019050614ae7565b5085935050505092915050565b60006020820190508181036000830152614b3b8184614ac3565b905092915050565b600060208284031215614b5957614b58614554565b5b6000614b6784828501614634565b91505092915050565b60008060008060808587031215614b8a57614b89614554565b5b6000614b9887828801614729565b9450506020614ba98782880161457f565b9350506040614bba8782880161457f565b9250506060614bcb87828801614729565b91505092959194509250565b6000602082019050614bec600083018461483e565b92915050565b6000608082019050614c076000830187614695565b614c1460208301866145c1565b614c2160408301856145c1565b614c2e6060830184614695565b95945050505050565b60008060408385031215614c4e57614c4d614554565b5b6000614c5c85828601614729565b9250506020614c6d8582860161457f565b9150509250929050565b6000819050919050565b6000614c9c614c97614c92846145eb565b614c77565b6145eb565b9050919050565b6000614cae82614c81565b9050919050565b6000614cc082614ca3565b9050919050565b614cd081614cb5565b82525050565b6000602082019050614ceb6000830184614cc7565b92915050565b6000614cfc826145eb565b9050919050565b6000614d0e82614cf1565b9050919050565b614d1e81614d03565b8114614d2957600080fd5b50565b600081519050614d3b81614d15565b92915050565b600060208284031215614d5757614d56614554565b5b6000614d6584828501614d2c565b91505092915050565b600081519050614d7d81614568565b92915050565b600060208284031215614d9957614d98614554565b5b6000614da784828501614d6e565b91505092915050565b600082825260208201905092915050565b7f6e6f7420656e61626c6564000000000000000000000000000000000000000000600082015250565b6000614df7600b83614db0565b9150614e0282614dc1565b602082019050919050565b60006020820190508181036000830152614e2681614dea565b9050919050565b7f416c7265616479207a617070696e670000000000000000000000000000000000600082015250565b6000614e63600f83614db0565b9150614e6e82614e2d565b602082019050919050565b60006020820190508181036000830152614e9281614e56565b9050919050565b7f4e6f206d6f6e65792073656e7400000000000000000000000000000000000000600082015250565b6000614ecf600d83614db0565b9150614eda82614e99565b602082019050919050565b60006020820190508181036000830152614efe81614ec2565b9050919050565b7f496e76616c6964207374616b6520747970650000000000000000000000000000600082015250565b6000614f3b601283614db0565b9150614f4682614f05565b602082019050919050565b60006020820190508181036000830152614f6a81614f2e565b9050919050565b6000606082019050614f86600083018661483e565b614f93602083018561483e565b614fa060408301846145c1565b949350505050565b600081519050614fb781614712565b92915050565b600060208284031215614fd357614fd2614554565b5b6000614fe184828501614fa8565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006150538261455e565b915061505e8361455e565b92508261506e5761506d614fea565b5b828204905092915050565b60006150848261455e565b915061508f8361455e565b92508282039050818111156150a7576150a6615019565b5b92915050565b60006150b88261460b565b9050919050565b6150c8816150ad565b81146150d357600080fd5b50565b6000815190506150e5816150bf565b92915050565b60006020828403121561510157615100614554565b5b600061510f848285016150d6565b91505092915050565b60006151238261460b565b9050919050565b61513381615118565b811461513e57600080fd5b50565b6000815190506151508161512a565b92915050565b60006020828403121561516c5761516b614554565b5b600061517a84828501615141565b91505092915050565b6000604082019050615198600083018561483e565b6151a560208301846145c1565b9392505050565b6000819050919050565b60006151d16151cc6151c7846151ac565b614c77565b61455e565b9050919050565b6151e1816151b6565b82525050565b600060c0820190506151fc600083018961483e565b61520960208301886145c1565b61521660408301876151d8565b61522360608301866151d8565b615230608083018561483e565b61523d60a08301846145c1565b979650505050505050565b60008060006060848603121561526157615260614554565b5b600061526f86828701614d6e565b935050602061528086828701614d6e565b925050604061529186828701614d6e565b9150509250925092565b60006152a68261455e565b91506152b18361455e565b92508282026152bf8161455e565b915082820484148315176152d6576152d5615019565b5b5092915050565b7f496e76616c69642062616c616e63650000000000000000000000000000000000600082015250565b6000615313600f83614db0565b915061531e826152dd565b602082019050919050565b6000602082019050818103600083015261534281615306565b9050919050565b7f496e76616c696420746f6b656e416d6f756e7400000000000000000000000000600082015250565b600061537f601383614db0565b915061538a82615349565b602082019050919050565b600060208201905081810360008301526153ae81615372565b9050919050565b600081905092915050565b50565b60006153d06000836153b5565b91506153db826153c0565b600082019050919050565b60006153f1826153c3565b9150819050919050565b7f4572726f722073656e64696e6700000000000000000000000000000000000000600082015250565b6000615431600d83614db0565b915061543c826153fb565b602082019050919050565b6000602082019050818103600083015261546081615424565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061549d602083614db0565b91506154a882615467565b602082019050919050565b600060208201905081810360008301526154cc81615490565b9050919050565b7f4f6e6c7920746f6b656e2063616e2063616c6c20746869730000000000000000600082015250565b6000615509601883614db0565b9150615514826154d3565b602082019050919050565b60006020820190508181036000830152615538816154fc565b9050919050565b7f55736520706572666f726d5a617020746f207374616b65206c6971756964697460008201527f7900000000000000000000000000000000000000000000000000000000000000602082015250565b600061559b602183614db0565b91506155a68261553f565b604082019050919050565b600060208201905081810360008301526155ca8161558e565b9050919050565b7f496e76616c6964206d756c7469706c6965720000000000000000000000000000600082015250565b6000615607601283614db0565b9150615612826155d1565b602082019050919050565b60006020820190508181036000830152615636816155fa565b9050919050565b7f496e76616c6964207374616b6500000000000000000000000000000000000000600082015250565b6000615673600d83614db0565b915061567e8261563d565b602082019050919050565b600060208201905081810360008301526156a281615666565b9050919050565b7f5374616b65206973206e6f74206f766572000000000000000000000000000000600082015250565b60006156df601183614db0565b91506156ea826156a9565b602082019050919050565b6000602082019050818103600083015261570e816156d2565b9050919050565b7f496e76616c696420616d6f756e74000000000000000000000000000000000000600082015250565b600061574b600e83614db0565b915061575682615715565b602082019050919050565b6000602082019050818103600083015261577a8161573e565b9050919050565b600060408201905061579660008301856145c1565b6157a36020830184614695565b9392505050565b60006157b58261455e565b91506157c08361455e565b92508282019050808211156157d8576157d7615019565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006158188261455e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361584a57615849615019565b5b600182019050919050565b7f416c726561647920616464656400000000000000000000000000000000000000600082015250565b600061588b600d83614db0565b915061589682615855565b602082019050919050565b600060208201905081810360008301526158ba8161587e565b9050919050565b7f496e76616c6964206475726174696f6e00000000000000000000000000000000600082015250565b60006158f7601083614db0565b9150615902826158c1565b602082019050919050565b60006020820190508181036000830152615926816158ea565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000615989602683614db0565b91506159948261592d565b604082019050919050565b600060208201905081810360008301526159b88161597c565b9050919050565b6000815190506159ce8161461d565b92915050565b6000602082840312156159ea576159e9614554565b5b60006159f8848285016159bf565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b615a368161460b565b82525050565b6000615a488383615a2d565b60208301905092915050565b6000602082019050919050565b6000615a6c82615a01565b615a768185615a0c565b9350615a8183615a1d565b8060005b83811015615ab2578151615a998882615a3c565b9750615aa483615a54565b925050600181019050615a85565b5085935050505092915050565b6000608082019050615ad460008301876145c1565b8181036020830152615ae68186615a61565b9050615af5604083018561483e565b615b0260608301846145c1565b95945050505050565b7f7374616b6564546f6b656e73206d7573742062652073616d6520617320616d6f60008201527f756e740000000000000000000000000000000000000000000000000000000000602082015250565b6000615b67602383614db0565b9150615b7282615b0b565b604082019050919050565b60006020820190508181036000830152615b9681615b5a565b9050919050565b7f496e73756666696369656e742062616c616e6365000000000000000000000000600082015250565b6000615bd3601483614db0565b9150615bde82615b9d565b602082019050919050565b60006020820190508181036000830152615c0281615bc6565b9050919050565b6000606082019050615c1e60008301866145c1565b615c2b6020830185614695565b615c386040830184614695565b949350505050565b615c4981614cf1565b82525050565b6000604082019050615c646000830185615c40565b615c7160208301846145c1565b939250505056fea26469706673582212206143fea098d1e98a79d81fae92f6a2b8e16b8d0240f4fa0c0105abf3ec79656264736f6c6343000811003360a0604052662386f26fc100006080908152503480156200001f57600080fd5b5060405162005095380380620050958339818101604052810190620000459190620003ea565b838483828281600390816200005b9190620006c6565b5080600490816200006d9190620006c6565b505050600033905080600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35080600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505082600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555068017c369ed02704c000600f8190555050505050620007ad565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200025b8262000210565b810181811067ffffffffffffffff821117156200027d576200027c62000221565b5b80604052505050565b600062000292620001f2565b9050620002a0828262000250565b919050565b600067ffffffffffffffff821115620002c357620002c262000221565b5b620002ce8262000210565b9050602081019050919050565b60005b83811015620002fb578082015181840152602081019050620002de565b60008484015250505050565b60006200031e6200031884620002a5565b62000286565b9050828152602081018484840111156200033d576200033c6200020b565b5b6200034a848285620002db565b509392505050565b600082601f8301126200036a576200036962000206565b5b81516200037c84826020860162000307565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620003b28262000385565b9050919050565b620003c481620003a5565b8114620003d057600080fd5b50565b600081519050620003e481620003b9565b92915050565b60008060008060808587031215620004075762000406620001fc565b5b600085015167ffffffffffffffff81111562000428576200042762000201565b5b620004368782880162000352565b94505060206200044987828801620003d3565b93505060406200045c87828801620003d3565b92505060606200046f87828801620003d3565b91505092959194509250565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620004ce57607f821691505b602082108103620004e457620004e362000486565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026200054e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200050f565b6200055a86836200050f565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620005a7620005a16200059b8462000572565b6200057c565b62000572565b9050919050565b6000819050919050565b620005c38362000586565b620005db620005d282620005ae565b8484546200051c565b825550505050565b600090565b620005f2620005e3565b620005ff818484620005b8565b505050565b5b8181101562000627576200061b600082620005e8565b60018101905062000605565b5050565b601f82111562000676576200064081620004ea565b6200064b84620004ff565b810160208510156200065b578190505b620006736200066a85620004ff565b83018262000604565b50505b505050565b600082821c905092915050565b60006200069b600019846008026200067b565b1980831691505092915050565b6000620006b6838362000688565b9150826002028217905092915050565b620006d1826200047b565b67ffffffffffffffff811115620006ed57620006ec62000221565b5b620006f98254620004b5565b620007068282856200062b565b600060209050601f8311600181146200073e576000841562000729578287015190505b620007358582620006a8565b865550620007a5565b601f1984166200074e86620004ea565b60005b82811015620007785784890151825560018201915060208501945060208101905062000751565b8683101562000798578489015162000794601f89168262000688565b8355505b6001600288020188555050505b505050505050565b6080516148be620007d760003960008181611ace01528181611f77015261268e01526148be6000f3fe60806040526004361061021e5760003560e01c806385a6b3ae11610123578063be10b614116100ab578063e7841ec01161006f578063e7841ec014610912578063f2fde38b1461093d578063f7c618c114610966578063fa1c7fbe14610991578063ffb2c479146109bc576102bf565b8063be10b61414610807578063c7e772ed14610832578063dd62ed3e1461086f578063deb906e7146108ac578063e30443bc146108e9576102bf565b8063a457c2d7116100f2578063a457c2d7146106ea578063a8b9d24014610727578063a9059cbb14610764578063a9ed31b6146107a1578063aafd847a146107ca576102bf565b806385a6b3ae1461062c5780638da5cb5b1461065757806391b89fba1461068257806395d89b41146106bf576102bf565b806331e79db0116101a657806370a082311161017557806370a082311461055b578063715018a614610598578063743e0c9b146105af57806377067d95146105d857806378e9792514610601576102bf565b806331e79db01461048f57806339509351146104b85780634adef718146104f55780634e7b827f1461051e576102bf565b806323b3a517116101ed57806323b3a5171461038257806323b872dd146103bf57806327ce0147146103fc5780633009a60914610439578063313ce56714610464576102bf565b806306fdde03146102c4578063095ea7b3146102ef57806309bbedde1461032c57806318160ddd14610357576102bf565b366102bf57600073ffffffffffffffffffffffffffffffffffffffff16600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146102b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102ab906135ef565b60405180910390fd5b6102bd346109fb565b005b600080fd5b3480156102d057600080fd5b506102d9610b2e565b6040516102e6919061368e565b60405180910390f35b3480156102fb57600080fd5b5061031660048036038101906103119190613749565b610bc0565b60405161032391906137a4565b60405180910390f35b34801561033857600080fd5b50610341610bdc565b60405161034e91906137ce565b60405180910390f35b34801561036357600080fd5b5061036c610bec565b60405161037991906137ce565b60405180910390f35b34801561038e57600080fd5b506103a960048036038101906103a491906137e9565b610bf6565b6040516103b691906138d4565b60405180910390f35b3480156103cb57600080fd5b506103e660048036038101906103e191906138f6565b610d5d565b6040516103f391906137a4565b60405180910390f35b34801561040857600080fd5b50610423600480360381019061041e9190613949565b610d85565b60405161043091906137ce565b60405180910390f35b34801561044557600080fd5b5061044e610e28565b60405161045b91906137ce565b60405180910390f35b34801561047057600080fd5b50610479610e2e565b6040516104869190613992565b60405180910390f35b34801561049b57600080fd5b506104b660048036038101906104b19190613949565b610e37565b005b3480156104c457600080fd5b506104df60048036038101906104da9190613749565b611012565b6040516104ec91906137a4565b60405180910390f35b34801561050157600080fd5b5061051c600480360381019061051791906137e9565b611042565b005b34801561052a57600080fd5b5061054560048036038101906105409190613949565b61114a565b60405161055291906137a4565b60405180910390f35b34801561056757600080fd5b50610582600480360381019061057d9190613949565b61116a565b60405161058f91906137ce565b60405180910390f35b3480156105a457600080fd5b506105ad6111b2565b005b3480156105bb57600080fd5b506105d660048036038101906105d191906137e9565b611303565b005b3480156105e457600080fd5b506105ff60048036038101906105fa91906139ad565b61158d565b005b34801561060d57600080fd5b50610616611778565b60405161062391906137ce565b60405180910390f35b34801561063857600080fd5b5061064161177e565b60405161064e91906137ce565b60405180910390f35b34801561066357600080fd5b5061066c611784565b60405161067991906139fc565b60405180910390f35b34801561068e57600080fd5b506106a960048036038101906106a49190613949565b6117ae565b6040516106b691906137ce565b60405180910390f35b3480156106cb57600080fd5b506106d46117c0565b6040516106e1919061368e565b60405180910390f35b3480156106f657600080fd5b50610711600480360381019061070c9190613749565b611852565b60405161071e91906137a4565b60405180910390f35b34801561073357600080fd5b5061074e60048036038101906107499190613949565b6118c2565b60405161075b91906137ce565b60405180910390f35b34801561077057600080fd5b5061078b60048036038101906107869190613749565b611925565b60405161079891906137a4565b60405180910390f35b3480156107ad57600080fd5b506107c860048036038101906107c39190613949565b611941565b005b3480156107d657600080fd5b506107f160048036038101906107ec9190613949565b611a83565b6040516107fe91906137ce565b60405180910390f35b34801561081357600080fd5b5061081c611acc565b60405161082991906137ce565b60405180910390f35b34801561083e57600080fd5b5061085960048036038101906108549190613949565b611af0565b60405161086691906137a4565b60405180910390f35b34801561087b57600080fd5b50610896600480360381019061089191906139ad565b611baf565b6040516108a391906137ce565b60405180910390f35b3480156108b857600080fd5b506108d360048036038101906108ce9190613949565b611c36565b6040516108e091906138d4565b60405180910390f35b3480156108f557600080fd5b50610910600480360381019061090b9190613a55565b611e57565b005b34801561091e57600080fd5b506109276120b4565b60405161093491906137ce565b60405180910390f35b34801561094957600080fd5b50610964600480360381019061095f9190613949565b6120be565b005b34801561097257600080fd5b5061097b6121c9565b6040516109889190613af4565b60405180910390f35b34801561099d57600080fd5b506109a66121ef565b6040516109b391906137ce565b60405180910390f35b3480156109c857600080fd5b506109e360048036038101906109de91906137e9565b61232e565b6040516109f293929190613b0f565b60405180910390f35b6000610a05610bec565b11610a0f57600080fd5b6000811115610b2b57610a62610a23610bec565b610a47700100000000000000000000000000000000846127e490919063ffffffff16565b610a519190613ba4565b60075461285e90919063ffffffff16565b6007819055503373ffffffffffffffffffffffffffffffffffffffff167fa493a9229478c3fcd73f66d2cdeb7f94fd0f341da924d1054236d7845411651182604051610aae91906137ce565b60405180910390a2610acb81600a5461285e90919063ffffffff16565b600a81905550610b0581600b60006201518042610ae89190613ba4565b81526020019081526020016000205461285e90919063ffffffff16565b600b60006201518042610b189190613ba4565b8152602001908152602001600020819055505b50565b606060038054610b3d90613c04565b80601f0160208091040260200160405190810160405280929190818152602001828054610b6990613c04565b8015610bb65780601f10610b8b57610100808354040283529160200191610bb6565b820191906000526020600020905b815481529060010190602001808311610b9957829003601f168201915b5050505050905090565b600080339050610bd18185856128bc565b600191505092915050565b6000601160000180549050905090565b6000600254905090565b6060601173b29b1b20aa0b51ab73770a87cbf43ffc6bba84b163deb3d89690916040518263ffffffff1660e01b8152600401610c329190613c3c565b602060405180830381865af4158015610c4f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c739190613c6c565b8210610cca57600567ffffffffffffffff811115610c9457610c93613c99565b5b604051908082528060200260200182016040528015610cc25781602001602082028036833780820191505090505b509050610d58565b6000601173b29b1b20aa0b51ab73770a87cbf43ffc6bba84b163d1aa9e7e9091856040518363ffffffff1660e01b8152600401610d08929190613cd7565b602060405180830381865af4158015610d25573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d499190613d15565b9050610d5481611c36565b9150505b919050565b600080339050610d6e858285612a85565b610d79858585612b11565b60019150509392505050565b6000700100000000000000000000000000000000610e17610e12600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610e04610dff610dee8861116a565b6007546127e490919063ffffffff16565b612b21565b612b3e90919063ffffffff16565b612b89565b610e219190613ba4565b9050919050565b60155481565b60006012905090565b3373ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610ec7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ebe90613d8e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16031561100f576001601760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550610f5f816000612ba0565b601173b29b1b20aa0b51ab73770a87cbf43ffc6bba84b1634c60db9c9091836040518363ffffffff1660e01b8152600401610f9b929190613dbd565b60006040518083038186803b158015610fb357600080fd5b505af4158015610fc7573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff167fa878b31040b2e6d0a9a3d3361209db3908ba62014b0dca52adbaee451d128b2560405160405180910390a25b50565b6000803390506110378185856110288589611baf565b6110329190613de6565b6128bc565b600191505092915050565b3373ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156110c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110ea9190613d15565b73ffffffffffffffffffffffffffffffffffffffff1614611140576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113790613e66565b60405180910390fd5b80600f8190555050565b60176020528060005260406000206000915054906101000a900460ff1681565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b3373ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611242576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123990613d8e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b600073ffffffffffffffffffffffffffffffffffffffff16600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611394576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138b90613ed2565b60405180910390fd5b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016113f191906139fc565b602060405180830381865afa15801561140e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114329190613c6c565b9050600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330856040518463ffffffff1660e01b815260040161149393929190613ef2565b6020604051808303816000875af11580156114b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114d69190613f55565b5080600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161153391906139fc565b602060405180830381865afa158015611550573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115749190613c6c565b61157e9190613f82565b9150611589826109fb565b5050565b3373ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461161d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161490613d8e565b60405180910390fd5b6000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630e8de47330856040518363ffffffff1660e01b815260040161167c929190613fb6565b602060405180830381865afa158015611699573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116bd9190613c6c565b90506116c98382611e57565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630e8de47330846040518363ffffffff1660e01b8152600401611726929190613fb6565b602060405180830381865afa158015611743573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117679190613c6c565b90506117738282611e57565b505050565b60165481565b600a5481565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60006117b9826118c2565b9050919050565b6060600480546117cf90613c04565b80601f01602080910402602001604051908101604052809291908181526020018280546117fb90613c04565b80156118485780601f1061181d57610100808354040283529160200191611848565b820191906000526020600020905b81548152906001019060200180831161182b57829003601f168201915b5050505050905090565b60008033905060006118648286611baf565b9050838110156118a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a09061402b565b60405180910390fd5b6118b682868684036128bc565b60019250505092915050565b600061191e600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461191084610d85565b612c0d90919063ffffffff16565b9050919050565b600080339050611936818585612b11565b600191505092915050565b3373ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156119c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119e99190613d15565b73ffffffffffffffffffffffffffffffffffffffff1614611a3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3690613e66565b60405180910390fd5b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000611afa611784565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611b5e57508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611b9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9490614097565b60405180910390fd5b611ba8826000612c57565b9050919050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6060600e67ffffffffffffffff811115611c5357611c52613c99565b5b604051908082528060200260200182016040528015611c815781602001602082028036833780820191505090505b5090506000611c8f8361116a565b90508082600081518110611ca657611ca56140b7565b5b6020026020010181815250506000611cbc610bec565b905060008111611ccd576000611ce8565b80620f424083611cdd91906140e6565b611ce79190613ba4565b5b83600181518110611cfc57611cfb6140b7565b5b6020026020010181815250508083600281518110611d1d57611d1c6140b7565b5b6020026020010181815250506000611d34856118c2565b90506000611d4186610d85565b90508185600381518110611d5857611d576140b7565b5b6020026020010181815250508085600481518110611d7957611d786140b7565b5b602002602001018181525050600a5485600581518110611d9c57611d9b6140b7565b5b602002602001018181525050611db06121ef565b85600681518110611dc457611dc36140b7565b5b60200260200101818152505060006201518042611de19190613ba4565b905060005b6007811015611e4c57600b60008284611dff9190613f82565b81526020019081526020016000205487826007611e1c9190613de6565b81518110611e2d57611e2c6140b7565b5b6020026020010181815250508080611e4490614128565b915050611de6565b505050505050919050565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611ee55750611eb6611784565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611f24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1b906141bc565b60405180910390fd5b601760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166120b0577f0000000000000000000000000000000000000000000000000000000000000000811061202b57600060165403611fae57426016819055505b611fb88282612ba0565b601173b29b1b20aa0b51ab73770a87cbf43ffc6bba84b163bc2b405c909184846040518463ffffffff1660e01b8152600401611ff6939291906141fd565b60006040518083038186803b15801561200e57600080fd5b505af4158015612022573d6000803e3d6000fd5b505050506120a3565b612036826000612ba0565b601173b29b1b20aa0b51ab73770a87cbf43ffc6bba84b1634c60db9c9091846040518363ffffffff1660e01b8152600401612072929190614234565b60006040518083038186803b15801561208a57600080fd5b505af415801561209e573d6000803e3d6000fd5b505050505b6120ae826000612c57565b505b5050565b6000601554905090565b3373ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461214e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161214590613d8e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036121bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121b4906142cf565b60405180910390fd5b6121c681612f8c565b50565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060165403612203576000905061232b565b6000601654426122139190613f82565b90506000810361222757600091505061232b565b600062093a80905080821015612259578181600a5461224691906140e6565b6122509190613ba4565b9250505061232b565b6000620151804261226a9190613ba4565b90506000805b600781101561232257600081036122e2576000600b600085815260200190815260200160002054905062015180846122a891906140e6565b426122b39190613f82565b95508562015180826122c591906140e6565b6122cf9190613ba4565b836122da9190613de6565b92505061230f565b600b600082856122f29190613f82565b8152602001908152602001600020548261230c9190613de6565b91505b808061231a90614128565b915050612270565b50809450505050505b90565b60008060008060116000018054905090506000810361235957600080601554935093509350506127dd565b600073ffffffffffffffffffffffffffffffffffffffff16600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461249e576000601054036123c157426010819055505b6000601054426123d19190613f82565b9050610258811061249c5760006201518082600f546123f091906140e6565b6123fa9190613ba4565b9050600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166310c5b32882306040518363ffffffff1660e01b81526004016124599291906142ef565b600060405180830381600087803b15801561247357600080fd5b505af1925050508015612484575060015b1561249357612492816109fb565b5b42601081905550505b505b600060155490506000805a90506000805b89841080156124bd57508582105b156127c45784806124cd90614128565b95505060116000018054905085106124e457600094505b6000601160000186815481106124fd576124fc6140b7565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905061253381613052565b1561255c57612543816001612c57565b1561255757818061255390614128565b9250505b6125ea565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633eb57b31826040518263ffffffff1660e01b81526004016125b791906139fc565b600060405180830381600087803b1580156125d157600080fd5b505af11580156125e5573d6000803e3d6000fd5b505050505b6000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630e8de47330846040518363ffffffff1660e01b8152600401612649929190613fb6565b602060405180830381865afa158015612666573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061268a9190613c6c565b90507f000000000000000000000000000000000000000000000000000000000000000081106126c2576126bd8282612ba0565b612784565b6126cd826000612ba0565b601173b29b1b20aa0b51ab73770a87cbf43ffc6bba84b1634c60db9c9091846040518363ffffffff1660e01b8152600401612709929190613dbd565b60006040518083038186803b15801561272157600080fd5b505af4158015612735573d6000803e3d6000fd5b505050506000601160000180549050036127505750506127c4565b6000870361277457600160116000018054905061276d9190613f82565b9650612783565b868061277f90614318565b9750505b5b838061278f90614128565b94505060005a9050808611156127b95780866127ab9190613f82565b876127b69190613de6565b96505b8095505050506124af565b8460158190555081816015549850985098505050505050505b9193909250565b60008083036127f65760009050612858565b6000828461280491906140e6565b90508284826128139190613ba4565b14612853576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161284a906143b3565b60405180910390fd5b809150505b92915050565b600080828461286d9190613de6565b9050838110156128b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128a99061441f565b60405180910390fd5b8091505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361292b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612922906144b1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361299a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161299190614543565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051612a7891906137ce565b60405180910390a3505050565b6000612a918484611baf565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114612b0b5781811015612afd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612af4906145af565b60405180910390fd5b612b0a84848484036128bc565b5b50505050565b6000612b1c57600080fd5b505050565b6000808290506000811215612b3557600080fd5b80915050919050565b6000808284612b4d91906145d9565b905060008312158015612b605750838112155b80612b765750600083128015612b7557508381125b5b612b7f57600080fd5b8091505092915050565b600080821215612b9857600080fd5b819050919050565b6000612bab8361116a565b905080821115612bdc576000612bca8284612c0d90919063ffffffff16565b9050612bd68482613072565b50612c08565b80821015612c07576000612bf98383612c0d90919063ffffffff16565b9050612c058482613131565b505b5b505050565b6000612c4f83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506131f0565b905092915050565b600080612c63846118c2565b9050600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633eb57b31856040518263ffffffff1660e01b8152600401612cc091906139fc565b600060405180830381600087803b158015612cda57600080fd5b505af1158015612cee573d6000803e3d6000fd5b505050506000811115612f805780600960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612d4a9190613de6565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff16600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603612e845760008473ffffffffffffffffffffffffffffffffffffffff1682610fa090604051612dd19061464e565b600060405180830381858888f193505050503d8060008114612e0f576040519150601f19603f3d011682016040523d82523d6000602084013e612e14565b606091505b5050905080612e7e5781600960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612e6c9190613f82565b92505081905550600092505050612f86565b50612f26565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb85836040518363ffffffff1660e01b8152600401612ee1929190614663565b6020604051808303816000875af1158015612f00573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f249190613f55565b505b8373ffffffffffffffffffffffffffffffffffffffff167f4483f0f5722e808851ec73e28bf37d50b6a3c4d7bde2d122089560c0f988b6248285604051612f6e92919061468c565b60405180910390a26001915050612f86565b60009150505b92915050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008061305e836118c2565b90506509184e72a000811015915050919050565b61307c8282613254565b6130ea61309c613097836007546127e490919063ffffffff16565b612b21565b600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461339290919063ffffffff16565b600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b61313b82826133dd565b6131a961315b613156836007546127e490919063ffffffff16565b612b21565b600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612b3e90919063ffffffff16565b600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b6000838311158290613238576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161322f919061368e565b60405180910390fd5b50600083856132479190613f82565b9050809150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036132c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132ba90614701565b60405180910390fd5b80600260008282546132d59190613de6565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161338691906137ce565b60405180910390a35050565b60008082846133a19190614721565b9050600083121580156133b45750838113155b806133ca57506000831280156133c957508381135b5b6133d357600080fd5b8091505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361344c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613443906147d6565b60405180910390fd5b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156134d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134c990614868565b60405180910390fd5b8181036000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600260008282540392505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161358591906137ce565b60405180910390a3505050565b600082825260208201905092915050565b7f43616c6c2072656365697665546f6b656e7320696e7374656164000000000000600082015250565b60006135d9601a83613592565b91506135e4826135a3565b602082019050919050565b60006020820190508181036000830152613608816135cc565b9050919050565b600081519050919050565b60005b8381101561363857808201518184015260208101905061361d565b60008484015250505050565b6000601f19601f8301169050919050565b60006136608261360f565b61366a8185613592565b935061367a81856020860161361a565b61368381613644565b840191505092915050565b600060208201905081810360008301526136a88184613655565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006136e0826136b5565b9050919050565b6136f0816136d5565b81146136fb57600080fd5b50565b60008135905061370d816136e7565b92915050565b6000819050919050565b61372681613713565b811461373157600080fd5b50565b6000813590506137438161371d565b92915050565b600080604083850312156137605761375f6136b0565b5b600061376e858286016136fe565b925050602061377f85828601613734565b9150509250929050565b60008115159050919050565b61379e81613789565b82525050565b60006020820190506137b96000830184613795565b92915050565b6137c881613713565b82525050565b60006020820190506137e360008301846137bf565b92915050565b6000602082840312156137ff576137fe6136b0565b5b600061380d84828501613734565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61384b81613713565b82525050565b600061385d8383613842565b60208301905092915050565b6000602082019050919050565b600061388182613816565b61388b8185613821565b935061389683613832565b8060005b838110156138c75781516138ae8882613851565b97506138b983613869565b92505060018101905061389a565b5085935050505092915050565b600060208201905081810360008301526138ee8184613876565b905092915050565b60008060006060848603121561390f5761390e6136b0565b5b600061391d868287016136fe565b935050602061392e868287016136fe565b925050604061393f86828701613734565b9150509250925092565b60006020828403121561395f5761395e6136b0565b5b600061396d848285016136fe565b91505092915050565b600060ff82169050919050565b61398c81613976565b82525050565b60006020820190506139a76000830184613983565b92915050565b600080604083850312156139c4576139c36136b0565b5b60006139d2858286016136fe565b92505060206139e3858286016136fe565b9150509250929050565b6139f6816136d5565b82525050565b6000602082019050613a1160008301846139ed565b92915050565b6000613a22826136b5565b9050919050565b613a3281613a17565b8114613a3d57600080fd5b50565b600081359050613a4f81613a29565b92915050565b60008060408385031215613a6c57613a6b6136b0565b5b6000613a7a85828601613a40565b9250506020613a8b85828601613734565b9150509250929050565b6000819050919050565b6000613aba613ab5613ab0846136b5565b613a95565b6136b5565b9050919050565b6000613acc82613a9f565b9050919050565b6000613ade82613ac1565b9050919050565b613aee81613ad3565b82525050565b6000602082019050613b096000830184613ae5565b92915050565b6000606082019050613b2460008301866137bf565b613b3160208301856137bf565b613b3e60408301846137bf565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613baf82613713565b9150613bba83613713565b925082613bca57613bc9613b46565b5b828204905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613c1c57607f821691505b602082108103613c2f57613c2e613bd5565b5b50919050565b8082525050565b6000602082019050613c516000830184613c35565b92915050565b600081519050613c668161371d565b92915050565b600060208284031215613c8257613c816136b0565b5b6000613c9084828501613c57565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613cd181613713565b82525050565b6000604082019050613cec6000830185613c35565b613cf96020830184613cc8565b9392505050565b600081519050613d0f816136e7565b92915050565b600060208284031215613d2b57613d2a6136b0565b5b6000613d3984828501613d00565b91505092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613d78602083613592565b9150613d8382613d42565b602082019050919050565b60006020820190508181036000830152613da781613d6b565b9050919050565b613db7816136d5565b82525050565b6000604082019050613dd26000830185613c35565b613ddf6020830184613dae565b9392505050565b6000613df182613713565b9150613dfc83613713565b9250828201905080821115613e1457613e13613b75565b5b92915050565b7f6f6e6c79546f6b656e4f776e6572000000000000000000000000000000000000600082015250565b6000613e50600e83613592565b9150613e5b82613e1a565b602082019050919050565b60006020820190508181036000830152613e7f81613e43565b9050919050565b7f53656e642045544820696e737465616400000000000000000000000000000000600082015250565b6000613ebc601083613592565b9150613ec782613e86565b602082019050919050565b60006020820190508181036000830152613eeb81613eaf565b9050919050565b6000606082019050613f0760008301866139ed565b613f1460208301856139ed565b613f2160408301846137bf565b949350505050565b613f3281613789565b8114613f3d57600080fd5b50565b600081519050613f4f81613f29565b92915050565b600060208284031215613f6b57613f6a6136b0565b5b6000613f7984828501613f40565b91505092915050565b6000613f8d82613713565b9150613f9883613713565b9250828203905081811115613fb057613faf613b75565b5b92915050565b6000604082019050613fcb60008301856139ed565b613fd860208301846139ed565b9392505050565b7f64656372656173656420616c6c6f77616e63652062656c6f77207a65726f0000600082015250565b6000614015601e83613592565b915061402082613fdf565b602082019050919050565b6000602082019050818103600083015261404481614008565b9050919050565b7f496e76616c6964206163636f756e740000000000000000000000000000000000600082015250565b6000614081600f83613592565b915061408c8261404b565b602082019050919050565b600060208201905081810360008301526140b081614074565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006140f182613713565b91506140fc83613713565b925082820261410a81613713565b9150828204841483151761412157614120613b75565b5b5092915050565b600061413382613713565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361416557614164613b75565b5b600182019050919050565b7f43616e6e6f742063616c6c000000000000000000000000000000000000000000600082015250565b60006141a6600b83613592565b91506141b182614170565b602082019050919050565b600060208201905081810360008301526141d581614199565b9050919050565b60006141e782613ac1565b9050919050565b6141f7816141dc565b82525050565b60006060820190506142126000830186613c35565b61421f60208301856141ee565b61422c6040830184613cc8565b949350505050565b60006040820190506142496000830185613c35565b61425660208301846141ee565b9392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006142b9602683613592565b91506142c48261425d565b604082019050919050565b600060208201905081810360008301526142e8816142ac565b9050919050565b600060408201905061430460008301856137bf565b61431160208301846139ed565b9392505050565b600061432382613713565b91506000820361433657614335613b75565b5b600182039050919050565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008201527f7700000000000000000000000000000000000000000000000000000000000000602082015250565b600061439d602183613592565b91506143a882614341565b604082019050919050565b600060208201905081810360008301526143cc81614390565b9050919050565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000600082015250565b6000614409601b83613592565b9150614414826143d3565b602082019050919050565b60006020820190508181036000830152614438816143fc565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061449b602483613592565b91506144a68261443f565b604082019050919050565b600060208201905081810360008301526144ca8161448e565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b600061452d602283613592565b9150614538826144d1565b604082019050919050565b6000602082019050818103600083015261455c81614520565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000614599601d83613592565b91506145a482614563565b602082019050919050565b600060208201905081810360008301526145c88161458c565b9050919050565b6000819050919050565b60006145e4826145cf565b91506145ef836145cf565b92508282019050828112156000831216838212600084121516171561461757614616613b75565b5b92915050565b600081905092915050565b50565b600061463860008361461d565b915061464382614628565b600082019050919050565b60006146598261462b565b9150819050919050565b600060408201905061467860008301856139ed565b61468560208301846137bf565b9392505050565b60006040820190506146a160008301856137bf565b6146ae6020830184613795565b9392505050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b60006146eb601f83613592565b91506146f6826146b5565b602082019050919050565b6000602082019050818103600083015261471a816146de565b9050919050565b600061472c826145cf565b9150614737836145cf565b925082820390508181126000841216828213600085121516171561475e5761475d613b75565b5b92915050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b60006147c0602183613592565b91506147cb82614764565b604082019050919050565b600060208201905081810360008301526147ef816147b3565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b6000614852602283613592565b915061485d826147f6565b604082019050919050565b6000602082019050818103600083015261488181614845565b905091905056fea26469706673582212200869706b666501ecc30307720693927b379b84ee3b00b87ecb008fa099c8776864736f6c6343000811003360806040523480156200001157600080fd5b506040516200156a3803806200156a8339818101604052810190620000379190620000fc565b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550506200012e565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620000b08262000083565b9050919050565b6000620000c482620000a3565b9050919050565b620000d681620000b7565b8114620000e257600080fd5b50565b600081519050620000f681620000cb565b92915050565b6000602082840312156200011557620001146200007e565b5b60006200012584828501620000e5565b91505092915050565b61142c806200013e6000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c80637934fd961461003b5780637b94377314610059575b600080fd5b610043610092565b6040516100509190610b69565b60405180910390f35b610073600480360381019061006e9190610d65565b6100b6565b6040516100899a99989796959493929190610e8e565b60405180910390f35b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606080606060008060008060008060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16634cf088d96040518163ffffffff1660e01b8152600401602060405180830381865afa158015610132573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101569190610f8f565b73ffffffffffffffffffffffffffffffffffffffff16637b9437738d8d6040518363ffffffff1660e01b8152600401610190929190610fcb565b600060405180830381865afa1580156101ad573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906101d691906110a7565b995060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16634497f4f56040518163ffffffff1660e01b8152600401602060405180830381865afa158015610243573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610267919061112e565b73ffffffffffffffffffffffffffffffffffffffff1663deb906e78d6040518263ffffffff1660e01b815260040161029f919061115b565b600060405180830381865afa1580156102bc573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906102e591906110a7565b985060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bd2eeab46040518163ffffffff1660e01b8152600401602060405180830381865afa158015610352573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610376919061112e565b73ffffffffffffffffffffffffffffffffffffffff1663deb906e78d6040518263ffffffff1660e01b81526004016103ae919061115b565b600060405180830381865afa1580156103cb573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906103f491906110a7565b975060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663983814bc8d6040518263ffffffff1660e01b815260040161044f919061115b565b602060405180830381865afa15801561046c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104909190611176565b965060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a082318d6040518263ffffffff1660e01b81526004016104eb919061115b565b602060405180830381865afa158015610508573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061052c9190611176565b95508b73ffffffffffffffffffffffffffffffffffffffff1631945060008073cb0e5bfa72bbb4d16ab5aa0c60601c438f04b4ad73ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa1580156105aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105ce9190611225565b506dffffffffffffffffffffffffffff1691506dffffffffffffffffffffffffffff1691508164e8d4a510008261060591906112a7565b61060f9190611318565b955060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a8aa1b316040518163ffffffff1660e01b8152600401602060405180830381865afa15801561067f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106a39190611387565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610ad85760008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a8aa1b316040518163ffffffff1660e01b8152600401602060405180830381865afa158015610744573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107689190611387565b73ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa1580156107b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107d69190611225565b826dffffffffffffffffffffffffffff169250816dffffffffffffffffffffffffffff16915050809350819450505060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a8aa1b316040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108cb9190611387565b73ffffffffffffffffffffffffffffffffffffffff16630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa158015610915573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061093991906113c9565b73ffffffffffffffffffffffffffffffffffffffff1603610961576000839050829350809250505b60008211156109885781633b9aca008461097b91906112a7565b6109859190611318565b95505b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a8aa1b316040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109f6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a1a9190611387565b73ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a889190611176565b90506000811115610ad65780670de0b6b3a764000084610aa891906112a7565b610ab29190611318565b955080670de0b6b3a764000085610ac991906112a7565b610ad39190611318565b94505b505b5050509295989b9194979a5092959850565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000610b2f610b2a610b2584610aea565b610b0a565b610aea565b9050919050565b6000610b4182610b14565b9050919050565b6000610b5382610b36565b9050919050565b610b6381610b48565b82525050565b6000602082019050610b7e6000830184610b5a565b92915050565b6000604051905090565b600080fd5b600080fd5b6000610ba382610aea565b9050919050565b610bb381610b98565b8114610bbe57600080fd5b50565b600081359050610bd081610baa565b92915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b610c2482610bdb565b810181811067ffffffffffffffff82111715610c4357610c42610bec565b5b80604052505050565b6000610c56610b84565b9050610c628282610c1b565b919050565b600067ffffffffffffffff821115610c8257610c81610bec565b5b602082029050602081019050919050565b600080fd5b6000819050919050565b610cab81610c98565b8114610cb657600080fd5b50565b600081359050610cc881610ca2565b92915050565b6000610ce1610cdc84610c67565b610c4c565b90508083825260208201905060208402830185811115610d0457610d03610c93565b5b835b81811015610d2d5780610d198882610cb9565b845260208401935050602081019050610d06565b5050509392505050565b600082601f830112610d4c57610d4b610bd6565b5b8135610d5c848260208601610cce565b91505092915050565b60008060408385031215610d7c57610d7b610b8e565b5b6000610d8a85828601610bc1565b925050602083013567ffffffffffffffff811115610dab57610daa610b93565b5b610db785828601610d37565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b610df681610c98565b82525050565b6000610e088383610ded565b60208301905092915050565b6000602082019050919050565b6000610e2c82610dc1565b610e368185610dcc565b9350610e4183610ddd565b8060005b83811015610e72578151610e598882610dfc565b9750610e6483610e14565b925050600181019050610e45565b5085935050505092915050565b610e8881610c98565b82525050565b6000610140820190508181036000830152610ea9818d610e21565b90508181036020830152610ebd818c610e21565b90508181036040830152610ed1818b610e21565b9050610ee0606083018a610e7f565b610eed6080830189610e7f565b610efa60a0830188610e7f565b610f0760c0830187610e7f565b610f1460e0830186610e7f565b610f22610100830185610e7f565b610f30610120830184610e7f565b9b9a5050505050505050505050565b6000610f4a82610aea565b9050919050565b6000610f5c82610f3f565b9050919050565b610f6c81610f51565b8114610f7757600080fd5b50565b600081519050610f8981610f63565b92915050565b600060208284031215610fa557610fa4610b8e565b5b6000610fb384828501610f7a565b91505092915050565b610fc581610b98565b82525050565b6000604082019050610fe06000830185610fbc565b8181036020830152610ff28184610e21565b90509392505050565b60008151905061100a81610ca2565b92915050565b600061102361101e84610c67565b610c4c565b9050808382526020820190506020840283018581111561104657611045610c93565b5b835b8181101561106f578061105b8882610ffb565b845260208401935050602081019050611048565b5050509392505050565b600082601f83011261108e5761108d610bd6565b5b815161109e848260208601611010565b91505092915050565b6000602082840312156110bd576110bc610b8e565b5b600082015167ffffffffffffffff8111156110db576110da610b93565b5b6110e784828501611079565b91505092915050565b60006110fb82610f3f565b9050919050565b61110b816110f0565b811461111657600080fd5b50565b60008151905061112881611102565b92915050565b60006020828403121561114457611143610b8e565b5b600061115284828501611119565b91505092915050565b60006020820190506111706000830184610fbc565b92915050565b60006020828403121561118c5761118b610b8e565b5b600061119a84828501610ffb565b91505092915050565b60006dffffffffffffffffffffffffffff82169050919050565b6111c6816111a3565b81146111d157600080fd5b50565b6000815190506111e3816111bd565b92915050565b600063ffffffff82169050919050565b611202816111e9565b811461120d57600080fd5b50565b60008151905061121f816111f9565b92915050565b60008060006060848603121561123e5761123d610b8e565b5b600061124c868287016111d4565b935050602061125d868287016111d4565b925050604061126e86828701611210565b9150509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006112b282610c98565b91506112bd83610c98565b92508282026112cb81610c98565b915082820484148315176112e2576112e1611278565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061132382610c98565b915061132e83610c98565b92508261133e5761133d6112e9565b5b828204905092915050565b600061135482610b98565b9050919050565b61136481611349565b811461136f57600080fd5b50565b6000815190506113818161135b565b92915050565b60006020828403121561139d5761139c610b8e565b5b60006113ab84828501611372565b91505092915050565b6000815190506113c381610baa565b92915050565b6000602082840312156113df576113de610b8e565b5b60006113ed848285016113b4565b9150509291505056fea264697066735822122099dd8c57bcf821a6d9340aedccb33a9d4e54dd080c25e0b7260be27b8b733ecb64736f6c63430008110033
Deployed Bytecode
0x6080604052600436106101fd5760003560e01c80637b9437731161010d578063a9059cbb116100a0578063c9567bf91161006f578063c9567bf914610733578063cec534d61461074a578063dd62ed3e14610773578063f2fde38b146107b0578063f887ea40146107d957610204565b8063a9059cbb1461068b578063a94c3ab0146106c8578063b9ccf21d146106f1578063bd2eeab41461070857610204565b8063983814bc116100dc578063983814bc146105bd578063a345f38d146105fa578063a457c2d714610623578063a8aa1b311461066057610204565b80637b943773146104f8578063871c128d1461053e5780638da5cb5b1461056757806395d89b411461059257610204565b806335e27479116101905780634cf088d91161015f5780634cf088d9146104395780634e71d92d1461046457806353674ba61461047b57806370a08231146104a4578063715018a6146104e157610204565b806335e274791461037f57806339509351146103a85780633eb57b31146103e55780634497f4f51461040e57610204565b806323b872dd116101cc57806323b872dd146102c557806327a14fc214610302578063313ce5671461032b578063318111fb1461035657610204565b806306fdde0314610209578063095ea7b31461023457806310c5b3281461027157806318160ddd1461029a57610204565b3661020457005b600080fd5b34801561021557600080fd5b5061021e610804565b60405161022b9190614817565b60405180910390f35b34801561024057600080fd5b5061025b600480360381019061025691906148e1565b610896565b604051610268919061493c565b60405180910390f35b34801561027d57600080fd5b5061029860048036038101906102939190614957565b6108b2565b005b3480156102a657600080fd5b506102af610a32565b6040516102bc91906149a6565b60405180910390f35b3480156102d157600080fd5b506102ec60048036038101906102e791906149c1565b610a3c565b6040516102f9919061493c565b60405180910390f35b34801561030e57600080fd5b5061032960048036038101906103249190614a14565b610a64565b005b34801561033757600080fd5b50610340610b0c565b60405161034d9190614a5d565b60405180910390f35b34801561036257600080fd5b5061037d60048036038101906103789190614a78565b610b15565b005b34801561038b57600080fd5b506103a660048036038101906103a19190614b1a565b610c8f565b005b3480156103b457600080fd5b506103cf60048036038101906103ca91906148e1565b6112e6565b6040516103dc919061493c565b60405180910390f35b3480156103f157600080fd5b5061040c60048036038101906104079190614b5a565b611316565b005b34801561041a57600080fd5b506104236115fb565b6040516104309190614be6565b60405180910390f35b34801561044557600080fd5b5061044e611621565b60405161045b9190614c22565b60405180910390f35b34801561047057600080fd5b50610479611647565b005b34801561048757600080fd5b506104a2600480360381019061049d9190614a14565b611787565b005b3480156104b057600080fd5b506104cb60048036038101906104c69190614b5a565b61183c565b6040516104d891906149a6565b60405180910390f35b3480156104ed57600080fd5b506104f6611884565b005b34801561050457600080fd5b5061051f600480360381019061051a9190614d85565b6119d5565b6040516105359a99989796959493929190614e9f565b60405180910390f35b34801561054a57600080fd5b5061056560048036038101906105609190614a14565b611aab565b005b34801561057357600080fd5b5061057c611b55565b6040516105899190614f5f565b60405180910390f35b34801561059e57600080fd5b506105a7611b7f565b6040516105b49190614817565b60405180910390f35b3480156105c957600080fd5b506105e460048036038101906105df9190614b5a565b611c11565b6040516105f191906149a6565b60405180910390f35b34801561060657600080fd5b50610621600480360381019061061c9190614b5a565b611cce565b005b34801561062f57600080fd5b5061064a600480360381019061064591906148e1565b611f14565b604051610657919061493c565b60405180910390f35b34801561066c57600080fd5b50610675611f84565b6040516106829190614fad565b60405180910390f35b34801561069757600080fd5b506106b260048036038101906106ad91906148e1565b611faa565b6040516106bf919061493c565b60405180910390f35b3480156106d457600080fd5b506106ef60048036038101906106ea9190614a14565b611fc6565b005b3480156106fd57600080fd5b506107066120a4565b005b34801561071457600080fd5b5061071d61213e565b60405161072a9190614be6565b60405180910390f35b34801561073f57600080fd5b50610748612164565b005b34801561075657600080fd5b50610771600480360381019061076c9190614fc8565b612770565b005b34801561077f57600080fd5b5061079a60048036038101906107959190614b1a565b612810565b6040516107a791906149a6565b60405180910390f35b3480156107bc57600080fd5b506107d760048036038101906107d29190614b5a565b61289f565b005b3480156107e557600080fd5b506107ee6129aa565b6040516107fb919061503c565b60405180910390f35b60606003805461081390615086565b80601f016020809104026020016040519081016040528092919081815260200182805461083f90615086565b801561088c5780601f106108615761010080835404028352916020019161088c565b820191906000526020600020905b81548152906001019060200180831161086f57829003601f168201915b5050505050905090565b6000803390506108a78185856129d0565b600191505092915050565b6108ba611b55565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061093c5750601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b61097b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161097290615103565b60405180910390fd5b6000620151804261098c9190615181565b905082601e600083815260200190815260200160002060008282546109b191906151b2565b92505081905550670de0b6b3a7640000601d546109ce91906151e6565b601e6000838152602001908152602001600020541115610a23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1a90615274565b60405180910390fd5b610a2d8284612b99565b505050565b6000600254905090565b600080339050610a4d858285612cd7565b610a58858585612d63565b60019150509392505050565b3373ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610af4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aeb906152e0565b60405180910390fd5b600f548111610b0257600080fd5b80600f8190555050565b60006012905090565b3373ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610ba5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9c906152e0565b60405180910390fd5b86601481905550856015819055508460168190555083601781905550826018819055508160198190555080601a81905550600f60145411158015610bec5750600f60155411155b8015610bfb5750606460165411155b8015610c0a5750601454601654115b8015610c1c57506301e1338060175411155b8015610c3857506064601954601854610c3591906151b2565b11155b8015610c4757506064601a5411155b610c86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7d90615103565b60405180910390fd5b50505050505050565b3373ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610d1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d16906152e0565b60405180910390fd5b81601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610d8b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16613972565b80601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610df7601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16613972565b600073ffffffffffffffffffffffffffffffffffffffff16601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f7c618c16040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e7c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ea0919061533e565b73ffffffffffffffffffffffffffffffffffffffff16148015610f805750600073ffffffffffffffffffffffffffffffffffffffff16601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f7c618c16040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f43573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f67919061533e565b73ffffffffffffffffffffffffffffffffffffffff1614155b610fbf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb6906153b7565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611043573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061106791906153ec565b73ffffffffffffffffffffffffffffffffffffffff1614801561114557503073ffffffffffffffffffffffffffffffffffffffff16601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611109573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061112d91906153ec565b73ffffffffffffffffffffffffffffffffffffffff16145b611184576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117b90615465565b60405180910390fd5b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166331e79db0601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b81526004016112019190614f5f565b600060405180830381600087803b15801561121b57600080fd5b505af115801561122f573d6000803e3d6000fd5b50505050601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166331e79db0601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b81526004016112b09190614f5f565b600060405180830381600087803b1580156112ca57600080fd5b505af11580156112de573d6000803e3d6000fd5b505050505050565b60008033905061130b8185856112fc8589612810565b61130691906151b2565b6129d0565b600191505092915050565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16634e7b827f826040518263ffffffff1660e01b81526004016113719190614f5f565b602060405180830381865afa15801561138e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113b291906154b1565b6115f857601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663238dafe06040518163ffffffff1660e01b8152600401602060405180830381865afa158015611423573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061144791906154b1565b156115f8576000602160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054036114ee57600061149e8261183c565b11156114e95742602160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b6115f8565b6000602160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020544261153b91906154de565b905060006064601a5462015180846115528761183c565b61155c91906151e6565b6115669190615181565b61157091906151e6565b61157a9190615181565b90506000810361158b5750506115f8565b6115948361183c565b8111156115a7576115a48361183c565b90505b6115b18382613cbc565b42602160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050505b50565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c7e772ed336040518263ffffffff1660e01b81526004016116a29190614f5f565b6020604051808303816000875af11580156116c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116e591906154b1565b50601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c7e772ed336040518263ffffffff1660e01b81526004016117419190614f5f565b6020604051808303816000875af1158015611760573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061178491906154b1565b50565b3373ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611817576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180e906152e0565b60405180910390fd5b6064601c546118269190615181565b81111561183257600080fd5b8060098190555050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b3373ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611914576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190b906152e0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60608060606000806000806000806000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637b9437738d8d6040518363ffffffff1660e01b8152600401611a42929190615512565b600060405180830381865afa158015611a5f573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611a8891906155ee565b99509950995099509950995099509950995099509295989b9194979a5092959850565b3373ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611b3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b32906152e0565b60405180910390fd5b624c4b40811115611b4b57600080fd5b80601b8190555050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060048054611b8e90615086565b80601f0160208091040260200160405190810160405280929190818152602001828054611bba90615086565b8015611c075780601f10611bdc57610100808354040283529160200191611c07565b820191906000526020600020905b815481529060010190602001808311611bea57829003601f168201915b5050505050905090565b6000806015541115611c27576015549050611cc9565b6000602060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205442611c7491906154de565b90506017548110611c8a57601454915050611cc9565b6000601454601654611c9c91906154de565b90506017548282611cad91906151e6565b611cb79190615181565b601654611cc491906154de565b925050505b919050565b3373ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611d5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d55906152e0565b60405180910390fd5b80601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166331e79db0826040518263ffffffff1660e01b8152600401611dfa9190614f5f565b600060405180830381600087803b158015611e1457600080fd5b505af1158015611e28573d6000803e3d6000fd5b50505050601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166331e79db0826040518263ffffffff1660e01b8152600401611e879190614f5f565b600060405180830381600087803b158015611ea157600080fd5b505af1158015611eb5573d6000803e3d6000fd5b505050506001600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6000803390506000611f268286612810565b905083811015611f6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f629061576d565b60405180910390fd5b611f7882868684036129d0565b60019250505092915050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080339050611fbb818585612d63565b600191505092915050565b3373ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612056576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204d906152e0565b60405180910390fd5b601d54811061209a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612091906153b7565b60405180910390fd5b80601d8190555050565b3373ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612134576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161212b906152e0565b60405180910390fd5b61213c613e71565b565b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b3373ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146121f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121eb906152e0565b60405180910390fd5b6000600d5414612239576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161223090615103565b60405180910390fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa1580156122a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122ca91906153ec565b73ffffffffffffffffffffffffffffffffffffffff1663c9c6539630600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612353573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061237791906153ec565b6040518363ffffffff1660e01b815260040161239492919061578d565b6020604051808303816000875af11580156123b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123d791906153ec565b600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166331e79db0600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b81526004016124949190614f5f565b600060405180830381600087803b1580156124ae57600080fd5b505af11580156124c2573d6000803e3d6000fd5b50505050601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166331e79db0600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b81526004016125439190614f5f565b600060405180830381600087803b15801561255d57600080fd5b505af1158015612571573d6000803e3d6000fd5b50505050600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d71947306125be3061183c565b6000806125c9611b55565b426040518863ffffffff1660e01b81526004016125eb969594939291906157f1565b60606040518083038185885af1158015612609573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061262e9190615852565b5050506001600e60016101000a81548160ff0219169083151502179055506103e8600a601c5461265e91906151e6565b6126689190615181565b600f8190555042600d819055506103e8601c546126859190615181565b600981905550600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b815260040161272a9291906158a5565b6020604051808303816000875af1158015612749573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061276d91906154b1565b50565b61277a83836108b2565b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663396500438285856040518463ffffffff1660e01b81526004016127d9939291906158ce565b600060405180830381600087803b1580156127f357600080fd5b505af1158015612807573d6000803e3d6000fd5b50505050505050565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561288c577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9050612899565b61289683836143da565b90505b92915050565b3373ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461292f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612926906152e0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361299e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161299590615977565b60405180910390fd5b6129a781614461565b50565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612a3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a3690615a09565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612aae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612aa590615a9b565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051612b8c91906149a6565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612c08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bff90615b07565b60405180910390fd5b8060026000828254612c1a91906151b2565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612ccb91906149a6565b60405180910390a35050565b6000612ce38484612810565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114612d5d5781811015612d4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d4690615b73565b60405180910390fd5b612d5c84848484036129d0565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612d9c57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612dd557600080fd5b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161480612e1b5750600e60009054906101000a900460ff165b15612e3057612e2b838383614527565b61396d565b612e38611b55565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015612ea65750612e76611b55565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b8015612f005750601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b15613553576000600d541180612f4157503073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b612f4a57600080fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16148015612ff55750600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b801561304b5750600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b1561307357600f548161305d8461183c565b61306791906151b2565b111561307257600080fd5b5b600061307e3061183c565b905060095481101580156130e05750600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b80156130f85750600e60019054906101000a900460ff165b1561310657613105613e71565b5b6000602060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020540361326d5742602060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663238dafe06040518163ffffffff1660e01b8152600401602060405180830381865afa1580156131fe573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061322291906154b1565b1561326c5742602160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b5b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c7e772ed856040518263ffffffff1660e01b81526004016132c89190614f5f565b6020604051808303816000875af11580156132e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061330b91906154b1565b50601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c7e772ed846040518263ffffffff1660e01b81526004016133679190614f5f565b6020604051808303816000875af1158015613386573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133aa91906154b1565b50601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161461353f57601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c7e772ed856040518263ffffffff1660e01b815260040161345b9190614f5f565b6020604051808303816000875af115801561347a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061349e91906154b1565b50601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c7e772ed846040518263ffffffff1660e01b81526004016134fa9190614f5f565b6020604051808303816000875af1158015613519573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061353d91906154b1565b505b61354884611316565b61355183611316565b505b600061355e8461183c565b90508082111561356c578091505b600080600d5414806135c75750600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b8061361b5750600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b156136295760009050613695565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361368e5761368784611c11565b9050613694565b60145490505b5b60008111156136d5576000606484836136ae91906151e6565b6136b89190615181565b90506136c5863083614527565b80846136d191906154de565b9350505b6136e0858585614527565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166377067d9586866040518363ffffffff1660e01b815260040161373d92919061578d565b600060405180830381600087803b15801561375757600080fd5b505af115801561376b573d6000803e3d6000fd5b505050506000601b541180156137cb5750600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b806138205750600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b1561396a57601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ffb2c479601b546040518263ffffffff1660e01b815260040161388291906149a6565b6060604051808303816000875af19250505080156138be57506040513d601f19601f820116820180604052508101906138bb9190615852565b60015b156138c7575050505b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ffb2c479601b546040518263ffffffff1660e01b815260040161392491906149a6565b6060604051808303816000875af192505050801561396057506040513d601f19601f8201168201806040525081019061395d9190615852565b60015b15613969575050505b5b50505b505050565b8073ffffffffffffffffffffffffffffffffffffffff166331e79db0826040518263ffffffff1660e01b81526004016139ab9190614f5f565b600060405180830381600087803b1580156139c557600080fd5b505af11580156139d9573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff166331e79db0306040518263ffffffff1660e01b8152600401613a169190614f5f565b600060405180830381600087803b158015613a3057600080fd5b505af1158015613a44573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff166331e79db0613a6c611b55565b6040518263ffffffff1660e01b8152600401613a889190614f5f565b600060405180830381600087803b158015613aa257600080fd5b505af1158015613ab6573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff166331e79db0600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b8152600401613b159190614f5f565b600060405180830381600087803b158015613b2f57600080fd5b505af1158015613b43573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff166331e79db0600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b8152600401613ba29190614f5f565b600060405180830381600087803b158015613bbc57600080fd5b505af1158015613bd0573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff166331e79db0601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b8152600401613c2f9190614f5f565b600060405180830381600087803b158015613c4957600080fd5b505af1158015613c5d573d6000803e3d6000fd5b505050506001600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603613d2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613d2290615c05565b60405180910390fd5b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015613db1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613da890615c97565b60405180910390fd5b8181036000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600260008282540392505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051613e6491906149a6565b60405180910390a3505050565b6000613e7c3061183c565b9050600954811115613e8e5760095490505b60008103613e9c57506143d8565b6001600e60006101000a81548160ff0219169083151502179055506000606460195483613ec991906151e6565b613ed39190615181565b90506000600267ffffffffffffffff811115613ef257613ef1614c42565b5b604051908082528060200260200182016040528015613f205781602001602082028036833780820191505090505b5090503081600081518110613f3857613f37615cb7565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015613fdf573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061400391906153ec565b8160018151811061401757614016615cb7565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac94760028461409c9190615181565b856140a791906154de565b60008430426040518663ffffffff1660e01b81526004016140cc959493929190615da4565b600060405180830381600087803b1580156140e657600080fd5b505af19250505080156140f7575060015b5060004711156143b95760008211156141ca57600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d71947306002866141579190615181565b600080614162611b55565b426040518863ffffffff1660e01b8152600401614184969594939291906157f1565b60606040518083038185885af1935050505080156141c057506040513d601f19601f820116820180604052508101906141bd9190615852565b60015b156141c9575050505b5b600060195460646141db91906154de565b601854476141e991906151e6565b6141f39190615181565b90506000601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015614264573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142889190615dfe565b111561434e576000601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16826207a120906040516142db90615e5c565b600060405180830381858888f193505050503d8060008114614319576040519150601f19603f3d011682016040523d82523d6000602084013e61431e565b606091505b505090508061434c576000600e60006101000a81548160ff02191690831515021790555050505050506143d8565b505b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050501580156143b6573d6000803e3d6000fd5b50505b6000600e60006101000a81548160ff0219169083151502179055505050505b565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603614596576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161458d90615ebd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603614605576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016145fc90615f29565b60405180910390fd5b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561468b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161468290615f95565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161477991906149a6565b60405180910390a350505050565b600081519050919050565b600082825260208201905092915050565b60005b838110156147c15780820151818401526020810190506147a6565b60008484015250505050565b6000601f19601f8301169050919050565b60006147e982614787565b6147f38185614792565b93506148038185602086016147a3565b61480c816147cd565b840191505092915050565b6000602082019050818103600083015261483181846147de565b905092915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006148788261484d565b9050919050565b6148888161486d565b811461489357600080fd5b50565b6000813590506148a58161487f565b92915050565b6000819050919050565b6148be816148ab565b81146148c957600080fd5b50565b6000813590506148db816148b5565b92915050565b600080604083850312156148f8576148f7614843565b5b600061490685828601614896565b9250506020614917858286016148cc565b9150509250929050565b60008115159050919050565b61493681614921565b82525050565b6000602082019050614951600083018461492d565b92915050565b6000806040838503121561496e5761496d614843565b5b600061497c858286016148cc565b925050602061498d85828601614896565b9150509250929050565b6149a0816148ab565b82525050565b60006020820190506149bb6000830184614997565b92915050565b6000806000606084860312156149da576149d9614843565b5b60006149e886828701614896565b93505060206149f986828701614896565b9250506040614a0a868287016148cc565b9150509250925092565b600060208284031215614a2a57614a29614843565b5b6000614a38848285016148cc565b91505092915050565b600060ff82169050919050565b614a5781614a41565b82525050565b6000602082019050614a726000830184614a4e565b92915050565b600080600080600080600060e0888a031215614a9757614a96614843565b5b6000614aa58a828b016148cc565b9750506020614ab68a828b016148cc565b9650506040614ac78a828b016148cc565b9550506060614ad88a828b016148cc565b9450506080614ae98a828b016148cc565b93505060a0614afa8a828b016148cc565b92505060c0614b0b8a828b016148cc565b91505092959891949750929550565b60008060408385031215614b3157614b30614843565b5b6000614b3f85828601614896565b9250506020614b5085828601614896565b9150509250929050565b600060208284031215614b7057614b6f614843565b5b6000614b7e84828501614896565b91505092915050565b6000819050919050565b6000614bac614ba7614ba28461484d565b614b87565b61484d565b9050919050565b6000614bbe82614b91565b9050919050565b6000614bd082614bb3565b9050919050565b614be081614bc5565b82525050565b6000602082019050614bfb6000830184614bd7565b92915050565b6000614c0c82614bb3565b9050919050565b614c1c81614c01565b82525050565b6000602082019050614c376000830184614c13565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b614c7a826147cd565b810181811067ffffffffffffffff82111715614c9957614c98614c42565b5b80604052505050565b6000614cac614839565b9050614cb88282614c71565b919050565b600067ffffffffffffffff821115614cd857614cd7614c42565b5b602082029050602081019050919050565b600080fd5b6000614d01614cfc84614cbd565b614ca2565b90508083825260208201905060208402830185811115614d2457614d23614ce9565b5b835b81811015614d4d5780614d3988826148cc565b845260208401935050602081019050614d26565b5050509392505050565b600082601f830112614d6c57614d6b614c3d565b5b8135614d7c848260208601614cee565b91505092915050565b60008060408385031215614d9c57614d9b614843565b5b6000614daa85828601614896565b925050602083013567ffffffffffffffff811115614dcb57614dca614848565b5b614dd785828601614d57565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b614e16816148ab565b82525050565b6000614e288383614e0d565b60208301905092915050565b6000602082019050919050565b6000614e4c82614de1565b614e568185614dec565b9350614e6183614dfd565b8060005b83811015614e92578151614e798882614e1c565b9750614e8483614e34565b925050600181019050614e65565b5085935050505092915050565b6000610140820190508181036000830152614eba818d614e41565b90508181036020830152614ece818c614e41565b90508181036040830152614ee2818b614e41565b9050614ef1606083018a614997565b614efe6080830189614997565b614f0b60a0830188614997565b614f1860c0830187614997565b614f2560e0830186614997565b614f33610100830185614997565b614f41610120830184614997565b9b9a5050505050505050505050565b614f598161486d565b82525050565b6000602082019050614f746000830184614f50565b92915050565b6000614f8582614b91565b9050919050565b6000614f9782614f7a565b9050919050565b614fa781614f8c565b82525050565b6000602082019050614fc26000830184614f9e565b92915050565b600080600060608486031215614fe157614fe0614843565b5b6000614fef868287016148cc565b935050602061500086828701614896565b9250506040615011868287016148cc565b9150509250925092565b600061502682614f7a565b9050919050565b6150368161501b565b82525050565b6000602082019050615051600083018461502d565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061509e57607f821691505b6020821081036150b1576150b0615057565b5b50919050565b7f6e6f000000000000000000000000000000000000000000000000000000000000600082015250565b60006150ed600283614792565b91506150f8826150b7565b602082019050919050565b6000602082019050818103600083015261511c816150e0565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061518c826148ab565b9150615197836148ab565b9250826151a7576151a6615123565b5b828204905092915050565b60006151bd826148ab565b91506151c8836148ab565b92508282019050808211156151e0576151df615152565b5b92915050565b60006151f1826148ab565b91506151fc836148ab565b925082820261520a816148ab565b9150828204841483151761522157615220615152565b5b5092915050565b7f3e00000000000000000000000000000000000000000000000000000000000000600082015250565b600061525e600183614792565b915061526982615228565b602082019050919050565b6000602082019050818103600083015261528d81615251565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006152ca602083614792565b91506152d582615294565b602082019050919050565b600060208201905081810360008301526152f9816152bd565b9050919050565b600061530b8261486d565b9050919050565b61531b81615300565b811461532657600080fd5b50565b60008151905061533881615312565b92915050565b60006020828403121561535457615353614843565b5b600061536284828501615329565b91505092915050565b7f696e76616c696400000000000000000000000000000000000000000000000000600082015250565b60006153a1600783614792565b91506153ac8261536b565b602082019050919050565b600060208201905081810360008301526153d081615394565b9050919050565b6000815190506153e68161487f565b92915050565b60006020828403121561540257615401614843565b5b6000615410848285016153d7565b91505092915050565b7f536574206f776e65720000000000000000000000000000000000000000000000600082015250565b600061544f600983614792565b915061545a82615419565b602082019050919050565b6000602082019050818103600083015261547e81615442565b9050919050565b61548e81614921565b811461549957600080fd5b50565b6000815190506154ab81615485565b92915050565b6000602082840312156154c7576154c6614843565b5b60006154d58482850161549c565b91505092915050565b60006154e9826148ab565b91506154f4836148ab565b925082820390508181111561550c5761550b615152565b5b92915050565b60006040820190506155276000830185614f50565b81810360208301526155398184614e41565b90509392505050565b600081519050615551816148b5565b92915050565b600061556a61556584614cbd565b614ca2565b9050808382526020820190506020840283018581111561558d5761558c614ce9565b5b835b818110156155b657806155a28882615542565b84526020840193505060208101905061558f565b5050509392505050565b600082601f8301126155d5576155d4614c3d565b5b81516155e5848260208601615557565b91505092915050565b6000806000806000806000806000806101408b8d03121561561257615611614843565b5b60008b015167ffffffffffffffff8111156156305761562f614848565b5b61563c8d828e016155c0565b9a505060208b015167ffffffffffffffff81111561565d5761565c614848565b5b6156698d828e016155c0565b99505060408b015167ffffffffffffffff81111561568a57615689614848565b5b6156968d828e016155c0565b98505060606156a78d828e01615542565b97505060806156b88d828e01615542565b96505060a06156c98d828e01615542565b95505060c06156da8d828e01615542565b94505060e06156eb8d828e01615542565b9350506101006156fd8d828e01615542565b92505061012061570f8d828e01615542565b9150509295989b9194979a5092959850565b7f64656372656173656420616c6c6f77616e63652062656c6f77207a65726f0000600082015250565b6000615757601e83614792565b915061576282615721565b602082019050919050565b600060208201905081810360008301526157868161574a565b9050919050565b60006040820190506157a26000830185614f50565b6157af6020830184614f50565b9392505050565b6000819050919050565b60006157db6157d66157d1846157b6565b614b87565b6148ab565b9050919050565b6157eb816157c0565b82525050565b600060c0820190506158066000830189614f50565b6158136020830188614997565b61582060408301876157e2565b61582d60608301866157e2565b61583a6080830185614f50565b61584760a0830184614997565b979650505050505050565b60008060006060848603121561586b5761586a614843565b5b600061587986828701615542565b935050602061588a86828701615542565b925050604061589b86828701615542565b9150509250925092565b60006040820190506158ba6000830185614f50565b6158c76020830184614997565b9392505050565b60006060820190506158e36000830186614997565b6158f06020830185614997565b6158fd6040830184614f50565b949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000615961602683614792565b915061596c82615905565b604082019050919050565b6000602082019050818103600083015261599081615954565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006159f3602483614792565b91506159fe82615997565b604082019050919050565b60006020820190508181036000830152615a22816159e6565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000615a85602283614792565b9150615a9082615a29565b604082019050919050565b60006020820190508181036000830152615ab481615a78565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6000615af1601f83614792565b9150615afc82615abb565b602082019050919050565b60006020820190508181036000830152615b2081615ae4565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000615b5d601d83614792565b9150615b6882615b27565b602082019050919050565b60006020820190508181036000830152615b8c81615b50565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000615bef602183614792565b9150615bfa82615b93565b604082019050919050565b60006020820190508181036000830152615c1e81615be2565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b6000615c81602283614792565b9150615c8c82615c25565b604082019050919050565b60006020820190508181036000830152615cb081615c74565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b615d1b8161486d565b82525050565b6000615d2d8383615d12565b60208301905092915050565b6000602082019050919050565b6000615d5182615ce6565b615d5b8185615cf1565b9350615d6683615d02565b8060005b83811015615d97578151615d7e8882615d21565b9750615d8983615d39565b925050600181019050615d6a565b5085935050505092915050565b600060a082019050615db96000830188614997565b615dc660208301876157e2565b8181036040830152615dd88186615d46565b9050615de76060830185614f50565b615df46080830184614997565b9695505050505050565b600060208284031215615e1457615e13614843565b5b6000615e2284828501615542565b91505092915050565b600081905092915050565b50565b6000615e46600083615e2b565b9150615e5182615e36565b600082019050919050565b6000615e6782615e39565b9150819050919050565b7f74616e736665722066726f6d20746865207a65726f2061646472657373000000600082015250565b6000615ea7601d83614792565b9150615eb282615e71565b602082019050919050565b60006020820190508181036000830152615ed681615e9a565b9050919050565b7f7472616e7366657220746f20746865207a65726f206164647265737300000000600082015250565b6000615f13601c83614792565b9150615f1e82615edd565b602082019050919050565b60006020820190508181036000830152615f4281615f06565b9050919050565b7f7472616e7366657220616d6f756e7420657863656564732062616c616e636500600082015250565b6000615f7f601f83614792565b9150615f8a82615f49565b602082019050919050565b60006020820190508181036000830152615fae81615f72565b905091905056fea2646970667358221220c6b8b95a3bc882926b87bb0d09ae55df4ea7a09876a094961a334db724cb2f5e64736f6c63430008110033
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
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.