ERC-20
Overview
Max Total Supply
1,000,000,000,000 HANNIBAL
Holders
20
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 18 Decimals)
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
REDDRAGON
Compiler Version
v0.8.6+commit.11564f7e
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-10-13 */ /** * SPDX-License-Identifier: MIT */ // 1 million market cap or dust :D FUCKIN MOOOOOON pragma solidity ^0.8.6; abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } library SafeMath { function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b > a) return (false, 0); return (true, a - b); } function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a / b); } function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a % b); } function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } function sub(uint256 a, uint256 b) internal pure returns (uint256) { require(b <= a, "SafeMath: subtraction overflow"); return a - b; } function mul(uint256 a, uint256 b) internal pure returns (uint256) { if (a == 0) return 0; uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } function div(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0, "SafeMath: division by zero"); return a / b; } function mod(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0, "SafeMath: modulo by zero"); return a % b; } function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b <= a, errorMessage); return a - b; } function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b > 0, errorMessage); return a / b; } function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b > 0, errorMessage); return a % b; } } 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); } interface IERC20Metadata is IERC20 { function name() external view returns (string memory); function symbol() external view returns (string memory); function decimals() external view returns (uint8); } abstract contract Context { function _msgSender() internal view virtual returns (address) {return msg.sender;} function _msgData() internal view virtual returns (bytes calldata) {this; return msg.data;} } library Address { function isContract(address account) internal view returns (bool) { uint256 size; assembly { size := extcodesize(account) } return size > 0; } function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance");(bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{ value: value }(data); return _verifyCallResult(success, returndata, errorMessage); } function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) { if (success) { return returndata; } else { if (returndata.length > 0) { assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else {revert(errorMessage);} } } } abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); constructor () { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } function owner() public view returns (address) { return _owner; } modifier onlyOwner() { require(_owner == _msgSender(), "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"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } interface IPancakeV2Factory { event PairCreated(address indexed token0, address indexed token1, address pair, uint); function createPair(address tokenA, address tokenB) external returns (address pair); } interface IPancakeV2Router { function factory() external pure returns (address); function WETH() external pure returns (address); function addLiquidity( address tokenA, address tokenB, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB, uint liquidity); function addLiquidityETH( address token, uint amountTokenDesired, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external payable returns (uint amountToken, uint amountETH, uint liquidity); function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; function swapExactETHForTokensSupportingFeeOnTransferTokens( uint amountOutMin, address[] calldata path, address to, uint deadline ) external payable; function swapExactTokensForETHSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; } contract REDDRAGON is IERC20Metadata, Ownable, ReentrancyGuard { using SafeMath for uint256; using Address for address; address internal deadAddress = 0x000000000000000000000000000000000000dEaD; address public marketingWallet = 0xBDB65749dE8C4641621aA63D19cAA24C3768a013; address public charityWallet = 0x3ab2579A25915A6EC41B88CFe5d5f19D6241e4dD; string constant _name = "RED DRAGON"; string constant _symbol = "HANNIBAL"; uint8 constant _decimals = 18; uint256 private constant MAX = ~uint256(0); uint256 internal constant _totalSupply = 1_000_000_000_000 * (10**18); uint256 internal _reflectedSupply = (MAX - (MAX % _totalSupply)); uint256 public collectedFeeTotal; uint256 public maxTxAmount = _totalSupply / 1000; // 0.1% of the total supply uint256 public maxWalletBalance = _totalSupply / 50; // 2% of the total supply bool public takeFeeEnabled = true; bool public tradingIsEnabled = true; bool public isInPresale = false; bool private swapping; bool public swapEnabled = true; uint256 public swapTokensAtAmount = 100_000_000 * (10**18); bool public antiBotEnabled = false; uint256 public antiBotFee = 990; // 99% uint256 public _startTimeForSwap; uint256 private constant FEES_DIVISOR = 10**3; uint256 public marketingFee = 10; // 1% uint256 public charityFee = 10; // 1% uint256 public lpFee = 5; // 0.5% uint256 private totalFee; // Total = 100% (1000) uint256 public marketingPortionOfSwap = 500; // 50% uint256 public charityPortionOfSwap = 300; // 30% uint256 public lpPortionOfSwap = 200; // 20% IPancakeV2Router public router; address public pair; mapping (address => uint256) internal _reflectedBalances; mapping (address => uint256) internal _balances; mapping (address => mapping (address => uint256)) internal _allowances; mapping(address => bool) public _isBlacklisted; mapping (address => bool) internal _isExcludedFromFee; mapping (address => bool) internal _isExcludedFromRewards; address[] private _excluded; event UpdatePancakeswapRouter(address indexed newAddress, address indexed oldAddress); event ExcludeFromFees(address indexed account, bool isExcluded); event ExcludeMultipleAccountsFromFees(address[] accounts, bool isExcluded); event MarketingWalletUpdated(address indexed newMarketingWallet, address indexed oldMarketingWallet); event CharityWalletUpdated(address indexed newCharityWallet, address indexed oldCharityWallet); event LiquidityAdded(uint256 tokenAmountSent, uint256 ethAmountSent, uint256 liquidity); event SwapTokensForETH(uint256 amountIn, address[] path); modifier zeroAddressCheck(address _theAddress) { require(_theAddress != address(0), "Address cannot be the zero address"); _; } constructor () { _reflectedBalances[owner()] = _reflectedSupply; IPancakeV2Router _newPancakeRouter = IPancakeV2Router(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D); pair = IPancakeV2Factory(_newPancakeRouter.factory()).createPair(address(this), _newPancakeRouter.WETH()); router = _newPancakeRouter; // set fees totalFee = marketingFee.add(charityFee).add(lpFee); // exclude owner and this contract from fee _isExcludedFromFee[owner()] = true; _isExcludedFromFee[address(this)] = true; // exclude the owner and this contract from rewards _exclude(owner()); _exclude(address(this)); // exclude the pair address from rewards - we don't want to redistribute _exclude(pair); _exclude(deadAddress); _approve(owner(), address(router), ~uint256(0)); emit Transfer(address(0), owner(), _totalSupply); } receive() external payable { } function name() external pure override returns (string memory) { return _name; } function symbol() external pure override returns (string memory) { return _symbol; } function decimals() external pure override returns (uint8) { return _decimals; } function totalSupply() external pure override returns (uint256) { return _totalSupply; } function balanceOf(address account) public view override returns (uint256){ if (_isExcludedFromRewards[account]) return _balances[account]; return tokenFromReflection(_reflectedBalances[account]); } function transfer(address recipient, uint256 amount) external override returns (bool){ _transfer(_msgSender(), recipient, amount); return true; } function allowance(address owner, address spender) external view override returns (uint256){ return _allowances[owner][spender]; } function approve(address spender, uint256 amount) external override returns (bool) { _approve(_msgSender(), spender, amount); return true; } function transferFrom(address sender, address recipient, uint256 amount) external override returns (bool){ _transfer(sender, recipient, amount); _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance")); return true; } function burn(uint256 amount) external nonReentrant { address sender = _msgSender(); require(sender != address(0), "ERC20: burn from the zero address"); require(sender != address(deadAddress), "ERC20: burn from the burn address"); uint256 balance = balanceOf(sender); require(balance >= amount, "ERC20: burn amount exceeds balance"); uint256 reflectedAmount = amount.mul(_getCurrentRate()); // remove the amount from the sender's balance first _reflectedBalances[sender] = _reflectedBalances[sender].sub(reflectedAmount); if (_isExcludedFromRewards[sender]) _balances[sender] = _balances[sender].sub(amount); _burnTokens( sender, amount, reflectedAmount ); } /** * @dev "Soft" burns the specified amount of tokens by sending them * to the burn address */ function _burnTokens(address sender, uint256 tBurn, uint256 rBurn) internal { /** * @dev Do not reduce _totalSupply and/or _reflectedSupply. (soft) burning by sending * tokens to the burn address (which should be excluded from rewards) is sufficient * in RFI */ _reflectedBalances[deadAddress] = _reflectedBalances[deadAddress].add(rBurn); if (_isExcludedFromRewards[deadAddress]) _balances[deadAddress] = _balances[deadAddress].add(tBurn); /** * @dev Emit the event so that the burn address balance is updated (on bscscan) */ emit Transfer(sender, deadAddress, tBurn); } function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue)); return true; } function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero")); return true; } function _approve(address owner, address spender, uint256 amount) internal { require(owner != address(0), "BaseRfiToken: approve from the zero address"); require(spender != address(0), "BaseRfiToken: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Calculates and returns the reflected amount for the given amount with or without * the transfer fees (deductTransferFee true/false) */ function reflectionFromToken(uint256 tAmount, bool deductTransferFee) external view returns(uint256) { require(tAmount <= _totalSupply, "Amount must be less than supply"); uint256 feesSum; if (!deductTransferFee) { (uint256 rAmount,,,,) = _getValues(tAmount,0); return rAmount; } else { feesSum = totalFee; (,uint256 rTransferAmount,,,) = _getValues(tAmount, feesSum); return rTransferAmount; } } /** * @dev Calculates and returns the amount of tokens corresponding to the given reflected amount. */ function tokenFromReflection(uint256 rAmount) public view returns(uint256) { require(rAmount <= _reflectedSupply, "Amount must be less than total reflections"); uint256 currentRate = _getCurrentRate(); return rAmount.div(currentRate); } function excludeFromReward(address account) external onlyOwner() { require(!_isExcludedFromRewards[account], "Account is not included"); _exclude(account); } function _exclude(address account) private { if(_reflectedBalances[account] > 0) { _balances[account] = tokenFromReflection(_reflectedBalances[account]); } _isExcludedFromRewards[account] = true; _excluded.push(account); } function includeInReward(address account) external onlyOwner() { require(_isExcludedFromRewards[account], "Account is not excluded"); for (uint256 i = 0; i < _excluded.length; i++) { if (_excluded[i] == account) { _excluded[i] = _excluded[_excluded.length - 1]; _balances[account] = 0; _isExcludedFromRewards[account] = false; _excluded.pop(); break; } } } function setExcludedFromFee(address account, bool value) external onlyOwner { _isExcludedFromFee[account] = value; } function _getValues(uint256 tAmount, uint256 feesSum) internal view returns (uint256, uint256, uint256, uint256, uint256) { uint256 tTotalFees = tAmount.mul(feesSum).div(FEES_DIVISOR); uint256 tTransferAmount = tAmount.sub(tTotalFees); uint256 currentRate = _getCurrentRate(); uint256 rAmount = tAmount.mul(currentRate); uint256 rTotalFees = tTotalFees.mul(currentRate); uint256 rTransferAmount = rAmount.sub(rTotalFees); return (rAmount, rTransferAmount, tAmount, tTransferAmount, currentRate); } function _getCurrentRate() internal view returns(uint256) { (uint256 rSupply, uint256 tSupply) = _getCurrentSupply(); return rSupply.div(tSupply); } function _getCurrentSupply() internal view returns(uint256, uint256) { uint256 rSupply = _reflectedSupply; uint256 tSupply = _totalSupply; /** * The code below removes balances of addresses excluded from rewards from * rSupply and tSupply, which effectively increases the % of transaction fees * delivered to non-excluded holders */ for (uint256 i = 0; i < _excluded.length; i++) { if (_reflectedBalances[_excluded[i]] > rSupply || _balances[_excluded[i]] > tSupply) return (_reflectedSupply, _totalSupply); rSupply = rSupply.sub(_reflectedBalances[_excluded[i]]); tSupply = tSupply.sub(_balances[_excluded[i]]); } if (tSupply == 0 || rSupply < _reflectedSupply.div(_totalSupply)) return (_reflectedSupply, _totalSupply); return (rSupply, tSupply); } /** * @dev Redistributes the specified amount among the current holders via the reflect.finance * algorithm, i.e. by updating the _reflectedSupply (_rSupply) which ultimately adjusts the * current rate used by `tokenFromReflection` and, in turn, the value returns from `balanceOf`. * */ function _redistribute(uint256 amount, uint256 currentRate, uint256 fee) private { uint256 tFee = amount.mul(fee).div(FEES_DIVISOR); uint256 rFee = tFee.mul(currentRate); _reflectedSupply = _reflectedSupply.sub(rFee); collectedFeeTotal = collectedFeeTotal.add(tFee); } function _burn(uint256 amount, uint256 currentRate, uint256 fee) private { uint256 tBurn = amount.mul(fee).div(FEES_DIVISOR); uint256 rBurn = tBurn.mul(currentRate); _burnTokens(address(this), tBurn, rBurn); collectedFeeTotal = collectedFeeTotal.add(tBurn); } function isExcludedFromReward(address account) external view returns (bool) { return _isExcludedFromRewards[account]; } function isExcludedFromFee(address account) public view returns(bool) { return _isExcludedFromFee[account]; } function blacklistAddress(address account, bool value) external onlyOwner{ _isBlacklisted[account] = value; } function setSwapEnabled(bool _enabled) external onlyOwner { swapEnabled = _enabled; } function updateSwapTokensAt(uint256 _swaptokens) external onlyOwner { swapTokensAtAmount = _swaptokens * (10**18); } function updateWalletMax(uint256 _walletMax) external onlyOwner { maxWalletBalance = _walletMax * (10**18); } function updateTransactionMax(uint256 _txMax) external onlyOwner { maxTxAmount = _txMax * (10**18); } function updateFees( uint256 _marketing, uint256 _charity, uint256 _lp) external onlyOwner { totalFee = _marketing.add(_charity).add(_lp); require(totalFee <= 100, "Total Fees cannot be greater than 10% (100)"); marketingFee = _marketing; charityFee = _charity; lpFee = _lp; } function updateMarketingWallet(address newWallet) external onlyOwner zeroAddressCheck(newWallet) { require(newWallet != marketingWallet, "The Marketing wallet is already this address"); emit MarketingWalletUpdated(newWallet, marketingWallet); marketingWallet = newWallet; } function updateCharityWallet(address newWallet) external onlyOwner zeroAddressCheck(newWallet) { require(newWallet != charityWallet, "The Charity wallet is already this address"); emit CharityWalletUpdated(newWallet, charityWallet); charityWallet = newWallet; } function updatePortionsOfSwap(uint256 marketingPortion, uint256 charityPortion, uint256 lpPortion) external onlyOwner { uint256 totalPortion = marketingPortion.add(charityPortion).add(lpPortion); require(totalPortion == 1000, "Total must be equal to 1000 (100%)"); marketingPortionOfSwap = marketingPortion; charityPortionOfSwap = charityPortion; lpPortionOfSwap = lpPortion; } function updateTradingIsEnabled(bool tradingStatus) external onlyOwner() { tradingIsEnabled = tradingStatus; } function updateRouterAddress(address newAddress) external onlyOwner { require(newAddress != address(router), "The router already has that address"); emit UpdatePancakeswapRouter(newAddress, address(router)); router = IPancakeV2Router(newAddress); } function toggleAntiBot(bool toggleStatus) external onlyOwner() { antiBotEnabled = toggleStatus; if(antiBotEnabled){ _startTimeForSwap = block.timestamp + 60; } } function _takeFee(uint256 amount, uint256 currentRate, uint256 fee, address recipient) private { uint256 tAmount = amount.mul(fee).div(FEES_DIVISOR); uint256 rAmount = tAmount.mul(currentRate); _reflectedBalances[recipient] = _reflectedBalances[recipient].add(rAmount); if(_isExcludedFromRewards[recipient]) _balances[recipient] = _balances[recipient].add(tAmount); } function _transferTokens(address sender, address recipient, uint256 amount, bool takeFee) private { uint256 sumOfFees = totalFee; // antibot enabled sumOfFees = antiBotEnabled && block.timestamp <= _startTimeForSwap ? antiBotFee : sumOfFees; // transfer between wallets if(sender != pair && recipient != pair) { sumOfFees = 0; } if ( !takeFee ){ sumOfFees = 0; } processReflectedBal(sender, recipient, amount, sumOfFees); } function processReflectedBal (address sender, address recipient, uint256 amount, uint256 sumOfFees) private { (uint256 rAmount, uint256 rTransferAmount, uint256 tAmount, uint256 tTransferAmount, uint256 currentRate ) = _getValues(amount, sumOfFees); theReflection(sender, recipient, rAmount, rTransferAmount, tAmount, tTransferAmount); _takeFees(amount, currentRate, sumOfFees); emit Transfer(sender, recipient, tTransferAmount); } function theReflection(address sender, address recipient, uint256 rAmount, uint256 rTransferAmount, uint256 tAmount, uint256 tTransferAmount) private { _reflectedBalances[sender] = _reflectedBalances[sender].sub(rAmount); _reflectedBalances[recipient] = _reflectedBalances[recipient].add(rTransferAmount); /** * Update the true/nominal balances for excluded accounts */ if (_isExcludedFromRewards[sender]) { _balances[sender] = _balances[sender].sub(tAmount); } if (_isExcludedFromRewards[recipient] ) { _balances[recipient] = _balances[recipient].add(tTransferAmount); } } function _takeFees(uint256 amount, uint256 currentRate, uint256 sumOfFees) private { if ( sumOfFees > 0 && !isInPresale ){ _takeFee( amount, currentRate, sumOfFees, address(this)); } } function _transfer(address sender, address recipient, uint256 amount) private { require(sender != address(0), "Token: transfer from the zero address"); require(recipient != address(0), "Token: transfer to the zero address"); require(sender != address(deadAddress), "Token: transfer from the burn address"); require(amount > 0, "Transfer amount must be greater than zero"); require(tradingIsEnabled, "This account cannot send tokens until trading is enabled"); require(!_isBlacklisted[sender] && !_isBlacklisted[recipient], "Blacklisted address"); if ( sender != address(router) && //router -> pair is removing liquidity which shouldn't have max !_isExcludedFromFee[recipient] && //no max for those excluded from fees !_isExcludedFromFee[sender] ) { require(amount <= maxTxAmount, "Transfer amount exceeds the Max Transaction Amount."); } if ( maxWalletBalance > 0 && !_isExcludedFromFee[recipient] && !_isExcludedFromFee[sender] && recipient != address(pair) ) { uint256 recipientBalance = balanceOf(recipient); require(recipientBalance + amount <= maxWalletBalance, "New balance would exceed the maxWalletBalance"); } // indicates whether or not fee should be deducted from the transfer bool _isTakeFee = takeFeeEnabled; if ( isInPresale ){ _isTakeFee = false; } // if any account belongs to _isExcludedFromFee account then remove the fee if(_isExcludedFromFee[sender] || _isExcludedFromFee[recipient]) { _isTakeFee = false; } _beforeTokenTransfer(recipient); _transferTokens(sender, recipient, amount, _isTakeFee); } function _beforeTokenTransfer(address recipient) private { if ( !isInPresale ){ uint256 contractTokenBalance = balanceOf(address(this)); // swap bool canSwap = contractTokenBalance >= swapTokensAtAmount; if (!swapping && canSwap && swapEnabled && recipient == pair) { swapping = true; swapBack(); swapping = false; } } } function swapBack() private nonReentrant { uint256 splitLiquidityPortion = lpPortionOfSwap.div(2); uint256 amountToLiquify = balanceOf(address(this)).mul(splitLiquidityPortion).div(FEES_DIVISOR); uint256 amountToSwap = balanceOf(address(this)).sub(amountToLiquify); uint256 balanceBefore = address(this).balance; swapTokensForETH(amountToSwap); uint256 amountBNB = address(this).balance.sub(balanceBefore); uint256 amountBNBMarketing = amountBNB.mul(marketingPortionOfSwap).div(FEES_DIVISOR); uint256 amountBNBCharity = amountBNB.mul(charityPortionOfSwap).div(FEES_DIVISOR); uint256 amountBNBLiquidity = amountBNB.mul(splitLiquidityPortion).div(FEES_DIVISOR); //Send to addresses transferToAddress(payable(marketingWallet), amountBNBMarketing); transferToAddress(payable(charityWallet), amountBNBCharity); // add liquidity _addLiquidity(amountToLiquify, amountBNBLiquidity); } function _addLiquidity(uint256 tokenAmount, uint256 ethAmount) private { // approve token transfer to cover all possible scenarios _approve(address(this), address(router), tokenAmount); // add the liquidity (uint256 tokenAmountSent, uint256 ethAmountSent, uint256 liquidity) = router.addLiquidityETH{value: ethAmount}( address(this), tokenAmount, 0, 0, owner(), block.timestamp ); emit LiquidityAdded(tokenAmountSent, ethAmountSent, liquidity); } function swapTokensForETH(uint256 tokenAmount) private { // generate the uniswap pair path of token -> weth address[] memory path = new address[](2); path[0] = address(this); path[1] = router.WETH(); _approve(address(this), address(router), tokenAmount); // make the swap router.swapExactTokensForETHSupportingFeeOnTransferTokens( tokenAmount, 0, // accept any amount of ETH path, address(this), block.timestamp ); emit SwapTokensForETH(tokenAmount, path); } function transferToAddress(address payable recipient, uint256 amount) private { require(recipient != address(0), "Cannot transfer the ETH to a zero address"); recipient.transfer(amount); } function TransferETH(address payable recipient, uint256 amount) external onlyOwner { require(recipient != address(0), "Cannot withdraw the ETH balance to a zero address"); recipient.transfer(amount); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","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":"newCharityWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldCharityWallet","type":"address"}],"name":"CharityWalletUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address[]","name":"accounts","type":"address[]"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeMultipleAccountsFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenAmountSent","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethAmountSent","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"liquidity","type":"uint256"}],"name":"LiquidityAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newMarketingWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldMarketingWallet","type":"address"}],"name":"MarketingWalletUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amountIn","type":"uint256"},{"indexed":false,"internalType":"address[]","name":"path","type":"address[]"}],"name":"SwapTokensForETH","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdatePancakeswapRouter","type":"event"},{"inputs":[{"internalType":"address payable","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TransferETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isBlacklisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_startTimeForSwap","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":[],"name":"antiBotEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"antiBotFee","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"},{"internalType":"bool","name":"value","type":"bool"}],"name":"blacklistAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"charityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"charityPortionOfSwap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"charityWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"collectedFeeTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","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":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInReward","outputs":[],"stateMutability":"nonpayable","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":"address","name":"account","type":"address"}],"name":"isExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromReward","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isInPresale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpPortionOfSwap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingPortionOfSwap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTxAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWalletBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tAmount","type":"uint256"},{"internalType":"bool","name":"deductTransferFee","type":"bool"}],"name":"reflectionFromToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"router","outputs":[{"internalType":"contract IPancakeV2Router","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setExcludedFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setSwapEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapTokensAtAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"takeFeeEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"toggleStatus","type":"bool"}],"name":"toggleAntiBot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"rAmount","type":"uint256"}],"name":"tokenFromReflection","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"tradingIsEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","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":"newWallet","type":"address"}],"name":"updateCharityWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_marketing","type":"uint256"},{"internalType":"uint256","name":"_charity","type":"uint256"},{"internalType":"uint256","name":"_lp","type":"uint256"}],"name":"updateFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newWallet","type":"address"}],"name":"updateMarketingWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"marketingPortion","type":"uint256"},{"internalType":"uint256","name":"charityPortion","type":"uint256"},{"internalType":"uint256","name":"lpPortion","type":"uint256"}],"name":"updatePortionsOfSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"updateRouterAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_swaptokens","type":"uint256"}],"name":"updateSwapTokensAt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"tradingStatus","type":"bool"}],"name":"updateTradingIsEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_txMax","type":"uint256"}],"name":"updateTransactionMax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_walletMax","type":"uint256"}],"name":"updateWalletMax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
6080604052600280546001600160a01b031990811661dead1790915560038054821673bdb65749de8c4641621aa63d19caa24c3768a01317905560048054909116733ab2579a25915a6ec41b88cfe5d5f19d6241e4dd179055620000736c0c9f2c9cd04674edea4000000060001962000b4e565b620000819060001962000b16565b6005556200009f6103e86c0c9f2c9cd04674edea4000000062000aff565b600755620000bc60326c0c9f2c9cd04674edea4000000062000aff565b6008556009805464ff00ffffff19166401000001011790556a52b7d2dcc80cd2e4000000600a908155600b805460ff191690556103de600c55600e819055600f5560056010556101f460125561012c60135560c86014553480156200012057600080fd5b50600080546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506001805560055460176000620001806000546001600160a01b031690565b6001600160a01b03166001600160a01b03168152602001908152602001600020819055506000737a250d5630b4cf539739df2c5dacb4c659f2488d9050806001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b158015620001f757600080fd5b505afa1580156200020c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000232919062000ab9565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156200027b57600080fd5b505afa15801562000290573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002b6919062000ab9565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b158015620002ff57600080fd5b505af115801562000314573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200033a919062000ab9565b601680546001600160a01b03199081166001600160a01b039384161790915560158054909116918316919091179055601054600f54600e54620003a49291620003909190620004da602090811b62001b2517901c565b620004da60201b62001b251790919060201c565b6011556001601b6000620003c06000546001600160a01b031690565b6001600160a01b0316815260208082019290925260409081016000908120805494151560ff19958616179055308152601b9092529020805490911660011790556200041d620004176000546001600160a01b031690565b62000548565b620004283062000548565b6016546200043f906001600160a01b031662000548565b60025462000456906001600160a01b031662000548565b620004826200046d6000546001600160a01b031690565b6015546001600160a01b03166000196200060b565b600080546040516c0c9f2c9cd04674edea4000000081526001600160a01b0390911691907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35062000ba7565b600080620004e9838562000ae4565b905083811015620005415760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f77000000000060448201526064015b60405180910390fd5b9392505050565b6001600160a01b03811660009081526017602052604090205415620005a5576001600160a01b0381166000908152601760205260409020546200058b9062000742565b6001600160a01b0382166000908152601860205260409020555b6001600160a01b03166000818152601c60205260408120805460ff19166001908117909155601d805491820181559091527f6d4407e7be21f808e6509aa9fa9143369579dd7d760fe20a2c09680fc146134f0180546001600160a01b0319169091179055565b6001600160a01b038316620006775760405162461bcd60e51b815260206004820152602b60248201527f42617365526669546f6b656e3a20617070726f76652066726f6d20746865207a60448201526a65726f206164647265737360a81b606482015260840162000538565b6001600160a01b038216620006e15760405162461bcd60e51b815260206004820152602960248201527f42617365526669546f6b656e3a20617070726f766520746f20746865207a65726044820152686f206164647265737360b81b606482015260840162000538565b6001600160a01b0383811660008181526019602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6000600554821115620007ab5760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b606482015260840162000538565b6000620007b7620007d3565b90506200054181846200080660201b62001b841790919060201c565b60008080620007e162000865565b91509150620007ff81836200080660201b62001b841790919060201c565b9250505090565b6000808211620008595760405162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015260640162000538565b62000541828462000aff565b60055460009081906c0c9f2c9cd04674edea40000000825b601d54811015620009fa578260176000601d8481548110620008a357620008a362000b91565b60009182526020808320909101546001600160a01b0316835282019290925260400190205411806200091257508160186000601d8481548110620008eb57620008eb62000b91565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b1562000933575050600554936c0c9f2c9cd04674edea400000009350915050565b6200098a60176000601d848154811062000951576200095162000b91565b60009182526020808320909101546001600160a01b03168352828101939093526040909101902054859162001bdf62000a59821b17901c565b9250620009e360186000601d8481548110620009aa57620009aa62000b91565b60009182526020808320909101546001600160a01b03168352828101939093526040909101902054849162001bdf62000a59821b17901c565b915080620009f18162000b30565b9150506200087d565b5080158062000a30575062000a2d6c0c9f2c9cd04674edea400000006005546200080660201b62001b841790919060201c565b82105b1562000a50575050600554926c0c9f2c9cd04674edea4000000092509050565b90939092509050565b60008282111562000aad5760405162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015260640162000538565b62000541828462000b16565b60006020828403121562000acc57600080fd5b81516001600160a01b03811681146200054157600080fd5b6000821982111562000afa5762000afa62000b65565b500190565b60008262000b115762000b1162000b7b565b500490565b60008282101562000b2b5762000b2b62000b65565b500390565b600060001982141562000b475762000b4762000b65565b5060010190565b60008262000b605762000b6062000b7b565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6133be8062000bb76000396000f3fe6080604052600436106103795760003560e01c8063715018a6116101d1578063aacebbe311610102578063d8c6404b116100a0578063ecfca8991161006f578063ecfca89914610a6d578063f2fde38b14610a83578063f887ea4014610aa3578063fd69c21514610ac357600080fd5b8063d8c6404b146109d7578063dd62ed3e146109f1578063e01af92c14610a37578063e2f4560514610a5757600080fd5b8063bbf1af95116100dc578063bbf1af9514610961578063cbf7e88814610981578063cccc205214610997578063d4cdeb3c146109b757600080fd5b8063aacebbe31461090b578063b225d4b71461092b578063bbde77c11461094b57600080fd5b80638c0b5e221161016f57806395d89b411161014957806395d89b411461087a578063a457c2d7146108ab578063a8aa1b31146108cb578063a9059cbb146108eb57600080fd5b80638c0b5e22146108265780638da5cb5b1461083c57806391053d941461085a57600080fd5b80637b208769116101ab5780637b208769146107975780637d8dbe24146107b7578063872f5969146107d757806388f82020146107ed57600080fd5b8063715018a61461073457806375f0a8741461074957806379c4903c1461078157600080fd5b80633e65d4aa116102ab578063589d89dc116102495780636b67c4df116102235780636b67c4df146106c65780636ddd1713146106dc578063704ce43e146106fe57806370a082311461071457600080fd5b8063589d89dc1461067a5780636612e66f14610690578063690c22ca146106b057600080fd5b80634549b039116102855780634549b039146105e1578063455a43961461060157806352390c02146106215780635342acb41461064157600080fd5b80633e65d4aa1461058757806342966c68146105a7578063450dde46146105c757600080fd5b80631cdd3be3116103185780632d838119116102f25780632d8381191461050b578063313ce5671461052b5780633685d41914610547578063395093511461056757600080fd5b80631cdd3be31461049b57806322429085146104cb57806323b872dd146104eb57600080fd5b806309c58fcd1161035457806309c58fcd1461041c5780631264c9c41461043b57806318160ddd1461045b5780631c65183e1461048557600080fd5b8062e6be7b1461038557806306fdde03146103a7578063095ea7b3146103ec57600080fd5b3661038057005b600080fd5b34801561039157600080fd5b506103a56103a0366004612f2e565b610ae3565b005b3480156103b357600080fd5b5060408051808201909152600a8152692922a210222920a3a7a760b11b60208201525b6040516103e39190613138565b60405180910390f35b3480156103f857600080fd5b5061040c610407366004612f68565b610bdd565b60405190151581526020016103e3565b34801561042857600080fd5b5060095461040c90610100900460ff1681565b34801561044757600080fd5b506103a5610456366004613043565b610bf4565b34801561046757600080fd5b506c0c9f2c9cd04674edea400000005b6040519081526020016103e3565b34801561049157600080fd5b5061047760135481565b3480156104a757600080fd5b5061040c6104b6366004612f2e565b601a6020526000908152604090205460ff1681565b3480156104d757600080fd5b506103a56104e636600461309a565b610c38565b3480156104f757600080fd5b5061040c610506366004612fcd565b610ced565b34801561051757600080fd5b5061047761052636600461305e565b610d56565b34801561053757600080fd5b50604051601281526020016103e3565b34801561055357600080fd5b506103a5610562366004612f2e565b610dda565b34801561057357600080fd5b5061040c610582366004612f68565b610f91565b34801561059357600080fd5b506103a56105a2366004612f2e565b610fc7565b3480156105b357600080fd5b506103a56105c236600461305e565b6110e7565b3480156105d357600080fd5b5060095461040c9060ff1681565b3480156105ed57600080fd5b506104776105fc366004613077565b611320565b34801561060d57600080fd5b506103a561061c36600461300e565b6113c1565b34801561062d57600080fd5b506103a561063c366004612f2e565b611416565b34801561064d57600080fd5b5061040c61065c366004612f2e565b6001600160a01b03166000908152601b602052604090205460ff1690565b34801561068657600080fd5b5061047760065481565b34801561069c57600080fd5b506103a56106ab36600461300e565b6114b5565b3480156106bc57600080fd5b50610477600d5481565b3480156106d257600080fd5b50610477600e5481565b3480156106e857600080fd5b5060095461040c90640100000000900460ff1681565b34801561070a57600080fd5b5061047760105481565b34801561072057600080fd5b5061047761072f366004612f2e565b61150a565b34801561074057600080fd5b506103a5611569565b34801561075557600080fd5b50600354610769906001600160a01b031681565b6040516001600160a01b0390911681526020016103e3565b34801561078d57600080fd5b5061047760125481565b3480156107a357600080fd5b50600454610769906001600160a01b031681565b3480156107c357600080fd5b506103a56107d236600461305e565b6115dd565b3480156107e357600080fd5b50610477600c5481565b3480156107f957600080fd5b5061040c610808366004612f2e565b6001600160a01b03166000908152601c602052604090205460ff1690565b34801561083257600080fd5b5061047760075481565b34801561084857600080fd5b506000546001600160a01b0316610769565b34801561086657600080fd5b506103a561087536600461305e565b61161f565b34801561088657600080fd5b50604080518082019091526008815267121053939250905360c21b60208201526103d6565b3480156108b757600080fd5b5061040c6108c6366004612f68565b611661565b3480156108d757600080fd5b50601654610769906001600160a01b031681565b3480156108f757600080fd5b5061040c610906366004612f68565b6116b0565b34801561091757600080fd5b506103a5610926366004612f2e565b6116bd565b34801561093757600080fd5b506103a561094636600461305e565b6117df565b34801561095757600080fd5b5061047760085481565b34801561096d57600080fd5b506103a561097c366004613043565b611821565b34801561098d57600080fd5b5061047760145481565b3480156109a357600080fd5b506103a56109b236600461309a565b611875565b3480156109c357600080fd5b5060095461040c9062010000900460ff1681565b3480156109e357600080fd5b50600b5461040c9060ff1681565b3480156109fd57600080fd5b50610477610a0c366004612f94565b6001600160a01b03918216600090815260196020908152604080832093909416825291909152205490565b348015610a4357600080fd5b506103a5610a52366004613043565b61191c565b348015610a6357600080fd5b50610477600a5481565b348015610a7957600080fd5b50610477600f5481565b348015610a8f57600080fd5b506103a5610a9e366004612f2e565b611966565b348015610aaf57600080fd5b50601554610769906001600160a01b031681565b348015610acf57600080fd5b506103a5610ade366004612f68565b611a50565b6000546001600160a01b03163314610b165760405162461bcd60e51b8152600401610b0d906131cf565b60405180910390fd5b6015546001600160a01b0382811691161415610b805760405162461bcd60e51b815260206004820152602360248201527f54686520726f7574657220616c7265616479206861732074686174206164647260448201526265737360e81b6064820152608401610b0d565b6015546040516001600160a01b03918216918316907fc4382ee892d64a85fffb798adefd9dd8fcdeb2b1ababe74b46cdae7fe88da4e090600090a3601580546001600160a01b0319166001600160a01b0392909216919091179055565b6000610bea338484611c3b565b5060015b92915050565b6000546001600160a01b03163314610c1e5760405162461bcd60e51b8152600401610b0d906131cf565b600980549115156101000261ff0019909216919091179055565b6000546001600160a01b03163314610c625760405162461bcd60e51b8152600401610b0d906131cf565b610c7681610c708585611b25565b90611b25565b601181905560641015610cdf5760405162461bcd60e51b815260206004820152602b60248201527f546f74616c20466565732063616e6e6f7420626520677265617465722074686160448201526a6e2031302520283130302960a81b6064820152608401610b0d565b600e92909255600f55601055565b6000610cfa848484611d6f565b610d4c8433610d478560405180606001604052806028815260200161333c602891396001600160a01b038a166000908152601960209081526040808320338452909152902054919061223f565b611c3b565b5060019392505050565b6000600554821115610dbd5760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b6064820152608401610b0d565b6000610dc7612276565b9050610dd38382611b84565b9392505050565b6000546001600160a01b03163314610e045760405162461bcd60e51b8152600401610b0d906131cf565b6001600160a01b0381166000908152601c602052604090205460ff16610e6c5760405162461bcd60e51b815260206004820152601760248201527f4163636f756e74206973206e6f74206578636c756465640000000000000000006044820152606401610b0d565b60005b601d54811015610f8d57816001600160a01b0316601d8281548110610e9657610e96613310565b6000918252602090912001546001600160a01b03161415610f7b57601d8054610ec1906001906132b2565b81548110610ed157610ed1613310565b600091825260209091200154601d80546001600160a01b039092169183908110610efd57610efd613310565b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152601882526040808220829055601c90925220805460ff19169055601d805480610f5557610f556132fa565b600082815260209020810160001990810180546001600160a01b03191690550190555050565b80610f85816132c9565b915050610e6f565b5050565b3360008181526019602090815260408083206001600160a01b03871684529091528120549091610bea918590610d479086611b25565b6000546001600160a01b03163314610ff15760405162461bcd60e51b8152600401610b0d906131cf565b806001600160a01b0381166110185760405162461bcd60e51b8152600401610b0d9061318d565b6004546001600160a01b03838116911614156110895760405162461bcd60e51b815260206004820152602a60248201527f54686520436861726974792077616c6c657420697320616c72656164792074686044820152696973206164647265737360b01b6064820152608401610b0d565b6004546040516001600160a01b03918216918416907fc20073d1c4443096c55d22a3812db7261aa6911634e1a0850f068d0c9923402d90600090a350600480546001600160a01b0319166001600160a01b0392909216919091179055565b6002600154141561113a5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b0d565b600260015533806111975760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610b0d565b6002546001600160a01b03828116911614156111ff5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865206275726e206164647265736044820152607360f81b6064820152608401610b0d565b600061120a8261150a565b9050828110156112675760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610b0d565b600061127b611274612276565b8590612299565b6001600160a01b0384166000908152601760205260409020549091506112a19082611bdf565b6001600160a01b038416600090815260176020908152604080832093909355601c9052205460ff161561130b576001600160a01b0383166000908152601860205260409020546112f19085611bdf565b6001600160a01b0384166000908152601860205260409020555b611316838583612318565b5050600180555050565b60006c0c9f2c9cd04674edea4000000083111561137f5760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e74206d757374206265206c657373207468616e20737570706c79006044820152606401610b0d565b6000826113a25760006113938560006123fa565b50929550610bee945050505050565b5060115460006113b285836123fa565b50919550610bee945050505050565b6000546001600160a01b031633146113eb5760405162461bcd60e51b8152600401610b0d906131cf565b6001600160a01b03919091166000908152601a60205260409020805460ff1916911515919091179055565b6000546001600160a01b031633146114405760405162461bcd60e51b8152600401610b0d906131cf565b6001600160a01b0381166000908152601c602052604090205460ff16156114a95760405162461bcd60e51b815260206004820152601760248201527f4163636f756e74206973206e6f7420696e636c756465640000000000000000006044820152606401610b0d565b6114b281612470565b50565b6000546001600160a01b031633146114df5760405162461bcd60e51b8152600401610b0d906131cf565b6001600160a01b03919091166000908152601b60205260409020805460ff1916911515919091179055565b6001600160a01b0381166000908152601c602052604081205460ff161561154757506001600160a01b031660009081526018602052604090205490565b6001600160a01b038216600090815260176020526040902054610bee90610d56565b6000546001600160a01b031633146115935760405162461bcd60e51b8152600401610b0d906131cf565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b031633146116075760405162461bcd60e51b8152600401610b0d906131cf565b61161981670de0b6b3a7640000613293565b60075550565b6000546001600160a01b031633146116495760405162461bcd60e51b8152600401610b0d906131cf565b61165b81670de0b6b3a7640000613293565b60085550565b6000610bea3384610d4785604051806060016040528060258152602001613364602591393360009081526019602090815260408083206001600160a01b038d168452909152902054919061223f565b6000610bea338484611d6f565b6000546001600160a01b031633146116e75760405162461bcd60e51b8152600401610b0d906131cf565b806001600160a01b03811661170e5760405162461bcd60e51b8152600401610b0d9061318d565b6003546001600160a01b03838116911614156117815760405162461bcd60e51b815260206004820152602c60248201527f546865204d61726b6574696e672077616c6c657420697320616c72656164792060448201526b74686973206164647265737360a01b6064820152608401610b0d565b6003546040516001600160a01b03918216918416907f8616c7a330e3cf61290821331585511f1e2778171e2b005fb5ec60cfe874dc6790600090a350600380546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146118095760405162461bcd60e51b8152600401610b0d906131cf565b61181b81670de0b6b3a7640000613293565b600a5550565b6000546001600160a01b0316331461184b5760405162461bcd60e51b8152600401610b0d906131cf565b600b805460ff191682151590811790915560ff16156114b25761186f42603c613259565b600d5550565b6000546001600160a01b0316331461189f5760405162461bcd60e51b8152600401610b0d906131cf565b60006118af82610c708686611b25565b9050806103e81461190d5760405162461bcd60e51b815260206004820152602260248201527f546f74616c206d75737420626520657175616c20746f20313030302028313030604482015261252960f01b6064820152608401610b0d565b50601292909255601355601455565b6000546001600160a01b031633146119465760405162461bcd60e51b8152600401610b0d906131cf565b600980549115156401000000000264ff0000000019909216919091179055565b6000546001600160a01b031633146119905760405162461bcd60e51b8152600401610b0d906131cf565b6001600160a01b0381166119f55760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b0d565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314611a7a5760405162461bcd60e51b8152600401610b0d906131cf565b6001600160a01b038216611aea5760405162461bcd60e51b815260206004820152603160248201527f43616e6e6f7420776974686472617720746865204554482062616c616e636520604482015270746f2061207a65726f206164647265737360781b6064820152608401610b0d565b6040516001600160a01b0383169082156108fc029083906000818181858888f19350505050158015611b20573d6000803e3d6000fd5b505050565b600080611b328385613259565b905083811015610dd35760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610b0d565b6000808211611bd55760405162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f0000000000006044820152606401610b0d565b610dd38284613271565b600082821115611c315760405162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f7700006044820152606401610b0d565b610dd382846132b2565b6001600160a01b038316611ca55760405162461bcd60e51b815260206004820152602b60248201527f42617365526669546f6b656e3a20617070726f76652066726f6d20746865207a60448201526a65726f206164647265737360a81b6064820152608401610b0d565b6001600160a01b038216611d0d5760405162461bcd60e51b815260206004820152602960248201527f42617365526669546f6b656e3a20617070726f766520746f20746865207a65726044820152686f206164647265737360b81b6064820152608401610b0d565b6001600160a01b0383811660008181526019602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b038316611dd35760405162461bcd60e51b815260206004820152602560248201527f546f6b656e3a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610b0d565b6001600160a01b038216611e355760405162461bcd60e51b815260206004820152602360248201527f546f6b656e3a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610b0d565b6002546001600160a01b0384811691161415611ea15760405162461bcd60e51b815260206004820152602560248201527f546f6b656e3a207472616e736665722066726f6d20746865206275726e206164604482015264647265737360d81b6064820152608401610b0d565b60008111611f035760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b6064820152608401610b0d565b600954610100900460ff16611f805760405162461bcd60e51b815260206004820152603860248201527f54686973206163636f756e742063616e6e6f742073656e6420746f6b656e732060448201527f756e74696c2074726164696e6720697320656e61626c656400000000000000006064820152608401610b0d565b6001600160a01b0383166000908152601a602052604090205460ff16158015611fc257506001600160a01b0382166000908152601a602052604090205460ff16155b6120045760405162461bcd60e51b8152602060048201526013602482015272426c61636b6c6973746564206164647265737360681b6044820152606401610b0d565b6015546001600160a01b0384811691161480159061203b57506001600160a01b0382166000908152601b602052604090205460ff16155b801561206057506001600160a01b0383166000908152601b602052604090205460ff16155b156120d3576007548111156120d35760405162461bcd60e51b815260206004820152603360248201527f5472616e7366657220616d6f756e74206578636565647320746865204d6178206044820152722a3930b739b0b1ba34b7b71020b6b7bab73a1760691b6064820152608401610b0d565b60006008541180156120fe57506001600160a01b0382166000908152601b602052604090205460ff16155b801561212357506001600160a01b0383166000908152601b602052604090205460ff16155b801561213d57506016546001600160a01b03838116911614155b156121c357600061214d8361150a565b60085490915061215d8383613259565b11156121c15760405162461bcd60e51b815260206004820152602d60248201527f4e65772062616c616e636520776f756c642065786365656420746865206d617860448201526c57616c6c657442616c616e636560981b6064820152608401610b0d565b505b60095460ff8082169162010000900416156121dc575060005b6001600160a01b0384166000908152601b602052604090205460ff168061221b57506001600160a01b0383166000908152601b602052604090205460ff165b15612224575060005b61222d83612530565b612239848484846125cd565b50505050565b600081848411156122635760405162461bcd60e51b8152600401610b0d9190613138565b5061226e83856132b2565b949350505050565b6000806000612283612646565b90925090506122928282611b84565b9250505090565b6000826122a857506000610bee565b60006122b48385613293565b9050826122c18583613271565b14610dd35760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610b0d565b6002546001600160a01b031660009081526017602052604090205461233d9082611b25565b600280546001600160a01b0390811660009081526017602090815260408083209590955592549091168152601c909152205460ff16156123b8576002546001600160a01b031660009081526018602052604090205461239c9083611b25565b6002546001600160a01b03166000908152601860205260409020555b6002546040518381526001600160a01b03918216918516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001611d62565b600080808080806124176103e86124118a8a612299565b90611b84565b905060006124258983611bdf565b90506000612431612276565b9050600061243f8b83612299565b9050600061244d8584612299565b9050600061245b8383611bdf565b929d929c9b5093995091975095505050505050565b6001600160a01b038116600090815260176020526040902054156124ca576001600160a01b0381166000908152601760205260409020546124b090610d56565b6001600160a01b0382166000908152601860205260409020555b6001600160a01b03166000818152601c60205260408120805460ff19166001908117909155601d805491820181559091527f6d4407e7be21f808e6509aa9fa9143369579dd7d760fe20a2c09680fc146134f0180546001600160a01b0319169091179055565b60095462010000900460ff166114b257600061254b3061150a565b600a54600954919250821015906301000000900460ff1615801561256c5750805b80156125825750600954640100000000900460ff165b801561259b57506016546001600160a01b038481169116145b15611b20576009805463ff000000191663010000001790556125bb6127fb565b6009805463ff00000019169055505050565b601154600b5460ff1680156125e45750600d544211155b6125ee57806125f2565b600c545b6016549091506001600160a01b0386811691161480159061262157506016546001600160a01b03858116911614155b1561262a575060005b81612633575060005b61263f8585858461294a565b5050505050565b60055460009081906c0c9f2c9cd04674edea40000000825b601d548110156127ad578260176000601d848154811061268057612680613310565b60009182526020808320909101546001600160a01b0316835282019290925260400190205411806126eb57508160186000601d84815481106126c4576126c4613310565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b1561270b575050600554936c0c9f2c9cd04674edea400000009350915050565b61275160176000601d848154811061272557612725613310565b60009182526020808320909101546001600160a01b031683528201929092526040019020548490611bdf565b925061279960186000601d848154811061276d5761276d613310565b60009182526020808320909101546001600160a01b031683528201929092526040019020548390611bdf565b9150806127a5816132c9565b91505061265e565b508015806127d357506005546127d0906c0c9f2c9cd04674edea40000000611b84565b82105b156127f2575050600554926c0c9f2c9cd04674edea4000000092509050565b90939092509050565b6002600154141561284e5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b0d565b600260018190556014546000916128659190611b84565b905060006128826103e86124118461287c3061150a565b90612299565b90506000612899826128933061150a565b90611bdf565b9050476128a5826129d7565b60006128b14783611bdf565b905060006128d06103e86124116012548561229990919063ffffffff16565b905060006128ef6103e86124116013548661229990919063ffffffff16565b905060006129036103e8612411868b612299565b60035490915061291c906001600160a01b031684612b79565b600454612932906001600160a01b031683612b79565b61293c8782612be1565b505060018055505050505050565b600080600080600061295c87876123fa565b94509450945094509450612974898987878787612d14565b61297f878288612e3d565b876001600160a01b0316896001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516129c491815260200190565b60405180910390a3505050505050505050565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110612a0c57612a0c613310565b6001600160a01b03928316602091820292909201810191909152601554604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b158015612a6057600080fd5b505afa158015612a74573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a989190612f4b565b81600181518110612aab57612aab613310565b6001600160a01b039283166020918202929092010152601554612ad19130911684611c3b565b60155460405163791ac94760e01b81526001600160a01b039091169063791ac94790612b0a90859060009086903090429060040161321d565b600060405180830381600087803b158015612b2457600080fd5b505af1158015612b38573d6000803e3d6000fd5b505050507f32cde87eb454f3a0b875ab23547023107cfad454363ec88ba5695e2c24aa52a78282604051612b6d929190613204565b60405180910390a15050565b6001600160a01b038216611aea5760405162461bcd60e51b815260206004820152602960248201527f43616e6e6f74207472616e73666572207468652045544820746f2061207a65726044820152686f206164647265737360b81b6064820152608401610b0d565b601554612bf99030906001600160a01b031684611c3b565b601554600090819081906001600160a01b031663f305d7198530888580612c286000546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c4016060604051808303818588803b158015612c8b57600080fd5b505af1158015612c9f573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612cc491906130c6565b604080518481526020810184905290810182905292955090935091507fd7f28048575eead8851d024ead087913957dfb4fd1a02b4d1573f5352a5a2be39060600160405180910390a15050505050565b6001600160a01b038616600090815260176020526040902054612d379085611bdf565b6001600160a01b038088166000908152601760205260408082209390935590871681522054612d669084611b25565b6001600160a01b038087166000908152601760209081526040808320949094559189168152601c909152205460ff1615612dd7576001600160a01b038616600090815260186020526040902054612dbd9083611bdf565b6001600160a01b0387166000908152601860205260409020555b6001600160a01b0385166000908152601c602052604090205460ff1615612e35576001600160a01b038516600090815260186020526040902054612e1b9082611b25565b6001600160a01b0386166000908152601860205260409020555b505050505050565b600081118015612e56575060095462010000900460ff16155b15611b2057611b20838383306000612e746103e86124118786612299565b90506000612e828286612299565b6001600160a01b038416600090815260176020526040902054909150612ea89082611b25565b6001600160a01b038416600090815260176020908152604080832093909355601c9052205460ff1615612e35576001600160a01b038316600090815260186020526040902054612ef89083611b25565b6001600160a01b038416600090815260186020526040902055505050505050565b80358015158114612f2957600080fd5b919050565b600060208284031215612f4057600080fd5b8135610dd381613326565b600060208284031215612f5d57600080fd5b8151610dd381613326565b60008060408385031215612f7b57600080fd5b8235612f8681613326565b946020939093013593505050565b60008060408385031215612fa757600080fd5b8235612fb281613326565b91506020830135612fc281613326565b809150509250929050565b600080600060608486031215612fe257600080fd5b8335612fed81613326565b92506020840135612ffd81613326565b929592945050506040919091013590565b6000806040838503121561302157600080fd5b823561302c81613326565b915061303a60208401612f19565b90509250929050565b60006020828403121561305557600080fd5b610dd382612f19565b60006020828403121561307057600080fd5b5035919050565b6000806040838503121561308a57600080fd5b8235915061303a60208401612f19565b6000806000606084860312156130af57600080fd5b505081359360208301359350604090920135919050565b6000806000606084860312156130db57600080fd5b8351925060208401519150604084015190509250925092565b600081518084526020808501945080840160005b8381101561312d5781516001600160a01b031687529582019590820190600101613108565b509495945050505050565b600060208083528351808285015260005b8181101561316557858101830151858201604001528201613149565b81811115613177576000604083870101525b50601f01601f1916929092016040019392505050565b60208082526022908201527f416464726573732063616e6e6f7420626520746865207a65726f206164647265604082015261737360f01b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b82815260406020820152600061226e60408301846130f4565b85815284602082015260a06040820152600061323c60a08301866130f4565b6001600160a01b0394909416606083015250608001529392505050565b6000821982111561326c5761326c6132e4565b500190565b60008261328e57634e487b7160e01b600052601260045260246000fd5b500490565b60008160001904831182151516156132ad576132ad6132e4565b500290565b6000828210156132c4576132c46132e4565b500390565b60006000198214156132dd576132dd6132e4565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6001600160a01b03811681146114b257600080fdfe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212206fbb60b012b2d8a292c237bd83ea374ca1a5239a87f92c4ddc4964c8b5a9cf4664736f6c63430008060033
Deployed Bytecode
0x6080604052600436106103795760003560e01c8063715018a6116101d1578063aacebbe311610102578063d8c6404b116100a0578063ecfca8991161006f578063ecfca89914610a6d578063f2fde38b14610a83578063f887ea4014610aa3578063fd69c21514610ac357600080fd5b8063d8c6404b146109d7578063dd62ed3e146109f1578063e01af92c14610a37578063e2f4560514610a5757600080fd5b8063bbf1af95116100dc578063bbf1af9514610961578063cbf7e88814610981578063cccc205214610997578063d4cdeb3c146109b757600080fd5b8063aacebbe31461090b578063b225d4b71461092b578063bbde77c11461094b57600080fd5b80638c0b5e221161016f57806395d89b411161014957806395d89b411461087a578063a457c2d7146108ab578063a8aa1b31146108cb578063a9059cbb146108eb57600080fd5b80638c0b5e22146108265780638da5cb5b1461083c57806391053d941461085a57600080fd5b80637b208769116101ab5780637b208769146107975780637d8dbe24146107b7578063872f5969146107d757806388f82020146107ed57600080fd5b8063715018a61461073457806375f0a8741461074957806379c4903c1461078157600080fd5b80633e65d4aa116102ab578063589d89dc116102495780636b67c4df116102235780636b67c4df146106c65780636ddd1713146106dc578063704ce43e146106fe57806370a082311461071457600080fd5b8063589d89dc1461067a5780636612e66f14610690578063690c22ca146106b057600080fd5b80634549b039116102855780634549b039146105e1578063455a43961461060157806352390c02146106215780635342acb41461064157600080fd5b80633e65d4aa1461058757806342966c68146105a7578063450dde46146105c757600080fd5b80631cdd3be3116103185780632d838119116102f25780632d8381191461050b578063313ce5671461052b5780633685d41914610547578063395093511461056757600080fd5b80631cdd3be31461049b57806322429085146104cb57806323b872dd146104eb57600080fd5b806309c58fcd1161035457806309c58fcd1461041c5780631264c9c41461043b57806318160ddd1461045b5780631c65183e1461048557600080fd5b8062e6be7b1461038557806306fdde03146103a7578063095ea7b3146103ec57600080fd5b3661038057005b600080fd5b34801561039157600080fd5b506103a56103a0366004612f2e565b610ae3565b005b3480156103b357600080fd5b5060408051808201909152600a8152692922a210222920a3a7a760b11b60208201525b6040516103e39190613138565b60405180910390f35b3480156103f857600080fd5b5061040c610407366004612f68565b610bdd565b60405190151581526020016103e3565b34801561042857600080fd5b5060095461040c90610100900460ff1681565b34801561044757600080fd5b506103a5610456366004613043565b610bf4565b34801561046757600080fd5b506c0c9f2c9cd04674edea400000005b6040519081526020016103e3565b34801561049157600080fd5b5061047760135481565b3480156104a757600080fd5b5061040c6104b6366004612f2e565b601a6020526000908152604090205460ff1681565b3480156104d757600080fd5b506103a56104e636600461309a565b610c38565b3480156104f757600080fd5b5061040c610506366004612fcd565b610ced565b34801561051757600080fd5b5061047761052636600461305e565b610d56565b34801561053757600080fd5b50604051601281526020016103e3565b34801561055357600080fd5b506103a5610562366004612f2e565b610dda565b34801561057357600080fd5b5061040c610582366004612f68565b610f91565b34801561059357600080fd5b506103a56105a2366004612f2e565b610fc7565b3480156105b357600080fd5b506103a56105c236600461305e565b6110e7565b3480156105d357600080fd5b5060095461040c9060ff1681565b3480156105ed57600080fd5b506104776105fc366004613077565b611320565b34801561060d57600080fd5b506103a561061c36600461300e565b6113c1565b34801561062d57600080fd5b506103a561063c366004612f2e565b611416565b34801561064d57600080fd5b5061040c61065c366004612f2e565b6001600160a01b03166000908152601b602052604090205460ff1690565b34801561068657600080fd5b5061047760065481565b34801561069c57600080fd5b506103a56106ab36600461300e565b6114b5565b3480156106bc57600080fd5b50610477600d5481565b3480156106d257600080fd5b50610477600e5481565b3480156106e857600080fd5b5060095461040c90640100000000900460ff1681565b34801561070a57600080fd5b5061047760105481565b34801561072057600080fd5b5061047761072f366004612f2e565b61150a565b34801561074057600080fd5b506103a5611569565b34801561075557600080fd5b50600354610769906001600160a01b031681565b6040516001600160a01b0390911681526020016103e3565b34801561078d57600080fd5b5061047760125481565b3480156107a357600080fd5b50600454610769906001600160a01b031681565b3480156107c357600080fd5b506103a56107d236600461305e565b6115dd565b3480156107e357600080fd5b50610477600c5481565b3480156107f957600080fd5b5061040c610808366004612f2e565b6001600160a01b03166000908152601c602052604090205460ff1690565b34801561083257600080fd5b5061047760075481565b34801561084857600080fd5b506000546001600160a01b0316610769565b34801561086657600080fd5b506103a561087536600461305e565b61161f565b34801561088657600080fd5b50604080518082019091526008815267121053939250905360c21b60208201526103d6565b3480156108b757600080fd5b5061040c6108c6366004612f68565b611661565b3480156108d757600080fd5b50601654610769906001600160a01b031681565b3480156108f757600080fd5b5061040c610906366004612f68565b6116b0565b34801561091757600080fd5b506103a5610926366004612f2e565b6116bd565b34801561093757600080fd5b506103a561094636600461305e565b6117df565b34801561095757600080fd5b5061047760085481565b34801561096d57600080fd5b506103a561097c366004613043565b611821565b34801561098d57600080fd5b5061047760145481565b3480156109a357600080fd5b506103a56109b236600461309a565b611875565b3480156109c357600080fd5b5060095461040c9062010000900460ff1681565b3480156109e357600080fd5b50600b5461040c9060ff1681565b3480156109fd57600080fd5b50610477610a0c366004612f94565b6001600160a01b03918216600090815260196020908152604080832093909416825291909152205490565b348015610a4357600080fd5b506103a5610a52366004613043565b61191c565b348015610a6357600080fd5b50610477600a5481565b348015610a7957600080fd5b50610477600f5481565b348015610a8f57600080fd5b506103a5610a9e366004612f2e565b611966565b348015610aaf57600080fd5b50601554610769906001600160a01b031681565b348015610acf57600080fd5b506103a5610ade366004612f68565b611a50565b6000546001600160a01b03163314610b165760405162461bcd60e51b8152600401610b0d906131cf565b60405180910390fd5b6015546001600160a01b0382811691161415610b805760405162461bcd60e51b815260206004820152602360248201527f54686520726f7574657220616c7265616479206861732074686174206164647260448201526265737360e81b6064820152608401610b0d565b6015546040516001600160a01b03918216918316907fc4382ee892d64a85fffb798adefd9dd8fcdeb2b1ababe74b46cdae7fe88da4e090600090a3601580546001600160a01b0319166001600160a01b0392909216919091179055565b6000610bea338484611c3b565b5060015b92915050565b6000546001600160a01b03163314610c1e5760405162461bcd60e51b8152600401610b0d906131cf565b600980549115156101000261ff0019909216919091179055565b6000546001600160a01b03163314610c625760405162461bcd60e51b8152600401610b0d906131cf565b610c7681610c708585611b25565b90611b25565b601181905560641015610cdf5760405162461bcd60e51b815260206004820152602b60248201527f546f74616c20466565732063616e6e6f7420626520677265617465722074686160448201526a6e2031302520283130302960a81b6064820152608401610b0d565b600e92909255600f55601055565b6000610cfa848484611d6f565b610d4c8433610d478560405180606001604052806028815260200161333c602891396001600160a01b038a166000908152601960209081526040808320338452909152902054919061223f565b611c3b565b5060019392505050565b6000600554821115610dbd5760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b6064820152608401610b0d565b6000610dc7612276565b9050610dd38382611b84565b9392505050565b6000546001600160a01b03163314610e045760405162461bcd60e51b8152600401610b0d906131cf565b6001600160a01b0381166000908152601c602052604090205460ff16610e6c5760405162461bcd60e51b815260206004820152601760248201527f4163636f756e74206973206e6f74206578636c756465640000000000000000006044820152606401610b0d565b60005b601d54811015610f8d57816001600160a01b0316601d8281548110610e9657610e96613310565b6000918252602090912001546001600160a01b03161415610f7b57601d8054610ec1906001906132b2565b81548110610ed157610ed1613310565b600091825260209091200154601d80546001600160a01b039092169183908110610efd57610efd613310565b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152601882526040808220829055601c90925220805460ff19169055601d805480610f5557610f556132fa565b600082815260209020810160001990810180546001600160a01b03191690550190555050565b80610f85816132c9565b915050610e6f565b5050565b3360008181526019602090815260408083206001600160a01b03871684529091528120549091610bea918590610d479086611b25565b6000546001600160a01b03163314610ff15760405162461bcd60e51b8152600401610b0d906131cf565b806001600160a01b0381166110185760405162461bcd60e51b8152600401610b0d9061318d565b6004546001600160a01b03838116911614156110895760405162461bcd60e51b815260206004820152602a60248201527f54686520436861726974792077616c6c657420697320616c72656164792074686044820152696973206164647265737360b01b6064820152608401610b0d565b6004546040516001600160a01b03918216918416907fc20073d1c4443096c55d22a3812db7261aa6911634e1a0850f068d0c9923402d90600090a350600480546001600160a01b0319166001600160a01b0392909216919091179055565b6002600154141561113a5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b0d565b600260015533806111975760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610b0d565b6002546001600160a01b03828116911614156111ff5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865206275726e206164647265736044820152607360f81b6064820152608401610b0d565b600061120a8261150a565b9050828110156112675760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610b0d565b600061127b611274612276565b8590612299565b6001600160a01b0384166000908152601760205260409020549091506112a19082611bdf565b6001600160a01b038416600090815260176020908152604080832093909355601c9052205460ff161561130b576001600160a01b0383166000908152601860205260409020546112f19085611bdf565b6001600160a01b0384166000908152601860205260409020555b611316838583612318565b5050600180555050565b60006c0c9f2c9cd04674edea4000000083111561137f5760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e74206d757374206265206c657373207468616e20737570706c79006044820152606401610b0d565b6000826113a25760006113938560006123fa565b50929550610bee945050505050565b5060115460006113b285836123fa565b50919550610bee945050505050565b6000546001600160a01b031633146113eb5760405162461bcd60e51b8152600401610b0d906131cf565b6001600160a01b03919091166000908152601a60205260409020805460ff1916911515919091179055565b6000546001600160a01b031633146114405760405162461bcd60e51b8152600401610b0d906131cf565b6001600160a01b0381166000908152601c602052604090205460ff16156114a95760405162461bcd60e51b815260206004820152601760248201527f4163636f756e74206973206e6f7420696e636c756465640000000000000000006044820152606401610b0d565b6114b281612470565b50565b6000546001600160a01b031633146114df5760405162461bcd60e51b8152600401610b0d906131cf565b6001600160a01b03919091166000908152601b60205260409020805460ff1916911515919091179055565b6001600160a01b0381166000908152601c602052604081205460ff161561154757506001600160a01b031660009081526018602052604090205490565b6001600160a01b038216600090815260176020526040902054610bee90610d56565b6000546001600160a01b031633146115935760405162461bcd60e51b8152600401610b0d906131cf565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b031633146116075760405162461bcd60e51b8152600401610b0d906131cf565b61161981670de0b6b3a7640000613293565b60075550565b6000546001600160a01b031633146116495760405162461bcd60e51b8152600401610b0d906131cf565b61165b81670de0b6b3a7640000613293565b60085550565b6000610bea3384610d4785604051806060016040528060258152602001613364602591393360009081526019602090815260408083206001600160a01b038d168452909152902054919061223f565b6000610bea338484611d6f565b6000546001600160a01b031633146116e75760405162461bcd60e51b8152600401610b0d906131cf565b806001600160a01b03811661170e5760405162461bcd60e51b8152600401610b0d9061318d565b6003546001600160a01b03838116911614156117815760405162461bcd60e51b815260206004820152602c60248201527f546865204d61726b6574696e672077616c6c657420697320616c72656164792060448201526b74686973206164647265737360a01b6064820152608401610b0d565b6003546040516001600160a01b03918216918416907f8616c7a330e3cf61290821331585511f1e2778171e2b005fb5ec60cfe874dc6790600090a350600380546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146118095760405162461bcd60e51b8152600401610b0d906131cf565b61181b81670de0b6b3a7640000613293565b600a5550565b6000546001600160a01b0316331461184b5760405162461bcd60e51b8152600401610b0d906131cf565b600b805460ff191682151590811790915560ff16156114b25761186f42603c613259565b600d5550565b6000546001600160a01b0316331461189f5760405162461bcd60e51b8152600401610b0d906131cf565b60006118af82610c708686611b25565b9050806103e81461190d5760405162461bcd60e51b815260206004820152602260248201527f546f74616c206d75737420626520657175616c20746f20313030302028313030604482015261252960f01b6064820152608401610b0d565b50601292909255601355601455565b6000546001600160a01b031633146119465760405162461bcd60e51b8152600401610b0d906131cf565b600980549115156401000000000264ff0000000019909216919091179055565b6000546001600160a01b031633146119905760405162461bcd60e51b8152600401610b0d906131cf565b6001600160a01b0381166119f55760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b0d565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314611a7a5760405162461bcd60e51b8152600401610b0d906131cf565b6001600160a01b038216611aea5760405162461bcd60e51b815260206004820152603160248201527f43616e6e6f7420776974686472617720746865204554482062616c616e636520604482015270746f2061207a65726f206164647265737360781b6064820152608401610b0d565b6040516001600160a01b0383169082156108fc029083906000818181858888f19350505050158015611b20573d6000803e3d6000fd5b505050565b600080611b328385613259565b905083811015610dd35760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610b0d565b6000808211611bd55760405162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f0000000000006044820152606401610b0d565b610dd38284613271565b600082821115611c315760405162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f7700006044820152606401610b0d565b610dd382846132b2565b6001600160a01b038316611ca55760405162461bcd60e51b815260206004820152602b60248201527f42617365526669546f6b656e3a20617070726f76652066726f6d20746865207a60448201526a65726f206164647265737360a81b6064820152608401610b0d565b6001600160a01b038216611d0d5760405162461bcd60e51b815260206004820152602960248201527f42617365526669546f6b656e3a20617070726f766520746f20746865207a65726044820152686f206164647265737360b81b6064820152608401610b0d565b6001600160a01b0383811660008181526019602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b038316611dd35760405162461bcd60e51b815260206004820152602560248201527f546f6b656e3a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610b0d565b6001600160a01b038216611e355760405162461bcd60e51b815260206004820152602360248201527f546f6b656e3a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610b0d565b6002546001600160a01b0384811691161415611ea15760405162461bcd60e51b815260206004820152602560248201527f546f6b656e3a207472616e736665722066726f6d20746865206275726e206164604482015264647265737360d81b6064820152608401610b0d565b60008111611f035760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b6064820152608401610b0d565b600954610100900460ff16611f805760405162461bcd60e51b815260206004820152603860248201527f54686973206163636f756e742063616e6e6f742073656e6420746f6b656e732060448201527f756e74696c2074726164696e6720697320656e61626c656400000000000000006064820152608401610b0d565b6001600160a01b0383166000908152601a602052604090205460ff16158015611fc257506001600160a01b0382166000908152601a602052604090205460ff16155b6120045760405162461bcd60e51b8152602060048201526013602482015272426c61636b6c6973746564206164647265737360681b6044820152606401610b0d565b6015546001600160a01b0384811691161480159061203b57506001600160a01b0382166000908152601b602052604090205460ff16155b801561206057506001600160a01b0383166000908152601b602052604090205460ff16155b156120d3576007548111156120d35760405162461bcd60e51b815260206004820152603360248201527f5472616e7366657220616d6f756e74206578636565647320746865204d6178206044820152722a3930b739b0b1ba34b7b71020b6b7bab73a1760691b6064820152608401610b0d565b60006008541180156120fe57506001600160a01b0382166000908152601b602052604090205460ff16155b801561212357506001600160a01b0383166000908152601b602052604090205460ff16155b801561213d57506016546001600160a01b03838116911614155b156121c357600061214d8361150a565b60085490915061215d8383613259565b11156121c15760405162461bcd60e51b815260206004820152602d60248201527f4e65772062616c616e636520776f756c642065786365656420746865206d617860448201526c57616c6c657442616c616e636560981b6064820152608401610b0d565b505b60095460ff8082169162010000900416156121dc575060005b6001600160a01b0384166000908152601b602052604090205460ff168061221b57506001600160a01b0383166000908152601b602052604090205460ff165b15612224575060005b61222d83612530565b612239848484846125cd565b50505050565b600081848411156122635760405162461bcd60e51b8152600401610b0d9190613138565b5061226e83856132b2565b949350505050565b6000806000612283612646565b90925090506122928282611b84565b9250505090565b6000826122a857506000610bee565b60006122b48385613293565b9050826122c18583613271565b14610dd35760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610b0d565b6002546001600160a01b031660009081526017602052604090205461233d9082611b25565b600280546001600160a01b0390811660009081526017602090815260408083209590955592549091168152601c909152205460ff16156123b8576002546001600160a01b031660009081526018602052604090205461239c9083611b25565b6002546001600160a01b03166000908152601860205260409020555b6002546040518381526001600160a01b03918216918516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001611d62565b600080808080806124176103e86124118a8a612299565b90611b84565b905060006124258983611bdf565b90506000612431612276565b9050600061243f8b83612299565b9050600061244d8584612299565b9050600061245b8383611bdf565b929d929c9b5093995091975095505050505050565b6001600160a01b038116600090815260176020526040902054156124ca576001600160a01b0381166000908152601760205260409020546124b090610d56565b6001600160a01b0382166000908152601860205260409020555b6001600160a01b03166000818152601c60205260408120805460ff19166001908117909155601d805491820181559091527f6d4407e7be21f808e6509aa9fa9143369579dd7d760fe20a2c09680fc146134f0180546001600160a01b0319169091179055565b60095462010000900460ff166114b257600061254b3061150a565b600a54600954919250821015906301000000900460ff1615801561256c5750805b80156125825750600954640100000000900460ff165b801561259b57506016546001600160a01b038481169116145b15611b20576009805463ff000000191663010000001790556125bb6127fb565b6009805463ff00000019169055505050565b601154600b5460ff1680156125e45750600d544211155b6125ee57806125f2565b600c545b6016549091506001600160a01b0386811691161480159061262157506016546001600160a01b03858116911614155b1561262a575060005b81612633575060005b61263f8585858461294a565b5050505050565b60055460009081906c0c9f2c9cd04674edea40000000825b601d548110156127ad578260176000601d848154811061268057612680613310565b60009182526020808320909101546001600160a01b0316835282019290925260400190205411806126eb57508160186000601d84815481106126c4576126c4613310565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b1561270b575050600554936c0c9f2c9cd04674edea400000009350915050565b61275160176000601d848154811061272557612725613310565b60009182526020808320909101546001600160a01b031683528201929092526040019020548490611bdf565b925061279960186000601d848154811061276d5761276d613310565b60009182526020808320909101546001600160a01b031683528201929092526040019020548390611bdf565b9150806127a5816132c9565b91505061265e565b508015806127d357506005546127d0906c0c9f2c9cd04674edea40000000611b84565b82105b156127f2575050600554926c0c9f2c9cd04674edea4000000092509050565b90939092509050565b6002600154141561284e5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b0d565b600260018190556014546000916128659190611b84565b905060006128826103e86124118461287c3061150a565b90612299565b90506000612899826128933061150a565b90611bdf565b9050476128a5826129d7565b60006128b14783611bdf565b905060006128d06103e86124116012548561229990919063ffffffff16565b905060006128ef6103e86124116013548661229990919063ffffffff16565b905060006129036103e8612411868b612299565b60035490915061291c906001600160a01b031684612b79565b600454612932906001600160a01b031683612b79565b61293c8782612be1565b505060018055505050505050565b600080600080600061295c87876123fa565b94509450945094509450612974898987878787612d14565b61297f878288612e3d565b876001600160a01b0316896001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516129c491815260200190565b60405180910390a3505050505050505050565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110612a0c57612a0c613310565b6001600160a01b03928316602091820292909201810191909152601554604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b158015612a6057600080fd5b505afa158015612a74573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a989190612f4b565b81600181518110612aab57612aab613310565b6001600160a01b039283166020918202929092010152601554612ad19130911684611c3b565b60155460405163791ac94760e01b81526001600160a01b039091169063791ac94790612b0a90859060009086903090429060040161321d565b600060405180830381600087803b158015612b2457600080fd5b505af1158015612b38573d6000803e3d6000fd5b505050507f32cde87eb454f3a0b875ab23547023107cfad454363ec88ba5695e2c24aa52a78282604051612b6d929190613204565b60405180910390a15050565b6001600160a01b038216611aea5760405162461bcd60e51b815260206004820152602960248201527f43616e6e6f74207472616e73666572207468652045544820746f2061207a65726044820152686f206164647265737360b81b6064820152608401610b0d565b601554612bf99030906001600160a01b031684611c3b565b601554600090819081906001600160a01b031663f305d7198530888580612c286000546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c4016060604051808303818588803b158015612c8b57600080fd5b505af1158015612c9f573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612cc491906130c6565b604080518481526020810184905290810182905292955090935091507fd7f28048575eead8851d024ead087913957dfb4fd1a02b4d1573f5352a5a2be39060600160405180910390a15050505050565b6001600160a01b038616600090815260176020526040902054612d379085611bdf565b6001600160a01b038088166000908152601760205260408082209390935590871681522054612d669084611b25565b6001600160a01b038087166000908152601760209081526040808320949094559189168152601c909152205460ff1615612dd7576001600160a01b038616600090815260186020526040902054612dbd9083611bdf565b6001600160a01b0387166000908152601860205260409020555b6001600160a01b0385166000908152601c602052604090205460ff1615612e35576001600160a01b038516600090815260186020526040902054612e1b9082611b25565b6001600160a01b0386166000908152601860205260409020555b505050505050565b600081118015612e56575060095462010000900460ff16155b15611b2057611b20838383306000612e746103e86124118786612299565b90506000612e828286612299565b6001600160a01b038416600090815260176020526040902054909150612ea89082611b25565b6001600160a01b038416600090815260176020908152604080832093909355601c9052205460ff1615612e35576001600160a01b038316600090815260186020526040902054612ef89083611b25565b6001600160a01b038416600090815260186020526040902055505050505050565b80358015158114612f2957600080fd5b919050565b600060208284031215612f4057600080fd5b8135610dd381613326565b600060208284031215612f5d57600080fd5b8151610dd381613326565b60008060408385031215612f7b57600080fd5b8235612f8681613326565b946020939093013593505050565b60008060408385031215612fa757600080fd5b8235612fb281613326565b91506020830135612fc281613326565b809150509250929050565b600080600060608486031215612fe257600080fd5b8335612fed81613326565b92506020840135612ffd81613326565b929592945050506040919091013590565b6000806040838503121561302157600080fd5b823561302c81613326565b915061303a60208401612f19565b90509250929050565b60006020828403121561305557600080fd5b610dd382612f19565b60006020828403121561307057600080fd5b5035919050565b6000806040838503121561308a57600080fd5b8235915061303a60208401612f19565b6000806000606084860312156130af57600080fd5b505081359360208301359350604090920135919050565b6000806000606084860312156130db57600080fd5b8351925060208401519150604084015190509250925092565b600081518084526020808501945080840160005b8381101561312d5781516001600160a01b031687529582019590820190600101613108565b509495945050505050565b600060208083528351808285015260005b8181101561316557858101830151858201604001528201613149565b81811115613177576000604083870101525b50601f01601f1916929092016040019392505050565b60208082526022908201527f416464726573732063616e6e6f7420626520746865207a65726f206164647265604082015261737360f01b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b82815260406020820152600061226e60408301846130f4565b85815284602082015260a06040820152600061323c60a08301866130f4565b6001600160a01b0394909416606083015250608001529392505050565b6000821982111561326c5761326c6132e4565b500190565b60008261328e57634e487b7160e01b600052601260045260246000fd5b500490565b60008160001904831182151516156132ad576132ad6132e4565b500290565b6000828210156132c4576132c46132e4565b500390565b60006000198214156132dd576132dd6132e4565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6001600160a01b03811681146114b257600080fdfe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212206fbb60b012b2d8a292c237bd83ea374ca1a5239a87f92c4ddc4964c8b5a9cf4664736f6c63430008060033
Deployed Bytecode Sourcemap
11310:23765:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26862:293;;;;;;;;;;-1:-1:-1;26862:293:0;;;;;:::i;:::-;;:::i;:::-;;15409:94;;;;;;;;;;-1:-1:-1;15490:5:0;;;;;;;;;;;;-1:-1:-1;;;15490:5:0;;;;15409:94;;;;;;;:::i;:::-;;;;;;;;16422:167;;;;;;;;;;-1:-1:-1;16422:167:0;;;;;:::i;:::-;;:::i;:::-;;;5215:14:1;;5208:22;5190:41;;5178:2;5163:18;16422:167:0;5145:92:1;12291:35:0;;;;;;;;;;-1:-1:-1;12291:35:0;;;;;;;;;;;26726:124;;;;;;;;;;-1:-1:-1;26726:124:0;;;;;:::i;:::-;;:::i;15719:102::-;;;;;;;;;;-1:-1:-1;11923:28:0;15719:102;;;18833:25:1;;;18821:2;18806:18;15719:102:0;18788:76:1;12947:41:0;;;;;;;;;;;;;;;;13329:46;;;;;;;;;;-1:-1:-1;13329:46:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;25279:324;;;;;;;;;;-1:-1:-1;25279:324:0;;;;;:::i;:::-;;:::i;16605:318::-;;;;;;;;;;-1:-1:-1;16605:318:0;;;;;:::i;:::-;;:::i;20249:268::-;;;;;;;;;;-1:-1:-1;20249:268:0;;;;;:::i;:::-;;:::i;15617:94::-;;;;;;;;;;-1:-1:-1;15617:94:0;;11818:2;20259:36:1;;20247:2;20232:18;15617:94:0;20214:87:1;21005:499:0;;;;;;;;;;-1:-1:-1;21005:499:0;;;;;:::i;:::-;;:::i;18558:218::-;;;;;;;;;;-1:-1:-1;18558:218:0;;;;;:::i;:::-;;:::i;25943:303::-;;;;;;;;;;-1:-1:-1;25943:303:0;;;;;:::i;:::-;;:::i;16939:776::-;;;;;;;;;;-1:-1:-1;16939:776:0;;;;;:::i;:::-;;:::i;12251:33::-;;;;;;;;;;-1:-1:-1;12251:33:0;;;;;;;;19610:511;;;;;;;;;;-1:-1:-1;19610:511:0;;;;;:::i;:::-;;:::i;24636:123::-;;;;;;;;;;-1:-1:-1;24636:123:0;;;;;:::i;:::-;;:::i;20529:180::-;;;;;;;;;;-1:-1:-1;20529:180:0;;;;;:::i;:::-;;:::i;24497:125::-;;;;;;;;;;-1:-1:-1;24497:125:0;;;;;:::i;:::-;-1:-1:-1;;;;;24586:27:0;24561:4;24586:27;;;:18;:27;;;;;;;;;24497:125;12035:32;;;;;;;;;;;;;;;;21516:132;;;;;;;;;;-1:-1:-1;21516:132:0;;;;;:::i;:::-;;:::i;12595:32::-;;;;;;;;;;;;;;;;12698;;;;;;;;;;;;;;;;12405:30;;;;;;;;;;-1:-1:-1;12405:30:0;;;;;;;;;;;12786:24;;;;;;;;;;;;;;;;15833:225;;;;;;;;;;-1:-1:-1;15833:225:0;;;;;:::i;:::-;;:::i;9320:148::-;;;;;;;;;;;;;:::i;11537:75::-;;;;;;;;;;-1:-1:-1;11537:75:0;;;;-1:-1:-1;;;;;11537:75:0;;;;;;-1:-1:-1;;;;;4394:32:1;;;4376:51;;4364:2;4349:18;11537:75:0;4331:102:1;12890:43:0;;;;;;;;;;;;;;;;11619:73;;;;;;;;;;-1:-1:-1;11619:73:0;;;;-1:-1:-1;;;;;11619:73:0;;;25156:115;;;;;;;;;;-1:-1:-1;25156:115:0;;;;;:::i;:::-;;:::i;12550:31::-;;;;;;;;;;;;;;;;24352:133;;;;;;;;;;-1:-1:-1;24352:133:0;;;;;:::i;:::-;-1:-1:-1;;;;;24446:31:0;24422:4;24446:31;;;:22;:31;;;;;;;;;24352:133;12078:48;;;;;;;;;;;;;;;;9095:79;;;;;;;;;;-1:-1:-1;9133:7:0;9160:6;-1:-1:-1;;;;;9160:6:0;9095:79;;25021:123;;;;;;;;;;-1:-1:-1;25021:123:0;;;;;:::i;:::-;;:::i;15511:98::-;;;;;;;;;;-1:-1:-1;15594:7:0;;;;;;;;;;;;-1:-1:-1;;;15594:7:0;;;;15511:98;;18788:269;;;;;;;;;;-1:-1:-1;18788:269:0;;;;;:::i;:::-;;:::i;13095:19::-;;;;;;;;;;-1:-1:-1;13095:19:0;;;;-1:-1:-1;;;;;13095:19:0;;;16074:172;;;;;;;;;;-1:-1:-1;16074:172:0;;;;;:::i;:::-;;:::i;25616:315::-;;;;;;;;;;-1:-1:-1;25616:315:0;;;;;:::i;:::-;;:::i;24879:130::-;;;;;;;;;;-1:-1:-1;24879:130:0;;;;;:::i;:::-;;:::i;12161:51::-;;;;;;;;;;;;;;;;27163:214;;;;;;;;;;-1:-1:-1;27163:214:0;;;;;:::i;:::-;;:::i;13002:36::-;;;;;;;;;;;;;;;;26260:454;;;;;;;;;;-1:-1:-1;26260:454:0;;;;;:::i;:::-;;:::i;12333:31::-;;;;;;;;;;-1:-1:-1;12333:31:0;;;;;;;;;;;12509:34;;;;;;;;;;-1:-1:-1;12509:34:0;;;;;;;;16262:148;;;;;;;;;;-1:-1:-1;16262:148:0;;;;;:::i;:::-;-1:-1:-1;;;;;16371:18:0;;;16345:7;16371:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;16262:148;24767:100;;;;;;;;;;-1:-1:-1;24767:100:0;;;;;:::i;:::-;;:::i;12442:58::-;;;;;;;;;;;;;;;;12743:30;;;;;;;;;;;;;;;;9476:244;;;;;;;;;;-1:-1:-1;9476:244:0;;;;;:::i;:::-;;:::i;13058:30::-;;;;;;;;;;-1:-1:-1;13058:30:0;;;;-1:-1:-1;;;;;13058:30:0;;;34842:224;;;;;;;;;;-1:-1:-1;34842:224:0;;;;;:::i;:::-;;:::i;26862:293::-;9229:6;;-1:-1:-1;;;;;9229:6:0;5421:10;9229:22;9221:67;;;;-1:-1:-1;;;9221:67:0;;;;;;;:::i;:::-;;;;;;;;;26971:6:::1;::::0;-1:-1:-1;;;;;26949:29:0;;::::1;26971:6:::0;::::1;26949:29;;26941:77;;;::::0;-1:-1:-1;;;26941:77:0;;9091:2:1;26941:77:0::1;::::0;::::1;9073:21:1::0;9130:2;9110:18;;;9103:30;9169:34;9149:18;;;9142:62;-1:-1:-1;;;9220:18:1;;;9213:33;9263:19;;26941:77:0::1;9063:225:1::0;26941:77:0::1;27078:6;::::0;27034:52:::1;::::0;-1:-1:-1;;;;;27078:6:0;;::::1;::::0;27034:52;::::1;::::0;::::1;::::0;27078:6:::1;::::0;27034:52:::1;27107:6;:37:::0;;-1:-1:-1;;;;;;27107:37:0::1;-1:-1:-1::0;;;;;27107:37:0;;;::::1;::::0;;;::::1;::::0;;26862:293::o;16422:167::-;16499:4;16516:39;5421:10;16539:7;16548:6;16516:8;:39::i;:::-;-1:-1:-1;16573:4:0;16422:167;;;;;:::o;26726:124::-;9229:6;;-1:-1:-1;;;;;9229:6:0;5421:10;9229:22;9221:67;;;;-1:-1:-1;;;9221:67:0;;;;;;;:::i;:::-;26810:16:::1;:32:::0;;;::::1;;;;-1:-1:-1::0;;26810:32:0;;::::1;::::0;;;::::1;::::0;;26726:124::o;25279:324::-;9229:6;;-1:-1:-1;;;;;9229:6:0;5421:10;9229:22;9221:67;;;;-1:-1:-1;;;9221:67:0;;;;;;;:::i;:::-;25391:33:::1;25420:3:::0;25391:24:::1;:10:::0;25406:8;25391:14:::1;:24::i;:::-;:28:::0;::::1;:33::i;:::-;25380:8;:44:::0;;;25455:3:::1;-1:-1:-1::0;25443:15:0::1;25435:71;;;::::0;-1:-1:-1;;;25435:71:0;;12491:2:1;25435:71:0::1;::::0;::::1;12473:21:1::0;12530:2;12510:18;;;12503:30;12569:34;12549:18;;;12542:62;-1:-1:-1;;;12620:18:1;;;12613:41;12671:19;;25435:71:0::1;12463:233:1::0;25435:71:0::1;25518:12;:25:::0;;;;25553:10:::1;:21:::0;25584:5:::1;:11:::0;25279:324::o;16605:318::-;16705:4;16721:36;16731:6;16739:9;16750:6;16721:9;:36::i;:::-;16768:121;16777:6;5421:10;16799:89;16837:6;16799:89;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16799:19:0;;;;;;:11;:19;;;;;;;;5421:10;16799:33;;;;;;;;;;:37;:89::i;:::-;16768:8;:121::i;:::-;-1:-1:-1;16907:4:0;16605:318;;;;;:::o;20249:268::-;20315:7;20354:16;;20343:7;:27;;20335:82;;;;-1:-1:-1;;;20335:82:0;;7917:2:1;20335:82:0;;;7899:21:1;7956:2;7936:18;;;7929:30;7995:34;7975:18;;;7968:62;-1:-1:-1;;;8046:18:1;;;8039:40;8096:19;;20335:82:0;7889:232:1;20335:82:0;20428:19;20450:17;:15;:17::i;:::-;20428:39;-1:-1:-1;20485:24:0;:7;20428:39;20485:11;:24::i;:::-;20478:31;20249:268;-1:-1:-1;;;20249:268:0:o;21005:499::-;9229:6;;-1:-1:-1;;;;;9229:6:0;5421:10;9229:22;9221:67;;;;-1:-1:-1;;;9221:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;21087:31:0;::::1;;::::0;;;:22:::1;:31;::::0;;;;;::::1;;21079:67;;;::::0;-1:-1:-1;;;21079:67:0;;11020:2:1;21079:67:0::1;::::0;::::1;11002:21:1::0;11059:2;11039:18;;;11032:30;11098:25;11078:18;;;11071:53;11141:18;;21079:67:0::1;10992:173:1::0;21079:67:0::1;21162:9;21157:340;21181:9;:16:::0;21177:20;::::1;21157:340;;;21239:7;-1:-1:-1::0;;;;;21223:23:0::1;:9;21233:1;21223:12;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;21223:12:0::1;:23;21219:267;;;21282:9;21292:16:::0;;:20:::1;::::0;21311:1:::1;::::0;21292:20:::1;:::i;:::-;21282:31;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;21267:9:::1;:12:::0;;-1:-1:-1;;;;;21282:31:0;;::::1;::::0;21277:1;;21267:12;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;;::::1;:46:::0;;-1:-1:-1;;;;;;21267:46:0::1;-1:-1:-1::0;;;;;21267:46:0;;::::1;;::::0;;21332:18;;::::1;::::0;;:9:::1;:18:::0;;;;;;:22;;;21373::::1;:31:::0;;;;:39;;-1:-1:-1;;21373:39:0::1;::::0;;21431:9:::1;:15:::0;;;::::1;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;-1:-1:-1;;21431:15:0;;;;;-1:-1:-1;;;;;;21431:15:0::1;::::0;;;;;21157:340:::1;21005:499:::0;:::o;21219:267::-:1;21199:3:::0;::::1;::::0;::::1;:::i;:::-;;;;21157:340;;;;21005:499:::0;:::o;18558:218::-;5421:10;18646:4;18695:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;18695:34:0;;;;;;;;;;18646:4;;18663:83;;18686:7;;18695:50;;18734:10;18695:38;:50::i;25943:303::-;9229:6;;-1:-1:-1;;;;;9229:6:0;5421:10;9229:22;9221:67;;;;-1:-1:-1;;;9221:67:0;;;;;;;:::i;:::-;26027:9;-1:-1:-1;;;;;14246:25:0;::::1;14238:72;;;;-1:-1:-1::0;;;14238:72:0::1;;;;;;;:::i;:::-;26070:13:::2;::::0;-1:-1:-1;;;;;26057:26:0;;::::2;26070:13:::0;::::2;26057:26;;26049:81;;;::::0;-1:-1:-1;;;26049:81:0;;10206:2:1;26049:81:0::2;::::0;::::2;10188:21:1::0;10245:2;10225:18;;;10218:30;10284:34;10264:18;;;10257:62;-1:-1:-1;;;10335:18:1;;;10328:40;10385:19;;26049:81:0::2;10178:232:1::0;26049:81:0::2;26178:13;::::0;26146:46:::2;::::0;-1:-1:-1;;;;;26178:13:0;;::::2;::::0;26146:46;::::2;::::0;::::2;::::0;26178:13:::2;::::0;26146:46:::2;-1:-1:-1::0;26213:13:0::2;:25:::0;;-1:-1:-1;;;;;;26213:25:0::2;-1:-1:-1::0;;;;;26213:25:0;;;::::2;::::0;;;::::2;::::0;;25943:303::o;16939:776::-;1012:1;1610:7;;:19;;1602:63;;;;-1:-1:-1;;;1602:63:0;;17716:2:1;1602:63:0;;;17698:21:1;17755:2;17735:18;;;17728:30;17794:33;17774:18;;;17767:61;17845:18;;1602:63:0;17688:181:1;1602:63:0;1012:1;1743:7;:18;5421:10;;17044:66:::1;;;::::0;-1:-1:-1;;;17044:66:0;;15652:2:1;17044:66:0::1;::::0;::::1;15634:21:1::0;15691:2;15671:18;;;15664:30;15730:34;15710:18;;;15703:62;-1:-1:-1;;;15781:18:1;;;15774:31;15822:19;;17044:66:0::1;15624:223:1::0;17044:66:0::1;17147:11;::::0;-1:-1:-1;;;;;17129:30:0;;::::1;17147:11:::0;::::1;17129:30;;17121:76;;;::::0;-1:-1:-1;;;17121:76:0;;14434:2:1;17121:76:0::1;::::0;::::1;14416:21:1::0;14473:2;14453:18;;;14446:30;14512:34;14492:18;;;14485:62;-1:-1:-1;;;14563:18:1;;;14556:31;14604:19;;17121:76:0::1;14406:223:1::0;17121:76:0::1;17210:15;17228:17;17238:6;17228:9;:17::i;:::-;17210:35;;17275:6;17264:7;:17;;17256:64;;;::::0;-1:-1:-1;;;17256:64:0;;7096:2:1;17256:64:0::1;::::0;::::1;7078:21:1::0;7135:2;7115:18;;;7108:30;7174:34;7154:18;;;7147:62;-1:-1:-1;;;7225:18:1;;;7218:32;7267:19;;17256:64:0::1;7068:224:1::0;17256:64:0::1;17333:23;17359:29;17370:17;:15;:17::i;:::-;17359:6:::0;;:10:::1;:29::i;:::-;-1:-1:-1::0;;;;;17492:26:0;::::1;;::::0;;;:18:::1;:26;::::0;;;;;17333:55;;-1:-1:-1;17492:47:0::1;::::0;17333:55;17492:30:::1;:47::i;:::-;-1:-1:-1::0;;;;;17463:26:0;::::1;;::::0;;;:18:::1;:26;::::0;;;;;;;:76;;;;17554:22:::1;:30:::0;;;;::::1;;17550:98;;;-1:-1:-1::0;;;;;17619:17:0;::::1;;::::0;;;:9:::1;:17;::::0;;;;;:29:::1;::::0;17641:6;17619:21:::1;:29::i;:::-;-1:-1:-1::0;;;;;17599:17:0;::::1;;::::0;;;:9:::1;:17;::::0;;;;:49;17550:98:::1;17661:46;17674:6;17682;17690:15;17661:11;:46::i;:::-;-1:-1:-1::0;;968:1:0;1922:22;;-1:-1:-1;;16939:776:0:o;19610:511::-;19702:7;11923:28;19730:7;:23;;19722:67;;;;-1:-1:-1;;;19722:67:0;;12131:2:1;19722:67:0;;;12113:21:1;12170:2;12150:18;;;12143:30;12209:33;12189:18;;;12182:61;12260:18;;19722:67:0;12103:181:1;19722:67:0;19800:15;19831:17;19826:288;;19866:15;19889:21;19900:7;19908:1;19889:10;:21::i;:::-;-1:-1:-1;19865:45:0;;-1:-1:-1;19925:14:0;;-1:-1:-1;;;;;19925:14:0;19826:288;-1:-1:-1;19982:8:0;;20007:23;20037:28;20048:7;19982:8;20037:10;:28::i;:::-;-1:-1:-1;20005:60:0;;-1:-1:-1;20080:22:0;;-1:-1:-1;;;;;20080:22:0;24636:123;9229:6;;-1:-1:-1;;;;;9229:6:0;5421:10;9229:22;9221:67;;;;-1:-1:-1;;;9221:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;24720:23:0;;;::::1;;::::0;;;:14:::1;:23;::::0;;;;:31;;-1:-1:-1;;24720:31:0::1;::::0;::::1;;::::0;;;::::1;::::0;;24636:123::o;20529:180::-;9229:6;;-1:-1:-1;;;;;9229:6:0;5421:10;9229:22;9221:67;;;;-1:-1:-1;;;9221:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;20614:31:0;::::1;;::::0;;;:22:::1;:31;::::0;;;;;::::1;;20613:32;20605:68;;;::::0;-1:-1:-1;;;20605:68:0;;9495:2:1;20605:68:0::1;::::0;::::1;9477:21:1::0;9534:2;9514:18;;;9507:30;9573:25;9553:18;;;9546:53;9616:18;;20605:68:0::1;9467:173:1::0;20605:68:0::1;20684:17;20693:7;20684:8;:17::i;:::-;20529:180:::0;:::o;21516:132::-;9229:6;;-1:-1:-1;;;;;9229:6:0;5421:10;9229:22;9221:67;;;;-1:-1:-1;;;9221:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;21604:27:0;;;::::1;;::::0;;;:18:::1;:27;::::0;;;;:35;;-1:-1:-1;;21604:35:0::1;::::0;::::1;;::::0;;;::::1;::::0;;21516:132::o;15833:225::-;-1:-1:-1;;;;;15922:31:0;;15899:7;15922:31;;;:22;:31;;;;;;;;15918:62;;;-1:-1:-1;;;;;;15962:18:0;;;;;:9;:18;;;;;;;15833:225::o;15918:62::-;-1:-1:-1;;;;;16018:27:0;;;;;;:18;:27;;;;;;15998:48;;:19;:48::i;9320:148::-;9229:6;;-1:-1:-1;;;;;9229:6:0;5421:10;9229:22;9221:67;;;;-1:-1:-1;;;9221:67:0;;;;;;;:::i;:::-;9427:1:::1;9411:6:::0;;9390:40:::1;::::0;-1:-1:-1;;;;;9411:6:0;;::::1;::::0;9390:40:::1;::::0;9427:1;;9390:40:::1;9458:1;9441:19:::0;;-1:-1:-1;;;;;;9441:19:0::1;::::0;;9320:148::o;25156:115::-;9229:6;;-1:-1:-1;;;;;9229:6:0;5421:10;9229:22;9221:67;;;;-1:-1:-1;;;9221:67:0;;;;;;;:::i;:::-;25246:17:::1;:6:::0;25256::::1;25246:17;:::i;:::-;25232:11;:31:::0;-1:-1:-1;25156:115:0:o;25021:123::-;9229:6;;-1:-1:-1;;;;;9229:6:0;5421:10;9229:22;9221:67;;;;-1:-1:-1;;;9221:67:0;;;;;;;:::i;:::-;25115:21:::1;:10:::0;25129:6:::1;25115:21;:::i;:::-;25096:16;:40:::0;-1:-1:-1;25021:123:0:o;18788:269::-;18881:4;18898:129;5421:10;18921:7;18930:96;18969:15;18930:96;;;;;;;;;;;;;;;;;5421:10;18930:25;;;;:11;:25;;;;;;;;-1:-1:-1;;;;;18930:34:0;;;;;;;;;;;;:38;:96::i;16074:172::-;16154:4;16170:42;5421:10;16194:9;16205:6;16170:9;:42::i;25616:315::-;9229:6;;-1:-1:-1;;;;;9229:6:0;5421:10;9229:22;9221:67;;;;-1:-1:-1;;;9221:67:0;;;;;;;:::i;:::-;25702:9;-1:-1:-1;;;;;14246:25:0;::::1;14238:72;;;;-1:-1:-1::0;;;14238:72:0::1;;;;;;;:::i;:::-;25745:15:::2;::::0;-1:-1:-1;;;;;25732:28:0;;::::2;25745:15:::0;::::2;25732:28;;25724:85;;;::::0;-1:-1:-1;;;25724:85:0;;16893:2:1;25724:85:0::2;::::0;::::2;16875:21:1::0;16932:2;16912:18;;;16905:30;16971:34;16951:18;;;16944:62;-1:-1:-1;;;17022:18:1;;;17015:42;17074:19;;25724:85:0::2;16865:234:1::0;25724:85:0::2;25859:15;::::0;25825:50:::2;::::0;-1:-1:-1;;;;;25859:15:0;;::::2;::::0;25825:50;::::2;::::0;::::2;::::0;25859:15:::2;::::0;25825:50:::2;-1:-1:-1::0;25896:15:0::2;:27:::0;;-1:-1:-1;;;;;;25896:27:0::2;-1:-1:-1::0;;;;;25896:27:0;;;::::2;::::0;;;::::2;::::0;;25616:315::o;24879:130::-;9229:6;;-1:-1:-1;;;;;9229:6:0;5421:10;9229:22;9221:67;;;;-1:-1:-1;;;9221:67:0;;;;;;;:::i;:::-;24979:22:::1;:11:::0;24994:6:::1;24979:22;:::i;:::-;24958:18;:43:::0;-1:-1:-1;24879:130:0:o;27163:214::-;9229:6;;-1:-1:-1;;;;;9229:6:0;5421:10;9229:22;9221:67;;;;-1:-1:-1;;;9221:67:0;;;;;;;:::i;:::-;27237:14:::1;:29:::0;;-1:-1:-1;;27237:29:0::1;::::0;::::1;;::::0;;::::1;::::0;;;::::1;27280:14:::0;27277:89:::1;;;27330:20;:15;27348:2;27330:20;:::i;:::-;27310:17;:40:::0;27163:214;:::o;26260:454::-;9229:6;;-1:-1:-1;;;;;9229:6:0;5421:10;9229:22;9221:67;;;;-1:-1:-1;;;9221:67:0;;;;;;;:::i;:::-;26406:20:::1;26429:51;26470:9:::0;26429:36:::1;:16:::0;26450:14;26429:20:::1;:36::i;:51::-;26406:74;;26499:12;26515:4;26499:20;26491:67;;;::::0;-1:-1:-1;;;26491:67:0;;18076:2:1;26491:67:0::1;::::0;::::1;18058:21:1::0;18115:2;18095:18;;;18088:30;18154:34;18134:18;;;18127:62;-1:-1:-1;;;18205:18:1;;;18198:32;18247:19;;26491:67:0::1;18048:224:1::0;26491:67:0::1;-1:-1:-1::0;26579:22:0::1;:41:::0;;;;26631:20:::1;:37:::0;26679:15:::1;:27:::0;26260:454::o;24767:100::-;9229:6;;-1:-1:-1;;;;;9229:6:0;5421:10;9229:22;9221:67;;;;-1:-1:-1;;;9221:67:0;;;;;;;:::i;:::-;24836:11:::1;:23:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;24836:23:0;;::::1;::::0;;;::::1;::::0;;24767:100::o;9476:244::-;9229:6;;-1:-1:-1;;;;;9229:6:0;5421:10;9229:22;9221:67;;;;-1:-1:-1;;;9221:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;9565:22:0;::::1;9557:73;;;::::0;-1:-1:-1;;;9557:73:0;;8328:2:1;9557:73:0::1;::::0;::::1;8310:21:1::0;8367:2;8347:18;;;8340:30;8406:34;8386:18;;;8379:62;-1:-1:-1;;;8457:18:1;;;8450:36;8503:19;;9557:73:0::1;8300:228:1::0;9557:73:0::1;9667:6;::::0;;9646:38:::1;::::0;-1:-1:-1;;;;;9646:38:0;;::::1;::::0;9667:6;::::1;::::0;9646:38:::1;::::0;::::1;9695:6;:17:::0;;-1:-1:-1;;;;;;9695:17:0::1;-1:-1:-1::0;;;;;9695:17:0;;;::::1;::::0;;;::::1;::::0;;9476:244::o;34842:224::-;9229:6;;-1:-1:-1;;;;;9229:6:0;5421:10;9229:22;9221:67;;;;-1:-1:-1;;;9221:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;34944:23:0;::::1;34936:85;;;::::0;-1:-1:-1;;;34936:85:0;;7499:2:1;34936:85:0::1;::::0;::::1;7481:21:1::0;7538:2;7518:18;;;7511:30;7577:34;7557:18;;;7550:62;-1:-1:-1;;;7628:18:1;;;7621:47;7685:19;;34936:85:0::1;7471:239:1::0;34936:85:0::1;35032:26;::::0;-1:-1:-1;;;;;35032:18:0;::::1;::::0;:26;::::1;;;::::0;35051:6;;35032:26:::1;::::0;;;35051:6;35032:18;:26;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;34842:224:::0;;:::o;2891:179::-;2949:7;;2981:5;2985:1;2981;:5;:::i;:::-;2969:17;;3010:1;3005;:6;;2997:46;;;;-1:-1:-1;;;2997:46:0;;8735:2:1;2997:46:0;;;8717:21:1;8774:2;8754:18;;;8747:30;8813:29;8793:18;;;8786:57;8860:18;;2997:46:0;8707:177:1;3474:153:0;3532:7;3564:1;3560;:5;3552:44;;;;-1:-1:-1;;;3552:44:0;;11776:2:1;3552:44:0;;;11758:21:1;11815:2;11795:18;;;11788:30;11854:28;11834:18;;;11827:56;11900:18;;3552:44:0;11748:176:1;3552:44:0;3614:5;3618:1;3614;:5;:::i;3078:158::-;3136:7;3169:1;3164;:6;;3156:49;;;;-1:-1:-1;;;3156:49:0;;9847:2:1;3156:49:0;;;9829:21:1;9886:2;9866:18;;;9859:30;9925:32;9905:18;;;9898:60;9975:18;;3156:49:0;9819:180:1;3156:49:0;3223:5;3227:1;3223;:5;:::i;19069:352::-;-1:-1:-1;;;;;19163:19:0;;19155:75;;;;-1:-1:-1;;;19155:75:0;;6278:2:1;19155:75:0;;;6260:21:1;6317:2;6297:18;;;6290:30;6356:34;6336:18;;;6329:62;-1:-1:-1;;;6407:18:1;;;6400:41;6458:19;;19155:75:0;6250:233:1;19155:75:0;-1:-1:-1;;;;;19249:21:0;;19241:75;;;;-1:-1:-1;;;19241:75:0;;17306:2:1;19241:75:0;;;17288:21:1;17345:2;17325:18;;;17318:30;17384:34;17364:18;;;17357:62;-1:-1:-1;;;17435:18:1;;;17428:39;17484:19;;19241:75:0;17278:231:1;19241:75:0;-1:-1:-1;;;;;19329:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;19381:32;;18833:25:1;;;19381:32:0;;18806:18:1;19381:32:0;;;;;;;;19069:352;;;:::o;29867:1892::-;-1:-1:-1;;;;;29964:20:0;;29956:70;;;;-1:-1:-1;;;29956:70:0;;6690:2:1;29956:70:0;;;6672:21:1;6729:2;6709:18;;;6702:30;6768:34;6748:18;;;6741:62;-1:-1:-1;;;6819:18:1;;;6812:35;6864:19;;29956:70:0;6662:227:1;29956:70:0;-1:-1:-1;;;;;30045:23:0;;30037:71;;;;-1:-1:-1;;;30037:71:0;;11372:2:1;30037:71:0;;;11354:21:1;11411:2;11391:18;;;11384:30;11450:34;11430:18;;;11423:62;-1:-1:-1;;;11501:18:1;;;11494:33;11544:19;;30037:71:0;11344:225:1;30037:71:0;30145:11;;-1:-1:-1;;;;;30127:30:0;;;30145:11;;30127:30;;30119:80;;;;-1:-1:-1;;;30119:80:0;;15246:2:1;30119:80:0;;;15228:21:1;15285:2;15265:18;;;15258:30;15324:34;15304:18;;;15297:62;-1:-1:-1;;;15375:18:1;;;15368:35;15420:19;;30119:80:0;15218:227:1;30119:80:0;30227:1;30218:6;:10;30210:64;;;;-1:-1:-1;;;30210:64:0;;14836:2:1;30210:64:0;;;14818:21:1;14875:2;14855:18;;;14848:30;14914:34;14894:18;;;14887:62;-1:-1:-1;;;14965:18:1;;;14958:39;15014:19;;30210:64:0;14808:231:1;30210:64:0;30303:16;;;;;;;30295:85;;;;-1:-1:-1;;;30295:85:0;;16468:2:1;30295:85:0;;;16450:21:1;16507:2;16487:18;;;16480:30;16546:34;16526:18;;;16519:62;16617:26;16597:18;;;16590:54;16661:19;;30295:85:0;16440:246:1;30295:85:0;-1:-1:-1;;;;;30402:22:0;;;;;;:14;:22;;;;;;;;30401:23;:53;;;;-1:-1:-1;;;;;;30429:25:0;;;;;;:14;:25;;;;;;;;30428:26;30401:53;30393:85;;;;-1:-1:-1;;;30393:85:0;;12903:2:1;30393:85:0;;;12885:21:1;12942:2;12922:18;;;12915:30;-1:-1:-1;;;12961:18:1;;;12954:49;13020:18;;30393:85:0;12875:169:1;30393:85:0;30535:6;;-1:-1:-1;;;;;30517:25:0;;;30535:6;;30517:25;;;;:136;;-1:-1:-1;;;;;;30624:29:0;;;;;;:18;:29;;;;;;;;30623:30;30517:136;:218;;;;-1:-1:-1;;;;;;30709:26:0;;;;;;:18;:26;;;;;;;;30708:27;30517:218;30499:375;;;30781:11;;30771:6;:21;;30763:85;;;;-1:-1:-1;;;30763:85:0;;13251:2:1;30763:85:0;;;13233:21:1;13290:2;13270:18;;;13263:30;13329:34;13309:18;;;13302:62;-1:-1:-1;;;13380:18:1;;;13373:49;13439:19;;30763:85:0;13223:241:1;30763:85:0;30918:1;30899:16;;:20;:54;;;;-1:-1:-1;;;;;;30924:29:0;;;;;;:18;:29;;;;;;;;30923:30;30899:54;:85;;;;-1:-1:-1;;;;;;30958:26:0;;;;;;:18;:26;;;;;;;;30957:27;30899:85;:115;;;;-1:-1:-1;31009:4:0;;-1:-1:-1;;;;;30988:26:0;;;31009:4;;30988:26;;30899:115;30894:327;;;31036:24;31063:20;31073:9;31063;:20::i;:::-;31139:16;;31036:47;;-1:-1:-1;31110:25:0;31129:6;31036:47;31110:25;:::i;:::-;:45;;31102:103;;;;-1:-1:-1;;;31102:103:0;;16054:2:1;31102:103:0;;;16036:21:1;16093:2;16073:18;;;16066:30;16132:34;16112:18;;;16105:62;-1:-1:-1;;;16183:18:1;;;16176:43;16236:19;;31102:103:0;16026:235:1;31102:103:0;31017:204;30894:327;31342:14;;;;;;;31372:11;;;;31367:41;;;-1:-1:-1;31400:5:0;31367:41;-1:-1:-1;;;;;31517:26:0;;;;;;:18;:26;;;;;;;;;:59;;-1:-1:-1;;;;;;31547:29:0;;;;;;:18;:29;;;;;;;;31517:59;31514:111;;;-1:-1:-1;31607:5:0;31514:111;31645:31;31666:9;31645:20;:31::i;:::-;31687:54;31703:6;31711:9;31722:6;31730:10;31687:15;:54::i;:::-;29945:1814;29867:1892;;;:::o;3796:200::-;3916:7;3952:12;3944:6;;;;3936:29;;;;-1:-1:-1;;;3936:29:0;;;;;;;;:::i;:::-;-1:-1:-1;3983:5:0;3987:1;3983;:5;:::i;:::-;3976:12;3796:200;-1:-1:-1;;;;3796:200:0:o;22253:171::-;22302:7;22323:15;22340;22359:19;:17;:19::i;:::-;22322:56;;-1:-1:-1;22322:56:0;-1:-1:-1;22396:20:0;22322:56;;22396:11;:20::i;:::-;22389:27;;;;22253:171;:::o;3246:220::-;3304:7;3328:6;3324:20;;-1:-1:-1;3343:1:0;3336:8;;3324:20;3355:9;3367:5;3371:1;3367;:5;:::i;:::-;3355:17;-1:-1:-1;3400:1:0;3391:5;3395:1;3355:17;3391:5;:::i;:::-;:10;3383:56;;;;-1:-1:-1;;;3383:56:0;;13671:2:1;3383:56:0;;;13653:21:1;13710:2;13690:18;;;13683:30;13749:34;13729:18;;;13722:62;-1:-1:-1;;;13800:18:1;;;13793:31;13841:19;;3383:56:0;13643:223:1;17847:699:0;18223:11;;-1:-1:-1;;;;;18223:11:0;18204:31;;;;:18;:31;;;;;;:42;;18240:5;18204:35;:42::i;:::-;18189:11;;;-1:-1:-1;;;;;18189:11:0;;;18170:31;;;;:18;:31;;;;;;;;:76;;;;18284:11;;;;;18261:35;;:22;:35;;;;;;;18257:112;;;18346:11;;-1:-1:-1;;;;;18346:11:0;18336:22;;;;:9;:22;;;;;;:33;;18363:5;18336:26;:33::i;:::-;18321:11;;-1:-1:-1;;;;;18321:11:0;18311:22;;;;:9;:22;;;;;:58;18257:112;18519:11;;18502:36;;18833:25:1;;;-1:-1:-1;;;;;18519:11:0;;;;18502:36;;;;;18821:2:1;18806:18;18502:36:0;18788:76:1;21656:585:0;21733:7;;;;;;21820:38;12680:5;21820:20;:7;21832;21820:11;:20::i;:::-;:24;;:38::i;:::-;21799:59;-1:-1:-1;21869:23:0;21895;:7;21799:59;21895:11;:23::i;:::-;21869:49;;21929:19;21951:17;:15;:17::i;:::-;21929:39;-1:-1:-1;21979:15:0;21997:24;:7;21929:39;21997:11;:24::i;:::-;21979:42;-1:-1:-1;22032:18:0;22053:27;:10;22068:11;22053:14;:27::i;:::-;22032:48;-1:-1:-1;22091:23:0;22117;:7;22032:48;22117:11;:23::i;:::-;22169:7;;;;22195;-1:-1:-1;22204:15:0;;-1:-1:-1;22221:11:0;;-1:-1:-1;21656:585:0;-1:-1:-1;;;;;;21656:585:0:o;20721:276::-;-1:-1:-1;;;;;20778:27:0;;20808:1;20778:27;;;:18;:27;;;;;;:31;20775:132;;-1:-1:-1;;;;;20867:27:0;;;;;;:18;:27;;;;;;20847:48;;:19;:48::i;:::-;-1:-1:-1;;;;;20826:18:0;;;;;;:9;:18;;;;;:69;20775:132;-1:-1:-1;;;;;20917:31:0;;;;;:22;:31;;;;;:38;;-1:-1:-1;;20917:38:0;20951:4;20917:38;;;;;;20966:9;:23;;;;;;;;;;;;;;-1:-1:-1;;;;;;20966:23:0;;;;;;20721:276::o;31771:537::-;31859:11;;;;;;;31853:448;;31887:28;31918:24;31936:4;31918:9;:24::i;:::-;32017:18;;32069:8;;31887:55;;-1:-1:-1;31993:42:0;;;;32069:8;;;;;32068:9;:20;;;;;32081:7;32068:20;:35;;;;-1:-1:-1;32092:11:0;;;;;;;32068:35;:56;;;;-1:-1:-1;32120:4:0;;-1:-1:-1;;;;;32107:17:0;;;32120:4;;32107:17;32068:56;32064:212;;;32145:8;:15;;-1:-1:-1;;32145:15:0;;;;;32197:10;:8;:10::i;:::-;32244:8;:16;;-1:-1:-1;;32244:16:0;;;31872:429;;31771:537;:::o;27824:556::-;27963:8;;28024:14;;;;:54;;;;;28061:17;;28042:15;:36;;28024:54;:79;;28094:9;28024:79;;;28081:10;;28024:79;28166:4;;28012:91;;-1:-1:-1;;;;;;28156:14:0;;;28166:4;;28156:14;;;;:35;;-1:-1:-1;28187:4:0;;-1:-1:-1;;;;;28174:17:0;;;28187:4;;28174:17;;28156:35;28153:80;;;-1:-1:-1;28220:1:0;28153:80;28259:7;28253:33;;-1:-1:-1;28282:1:0;28253:33;28306:57;28326:6;28334:9;28345:6;28353:9;28306:19;:57::i;:::-;27922:458;27824:556;;;;:::o;22436:916::-;22534:16;;22487:7;;;;11923:28;22487:7;22851:342;22875:9;:16;22871:20;;22851:342;;;22952:7;22917:18;:32;22936:9;22946:1;22936:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;22936:12:0;22917:32;;;;;;;;;;;;;:42;;:79;;;22989:7;22963:9;:23;22973:9;22983:1;22973:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;22973:12:0;22963:23;;;;;;;;;;;;;:33;22917:79;22913:137;;;-1:-1:-1;;23019:16:0;;;11923:28;;-1:-1:-1;22436:916:0;-1:-1:-1;;22436:916:0:o;22913:137::-;23075:45;23087:18;:32;23106:9;23116:1;23106:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;23106:12:0;23087:32;;;;;;;;;;;;;23075:7;;:11;:45::i;:::-;23065:55;;23145:36;23157:9;:23;23167:9;23177:1;23167:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;23167:12:0;23157:23;;;;;;;;;;;;;23145:7;;:11;:36::i;:::-;23135:46;-1:-1:-1;22893:3:0;;;;:::i;:::-;;;;22851:342;;;-1:-1:-1;23207:12:0;;;:60;;-1:-1:-1;23233:16:0;;:34;;11923:28;23233:20;:34::i;:::-;23223:7;:44;23207:60;23203:105;;;-1:-1:-1;;23277:16:0;;;11923:28;;-1:-1:-1;22436:916:0;-1:-1:-1;22436:916:0:o;23203:105::-;23327:7;;23336;;-1:-1:-1;22436:916:0;-1:-1:-1;22436:916:0:o;32320:1053::-;1012:1;1610:7;;:19;;1602:63;;;;-1:-1:-1;;;1602:63:0;;17716:2:1;1602:63:0;;;17698:21:1;17755:2;17735:18;;;17728:30;17794:33;17774:18;;;17767:61;17845:18;;1602:63:0;17688:181:1;1602:63:0;1012:1;1743:7;:18;;;32404:15:::1;::::0;32372:29:::1;::::0;32404:22:::1;::::0;:15;:19:::1;:22::i;:::-;32372:54;;32437:23;32463:69;12680:5;32463:51;32492:21;32463:24;32481:4;32463:9;:24::i;:::-;:28:::0;::::1;:51::i;:69::-;32437:95;;32543:20;32566:45;32595:15;32566:24;32584:4;32566:9;:24::i;:::-;:28:::0;::::1;:45::i;:::-;32543:68:::0;-1:-1:-1;32648:21:0::1;32690:30;32543:68:::0;32690:16:::1;:30::i;:::-;32733:17;32753:40;:21;32779:13:::0;32753:25:::1;:40::i;:::-;32733:60;;32814:26;32843:55;12680:5;32843:37;32857:22;;32843:9;:13;;:37;;;;:::i;:55::-;32814:84;;32909:24;32936:53;12680:5;32936:35;32950:20;;32936:9;:13;;:35;;;;:::i;:53::-;32909:80:::0;-1:-1:-1;33000:26:0::1;33029:54;12680:5;33029:36;:9:::0;33043:21;33029:13:::1;:36::i;:54::-;33161:15;::::0;33000:83;;-1:-1:-1;33135:63:0::1;::::0;-1:-1:-1;;;;;33161:15:0::1;33179:18:::0;33135:17:::1;:63::i;:::-;33235:13;::::0;33209:59:::1;::::0;-1:-1:-1;;;;;33235:13:0::1;33251:16:::0;33209:17:::1;:59::i;:::-;33315:50;33329:15;33346:18;33315:13;:50::i;:::-;-1:-1:-1::0;;968:1:0;1922:22;;-1:-1:-1;;;;;;32320:1053:0:o;28392:528::-;28522:15;28539:23;28564:15;28591:23;28616:19;28640:29;28651:6;28659:9;28640:10;:29::i;:::-;28521:148;;;;;;;;;;28691:84;28705:6;28713:9;28724:7;28733:15;28750:7;28759:15;28691:13;:84::i;:::-;28797:41;28807:6;28815:11;28828:9;28797;:41::i;:::-;28881:9;-1:-1:-1;;;;;28864:44:0;28873:6;-1:-1:-1;;;;;28864:44:0;;28892:15;28864:44;;;;18833:25:1;;18821:2;18806:18;;18788:76;28864:44:0;;;;;;;;28500:420;;;;;28392:528;;;;:::o;33984:623::-;34134:16;;;34148:1;34134:16;;;;;;;;34110:21;;34134:16;;;;;;;;;;-1:-1:-1;34134:16:0;34110:40;;34179:4;34161;34166:1;34161:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;34161:23:0;;;:7;;;;;;;;;;:23;;;;34205:6;;:13;;;-1:-1:-1;;;34205:13:0;;;;:6;;;;;:11;;:13;;;;;34161:7;;34205:13;;;;;:6;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34195:4;34200:1;34195:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;34195:23:0;;;:7;;;;;;;;;:23;34263:6;;34231:53;;34248:4;;34263:6;34272:11;34231:8;:53::i;:::-;34323:6;;:215;;-1:-1:-1;;;34323:215:0;;-1:-1:-1;;;;;34323:6:0;;;;:57;;:215;;34395:11;;34323:6;;34465:4;;34492;;34512:15;;34323:215;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34564:35;34581:11;34594:4;34564:35;;;;;;;:::i;:::-;;;;;;;;34039:568;33984:623;:::o;34619:211::-;-1:-1:-1;;;;;34716:23:0;;34708:77;;;;-1:-1:-1;;;34708:77:0;;18479:2:1;34708:77:0;;;18461:21:1;18518:2;18498:18;;;18491:30;18557:34;18537:18;;;18530:62;-1:-1:-1;;;18608:18:1;;;18601:39;18657:19;;34708:77:0;18451:231:1;33385:587:0;33566:6;;33534:53;;33551:4;;-1:-1:-1;;;;;33566:6:0;33575:11;33534:8;:53::i;:::-;33700:6;;33631:23;;;;;;-1:-1:-1;;;;;33700:6:0;:22;33730:9;33763:4;33783:11;33631:23;;33841:7;9133;9160:6;-1:-1:-1;;;;;9160:6:0;;9095:79;33841:7;33700:189;;;;;;-1:-1:-1;;;;;;33700:189:0;;;-1:-1:-1;;;;;4797:15:1;;;33700:189:0;;;4779:34:1;4829:18;;;4822:34;;;;4872:18;;;4865:34;;;;4915:18;;;4908:34;4979:15;;;4958:19;;;4951:44;33863:15:0;5011:19:1;;;5004:35;4713:19;;33700:189:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33907:57;;;19995:25:1;;;20051:2;20036:18;;20029:34;;;20079:18;;;20072:34;;;33630:259:0;;-1:-1:-1;33630:259:0;;-1:-1:-1;33630:259:0;-1:-1:-1;33907:57:0;;19983:2:1;19968:18;33907:57:0;;;;;;;33456:516;;;33385:587;;:::o;28932:685::-;-1:-1:-1;;;;;29146:26:0;;;;;;:18;:26;;;;;;:39;;29177:7;29146:30;:39::i;:::-;-1:-1:-1;;;;;29117:26:0;;;;;;;:18;:26;;;;;;:68;;;;29228:29;;;;;;;:50;;29262:15;29228:33;:50::i;:::-;-1:-1:-1;;;;;29196:29:0;;;;;;;:18;:29;;;;;;;;:82;;;;29404:30;;;;;:22;:30;;;;;;;29400:91;;;-1:-1:-1;;;;;29458:17:0;;;;;;:9;:17;;;;;;:30;;29480:7;29458:21;:30::i;:::-;-1:-1:-1;;;;;29438:17:0;;;;;;:9;:17;;;;;:50;29400:91;-1:-1:-1;;;;;29505:33:0;;;;;;:22;:33;;;;;;;;29501:109;;;-1:-1:-1;;;;;29566:20:0;;;;;;:9;:20;;;;;;:41;;29591:15;29566:24;:41::i;:::-;-1:-1:-1;;;;;29543:20:0;;;;;;:9;:20;;;;;:64;29501:109;28932:685;;;;;;:::o;29635:220::-;29746:1;29734:9;:13;:29;;;;-1:-1:-1;29752:11:0;;;;;;;29751:12;29734:29;29729:119;;;29780:56;29790:6;29798:11;29811:9;29830:4;27495:15;27513:33;12680:5;27513:15;:6;27524:3;27513:10;:15::i;:33::-;27495:51;-1:-1:-1;27557:15:0;27575:24;27495:51;27587:11;27575;:24::i;:::-;-1:-1:-1;;;;;27644:29:0;;;;;;:18;:29;;;;;;27557:42;;-1:-1:-1;27644:42:0;;27557;27644:33;:42::i;:::-;-1:-1:-1;;;;;27612:29:0;;;;;;:18;:29;;;;;;;;:74;;;;27700:22;:33;;;;;;27697:107;;;-1:-1:-1;;;;;27771:20:0;;;;;;:9;:20;;;;;;:33;;27796:7;27771:24;:33::i;:::-;-1:-1:-1;;;;;27748:20:0;;;;;;:9;:20;;;;;:56;27484:328;;27389:423;;;;:::o;14:160:1:-;79:20;;135:13;;128:21;118:32;;108:2;;164:1;161;154:12;108:2;60:114;;;:::o;179:247::-;238:6;291:2;279:9;270:7;266:23;262:32;259:2;;;307:1;304;297:12;259:2;346:9;333:23;365:31;390:5;365:31;:::i;431:251::-;501:6;554:2;542:9;533:7;529:23;525:32;522:2;;;570:1;567;560:12;522:2;602:9;596:16;621:31;646:5;621:31;:::i;687:323::-;763:6;771;824:2;812:9;803:7;799:23;795:32;792:2;;;840:1;837;830:12;792:2;879:9;866:23;898:31;923:5;898:31;:::i;:::-;948:5;1000:2;985:18;;;;972:32;;-1:-1:-1;;;782:228:1:o;1015:388::-;1083:6;1091;1144:2;1132:9;1123:7;1119:23;1115:32;1112:2;;;1160:1;1157;1150:12;1112:2;1199:9;1186:23;1218:31;1243:5;1218:31;:::i;:::-;1268:5;-1:-1:-1;1325:2:1;1310:18;;1297:32;1338:33;1297:32;1338:33;:::i;:::-;1390:7;1380:17;;;1102:301;;;;;:::o;1408:456::-;1485:6;1493;1501;1554:2;1542:9;1533:7;1529:23;1525:32;1522:2;;;1570:1;1567;1560:12;1522:2;1609:9;1596:23;1628:31;1653:5;1628:31;:::i;:::-;1678:5;-1:-1:-1;1735:2:1;1720:18;;1707:32;1748:33;1707:32;1748:33;:::i;:::-;1512:352;;1800:7;;-1:-1:-1;;;1854:2:1;1839:18;;;;1826:32;;1512:352::o;1869:315::-;1934:6;1942;1995:2;1983:9;1974:7;1970:23;1966:32;1963:2;;;2011:1;2008;2001:12;1963:2;2050:9;2037:23;2069:31;2094:5;2069:31;:::i;:::-;2119:5;-1:-1:-1;2143:35:1;2174:2;2159:18;;2143:35;:::i;:::-;2133:45;;1953:231;;;;;:::o;2509:180::-;2565:6;2618:2;2606:9;2597:7;2593:23;2589:32;2586:2;;;2634:1;2631;2624:12;2586:2;2657:26;2673:9;2657:26;:::i;2694:180::-;2753:6;2806:2;2794:9;2785:7;2781:23;2777:32;2774:2;;;2822:1;2819;2812:12;2774:2;-1:-1:-1;2845:23:1;;2764:110;-1:-1:-1;2764:110:1:o;2879:248::-;2944:6;2952;3005:2;2993:9;2984:7;2980:23;2976:32;2973:2;;;3021:1;3018;3011:12;2973:2;3057:9;3044:23;3034:33;;3086:35;3117:2;3106:9;3102:18;3086:35;:::i;3132:316::-;3209:6;3217;3225;3278:2;3266:9;3257:7;3253:23;3249:32;3246:2;;;3294:1;3291;3284:12;3246:2;-1:-1:-1;;3317:23:1;;;3387:2;3372:18;;3359:32;;-1:-1:-1;3438:2:1;3423:18;;;3410:32;;3236:212;-1:-1:-1;3236:212:1:o;3453:306::-;3541:6;3549;3557;3610:2;3598:9;3589:7;3585:23;3581:32;3578:2;;;3626:1;3623;3616:12;3578:2;3655:9;3649:16;3639:26;;3705:2;3694:9;3690:18;3684:25;3674:35;;3749:2;3738:9;3734:18;3728:25;3718:35;;3568:191;;;;;:::o;3764:461::-;3817:3;3855:5;3849:12;3882:6;3877:3;3870:19;3908:4;3937:2;3932:3;3928:12;3921:19;;3974:2;3967:5;3963:14;3995:1;4005:195;4019:6;4016:1;4013:13;4005:195;;;4084:13;;-1:-1:-1;;;;;4080:39:1;4068:52;;4140:12;;;;4175:15;;;;4116:1;4034:9;4005:195;;;-1:-1:-1;4216:3:1;;3825:400;-1:-1:-1;;;;;3825:400:1:o;5474:597::-;5586:4;5615:2;5644;5633:9;5626:21;5676:6;5670:13;5719:6;5714:2;5703:9;5699:18;5692:34;5744:1;5754:140;5768:6;5765:1;5762:13;5754:140;;;5863:14;;;5859:23;;5853:30;5829:17;;;5848:2;5825:26;5818:66;5783:10;;5754:140;;;5912:6;5909:1;5906:13;5903:2;;;5982:1;5977:2;5968:6;5957:9;5953:22;5949:31;5942:42;5903:2;-1:-1:-1;6055:2:1;6034:15;-1:-1:-1;;6030:29:1;6015:45;;;;6062:2;6011:54;;5595:476;-1:-1:-1;;;5595:476:1:o;10415:398::-;10617:2;10599:21;;;10656:2;10636:18;;;10629:30;10695:34;10690:2;10675:18;;10668:62;-1:-1:-1;;;10761:2:1;10746:18;;10739:32;10803:3;10788:19;;10589:224::o;13871:356::-;14073:2;14055:21;;;14092:18;;;14085:30;14151:34;14146:2;14131:18;;14124:62;14218:2;14203:18;;14045:182::o;18869:332::-;19076:6;19065:9;19058:25;19119:2;19114;19103:9;19099:18;19092:30;19039:4;19139:56;19191:2;19180:9;19176:18;19168:6;19139:56;:::i;19206:582::-;19505:6;19494:9;19487:25;19548:6;19543:2;19532:9;19528:18;19521:34;19591:3;19586:2;19575:9;19571:18;19564:31;19468:4;19612:57;19664:3;19653:9;19649:19;19641:6;19612:57;:::i;:::-;-1:-1:-1;;;;;19705:32:1;;;;19700:2;19685:18;;19678:60;-1:-1:-1;19769:3:1;19754:19;19747:35;19604:65;19477:311;-1:-1:-1;;;19477:311:1:o;20306:128::-;20346:3;20377:1;20373:6;20370:1;20367:13;20364:2;;;20383:18;;:::i;:::-;-1:-1:-1;20419:9:1;;20354:80::o;20439:217::-;20479:1;20505;20495:2;;20549:10;20544:3;20540:20;20537:1;20530:31;20584:4;20581:1;20574:15;20612:4;20609:1;20602:15;20495:2;-1:-1:-1;20641:9:1;;20485:171::o;20661:168::-;20701:7;20767:1;20763;20759:6;20755:14;20752:1;20749:21;20744:1;20737:9;20730:17;20726:45;20723:2;;;20774:18;;:::i;:::-;-1:-1:-1;20814:9:1;;20713:116::o;20834:125::-;20874:4;20902:1;20899;20896:8;20893:2;;;20907:18;;:::i;:::-;-1:-1:-1;20944:9:1;;20883:76::o;20964:135::-;21003:3;-1:-1:-1;;21024:17:1;;21021:2;;;21044:18;;:::i;:::-;-1:-1:-1;21091:1:1;21080:13;;21011:88::o;21104:127::-;21165:10;21160:3;21156:20;21153:1;21146:31;21196:4;21193:1;21186:15;21220:4;21217:1;21210:15;21236:127;21297:10;21292:3;21288:20;21285:1;21278:31;21328:4;21325:1;21318:15;21352:4;21349:1;21342:15;21368:127;21429:10;21424:3;21420:20;21417:1;21410:31;21460:4;21457:1;21450:15;21484:4;21481:1;21474:15;21632:131;-1:-1:-1;;;;;21707:31:1;;21697:42;;21687:2;;21753:1;21750;21743:12
Swarm Source
ipfs://6fbb60b012b2d8a292c237bd83ea374ca1a5239a87f92c4ddc4964c8b5a9cf46
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.