Polygon Sponsored slots available. Book your slot here!
Contract Overview
[ Download CSV Export ]
Latest 25 internal transaction
[ Download CSV Export ]
Contract Name:
BabyMatic
Compiler Version
v0.6.2+commit.bacdbe57
Contract Source Code (Solidity)
/** *Submitted for verification at polygonscan.com on 2021-08-05 */ // SPDX-License-Identifier: MIT pragma solidity ^0.6.2; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } pragma solidity ^0.6.2; 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; } } pragma solidity ^0.6.2; 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; } } pragma solidity ^0.6.2; /** * @title SafeMathInt * @dev Math operations for int256 with overflow safety checks. */ library SafeMathInt { int256 private constant MIN_INT256 = int256(1) << 255; int256 private constant MAX_INT256 = ~(int256(1) << 255); /** * @dev Multiplies two int256 variables and fails on overflow. */ function mul(int256 a, int256 b) internal pure returns (int256) { int256 c = a * b; // Detect overflow when multiplying MIN_INT256 with -1 require(c != MIN_INT256 || (a & MIN_INT256) != (b & MIN_INT256)); require((b == 0) || (c / b == a)); return c; } /** * @dev Division of two int256 variables and fails on overflow. */ function div(int256 a, int256 b) internal pure returns (int256) { // Prevent overflow when dividing MIN_INT256 by -1 require(b != -1 || a != MIN_INT256); // Solidity already throws when dividing by 0. return a / b; } /** * @dev Subtracts two int256 variables and fails on overflow. */ function sub(int256 a, int256 b) internal pure returns (int256) { int256 c = a - b; require((b >= 0 && c <= a) || (b < 0 && c > a)); return c; } /** * @dev Adds two int256 variables and fails on overflow. */ function add(int256 a, int256 b) internal pure returns (int256) { int256 c = a + b; require((b >= 0 && c >= a) || (b < 0 && c < a)); return c; } /** * @dev Converts to absolute value, and fails on overflow. */ function abs(int256 a) internal pure returns (int256) { require(a != MIN_INT256); return a < 0 ? -a : a; } function toUint256Safe(int256 a) internal pure returns (uint256) { require(a >= 0); return uint256(a); } } pragma solidity ^0.6.2; /** * @title SafeMathUint * @dev Math operations with safety checks that revert on error */ library SafeMathUint { function toInt256Safe(uint256 a) internal pure returns (int256) { int256 b = int256(a); require(b >= 0); return b; } } pragma solidity ^0.6.2; 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(); } } pragma solidity ^0.6.2; 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; } pragma solidity ^0.6.2; 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; } pragma solidity ^0.6.2; 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); } 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; } pragma solidity ^0.6.2; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ 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); } pragma solidity ^0.6.2; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ 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); } pragma solidity ^0.6.2; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin guidelines: functions revert instead * of returning `false` on failure. This behavior is nonetheless conventional * and does not conflict with the expectations of ERC20 applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ 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 {} } pragma solidity ^0.6.2; /// @title Dividend-Paying Token Interface /// @author Roger Wu (https://github.com/roger-wu) /// @dev An interface for a dividend-paying token contract. interface DividendPayingTokenInterface { /// @notice View the amount of dividend in wei that an address can withdraw. /// @param _owner The address of a token holder. /// @return The amount of dividend in wei that `_owner` can withdraw. function dividendOf(address _owner) external view returns(uint256); /// @notice 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 ); } pragma solidity ^0.6.2; /// @title Dividend-Paying Token Optional Interface /// @author Roger Wu (https://github.com/roger-wu) /// @dev OPTIONAL functions for a dividend-paying token contract. interface DividendPayingTokenOptionalInterface { /// @notice View the amount of dividend in wei that an address can withdraw. /// @param _owner The address of a token holder. /// @return The amount of dividend in wei that `_owner` can withdraw. function withdrawableDividendOf(address _owner) external view returns(uint256); /// @notice View the amount of dividend in wei that an address has withdrawn. /// @param _owner The address of a token holder. /// @return The amount of dividend in wei that `_owner` has withdrawn. function withdrawnDividendOf(address _owner) external view returns(uint256); /// @notice View the amount of dividend in wei that an address has earned in total. /// @dev accumulativeDividendOf(_owner) = withdrawableDividendOf(_owner) + withdrawnDividendOf(_owner) /// @param _owner The address of a token holder. /// @return The amount of dividend in wei that `_owner` has earned in total. function accumulativeDividendOf(address _owner) external view returns(uint256); } pragma solidity ^0.6.2; /// @title Dividend-Paying Token /// @author Roger Wu (https://github.com/roger-wu) /// @dev A mintable ERC20 token that allows anyone to pay and distribute ether /// to token holders as dividends and allows token holders to withdraw their dividends. /// Reference: the source code of PoWH3D: https://etherscan.io/address/0xB3775fB83F7D12A36E0475aBdD1FCA35c091efBe#code contract DividendPayingToken is ERC20, 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); } } } pragma solidity ^0.6.2; contract BabyMatic is ERC20, Ownable { using SafeMath for uint256; IUniswapV2Router02 public uniswapV2Router; address public uniswapV2Pair; bool private swapping; BabyMaticDividendTracker public dividendTracker; uint256 public swapTokensAtAmount = 2000000 * (10**18); uint256 public _maxTxAmount = 1000000000 * (10**18); uint256 public MaticRewardsFee = 7; uint256 public marketingFee = 5; uint256 public liquidityFee = 3; uint256 public totalFees = MaticRewardsFee.add(marketingFee).add(liquidityFee); bool public swapEnabled = true; address payable _marketingWallet; address payable _devWallet; // use by default 300,000 gas to process auto-claiming dividends uint256 public gasForProcessing = 500000; mapping (address => bool) private _isExcludedFromFees; // 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 GasForProcessingUpdated(uint256 indexed newValue, uint256 indexed oldValue); event SwapAndLiquify( uint256 tokensSwapped, uint256 ethReceived, uint256 tokensIntoLiqudity ); event SwapETHForTokens( uint256 amountIn, address[] path ); event SendDividends( uint256 tokensSwapped, uint256 amount ); event ProcessedDividendTracker( uint256 iterations, uint256 claims, uint256 lastProcessedIndex, bool indexed automatic, uint256 gas, address indexed processor ); modifier lockTheSwap { swapping = true; _; swapping = false; } constructor() public ERC20("BabyMatic", "BabyMatic") { _marketingWallet = 0x19A4Fb294452300E2539E3d7690d6CF479B9d4a3; _devWallet = 0x2Be8325759bf513FCC5770100638bbCc932f900a; dividendTracker = new BabyMaticDividendTracker(); IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(0xa5E0829CaCEd8fFDD4De3c43696c57F7D7A678ff); // 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(owner()); dividendTracker.excludeFromDividends(address(_uniswapV2Router)); // exclude from paying fees or having max transaction amount excludeFromFees(owner(), true); excludeFromFees(_marketingWallet, true); excludeFromFees(address(this), true); /* _mint is an internal function in ERC20.sol that is only called here, and CANNOT be called ever again */ _mint(owner(), 100000000000 * (10**18)); } receive() external payable { } function updateDividendTracker(address newAddress) public onlyOwner { require(newAddress != address(dividendTracker), "BabyMatic: The dividend tracker already has that address"); BabyMaticDividendTracker newDividendTracker = BabyMaticDividendTracker(payable(newAddress)); require(newDividendTracker.owner() == address(this), "BabyMatic: The new dividend tracker must be owned by the BabyMatic token contract"); newDividendTracker.excludeFromDividends(address(newDividendTracker)); newDividendTracker.excludeFromDividends(address(this)); newDividendTracker.excludeFromDividends(owner()); newDividendTracker.excludeFromDividends(address(uniswapV2Router)); emit UpdateDividendTracker(newAddress, address(dividendTracker)); dividendTracker = newDividendTracker; } function updateUniswapV2Router(address newAddress) public onlyOwner { require(newAddress != address(uniswapV2Router), "BabyMatic: The router already has that address"); emit UpdateUniswapV2Router(newAddress, address(uniswapV2Router)); uniswapV2Router = IUniswapV2Router02(newAddress); } function excludeFromFees(address account, bool excluded) public onlyOwner { require(_isExcludedFromFees[account] != excluded, "BabyMatic: Account is already the value of 'excluded'"); _isExcludedFromFees[account] = excluded; emit ExcludeFromFees(account, excluded); } function excludeMultipleAccountsFromFees(address[] memory accounts, bool excluded) public onlyOwner { for(uint256 i = 0; i < accounts.length; i++) { _isExcludedFromFees[accounts[i]] = excluded; } emit ExcludeMultipleAccountsFromFees(accounts, excluded); } function setAutomatedMarketMakerPair(address pair, bool value) public onlyOwner { require(pair != uniswapV2Pair, "BabyMatic: The PancakeSwap pair cannot be removed from automatedMarketMakerPairs"); _setAutomatedMarketMakerPair(pair, value); } function _setAutomatedMarketMakerPair(address pair, bool value) private { require(automatedMarketMakerPairs[pair] != value, "BabyMatic: Automated market maker pair is already set to that value"); automatedMarketMakerPairs[pair] = value; if(value) { dividendTracker.excludeFromDividends(pair); } emit SetAutomatedMarketMakerPair(pair, value); } function updateGasForProcessing(uint256 newValue) public onlyOwner { require(newValue >= 200000 && newValue <= 500000, "BabyMatic: gasForProcessing must be between 200,000 and 500,000"); require(newValue != gasForProcessing, "BabyMatic: Cannot update gasForProcessing to same value"); 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 setMarketingWallet(address newWallet) external onlyOwner{ _marketingWallet = payable(newWallet); } function setDevWallet(address newWallet) external onlyOwner{ _devWallet = payable(newWallet); } function setSwapEnabled(bool value) external onlyOwner{ swapEnabled = value; } function _transfer( address from, address to, uint256 amount ) internal override { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); if(amount == 0) { super._transfer(from, to, 0); return; } uint256 contractTokenBalance = balanceOf(address(this)); bool overMinimumTokenBalance = contractTokenBalance >= swapTokensAtAmount; if(swapEnabled && !swapping && from != uniswapV2Pair) { if (overMinimumTokenBalance) { uint256 swapTokens = contractTokenBalance.mul(liquidityFee).div(totalFees); swapAndLiquify(swapTokens); uint256 marketingTokens = contractTokenBalance.mul(marketingFee).div(totalFees); swapAndSendToMarketing(marketingTokens); uint256 sellTokens = balanceOf(address(this)); swapAndSendDividends(sellTokens); } } bool takeFee = true; // 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); 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 swapAndSendToMarketing(uint256 tokens) private lockTheSwap { uint256 initialBalance = address(this).balance; swapTokensForEth(tokens); // how much ETH did we just swap into? uint256 newBalance = address(this).balance.sub(initialBalance); uint256 feeSplit = newBalance.div(2); _marketingWallet.transfer(feeSplit); _devWallet.transfer(feeSplit); } 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 owner(), block.timestamp ); } function swapAndLiquify(uint256 tokens) private lockTheSwap{ // split the contract balance into halves uint256 half = tokens.div(2); uint256 otherHalf = tokens.sub(half); 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 swapAndSendDividends(uint256 tokens) private lockTheSwap{ swapTokensForEth(tokens); uint256 dividends = address(this).balance; (bool success,) = address(dividendTracker).call{value: dividends}(""); if(success) { emit SendDividends(tokens, dividends); } } } contract BabyMaticDividendTracker is DividendPayingToken, Ownable { using SafeMath for uint256; using SafeMathInt for int256; using IterableMapping for IterableMapping.Map; IterableMapping.Map private tokenHoldersMap; uint256 public lastProcessedIndex; mapping (address => bool) public excludedFromDividends; mapping (address => uint256) public lastClaimTimes; uint256 public claimWait; uint256 public minimumTokenBalanceForDividends; event ExcludeFromDividends(address indexed account); event ClaimWaitUpdated(uint256 indexed newValue, uint256 indexed oldValue); event Claim(address indexed account, uint256 amount, bool indexed automatic); constructor() public DividendPayingToken("BabyMatic_Dividend_Tracker", "BabyMatic_Dividend_Tracker") { claimWait = 3600; minimumTokenBalanceForDividends = 100000 * (10**18); //must hold 100000 tokens } function _transfer(address, address, uint256) internal override { require(false, "BabyMatic_Dividend_Tracker: No transfers allowed"); } function withdrawDividend() public override { require(false, "BabyMatic_Dividend_Tracker: withdrawDividend disabled. Use the 'claim' function on the main BabyMatic 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, "BabyMatic_Dividend_Tracker: claimWait must be updated to between 1 and 24 hours"); require(newClaimWait != claimWait, "BabyMatic_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":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"iterations","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"claims","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lastProcessedIndex","type":"uint256"},{"indexed":true,"internalType":"bool","name":"automatic","type":"bool"},{"indexed":false,"internalType":"uint256","name":"gas","type":"uint256"},{"indexed":true,"internalType":"address","name":"processor","type":"address"}],"name":"ProcessedDividendTracker","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"SendDividends","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pair","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"SetAutomatedMarketMakerPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":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":"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":"MaticRewardsFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxTxAmount","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":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"dividendTokenBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dividendTracker","outputs":[{"internalType":"contract BabyMaticDividendTracker","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":"marketingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"gas","type":"uint256"}],"name":"processDividendTracker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newWallet","type":"address"}],"name":"setDevWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newWallet","type":"address"}],"name":"setMarketingWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"setSwapEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapTokensAtAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"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":"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
60806040526a01a784379d99db420000006009556b033b2e3c9fd0803ce8000000600a556007600b556005600c556003600d556200006b600d5462000057600c54600b546200060860201b620025011790919060201c565b6200060860201b620025011790919060201c565b600e55600f805460ff191660011790556207a1206011553480156200008f57600080fd5b50604080518082018252600980825268426162794d6174696360b81b602080840182815285518087019096529285528401528151919291620000d49160039162000a04565b508051620000ea90600490602084019062000a04565b5050506000620000ff6200066a60201b60201c565b600580546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600f80547419a4fb294452300e2539e3d7690d6cf479b9d4a300610100600160a81b0319909116179055601080546001600160a01b031916732be8325759bf513fcc5770100638bbcc932f900a179055604051620001ab9062000a89565b604051809103906000f080158015620001c8573d6000803e3d6000fd5b50600860006101000a8154816001600160a01b0302191690836001600160a01b03160217905550600073a5e0829caced8ffdd4de3c43696c57f7d7a678ff90506000816001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b1580156200024457600080fd5b505afa15801562000259573d6000803e3d6000fd5b505050506040513d60208110156200027057600080fd5b5051604080516315ab88c960e31b815290516001600160a01b039283169263c9c653969230929187169163ad5c464891600480820192602092909190829003018186803b158015620002c157600080fd5b505afa158015620002d6573d6000803e3d6000fd5b505050506040513d6020811015620002ed57600080fd5b5051604080516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301525160448083019260209291908290030181600087803b1580156200034057600080fd5b505af115801562000355573d6000803e3d6000fd5b505050506040513d60208110156200036c57600080fd5b5051600680546001600160a01b038086166001600160a01b03199283161790925560078054928416929091169190911790559050620003b68160016001600160e01b036200066f16565b6008546040805163031e79db60e41b81526001600160a01b0390921660048301819052905190916331e79db091602480830192600092919082900301818387803b1580156200040457600080fd5b505af115801562000419573d6000803e3d6000fd5b50506008546040805163031e79db60e41b815230600482015290516001600160a01b0390921693506331e79db0925060248082019260009290919082900301818387803b1580156200046a57600080fd5b505af11580156200047f573d6000803e3d6000fd5b50506008546001600160a01b031691506331e79db09050620004a96001600160e01b03620007a216565b6040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050600060405180830381600087803b158015620004f257600080fd5b505af115801562000507573d6000803e3d6000fd5b50506008546040805163031e79db60e41b81526001600160a01b03878116600483015291519190921693506331e79db09250602480830192600092919082900301818387803b1580156200055a57600080fd5b505af11580156200056f573d6000803e3d6000fd5b505050506200059862000587620007a260201b60201c565b60016001600160e01b03620007b116565b600f54620005b69061010090046001600160a01b03166001620007b1565b620005cc3060016001600160e01b03620007b116565b62000600620005e36001600160e01b03620007a216565b6c01431e0fae6d7217caa00000006001600160e01b03620008e716565b505062000ab4565b60008282018381101562000663576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b335b90565b6001600160a01b03821660009081526013602052604090205460ff1615158115151415620006cf5760405162461bcd60e51b8152600401808060200182810382526043815260200180620060b96043913960600191505060405180910390fd5b6001600160a01b0382166000908152601360205260409020805460ff1916821580159190911790915562000766576008546040805163031e79db60e41b81526001600160a01b038581166004830152915191909216916331e79db091602480830192600092919082900301818387803b1580156200074c57600080fd5b505af115801562000761573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b6005546001600160a01b031690565b620007c46001600160e01b036200066a16565b6005546001600160a01b0390811691161462000827576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001600160a01b03821660009081526012602052604090205460ff1615158115151415620008875760405162461bcd60e51b8152600401808060200182810382526035815260200180620060fc6035913960400191505060405180910390fd5b6001600160a01b038216600081815260126020908152604091829020805460ff1916851515908117909155825190815291517f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df79281900390910190a25050565b6001600160a01b03821662000943576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b6200095a600083836001600160e01b03620009ff16565b62000976816002546200060860201b620025011790919060201c565b6002556001600160a01b03821660009081526020818152604090912054620009a99183906200250162000608821b17901c565b6001600160a01b0383166000818152602081815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1062000a4757805160ff191683800117855562000a77565b8280016001018555821562000a77579182015b8281111562000a7757825182559160200191906001019062000a5a565b5062000a8592915062000a97565b5090565b6124498062003c7083390190565b6200066c91905b8082111562000a85576000815560010162000a9e565b6131ac8062000ac46000396000f3fe60806040526004361061028c5760003560e01c8063715018a61161015a578063a9059cbb116100c1578063e01af92c1161007a578063e01af92c14610a32578063e2f4560514610a5e578063e7841ec014610a73578063e98030c714610a88578063f27fd25414610ab2578063f2fde38b14610adc57610293565b8063a9059cbb14610820578063ad56c13c14610859578063b62496f5146108d7578063c02466681461090a578063c492f04614610945578063dd62ed3e146109f757610293565b806398118cb41161011357806398118cb41461073a5780639a7a23d61461074f5780639c1b8af51461078a578063a26579ad1461079f578063a457c2d7146107b4578063a8b9d240146107ed57610293565b8063715018a6146106895780637d1db4a51461069e578063871c128d146106b357806388bdd9be146106dd5780638da5cb5b1461071057806395d89b411461072557610293565b806339509351116101fe57806365b8dbc0116101b757806365b8dbc01461059c5780636843cd84146105cf5780636b67c4df146106025780636ddd171314610617578063700bb1911461062c57806370a082311461065657610293565b806339509351146104be57806349bd5a5e146104f75780634e71d92d1461050c5780634fbee193146105215780635d098b381461055457806364b0f6531461058757610293565b806318160ddd1161025057806318160ddd146103dc5780631f53ac02146103f157806323b872dd146104265780632c1f52161461046957806330bb4cff1461047e578063313ce5671461049357610293565b806306fdde0314610298578063095ea7b31461032257806313114a9d1461036f5780631694505e146103965780631810f811146103c757610293565b3661029357005b600080fd5b3480156102a457600080fd5b506102ad610b0f565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102e75781810151838201526020016102cf565b50505050905090810190601f1680156103145780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561032e57600080fd5b5061035b6004803603604081101561034557600080fd5b506001600160a01b038135169060200135610ba5565b604080519115158252519081900360200190f35b34801561037b57600080fd5b50610384610bc3565b60408051918252519081900360200190f35b3480156103a257600080fd5b506103ab610bc9565b604080516001600160a01b039092168252519081900360200190f35b3480156103d357600080fd5b50610384610bd8565b3480156103e857600080fd5b50610384610bde565b3480156103fd57600080fd5b506104246004803603602081101561041457600080fd5b50356001600160a01b0316610be4565b005b34801561043257600080fd5b5061035b6004803603606081101561044957600080fd5b506001600160a01b03813581169160208101359091169060400135610c5e565b34801561047557600080fd5b506103ab610ceb565b34801561048a57600080fd5b50610384610cfa565b34801561049f57600080fd5b506104a8610d70565b6040805160ff9092168252519081900360200190f35b3480156104ca57600080fd5b5061035b600480360360408110156104e157600080fd5b506001600160a01b038135169060200135610d75565b34801561050357600080fd5b506103ab610dc9565b34801561051857600080fd5b50610424610dd8565b34801561052d57600080fd5b5061035b6004803603602081101561054457600080fd5b50356001600160a01b0316610e5d565b34801561056057600080fd5b506104246004803603602081101561057757600080fd5b50356001600160a01b0316610e7b565b34801561059357600080fd5b50610384610efb565b3480156105a857600080fd5b50610424600480360360208110156105bf57600080fd5b50356001600160a01b0316610f40565b3480156105db57600080fd5b50610384600480360360208110156105f257600080fd5b50356001600160a01b0316611042565b34801561060e57600080fd5b506103846110c5565b34801561062357600080fd5b5061035b6110cb565b34801561063857600080fd5b506104246004803603602081101561064f57600080fd5b50356110d4565b34801561066257600080fd5b506103846004803603602081101561067957600080fd5b50356001600160a01b03166111bb565b34801561069557600080fd5b506104246111d6565b3480156106aa57600080fd5b50610384611278565b3480156106bf57600080fd5b50610424600480360360208110156106d657600080fd5b503561127e565b3480156106e957600080fd5b506104246004803603602081101561070057600080fd5b50356001600160a01b031661139b565b34801561071c57600080fd5b506103ab6116f4565b34801561073157600080fd5b506102ad611703565b34801561074657600080fd5b50610384611764565b34801561075b57600080fd5b506104246004803603604081101561077257600080fd5b506001600160a01b038135169060200135151561176a565b34801561079657600080fd5b50610384611819565b3480156107ab57600080fd5b5061038461181f565b3480156107c057600080fd5b5061035b600480360360408110156107d757600080fd5b506001600160a01b038135169060200135611864565b3480156107f957600080fd5b506103846004803603602081101561081057600080fd5b50356001600160a01b03166118d2565b34801561082c57600080fd5b5061035b6004803603604081101561084357600080fd5b506001600160a01b038135169060200135611923565b34801561086557600080fd5b5061088c6004803603602081101561087c57600080fd5b50356001600160a01b0316611937565b604080516001600160a01b0390991689526020890197909752878701959095526060870193909352608086019190915260a085015260c084015260e083015251908190036101000190f35b3480156108e357600080fd5b5061035b600480360360208110156108fa57600080fd5b50356001600160a01b0316611a20565b34801561091657600080fd5b506104246004803603604081101561092d57600080fd5b506001600160a01b0381351690602001351515611a35565b34801561095157600080fd5b506104246004803603604081101561096857600080fd5b81019060208101813564010000000081111561098357600080fd5b82018360208201111561099557600080fd5b803590602001918460208302840111640100000000831117156109b757600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295505050503515159050611b4b565b348015610a0357600080fd5b5061038460048036036040811015610a1a57600080fd5b506001600160a01b0381358116916020013516611c80565b348015610a3e57600080fd5b5061042460048036036020811015610a5557600080fd5b50351515611cab565b348015610a6a57600080fd5b50610384611d16565b348015610a7f57600080fd5b50610384611d1c565b348015610a9457600080fd5b5061042460048036036020811015610aab57600080fd5b5035611d61565b348015610abe57600080fd5b5061088c60048036036020811015610ad557600080fd5b5035611e21565b348015610ae857600080fd5b5061042460048036036020811015610aff57600080fd5b50356001600160a01b0316611e87565b60038054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610b9b5780601f10610b7057610100808354040283529160200191610b9b565b820191906000526020600020905b815481529060010190602001808311610b7e57829003601f168201915b5050505050905090565b6000610bb9610bb2611f80565b8484611f84565b5060015b92915050565b600e5481565b6006546001600160a01b031681565b600b5481565b60025490565b610bec611f80565b6005546001600160a01b03908116911614610c3c576040805162461bcd60e51b8152602060048201819052602482015260008051602061304f833981519152604482015290519081900360640190fd5b601080546001600160a01b0319166001600160a01b0392909216919091179055565b6000610c6b848484612070565b610ce184610c77611f80565b610cdc85604051806060016040528060288152602001613027602891396001600160a01b038a16600090815260016020526040812090610cb5611f80565b6001600160a01b03168152602081019190915260400160002054919063ffffffff61246a16565b611f84565b5060019392505050565b6008546001600160a01b031681565b600854604080516342d359d760e11b815290516000926001600160a01b0316916385a6b3ae916004808301926020929190829003018186803b158015610d3f57600080fd5b505afa158015610d53573d6000803e3d6000fd5b505050506040513d6020811015610d6957600080fd5b5051905090565b601290565b6000610bb9610d82611f80565b84610cdc8560016000610d93611f80565b6001600160a01b03908116825260208083019390935260409182016000908120918c16815292529020549063ffffffff61250116565b6007546001600160a01b031681565b6008546040805163bc4c4b3760e01b815233600482015260006024820181905291516001600160a01b039093169263bc4c4b3792604480840193602093929083900390910190829087803b158015610e2f57600080fd5b505af1158015610e43573d6000803e3d6000fd5b505050506040513d6020811015610e5957600080fd5b5050565b6001600160a01b031660009081526012602052604090205460ff1690565b610e83611f80565b6005546001600160a01b03908116911614610ed3576040805162461bcd60e51b8152602060048201819052602482015260008051602061304f833981519152604482015290519081900360640190fd5b600f80546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b600854604080516304ddf6ef60e11b815290516000926001600160a01b0316916309bbedde916004808301926020929190829003018186803b158015610d3f57600080fd5b610f48611f80565b6005546001600160a01b03908116911614610f98576040805162461bcd60e51b8152602060048201819052602482015260008051602061304f833981519152604482015290519081900360640190fd5b6006546001600160a01b0382811691161415610fe55760405162461bcd60e51b815260040180806020018281038252602e8152602001806130a6602e913960400191505060405180910390fd5b6006546040516001600160a01b03918216918316907f8fc842bbd331dfa973645f4ed48b11683d501ebf1352708d77a5da2ab49a576e90600090a3600680546001600160a01b0319166001600160a01b0392909216919091179055565b600854604080516370a0823160e01b81526001600160a01b038481166004830152915160009392909216916370a0823191602480820192602092909190829003018186803b15801561109357600080fd5b505afa1580156110a7573d6000803e3d6000fd5b505050506040513d60208110156110bd57600080fd5b505192915050565b600c5481565b600f5460ff1681565b600854604080516001624d3b8760e01b03198152600481018490529051600092839283926001600160a01b039092169163ffb2c4799160248082019260609290919082900301818787803b15801561112b57600080fd5b505af115801561113f573d6000803e3d6000fd5b505050506040513d606081101561115557600080fd5b5080516020808301516040938401518451848152928301829052828501819052606083018990529351929650945091925032916000917fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989181900360800190a350505050565b6001600160a01b031660009081526020819052604090205490565b6111de611f80565b6005546001600160a01b0390811691161461122e576040805162461bcd60e51b8152602060048201819052602482015260008051602061304f833981519152604482015290519081900360640190fd5b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b600a5481565b611286611f80565b6005546001600160a01b039081169116146112d6576040805162461bcd60e51b8152602060048201819052602482015260008051602061304f833981519152604482015290519081900360640190fd5b62030d4081101580156112ec57506207a1208111155b6113275760405162461bcd60e51b815260040180806020018281038252603f815260200180612eee603f913960400191505060405180910390fd5b6011548114156113685760405162461bcd60e51b815260040180806020018281038252603781526020018061306f6037913960400191505060405180910390fd5b60115460405182907f40d7e40e79af4e8e5a9b3c57030d8ea93f13d669c06d448c4d631d4ae7d23db790600090a3601155565b6113a3611f80565b6005546001600160a01b039081169116146113f3576040805162461bcd60e51b8152602060048201819052602482015260008051602061304f833981519152604482015290519081900360640190fd5b6008546001600160a01b03828116911614156114405760405162461bcd60e51b8152600401808060200182810382526038815260200180612fce6038913960400191505060405180910390fd5b6000819050306001600160a01b0316816001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561148857600080fd5b505afa15801561149c573d6000803e3d6000fd5b505050506040513d60208110156114b257600080fd5b50516001600160a01b0316146114f95760405162461bcd60e51b8152600401808060200182810382526051815260200180612f7d6051913960600191505060405180910390fd5b6040805163031e79db60e41b81526001600160a01b0383166004820181905291516331e79db09160248082019260009290919082900301818387803b15801561154157600080fd5b505af1158015611555573d6000803e3d6000fd5b50506040805163031e79db60e41b815230600482015290516001600160a01b03851693506331e79db09250602480830192600092919082900301818387803b1580156115a057600080fd5b505af11580156115b4573d6000803e3d6000fd5b50505050806001600160a01b03166331e79db06115cf6116f4565b6040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050600060405180830381600087803b15801561161757600080fd5b505af115801561162b573d6000803e3d6000fd5b50506006546040805163031e79db60e41b81526001600160a01b039283166004820152905191851693506331e79db0925060248082019260009290919082900301818387803b15801561167d57600080fd5b505af1158015611691573d6000803e3d6000fd5b50506008546040516001600160a01b03918216935090851691507f90c7d74461c613da5efa97d90740869367d74ab3aa5837aa4ae9a975f954b7a890600090a3600880546001600160a01b0319166001600160a01b039290921691909117905550565b6005546001600160a01b031690565b60048054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610b9b5780601f10610b7057610100808354040283529160200191610b9b565b600d5481565b611772611f80565b6005546001600160a01b039081169116146117c2576040805162461bcd60e51b8152602060048201819052602482015260008051602061304f833981519152604482015290519081900360640190fd5b6007546001600160a01b038381169116141561180f5760405162461bcd60e51b8152600401808060200182810382526050815260200180612f2d6050913960600191505060405180910390fd5b610e598282612562565b60115481565b60085460408051631bc9e27b60e21b815290516000926001600160a01b031691636f2789ec916004808301926020929190829003018186803b158015610d3f57600080fd5b6000610bb9611871611f80565b84610cdc85604051806060016040528060258152602001613152602591396001600061189b611f80565b6001600160a01b03908116825260208083019390935260409182016000908120918d1681529252902054919063ffffffff61246a16565b600854604080516302a2e74960e61b81526001600160a01b0384811660048301529151600093929092169163a8b9d24091602480820192602092909190829003018186803b15801561109357600080fd5b6000610bb9611930611f80565b8484612070565b600080600080600080600080600860009054906101000a90046001600160a01b03166001600160a01b031663fbcbc0f18a6040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b031681526020019150506101006040518083038186803b1580156119af57600080fd5b505afa1580156119c3573d6000803e3d6000fd5b505050506040513d6101008110156119da57600080fd5b508051602082015160408301516060840151608085015160a086015160c087015160e090970151959e50939c50919a509850965094509092509050919395975091939597565b60136020526000908152604090205460ff1681565b611a3d611f80565b6005546001600160a01b03908116911614611a8d576040805162461bcd60e51b8152602060048201819052602482015260008051602061304f833981519152604482015290519081900360640190fd5b6001600160a01b03821660009081526012602052604090205460ff1615158115151415611aeb5760405162461bcd60e51b81526004018080602001828103825260358152602001806130d46035913960400191505060405180910390fd5b6001600160a01b038216600081815260126020908152604091829020805460ff1916851515908117909155825190815291517f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df79281900390910190a25050565b611b53611f80565b6005546001600160a01b03908116911614611ba3576040805162461bcd60e51b8152602060048201819052602482015260008051602061304f833981519152604482015290519081900360640190fd5b60005b8251811015611bfa578160126000858481518110611bc057fe5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff1916911515919091179055600101611ba6565b507f7fdaf542373fa84f4ee8d662c642f44e4c2276a217d7d29e548b6eb29a233b358282604051808060200183151515158152602001828103825284818151815260200191508051906020019060200280838360005b83811015611c68578181015183820152602001611c50565b50505050905001935050505060405180910390a15050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b611cb3611f80565b6005546001600160a01b03908116911614611d03576040805162461bcd60e51b8152602060048201819052602482015260008051602061304f833981519152604482015290519081900360640190fd5b600f805460ff1916911515919091179055565b60095481565b6008546040805163039e107b60e61b815290516000926001600160a01b03169163e7841ec0916004808301926020929190829003018186803b158015610d3f57600080fd5b611d69611f80565b6005546001600160a01b03908116911614611db9576040805162461bcd60e51b8152602060048201819052602482015260008051602061304f833981519152604482015290519081900360640190fd5b6008546040805163e98030c760e01b81526004810184905290516001600160a01b039092169163e98030c79160248082019260009290919082900301818387803b158015611e0657600080fd5b505af1158015611e1a573d6000803e3d6000fd5b5050505050565b600080600080600080600080600860009054906101000a90046001600160a01b03166001600160a01b0316635183d6fd8a6040518263ffffffff1660e01b8152600401808281526020019150506101006040518083038186803b1580156119af57600080fd5b611e8f611f80565b6005546001600160a01b03908116911614611edf576040805162461bcd60e51b8152602060048201819052602482015260008051602061304f833981519152604482015290519081900360640190fd5b6001600160a01b038116611f245760405162461bcd60e51b8152600401808060200182810382526026815260200180612e806026913960400191505060405180910390fd5b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b3390565b6001600160a01b038316611fc95760405162461bcd60e51b815260040180806020018281038252602481526020018061312e6024913960400191505060405180910390fd5b6001600160a01b03821661200e5760405162461bcd60e51b8152600401808060200182810382526022815260200180612ea66022913960400191505060405180910390fd5b6001600160a01b03808416600081815260016020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6001600160a01b0383166120b55760405162461bcd60e51b81526004018080602001828103825260258152602001806131096025913960400191505060405180910390fd5b6001600160a01b0382166120fa5760405162461bcd60e51b8152600401808060200182810382526023815260200180612e1a6023913960400191505060405180910390fd5b806121105761210b83836000612690565b612465565b600061211b306111bb565b600954600f549192508210159060ff1680156121415750600754600160a01b900460ff16155b801561215b57506007546001600160a01b03868116911614155b156121dc5780156121dc57600061218f600e54612183600d54866127f790919063ffffffff16565b9063ffffffff61285016565b905061219a81612892565b60006121b7600e54612183600c54876127f790919063ffffffff16565b90506121c28161294a565b60006121cd306111bb565b90506121d881612a1d565b5050505b6001600160a01b03851660009081526012602052604090205460019060ff168061221e57506001600160a01b03851660009081526012602052604090205460ff165b15612227575060005b801561226a5760006122496064612183600e54886127f790919063ffffffff16565b905061225b858263ffffffff612ae716565b9450612268873083612690565b505b612275868686612690565b6008546001600160a01b031663e30443bc87612290816111bb565b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050600060405180830381600087803b1580156122df57600080fd5b505af19250505080156122f0575060015b506008546001600160a01b031663e30443bc8661230c816111bb565b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050600060405180830381600087803b15801561235b57600080fd5b505af192505050801561236c575060015b50600754600160a01b900460ff1661246157601154600854604080516001624d3b8760e01b031981526004810184905290516001600160a01b039092169163ffb2c479916024808201926060929091908290030181600087803b1580156123d257600080fd5b505af192505050801561240657506040513d60608110156123f257600080fd5b508051602082015160409092015190919060015b61240f5761245f565b604080518481526020810184905280820183905260608101869052905132916001917fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989181900360800190a35050505b505b5050505b505050565b600081848411156124f95760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156124be5781810151838201526020016124a6565b50505050905090810190601f1680156124eb5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b60008282018381101561255b576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b6001600160a01b03821660009081526013602052604090205460ff16151581151514156125c05760405162461bcd60e51b8152600401808060200182810382526043815260200180612e3d6043913960600191505060405180910390fd5b6001600160a01b0382166000908152601360205260409020805460ff19168215801591909117909155612654576008546040805163031e79db60e41b81526001600160a01b038581166004830152915191909216916331e79db091602480830192600092919082900301818387803b15801561263b57600080fd5b505af115801561264f573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b6001600160a01b0383166126d55760405162461bcd60e51b81526004018080602001828103825260258152602001806131096025913960400191505060405180910390fd5b6001600160a01b03821661271a5760405162461bcd60e51b8152600401808060200182810382526023815260200180612e1a6023913960400191505060405180910390fd5b612725838383612465565b61276881604051806060016040528060268152602001612ec8602691396001600160a01b038616600090815260208190526040902054919063ffffffff61246a16565b6001600160a01b03808516600090815260208190526040808220939093559084168152205461279d908263ffffffff61250116565b6001600160a01b038084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b60008261280657506000610bbd565b8282028284828161281357fe5b041461255b5760405162461bcd60e51b81526004018080602001828103825260218152602001806130066021913960400191505060405180910390fd5b600061255b83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612b29565b6007805460ff60a01b1916600160a01b17905560006128b882600263ffffffff61285016565b905060006128cc838363ffffffff612ae716565b9050476128d883612b8e565b60006128ea478363ffffffff612ae716565b90506128f68382612d34565b604080518581526020810183905280820185905290517f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619181900360600190a150506007805460ff60a01b19169055505050565b6007805460ff60a01b1916600160a01b1790554761296782612b8e565b6000612979478363ffffffff612ae716565b9050600061298e82600263ffffffff61285016565b600f5460405191925061010090046001600160a01b0316906108fc8315029083906000818181858888f193505050501580156129ce573d6000803e3d6000fd5b506010546040516001600160a01b039091169082156108fc029083906000818181858888f19350505050158015612a09573d6000803e3d6000fd5b50506007805460ff60a01b19169055505050565b6007805460ff60a01b1916600160a01b179055612a3981612b8e565b60085460405147916000916001600160a01b039091169083908381818185875af1925050503d8060008114612a8a576040519150601f19603f3d011682016040523d82523d6000602084013e612a8f565b606091505b505090508015612ad557604080518481526020810184905281517f80195cc573b02cc48460cbca6e6e4cc85ddb91959d946e1c3025ea3d87942dc3929181900390910190a15b50506007805460ff60a01b1916905550565b600061255b83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061246a565b60008183612b785760405162461bcd60e51b81526020600482018181528351602484015283519092839260449091019190850190808383600083156124be5781810151838201526020016124a6565b506000838581612b8457fe5b0495945050505050565b60408051600280825260608083018452926020830190803883390190505090503081600081518110612bbc57fe5b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b158015612c1057600080fd5b505afa158015612c24573d6000803e3d6000fd5b505050506040513d6020811015612c3a57600080fd5b5051815182906001908110612c4b57fe5b6001600160a01b039283166020918202929092010152600654612c719130911684611f84565b60065460405163791ac94760e01b8152600481018481526000602483018190523060648401819052426084850181905260a060448601908152875160a487015287516001600160a01b039097169663791ac947968a968a9594939092909160c40190602080880191028083838b5b83811015612cf7578181015183820152602001612cdf565b505050509050019650505050505050600060405180830381600087803b158015612d2057600080fd5b505af1158015612461573d6000803e3d6000fd5b600654612d4c9030906001600160a01b031684611f84565b6006546001600160a01b031663f305d719823085600080612d6b6116f4565b426040518863ffffffff1660e01b815260040180876001600160a01b03166001600160a01b03168152602001868152602001858152602001848152602001836001600160a01b03166001600160a01b0316815260200182815260200196505050505050506060604051808303818588803b158015612de857600080fd5b505af1158015612dfc573d6000803e3d6000fd5b50505050506040513d6060811015612e1357600080fd5b5050505056fe45524332303a207472616e7366657220746f20746865207a65726f2061646472657373426162794d617469633a204175746f6d61746564206d61726b6574206d616b6572207061697220697320616c72656164792073657420746f20746861742076616c75654f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e6365426162794d617469633a20676173466f7250726f63657373696e67206d757374206265206265747765656e203230302c30303020616e64203530302c303030426162794d617469633a205468652050616e63616b655377617020706169722063616e6e6f742062652072656d6f7665642066726f6d206175746f6d617465644d61726b65744d616b65725061697273426162794d617469633a20546865206e6577206469766964656e6420747261636b6572206d757374206265206f776e65642062792074686520426162794d6174696320746f6b656e20636f6e7472616374426162794d617469633a20546865206469766964656e6420747261636b657220616c72656164792068617320746861742061646472657373536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63654f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572426162794d617469633a2043616e6e6f742075706461746520676173466f7250726f63657373696e6720746f2073616d652076616c7565426162794d617469633a2054686520726f7574657220616c72656164792068617320746861742061646472657373426162794d617469633a204163636f756e7420697320616c7265616479207468652076616c7565206f6620276578636c756465642745524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa264697066735822122011390b019a80a0bfdfadf2a7e48b4a441d85267f7118305ea8adff3cb5a1f98864736f6c6343000602003360806040523480156200001157600080fd5b50604080518082018252601a8082527f426162794d617469635f4469766964656e645f547261636b6572000000000000602080840182815285518087019096529285528401528151919291839183916200006e9160039162000108565b5080516200008490600490602084019062000108565b505050505060006200009b6200010360201b60201c565b600980546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350610e1060115569152d02c7e14af6800000601255620001aa565b335b90565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200014b57805160ff19168380011785556200017b565b828001600101855582156200017b579182015b828111156200017b5782518255916020019190600101906200015e565b50620001899291506200018d565b5090565b6200010591905b8082111562000189576000815560010162000194565b61228f80620001ba6000396000f3fe6080604052600436106102085760003560e01c8063715018a611610118578063bc4c4b37116100a0578063e7841ec01161006f578063e7841ec0146107d0578063e98030c7146107e5578063f2fde38b1461080f578063fbcbc0f114610842578063ffb2c4791461087557610217565b8063bc4c4b371461070c578063be10b61414610747578063dd62ed3e1461075c578063e30443bc1461079757610217565b806395d89b41116100e757806395d89b411461061f578063a457c2d714610634578063a8b9d2401461066d578063a9059cbb146106a0578063aafd847a146106d957610217565b8063715018a61461059157806385a6b3ae146105a65780638da5cb5b146105bb57806391b89fba146105ec57610217565b80633009a6091161019b5780634e7b827f1161016a5780634e7b827f1461048c5780635183d6fd146104bf5780636a474002146105345780636f2789ec1461054957806370a082311461055e57610217565b80633009a609146103e0578063313ce567146103f557806331e79db014610420578063395093511461045357610217565b806318160ddd116101d757806318160ddd14610322578063226cfa3d1461033757806323b872dd1461036a57806327ce0147146103ad57610217565b806303c833021461021c57806306fdde0314610224578063095ea7b3146102ae57806309bbedde146102fb57610217565b36610217576102156108bd565b005b600080fd5b6102156108bd565b34801561023057600080fd5b50610239610960565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561027357818101518382015260200161025b565b50505050905090810190601f1680156102a05780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156102ba57600080fd5b506102e7600480360360408110156102d157600080fd5b506001600160a01b0381351690602001356109f6565b604080519115158252519081900360200190f35b34801561030757600080fd5b50610310610a14565b60408051918252519081900360200190f35b34801561032e57600080fd5b50610310610a1a565b34801561034357600080fd5b506103106004803603602081101561035a57600080fd5b50356001600160a01b0316610a20565b34801561037657600080fd5b506102e76004803603606081101561038d57600080fd5b506001600160a01b03813581169160208101359091169060400135610a32565b3480156103b957600080fd5b50610310600480360360208110156103d057600080fd5b50356001600160a01b0316610abf565b3480156103ec57600080fd5b50610310610b2a565b34801561040157600080fd5b5061040a610b30565b6040805160ff9092168252519081900360200190f35b34801561042c57600080fd5b506102156004803603602081101561044357600080fd5b50356001600160a01b0316610b35565b34801561045f57600080fd5b506102e76004803603604081101561047657600080fd5b506001600160a01b038135169060200135610c91565b34801561049857600080fd5b506102e7600480360360208110156104af57600080fd5b50356001600160a01b0316610ce5565b3480156104cb57600080fd5b506104e9600480360360208110156104e257600080fd5b5035610cfa565b604080516001600160a01b0390991689526020890197909752878701959095526060870193909352608086019190915260a085015260c084015260e083015251908190036101000190f35b34801561054057600080fd5b50610215610e59565b34801561055557600080fd5b50610310610e90565b34801561056a57600080fd5b506103106004803603602081101561058157600080fd5b50356001600160a01b0316610e96565b34801561059d57600080fd5b50610215610eb1565b3480156105b257600080fd5b50610310610f53565b3480156105c757600080fd5b506105d0610f59565b604080516001600160a01b039092168252519081900360200190f35b3480156105f857600080fd5b506103106004803603602081101561060f57600080fd5b50356001600160a01b0316610f68565b34801561062b57600080fd5b50610239610f73565b34801561064057600080fd5b506102e76004803603604081101561065757600080fd5b506001600160a01b038135169060200135610fd4565b34801561067957600080fd5b506103106004803603602081101561069057600080fd5b50356001600160a01b0316611042565b3480156106ac57600080fd5b506102e7600480360360408110156106c357600080fd5b506001600160a01b038135169060200135611074565b3480156106e557600080fd5b50610310600480360360208110156106fc57600080fd5b50356001600160a01b0316611088565b34801561071857600080fd5b506102e76004803603604081101561072f57600080fd5b506001600160a01b03813516906020013515156110a3565b34801561075357600080fd5b50610310611178565b34801561076857600080fd5b506103106004803603604081101561077f57600080fd5b506001600160a01b038135811691602001351661117e565b3480156107a357600080fd5b50610215600480360360408110156107ba57600080fd5b506001600160a01b0381351690602001356111a9565b3480156107dc57600080fd5b50610310611355565b3480156107f157600080fd5b506102156004803603602081101561080857600080fd5b503561135b565b34801561081b57600080fd5b506102156004803603602081101561083257600080fd5b50356001600160a01b0316611477565b34801561084e57600080fd5b506104e96004803603602081101561086557600080fd5b50356001600160a01b0316611570565b34801561088157600080fd5b5061089f6004803603602081101561089857600080fd5b503561170a565b60408051938452602084019290925282820152519081900360600190f35b60006108c7610a1a565b116108d157600080fd5b341561095e5761090e6108e2610a1a565b6108f634600160801b63ffffffff61181416565b816108fd57fe5b60055491900463ffffffff61187416565b60055560408051348152905133917fa493a9229478c3fcd73f66d2cdeb7f94fd0f341da924d1054236d78454116511919081900360200190a260085461095a903463ffffffff61187416565b6008555b565b60038054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156109ec5780601f106109c1576101008083540402835291602001916109ec565b820191906000526020600020905b8154815290600101906020018083116109cf57829003601f168201915b5050505050905090565b6000610a0a610a036118ce565b84846118d2565b5060015b92915050565b600a5490565b60025490565b60106020526000908152604090205481565b6000610a3f8484846119be565b610ab584610a4b6118ce565b610ab0856040518060600160405280602881526020016121a8602891396001600160a01b038a16600090815260016020526040812090610a896118ce565b6001600160a01b03168152602081019190915260400160002054919063ffffffff6119f516565b6118d2565b5060019392505050565b6001600160a01b038116600090815260066020526040812054600160801b90610b1a90610b1590610b09610b04610af588610e96565b6005549063ffffffff61181416565b611a8c565b9063ffffffff611a9c16565b611acf565b81610b2157fe5b0490505b919050565b600e5481565b601290565b610b3d6118ce565b6009546001600160a01b03908116911614610b8d576040805162461bcd60e51b815260206004820181905260248201526000805160206121d0833981519152604482015290519081900360640190fd5b6001600160a01b0381166000908152600f602052604090205460ff1615610bb357600080fd5b6001600160a01b0381166000908152600f60205260408120805460ff19166001179055610be1908290611ae2565b6040805163131836e760e21b8152600a60048201526001600160a01b038316602482015290517315d4da365795546f47eb04876ec0760e1ff4400d91634c60db9c916044808301926000929190829003018186803b158015610c4257600080fd5b505af4158015610c56573d6000803e3d6000fd5b50506040516001600160a01b03841692507fa878b31040b2e6d0a9a3d3361209db3908ba62014b0dca52adbaee451d128b259150600090a250565b6000610a0a610c9e6118ce565b84610ab08560016000610caf6118ce565b6001600160a01b03908116825260208083019390935260409182016000908120918c16815292529020549063ffffffff61187416565b600f6020526000908152604090205460ff1681565b600080600080600080600080600a7315d4da365795546f47eb04876ec0760e1ff4400d63deb3d89690916040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015610d5857600080fd5b505af4158015610d6c573d6000803e3d6000fd5b505050506040513d6020811015610d8257600080fd5b50518910610da9575060009650600019955085945086935083925082915081905080610e4e565b6000600a7315d4da365795546f47eb04876ec0760e1ff4400d63d1aa9e7e90918c6040518363ffffffff1660e01b8152600401808381526020018281526020019250505060206040518083038186803b158015610e0557600080fd5b505af4158015610e19573d6000803e3d6000fd5b505050506040513d6020811015610e2f57600080fd5b50519050610e3c81611570565b98509850985098509850985098509850505b919395975091939597565b60405162461bcd60e51b815260040180806020018281038252606f815260200180612118606f913960800191505060405180910390fd5b60115481565b6001600160a01b031660009081526020819052604090205490565b610eb96118ce565b6009546001600160a01b03908116911614610f09576040805162461bcd60e51b815260206004820181905260248201526000805160206121d0833981519152604482015290519081900360640190fd5b6009546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600980546001600160a01b0319169055565b60085481565b6009546001600160a01b031690565b6000610a0e82611042565b60048054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156109ec5780601f106109c1576101008083540402835291602001916109ec565b6000610a0a610fe16118ce565b84610ab085604051806060016040528060258152602001612235602591396001600061100b6118ce565b6001600160a01b03908116825260208083019390935260409182016000908120918d1681529252902054919063ffffffff6119f516565b6001600160a01b038116600090815260076020526040812054610a0e9061106884610abf565b9063ffffffff611b4716565b6000610a0a6110816118ce565b84846119be565b6001600160a01b031660009081526007602052604090205490565b60006110ad6118ce565b6009546001600160a01b039081169116146110fd576040805162461bcd60e51b815260206004820181905260248201526000805160206121d0833981519152604482015290519081900360640190fd5b600061110884611b89565b9050801561116e576001600160a01b0384166000818152601060209081526040918290204290558151848152915186151593927fa2c38e2d2fb7e3e1912d937fd1ca11ed6d51864dee4cfa7a7bf02becd7acf09292908290030190a36001915050610a0e565b5060009392505050565b60125481565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6111b16118ce565b6009546001600160a01b03908116911614611201576040805162461bcd60e51b815260206004820181905260248201526000805160206121d0833981519152604482015290519081900360640190fd5b6001600160a01b0382166000908152600f602052604090205460ff161561122757611351565b60125481106112bf5761123a8282611ae2565b60408051632f0ad01760e21b8152600a60048201526001600160a01b03841660248201526044810183905290517315d4da365795546f47eb04876ec0760e1ff4400d9163bc2b405c916064808301926000929190829003018186803b1580156112a257600080fd5b505af41580156112b6573d6000803e3d6000fd5b50505050611344565b6112ca826000611ae2565b6040805163131836e760e21b8152600a60048201526001600160a01b038416602482015290517315d4da365795546f47eb04876ec0760e1ff4400d91634c60db9c916044808301926000929190829003018186803b15801561132b57600080fd5b505af415801561133f573d6000803e3d6000fd5b505050505b61134f8260016110a3565b505b5050565b600e5490565b6113636118ce565b6009546001600160a01b039081169116146113b3576040805162461bcd60e51b815260206004820181905260248201526000805160206121d0833981519152604482015290519081900360640190fd5b610e1081101580156113c85750620151808111155b6114035760405162461bcd60e51b815260040180806020018281038252604f815260200180612058604f913960600191505060405180910390fd5b6011548114156114445760405162461bcd60e51b81526004018080602001828103825260418152602001806120d76041913960600191505060405180910390fd5b60115460405182907f474ea64804364a1e29a4487ddb63c3342a2dd826ccd8acf48825e680a0e6f20f90600090a3601155565b61147f6118ce565b6009546001600160a01b039081169116146114cf576040805162461bcd60e51b815260206004820181905260248201526000805160206121d0833981519152604482015290519081900360640190fd5b6001600160a01b0381166115145760405162461bcd60e51b81526004018080602001828103825260268152602001806120106026913960400191505060405180910390fd5b6009546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600980546001600160a01b0319166001600160a01b0392909216919091179055565b600080600080600080600080889750600a7315d4da365795546f47eb04876ec0760e1ff4400d6317e142d190918a6040518363ffffffff1660e01b815260040180838152602001826001600160a01b03166001600160a01b031681526020019250505060206040518083038186803b1580156115eb57600080fd5b505af41580156115ff573d6000803e3d6000fd5b505050506040513d602081101561161557600080fd5b5051965060001995506000871261168b57600e5487111561164b57600e5461164490889063ffffffff611cd616565b955061168b565b600e54600a5460009110611660576000611675565b600e54600a546116759163ffffffff611b4716565b9050611687888263ffffffff611a9c16565b9650505b61169488611042565b945061169f88610abf565b6001600160a01b0389166000908152601060205260409020549094509250826116c95760006116dd565b6011546116dd90849063ffffffff61187416565b91504282116116ed5760006116fd565b6116fd824263ffffffff611b4716565b9050919395975091939597565b600a54600090819081908061172a575050600e546000925082915061180d565b600e546000805a90506000805b898410801561174557508582105b156117fc57600a54600190950194851061175e57600094505b6000600a600001868154811061177057fe5b60009182526020808320909101546001600160a01b031680835260109091526040909120549091506117a190611d08565b156117bd576117b18160016110a3565b156117bd576001909101905b60019092019160005a9050808511156117f3576117f06117e3868363ffffffff611b4716565b879063ffffffff61187416565b95505b93506117379050565b600e85905590975095509193505050505b9193909250565b60008261182357506000610a0e565b8282028284828161183057fe5b041461186d5760405162461bcd60e51b81526004018080602001828103825260218152602001806121876021913960400191505060405180910390fd5b9392505050565b60008282018381101561186d576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b3390565b6001600160a01b0383166119175760405162461bcd60e51b81526004018080602001828103825260248152602001806122116024913960400191505060405180910390fd5b6001600160a01b03821661195c5760405162461bcd60e51b81526004018080602001828103825260228152602001806120366022913960400191505060405180910390fd5b6001600160a01b03808416600081815260016020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b60405162461bcd60e51b81526004018080602001828103825260308152602001806120a76030913960400191505060405180910390fd5b60008184841115611a845760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611a49578181015183820152602001611a31565b50505050905090810190601f168015611a765780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b60008181811215610a0e57600080fd5b6000828201818312801590611ab15750838112155b80611ac65750600083128015611ac657508381125b61186d57600080fd5b600080821215611ade57600080fd5b5090565b6000611aed83610e96565b905080821115611b1b576000611b09838363ffffffff611b4716565b9050611b158482611d35565b5061134f565b8082101561134f576000611b35828463ffffffff611b4716565b9050611b418482611d9f565b50505050565b600061186d83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506119f5565b600080611b9583611042565b90508015611ccd576001600160a01b038316600090815260076020526040902054611bc6908263ffffffff61187416565b6001600160a01b038416600081815260076020908152604091829020939093558051848152905191927fee503bee2bb6a87e57bc57db795f98137327401a0e7b7ce42e37926cc1a9ca4d92918290030190a26040516000906001600160a01b03851690610bb890849084818181858888f193505050503d8060008114611c68576040519150601f19603f3d011682016040523d82523d6000602084013e611c6d565b606091505b5050905080611cc5576001600160a01b038416600090815260076020526040902054611c9f908363ffffffff611b4716565b6001600160a01b0385166000908152600760205260408120919091559250610b25915050565b509050610b25565b50600092915050565b6000818303818312801590611ceb5750838113155b80611ac65750600083128015611ac6575083811361186d57600080fd5b600042821115611d1a57506000610b25565b601154611d2d428463ffffffff611b4716565b101592915050565b611d3f8282611de9565b611d7f611d5a610b048360055461181490919063ffffffff16565b6001600160a01b0384166000908152600660205260409020549063ffffffff611cd616565b6001600160a01b0390921660009081526006602052604090209190915550565b611da98282611ee5565b611d7f611dc4610b048360055461181490919063ffffffff16565b6001600160a01b0384166000908152600660205260409020549063ffffffff611a9c16565b6001600160a01b038216611e44576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b611e506000838361134f565b600254611e63908263ffffffff61187416565b6002556001600160a01b038216600090815260208190526040902054611e8f908263ffffffff61187416565b6001600160a01b0383166000818152602081815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b6001600160a01b038216611f2a5760405162461bcd60e51b81526004018080602001828103825260218152602001806121f06021913960400191505060405180910390fd5b611f368260008361134f565b611f7981604051806060016040528060228152602001611fee602291396001600160a01b038516600090815260208190526040902054919063ffffffff6119f516565b6001600160a01b038316600090815260208190526040902055600254611fa5908263ffffffff611b4716565b6002556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a3505056fe45524332303a206275726e20616d6f756e7420657863656564732062616c616e63654f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f2061646472657373426162794d617469635f4469766964656e645f547261636b65723a20636c61696d57616974206d757374206265207570646174656420746f206265747765656e203120616e6420323420686f757273426162794d617469635f4469766964656e645f547261636b65723a204e6f207472616e736665727320616c6c6f776564426162794d617469635f4469766964656e645f547261636b65723a2043616e6e6f742075706461746520636c61696d5761697420746f2073616d652076616c7565426162794d617469635f4469766964656e645f547261636b65723a2077697468647261774469766964656e642064697361626c65642e20557365207468652027636c61696d272066756e6374696f6e206f6e20746865206d61696e20426162794d6174696320636f6e74726163742e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63654f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657245524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220926f6a179604998e37de30c79bf23d009f5f240db1735d7ea7d094ef15546a3464736f6c63430006020033426162794d617469633a204175746f6d61746564206d61726b6574206d616b6572207061697220697320616c72656164792073657420746f20746861742076616c7565426162794d617469633a204163636f756e7420697320616c7265616479207468652076616c7565206f6620276578636c7564656427
Deployed ByteCode Sourcemap
44914:14018:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24717:100;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24717:100:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8::-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;24717:100:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26884:169;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26884:169:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;26884:169:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;45420:79;;8:9:-1;5:2;;;30:1;27;20:12;5:2;45420:79:0;;;:::i;:::-;;;;;;;;;;;;;;;;44994:41;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44994:41:0;;;:::i;:::-;;;;-1:-1:-1;;;;;44994:41:0;;;;;;;;;;;;;;45300:35;;8:9:-1;5:2;;;30:1;27;20:12;5:2;45300:35:0;;;:::i;25837:108::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25837:108:0;;;:::i;53967:109::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;53967:109:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;53967:109:0;-1:-1:-1;;;;;53967:109:0;;:::i;:::-;;27535:355;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27535:355:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;27535:355:0;;;;;;;;;;;;;;;;;:::i;45115:47::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;45115:47:0;;;:::i;51907:141::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;51907:141:0;;;:::i;25679:93::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25679:93:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;28299:218;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28299:218:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;28299:218:0;;;;;;;;:::i;45042:28::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;45042:28:0;;;:::i;53443:94::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;53443:94:0;;;:::i;52057:125::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;52057:125:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;52057:125:0;-1:-1:-1;;;;;52057:125:0;;:::i;53834:121::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;53834:121:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;53834:121:0;-1:-1:-1;;;;;53834:121:0;;:::i;53684:141::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;53684:141:0;;;:::i;49581:318::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;49581:318:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;49581:318:0;-1:-1:-1;;;;;49581:318:0;;:::i;52351:139::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;52351:139:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;52351:139:0;-1:-1:-1;;;;;52351:139:0;;:::i;45342:32::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;45342:32:0;;;:::i;45509:30::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;45509:30:0;;;:::i;53163:271::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;53163:271:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;53163:271:0;;:::i;26008:127::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26008:127:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;26008:127:0;-1:-1:-1;;;;;26008:127:0;;:::i;2115:148::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2115:148:0;;;:::i;45239:51::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;45239:51:0;;;:::i;51234:414::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;51234:414:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;51234:414:0;;:::i;48712:860::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;48712:860:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;48712:860:0;-1:-1:-1;;;;;48712:860:0;;:::i;1473:79::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1473:79:0;;;:::i;24936:104::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24936:104:0;;;:::i;45381:32::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;45381:32:0;;;:::i;50534:268::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;50534:268:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;50534:268:0;;;;;;;;;;:::i;45697:40::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;45697:40:0;;;:::i;51790:108::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;51790:108:0;;;:::i;29020:269::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29020:269:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;29020:269:0;;;;;;;;:::i;52191:151::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;52191:151:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;52191:151:0;-1:-1:-1;;;;;52191:151:0;;:::i;26348:175::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26348:175:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;26348:175:0;;;;;;;;:::i;52499:318::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;52499:318:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;52499:318:0;-1:-1:-1;;;;;52499:318:0;;:::i;:::-;;;;-1:-1:-1;;;;;52499:318:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45959:58;;8:9:-1;5:2;;;30:1;27;20:12;5:2;45959:58:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;45959:58:0;-1:-1:-1;;;;;45959:58:0;;:::i;49908:302::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;49908:302:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;49908:302:0;;;;;;;;;;:::i;50219:303::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;50219:303:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;50219:303:0;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;50219:303:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;50219:303:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;50219:303:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;50219:303:0;;-1:-1:-1;;;;50219:303:0;;;;-1:-1:-1;50219:303:0;:::i;26586:151::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26586:151:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;26586:151:0;;;;;;;;;;:::i;54085:92::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;54085:92:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;54085:92:0;;;;:::i;45172:54::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;45172:54:0;;;:::i;53546:129::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;53546:129:0;;;:::i;51657:124::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;51657:124:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;51657:124:0;;:::i;52826:328::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;52826:328:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;52826:328:0;;:::i;2418:244::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2418:244:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;2418:244:0;-1:-1:-1;;;;;2418:244:0;;:::i;24717:100::-;24804:5;24797:12;;;;;;;;-1:-1:-1;;24797:12:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24771:13;;24797:12;;24804:5;;24797:12;;24804:5;24797:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24717:100;:::o;26884:169::-;26967:4;26984:39;26993:12;:10;:12::i;:::-;27007:7;27016:6;26984:8;:39::i;:::-;-1:-1:-1;27041:4:0;26884:169;;;;;:::o;45420:79::-;;;;:::o;44994:41::-;;;-1:-1:-1;;;;;44994:41:0;;:::o;45300:35::-;;;;:::o;25837:108::-;25925:12;;25837:108;:::o;53967:109::-;1695:12;:10;:12::i;:::-;1685:6;;-1:-1:-1;;;;;1685:6:0;;;:22;;;1677:67;;;;;-1:-1:-1;;;1677:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1677:67:0;;;;;;;;;;;;;;;54037:10:::1;:31:::0;;-1:-1:-1;;;;;;54037:31:0::1;-1:-1:-1::0;;;;;54037:31:0;;;::::1;::::0;;;::::1;::::0;;53967:109::o;27535:355::-;27675:4;27692:36;27702:6;27710:9;27721:6;27692:9;:36::i;:::-;27739:121;27748:6;27756:12;:10;:12::i;:::-;27770:89;27808:6;27770:89;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;27770:19:0;;;;;;:11;:19;;;;;;27790:12;:10;:12::i;:::-;-1:-1:-1;;;;;27770:33:0;;;;;;;;;;;;-1:-1:-1;27770:33:0;;;:89;;:37;:89;:::i;:::-;27739:8;:121::i;:::-;-1:-1:-1;27878:4:0;27535:355;;;;;:::o;45115:47::-;;;-1:-1:-1;;;;;45115:47:0;;:::o;51907:141::-;51997:15;;:43;;;-1:-1:-1;;;51997:43:0;;;;51970:7;;-1:-1:-1;;;;;51997:15:0;;:41;;:43;;;;;;;;;;;;;;:15;:43;;;5:2:-1;;;;30:1;27;20:12;5:2;51997:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;51997:43:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;51997:43:0;;-1:-1:-1;51907:141:0;:::o;25679:93::-;25762:2;25679:93;:::o;28299:218::-;28387:4;28404:83;28413:12;:10;:12::i;:::-;28427:7;28436:50;28475:10;28436:11;:25;28448:12;:10;:12::i;:::-;-1:-1:-1;;;;;28436:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;28436:25:0;;;:34;;;;;;;;;;;:50;:38;:50;:::i;45042:28::-;;;-1:-1:-1;;;;;45042:28:0;;:::o;53443:94::-;53480:15;;:49;;;-1:-1:-1;;;53480:49:0;;53511:10;53480:49;;;;:15;:49;;;;;;;;-1:-1:-1;;;;;53480:15:0;;;;:30;;:49;;;;;;;;;;;;;;;;;;:15;:49;;;5:2:-1;;;;30:1;27;20:12;5:2;53480:49:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;53480:49:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;53443:94:0:o;52057:125::-;-1:-1:-1;;;;;52146:28:0;52122:4;52146:28;;;:19;:28;;;;;;;;;52057:125::o;53834:121::-;1695:12;:10;:12::i;:::-;1685:6;;-1:-1:-1;;;;;1685:6:0;;;:22;;;1677:67;;;;;-1:-1:-1;;;1677:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1677:67:0;;;;;;;;;;;;;;;53910:16:::1;:37:::0;;-1:-1:-1;;;;;53910:37:0;;::::1;;;-1:-1:-1::0;;;;;;53910:37:0;;::::1;::::0;;;::::1;::::0;;53834:121::o;53684:141::-;53776:15;;:41;;;-1:-1:-1;;;53776:41:0;;;;53749:7;;-1:-1:-1;;;;;53776:15:0;;:39;;:41;;;;;;;;;;;;;;:15;:41;;;5:2:-1;;;;30:1;27;20:12;49581:318:0;1695:12;:10;:12::i;:::-;1685:6;;-1:-1:-1;;;;;1685:6:0;;;:22;;;1677:67;;;;;-1:-1:-1;;;1677:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1677:67:0;;;;;;;;;;;;;;;49690:15:::1;::::0;-1:-1:-1;;;;;49668:38:0;;::::1;49690:15:::0;::::1;49668:38;;49660:97;;;;-1:-1:-1::0;;;49660:97:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49815:15;::::0;49773:59:::1;::::0;-1:-1:-1;;;;;49815:15:0;;::::1;::::0;49773:59;::::1;::::0;::::1;::::0;49815:15:::1;::::0;49773:59:::1;49843:15;:48:::0;;-1:-1:-1;;;;;;49843:48:0::1;-1:-1:-1::0;;;;;49843:48:0;;;::::1;::::0;;;::::1;::::0;;49581:318::o;52351:139::-;52448:15;;:34;;;-1:-1:-1;;;52448:34:0;;-1:-1:-1;;;;;52448:34:0;;;;;;;;;52421:7;;52448:15;;;;;:25;;:34;;;;;;;;;;;;;;;:15;:34;;;5:2:-1;;;;30:1;27;20:12;5:2;52448:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;52448:34:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;52448:34:0;;52351:139;-1:-1:-1;;52351:139:0:o;45342:32::-;;;;:::o;45509:30::-;;;;;;:::o;53163:271::-;53295:15;;:28;;;-1:-1:-1;;;;;;53295:28:0;;;;;;;;;;53229:18;;;;;;-1:-1:-1;;;;;53295:15:0;;;;:23;;:28;;;;;;;;;;;;;;;53229:18;53295:15;:28;;;5:2:-1;;;;30:1;27;20:12;5:2;53295:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;53295:28:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;53295:28:0;;;;;;;;;;;;53339:87;;;;;;;;;;;;;;;;;53295:28;53339:87;;;;;;;53295:28;;-1:-1:-1;53295:28:0;-1:-1:-1;53295:28:0;;-1:-1:-1;53416:9:0;;53404:5;;53339:87;;;;;;;;;53163:271;;;;:::o;26008:127::-;-1:-1:-1;;;;;26109:18:0;26082:7;26109:18;;;;;;;;;;;;26008:127::o;2115:148::-;1695:12;:10;:12::i;:::-;1685:6;;-1:-1:-1;;;;;1685:6:0;;;:22;;;1677:67;;;;;-1:-1:-1;;;1677:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1677:67:0;;;;;;;;;;;;;;;2206:6:::1;::::0;2185:40:::1;::::0;2222:1:::1;::::0;-1:-1:-1;;;;;2206:6:0::1;::::0;2185:40:::1;::::0;2222:1;;2185:40:::1;2236:6;:19:::0;;-1:-1:-1;;;;;;2236:19:0::1;::::0;;2115:148::o;45239:51::-;;;;:::o;51234:414::-;1695:12;:10;:12::i;:::-;1685:6;;-1:-1:-1;;;;;1685:6:0;;;:22;;;1677:67;;;;;-1:-1:-1;;;1677:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1677:67:0;;;;;;;;;;;;;;;51332:6:::1;51320:8;:18;;:40;;;;;51354:6;51342:8;:18;;51320:40;51312:116;;;;-1:-1:-1::0;;;51312:116:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51459:16;;51447:8;:28;;51439:96;;;;-1:-1:-1::0;;;51439:96:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51585:16;::::0;51551:51:::1;::::0;51575:8;;51551:51:::1;::::0;;;::::1;51613:16;:27:::0;51234:414::o;48712:860::-;1695:12;:10;:12::i;:::-;1685:6;;-1:-1:-1;;;;;1685:6:0;;;:22;;;1677:67;;;;;-1:-1:-1;;;1677:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1677:67:0;;;;;;;;;;;;;;;48821:15:::1;::::0;-1:-1:-1;;;;;48799:38:0;;::::1;48821:15:::0;::::1;48799:38;;48791:107;;;;-1:-1:-1::0;;;48791:107:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48912:43;48991:10;48912:91;;49063:4;-1:-1:-1::0;;;;;49025:43:0::1;:18;-1:-1:-1::0;;;;;49025:24:0::1;;:26;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27::::0;20:12:::1;5:2;49025:26:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;49025:26:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26::::0;19:12:::1;2:2;-1:-1:::0;49025:26:0;-1:-1:-1;;;;;49025:43:0::1;;49017:137;;;;-1:-1:-1::0;;;49017:137:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49168:68;::::0;;-1:-1:-1;;;49168:68:0;;-1:-1:-1;;;;;49168:39:0;::::1;:68;::::0;::::1;::::0;;;;;:39:::1;::::0;:68;;;;;-1:-1:-1;;49168:68:0;;;;;;;;-1:-1:-1;49168:39:0;:68;::::1;;5:2:-1::0;::::1;;;30:1;27::::0;20:12:::1;5:2;49168:68:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;-1:-1:::0;;49247:54:0::1;::::0;;-1:-1:-1;;;49247:54:0;;49295:4:::1;49247:54;::::0;::::1;::::0;;;-1:-1:-1;;;;;49247:39:0;::::1;::::0;-1:-1:-1;49247:39:0::1;::::0;-1:-1:-1;49247:54:0;;;;;-1:-1:-1;;49247:54:0;;;;;;;-1:-1:-1;49247:39:0;:54;::::1;;5:2:-1::0;::::1;;;30:1;27::::0;20:12:::1;5:2;49247:54:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;49247:54:0;;;;49312:18;-1:-1:-1::0;;;;;49312:39:0::1;;49352:7;:5;:7::i;:::-;49312:48;;;;;;;;;;;;;-1:-1:-1::0;;;;;49312:48:0::1;-1:-1:-1::0;;;;;49312:48:0::1;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27::::0;20:12:::1;5:2;49312:48:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;-1:-1:::0;;49419:15:0::1;::::0;49371:65:::1;::::0;;-1:-1:-1;;;49371:65:0;;-1:-1:-1;;;;;49419:15:0;;::::1;49371:65;::::0;::::1;::::0;;;:39;;::::1;::::0;-1:-1:-1;49371:39:0::1;::::0;-1:-1:-1;49371:65:0;;;;;49419:15:::1;::::0;49371:65;;;;;;;;49419:15;49371:39;:65;::::1;;5:2:-1::0;::::1;;;30:1;27::::0;20:12:::1;5:2;49371:65:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;-1:-1:::0;;49497:15:0::1;::::0;49455:59:::1;::::0;-1:-1:-1;;;;;49497:15:0;;::::1;::::0;-1:-1:-1;49455:59:0;;::::1;::::0;-1:-1:-1;49455:59:0::1;::::0;49497:15:::1;::::0;49455:59:::1;49528:15;:36:::0;;-1:-1:-1;;;;;;49528:36:0::1;-1:-1:-1::0;;;;;49528:36:0;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;48712:860:0:o;1473:79::-;1538:6;;-1:-1:-1;;;;;1538:6:0;1473:79;:::o;24936:104::-;25025:7;25018:14;;;;;;;;-1:-1:-1;;25018:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24992:13;;25018:14;;25025:7;;25018:14;;25025:7;25018:14;;;;;;;;;;;;;;;;;;;;;;;;45381:32;;;;:::o;50534:268::-;1695:12;:10;:12::i;:::-;1685:6;;-1:-1:-1;;;;;1685:6:0;;;:22;;;1677:67;;;;;-1:-1:-1;;;1677:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1677:67:0;;;;;;;;;;;;;;;50641:13:::1;::::0;-1:-1:-1;;;;;50633:21:0;;::::1;50641:13:::0;::::1;50633:21;;50625:114;;;;-1:-1:-1::0;;;50625:114:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50753:41;50782:4;50788:5;50753:28;:41::i;45697:40::-:0;;;;:::o;51790:108::-;51863:15;;:27;;;-1:-1:-1;;;51863:27:0;;;;51836:7;;-1:-1:-1;;;;;51863:15:0;;:25;;:27;;;;;;;;;;;;;;:15;:27;;;5:2:-1;;;;30:1;27;20:12;29020:269:0;29113:4;29130:129;29139:12;:10;:12::i;:::-;29153:7;29162:96;29201:15;29162:96;;;;;;;;;;;;;;;;;:11;:25;29174:12;:10;:12::i;:::-;-1:-1:-1;;;;;29162:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;29162:25:0;;;:34;;;;;;;;;;;:96;;:38;:96;:::i;52191:151::-;52287:15;;:47;;;-1:-1:-1;;;52287:47:0;;-1:-1:-1;;;;;52287:47:0;;;;;;;;;52260:7;;52287:15;;;;;:38;;:47;;;;;;;;;;;;;;;:15;:47;;;5:2:-1;;;;30:1;27;20:12;26348:175:0;26434:4;26451:42;26461:12;:10;:12::i;:::-;26475:9;26486:6;26451:9;:42::i;52499:318::-;52595:7;52617:6;52638;52659:7;52681;52703;52725;52747;52774:15;;;;;;;;;-1:-1:-1;;;;;52774:15:0;-1:-1:-1;;;;;52774:26:0;;52801:7;52774:35;;;;;;;;;;;;;-1:-1:-1;;;;;52774:35:0;-1:-1:-1;;;;;52774:35:0;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;52774:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;52774:35:0;;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;52774:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52774:35:0;;-1:-1:-1;52774:35:0;;-1:-1:-1;52774:35:0;-1:-1:-1;52774:35:0;-1:-1:-1;52774:35:0;-1:-1:-1;52774:35:0;;-1:-1:-1;52774:35:0;-1:-1:-1;52499:318:0;;;;;;;;;:::o;45959:58::-;;;;;;;;;;;;;;;:::o;49908:302::-;1695:12;:10;:12::i;:::-;1685:6;;-1:-1:-1;;;;;1685:6:0;;;:22;;;1677:67;;;;;-1:-1:-1;;;1677:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1677:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;50001:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;::::1;;:40;;::::0;::::1;;;;49993:106;;;;-1:-1:-1::0;;;49993:106:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;50110:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;;;;:39;;-1:-1:-1;;50110:39:0::1;::::0;::::1;;::::0;;::::1;::::0;;;50168:34;;;;;;;::::1;::::0;;;;;;;;::::1;49908:302:::0;;:::o;50219:303::-;1695:12;:10;:12::i;:::-;1685:6;;-1:-1:-1;;;;;1685:6:0;;;:22;;;1677:67;;;;;-1:-1:-1;;;1677:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1677:67:0;;;;;;;;;;;;;;;50334:9:::1;50330:115;50353:8;:15;50349:1;:19;50330:115;;;50425:8;50390:19;:32;50410:8;50419:1;50410:11;;;;;;;;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;50390:32:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;50390:32:0;:43;;-1:-1:-1;;50390:43:0::1;::::0;::::1;;::::0;;;::::1;::::0;;-1:-1:-1;50370:3:0::1;50330:115;;;;50463:51;50495:8;50505;50463:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11:::0;;::::1;84:18:::0;71:11;;::::1;64:39:::0;52:2:::1;45:10;8:100;;;12:14;50463:51:0;;;;;;;;;;;;;;;;;;50219:303:::0;;:::o;26586:151::-;-1:-1:-1;;;;;26702:18:0;;;26675:7;26702:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;26586:151::o;54085:92::-;1695:12;:10;:12::i;:::-;1685:6;;-1:-1:-1;;;;;1685:6:0;;;:22;;;1677:67;;;;;-1:-1:-1;;;1677:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1677:67:0;;;;;;;;;;;;;;;54150:11:::1;:19:::0;;-1:-1:-1;;54150:19:0::1;::::0;::::1;;::::0;;;::::1;::::0;;54085:92::o;45172:54::-;;;;:::o;53546:129::-;53628:15;;:39;;;-1:-1:-1;;;53628:39:0;;;;53601:7;;-1:-1:-1;;;;;53628:15:0;;:37;;:39;;;;;;;;;;;;;;:15;:39;;;5:2:-1;;;;30:1;27;20:12;51657:124:0;1695:12;:10;:12::i;:::-;1685:6;;-1:-1:-1;;;;;1685:6:0;;;:22;;;1677:67;;;;;-1:-1:-1;;;1677:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1677:67:0;;;;;;;;;;;;;;;51731:15:::1;::::0;:42:::1;::::0;;-1:-1:-1;;;51731:42:0;;::::1;::::0;::::1;::::0;;;;;-1:-1:-1;;;;;51731:15:0;;::::1;::::0;:31:::1;::::0;:42;;;;;:15:::1;::::0;:42;;;;;;;;:15;;:42;::::1;;5:2:-1::0;::::1;;;30:1;27::::0;20:12:::1;5:2;51731:42:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;51731:42:0;;;;51657:124:::0;:::o;52826:328::-;52927:7;52949:6;52970;52991:7;53013;53035;53057;53079;53106:15;;;;;;;;;-1:-1:-1;;;;;53106:15:0;-1:-1:-1;;;;;53106:33:0;;53140:5;53106:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;2418:244:0;1695:12;:10;:12::i;:::-;1685:6;;-1:-1:-1;;;;;1685:6:0;;;:22;;;1677:67;;;;;-1:-1:-1;;;1677:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1677:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;2507:22:0;::::1;2499:73;;;;-1:-1:-1::0;;;2499:73:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2609:6;::::0;2588:38:::1;::::0;-1:-1:-1;;;;;2588:38:0;;::::1;::::0;2609:6:::1;::::0;2588:38:::1;::::0;2609:6:::1;::::0;2588:38:::1;2637:6;:17:::0;;-1:-1:-1;;;;;;2637:17:0::1;-1:-1:-1::0;;;;;2637:17:0;;;::::1;::::0;;;::::1;::::0;;2418:244::o;601:98::-;681:10;601:98;:::o;32206:380::-;-1:-1:-1;;;;;32342:19:0;;32334:68;;;;-1:-1:-1;;;32334:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;32421:21:0;;32413:68;;;;-1:-1:-1;;;32413:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;32494:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;32546:32;;;;;;;;;;;;;;;;;32206:380;;;:::o;54186:2118::-;-1:-1:-1;;;;;54318:18:0;;54310:68;;;;-1:-1:-1;;;54310:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;54397:16:0;;54389:64;;;;-1:-1:-1;;;54389:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54477:11;54474:92;;54505:28;54521:4;54527:2;54531:1;54505:15;:28::i;:::-;54548:7;;54474:92;54579:28;54610:24;54628:4;54610:9;:24::i;:::-;54700:18;;54732:11;;54579:55;;-1:-1:-1;54676:42:0;;;;54732:11;;:24;;;;-1:-1:-1;54748:8:0;;-1:-1:-1;;;54748:8:0;;;;54747:9;54732:24;:49;;;;-1:-1:-1;54768:13:0;;-1:-1:-1;;;;;54760:21:0;;;54768:13;;54760:21;;54732:49;54729:540;;;54801:23;54797:458;;;54845:18;54866:53;54909:9;;54866:38;54891:12;;54866:20;:24;;:38;;;;:::i;:::-;:42;:53;:42;:53;:::i;:::-;54845:74;;54938:26;54953:10;54938:14;:26::i;:::-;54985:23;55011:53;55054:9;;55011:38;55036:12;;55011:20;:24;;:38;;;;:::i;:53::-;54985:79;;55083:39;55106:15;55083:22;:39::i;:::-;55144:18;55165:24;55183:4;55165:9;:24::i;:::-;55144:45;;55208:32;55229:10;55208:20;:32::i;:::-;54797:458;;;;-1:-1:-1;;;;;55403:25:0;;55282:12;55403:25;;;:19;:25;;;;;;55297:4;;55403:25;;;:52;;-1:-1:-1;;;;;;55432:23:0;;;;;;:19;:23;;;;;;;;55403:52;55400:99;;;-1:-1:-1;55482:5:0;55400:99;55515:7;55512:198;;;55539:12;55554:30;55580:3;55554:21;55565:9;;55554:6;:10;;:21;;;;:::i;:30::-;55539:45;-1:-1:-1;55622:16:0;:6;55539:45;55622:16;:10;:16;:::i;:::-;55613:25;;55656:42;55672:4;55686;55693;55656:15;:42::i;:::-;55512:198;;55723:33;55739:4;55745:2;55749:6;55723:15;:33::i;:::-;55774:15;;-1:-1:-1;;;;;55774:15:0;:26;55809:4;55816:15;55809:4;55816:9;:15::i;:::-;55774:58;;;;;;;;;;;;;-1:-1:-1;;;;;55774:58:0;-1:-1:-1;;;;;55774:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;55774:58:0;;;;;;;;;;;;;;55770:74;55858:15;;-1:-1:-1;;;;;55858:15:0;:26;55893:2;55898:13;55893:2;55898:9;:13::i;:::-;55858:54;;;;;;;;;;;;;-1:-1:-1;;;;;55858:54:0;-1:-1:-1;;;;;55858:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;55858:54:0;;;;;;;;;;;;;;55854:70;55941:8;;-1:-1:-1;;;55941:8:0;;;;55937:360;;55980:16;;56018:15;;:28;;;-1:-1:-1;;;;;;56018:28:0;;;;;;;;;;-1:-1:-1;;;;;56018:15:0;;;;:23;;:28;;;;;;;;;;;;;;;55966:11;56018:15;:28;;;5:2:-1;;;;30:1;27;20:12;5:2;56018:28:0;;;;;;;;;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;56018:28:0;;;;;;;;;;;;;;;;56014:272;;;;;56144:86;;;;;;;;;;;;;;;;;;;;;;;;;;56220:9;;56209:4;;56144:86;;;;;;;;;56047:199;;;56014:272;55937:360;;54186:2118;;;;;;;:::o;3862:192::-;3948:7;3984:12;3976:6;;;;3968:29;;;;-1:-1:-1;;;3968:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;3968:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;4020:5:0;;;3862:192::o;2959:181::-;3017:7;3049:5;;;3073:6;;;;3065:46;;;;;-1:-1:-1;;;3065:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;3131:1;2959:181;-1:-1:-1;;;2959:181:0:o;50811:412::-;-1:-1:-1;;;;;50902:31:0;;;;;;:25;:31;;;;;;;;:40;;;;;;;50894:120;;;;-1:-1:-1;;;50894:120:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;51025:31:0;;;;;;:25;:31;;;;;:39;;-1:-1:-1;;51025:39:0;;;;;;;;;;;;51078:79;;51103:15;;:42;;;-1:-1:-1;;;51103:42:0;;-1:-1:-1;;;;;51103:42:0;;;;;;;;;:15;;;;;:36;;:42;;;;;:15;;:42;;;;;;;:15;;:42;;;5:2:-1;;;;30:1;27;20:12;5:2;51103:42:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;51103:42:0;;;;51078:79;51175:40;;;;;;-1:-1:-1;;;;;51175:40:0;;;;;;;;50811:412;;:::o;29779:573::-;-1:-1:-1;;;;;29919:20:0;;29911:70;;;;-1:-1:-1;;;29911:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;30000:23:0;;29992:71;;;;-1:-1:-1;;;29992:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30076:47;30097:6;30105:9;30116:6;30076:20;:47::i;:::-;30156:71;30178:6;30156:71;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;30156:17:0;;:9;:17;;;;;;;;;;;;:71;;:21;:71;:::i;:::-;-1:-1:-1;;;;;30136:17:0;;;:9;:17;;;;;;;;;;;:91;;;;30261:20;;;;;;;:32;;30286:6;30261:32;:24;:32;:::i;:::-;-1:-1:-1;;;;;30238:20:0;;;:9;:20;;;;;;;;;;;;:55;;;;30309:35;;;;;;;30238:20;;30309:35;;;;;;;;;;;;;29779:573;;;:::o;4313:471::-;4371:7;4616:6;4612:47;;-1:-1:-1;4646:1:0;4639:8;;4612:47;4683:5;;;4687:1;4683;:5;:1;4707:5;;;;;:10;4699:56;;;;-1:-1:-1;;;4699:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5260:132;5318:7;5345:39;5349:1;5352;5345:39;;;;;;;;;;;;;;;;;:3;:39::i;57303:677::-;47127:8;:15;;-1:-1:-1;;;;47127:15:0;-1:-1:-1;;;47127:15:0;;;;57439:13:::1;:6:::0;57450:1:::1;57439:13;:10;:13;:::i;:::-;57424:28:::0;-1:-1:-1;57463:17:0::1;57483:16;:6:::0;57424:28;57483:16:::1;:10;:16;:::i;:::-;57463:36:::0;-1:-1:-1;57537:21:0::1;57603:22;57620:4:::0;57603:16:::1;:22::i;:::-;57756:18;57777:41;:21;57803:14:::0;57777:41:::1;:25;:41;:::i;:::-;57756:62;;57868:35;57881:9;57892:10;57868:12;:35::i;:::-;57929:43;::::0;;;;;::::1;::::0;::::1;::::0;;;;;;;;;;;::::1;::::0;;;;;;;::::1;-1:-1:-1::0;;47165:8:0;:16;;-1:-1:-1;;;;47165:16:0;;;-1:-1:-1;;;57303:677:0:o;56314:431::-;47127:8;:15;;-1:-1:-1;;;;47127:15:0;-1:-1:-1;;;47127:15:0;;;56421:21:::1;56456:24;56473:6:::0;56456:16:::1;:24::i;:::-;56539:18;56560:41;:21;56586:14:::0;56560:41:::1;:25;:41;:::i;:::-;56539:62:::0;-1:-1:-1;56612:16:0::1;56631:17;56539:62:::0;56646:1:::1;56631:17;:14;:17;:::i;:::-;56660:16;::::0;:35:::1;::::0;56612:36;;-1:-1:-1;56660:16:0::1;::::0;::::1;-1:-1:-1::0;;;;;56660:16:0::1;::::0;:35:::1;::::0;::::1;;::::0;56612:36;;56660:35:::1;::::0;;;56612:36;56660:16;:35;::::1;;;;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;-1:-1:::0;56708:10:0::1;::::0;:29:::1;::::0;-1:-1:-1;;;;;56708:10:0;;::::1;::::0;:29;::::1;;;::::0;56728:8;;56708:10:::1;:29:::0;:10;:29;56728:8;56708:10;:29;::::1;;;;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;-1:-1:::0;;47165:8:0;:16;;-1:-1:-1;;;;47165:16:0;;;-1:-1:-1;;;56314:431:0:o;58600:329::-;47127:8;:15;;-1:-1:-1;;;;47127:15:0;-1:-1:-1;;;47127:15:0;;;58676:24:::1;58693:6:::0;58676:16:::1;:24::i;:::-;58789:15;::::0;58781:51:::1;::::0;58731:21:::1;::::0;58711:17:::1;::::0;-1:-1:-1;;;;;58789:15:0;;::::1;::::0;58731:21;;58711:17;58781:51;58711:17;58781:51;58731:21;58789:15;58781:51:::1;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;58763:69:0;;;58849:7;58846:76;;;58878:32;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;;;;;;;;;::::1;58846:76;-1:-1:-1::0;;47165:8:0;:16;;-1:-1:-1;;;;47165:16:0;;;-1:-1:-1;58600:329:0:o;3423:136::-;3481:7;3508:43;3512:1;3515;3508:43;;;;;;;;;;;;;;;;;:3;:43::i;5888:278::-;5974:7;6009:12;6002:5;5994:28;;;;-1:-1:-1;;;5994:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;5994:28:0;;6033:9;6049:1;6045;:5;;;;;;;5888:278;-1:-1:-1;;;;;5888:278:0:o;57989:600::-;58145:16;;;58159:1;58145:16;;;58121:21;58145:16;;;;;58121:21;58145:16;;;;;105:10:-1;58145:16:0;88:34:-1;136:17;;-1:-1;58145:16:0;58121:40;;58190:4;58172;58177:1;58172:7;;;;;;;;-1:-1:-1;;;;;58172:23:0;;;:7;;;;;;;;;;:23;;;;58216:15;;:22;;;-1:-1:-1;;;58216:22:0;;;;:15;;;;;:20;;:22;;;;;58172:7;;58216:22;;;;;:15;:22;;;5:2:-1;;;;30:1;27;20:12;5:2;58216:22:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;58216:22:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;58216:22:0;58206:7;;:4;;58211:1;;58206:7;;;;;;-1:-1:-1;;;;;58206:32:0;;;:7;;;;;;;;;:32;58284:15;;58252:62;;58269:4;;58284:15;58302:11;58252:8;:62::i;:::-;58354:15;;:224;;-1:-1:-1;;;58354:224:0;;;;;;;;:15;:224;;;;;;58532:4;58354:224;;;;;;58552:15;58354:224;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;58354:15:0;;;;:66;;58435:11;;58505:4;;58532;58552:15;58354:224;;;;;;;;;;;;;;;;:15;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;58354:224:0;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;58354:224:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;56758:533:0;56948:15;;56916:62;;56933:4;;-1:-1:-1;;;;;56948:15:0;56966:11;56916:8;:62::i;:::-;57021:15;;-1:-1:-1;;;;;57021:15:0;:31;57060:9;57093:4;57113:11;57021:15;;57225:7;:5;:7::i;:::-;57247:15;57021:252;;;;;;;;;;;;;-1:-1:-1;;;;;57021:252:0;-1:-1:-1;;;;;57021:252:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;57021:252:0;-1:-1:-1;;;;;57021:252:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;57021:252:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;57021:252:0;;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;56758:533:0:o
Swarm Source
ipfs://926f6a179604998e37de30c79bf23d009f5f240db1735d7ea7d094ef15546a34
Age | Block | Fee Address | BC Fee Address | Voting Power | Jailed | Incoming |
---|
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.