Token CROBTC
Overview CRC20
Price
$0.00 @ 0.000000 CRO
Fully Diluted Market Cap
Total Supply:
1,000,000,000 CROBTC
Holders:
277 addresses
Contract:
Decimals:
18
Official Site:
Balance
218,084.063077228 CROBTCValue
$0.00
[ Download CSV Export ]
[ Download CSV Export ]
OVERVIEW
CroKing is a multifacet utility token which uses the Hype of Cronos Chain which provides a fresh start for many crypto investors away from the regular BSC and ETH dominance and gives holder 9% BTC Rewards.Update? Click here to update the token ICO / general information
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
CROBTC
Compiler Version
v0.8.9+commit.e5eed63a
Contract Source Code (Solidity)
/** *Submitted for verification at cronoscan.com on 2022-07-09 */ // SPDX-License-Identifier: MIT pragma solidity 0.8.9; abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } interface IUniswapV2Pair { event Approval(address indexed owner, address indexed spender, uint value); event Transfer(address indexed from, address indexed to, uint value); function name() external pure returns (string memory); function symbol() external pure returns (string memory); function decimals() external pure returns (uint8); function totalSupply() external view returns (uint); function balanceOf(address owner) external view returns (uint); function allowance(address owner, address spender) external view returns (uint); function approve(address spender, uint value) external returns (bool); function transfer(address to, uint value) external returns (bool); function transferFrom(address from, address to, uint value) external returns (bool); function DOMAIN_SEPARATOR() external view returns (bytes32); function PERMIT_TYPEHASH() external pure returns (bytes32); function nonces(address owner) external view returns (uint); function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external; event Mint(address indexed sender, uint amount0, uint amount1); event Burn(address indexed sender, uint amount0, uint amount1, address indexed to); event Swap( address indexed sender, uint amount0In, uint amount1In, uint amount0Out, uint amount1Out, address indexed to ); event Sync(uint112 reserve0, uint112 reserve1); function MINIMUM_LIQUIDITY() external pure returns (uint); function factory() external view returns (address); function token0() external view returns (address); function token1() external view returns (address); function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast); function price0CumulativeLast() external view returns (uint); function price1CumulativeLast() external view returns (uint); function kLast() external view returns (uint); function mint(address to) external returns (uint liquidity); function burn(address to) external returns (uint amount0, uint amount1); function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external; function skim(address to) external; function sync() external; function initialize(address, address) external; } interface IUniswapV2Factory { event PairCreated(address indexed token0, address indexed token1, address pair, uint); function feeTo() external view returns (address); function feeToSetter() external view returns (address); function getPair(address tokenA, address tokenB) external view returns (address pair); function allPairs(uint) external view returns (address pair); function allPairsLength() external view returns (uint); function createPair(address tokenA, address tokenB) external returns (address pair); function setFeeTo(address) external; function setFeeToSetter(address) external; } 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(); } } interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } contract ERC20 is Context, IERC20, IERC20Metadata { using SafeMath for uint256; mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The default value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) { _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 {} } interface DividendPayingTokenOptionalInterface { /// @notice View the amount of dividend in wei that an address can withdraw. /// @param _owner The address of a token holder. /// @return The amount of dividend in wei that `_owner` can withdraw. function withdrawableDividendOf(address _owner) external view returns(uint256); /// @notice View the amount of dividend in wei that an address has withdrawn. /// @param _owner The address of a token holder. /// @return The amount of dividend in wei that `_owner` has withdrawn. function withdrawnDividendOf(address _owner) external view returns(uint256); /// @notice View the amount of dividend in wei that an address has earned in total. /// @dev accumulativeDividendOf(_owner) = withdrawableDividendOf(_owner) + withdrawnDividendOf(_owner) /// @param _owner The address of a token holder. /// @return The amount of dividend in wei that `_owner` has earned in total. function accumulativeDividendOf(address _owner) external view returns(uint256); } interface DividendPayingTokenInterface { /// @notice View the amount of dividend in wei that an address can withdraw. /// @param _owner The address of a token holder. /// @return The amount of dividend in wei that `_owner` can withdraw. function dividendOf(address _owner) external view returns(uint256); /// @notice Distributes ether to token holders as dividends. /// @dev SHOULD distribute the paid ether to token holders as dividends. /// SHOULD NOT directly transfer ether to token holders in this function. /// MUST emit a `DividendsDistributed` event when the amount of distributed ether is greater than 0. function distributeDividends() external payable; /// @notice Withdraws the ether distributed to the sender. /// @dev SHOULD transfer `dividendOf(msg.sender)` wei to `msg.sender`, and `dividendOf(msg.sender)` SHOULD be 0 after the transfer. /// MUST emit a `DividendWithdrawn` event if the amount of ether transferred is greater than 0. function withdrawDividend() external; /// @dev This event MUST emit when ether is distributed to token holders. /// @param from The address which sends ether to this contract. /// @param weiAmount The amount of distributed ether in wei. event DividendsDistributed( address indexed from, uint256 weiAmount ); /// @dev This event MUST emit when an address withdraws their dividend. /// @param to The address which withdraws ether from this contract. /// @param weiAmount The amount of withdrawn ether in wei. event DividendWithdrawn( address indexed to, uint256 weiAmount ); } library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } contract 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 () { 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; } } 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); } } library SafeMathUint { function toInt256Safe(uint256 a) internal pure returns (int256) { int256 b = int256(a); require(b >= 0); return b; } } 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; } contract DividendPayingToken is DividendPayingTokenInterface, DividendPayingTokenOptionalInterface, Ownable { 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; address public immutable token = address(0x062E66477Faf219F25D27dCED647BF57C3107d52); // BTC // 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; mapping (address => uint256) public holderBalance; uint256 public totalBalance; uint256 public totalDividendsDistributed; /// @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(false, "Cannot send BNB directly to tracker as it is unrecoverable"); // } function distributeTokenDividends(uint256 amount) public onlyOwner { require(totalBalance > 0); if (amount > 0) { magnifiedDividendPerShare = magnifiedDividendPerShare.add( (amount).mul(magnitude) / totalBalance ); emit DividendsDistributed(msg.sender, amount); totalDividendsDistributed = totalDividendsDistributed.add(amount); } } /// @notice Withdraws the ether distributed to the sender. /// @dev It emits a `DividendWithdrawn` event if the amount of withdrawn ether is greater than 0. function withdrawDividend() public virtual override { _withdrawDividendOfUser(payable(msg.sender)); } /// @notice Withdraws the ether distributed to the sender. /// @dev It emits a `DividendWithdrawn` event if the amount of withdrawn ether is greater than 0. function _withdrawDividendOfUser(address payable user) internal returns (uint256) { uint256 _withdrawableDividend = withdrawableDividendOf(user); if (_withdrawableDividend > 0) { withdrawnDividends[user] = withdrawnDividends[user].add(_withdrawableDividend); emit DividendWithdrawn(user, _withdrawableDividend); bool success = IERC20(token).transfer(user, _withdrawableDividend); 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(holderBalance[_owner]).toInt256Safe() .add(magnifiedDividendCorrections[_owner]).toUint256Safe() / magnitude; } /// @dev Internal function that increases 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 _increase(address account, uint256 value) internal { magnifiedDividendCorrections[account] = magnifiedDividendCorrections[account] .sub( (magnifiedDividendPerShare.mul(value)).toInt256Safe() ); } /// @dev Internal function that reduces 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 _reduce(address account, uint256 value) internal { magnifiedDividendCorrections[account] = magnifiedDividendCorrections[account] .add( (magnifiedDividendPerShare.mul(value)).toInt256Safe() ); } function _setBalance(address account, uint256 newBalance) internal { uint256 currentBalance = holderBalance[account]; holderBalance[account] = newBalance; if(newBalance > currentBalance) { uint256 increaseAmount = newBalance.sub(currentBalance); _increase(account, increaseAmount); totalBalance += increaseAmount; } else if(newBalance < currentBalance) { uint256 reduceAmount = currentBalance.sub(newBalance); _reduce(account, reduceAmount); totalBalance -= reduceAmount; } } } contract CROBTC is ERC20, Ownable { using SafeMath for uint256; IUniswapV2Router02 public uniswapV2Router; address public immutable uniswapV2Pair; bool private swapping; DividendTracker public dividendTracker; address public marketingWallet; address public devWallet; address public immutable token = address(0x062E66477Faf219F25D27dCED647BF57C3107d52); // BTC uint256 public maxTransactionAmount; uint256 public swapTokensAtAmount; uint256 public maxWallet; uint256 public liquidityActiveBlock = 0; // 0 means liquidity is not active yet uint256 public tradingActiveBlock = 0; // 0 means trading is not active uint256 public earlyBuyPenaltyEnd; // determines when snipers/bots can sell without extra penalty bool public limitsInEffect = true; bool public tradingActive = false; bool public swapEnabled = false; // Anti-bot and anti-whale mappings and variables mapping(address => uint256) private _holderLastTransferTimestamp; // to hold last Transfers temporarily during launch bool public transferDelayEnabled = true; uint256 public totalSellFees; uint256 public rewardsSellFee; uint256 public marketingSellFee; uint256 public liquiditySellFee; uint256 public devSellFee; uint256 public burnSellFee; uint256 public totalBuyFees; uint256 public rewardsBuyFee; uint256 public marketingBuyFee; uint256 public liquidityBuyFee; uint256 public devBuyFee; uint256 public burnBuyFee; uint256 public tokensForRewards; uint256 public tokensForMarketing; uint256 public tokensForLiquidity; uint256 public tokensForDev; bool public happyHourEnabled = false; bool public launchTaxUsed = false; // use by default 300,000 gas to process auto-claiming dividends uint256 public gasForProcessing = 300000; /******************/ // exlcude from fees and max transaction amount mapping (address => bool) private _isExcludedFromFees; mapping (address => bool) public _isExcludedMaxTransactionAmount; // 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 ExcludedMaxTransactionAmount(address indexed account, bool isExcluded); event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value); event marketingWalletUpdated(address indexed newWallet, address indexed oldWallet); event GasForProcessingUpdated(uint256 indexed newValue, uint256 indexed oldValue); event BuybackMultiplierActive(uint256 duration); event BoughtEarly(address indexed sniper); event HappyHour(bool enabled); event SwapAndLiquify( uint256 tokensSwapped, uint256 ethReceived, uint256 tokensIntoLiqudity ); event SendDividends( uint256 tokensSwapped, uint256 amount ); event ProcessedDividendTracker( uint256 iterations, uint256 claims, uint256 lastProcessedIndex, bool indexed automatic, uint256 gas, address indexed processor ); constructor() ERC20("CROBTC", "CROBTC") { uint256 totalSupply = 1 * 1e9 * 1e18; maxTransactionAmount = totalSupply * 5 / 1000; // 0.5% maxTransactionAmountTxn swapTokensAtAmount = totalSupply * 1 / 1000; // 0.1% swap tokens amount maxWallet = totalSupply * 2 / 100; // 2% Max wallet rewardsSellFee = 9; marketingSellFee = 2; liquiditySellFee = 2; devSellFee = 2; burnSellFee = 2; totalSellFees = rewardsSellFee + marketingSellFee + liquiditySellFee + devSellFee + burnSellFee; rewardsBuyFee = 9; marketingBuyFee = 1; liquidityBuyFee = 2; devBuyFee = 1; burnBuyFee = 0; totalBuyFees = rewardsBuyFee + marketingBuyFee + liquidityBuyFee + devBuyFee + burnBuyFee; dividendTracker = new DividendTracker(); marketingWallet = address(0xCb9D40F3B78eB82412200795B295D09df3a28918); // set as marketing wallet devWallet = address(0x62a2F1852696CFCd18A81Ec3e521A8700cB6E5f6); // set as dev wallet IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(0x145677FC4d9b8F19B5D56d1820c48e0443049a30); // 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)); dividendTracker.excludeFromDividends(address(0xdead)); // exclude from paying fees or having max transaction amount excludeFromFees(owner(), true); excludeFromFees(address(this), true); excludeFromFees(address(0xdead), true); excludeFromMaxTransaction(owner(), true); excludeFromMaxTransaction(address(this), true); excludeFromMaxTransaction(address(dividendTracker), true); excludeFromMaxTransaction(address(_uniswapV2Router), true); excludeFromMaxTransaction(address(0xdead), true); /* _mint is an internal function in ERC20.sol that is only called here, and CANNOT be called ever again */ _mint(address(owner()), totalSupply); } receive() external payable { } // disable Transfer delay - cannot be reenabled function disableTransferDelay() external onlyOwner returns (bool){ transferDelayEnabled = false; return true; } // excludes wallets and contracts from dividends (such as CEX hotwallets, etc.) function excludeFromDividends(address account) external onlyOwner { dividendTracker.excludeFromDividends(account); } // removes exclusion on wallets and contracts from dividends (such as CEX hotwallets, etc.) function includeInDividends(address account) external onlyOwner { dividendTracker.includeInDividends(account); } // once enabled, can never be turned off function enableTrading() external onlyOwner { tradingActive = true; swapEnabled = true; tradingActiveBlock = block.number; earlyBuyPenaltyEnd = block.timestamp + 72 hours; } // only use to disable contract sales if absolutely necessary (emergency use only) function updateSwapEnabled(bool enabled) external onlyOwner(){ swapEnabled = enabled; } function updateMaxAmount(uint256 newNum) external onlyOwner { require(newNum > (totalSupply() * 5 / 1000)/1e18, "Cannot set maxTransactionAmount lower than 0.5%"); maxTransactionAmount = newNum * (10**18); } function updateMaxWalletAmount(uint256 newNum) external onlyOwner { require(newNum > (totalSupply() * 1 / 100)/1e18, "Cannot set maxWallet lower than 1%"); maxWallet = newNum * (10**18); } function updateBuyFees(uint256 _marketingFee, uint256 _rewardsFee, uint256 _liquidityFee, uint256 _devFee, uint256 _burnFee) external onlyOwner { marketingBuyFee = _marketingFee; rewardsBuyFee = _rewardsFee; liquidityBuyFee = _liquidityFee; devBuyFee = _devFee; burnBuyFee = _burnFee; totalBuyFees = marketingBuyFee + rewardsBuyFee + liquidityBuyFee + devBuyFee + burnBuyFee; require(totalBuyFees <= 20, "Must keep fees at 20% or less"); } function updateSellFees(uint256 _marketingFee, uint256 _rewardsFee, uint256 _liquidityFee, uint256 _devFee, uint256 _burnFee) external onlyOwner { marketingSellFee = _marketingFee; rewardsSellFee = _rewardsFee; liquiditySellFee = _liquidityFee; devSellFee = _devFee; burnSellFee = _burnFee; totalSellFees = marketingSellFee + rewardsSellFee + liquiditySellFee + devSellFee + burnSellFee; require(totalBuyFees <= 30, "Must keep fees at 30% or less"); } function excludeFromMaxTransaction(address updAds, bool isEx) public onlyOwner { _isExcludedMaxTransactionAmount[updAds] = isEx; emit ExcludedMaxTransactionAmount(updAds, isEx); } function excludeFromFees(address account, bool excluded) public onlyOwner { _isExcludedFromFees[account] = excluded; emit ExcludeFromFees(account, excluded); } function excludeMultipleAccountsFromFees(address[] calldata accounts, bool excluded) external onlyOwner { for(uint256 i = 0; i < accounts.length; i++) { _isExcludedFromFees[accounts[i]] = excluded; } emit ExcludeMultipleAccountsFromFees(accounts, excluded); } function airdropToWallets(address[] memory wallets, uint256[] memory amountsInTokens) external onlyOwner { require(wallets.length == amountsInTokens.length, "arrays must be the same length"); require(wallets.length < 200, "Can only airdrop 200 wallets per txn due to gas limits"); // allows for airdrop + launch at the same exact time, reducing delays and reducing sniper input. for(uint256 i = 0; i < wallets.length; i++){ super._transfer(msg.sender, wallets[i], amountsInTokens[i]); dividendTracker.setBalance(payable(wallets[i]), balanceOf(wallets[i])); } } function setAutomatedMarketMakerPair(address pairaddress, bool value) public onlyOwner { require(pairaddress != uniswapV2Pair, "The PancakeSwap pair cannot be removed from automatedMarketMakerPairs"); _setAutomatedMarketMakerPair(pairaddress, value); } function _setAutomatedMarketMakerPair(address pair, bool value) private { automatedMarketMakerPairs[pair] = value; excludeFromMaxTransaction(pair, value); if(value) { dividendTracker.excludeFromDividends(pair); } emit SetAutomatedMarketMakerPair(pair, value); } function updateMarketingWallet(address newMarketingWallet) external onlyOwner { excludeFromFees(newMarketingWallet, true); emit marketingWalletUpdated(newMarketingWallet, marketingWallet); marketingWallet = newMarketingWallet; } function updateDevWallet(address newDevWallet) external onlyOwner { devWallet = newDevWallet; } function updateGasForProcessing(uint256 newValue) external onlyOwner { require(newValue >= 200000 && newValue <= 750000, " gasForProcessing must be between 200,000 and 500,000"); require(newValue != gasForProcessing, "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.holderBalance(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(payable(msg.sender), false); } function getLastProcessedIndex() external view returns(uint256) { return dividendTracker.getLastProcessedIndex(); } function getNumberOfDividendTokenHolders() external view returns(uint256) { return dividendTracker.getNumberOfTokenHolders(); } function getNumberOfDividends() external view returns(uint256) { return dividendTracker.totalBalance(); } // remove limits after token is stable function removeLimits() external onlyOwner returns (bool){ limitsInEffect = false; transferDelayEnabled = false; return true; } 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; } if(!tradingActive){ require(_isExcludedFromFees[from] || _isExcludedFromFees[to], "Trading is not active yet."); } if(limitsInEffect){ if ( from != owner() && to != owner() && to != address(0) && to != address(0xdead) && !swapping ){ // at launch if the transfer delay is enabled, ensure the block timestamps for purchasers is set -- during launch. if (transferDelayEnabled){ if (to != owner() && to != address(uniswapV2Router) && to != address(uniswapV2Pair)){ require(_holderLastTransferTimestamp[tx.origin] < block.number, "_transfer:: Transfer Delay enabled. Only one purchase per block allowed."); _holderLastTransferTimestamp[tx.origin] = block.number; } } //when buy if (automatedMarketMakerPairs[from] && !_isExcludedMaxTransactionAmount[to]) { require(amount + balanceOf(to) <= maxWallet, "Unable to exceed Max Wallet"); } //when sell else if (automatedMarketMakerPairs[to] && !_isExcludedMaxTransactionAmount[from]) { require(amount <= maxTransactionAmount, "Sell transfer amount exceeds the maxTransactionAmount."); } else if(!_isExcludedMaxTransactionAmount[to]) { require(amount + balanceOf(to) <= maxWallet, "Unable to exceed Max Wallet"); } } } uint256 contractTokenBalance = balanceOf(address(this)); bool canSwap = contractTokenBalance >= swapTokensAtAmount; if( canSwap && swapEnabled && !swapping && !automatedMarketMakerPairs[from] && !_isExcludedFromFees[from] && !_isExcludedFromFees[to] ) { swapping = true; swapBack(); swapping = false; } bool takeFee = !swapping; // if any account belongs to _isExcludedFromFee account then remove the fee if(_isExcludedFromFees[from] || _isExcludedFromFees[to]) { takeFee = false; } uint256 fees = 0; uint256 tokensForBurn = 0; // no taxes on transfers (non buys/sells) if(takeFee){ // on sell if (automatedMarketMakerPairs[to] && totalSellFees > 0){ fees = amount.mul(totalSellFees).div(100); tokensForRewards += fees * rewardsSellFee / totalSellFees; tokensForLiquidity += fees * liquiditySellFee / totalSellFees; tokensForBurn = fees * burnSellFee / totalSellFees; tokensForDev += fees * devSellFee / totalSellFees; tokensForMarketing += fees * marketingSellFee / totalSellFees; } // on buy else if(automatedMarketMakerPairs[from] && totalBuyFees > 0) { fees = amount.mul(totalBuyFees).div(100); tokensForRewards += fees * rewardsBuyFee / totalBuyFees; tokensForLiquidity += fees * liquidityBuyFee / totalBuyFees; tokensForBurn = fees * burnBuyFee / totalBuyFees; tokensForDev += fees * devBuyFee / totalBuyFees; tokensForMarketing += fees * marketingBuyFee / totalBuyFees; } if(tokensForBurn > 0){ super._transfer(from, address(0xdead), tokensForBurn); } if(fees > 0){ super._transfer(from, address(this), fees - tokensForBurn); } amount -= 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 swapBnbForRewardToken(uint256 bnbAmount) private { if(bnbAmount > 0){ address[] memory path = new address[](2); path[0] = uniswapV2Router.WETH(); path[1] = token; uniswapV2Router.swapExactETHForTokensSupportingFeeOnTransferTokens{value: bnbAmount}( 0, path, address(this), block.timestamp ); } } function swapTokensForEth(uint256 tokenAmount) private { // generate the uniswap pair path of token -> weth address[] memory path = new address[](2); path[0] = address(this); path[1] = uniswapV2Router.WETH(); _approve(address(this), address(uniswapV2Router), tokenAmount); // make the swap uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens( tokenAmount, 0, // accept any amount of ETH path, address(this), block.timestamp ); } function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private { // approve token transfer to cover all possible scenarios _approve(address(this), address(uniswapV2Router), tokenAmount); // add the liquidity uniswapV2Router.addLiquidityETH{value: ethAmount}( address(this), tokenAmount, 0, // slippage is unavoidable 0, // slippage is unavoidable address(0xdead), block.timestamp ); } function swapBack() private { uint256 contractBalance = balanceOf(address(this)); uint256 totalTokensToSwap = tokensForLiquidity + tokensForMarketing + tokensForRewards + tokensForDev; if(contractBalance == 0 || totalTokensToSwap == 0) {return;} // Halve the amount of liquidity tokens uint256 liquidityTokens = contractBalance * tokensForLiquidity / totalTokensToSwap / 2; uint256 amountToSwapForETH = contractBalance.sub(liquidityTokens); uint256 initialETHBalance = address(this).balance; swapTokensForEth(amountToSwapForETH); uint256 ethBalance = address(this).balance.sub(initialETHBalance); uint256 ethForMarketing = ethBalance.mul(tokensForMarketing).div(totalTokensToSwap); uint256 ethForDev = ethBalance.mul(tokensForDev).div(totalTokensToSwap); uint256 ethForRewards = ethBalance.mul(tokensForRewards).div(totalTokensToSwap); uint256 ethForLiquidity = ethBalance - ethForMarketing - ethForDev - ethForRewards; tokensForLiquidity = 0; tokensForMarketing = 0; tokensForRewards = 0; tokensForDev = 0; (bool success,) = address(marketingWallet).call{value: ethForMarketing}(""); (success,) = address(devWallet).call{value: ethForDev}(""); if(liquidityTokens > 0 && ethForLiquidity > 0){ addLiquidity(liquidityTokens, ethForLiquidity); emit SwapAndLiquify(amountToSwapForETH, ethForLiquidity, tokensForLiquidity); } ethForRewards = address(this).balance; // keep leftover ETH for buyback only if there is a buyback fee, if not, send the remaining ETH to the marketing wallet if it accumulates swapBnbForRewardToken(ethForRewards); uint256 tokenBalance = IERC20(token).balanceOf(address(this)); success = IERC20(token).transfer(address(dividendTracker), tokenBalance); if (success) { dividendTracker.distributeTokenDividends(tokenBalance); emit SendDividends(tokenBalance, ethForRewards); } } function happyHourToggle(bool enable) external onlyOwner { require(happyHourEnabled != enable, "Already set to this setting."); // uses hardcoded values to set happy hour on or off if(enable){ happyHourEnabled = true; rewardsSellFee = 10; marketingSellFee = 9; liquiditySellFee = 2; devSellFee = 2; burnSellFee = 2; totalSellFees = rewardsSellFee + marketingSellFee + liquiditySellFee + devSellFee + burnSellFee; rewardsBuyFee = 1; marketingBuyFee = 1; liquidityBuyFee = 1; devBuyFee = 1; burnBuyFee = 0; totalBuyFees = rewardsBuyFee + marketingBuyFee + liquidityBuyFee + devBuyFee + burnBuyFee; } // set back to normal taxes else if(!enable){ happyHourEnabled = false; rewardsSellFee = 9; marketingSellFee = 2; liquiditySellFee = 2; devSellFee = 2; burnSellFee = 2; totalSellFees = rewardsSellFee + marketingSellFee + liquiditySellFee + devSellFee + burnSellFee; rewardsBuyFee = 9; marketingBuyFee = 1; liquidityBuyFee = 2; devBuyFee = 1; burnBuyFee = 0; totalBuyFees = rewardsBuyFee + marketingBuyFee + liquidityBuyFee + devBuyFee + burnBuyFee; } emit HappyHour(enable); } function afterLaunchOn(bool enable) external onlyOwner { require(!launchTaxUsed || !enable, "Already used Launch tax, cannot call again."); if(enable){ launchTaxUsed = true; rewardsSellFee = 9; marketingSellFee = 5; liquiditySellFee = 2; devSellFee = 2; burnSellFee = 2; totalSellFees = rewardsSellFee + marketingSellFee + liquiditySellFee + devSellFee + burnSellFee; rewardsBuyFee = 9; marketingBuyFee = 1; liquidityBuyFee = 2; devBuyFee = 1; burnBuyFee = 0; totalBuyFees = rewardsBuyFee + marketingBuyFee + liquidityBuyFee + devBuyFee + burnBuyFee; } // set back to normal taxes else if(!enable){ happyHourEnabled = false; rewardsSellFee = 9; marketingSellFee = 2; liquiditySellFee = 2; devSellFee = 2; burnSellFee = 2; totalSellFees = rewardsSellFee + marketingSellFee + liquiditySellFee + devSellFee + burnSellFee; rewardsBuyFee = 9; marketingBuyFee = 1; liquidityBuyFee = 2; devBuyFee = 1; burnBuyFee = 0; totalBuyFees = rewardsBuyFee + marketingBuyFee + liquidityBuyFee + devBuyFee + burnBuyFee; } } function resetTax() external onlyOwner { rewardsSellFee = 9; marketingSellFee = 2; liquiditySellFee = 2; devSellFee = 2; burnSellFee = 2; totalSellFees = rewardsSellFee + marketingSellFee + liquiditySellFee + devSellFee + burnSellFee; rewardsBuyFee = 9; marketingBuyFee = 1; liquidityBuyFee = 2; devBuyFee = 1; burnBuyFee = 0; totalBuyFees = rewardsBuyFee + marketingBuyFee + liquidityBuyFee + devBuyFee + burnBuyFee; } // useful for buybacks or to reclaim any BNB on the contract in a way that helps holders. function buyBackTokens(uint256 bnbAmountInWei) external onlyOwner { // generate the uniswap pair path of weth -> eth address[] memory path = new address[](2); path[0] = uniswapV2Router.WETH(); path[1] = address(this); // make the swap uniswapV2Router.swapExactETHForTokensSupportingFeeOnTransferTokens{value: bnbAmountInWei}( 0, // accept any amount of Ethereum path, address(0xdead), block.timestamp ); } function withdrawStuckEth() external onlyOwner { (bool success,) = address(msg.sender).call{value: address(this).balance}(""); require(success, "failed to withdraw"); } } contract DividendTracker is DividendPayingToken { 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 immutable minimumTokenBalanceForDividends; event ExcludeFromDividends(address indexed account); event IncludeInDividends(address indexed account); event ClaimWaitUpdated(uint256 indexed newValue, uint256 indexed oldValue); event Claim(address indexed account, uint256 amount, bool indexed automatic); constructor() { claimWait = 1200; minimumTokenBalanceForDividends = 10000 * (10**18); //must hold 10,000+ tokens } function excludeFromDividends(address account) external onlyOwner { excludedFromDividends[account] = true; _setBalance(account, 0); tokenHoldersMap.remove(account); emit ExcludeFromDividends(account); } function includeInDividends(address account) external onlyOwner { require(excludedFromDividends[account]); excludedFromDividends[account] = false; emit IncludeInDividends(account); } function updateClaimWait(uint256 newClaimWait) external onlyOwner { require(newClaimWait >= 1200 && newClaimWait <= 86400, "Dividend_Tracker: claimWait must be updated to between 1 and 24 hours"); require(newClaimWait != claimWait, "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":"sniper","type":"address"}],"name":"BoughtEarly","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"duration","type":"uint256"}],"name":"BuybackMultiplierActive","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":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludedMaxTransactionAmount","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":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"HappyHour","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":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"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldWallet","type":"address"}],"name":"marketingWalletUpdated","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isExcludedMaxTransactionAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"enable","type":"bool"}],"name":"afterLaunchOn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"wallets","type":"address[]"},{"internalType":"uint256[]","name":"amountsInTokens","type":"uint256[]"}],"name":"airdropToWallets","outputs":[],"stateMutability":"nonpayable","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":"burnBuyFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burnSellFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"bnbAmountInWei","type":"uint256"}],"name":"buyBackTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"devBuyFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"devSellFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"devWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"disableTransferDelay","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 DividendTracker","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"earlyBuyPenaltyEnd","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromDividends","outputs":[],"stateMutability":"nonpayable","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":"updAds","type":"address"},{"internalType":"bool","name":"isEx","type":"bool"}],"name":"excludeFromMaxTransaction","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":"getNumberOfDividends","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalDividendsDistributed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"happyHourEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"enable","type":"bool"}],"name":"happyHourToggle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launchTaxUsed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"limitsInEffect","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityActiveBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityBuyFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquiditySellFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingBuyFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingSellFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTransactionAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWallet","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":"removeLimits","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"resetTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardsBuyFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardsSellFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pairaddress","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","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":"token","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForDev","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForMarketing","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalBuyFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSellFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingActiveBlock","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":[],"name":"transferDelayEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"_marketingFee","type":"uint256"},{"internalType":"uint256","name":"_rewardsFee","type":"uint256"},{"internalType":"uint256","name":"_liquidityFee","type":"uint256"},{"internalType":"uint256","name":"_devFee","type":"uint256"},{"internalType":"uint256","name":"_burnFee","type":"uint256"}],"name":"updateBuyFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"claimWait","type":"uint256"}],"name":"updateClaimWait","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newDevWallet","type":"address"}],"name":"updateDevWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"updateGasForProcessing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newMarketingWallet","type":"address"}],"name":"updateMarketingWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxWalletAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_marketingFee","type":"uint256"},{"internalType":"uint256","name":"_rewardsFee","type":"uint256"},{"internalType":"uint256","name":"_liquidityFee","type":"uint256"},{"internalType":"uint256","name":"_devFee","type":"uint256"},{"internalType":"uint256","name":"_burnFee","type":"uint256"}],"name":"updateSellFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"updateSwapEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawStuckEth","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
60c060405273062e66477faf219f25d27dced647bf57c3107d5260a0526000600d819055600e556010805462ffffff191660019081179091556012805460ff191690911790556023805461ffff19169055620493e06024553480156200006457600080fd5b5060408051808201825260068082526543524f42544360d01b602080840182815285518087019096529285528401528151919291620000a69160039162000ae7565b508051620000bc90600490602084019062000ae7565b5050506000620000d16200074660201b60201c565b600580546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506b033b2e3c9fd0803ce80000006103e86200013c82600562000bb1565b62000148919062000bd3565b600a556103e86200015b82600162000bb1565b62000167919062000bd3565b600b5560646200017982600262000bb1565b62000185919062000bd3565b600c5560096014819055600260158190556016819055601781905560188190559081908190620001b790829062000bf6565b620001c3919062000bf6565b620001cf919062000bf6565b620001db919062000bf6565b6013556009601a8190556001601b8190556002601c819055601d8290556000601e819055926200020d90839062000bf6565b62000219919062000bf6565b62000225919062000bf6565b62000231919062000bf6565b601955604051620002429062000b76565b604051809103906000f0801580156200025f573d6000803e3d6000fd5b50600780546001600160a01b03929092166001600160a01b031992831617905560088054821673cb9d40f3b78eb82412200795b295d09df3a28918179055600980549091167362a2f1852696cfcd18a81ec3e521a8700cb6e5f61790556040805163c45a015560e01b8152905173145677fc4d9b8f19b5d56d1820c48e0443049a3091600091839163c45a0155916004808301926020929190829003018186803b1580156200030d57600080fd5b505afa15801562000322573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000348919062000c11565b6001600160a01b031663c9c6539630846001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156200039157600080fd5b505afa158015620003a6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003cc919062000c11565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b1580156200041557600080fd5b505af11580156200042a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000450919062000c11565b600680546001600160a01b0319166001600160a01b038581169190911790915581166080529050620004848160016200074a565b60075460405163031e79db60e41b81526001600160a01b0390911660048201819052906331e79db090602401600060405180830381600087803b158015620004cb57600080fd5b505af1158015620004e0573d6000803e3d6000fd5b505060075460405163031e79db60e41b81523060048201526001600160a01b0390911692506331e79db09150602401600060405180830381600087803b1580156200052a57600080fd5b505af11580156200053f573d6000803e3d6000fd5b50506007546001600160a01b031691506331e79db09050620005696005546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401600060405180830381600087803b158015620005ab57600080fd5b505af1158015620005c0573d6000803e3d6000fd5b505060075460405163031e79db60e41b81526001600160a01b03868116600483015290911692506331e79db09150602401600060405180830381600087803b1580156200060c57600080fd5b505af115801562000621573d6000803e3d6000fd5b505060075460405163031e79db60e41b815261dead60048201526001600160a01b0390911692506331e79db09150602401600060405180830381600087803b1580156200066d57600080fd5b505af115801562000682573d6000803e3d6000fd5b50505050620006a26200069a6200081f60201b60201c565b60016200082e565b620006af3060016200082e565b620006be61dead60016200082e565b620006dd620006d56005546001600160a01b031690565b6001620008dd565b620006ea306001620008dd565b60075462000703906001600160a01b03166001620008dd565b62000710826001620008dd565b6200071f61dead6001620008dd565b6200073d620007366005546001600160a01b031690565b8462000981565b50505062000c79565b3390565b6001600160a01b0382166000908152602760205260409020805460ff19168215151790556200077a8282620008dd565b8015620007e35760075460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db090602401600060405180830381600087803b158015620007c957600080fd5b505af1158015620007de573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b6005546001600160a01b031690565b6005546001600160a01b031633146200087d5760405162461bcd60e51b81526020600482018190526024820152600080516020620070fe83398151915260448201526064015b60405180910390fd5b6001600160a01b038216600081815260256020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df791015b60405180910390a25050565b6005546001600160a01b03163314620009285760405162461bcd60e51b81526020600482018190526024820152600080516020620070fe833981519152604482015260640162000874565b6001600160a01b038216600081815260266020908152604091829020805460ff191685151590811790915591519182527f575f9d01836c9206322151b9e9ec3f2b77b87e71176933b9b44d2d732f768d959101620008d1565b6001600160a01b038216620009d95760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640162000874565b620009f58160025462000a7d60201b62002a2d1790919060201c565b6002556001600160a01b0382166000908152602081815260409091205462000a2891839062002a2d62000a7d821b17901c565b6001600160a01b038316600081815260208181526040808320949094559251848152919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b60008062000a8c838562000bf6565b90508381101562000ae05760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015260640162000874565b9392505050565b82805462000af59062000c3c565b90600052602060002090601f01602090048101928262000b19576000855562000b64565b82601f1062000b3457805160ff191683800117855562000b64565b8280016001018555821562000b64579182015b8281111562000b6457825182559160200191906001019062000b47565b5062000b7292915062000b84565b5090565b611b0c80620055f283390190565b5b8082111562000b72576000815560010162000b85565b634e487b7160e01b600052601160045260246000fd5b600081600019048311821515161562000bce5762000bce62000b9b565b500290565b60008262000bf157634e487b7160e01b600052601260045260246000fd5b500490565b6000821982111562000c0c5762000c0c62000b9b565b500190565b60006020828403121562000c2457600080fd5b81516001600160a01b038116811462000ae057600080fd5b600181811c9082168062000c5157607f821691505b6020821081141562000c7357634e487b7160e01b600052602260045260246000fd5b50919050565b60805160a05161493062000cc260003960008181610ebf01528181613a6a01528181613b18015261404101526000818161077501528181611b460152612e7501526149306000f3fe6080604052600436106104c45760003560e01c80638ea5220f11610276578063c876d0b91161014f578063ee40166e116100c1578063f54afa7811610085578063f54afa7814610e61578063f8b45b0514610e77578063fb37b5e714610e8d578063fc0c546a14610ead578063fc155d1d14610ee1578063ff935af614610f0157600080fd5b8063ee40166e14610dd6578063f170d7fd14610dec578063f27fd25414610e0c578063f2fde38b14610e2c578063f32383e914610e4c57600080fd5b8063dd62ed3e11610113578063dd62ed3e14610d1a578063e2f4560514610d60578063e7841ec014610d76578063e7f444b314610d8b578063e884f26014610da1578063e98030c714610db657600080fd5b8063c876d0b914610ca8578063c8c8ebe414610cc2578063ccb6135814610cd8578063ccd146b214610cee578063d0a3981414610d0457600080fd5b8063aacebbe3116101e8578063b9e93700116101ac578063b9e9370014610bf3578063bbc0c74214610c09578063c024666814610c28578063c0f306ef14610c48578063c18bc19514610c68578063c492f04614610c8857600080fd5b8063aacebbe314610b08578063ad56c13c14610b28578063b2159d0f14610b8d578063b45e83f814610bad578063b62496f514610bc357600080fd5b80639c1b8af51161023a5780639c1b8af514610a675780639fccce3214610a7d578063a26579ad14610a93578063a457c2d714610aa8578063a8b9d24014610ac8578063a9059cbb14610ae857600080fd5b80638ea5220f146109d35780639066876a146109f3578063924de9b714610a1257806395d89b4114610a325780639a7a23d614610a4757600080fd5b806349bd5a5e116103a8578063715018a61161031a5780637ae3ff47116102de5780637ae3ff471461093f5780637e761377146109555780637fa787ba1461096b578063871c128d146109805780638a8c523c146109a05780638da5cb5b146109b557600080fd5b8063715018a6146108c057806371778e7d146108d5578063751039fc146108ea5780637571336a146108ff57806375f0a8741461091f57600080fd5b806364b0f6531161036c57806364b0f65314610815578063680789521461082a5780636843cd84146108405780636ddd171314610860578063700bb1911461088057806370a08231146108a057600080fd5b806349bd5a5e146107635780634a62bb65146107975780634af6f7ee146107b15780634e71d92d146107c75780634fbee193146107dc57600080fd5b80631816467f1161044157806323b872dd1161040557806323b872dd146106b25780632c1f5216146106d257806330bb4cff146106f2578063313ce5671461070757806331e79db014610723578063395093511461074357600080fd5b80631816467f146106305780631a8145bb146106505780631f3fed8f146106665780631fc851bd1461067c5780632307b4411461069257600080fd5b80630fb0e354116104885780630fb0e35414610577578063106b5da11461059157806310d5de53146105b35780631694505e146105e357806318160ddd1461061b57600080fd5b806301143fea146104d057806306fdde03146104f9578063095ea7b31461051b578063099d0d301461054b5780630f4432e31461056157600080fd5b366104cb57005b600080fd5b3480156104dc57600080fd5b506104e6601d5481565b6040519081526020015b60405180910390f35b34801561050557600080fd5b5061050e610f21565b6040516104f091906140e7565b34801561052757600080fd5b5061053b610536366004614151565b610fb3565b60405190151581526020016104f0565b34801561055757600080fd5b506104e660165481565b34801561056d57600080fd5b506104e6600d5481565b34801561058357600080fd5b5060235461053b9060ff1681565b34801561059d57600080fd5b506105b16105ac36600461417d565b610fca565b005b3480156105bf57600080fd5b5061053b6105ce366004614196565b60266020526000908152604090205460ff1681565b3480156105ef57600080fd5b50600654610603906001600160a01b031681565b6040516001600160a01b0390911681526020016104f0565b34801561062757600080fd5b506002546104e6565b34801561063c57600080fd5b506105b161064b366004614196565b6110af565b34801561065c57600080fd5b506104e660215481565b34801561067257600080fd5b506104e660205481565b34801561068857600080fd5b506104e6600f5481565b34801561069e57600080fd5b506105b16106ad366004614289565b6110fb565b3480156106be57600080fd5b5061053b6106cd36600461434b565b6112f8565b3480156106de57600080fd5b50600754610603906001600160a01b031681565b3480156106fe57600080fd5b506104e6611361565b34801561071357600080fd5b50604051601281526020016104f0565b34801561072f57600080fd5b506105b161073e366004614196565b6113e3565b34801561074f57600080fd5b5061053b61075e366004614151565b611470565b34801561076f57600080fd5b506106037f000000000000000000000000000000000000000000000000000000000000000081565b3480156107a357600080fd5b5060105461053b9060ff1681565b3480156107bd57600080fd5b506104e6601a5481565b3480156107d357600080fd5b506105b16114a6565b3480156107e857600080fd5b5061053b6107f7366004614196565b6001600160a01b031660009081526025602052604090205460ff1690565b34801561082157600080fd5b506104e661152d565b34801561083657600080fd5b506104e6601b5481565b34801561084c57600080fd5b506104e661085b366004614196565b611572565b34801561086c57600080fd5b5060105461053b9062010000900460ff1681565b34801561088c57600080fd5b506105b161089b36600461417d565b6115f1565b3480156108ac57600080fd5b506104e66108bb366004614196565b6116d2565b3480156108cc57600080fd5b506105b16116ed565b3480156108e157600080fd5b506104e6611761565b3480156108f657600080fd5b5061053b6117a6565b34801561090b57600080fd5b506105b161091a36600461439a565b6117ef565b34801561092b57600080fd5b50600854610603906001600160a01b031681565b34801561094b57600080fd5b506104e6601e5481565b34801561096157600080fd5b506104e660185481565b34801561097757600080fd5b506105b1611879565b34801561098c57600080fd5b506105b161099b36600461417d565b611930565b3480156109ac57600080fd5b506105b1611a74565b3480156109c157600080fd5b506005546001600160a01b0316610603565b3480156109df57600080fd5b50600954610603906001600160a01b031681565b3480156109ff57600080fd5b5060235461053b90610100900460ff1681565b348015610a1e57600080fd5b506105b1610a2d3660046143d3565b611ac5565b348015610a3e57600080fd5b5061050e611b0b565b348015610a5357600080fd5b506105b1610a6236600461439a565b611b1a565b348015610a7357600080fd5b506104e660245481565b348015610a8957600080fd5b506104e660225481565b348015610a9f57600080fd5b506104e6611c08565b348015610ab457600080fd5b5061053b610ac3366004614151565b611c4d565b348015610ad457600080fd5b506104e6610ae3366004614196565b611c9c565b348015610af457600080fd5b5061053b610b03366004614151565b611ccf565b348015610b1457600080fd5b506105b1610b23366004614196565b611cdc565b348015610b3457600080fd5b50610b48610b43366004614196565b611d6e565b604080516001600160a01b0390991689526020890197909752958701949094526060860192909252608085015260a084015260c083015260e0820152610100016104f0565b348015610b9957600080fd5b506105b1610ba83660046143d3565b611e18565b348015610bb957600080fd5b506104e660175481565b348015610bcf57600080fd5b5061053b610bde366004614196565b60276020526000908152604090205460ff1681565b348015610bff57600080fd5b506104e660195481565b348015610c1557600080fd5b5060105461053b90610100900460ff1681565b348015610c3457600080fd5b506105b1610c4336600461439a565b612030565b348015610c5457600080fd5b506105b1610c63366004614196565b6120b2565b348015610c7457600080fd5b506105b1610c8336600461417d565b61210e565b348015610c9457600080fd5b506105b1610ca33660046143f0565b6121dc565b348015610cb457600080fd5b5060125461053b9060ff1681565b348015610cce57600080fd5b506104e6600a5481565b348015610ce457600080fd5b506104e6601c5481565b348015610cfa57600080fd5b506104e660145481565b348015610d1057600080fd5b506104e660135481565b348015610d2657600080fd5b506104e6610d35366004614476565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b348015610d6c57600080fd5b506104e6600b5481565b348015610d8257600080fd5b506104e66122b8565b348015610d9757600080fd5b506104e660155481565b348015610dad57600080fd5b5061053b6122fd565b348015610dc257600080fd5b506105b1610dd136600461417d565b61233a565b348015610de257600080fd5b506104e6600e5481565b348015610df857600080fd5b506105b1610e073660046144a4565b612395565b348015610e1857600080fd5b50610b48610e2736600461417d565b612458565b348015610e3857600080fd5b506105b1610e47366004614196565b61249a565b348015610e5857600080fd5b506105b1612585565b348015610e6d57600080fd5b506104e6601f5481565b348015610e8357600080fd5b506104e6600c5481565b348015610e9957600080fd5b506105b1610ea83660046143d3565b61264d565b348015610eb957600080fd5b506106037f000000000000000000000000000000000000000000000000000000000000000081565b348015610eed57600080fd5b506105b1610efc36600461417d565b6127dd565b348015610f0d57600080fd5b506105b1610f1c3660046144a4565b612969565b606060038054610f30906144df565b80601f0160208091040260200160405190810160405280929190818152602001828054610f5c906144df565b8015610fa95780601f10610f7e57610100808354040283529160200191610fa9565b820191906000526020600020905b815481529060010190602001808311610f8c57829003601f168201915b5050505050905090565b6000610fc0338484612a93565b5060015b92915050565b6005546001600160a01b03163314610ffd5760405162461bcd60e51b8152600401610ff49061451a565b60405180910390fd5b670de0b6b3a76400006103e861101260025490565b61101d906005614565565b6110279190614584565b6110319190614584565b81116110975760405162461bcd60e51b815260206004820152602f60248201527f43616e6e6f7420736574206d61785472616e73616374696f6e416d6f756e742060448201526e6c6f776572207468616e20302e352560881b6064820152608401610ff4565b6110a981670de0b6b3a7640000614565565b600a5550565b6005546001600160a01b031633146110d95760405162461bcd60e51b8152600401610ff49061451a565b600980546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b031633146111255760405162461bcd60e51b8152600401610ff49061451a565b80518251146111765760405162461bcd60e51b815260206004820152601e60248201527f617272617973206d757374206265207468652073616d65206c656e67746800006044820152606401610ff4565b60c88251106111e65760405162461bcd60e51b815260206004820152603660248201527f43616e206f6e6c792061697264726f70203230302077616c6c657473207065726044820152752074786e2064756520746f20676173206c696d69747360501b6064820152608401610ff4565b60005b82518110156112f35761122f33848381518110611208576112086145a6565b6020026020010151848481518110611222576112226145a6565b6020026020010151612bb8565b60075483516001600160a01b039091169063e30443bc90859084908110611258576112586145a6565b6020026020010151611282868581518110611275576112756145a6565b60200260200101516116d2565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b1580156112c857600080fd5b505af11580156112dc573d6000803e3d6000fd5b5050505080806112eb906145bc565b9150506111e9565b505050565b6000611305848484612cc1565b6113578433611352856040518060600160405280602881526020016148ae602891396001600160a01b038a16600090815260016020908152604080832033845290915290205491906136fd565b612a93565b5060019392505050565b600754604080516342d359d760e11b815290516000926001600160a01b0316916385a6b3ae916004808301926020929190829003018186803b1580156113a657600080fd5b505afa1580156113ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113de91906145d7565b905090565b6005546001600160a01b0316331461140d5760405162461bcd60e51b8152600401610ff49061451a565b60075460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db0906024015b600060405180830381600087803b15801561145557600080fd5b505af1158015611469573d6000803e3d6000fd5b5050505050565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610fc09185906113529086612a2d565b60075460405163bc4c4b3760e01b8152336004820152600060248201526001600160a01b039091169063bc4c4b3790604401602060405180830381600087803b1580156114f257600080fd5b505af1158015611506573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061152a91906145f0565b50565b600754604080516304ddf6ef60e11b815290516000926001600160a01b0316916309bbedde916004808301926020929190829003018186803b1580156113a657600080fd5b60075460405163156dbbf560e31b81526001600160a01b038381166004830152600092169063ab6ddfa8906024015b60206040518083038186803b1580156115b957600080fd5b505afa1580156115cd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fc491906145d7565b6007546040516001624d3b8760e01b0319815260048101839052600091829182916001600160a01b03169063ffb2c47990602401606060405180830381600087803b15801561163f57600080fd5b505af1158015611653573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611677919061460d565b604080518481526020810184905290810182905260608101889052929550909350915032906000907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a350505050565b6001600160a01b031660009081526020819052604090205490565b6005546001600160a01b031633146117175760405162461bcd60e51b8152600401610ff49061451a565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b6007546040805163ad7a672f60e01b815290516000926001600160a01b03169163ad7a672f916004808301926020929190829003018186803b1580156113a657600080fd5b6005546000906001600160a01b031633146117d35760405162461bcd60e51b8152600401610ff49061451a565b506010805460ff19908116909155601280549091169055600190565b6005546001600160a01b031633146118195760405162461bcd60e51b8152600401610ff49061451a565b6001600160a01b038216600081815260266020908152604091829020805460ff191685151590811790915591519182527f575f9d01836c9206322151b9e9ec3f2b77b87e71176933b9b44d2d732f768d9591015b60405180910390a25050565b6005546001600160a01b031633146118a35760405162461bcd60e51b8152600401610ff49061451a565b604051600090339047908381818185875af1925050503d80600081146118e5576040519150601f19603f3d011682016040523d82523d6000602084013e6118ea565b606091505b505090508061152a5760405162461bcd60e51b81526020600482015260126024820152716661696c656420746f20776974686472617760701b6044820152606401610ff4565b6005546001600160a01b0316331461195a5760405162461bcd60e51b8152600401610ff49061451a565b62030d4081101580156119705750620b71b08111155b6119da5760405162461bcd60e51b815260206004820152603560248201527f20676173466f7250726f63657373696e67206d7573742062652062657477656560448201527406e203230302c30303020616e64203530302c30303605c1b6064820152608401610ff4565b602454811415611a415760405162461bcd60e51b815260206004820152602c60248201527f43616e6e6f742075706461746520676173466f7250726f63657373696e67207460448201526b6f2073616d652076616c756560a01b6064820152608401610ff4565b60245460405182907f40d7e40e79af4e8e5a9b3c57030d8ea93f13d669c06d448c4d631d4ae7d23db790600090a3602455565b6005546001600160a01b03163314611a9e5760405162461bcd60e51b8152600401610ff49061451a565b6010805462ffff0019166201010017905543600e55611ac0426203f48061463b565b600f55565b6005546001600160a01b03163314611aef5760405162461bcd60e51b8152600401610ff49061451a565b60108054911515620100000262ff000019909216919091179055565b606060048054610f30906144df565b6005546001600160a01b03163314611b445760405162461bcd60e51b8152600401610ff49061451a565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415611bfa5760405162461bcd60e51b815260206004820152604560248201527f5468652050616e63616b655377617020706169722063616e6e6f74206265207260448201527f656d6f7665642066726f6d206175746f6d617465644d61726b65744d616b6572606482015264506169727360d81b608482015260a401610ff4565b611c048282613737565b5050565b60075460408051631bc9e27b60e21b815290516000926001600160a01b031691636f2789ec916004808301926020929190829003018186803b1580156113a657600080fd5b6000610fc03384611352856040518060600160405280602581526020016148d6602591393360009081526001602090815260408083206001600160a01b038d16845290915290205491906136fd565b6007546040516302a2e74960e61b81526001600160a01b038381166004830152600092169063a8b9d240906024016115a1565b6000610fc0338484612cc1565b6005546001600160a01b03163314611d065760405162461bcd60e51b8152600401610ff49061451a565b611d11816001612030565b6008546040516001600160a01b03918216918316907fa751787977eeb3902e30e1d19ca00c6ad274a1f622c31a206e32366700b0567490600090a3600880546001600160a01b0319166001600160a01b0392909216919091179055565b60075460405163fbcbc0f160e01b81526001600160a01b038381166004830152600092839283928392839283928392839291169063fbcbc0f1906024015b6101006040518083038186803b158015611dc557600080fd5b505afa158015611dd9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dfd9190614653565b97509750975097509750975097509750919395975091939597565b6005546001600160a01b03163314611e425760405162461bcd60e51b8152600401610ff49061451a565b60235460ff1615158115151415611e9b5760405162461bcd60e51b815260206004820152601c60248201527f416c72656164792073657420746f20746869732073657474696e672e000000006044820152606401610ff4565b8015611f4c576023805460ff19166001179055600a60148190556009601581905560026016819055601781905560188190559182918291611edc919061463b565b611ee6919061463b565b611ef0919061463b565b611efa919061463b565b6013556001601a819055601b819055601c819055601d8190556000601e8190559080611f26818061463b565b611f30919061463b565b611f3a919061463b565b611f44919061463b565b601955611ff8565b80611ff8576023805460ff1916905560096014819055600260158190556016819055601781905560188190559081908190611f8890829061463b565b611f92919061463b565b611f9c919061463b565b611fa6919061463b565b6013556009601a8190556001601b8190556002601c819055601d8290556000601e81905592611fd690839061463b565b611fe0919061463b565b611fea919061463b565b611ff4919061463b565b6019555b60405181151581527fcb94f18351a6190da0f2aac99d5061a1dc8f04e23d3a9ce8e6c58b47064d6b6c9060200160405180910390a150565b6005546001600160a01b0316331461205a5760405162461bcd60e51b8152600401610ff49061451a565b6001600160a01b038216600081815260256020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910161186d565b6005546001600160a01b031633146120dc5760405162461bcd60e51b8152600401610ff49061451a565b60075460405163c0f306ef60e01b81526001600160a01b0383811660048301529091169063c0f306ef9060240161143b565b6005546001600160a01b031633146121385760405162461bcd60e51b8152600401610ff49061451a565b670de0b6b3a7640000606461214c60025490565b612157906001614565565b6121619190614584565b61216b9190614584565b81116121c45760405162461bcd60e51b815260206004820152602260248201527f43616e6e6f7420736574206d617857616c6c6574206c6f776572207468616e20604482015261312560f01b6064820152608401610ff4565b6121d681670de0b6b3a7640000614565565b600c5550565b6005546001600160a01b031633146122065760405162461bcd60e51b8152600401610ff49061451a565b60005b82811015612277578160256000868685818110612228576122286145a6565b905060200201602081019061223d9190614196565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790558061226f816145bc565b915050612209565b507f7fdaf542373fa84f4ee8d662c642f44e4c2276a217d7d29e548b6eb29a233b358383836040516122ab939291906146bd565b60405180910390a1505050565b6007546040805163039e107b60e61b815290516000926001600160a01b03169163e7841ec0916004808301926020929190829003018186803b1580156113a657600080fd5b6005546000906001600160a01b0316331461232a5760405162461bcd60e51b8152600401610ff49061451a565b506012805460ff19169055600190565b6005546001600160a01b031633146123645760405162461bcd60e51b8152600401610ff49061451a565b60075460405163e98030c760e01b8152600481018390526001600160a01b039091169063e98030c79060240161143b565b6005546001600160a01b031633146123bf5760405162461bcd60e51b8152600401610ff49061451a565b601b859055601a849055601c839055601d829055601e8190558082846123e5878961463b565b6123ef919061463b565b6123f9919061463b565b612403919061463b565b6019819055601410156114695760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420323025206f72206c6573730000006044820152606401610ff4565b600754604051635183d6fd60e01b81526004810183905260009182918291829182918291829182916001600160a01b0390911690635183d6fd90602401611dac565b6005546001600160a01b031633146124c45760405162461bcd60e51b8152600401610ff49061451a565b6001600160a01b0381166125295760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610ff4565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b031633146125af5760405162461bcd60e51b8152600401610ff49061451a565b600960148190556002601581905560168190556017819055601881905590819081906125dc90829061463b565b6125e6919061463b565b6125f0919061463b565b6125fa919061463b565b6013556009601a8190556001601b8190556002601c819055601d8290556000601e8190559261262a90839061463b565b612634919061463b565b61263e919061463b565b612648919061463b565b601955565b6005546001600160a01b031633146126775760405162461bcd60e51b8152600401610ff49061451a565b602354610100900460ff16158061268c575080155b6126ec5760405162461bcd60e51b815260206004820152602b60248201527f416c72656164792075736564204c61756e6368207461782c2063616e6e6f742060448201526a31b0b6361030b3b0b4b71760a91b6064820152608401610ff4565b80156127a1576023805461ff00191661010017905560096014819055600560158190556002601681905560178190556018819055918291829161272f919061463b565b612739919061463b565b612743919061463b565b61274d919061463b565b6013556009601a8190556001601b8190556002601c819055601d8290556000601e8190559261277d90839061463b565b612787919061463b565b612791919061463b565b61279b919061463b565b60195550565b8061152a576023805460ff191690556009601481905560026015819055601681905560178190556018819055908190819061272f90829061463b565b6005546001600160a01b031633146128075760405162461bcd60e51b8152600401610ff49061451a565b6040805160028082526060820183526000926020830190803683375050600654604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c464892506004808301926020929190829003018186803b15801561286c57600080fd5b505afa158015612880573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128a49190614716565b816000815181106128b7576128b76145a6565b60200260200101906001600160a01b031690816001600160a01b03168152505030816001815181106128eb576128eb6145a6565b6001600160a01b03928316602091820292909201015260065460405163b6f9de9560e01b815291169063b6f9de9590849061293390600090869061dead904290600401614777565b6000604051808303818588803b15801561294c57600080fd5b505af1158015612960573d6000803e3d6000fd5b50505050505050565b6005546001600160a01b031633146129935760405162461bcd60e51b8152600401610ff49061451a565b601585905560148490556016839055601782905560188190558082846129b9878961463b565b6129c3919061463b565b6129cd919061463b565b6129d7919061463b565b601355601954601e10156114695760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420333025206f72206c6573730000006044820152606401610ff4565b600080612a3a838561463b565b905083811015612a8c5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610ff4565b9392505050565b6001600160a01b038316612af55760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610ff4565b6001600160a01b038216612b565760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610ff4565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b038316612bde5760405162461bcd60e51b8152600401610ff4906147ac565b6001600160a01b038216612c045760405162461bcd60e51b8152600401610ff4906147f1565b612c4181604051806060016040528060268152602001614888602691396001600160a01b03861660009081526020819052604090205491906136fd565b6001600160a01b038085166000908152602081905260408082209390935590841681522054612c709082612a2d565b6001600160a01b038381166000818152602081815260409182902094909455518481529092918616917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101612bab565b6001600160a01b038316612ce75760405162461bcd60e51b8152600401610ff4906147ac565b6001600160a01b038216612d0d5760405162461bcd60e51b8152600401610ff4906147f1565b80612d1e576112f383836000612bb8565b601054610100900460ff16612db8576001600160a01b03831660009081526025602052604090205460ff1680612d6c57506001600160a01b03821660009081526025602052604090205460ff165b612db85760405162461bcd60e51b815260206004820152601a60248201527f54726164696e67206973206e6f7420616374697665207965742e0000000000006044820152606401610ff4565b60105460ff1615613142576005546001600160a01b03848116911614801590612def57506005546001600160a01b03838116911614155b8015612e0357506001600160a01b03821615155b8015612e1a57506001600160a01b03821661dead14155b8015612e305750600654600160a01b900460ff16155b156131425760125460ff1615612f58576005546001600160a01b03838116911614801590612e6c57506006546001600160a01b03838116911614155b8015612eaa57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614155b15612f5857326000908152601160205260409020544311612f455760405162461bcd60e51b815260206004820152604960248201527f5f7472616e736665723a3a205472616e736665722044656c617920656e61626c60448201527f65642e20204f6e6c79206f6e652070757263686173652070657220626c6f636b6064820152681030b63637bbb2b21760b91b608482015260a401610ff4565b3260009081526011602052604090204390555b6001600160a01b03831660009081526027602052604090205460ff168015612f9957506001600160a01b03821660009081526026602052604090205460ff16155b1561300757600c54612faa836116d2565b612fb4908361463b565b11156130025760405162461bcd60e51b815260206004820152601b60248201527f556e61626c6520746f20657863656564204d61782057616c6c657400000000006044820152606401610ff4565b613142565b6001600160a01b03821660009081526027602052604090205460ff16801561304857506001600160a01b03831660009081526026602052604090205460ff16155b156130be57600a548111156130025760405162461bcd60e51b815260206004820152603660248201527f53656c6c207472616e7366657220616d6f756e742065786365656473207468656044820152751036b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760511b6064820152608401610ff4565b6001600160a01b03821660009081526026602052604090205460ff1661314257600c546130ea836116d2565b6130f4908361463b565b11156131425760405162461bcd60e51b815260206004820152601b60248201527f556e61626c6520746f20657863656564204d61782057616c6c657400000000006044820152606401610ff4565b600061314d306116d2565b600b549091508110801590819061316c575060105462010000900460ff165b80156131825750600654600160a01b900460ff16155b80156131a757506001600160a01b03851660009081526027602052604090205460ff16155b80156131cc57506001600160a01b03851660009081526025602052604090205460ff16155b80156131f157506001600160a01b03841660009081526025602052604090205460ff16155b1561321f576006805460ff60a01b1916600160a01b179055613211613807565b6006805460ff60a01b191690555b6006546001600160a01b03861660009081526025602052604090205460ff600160a01b90920482161591168061326d57506001600160a01b03851660009081526025602052604090205460ff165b15613276575060005b6000808215613518576001600160a01b03871660009081526027602052604090205460ff1680156132a957506000601354115b156133b4576132ce60646132c860135489613c4390919063ffffffff16565b90613cc2565b9150601354601454836132e19190614565565b6132eb9190614584565b601f60008282546132fc919061463b565b90915550506013546016546133119084614565565b61331b9190614584565b6021600082825461332c919061463b565b90915550506013546018546133419084614565565b61334b9190614584565b90506013546017548361335e9190614565565b6133689190614584565b60226000828254613379919061463b565b909155505060135460155461338e9084614565565b6133989190614584565b602060008282546133a9919061463b565b909155506134de9050565b6001600160a01b03881660009081526027602052604090205460ff1680156133de57506000601954115b156134de576133fd60646132c860195489613c4390919063ffffffff16565b9150601954601a54836134109190614565565b61341a9190614584565b601f600082825461342b919061463b565b9091555050601954601c546134409084614565565b61344a9190614584565b6021600082825461345b919061463b565b9091555050601954601e546134709084614565565b61347a9190614584565b9050601954601d548361348d9190614565565b6134979190614584565b602260008282546134a8919061463b565b9091555050601954601b546134bd9084614565565b6134c79190614584565b602060008282546134d8919061463b565b90915550505b80156134f1576134f18861dead83612bb8565b811561350b5761350b88306135068486614834565b612bb8565b6135158287614834565b95505b613523888888612bb8565b6007546001600160a01b031663e30443bc8961353e816116d2565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561358457600080fd5b505af1925050508015613595575060015b506007546001600160a01b031663e30443bc886135b1816116d2565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b1580156135f757600080fd5b505af1925050508015613608575060015b50600654600160a01b900460ff166136f357602480546007546040516001624d3b8760e01b031981526004810183905291926001600160a01b039091169163ffb2c4799101606060405180830381600087803b15801561366757600080fd5b505af1925050508015613697575060408051601f3d908101601f191682019092526136949181019061460d565b60015b6136a0576136f1565b60408051848152602081018490529081018290526060810185905232906001907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a35050505b505b5050505050505050565b600081848411156137215760405162461bcd60e51b8152600401610ff491906140e7565b50600061372e8486614834565b95945050505050565b6001600160a01b0382166000908152602760205260409020805460ff191682151517905561376582826117ef565b80156137cb5760075460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db090602401600060405180830381600087803b1580156137b257600080fd5b505af11580156137c6573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b6000613812306116d2565b90506000602254601f5460205460215461382c919061463b565b613836919061463b565b613840919061463b565b905081158061384d575080155b15613856575050565b6000600282602154856138699190614565565b6138739190614584565b61387d9190614584565b9050600061388b8483613d04565b90504761389782613d46565b60006138a34783613d04565b905060006138c0866132c860205485613c4390919063ffffffff16565b905060006138dd876132c860225486613c4390919063ffffffff16565b905060006138fa886132c8601f5487613c4390919063ffffffff16565b90506000818361390a8688614834565b6139149190614834565b61391e9190614834565b600060218190556020819055601f819055602281905560085460405192935090916001600160a01b039091169086908381818185875af1925050503d8060008114613985576040519150601f19603f3d011682016040523d82523d6000602084013e61398a565b606091505b50506009546040519192506001600160a01b0316908590600081818185875af1925050503d80600081146139da576040519150601f19603f3d011682016040523d82523d6000602084013e6139df565b606091505b509091505088158015906139f35750600082115b15613a4657613a028983613eaf565b602154604080518a81526020810185905280820192909252517f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619181900360600190a15b479250613a5283613f69565b6040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a082319060240160206040518083038186803b158015613ab457600080fd5b505afa158015613ac8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613aec91906145d7565b60075460405163a9059cbb60e01b81526001600160a01b039182166004820152602481018390529192507f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb90604401602060405180830381600087803b158015613b5c57600080fd5b505af1158015613b70573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b9491906145f0565b91508115613c355760075460405163b0c7ce3760e01b8152600481018390526001600160a01b039091169063b0c7ce3790602401600060405180830381600087803b158015613be257600080fd5b505af1158015613bf6573d6000803e3d6000fd5b505060408051848152602081018890527f80195cc573b02cc48460cbca6e6e4cc85ddb91959d946e1c3025ea3d87942dc3935001905060405180910390a15b505050505050505050505050565b600082613c5257506000610fc4565b6000613c5e8385614565565b905082613c6b8583614584565b14612a8c5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610ff4565b6000612a8c83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506140b9565b6000612a8c83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506136fd565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110613d7b57613d7b6145a6565b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b158015613dcf57600080fd5b505afa158015613de3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e079190614716565b81600181518110613e1a57613e1a6145a6565b6001600160a01b039283166020918202929092010152600654613e409130911684612a93565b60065460405163791ac94760e01b81526001600160a01b039091169063791ac94790613e7990859060009086903090429060040161484b565b600060405180830381600087803b158015613e9357600080fd5b505af1158015613ea7573d6000803e3d6000fd5b505050505050565b600654613ec79030906001600160a01b031684612a93565b60065460405163f305d71960e01b815230600482015260248101849052600060448201819052606482015261dead60848201524260a48201526001600160a01b039091169063f305d71990839060c4016060604051808303818588803b158015613f3057600080fd5b505af1158015613f44573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611469919061460d565b801561152a576040805160028082526060820183526000926020830190803683375050600654604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c464892506004808301926020929190829003018186803b158015613fd457600080fd5b505afa158015613fe8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061400c9190614716565b8160008151811061401f5761401f6145a6565b60200260200101906001600160a01b031690816001600160a01b0316815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110614073576140736145a6565b6001600160a01b03928316602091820292909201015260065460405163b6f9de9560e01b815291169063b6f9de9590849061293390600090869030904290600401614777565b600081836140da5760405162461bcd60e51b8152600401610ff491906140e7565b50600061372e8486614584565b600060208083528351808285015260005b81811015614114578581018301518582016040015282016140f8565b81811115614126576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b038116811461152a57600080fd5b6000806040838503121561416457600080fd5b823561416f8161413c565b946020939093013593505050565b60006020828403121561418f57600080fd5b5035919050565b6000602082840312156141a857600080fd5b8135612a8c8161413c565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156141f2576141f26141b3565b604052919050565b600067ffffffffffffffff821115614214576142146141b3565b5060051b60200190565b600082601f83011261422f57600080fd5b8135602061424461423f836141fa565b6141c9565b82815260059290921b8401810191818101908684111561426357600080fd5b8286015b8481101561427e5780358352918301918301614267565b509695505050505050565b6000806040838503121561429c57600080fd5b823567ffffffffffffffff808211156142b457600080fd5b818501915085601f8301126142c857600080fd5b813560206142d861423f836141fa565b82815260059290921b840181019181810190898411156142f757600080fd5b948201945b8386101561431e57853561430f8161413c565b825294820194908201906142fc565b9650508601359250508082111561433457600080fd5b506143418582860161421e565b9150509250929050565b60008060006060848603121561436057600080fd5b833561436b8161413c565b9250602084013561437b8161413c565b929592945050506040919091013590565b801515811461152a57600080fd5b600080604083850312156143ad57600080fd5b82356143b88161413c565b915060208301356143c88161438c565b809150509250929050565b6000602082840312156143e557600080fd5b8135612a8c8161438c565b60008060006040848603121561440557600080fd5b833567ffffffffffffffff8082111561441d57600080fd5b818601915086601f83011261443157600080fd5b81358181111561444057600080fd5b8760208260051b850101111561445557600080fd5b6020928301955093505084013561446b8161438c565b809150509250925092565b6000806040838503121561448957600080fd5b82356144948161413c565b915060208301356143c88161413c565b600080600080600060a086880312156144bc57600080fd5b505083359560208501359550604085013594606081013594506080013592509050565b600181811c908216806144f357607f821691505b6020821081141561451457634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600081600019048311821515161561457f5761457f61454f565b500290565b6000826145a157634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052603260045260246000fd5b60006000198214156145d0576145d061454f565b5060010190565b6000602082840312156145e957600080fd5b5051919050565b60006020828403121561460257600080fd5b8151612a8c8161438c565b60008060006060848603121561462257600080fd5b8351925060208401519150604084015190509250925092565b6000821982111561464e5761464e61454f565b500190565b600080600080600080600080610100898b03121561467057600080fd5b885161467b8161413c565b809850506020890151965060408901519550606089015194506080890151935060a0890151925060c0890151915060e089015190509295985092959890939650565b6040808252810183905260008460608301825b868110156147005782356146e38161413c565b6001600160a01b03168252602092830192909101906001016146d0565b5080925050508215156020830152949350505050565b60006020828403121561472857600080fd5b8151612a8c8161413c565b600081518084526020808501945080840160005b8381101561476c5781516001600160a01b031687529582019590820190600101614747565b509495945050505050565b8481526080602082015260006147906080830186614733565b6001600160a01b03949094166040830152506060015292915050565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b6000828210156148465761484661454f565b500390565b85815284602082015260a06040820152600061486a60a0830186614733565b6001600160a01b039490941660608301525060800152939250505056fe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220b7c0e2f095b3fb1e8e3fe2ed965df02bcd967f983af58d350b55be93e47d279864736f6c6343000809003360c060405273062e66477faf219f25d27dced647bf57c3107d5260805234801561002857600080fd5b50600080546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506104b0600e5569021e19e0c9bab240000060a05260805160a051611a5b6100b1600039600081816104c10152610c4a0152600081816105aa01526114a30152611a5b6000f3fe6080604052600436106101c65760003560e01c8063a8b9d240116100f7578063c0f306ef11610095578063f2fde38b11610064578063f2fde38b14610558578063fbcbc0f114610578578063fc0c546a14610598578063ffb2c479146105cc57600080fd5b8063c0f306ef146104e3578063e30443bc14610503578063e7841ec014610523578063e98030c71461053857600080fd5b8063ad7a672f116100d1578063ad7a672f14610459578063b0c7ce371461046f578063bc4c4b371461048f578063be10b614146104af57600080fd5b8063a8b9d240146103d6578063aafd847a146103f6578063ab6ddfa81461042c57600080fd5b80635183d6fd11610164578063715018a61161013e578063715018a61461035957806385a6b3ae1461036e5780638da5cb5b1461038457806391b89fba146103b657600080fd5b80635183d6fd146102c95780636a4740021461032e5780636f2789ec1461034357600080fd5b806327ce0147116101a057806327ce0147146102335780633009a6091461025357806331e79db0146102695780634e7b827f1461028957600080fd5b806303c83302146101da57806309bbedde146101e2578063226cfa3d1461020657600080fd5b366101d5576101d3610607565b005b600080fd5b6101d3610607565b3480156101ee57600080fd5b506007545b6040519081526020015b60405180910390f35b34801561021257600080fd5b506101f3610221366004611768565b600d6020526000908152604090205481565b34801561023f57600080fd5b506101f361024e366004611768565b61067a565b34801561025f57600080fd5b506101f3600b5481565b34801561027557600080fd5b506101d3610284366004611768565b6106dd565b34801561029557600080fd5b506102b96102a4366004611768565b600c6020526000908152604090205460ff1681565b60405190151581526020016101fd565b3480156102d557600080fd5b506102e96102e4366004611785565b6107de565b604080516001600160a01b0390991689526020890197909752958701949094526060860192909252608085015260a084015260c083015260e0820152610100016101fd565b34801561033a57600080fd5b506101d3610950565b34801561034f57600080fd5b506101f3600e5481565b34801561036557600080fd5b506101d361095c565b34801561037a57600080fd5b506101f360065481565b34801561039057600080fd5b506000546001600160a01b03165b6040516001600160a01b0390911681526020016101fd565b3480156103c257600080fd5b506101f36103d1366004611768565b6109d0565b3480156103e257600080fd5b506101f36103f1366004611768565b6109d7565b34801561040257600080fd5b506101f3610411366004611768565b6001600160a01b031660009081526003602052604090205490565b34801561043857600080fd5b506101f3610447366004611768565b60046020526000908152604090205481565b34801561046557600080fd5b506101f360055481565b34801561047b57600080fd5b506101d361048a366004611785565b610a03565b34801561049b57600080fd5b506102b96104aa3660046117ac565b610ab5565b3480156104bb57600080fd5b506101f37f000000000000000000000000000000000000000000000000000000000000000081565b3480156104ef57600080fd5b506101d36104fe366004611768565b610b61565b34801561050f57600080fd5b506101d361051e3660046117e5565b610bf9565b34801561052f57600080fd5b50600b546101f3565b34801561054457600080fd5b506101d3610553366004611785565b610d85565b34801561056457600080fd5b506101d3610573366004611768565b610eef565b34801561058457600080fd5b506102e9610593366004611768565b610fd9565b3480156105a457600080fd5b5061039e7f000000000000000000000000000000000000000000000000000000000000000081565b3480156105d857600080fd5b506105ec6105e7366004611785565b611151565b604080519384526020840192909252908201526060016101fd565b60405162461bcd60e51b815260206004820152603a60248201527f43616e6e6f742073656e6420424e42206469726563746c7920746f207472616360448201527f6b657220617320697420697320756e7265636f76657261626c6500000000000060648201526084015b60405180910390fd5b6001600160a01b0381166000908152600260209081526040808320546004909252822054600154600160801b926106cd926106c8926106c2916106bd919061126c565b6112f2565b90611302565b611340565b6106d79190611827565b92915050565b6000546001600160a01b031633146107075760405162461bcd60e51b815260040161067190611849565b6001600160a01b0381166000908152600c60205260408120805460ff19166001179055610735908290611353565b60405163131836e760e21b8152600760048201526001600160a01b038216602482015273eb8f24ad682e40ceca006a453e34ec67845f959690634c60db9c9060440160006040518083038186803b15801561078f57600080fd5b505af41580156107a3573d6000803e3d6000fd5b50506040516001600160a01b03841692507fa878b31040b2e6d0a9a3d3361209db3908ba62014b0dca52adbaee451d128b259150600090a250565b600080600080600080600080600773eb8f24ad682e40ceca006a453e34ec67845f959663deb3d89690916040518263ffffffff1660e01b815260040161082691815260200190565b60206040518083038186803b15801561083e57600080fd5b505af4158015610852573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610876919061187e565b891061089b575060009650600019955085945086935083925082915081905080610945565b6040516368d54f3f60e11b815260076004820152602481018a905260009073eb8f24ad682e40ceca006a453e34ec67845f95969063d1aa9e7e9060440160206040518083038186803b1580156108f057600080fd5b505af4158015610904573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109289190611897565b905061093381610fd9565b98509850985098509850985098509850505b919395975091939597565b610959336113ec565b50565b6000546001600160a01b031633146109865760405162461bcd60e51b815260040161067190611849565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b60006106d7825b6001600160a01b0381166000908152600360205260408120546106d7906109fd8461067a565b90611580565b6000546001600160a01b03163314610a2d5760405162461bcd60e51b815260040161067190611849565b600060055411610a3c57600080fd5b801561095957600554610a6a90610a5783600160801b61126c565b610a619190611827565b600154906115c2565b60015560405181815233907fa493a9229478c3fcd73f66d2cdeb7f94fd0f341da924d1054236d784541165119060200160405180910390a2600654610aaf90826115c2565b60065550565b600080546001600160a01b03163314610ae05760405162461bcd60e51b815260040161067190611849565b6000610aeb846113ec565b90508015610b57576001600160a01b0384166000818152600d6020526040908190204290555184151591907fa2c38e2d2fb7e3e1912d937fd1ca11ed6d51864dee4cfa7a7bf02becd7acf09290610b459085815260200190565b60405180910390a360019150506106d7565b5060009392505050565b6000546001600160a01b03163314610b8b5760405162461bcd60e51b815260040161067190611849565b6001600160a01b0381166000908152600c602052604090205460ff16610bb057600080fd5b6001600160a01b0381166000818152600c6020526040808220805460ff19169055517f40a78dcf8526b72f2eaf598af1c7e49c8d5fc577f6c8f1bed887f3e4dfa289329190a250565b6000546001600160a01b03163314610c235760405162461bcd60e51b815260040161067190611849565b6001600160a01b0382166000908152600c602052604090205460ff1615610c48575050565b7f00000000000000000000000000000000000000000000000000000000000000008110610cf757610c798282611353565b604051632f0ad01760e21b8152600760048201526001600160a01b03831660248201526044810182905273eb8f24ad682e40ceca006a453e34ec67845f95969063bc2b405c9060640160006040518083038186803b158015610cda57600080fd5b505af4158015610cee573d6000803e3d6000fd5b50505050610d75565b610d02826000611353565b60405163131836e760e21b8152600760048201526001600160a01b038316602482015273eb8f24ad682e40ceca006a453e34ec67845f959690634c60db9c9060440160006040518083038186803b158015610d5c57600080fd5b505af4158015610d70573d6000803e3d6000fd5b505050505b610d80826001610ab5565b505050565b6000546001600160a01b03163314610daf5760405162461bcd60e51b815260040161067190611849565b6104b08110158015610dc45750620151808111155b610e445760405162461bcd60e51b815260206004820152604560248201527f4469766964656e645f547261636b65723a20636c61696d57616974206d75737460448201527f206265207570646174656420746f206265747765656e203120616e6420323420606482015264686f75727360d81b608482015260a401610671565b600e54811415610ebc5760405162461bcd60e51b815260206004820152603760248201527f4469766964656e645f547261636b65723a2043616e6e6f74207570646174652060448201527f636c61696d5761697420746f2073616d652076616c75650000000000000000006064820152608401610671565b600e5460405182907f474ea64804364a1e29a4487ddb63c3342a2dd826ccd8acf48825e680a0e6f20f90600090a3600e55565b6000546001600160a01b03163314610f195760405162461bcd60e51b815260040161067190611849565b6001600160a01b038116610f7e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610671565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6040516317e142d160e01b8152600760048201526001600160a01b0382166024820152819060009081908190819081908190819073eb8f24ad682e40ceca006a453e34ec67845f9596906317e142d19060440160206040518083038186803b15801561104457600080fd5b505af4158015611058573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061107c919061187e565b96506000199550600087126110de57600b548711156110aa57600b546110a3908890611621565b95506110de565b600b54600754600091106110bf5760006110ce565b600b546007546110ce91611580565b90506110da8882611302565b9650505b6110e7886109d7565b94506110f28861067a565b6001600160a01b0389166000908152600d602052604090205490945092508261111c57600061112a565b600e5461112a9084906115c2565b915042821161113a576000611144565b6111448242611580565b9050919395975091939597565b6007546000908190819080611171575050600b5460009250829150611265565b600b546000805a90506000805b898410801561118c57508582105b15611254578461119b816118b4565b600754909650861090506111ae57600094505b6000600760000186815481106111c6576111c66118cf565b60009182526020808320909101546001600160a01b0316808352600d9091526040909120549091506111f79061165e565b1561121a57611207816001610ab5565b1561121a5781611216816118b4565b9250505b82611224816118b4565b93505060005a90508085111561124b576112486112418683611580565b87906115c2565b95505b935061117e9050565b600b85905590975095509193505050505b9193909250565b60008261127b575060006106d7565b600061128783856118e5565b9050826112948583611827565b146112eb5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610671565b9392505050565b600081818112156106d757600080fd5b60008061130f8385611904565b9050600083121580156113225750838112155b80611337575060008312801561133757508381125b6112eb57600080fd5b60008082121561134f57600080fd5b5090565b6001600160a01b0382166000908152600460205260409020805490829055808211156113af5760006113858383611580565b90506113918482611685565b80600560008282546113a39190611945565b90915550610d80915050565b80821015610d805760006113c38284611580565b90506113cf84826116df565b80600560008282546113e1919061195d565b909155505050505050565b6000806113f8836109d7565b90508015611577576001600160a01b03831660009081526003602052604090205461142390826115c2565b6001600160a01b038416600081815260036020526040908190209290925590517fee503bee2bb6a87e57bc57db795f98137327401a0e7b7ce42e37926cc1a9ca4d906114729084815260200190565b60405180910390a260405163a9059cbb60e01b81526001600160a01b038481166004830152602482018390526000917f00000000000000000000000000000000000000000000000000000000000000009091169063a9059cbb90604401602060405180830381600087803b1580156114e957600080fd5b505af11580156114fd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115219190611974565b905080611570576001600160a01b03841660009081526003602052604090205461154b9083611580565b6001600160a01b03909416600090815260036020526040812094909455509192915050565b5092915050565b50600092915050565b60006112eb83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611719565b6000806115cf8385611945565b9050838110156112eb5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610671565b60008061162e8385611991565b9050600083121580156116415750838113155b80611337575060008312801561133757508381136112eb57600080fd5b60004282111561167057506000919050565b600e5461167d4284611580565b101592915050565b6116bf6116a06106bd8360015461126c90919063ffffffff16565b6001600160a01b03841660009081526002602052604090205490611621565b6001600160a01b0390921660009081526002602052604090209190915550565b6116bf6116fa6106bd8360015461126c90919063ffffffff16565b6001600160a01b03841660009081526002602052604090205490611302565b6000818484111561173d5760405162461bcd60e51b815260040161067191906119d0565b50600061174a848661195d565b95945050505050565b6001600160a01b038116811461095957600080fd5b60006020828403121561177a57600080fd5b81356112eb81611753565b60006020828403121561179757600080fd5b5035919050565b801515811461095957600080fd5b600080604083850312156117bf57600080fd5b82356117ca81611753565b915060208301356117da8161179e565b809150509250929050565b600080604083850312156117f857600080fd5b823561180381611753565b946020939093013593505050565b634e487b7160e01b600052601160045260246000fd5b60008261184457634e487b7160e01b600052601260045260246000fd5b500490565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60006020828403121561189057600080fd5b5051919050565b6000602082840312156118a957600080fd5b81516112eb81611753565b60006000198214156118c8576118c8611811565b5060010190565b634e487b7160e01b600052603260045260246000fd5b60008160001904831182151516156118ff576118ff611811565b500290565b600080821280156001600160ff1b038490038513161561192657611926611811565b600160ff1b839003841281161561193f5761193f611811565b50500190565b6000821982111561195857611958611811565b500190565b60008282101561196f5761196f611811565b500390565b60006020828403121561198657600080fd5b81516112eb8161179e565b60008083128015600160ff1b8501841216156119af576119af611811565b6001600160ff1b03840183138116156119ca576119ca611811565b50500390565b600060208083528351808285015260005b818110156119fd578581018301518582016040015282016119e1565b81811115611a0f576000604083870101525b50601f01601f191692909201604001939250505056fea2646970667358221220a9d085c01ca6da5a11c2b93977e1e442bf1ae4b3e87584ea35a1d2eb72f3c9b464736f6c634300080900334f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572
Deployed Bytecode
0x6080604052600436106104c45760003560e01c80638ea5220f11610276578063c876d0b91161014f578063ee40166e116100c1578063f54afa7811610085578063f54afa7814610e61578063f8b45b0514610e77578063fb37b5e714610e8d578063fc0c546a14610ead578063fc155d1d14610ee1578063ff935af614610f0157600080fd5b8063ee40166e14610dd6578063f170d7fd14610dec578063f27fd25414610e0c578063f2fde38b14610e2c578063f32383e914610e4c57600080fd5b8063dd62ed3e11610113578063dd62ed3e14610d1a578063e2f4560514610d60578063e7841ec014610d76578063e7f444b314610d8b578063e884f26014610da1578063e98030c714610db657600080fd5b8063c876d0b914610ca8578063c8c8ebe414610cc2578063ccb6135814610cd8578063ccd146b214610cee578063d0a3981414610d0457600080fd5b8063aacebbe3116101e8578063b9e93700116101ac578063b9e9370014610bf3578063bbc0c74214610c09578063c024666814610c28578063c0f306ef14610c48578063c18bc19514610c68578063c492f04614610c8857600080fd5b8063aacebbe314610b08578063ad56c13c14610b28578063b2159d0f14610b8d578063b45e83f814610bad578063b62496f514610bc357600080fd5b80639c1b8af51161023a5780639c1b8af514610a675780639fccce3214610a7d578063a26579ad14610a93578063a457c2d714610aa8578063a8b9d24014610ac8578063a9059cbb14610ae857600080fd5b80638ea5220f146109d35780639066876a146109f3578063924de9b714610a1257806395d89b4114610a325780639a7a23d614610a4757600080fd5b806349bd5a5e116103a8578063715018a61161031a5780637ae3ff47116102de5780637ae3ff471461093f5780637e761377146109555780637fa787ba1461096b578063871c128d146109805780638a8c523c146109a05780638da5cb5b146109b557600080fd5b8063715018a6146108c057806371778e7d146108d5578063751039fc146108ea5780637571336a146108ff57806375f0a8741461091f57600080fd5b806364b0f6531161036c57806364b0f65314610815578063680789521461082a5780636843cd84146108405780636ddd171314610860578063700bb1911461088057806370a08231146108a057600080fd5b806349bd5a5e146107635780634a62bb65146107975780634af6f7ee146107b15780634e71d92d146107c75780634fbee193146107dc57600080fd5b80631816467f1161044157806323b872dd1161040557806323b872dd146106b25780632c1f5216146106d257806330bb4cff146106f2578063313ce5671461070757806331e79db014610723578063395093511461074357600080fd5b80631816467f146106305780631a8145bb146106505780631f3fed8f146106665780631fc851bd1461067c5780632307b4411461069257600080fd5b80630fb0e354116104885780630fb0e35414610577578063106b5da11461059157806310d5de53146105b35780631694505e146105e357806318160ddd1461061b57600080fd5b806301143fea146104d057806306fdde03146104f9578063095ea7b31461051b578063099d0d301461054b5780630f4432e31461056157600080fd5b366104cb57005b600080fd5b3480156104dc57600080fd5b506104e6601d5481565b6040519081526020015b60405180910390f35b34801561050557600080fd5b5061050e610f21565b6040516104f091906140e7565b34801561052757600080fd5b5061053b610536366004614151565b610fb3565b60405190151581526020016104f0565b34801561055757600080fd5b506104e660165481565b34801561056d57600080fd5b506104e6600d5481565b34801561058357600080fd5b5060235461053b9060ff1681565b34801561059d57600080fd5b506105b16105ac36600461417d565b610fca565b005b3480156105bf57600080fd5b5061053b6105ce366004614196565b60266020526000908152604090205460ff1681565b3480156105ef57600080fd5b50600654610603906001600160a01b031681565b6040516001600160a01b0390911681526020016104f0565b34801561062757600080fd5b506002546104e6565b34801561063c57600080fd5b506105b161064b366004614196565b6110af565b34801561065c57600080fd5b506104e660215481565b34801561067257600080fd5b506104e660205481565b34801561068857600080fd5b506104e6600f5481565b34801561069e57600080fd5b506105b16106ad366004614289565b6110fb565b3480156106be57600080fd5b5061053b6106cd36600461434b565b6112f8565b3480156106de57600080fd5b50600754610603906001600160a01b031681565b3480156106fe57600080fd5b506104e6611361565b34801561071357600080fd5b50604051601281526020016104f0565b34801561072f57600080fd5b506105b161073e366004614196565b6113e3565b34801561074f57600080fd5b5061053b61075e366004614151565b611470565b34801561076f57600080fd5b506106037f00000000000000000000000062aa744ae83dc9adf1e84073198f70d3c4c5767c81565b3480156107a357600080fd5b5060105461053b9060ff1681565b3480156107bd57600080fd5b506104e6601a5481565b3480156107d357600080fd5b506105b16114a6565b3480156107e857600080fd5b5061053b6107f7366004614196565b6001600160a01b031660009081526025602052604090205460ff1690565b34801561082157600080fd5b506104e661152d565b34801561083657600080fd5b506104e6601b5481565b34801561084c57600080fd5b506104e661085b366004614196565b611572565b34801561086c57600080fd5b5060105461053b9062010000900460ff1681565b34801561088c57600080fd5b506105b161089b36600461417d565b6115f1565b3480156108ac57600080fd5b506104e66108bb366004614196565b6116d2565b3480156108cc57600080fd5b506105b16116ed565b3480156108e157600080fd5b506104e6611761565b3480156108f657600080fd5b5061053b6117a6565b34801561090b57600080fd5b506105b161091a36600461439a565b6117ef565b34801561092b57600080fd5b50600854610603906001600160a01b031681565b34801561094b57600080fd5b506104e6601e5481565b34801561096157600080fd5b506104e660185481565b34801561097757600080fd5b506105b1611879565b34801561098c57600080fd5b506105b161099b36600461417d565b611930565b3480156109ac57600080fd5b506105b1611a74565b3480156109c157600080fd5b506005546001600160a01b0316610603565b3480156109df57600080fd5b50600954610603906001600160a01b031681565b3480156109ff57600080fd5b5060235461053b90610100900460ff1681565b348015610a1e57600080fd5b506105b1610a2d3660046143d3565b611ac5565b348015610a3e57600080fd5b5061050e611b0b565b348015610a5357600080fd5b506105b1610a6236600461439a565b611b1a565b348015610a7357600080fd5b506104e660245481565b348015610a8957600080fd5b506104e660225481565b348015610a9f57600080fd5b506104e6611c08565b348015610ab457600080fd5b5061053b610ac3366004614151565b611c4d565b348015610ad457600080fd5b506104e6610ae3366004614196565b611c9c565b348015610af457600080fd5b5061053b610b03366004614151565b611ccf565b348015610b1457600080fd5b506105b1610b23366004614196565b611cdc565b348015610b3457600080fd5b50610b48610b43366004614196565b611d6e565b604080516001600160a01b0390991689526020890197909752958701949094526060860192909252608085015260a084015260c083015260e0820152610100016104f0565b348015610b9957600080fd5b506105b1610ba83660046143d3565b611e18565b348015610bb957600080fd5b506104e660175481565b348015610bcf57600080fd5b5061053b610bde366004614196565b60276020526000908152604090205460ff1681565b348015610bff57600080fd5b506104e660195481565b348015610c1557600080fd5b5060105461053b90610100900460ff1681565b348015610c3457600080fd5b506105b1610c4336600461439a565b612030565b348015610c5457600080fd5b506105b1610c63366004614196565b6120b2565b348015610c7457600080fd5b506105b1610c8336600461417d565b61210e565b348015610c9457600080fd5b506105b1610ca33660046143f0565b6121dc565b348015610cb457600080fd5b5060125461053b9060ff1681565b348015610cce57600080fd5b506104e6600a5481565b348015610ce457600080fd5b506104e6601c5481565b348015610cfa57600080fd5b506104e660145481565b348015610d1057600080fd5b506104e660135481565b348015610d2657600080fd5b506104e6610d35366004614476565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b348015610d6c57600080fd5b506104e6600b5481565b348015610d8257600080fd5b506104e66122b8565b348015610d9757600080fd5b506104e660155481565b348015610dad57600080fd5b5061053b6122fd565b348015610dc257600080fd5b506105b1610dd136600461417d565b61233a565b348015610de257600080fd5b506104e6600e5481565b348015610df857600080fd5b506105b1610e073660046144a4565b612395565b348015610e1857600080fd5b50610b48610e2736600461417d565b612458565b348015610e3857600080fd5b506105b1610e47366004614196565b61249a565b348015610e5857600080fd5b506105b1612585565b348015610e6d57600080fd5b506104e6601f5481565b348015610e8357600080fd5b506104e6600c5481565b348015610e9957600080fd5b506105b1610ea83660046143d3565b61264d565b348015610eb957600080fd5b506106037f000000000000000000000000062e66477faf219f25d27dced647bf57c3107d5281565b348015610eed57600080fd5b506105b1610efc36600461417d565b6127dd565b348015610f0d57600080fd5b506105b1610f1c3660046144a4565b612969565b606060038054610f30906144df565b80601f0160208091040260200160405190810160405280929190818152602001828054610f5c906144df565b8015610fa95780601f10610f7e57610100808354040283529160200191610fa9565b820191906000526020600020905b815481529060010190602001808311610f8c57829003601f168201915b5050505050905090565b6000610fc0338484612a93565b5060015b92915050565b6005546001600160a01b03163314610ffd5760405162461bcd60e51b8152600401610ff49061451a565b60405180910390fd5b670de0b6b3a76400006103e861101260025490565b61101d906005614565565b6110279190614584565b6110319190614584565b81116110975760405162461bcd60e51b815260206004820152602f60248201527f43616e6e6f7420736574206d61785472616e73616374696f6e416d6f756e742060448201526e6c6f776572207468616e20302e352560881b6064820152608401610ff4565b6110a981670de0b6b3a7640000614565565b600a5550565b6005546001600160a01b031633146110d95760405162461bcd60e51b8152600401610ff49061451a565b600980546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b031633146111255760405162461bcd60e51b8152600401610ff49061451a565b80518251146111765760405162461bcd60e51b815260206004820152601e60248201527f617272617973206d757374206265207468652073616d65206c656e67746800006044820152606401610ff4565b60c88251106111e65760405162461bcd60e51b815260206004820152603660248201527f43616e206f6e6c792061697264726f70203230302077616c6c657473207065726044820152752074786e2064756520746f20676173206c696d69747360501b6064820152608401610ff4565b60005b82518110156112f35761122f33848381518110611208576112086145a6565b6020026020010151848481518110611222576112226145a6565b6020026020010151612bb8565b60075483516001600160a01b039091169063e30443bc90859084908110611258576112586145a6565b6020026020010151611282868581518110611275576112756145a6565b60200260200101516116d2565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b1580156112c857600080fd5b505af11580156112dc573d6000803e3d6000fd5b5050505080806112eb906145bc565b9150506111e9565b505050565b6000611305848484612cc1565b6113578433611352856040518060600160405280602881526020016148ae602891396001600160a01b038a16600090815260016020908152604080832033845290915290205491906136fd565b612a93565b5060019392505050565b600754604080516342d359d760e11b815290516000926001600160a01b0316916385a6b3ae916004808301926020929190829003018186803b1580156113a657600080fd5b505afa1580156113ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113de91906145d7565b905090565b6005546001600160a01b0316331461140d5760405162461bcd60e51b8152600401610ff49061451a565b60075460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db0906024015b600060405180830381600087803b15801561145557600080fd5b505af1158015611469573d6000803e3d6000fd5b5050505050565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610fc09185906113529086612a2d565b60075460405163bc4c4b3760e01b8152336004820152600060248201526001600160a01b039091169063bc4c4b3790604401602060405180830381600087803b1580156114f257600080fd5b505af1158015611506573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061152a91906145f0565b50565b600754604080516304ddf6ef60e11b815290516000926001600160a01b0316916309bbedde916004808301926020929190829003018186803b1580156113a657600080fd5b60075460405163156dbbf560e31b81526001600160a01b038381166004830152600092169063ab6ddfa8906024015b60206040518083038186803b1580156115b957600080fd5b505afa1580156115cd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fc491906145d7565b6007546040516001624d3b8760e01b0319815260048101839052600091829182916001600160a01b03169063ffb2c47990602401606060405180830381600087803b15801561163f57600080fd5b505af1158015611653573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611677919061460d565b604080518481526020810184905290810182905260608101889052929550909350915032906000907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a350505050565b6001600160a01b031660009081526020819052604090205490565b6005546001600160a01b031633146117175760405162461bcd60e51b8152600401610ff49061451a565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b6007546040805163ad7a672f60e01b815290516000926001600160a01b03169163ad7a672f916004808301926020929190829003018186803b1580156113a657600080fd5b6005546000906001600160a01b031633146117d35760405162461bcd60e51b8152600401610ff49061451a565b506010805460ff19908116909155601280549091169055600190565b6005546001600160a01b031633146118195760405162461bcd60e51b8152600401610ff49061451a565b6001600160a01b038216600081815260266020908152604091829020805460ff191685151590811790915591519182527f575f9d01836c9206322151b9e9ec3f2b77b87e71176933b9b44d2d732f768d9591015b60405180910390a25050565b6005546001600160a01b031633146118a35760405162461bcd60e51b8152600401610ff49061451a565b604051600090339047908381818185875af1925050503d80600081146118e5576040519150601f19603f3d011682016040523d82523d6000602084013e6118ea565b606091505b505090508061152a5760405162461bcd60e51b81526020600482015260126024820152716661696c656420746f20776974686472617760701b6044820152606401610ff4565b6005546001600160a01b0316331461195a5760405162461bcd60e51b8152600401610ff49061451a565b62030d4081101580156119705750620b71b08111155b6119da5760405162461bcd60e51b815260206004820152603560248201527f20676173466f7250726f63657373696e67206d7573742062652062657477656560448201527406e203230302c30303020616e64203530302c30303605c1b6064820152608401610ff4565b602454811415611a415760405162461bcd60e51b815260206004820152602c60248201527f43616e6e6f742075706461746520676173466f7250726f63657373696e67207460448201526b6f2073616d652076616c756560a01b6064820152608401610ff4565b60245460405182907f40d7e40e79af4e8e5a9b3c57030d8ea93f13d669c06d448c4d631d4ae7d23db790600090a3602455565b6005546001600160a01b03163314611a9e5760405162461bcd60e51b8152600401610ff49061451a565b6010805462ffff0019166201010017905543600e55611ac0426203f48061463b565b600f55565b6005546001600160a01b03163314611aef5760405162461bcd60e51b8152600401610ff49061451a565b60108054911515620100000262ff000019909216919091179055565b606060048054610f30906144df565b6005546001600160a01b03163314611b445760405162461bcd60e51b8152600401610ff49061451a565b7f00000000000000000000000062aa744ae83dc9adf1e84073198f70d3c4c5767c6001600160a01b0316826001600160a01b03161415611bfa5760405162461bcd60e51b815260206004820152604560248201527f5468652050616e63616b655377617020706169722063616e6e6f74206265207260448201527f656d6f7665642066726f6d206175746f6d617465644d61726b65744d616b6572606482015264506169727360d81b608482015260a401610ff4565b611c048282613737565b5050565b60075460408051631bc9e27b60e21b815290516000926001600160a01b031691636f2789ec916004808301926020929190829003018186803b1580156113a657600080fd5b6000610fc03384611352856040518060600160405280602581526020016148d6602591393360009081526001602090815260408083206001600160a01b038d16845290915290205491906136fd565b6007546040516302a2e74960e61b81526001600160a01b038381166004830152600092169063a8b9d240906024016115a1565b6000610fc0338484612cc1565b6005546001600160a01b03163314611d065760405162461bcd60e51b8152600401610ff49061451a565b611d11816001612030565b6008546040516001600160a01b03918216918316907fa751787977eeb3902e30e1d19ca00c6ad274a1f622c31a206e32366700b0567490600090a3600880546001600160a01b0319166001600160a01b0392909216919091179055565b60075460405163fbcbc0f160e01b81526001600160a01b038381166004830152600092839283928392839283928392839291169063fbcbc0f1906024015b6101006040518083038186803b158015611dc557600080fd5b505afa158015611dd9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dfd9190614653565b97509750975097509750975097509750919395975091939597565b6005546001600160a01b03163314611e425760405162461bcd60e51b8152600401610ff49061451a565b60235460ff1615158115151415611e9b5760405162461bcd60e51b815260206004820152601c60248201527f416c72656164792073657420746f20746869732073657474696e672e000000006044820152606401610ff4565b8015611f4c576023805460ff19166001179055600a60148190556009601581905560026016819055601781905560188190559182918291611edc919061463b565b611ee6919061463b565b611ef0919061463b565b611efa919061463b565b6013556001601a819055601b819055601c819055601d8190556000601e8190559080611f26818061463b565b611f30919061463b565b611f3a919061463b565b611f44919061463b565b601955611ff8565b80611ff8576023805460ff1916905560096014819055600260158190556016819055601781905560188190559081908190611f8890829061463b565b611f92919061463b565b611f9c919061463b565b611fa6919061463b565b6013556009601a8190556001601b8190556002601c819055601d8290556000601e81905592611fd690839061463b565b611fe0919061463b565b611fea919061463b565b611ff4919061463b565b6019555b60405181151581527fcb94f18351a6190da0f2aac99d5061a1dc8f04e23d3a9ce8e6c58b47064d6b6c9060200160405180910390a150565b6005546001600160a01b0316331461205a5760405162461bcd60e51b8152600401610ff49061451a565b6001600160a01b038216600081815260256020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910161186d565b6005546001600160a01b031633146120dc5760405162461bcd60e51b8152600401610ff49061451a565b60075460405163c0f306ef60e01b81526001600160a01b0383811660048301529091169063c0f306ef9060240161143b565b6005546001600160a01b031633146121385760405162461bcd60e51b8152600401610ff49061451a565b670de0b6b3a7640000606461214c60025490565b612157906001614565565b6121619190614584565b61216b9190614584565b81116121c45760405162461bcd60e51b815260206004820152602260248201527f43616e6e6f7420736574206d617857616c6c6574206c6f776572207468616e20604482015261312560f01b6064820152608401610ff4565b6121d681670de0b6b3a7640000614565565b600c5550565b6005546001600160a01b031633146122065760405162461bcd60e51b8152600401610ff49061451a565b60005b82811015612277578160256000868685818110612228576122286145a6565b905060200201602081019061223d9190614196565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790558061226f816145bc565b915050612209565b507f7fdaf542373fa84f4ee8d662c642f44e4c2276a217d7d29e548b6eb29a233b358383836040516122ab939291906146bd565b60405180910390a1505050565b6007546040805163039e107b60e61b815290516000926001600160a01b03169163e7841ec0916004808301926020929190829003018186803b1580156113a657600080fd5b6005546000906001600160a01b0316331461232a5760405162461bcd60e51b8152600401610ff49061451a565b506012805460ff19169055600190565b6005546001600160a01b031633146123645760405162461bcd60e51b8152600401610ff49061451a565b60075460405163e98030c760e01b8152600481018390526001600160a01b039091169063e98030c79060240161143b565b6005546001600160a01b031633146123bf5760405162461bcd60e51b8152600401610ff49061451a565b601b859055601a849055601c839055601d829055601e8190558082846123e5878961463b565b6123ef919061463b565b6123f9919061463b565b612403919061463b565b6019819055601410156114695760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420323025206f72206c6573730000006044820152606401610ff4565b600754604051635183d6fd60e01b81526004810183905260009182918291829182918291829182916001600160a01b0390911690635183d6fd90602401611dac565b6005546001600160a01b031633146124c45760405162461bcd60e51b8152600401610ff49061451a565b6001600160a01b0381166125295760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610ff4565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b031633146125af5760405162461bcd60e51b8152600401610ff49061451a565b600960148190556002601581905560168190556017819055601881905590819081906125dc90829061463b565b6125e6919061463b565b6125f0919061463b565b6125fa919061463b565b6013556009601a8190556001601b8190556002601c819055601d8290556000601e8190559261262a90839061463b565b612634919061463b565b61263e919061463b565b612648919061463b565b601955565b6005546001600160a01b031633146126775760405162461bcd60e51b8152600401610ff49061451a565b602354610100900460ff16158061268c575080155b6126ec5760405162461bcd60e51b815260206004820152602b60248201527f416c72656164792075736564204c61756e6368207461782c2063616e6e6f742060448201526a31b0b6361030b3b0b4b71760a91b6064820152608401610ff4565b80156127a1576023805461ff00191661010017905560096014819055600560158190556002601681905560178190556018819055918291829161272f919061463b565b612739919061463b565b612743919061463b565b61274d919061463b565b6013556009601a8190556001601b8190556002601c819055601d8290556000601e8190559261277d90839061463b565b612787919061463b565b612791919061463b565b61279b919061463b565b60195550565b8061152a576023805460ff191690556009601481905560026015819055601681905560178190556018819055908190819061272f90829061463b565b6005546001600160a01b031633146128075760405162461bcd60e51b8152600401610ff49061451a565b6040805160028082526060820183526000926020830190803683375050600654604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c464892506004808301926020929190829003018186803b15801561286c57600080fd5b505afa158015612880573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128a49190614716565b816000815181106128b7576128b76145a6565b60200260200101906001600160a01b031690816001600160a01b03168152505030816001815181106128eb576128eb6145a6565b6001600160a01b03928316602091820292909201015260065460405163b6f9de9560e01b815291169063b6f9de9590849061293390600090869061dead904290600401614777565b6000604051808303818588803b15801561294c57600080fd5b505af1158015612960573d6000803e3d6000fd5b50505050505050565b6005546001600160a01b031633146129935760405162461bcd60e51b8152600401610ff49061451a565b601585905560148490556016839055601782905560188190558082846129b9878961463b565b6129c3919061463b565b6129cd919061463b565b6129d7919061463b565b601355601954601e10156114695760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420333025206f72206c6573730000006044820152606401610ff4565b600080612a3a838561463b565b905083811015612a8c5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610ff4565b9392505050565b6001600160a01b038316612af55760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610ff4565b6001600160a01b038216612b565760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610ff4565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b038316612bde5760405162461bcd60e51b8152600401610ff4906147ac565b6001600160a01b038216612c045760405162461bcd60e51b8152600401610ff4906147f1565b612c4181604051806060016040528060268152602001614888602691396001600160a01b03861660009081526020819052604090205491906136fd565b6001600160a01b038085166000908152602081905260408082209390935590841681522054612c709082612a2d565b6001600160a01b038381166000818152602081815260409182902094909455518481529092918616917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101612bab565b6001600160a01b038316612ce75760405162461bcd60e51b8152600401610ff4906147ac565b6001600160a01b038216612d0d5760405162461bcd60e51b8152600401610ff4906147f1565b80612d1e576112f383836000612bb8565b601054610100900460ff16612db8576001600160a01b03831660009081526025602052604090205460ff1680612d6c57506001600160a01b03821660009081526025602052604090205460ff165b612db85760405162461bcd60e51b815260206004820152601a60248201527f54726164696e67206973206e6f7420616374697665207965742e0000000000006044820152606401610ff4565b60105460ff1615613142576005546001600160a01b03848116911614801590612def57506005546001600160a01b03838116911614155b8015612e0357506001600160a01b03821615155b8015612e1a57506001600160a01b03821661dead14155b8015612e305750600654600160a01b900460ff16155b156131425760125460ff1615612f58576005546001600160a01b03838116911614801590612e6c57506006546001600160a01b03838116911614155b8015612eaa57507f00000000000000000000000062aa744ae83dc9adf1e84073198f70d3c4c5767c6001600160a01b0316826001600160a01b031614155b15612f5857326000908152601160205260409020544311612f455760405162461bcd60e51b815260206004820152604960248201527f5f7472616e736665723a3a205472616e736665722044656c617920656e61626c60448201527f65642e20204f6e6c79206f6e652070757263686173652070657220626c6f636b6064820152681030b63637bbb2b21760b91b608482015260a401610ff4565b3260009081526011602052604090204390555b6001600160a01b03831660009081526027602052604090205460ff168015612f9957506001600160a01b03821660009081526026602052604090205460ff16155b1561300757600c54612faa836116d2565b612fb4908361463b565b11156130025760405162461bcd60e51b815260206004820152601b60248201527f556e61626c6520746f20657863656564204d61782057616c6c657400000000006044820152606401610ff4565b613142565b6001600160a01b03821660009081526027602052604090205460ff16801561304857506001600160a01b03831660009081526026602052604090205460ff16155b156130be57600a548111156130025760405162461bcd60e51b815260206004820152603660248201527f53656c6c207472616e7366657220616d6f756e742065786365656473207468656044820152751036b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760511b6064820152608401610ff4565b6001600160a01b03821660009081526026602052604090205460ff1661314257600c546130ea836116d2565b6130f4908361463b565b11156131425760405162461bcd60e51b815260206004820152601b60248201527f556e61626c6520746f20657863656564204d61782057616c6c657400000000006044820152606401610ff4565b600061314d306116d2565b600b549091508110801590819061316c575060105462010000900460ff165b80156131825750600654600160a01b900460ff16155b80156131a757506001600160a01b03851660009081526027602052604090205460ff16155b80156131cc57506001600160a01b03851660009081526025602052604090205460ff16155b80156131f157506001600160a01b03841660009081526025602052604090205460ff16155b1561321f576006805460ff60a01b1916600160a01b179055613211613807565b6006805460ff60a01b191690555b6006546001600160a01b03861660009081526025602052604090205460ff600160a01b90920482161591168061326d57506001600160a01b03851660009081526025602052604090205460ff165b15613276575060005b6000808215613518576001600160a01b03871660009081526027602052604090205460ff1680156132a957506000601354115b156133b4576132ce60646132c860135489613c4390919063ffffffff16565b90613cc2565b9150601354601454836132e19190614565565b6132eb9190614584565b601f60008282546132fc919061463b565b90915550506013546016546133119084614565565b61331b9190614584565b6021600082825461332c919061463b565b90915550506013546018546133419084614565565b61334b9190614584565b90506013546017548361335e9190614565565b6133689190614584565b60226000828254613379919061463b565b909155505060135460155461338e9084614565565b6133989190614584565b602060008282546133a9919061463b565b909155506134de9050565b6001600160a01b03881660009081526027602052604090205460ff1680156133de57506000601954115b156134de576133fd60646132c860195489613c4390919063ffffffff16565b9150601954601a54836134109190614565565b61341a9190614584565b601f600082825461342b919061463b565b9091555050601954601c546134409084614565565b61344a9190614584565b6021600082825461345b919061463b565b9091555050601954601e546134709084614565565b61347a9190614584565b9050601954601d548361348d9190614565565b6134979190614584565b602260008282546134a8919061463b565b9091555050601954601b546134bd9084614565565b6134c79190614584565b602060008282546134d8919061463b565b90915550505b80156134f1576134f18861dead83612bb8565b811561350b5761350b88306135068486614834565b612bb8565b6135158287614834565b95505b613523888888612bb8565b6007546001600160a01b031663e30443bc8961353e816116d2565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561358457600080fd5b505af1925050508015613595575060015b506007546001600160a01b031663e30443bc886135b1816116d2565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b1580156135f757600080fd5b505af1925050508015613608575060015b50600654600160a01b900460ff166136f357602480546007546040516001624d3b8760e01b031981526004810183905291926001600160a01b039091169163ffb2c4799101606060405180830381600087803b15801561366757600080fd5b505af1925050508015613697575060408051601f3d908101601f191682019092526136949181019061460d565b60015b6136a0576136f1565b60408051848152602081018490529081018290526060810185905232906001907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a35050505b505b5050505050505050565b600081848411156137215760405162461bcd60e51b8152600401610ff491906140e7565b50600061372e8486614834565b95945050505050565b6001600160a01b0382166000908152602760205260409020805460ff191682151517905561376582826117ef565b80156137cb5760075460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db090602401600060405180830381600087803b1580156137b257600080fd5b505af11580156137c6573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b6000613812306116d2565b90506000602254601f5460205460215461382c919061463b565b613836919061463b565b613840919061463b565b905081158061384d575080155b15613856575050565b6000600282602154856138699190614565565b6138739190614584565b61387d9190614584565b9050600061388b8483613d04565b90504761389782613d46565b60006138a34783613d04565b905060006138c0866132c860205485613c4390919063ffffffff16565b905060006138dd876132c860225486613c4390919063ffffffff16565b905060006138fa886132c8601f5487613c4390919063ffffffff16565b90506000818361390a8688614834565b6139149190614834565b61391e9190614834565b600060218190556020819055601f819055602281905560085460405192935090916001600160a01b039091169086908381818185875af1925050503d8060008114613985576040519150601f19603f3d011682016040523d82523d6000602084013e61398a565b606091505b50506009546040519192506001600160a01b0316908590600081818185875af1925050503d80600081146139da576040519150601f19603f3d011682016040523d82523d6000602084013e6139df565b606091505b509091505088158015906139f35750600082115b15613a4657613a028983613eaf565b602154604080518a81526020810185905280820192909252517f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619181900360600190a15b479250613a5283613f69565b6040516370a0823160e01b81523060048201526000907f000000000000000000000000062e66477faf219f25d27dced647bf57c3107d526001600160a01b0316906370a082319060240160206040518083038186803b158015613ab457600080fd5b505afa158015613ac8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613aec91906145d7565b60075460405163a9059cbb60e01b81526001600160a01b039182166004820152602481018390529192507f000000000000000000000000062e66477faf219f25d27dced647bf57c3107d52169063a9059cbb90604401602060405180830381600087803b158015613b5c57600080fd5b505af1158015613b70573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b9491906145f0565b91508115613c355760075460405163b0c7ce3760e01b8152600481018390526001600160a01b039091169063b0c7ce3790602401600060405180830381600087803b158015613be257600080fd5b505af1158015613bf6573d6000803e3d6000fd5b505060408051848152602081018890527f80195cc573b02cc48460cbca6e6e4cc85ddb91959d946e1c3025ea3d87942dc3935001905060405180910390a15b505050505050505050505050565b600082613c5257506000610fc4565b6000613c5e8385614565565b905082613c6b8583614584565b14612a8c5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610ff4565b6000612a8c83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506140b9565b6000612a8c83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506136fd565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110613d7b57613d7b6145a6565b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b158015613dcf57600080fd5b505afa158015613de3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e079190614716565b81600181518110613e1a57613e1a6145a6565b6001600160a01b039283166020918202929092010152600654613e409130911684612a93565b60065460405163791ac94760e01b81526001600160a01b039091169063791ac94790613e7990859060009086903090429060040161484b565b600060405180830381600087803b158015613e9357600080fd5b505af1158015613ea7573d6000803e3d6000fd5b505050505050565b600654613ec79030906001600160a01b031684612a93565b60065460405163f305d71960e01b815230600482015260248101849052600060448201819052606482015261dead60848201524260a48201526001600160a01b039091169063f305d71990839060c4016060604051808303818588803b158015613f3057600080fd5b505af1158015613f44573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611469919061460d565b801561152a576040805160028082526060820183526000926020830190803683375050600654604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c464892506004808301926020929190829003018186803b158015613fd457600080fd5b505afa158015613fe8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061400c9190614716565b8160008151811061401f5761401f6145a6565b60200260200101906001600160a01b031690816001600160a01b0316815250507f000000000000000000000000062e66477faf219f25d27dced647bf57c3107d5281600181518110614073576140736145a6565b6001600160a01b03928316602091820292909201015260065460405163b6f9de9560e01b815291169063b6f9de9590849061293390600090869030904290600401614777565b600081836140da5760405162461bcd60e51b8152600401610ff491906140e7565b50600061372e8486614584565b600060208083528351808285015260005b81811015614114578581018301518582016040015282016140f8565b81811115614126576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b038116811461152a57600080fd5b6000806040838503121561416457600080fd5b823561416f8161413c565b946020939093013593505050565b60006020828403121561418f57600080fd5b5035919050565b6000602082840312156141a857600080fd5b8135612a8c8161413c565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156141f2576141f26141b3565b604052919050565b600067ffffffffffffffff821115614214576142146141b3565b5060051b60200190565b600082601f83011261422f57600080fd5b8135602061424461423f836141fa565b6141c9565b82815260059290921b8401810191818101908684111561426357600080fd5b8286015b8481101561427e5780358352918301918301614267565b509695505050505050565b6000806040838503121561429c57600080fd5b823567ffffffffffffffff808211156142b457600080fd5b818501915085601f8301126142c857600080fd5b813560206142d861423f836141fa565b82815260059290921b840181019181810190898411156142f757600080fd5b948201945b8386101561431e57853561430f8161413c565b825294820194908201906142fc565b9650508601359250508082111561433457600080fd5b506143418582860161421e565b9150509250929050565b60008060006060848603121561436057600080fd5b833561436b8161413c565b9250602084013561437b8161413c565b929592945050506040919091013590565b801515811461152a57600080fd5b600080604083850312156143ad57600080fd5b82356143b88161413c565b915060208301356143c88161438c565b809150509250929050565b6000602082840312156143e557600080fd5b8135612a8c8161438c565b60008060006040848603121561440557600080fd5b833567ffffffffffffffff8082111561441d57600080fd5b818601915086601f83011261443157600080fd5b81358181111561444057600080fd5b8760208260051b850101111561445557600080fd5b6020928301955093505084013561446b8161438c565b809150509250925092565b6000806040838503121561448957600080fd5b82356144948161413c565b915060208301356143c88161413c565b600080600080600060a086880312156144bc57600080fd5b505083359560208501359550604085013594606081013594506080013592509050565b600181811c908216806144f357607f821691505b6020821081141561451457634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600081600019048311821515161561457f5761457f61454f565b500290565b6000826145a157634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052603260045260246000fd5b60006000198214156145d0576145d061454f565b5060010190565b6000602082840312156145e957600080fd5b5051919050565b60006020828403121561460257600080fd5b8151612a8c8161438c565b60008060006060848603121561462257600080fd5b8351925060208401519150604084015190509250925092565b6000821982111561464e5761464e61454f565b500190565b600080600080600080600080610100898b03121561467057600080fd5b885161467b8161413c565b809850506020890151965060408901519550606089015194506080890151935060a0890151925060c0890151915060e089015190509295985092959890939650565b6040808252810183905260008460608301825b868110156147005782356146e38161413c565b6001600160a01b03168252602092830192909101906001016146d0565b5080925050508215156020830152949350505050565b60006020828403121561472857600080fd5b8151612a8c8161413c565b600081518084526020808501945080840160005b8381101561476c5781516001600160a01b031687529582019590820190600101614747565b509495945050505050565b8481526080602082015260006147906080830186614733565b6001600160a01b03949094166040830152506060015292915050565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b6000828210156148465761484661454f565b500390565b85815284602082015260a06040820152600061486a60a0830186614733565b6001600160a01b039490941660608301525060800152939250505056fe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220b7c0e2f095b3fb1e8e3fe2ed965df02bcd967f983af58d350b55be93e47d279864736f6c63430008090033
Deployed ByteCode Sourcemap
41474:27536:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43006:24;;;;;;;;;;;;;;;;;;;160:25:1;;;148:2;133:18;43006:24:0;;;;;;;;9224:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;11391:169::-;;;;;;;;;;-1:-1:-1;11391:169:0;;;;;:::i;:::-;;:::i;:::-;;;1419:14:1;;1412:22;1394:41;;1382:2;1367:18;11391:169:0;1254:187:1;42754:31:0;;;;;;;;;;;;;;;;42019:39;;;;;;;;;;;;;;;;43233:36;;;;;;;;;;-1:-1:-1;43233:36:0;;;;;;;;49012:230;;;;;;;;;;-1:-1:-1;49012:230:0;;;;;:::i;:::-;;:::i;:::-;;43592:64;;;;;;;;;;-1:-1:-1;43592:64:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;41550:41;;;;;;;;;;-1:-1:-1;41550:41:0;;;;-1:-1:-1;;;;;41550:41:0;;;;;;-1:-1:-1;;;;;2074:32:1;;;2056:51;;2044:2;2029:18;41550:41:0;1883:230:1;10344:108:0;;;;;;;;;;-1:-1:-1;10432:12:0;;10344:108;;52777:109;;;;;;;;;;-1:-1:-1;52777:109:0;;;;;:::i;:::-;;:::i;43153:33::-;;;;;;;;;;;;;;;;43113;;;;;;;;;;;;;;;;42181;;;;;;;;;;;;;;;;51239:627;;;;;;;;;;-1:-1:-1;51239:627:0;;;;;:::i;:::-;;:::i;12042:355::-;;;;;;;;;;-1:-1:-1;12042:355:0;;;;;:::i;:::-;;:::i;41675:38::-;;;;;;;;;;-1:-1:-1;41675:38:0;;;;-1:-1:-1;;;;;41675:38:0;;;53545:141;;;;;;;;;;;;;:::i;10186:93::-;;;;;;;;;;-1:-1:-1;10186:93:0;;10269:2;5448:36:1;;5436:2;5421:18;10186:93:0;5306:184:1;48170:130:0;;;;;;;;;;-1:-1:-1;48170:130:0;;;;;:::i;:::-;;:::i;12806:218::-;;;;;;;;;;-1:-1:-1;12806:218:0;;;;;:::i;:::-;;:::i;41598:38::-;;;;;;;;;;;;;;;42290:33;;;;;;;;;;-1:-1:-1;42290:33:0;;;;;;;;42897:28;;;;;;;;;;;;;;;;55041:97;;;;;;;;;;;;;:::i;53694:125::-;;;;;;;;;;-1:-1:-1;53694:125:0;;;;;:::i;:::-;-1:-1:-1;;;;;53783:28:0;53759:4;53783:28;;;:19;:28;;;;;;;;;53694:125;55280:141;;;;;;;;;;;;;:::i;42932:30::-;;;;;;;;;;;;;;;;53979:134;;;;;;;;;;-1:-1:-1;53979:134:0;;;;;:::i;:::-;;:::i;42370:31::-;;;;;;;;;;-1:-1:-1;42370:31:0;;;;;;;;;;;54774:259;;;;;;;;;;-1:-1:-1;54774:259:0;;;;;:::i;:::-;;:::i;10515:127::-;;;;;;;;;;-1:-1:-1;10515:127:0;;;;;:::i;:::-;;:::i;26360:148::-;;;;;;;;;;;;;:::i;55433:119::-;;;;;;;;;;;;;:::i;55608:159::-;;;;;;;;;;;;;:::i;50523:202::-;;;;;;;;;;-1:-1:-1;50523:202:0;;;;;:::i;:::-;;:::i;41722:30::-;;;;;;;;;;-1:-1:-1;41722:30:0;;;;-1:-1:-1;;;;;41722:30:0;;;43037:25;;;;;;;;;;;;;;;;42824:26;;;;;;;;;;;;;;;;68816:191;;;;;;;;;;;;;:::i;52894:395::-;;;;;;;;;;-1:-1:-1;52894:395:0;;;;;:::i;:::-;;:::i;48589:214::-;;;;;;;;;;;;;:::i;25718:79::-;;;;;;;;;;-1:-1:-1;25783:6:0;;-1:-1:-1;;;;;25783:6:0;25718:79;;41759:24;;;;;;;;;;-1:-1:-1;41759:24:0;;;;-1:-1:-1;;;;;41759:24:0;;;43276:33;;;;;;;;;;-1:-1:-1;43276:33:0;;;;;;;;;;;48903:101;;;;;;;;;;-1:-1:-1;48903:101:0;;;;;:::i;:::-;;:::i;9443:104::-;;;;;;;;;;;;;:::i;51874:277::-;;;;;;;;;;-1:-1:-1;51874:277:0;;;;;:::i;:::-;;:::i;43400:40::-;;;;;;;;;;;;;;;;43193:27;;;;;;;;;;;;;;;;53429:108;;;;;;;;;;;;;:::i;13527:269::-;;;;;;;;;;-1:-1:-1;13527:269:0;;;;;:::i;:::-;;:::i;53827:147::-;;;;;;;;;;-1:-1:-1;53827:147:0;;;;;:::i;:::-;;:::i;10855:175::-;;;;;;;;;;-1:-1:-1;10855:175:0;;;;;:::i;:::-;;:::i;52505:260::-;;;;;;;;;;-1:-1:-1;52505:260:0;;;;;:::i;:::-;;:::i;54121:318::-;;;;;;;;;;-1:-1:-1;54121:318:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;6816:32:1;;;6798:51;;6880:2;6865:18;;6858:34;;;;6908:18;;;6901:34;;;;6966:2;6951:18;;6944:34;;;;7009:3;6994:19;;6987:35;6836:3;7038:19;;7031:35;7097:3;7082:19;;7075:35;7141:3;7126:19;;7119:35;6785:3;6770:19;54121:318:0;6459:701:1;64605:1557:0;;;;;;;;;;-1:-1:-1;64605:1557:0;;;;;:::i;:::-;;:::i;42792:25::-;;;;;;;;;;;;;;;;43814:58;;;;;;;;;;-1:-1:-1;43814:58:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;42863:27;;;;;;;;;;;;;;;;42330:33;;;;;;;;;;-1:-1:-1;42330:33:0;;;;;;;;;;;50733:184;;;;;;;;;;-1:-1:-1;50733:184:0;;;;;:::i;:::-;;:::i;48405:126::-;;;;;;;;;;-1:-1:-1;48405:126:0;;;;;:::i;:::-;;:::i;49254:211::-;;;;;;;;;;-1:-1:-1;49254:211:0;;;;;:::i;:::-;;:::i;50925:306::-;;;;;;;;;;-1:-1:-1;50925:306:0;;;;;:::i;:::-;;:::i;42593:39::-;;;;;;;;;;-1:-1:-1;42593:39:0;;;;;;;;41900:35;;;;;;;;;;;;;;;;42969:30;;;;;;;;;;;;;;;;42680:29;;;;;;;;;;;;;;;;42645:28;;;;;;;;;;;;;;;;11093:151;;;;;;;;;;-1:-1:-1;11093:151:0;;;;;:::i;:::-;-1:-1:-1;;;;;11209:18:0;;;11182:7;11209:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;11093:151;41942:33;;;;;;;;;;;;;;;;55146:126;;;;;;;;;;;;;:::i;42716:31::-;;;;;;;;;;;;;;;;47943:134;;;;;;;;;;;;;:::i;53297:124::-;;;;;;;;;;-1:-1:-1;53297:124:0;;;;;:::i;:::-;;:::i;42104:37::-;;;;;;;;;;;;;;;;49477:507;;;;;;;;;;-1:-1:-1;49477:507:0;;;;;:::i;:::-;;:::i;54444:325::-;;;;;;;;;;-1:-1:-1;54444:325:0;;;;;:::i;:::-;;:::i;26663:244::-;;;;;;;;;;-1:-1:-1;26663:244:0;;;;;:::i;:::-;;:::i;67628:542::-;;;;;;;;;;;;;:::i;43075:31::-;;;;;;;;;;;;;;;;41982:24;;;;;;;;;;;;;;;;66174:1442;;;;;;;;;;-1:-1:-1;66174:1442:0;;;;;:::i;:::-;;:::i;41796:84::-;;;;;;;;;;;;;;;68277:527;;;;;;;;;;-1:-1:-1;68277:527:0;;;;;:::i;:::-;;:::i;49996:519::-;;;;;;;;;;-1:-1:-1;49996:519:0;;;;;:::i;:::-;;:::i;9224:100::-;9278:13;9311:5;9304:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9224:100;:::o;11391:169::-;11474:4;11491:39;305:10;11514:7;11523:6;11491:8;:39::i;:::-;-1:-1:-1;11548:4:0;11391:169;;;;;:::o;49012:230::-;25930:6;;-1:-1:-1;;;;;25930:6:0;305:10;25930:22;25922:67;;;;-1:-1:-1;;;25922:67:0;;;;;;;:::i;:::-;;;;;;;;;49127:4:::1;49121;49101:13;10432:12:::0;;;10344:108;49101:13:::1;:17;::::0;49117:1:::1;49101:17;:::i;:::-;:24;;;;:::i;:::-;49100:31;;;;:::i;:::-;49091:6;:40;49083:100;;;::::0;-1:-1:-1;;;49083:100:0;;10247:2:1;49083:100:0::1;::::0;::::1;10229:21:1::0;10286:2;10266:18;;;10259:30;10325:34;10305:18;;;10298:62;-1:-1:-1;;;10376:18:1;;;10369:45;10431:19;;49083:100:0::1;10045:411:1::0;49083:100:0::1;49217:17;:6:::0;49227::::1;49217:17;:::i;:::-;49194:20;:40:::0;-1:-1:-1;49012:230:0:o;52777:109::-;25930:6;;-1:-1:-1;;;;;25930:6:0;305:10;25930:22;25922:67;;;;-1:-1:-1;;;25922:67:0;;;;;;;:::i;:::-;52854:9:::1;:24:::0;;-1:-1:-1;;;;;;52854:24:0::1;-1:-1:-1::0;;;;;52854:24:0;;;::::1;::::0;;;::::1;::::0;;52777:109::o;51239:627::-;25930:6;;-1:-1:-1;;;;;25930:6:0;305:10;25930:22;25922:67;;;;-1:-1:-1;;;25922:67:0;;;;;;;:::i;:::-;51381:15:::1;:22;51363:7;:14;:40;51355:83;;;::::0;-1:-1:-1;;;51355:83:0;;10663:2:1;51355:83:0::1;::::0;::::1;10645:21:1::0;10702:2;10682:18;;;10675:30;10741:32;10721:18;;;10714:60;10791:18;;51355:83:0::1;10461:354:1::0;51355:83:0::1;51474:3;51457:7;:14;:20;51449:87;;;::::0;-1:-1:-1;;;51449:87:0;;11022:2:1;51449:87:0::1;::::0;::::1;11004:21:1::0;11061:2;11041:18;;;11034:30;11100:34;11080:18;;;11073:62;-1:-1:-1;;;11151:18:1;;;11144:52;11213:19;;51449:87:0::1;10820:418:1::0;51449:87:0::1;51649:9;51645:214;51668:7;:14;51664:1;:18;51645:214;;;51703:59;51719:10;51731:7;51739:1;51731:10;;;;;;;;:::i;:::-;;;;;;;51743:15;51759:1;51743:18;;;;;;;;:::i;:::-;;;;;;;51703:15;:59::i;:::-;51777:15;::::0;51812:10;;-1:-1:-1;;;;;51777:15:0;;::::1;::::0;:26:::1;::::0;51812:7;;51820:1;;51812:10;::::1;;;;;:::i;:::-;;;;;;;51825:21;51835:7;51843:1;51835:10;;;;;;;;:::i;:::-;;;;;;;51825:9;:21::i;:::-;51777:70;::::0;-1:-1:-1;;;;;;51777:70:0::1;::::0;;;;;;-1:-1:-1;;;;;11583:32:1;;;51777:70:0::1;::::0;::::1;11565:51:1::0;11632:18;;;11625:34;11538:18;;51777:70:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;51684:3;;;;;:::i;:::-;;;;51645:214;;;;51239:627:::0;;:::o;12042:355::-;12182:4;12199:36;12209:6;12217:9;12228:6;12199:9;:36::i;:::-;12246:121;12255:6;305:10;12277:89;12315:6;12277:89;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;12277:19:0;;;;;;:11;:19;;;;;;;;305:10;12277:33;;;;;;;;;;:37;:89::i;:::-;12246:8;:121::i;:::-;-1:-1:-1;12385:4:0;12042:355;;;;;:::o;53545:141::-;53635:15;;:43;;;-1:-1:-1;;;53635:43:0;;;;53608:7;;-1:-1:-1;;;;;53635:15:0;;:41;;:43;;;;;;;;;;;;;;:15;:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53628:50;;53545:141;:::o;48170:130::-;25930:6;;-1:-1:-1;;;;;25930:6:0;305:10;25930:22;25922:67;;;;-1:-1:-1;;;25922:67:0;;;;;;;:::i;:::-;48247:15:::1;::::0;:45:::1;::::0;-1:-1:-1;;;48247:45:0;;-1:-1:-1;;;;;2074:32:1;;;48247:45:0::1;::::0;::::1;2056:51:1::0;48247:15:0;;::::1;::::0;:36:::1;::::0;2029:18:1;;48247:45:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;48170:130:::0;:::o;12806:218::-;305:10;12894:4;12943:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;12943:34:0;;;;;;;;;;12894:4;;12911:83;;12934:7;;12943:50;;12982:10;12943:38;:50::i;55041:97::-;55072:15;;:58;;-1:-1:-1;;;55072:58:0;;55111:10;55072:58;;;12183:51:1;55072:15:0;12250:18:1;;;12243:50;-1:-1:-1;;;;;55072:15:0;;;;:30;;12156:18:1;;55072:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;55041:97::o;55280:141::-;55372:15;;:41;;;-1:-1:-1;;;55372:41:0;;;;55345:7;;-1:-1:-1;;;;;55372:15:0;;:39;;:41;;;;;;;;;;;;;;:15;:41;;;;;;;;;;53979:134;54070:15;;:38;;-1:-1:-1;;;54070:38:0;;-1:-1:-1;;;;;2074:32:1;;;54070:38:0;;;2056:51:1;54049:7:0;;54070:15;;:29;;2029:18:1;;54070:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;54774:259::-;54900:15;;:28;;-1:-1:-1;;;;;;54900:28:0;;;;;160:25:1;;;54834:18:0;;;;;;-1:-1:-1;;;;;54900:15:0;;:23;;133:18:1;;54900:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54938:87;;;13096:25:1;;;13152:2;13137:18;;13130:34;;;13180:18;;;13173:34;;;13238:2;13223:18;;13216:34;;;54833:95:0;;-1:-1:-1;54833:95:0;;-1:-1:-1;54833:95:0;-1:-1:-1;55015:9:0;;55003:5;;54938:87;;13083:3:1;13068:19;54938:87:0;;;;;;;54828:205;;;54774:259;:::o;10515:127::-;-1:-1:-1;;;;;10616:18:0;10589:7;10616:18;;;;;;;;;;;;10515:127::o;26360:148::-;25930:6;;-1:-1:-1;;;;;25930:6:0;305:10;25930:22;25922:67;;;;-1:-1:-1;;;25922:67:0;;;;;;;:::i;:::-;26451:6:::1;::::0;26430:40:::1;::::0;26467:1:::1;::::0;-1:-1:-1;;;;;26451:6:0::1;::::0;26430:40:::1;::::0;26467:1;;26430:40:::1;26481:6;:19:::0;;-1:-1:-1;;;;;;26481:19:0::1;::::0;;26360:148::o;55433:119::-;55514:15;;:30;;;-1:-1:-1;;;55514:30:0;;;;55487:7;;-1:-1:-1;;;;;55514:15:0;;:28;;:30;;;;;;;;;;;;;;:15;:30;;;;;;;;;;55608:159;25930:6;;55660:4;;-1:-1:-1;;;;;25930:6:0;305:10;25930:22;25922:67;;;;-1:-1:-1;;;25922:67:0;;;;;;;:::i;:::-;-1:-1:-1;55676:14:0::1;:22:::0;;-1:-1:-1;;55676:22:0;;::::1;::::0;;;55709:20:::1;:28:::0;;;;::::1;::::0;;55676:22;55608:159;:::o;50523:202::-;25930:6;;-1:-1:-1;;;;;25930:6:0;305:10;25930:22;25922:67;;;;-1:-1:-1;;;25922:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;50613:39:0;::::1;;::::0;;;:31:::1;:39;::::0;;;;;;;;:46;;-1:-1:-1;;50613:46:0::1;::::0;::::1;;::::0;;::::1;::::0;;;50675:42;;1394:41:1;;;50675:42:0::1;::::0;1367:18:1;50675:42:0::1;;;;;;;;50523:202:::0;;:::o;68816:191::-;25930:6;;-1:-1:-1;;;;;25930:6:0;305:10;25930:22;25922:67;;;;-1:-1:-1;;;25922:67:0;;;;;;;:::i;:::-;68892:58:::1;::::0;68875:12:::1;::::0;68900:10:::1;::::0;68924:21:::1;::::0;68875:12;68892:58;68875:12;68892:58;68924:21;68900:10;68892:58:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68874:76;;;68969:7;68961:38;;;::::0;-1:-1:-1;;;68961:38:0;;13673:2:1;68961:38:0::1;::::0;::::1;13655:21:1::0;13712:2;13692:18;;;13685:30;-1:-1:-1;;;13731:18:1;;;13724:48;13789:18;;68961:38:0::1;13471:342:1::0;52894:395:0;25930:6;;-1:-1:-1;;;;;25930:6:0;305:10;25930:22;25922:67;;;;-1:-1:-1;;;25922:67:0;;;;;;;:::i;:::-;52994:6:::1;52982:8;:18;;:40;;;;;53016:6;53004:8;:18;;52982:40;52974:106;;;::::0;-1:-1:-1;;;52974:106:0;;14020:2:1;52974:106:0::1;::::0;::::1;14002:21:1::0;14059:2;14039:18;;;14032:30;14098:34;14078:18;;;14071:62;-1:-1:-1;;;14149:18:1;;;14142:51;14210:19;;52974:106:0::1;13818:417:1::0;52974:106:0::1;53111:16;;53099:8;:28;;53091:85;;;::::0;-1:-1:-1;;;53091:85:0;;14442:2:1;53091:85:0::1;::::0;::::1;14424:21:1::0;14481:2;14461:18;;;14454:30;14520:34;14500:18;;;14493:62;-1:-1:-1;;;14571:18:1;;;14564:42;14623:19;;53091:85:0::1;14240:408:1::0;53091:85:0::1;53226:16;::::0;53192:51:::1;::::0;53216:8;;53192:51:::1;::::0;;;::::1;53254:16;:27:::0;52894:395::o;48589:214::-;25930:6;;-1:-1:-1;;;;;25930:6:0;305:10;25930:22;25922:67;;;;-1:-1:-1;;;25922:67:0;;;;;;;:::i;:::-;48644:13:::1;:20:::0;;-1:-1:-1;;48675:18:0;;;;;48725:12:::1;48704:18;:33:::0;48769:26:::1;:15;48787:8;48769:26;:::i;:::-;48748:18;:47:::0;48589:214::o;48903:101::-;25930:6;;-1:-1:-1;;;;;25930:6:0;305:10;25930:22;25922:67;;;;-1:-1:-1;;;25922:67:0;;;;;;;:::i;:::-;48975:11:::1;:21:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;48975:21:0;;::::1;::::0;;;::::1;::::0;;48903:101::o;9443:104::-;9499:13;9532:7;9525:14;;;;;:::i;51874:277::-;25930:6;;-1:-1:-1;;;;;25930:6:0;305:10;25930:22;25922:67;;;;-1:-1:-1;;;25922:67:0;;;;;;;:::i;:::-;51995:13:::1;-1:-1:-1::0;;;;;51980:28:0::1;:11;-1:-1:-1::0;;;;;51980:28:0::1;;;51972:110;;;::::0;-1:-1:-1;;;51972:110:0;;14988:2:1;51972:110:0::1;::::0;::::1;14970:21:1::0;15027:2;15007:18;;;15000:30;15066:34;15046:18;;;15039:62;15137:34;15117:18;;;15110:62;-1:-1:-1;;;15188:19:1;;;15181:36;15234:19;;51972:110:0::1;14786:473:1::0;51972:110:0::1;52095:48;52124:11;52137:5;52095:28;:48::i;:::-;51874:277:::0;;:::o;53429:108::-;53502:15;;:27;;;-1:-1:-1;;;53502:27:0;;;;53475:7;;-1:-1:-1;;;;;53502:15:0;;:25;;:27;;;;;;;;;;;;;;:15;:27;;;;;;;;;;13527:269;13620:4;13637:129;305:10;13660:7;13669:96;13708:15;13669:96;;;;;;;;;;;;;;;;;305:10;13669:25;;;;:11;:25;;;;;;;;-1:-1:-1;;;;;13669:34:0;;;;;;;;;;;;:38;:96::i;53827:147::-;53920:15;;:47;;-1:-1:-1;;;53920:47:0;;-1:-1:-1;;;;;2074:32:1;;;53920:47:0;;;2056:51:1;53896:7:0;;53920:15;;:38;;2029:18:1;;53920:47:0;1883:230:1;10855:175:0;10941:4;10958:42;305:10;10982:9;10993:6;10958:9;:42::i;52505:260::-;25930:6;;-1:-1:-1;;;;;25930:6:0;305:10;25930:22;25922:67;;;;-1:-1:-1;;;25922:67:0;;;;;;;:::i;:::-;52594:41:::1;52610:18;52630:4;52594:15;:41::i;:::-;52694:15;::::0;52651:59:::1;::::0;-1:-1:-1;;;;;52694:15:0;;::::1;::::0;52651:59;::::1;::::0;::::1;::::0;52694:15:::1;::::0;52651:59:::1;52721:15;:36:::0;;-1:-1:-1;;;;;;52721:36:0::1;-1:-1:-1::0;;;;;52721:36:0;;;::::1;::::0;;;::::1;::::0;;52505:260::o;54121:318::-;54396:15;;:35;;-1:-1:-1;;;54396:35:0;;-1:-1:-1;;;;;2074:32:1;;;54396:35:0;;;2056:51:1;54217:7:0;;;;;;;;;;;;;;;;54396:15;;;:26;;2029:18:1;;54396:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54389:42;;;;;;;;;;;;;;;;54121:318;;;;;;;;;:::o;64605:1557::-;25930:6;;-1:-1:-1;;;;;25930:6:0;305:10;25930:22;25922:67;;;;-1:-1:-1;;;25922:67:0;;;;;;;:::i;:::-;64691:16:::1;::::0;::::1;;:26;;::::0;::::1;;;;64683:67;;;::::0;-1:-1:-1;;;64683:67:0;;16152:2:1;64683:67:0::1;::::0;::::1;16134:21:1::0;16191:2;16171:18;;;16164:30;16230;16210:18;;;16203:58;16278:18;;64683:67:0::1;15950:352:1::0;64683:67:0::1;64846:6;64843:1269;;;64868:16;:23:::0;;-1:-1:-1;;64868:23:0::1;64887:4;64868:23;::::0;;64923:2:::1;64906:14;:19:::0;;;64959:1:::1;64940:16;:20:::0;;;64994:1:::1;64975:16;:20:::0;;;65010:10:::1;:14:::0;;;65039:11:::1;:15:::0;;;64994:1;;;;;65085:33:::1;::::0;64959:1;65085:33:::1;:::i;:::-;:52;;;;:::i;:::-;:65;;;;:::i;:::-;:79;;;;:::i;:::-;65069:13;:95:::0;65209:1:::1;65193:13;:17:::0;;;65225:15:::1;:19:::0;;;65259:15:::1;:19:::0;;;65293:9:::1;:13:::0;;;-1:-1:-1;65321:10:0::1;:14:::0;;;-1:-1:-1;65209:1:0;65365:31:::1;65209:1:::0;;65365:31:::1;:::i;:::-;:49;;;;:::i;:::-;:61;;;;:::i;:::-;:74;;;;:::i;:::-;65350:12;:89:::0;64843:1269:::1;;;65507:6;65503:609;;65529:16;:24:::0;;-1:-1:-1;;65529:24:0::1;::::0;;65585:1:::1;65568:14;:18:::0;;;65620:1:::1;65601:16;:20:::0;;;65636:16:::1;:20:::0;;;65671:10:::1;:14:::0;;;65700:11:::1;:15:::0;;;65620:1;;;;;65746:33:::1;::::0;65620:1;;65746:33:::1;:::i;:::-;:52;;;;:::i;:::-;:65;;;;:::i;:::-;:79;;;;:::i;:::-;65730:13;:95:::0;65870:1:::1;65854:13;:17:::0;;;65904:1:::1;65886:15;:19:::0;;;65938:1:::1;65920:15;:19:::0;;;65954:9:::1;:13:::0;;;-1:-1:-1;65982:10:0::1;:14:::0;;;-1:-1:-1;66026:31:0::1;::::0;65904:1;;66026:31:::1;:::i;:::-;:49;;;;:::i;:::-;:61;;;;:::i;:::-;:74;;;;:::i;:::-;66011:12;:89:::0;65503:609:::1;66137:17;::::0;1419:14:1;;1412:22;1394:41;;66137:17:0::1;::::0;1382:2:1;1367:18;66137:17:0::1;;;;;;;64605:1557:::0;:::o;50733:184::-;25930:6;;-1:-1:-1;;;;;25930:6:0;305:10;25930:22;25922:67;;;;-1:-1:-1;;;25922:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;50818:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;;;;:39;;-1:-1:-1;;50818:39:0::1;::::0;::::1;;::::0;;::::1;::::0;;;50875:34;;1394:41:1;;;50875:34:0::1;::::0;1367:18:1;50875:34:0::1;1254:187:1::0;48405:126:0;25930:6;;-1:-1:-1;;;;;25930:6:0;305:10;25930:22;25922:67;;;;-1:-1:-1;;;25922:67:0;;;;;;;:::i;:::-;48480:15:::1;::::0;:43:::1;::::0;-1:-1:-1;;;48480:43:0;;-1:-1:-1;;;;;2074:32:1;;;48480:43:0::1;::::0;::::1;2056:51:1::0;48480:15:0;;::::1;::::0;:34:::1;::::0;2029:18:1;;48480:43:0::1;1883:230:1::0;49254:211:0;25930:6;;-1:-1:-1;;;;;25930:6:0;305:10;25930:22;25922:67;;;;-1:-1:-1;;;25922:67:0;;;;;;;:::i;:::-;49374:4:::1;49369:3;49349:13;10432:12:::0;;;10344:108;49349:13:::1;:17;::::0;49365:1:::1;49349:17;:::i;:::-;:23;;;;:::i;:::-;49348:30;;;;:::i;:::-;49339:6;:39;49331:86;;;::::0;-1:-1:-1;;;49331:86:0;;16509:2:1;49331:86:0::1;::::0;::::1;16491:21:1::0;16548:2;16528:18;;;16521:30;16587:34;16567:18;;;16560:62;-1:-1:-1;;;16638:18:1;;;16631:32;16680:19;;49331:86:0::1;16307:398:1::0;49331:86:0::1;49440:17;:6:::0;49450::::1;49440:17;:::i;:::-;49428:9;:29:::0;-1:-1:-1;49254:211:0:o;50925:306::-;25930:6;;-1:-1:-1;;;;;25930:6:0;305:10;25930:22;25922:67;;;;-1:-1:-1;;;25922:67:0;;;;;;;:::i;:::-;51044:9:::1;51040:115;51059:19:::0;;::::1;51040:115;;;51135:8;51100:19;:32;51120:8;;51129:1;51120:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;51100:32:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;51100:32:0;:43;;-1:-1:-1;;51100:43:0::1;::::0;::::1;;::::0;;;::::1;::::0;;51080:3;::::1;::::0;::::1;:::i;:::-;;;;51040:115;;;;51172:51;51204:8;;51214;51172:51;;;;;;;;:::i;:::-;;;;;;;;50925:306:::0;;;:::o;55146:126::-;55225:15;;:39;;;-1:-1:-1;;;55225:39:0;;;;55201:7;;-1:-1:-1;;;;;55225:15:0;;:37;;:39;;;;;;;;;;;;;;:15;:39;;;;;;;;;;47943:134;25930:6;;48003:4;;-1:-1:-1;;;;;25930:6:0;305:10;25930:22;25922:67;;;;-1:-1:-1;;;25922:67:0;;;;;;;:::i;:::-;-1:-1:-1;48019:20:0::1;:28:::0;;-1:-1:-1;;48019:28:0::1;::::0;;;47943:134;:::o;53297:124::-;25930:6;;-1:-1:-1;;;;;25930:6:0;305:10;25930:22;25922:67;;;;-1:-1:-1;;;25922:67:0;;;;;;;:::i;:::-;53371:15:::1;::::0;:42:::1;::::0;-1:-1:-1;;;53371:42:0;;::::1;::::0;::::1;160:25:1::0;;;-1:-1:-1;;;;;53371:15:0;;::::1;::::0;:31:::1;::::0;133:18:1;;53371:42:0::1;14:177:1::0;49477:507:0;25930:6;;-1:-1:-1;;;;;25930:6:0;305:10;25930:22;25922:67;;;;-1:-1:-1;;;25922:67:0;;;;;;;:::i;:::-;49632:15:::1;:31:::0;;;49674:13:::1;:27:::0;;;49712:15:::1;:31:::0;;;49754:9:::1;:19:::0;;;49784:10:::1;:21:::0;;;49797:8;49766:7;49730:13;49831:31:::1;49690:11:::0;49650:13;49831:31:::1;:::i;:::-;:49;;;;:::i;:::-;:61;;;;:::i;:::-;:74;;;;:::i;:::-;49816:12;:89:::0;;;49940:2:::1;-1:-1:-1::0;49924:18:0::1;49916:60;;;::::0;-1:-1:-1;;;49916:60:0;;17711:2:1;49916:60:0::1;::::0;::::1;17693:21:1::0;17750:2;17730:18;;;17723:30;17789:31;17769:18;;;17762:59;17838:18;;49916:60:0::1;17509:353:1::0;54444:325:0;54721:15;;:40;;-1:-1:-1;;;54721:40:0;;;;;160:25:1;;;54545:7:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;54721:15:0;;;;:33;;133:18:1;;54721:40:0;14:177:1;26663:244:0;25930:6;;-1:-1:-1;;;;;25930:6:0;305:10;25930:22;25922:67;;;;-1:-1:-1;;;25922:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;26752:22:0;::::1;26744:73;;;::::0;-1:-1:-1;;;26744:73:0;;18069:2:1;26744:73:0::1;::::0;::::1;18051:21:1::0;18108:2;18088:18;;;18081:30;18147:34;18127:18;;;18120:62;-1:-1:-1;;;18198:18:1;;;18191:36;18244:19;;26744:73:0::1;17867:402:1::0;26744:73:0::1;26854:6;::::0;26833:38:::1;::::0;-1:-1:-1;;;;;26833:38:0;;::::1;::::0;26854:6:::1;::::0;26833:38:::1;::::0;26854:6:::1;::::0;26833:38:::1;26882:6;:17:::0;;-1:-1:-1;;;;;;26882:17:0::1;-1:-1:-1::0;;;;;26882:17:0;;;::::1;::::0;;;::::1;::::0;;26663:244::o;67628:542::-;25930:6;;-1:-1:-1;;;;;25930:6:0;305:10;25930:22;25922:67;;;;-1:-1:-1;;;25922:67:0;;;;;;;:::i;:::-;67695:1:::1;67678:14;:18:::0;;;67726:1:::1;67707:16;:20:::0;;;67738:16:::1;:20:::0;;;67769:10:::1;:14:::0;;;67794:11:::1;:15:::0;;;67726:1;;;;;67836:33:::1;::::0;67726:1;;67836:33:::1;:::i;:::-;:52;;;;:::i;:::-;:65;;;;:::i;:::-;:79;;;;:::i;:::-;67820:13;:95:::0;67952:1:::1;67936:13;:17:::0;;;67982:1:::1;67964:15;:19:::0;;;68012:1:::1;67994:15;:19:::0;;;68024:9:::1;:13:::0;;;-1:-1:-1;68048:10:0::1;:14:::0;;;-1:-1:-1;68088:31:0::1;::::0;67982:1;;68088:31:::1;:::i;:::-;:49;;;;:::i;:::-;:61;;;;:::i;:::-;:74;;;;:::i;:::-;68073:12;:89:::0;67628:542::o;66174:1442::-;25930:6;;-1:-1:-1;;;;;25930:6:0;305:10;25930:22;25922:67;;;;-1:-1:-1;;;25922:67:0;;;;;;;:::i;:::-;66259:13:::1;::::0;::::1;::::0;::::1;;;66258:14;::::0;:25:::1;;;66277:6;66276:7;66258:25;66250:81;;;::::0;-1:-1:-1;;;66250:81:0;;18476:2:1;66250:81:0::1;::::0;::::1;18458:21:1::0;18515:2;18495:18;;;18488:30;18554:34;18534:18;;;18527:62;-1:-1:-1;;;18605:18:1;;;18598:41;18656:19;;66250:81:0::1;18274:407:1::0;66250:81:0::1;66347:6;66344:1265;;;66369:13;:20:::0;;-1:-1:-1;;66369:20:0::1;;;::::0;;66421:1:::1;66404:14;:18:::0;;;66456:1:::1;66437:16;:20:::0;;;66491:1:::1;66472:16;:20:::0;;;66507:10:::1;:14:::0;;;66536:11:::1;:15:::0;;;66491:1;;;;;66582:33:::1;::::0;66456:1;66582:33:::1;:::i;:::-;:52;;;;:::i;:::-;:65;;;;:::i;:::-;:79;;;;:::i;:::-;66566:13;:95:::0;66706:1:::1;66690:13;:17:::0;;;66740:1:::1;66722:15;:19:::0;;;66774:1:::1;66756:15;:19:::0;;;66790:9:::1;:13:::0;;;-1:-1:-1;66818:10:0::1;:14:::0;;;-1:-1:-1;66862:31:0::1;::::0;66740:1;;66862:31:::1;:::i;:::-;:49;;;;:::i;:::-;:61;;;;:::i;:::-;:74;;;;:::i;:::-;66847:12;:89:::0;55072:58;55041:97::o;66344:1265::-:1;67004:6;67000:609;;67026:16;:24:::0;;-1:-1:-1;;67026:24:0::1;::::0;;67082:1:::1;67065:14;:18:::0;;;67117:1:::1;67098:16;:20:::0;;;67133:16:::1;:20:::0;;;67168:10:::1;:14:::0;;;67197:11:::1;:15:::0;;;67117:1;;;;;67243:33:::1;::::0;67117:1;;67243:33:::1;:::i;68277:527::-:0;25930:6;;-1:-1:-1;;;;;25930:6:0;305:10;25930:22;25922:67;;;;-1:-1:-1;;;25922:67:0;;;;;;;:::i;:::-;68436:16:::1;::::0;;68450:1:::1;68436:16:::0;;;;;::::1;::::0;;68412:21:::1;::::0;68436:16:::1;::::0;::::1;::::0;;::::1;::::0;::::1;-1:-1:-1::0;;68473:15:0::1;::::0;:22:::1;::::0;;-1:-1:-1;;;68473:22:0;;;;68412:40;;-1:-1:-1;;;;;;68473:15:0;;::::1;::::0;:20:::1;::::0;-1:-1:-1;68473:22:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;:15;:22;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;68463:4;68468:1;68463:7;;;;;;;;:::i;:::-;;;;;;:32;-1:-1:-1::0;;;;;68463:32:0::1;;;-1:-1:-1::0;;;;;68463:32:0::1;;;::::0;::::1;68524:4;68506;68511:1;68506:7;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;68506:23:0;;::::1;:7;::::0;;::::1;::::0;;;;;:23;68568:15:::1;::::0;:228:::1;::::0;-1:-1:-1;;;68568:228:0;;:15;::::1;::::0;:66:::1;::::0;68642:14;;68568:228:::1;::::0;:15:::1;::::0;68721:4;;68748:6:::1;::::0;68770:15:::1;::::0;68568:228:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;68343:461;68277:527:::0;:::o;49996:519::-;25930:6;;-1:-1:-1;;;;;25930:6:0;305:10;25930:22;25922:67;;;;-1:-1:-1;;;25922:67:0;;;;;;;:::i;:::-;50152:16:::1;:32:::0;;;50195:14:::1;:28:::0;;;50234:16:::1;:32:::0;;;50277:10:::1;:20:::0;;;50308:11:::1;:22:::0;;;50322:8;50290:7;50253:13;50357:33:::1;50212:11:::0;50171:13;50357:33:::1;:::i;:::-;:52;;;;:::i;:::-;:65;;;;:::i;:::-;:79;;;;:::i;:::-;50341:13;:95:::0;50455:12:::1;::::0;50471:2:::1;-1:-1:-1::0;50455:18:0::1;50447:60;;;::::0;-1:-1:-1;;;50447:60:0;;20125:2:1;50447:60:0::1;::::0;::::1;20107:21:1::0;20164:2;20144:18;;;20137:30;20203:31;20183:18;;;20176:59;20252:18;;50447:60:0::1;19923:353:1::0;20762:181:0;20820:7;;20852:5;20856:1;20852;:5;:::i;:::-;20840:17;;20881:1;20876;:6;;20868:46;;;;-1:-1:-1;;;20868:46:0;;20483:2:1;20868:46:0;;;20465:21:1;20522:2;20502:18;;;20495:30;20561:29;20541:18;;;20534:57;20608:18;;20868:46:0;20281:351:1;20868:46:0;20934:1;20762:181;-1:-1:-1;;;20762:181:0:o;16713:380::-;-1:-1:-1;;;;;16849:19:0;;16841:68;;;;-1:-1:-1;;;16841:68:0;;20839:2:1;16841:68:0;;;20821:21:1;20878:2;20858:18;;;20851:30;20917:34;20897:18;;;20890:62;-1:-1:-1;;;20968:18:1;;;20961:34;21012:19;;16841:68:0;20637:400:1;16841:68:0;-1:-1:-1;;;;;16928:21:0;;16920:68;;;;-1:-1:-1;;;16920:68:0;;21244:2:1;16920:68:0;;;21226:21:1;21283:2;21263:18;;;21256:30;21322:34;21302:18;;;21295:62;-1:-1:-1;;;21373:18:1;;;21366:32;21415:19;;16920:68:0;21042:398:1;16920:68:0;-1:-1:-1;;;;;17001:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;17053:32;;160:25:1;;;17053:32:0;;133:18:1;17053:32:0;;;;;;;;16713:380;;;:::o;14286:573::-;-1:-1:-1;;;;;14426:20:0;;14418:70;;;;-1:-1:-1;;;14418:70:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;14507:23:0;;14499:71;;;;-1:-1:-1;;;14499:71:0;;;;;;;:::i;:::-;14663;14685:6;14663:71;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;14663:17:0;;:9;:17;;;;;;;;;;;;:71;:21;:71::i;:::-;-1:-1:-1;;;;;14643:17:0;;;:9;:17;;;;;;;;;;;:91;;;;14768:20;;;;;;;:32;;14793:6;14768:24;:32::i;:::-;-1:-1:-1;;;;;14745:20:0;;;:9;:20;;;;;;;;;;;;:55;;;;14816:35;160:25:1;;;14745:20:0;;14816:35;;;;;;133:18:1;14816:35:0;14:177:1;55779:4924:0;-1:-1:-1;;;;;55911:18:0;;55903:68;;;;-1:-1:-1;;;55903:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;55990:16:0;;55982:64;;;;-1:-1:-1;;;55982:64:0;;;;;;;:::i;:::-;56071:11;56068:92;;56099:28;56115:4;56121:2;56125:1;56099:15;:28::i;56068:92::-;56184:13;;;;;;;56180:136;;-1:-1:-1;;;;;56221:25:0;;;;;;:19;:25;;;;;;;;;:52;;-1:-1:-1;;;;;;56250:23:0;;;;;;:19;:23;;;;;;;;56221:52;56213:91;;;;-1:-1:-1;;;56213:91:0;;22457:2:1;56213:91:0;;;22439:21:1;22496:2;22476:18;;;22469:30;22535:28;22515:18;;;22508:56;22581:18;;56213:91:0;22255:350:1;56213:91:0;56339:14;;;;56336:1543;;;25783:6;;-1:-1:-1;;;;;56391:15:0;;;25783:6;;56391:15;;;;:49;;-1:-1:-1;25783:6:0;;-1:-1:-1;;;;;56427:13:0;;;25783:6;;56427:13;;56391:49;:86;;;;-1:-1:-1;;;;;;56461:16:0;;;;56391:86;:128;;;;-1:-1:-1;;;;;;56498:21:0;;56512:6;56498:21;;56391:128;:158;;;;-1:-1:-1;56541:8:0;;-1:-1:-1;;;56541:8:0;;;;56540:9;56391:158;56369:1499;;;56723:20;;;;56719:423;;;25783:6;;-1:-1:-1;;;;;56771:13:0;;;25783:6;;56771:13;;;;:47;;-1:-1:-1;56802:15:0;;-1:-1:-1;;;;;56788:30:0;;;56802:15;;56788:30;;56771:47;:79;;;;;56836:13;-1:-1:-1;;;;;56822:28:0;:2;-1:-1:-1;;;;;56822:28:0;;;56771:79;56767:356;;;56915:9;56886:39;;;;:28;:39;;;;;;56928:12;-1:-1:-1;56878:140:0;;;;-1:-1:-1;;;56878:140:0;;22812:2:1;56878:140:0;;;22794:21:1;22851:2;22831:18;;;22824:30;22890:34;22870:18;;;22863:62;22961:34;22941:18;;;22934:62;-1:-1:-1;;;23012:19:1;;;23005:40;23062:19;;56878:140:0;22610:477:1;56878:140:0;57074:9;57045:39;;;;:28;:39;;;;;57087:12;57045:54;;56767:356;-1:-1:-1;;;;;57210:31:0;;;;;;:25;:31;;;;;;;;:71;;;;-1:-1:-1;;;;;;57246:35:0;;;;;;:31;:35;;;;;;;;57245:36;57210:71;57206:647;;;57340:9;;57323:13;57333:2;57323:9;:13::i;:::-;57314:22;;:6;:22;:::i;:::-;:35;;57306:75;;;;-1:-1:-1;;;57306:75:0;;23294:2:1;57306:75:0;;;23276:21:1;23333:2;23313:18;;;23306:30;23372:29;23352:18;;;23345:57;23419:18;;57306:75:0;23092:351:1;57306:75:0;57206:647;;;-1:-1:-1;;;;;57458:29:0;;;;;;:25;:29;;;;;;;;:71;;;;-1:-1:-1;;;;;;57492:37:0;;;;;;:31;:37;;;;;;;;57491:38;57458:71;57454:399;;;57572:20;;57562:6;:30;;57554:97;;;;-1:-1:-1;;;57554:97:0;;23650:2:1;57554:97:0;;;23632:21:1;23689:2;23669:18;;;23662:30;23728:34;23708:18;;;23701:62;-1:-1:-1;;;23779:18:1;;;23772:52;23841:19;;57554:97:0;23448:418:1;57454:399:0;-1:-1:-1;;;;;57698:35:0;;;;;;:31;:35;;;;;;;;57694:159;;57792:9;;57775:13;57785:2;57775:9;:13::i;:::-;57766:22;;:6;:22;:::i;:::-;:35;;57758:75;;;;-1:-1:-1;;;57758:75:0;;23294:2:1;57758:75:0;;;23276:21:1;23333:2;23313:18;;;23306:30;23372:29;23352:18;;;23345:57;23419:18;;57758:75:0;23092:351:1;57758:75:0;57885:28;57916:24;57934:4;57916:9;:24::i;:::-;58000:18;;57885:55;;-1:-1:-1;57976:42:0;;;;;;;58049:35;;-1:-1:-1;58073:11:0;;;;;;;58049:35;:61;;;;-1:-1:-1;58102:8:0;;-1:-1:-1;;;58102:8:0;;;;58101:9;58049:61;:110;;;;-1:-1:-1;;;;;;58128:31:0;;;;;;:25;:31;;;;;;;;58127:32;58049:110;:153;;;;-1:-1:-1;;;;;;58177:25:0;;;;;;:19;:25;;;;;;;;58176:26;58049:153;:194;;;;-1:-1:-1;;;;;;58220:23:0;;;;;;:19;:23;;;;;;;;58219:24;58049:194;58031:322;;;58270:8;:15;;-1:-1:-1;;;;58270:15:0;-1:-1:-1;;;58270:15:0;;;58300:10;:8;:10::i;:::-;58325:8;:16;;-1:-1:-1;;;;58325:16:0;;;58031:322;58381:8;;-1:-1:-1;;;;;58490:25:0;;58365:12;58490:25;;;:19;:25;;;;;;58381:8;-1:-1:-1;;;58381:8:0;;;;;58380:9;;58490:25;;:52;;-1:-1:-1;;;;;;58519:23:0;;;;;;:19;:23;;;;;;;;58490:52;58487:99;;;-1:-1:-1;58569:5:0;58487:99;58606:12;58633:21;58733:7;58730:1434;;;-1:-1:-1;;;;;58784:29:0;;;;;;:25;:29;;;;;;;;:50;;;;;58833:1;58817:13;;:17;58784:50;58780:1034;;;58861:34;58891:3;58861:25;58872:13;;58861:6;:10;;:25;;;;:::i;:::-;:29;;:34::i;:::-;58854:41;;58958:13;;58941:14;;58934:4;:21;;;;:::i;:::-;:37;;;;:::i;:::-;58914:16;;:57;;;;;;;:::i;:::-;;;;-1:-1:-1;;59038:13:0;;59019:16;;59012:23;;:4;:23;:::i;:::-;:39;;;;:::i;:::-;58990:18;;:61;;;;;;;:::i;:::-;;;;-1:-1:-1;;59107:13:0;;59093:11;;59086:18;;:4;:18;:::i;:::-;:34;;;;:::i;:::-;59070:50;;59175:13;;59162:10;;59155:4;:17;;;;:::i;:::-;:33;;;;:::i;:::-;59139:12;;:49;;;;;;;:::i;:::-;;;;-1:-1:-1;;59255:13:0;;59236:16;;59229:23;;:4;:23;:::i;:::-;:39;;;;:::i;:::-;59207:18;;:61;;;;;;;:::i;:::-;;;;-1:-1:-1;58780:1034:0;;-1:-1:-1;58780:1034:0;;-1:-1:-1;;;;;59329:31:0;;;;;;:25;:31;;;;;;;;:51;;;;;59379:1;59364:12;;:16;59329:51;59326:488;;;59405:33;59434:3;59405:24;59416:12;;59405:6;:10;;:24;;;;:::i;:33::-;59398:40;;59497:12;;59481:13;;59474:4;:20;;;;:::i;:::-;:35;;;;:::i;:::-;59454:16;;:55;;;;;;;:::i;:::-;;;;-1:-1:-1;;59575:12:0;;59557:15;;59550:22;;:4;:22;:::i;:::-;:37;;;;:::i;:::-;59528:18;;:59;;;;;;;:::i;:::-;;;;-1:-1:-1;;59642:12:0;;59629:10;;59622:17;;:4;:17;:::i;:::-;:32;;;;:::i;:::-;59606:48;;59708:12;;59696:9;;59689:4;:16;;;;:::i;:::-;:31;;;;:::i;:::-;59673:12;;:47;;;;;;;:::i;:::-;;;;-1:-1:-1;;59786:12:0;;59768:15;;59761:22;;:4;:22;:::i;:::-;:37;;;;:::i;:::-;59739:18;;:59;;;;;;;:::i;:::-;;;;-1:-1:-1;;59326:488:0;59873:17;;59870:109;;59910:53;59926:4;59940:6;59949:13;59910:15;:53::i;:::-;60010:8;;60007:109;;60042:58;60058:4;60072;60079:20;60086:13;60079:4;:20;:::i;:::-;60042:15;:58::i;:::-;60138:14;60148:4;60138:14;;:::i;:::-;;;58730:1434;60176:33;60192:4;60198:2;60202:6;60176:15;:33::i;:::-;60226:15;;-1:-1:-1;;;;;60226:15:0;:26;60261:4;60268:15;60261:4;60268:9;:15::i;:::-;60226:58;;-1:-1:-1;;;;;;60226:58:0;;;;;;;-1:-1:-1;;;;;11583:32:1;;;60226:58:0;;;11565:51:1;11632:18;;;11625:34;11538:18;;60226:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60222:74;60310:15;;-1:-1:-1;;;;;60310:15:0;:26;60345:2;60350:13;60345:2;60350:9;:13::i;:::-;60310:54;;-1:-1:-1;;;;;;60310:54:0;;;;;;;-1:-1:-1;;;;;11583:32:1;;;60310:54:0;;;11565:51:1;11632:18;;;11625:34;11538:18;;60310:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60306:70;60392:8;;-1:-1:-1;;;60392:8:0;;;;60388:308;;60425:16;;;60456:15;;:28;;-1:-1:-1;;;;;;60456:28:0;;;;;160:25:1;;;60425:16:0;;-1:-1:-1;;;;;60456:15:0;;;;:23;;133:18:1;60456:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;60456:28:0;;;;;;;;-1:-1:-1;;60456:28:0;;;;;;;;;;;;:::i;:::-;;;60452:233;;;;;60573:86;;;13096:25:1;;;13152:2;13137:18;;13130:34;;;13180:18;;;13173:34;;;13238:2;13223:18;;13216:34;;;60649:9:0;;60638:4;;60573:86;;13083:3:1;13068:19;60573:86:0;;;;;;;60485:184;;;60452:233;60402:294;60388:308;55892:4811;;;;;55779:4924;;;:::o;21665:192::-;21751:7;21787:12;21779:6;;;;21771:29;;;;-1:-1:-1;;;21771:29:0;;;;;;;;:::i;:::-;-1:-1:-1;21811:9:0;21823:5;21827:1;21823;:5;:::i;:::-;21811:17;21665:192;-1:-1:-1;;;;;21665:192:0:o;52159:338::-;-1:-1:-1;;;;;52242:31:0;;;;;;:25;:31;;;;;:39;;-1:-1:-1;;52242:39:0;;;;;;;52294:38;52242:31;:39;52294:25;:38::i;:::-;52356:5;52353:79;;;52378:15;;:42;;-1:-1:-1;;;52378:42:0;;-1:-1:-1;;;;;2074:32:1;;;52378:42:0;;;2056:51:1;52378:15:0;;;;:36;;2029:18:1;;52378:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52353:79;52449:40;;;;;;-1:-1:-1;;;;;52449:40:0;;;;;;;;52159:338;;:::o;62345:2248::-;62384:23;62410:24;62428:4;62410:9;:24::i;:::-;62384:50;;62445:25;62534:12;;62515:16;;62494:18;;62473;;:39;;;;:::i;:::-;:58;;;;:::i;:::-;:73;;;;:::i;:::-;62445:101;-1:-1:-1;62570:20:0;;;:46;;-1:-1:-1;62594:22:0;;62570:46;62567:60;;;62619:7;;62345:2248::o;62567:60::-;62696:23;62781:1;62761:17;62740:18;;62722:15;:36;;;;:::i;:::-;:56;;;;:::i;:::-;:60;;;;:::i;:::-;62696:86;-1:-1:-1;62793:26:0;62822:36;:15;62696:86;62822:19;:36::i;:::-;62793:65;-1:-1:-1;62907:21:0;62941:36;62793:65;62941:16;:36::i;:::-;62999:18;63020:44;:21;63046:17;63020:25;:44::i;:::-;62999:65;;63085:23;63111:57;63150:17;63111:34;63126:18;;63111:10;:14;;:34;;;;:::i;:57::-;63085:83;;63179:17;63199:51;63232:17;63199:28;63214:12;;63199:10;:14;;:28;;;;:::i;:51::-;63179:71;;63261:21;63285:55;63322:17;63285:32;63300:16;;63285:10;:14;;:32;;;;:::i;:55::-;63261:79;-1:-1:-1;63361:23:0;63261:79;63418:9;63387:28;63400:15;63387:10;:28;:::i;:::-;:40;;;;:::i;:::-;:56;;;;:::i;:::-;63485:1;63464:18;:22;;;63497:18;:22;;;63530:16;:20;;;63561:12;:16;;;63624:15;;63616:57;;63361:82;;-1:-1:-1;63485:1:0;;-1:-1:-1;;;;;63624:15:0;;;;63653;;63485:1;63616:57;63485:1;63616:57;63653:15;63624;63616:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;63705:9:0;;63697:45;;63598:75;;-1:-1:-1;;;;;;63705:9:0;;63728;;63697:45;;;;63728:9;63705;63697:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;63684:58:0;;-1:-1:-1;;63766:19:0;;;;;:42;;;63807:1;63789:15;:19;63766:42;63763:210;;;63824:46;63837:15;63854;63824:12;:46::i;:::-;63942:18;;63890:71;;;24203:25:1;;;24259:2;24244:18;;24237:34;;;24287:18;;;24280:34;;;;63890:71:0;;;;;;24191:2:1;63890:71:0;;;63763:210;64009:21;63993:37;;64188:36;64210:13;64188:21;:36::i;:::-;64268:38;;-1:-1:-1;;;64268:38:0;;64300:4;64268:38;;;2056:51:1;64245:20:0;;64275:5;-1:-1:-1;;;;;64268:23:0;;;;2029:18:1;;64268:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;64358:15;;64327:62;;-1:-1:-1;;;64327:62:0;;-1:-1:-1;;;;;64358:15:0;;;64327:62;;;11565:51:1;11632:18;;;11625:34;;;64245:61:0;;-1:-1:-1;64334:5:0;64327:22;;;;11538:18:1;;64327:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;64317:72;;64414:7;64410:156;;;64438:15;;:54;;-1:-1:-1;;;64438:54:0;;;;;160:25:1;;;-1:-1:-1;;;;;64438:15:0;;;;:40;;133:18:1;;64438:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;64512:42:0;;;24778:25:1;;;24834:2;24819:18;;24812:34;;;64512:42:0;;-1:-1:-1;24751:18:1;;-1:-1:-1;64512:42:0;;;;;;;64410:156;62373:2220;;;;;;;;;;;;62345:2248::o;22116:471::-;22174:7;22419:6;22415:47;;-1:-1:-1;22449:1:0;22442:8;;22415:47;22474:9;22486:5;22490:1;22486;:5;:::i;:::-;22474:17;-1:-1:-1;22519:1:0;22510:5;22514:1;22474:17;22510:5;:::i;:::-;:10;22502:56;;;;-1:-1:-1;;;22502:56:0;;25059:2:1;22502:56:0;;;25041:21:1;25098:2;25078:18;;;25071:30;25137:34;25117:18;;;25110:62;-1:-1:-1;;;25188:18:1;;;25181:31;25229:19;;22502:56:0;24857:397:1;23063:132:0;23121:7;23148:39;23152:1;23155;23148:39;;;;;;;;;;;;;;;;;:3;:39::i;21226:136::-;21284:7;21311:43;21315:1;21318;21311:43;;;;;;;;;;;;;;;;;:3;:43::i;61197:601::-;61349:16;;;61363:1;61349:16;;;;;;;;61325:21;;61349:16;;;;;;;;;;-1:-1:-1;61349:16:0;61325:40;;61394:4;61376;61381:1;61376:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;61376:23:0;;;:7;;;;;;;;;;:23;;;;61420:15;;:22;;;-1:-1:-1;;;61420:22:0;;;;:15;;;;;:20;;:22;;;;;61376:7;;61420:22;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;61410:4;61415:1;61410:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;61410:32:0;;;:7;;;;;;;;;:32;61487:15;;61455:62;;61472:4;;61487:15;61505:11;61455:8;:62::i;:::-;61556:15;;:224;;-1:-1:-1;;;61556:224:0;;-1:-1:-1;;;;;61556:15:0;;;;:66;;:224;;61637:11;;61556:15;;61707:4;;61734;;61754:15;;61556:224;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61252:546;61197:601;:::o;61810:523::-;61990:15;;61958:62;;61975:4;;-1:-1:-1;;;;;61990:15:0;62008:11;61958:8;:62::i;:::-;62063:15;;:260;;-1:-1:-1;;;62063:260:0;;62135:4;62063:260;;;26187:34:1;26237:18;;;26230:34;;;62063:15:0;26280:18:1;;;26273:34;;;26323:18;;;26316:34;62275:6:0;26366:19:1;;;26359:44;62297:15:0;26419:19:1;;;26412:35;-1:-1:-1;;;;;62063:15:0;;;;:31;;62102:9;;26121:19:1;;62063:260:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;60711:474::-;60783:13;;60780:398;;60836:16;;;60850:1;60836:16;;;;;;;;60812:21;;60836:16;;;;;;;;-1:-1:-1;;60877:15:0;;:22;;;-1:-1:-1;;;60877:22:0;;;;60812:40;;-1:-1:-1;;;;;;60877:15:0;;;;:20;;-1:-1:-1;60877:22:0;;;;;;;;;;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;60867:4;60872:1;60867:7;;;;;;;;:::i;:::-;;;;;;:32;-1:-1:-1;;;;;60867:32:0;;;-1:-1:-1;;;;;60867:32:0;;;;;60924:5;60914:4;60919:1;60914:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;60914:15:0;;;:7;;;;;;;;;:15;60958;;:208;;-1:-1:-1;;;60958:208:0;;:15;;;:66;;61032:9;;60958:208;;:15;;61081:4;;61112;;61136:15;;60958:208;;;:::i;23691:278::-;23777:7;23812:12;23805:5;23797:28;;;;-1:-1:-1;;;23797:28:0;;;;;;;;:::i;:::-;-1:-1:-1;23836:9:0;23848:5;23852:1;23848;:5;:::i;196:597:1:-;308:4;337:2;366;355:9;348:21;398:6;392:13;441:6;436:2;425:9;421:18;414:34;466:1;476:140;490:6;487:1;484:13;476:140;;;585:14;;;581:23;;575:30;551:17;;;570:2;547:26;540:66;505:10;;476:140;;;634:6;631:1;628:13;625:91;;;704:1;699:2;690:6;679:9;675:22;671:31;664:42;625:91;-1:-1:-1;777:2:1;756:15;-1:-1:-1;;752:29:1;737:45;;;;784:2;733:54;;196:597;-1:-1:-1;;;196:597:1:o;798:131::-;-1:-1:-1;;;;;873:31:1;;863:42;;853:70;;919:1;916;909:12;934:315;1002:6;1010;1063:2;1051:9;1042:7;1038:23;1034:32;1031:52;;;1079:1;1076;1069:12;1031:52;1118:9;1105:23;1137:31;1162:5;1137:31;:::i;:::-;1187:5;1239:2;1224:18;;;;1211:32;;-1:-1:-1;;;934:315:1:o;1446:180::-;1505:6;1558:2;1546:9;1537:7;1533:23;1529:32;1526:52;;;1574:1;1571;1564:12;1526:52;-1:-1:-1;1597:23:1;;1446:180;-1:-1:-1;1446:180:1:o;1631:247::-;1690:6;1743:2;1731:9;1722:7;1718:23;1714:32;1711:52;;;1759:1;1756;1749:12;1711:52;1798:9;1785:23;1817:31;1842:5;1817:31;:::i;2118:127::-;2179:10;2174:3;2170:20;2167:1;2160:31;2210:4;2207:1;2200:15;2234:4;2231:1;2224:15;2250:275;2321:2;2315:9;2386:2;2367:13;;-1:-1:-1;;2363:27:1;2351:40;;2421:18;2406:34;;2442:22;;;2403:62;2400:88;;;2468:18;;:::i;:::-;2504:2;2497:22;2250:275;;-1:-1:-1;2250:275:1:o;2530:183::-;2590:4;2623:18;2615:6;2612:30;2609:56;;;2645:18;;:::i;:::-;-1:-1:-1;2690:1:1;2686:14;2702:4;2682:25;;2530:183::o;2718:662::-;2772:5;2825:3;2818:4;2810:6;2806:17;2802:27;2792:55;;2843:1;2840;2833:12;2792:55;2879:6;2866:20;2905:4;2929:60;2945:43;2985:2;2945:43;:::i;:::-;2929:60;:::i;:::-;3023:15;;;3109:1;3105:10;;;;3093:23;;3089:32;;;3054:12;;;;3133:15;;;3130:35;;;3161:1;3158;3151:12;3130:35;3197:2;3189:6;3185:15;3209:142;3225:6;3220:3;3217:15;3209:142;;;3291:17;;3279:30;;3329:12;;;;3242;;3209:142;;;-1:-1:-1;3369:5:1;2718:662;-1:-1:-1;;;;;;2718:662:1:o;3385:1215::-;3503:6;3511;3564:2;3552:9;3543:7;3539:23;3535:32;3532:52;;;3580:1;3577;3570:12;3532:52;3620:9;3607:23;3649:18;3690:2;3682:6;3679:14;3676:34;;;3706:1;3703;3696:12;3676:34;3744:6;3733:9;3729:22;3719:32;;3789:7;3782:4;3778:2;3774:13;3770:27;3760:55;;3811:1;3808;3801:12;3760:55;3847:2;3834:16;3869:4;3893:60;3909:43;3949:2;3909:43;:::i;3893:60::-;3987:15;;;4069:1;4065:10;;;;4057:19;;4053:28;;;4018:12;;;;4093:19;;;4090:39;;;4125:1;4122;4115:12;4090:39;4149:11;;;;4169:217;4185:6;4180:3;4177:15;4169:217;;;4265:3;4252:17;4282:31;4307:5;4282:31;:::i;:::-;4326:18;;4202:12;;;;4364;;;;4169:217;;;4405:5;-1:-1:-1;;4448:18:1;;4435:32;;-1:-1:-1;;4479:16:1;;;4476:36;;;4508:1;4505;4498:12;4476:36;;4531:63;4586:7;4575:8;4564:9;4560:24;4531:63;:::i;:::-;4521:73;;;3385:1215;;;;;:::o;4605:456::-;4682:6;4690;4698;4751:2;4739:9;4730:7;4726:23;4722:32;4719:52;;;4767:1;4764;4757:12;4719:52;4806:9;4793:23;4825:31;4850:5;4825:31;:::i;:::-;4875:5;-1:-1:-1;4932:2:1;4917:18;;4904:32;4945:33;4904:32;4945:33;:::i;:::-;4605:456;;4997:7;;-1:-1:-1;;;5051:2:1;5036:18;;;;5023:32;;4605:456::o;5703:118::-;5789:5;5782:13;5775:21;5768:5;5765:32;5755:60;;5811:1;5808;5801:12;5826:382;5891:6;5899;5952:2;5940:9;5931:7;5927:23;5923:32;5920:52;;;5968:1;5965;5958:12;5920:52;6007:9;5994:23;6026:31;6051:5;6026:31;:::i;:::-;6076:5;-1:-1:-1;6133:2:1;6118:18;;6105:32;6146:30;6105:32;6146:30;:::i;:::-;6195:7;6185:17;;;5826:382;;;;;:::o;6213:241::-;6269:6;6322:2;6310:9;6301:7;6297:23;6293:32;6290:52;;;6338:1;6335;6328:12;6290:52;6377:9;6364:23;6396:28;6418:5;6396:28;:::i;7165:750::-;7257:6;7265;7273;7326:2;7314:9;7305:7;7301:23;7297:32;7294:52;;;7342:1;7339;7332:12;7294:52;7382:9;7369:23;7411:18;7452:2;7444:6;7441:14;7438:34;;;7468:1;7465;7458:12;7438:34;7506:6;7495:9;7491:22;7481:32;;7551:7;7544:4;7540:2;7536:13;7532:27;7522:55;;7573:1;7570;7563:12;7522:55;7613:2;7600:16;7639:2;7631:6;7628:14;7625:34;;;7655:1;7652;7645:12;7625:34;7710:7;7703:4;7693:6;7690:1;7686:14;7682:2;7678:23;7674:34;7671:47;7668:67;;;7731:1;7728;7721:12;7668:67;7762:4;7754:13;;;;-1:-1:-1;7786:6:1;-1:-1:-1;;7827:20:1;;7814:34;7857:28;7814:34;7857:28;:::i;:::-;7904:5;7894:15;;;7165:750;;;;;:::o;7920:388::-;7988:6;7996;8049:2;8037:9;8028:7;8024:23;8020:32;8017:52;;;8065:1;8062;8055:12;8017:52;8104:9;8091:23;8123:31;8148:5;8123:31;:::i;:::-;8173:5;-1:-1:-1;8230:2:1;8215:18;;8202:32;8243:33;8202:32;8243:33;:::i;8313:454::-;8408:6;8416;8424;8432;8440;8493:3;8481:9;8472:7;8468:23;8464:33;8461:53;;;8510:1;8507;8500:12;8461:53;-1:-1:-1;;8533:23:1;;;8603:2;8588:18;;8575:32;;-1:-1:-1;8654:2:1;8639:18;;8626:32;;8705:2;8690:18;;8677:32;;-1:-1:-1;8756:3:1;8741:19;8728:33;;-1:-1:-1;8313:454:1;-1:-1:-1;8313:454:1:o;8772:380::-;8851:1;8847:12;;;;8894;;;8915:61;;8969:4;8961:6;8957:17;8947:27;;8915:61;9022:2;9014:6;9011:14;8991:18;8988:38;8985:161;;;9068:10;9063:3;9059:20;9056:1;9049:31;9103:4;9100:1;9093:15;9131:4;9128:1;9121:15;8985:161;;8772:380;;;:::o;9157:356::-;9359:2;9341:21;;;9378:18;;;9371:30;9437:34;9432:2;9417:18;;9410:62;9504:2;9489:18;;9157:356::o;9518:127::-;9579:10;9574:3;9570:20;9567:1;9560:31;9610:4;9607:1;9600:15;9634:4;9631:1;9624:15;9650:168;9690:7;9756:1;9752;9748:6;9744:14;9741:1;9738:21;9733:1;9726:9;9719:17;9715:45;9712:71;;;9763:18;;:::i;:::-;-1:-1:-1;9803:9:1;;9650:168::o;9823:217::-;9863:1;9889;9879:132;;9933:10;9928:3;9924:20;9921:1;9914:31;9968:4;9965:1;9958:15;9996:4;9993:1;9986:15;9879:132;-1:-1:-1;10025:9:1;;9823:217::o;11243:127::-;11304:10;11299:3;11295:20;11292:1;11285:31;11335:4;11332:1;11325:15;11359:4;11356:1;11349:15;11670:135;11709:3;-1:-1:-1;;11730:17:1;;11727:43;;;11750:18;;:::i;:::-;-1:-1:-1;11797:1:1;11786:13;;11670:135::o;11810:184::-;11880:6;11933:2;11921:9;11912:7;11908:23;11904:32;11901:52;;;11949:1;11946;11939:12;11901:52;-1:-1:-1;11972:16:1;;11810:184;-1:-1:-1;11810:184:1:o;12304:245::-;12371:6;12424:2;12412:9;12403:7;12399:23;12395:32;12392:52;;;12440:1;12437;12430:12;12392:52;12472:9;12466:16;12491:28;12513:5;12491:28;:::i;12554:306::-;12642:6;12650;12658;12711:2;12699:9;12690:7;12686:23;12682:32;12679:52;;;12727:1;12724;12717:12;12679:52;12756:9;12750:16;12740:26;;12806:2;12795:9;12791:18;12785:25;12775:35;;12850:2;12839:9;12835:18;12829:25;12819:35;;12554:306;;;;;:::o;14653:128::-;14693:3;14724:1;14720:6;14717:1;14714:13;14711:39;;;14730:18;;:::i;:::-;-1:-1:-1;14766:9:1;;14653:128::o;15264:681::-;15395:6;15403;15411;15419;15427;15435;15443;15451;15504:3;15492:9;15483:7;15479:23;15475:33;15472:53;;;15521:1;15518;15511:12;15472:53;15553:9;15547:16;15572:31;15597:5;15572:31;:::i;:::-;15622:5;15612:15;;;15667:2;15656:9;15652:18;15646:25;15636:35;;15711:2;15700:9;15696:18;15690:25;15680:35;;15755:2;15744:9;15740:18;15734:25;15724:35;;15799:3;15788:9;15784:19;15778:26;15768:36;;15844:3;15833:9;15829:19;15823:26;15813:36;;15889:3;15878:9;15874:19;15868:26;15858:36;;15934:3;15923:9;15919:19;15913:26;15903:36;;15264:681;;;;;;;;;;;:::o;16710:794::-;16932:2;16944:21;;;16917:18;;17000:22;;;16884:4;17079:6;17053:2;17038:18;;16884:4;17113:304;17127:6;17124:1;17121:13;17113:304;;;17202:6;17189:20;17222:31;17247:5;17222:31;:::i;:::-;-1:-1:-1;;;;;17278:31:1;17266:44;;17333:4;17392:15;;;;17357:12;;;;17306:1;17142:9;17113:304;;;17117:3;17434;17426:11;;;;17489:6;17482:14;17475:22;17468:4;17457:9;17453:20;17446:52;16710:794;;;;;;:::o;18686:251::-;18756:6;18809:2;18797:9;18788:7;18784:23;18780:32;18777:52;;;18825:1;18822;18815:12;18777:52;18857:9;18851:16;18876:31;18901:5;18876:31;:::i;18942:461::-;18995:3;19033:5;19027:12;19060:6;19055:3;19048:19;19086:4;19115:2;19110:3;19106:12;19099:19;;19152:2;19145:5;19141:14;19173:1;19183:195;19197:6;19194:1;19191:13;19183:195;;;19262:13;;-1:-1:-1;;;;;19258:39:1;19246:52;;19318:12;;;;19353:15;;;;19294:1;19212:9;19183:195;;;-1:-1:-1;19394:3:1;;18942:461;-1:-1:-1;;;;;18942:461:1:o;19408:510::-;19679:6;19668:9;19661:25;19722:3;19717:2;19706:9;19702:18;19695:31;19642:4;19743:57;19795:3;19784:9;19780:19;19772:6;19743:57;:::i;:::-;-1:-1:-1;;;;;19836:32:1;;;;19831:2;19816:18;;19809:60;-1:-1:-1;19900:2:1;19885:18;19878:34;19735:65;19408:510;-1:-1:-1;;19408:510:1:o;21445:401::-;21647:2;21629:21;;;21686:2;21666:18;;;21659:30;21725:34;21720:2;21705:18;;21698:62;-1:-1:-1;;;21791:2:1;21776:18;;21769:35;21836:3;21821:19;;21445:401::o;21851:399::-;22053:2;22035:21;;;22092:2;22072:18;;;22065:30;22131:34;22126:2;22111:18;;22104:62;-1:-1:-1;;;22197:2:1;22182:18;;22175:33;22240:3;22225:19;;21851:399::o;23871:125::-;23911:4;23939:1;23936;23933:8;23930:34;;;23944:18;;:::i;:::-;-1:-1:-1;23981:9:1;;23871:125::o;25259:582::-;25558:6;25547:9;25540:25;25601:6;25596:2;25585:9;25581:18;25574:34;25644:3;25639:2;25628:9;25624:18;25617:31;25521:4;25665:57;25717:3;25706:9;25702:19;25694:6;25665:57;:::i;:::-;-1:-1:-1;;;;;25758:32:1;;;;25753:2;25738:18;;25731:60;-1:-1:-1;25822:3:1;25807:19;25800:35;25657:65;25259:582;-1:-1:-1;;;25259:582:1:o
Swarm Source
ipfs://a9d085c01ca6da5a11c2b93977e1e442bf1ae4b3e87584ea35a1d2eb72f3c9b4