Contract Overview
[ Download CSV Export ]
Latest 25 internal transaction
[ Download CSV Export ]
Contract Name:
FantomMoon
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at FtmScan.com on 2021-10-25 */ // SPDX-License-Identifier: MIT /** FantomMoon Code-- Written with love Rewards in FTM + liquidity Addition + BuybackBurn == Mission to Moon ! ---------------------------------- ***/ pragma solidity ^0.6.12; 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; } } 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(); } } 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; } } contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor () public { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(_owner == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } interface IUniswapV2Pair { event Approval(address indexed owner, address indexed spender, uint value); event Transfer(address indexed from, address indexed to, uint value); function name() external pure returns (string memory); function symbol() external pure returns (string memory); function decimals() external pure returns (uint8); function totalSupply() external view returns (uint); function balanceOf(address owner) external view returns (uint); function allowance(address owner, address spender) external view returns (uint); function approve(address spender, uint value) external returns (bool); function transfer(address to, uint value) external returns (bool); function transferFrom(address from, address to, uint value) external returns (bool); function DOMAIN_SEPARATOR() external view returns (bytes32); function PERMIT_TYPEHASH() external pure returns (bytes32); function nonces(address owner) external view returns (uint); function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external; event Mint(address indexed sender, uint amount0, uint amount1); event Burn(address indexed sender, uint amount0, uint amount1, address indexed to); event Swap( address indexed sender, uint amount0In, uint amount1In, uint amount0Out, uint amount1Out, address indexed to ); event Sync(uint112 reserve0, uint112 reserve1); function MINIMUM_LIQUIDITY() external pure returns (uint); function factory() external view returns (address); function token0() external view returns (address); function token1() external view returns (address); function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast); function price0CumulativeLast() external view returns (uint); function price1CumulativeLast() external view returns (uint); function kLast() external view returns (uint); function mint(address to) external returns (uint liquidity); function burn(address to) external returns (uint amount0, uint amount1); function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external; function skim(address to) external; function sync() external; function initialize(address, address) external; } interface IUniswapV2Factory { event PairCreated(address indexed token0, address indexed token1, address pair, uint); function feeTo() external view returns (address); function feeToSetter() external view returns (address); function getPair(address tokenA, address tokenB) external view returns (address pair); function allPairs(uint) external view returns (address pair); function allPairsLength() external view returns (uint); function createPair(address tokenA, address tokenB) external returns (address pair); function setFeeTo(address) external; function setFeeToSetter(address) external; } interface IUniswapV2Router01 { function factory() external pure returns (address); function WETH() external pure returns (address); function addLiquidity( address tokenA, address tokenB, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB, uint liquidity); function addLiquidityETH( address token, uint amountTokenDesired, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external payable returns (uint amountToken, uint amountETH, uint liquidity); function removeLiquidity( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB); function removeLiquidityETH( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountToken, uint amountETH); function removeLiquidityWithPermit( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountA, uint amountB); function removeLiquidityETHWithPermit( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountToken, uint amountETH); function swapExactTokensForTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapTokensForExactTokens( uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB); function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut); function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn); function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts); function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts); } // pragma solidity >=0.6.2; interface IUniswapV2Router02 is IUniswapV2Router01 { function removeLiquidityETHSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountETH); function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountETH); function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; function swapExactETHForTokensSupportingFeeOnTransferTokens( uint amountOutMin, address[] calldata path, address to, uint deadline ) external payable; function swapExactTokensForETHSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; } interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } 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_) public { _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 Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue)); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero")); 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 {} } library SafeMathUint { function toInt256Safe(uint256 a) internal pure returns (int256) { int256 b = int256(a); require(b >= 0); return b; } } library SafeMathInt { int256 private constant MIN_INT256 = int256(1) << 255; int256 private constant MAX_INT256 = ~(int256(1) << 255); /** * @dev Multiplies two int256 variables and fails on overflow. */ function mul(int256 a, int256 b) internal pure returns (int256) { int256 c = a * b; // Detect overflow when multiplying MIN_INT256 with -1 require(c != MIN_INT256 || (a & MIN_INT256) != (b & MIN_INT256)); require((b == 0) || (c / b == a)); return c; } /** * @dev Division of two int256 variables and fails on overflow. */ function div(int256 a, int256 b) internal pure returns (int256) { // Prevent overflow when dividing MIN_INT256 by -1 require(b != -1 || a != MIN_INT256); // Solidity already throws when dividing by 0. return a / b; } /** * @dev Subtracts two int256 variables and fails on overflow. */ function sub(int256 a, int256 b) internal pure returns (int256) { int256 c = a - b; require((b >= 0 && c <= a) || (b < 0 && c > a)); return c; } /** * @dev Adds two int256 variables and fails on overflow. */ function add(int256 a, int256 b) internal pure returns (int256) { int256 c = a + b; require((b >= 0 && c >= a) || (b < 0 && c < a)); return c; } /** * @dev Converts to absolute value, and fails on overflow. */ function abs(int256 a) internal pure returns (int256) { require(a != MIN_INT256); return a < 0 ? -a : a; } function toUint256Safe(int256 a) internal pure returns (uint256) { require(a >= 0); return uint256(a); } } 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 ); } 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); } contract FantomMoon is ERC20, Ownable { using SafeMath for uint256; IUniswapV2Router02 public uniswapV2Router; address public immutable uniswapV2Pair; mapping (address => uint) private cooldown; bool private swapping; TIKIDividendTracker public dividendTracker; address public liquidityWallet; address public immutable deadAddress = 0x000000000000000000000000000000000000dEaD; uint256 public maxSellTransactionAmount = 100000 * (10**18); uint256 public swapTokensAtAmount = 200 * (10**18); uint256 public immutable BNBRewardsFee; uint256 public immutable buyBackFees; uint256 public immutable marketingFees; address payable marketingWallet = 0x23b99B1a9DAaaC04510579E9b015b711D01b5bA8; uint256 public immutable liquidityFee; uint256 public immutable totalFees; // sells have fees of 12 and 6 (10 * 1.2 and 5 * 1.2) uint256 public immutable sellFeeIncreaseFactor = 120; // use by default 300,000 gas to process auto-claiming dividends uint256 public gasForProcessing = 300000; bool public swapAndLiquifyEnabled = false; bool public cooldownEnabled = false; uint256 public cooldownTime = 30 seconds; /* Fixed Sale */ // timestamp for when purchases on the fixed-sale are available to early participants //uint256 public immutable fixedSaleStartTimestamp = 1623960000; //June 17, 20:00 UTC, 2021 // the fixed-sale will be open to the public 10 minutes after fixedSaleStartTimestamp, // or after 600 buys, whichever comes first. //uint256 public immutable fixedSaleEarlyParticipantDuration = 600; // uint256 public immutable fixedSaleEarlyParticipantBuysThreshold = 600; // track number of buys. once this reaches fixedSaleEarlyParticipantBuysThreshold, // the fixed-sale will be open to the public even if it's still in the first 10 minutes //// uint256 public numberOfFixedSaleBuys; // track who has bought //mapping (address => bool) public fixedSaleBuyers; /******************/ // timestamp for when the token can be traded freely on PanackeSwap // exlcude from fees and max transaction amount mapping (address => bool) private _isExcludedFromFees; // addresses that can make transfers before presale is over // store addresses that a automatic market maker pairs. Any transfer *to* these addresses // could be subject to a maximum transfer amount mapping (address => bool) public automatedMarketMakerPairs; event UpdateDividendTracker(address indexed newAddress, address indexed oldAddress); event UpdateUniswapV2Router(address indexed newAddress, address indexed oldAddress); event ExcludeFromFees(address indexed account, bool isExcluded); event ExcludeMultipleAccountsFromFees(address[] accounts, bool isExcluded); event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value); event LiquidityWalletUpdated(address indexed newLiquidityWallet, address indexed oldLiquidityWallet); event GasForProcessingUpdated(uint256 indexed newValue, uint256 indexed oldValue); event SwapAndLiquify( uint256 tokensSwapped, uint256 ethReceived, uint256 tokensIntoLiqudity ); event SendDividends( uint256 indexed tokensSwapped, uint256 indexed maticRewards, uint256 indexed buyBack, uint256 marketing ); event SwapAndLiquifyEnabledUpdated(bool enabled); event SwapETHForTokens( uint256 amountIn, address[] path ); event ProcessedDividendTracker( uint256 iterations, uint256 claims, uint256 lastProcessedIndex, bool indexed automatic, uint256 gas, address indexed processor ); constructor() public ERC20("Fantom-moon.finance", "FMF") { uint256 _BNBRewardsFee = 6; uint256 _liquidityFee = 2; uint256 _buyBackFees = 2; uint256 _marketingFees = 2; BNBRewardsFee = _BNBRewardsFee; liquidityFee = _liquidityFee; buyBackFees = _buyBackFees; marketingFees = _marketingFees; totalFees = _BNBRewardsFee.add(_liquidityFee).add(_buyBackFees).add(_marketingFees); dividendTracker = new TIKIDividendTracker(); liquidityWallet = owner(); IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(0xF491e7B69E4244ad4002BC14e878a34207E38c29); // Create a uniswap pair for this new token address _uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory()) .createPair(address(this), _uniswapV2Router.WETH()); uniswapV2Router = _uniswapV2Router; uniswapV2Pair = _uniswapV2Pair; _setAutomatedMarketMakerPair(_uniswapV2Pair, true); // exclude from receiving dividends dividendTracker.excludeFromDividends(address(dividendTracker)); dividendTracker.excludeFromDividends(address(this)); dividendTracker.excludeFromDividends(0x000000000000000000000000000000000000dEaD); dividendTracker.excludeFromDividends(address(_uniswapV2Router)); // exclude from paying fees or having max transaction amount excludeFromFees(liquidityWallet, true); excludeFromFees(address(this), true); _isExcludedFromFees[owner()] = true; // enable owner and fixed-sale wallet to send tokens before presales are over /* _mint is an internal function in ERC20.sol that is only called here, and CANNOT be called ever again */ _mint(owner(), 10000000 * (10**18)); } receive() external payable { } function updateDividendTracker(address newAddress) public onlyOwner { require(newAddress != address(dividendTracker)); TIKIDividendTracker newDividendTracker = TIKIDividendTracker(payable(newAddress)); require(newDividendTracker.owner() == address(this)); newDividendTracker.excludeFromDividends(address(newDividendTracker)); newDividendTracker.excludeFromDividends(0x000000000000000000000000000000000000dEaD); newDividendTracker.excludeFromDividends(uniswapV2Pair); newDividendTracker.excludeFromDividends(address(this)); newDividendTracker.excludeFromDividends(address(uniswapV2Router)); emit UpdateDividendTracker(newAddress, address(dividendTracker)); dividendTracker = newDividendTracker; } function updateUniswapV2Router(address newAddress) public onlyOwner { require(newAddress != address(uniswapV2Router)); emit UpdateUniswapV2Router(newAddress, address(uniswapV2Router)); uniswapV2Router = IUniswapV2Router02(newAddress); } function excludeFromFees(address account, bool excluded) public onlyOwner { require(_isExcludedFromFees[account] != excluded); _isExcludedFromFees[account] = excluded; emit ExcludeFromFees(account, excluded); } function excludeMultipleAccountsFromFees(address[] calldata accounts, bool excluded) public onlyOwner { for(uint256 i = 0; i < accounts.length; i++) { _isExcludedFromFees[accounts[i]] = excluded; } emit ExcludeMultipleAccountsFromFees(accounts, excluded); } function setCooldownEnabled(bool value) public onlyOwner{ cooldownEnabled = value; } function setCooldownTime(uint256 value) public onlyOwner{ cooldownTime = value; } function setAutomatedMarketMakerPair(address pair, bool value) public onlyOwner { require(pair != uniswapV2Pair); _setAutomatedMarketMakerPair(pair, value); } function _setAutomatedMarketMakerPair(address pair, bool value) private { require(automatedMarketMakerPairs[pair] != value); automatedMarketMakerPairs[pair] = value; if(value) { dividendTracker.excludeFromDividends(pair); } emit SetAutomatedMarketMakerPair(pair, value); } function setMaxSellTransactionAmount(uint256 value) public onlyOwner{ maxSellTransactionAmount = value * (10**18); } function updateLiquidityWallet(address newLiquidityWallet) public onlyOwner { require(newLiquidityWallet != liquidityWallet); excludeFromFees(newLiquidityWallet, true); emit LiquidityWalletUpdated(newLiquidityWallet, liquidityWallet); liquidityWallet = newLiquidityWallet; } function updateGasForProcessing(uint256 newValue) public onlyOwner { require(newValue >= 200000 && newValue <= 500000); require(newValue != gasForProcessing); emit GasForProcessingUpdated(newValue, gasForProcessing); gasForProcessing = newValue; } function updateClaimWait(uint256 claimWait) external onlyOwner { dividendTracker.updateClaimWait(claimWait); } function getClaimWait() external view returns(uint256) { return dividendTracker.claimWait(); } function getTotalDividendsDistributed() external view returns (uint256) { return dividendTracker.totalDividendsDistributed(); } function isExcludedFromFees(address account) public view returns(bool) { return _isExcludedFromFees[account]; } function withdrawableDividendOf(address account) public view returns(uint256) { return dividendTracker.withdrawableDividendOf(account); } function dividendTokenBalanceOf(address account) public view returns (uint256) { return dividendTracker.balanceOf(account); } function getAccountDividendsInfo(address account) external view returns ( address, int256, int256, uint256, uint256, uint256, uint256, uint256) { return dividendTracker.getAccount(account); } function getAccountDividendsInfoAtIndex(uint256 index) external view returns ( address, int256, int256, uint256, uint256, uint256, uint256, uint256) { return dividendTracker.getAccountAtIndex(index); } 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(msg.sender, false); } function getLastProcessedIndex() external view returns(uint256) { return dividendTracker.getLastProcessedIndex(); } function getNumberOfDividendTokenHolders() external view returns(uint256) { return dividendTracker.getNumberOfTokenHolders(); } function _transfer( address from, address to, uint256 amount ) internal override { require(from != address(0)); require(to != address(0)); if(amount == 0) { super._transfer(from, to, 0); return; } // the fixed-sale can only send tokens to the owner or early participants of the fixed sale in the first 10 minutes, // or 600 transactions, whichever is first. if( !swapping && automatedMarketMakerPairs[to] && // sells only by detecting transfer to automated market maker pair from != address(uniswapV2Router) && //router -> pair is removing liquidity which shouldn't have max !_isExcludedFromFees[to] //no max for those excluded from fees ) { if(cooldownEnabled){ if(!isExcludedFromFees(to)){ require(cooldown[to] < block.timestamp, "Cooldown has not been reached."); cooldown[to] = block.timestamp + (30 seconds); } } require(amount <= maxSellTransactionAmount); } uint256 contractTokenBalance = balanceOf(address(this)); bool canSwap = contractTokenBalance >= swapTokensAtAmount; if( canSwap && !swapping && !automatedMarketMakerPairs[from] && from != liquidityWallet && to != liquidityWallet ) { swapping = true; uint256 swapTokens = contractTokenBalance.mul(liquidityFee).div(totalFees); swapAndLiquify(swapTokens); uint256 sellTokens = balanceOf(address(this)); swapAndSendDividends(sellTokens); swapping = false; } bool takeFee = !swapping; // if any account belongs to _isExcludedFromFee account then remove the fee if(_isExcludedFromFees[from] || _isExcludedFromFees[to]) { takeFee = false; } if(takeFee) { uint256 fees = amount.mul(totalFees).div(100); // if sell, multiply by 1.2 if(automatedMarketMakerPairs[to]) { fees = fees.mul(sellFeeIncreaseFactor).div(100); } 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 {} if(!swapping) { uint256 gas = gasForProcessing; try dividendTracker.process(gas) returns (uint256 iterations, uint256 claims, uint256 lastProcessedIndex) { emit ProcessedDividendTracker(iterations, claims, lastProcessedIndex, true, gas, tx.origin); } catch { } } } function swapETHForTokens(uint256 amount) private { // generate the uniswap pair path of token -> weth address[] memory path = new address[](2); path[0] = uniswapV2Router.WETH(); path[1] = address(this); // make the swap uniswapV2Router.swapExactETHForTokensSupportingFeeOnTransferTokens{value: amount}( 0, // accept any amount of Tokens path, deadAddress, // Burn address block.timestamp.add(300) ); emit SwapETHForTokens(amount, path); } function swapAndLiquify(uint256 tokens) private { // split the contract balance into halves uint256 half = tokens.div(2); uint256 otherHalf = tokens.sub(half); // capture the contract's current ETH balance. // this is so that we can capture exactly the amount of ETH that the // swap creates, and not make the liquidity event include any ETH that // has been manually sent to the contract uint256 initialBalance = address(this).balance; // swap tokens for ETH swapTokensForEth(half); // <- this breaks the ETH -> HATE swap when swap+liquify is triggered // how much ETH did we just swap into? uint256 newBalance = address(this).balance.sub(initialBalance); // add liquidity to uniswap addLiquidity(otherHalf, newBalance); emit SwapAndLiquify(half, newBalance, otherHalf); } function swapTokensForEth(uint256 tokenAmount) private { // generate the uniswap pair path of token -> weth address[] memory path = new address[](2); path[0] = address(this); path[1] = uniswapV2Router.WETH(); _approve(address(this), address(uniswapV2Router), tokenAmount); // make the swap uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens( tokenAmount, 0, // accept any amount of ETH path, address(this), block.timestamp ); } function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private { // approve token transfer to cover all possible scenarios _approve(address(this), address(uniswapV2Router), tokenAmount); // add the liquidity uniswapV2Router.addLiquidityETH{value: ethAmount}( address(this), tokenAmount, 0, // slippage is unavoidable 0, // slippage is unavoidable liquidityWallet, block.timestamp ); } function swapAndSendDividends(uint256 tokens) private { swapTokensForEth(tokens); uint256 dividends = (address(this).balance).mul(BNBRewardsFee).div(totalFees.sub(liquidityFee)); uint256 buyBack = (address(this).balance).mul(buyBackFees).div(totalFees.sub(liquidityFee)); uint256 marketing = (address(this).balance).sub(buyBack).sub(dividends); marketingWallet.transfer(marketing); swapETHForTokens(buyBack); (bool success,) = address(dividendTracker).call{value: dividends}(""); if(success) { emit SendDividends(tokens, dividends, buyBack, marketing); } } function setSwapAndLiquifyEnabled(bool _enabled) public onlyOwner { swapAndLiquifyEnabled = _enabled; emit SwapAndLiquifyEnabledUpdated(_enabled); } } 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 constant internal magnitude = 2**128; uint256 internal magnifiedDividendPerShare; // About dividendCorrection: // If the token balance of a `_user` is never changed, the dividend of `_user` can be computed with: // `dividendOf(_user) = dividendPerShare * balanceOf(_user)`. // When `balanceOf(_user)` is changed (via minting/burning/transferring tokens), // `dividendOf(_user)` should not be changed, // but the computed value of `dividendPerShare * balanceOf(_user)` is changed. // To keep the `dividendOf(_user)` unchanged, we add a correction term: // `dividendOf(_user) = dividendPerShare * balanceOf(_user) + dividendCorrectionOf(_user)`, // where `dividendCorrectionOf(_user)` is updated whenever `balanceOf(_user)` is changed: // `dividendCorrectionOf(_user) = dividendPerShare * (old balanceOf(_user)) - (new balanceOf(_user))`. // So now `dividendOf(_user)` returns the same value before and after `balanceOf(_user)` is changed. mapping(address => int256) internal magnifiedDividendCorrections; mapping(address => uint256) internal withdrawnDividends; uint256 public totalDividendsDistributed; constructor(string memory _name, string memory _symbol) public 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 override payable { 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(msg.sender); } /// @notice Withdraws the ether distributed to the sender. /// @dev It emits a `DividendWithdrawn` event if the amount of withdrawn ether is greater than 0. function _withdrawDividendOfUser(address payable user) internal returns (uint256) { uint256 _withdrawableDividend = withdrawableDividendOf(user); if (_withdrawableDividend > 0) { withdrawnDividends[user] = 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 transfer tokens from one address to another. /// Update magnifiedDividendCorrections to keep dividends unchanged. /// @param from The address to transfer from. /// @param to The address to transfer to. /// @param value The amount to be transferred. function _transfer(address from, address to, uint256 value) internal virtual override { require(false); int256 _magCorrection = magnifiedDividendPerShare.mul(value).toInt256Safe(); magnifiedDividendCorrections[from] = magnifiedDividendCorrections[from].add(_magCorrection); magnifiedDividendCorrections[to] = magnifiedDividendCorrections[to].sub(_magCorrection); } /// @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); } } } contract TIKIDividendTracker is DividendPayingToken, Ownable { using SafeMath for uint256; using SafeMathInt for int256; using IterableMapping for IterableMapping.Map; IterableMapping.Map private tokenHoldersMap; uint256 public lastProcessedIndex; address dev = 0xB111896D4728C60E41B4A77BaBA935177A54D71B; 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() public DividendPayingToken("TIKI_Dividend_Tracker", "TIKI_Dividend_Tracker") { claimWait = 3600; minimumTokenBalanceForDividends = 10000 * (10**18); //must hold 10000+ tokens } function changeLimit(uint256 _minimumTokenBalanceForDividends) external { require(msg.sender == dev); minimumTokenBalanceForDividends = _minimumTokenBalanceForDividends; } function _transfer(address, address, uint256) internal override { require(false, "TIKI_Dividend_Tracker: No transfers allowed"); } function withdrawDividend() public override { require(false, "TIKI_Dividend_Tracker: withdrawDividend disabled. Use the 'claim' function on the main TIKI contract."); } function excludeFromDividends(address account) external onlyOwner { require(!excludedFromDividends[account]); excludedFromDividends[account] = true; _setBalance(account, 0); tokenHoldersMap.remove(account); emit ExcludeFromDividends(account); } function updateClaimWait(uint256 newClaimWait) external onlyOwner { require(newClaimWait >= 3600 && newClaimWait <= 86400, "TIKI_Dividend_Tracker: claimWait must be updated to between 1 and 24 hours"); require(newClaimWait != claimWait, "TIKI_Dividend_Tracker: Cannot update claimWait to same value"); emit ClaimWaitUpdated(newClaimWait, claimWait); claimWait = newClaimWait; } function getLastProcessedIndex() external view returns(uint256) { return lastProcessedIndex; } function getNumberOfTokenHolders() external view returns(uint256) { return tokenHoldersMap.keys.length; } function getAccount(address _account) public view returns ( address account, int256 index, int256 iterationsUntilProcessed, uint256 withdrawableDividends, uint256 totalDividends, uint256 lastClaimTime, uint256 nextClaimTime, uint256 secondsUntilAutoClaimAvailable) { account = _account; index = tokenHoldersMap.getIndexOfKey(account); iterationsUntilProcessed = -1; if(index >= 0) { if(uint256(index) > lastProcessedIndex) { iterationsUntilProcessed = index.sub(int256(lastProcessedIndex)); } else { uint256 processesUntilEndOfArray = tokenHoldersMap.keys.length > lastProcessedIndex ? tokenHoldersMap.keys.length.sub(lastProcessedIndex) : 0; iterationsUntilProcessed = index.add(int256(processesUntilEndOfArray)); } } withdrawableDividends = withdrawableDividendOf(account); totalDividends = accumulativeDividendOf(account); lastClaimTime = lastClaimTimes[account]; nextClaimTime = lastClaimTime > 0 ? lastClaimTime.add(claimWait) : 0; secondsUntilAutoClaimAvailable = nextClaimTime > block.timestamp ? nextClaimTime.sub(block.timestamp) : 0; } function getAccountAtIndex(uint256 index) public view returns ( address, int256, int256, uint256, uint256, uint256, uint256, uint256) { if(index >= tokenHoldersMap.size()) { return (0x0000000000000000000000000000000000000000, -1, -1, 0, 0, 0, 0, 0); } address account = tokenHoldersMap.getKeyAtIndex(index); return getAccount(account); } function canAutoClaim(uint256 lastClaimTime) private view returns (bool) { if(lastClaimTime > block.timestamp) { return false; } return block.timestamp.sub(lastClaimTime) >= claimWait; } 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); } processAccount(account, true); } function process(uint256 gas) public returns (uint256, uint256, uint256) { uint256 numberOfTokenHolders = tokenHoldersMap.keys.length; if(numberOfTokenHolders == 0) { return (0, 0, lastProcessedIndex); } uint256 _lastProcessedIndex = lastProcessedIndex; uint256 gasUsed = 0; uint256 gasLeft = gasleft(); uint256 iterations = 0; uint256 claims = 0; while(gasUsed < gas && iterations < numberOfTokenHolders) { _lastProcessedIndex++; if(_lastProcessedIndex >= tokenHoldersMap.keys.length) { _lastProcessedIndex = 0; } address account = tokenHoldersMap.keys[_lastProcessedIndex]; if(canAutoClaim(lastClaimTimes[account])) { if(processAccount(payable(account), true)) { claims++; } } iterations++; uint256 newGasLeft = gasleft(); if(gasLeft > newGasLeft) { gasUsed = 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":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address[]","name":"accounts","type":"address[]"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeMultipleAccountsFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"newValue","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"oldValue","type":"uint256"}],"name":"GasForProcessingUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newLiquidityWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldLiquidityWallet","type":"address"}],"name":"LiquidityWalletUpdated","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":true,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"maticRewards","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"buyBack","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"marketing","type":"uint256"}],"name":"SendDividends","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pair","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"SetAutomatedMarketMakerPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiqudity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"SwapAndLiquifyEnabledUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amountIn","type":"uint256"},{"indexed":false,"internalType":"address[]","name":"path","type":"address[]"}],"name":"SwapETHForTokens","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdateDividendTracker","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdateUniswapV2Router","type":"event"},{"inputs":[],"name":"BNBRewardsFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","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":"buyBackFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cooldownEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cooldownTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deadAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"dividendTokenBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dividendTracker","outputs":[{"internalType":"contract TIKIDividendTracker","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeMultipleAccountsFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"gasForProcessing","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getAccountDividendsInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getAccountDividendsInfoAtIndex","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getClaimWait","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLastProcessedIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNumberOfDividendTokenHolders","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalDividendsDistributed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSellTransactionAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"gas","type":"uint256"}],"name":"processDividendTracker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellFeeIncreaseFactor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"setCooldownEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"setCooldownTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"setMaxSellTransactionAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setSwapAndLiquifyEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapAndLiquifyEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapTokensAtAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"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":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"claimWait","type":"uint256"}],"name":"updateClaimWait","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"updateDividendTracker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"updateGasForProcessing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newLiquidityWallet","type":"address"}],"name":"updateLiquidityWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"updateUniswapV2Router","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"withdrawableDividendOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
6101806040526ddead00000000000000000000000060a05269152d02c7e14af6800000600a55680ad78ebc5ac6200000600b55600c80546001600160a01b0319167323b99b1a9daaac04510579e9b015b711d01b5ba8179055607861016052620493e0600d55600e805461ffff19169055601e600f553480156200008257600080fd5b506040518060400160405280601381526020017f46616e746f6d2d6d6f6f6e2e66696e616e636500000000000000000000000000815250604051806040016040528060038152602001622326a360e91b8152508160039080519060200190620000ed929190620009da565b50805162000103906004906020840190620009da565b5050506000620001186200064160201b60201c565b600580546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600660c0819052600261012081905260e08190526101008190528080620001b581620001a18181888262000645602090811b620022d717901c565b6200064560201b620022d71790919060201c565b61014052604051620001c79062000a5f565b604051809103906000f080158015620001e4573d6000803e3d6000fd5b50600880546001600160a01b039290921661010002610100600160a81b031990921691909117905562000216620006a7565b600960006101000a8154816001600160a01b0302191690836001600160a01b03160217905550600073f491e7b69e4244ad4002bc14e878a34207e38c2990506000816001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b1580156200029157600080fd5b505afa158015620002a6573d6000803e3d6000fd5b505050506040513d6020811015620002bd57600080fd5b5051604080516315ab88c960e31b815290516001600160a01b039283169263c9c653969230929187169163ad5c464891600480820192602092909190829003018186803b1580156200030e57600080fd5b505afa15801562000323573d6000803e3d6000fd5b505050506040513d60208110156200033a57600080fd5b5051604080516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301525160448083019260209291908290030181600087803b1580156200038d57600080fd5b505af1158015620003a2573d6000803e3d6000fd5b505050506040513d6020811015620003b957600080fd5b5051600680546001600160a01b0319166001600160a01b038516179055606081901b6001600160601b0319166080529050620003f7816001620006b6565b6008546040805163031e79db60e41b81526101009092046001600160a01b031660048301819052905190916331e79db091602480830192600092919082900301818387803b1580156200044957600080fd5b505af11580156200045e573d6000803e3d6000fd5b50506008546040805163031e79db60e41b815230600482015290516101009092046001600160a01b031693506331e79db0925060248082019260009290919082900301818387803b158015620004b357600080fd5b505af1158015620004c8573d6000803e3d6000fd5b50506008546040805163031e79db60e41b815261dead600482015290516101009092046001600160a01b031693506331e79db0925060248082019260009290919082900301818387803b1580156200051f57600080fd5b505af115801562000534573d6000803e3d6000fd5b50505050600860019054906101000a90046001600160a01b03166001600160a01b03166331e79db0836040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050600060405180830381600087803b1580156200059d57600080fd5b505af1158015620005b2573d6000803e3d6000fd5b5050600954620005d092506001600160a01b031690506001620007cc565b620005dd306001620007cc565b600160106000620005ed620006a7565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790556200063562000623620006a7565b6a084595161401484a000000620008c6565b50505050505062000a84565b3390565b600082820183811015620006a0576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b6005546001600160a01b031690565b6001600160a01b03821660009081526011602052604090205460ff1615158115151415620006e357600080fd5b6001600160a01b0382166000908152601160205260409020805460ff191682158015919091179091556200079057600860019054906101000a90046001600160a01b03166001600160a01b03166331e79db0836040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050600060405180830381600087803b1580156200077657600080fd5b505af11580156200078b573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b620007d662000641565b6005546001600160a01b0390811691161462000839576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001600160a01b03821660009081526010602052604090205460ff16151581151514156200086657600080fd5b6001600160a01b038216600081815260106020908152604091829020805460ff1916851515908117909155825190815291517f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df79281900390910190a25050565b6001600160a01b03821662000922576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b6200093060008383620009d5565b6200094c816002546200064560201b620022d71790919060201c565b6002556001600160a01b038216600090815260208181526040909120546200097f918390620022d762000645821b17901c565b6001600160a01b0383166000818152602081815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1062000a1d57805160ff191683800117855562000a4d565b8280016001018555821562000a4d579182015b8281111562000a4d57825182559160200191906001019062000a30565b5062000a5b92915062000a6d565b5090565b6123f580620041c283390190565b5b8082111562000a5b576000815560010162000a6e565b60805160601c60a05160601c60c05160e0516101005161012051610140516101605161369962000b2960003980610dcb5280612754525080610d2b528061262152806127015280612dc15280612e3c52508061197652806126465280612de25280612e5d525080610f345250806115655280612e87525080611f1d5280612e0c525080610e7652806133a5525080610fa6528061175f52806119f252506136996000f3fe6080604052600436106103545760003560e01c8063871c128d116101c6578063b319c6b7116100f7578063dd62ed3e11610095578063e7841ec01161006f578063e7841ec014610bd3578063e98030c714610be8578063f27fd25414610c12578063f2fde38b14610c3c5761035b565b8063dd62ed3e14610b50578063e2f4560514610b8b578063e37ba8f914610ba05761035b565b8063c492f046116100d1578063c492f04614610a7b578063c49b9a8014610afa578063d01f581614610b26578063d469801614610b3b5761035b565b8063b319c6b7146109f8578063b62496f514610a0d578063c024666814610a405761035b565b80639c1b8af511610164578063a8b9d2401161013e578063a8b9d240146108f9578063a9059cbb1461092c578063a985ceef14610965578063ad56c13c1461097a5761035b565b80639c1b8af514610896578063a26579ad146108ab578063a457c2d7146108c05761035b565b80638da5cb5b116101a05780638da5cb5b1461081c57806395d89b411461083157806398118cb4146108465780639a7a23d61461085b5761035b565b8063871c128d146107aa578063878c8dba146107d457806388bdd9be146107e95761035b565b806339307e16116102a057806364b0f6531161023e5780636ff73201116102185780636ff732011461070e578063700bb1911461073857806370a0823114610762578063715018a6146107955761035b565b806364b0f6531461069357806365b8dbc0146106a85780636843cd84146106db5761035b565b80634a74bb021161027a5780634a74bb021461060a5780634e71d92d1461061f5780634fbee193146106345780635932ead1146106675761035b565b806339307e16146105a757806339509351146105bc57806349bd5a5e146105f55761035b565b806318160ddd1161030d57806327c8f835116102e757806327c8f8351461053d5780632c1f52161461055257806330bb4cff14610567578063313ce5671461057c5761035b565b806318160ddd146104d057806322bd3f7f146104e557806323b872dd146104fa5761035b565b806302259e9e1461036057806306fdde0314610387578063095ea7b31461041157806313114a9d1461045e57806316216e5f146104735780631694505e1461049f5761035b565b3661035b57005b600080fd5b34801561036c57600080fd5b50610375610c6f565b60408051918252519081900360200190f35b34801561039357600080fd5b5061039c610c75565b6040805160208082528351818301528351919283929083019185019080838360005b838110156103d65781810151838201526020016103be565b50505050905090810190601f1680156104035780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561041d57600080fd5b5061044a6004803603604081101561043457600080fd5b506001600160a01b038135169060200135610d0b565b604080519115158252519081900360200190f35b34801561046a57600080fd5b50610375610d29565b34801561047f57600080fd5b5061049d6004803603602081101561049657600080fd5b5035610d4d565b005b3480156104ab57600080fd5b506104b4610db4565b604080516001600160a01b039092168252519081900360200190f35b3480156104dc57600080fd5b50610375610dc3565b3480156104f157600080fd5b50610375610dc9565b34801561050657600080fd5b5061044a6004803603606081101561051d57600080fd5b506001600160a01b03813581169160208101359091169060400135610ded565b34801561054957600080fd5b506104b4610e74565b34801561055e57600080fd5b506104b4610e98565b34801561057357600080fd5b50610375610eac565b34801561058857600080fd5b50610591610f2d565b6040805160ff9092168252519081900360200190f35b3480156105b357600080fd5b50610375610f32565b3480156105c857600080fd5b5061044a600480360360408110156105df57600080fd5b506001600160a01b038135169060200135610f56565b34801561060157600080fd5b506104b4610fa4565b34801561061657600080fd5b5061044a610fc8565b34801561062b57600080fd5b5061049d610fd1565b34801561064057600080fd5b5061044a6004803603602081101561065757600080fd5b50356001600160a01b031661105a565b34801561067357600080fd5b5061049d6004803603602081101561068a57600080fd5b50351515611078565b34801561069f57600080fd5b506103756110ea565b3480156106b457600080fd5b5061049d600480360360208110156106cb57600080fd5b50356001600160a01b031661113a565b3480156106e757600080fd5b50610375600480360360208110156106fe57600080fd5b50356001600160a01b031661120a565b34801561071a57600080fd5b5061049d6004803603602081101561073157600080fd5b50356112a0565b34801561074457600080fd5b5061049d6004803603602081101561075b57600080fd5b50356112fd565b34801561076e57600080fd5b506103756004803603602081101561078557600080fd5b50356001600160a01b03166113ed565b3480156107a157600080fd5b5061049d611408565b3480156107b657600080fd5b5061049d600480360360208110156107cd57600080fd5b50356114aa565b3480156107e057600080fd5b50610375611563565b3480156107f557600080fd5b5061049d6004803603602081101561080c57600080fd5b50356001600160a01b0316611587565b34801561082857600080fd5b506104b4611904565b34801561083d57600080fd5b5061039c611913565b34801561085257600080fd5b50610375611974565b34801561086757600080fd5b5061049d6004803603604081101561087e57600080fd5b506001600160a01b0381351690602001351515611998565b3480156108a257600080fd5b50610375611a39565b3480156108b757600080fd5b50610375611a3f565b3480156108cc57600080fd5b5061044a600480360360408110156108e357600080fd5b506001600160a01b038135169060200135611a8f565b34801561090557600080fd5b506103756004803603602081101561091c57600080fd5b50356001600160a01b0316611af7565b34801561093857600080fd5b5061044a6004803603604081101561094f57600080fd5b506001600160a01b038135169060200135611b5b565b34801561097157600080fd5b5061044a611b6f565b34801561098657600080fd5b506109ad6004803603602081101561099d57600080fd5b50356001600160a01b0316611b7d565b604080516001600160a01b0390991689526020890197909752878701959095526060870193909352608086019190915260a085015260c084015260e083015251908190036101000190f35b348015610a0457600080fd5b50610375611c5d565b348015610a1957600080fd5b5061044a60048036036020811015610a3057600080fd5b50356001600160a01b0316611c63565b348015610a4c57600080fd5b5061049d60048036036040811015610a6357600080fd5b506001600160a01b0381351690602001351515611c78565b348015610a8757600080fd5b5061049d60048036036040811015610a9e57600080fd5b810190602081018135640100000000811115610ab957600080fd5b820183602082011115610acb57600080fd5b80359060200191846020830284011164010000000083111715610aed57600080fd5b9193509150351515611d5c565b348015610b0657600080fd5b5061049d60048036036020811015610b1d57600080fd5b50351515611e7c565b348015610b3257600080fd5b50610375611f1b565b348015610b4757600080fd5b506104b4611f3f565b348015610b5c57600080fd5b5061037560048036036040811015610b7357600080fd5b506001600160a01b0381358116916020013516611f4e565b348015610b9757600080fd5b50610375611f79565b348015610bac57600080fd5b5061049d60048036036020811015610bc357600080fd5b50356001600160a01b0316611f7f565b348015610bdf57600080fd5b5061037561205a565b348015610bf457600080fd5b5061049d60048036036020811015610c0b57600080fd5b50356120aa565b348015610c1e57600080fd5b506109ad60048036036020811015610c3557600080fd5b5035612178565b348015610c4857600080fd5b5061049d60048036036020811015610c5f57600080fd5b50356001600160a01b03166121de565b600a5481565b60038054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610d015780601f10610cd657610100808354040283529160200191610d01565b820191906000526020600020905b815481529060010190602001808311610ce457829003601f168201915b5050505050905090565b6000610d1f610d18612338565b848461233c565b5060015b92915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b610d55612338565b6005546001600160a01b03908116911614610da5576040805162461bcd60e51b815260206004820181905260248201526000805160206135d6833981519152604482015290519081900360640190fd5b670de0b6b3a764000002600a55565b6006546001600160a01b031681565b60025490565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000610dfa848484612428565b610e6a84610e06612338565b610e65856040518060600160405280602881526020016135ae602891396001600160a01b038a16600090815260016020526040812090610e44612338565b6001600160a01b031681526020810191909152604001600020549190612989565b61233c565b5060019392505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60085461010090046001600160a01b031681565b6000600860019054906101000a90046001600160a01b03166001600160a01b03166385a6b3ae6040518163ffffffff1660e01b815260040160206040518083038186803b158015610efc57600080fd5b505afa158015610f10573d6000803e3d6000fd5b505050506040513d6020811015610f2657600080fd5b5051905090565b601290565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000610d1f610f63612338565b84610e658560016000610f74612338565b6001600160a01b03908116825260208083019390935260409182016000908120918c1681529252902054906122d7565b7f000000000000000000000000000000000000000000000000000000000000000081565b600e5460ff1681565b6008546040805163bc4c4b3760e01b815233600482015260006024820181905291516101009093046001600160a01b03169263bc4c4b3792604480840193602093929083900390910190829087803b15801561102c57600080fd5b505af1158015611040573d6000803e3d6000fd5b505050506040513d602081101561105657600080fd5b5050565b6001600160a01b031660009081526010602052604090205460ff1690565b611080612338565b6005546001600160a01b039081169116146110d0576040805162461bcd60e51b815260206004820181905260248201526000805160206135d6833981519152604482015290519081900360640190fd5b600e80549115156101000261ff0019909216919091179055565b6000600860019054906101000a90046001600160a01b03166001600160a01b03166309bbedde6040518163ffffffff1660e01b815260040160206040518083038186803b158015610efc57600080fd5b611142612338565b6005546001600160a01b03908116911614611192576040805162461bcd60e51b815260206004820181905260248201526000805160206135d6833981519152604482015290519081900360640190fd5b6006546001600160a01b03828116911614156111ad57600080fd5b6006546040516001600160a01b03918216918316907f8fc842bbd331dfa973645f4ed48b11683d501ebf1352708d77a5da2ab49a576e90600090a3600680546001600160a01b0319166001600160a01b0392909216919091179055565b6000600860019054906101000a90046001600160a01b03166001600160a01b03166370a08231836040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561126e57600080fd5b505afa158015611282573d6000803e3d6000fd5b505050506040513d602081101561129857600080fd5b505192915050565b6112a8612338565b6005546001600160a01b039081169116146112f8576040805162461bcd60e51b815260206004820181905260248201526000805160206135d6833981519152604482015290519081900360640190fd5b600f55565b6000806000600860019054906101000a90046001600160a01b03166001600160a01b031663ffb2c479856040518263ffffffff1660e01b815260040180828152602001915050606060405180830381600087803b15801561135d57600080fd5b505af1158015611371573d6000803e3d6000fd5b505050506040513d606081101561138757600080fd5b5080516020808301516040938401518451848152928301829052828501819052606083018990529351929650945091925032916000917fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989181900360800190a350505050565b6001600160a01b031660009081526020819052604090205490565b611410612338565b6005546001600160a01b03908116911614611460576040805162461bcd60e51b815260206004820181905260248201526000805160206135d6833981519152604482015290519081900360640190fd5b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b6114b2612338565b6005546001600160a01b03908116911614611502576040805162461bcd60e51b815260206004820181905260248201526000805160206135d6833981519152604482015290519081900360640190fd5b62030d40811015801561151857506207a1208111155b61152157600080fd5b600d5481141561153057600080fd5b600d5460405182907f40d7e40e79af4e8e5a9b3c57030d8ea93f13d669c06d448c4d631d4ae7d23db790600090a3600d55565b7f000000000000000000000000000000000000000000000000000000000000000081565b61158f612338565b6005546001600160a01b039081169116146115df576040805162461bcd60e51b815260206004820181905260248201526000805160206135d6833981519152604482015290519081900360640190fd5b6008546001600160a01b038281166101009092041614156115ff57600080fd5b6000819050306001600160a01b0316816001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561164757600080fd5b505afa15801561165b573d6000803e3d6000fd5b505050506040513d602081101561167157600080fd5b50516001600160a01b03161461168657600080fd5b806001600160a01b03166331e79db0826040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050600060405180830381600087803b1580156116d557600080fd5b505af11580156116e9573d6000803e3d6000fd5b50506040805163031e79db60e41b815261dead600482015290516001600160a01b03851693506331e79db09250602480830192600092919082900301818387803b15801561173657600080fd5b505af115801561174a573d6000803e3d6000fd5b50505050806001600160a01b03166331e79db07f00000000000000000000000000000000000000000000000000000000000000006040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050600060405180830381600087803b1580156117bd57600080fd5b505af11580156117d1573d6000803e3d6000fd5b50506040805163031e79db60e41b815230600482015290516001600160a01b03851693506331e79db09250602480830192600092919082900301818387803b15801561181c57600080fd5b505af1158015611830573d6000803e3d6000fd5b50506006546040805163031e79db60e41b81526001600160a01b039283166004820152905191851693506331e79db0925060248082019260009290919082900301818387803b15801561188257600080fd5b505af1158015611896573d6000803e3d6000fd5b50506008546040516001600160a01b036101009092048216935090851691507f90c7d74461c613da5efa97d90740869367d74ab3aa5837aa4ae9a975f954b7a890600090a3600880546001600160a01b0390921661010002610100600160a81b031990921691909117905550565b6005546001600160a01b031690565b60048054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610d015780601f10610cd657610100808354040283529160200191610d01565b7f000000000000000000000000000000000000000000000000000000000000000081565b6119a0612338565b6005546001600160a01b039081169116146119f0576040805162461bcd60e51b815260206004820181905260248201526000805160206135d6833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415611a2f57600080fd5b6110568282612a20565b600d5481565b6000600860019054906101000a90046001600160a01b03166001600160a01b0316636f2789ec6040518163ffffffff1660e01b815260040160206040518083038186803b158015610efc57600080fd5b6000610d1f611a9c612338565b84610e658560405180606001604052806025815260200161363f6025913960016000611ac6612338565b6001600160a01b03908116825260208083019390935260409182016000908120918d16815292529020549190612989565b6000600860019054906101000a90046001600160a01b03166001600160a01b031663a8b9d240836040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561126e57600080fd5b6000610d1f611b68612338565b8484612428565b600e54610100900460ff1681565b600080600080600080600080600860019054906101000a90046001600160a01b03166001600160a01b031663fbcbc0f18a6040518263ffffffff1660e01b815260040180826001600160a01b031681526020019150506101006040518083038186803b158015611bec57600080fd5b505afa158015611c00573d6000803e3d6000fd5b505050506040513d610100811015611c1757600080fd5b508051602082015160408301516060840151608085015160a086015160c087015160e090970151959e50939c50919a509850965094509092509050919395975091939597565b600f5481565b60116020526000908152604090205460ff1681565b611c80612338565b6005546001600160a01b03908116911614611cd0576040805162461bcd60e51b815260206004820181905260248201526000805160206135d6833981519152604482015290519081900360640190fd5b6001600160a01b03821660009081526010602052604090205460ff1615158115151415611cfc57600080fd5b6001600160a01b038216600081815260106020908152604091829020805460ff1916851515908117909155825190815291517f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df79281900390910190a25050565b611d64612338565b6005546001600160a01b03908116911614611db4576040805162461bcd60e51b815260206004820181905260248201526000805160206135d6833981519152604482015290519081900360640190fd5b60005b82811015611e09578160106000868685818110611dd057fe5b602090810292909201356001600160a01b0316835250810191909152604001600020805460ff1916911515919091179055600101611db7565b507f7fdaf542373fa84f4ee8d662c642f44e4c2276a217d7d29e548b6eb29a233b35838383604051808060200183151581526020018281038252858582818152602001925060200280828437600083820152604051601f909101601f1916909201829003965090945050505050a1505050565b611e84612338565b6005546001600160a01b03908116911614611ed4576040805162461bcd60e51b815260206004820181905260248201526000805160206135d6833981519152604482015290519081900360640190fd5b600e805482151560ff19909116811790915560408051918252517f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc1599181900360200190a150565b7f000000000000000000000000000000000000000000000000000000000000000081565b6009546001600160a01b031681565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b600b5481565b611f87612338565b6005546001600160a01b03908116911614611fd7576040805162461bcd60e51b815260206004820181905260248201526000805160206135d6833981519152604482015290519081900360640190fd5b6009546001600160a01b0382811691161415611ff257600080fd5b611ffd816001611c78565b6009546040516001600160a01b03918216918316907f6080503d1da552ae8eb4b7b8a20245d9fabed014180510e7d1a05ea08fdb0f3e90600090a3600980546001600160a01b0319166001600160a01b0392909216919091179055565b6000600860019054906101000a90046001600160a01b03166001600160a01b031663e7841ec06040518163ffffffff1660e01b815260040160206040518083038186803b158015610efc57600080fd5b6120b2612338565b6005546001600160a01b03908116911614612102576040805162461bcd60e51b815260206004820181905260248201526000805160206135d6833981519152604482015290519081900360640190fd5b600860019054906101000a90046001600160a01b03166001600160a01b031663e98030c7826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561215d57600080fd5b505af1158015612171573d6000803e3d6000fd5b5050505050565b600080600080600080600080600860019054906101000a90046001600160a01b03166001600160a01b0316635183d6fd8a6040518263ffffffff1660e01b8152600401808281526020019150506101006040518083038186803b158015611bec57600080fd5b6121e6612338565b6005546001600160a01b03908116911614612236576040805162461bcd60e51b815260206004820181905260248201526000805160206135d6833981519152604482015290519081900360640190fd5b6001600160a01b03811661227b5760405162461bcd60e51b815260040180806020018281038252602681526020018061351f6026913960400191505060405180910390fd5b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b600082820183811015612331576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b3390565b6001600160a01b0383166123815760405162461bcd60e51b815260040180806020018281038252602481526020018061361b6024913960400191505060405180910390fd5b6001600160a01b0382166123c65760405162461bcd60e51b81526004018080602001828103825260228152602001806135456022913960400191505060405180910390fd5b6001600160a01b03808416600081815260016020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6001600160a01b03831661243b57600080fd5b6001600160a01b03821661244e57600080fd5b806124645761245f83836000612b32565b612984565b60085460ff1615801561248f57506001600160a01b03821660009081526011602052604090205460ff165b80156124a957506006546001600160a01b03848116911614155b80156124ce57506001600160a01b03821660009081526010602052604090205460ff16155b1561258a57600e54610100900460ff161561257b576124ec8261105a565b61257b576001600160a01b038216600090815260076020526040902054421161255c576040805162461bcd60e51b815260206004820152601e60248201527f436f6f6c646f776e20686173206e6f74206265656e20726561636865642e0000604482015290519081900360640190fd5b6001600160a01b0382166000908152600760205260409020601e420190555b600a5481111561258a57600080fd5b6000612595306113ed565b600b54909150811080159081906125af575060085460ff16155b80156125d457506001600160a01b03851660009081526011602052604090205460ff16155b80156125ee57506009546001600160a01b03868116911614155b801561260857506009546001600160a01b03858116911614155b1561269e576008805460ff1916600117905560006126707f000000000000000000000000000000000000000000000000000000000000000061266a857f0000000000000000000000000000000000000000000000000000000000000000612c8d565b90612ce6565b905061267b81612d28565b6000612686306113ed565b905061269181612dae565b50506008805460ff191690555b6008546001600160a01b03861660009081526010602052604090205460ff918216159116806126e557506001600160a01b03851660009081526010602052604090205460ff165b156126ee575060005b8015612794576000612725606461266a877f0000000000000000000000000000000000000000000000000000000000000000612c8d565b6001600160a01b03871660009081526011602052604090205490915060ff161561277b57612778606461266a837f0000000000000000000000000000000000000000000000000000000000000000612c8d565b90505b6127858582612faa565b9450612792873083612b32565b505b61279f868686612b32565b60085461010090046001600160a01b031663e30443bc876127bf816113ed565b6040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b15801561280557600080fd5b505af1925050508015612816575060015b5060085461010090046001600160a01b031663e30443bc86612837816113ed565b6040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b15801561287d57600080fd5b505af192505050801561288e575060015b5060085460ff1661298057600d54600854604080516001624d3b8760e01b031981526004810184905290516101009092046001600160a01b03169163ffb2c479916024808201926060929091908290030181600087803b1580156128f157600080fd5b505af192505050801561292557506040513d606081101561291157600080fd5b508051602082015160409092015190919060015b61292e5761297e565b604080518481526020810184905280820183905260608101869052905132916001917fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989181900360800190a35050505b505b5050505b505050565b60008184841115612a185760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156129dd5781810151838201526020016129c5565b50505050905090810190601f168015612a0a5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6001600160a01b03821660009081526011602052604090205460ff1615158115151415612a4c57600080fd5b6001600160a01b0382166000908152601160205260409020805460ff19168215801591909117909155612af657600860019054906101000a90046001600160a01b03166001600160a01b03166331e79db0836040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050600060405180830381600087803b158015612add57600080fd5b505af1158015612af1573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b6001600160a01b038316612b775760405162461bcd60e51b81526004018080602001828103825260258152602001806135f66025913960400191505060405180910390fd5b6001600160a01b038216612bbc5760405162461bcd60e51b81526004018080602001828103825260238152602001806134fc6023913960400191505060405180910390fd5b612bc7838383612984565b612c0481604051806060016040528060268152602001613567602691396001600160a01b0386166000908152602081905260409020549190612989565b6001600160a01b038085166000908152602081905260408082209390935590841681522054612c3390826122d7565b6001600160a01b038084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b600082612c9c57506000610d23565b82820282848281612ca957fe5b04146123315760405162461bcd60e51b815260040180806020018281038252602181526020018061358d6021913960400191505060405180910390fd5b600061233183836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612fec565b6000612d35826002612ce6565b90506000612d438383612faa565b905047612d4f83613051565b6000612d5b4783612faa565b9050612d6783826131f7565b604080518581526020810183905280820185905290517f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619181900360600190a15050505050565b612db781613051565b6000612e30612e067f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000612faa565b61266a477f0000000000000000000000000000000000000000000000000000000000000000612c8d565b90506000612eab612e817f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000612faa565b61266a477f0000000000000000000000000000000000000000000000000000000000000000612c8d565b90506000612ec383612ebd4785612faa565b90612faa565b600c546040519192506001600160a01b03169082156108fc029083906000818181858888f19350505050158015612efe573d6000803e3d6000fd5b50612f08826132b5565b60085460405160009161010090046001600160a01b03169085908381818185875af1925050503d8060008114612f5a576040519150601f19603f3d011682016040523d82523d6000602084013e612f5f565b606091505b505090508015612171578284867f7f2fcd183017e07ea673097ef02ac5c6a1539469706e3bd548d4ee0f6662bf53856040518082815260200191505060405180910390a45050505050565b600061233183836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612989565b6000818361303b5760405162461bcd60e51b81526020600482018181528351602484015283519092839260449091019190850190808383600083156129dd5781810151838201526020016129c5565b50600083858161304757fe5b0495945050505050565b6040805160028082526060808301845292602083019080368337019050509050308160008151811061307f57fe5b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b1580156130d357600080fd5b505afa1580156130e7573d6000803e3d6000fd5b505050506040513d60208110156130fd57600080fd5b505181518290600190811061310e57fe5b6001600160a01b039283166020918202929092010152600654613134913091168461233c565b60065460405163791ac94760e01b8152600481018481526000602483018190523060648401819052426084850181905260a060448601908152875160a487015287516001600160a01b039097169663791ac947968a968a9594939092909160c40190602080880191028083838b5b838110156131ba5781810151838201526020016131a2565b505050509050019650505050505050600060405180830381600087803b1580156131e357600080fd5b505af1158015612980573d6000803e3d6000fd5b60065461320f9030906001600160a01b03168461233c565b6006546009546040805163f305d71960e01b81523060048201526024810186905260006044820181905260648201526001600160a01b0392831660848201524260a48201529051919092169163f305d71991849160c48082019260609290919082900301818588803b15801561328457600080fd5b505af1158015613298573d6000803e3d6000fd5b50505050506040513d60608110156132af57600080fd5b50505050565b60408051600280825260608083018452926020830190803683375050600654604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c464892506004808301926020929190829003018186803b15801561331957600080fd5b505afa15801561332d573d6000803e3d6000fd5b505050506040513d602081101561334357600080fd5b50518151829060009061335257fe5b60200260200101906001600160a01b031690816001600160a01b031681525050308160018151811061338057fe5b6001600160a01b0392831660209182029290920101526006541663b6f9de95836000847f00000000000000000000000000000000000000000000000000000000000000006133d04261012c6122d7565b6040518663ffffffff1660e01b81526004018085815260200180602001846001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b8381101561343a578181015183820152602001613422565b50505050905001955050505050506000604051808303818588803b15801561346157600080fd5b505af1158015613475573d6000803e3d6000fd5b50505050507f6fd378a9d8b7345c2e5b18229aaf1e39d32b177b501d0a0d26a0a858a23a962482826040518083815260200180602001828103825283818151815260200191508051906020019060200280838360005b838110156134e35781810151838201526020016134cb565b50505050905001935050505060405180910390a1505056fe45524332303a207472616e7366657220746f20746865207a65726f20616464726573734f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e6365536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63654f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657245524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220e8d0d2efc1d4e1047a46699035fc57e96ecb567d5938be7d1fc07d5f0c081aa964736f6c634300060c00336080604052600f80546001600160a01b03191673b111896d4728c60e41b4a77baba935177a54d71b1790553480156200003757600080fd5b5060408051808201825260158082527f54494b495f4469766964656e645f547261636b657200000000000000000000006020808401828152855180870190965292855284015281519192918391839162000094916003916200012d565b508051620000aa9060049060208401906200012d565b50505050506000620000c16200012960201b60201c565b600980546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350610e1060125569021e19e0c9bab2400000601355620001c9565b3390565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200017057805160ff1916838001178555620001a0565b82800160010185558215620001a0579182015b82811115620001a057825182559160200191906001019062000183565b50620001ae929150620001b2565b5090565b5b80821115620001ae5760008155600101620001b3565b61221c80620001d96000396000f3fe6080604052600436106102135760003560e01c8063715018a611610118578063bc4c4b37116100a0578063e7841ec01161006f578063e7841ec014610805578063e98030c71461081a578063f2fde38b14610844578063fbcbc0f114610877578063ffb2c479146108aa57610222565b8063bc4c4b3714610741578063be10b6141461077c578063dd62ed3e14610791578063e30443bc146107cc57610222565b806395d89b41116100e757806395d89b4114610654578063a457c2d714610669578063a8b9d240146106a2578063a9059cbb146106d5578063aafd847a1461070e57610222565b8063715018a6146105c657806385a6b3ae146105db5780638da5cb5b146105f057806391b89fba1461062157610222565b8063313ce5671161019b5780635183d6fd1161016a5780635183d6fd146104ca5780636a4740021461053f5780636d33b42b146105545780636f2789ec1461057e57806370a082311461059357610222565b8063313ce5671461040057806331e79db01461042b578063395093511461045e5780634e7b827f1461049757610222565b806318160ddd116101e257806318160ddd1461032d578063226cfa3d1461034257806323b872dd1461037557806327ce0147146103b85780633009a609146103eb57610222565b806303c833021461022757806306fdde031461022f578063095ea7b3146102b957806309bbedde1461030657610222565b36610222576102206108f2565b005b600080fd5b6102206108f2565b34801561023b57600080fd5b50610244610983565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561027e578181015183820152602001610266565b50505050905090810190601f1680156102ab5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156102c557600080fd5b506102f2600480360360408110156102dc57600080fd5b506001600160a01b038135169060200135610a19565b604080519115158252519081900360200190f35b34801561031257600080fd5b5061031b610a37565b60408051918252519081900360200190f35b34801561033957600080fd5b5061031b610a3d565b34801561034e57600080fd5b5061031b6004803603602081101561036557600080fd5b50356001600160a01b0316610a43565b34801561038157600080fd5b506102f26004803603606081101561039857600080fd5b506001600160a01b03813581169160208101359091169060400135610a55565b3480156103c457600080fd5b5061031b600480360360208110156103db57600080fd5b50356001600160a01b0316610adc565b3480156103f757600080fd5b5061031b610b3b565b34801561040c57600080fd5b50610415610b41565b6040805160ff9092168252519081900360200190f35b34801561043757600080fd5b506102206004803603602081101561044e57600080fd5b50356001600160a01b0316610b46565b34801561046a57600080fd5b506102f26004803603604081101561048157600080fd5b506001600160a01b038135169060200135610ca2565b3480156104a357600080fd5b506102f2600480360360208110156104ba57600080fd5b50356001600160a01b0316610cf0565b3480156104d657600080fd5b506104f4600480360360208110156104ed57600080fd5b5035610d05565b604080516001600160a01b0390991689526020890197909752878701959095526060870193909352608086019190915260a085015260c084015260e083015251908190036101000190f35b34801561054b57600080fd5b50610220610e64565b34801561056057600080fd5b506102206004803603602081101561057757600080fd5b5035610e9b565b34801561058a57600080fd5b5061031b610eb7565b34801561059f57600080fd5b5061031b600480360360208110156105b657600080fd5b50356001600160a01b0316610ebd565b3480156105d257600080fd5b50610220610ed8565b3480156105e757600080fd5b5061031b610f7a565b3480156105fc57600080fd5b50610605610f80565b604080516001600160a01b039092168252519081900360200190f35b34801561062d57600080fd5b5061031b6004803603602081101561064457600080fd5b50356001600160a01b0316610f8f565b34801561066057600080fd5b50610244610f9a565b34801561067557600080fd5b506102f26004803603604081101561068c57600080fd5b506001600160a01b038135169060200135610ffb565b3480156106ae57600080fd5b5061031b600480360360208110156106c557600080fd5b50356001600160a01b0316611063565b3480156106e157600080fd5b506102f2600480360360408110156106f857600080fd5b506001600160a01b03813516906020013561108f565b34801561071a57600080fd5b5061031b6004803603602081101561073157600080fd5b50356001600160a01b03166110a3565b34801561074d57600080fd5b506102f26004803603604081101561076457600080fd5b506001600160a01b03813516906020013515156110be565b34801561078857600080fd5b5061031b611193565b34801561079d57600080fd5b5061031b600480360360408110156107b457600080fd5b506001600160a01b0381358116916020013516611199565b3480156107d857600080fd5b50610220600480360360408110156107ef57600080fd5b506001600160a01b0381351690602001356111c4565b34801561081157600080fd5b5061031b611370565b34801561082657600080fd5b506102206004803603602081101561083d57600080fd5b5035611376565b34801561085057600080fd5b506102206004803603602081101561086757600080fd5b50356001600160a01b0316611492565b34801561088357600080fd5b506104f46004803603602081101561089a57600080fd5b50356001600160a01b031661158b565b3480156108b657600080fd5b506108d4600480360360208110156108cd57600080fd5b50356116fe565b60408051938452602084019290925282820152519081900360600190f35b60006108fc610a3d565b1161090657600080fd5b341561098157610937610917610a3d565b61092534600160801b6117fc565b8161092c57fe5b60055491900461185c565b60055560408051348152905133917fa493a9229478c3fcd73f66d2cdeb7f94fd0f341da924d1054236d78454116511919081900360200190a260085461097d903461185c565b6008555b565b60038054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610a0f5780601f106109e457610100808354040283529160200191610a0f565b820191906000526020600020905b8154815290600101906020018083116109f257829003601f168201915b5050505050905090565b6000610a2d610a266118b6565b84846118ba565b5060015b92915050565b600a5490565b60025490565b60116020526000908152604090205481565b6000610a628484846119a6565b610ad284610a6e6118b6565b610acd856040518060600160405280602881526020016120f9602891396001600160a01b038a16600090815260016020526040812090610aac6118b6565b6001600160a01b0316815260208101919091526040016000205491906119dd565b6118ba565b5060019392505050565b6001600160a01b038116600090815260066020526040812054600160801b90610b2b90610b2690610b20610b1b610b1288610ebd565b600554906117fc565b611a74565b90611a84565b611ab7565b81610b3257fe5b0490505b919050565b600e5481565b601290565b610b4e6118b6565b6009546001600160a01b03908116911614610b9e576040805162461bcd60e51b81526020600482018190526024820152600080516020612121833981519152604482015290519081900360640190fd5b6001600160a01b03811660009081526010602052604090205460ff1615610bc457600080fd5b6001600160a01b0381166000908152601060205260408120805460ff19166001179055610bf2908290611aca565b6040805163131836e760e21b8152600a60048201526001600160a01b03831660248201529051731e4b022c1cf11f3cd6663dee191ac02ac8a0ede391634c60db9c916044808301926000929190829003018186803b158015610c5357600080fd5b505af4158015610c67573d6000803e3d6000fd5b50506040516001600160a01b03841692507fa878b31040b2e6d0a9a3d3361209db3908ba62014b0dca52adbaee451d128b259150600090a250565b6000610a2d610caf6118b6565b84610acd8560016000610cc06118b6565b6001600160a01b03908116825260208083019390935260409182016000908120918c16815292529020549061185c565b60106020526000908152604090205460ff1681565b600080600080600080600080600a731e4b022c1cf11f3cd6663dee191ac02ac8a0ede363deb3d89690916040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015610d6357600080fd5b505af4158015610d77573d6000803e3d6000fd5b505050506040513d6020811015610d8d57600080fd5b50518910610db4575060009650600019955085945086935083925082915081905080610e59565b6000600a731e4b022c1cf11f3cd6663dee191ac02ac8a0ede363d1aa9e7e90918c6040518363ffffffff1660e01b8152600401808381526020018281526020019250505060206040518083038186803b158015610e1057600080fd5b505af4158015610e24573d6000803e3d6000fd5b505050506040513d6020811015610e3a57600080fd5b50519050610e478161158b565b98509850985098509850985098509850505b919395975091939597565b60405162461bcd60e51b81526004018080602001828103825260658152602001806120486065913960800191505060405180910390fd5b600f546001600160a01b03163314610eb257600080fd5b601355565b60125481565b6001600160a01b031660009081526020819052604090205490565b610ee06118b6565b6009546001600160a01b03908116911614610f30576040805162461bcd60e51b81526020600482018190526024820152600080516020612121833981519152604482015290519081900360640190fd5b6009546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600980546001600160a01b0319169055565b60085481565b6009546001600160a01b031690565b6000610a3182611063565b60048054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610a0f5780601f106109e457610100808354040283529160200191610a0f565b6000610a2d6110086118b6565b84610acd856040518060600160405280602581526020016121c260259139600160006110326118b6565b6001600160a01b03908116825260208083019390935260409182016000908120918d168152925290205491906119dd565b6001600160a01b038116600090815260076020526040812054610a319061108984610adc565b90611b23565b6000610a2d61109c6118b6565b84846119a6565b6001600160a01b031660009081526007602052604090205490565b60006110c86118b6565b6009546001600160a01b03908116911614611118576040805162461bcd60e51b81526020600482018190526024820152600080516020612121833981519152604482015290519081900360640190fd5b600061112384611b65565b90508015611189576001600160a01b0384166000818152601160209081526040918290204290558151848152915186151593927fa2c38e2d2fb7e3e1912d937fd1ca11ed6d51864dee4cfa7a7bf02becd7acf09292908290030190a36001915050610a31565b5060009392505050565b60135481565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6111cc6118b6565b6009546001600160a01b0390811691161461121c576040805162461bcd60e51b81526020600482018190526024820152600080516020612121833981519152604482015290519081900360640190fd5b6001600160a01b03821660009081526010602052604090205460ff16156112425761136c565b60135481106112da576112558282611aca565b60408051632f0ad01760e21b8152600a60048201526001600160a01b0384166024820152604481018390529051731e4b022c1cf11f3cd6663dee191ac02ac8a0ede39163bc2b405c916064808301926000929190829003018186803b1580156112bd57600080fd5b505af41580156112d1573d6000803e3d6000fd5b5050505061135f565b6112e5826000611aca565b6040805163131836e760e21b8152600a60048201526001600160a01b03841660248201529051731e4b022c1cf11f3cd6663dee191ac02ac8a0ede391634c60db9c916044808301926000929190829003018186803b15801561134657600080fd5b505af415801561135a573d6000803e3d6000fd5b505050505b61136a8260016110be565b505b5050565b600e5490565b61137e6118b6565b6009546001600160a01b039081169116146113ce576040805162461bcd60e51b81526020600482018190526024820152600080516020612121833981519152604482015290519081900360640190fd5b610e1081101580156113e35750620151808111155b61141e5760405162461bcd60e51b815260040180806020018281038252604a815260200180611ffe604a913960600191505060405180910390fd5b60125481141561145f5760405162461bcd60e51b815260040180806020018281038252603c815260200180612162603c913960400191505060405180910390fd5b60125460405182907f474ea64804364a1e29a4487ddb63c3342a2dd826ccd8acf48825e680a0e6f20f90600090a3601255565b61149a6118b6565b6009546001600160a01b039081169116146114ea576040805162461bcd60e51b81526020600482018190526024820152600080516020612121833981519152604482015290519081900360640190fd5b6001600160a01b03811661152f5760405162461bcd60e51b8152600401808060200182810382526026815260200180611fb66026913960400191505060405180910390fd5b6009546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600980546001600160a01b0319166001600160a01b0392909216919091179055565b600080600080600080600080889750600a731e4b022c1cf11f3cd6663dee191ac02ac8a0ede36317e142d190918a6040518363ffffffff1660e01b815260040180838152602001826001600160a01b031681526020019250505060206040518083038186803b1580156115fd57600080fd5b505af4158015611611573d6000803e3d6000fd5b505050506040513d602081101561162757600080fd5b5051965060001995506000871261168b57600e5487111561165757600e54611650908890611ca6565b955061168b565b600e54600a546000911061166c57600061167b565b600e54600a5461167b91611b23565b90506116878882611a84565b9650505b61169488611063565b945061169f88610adc565b6001600160a01b0389166000908152601160205260409020549094509250826116c95760006116d7565b6012546116d790849061185c565b91504282116116e75760006116f1565b6116f18242611b23565b9050919395975091939597565b600a54600090819081908061171e575050600e54600092508291506117f5565b600e546000805a90506000805b898410801561173957508582105b156117e457600a54600190950194851061175257600094505b6000600a600001868154811061176457fe5b60009182526020808320909101546001600160a01b0316808352601190915260409091205490915061179590611cd8565b156117b1576117a58160016110be565b156117b1576001909101905b60019092019160005a9050808511156117db576117d86117d18683611b23565b879061185c565b95505b935061172b9050565b600e85905590975095509193505050505b9193909250565b60008261180b57506000610a31565b8282028284828161181857fe5b04146118555760405162461bcd60e51b81526004018080602001828103825260218152602001806120d86021913960400191505060405180910390fd5b9392505050565b600082820183811015611855576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b3390565b6001600160a01b0383166118ff5760405162461bcd60e51b815260040180806020018281038252602481526020018061219e6024913960400191505060405180910390fd5b6001600160a01b0382166119445760405162461bcd60e51b8152600401808060200182810382526022815260200180611fdc6022913960400191505060405180910390fd5b6001600160a01b03808416600081815260016020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b60405162461bcd60e51b815260040180806020018281038252602b8152602001806120ad602b913960400191505060405180910390fd5b60008184841115611a6c5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611a31578181015183820152602001611a19565b50505050905090810190601f168015611a5e5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b60008181811215610a3157600080fd5b6000828201818312801590611a995750838112155b80611aae5750600083128015611aae57508381125b61185557600080fd5b600080821215611ac657600080fd5b5090565b6000611ad583610ebd565b905080821115611afd576000611aeb8383611b23565b9050611af78482611cff565b5061136a565b8082101561136a576000611b118284611b23565b9050611b1d8482611d63565b50505050565b600061185583836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506119dd565b600080611b7183611063565b90508015611c9d576001600160a01b038316600090815260076020526040902054611b9c908261185c565b6001600160a01b038416600081815260076020908152604091829020939093558051848152905191927fee503bee2bb6a87e57bc57db795f98137327401a0e7b7ce42e37926cc1a9ca4d92918290030190a26040516000906001600160a01b03851690610bb890849084818181858888f193505050503d8060008114611c3e576040519150601f19603f3d011682016040523d82523d6000602084013e611c43565b606091505b5050905080611c95576001600160a01b038416600090815260076020526040902054611c6f9083611b23565b6001600160a01b0385166000908152600760205260408120919091559250610b36915050565b509050610b36565b50600092915050565b6000818303818312801590611cbb5750838113155b80611aae5750600083128015611aae575083811361185557600080fd5b600042821115611cea57506000610b36565b601254611cf74284611b23565b101592915050565b611d098282611da7565b611d43611d24610b1b836005546117fc90919063ffffffff16565b6001600160a01b03841660009081526006602052604090205490611ca6565b6001600160a01b0390921660009081526006602052604090209190915550565b611d6d8282611e97565b611d43611d88610b1b836005546117fc90919063ffffffff16565b6001600160a01b03841660009081526006602052604090205490611a84565b6001600160a01b038216611e02576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b611e0e6000838361136a565b600254611e1b908261185c565b6002556001600160a01b038216600090815260208190526040902054611e41908261185c565b6001600160a01b0383166000818152602081815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b6001600160a01b038216611edc5760405162461bcd60e51b81526004018080602001828103825260218152602001806121416021913960400191505060405180910390fd5b611ee88260008361136a565b611f2581604051806060016040528060228152602001611f94602291396001600160a01b03851660009081526020819052604090205491906119dd565b6001600160a01b038316600090815260208190526040902055600254611f4b9082611b23565b6002556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a3505056fe45524332303a206275726e20616d6f756e7420657863656564732062616c616e63654f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f206164647265737354494b495f4469766964656e645f547261636b65723a20636c61696d57616974206d757374206265207570646174656420746f206265747765656e203120616e6420323420686f75727354494b495f4469766964656e645f547261636b65723a2077697468647261774469766964656e642064697361626c65642e20557365207468652027636c61696d272066756e6374696f6e206f6e20746865206d61696e2054494b4920636f6e74726163742e54494b495f4469766964656e645f547261636b65723a204e6f207472616e736665727320616c6c6f776564536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63654f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657245524332303a206275726e2066726f6d20746865207a65726f206164647265737354494b495f4469766964656e645f547261636b65723a2043616e6e6f742075706461746520636c61696d5761697420746f2073616d652076616c756545524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220735475d57be169e9af9987dfa86cd027b56b28dac8956249aa0b66d6aadbe03664736f6c634300060c0033
Deployed ByteCode Sourcemap
33951:17724:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34394:59;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;20673:100;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22847:169;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;22847:169:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;34789:34;;;;;;;;;;;;;:::i;42246:136::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42246:136:0;;:::i;:::-;;34032:41;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;34032:41:0;;;;;;;;;;;;;;21796:108;;;;;;;;;;;;;:::i;34892:52::-;;;;;;;;;;;;;:::i;23499:355::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;23499:355:0;;;;;;;;;;;;;;;;;:::i;34300:81::-;;;;;;;;;;;;;:::i;34211:42::-;;;;;;;;;;;;;:::i;43268:141::-;;;;;;;;;;;;;:::i;21637:93::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;34611:38;;;;;;;;;;;;;:::i;24264:218::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;24264:218:0;;;;;;;;:::i;34080:38::-;;;;;;;;;;;;;:::i;35075:41::-;;;;;;;;;;;;;:::i;44767:88::-;;;;;;;;;;;;;:::i;43418:125::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43418:125:0;-1:-1:-1;;;;;43418:125:0;;:::i;41474:104::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41474:104:0;;;;:::i;44999:141::-;;;;;;;;;;;;;:::i;40629:268::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40629:268:0;-1:-1:-1;;;;;40629:268:0;;:::i;43705:130::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43705:130:0;-1:-1:-1;;;;;43705:130:0;;:::i;41587:101::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41587:101:0;;:::i;44499:259::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44499:259:0;;:::i;21968:127::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21968:127:0;-1:-1:-1;;;;;21968:127:0;;:::i;8161:148::-;;;;;;;;;;;;;:::i;42721:288::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42721:288:0;;:::i;34568:36::-;;;;;;;;;;;;;:::i;39809:811::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39809:811:0;-1:-1:-1;;;;;39809:811:0;;:::i;7517:79::-;;;;;;;;;;;;;:::i;20893:104::-;;;;;;;;;;;;;:::i;34745:37::-;;;;;;;;;;;;;:::i;41700:184::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;41700:184:0;;;;;;;;;;:::i;35025:40::-;;;;;;;;;;;;;:::i;43151:108::-;;;;;;;;;;;;;:::i;24986:269::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;24986:269:0;;;;;;;;:::i;43552:147::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43552:147:0;-1:-1:-1;;;;;43552:147:0;;:::i;22309:175::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;22309:175:0;;;;;;;;:::i;35123:35::-;;;;;;;;;;;;;:::i;43844:318::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43844:318:0;-1:-1:-1;;;;;43844:318:0;;:::i;:::-;;;;-1:-1:-1;;;;;43844:318:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35165:40;;;;;;;;;;;;;:::i;36495:58::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36495:58:0;-1:-1:-1;;;;;36495:58:0;;:::i;40906:245::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;40906:245:0;;;;;;;;;;:::i;41160:305::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41160:305:0;-1:-1:-1;41160:305:0;;;;:::i;51501:171::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51501:171:0;;;;:::i;34523:38::-;;;;;;;;;;;;;:::i;34263:30::-;;;;;;;;;;;;;:::i;22548:151::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;22548:151:0;;;;;;;;;;:::i;34460:50::-;;;;;;;;;;;;;:::i;42397:315::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42397:315:0;-1:-1:-1;;;;;42397:315:0;;:::i;44864:126::-;;;;;;;;;;;;;:::i;43018:124::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43018:124:0;;:::i;44168:325::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44168:325:0;;:::i;8465:244::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8465:244:0;-1:-1:-1;;;;;8465:244:0;;:::i;34394:59::-;;;;:::o;20673:100::-;20760:5;20753:12;;;;;;;;-1:-1:-1;;20753:12:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20727:13;;20753:12;;20760:5;;20753:12;;20760:5;20753:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20673:100;:::o;22847:169::-;22930:4;22947:39;22956:12;:10;:12::i;:::-;22970:7;22979:6;22947:8;:39::i;:::-;-1:-1:-1;23004:4:0;22847:169;;;;;:::o;34789:34::-;;;:::o;42246:136::-;7740:12;:10;:12::i;:::-;7730:6;;-1:-1:-1;;;;;7730:6:0;;;:22;;;7722:67;;;;;-1:-1:-1;;;7722:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;7722:67:0;;;;;;;;;;;;;;;42364:6:::1;42355:16;42328:24;:43:::0;42246:136::o;34032:41::-;;;-1:-1:-1;;;;;34032:41:0;;:::o;21796:108::-;21884:12;;21796:108;:::o;34892:52::-;;;:::o;23499:355::-;23639:4;23656:36;23666:6;23674:9;23685:6;23656:9;:36::i;:::-;23703:121;23712:6;23720:12;:10;:12::i;:::-;23734:89;23772:6;23734:89;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;23734:19:0;;;;;;:11;:19;;;;;;23754:12;:10;:12::i;:::-;-1:-1:-1;;;;;23734:33:0;;;;;;;;;;;;-1:-1:-1;23734:33:0;;;:89;:37;:89::i;:::-;23703:8;:121::i;:::-;-1:-1:-1;23842:4:0;23499:355;;;;;:::o;34300:81::-;;;:::o;34211:42::-;;;;;;-1:-1:-1;;;;;34211:42:0;;:::o;43268:141::-;43331:7;43358:15;;;;;;;;;-1:-1:-1;;;;;43358:15:0;-1:-1:-1;;;;;43358:41:0;;:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43358:43:0;;-1:-1:-1;43268:141:0;:::o;21637:93::-;21720:2;21637:93;:::o;34611:38::-;;;:::o;24264:218::-;24352:4;24369:83;24378:12;:10;:12::i;:::-;24392:7;24401:50;24440:10;24401:11;:25;24413:12;:10;:12::i;:::-;-1:-1:-1;;;;;24401:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;24401:25:0;;;:34;;;;;;;;;;;:38;:50::i;34080:38::-;;;:::o;35075:41::-;;;;;;:::o;44767:88::-;44798:15;;:49;;;-1:-1:-1;;;44798:49:0;;44829:10;44798:49;;;;-1:-1:-1;44798:49:0;;;;;;;;:15;;;;-1:-1:-1;;;;;44798:15:0;;:30;;:49;;;;;;;;;;;;;;;;;;:15;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;44767:88:0:o;43418:125::-;-1:-1:-1;;;;;43507:28:0;43483:4;43507:28;;;:19;:28;;;;;;;;;43418:125::o;41474:104::-;7740:12;:10;:12::i;:::-;7730:6;;-1:-1:-1;;;;;7730:6:0;;;:22;;;7722:67;;;;;-1:-1:-1;;;7722:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;7722:67:0;;;;;;;;;;;;;;;41544:15:::1;:23:::0;;;::::1;;;;-1:-1:-1::0;;41544:23:0;;::::1;::::0;;;::::1;::::0;;41474:104::o;44999:141::-;45064:7;45091:15;;;;;;;;;-1:-1:-1;;;;;45091:15:0;-1:-1:-1;;;;;45091:39:0;;:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40629:268;7740:12;:10;:12::i;:::-;7730:6;;-1:-1:-1;;;;;7730:6:0;;;:22;;;7722:67;;;;;-1:-1:-1;;;7722:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;7722:67:0;;;;;;;;;;;;;;;40738:15:::1;::::0;-1:-1:-1;;;;;40716:38:0;;::::1;40738:15:::0;::::1;40716:38;;40708:47;;;::::0;::::1;;40813:15;::::0;40771:59:::1;::::0;-1:-1:-1;;;;;40813:15:0;;::::1;::::0;40771:59;::::1;::::0;::::1;::::0;40813:15:::1;::::0;40771:59:::1;40841:15;:48:::0;;-1:-1:-1;;;;;;40841:48:0::1;-1:-1:-1::0;;;;;40841:48:0;;;::::1;::::0;;;::::1;::::0;;40629:268::o;43705:130::-;43775:7;43796:15;;;;;;;;;-1:-1:-1;;;;;43796:15:0;-1:-1:-1;;;;;43796:25:0;;43822:7;43796:34;;;;;;;;;;;;;-1:-1:-1;;;;;43796:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43796:34:0;;43705:130;-1:-1:-1;;43705:130:0:o;41587:101::-;7740:12;:10;:12::i;:::-;7730:6;;-1:-1:-1;;;;;7730:6:0;;;:22;;;7722:67;;;;;-1:-1:-1;;;7722:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;7722:67:0;;;;;;;;;;;;;;;41657:12:::1;:20:::0;41587:101::o;44499:259::-;44559:18;44579:14;44595:26;44625:15;;;;;;;;;-1:-1:-1;;;;;44625:15:0;-1:-1:-1;;;;;44625:23:0;;44649:3;44625:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44625:28:0;;;;;;;;;;;;44663:87;;;;;;;;;;;;;;;;;44625:28;44663:87;;;;;;;44625:28;;-1:-1:-1;44625:28:0;-1:-1:-1;44625:28:0;;-1:-1:-1;44740:9:0;;44728:5;;44663:87;;;;;;;;;44499:259;;;;:::o;21968:127::-;-1:-1:-1;;;;;22069:18:0;22042:7;22069:18;;;;;;;;;;;;21968:127::o;8161:148::-;7740:12;:10;:12::i;:::-;7730:6;;-1:-1:-1;;;;;7730:6:0;;;:22;;;7722:67;;;;;-1:-1:-1;;;7722:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;7722:67:0;;;;;;;;;;;;;;;8252:6:::1;::::0;8231:40:::1;::::0;8268:1:::1;::::0;-1:-1:-1;;;;;8252:6:0::1;::::0;8231:40:::1;::::0;8268:1;;8231:40:::1;8282:6;:19:::0;;-1:-1:-1;;;;;;8282:19:0::1;::::0;;8161:148::o;42721:288::-;7740:12;:10;:12::i;:::-;7730:6;;-1:-1:-1;;;;;7730:6:0;;;:22;;;7722:67;;;;;-1:-1:-1;;;7722:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;7722:67:0;;;;;;;;;;;;;;;42819:6:::1;42807:8;:18;;:40;;;;;42841:6;42829:8;:18;;42807:40;42799:49;;;::::0;::::1;;42879:16;;42867:8;:28;;42859:37;;;::::0;::::1;;42946:16;::::0;42912:51:::1;::::0;42936:8;;42912:51:::1;::::0;;;::::1;42974:16;:27:::0;42721:288::o;34568:36::-;;;:::o;39809:811::-;7740:12;:10;:12::i;:::-;7730:6;;-1:-1:-1;;;;;7730:6:0;;;:22;;;7722:67;;;;;-1:-1:-1;;;7722:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;7722:67:0;;;;;;;;;;;;;;;39918:15:::1;::::0;-1:-1:-1;;;;;39896:38:0;;::::1;39918:15;::::0;;::::1;;39896:38;;39888:47;;;::::0;::::1;;39949:38;40018:10;39949:81;;40090:4;-1:-1:-1::0;;;;;40052:43:0::1;:18;-1:-1:-1::0;;;;;40052:24:0::1;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;40052:26:0;-1:-1:-1;;;;;40052:43:0::1;;40044:52;;;::::0;::::1;;40110:18;-1:-1:-1::0;;;;;40110:39:0::1;;40158:18;40110:68;;;;;;;;;;;;;-1:-1:-1::0;;;;;40110:68:0::1;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;40189:83:0::1;::::0;;-1:-1:-1;;;40189:83:0;;40229:42:::1;40189:83;::::0;::::1;::::0;;;-1:-1:-1;;;;;40189:39:0;::::1;::::0;-1:-1:-1;40189:39:0::1;::::0;-1:-1:-1;40189:83:0;;;;;-1:-1:-1;;40189:83:0;;;;;;;-1:-1:-1;40189:39:0;:83;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;40283:18;-1:-1:-1::0;;;;;40283:39:0::1;;40323:13;40283:54;;;;;;;;;;;;;-1:-1:-1::0;;;;;40283:54:0::1;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;40354:54:0::1;::::0;;-1:-1:-1;;;40354:54:0;;40402:4:::1;40354:54;::::0;::::1;::::0;;;-1:-1:-1;;;;;40354:39:0;::::1;::::0;-1:-1:-1;40354:39:0::1;::::0;-1:-1:-1;40354:54:0;;;;;-1:-1:-1;;40354:54:0;;;;;;;-1:-1:-1;40354:39:0;:54;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;40467:15:0::1;::::0;40419:65:::1;::::0;;-1:-1:-1;;;40419:65:0;;-1:-1:-1;;;;;40467:15:0;;::::1;40419:65;::::0;::::1;::::0;;;:39;;::::1;::::0;-1:-1:-1;40419:39:0::1;::::0;-1:-1:-1;40419:65:0;;;;;40467:15:::1;::::0;40419:65;;;;;;;;40467:15;40419:39;:65;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;40545:15:0::1;::::0;40503:59:::1;::::0;-1:-1:-1;;;;;40545:15:0::1;::::0;;::::1;::::0;::::1;::::0;-1:-1:-1;40503:59:0;;::::1;::::0;-1:-1:-1;40503:59:0::1;::::0;;;::::1;40576:15;:36:::0;;-1:-1:-1;;;;;40576:36:0;;::::1;;;-1:-1:-1::0;;;;;;40576:36:0;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;39809:811:0:o;7517:79::-;7582:6;;-1:-1:-1;;;;;7582:6:0;7517:79;:::o;20893:104::-;20982:7;20975:14;;;;;;;;-1:-1:-1;;20975:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20949:13;;20975:14;;20982:7;;20975:14;;20982:7;20975:14;;;;;;;;;;;;;;;;;;;;;;;;34745:37;;;:::o;41700:184::-;7740:12;:10;:12::i;:::-;7730:6;;-1:-1:-1;;;;;7730:6:0;;;:22;;;7722:67;;;;;-1:-1:-1;;;7722:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;7722:67:0;;;;;;;;;;;;;;;41807:13:::1;-1:-1:-1::0;;;;;41799:21:0::1;:4;-1:-1:-1::0;;;;;41799:21:0::1;;;41791:30;;;::::0;::::1;;41835:41;41864:4;41870:5;41835:28;:41::i;35025:40::-:0;;;;:::o;43151:108::-;43197:7;43224:15;;;;;;;;;-1:-1:-1;;;;;43224:15:0;-1:-1:-1;;;;;43224:25:0;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24986:269;25079:4;25096:129;25105:12;:10;:12::i;:::-;25119:7;25128:96;25167:15;25128:96;;;;;;;;;;;;;;;;;:11;:25;25140:12;:10;:12::i;:::-;-1:-1:-1;;;;;25128:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;25128:25:0;;;:34;;;;;;;;;;;:96;:38;:96::i;43552:147::-;43621:7;43645:15;;;;;;;;;-1:-1:-1;;;;;43645:15:0;-1:-1:-1;;;;;43645:38:0;;43684:7;43645:47;;;;;;;;;;;;;-1:-1:-1;;;;;43645:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;22309:175;22395:4;22412:42;22422:12;:10;:12::i;:::-;22436:9;22447:6;22412:9;:42::i;35123:35::-;;;;;;;;;:::o;43844:318::-;43940:7;43962:6;43983;44004:7;44026;44048;44070;44092;44119:15;;;;;;;;;-1:-1:-1;;;;;44119:15:0;-1:-1:-1;;;;;44119:26:0;;44146:7;44119:35;;;;;;;;;;;;;-1:-1:-1;;;;;44119:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44119:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44119:35:0;;-1:-1:-1;44119:35:0;;-1:-1:-1;44119:35:0;-1:-1:-1;44119:35:0;-1:-1:-1;44119:35:0;-1:-1:-1;44119:35:0;;-1:-1:-1;44119:35:0;-1:-1:-1;43844:318:0;;;;;;;;;:::o;35165:40::-;;;;:::o;36495:58::-;;;;;;;;;;;;;;;:::o;40906:245::-;7740:12;:10;:12::i;:::-;7730:6;;-1:-1:-1;;;;;7730:6:0;;;:22;;;7722:67;;;;;-1:-1:-1;;;7722:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;7722:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;40999:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;::::1;;:40;;::::0;::::1;;;;40991:49;;;::::0;::::1;;-1:-1:-1::0;;;;;41051:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;;;;:39;;-1:-1:-1;;41051:39:0::1;::::0;::::1;;::::0;;::::1;::::0;;;41109:34;;;;;;;::::1;::::0;;;;;;;;::::1;40906:245:::0;;:::o;41160:305::-;7740:12;:10;:12::i;:::-;7730:6;;-1:-1:-1;;;;;7730:6:0;;;:22;;;7722:67;;;;;-1:-1:-1;;;7722:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;7722:67:0;;;;;;;;;;;;;;;41277:9:::1;41273:115;41292:19:::0;;::::1;41273:115;;;41368:8;41333:19;:32;41353:8;;41362:1;41353:11;;;;;;;;::::0;;::::1;::::0;;;::::1;;-1:-1:-1::0;;;;;41353:11:0::1;41333:32:::0;;-1:-1:-1;41333:32:0;::::1;::::0;;;;;;-1:-1:-1;41333:32:0;:43;;-1:-1:-1;;41333:43:0::1;::::0;::::1;;::::0;;;::::1;::::0;;-1:-1:-1;41313:3:0::1;41273:115;;;;41406:51;41438:8;;41448;41406:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;-1:-1:-1::0;;41406:51:0::1;::::0;;::::1;::::0;;::::1;::::0;-1:-1:-1;41406:51:0;;-1:-1:-1;;;;;41406:51:0::1;41160:305:::0;;;:::o;51501:171::-;7740:12;:10;:12::i;:::-;7730:6;;-1:-1:-1;;;;;7730:6:0;;;:22;;;7722:67;;;;;-1:-1:-1;;;7722:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;7722:67:0;;;;;;;;;;;;;;;51578:21:::1;:32:::0;;;::::1;;-1:-1:-1::0;;51578:32:0;;::::1;::::0;::::1;::::0;;;51626:38:::1;::::0;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;51501:171:::0;:::o;34523:38::-;;;:::o;34263:30::-;;;-1:-1:-1;;;;;34263:30:0;;:::o;22548:151::-;-1:-1:-1;;;;;22664:18:0;;;22637:7;22664:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;22548:151::o;34460:50::-;;;;:::o;42397:315::-;7740:12;:10;:12::i;:::-;7730:6;;-1:-1:-1;;;;;7730:6:0;;;:22;;;7722:67;;;;;-1:-1:-1;;;7722:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;7722:67:0;;;;;;;;;;;;;;;42514:15:::1;::::0;-1:-1:-1;;;;;42492:37:0;;::::1;42514:15:::0;::::1;42492:37;;42484:46;;;::::0;::::1;;42541:41;42557:18;42577:4;42541:15;:41::i;:::-;42641:15;::::0;42598:59:::1;::::0;-1:-1:-1;;;;;42641:15:0;;::::1;::::0;42598:59;::::1;::::0;::::1;::::0;42641:15:::1;::::0;42598:59:::1;42668:15;:36:::0;;-1:-1:-1;;;;;;42668:36:0::1;-1:-1:-1::0;;;;;42668:36:0;;;::::1;::::0;;;::::1;::::0;;42397:315::o;44864:126::-;44919:7;44943:15;;;;;;;;;-1:-1:-1;;;;;44943:15:0;-1:-1:-1;;;;;44943:37:0;;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43018:124;7740:12;:10;:12::i;:::-;7730:6;;-1:-1:-1;;;;;7730:6:0;;;:22;;;7722:67;;;;;-1:-1:-1;;;7722:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;7722:67:0;;;;;;;;;;;;;;;43092:15:::1;;;;;;;;;-1:-1:-1::0;;;;;43092:15:0::1;-1:-1:-1::0;;;;;43092:31:0::1;;43124:9;43092:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;43018:124:::0;:::o;44168:325::-;44269:7;44291:6;44312;44333:7;44355;44377;44399;44421;44445:15;;;;;;;;;-1:-1:-1;;;;;44445:15:0;-1:-1:-1;;;;;44445:33:0;;44479:5;44445:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8465:244;7740:12;:10;:12::i;:::-;7730:6;;-1:-1:-1;;;;;7730:6:0;;;:22;;;7722:67;;;;;-1:-1:-1;;;7722:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;7722:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;8554:22:0;::::1;8546:73;;;;-1:-1:-1::0;;;8546:73:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8656:6;::::0;8635:38:::1;::::0;-1:-1:-1;;;;;8635:38:0;;::::1;::::0;8656:6:::1;::::0;8635:38:::1;::::0;8656:6:::1;::::0;8635:38:::1;8684:6;:17:::0;;-1:-1:-1;;;;;;8684:17:0::1;-1:-1:-1::0;;;;;8684:17:0;;;::::1;::::0;;;::::1;::::0;;8465:244::o;509:182::-;567:7;599:5;;;623:6;;;;615:46;;;;;-1:-1:-1;;;615:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;682:1;509:182;-1:-1:-1;;;509:182:0:o;6665:98::-;6745:10;6665:98;:::o;28182:381::-;-1:-1:-1;;;;;28318:19:0;;28310:68;;;;-1:-1:-1;;;28310:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;28397:21:0;;28389:68;;;;-1:-1:-1;;;28389:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;28471:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;28523:32;;;;;;;;;;;;;;;;;28182:381;;;:::o;45155:3006::-;-1:-1:-1;;;;;45287:18:0;;45279:27;;;;;;-1:-1:-1;;;;;45325:16:0;;45317:25;;;;;;45359:11;45356:92;;45387:28;45403:4;45409:2;45413:1;45387:15;:28::i;:::-;45430:7;;45356:92;45668:8;;;;45667:9;:55;;;;-1:-1:-1;;;;;;45693:29:0;;;;;;:25;:29;;;;;;;;45667:55;:168;;;;-1:-1:-1;45819:15:0;;-1:-1:-1;;;;;45803:32:0;;;45819:15;;45803:32;;45667:168;:273;;;;-1:-1:-1;;;;;;45917:23:0;;;;;;:19;:23;;;;;;;;45916:24;45667:273;45652:685;;;46013:15;;;;;;;46010:249;;;46049:22;46068:2;46049:18;:22::i;:::-;46045:198;;-1:-1:-1;;;;;46101:12:0;;;;;;:8;:12;;;;;;46116:15;-1:-1:-1;46093:73:0;;;;;-1:-1:-1;;;46093:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;46182:12:0;;;;;;:8;:12;;;;;46216:10;46197:15;:30;46182:45;;46045:198;46297:24;;46287:6;:34;;46279:43;;;;;;46344:28;46375:24;46393:4;46375:9;:24::i;:::-;46452:18;;46344:55;;-1:-1:-1;46428:42:0;;;;;;;46501:33;;-1:-1:-1;46526:8:0;;;;46525:9;46501:33;:82;;;;-1:-1:-1;;;;;;46552:31:0;;;;;;:25;:31;;;;;;;;46551:32;46501:82;:122;;;;-1:-1:-1;46608:15:0;;-1:-1:-1;;;;;46600:23:0;;;46608:15;;46600:23;;46501:122;:160;;;;-1:-1:-1;46646:15:0;;-1:-1:-1;;;;;46640:21:0;;;46646:15;;46640:21;;46501:160;46484:510;;;46691:8;:15;;-1:-1:-1;;46691:15:0;46702:4;46691:15;;;:8;46745:53;46788:9;46745:38;:20;46770:12;46745:24;:38::i;:::-;:42;;:53::i;:::-;46724:74;;46813:26;46828:10;46813:14;:26::i;:::-;46857:18;46878:24;46896:4;46878:9;:24::i;:::-;46857:45;;46917:32;46938:10;46917:20;:32::i;:::-;-1:-1:-1;;46966:8:0;:16;;-1:-1:-1;;46966:16:0;;;46484:510;47026:8;;-1:-1:-1;;;;;47136:25:0;;47010:12;47136:25;;;:19;:25;;;;;;47026:8;;;;47025:9;;47136:25;;:52;;-1:-1:-1;;;;;;47165:23:0;;;;;;:19;:23;;;;;;;;47136:52;47133:99;;;-1:-1:-1;47215:5:0;47133:99;47248:7;47245:355;;;47269:12;47284:30;47310:3;47284:21;:6;47295:9;47284:10;:21::i;:30::-;-1:-1:-1;;;;;47376:29:0;;;;;;:25;:29;;;;;;47269:45;;-1:-1:-1;47376:29:0;;47373:116;;;47433:40;47469:3;47433:31;:4;47442:21;47433:8;:31::i;:40::-;47426:47;;47373:116;47512:16;:6;47523:4;47512:10;:16::i;:::-;47503:25;;47546:42;47562:4;47576;47583;47546:15;:42::i;:::-;47245:355;;47613:33;47629:4;47635:2;47639:6;47613:15;:33::i;:::-;47664:15;;;;;-1:-1:-1;;;;;47664:15:0;:26;47699:4;47706:15;47699:4;47706:9;:15::i;:::-;47664:58;;;;;;;;;;;;;-1:-1:-1;;;;;47664:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47660:74;47748:15;;;;;-1:-1:-1;;;;;47748:15:0;:26;47783:2;47788:13;47783:2;47788:9;:13::i;:::-;47748:54;;;;;;;;;;;;;-1:-1:-1;;;;;47748:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47744:70;47831:8;;;;47827:321;;47864:16;;47896:15;;:28;;;-1:-1:-1;;;;;;47896:28:0;;;;;;;;;;:15;;;;-1:-1:-1;;;;;47896:15:0;;:23;;:28;;;;;;;;;;;;;;;-1:-1:-1;47896:15:0;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47896:28:0;;;;;;;;;;;;;;;;47892:245;;;;;48013:86;;;;;;;;;;;;;;;;;;;;;;;;;;48089:9;;48078:4;;48013:86;;;;;;;;;47925:184;;;47892:245;47827:321;;45155:3006;;;;;;;:::o;1415:193::-;1501:7;1537:12;1529:6;;;;1521:29;;;;-1:-1:-1;;;1521:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1573:5:0;;;1415:193::o;41893:341::-;-1:-1:-1;;;;;41984:31:0;;;;;;:25;:31;;;;;;;;:40;;;;;;;41976:49;;;;;;-1:-1:-1;;;;;42036:31:0;;;;;;:25;:31;;;;;:39;;-1:-1:-1;;42036:39:0;;;;;;;;;;;;42089:79;;42114:15;;;;;;;;;-1:-1:-1;;;;;42114:15:0;-1:-1:-1;;;;;42114:36:0;;42151:4;42114:42;;;;;;;;;;;;;-1:-1:-1;;;;;42114:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42089:79;42186:40;;;;;;-1:-1:-1;;;;;42186:40:0;;;;;;;;41893:341;;:::o;25746:575::-;-1:-1:-1;;;;;25886:20:0;;25878:70;;;;-1:-1:-1;;;25878:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;25967:23:0;;25959:71;;;;-1:-1:-1;;;25959:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26044:47;26065:6;26073:9;26084:6;26044:20;:47::i;:::-;26125:71;26147:6;26125:71;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;26125:17:0;;:9;:17;;;;;;;;;;;;:71;:21;:71::i;:::-;-1:-1:-1;;;;;26105:17:0;;;:9;:17;;;;;;;;;;;:91;;;;26230:20;;;;;;;:32;;26255:6;26230:24;:32::i;:::-;-1:-1:-1;;;;;26207:20:0;;;:9;:20;;;;;;;;;;;;:55;;;;26278:35;;;;;;;26207:20;;26278:35;;;;;;;;;;;;;25746:575;;;:::o;1868:473::-;1926:7;2171:6;2167:47;;-1:-1:-1;2201:1:0;2194:8;;2167:47;2239:5;;;2243:1;2239;:5;:1;2263:5;;;;;:10;2255:56;;;;-1:-1:-1;;;2255:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2820:132;2878:7;2905:39;2909:1;2912;2905:39;;;;;;;;;;;;;;;;;:3;:39::i;48754:928::-;48864:12;48879:13;:6;48890:1;48879:10;:13::i;:::-;48864:28;-1:-1:-1;48903:17:0;48923:16;:6;48864:28;48923:10;:16::i;:::-;48903:36;-1:-1:-1;49243:21:0;49310:22;49327:4;49310:16;:22::i;:::-;49464:18;49485:41;:21;49511:14;49485:25;:41::i;:::-;49464:62;;49577:35;49590:9;49601:10;49577:12;:35::i;:::-;49631:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48754:928;;;;;:::o;50837:656::-;50902:24;50919:6;50902:16;:24::i;:::-;50940:17;50960:75;51007:27;:9;51021:12;51007:13;:27::i;:::-;50960:42;50961:21;50988:13;50960:27;:42::i;:75::-;50940:95;-1:-1:-1;51046:15:0;51064:73;51109:27;:9;51123:12;51109:13;:27::i;:::-;51064:40;51065:21;51092:11;51064:27;:40::i;:73::-;51046:91;-1:-1:-1;51148:17:0;51168:51;51209:9;51168:36;51169:21;51046:91;51168:27;:36::i;:::-;:40;;:51::i;:::-;51230:15;;:35;;51148:71;;-1:-1:-1;;;;;;51230:15:0;;:35;;;;;51148:71;;51230:15;:35;:15;:35;51148:71;51230:15;:35;;;;;;;;;;;;;;;;;;;;;51276:25;51293:7;51276:16;:25::i;:::-;51338:15;;51330:51;;51313:12;;51338:15;;;-1:-1:-1;;;;;51338:15:0;;51367:9;;51313:12;51330:51;51313:12;51330:51;51367:9;51338:15;51330:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51312:69;;;51398:7;51395:91;;;51455:7;51444:9;51436:6;51422:52;51464:9;51422:52;;;;;;;;;;;;;;;;;;50837:656;;;;;:::o;975:136::-;1033:7;1060:43;1064:1;1067;1060:43;;;;;;;;;;;;;;;;;:3;:43::i;3449:279::-;3535:7;3570:12;3563:5;3555:28;;;;-1:-1:-1;;;3555:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3594:9;3610:1;3606;:5;;;;;;;3449:279;-1:-1:-1;;;;;3449:279:0:o;49691:600::-;49847:16;;;49861:1;49847:16;;;49823:21;49847:16;;;;;49823:21;49847:16;;;;;;;;;;-1:-1:-1;49847:16:0;49823:40;;49892:4;49874;49879:1;49874:7;;;;;;;;-1:-1:-1;;;;;49874:23:0;;;:7;;;;;;;;;;:23;;;;49918:15;;:22;;;-1:-1:-1;;;49918:22:0;;;;:15;;;;;:20;;:22;;;;;49874:7;;49918:22;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49918:22:0;49908:7;;:4;;49913:1;;49908:7;;;;;;-1:-1:-1;;;;;49908:32:0;;;:7;;;;;;;;;:32;49986:15;;49954:62;;49971:4;;49986:15;50004:11;49954:8;:62::i;:::-;50056:15;;:224;;-1:-1:-1;;;50056:224:0;;;;;;;;:15;:224;;;;;;50234:4;50056:224;;;;;;50254:15;50056:224;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;50056:15:0;;;;:66;;50137:11;;50207:4;;50234;50254:15;50056:224;;;;;;;;;;;;;;;;:15;:224;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50300:528;50483:15;;50451:62;;50468:4;;-1:-1:-1;;;;;50483:15:0;50501:11;50451:8;:62::i;:::-;50557:15;;50761;;50557:260;;;-1:-1:-1;;;50557:260:0;;50629:4;50557:260;;;;;;;;;;:15;:260;;;;;;;;;;-1:-1:-1;;;;;50761:15:0;;;50557:260;;;;50791:15;50557:260;;;;;;:15;;;;;:31;;50596:9;;50557:260;;;;;;;;;;;;;;;50596:9;50557:15;:260;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;50300:528:0:o;48173:572::-;48318:16;;;48332:1;48318:16;;;48294:21;48318:16;;;;;48294:21;48318:16;;;;;;;;-1:-1:-1;;48355:15:0;;:22;;;-1:-1:-1;;;48355:22:0;;;;48294:40;;-1:-1:-1;;;;;;48355:15:0;;;;:20;;-1:-1:-1;48355:22:0;;;;;;;;;;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48355:22:0;48345:7;;:4;;48350:1;;48345:7;;;;;;;;;:32;-1:-1:-1;;;;;48345:32:0;;;-1:-1:-1;;;;;48345:32:0;;;;;48406:4;48388;48393:1;48388:7;;;;;;;;-1:-1:-1;;;;;48388:23:0;;;:7;;;;;;;;;:23;48449:15;;;:66;48523:6;48449:15;48592:4;48611:11;48653:24;:15;48673:3;48653:19;:24::i;:::-;48449:239;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;48449:239:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48707:30;48724:6;48732:4;48707:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48173:572;;:::o
Swarm Source
ipfs://735475d57be169e9af9987dfa86cd027b56b28dac8956249aa0b66d6aadbe036
Age | Block | Fee Address | BC Fee Address | Voting Power | Jailed | Incoming |
---|
Validator ID :
0 FTM
Amount Staked
0
Amount Delegated
0
Staking Total
0
Staking Start Epoch
0
Staking Start Time
0
Proof of Importance
0
Origination Score
0
Validation Score
0
Active
0
Online
0
Downtime
0 s
Address | Amount | claimed Rewards | Created On Epoch | Created On |
---|
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.