ERC-20
Overview
Max Total Supply
420,000,000,000,000 CAWELON
Holders
549
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:
CAWELON
Compiler Version
v0.8.19+commit.7dd6d404
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2024-04-29 */ pragma solidity 0.8.19; // SPDX-License-Identifier: MIT 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); } abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); constructor() { _setOwner(_msgSender()); } function owner() public view virtual returns (address) { return _owner; } modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } function renounceOwnership() public virtual onlyOwner { _setOwner(address(0)); } function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } interface IFactory { function createPair(address tokenA, address tokenB) external returns (address pair); } interface IRouter { function factory() external pure returns (address); function WETH() external pure returns (address); function swapExactTokensForETHSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external; function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; } /** * @title SafeMathInt * @dev Math operations for int256 with overflow safety checks. */ library SafeMathInt { int256 private constant MIN_INT256 = int256(1) << 255; /** * @dev Multiplies two int256 variables and fails on overflow. */ function mul(int256 a, int256 b) internal pure returns (int256) { int256 c = a * b; // Detect overflow when multiplying MIN_INT256 with -1 require(c != MIN_INT256 || (a & MIN_INT256) != (b & MIN_INT256)); require((b == 0) || (c / b == a)); return c; } /** * @dev Division of two int256 variables and fails on overflow. */ function div(int256 a, int256 b) internal pure returns (int256) { // Prevent overflow when dividing MIN_INT256 by -1 require(b != -1 || a != MIN_INT256); // Solidity already throws when dividing by 0. return a / b; } /** * @dev Subtracts two int256 variables and fails on overflow. */ function sub(int256 a, int256 b) internal pure returns (int256) { int256 c = a - b; require((b >= 0 && c <= a) || (b < 0 && c > a)); return c; } /** * @dev Adds two int256 variables and fails on overflow. */ function add(int256 a, int256 b) internal pure returns (int256) { int256 c = a + b; require((b >= 0 && c >= a) || (b < 0 && c < a)); return c; } function toUint256Safe(int256 a) internal pure returns (uint256) { require(a >= 0); return uint256(a); } } /** * @title SafeMathUint * @dev Math operations with safety checks that revert on error */ library SafeMathUint { function toInt256Safe(uint256 a) internal pure returns (int256) { int256 b = int256(a); require(b >= 0); return b; } } interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } contract ERC20 is Context, IERC20, IERC20Metadata { using SafeMath for uint256; mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The default value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5,05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless this function is * overridden; * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public virtual override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(_msgSender(), spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * Requirements: * * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for ``sender``'s tokens of at least * `amount`. */ function transferFrom( address sender, address recipient, uint256 amount ) public virtual override returns (bool) { _transfer(sender, recipient, amount); _approve( sender, _msgSender(), _allowances[sender][_msgSender()].sub( amount, "ERC20: transfer amount exceeds allowance" ) ); return true; } /** * @dev Moves tokens `amount` from `sender` to `recipient`. * * This is internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer( address sender, address recipient, uint256 amount ) internal virtual { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(sender, recipient, amount); _balances[sender] = _balances[sender].sub( amount, "ERC20: transfer amount exceeds balance" ); _balances[recipient] = _balances[recipient].add(amount); emit Transfer(sender, recipient, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply = _totalSupply.add(amount); _balances[account] = _balances[account].add(amount); emit Transfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); _balances[account] = _balances[account].sub( amount, "ERC20: burn amount exceeds balance" ); _totalSupply = _totalSupply.sub(amount); emit Transfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve( address owner, address spender, uint256 amount ) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be to transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual {} } contract CAWELON is Context, ERC20, Ownable { using SafeMath for uint256; IRouter public router; address public uniswapV2Pair; bool private swapping; struct airDropWallets { uint256 amount; uint256 unlockTime; } mapping(address => airDropWallets) public airDropWalletsData; mapping(address => bool) public _isExcludedFromFee; // store addresses that a automatic market maker pairs. Any transfer *to* these addresses mapping(address => bool) public automatedMarketMakerPairs; uint256 private ethRewardsBuyFee = 4; uint256 private devBuyFee = 1; uint256 private nativeBurnBuyFee = 3; uint256 private devSellFee = 1; uint256 private nativeBurnSellFee = 3; uint256 private cawBurnSellFee = 4; uint256 public totalBuyFees = ethRewardsBuyFee.add(devBuyFee).add(nativeBurnBuyFee); uint256 public totalSellFees = nativeBurnSellFee.add(cawBurnSellFee).add(devSellFee); uint256 private countETHRewardFees = 0; uint256 private countCAWBurnFee = 0; uint256 private countNativeBurnFee = 0; address public cawCollectWallet = payable(0xbf38fA464F04f18568938d24B72feA56da76bC4A); address public devWallet = payable(0xEFe317a9230D5852AC5e5Ad0Ed5400C1C8e0D65C); DividendTracker public dividendTracker; uint256 public swapTokensAtAmount = 210000000000 * 10**18; //0.05% address constant deadWallet = 0x000000000000000000000000000000000000dEaD; address public immutable CAW = address(0xf3b9569F82B18aEf890De263B84189bd33EBe452); // CAW event SendDividends(uint256 tokenAmount, uint256 ethAmount); event ProcessedDividendTracker( uint256 iterations, uint256 claims, uint256 lastProcessedIndex, bool indexed automatic, uint256 gas, address indexed processor ); constructor() ERC20("CAW Supporter", "CAWELON"){ dividendTracker = new DividendTracker(); // exclude from receiving dividends dividendTracker.excludeFromDividends(address(dividendTracker)); dividendTracker.excludeFromDividends(address(this)); dividendTracker.excludeFromDividends(deadWallet); _isExcludedFromFee[address(this)] = true; _isExcludedFromFee[0x49e1F66863E08eff662ba879c636f4eaDeDD33b3] = true; _isExcludedFromFee[deadWallet] = true; _mint(0x49e1F66863E08eff662ba879c636f4eaDeDD33b3, 420000000000000 * (10**18)); } receive() external payable {} function createPair() external onlyOwner { IRouter _router = IRouter(address(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D)); address _pair = IFactory(_router.factory()).createPair(address(this), _router.WETH()); router = _router; uniswapV2Pair = _pair; automatedMarketMakerPairs[uniswapV2Pair] = true; dividendTracker.excludeFromDividends(uniswapV2Pair); } function airDrop (address[] calldata recipients, uint256[] calldata amount, uint256 _unlockTime) public onlyOwner{ for (uint256 i = 0; i < recipients.length; i++){ IERC20(address(this)).transferFrom(msg.sender, recipients[i], amount[i] * (10**18)); airDropWalletsData[recipients[i]].amount = amount[i] * (10**18); airDropWalletsData[recipients[i]].unlockTime = block.timestamp.add(_unlockTime * 86400); } } /// @dev It will send all ETH to dev which are sended accidentally function recoverETH() external onlyOwner { uint256 ETHbalance = address(this).balance; (bool success, ) = payable(owner()).call{value: ETHbalance}(""); require(success); } function excludeFromDividends(address account) public onlyOwner { dividendTracker.excludeFromDividends(account); } function excludeFromFee(address account) public onlyOwner { _isExcludedFromFee[account] = true; } function updateSwapTokensAtAmount(uint256 newAmount) external onlyOwner{ require(newAmount >= totalSupply() / 2000, "SwapTokensAtAmount must be greater than or equal to 0.05% of total supply"); swapTokensAtAmount = newAmount * 10**18; } function updateDividendTracker(address newAddress) public onlyOwner { require(newAddress != address(dividendTracker), " The dividend tracker already has that address"); dividendTracker.recoverETH(); DividendTracker newDividendTracker = DividendTracker(payable(newAddress)); newDividendTracker.excludeFromDividends( address(newDividendTracker) ); newDividendTracker.excludeFromDividends(address(this)); newDividendTracker.excludeFromDividends(uniswapV2Pair); newDividendTracker.excludeFromDividends(deadWallet); dividendTracker = newDividendTracker; } function processDividendTracker(uint256 gas) external { (uint256 iterations, uint256 claims, uint256 lastProcessedIndex) = dividendTracker.process(gas); emit ProcessedDividendTracker(iterations, claims, lastProcessedIndex, false, gas, tx.origin); } function claim() external { dividendTracker.processAccount(payable(msg.sender), false); } uint256 private devFeeActual; uint256 private cawBurnFeeActual; uint256 private nativeBurnFeeActual; uint256 private ETHRewardsFeeActual; function _transfer( address from, address to, uint256 amount ) internal override { require(from != address(0), "ERC20: transfer from the zero address"); require(amount > 0, "Transfer amount must be greater than zero"); if(from != uniswapV2Pair){ require(to != address(this), "You cannot send tokens to the contract address!"); } if (amount == 0) { super._transfer(from, to, 0); return; } else if ( !swapping && !_isExcludedFromFee[from] && !_isExcludedFromFee[to] ) { bool isSelling = automatedMarketMakerPairs[to]; bool isBuying = automatedMarketMakerPairs[from]; if ( isSelling && // sells only by detecting transfer to automated market maker pair from != address(router) //router -> pair is removing liquidity which shouldn't have max ) { if(block.timestamp <= airDropWalletsData[from].unlockTime && airDropWalletsData[from].amount > 0){ require(amount <= (balanceOf(from).sub(airDropWalletsData[from].amount))); } devFeeActual = devSellFee; ETHRewardsFeeActual = 0; cawBurnFeeActual = cawBurnSellFee; nativeBurnFeeActual = nativeBurnSellFee; } else if ( isBuying && to != address(router) ) { devFeeActual = devBuyFee; cawBurnFeeActual = 0; nativeBurnFeeActual = nativeBurnBuyFee; ETHRewardsFeeActual = ethRewardsBuyFee; } else { devFeeActual = 0; cawBurnFeeActual = 0; nativeBurnFeeActual = 0; ETHRewardsFeeActual = 0; if(block.timestamp <= airDropWalletsData[from].unlockTime && airDropWalletsData[from].amount > 0){ require(amount <= (balanceOf(from).sub(airDropWalletsData[from].amount)), "wait for unlock period"); } } uint256 contractTokenBalance = balanceOf(address(this)); bool canSwap = contractTokenBalance >= swapTokensAtAmount; if (canSwap && !automatedMarketMakerPairs[from]) { swapping = true; burnNativeTokens(countNativeBurnFee); buyCAWTokens(countCAWBurnFee); swapTokensForDividendETH(countETHRewardFees); swapAndSendDevETH(); swapping = false; } uint256 devFeeAmount = amount.mul(devFeeActual).div(100); uint256 nativeFeeAmount = amount.mul(nativeBurnFeeActual).div(100); uint256 cawFeeAmount = amount.mul(cawBurnFeeActual).div(100); uint256 ETHRewardsFeeAmount = amount.mul(ETHRewardsFeeActual).div(100); countNativeBurnFee += nativeFeeAmount; countCAWBurnFee += cawFeeAmount; countETHRewardFees += ETHRewardsFeeAmount; uint256 fees = devFeeAmount + nativeFeeAmount + cawFeeAmount + ETHRewardsFeeAmount; amount = amount.sub(fees); super._transfer(from, address(this), fees); } super._transfer(from, to, amount); try dividendTracker.setBalance(payable(from), balanceOf(from)) {} catch {} try dividendTracker.setBalance(payable(to), balanceOf(to)) {} catch {} } function burnNativeTokens(uint256 tokenAmount) private { uint256 contractBalance = balanceOf(address(this)); if(tokenAmount > contractBalance){ return; } bool success = IERC20(address(this)).transfer(deadWallet, tokenAmount); if(success){ countNativeBurnFee -= tokenAmount; } } function buyCAWTokens(uint256 tokenAmount) private { address[] memory path = new address[](3); path[0] = address(this); path[1] = router.WETH(); path[2] = CAW; _approve(address(this), address(router), tokenAmount); // make the swap router.swapExactTokensForTokensSupportingFeeOnTransferTokens( tokenAmount, 0, path, cawCollectWallet, block.timestamp ); countCAWBurnFee -= tokenAmount; } function swapTokensForDividendETH(uint256 tokenAmount) private { uint256 beforeSwap; uint256 afterSwapDelta; beforeSwap = address(this).balance; uint256 contractBalance = balanceOf(address(this)); if(tokenAmount > contractBalance){ return; } swapTokensForETH(tokenAmount, payable(address(this))); afterSwapDelta = address(this).balance - beforeSwap; countETHRewardFees -= tokenAmount; uint256 ETHRewards = afterSwapDelta; (bool success, ) = address(dividendTracker).call{value: ETHRewards}(""); if(success){ emit SendDividends(tokenAmount, ETHRewards); } } function swapTokensForETH(uint256 tokenAmount, address wallet) private { // generate the 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, payable(wallet), block.timestamp ); } function swapAndSendDevETH() private { uint256 contractBalance = balanceOf(address(this)); if(contractBalance <= 0){ return; } swapTokensForETH(contractBalance, devWallet); } } interface DividendPayingTokenOptionalInterface { /// @notice View the amount of dividend in wei that an address can withdraw. /// @param _owner The address of a token holder. /// @return The amount of dividend in wei that `_owner` can withdraw. function withdrawableDividendOf(address _owner) external view returns (uint256); /// @notice View the amount of dividend in wei that an address has withdrawn. /// @param _owner The address of a token holder. /// @return The amount of dividend in wei that `_owner` has withdrawn. function withdrawnDividendOf(address _owner) external view returns (uint256); /// @notice View the amount of dividend in wei that an address has earned in total. /// @dev accumulativeDividendOf(_owner) = withdrawableDividendOf(_owner) + withdrawnDividendOf(_owner) /// @param _owner The address of a token holder. /// @return The amount of dividend in wei that `_owner` has earned in total. function accumulativeDividendOf(address _owner) external view returns (uint256); } interface DividendPayingTokenInterface { /// @notice View the amount of dividend in wei that an address can withdraw. /// @param _owner The address of a token holder. /// @return The amount of dividend in wei that `_owner` can withdraw. function dividendOf(address _owner) external view returns (uint256); /// @notice Distributes ether to token holders as dividends. /// @dev SHOULD distribute the paid ether to token holders as dividends. /// SHOULD NOT directly transfer ether to token holders in this function. /// MUST emit a `DividendsDistributed` event when the amount of distributed ether is greater than 0. function distributeDividends() external payable; /// @notice Withdraws the ether distributed to the sender. /// @dev SHOULD transfer `dividendOf(msg.sender)` wei to `msg.sender`, and `dividendOf(msg.sender)` SHOULD be 0 after the transfer. /// MUST emit a `DividendWithdrawn` event if the amount of ether transferred is greater than 0. function withdrawDividend() external; /// @dev This event MUST emit when ether is distributed to token holders. /// @param from The address which sends ether to this contract. /// @param weiAmount The amount of distributed ether in wei. event DividendsDistributed(address indexed from, uint256 weiAmount); /// @dev This event MUST emit when an address withdraws their dividend. /// @param to The address which withdraws ether from this contract. /// @param weiAmount The amount of withdrawn ether in wei. event DividendWithdrawn(address indexed to, uint256 weiAmount); } contract DividendPayingToken is ERC20, DividendPayingTokenInterface, DividendPayingTokenOptionalInterface { using SafeMath for uint256; using SafeMathUint for uint256; using SafeMathInt for int256; // With `magnitude`, we can properly distribute dividends even if the amount of received ether is small. // For more discussion about choosing the value of `magnitude`, // see https://github.com/ethereum/EIPs/issues/1726#issuecomment-472352728 uint256 internal constant magnitude = 2**128; uint256 internal magnifiedDividendPerShare; // About dividendCorrection: // If the token balance of a `_user` is never changed, the dividend of `_user` can be computed with: // `dividendOf(_user) = dividendPerShare * balanceOf(_user)`. // When `balanceOf(_user)` is changed (via minting/burning/transferring tokens), // `dividendOf(_user)` should not be changed, // but the computed value of `dividendPerShare * balanceOf(_user)` is changed. // To keep the `dividendOf(_user)` unchanged, we add a correction term: // `dividendOf(_user) = dividendPerShare * balanceOf(_user) + dividendCorrectionOf(_user)`, // where `dividendCorrectionOf(_user)` is updated whenever `balanceOf(_user)` is changed: // `dividendCorrectionOf(_user) = dividendPerShare * (old balanceOf(_user)) - (new balanceOf(_user))`. // So now `dividendOf(_user)` returns the same value before and after `balanceOf(_user)` is changed. mapping(address => int256) internal magnifiedDividendCorrections; mapping(address => uint256) internal withdrawnDividends; uint256 public totalDividendsDistributed; constructor(string memory _name, string memory _symbol) ERC20(_name, _symbol) {} /// @dev Distributes dividends whenever ether is paid to this contract. receive() external payable { distributeDividends(); } /// @notice Distributes ether to token holders as dividends. /// @dev It reverts if the total supply of tokens is 0. /// It emits the `DividendsDistributed` event if the amount of received ether is greater than 0. /// About undistributed ether: /// In each distribution, there is a small amount of ether not distributed, /// the magnified amount of which is /// `(msg.value * magnitude) % totalSupply()`. /// With a well-chosen `magnitude`, the amount of undistributed ether /// (de-magnified) in a distribution can be less than 1 wei. /// We can actually keep track of the undistributed ether in a distribution /// and try to distribute it in the next distribution, /// but keeping track of such data on-chain costs much more than /// the saved ether, so we don't do that. function distributeDividends() public payable override { require(totalSupply() > 0); if (msg.value > 0) { magnifiedDividendPerShare = magnifiedDividendPerShare.add( (msg.value).mul(magnitude) / totalSupply() ); emit DividendsDistributed(msg.sender, msg.value); totalDividendsDistributed = totalDividendsDistributed.add( msg.value ); } } /// @notice Withdraws the ether distributed to the sender. /// @dev It emits a `DividendWithdrawn` event if the amount of withdrawn ether is greater than 0. function withdrawDividend() public virtual override { _withdrawDividendOfUser(payable(msg.sender)); } /// @notice Withdraws the ether distributed to the sender. /// @dev It emits a `DividendWithdrawn` event if the amount of withdrawn ether is greater than 0. function _withdrawDividendOfUser(address payable user) internal virtual returns (uint256) { uint256 _withdrawableDividend = withdrawableDividendOf(user); if (_withdrawableDividend > 0) { withdrawnDividends[user] = withdrawnDividends[user].add( _withdrawableDividend ); emit DividendWithdrawn(user, _withdrawableDividend); (bool success, ) = user.call{ value: _withdrawableDividend, gas: 3000 }(""); if (!success) { withdrawnDividends[user] = withdrawnDividends[user].sub( _withdrawableDividend ); return 0; } return _withdrawableDividend; } return 0; } /// @notice View the amount of dividend in wei that an address can withdraw. /// @param _owner The address of a token holder. /// @return The amount of dividend in wei that `_owner` can withdraw. function dividendOf(address _owner) public view override returns (uint256) { return withdrawableDividendOf(_owner); } /// @notice View the amount of dividend in wei that an address can withdraw. /// @param _owner The address of a token holder. /// @return The amount of dividend in wei that `_owner` can withdraw. function withdrawableDividendOf(address _owner) public view override returns (uint256) { return accumulativeDividendOf(_owner).sub(withdrawnDividends[_owner]); } /// @notice View the amount of dividend in wei that an address has withdrawn. /// @param _owner The address of a token holder. /// @return The amount of dividend in wei that `_owner` has withdrawn. function withdrawnDividendOf(address _owner) public view override returns (uint256) { return withdrawnDividends[_owner]; } /// @notice View the amount of dividend in wei that an address has earned in total. /// @dev accumulativeDividendOf(_owner) = withdrawableDividendOf(_owner) + withdrawnDividendOf(_owner) /// = (magnifiedDividendPerShare * balanceOf(_owner) + magnifiedDividendCorrections[_owner]) / magnitude /// @param _owner The address of a token holder. /// @return The amount of dividend in wei that `_owner` has earned in total. function accumulativeDividendOf(address _owner) public view override returns (uint256) { return magnifiedDividendPerShare .mul(balanceOf(_owner)) .toInt256Safe() .add(magnifiedDividendCorrections[_owner]) .toUint256Safe() / magnitude; } /// @dev Internal function that mints tokens to an account. /// Update magnifiedDividendCorrections to keep dividends unchanged. /// @param account The account that will receive the created tokens. /// @param value The amount that will be created. function _mint(address account, uint256 value) internal override { super._mint(account, value); magnifiedDividendCorrections[account] = magnifiedDividendCorrections[ account ].sub((magnifiedDividendPerShare.mul(value)).toInt256Safe()); } /// @dev Internal function that burns an amount of the token of a given account. /// Update magnifiedDividendCorrections to keep dividends unchanged. /// @param account The account whose tokens will be burnt. /// @param value The amount that will be burnt. function _burn(address account, uint256 value) internal override { super._burn(account, value); magnifiedDividendCorrections[account] = magnifiedDividendCorrections[ account ].add((magnifiedDividendPerShare.mul(value)).toInt256Safe()); } function _setBalance(address account, uint256 newBalance) internal { uint256 currentBalance = balanceOf(account); if (newBalance > currentBalance) { uint256 mintAmount = newBalance.sub(currentBalance); _mint(account, mintAmount); } else if (newBalance < currentBalance) { uint256 burnAmount = currentBalance.sub(newBalance); _burn(account, burnAmount); } } } library IterableMapping { // Iterable mapping from address to uint; struct Map { address[] keys; mapping(address => uint) values; mapping(address => uint) indexOf; mapping(address => bool) inserted; } function get(Map storage map, address key) public view returns (uint) { return map.values[key]; } function getIndexOfKey(Map storage map, address key) public view returns (int) { if(!map.inserted[key]) { return -1; } return int(map.indexOf[key]); } function getKeyAtIndex(Map storage map, uint index) public view returns (address) { return map.keys[index]; } function size(Map storage map) public view returns (uint) { return map.keys.length; } function set(Map storage map, address key, uint val) public { if (map.inserted[key]) { map.values[key] = val; } else { map.inserted[key] = true; map.values[key] = val; map.indexOf[key] = map.keys.length; map.keys.push(key); } } function remove(Map storage map, address key) public { if (!map.inserted[key]) { return; } delete map.inserted[key]; delete map.values[key]; uint index = map.indexOf[key]; uint lastIndex = map.keys.length - 1; address lastKey = map.keys[lastIndex]; map.indexOf[lastKey] = index; delete map.indexOf[key]; map.keys[index] = lastKey; map.keys.pop(); } } library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } contract DividendTracker is DividendPayingToken, Ownable { using SafeMath for uint256; using SafeMathInt for int256; using IterableMapping for IterableMapping.Map; IterableMapping.Map private tokenHoldersMap; uint256 public lastProcessedIndex; mapping (address => bool) public excludedFromDividends; mapping (address => uint256) public lastClaimTimes; uint256 public claimWait; uint256 public minimumTokenBalanceForDividends; event ExcludeFromDividends(address indexed account); event ClaimWaitUpdated(uint256 indexed newValue, uint256 indexed oldValue); event Claim(address indexed account, uint256 amount, bool indexed automatic); constructor() DividendPayingToken("Dividend_Tracker", "Dividend_Tracker") { claimWait = 24 hours; minimumTokenBalanceForDividends = 10000 * (10**18); //must hold 10000+ tokens } function _transfer(address, address, uint256) internal pure override { require(false, "Dividend_Tracker: No transfers allowed"); } function withdrawDividend() public pure override { require(false, "Dividend_Tracker: withdrawDividend disabled. Use the 'claim' function on the main contract."); } /// @dev It will send all ETH to curent contracty owner function recoverETH() external onlyOwner { uint256 ETHbalance = address(this).balance; (bool success, ) = payable(owner()).call{value: ETHbalance}(""); require(success); } function excludeFromDividends(address account) external onlyOwner { require(!excludedFromDividends[account]); excludedFromDividends[account] = true; _setBalance(account, 0); tokenHoldersMap.remove(account); emit ExcludeFromDividends(account); } function getNumberOfTokenHolders() external view returns(uint256) { return tokenHoldersMap.keys.length; } function getAccount(address _account) public view returns ( address account, int256 index, uint256 withdrawableDividends, uint256 totalDividends, uint256 lastClaimTime, uint256 nextClaimTime, uint256 secondsUntilNextClaimAvailable) { account = _account; index = tokenHoldersMap.getIndexOfKey(account); withdrawableDividends = withdrawableDividendOf(account); totalDividends = accumulativeDividendOf(account); lastClaimTime = lastClaimTimes[account]; nextClaimTime = lastClaimTime > 0 ? lastClaimTime.add(claimWait) : 0; secondsUntilNextClaimAvailable = nextClaimTime > block.timestamp ? nextClaimTime.sub(block.timestamp) : 0; } function getAccountAtIndex(uint256 index) public view returns ( address, int256, uint256, uint256, uint256, uint256, uint256) { if(index >= 10) { return (0x0000000000000000000000000000000000000000, -1, 0, 0, 0, 0, 0); } address account = tokenHoldersMap.getKeyAtIndex(index); return getAccount(account); } function setBalance(address payable account, uint256 newBalance) external onlyOwner { if(excludedFromDividends[account]) { return; } if(newBalance >= minimumTokenBalanceForDividends) { _setBalance(account, newBalance); tokenHoldersMap.set(account, newBalance); } else { _setBalance(account, 0); tokenHoldersMap.remove(account); } } function process(uint256 gas) public returns (uint256, uint256, uint256) { uint256 numberOfTokenHolders = tokenHoldersMap.keys.length; if(numberOfTokenHolders == 0) { return (0, 0, lastProcessedIndex); } uint256 _lastProcessedIndex = lastProcessedIndex; uint256 gasUsed = 0; uint256 gasLeft = gasleft(); uint256 iterations = 0; uint256 claims = 0; while(gasUsed < gas && iterations < numberOfTokenHolders) { _lastProcessedIndex++; if(_lastProcessedIndex >= tokenHoldersMap.keys.length) { _lastProcessedIndex = 0; } address account = tokenHoldersMap.keys[_lastProcessedIndex]; if(processAccount(payable(account), true)) { claims++; } iterations++; uint256 newGasLeft = gasleft(); if(gasLeft > newGasLeft) { gasUsed = gasUsed.add(gasLeft.sub(newGasLeft)); } gasLeft = newGasLeft; } lastProcessedIndex = _lastProcessedIndex; return (iterations, claims, lastProcessedIndex); } function processAccount(address payable account, bool automatic) public onlyOwner returns (bool) { uint256 amount = _withdrawDividendOfUser(account); if(amount > 0) { lastClaimTimes[account] = block.timestamp; emit Claim(account, amount, automatic); return true; } return false; } }
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":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"iterations","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"claims","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lastProcessedIndex","type":"uint256"},{"indexed":true,"internalType":"bool","name":"automatic","type":"bool"},{"indexed":false,"internalType":"uint256","name":"gas","type":"uint256"},{"indexed":true,"internalType":"address","name":"processor","type":"address"}],"name":"ProcessedDividendTracker","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethAmount","type":"uint256"}],"name":"SendDividends","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"CAW","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"amount","type":"uint256[]"},{"internalType":"uint256","name":"_unlockTime","type":"uint256"}],"name":"airDrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"airDropWalletsData","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"unlockTime","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cawCollectWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"createPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"devWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dividendTracker","outputs":[{"internalType":"contract DividendTracker","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"gas","type":"uint256"}],"name":"processDividendTracker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"recoverETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"router","outputs":[{"internalType":"contract IRouter","name":"","type":"address"}],"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":"view","type":"function"},{"inputs":[],"name":"totalBuyFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSellFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"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":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"updateDividendTracker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"updateSwapTokensAtAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60a06040526004600b556001600c556003600d556001600e556003600f55600460105562000049600d5462000042600c54600b546200038260201b90919060201c565b9062000382565b601155600e54601054600f5462000067929162000042919062000382565b601255600060138190556014819055601555601680546001600160a01b031990811673bf38fa464f04f18568938d24b72fea56da76bc4a179091556017805490911673efe317a9230d5852ac5e5ad0ed5400c1c8e0d65c1790556c02a68bedbb190931f65000000060195573f3b9569f82b18aef890de263b84189bd33ebe452608052348015620000f757600080fd5b506040518060400160405280600d81526020016c21a0ab9029bab83837b93a32b960991b8152506040518060400160405280600781526020016621a0aba2a627a760c91b81525081600390816200014f9190620005e3565b5060046200015e8282620005e3565b5050506200017b62000175620003f260201b60201c565b620003f6565b604051620001899062000531565b604051809103906000f080158015620001a6573d6000803e3d6000fd5b50601880546001600160a01b0319166001600160a01b0392909216918217905560405163031e79db60e41b8152600481018290526331e79db090602401600060405180830381600087803b158015620001fe57600080fd5b505af115801562000213573d6000803e3d6000fd5b505060185460405163031e79db60e41b81523060048201526001600160a01b0390911692506331e79db09150602401600060405180830381600087803b1580156200025d57600080fd5b505af115801562000272573d6000803e3d6000fd5b505060185460405163031e79db60e41b815261dead60048201526001600160a01b0390911692506331e79db09150602401600060405180830381600087803b158015620002be57600080fd5b505af1158015620002d3573d6000803e3d6000fd5b50503060009081526009602052604081208054600160ff1991821681179092557f6068e1280f5b79ff007e25fc172ca51eeb31f00acebfd703f684b6eb48e1a770805482168317905561dead9092527f960b1051749987b45b5679007fff577a1c2f763ec21c15a6c5eb1930750037858054909216179055506200037c90507349e1f66863e08eff662ba879c636f4eadedd33b36d14b5253145b397d654510000000062000448565b620006d1565b600080620003918385620006af565b905083811015620003e95760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f77000000000060448201526064015b60405180910390fd5b90505b92915050565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038216620004a05760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401620003e0565b600254620004af908262000382565b6002556001600160a01b038216600090815260208190526040902054620004d7908262000382565b6001600160a01b038316600081815260208181526040808320949094559251848152919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b505050565b611ea88062002e2383390190565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200056a57607f821691505b6020821081036200058b57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200052c57600081815260208120601f850160051c81016020861015620005ba5750805b601f850160051c820191505b81811015620005db57828155600101620005c6565b505050505050565b81516001600160401b03811115620005ff57620005ff6200053f565b620006178162000610845462000555565b8462000591565b602080601f8311600181146200064f5760008415620006365750858301515b600019600386901b1c1916600185901b178555620005db565b600085815260208120601f198616915b8281101562000680578886015182559484019460019091019084016200065f565b50858210156200069f5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b80820180821115620003ec57634e487b7160e01b600052601160045260246000fd5b60805161272f620006f4600039600081816106580152611e1e015261272f6000f3fe6080604052600436106101f25760003560e01c80637e002d2a1161010d578063b84b0b6a116100a0578063dd62ed3e1161006f578063dd62ed3e146105aa578063e2f45605146105f0578063f2fde38b14610606578063f887ea4014610626578063fce7416b1461064657600080fd5b8063b84b0b6a1461053e578063b9e937001461055e578063d0a3981414610574578063d257b34f1461058a57600080fd5b806395d89b41116100dc57806395d89b41146104c45780639e78fb4f146104d9578063a9059cbb146104ee578063b62496f51461050e57600080fd5b80637e002d2a1461041d57806388bdd9be146104665780638da5cb5b146104865780638ea5220f146104a457600080fd5b806331e79db011610185578063700bb19111610154578063700bb1911461039857806370a08231146103b8578063715018a6146103d8578063768dc710146103ed57600080fd5b806331e79db014610323578063437823ec1461034357806349bd5a5e146103635780634e71d92d1461038357600080fd5b806318160ddd116101c157806318160ddd1461029057806323b872dd146102af5780632c1f5216146102cf578063313ce5671461030757600080fd5b80630614117a146101fe57806306fdde0314610215578063095ea7b3146102405780630a3db14f1461027057600080fd5b366101f957005b600080fd5b34801561020a57600080fd5b5061021361067a565b005b34801561022157600080fd5b5061022a610723565b6040516102379190612267565b60405180910390f35b34801561024c57600080fd5b5061026061025b3660046122ca565b6107b5565b6040519015158152602001610237565b34801561027c57600080fd5b5061021361028b366004612342565b6107cc565b34801561029c57600080fd5b506002545b604051908152602001610237565b3480156102bb57600080fd5b506102606102ca3660046123b6565b6109be565b3480156102db57600080fd5b506018546102ef906001600160a01b031681565b6040516001600160a01b039091168152602001610237565b34801561031357600080fd5b5060405160128152602001610237565b34801561032f57600080fd5b5061021361033e3660046123f7565b610a27565b34801561034f57600080fd5b5061021361035e3660046123f7565b610ab3565b34801561036f57600080fd5b506007546102ef906001600160a01b031681565b34801561038f57600080fd5b50610213610b01565b3480156103a457600080fd5b506102136103b3366004612414565b610b79565b3480156103c457600080fd5b506102a16103d33660046123f7565b610c4b565b3480156103e457600080fd5b50610213610c66565b3480156103f957600080fd5b506102606104083660046123f7565b60096020526000908152604090205460ff1681565b34801561042957600080fd5b506104516104383660046123f7565b6008602052600090815260409020805460019091015482565b60408051928352602083019190915201610237565b34801561047257600080fd5b506102136104813660046123f7565b610c9c565b34801561049257600080fd5b506005546001600160a01b03166102ef565b3480156104b057600080fd5b506017546102ef906001600160a01b031681565b3480156104d057600080fd5b5061022a610f36565b3480156104e557600080fd5b50610213610f45565b3480156104fa57600080fd5b506102606105093660046122ca565b61116b565b34801561051a57600080fd5b506102606105293660046123f7565b600a6020526000908152604090205460ff1681565b34801561054a57600080fd5b506016546102ef906001600160a01b031681565b34801561056a57600080fd5b506102a160115481565b34801561058057600080fd5b506102a160125481565b34801561059657600080fd5b506102136105a5366004612414565b611178565b3480156105b657600080fd5b506102a16105c536600461242d565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b3480156105fc57600080fd5b506102a160195481565b34801561061257600080fd5b506102136106213660046123f7565b611257565b34801561063257600080fd5b506006546102ef906001600160a01b031681565b34801561065257600080fd5b506102ef7f000000000000000000000000000000000000000000000000000000000000000081565b6005546001600160a01b031633146106ad5760405162461bcd60e51b81526004016106a490612466565b60405180910390fd5b4760006106c26005546001600160a01b031690565b6001600160a01b03168260405160006040518083038185875af1925050503d806000811461070c576040519150601f19603f3d011682016040523d82523d6000602084013e610711565b606091505b505090508061071f57600080fd5b5050565b6060600380546107329061249b565b80601f016020809104026020016040519081016040528092919081815260200182805461075e9061249b565b80156107ab5780601f10610780576101008083540402835291602001916107ab565b820191906000526020600020905b81548152906001019060200180831161078e57829003601f168201915b5050505050905090565b60006107c23384846112ef565b5060015b92915050565b6005546001600160a01b031633146107f65760405162461bcd60e51b81526004016106a490612466565b60005b848110156109b657306323b872dd3388888581811061081a5761081a6124d5565b905060200201602081019061082f91906123f7565b878786818110610841576108416124d5565b90506020020135670de0b6b3a764000061085b9190612501565b6040516001600160e01b031960e086901b1681526001600160a01b03938416600482015292909116602483015260448201526064016020604051808303816000875af11580156108af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108d39190612518565b508383828181106108e6576108e66124d5565b90506020020135670de0b6b3a76400006109009190612501565b60086000888885818110610916576109166124d5565b905060200201602081019061092b91906123f7565b6001600160a01b0316815260208101919091526040016000205561095c6109558362015180612501565b4290611414565b60086000888885818110610972576109726124d5565b905060200201602081019061098791906123f7565b6001600160a01b03168152602081019190915260400160002060010155806109ae8161253a565b9150506107f9565b505050505050565b60006109cb84848461147a565b610a1d8433610a18856040518060600160405280602881526020016126d2602891396001600160a01b038a1660009081526001602090815260408083203384529091529020549190611a78565b6112ef565b5060019392505050565b6005546001600160a01b03163314610a515760405162461bcd60e51b81526004016106a490612466565b60185460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db090602401600060405180830381600087803b158015610a9857600080fd5b505af1158015610aac573d6000803e3d6000fd5b5050505050565b6005546001600160a01b03163314610add5760405162461bcd60e51b81526004016106a490612466565b6001600160a01b03166000908152600960205260409020805460ff19166001179055565b60185460405163bc4c4b3760e01b8152336004820152600060248201526001600160a01b039091169063bc4c4b37906044016020604051808303816000875af1158015610b52573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b769190612518565b50565b6018546040516001624d3b8760e01b0319815260048101839052600091829182916001600160a01b03169063ffb2c479906024016060604051808303816000875af1158015610bcc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bf09190612553565b604080518481526020810184905290810182905260608101889052929550909350915032906000907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a350505050565b6001600160a01b031660009081526020819052604090205490565b6005546001600160a01b03163314610c905760405162461bcd60e51b81526004016106a490612466565b610c9a6000611ab2565b565b6005546001600160a01b03163314610cc65760405162461bcd60e51b81526004016106a490612466565b6018546001600160a01b0390811690821603610d3b5760405162461bcd60e51b815260206004820152602e60248201527f20546865206469766964656e6420747261636b657220616c726561647920686160448201526d732074686174206164647265737360901b60648201526084016106a4565b601860009054906101000a90046001600160a01b03166001600160a01b0316630614117a6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610d8b57600080fd5b505af1158015610d9f573d6000803e3d6000fd5b505060405163031e79db60e41b81526001600160a01b0384166004820181905284935091506331e79db090602401600060405180830381600087803b158015610de757600080fd5b505af1158015610dfb573d6000803e3d6000fd5b505060405163031e79db60e41b81523060048201526001600160a01b03841692506331e79db09150602401600060405180830381600087803b158015610e4057600080fd5b505af1158015610e54573d6000803e3d6000fd5b505060075460405163031e79db60e41b81526001600160a01b03918216600482015290841692506331e79db09150602401600060405180830381600087803b158015610e9f57600080fd5b505af1158015610eb3573d6000803e3d6000fd5b505060405163031e79db60e41b815261dead60048201526001600160a01b03841692506331e79db09150602401600060405180830381600087803b158015610efa57600080fd5b505af1158015610f0e573d6000803e3d6000fd5b5050601880546001600160a01b0319166001600160a01b039490941693909317909255505050565b6060600480546107329061249b565b6005546001600160a01b03163314610f6f5760405162461bcd60e51b81526004016106a490612466565b6000737a250d5630b4cf539739df2c5dacb4c659f2488d90506000816001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015610fc8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fec9190612581565b6001600160a01b031663c9c6539630846001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611039573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061105d9190612581565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af11580156110aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110ce9190612581565b600680546001600160a01b038581166001600160a01b031992831617909255600780548484169216821781556000918252600a602052604091829020805460ff191660011790556018549054915163031e79db60e41b815291831660048301529293509116906331e79db090602401600060405180830381600087803b15801561115757600080fd5b505af11580156109b6573d6000803e3d6000fd5b60006107c233848461147a565b6005546001600160a01b031633146111a25760405162461bcd60e51b81526004016106a490612466565b6107d06111ae60025490565b6111b8919061259e565b81101561123f5760405162461bcd60e51b815260206004820152604960248201527f53776170546f6b656e734174416d6f756e74206d75737420626520677265617460448201527f6572207468616e206f7220657175616c20746f20302e303525206f6620746f74606482015268616c20737570706c7960b81b608482015260a4016106a4565b61125181670de0b6b3a7640000612501565b60195550565b6005546001600160a01b031633146112815760405162461bcd60e51b81526004016106a490612466565b6001600160a01b0381166112e65760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016106a4565b610b7681611ab2565b6001600160a01b0383166113515760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016106a4565b6001600160a01b0382166113b25760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016106a4565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b60008061142183856125c0565b9050838110156114735760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f77000000000060448201526064016106a4565b9392505050565b6001600160a01b0383166114a05760405162461bcd60e51b81526004016106a4906125d3565b600081116115025760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b60648201526084016106a4565b6007546001600160a01b0384811691161461158757306001600160a01b038316036115875760405162461bcd60e51b815260206004820152602f60248201527f596f752063616e6e6f742073656e6420746f6b656e7320746f2074686520636f60448201526e6e747261637420616464726573732160881b60648201526084016106a4565b806000036115a05761159b83836000611b04565b505050565b600754600160a01b900460ff161580156115d357506001600160a01b03831660009081526009602052604090205460ff16155b80156115f857506001600160a01b03821660009081526009602052604090205460ff16155b1561197e576001600160a01b038083166000908152600a602052604080822054928616825290205460ff918216911681801561164257506006546001600160a01b03868116911614155b156116e2576001600160a01b038516600090815260086020526040902060010154421180159061168957506001600160a01b03851660009081526008602052604090205415155b156116c6576001600160a01b0385166000908152600860205260409020546116ba906116b487610c4b565b90611c49565b8311156116c657600080fd5b600e54601a556000601d55601054601b55600f54601c556117e6565b8080156116fd57506006546001600160a01b03858116911614155b1561171e57600c54601a556000601b55600d54601c55600b54601d556117e6565b6000601a819055601b819055601c819055601d8190556001600160a01b038616815260086020526040902060010154421180159061177357506001600160a01b03851660009081526008602052604090205415155b156117e6576001600160a01b03851660009081526008602052604090205461179e906116b487610c4b565b8311156117e65760405162461bcd60e51b81526020600482015260166024820152751dd85a5d08199bdc881d5b9b1bd8dac81c195c9a5bd960521b60448201526064016106a4565b60006117f130610c4b565b6019549091508110801590819061182157506001600160a01b0387166000908152600a602052604090205460ff16155b15611871576007805460ff60a01b1916600160a01b17905560155461184590611c8b565b611850601454611d35565b61185b601354611f00565b611863611feb565b6007805460ff60a01b191690555b6000611893606461188d601a548961201a90919063ffffffff16565b9061209c565b905060006118b1606461188d601c548a61201a90919063ffffffff16565b905060006118cf606461188d601b548b61201a90919063ffffffff16565b905060006118ed606461188d601d548c61201a90919063ffffffff16565b9050826015600082825461190191906125c0565b92505081905550816014600082825461191a91906125c0565b92505081905550806013600082825461193391906125c0565b9091555060009050818361194786886125c0565b61195191906125c0565b61195b91906125c0565b90506119678a82611c49565b99506119748c3083611b04565b5050505050505050505b611989838383611b04565b6018546001600160a01b031663e30443bc846119a481610c4b565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b1580156119ea57600080fd5b505af19250505080156119fb575060015b506018546001600160a01b031663e30443bc83611a1781610c4b565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015611a5d57600080fd5b505af1925050508015611a6e575060015b1561159b57505050565b60008184841115611a9c5760405162461bcd60e51b81526004016106a49190612267565b506000611aa98486612618565b95945050505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038316611b2a5760405162461bcd60e51b81526004016106a4906125d3565b6001600160a01b038216611b8c5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016106a4565b611bc9816040518060600160405280602681526020016126ac602691396001600160a01b0386166000908152602081905260409020549190611a78565b6001600160a01b038085166000908152602081905260408082209390935590841681522054611bf89082611414565b6001600160a01b038381166000818152602081815260409182902094909455518481529092918616917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101611407565b600061147383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611a78565b6000611c9630610c4b565b905080821115611ca4575050565b60405163a9059cbb60e01b815261dead600482015260248101839052600090309063a9059cbb906044016020604051808303816000875af1158015611ced573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d119190612518565b9050801561159b578260156000828254611d2b9190612618565b9091555050505050565b60408051600380825260808201909252600091602082016060803683370190505090503081600081518110611d6c57611d6c6124d5565b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015611dc5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611de99190612581565b81600181518110611dfc57611dfc6124d5565b60200260200101906001600160a01b031690816001600160a01b0316815250507f000000000000000000000000000000000000000000000000000000000000000081600281518110611e5057611e506124d5565b6001600160a01b039283166020918202929092010152600654611e7691309116846112ef565b600654601654604051635c11d79560e01b81526001600160a01b0392831692635c11d79592611eb39287926000928892911690429060040161266f565b600060405180830381600087803b158015611ecd57600080fd5b505af1158015611ee1573d6000803e3d6000fd5b505050508160146000828254611ef79190612618565b90915550505050565b47600080611f0d30610c4b565b905080841115611f1d5750505050565b611f2784306120de565b611f318347612618565b91508360136000828254611f459190612618565b909155505060185460405183916000916001600160a01b039091169083908381818185875af1925050503d8060008114611f9b576040519150601f19603f3d011682016040523d82523d6000602084013e611fa0565b606091505b5050905080156109b65760408051878152602081018490527f80195cc573b02cc48460cbca6e6e4cc85ddb91959d946e1c3025ea3d87942dc3910160405180910390a1505050505050565b6000611ff630610c4b565b9050600081116120035750565b601754610b769082906001600160a01b03166120de565b60008260000361202c575060006107c6565b60006120388385612501565b905082612045858361259e565b146114735760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b60648201526084016106a4565b600061147383836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612239565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110612113576121136124d5565b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa15801561216c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121909190612581565b816001815181106121a3576121a36124d5565b6001600160a01b0392831660209182029290920101526006546121c991309116856112ef565b60065460405163791ac94760e01b81526001600160a01b039091169063791ac9479061220290869060009086908890429060040161266f565b600060405180830381600087803b15801561221c57600080fd5b505af1158015612230573d6000803e3d6000fd5b50505050505050565b6000818361225a5760405162461bcd60e51b81526004016106a49190612267565b506000611aa9848661259e565b600060208083528351808285015260005b8181101561229457858101830151858201604001528201612278565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114610b7657600080fd5b600080604083850312156122dd57600080fd5b82356122e8816122b5565b946020939093013593505050565b60008083601f84011261230857600080fd5b50813567ffffffffffffffff81111561232057600080fd5b6020830191508360208260051b850101111561233b57600080fd5b9250929050565b60008060008060006060868803121561235a57600080fd5b853567ffffffffffffffff8082111561237257600080fd5b61237e89838a016122f6565b9097509550602088013591508082111561239757600080fd5b506123a4888289016122f6565b96999598509660400135949350505050565b6000806000606084860312156123cb57600080fd5b83356123d6816122b5565b925060208401356123e6816122b5565b929592945050506040919091013590565b60006020828403121561240957600080fd5b8135611473816122b5565b60006020828403121561242657600080fd5b5035919050565b6000806040838503121561244057600080fd5b823561244b816122b5565b9150602083013561245b816122b5565b809150509250929050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c908216806124af57607f821691505b6020821081036124cf57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b80820281158282048414176107c6576107c66124eb565b60006020828403121561252a57600080fd5b8151801515811461147357600080fd5b60006001820161254c5761254c6124eb565b5060010190565b60008060006060848603121561256857600080fd5b8351925060208401519150604084015190509250925092565b60006020828403121561259357600080fd5b8151611473816122b5565b6000826125bb57634e487b7160e01b600052601260045260246000fd5b500490565b808201808211156107c6576107c66124eb565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b818103818111156107c6576107c66124eb565b600081518084526020808501945080840160005b838110156126645781516001600160a01b03168752958201959082019060010161263f565b509495945050505050565b85815284602082015260a06040820152600061268e60a083018661262b565b6001600160a01b039490941660608301525060800152939250505056fe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365a2646970667358221220bc0fe1e0183f204945961a1dcb6d490a568975231b49329d2019767f8251726a64736f6c6343000813003360806040523480156200001157600080fd5b5060408051808201825260108082526f2234bb34b232b7322faa3930b1b5b2b960811b602080840182905284518086019095529184529083015290818160036200005c8382620001a0565b5060046200006b8282620001a0565b50505050506200008a62000084620000a560201b60201c565b620000a9565b6201518060115569021e19e0c9bab24000006012556200026c565b3390565b600980546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200012657607f821691505b6020821081036200014757634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200019b57600081815260208120601f850160051c81016020861015620001765750805b601f850160051c820191505b81811015620001975782815560010162000182565b5050505b505050565b81516001600160401b03811115620001bc57620001bc620000fb565b620001d481620001cd845462000111565b846200014d565b602080601f8311600181146200020c5760008415620001f35750858301515b600019600386901b1c1916600185901b17855562000197565b600085815260208120601f198616915b828110156200023d578886015182559484019460019091019084016200021c565b50858210156200025c5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b611c2c806200027c6000396000f3fe6080604052600436106101e75760003560e01c806370a0823111610102578063aafd847a11610095578063e30443bc11610064578063e30443bc146105d0578063f2fde38b146105f0578063fbcbc0f114610610578063ffb2c4791461063057600080fd5b8063aafd847a1461051e578063bc4c4b3714610554578063be10b61414610574578063dd62ed3e1461058a57600080fd5b806391b89fba116100d157806391b89fba146104a957806395d89b41146104c9578063a8b9d240146104de578063a9059cbb146104fe57600080fd5b806370a0823114610420578063715018a61461045657806385a6b3ae1461046b5780638da5cb5b1461048157600080fd5b806327ce01471161017a5780634e7b827f116101495780634e7b827f146103665780635183d6fd146103965780636a474002146103f55780636f2789ec1461040a57600080fd5b806327ce0147146102f45780633009a60914610314578063313ce5671461032a57806331e79db01461034657600080fd5b806309bbedde116101b657806309bbedde1461027357806318160ddd14610292578063226cfa3d146102a757806323b872dd146102d457600080fd5b806303c83302146101fb5780630614117a1461020357806306fdde0314610218578063095ea7b31461024357600080fd5b366101f6576101f461066b565b005b600080fd5b6101f461066b565b34801561020f57600080fd5b506101f46106fe565b34801561022457600080fd5b5061022d6107a7565b60405161023a91906118a9565b60405180910390f35b34801561024f57600080fd5b5061026361025e36600461190c565b610839565b604051901515815260200161023a565b34801561027f57600080fd5b50600a545b60405190815260200161023a565b34801561029e57600080fd5b50600254610284565b3480156102b357600080fd5b506102846102c2366004611938565b60106020526000908152604090205481565b3480156102e057600080fd5b506102636102ef366004611955565b610850565b34801561030057600080fd5b5061028461030f366004611938565b6108b9565b34801561032057600080fd5b50610284600e5481565b34801561033657600080fd5b506040516012815260200161023a565b34801561035257600080fd5b506101f4610361366004611938565b610915565b34801561037257600080fd5b50610263610381366004611938565b600f6020526000908152604090205460ff1681565b3480156103a257600080fd5b506103b66103b1366004611996565b610a3c565b604080516001600160a01b0390981688526020880196909652948601939093526060850191909152608084015260a083015260c082015260e00161023a565b34801561040157600080fd5b506101f4610b0f565b34801561041657600080fd5b5061028460115481565b34801561042c57600080fd5b5061028461043b366004611938565b6001600160a01b031660009081526020819052604090205490565b34801561046257600080fd5b506101f4610ba3565b34801561047757600080fd5b5061028460085481565b34801561048d57600080fd5b506009546040516001600160a01b03909116815260200161023a565b3480156104b557600080fd5b506102846104c4366004611938565b610bd7565b3480156104d557600080fd5b5061022d610be2565b3480156104ea57600080fd5b506102846104f9366004611938565b610bf1565b34801561050a57600080fd5b5061026361051936600461190c565b610c1d565b34801561052a57600080fd5b50610284610539366004611938565b6001600160a01b031660009081526007602052604090205490565b34801561056057600080fd5b5061026361056f3660046119af565b610c2a565b34801561058057600080fd5b5061028460125481565b34801561059657600080fd5b506102846105a53660046119ed565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b3480156105dc57600080fd5b506101f46105eb36600461190c565b610cd8565b3480156105fc57600080fd5b506101f461060b366004611938565b610e05565b34801561061c57600080fd5b506103b661062b366004611938565b610ea0565b34801561063c57600080fd5b5061065061064b366004611996565b610fa7565b6040805193845260208401929092529082015260600161023a565b600061067660025490565b1161068057600080fd5b34156106fc576106b361069260025490565b6106a034600160801b6110a5565b6106aa9190611a31565b6005549061112e565b60055560405134815233907fa493a9229478c3fcd73f66d2cdeb7f94fd0f341da924d1054236d784541165119060200160405180910390a26008546106f8903461112e565b6008555b565b6009546001600160a01b031633146107315760405162461bcd60e51b815260040161072890611a53565b60405180910390fd5b4760006107466009546001600160a01b031690565b6001600160a01b03168260405160006040518083038185875af1925050503d8060008114610790576040519150601f19603f3d011682016040523d82523d6000602084013e610795565b606091505b50509050806107a357600080fd5b5050565b6060600380546107b690611a88565b80601f01602080910402602001604051908101604052809291908181526020018280546107e290611a88565b801561082f5780601f106108045761010080835404028352916020019161082f565b820191906000526020600020905b81548152906001019060200180831161081257829003601f168201915b5050505050905090565b600061084633848461118d565b5060015b92915050565b600061085d8484846112b1565b6108af84336108aa85604051806060016040528060288152602001611bcf602891396001600160a01b038a166000908152600160209081526040808320338452909152902054919061130d565b61118d565b5060019392505050565b6001600160a01b03811660009081526006602090815260408083205491839052822054600554600160801b9261090b9261090692610900916108fb91906110a5565b611347565b90611357565b611395565b61084a9190611a31565b6009546001600160a01b0316331461093f5760405162461bcd60e51b815260040161072890611a53565b6001600160a01b0381166000908152600f602052604090205460ff161561096557600080fd5b6001600160a01b0381166000908152600f60205260408120805460ff191660011790556109939082906113a8565b60405163131836e760e21b8152600a60048201526001600160a01b0382166024820152736aace99a58d06053785676f5f8ea3555c12b798890634c60db9c9060440160006040518083038186803b1580156109ed57600080fd5b505af4158015610a01573d6000803e3d6000fd5b50506040516001600160a01b03841692507fa878b31040b2e6d0a9a3d3361209db3908ba62014b0dca52adbaee451d128b259150600090a250565b6000806000806000806000600a8810610a6b575060009550600019945085935083925082915081905080610b04565b6040516368d54f3f60e11b8152600a600482015260248101899052600090736aace99a58d06053785676f5f8ea3555c12b79889063d1aa9e7e90604401602060405180830381865af4158015610ac5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ae99190611ac2565b9050610af481610ea0565b9750975097509750975097509750505b919395979092949650565b60405162461bcd60e51b815260206004820152605c60248201527f4469766964656e645f547261636b65723a20776974686472617744697669646560448201527f6e642064697361626c65642e20557365207468652027636c61696d272066756e60648201527f6374696f6e206f6e20746865206d61696e2020636f6e74726163742e00000000608482015260a401610728565b6009546001600160a01b03163314610bcd5760405162461bcd60e51b815260040161072890611a53565b6106fc6000611407565b600061084a82610bf1565b6060600480546107b690611a88565b6001600160a01b03811660009081526007602052604081205461084a90610c17846108b9565b90611459565b60006108463384846112b1565b6009546000906001600160a01b03163314610c575760405162461bcd60e51b815260040161072890611a53565b6000610c628461149b565b90508015610cce576001600160a01b038416600081815260106020526040908190204290555184151591907fa2c38e2d2fb7e3e1912d937fd1ca11ed6d51864dee4cfa7a7bf02becd7acf09290610cbc9085815260200190565b60405180910390a3600191505061084a565b5060009392505050565b6009546001600160a01b03163314610d025760405162461bcd60e51b815260040161072890611a53565b6001600160a01b0382166000908152600f602052604090205460ff166107a3576012548110610db357610d3582826113a8565b604051632f0ad01760e21b8152600a60048201526001600160a01b038316602482015260448101829052736aace99a58d06053785676f5f8ea3555c12b79889063bc2b405c906064015b60006040518083038186803b158015610d9757600080fd5b505af4158015610dab573d6000803e3d6000fd5b505050505050565b610dbe8260006113a8565b60405163131836e760e21b8152600a60048201526001600160a01b0383166024820152736aace99a58d06053785676f5f8ea3555c12b798890634c60db9c90604401610d7f565b6009546001600160a01b03163314610e2f5760405162461bcd60e51b815260040161072890611a53565b6001600160a01b038116610e945760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610728565b610e9d81611407565b50565b6040516317e142d160e01b8152600a60048201526001600160a01b0382166024820152819060009081908190819081908190736aace99a58d06053785676f5f8ea3555c12b7988906317e142d190604401602060405180830381865af4158015610f0e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f329190611adf565b9550610f3d87610bf1565b9450610f48876108b9565b6001600160a01b038816600090815260106020526040902054909450925082610f72576000610f80565b601154610f8090849061112e565b9150428211610f90576000610f9a565b610f9a8242611459565b9050919395979092949650565b600a5460009081908190808203610fc9575050600e546000925082915061109e565b600e546000805a90506000805b8984108015610fe457508582105b1561108d5784610ff381611af8565b600a549096508610905061100657600094505b6000600a600001868154811061101e5761101e611b11565b6000918252602090912001546001600160a01b03169050611040816001610c2a565b15611053578161104f81611af8565b9250505b8261105d81611af8565b93505060005a9050808511156110845761108161107a8683611459565b879061112e565b95505b9350610fd69050565b600e85905590975095509193505050505b9193909250565b6000826000036110b75750600061084a565b60006110c38385611b27565b9050826110d08583611a31565b146111275760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610728565b9392505050565b60008061113b8385611b3e565b9050838110156111275760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610728565b6001600160a01b0383166111ef5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610728565b6001600160a01b0382166112505760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610728565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60405162461bcd60e51b815260206004820152602660248201527f4469766964656e645f547261636b65723a204e6f207472616e736665727320616044820152651b1b1bddd95960d21b6064820152608401610728565b505050565b600081848411156113315760405162461bcd60e51b815260040161072891906118a9565b50600061133e8486611b51565b95945050505050565b6000818181121561084a57600080fd5b6000806113648385611b64565b9050600083121580156113775750838112155b8061138c575060008312801561138c57508381125b61112757600080fd5b6000808212156113a457600080fd5b5090565b6001600160a01b038216600090815260208190526040902054808211156113e75760006113d58383611459565b90506113e184826115e1565b50505050565b808210156113085760006113fb8284611459565b90506113e18482611645565b600980546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600061112783836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061130d565b6000806114a783610bf1565b905080156115d8576001600160a01b0383166000908152600760205260409020546114d2908261112e565b6001600160a01b038416600081815260076020526040908190209290925590517fee503bee2bb6a87e57bc57db795f98137327401a0e7b7ce42e37926cc1a9ca4d906115219084815260200190565b60405180910390a26000836001600160a01b031682610bb890604051600060405180830381858888f193505050503d806000811461157b576040519150601f19603f3d011682016040523d82523d6000602084013e611580565b606091505b50509050806115d1576001600160a01b0384166000908152600760205260409020546115ac9083611459565b6001600160a01b03909416600090815260076020526040812094909455509192915050565b5092915050565b50600092915050565b6115eb8282611689565b6116256116066108fb836005546110a590919063ffffffff16565b6001600160a01b03841660009081526006602052604090205490611768565b6001600160a01b0390921660009081526006602052604090209190915550565b61164f82826117a5565b61162561166a6108fb836005546110a590919063ffffffff16565b6001600160a01b03841660009081526006602052604090205490611357565b6001600160a01b0382166116df5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610728565b6002546116ec908261112e565b6002556001600160a01b038216600090815260208190526040902054611712908261112e565b6001600160a01b038316600081815260208181526040808320949094559251848152919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91015b60405180910390a35050565b6000806117758385611b8c565b9050600083121580156117885750838113155b8061138c575060008312801561138c575083811361112757600080fd5b6001600160a01b0382166118055760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610728565b61184281604051806060016040528060228152602001611bad602291396001600160a01b038516600090815260208190526040902054919061130d565b6001600160a01b0383166000908152602081905260409020556002546118689082611459565b6002556040518181526000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200161175c565b600060208083528351808285015260005b818110156118d6578581018301518582016040015282016118ba565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114610e9d57600080fd5b6000806040838503121561191f57600080fd5b823561192a816118f7565b946020939093013593505050565b60006020828403121561194a57600080fd5b8135611127816118f7565b60008060006060848603121561196a57600080fd5b8335611975816118f7565b92506020840135611985816118f7565b929592945050506040919091013590565b6000602082840312156119a857600080fd5b5035919050565b600080604083850312156119c257600080fd5b82356119cd816118f7565b9150602083013580151581146119e257600080fd5b809150509250929050565b60008060408385031215611a0057600080fd5b8235611a0b816118f7565b915060208301356119e2816118f7565b634e487b7160e01b600052601160045260246000fd5b600082611a4e57634e487b7160e01b600052601260045260246000fd5b500490565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c90821680611a9c57607f821691505b602082108103611abc57634e487b7160e01b600052602260045260246000fd5b50919050565b600060208284031215611ad457600080fd5b8151611127816118f7565b600060208284031215611af157600080fd5b5051919050565b600060018201611b0a57611b0a611a1b565b5060010190565b634e487b7160e01b600052603260045260246000fd5b808202811582820484141761084a5761084a611a1b565b8082018082111561084a5761084a611a1b565b8181038181111561084a5761084a611a1b565b8082018281126000831280158216821582161715611b8457611b84611a1b565b505092915050565b81810360008312801583831316838312821617156115d1576115d1611a1b56fe45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365a26469706673582212207721c699b09ed27a7eba52a91608fb4ae9fbbeae089e3437bc2f4bf5a20aa40f64736f6c63430008130033
Deployed Bytecode
0x6080604052600436106101f25760003560e01c80637e002d2a1161010d578063b84b0b6a116100a0578063dd62ed3e1161006f578063dd62ed3e146105aa578063e2f45605146105f0578063f2fde38b14610606578063f887ea4014610626578063fce7416b1461064657600080fd5b8063b84b0b6a1461053e578063b9e937001461055e578063d0a3981414610574578063d257b34f1461058a57600080fd5b806395d89b41116100dc57806395d89b41146104c45780639e78fb4f146104d9578063a9059cbb146104ee578063b62496f51461050e57600080fd5b80637e002d2a1461041d57806388bdd9be146104665780638da5cb5b146104865780638ea5220f146104a457600080fd5b806331e79db011610185578063700bb19111610154578063700bb1911461039857806370a08231146103b8578063715018a6146103d8578063768dc710146103ed57600080fd5b806331e79db014610323578063437823ec1461034357806349bd5a5e146103635780634e71d92d1461038357600080fd5b806318160ddd116101c157806318160ddd1461029057806323b872dd146102af5780632c1f5216146102cf578063313ce5671461030757600080fd5b80630614117a146101fe57806306fdde0314610215578063095ea7b3146102405780630a3db14f1461027057600080fd5b366101f957005b600080fd5b34801561020a57600080fd5b5061021361067a565b005b34801561022157600080fd5b5061022a610723565b6040516102379190612267565b60405180910390f35b34801561024c57600080fd5b5061026061025b3660046122ca565b6107b5565b6040519015158152602001610237565b34801561027c57600080fd5b5061021361028b366004612342565b6107cc565b34801561029c57600080fd5b506002545b604051908152602001610237565b3480156102bb57600080fd5b506102606102ca3660046123b6565b6109be565b3480156102db57600080fd5b506018546102ef906001600160a01b031681565b6040516001600160a01b039091168152602001610237565b34801561031357600080fd5b5060405160128152602001610237565b34801561032f57600080fd5b5061021361033e3660046123f7565b610a27565b34801561034f57600080fd5b5061021361035e3660046123f7565b610ab3565b34801561036f57600080fd5b506007546102ef906001600160a01b031681565b34801561038f57600080fd5b50610213610b01565b3480156103a457600080fd5b506102136103b3366004612414565b610b79565b3480156103c457600080fd5b506102a16103d33660046123f7565b610c4b565b3480156103e457600080fd5b50610213610c66565b3480156103f957600080fd5b506102606104083660046123f7565b60096020526000908152604090205460ff1681565b34801561042957600080fd5b506104516104383660046123f7565b6008602052600090815260409020805460019091015482565b60408051928352602083019190915201610237565b34801561047257600080fd5b506102136104813660046123f7565b610c9c565b34801561049257600080fd5b506005546001600160a01b03166102ef565b3480156104b057600080fd5b506017546102ef906001600160a01b031681565b3480156104d057600080fd5b5061022a610f36565b3480156104e557600080fd5b50610213610f45565b3480156104fa57600080fd5b506102606105093660046122ca565b61116b565b34801561051a57600080fd5b506102606105293660046123f7565b600a6020526000908152604090205460ff1681565b34801561054a57600080fd5b506016546102ef906001600160a01b031681565b34801561056a57600080fd5b506102a160115481565b34801561058057600080fd5b506102a160125481565b34801561059657600080fd5b506102136105a5366004612414565b611178565b3480156105b657600080fd5b506102a16105c536600461242d565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b3480156105fc57600080fd5b506102a160195481565b34801561061257600080fd5b506102136106213660046123f7565b611257565b34801561063257600080fd5b506006546102ef906001600160a01b031681565b34801561065257600080fd5b506102ef7f000000000000000000000000f3b9569f82b18aef890de263b84189bd33ebe45281565b6005546001600160a01b031633146106ad5760405162461bcd60e51b81526004016106a490612466565b60405180910390fd5b4760006106c26005546001600160a01b031690565b6001600160a01b03168260405160006040518083038185875af1925050503d806000811461070c576040519150601f19603f3d011682016040523d82523d6000602084013e610711565b606091505b505090508061071f57600080fd5b5050565b6060600380546107329061249b565b80601f016020809104026020016040519081016040528092919081815260200182805461075e9061249b565b80156107ab5780601f10610780576101008083540402835291602001916107ab565b820191906000526020600020905b81548152906001019060200180831161078e57829003601f168201915b5050505050905090565b60006107c23384846112ef565b5060015b92915050565b6005546001600160a01b031633146107f65760405162461bcd60e51b81526004016106a490612466565b60005b848110156109b657306323b872dd3388888581811061081a5761081a6124d5565b905060200201602081019061082f91906123f7565b878786818110610841576108416124d5565b90506020020135670de0b6b3a764000061085b9190612501565b6040516001600160e01b031960e086901b1681526001600160a01b03938416600482015292909116602483015260448201526064016020604051808303816000875af11580156108af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108d39190612518565b508383828181106108e6576108e66124d5565b90506020020135670de0b6b3a76400006109009190612501565b60086000888885818110610916576109166124d5565b905060200201602081019061092b91906123f7565b6001600160a01b0316815260208101919091526040016000205561095c6109558362015180612501565b4290611414565b60086000888885818110610972576109726124d5565b905060200201602081019061098791906123f7565b6001600160a01b03168152602081019190915260400160002060010155806109ae8161253a565b9150506107f9565b505050505050565b60006109cb84848461147a565b610a1d8433610a18856040518060600160405280602881526020016126d2602891396001600160a01b038a1660009081526001602090815260408083203384529091529020549190611a78565b6112ef565b5060019392505050565b6005546001600160a01b03163314610a515760405162461bcd60e51b81526004016106a490612466565b60185460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db090602401600060405180830381600087803b158015610a9857600080fd5b505af1158015610aac573d6000803e3d6000fd5b5050505050565b6005546001600160a01b03163314610add5760405162461bcd60e51b81526004016106a490612466565b6001600160a01b03166000908152600960205260409020805460ff19166001179055565b60185460405163bc4c4b3760e01b8152336004820152600060248201526001600160a01b039091169063bc4c4b37906044016020604051808303816000875af1158015610b52573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b769190612518565b50565b6018546040516001624d3b8760e01b0319815260048101839052600091829182916001600160a01b03169063ffb2c479906024016060604051808303816000875af1158015610bcc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bf09190612553565b604080518481526020810184905290810182905260608101889052929550909350915032906000907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a350505050565b6001600160a01b031660009081526020819052604090205490565b6005546001600160a01b03163314610c905760405162461bcd60e51b81526004016106a490612466565b610c9a6000611ab2565b565b6005546001600160a01b03163314610cc65760405162461bcd60e51b81526004016106a490612466565b6018546001600160a01b0390811690821603610d3b5760405162461bcd60e51b815260206004820152602e60248201527f20546865206469766964656e6420747261636b657220616c726561647920686160448201526d732074686174206164647265737360901b60648201526084016106a4565b601860009054906101000a90046001600160a01b03166001600160a01b0316630614117a6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610d8b57600080fd5b505af1158015610d9f573d6000803e3d6000fd5b505060405163031e79db60e41b81526001600160a01b0384166004820181905284935091506331e79db090602401600060405180830381600087803b158015610de757600080fd5b505af1158015610dfb573d6000803e3d6000fd5b505060405163031e79db60e41b81523060048201526001600160a01b03841692506331e79db09150602401600060405180830381600087803b158015610e4057600080fd5b505af1158015610e54573d6000803e3d6000fd5b505060075460405163031e79db60e41b81526001600160a01b03918216600482015290841692506331e79db09150602401600060405180830381600087803b158015610e9f57600080fd5b505af1158015610eb3573d6000803e3d6000fd5b505060405163031e79db60e41b815261dead60048201526001600160a01b03841692506331e79db09150602401600060405180830381600087803b158015610efa57600080fd5b505af1158015610f0e573d6000803e3d6000fd5b5050601880546001600160a01b0319166001600160a01b039490941693909317909255505050565b6060600480546107329061249b565b6005546001600160a01b03163314610f6f5760405162461bcd60e51b81526004016106a490612466565b6000737a250d5630b4cf539739df2c5dacb4c659f2488d90506000816001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015610fc8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fec9190612581565b6001600160a01b031663c9c6539630846001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611039573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061105d9190612581565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af11580156110aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110ce9190612581565b600680546001600160a01b038581166001600160a01b031992831617909255600780548484169216821781556000918252600a602052604091829020805460ff191660011790556018549054915163031e79db60e41b815291831660048301529293509116906331e79db090602401600060405180830381600087803b15801561115757600080fd5b505af11580156109b6573d6000803e3d6000fd5b60006107c233848461147a565b6005546001600160a01b031633146111a25760405162461bcd60e51b81526004016106a490612466565b6107d06111ae60025490565b6111b8919061259e565b81101561123f5760405162461bcd60e51b815260206004820152604960248201527f53776170546f6b656e734174416d6f756e74206d75737420626520677265617460448201527f6572207468616e206f7220657175616c20746f20302e303525206f6620746f74606482015268616c20737570706c7960b81b608482015260a4016106a4565b61125181670de0b6b3a7640000612501565b60195550565b6005546001600160a01b031633146112815760405162461bcd60e51b81526004016106a490612466565b6001600160a01b0381166112e65760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016106a4565b610b7681611ab2565b6001600160a01b0383166113515760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016106a4565b6001600160a01b0382166113b25760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016106a4565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b60008061142183856125c0565b9050838110156114735760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f77000000000060448201526064016106a4565b9392505050565b6001600160a01b0383166114a05760405162461bcd60e51b81526004016106a4906125d3565b600081116115025760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b60648201526084016106a4565b6007546001600160a01b0384811691161461158757306001600160a01b038316036115875760405162461bcd60e51b815260206004820152602f60248201527f596f752063616e6e6f742073656e6420746f6b656e7320746f2074686520636f60448201526e6e747261637420616464726573732160881b60648201526084016106a4565b806000036115a05761159b83836000611b04565b505050565b600754600160a01b900460ff161580156115d357506001600160a01b03831660009081526009602052604090205460ff16155b80156115f857506001600160a01b03821660009081526009602052604090205460ff16155b1561197e576001600160a01b038083166000908152600a602052604080822054928616825290205460ff918216911681801561164257506006546001600160a01b03868116911614155b156116e2576001600160a01b038516600090815260086020526040902060010154421180159061168957506001600160a01b03851660009081526008602052604090205415155b156116c6576001600160a01b0385166000908152600860205260409020546116ba906116b487610c4b565b90611c49565b8311156116c657600080fd5b600e54601a556000601d55601054601b55600f54601c556117e6565b8080156116fd57506006546001600160a01b03858116911614155b1561171e57600c54601a556000601b55600d54601c55600b54601d556117e6565b6000601a819055601b819055601c819055601d8190556001600160a01b038616815260086020526040902060010154421180159061177357506001600160a01b03851660009081526008602052604090205415155b156117e6576001600160a01b03851660009081526008602052604090205461179e906116b487610c4b565b8311156117e65760405162461bcd60e51b81526020600482015260166024820152751dd85a5d08199bdc881d5b9b1bd8dac81c195c9a5bd960521b60448201526064016106a4565b60006117f130610c4b565b6019549091508110801590819061182157506001600160a01b0387166000908152600a602052604090205460ff16155b15611871576007805460ff60a01b1916600160a01b17905560155461184590611c8b565b611850601454611d35565b61185b601354611f00565b611863611feb565b6007805460ff60a01b191690555b6000611893606461188d601a548961201a90919063ffffffff16565b9061209c565b905060006118b1606461188d601c548a61201a90919063ffffffff16565b905060006118cf606461188d601b548b61201a90919063ffffffff16565b905060006118ed606461188d601d548c61201a90919063ffffffff16565b9050826015600082825461190191906125c0565b92505081905550816014600082825461191a91906125c0565b92505081905550806013600082825461193391906125c0565b9091555060009050818361194786886125c0565b61195191906125c0565b61195b91906125c0565b90506119678a82611c49565b99506119748c3083611b04565b5050505050505050505b611989838383611b04565b6018546001600160a01b031663e30443bc846119a481610c4b565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b1580156119ea57600080fd5b505af19250505080156119fb575060015b506018546001600160a01b031663e30443bc83611a1781610c4b565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015611a5d57600080fd5b505af1925050508015611a6e575060015b1561159b57505050565b60008184841115611a9c5760405162461bcd60e51b81526004016106a49190612267565b506000611aa98486612618565b95945050505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038316611b2a5760405162461bcd60e51b81526004016106a4906125d3565b6001600160a01b038216611b8c5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016106a4565b611bc9816040518060600160405280602681526020016126ac602691396001600160a01b0386166000908152602081905260409020549190611a78565b6001600160a01b038085166000908152602081905260408082209390935590841681522054611bf89082611414565b6001600160a01b038381166000818152602081815260409182902094909455518481529092918616917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101611407565b600061147383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611a78565b6000611c9630610c4b565b905080821115611ca4575050565b60405163a9059cbb60e01b815261dead600482015260248101839052600090309063a9059cbb906044016020604051808303816000875af1158015611ced573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d119190612518565b9050801561159b578260156000828254611d2b9190612618565b9091555050505050565b60408051600380825260808201909252600091602082016060803683370190505090503081600081518110611d6c57611d6c6124d5565b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015611dc5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611de99190612581565b81600181518110611dfc57611dfc6124d5565b60200260200101906001600160a01b031690816001600160a01b0316815250507f000000000000000000000000f3b9569f82b18aef890de263b84189bd33ebe45281600281518110611e5057611e506124d5565b6001600160a01b039283166020918202929092010152600654611e7691309116846112ef565b600654601654604051635c11d79560e01b81526001600160a01b0392831692635c11d79592611eb39287926000928892911690429060040161266f565b600060405180830381600087803b158015611ecd57600080fd5b505af1158015611ee1573d6000803e3d6000fd5b505050508160146000828254611ef79190612618565b90915550505050565b47600080611f0d30610c4b565b905080841115611f1d5750505050565b611f2784306120de565b611f318347612618565b91508360136000828254611f459190612618565b909155505060185460405183916000916001600160a01b039091169083908381818185875af1925050503d8060008114611f9b576040519150601f19603f3d011682016040523d82523d6000602084013e611fa0565b606091505b5050905080156109b65760408051878152602081018490527f80195cc573b02cc48460cbca6e6e4cc85ddb91959d946e1c3025ea3d87942dc3910160405180910390a1505050505050565b6000611ff630610c4b565b9050600081116120035750565b601754610b769082906001600160a01b03166120de565b60008260000361202c575060006107c6565b60006120388385612501565b905082612045858361259e565b146114735760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b60648201526084016106a4565b600061147383836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612239565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110612113576121136124d5565b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa15801561216c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121909190612581565b816001815181106121a3576121a36124d5565b6001600160a01b0392831660209182029290920101526006546121c991309116856112ef565b60065460405163791ac94760e01b81526001600160a01b039091169063791ac9479061220290869060009086908890429060040161266f565b600060405180830381600087803b15801561221c57600080fd5b505af1158015612230573d6000803e3d6000fd5b50505050505050565b6000818361225a5760405162461bcd60e51b81526004016106a49190612267565b506000611aa9848661259e565b600060208083528351808285015260005b8181101561229457858101830151858201604001528201612278565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114610b7657600080fd5b600080604083850312156122dd57600080fd5b82356122e8816122b5565b946020939093013593505050565b60008083601f84011261230857600080fd5b50813567ffffffffffffffff81111561232057600080fd5b6020830191508360208260051b850101111561233b57600080fd5b9250929050565b60008060008060006060868803121561235a57600080fd5b853567ffffffffffffffff8082111561237257600080fd5b61237e89838a016122f6565b9097509550602088013591508082111561239757600080fd5b506123a4888289016122f6565b96999598509660400135949350505050565b6000806000606084860312156123cb57600080fd5b83356123d6816122b5565b925060208401356123e6816122b5565b929592945050506040919091013590565b60006020828403121561240957600080fd5b8135611473816122b5565b60006020828403121561242657600080fd5b5035919050565b6000806040838503121561244057600080fd5b823561244b816122b5565b9150602083013561245b816122b5565b809150509250929050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c908216806124af57607f821691505b6020821081036124cf57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b80820281158282048414176107c6576107c66124eb565b60006020828403121561252a57600080fd5b8151801515811461147357600080fd5b60006001820161254c5761254c6124eb565b5060010190565b60008060006060848603121561256857600080fd5b8351925060208401519150604084015190509250925092565b60006020828403121561259357600080fd5b8151611473816122b5565b6000826125bb57634e487b7160e01b600052601260045260246000fd5b500490565b808201808211156107c6576107c66124eb565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b818103818111156107c6576107c66124eb565b600081518084526020808501945080840160005b838110156126645781516001600160a01b03168752958201959082019060010161263f565b509495945050505050565b85815284602082015260a06040820152600061268e60a083018661262b565b6001600160a01b039490941660608301525060800152939250505056fe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365a2646970667358221220bc0fe1e0183f204945961a1dcb6d490a568975231b49329d2019767f8251726a64736f6c63430008130033
Deployed Bytecode Sourcemap
13478:11807:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17051:219;;;;;;;;;;;;;:::i;:::-;;5914:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8222:210;;;;;;;;;;-1:-1:-1;8222:210:0;;;;;:::i;:::-;;:::i;:::-;;;1188:14:1;;1181:22;1163:41;;1151:2;1136:18;8222:210:0;1023:187:1;16495:476:0;;;;;;;;;;-1:-1:-1;16495:476:0;;;;;:::i;:::-;;:::i;7034:108::-;;;;;;;;;;-1:-1:-1;7122:12:0;;7034:108;;;2579:25:1;;;2567:2;2552:18;7034:108:0;2433:177:1;8914:454:0;;;;;;;;;;-1:-1:-1;8914:454:0;;;;;:::i;:::-;;:::i;14800:38::-;;;;;;;;;;-1:-1:-1;14800:38:0;;;;-1:-1:-1;;;;;14800:38:0;;;;;;-1:-1:-1;;;;;3272:32:1;;;3254:51;;3242:2;3227:18;14800:38:0;3076:235:1;6876:93:0;;;;;;;;;;-1:-1:-1;6876:93:0;;6959:2;3458:36:1;;3446:2;3431:18;6876:93:0;3316:184:1;17278:130:0;;;;;;;;;;-1:-1:-1;17278:130:0;;;;;:::i;:::-;;:::i;17416:111::-;;;;;;;;;;-1:-1:-1;17416:111:0;;;;;:::i;:::-;;:::i;13594:28::-;;;;;;;;;;-1:-1:-1;13594:28:0;;;;-1:-1:-1;;;;;13594:28:0;;;18730:103;;;;;;;;;;;;;:::i;18463:259::-;;;;;;;;;;-1:-1:-1;18463:259:0;;;;;:::i;:::-;;:::i;7205:177::-;;;;;;;;;;-1:-1:-1;7205:177:0;;;;;:::i;:::-;;:::i;1622:94::-;;;;;;;;;;;;;:::i;13823:51::-;;;;;;;;;;-1:-1:-1;13823:51:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;13753:61;;;;;;;;;;-1:-1:-1;13753:61:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;4324:25:1;;;4380:2;4365:18;;4358:34;;;;4297:18;13753:61:0;4150:248:1;17803:652:0;;;;;;;;;;-1:-1:-1;17803:652:0;;;;;:::i;:::-;;:::i;1399:87::-;;;;;;;;;;-1:-1:-1;1472:6:0;;-1:-1:-1;;;;;1472:6:0;1399:87;;14706:79;;;;;;;;;;-1:-1:-1;14706:79:0;;;;-1:-1:-1;;;;;14706:79:0;;;6133:104;;;;;;;;;;;;;:::i;16064:423::-;;;;;;;;;;;;;:::i;7595:216::-;;;;;;;;;;-1:-1:-1;7595:216:0;;;;;:::i;:::-;;:::i;13978:57::-;;;;;;;;;;-1:-1:-1;13978:57:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;14613:86;;;;;;;;;;-1:-1:-1;14613:86:0;;;;-1:-1:-1;;;;;14613:86:0;;;14292:83;;;;;;;;;;;;;;;;14382:84;;;;;;;;;;;;;;;;17535:260;;;;;;;;;;-1:-1:-1;17535:260:0;;;;;:::i;:::-;;:::i;7874:201::-;;;;;;;;;;-1:-1:-1;7874:201:0;;;;;:::i;:::-;-1:-1:-1;;;;;8040:18:0;;;8008:7;8040:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;7874:201;14847:57;;;;;;;;;;;;;;;;1724:192;;;;;;;;;;-1:-1:-1;1724:192:0;;;;;:::i;:::-;;:::i;13564:21::-;;;;;;;;;;-1:-1:-1;13564:21:0;;;;-1:-1:-1;;;;;13564:21:0;;;15000:82;;;;;;;;;;;;;;;17051:219;1472:6;;-1:-1:-1;;;;;1472:6:0;900:10;1534:23;1526:68;;;;-1:-1:-1;;;1526:68:0;;;;;;;:::i;:::-;;;;;;;;;17130:21:::1;17109:18;17189:7;1472:6:::0;;-1:-1:-1;;;;;1472:6:0;;1399:87;17189:7:::1;-1:-1:-1::0;;;;;17181:21:0::1;17210:10;17181:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17162:63;;;17244:7;17236:16;;;::::0;::::1;;17092:178;;17051:219::o:0;5914:100::-;5968:13;6001:5;5994:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5914:100;:::o;8222:210::-;8341:4;8363:39;900:10;8386:7;8395:6;8363:8;:39::i;:::-;-1:-1:-1;8420:4:0;8222:210;;;;;:::o;16495:476::-;1472:6;;-1:-1:-1;;;;;1472:6:0;900:10;1534:23;1526:68;;;;-1:-1:-1;;;1526:68:0;;;;;;;:::i;:::-;16626:9:::1;16621:343;16641:21:::0;;::::1;16621:343;;;16700:4;16685:34;16720:10;16732::::0;;16743:1;16732:13;;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;16747:6;;16754:1;16747:9;;;;;;;:::i;:::-;;;;;;;16760:6;16747:20;;;;:::i;:::-;16685:83;::::0;-1:-1:-1;;;;;;16685:83:0::1;::::0;;;;;;-1:-1:-1;;;;;6670:15:1;;;16685:83:0::1;::::0;::::1;6652:34:1::0;6722:15;;;;6702:18;;;6695:43;6754:18;;;6747:34;6587:18;;16685:83:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;16827:6;;16834:1;16827:9;;;;;;;:::i;:::-;;;;;;;16840:6;16827:20;;;;:::i;:::-;16784:18;:33;16803:10;;16814:1;16803:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;16784:33:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;16784:33:0;:63;16910:40:::1;16930:19;:11:::0;16944:5:::1;16930:19;:::i;:::-;16910:15;::::0;:19:::1;:40::i;:::-;16863:18;:33;16882:10;;16893:1;16882:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;16863:33:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;16863:33:0;:44:::1;;:87:::0;16664:3;::::1;::::0;::::1;:::i;:::-;;;;16621:343;;;;16495:476:::0;;;;;:::o;8914:454::-;9054:4;9071:36;9081:6;9089:9;9100:6;9071:9;:36::i;:::-;9118:220;9141:6;900:10;9189:138;9245:6;9189:138;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9189:19:0;;;;;;:11;:19;;;;;;;;900:10;9189:33;;;;;;;;;;:37;:138::i;:::-;9118:8;:220::i;:::-;-1:-1:-1;9356:4:0;8914:454;;;;;:::o;17278:130::-;1472:6;;-1:-1:-1;;;;;1472:6:0;900:10;1534:23;1526:68;;;;-1:-1:-1;;;1526:68:0;;;;;;;:::i;:::-;17353:15:::1;::::0;:45:::1;::::0;-1:-1:-1;;;17353:45:0;;-1:-1:-1;;;;;3272:32:1;;;17353:45:0::1;::::0;::::1;3254:51:1::0;17353:15:0;;::::1;::::0;:36:::1;::::0;3227:18:1;;17353:45:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;17278:130:::0;:::o;17416:111::-;1472:6;;-1:-1:-1;;;;;1472:6:0;900:10;1534:23;1526:68;;;;-1:-1:-1;;;1526:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;17485:27:0::1;;::::0;;;:18:::1;:27;::::0;;;;:34;;-1:-1:-1;;17485:34:0::1;17515:4;17485:34;::::0;;17416:111::o;18730:103::-;18767:15;;:58;;-1:-1:-1;;;18767:58:0;;18806:10;18767:58;;;7398:51:1;18767:15:0;7465:18:1;;;7458:50;-1:-1:-1;;;;;18767:15:0;;;;:30;;7371:18:1;;18767:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;18730:103::o;18463:259::-;18589:15;;:28;;-1:-1:-1;;;;;;18589:28:0;;;;;2579:25:1;;;18523:18:0;;;;;;-1:-1:-1;;;;;18589:15:0;;:23;;2552:18:1;;18589:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18627:87;;;8061:25:1;;;8117:2;8102:18;;8095:34;;;8145:18;;;8138:34;;;8203:2;8188:18;;8181:34;;;18522:95:0;;-1:-1:-1;18522:95:0;;-1:-1:-1;18522:95:0;-1:-1:-1;18704:9:0;;18692:5;;18627:87;;8048:3:1;8033:19;18627:87:0;;;;;;;18517:205;;;18463:259;:::o;7205:177::-;-1:-1:-1;;;;;7356:18:0;7324:7;7356:18;;;;;;;;;;;;7205:177::o;1622:94::-;1472:6;;-1:-1:-1;;;;;1472:6:0;900:10;1534:23;1526:68;;;;-1:-1:-1;;;1526:68:0;;;;;;;:::i;:::-;1687:21:::1;1705:1;1687:9;:21::i;:::-;1622:94::o:0;17803:652::-;1472:6;;-1:-1:-1;;;;;1472:6:0;900:10;1534:23;1526:68;;;;-1:-1:-1;;;1526:68:0;;;;;;;:::i;:::-;17911:15:::1;::::0;-1:-1:-1;;;;;17911:15:0;;::::1;17889:38:::0;;::::1;::::0;17881:97:::1;;;::::0;-1:-1:-1;;;17881:97:0;;8428:2:1;17881:97:0::1;::::0;::::1;8410:21:1::0;8467:2;8447:18;;;8440:30;8506:34;8486:18;;;8479:62;-1:-1:-1;;;8557:18:1;;;8550:44;8611:19;;17881:97:0::1;8226:410:1::0;17881:97:0::1;17990:15;;;;;;;;;-1:-1:-1::0;;;;;17990:15:0::1;-1:-1:-1::0;;;;;17990:26:0::1;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;18114:92:0::1;::::0;-1:-1:-1;;;18114:92:0;;-1:-1:-1;;;;;18114:39:0;::::1;:92;::::0;::::1;3254:51:1::0;;;18091:10:0;;-1:-1:-1;18114:39:0;-1:-1:-1;18114:39:0::1;::::0;3227:18:1;;18114:92:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;18219:54:0::1;::::0;-1:-1:-1;;;18219:54:0;;18267:4:::1;18219:54;::::0;::::1;3254:51:1::0;-1:-1:-1;;;;;18219:39:0;::::1;::::0;-1:-1:-1;18219:39:0::1;::::0;-1:-1:-1;3227:18:1;;18219:54:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;18324:13:0::1;::::0;18284:54:::1;::::0;-1:-1:-1;;;18284:54:0;;-1:-1:-1;;;;;18324:13:0;;::::1;18284:54;::::0;::::1;3254:51:1::0;18284:39:0;;::::1;::::0;-1:-1:-1;18284:39:0::1;::::0;-1:-1:-1;3227:18:1;;18284:54:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;18349:51:0::1;::::0;-1:-1:-1;;;18349:51:0;;14951:42:::1;18349:51;::::0;::::1;3254::1::0;-1:-1:-1;;;;;18349:39:0;::::1;::::0;-1:-1:-1;18349:39:0::1;::::0;-1:-1:-1;3227:18:1;;18349:51:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;18411:15:0::1;:36:::0;;-1:-1:-1;;;;;;18411:36:0::1;-1:-1:-1::0;;;;;18411:36:0;;;::::1;::::0;;;::::1;::::0;;;-1:-1:-1;;;17803:652:0:o;6133:104::-;6189:13;6222:7;6215:14;;;;;:::i;16064:423::-;1472:6;;-1:-1:-1;;;;;1472:6:0;900:10;1534:23;1526:68;;;;-1:-1:-1;;;1526:68:0;;;;;;;:::i;:::-;16117:15:::1;16151:42;16117:78;;16206:13;16231:7;-1:-1:-1::0;;;;;16231:15:0::1;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;16222:38:0::1;;16269:4;16276:7;-1:-1:-1::0;;;;;16276:12:0::1;;:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16222:69;::::0;-1:-1:-1;;;;;;16222:69:0::1;::::0;;;;;;-1:-1:-1;;;;;9127:15:1;;;16222:69:0::1;::::0;::::1;9109:34:1::0;9179:15;;9159:18;;;9152:43;9044:18;;16222:69:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16304:6;:16:::0;;-1:-1:-1;;;;;16304:16:0;;::::1;-1:-1:-1::0;;;;;;16304:16:0;;::::1;;::::0;;;16331:13:::1;:21:::0;;;;::::1;::::0;::::1;::::0;::::1;::::0;;-1:-1:-1;16365:40:0;;;:25:::1;:40;::::0;;;;;;:47;;-1:-1:-1;;16365:47:0::1;-1:-1:-1::0;16365:47:0::1;::::0;;16426:15:::1;::::0;16463:13;;16426:51;;-1:-1:-1;;;16426:51:0;;16463:13;;::::1;16426:51;::::0;::::1;3254::1::0;16331:21:0;;-1:-1:-1;16426:15:0;::::1;::::0;:36:::1;::::0;3227:18:1;;16426:51:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;7595:216:::0;7717:4;7739:42;900:10;7763:9;7774:6;7739:9;:42::i;17535:260::-;1472:6;;-1:-1:-1;;;;;1472:6:0;900:10;1534:23;1526:68;;;;-1:-1:-1;;;1526:68:0;;;;;;;:::i;:::-;17654:4:::1;17638:13;7122:12:::0;;;7034:108;17638:13:::1;:20;;;;:::i;:::-;17625:9;:33;;17617:119;;;::::0;-1:-1:-1;;;17617:119:0;;9630:2:1;17617:119:0::1;::::0;::::1;9612:21:1::0;9669:2;9649:18;;;9642:30;9708:34;9688:18;;;9681:62;9779:34;9759:18;;;9752:62;-1:-1:-1;;;9830:19:1;;;9823:40;9880:19;;17617:119:0::1;9428:477:1::0;17617:119:0::1;17769:18;:9:::0;17781:6:::1;17769:18;:::i;:::-;17748;:39:::0;-1:-1:-1;17535:260:0:o;1724:192::-;1472:6;;-1:-1:-1;;;;;1472:6:0;900:10;1534:23;1526:68;;;;-1:-1:-1;;;1526:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;1813:22:0;::::1;1805:73;;;::::0;-1:-1:-1;;;1805:73:0;;10112:2:1;1805:73:0::1;::::0;::::1;10094:21:1::0;10151:2;10131:18;;;10124:30;10190:34;10170:18;;;10163:62;-1:-1:-1;;;10241:18:1;;;10234:36;10287:19;;1805:73:0::1;9910:402:1::0;1805:73:0::1;1889:19;1899:8;1889:9;:19::i;12361:380::-:0;-1:-1:-1;;;;;12497:19:0;;12489:68;;;;-1:-1:-1;;;12489:68:0;;10519:2:1;12489:68:0;;;10501:21:1;10558:2;10538:18;;;10531:30;10597:34;10577:18;;;10570:62;-1:-1:-1;;;10648:18:1;;;10641:34;10692:19;;12489:68:0;10317:400:1;12489:68:0;-1:-1:-1;;;;;12576:21:0;;12568:68;;;;-1:-1:-1;;;12568:68:0;;10924:2:1;12568:68:0;;;10906:21:1;10963:2;10943:18;;;10936:30;11002:34;10982:18;;;10975:62;-1:-1:-1;;;11053:18:1;;;11046:32;11095:19;;12568:68:0;10722:398:1;12568:68:0;-1:-1:-1;;;;;12649:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;12701:32;;2579:25:1;;;12701:32:0;;2552:18:1;12701:32:0;;;;;;;;12361:380;;;:::o;38208:181::-;38266:7;;38298:5;38302:1;38298;:5;:::i;:::-;38286:17;;38327:1;38322;:6;;38314:46;;;;-1:-1:-1;;;38314:46:0;;11457:2:1;38314:46:0;;;11439:21:1;11496:2;11476:18;;;11469:30;11535:29;11515:18;;;11508:57;11582:18;;38314:46:0;11255:351:1;38314:46:0;38380:1;38208:181;-1:-1:-1;;;38208:181:0:o;19011:3705::-;-1:-1:-1;;;;;19143:18:0;;19135:68;;;;-1:-1:-1;;;19135:68:0;;;;;;;:::i;:::-;19231:1;19222:6;:10;19214:64;;;;-1:-1:-1;;;19214:64:0;;12219:2:1;19214:64:0;;;12201:21:1;12258:2;12238:18;;;12231:30;12297:34;12277:18;;;12270:62;-1:-1:-1;;;12348:18:1;;;12341:39;12397:19;;19214:64:0;12017:405:1;19214:64:0;19302:13;;-1:-1:-1;;;;;19294:21:0;;;19302:13;;19294:21;19291:131;;19353:4;-1:-1:-1;;;;;19339:19:0;;;19331:79;;;;-1:-1:-1;;;19331:79:0;;12629:2:1;19331:79:0;;;12611:21:1;12668:2;12648:18;;;12641:30;12707:34;12687:18;;;12680:62;-1:-1:-1;;;12758:18:1;;;12751:45;12813:19;;19331:79:0;12427:411:1;19331:79:0;19438:6;19448:1;19438:11;19434:3053;;19466:28;19482:4;19488:2;19492:1;19466:15;:28::i;:::-;19011:3705;;;:::o;19434:3053::-;19552:8;;-1:-1:-1;;;19552:8:0;;;;19551:9;:38;;;;-1:-1:-1;;;;;;19565:24:0;;;;;;:18;:24;;;;;;;;19564:25;19551:38;:65;;;;-1:-1:-1;;;;;;19594:22:0;;;;;;:18;:22;;;;;;;;19593:23;19551:65;19533:2954;;;-1:-1:-1;;;;;19660:29:0;;;19643:14;19660:29;;;:25;:29;;;;;;;19720:31;;;;;;;;19660:29;;;;;19720:31;19660:29;19792:120;;;;-1:-1:-1;19905:6:0;;-1:-1:-1;;;;;19889:23:0;;;19905:6;;19889:23;;19792:120;19770:1477;;;-1:-1:-1;;;;;20033:24:0;;;;;;:18;:24;;;;;:35;;;20014:15;:54;;;;:93;;-1:-1:-1;;;;;;20072:24:0;;20106:1;20072:24;;;:18;:24;;;;;:31;:35;;20014:93;20011:211;;;-1:-1:-1;;;;;20168:24:0;;;;;;:18;:24;;;;;:31;20148:52;;:15;20187:4;20148:9;:15::i;:::-;:19;;:52::i;:::-;20137:6;:64;;20129:73;;;;;;20257:10;;20242:12;:25;-1:-1:-1;20286:19:0;:23;20347:14;;20328:16;:33;20402:17;;20380:19;:39;19770:1477;;;20478:8;:50;;;;-1:-1:-1;20521:6:0;;-1:-1:-1;;;;;20507:21:0;;;20521:6;;20507:21;;20478:50;20456:791;;;20579:9;;20564:12;:24;-1:-1:-1;20608:16:0;:20;20670:16;;20648:19;:38;20728:16;;20706:19;:38;20456:791;;;20847:1;20832:12;:16;;;20868;:20;;;20908:19;:23;;;20951:19;:23;;;-1:-1:-1;;;;;21017:24:0;;;;:18;:24;;;;;:35;;;20998:15;:54;;;;:93;;-1:-1:-1;;;;;;21056:24:0;;21090:1;21056:24;;;:18;:24;;;;;:31;:35;;20998:93;20995:237;;;-1:-1:-1;;;;;21152:24:0;;;;;;:18;:24;;;;;:31;21132:52;;:15;21171:4;21132:9;:15::i;:52::-;21121:6;:64;;21113:99;;;;-1:-1:-1;;;21113:99:0;;13045:2:1;21113:99:0;;;13027:21:1;13084:2;13064:18;;;13057:30;-1:-1:-1;;;13103:18:1;;;13096:52;13165:18;;21113:99:0;12843:346:1;21113:99:0;21278:28;21309:24;21327:4;21309:9;:24::i;:::-;21389:18;;21278:55;;-1:-1:-1;21365:42:0;;;;;;;21440:43;;-1:-1:-1;;;;;;21452:31:0;;;;;;:25;:31;;;;;;;;21451:32;21440:43;21436:348;;;21504:8;:15;;-1:-1:-1;;;;21504:15:0;-1:-1:-1;;;21504:15:0;;;21557:18;;21540:36;;:16;:36::i;:::-;21597:29;21610:15;;21597:12;:29::i;:::-;21647:44;21672:18;;21647:24;:44::i;:::-;21712:19;:17;:19::i;:::-;21752:8;:16;;-1:-1:-1;;;;21752:16:0;;;21436:348;21800:20;21823:33;21852:3;21823:24;21834:12;;21823:6;:10;;:24;;;;:::i;:::-;:28;;:33::i;:::-;21800:56;;21871:23;21897:40;21933:3;21897:31;21908:19;;21897:6;:10;;:31;;;;:::i;:40::-;21871:66;;21952:20;21975:37;22008:3;21975:28;21986:16;;21975:6;:10;;:28;;;;:::i;:37::-;21952:60;;22027:27;22057:40;22093:3;22057:31;22068:19;;22057:6;:10;;:31;;;;:::i;:40::-;22027:70;;22148:15;22126:18;;:37;;;;;;;:::i;:::-;;;;;;;;22197:12;22178:15;;:31;;;;;;;:::i;:::-;;;;;;;;22246:19;22224:18;;:41;;;;;;;:::i;:::-;;;;-1:-1:-1;22282:12:0;;-1:-1:-1;22345:19:0;22330:12;22297:30;22312:15;22297:12;:30;:::i;:::-;:45;;;;:::i;:::-;:67;;;;:::i;:::-;22282:82;-1:-1:-1;22388:16:0;:6;22282:82;22388:10;:16::i;:::-;22379:25;;22419:42;22435:4;22449;22456;22419:15;:42::i;:::-;19628:2859;;;;;;;;;19533:2954;22499:33;22515:4;22521:2;22525:6;22499:15;:33::i;:::-;22549:15;;-1:-1:-1;;;;;22549:15:0;:26;22584:4;22591:15;22584:4;22591:9;:15::i;:::-;22549:58;;-1:-1:-1;;;;;;22549:58:0;;;;;;;-1:-1:-1;;;;;13402:32:1;;;22549:58:0;;;13384:51:1;13451:18;;;13444:34;13357:18;;22549:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22545:74;22633:15;;-1:-1:-1;;;;;22633:15:0;:26;22668:2;22673:13;22668:2;22673:9;:13::i;:::-;22633:54;;-1:-1:-1;;;;;;22633:54:0;;;;;;;-1:-1:-1;;;;;13402:32:1;;;22633:54:0;;;13384:51:1;13451:18;;;13444:34;13357:18;;22633:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22629:70;;;19011:3705;;;:::o;39111:192::-;39197:7;39233:12;39225:6;;;;39217:29;;;;-1:-1:-1;;;39217:29:0;;;;;;;;:::i;:::-;-1:-1:-1;39257:9:0;39269:5;39273:1;39269;:5;:::i;:::-;39257:17;39111:192;-1:-1:-1;;;;;39111:192:0:o;1924:173::-;1999:6;;;-1:-1:-1;;;;;2016:17:0;;;-1:-1:-1;;;;;;2016:17:0;;;;;;;2049:40;;1999:6;;;2016:17;1999:6;;2049:40;;1980:16;;2049:40;1969:128;1924:173;:::o;9860:610::-;-1:-1:-1;;;;;10000:20:0;;9992:70;;;;-1:-1:-1;;;9992:70:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;10081:23:0;;10073:71;;;;-1:-1:-1;;;10073:71:0;;13824:2:1;10073:71:0;;;13806:21:1;13863:2;13843:18;;;13836:30;13902:34;13882:18;;;13875:62;-1:-1:-1;;;13953:18:1;;;13946:33;13996:19;;10073:71:0;13622:399:1;10073:71:0;10237:108;10273:6;10237:108;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;10237:17:0;;:9;:17;;;;;;;;;;;;:108;:21;:108::i;:::-;-1:-1:-1;;;;;10217:17:0;;;:9;:17;;;;;;;;;;;:128;;;;10379:20;;;;;;;:32;;10404:6;10379:24;:32::i;:::-;-1:-1:-1;;;;;10356:20:0;;;:9;:20;;;;;;;;;;;;:55;;;;10427:35;2579:25:1;;;10356:20:0;;10427:35;;;;;;2552:18:1;10427:35:0;2433:177:1;38672:136:0;38730:7;38757:43;38761:1;38764;38757:43;;;;;;;;;;;;;;;;;:3;:43::i;22724:402::-;22804:23;22830:24;22848:4;22830:9;:24::i;:::-;22804:50;;22892:15;22878:11;:29;22875:66;;;22923:7;22724:402;:::o;22875:66::-;22976:55;;-1:-1:-1;;;22976:55:0;;14951:42;22976:55;;;13384:51:1;13451:18;;;13444:34;;;22961:12:0;;22991:4;;22976:30;;13357:18:1;;22976:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22961:70;;23053:7;23050:69;;;23097:11;23075:18;;:33;;;;;;;:::i;:::-;;;;-1:-1:-1;;22779:347:0;;22724:402;:::o;23140:545::-;23228:16;;;23242:1;23228:16;;;;;;;;;23204:21;;23228:16;;;;;;;;;;-1:-1:-1;23228:16:0;23204:40;;23273:4;23255;23260:1;23255:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;23255:23:0;;;:7;;;;;;;;;;:23;;;;23299:6;;:13;;;-1:-1:-1;;;23299:13:0;;;;:6;;;;;:11;;:13;;;;;23255:7;;23299:13;;;;;:6;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23289:4;23294:1;23289:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1;;;;;23289:23:0;;;-1:-1:-1;;;;;23289:23:0;;;;;23333:3;23323:4;23328:1;23323:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;23323:13:0;;;:7;;;;;;;;;:13;23381:6;;23349:53;;23366:4;;23381:6;23390:11;23349:8;:53::i;:::-;23441:6;;23577:16;;23441:193;;-1:-1:-1;;;23441:193:0;;-1:-1:-1;;;;;23441:6:0;;;;:60;;:193;;23516:11;;23441:6;;23558:4;;23577:16;;;23608:15;;23441:193;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23666:11;23647:15;;:30;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;23140:545:0:o;23693:749::-;23862:21;23777:18;;23920:24;23938:4;23920:9;:24::i;:::-;23894:50;;23982:15;23968:11;:29;23965:66;;;24013:7;;;23693:749;:::o;23965:66::-;24043:53;24060:11;24089:4;24043:16;:53::i;:::-;24124:34;24148:10;24124:21;:34;:::i;:::-;24107:51;;24191:11;24169:18;;:33;;;;;;;:::i;:::-;;;;-1:-1:-1;;24288:15:0;;24280:52;;24234:14;;24213:18;;-1:-1:-1;;;;;24288:15:0;;;;24234:14;;24213:18;24280:52;24213:18;24280:52;24234:14;24288:15;24280:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24261:71;;;24356:7;24353:80;;;24383:38;;;4324:25:1;;;4380:2;4365:18;;4358:34;;;24383:38:0;;4297:18:1;24383:38:0;;;;;;;23756:686;;;;;23693:749;:::o;25030:252::-;25088:23;25114:24;25132:4;25114:9;:24::i;:::-;25088:50;;25181:1;25162:15;:20;25159:57;;25198:7;25030:252::o;25159:57::-;25262:9;;25228:44;;25245:15;;-1:-1:-1;;;;;25262:9:0;25228:16;:44::i;39562:471::-;39620:7;39865:1;39870;39865:6;39861:47;;-1:-1:-1;39895:1:0;39888:8;;39861:47;39920:9;39932:5;39936:1;39932;:5;:::i;:::-;39920:17;-1:-1:-1;39965:1:0;39956:5;39960:1;39920:17;39956:5;:::i;:::-;:10;39948:56;;;;-1:-1:-1;;;39948:56:0;;15692:2:1;39948:56:0;;;15674:21:1;15731:2;15711:18;;;15704:30;15770:34;15750:18;;;15743:62;-1:-1:-1;;;15821:18:1;;;15814:31;15862:19;;39948:56:0;15490:397:1;40509:132:0;40567:7;40594:39;40598:1;40601;40594:39;;;;;;;;;;;;;;;;;:3;:39::i;24450:572::-;24608:16;;;24622:1;24608:16;;;;;;;;24584:21;;24608:16;;;;;;;;;;-1:-1:-1;24608:16:0;24584:40;;24653:4;24635;24640:1;24635:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;24635:23:0;;;:7;;;;;;;;;;:23;;;;24679:6;;:13;;;-1:-1:-1;;;24679:13:0;;;;:6;;;;;:11;;:13;;;;;24635:7;;24679:13;;;;;:6;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24669:4;24674:1;24669:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;24669:23:0;;;:7;;;;;;;;;:23;24737:6;;24705:53;;24722:4;;24737:6;24746:11;24705:8;:53::i;:::-;24797:6;;:217;;-1:-1:-1;;;24797:217:0;;-1:-1:-1;;;;;24797:6:0;;;;:57;;:217;;24869:11;;24797:6;;24939:4;;24966:6;;24988:15;;24797:217;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24521:501;24450:572;;:::o;41137:278::-;41223:7;41258:12;41251:5;41243:28;;;;-1:-1:-1;;;41243:28:0;;;;;;;;:::i;:::-;-1:-1:-1;41282:9:0;41294:5;41298:1;41294;:5;:::i;14:548:1:-;126:4;155:2;184;173:9;166:21;216:6;210:13;259:6;254:2;243:9;239:18;232:34;284:1;294:140;308:6;305:1;302:13;294:140;;;403:14;;;399:23;;393:30;369:17;;;388:2;365:26;358:66;323:10;;294:140;;;298:3;483:1;478:2;469:6;458:9;454:22;450:31;443:42;553:2;546;542:7;537:2;529:6;525:15;521:29;510:9;506:45;502:54;494:62;;;;14:548;;;;:::o;567:131::-;-1:-1:-1;;;;;642:31:1;;632:42;;622:70;;688:1;685;678:12;703:315;771:6;779;832:2;820:9;811:7;807:23;803:32;800:52;;;848:1;845;838:12;800:52;887:9;874:23;906:31;931:5;906:31;:::i;:::-;956:5;1008:2;993:18;;;;980:32;;-1:-1:-1;;;703:315:1:o;1215:367::-;1278:8;1288:6;1342:3;1335:4;1327:6;1323:17;1319:27;1309:55;;1360:1;1357;1350:12;1309:55;-1:-1:-1;1383:20:1;;1426:18;1415:30;;1412:50;;;1458:1;1455;1448:12;1412:50;1495:4;1487:6;1483:17;1471:29;;1555:3;1548:4;1538:6;1535:1;1531:14;1523:6;1519:27;1515:38;1512:47;1509:67;;;1572:1;1569;1562:12;1509:67;1215:367;;;;;:::o;1587:841::-;1718:6;1726;1734;1742;1750;1803:2;1791:9;1782:7;1778:23;1774:32;1771:52;;;1819:1;1816;1809:12;1771:52;1859:9;1846:23;1888:18;1929:2;1921:6;1918:14;1915:34;;;1945:1;1942;1935:12;1915:34;1984:70;2046:7;2037:6;2026:9;2022:22;1984:70;:::i;:::-;2073:8;;-1:-1:-1;1958:96:1;-1:-1:-1;2161:2:1;2146:18;;2133:32;;-1:-1:-1;2177:16:1;;;2174:36;;;2206:1;2203;2196:12;2174:36;;2245:72;2309:7;2298:8;2287:9;2283:24;2245:72;:::i;:::-;1587:841;;;;-1:-1:-1;2336:8:1;2418:2;2403:18;2390:32;;1587:841;-1:-1:-1;;;;1587:841:1:o;2615:456::-;2692:6;2700;2708;2761:2;2749:9;2740:7;2736:23;2732:32;2729:52;;;2777:1;2774;2767:12;2729:52;2816:9;2803:23;2835:31;2860:5;2835:31;:::i;:::-;2885:5;-1:-1:-1;2942:2:1;2927:18;;2914:32;2955:33;2914:32;2955:33;:::i;:::-;2615:456;;3007:7;;-1:-1:-1;;;3061:2:1;3046:18;;;;3033:32;;2615:456::o;3505:247::-;3564:6;3617:2;3605:9;3596:7;3592:23;3588:32;3585:52;;;3633:1;3630;3623:12;3585:52;3672:9;3659:23;3691:31;3716:5;3691:31;:::i;3965:180::-;4024:6;4077:2;4065:9;4056:7;4052:23;4048:32;4045:52;;;4093:1;4090;4083:12;4045:52;-1:-1:-1;4116:23:1;;3965:180;-1:-1:-1;3965:180:1:o;4403:388::-;4471:6;4479;4532:2;4520:9;4511:7;4507:23;4503:32;4500:52;;;4548:1;4545;4538:12;4500:52;4587:9;4574:23;4606:31;4631:5;4606:31;:::i;:::-;4656:5;-1:-1:-1;4713:2:1;4698:18;;4685:32;4726:33;4685:32;4726:33;:::i;:::-;4778:7;4768:17;;;4403:388;;;;;:::o;5019:356::-;5221:2;5203:21;;;5240:18;;;5233:30;5299:34;5294:2;5279:18;;5272:62;5366:2;5351:18;;5019:356::o;5590:380::-;5669:1;5665:12;;;;5712;;;5733:61;;5787:4;5779:6;5775:17;5765:27;;5733:61;5840:2;5832:6;5829:14;5809:18;5806:38;5803:161;;5886:10;5881:3;5877:20;5874:1;5867:31;5921:4;5918:1;5911:15;5949:4;5946:1;5939:15;5803:161;;5590:380;;;:::o;5975:127::-;6036:10;6031:3;6027:20;6024:1;6017:31;6067:4;6064:1;6057:15;6091:4;6088:1;6081:15;6107:127;6168:10;6163:3;6159:20;6156:1;6149:31;6199:4;6196:1;6189:15;6223:4;6220:1;6213:15;6239:168;6312:9;;;6343;;6360:15;;;6354:22;;6340:37;6330:71;;6381:18;;:::i;6792:277::-;6859:6;6912:2;6900:9;6891:7;6887:23;6883:32;6880:52;;;6928:1;6925;6918:12;6880:52;6960:9;6954:16;7013:5;7006:13;6999:21;6992:5;6989:32;6979:60;;7035:1;7032;7025:12;7074:135;7113:3;7134:17;;;7131:43;;7154:18;;:::i;:::-;-1:-1:-1;7201:1:1;7190:13;;7074:135::o;7519:306::-;7607:6;7615;7623;7676:2;7664:9;7655:7;7651:23;7647:32;7644:52;;;7692:1;7689;7682:12;7644:52;7721:9;7715:16;7705:26;;7771:2;7760:9;7756:18;7750:25;7740:35;;7815:2;7804:9;7800:18;7794:25;7784:35;;7519:306;;;;;:::o;8641:251::-;8711:6;8764:2;8752:9;8743:7;8739:23;8735:32;8732:52;;;8780:1;8777;8770:12;8732:52;8812:9;8806:16;8831:31;8856:5;8831:31;:::i;9206:217::-;9246:1;9272;9262:132;;9316:10;9311:3;9307:20;9304:1;9297:31;9351:4;9348:1;9341:15;9379:4;9376:1;9369:15;9262:132;-1:-1:-1;9408:9:1;;9206:217::o;11125:125::-;11190:9;;;11211:10;;;11208:36;;;11224:18;;:::i;11611:401::-;11813:2;11795:21;;;11852:2;11832:18;;;11825:30;11891:34;11886:2;11871:18;;11864:62;-1:-1:-1;;;11957:2:1;11942:18;;11935:35;12002:3;11987:19;;11611:401::o;13489:128::-;13556:9;;;13577:11;;;13574:37;;;13591:18;;:::i;14437:461::-;14490:3;14528:5;14522:12;14555:6;14550:3;14543:19;14581:4;14610:2;14605:3;14601:12;14594:19;;14647:2;14640:5;14636:14;14668:1;14678:195;14692:6;14689:1;14686:13;14678:195;;;14757:13;;-1:-1:-1;;;;;14753:39:1;14741:52;;14813:12;;;;14848:15;;;;14789:1;14707:9;14678:195;;;-1:-1:-1;14889:3:1;;14437:461;-1:-1:-1;;;;;14437:461:1:o;14903:582::-;15202:6;15191:9;15184:25;15245:6;15240:2;15229:9;15225:18;15218:34;15288:3;15283:2;15272:9;15268:18;15261:31;15165:4;15309:57;15361:3;15350:9;15346:19;15338:6;15309:57;:::i;:::-;-1:-1:-1;;;;;15402:32:1;;;;15397:2;15382:18;;15375:60;-1:-1:-1;15466:3:1;15451:19;15444:35;15301:65;14903:582;-1:-1:-1;;;14903:582:1:o
Swarm Source
ipfs://7721c699b09ed27a7eba52a91608fb4ae9fbbeae089e3437bc2f4bf5a20aa40f
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.