Contract Information

Explore the source code, ABI, and bytecode for the SAITAMA smart contract.
More Info

SAITAMA Source Code

/** SAITAMA V2 */ pragma solidity ^0.8.14; // SPDX-License-Identifier: Unlicensed interface IERC20 { 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); } /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ 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; } } abstract contract Context { function _msgSender() internal view virtual returns (address payable) { return payable(msg.sender); } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // According to EIP-1052, 0x0 is the value returned for not-yet created accounts // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned // for accounts without code, i.e. `keccak256('')` bytes32 codehash; bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; // solhint-disable-next-line no-inline-assembly assembly { codehash := extcodehash(account) } return (codehash != accountHash && codehash != 0x0); } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return _functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); return _functionCallWithValue(target, data, value, errorMessage); } function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) { require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: weiValue }(data); if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ contract Ownable is Context { address private _owner; address private _previousOwner; uint256 private _lockTime; 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; } } // pragma solidity >=0.5.0; interface IUniswapV2Factory { event PairCreated(address indexed token0, address indexed token1, address pair, uint); function feeTo() external view returns (address); function feeToSetter() external view returns (address); function getPair(address tokenA, address tokenB) external view returns (address pair); function allPairs(uint) external view returns (address pair); function allPairsLength() external view returns (uint); function createPair(address tokenA, address tokenB) external returns (address pair); function setFeeTo(address) external; function setFeeToSetter(address) external; } // pragma solidity >=0.5.0; interface IUniswapV2Pair { event Approval(address indexed owner, address indexed spender, uint value); event Transfer(address indexed from, address indexed to, uint value); function name() external pure returns (string memory); function symbol() external pure returns (string memory); function decimals() external pure returns (uint8); function totalSupply() external view returns (uint); function balanceOf(address owner) external view returns (uint); function allowance(address owner, address spender) external view returns (uint); function approve(address spender, uint value) external returns (bool); function transfer(address to, uint value) external returns (bool); function transferFrom(address from, address to, uint value) external returns (bool); function DOMAIN_SEPARATOR() external view returns (bytes32); function PERMIT_TYPEHASH() external pure returns (bytes32); function nonces(address owner) external view returns (uint); function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external; event Mint(address indexed sender, uint amount0, uint amount1); event Burn(address indexed sender, uint amount0, uint amount1, address indexed to); event Swap( address indexed sender, uint amount0In, uint amount1In, uint amount0Out, uint amount1Out, address indexed to ); event Sync(uint112 reserve0, uint112 reserve1); function MINIMUM_LIQUIDITY() external pure returns (uint); function factory() external view returns (address); function token0() external view returns (address); function token1() external view returns (address); function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast); function price0CumulativeLast() external view returns (uint); function price1CumulativeLast() external view returns (uint); function kLast() external view returns (uint); function mint(address to) external returns (uint liquidity); function burn(address to) external returns (uint amount0, uint amount1); function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external; function skim(address to) external; function sync() external; function initialize(address, address) external; } // pragma solidity >=0.6.2; interface IUniswapV2Router01 { function factory() external pure returns (address); function WETH() external pure returns (address); function addLiquidity( address tokenA, address tokenB, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB, uint liquidity); function addLiquidityETH( address token, uint amountTokenDesired, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external payable returns (uint amountToken, uint amountETH, uint liquidity); function removeLiquidity( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB); function removeLiquidityETH( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountToken, uint amountETH); function removeLiquidityWithPermit( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountA, uint amountB); function removeLiquidityETHWithPermit( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountToken, uint amountETH); function swapExactTokensForTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapTokensForExactTokens( uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB); function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut); function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn); function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts); function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts); } // pragma solidity >=0.6.2; interface IUniswapV2Router02 is IUniswapV2Router01 { function removeLiquidityETHSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountETH); function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountETH); function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; function swapExactETHForTokensSupportingFeeOnTransferTokens( uint amountOutMin, address[] calldata path, address to, uint deadline ) external payable; function swapExactTokensForETHSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; } // SAITAMA V2 contract SAITAMA is Context, IERC20, Ownable { using SafeMath for uint256; using Address for address; struct RValuesStruct { uint256 rAmount; uint256 rTransferAmount; uint256 rReflectionFee; uint256 rBurnFee; uint256 rmarketingTokenFee; uint256 rMarketingETHFee; } struct TValuesStruct { uint256 tTransferAmount; uint256 tReflectionFee; uint256 tBurnFee; uint256 tmarketingTokenFee; uint256 tMarketingETHFee; } struct ValuesStruct { uint256 rAmount; uint256 rTransferAmount; uint256 rReflectionFee; uint256 rBurnFee; uint256 rmarketingTokenFee; uint256 rMarketingETHFee; uint256 tTransferAmount; uint256 tReflectionFee; uint256 tBurnFee; uint256 tmarketingTokenFee; uint256 tMarketingETHFee; } mapping (address => uint256) private _rOwned; mapping (address => uint256) private _tOwned; mapping (address => mapping (address => uint256)) private _allowances; mapping (address => bool) private _isExcludedFromFee; mapping (address => bool) private _isExcluded; address[] private _excluded; uint256 private constant MAX = uint256(0); uint256 private _tTotal = 100 * 10**9 * 10**9; uint256 private _rTotal = (MAX - (MAX % _tTotal)); uint256 private _tReflectionFeeTotal; uint256 private _tBurnFeeTotal; string private _name = "SAITAMA"; string private _symbol = "SAITAMA"; uint8 private _decimals = 9; uint256 public _reflectionFee = 1; uint256 public _burnFee = 1; uint256 public _marketingTokenFee = 1; uint256 public _marketingETHFee = 1; address public marketingTokenFeeWallet = 0xb3a50a36f988a1D44c248a042A068F822A5FaA29; address public marketingETHFeeWallet = 0xb3a50a36f988a1D44c248a042A068F822A5FaA29; IUniswapV2Router02 public immutable uniswapV2Router; address public immutable uniswapV2Pair; bool inMarketingEthSwap = false; bool public _marketingConverttoETH = true; bool public _tradingEnabled = false; uint256 public _maxTxAmount = 100 * 10**6 * 10**9; uint256 private _numTokensSwapToETHForMarketing = 40 * 10**6 * 10**9; event MinTokensBeforeSwapUpdated(uint256 minTokensBeforeSwap); modifier lockTheSwap { inMarketingEthSwap = true; _; inMarketingEthSwap = false; } constructor () { _rOwned[_msgSender()] = _rTotal; IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D); // Uniswap V2 // Create a uniswap pair for this new token uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory()) .createPair(address(this), _uniswapV2Router.WETH()); // set the rest of the contract variables uniswapV2Router = _uniswapV2Router; //exclude owner and this contract from fee _isExcludedFromFee[owner()] = true; _isExcludedFromFee[address(this)] = true; emit Transfer(address(0), _msgSender(), _tTotal); } function name() public view returns (string memory) { return _name; } function symbol() public view returns (string memory) { return _symbol; } function decimals() public view returns (uint8) { return _decimals; } function totalSupply() public view override returns (uint256) { return _tTotal; } function balanceOf(address account) public view override returns (uint256) { if (_isExcluded[account]) return _tOwned[account]; return tokenFromReflection(_rOwned[account]); } function transfer(address recipient, uint256 amount) public override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } function allowance(address owner, address spender) public view override returns (uint256) { return _allowances[owner][spender]; } function approve(address spender, uint256 amount) public override returns (bool) { _approve(_msgSender(), spender, amount); return true; } function transferFrom(address sender, address recipient, uint256 amount) public override returns (bool) { _transfer(sender, recipient, amount); _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance")); return true; } function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue)); return true; } function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero")); return true; } function isExcludedFromReward(address account) public view returns (bool) { return _isExcluded[account]; } function totalReflectionFees() public view returns (uint256) { return _tReflectionFeeTotal; } function totalBurnFees() public view returns (uint256) { return _tBurnFeeTotal; } /** * @dev Returns the Number of tokens in contract that are needed to be reached before swapping to ETH and sending to Marketing Wallet. . */ function numTokensSwapToETHForMarketing() public view returns (uint256) { return _numTokensSwapToETHForMarketing; } function reflectionFromToken(uint256 tAmount, bool deductTransferFee) public view returns(uint256) { require(tAmount <= _tTotal, "Amount must be less than supply"); if (!deductTransferFee) { uint256 rAmount = _getValues(tAmount).rAmount; return rAmount; } else { uint256 rTransferAmount = _getValues(tAmount).rTransferAmount; return rTransferAmount; } } function tokenFromReflection(uint256 rAmount) public view returns(uint256) { require(rAmount <= _rTotal, "Amount must be less than total reflections"); uint256 currentRate = _getRate(); return rAmount.div(currentRate); } function excludeFromReward(address account) public onlyOwner() { require(account != 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D, 'We can not exclude Uniswap router.'); require(!_isExcluded[account], "Account already excluded"); require(_excluded.length < 100, "Excluded list is too long"); if(_rOwned[account] > 0) { _tOwned[account] = tokenFromReflection(_rOwned[account]); } _isExcluded[account] = true; _excluded.push(account); } //to recieve ETH from uniswapV2Router when swaping receive() external payable {} function _distributeFee(uint256 rReflectionFee, uint256 rBurnFee, uint256 rmarketingTokenFee, uint256 tReflectionFee, uint256 tBurnFee, uint256 tmarketingTokenFee) private { _rTotal = _rTotal.sub(rReflectionFee).sub(rBurnFee); _tReflectionFeeTotal = _tReflectionFeeTotal.add(tReflectionFee); _tTotal = _tTotal.sub(tBurnFee); _tBurnFeeTotal = _tBurnFeeTotal.add(tBurnFee); _rOwned[marketingTokenFeeWallet] = _rOwned[marketingTokenFeeWallet].add(rmarketingTokenFee); if (_isExcluded[marketingTokenFeeWallet]) { _tOwned[marketingTokenFeeWallet] = _tOwned[marketingTokenFeeWallet].add(tmarketingTokenFee); } } function _getValues(uint256 tAmount) private view returns (ValuesStruct memory) { TValuesStruct memory tvs = _getTValues(tAmount); RValuesStruct memory rvs = _getRValues(tAmount, tvs.tReflectionFee, tvs.tBurnFee, tvs.tmarketingTokenFee, tvs.tMarketingETHFee, _getRate()); return ValuesStruct( rvs.rAmount, rvs.rTransferAmount, rvs.rReflectionFee, rvs.rBurnFee, rvs.rmarketingTokenFee, rvs.rMarketingETHFee, tvs.tTransferAmount, tvs.tReflectionFee, tvs.tBurnFee, tvs.tmarketingTokenFee, tvs.tMarketingETHFee ); } function _getTValues(uint256 tAmount) private view returns (TValuesStruct memory) { uint256 tReflectionFee = calculateReflectionFee(tAmount); uint256 tBurnFee = calculateBurnFee(tAmount); uint256 tmarketingTokenFee = calculatemarketingTokenFee(tAmount); uint256 tMarketingETHFee = calculateMarketingETHFee(tAmount); uint256 tTransferAmount = tAmount.sub(tReflectionFee).sub(tBurnFee).sub(tmarketingTokenFee).sub(tMarketingETHFee); return TValuesStruct(tTransferAmount, tReflectionFee, tBurnFee, tmarketingTokenFee, tMarketingETHFee); } function _getRValues(uint256 tAmount, uint256 tReflectionFee, uint256 tBurnFee, uint256 tmarketingTokenFee, uint256 tMarketingETHFee, uint256 currentRate) private pure returns (RValuesStruct memory) { uint256 rAmount = tAmount.mul(currentRate); uint256 rReflectionFee = tReflectionFee.mul(currentRate); uint256 rBurnFee = tBurnFee.mul(currentRate); uint256 rmarketingTokenFee = tmarketingTokenFee.mul(currentRate); uint256 rMarketingETHFee = tMarketingETHFee.mul(currentRate); uint256 rTransferAmount = rAmount.sub(rReflectionFee).sub(rMarketingETHFee).sub(rBurnFee).sub(rmarketingTokenFee); return RValuesStruct(rAmount, rTransferAmount, rReflectionFee, rBurnFee, rmarketingTokenFee, rMarketingETHFee); } function _getRate() private view returns(uint256) { (uint256 rSupply, uint256 tSupply) = _getCurrentSupply(); return rSupply.div(tSupply); } function _getCurrentSupply() private view returns(uint256, uint256) { uint256 rSupply = _rTotal; uint256 tSupply = _tTotal; for (uint256 i = 0; i < _excluded.length; i++) { if (_rOwned[_excluded[i]] > rSupply || _tOwned[_excluded[i]] > tSupply) return (_rTotal, _tTotal); rSupply = rSupply.sub(_rOwned[_excluded[i]]); tSupply = tSupply.sub(_tOwned[_excluded[i]]); } if (rSupply < _rTotal.div(_tTotal)) return (_rTotal, _tTotal); return (rSupply, tSupply); } function _takeMarketingETHFee(uint256 rMarketingETHFee, uint256 tMarketingETHFee) private { _rOwned[address(this)] = _rOwned[address(this)].add(rMarketingETHFee); if(_isExcluded[address(this)]) _tOwned[address(this)] = _tOwned[address(this)].add(tMarketingETHFee); } function calculateReflectionFee(uint256 _amount) private view returns (uint256) { return _amount.mul(_reflectionFee).div( 10**2 ); } function calculateBurnFee(uint256 _amount) private view returns (uint256) { return _amount.mul(_burnFee).div( 10**2 ); } function calculatemarketingTokenFee(uint256 _amount) private view returns (uint256) { return _amount.mul(_marketingTokenFee).div( 10**2 ); } function calculateMarketingETHFee(uint256 _amount) private view returns (uint256) { return _amount.mul(_marketingETHFee).div( 10**2 ); } function removeAllFee() private { _reflectionFee = 0; _marketingETHFee = 0; _burnFee = 0; _marketingTokenFee = 0; } function restoreAllFee() private { _reflectionFee = 1; _marketingETHFee = 1; _marketingTokenFee = 1; _burnFee = 1; } function isExcludedFromFee(address account) public view returns(bool) { return _isExcludedFromFee[account]; } function _approve(address owner, address spender, uint256 amount) private { 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); } function _transfer( address from, address to, uint256 amount ) private { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); require(amount > 0, "Transfer amount must be greater than zero"); // block trading until owner has added liquidity and enabled trading if(!_tradingEnabled && from != owner()) { revert("Trading not yet enabled!"); } // is the token balance of this contract address over the min number of // tokens that we need to initiate a swaptoEth lock? // also, don't get caught in a circular liquidity event. // also, don't SwapMarketingAndSendETH if sender is uniswap pair. uint256 contractTokenBalance = balanceOf(address(this)); bool overMinTokenBalance = contractTokenBalance >= _numTokensSwapToETHForMarketing; if ( overMinTokenBalance && !inMarketingEthSwap && from != uniswapV2Pair && _marketingConverttoETH ) { contractTokenBalance = _numTokensSwapToETHForMarketing; //Perform a Swap of Token for ETH Portion of Marketing Fees swapMarketingAndSendEth(contractTokenBalance); } //transfer amount, it will take tax, burn, liquidity fee _tokenTransfer(from,to,amount); } function swapMarketingAndSendEth(uint256 tokenAmount) private lockTheSwap { // 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, marketingETHFeeWallet, block.timestamp ); } //this method is responsible for taking all fee, if takeFee is true function _tokenTransfer(address sender, address recipient, uint256 amount) private { if(_isExcludedFromFee[sender] || _isExcludedFromFee[recipient]){ removeAllFee(); } else{ require(amount <= _maxTxAmount, "Transfer amount exceeds the maxTxAmount."); } ValuesStruct memory vs = _getValues(amount); _takeMarketingETHFee(vs.rMarketingETHFee, vs.tMarketingETHFee); _distributeFee(vs.rReflectionFee, vs.rBurnFee, vs.rmarketingTokenFee, vs.tReflectionFee, vs.tBurnFee, vs.tmarketingTokenFee); if (_isExcluded[sender] && !_isExcluded[recipient]) { _transferFromExcluded(sender, recipient, amount, vs); } else if (!_isExcluded[sender] && _isExcluded[recipient]) { _transferToExcluded(sender, recipient, vs); } else if (!_isExcluded[sender] && !_isExcluded[recipient]) { _transferStandard(sender, recipient, vs); } else if (_isExcluded[sender] && _isExcluded[recipient]) { _transferBothExcluded(sender, recipient, amount, vs); } if(_isExcludedFromFee[sender] || _isExcludedFromFee[recipient]) restoreAllFee(); } function _transferStandard(address sender, address recipient, ValuesStruct memory vs) private { _rOwned[sender] = _rOwned[sender].sub(vs.rAmount); _rOwned[recipient] = _rOwned[recipient].add(vs.rTransferAmount); emit Transfer(sender, recipient, vs.tTransferAmount); } function _transferToExcluded(address sender, address recipient, ValuesStruct memory vs) private { _rOwned[sender] = _rOwned[sender].sub(vs.rAmount); _tOwned[recipient] = _tOwned[recipient].add(vs.tTransferAmount); _rOwned[recipient] = _rOwned[recipient].add(vs.rTransferAmount); emit Transfer(sender, recipient, vs.tTransferAmount); } function _transferFromExcluded(address sender, address recipient, uint256 tAmount, ValuesStruct memory vs) private { _tOwned[sender] = _tOwned[sender].sub(tAmount); _rOwned[sender] = _rOwned[sender].sub(vs.rAmount); _rOwned[recipient] = _rOwned[recipient].add(vs.rTransferAmount); emit Transfer(sender, recipient, vs.tTransferAmount); } function _transferBothExcluded(address sender, address recipient, uint256 tAmount, ValuesStruct memory vs) private { _tOwned[sender] = _tOwned[sender].sub(tAmount); _rOwned[sender] = _rOwned[sender].sub(vs.rAmount); _tOwned[recipient] = _tOwned[recipient].add(vs.tTransferAmount); _rOwned[recipient] = _rOwned[recipient].add(vs.rTransferAmount); emit Transfer(sender, recipient, vs.tTransferAmount); } function excludeFromFee(address account) public onlyOwner { _isExcludedFromFee[account] = true; } function includeInFee(address account) public onlyOwner { _isExcludedFromFee[account] = false; } function enableAllFees() external onlyOwner() { _reflectionFee = 1; _burnFee = 1; _marketingTokenFee = 1; _marketingETHFee = 1; _marketingConverttoETH = true; } function disableAllFees() external onlyOwner() { _reflectionFee = 0; _burnFee = 0; _marketingTokenFee = 0; _marketingETHFee = 0; _marketingConverttoETH = false; } function setMarketingETHWallet(address newWallet) external onlyOwner() { marketingETHFeeWallet = newWallet; } function setMarketingTokenWallet(address newWallet) external onlyOwner() { marketingTokenFeeWallet = newWallet; } function setMaxTxAmount(uint256 maxAmountInTokensWithDecimals) external onlyOwner() { require(maxAmountInTokensWithDecimals > 100 * 10**6 * 10**9, "Cannot set transaction amount less than 0.1 percent of initial Total Supply!"); _maxTxAmount = maxAmountInTokensWithDecimals; } function enableTrading() public onlyOwner { require(!_tradingEnabled, "Trading already enabled!"); _tradingEnabled = true; } function setmarketingConverttoETH(bool _enabled) public onlyOwner { _marketingConverttoETH = _enabled; } // Number of Tokens to Accrue before Selling To Add to Marketing function setnumTokensSwapToETHForMarketing(uint256 tokenAmount) external onlyOwner() { _numTokensSwapToETHForMarketing = tokenAmount; } /** * @dev Function to recover any ETH sent to Contract by Mistake. */ function recoverETHFromContract(uint256 weiAmount) external onlyOwner{ require(address(this).balance >= weiAmount, "insufficient ETH balance"); payable(owner()).transfer(weiAmount); } /** * @dev Function to recover any ERC20 Tokens sent to Contract by Mistake. */ function recoverAnyERC20TokensFromContract(address _tokenAddr, address _to, uint _amount) public onlyOwner { IERC20(_tokenAddr).transfer(_to, _amount); } }
< /**

SAITAMA V2

*/

pragma solidity ^0.8.14;

// SPDX-License-Identifier: Unlicensed

interface IERC20 {

    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);
}



/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */

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;
    }
}

abstract contract Context {
    function _msgSender() internal view virtual returns (address payable) {
        return payable(msg.sender);
    }

    function _msgData() internal view virtual returns (bytes memory) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}


/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // According to EIP-1052, 0x0 is the value returned for not-yet created accounts
        // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned
        // for accounts without code, i.e. `keccak256('')`
        bytes32 codehash;
        bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
        // solhint-disable-next-line no-inline-assembly
        assembly { codehash := extcodehash(account) }
        return (codehash != accountHash && codehash != 0x0);
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (bool success, ) = recipient.call{ value: amount }("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain`call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        return _functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        return _functionCallWithValue(target, data, value, errorMessage);
    }

    function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) {
        require(isContract(target), "Address: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{ value: weiValue }(data);
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
contract Ownable is Context {
    address private _owner;
    address private _previousOwner;
    uint256 private _lockTime;

    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;
    }
}
// pragma solidity >=0.5.0;

interface IUniswapV2Factory {
    event PairCreated(address indexed token0, address indexed token1, address pair, uint);

    function feeTo() external view returns (address);
    function feeToSetter() external view returns (address);

    function getPair(address tokenA, address tokenB) external view returns (address pair);
    function allPairs(uint) external view returns (address pair);
    function allPairsLength() external view returns (uint);

    function createPair(address tokenA, address tokenB) external returns (address pair);

    function setFeeTo(address) external;
    function setFeeToSetter(address) external;
}


// pragma solidity >=0.5.0;

interface IUniswapV2Pair {
    event Approval(address indexed owner, address indexed spender, uint value);
    event Transfer(address indexed from, address indexed to, uint value);

    function name() external pure returns (string memory);
    function symbol() external pure returns (string memory);
    function decimals() external pure returns (uint8);
    function totalSupply() external view returns (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);

    function approve(address spender, uint value) external returns (bool);
    function transfer(address to, uint value) external returns (bool);
    function transferFrom(address from, address to, uint value) external returns (bool);

    function DOMAIN_SEPARATOR() external view returns (bytes32);
    function PERMIT_TYPEHASH() external pure returns (bytes32);
    function nonces(address owner) external view returns (uint);

    function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;

    event Mint(address indexed sender, uint amount0, uint amount1);
    event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);
    event Swap(
        address indexed sender,
        uint amount0In,
        uint amount1In,
        uint amount0Out,
        uint amount1Out,
        address indexed to
    );
    event Sync(uint112 reserve0, uint112 reserve1);

    function MINIMUM_LIQUIDITY() external pure returns (uint);
    function factory() external view returns (address);
    function token0() external view returns (address);
    function token1() external view returns (address);
    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
    function price0CumulativeLast() external view returns (uint);
    function price1CumulativeLast() external view returns (uint);
    function kLast() external view returns (uint);

    function mint(address to) external returns (uint liquidity);
    function burn(address to) external returns (uint amount0, uint amount1);
    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
    function skim(address to) external;
    function sync() external;

    function initialize(address, address) external;
}

// pragma solidity >=0.6.2;

interface IUniswapV2Router01 {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountETH);
    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountToken, uint amountETH);
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
    external
    payable
    returns (uint[] memory amounts);
    function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
    external
    returns (uint[] memory amounts);
    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
    external
    returns (uint[] memory amounts);
    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
    external
    payable
    returns (uint[] memory amounts);

    function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
    function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
    function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}


// pragma solidity >=0.6.2;

interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountETH);
    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountETH);

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable;
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
}


//    SAITAMA V2

contract SAITAMA is Context, IERC20, Ownable {
    using SafeMath for uint256;
    using Address for address;


    struct RValuesStruct {
        uint256 rAmount;
        uint256 rTransferAmount;
        uint256 rReflectionFee;
        uint256 rBurnFee;
        uint256 rmarketingTokenFee;
        uint256 rMarketingETHFee;
    }

    struct TValuesStruct {
        uint256 tTransferAmount;
        uint256 tReflectionFee;
        uint256 tBurnFee;
        uint256 tmarketingTokenFee;
        uint256 tMarketingETHFee;
    }

    struct ValuesStruct {
        uint256 rAmount;
        uint256 rTransferAmount;
        uint256 rReflectionFee;
        uint256 rBurnFee;
        uint256 rmarketingTokenFee;
        uint256 rMarketingETHFee;
        uint256 tTransferAmount;
        uint256 tReflectionFee;
        uint256 tBurnFee;
        uint256 tmarketingTokenFee;
        uint256 tMarketingETHFee;
    }

    mapping (address => uint256) private _rOwned;
    mapping (address => uint256) private _tOwned;
    mapping (address => mapping (address => uint256)) private _allowances;

    mapping (address => bool) private _isExcludedFromFee;

    mapping (address => bool) private _isExcluded;
    address[] private _excluded;

    uint256 private constant MAX = uint256(0);
    uint256 private _tTotal = 100 * 10**9 * 10**9;
    uint256 private _rTotal = (MAX - (MAX % _tTotal));
    uint256 private _tReflectionFeeTotal;
    uint256 private _tBurnFeeTotal;

    string private _name = "SAITAMA";
    string private _symbol = "SAITAMA";
    uint8 private _decimals = 9;

    uint256 public _reflectionFee = 1;

    uint256 public _burnFee = 1;

    uint256 public _marketingTokenFee = 1;

    uint256 public _marketingETHFee = 1;

    address public marketingTokenFeeWallet = 0xb3a50a36f988a1D44c248a042A068F822A5FaA29;
    address public marketingETHFeeWallet = 0xb3a50a36f988a1D44c248a042A068F822A5FaA29;

    IUniswapV2Router02 public immutable uniswapV2Router;
    address public immutable uniswapV2Pair;

    bool inMarketingEthSwap = false;
    bool public _marketingConverttoETH = true;
    bool public _tradingEnabled = false;
    
    uint256 public _maxTxAmount = 100 * 10**6 * 10**9;
    uint256 private _numTokensSwapToETHForMarketing = 40 * 10**6 * 10**9;

    event MinTokensBeforeSwapUpdated(uint256 minTokensBeforeSwap);
 
    modifier lockTheSwap {
        inMarketingEthSwap = true;
        _;
        inMarketingEthSwap = false;
    }

    constructor () {
        _rOwned[_msgSender()] = _rTotal;
 
        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);  // Uniswap V2
        // Create a uniswap pair for this new token
        uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory())
        .createPair(address(this), _uniswapV2Router.WETH());

        // set the rest of the contract variables
        uniswapV2Router = _uniswapV2Router;

        //exclude owner and this contract from fee
        _isExcludedFromFee[owner()] = true;
        _isExcludedFromFee[address(this)] = true;

        emit Transfer(address(0), _msgSender(), _tTotal);
    }

    function name() public view returns (string memory) {
        return _name;
    }

    function symbol() public view returns (string memory) {
        return _symbol;
    }

    function decimals() public view returns (uint8) {
        return _decimals;
    }

    function totalSupply() public view override returns (uint256) {
        return _tTotal;
    }

    function balanceOf(address account) public view override returns (uint256) {
        if (_isExcluded[account]) return _tOwned[account];
        return tokenFromReflection(_rOwned[account]);
    }

    function transfer(address recipient, uint256 amount) public override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    function allowance(address owner, address spender) public view override returns (uint256) {
        return _allowances[owner][spender];
    }

    function approve(address spender, uint256 amount) public override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    function transferFrom(address sender, address recipient, uint256 amount) public override returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
        return true;
    }

    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));
        return true;
    }

    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
        return true;
    }

    function isExcludedFromReward(address account) public view returns (bool) {
        return _isExcluded[account];
    }

    function totalReflectionFees() public view returns (uint256) {
        return _tReflectionFeeTotal;
    }

    function totalBurnFees() public view returns (uint256) {
        return _tBurnFeeTotal;
    }

    /**
     * @dev Returns the Number of tokens in contract that are needed to be reached before swapping to ETH and sending to Marketing Wallet. .
     */
    function numTokensSwapToETHForMarketing() public view returns (uint256) {
        return _numTokensSwapToETHForMarketing;
    }

    function reflectionFromToken(uint256 tAmount, bool deductTransferFee) public view returns(uint256) {
        require(tAmount <= _tTotal, "Amount must be less than supply");
        if (!deductTransferFee) {
            uint256 rAmount = _getValues(tAmount).rAmount;
            return rAmount;
        } else {
            uint256 rTransferAmount = _getValues(tAmount).rTransferAmount;
            return rTransferAmount;
        }
    }

    function tokenFromReflection(uint256 rAmount) public view returns(uint256) {
        require(rAmount <= _rTotal, "Amount must be less than total reflections");
        uint256 currentRate =  _getRate();
        return rAmount.div(currentRate);
    }

    function excludeFromReward(address account) public onlyOwner() {
        require(account != 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D, 'We can not exclude Uniswap router.');
        require(!_isExcluded[account], "Account already excluded");
        require(_excluded.length < 100, "Excluded list is too long");
        if(_rOwned[account] > 0) {
            _tOwned[account] = tokenFromReflection(_rOwned[account]);
        }
        _isExcluded[account] = true;
        _excluded.push(account);
    }

    //to recieve ETH from uniswapV2Router when swaping
    receive() external payable {}

    function _distributeFee(uint256 rReflectionFee, uint256 rBurnFee, uint256 rmarketingTokenFee, uint256 tReflectionFee, uint256 tBurnFee, uint256 tmarketingTokenFee) private {
        _rTotal = _rTotal.sub(rReflectionFee).sub(rBurnFee);
        _tReflectionFeeTotal = _tReflectionFeeTotal.add(tReflectionFee);
        _tTotal = _tTotal.sub(tBurnFee);
        _tBurnFeeTotal = _tBurnFeeTotal.add(tBurnFee);

        _rOwned[marketingTokenFeeWallet] = _rOwned[marketingTokenFeeWallet].add(rmarketingTokenFee);
        if (_isExcluded[marketingTokenFeeWallet]) {
            _tOwned[marketingTokenFeeWallet] = _tOwned[marketingTokenFeeWallet].add(tmarketingTokenFee);
        }
    }

    function _getValues(uint256 tAmount) private view returns (ValuesStruct memory) {
        TValuesStruct memory tvs = _getTValues(tAmount);
        RValuesStruct memory rvs = _getRValues(tAmount, tvs.tReflectionFee, tvs.tBurnFee, tvs.tmarketingTokenFee, tvs.tMarketingETHFee, _getRate());

        return ValuesStruct(
            rvs.rAmount,
            rvs.rTransferAmount,
            rvs.rReflectionFee,
            rvs.rBurnFee,
            rvs.rmarketingTokenFee,
            rvs.rMarketingETHFee,
            tvs.tTransferAmount,
            tvs.tReflectionFee,
            tvs.tBurnFee,
            tvs.tmarketingTokenFee,
            tvs.tMarketingETHFee
        );
    }

    function _getTValues(uint256 tAmount) private view returns (TValuesStruct memory) {
        uint256 tReflectionFee = calculateReflectionFee(tAmount);
        uint256 tBurnFee = calculateBurnFee(tAmount);
        uint256 tmarketingTokenFee = calculatemarketingTokenFee(tAmount);
        uint256 tMarketingETHFee = calculateMarketingETHFee(tAmount);
        uint256 tTransferAmount = tAmount.sub(tReflectionFee).sub(tBurnFee).sub(tmarketingTokenFee).sub(tMarketingETHFee);
        return TValuesStruct(tTransferAmount, tReflectionFee, tBurnFee, tmarketingTokenFee, tMarketingETHFee);
    }

    function _getRValues(uint256 tAmount, uint256 tReflectionFee, uint256 tBurnFee, uint256 tmarketingTokenFee, uint256 tMarketingETHFee, uint256 currentRate) private pure returns (RValuesStruct memory) {
        uint256 rAmount = tAmount.mul(currentRate);
        uint256 rReflectionFee = tReflectionFee.mul(currentRate);
        uint256 rBurnFee = tBurnFee.mul(currentRate);
        uint256 rmarketingTokenFee = tmarketingTokenFee.mul(currentRate);
        uint256 rMarketingETHFee = tMarketingETHFee.mul(currentRate);
        uint256 rTransferAmount = rAmount.sub(rReflectionFee).sub(rMarketingETHFee).sub(rBurnFee).sub(rmarketingTokenFee);
        return RValuesStruct(rAmount, rTransferAmount, rReflectionFee, rBurnFee, rmarketingTokenFee, rMarketingETHFee);
    }

    function _getRate() private view returns(uint256) {
        (uint256 rSupply, uint256 tSupply) = _getCurrentSupply();
        return rSupply.div(tSupply);
    }

    function _getCurrentSupply() private view returns(uint256, uint256) {
        uint256 rSupply = _rTotal;
        uint256 tSupply = _tTotal;
        for (uint256 i = 0; i < _excluded.length; i++) {
            if (_rOwned[_excluded[i]] > rSupply || _tOwned[_excluded[i]] > tSupply) return (_rTotal, _tTotal);
            rSupply = rSupply.sub(_rOwned[_excluded[i]]);
            tSupply = tSupply.sub(_tOwned[_excluded[i]]);
        }
        if (rSupply < _rTotal.div(_tTotal)) return (_rTotal, _tTotal);
        return (rSupply, tSupply);
    }

    function _takeMarketingETHFee(uint256 rMarketingETHFee, uint256 tMarketingETHFee) private {
        _rOwned[address(this)] = _rOwned[address(this)].add(rMarketingETHFee);
        if(_isExcluded[address(this)])
            _tOwned[address(this)] = _tOwned[address(this)].add(tMarketingETHFee);
    }

    function calculateReflectionFee(uint256 _amount) private view returns (uint256) {
        return _amount.mul(_reflectionFee).div(
            10**2
        );
    }

    function calculateBurnFee(uint256 _amount) private view returns (uint256) {
        return _amount.mul(_burnFee).div(
            10**2
        );
    }

    function calculatemarketingTokenFee(uint256 _amount) private view returns (uint256) {
        return _amount.mul(_marketingTokenFee).div(
            10**2
        );
    }

    function calculateMarketingETHFee(uint256 _amount) private view returns (uint256) {
        return _amount.mul(_marketingETHFee).div(
            10**2
        );
    }

    function removeAllFee() private {
        _reflectionFee = 0;
        _marketingETHFee = 0;
        _burnFee = 0;
        _marketingTokenFee = 0;
    }

    function restoreAllFee() private {
        _reflectionFee = 1;
        _marketingETHFee = 1;
        _marketingTokenFee = 1;
        _burnFee = 1;
	}

    function isExcludedFromFee(address account) public view returns(bool) {
        return _isExcludedFromFee[account];
    }

    function _approve(address owner, address spender, uint256 amount) private {
        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);
    }

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) private {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
        require(amount > 0, "Transfer amount must be greater than zero");
        
        // block trading until owner has added liquidity and enabled trading
        if(!_tradingEnabled && from != owner()) {
            revert("Trading not yet enabled!");
        }
        
        // is the token balance of this contract address over the min number of
        // tokens that we need to initiate a swaptoEth lock?
        // also, don't get caught in a circular liquidity event.
        // also, don't SwapMarketingAndSendETH if sender is uniswap pair.
        uint256 contractTokenBalance = balanceOf(address(this));
        bool overMinTokenBalance = contractTokenBalance >= _numTokensSwapToETHForMarketing;
        if (
            overMinTokenBalance &&
            !inMarketingEthSwap &&
            from != uniswapV2Pair &&
            _marketingConverttoETH
        ) {
            contractTokenBalance = _numTokensSwapToETHForMarketing;
            //Perform a Swap of Token for ETH Portion of Marketing Fees
            swapMarketingAndSendEth(contractTokenBalance);
        }

        //transfer amount, it will take tax, burn, liquidity fee
        _tokenTransfer(from,to,amount);

    }

     function swapMarketingAndSendEth(uint256 tokenAmount) private lockTheSwap {
        // 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,
            marketingETHFeeWallet,
            block.timestamp
        );
    }

    //this method is responsible for taking all fee, if takeFee is true
    function _tokenTransfer(address sender, address recipient, uint256 amount) private {
        if(_isExcludedFromFee[sender] || _isExcludedFromFee[recipient]){
            removeAllFee();
        }
        else{
            require(amount <= _maxTxAmount, "Transfer amount exceeds the maxTxAmount.");
        }

        ValuesStruct memory vs = _getValues(amount);
        _takeMarketingETHFee(vs.rMarketingETHFee, vs.tMarketingETHFee);
        _distributeFee(vs.rReflectionFee, vs.rBurnFee, vs.rmarketingTokenFee, vs.tReflectionFee, vs.tBurnFee, vs.tmarketingTokenFee);

        if (_isExcluded[sender] && !_isExcluded[recipient]) {
            _transferFromExcluded(sender, recipient, amount, vs);
        } else if (!_isExcluded[sender] && _isExcluded[recipient]) {
            _transferToExcluded(sender, recipient, vs);
        } else if (!_isExcluded[sender] && !_isExcluded[recipient]) {
            _transferStandard(sender, recipient, vs);
        } else if (_isExcluded[sender] && _isExcluded[recipient]) {
            _transferBothExcluded(sender, recipient, amount, vs);
        }

        if(_isExcludedFromFee[sender] || _isExcludedFromFee[recipient])
            restoreAllFee();
    }

    function _transferStandard(address sender, address recipient, ValuesStruct memory vs) private {
        _rOwned[sender] = _rOwned[sender].sub(vs.rAmount);
        _rOwned[recipient] = _rOwned[recipient].add(vs.rTransferAmount);
        emit Transfer(sender, recipient, vs.tTransferAmount);
    }

    function _transferToExcluded(address sender, address recipient, ValuesStruct memory vs) private {
        _rOwned[sender] = _rOwned[sender].sub(vs.rAmount);
        _tOwned[recipient] = _tOwned[recipient].add(vs.tTransferAmount);
        _rOwned[recipient] = _rOwned[recipient].add(vs.rTransferAmount);
        emit Transfer(sender, recipient, vs.tTransferAmount);
    }

    function _transferFromExcluded(address sender, address recipient, uint256 tAmount, ValuesStruct memory vs) private {
        _tOwned[sender] = _tOwned[sender].sub(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(vs.rAmount);
        _rOwned[recipient] = _rOwned[recipient].add(vs.rTransferAmount);
        emit Transfer(sender, recipient, vs.tTransferAmount);
    }

    function _transferBothExcluded(address sender, address recipient, uint256 tAmount, ValuesStruct memory vs) private {
        _tOwned[sender] = _tOwned[sender].sub(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(vs.rAmount);
        _tOwned[recipient] = _tOwned[recipient].add(vs.tTransferAmount);
        _rOwned[recipient] = _rOwned[recipient].add(vs.rTransferAmount);
        emit Transfer(sender, recipient, vs.tTransferAmount);
    }

    function excludeFromFee(address account) public onlyOwner {
        _isExcludedFromFee[account] = true;
    }

    function includeInFee(address account) public onlyOwner {
        _isExcludedFromFee[account] = false;
    }

    function enableAllFees() external onlyOwner() {
        _reflectionFee = 1;
        _burnFee = 1;
        _marketingTokenFee = 1;
        _marketingETHFee = 1;
        _marketingConverttoETH = true;
    }

    function disableAllFees() external onlyOwner() {
        _reflectionFee = 0;
        _burnFee = 0;
        _marketingTokenFee = 0;
        _marketingETHFee = 0;
        _marketingConverttoETH = false;
    }

    function setMarketingETHWallet(address newWallet) external onlyOwner() {
        marketingETHFeeWallet = newWallet;
    }

    function setMarketingTokenWallet(address newWallet) external onlyOwner() {
        marketingTokenFeeWallet = newWallet;
    }

    function setMaxTxAmount(uint256 maxAmountInTokensWithDecimals) external onlyOwner() {
        require(maxAmountInTokensWithDecimals > 100 * 10**6 * 10**9, "Cannot set transaction amount less than 0.1 percent of initial Total Supply!");
        _maxTxAmount = maxAmountInTokensWithDecimals;
    }

    function enableTrading() public onlyOwner {
        require(!_tradingEnabled, "Trading already enabled!");
        _tradingEnabled = true;
    }

    function setmarketingConverttoETH(bool _enabled) public onlyOwner {
        _marketingConverttoETH = _enabled;
    }

    // Number of Tokens to Accrue before Selling To Add to Marketing
	function setnumTokensSwapToETHForMarketing(uint256 tokenAmount) external onlyOwner() {
       _numTokensSwapToETHForMarketing = tokenAmount;
    }

    /**
     * @dev Function to recover any ETH sent to Contract by Mistake.
    */	
    function recoverETHFromContract(uint256 weiAmount) external onlyOwner{
        require(address(this).balance >= weiAmount, "insufficient ETH balance");
        payable(owner()).transfer(weiAmount);
    }
       
    /**
     * @dev Function to recover any ERC20 Tokens sent to Contract by Mistake.
    */
    function recoverAnyERC20TokensFromContract(address _tokenAddr, address _to, uint _amount) public onlyOwner {
        IERC20(_tokenAddr).transfer(_to, _amount);
    }

} < 

SAITAMA ABI

[{"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":false,"internalType":"uint256","name":"minTokensBeforeSwap","type":"uint256"}],"name":"MinTokensBeforeSwapUpdated","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":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"_burnFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_marketingConverttoETH","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_marketingETHFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_marketingTokenFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxTxAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_reflectionFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_tradingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"disableAllFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableAllFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromReward","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingETHFeeWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingTokenFeeWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numTokensSwapToETHForMarketing","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddr","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"recoverAnyERC20TokensFromContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"weiAmount","type":"uint256"}],"name":"recoverETHFromContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tAmount","type":"uint256"},{"internalType":"bool","name":"deductTransferFee","type":"bool"}],"name":"reflectionFromToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newWallet","type":"address"}],"name":"setMarketingETHWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newWallet","type":"address"}],"name":"setMarketingTokenWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxAmountInTokensWithDecimals","type":"uint256"}],"name":"setMaxTxAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setmarketingConverttoETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"setnumTokensSwapToETHForMarketing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"rAmount","type":"uint256"}],"name":"tokenFromReflection","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalBurnFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalReflectionFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]
[{"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":false,"internalType":"uint256","name":"minTokensBeforeSwap","type":"uint256"}],"name":"MinTokensBeforeSwapUpdated","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":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"_burnFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_marketingConverttoETH","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_marketingETHFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_marketingTokenFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxTxAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_reflectionFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_tradingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"disableAllFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableAllFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromReward","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingETHFeeWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingTokenFeeWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numTokensSwapToETHForMarketing","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddr","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"recoverAnyERC20TokensFromContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"weiAmount","type":"uint256"}],"name":"recoverETHFromContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tAmount","type":"uint256"},{"internalType":"bool","name":"deductTransferFee","type":"bool"}],"name":"reflectionFromToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newWallet","type":"address"}],"name":"setMarketingETHWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newWallet","type":"address"}],"name":"setMarketingTokenWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxAmountInTokensWithDecimals","type":"uint256"}],"name":"setMaxTxAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setmarketingConverttoETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"setnumTokensSwapToETHForMarketing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"rAmount","type":"uint256"}],"name":"tokenFromReflection","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalBurnFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalReflectionFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

SAITAMA Bytecode

60c060405268056bc75e2d6310000060095560095460001962000023919062000763565b600019620000329190620007ca565b600a556040518060400160405280600781526020017f53414954414d4100000000000000000000000000000000000000000000000000815250600d9080519060200190620000829291906200067a565b506040518060400160405280600781526020017f53414954414d4100000000000000000000000000000000000000000000000000815250600e9080519060200190620000d09291906200067a565b506009600f60006101000a81548160ff021916908360ff160217905550600160105560016011556001601255600160135573b3a50a36f988a1d44c248a042a068f822a5faa29601460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073b3a50a36f988a1d44c248a042a068f822a5faa29601560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000601560146101000a81548160ff02191690831515021790555060016015806101000a81548160ff0219169083151502179055506000601560166101000a81548160ff02191690831515021790555067016345785d8a0000601655668e1bc9bf0400006017553480156200021f57600080fd5b506000620002326200064960201b60201c565b9050806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350600a5460036000620002e76200064960201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000737a250d5630b4cf539739df2c5dacb4c659f2488d90508073ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200038a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003b091906200086f565b73ffffffffffffffffffffffffffffffffffffffff1663c9c65396308373ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000418573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200043e91906200086f565b6040518363ffffffff1660e01b81526004016200045d929190620008b2565b6020604051808303816000875af11580156200047d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620004a391906200086f565b73ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff16815250508073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1681525050600160066000620005206200065160201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600660003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550620005d96200064960201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6009546040516200063a9190620008f0565b60405180910390a35062000971565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b82805462000688906200093c565b90600052602060002090601f016020900481019282620006ac5760008555620006f8565b82601f10620006c757805160ff1916838001178555620006f8565b82800160010185558215620006f8579182015b82811115620006f7578251825591602001919060010190620006da565b5b5090506200070791906200070b565b5090565b5b80821115620007265760008160009055506001016200070c565b5090565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600062000770826200072a565b91506200077d836200072a565b92508262000790576200078f62000734565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000620007d7826200072a565b9150620007e4836200072a565b925082821015620007fa57620007f96200079b565b5b828203905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000837826200080a565b9050919050565b62000849816200082a565b81146200085557600080fd5b50565b60008151905062000869816200083e565b92915050565b60006020828403121562000888576200088762000805565b5b6000620008988482850162000858565b91505092915050565b620008ac816200082a565b82525050565b6000604082019050620008c96000830185620008a1565b620008d86020830184620008a1565b9392505050565b620008ea816200072a565b82525050565b6000602082019050620009076000830184620008df565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200095557607f821691505b6020821081036200096b576200096a6200090d565b5b50919050565b60805160a0516158ef620009b3600039600081816110130152612775015260008181610b6f01528181612ab001528181612b910152612bb801526158ef6000f3fe6080604052600436106102765760003560e01c8063741af87f1161014f578063adbede72116100c1578063ea2f0b371161007a578063ea2f0b371461098b578063ec0c9d4d146109b4578063ec28438a146109dd578063f2fde38b14610a06578063f709594514610a2f578063ffc7863514610a5a5761027d565b8063adbede721461087b578063b8d36b50146108a6578063c0b0fda2146108cf578063c5254f40146108fa578063c730b8a414610923578063dd62ed3e1461094e5761027d565b80638c8f8c04116101135780638c8f8c04146107595780638da5cb5b146107825780638ff67c36146107ad57806395d89b41146107d6578063a457c2d714610801578063a9059cbb1461083e5761027d565b8063741af87f1461069857806376b851ca146106af5780637d1db4a5146106da57806388f82020146107055780638a8c523c146107425761027d565b806338780fe6116101e857806349bd5a5e116101ac57806349bd5a5e1461058857806352390c02146105b35780635342acb4146105dc57806370a082311461061957806370c668c814610656578063715018a6146106815761027d565b806338780fe61461049157806338e2f22f146104ba57806339509351146104e5578063437823ec146105225780634549b0391461054b5761027d565b806318160ddd1161023a57806318160ddd1461036b57806323b872dd146103965780632d838119146103d3578063313ce56714610410578063317653e01461043b5780633206b4aa146104665761027d565b806301ba031f1461028257806306486014146102ad57806306fdde03146102d8578063095ea7b3146103035780631694505e146103405761027d565b3661027d57005b600080fd5b34801561028e57600080fd5b50610297610a71565b6040516102a49190614613565b60405180910390f35b3480156102b957600080fd5b506102c2610a97565b6040516102cf9190614613565b60405180910390f35b3480156102e457600080fd5b506102ed610abd565b6040516102fa91906146c7565b60405180910390f35b34801561030f57600080fd5b5061032a60048036038101906103259190614750565b610b4f565b60405161033791906147ab565b60405180910390f35b34801561034c57600080fd5b50610355610b6d565b6040516103629190614825565b60405180910390f35b34801561037757600080fd5b50610380610b91565b60405161038d919061484f565b60405180910390f35b3480156103a257600080fd5b506103bd60048036038101906103b8919061486a565b610b9b565b6040516103ca91906147ab565b60405180910390f35b3480156103df57600080fd5b506103fa60048036038101906103f591906148bd565b610c74565b604051610407919061484f565b60405180910390f35b34801561041c57600080fd5b50610425610ce2565b6040516104329190614906565b60405180910390f35b34801561044757600080fd5b50610450610cf9565b60405161045d919061484f565b60405180910390f35b34801561047257600080fd5b5061047b610d03565b604051610488919061484f565b60405180910390f35b34801561049d57600080fd5b506104b860048036038101906104b39190614921565b610d09565b005b3480156104c657600080fd5b506104cf610de2565b6040516104dc919061484f565b60405180910390f35b3480156104f157600080fd5b5061050c60048036038101906105079190614750565b610dec565b60405161051991906147ab565b60405180910390f35b34801561052e57600080fd5b5061054960048036038101906105449190614921565b610e9f565b005b34801561055757600080fd5b50610572600480360381019061056d919061497a565b610f8f565b60405161057f919061484f565b60405180910390f35b34801561059457600080fd5b5061059d611011565b6040516105aa9190614613565b60405180910390f35b3480156105bf57600080fd5b506105da60048036038101906105d59190614921565b611035565b005b3480156105e857600080fd5b5061060360048036038101906105fe9190614921565b6113b3565b60405161061091906147ab565b60405180910390f35b34801561062557600080fd5b50610640600480360381019061063b9190614921565b611409565b60405161064d919061484f565b60405180910390f35b34801561066257600080fd5b5061066b6114f4565b604051610678919061484f565b60405180910390f35b34801561068d57600080fd5b506106966114fa565b005b3480156106a457600080fd5b506106ad61164d565b005b3480156106bb57600080fd5b506106c461171e565b6040516106d191906147ab565b60405180910390f35b3480156106e657600080fd5b506106ef61172f565b6040516106fc919061484f565b60405180910390f35b34801561071157600080fd5b5061072c60048036038101906107279190614921565b611735565b60405161073991906147ab565b60405180910390f35b34801561074e57600080fd5b5061075761178b565b005b34801561076557600080fd5b50610780600480360381019061077b919061486a565b61188d565b005b34801561078e57600080fd5b506107976119a6565b6040516107a49190614613565b60405180910390f35b3480156107b957600080fd5b506107d460048036038101906107cf91906149ba565b6119cf565b005b3480156107e257600080fd5b506107eb611a80565b6040516107f891906146c7565b60405180910390f35b34801561080d57600080fd5b5061082860048036038101906108239190614750565b611b12565b60405161083591906147ab565b60405180910390f35b34801561084a57600080fd5b5061086560048036038101906108609190614750565b611bdf565b60405161087291906147ab565b60405180910390f35b34801561088757600080fd5b50610890611bfd565b60405161089d919061484f565b60405180910390f35b3480156108b257600080fd5b506108cd60048036038101906108c891906148bd565b611c07565b005b3480156108db57600080fd5b506108e4611d30565b6040516108f1919061484f565b60405180910390f35b34801561090657600080fd5b50610921600480360381019061091c9190614921565b611d36565b005b34801561092f57600080fd5b50610938611e0f565b604051610945919061484f565b60405180910390f35b34801561095a57600080fd5b50610975600480360381019061097091906149e7565b611e15565b604051610982919061484f565b60405180910390f35b34801561099757600080fd5b506109b260048036038101906109ad9190614921565b611e9c565b005b3480156109c057600080fd5b506109db60048036038101906109d691906148bd565b611f8c565b005b3480156109e957600080fd5b50610a0460048036038101906109ff91906148bd565b61202b565b005b348015610a1257600080fd5b50610a2d6004803603810190610a289190614921565b612114565b005b348015610a3b57600080fd5b50610a446122d5565b604051610a5191906147ab565b60405180910390f35b348015610a6657600080fd5b50610a6f6122e8565b005b601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6060600d8054610acc90614a56565b80601f0160208091040260200160405190810160405280929190818152602001828054610af890614a56565b8015610b455780601f10610b1a57610100808354040283529160200191610b45565b820191906000526020600020905b815481529060010190602001808311610b2857829003601f168201915b5050505050905090565b6000610b63610b5c6123b9565b84846123c1565b6001905092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600954905090565b6000610ba884848461258a565b610c6984610bb46123b9565b610c648560405180606001604052806028815260200161586d60289139600560008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610c1a6123b9565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546128009092919063ffffffff16565b6123c1565b600190509392505050565b6000600a54821115610cbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb290614af9565b60405180910390fd5b6000610cc5612864565b9050610cda818461288f90919063ffffffff16565b915050919050565b6000600f60009054906101000a900460ff16905090565b6000600c54905090565b60105481565b610d116123b9565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610d9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9590614b65565b60405180910390fd5b80601560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000601754905090565b6000610e95610df96123b9565b84610e908560056000610e0a6123b9565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546128d990919063ffffffff16565b6123c1565b6001905092915050565b610ea76123b9565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610f34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2b90614b65565b60405180910390fd5b6001600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6000600954831115610fd6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fcd90614bd1565b60405180910390fd5b81610ff5576000610fe684612937565b6000015190508091505061100b565b600061100084612937565b602001519050809150505b92915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b61103d6123b9565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146110ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c190614b65565b60405180910390fd5b737a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361114c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114390614c63565b60405180910390fd5b600760008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156111d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d090614ccf565b60405180910390fd5b606460088054905010611221576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121890614d3b565b60405180910390fd5b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411156112f5576112b1600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610c74565b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b6001600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506008819080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156114a457600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506114ef565b6114ec600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610c74565b90505b919050565b60125481565b6115026123b9565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461158f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158690614b65565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6116556123b9565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146116e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d990614b65565b60405180910390fd5b600060108190555060006011819055506000601281905550600060138190555060006015806101000a81548160ff021916908315150217905550565b60158054906101000a900460ff1681565b60165481565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6117936123b9565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611820576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181790614b65565b60405180910390fd5b601560169054906101000a900460ff1615611870576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186790614da7565b60405180910390fd5b6001601560166101000a81548160ff021916908315150217905550565b6118956123b9565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611922576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191990614b65565b60405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff1660e01b815260040161195d929190614dc7565b6020604051808303816000875af115801561197c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119a09190614e05565b50505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6119d76123b9565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611a64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5b90614b65565b60405180910390fd5b806015806101000a81548160ff02191690831515021790555050565b6060600e8054611a8f90614a56565b80601f0160208091040260200160405190810160405280929190818152602001828054611abb90614a56565b8015611b085780601f10611add57610100808354040283529160200191611b08565b820191906000526020600020905b815481529060010190602001808311611aeb57829003601f168201915b5050505050905090565b6000611bd5611b1f6123b9565b84611bd0856040518060600160405280602581526020016158956025913960056000611b496123b9565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546128009092919063ffffffff16565b6123c1565b6001905092915050565b6000611bf3611bec6123b9565b848461258a565b6001905092915050565b6000600b54905090565b611c0f6123b9565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611c9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c9390614b65565b60405180910390fd5b80471015611cdf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cd690614e7e565b60405180910390fd5b611ce76119a6565b73ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611d2c573d6000803e3d6000fd5b5050565b60115481565b611d3e6123b9565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611dcb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dc290614b65565b60405180910390fd5b80601460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60135481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b611ea46123b9565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611f31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2890614b65565b60405180910390fd5b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b611f946123b9565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612021576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161201890614b65565b60405180910390fd5b8060178190555050565b6120336123b9565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146120c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120b790614b65565b60405180910390fd5b67016345785d8a0000811161210a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161210190614f36565b60405180910390fd5b8060168190555050565b61211c6123b9565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146121a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121a090614b65565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612218576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161220f90614fc8565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b601560169054906101000a900460ff1681565b6122f06123b9565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461237d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161237490614b65565b60405180910390fd5b600160108190555060016011819055506001601281905550600160138190555060016015806101000a81548160ff021916908315150217905550565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612430576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124279061505a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361249f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612496906150ec565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161257d919061484f565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036125f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125f09061517e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612668576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161265f90615210565b60405180910390fd5b600081116126ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126a2906152a2565b60405180910390fd5b601560169054906101000a900460ff161580156126fb57506126cb6119a6565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b1561273b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127329061530e565b60405180910390fd5b600061274630611409565b90506000601754821015905080801561276c5750601560149054906101000a900460ff16155b80156127c457507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b80156127da575060158054906101000a900460ff165b156127ee5760175491506127ed826129f6565b5b6127f9858585612c8b565b5050505050565b6000838311158290612848576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161283f91906146c7565b60405180910390fd5b5060008385612857919061535d565b9050809150509392505050565b6000806000612871613162565b91509150612888818361288f90919063ffffffff16565b9250505090565b60006128d183836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613415565b905092915050565b60008082846128e89190615391565b90508381101561292d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161292490615433565b60405180910390fd5b8091505092915050565b61293f614513565b600061294a83613478565b9050600061297384836020015184604001518560600151866080015161296e612864565b613534565b905060405180610160016040528082600001518152602001826020015181526020018260400151815260200182606001518152602001826080015181526020018260a00151815260200183600001518152602001836020015181526020018360400151815260200183606001518152602001836080015181525092505050919050565b6001601560146101000a81548160ff0219169083151502179055506000600267ffffffffffffffff811115612a2e57612a2d615453565b5b604051908082528060200260200182016040528015612a5c5781602001602082028036833780820191505090505b5090503081600081518110612a7457612a73615482565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612b19573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b3d91906154c6565b81600181518110612b5157612b50615482565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050612bb6307f0000000000000000000000000000000000000000000000000000000000000000846123c1565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663791ac94783600084601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16426040518663ffffffff1660e01b8152600401612c3a9594939291906155ec565b600060405180830381600087803b158015612c5457600080fd5b505af1158015612c68573d6000803e3d6000fd5b50505050506000601560146101000a81548160ff02191690831515021790555050565b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680612d2c5750600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b15612d3e57612d3961363b565b612d84565b601654811115612d83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d7a906156b8565b60405180910390fd5b5b6000612d8f82612937565b9050612da48160a0015182610140015161365d565b612dcc8160400151826060015183608001518460e001518561010001518661012001516137de565b600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168015612e6f5750600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15612e8557612e8084848484613a8b565b6130ad565b600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16158015612f285750600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b15612f3d57612f38848483613cc1565b6130ac565b600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16158015612fe15750600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15612ff657612ff1848483613efa565b6130ab565b600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680156130985750600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b156130aa576130a98484848461409a565b5b5b5b5b600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168061314e5750600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b1561315c5761315b614369565b5b50505050565b6000806000600a5490506000600954905060005b6008805490508110156133d85782600360006008848154811061319c5761319b615482565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054118061328a575081600460006008848154811061322257613221615482565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054115b156132a157600a5460095494509450505050613411565b61333160036000600884815481106132bc576132bb615482565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548461438b90919063ffffffff16565b92506133c3600460006008848154811061334e5761334d615482565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548361438b90919063ffffffff16565b915080806133d0906156d8565b915050613176565b506133f0600954600a5461288f90919063ffffffff16565b82101561340857600a54600954935093505050613411565b81819350935050505b9091565b6000808311829061345c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161345391906146c7565b60405180910390fd5b506000838561346b919061574f565b9050809150509392505050565b61348061456d565b600061348b836143d5565b9050600061349884614406565b905060006134a585614437565b905060006134b286614468565b905060006134ff826134f1856134e3886134d58b8e61438b90919063ffffffff16565b61438b90919063ffffffff16565b61438b90919063ffffffff16565b61438b90919063ffffffff16565b90506040518060a001604052808281526020018681526020018581526020018481526020018381525095505050505050919050565b61353c61459c565b6000613551838961449990919063ffffffff16565b90506000613568848961449990919063ffffffff16565b9050600061357f858961449990919063ffffffff16565b90506000613596868961449990919063ffffffff16565b905060006135ad878961449990919063ffffffff16565b905060006135fa836135ec866135de866135d08b8d61438b90919063ffffffff16565b61438b90919063ffffffff16565b61438b90919063ffffffff16565b61438b90919063ffffffff16565b90506040518060c001604052808781526020018281526020018681526020018581526020018481526020018381525096505050505050509695505050505050565b6000601081905550600060138190555060006011819055506000601281905550565b6136af82600360003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546128d990919063ffffffff16565b600360003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600760003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156137da5761379681600460003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546128d990919063ffffffff16565b600460003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b5050565b613805856137f788600a5461438b90919063ffffffff16565b61438b90919063ffffffff16565b600a8190555061382083600b546128d990919063ffffffff16565b600b8190555061383b8260095461438b90919063ffffffff16565b60098190555061385682600c546128d990919063ffffffff16565b600c819055506138d08460036000601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546128d990919063ffffffff16565b60036000601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060076000601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615613a8357613a1d8160046000601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546128d990919063ffffffff16565b60046000601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b505050505050565b613add82600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461438b90919063ffffffff16565b600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613b768160000151600360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461438b90919063ffffffff16565b600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613c0f8160200151600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546128d990919063ffffffff16565b600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360c00151604051613cb3919061484f565b60405180910390a350505050565b613d178160000151600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461438b90919063ffffffff16565b600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613db08160c00151600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546128d990919063ffffffff16565b600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613e498160200151600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546128d990919063ffffffff16565b600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360c00151604051613eed919061484f565b60405180910390a3505050565b613f508160000151600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461438b90919063ffffffff16565b600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613fe98160200151600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546128d990919063ffffffff16565b600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360c0015160405161408d919061484f565b60405180910390a3505050565b6140ec82600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461438b90919063ffffffff16565b600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506141858160000151600360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461438b90919063ffffffff16565b600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061421e8160c00151600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546128d990919063ffffffff16565b600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506142b78160200151600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546128d990919063ffffffff16565b600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360c0015160405161435b919061484f565b60405180910390a350505050565b6001601081905550600160138190555060016012819055506001601181905550565b60006143cd83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612800565b905092915050565b60006143ff60646143f16010548561449990919063ffffffff16565b61288f90919063ffffffff16565b9050919050565b600061443060646144226011548561449990919063ffffffff16565b61288f90919063ffffffff16565b9050919050565b600061446160646144536012548561449990919063ffffffff16565b61288f90919063ffffffff16565b9050919050565b600061449260646144846013548561449990919063ffffffff16565b61288f90919063ffffffff16565b9050919050565b60008083036144ab576000905061450d565b600082846144b99190615780565b90508284826144c8919061574f565b14614508576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016144ff9061584c565b60405180910390fd5b809150505b92915050565b60405180610160016040528060008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b6040518060c001604052806000815260200160008152602001600081526020016000815260200160008152602001600081525090565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006145fd826145d2565b9050919050565b61460d816145f2565b82525050565b60006020820190506146286000830184614604565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561466857808201518184015260208101905061464d565b83811115614677576000848401525b50505050565b6000601f19601f8301169050919050565b60006146998261462e565b6146a38185614639565b93506146b381856020860161464a565b6146bc8161467d565b840191505092915050565b600060208201905081810360008301526146e1818461468e565b905092915050565b600080fd5b6146f7816145f2565b811461470257600080fd5b50565b600081359050614714816146ee565b92915050565b6000819050919050565b61472d8161471a565b811461473857600080fd5b50565b60008135905061474a81614724565b92915050565b60008060408385031215614767576147666146e9565b5b600061477585828601614705565b92505060206147868582860161473b565b9150509250929050565b60008115159050919050565b6147a581614790565b82525050565b60006020820190506147c0600083018461479c565b92915050565b6000819050919050565b60006147eb6147e66147e1846145d2565b6147c6565b6145d2565b9050919050565b60006147fd826147d0565b9050919050565b600061480f826147f2565b9050919050565b61481f81614804565b82525050565b600060208201905061483a6000830184614816565b92915050565b6148498161471a565b82525050565b60006020820190506148646000830184614840565b92915050565b600080600060608486031215614883576148826146e9565b5b600061489186828701614705565b93505060206148a286828701614705565b92505060406148b38682870161473b565b9150509250925092565b6000602082840312156148d3576148d26146e9565b5b60006148e18482850161473b565b91505092915050565b600060ff82169050919050565b614900816148ea565b82525050565b600060208201905061491b60008301846148f7565b92915050565b600060208284031215614937576149366146e9565b5b600061494584828501614705565b91505092915050565b61495781614790565b811461496257600080fd5b50565b6000813590506149748161494e565b92915050565b60008060408385031215614991576149906146e9565b5b600061499f8582860161473b565b92505060206149b085828601614965565b9150509250929050565b6000602082840312156149d0576149cf6146e9565b5b60006149de84828501614965565b91505092915050565b600080604083850312156149fe576149fd6146e9565b5b6000614a0c85828601614705565b9250506020614a1d85828601614705565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680614a6e57607f821691505b602082108103614a8157614a80614a27565b5b50919050565b7f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260008201527f65666c656374696f6e7300000000000000000000000000000000000000000000602082015250565b6000614ae3602a83614639565b9150614aee82614a87565b604082019050919050565b60006020820190508181036000830152614b1281614ad6565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614b4f602083614639565b9150614b5a82614b19565b602082019050919050565b60006020820190508181036000830152614b7e81614b42565b9050919050565b7f416d6f756e74206d757374206265206c657373207468616e20737570706c7900600082015250565b6000614bbb601f83614639565b9150614bc682614b85565b602082019050919050565b60006020820190508181036000830152614bea81614bae565b9050919050565b7f57652063616e206e6f74206578636c75646520556e697377617020726f75746560008201527f722e000000000000000000000000000000000000000000000000000000000000602082015250565b6000614c4d602283614639565b9150614c5882614bf1565b604082019050919050565b60006020820190508181036000830152614c7c81614c40565b9050919050565b7f4163636f756e7420616c7265616479206578636c756465640000000000000000600082015250565b6000614cb9601883614639565b9150614cc482614c83565b602082019050919050565b60006020820190508181036000830152614ce881614cac565b9050919050565b7f4578636c75646564206c69737420697320746f6f206c6f6e6700000000000000600082015250565b6000614d25601983614639565b9150614d3082614cef565b602082019050919050565b60006020820190508181036000830152614d5481614d18565b9050919050565b7f54726164696e6720616c726561647920656e61626c6564210000000000000000600082015250565b6000614d91601883614639565b9150614d9c82614d5b565b602082019050919050565b60006020820190508181036000830152614dc081614d84565b9050919050565b6000604082019050614ddc6000830185614604565b614de96020830184614840565b9392505050565b600081519050614dff8161494e565b92915050565b600060208284031215614e1b57614e1a6146e9565b5b6000614e2984828501614df0565b91505092915050565b7f696e73756666696369656e74204554482062616c616e63650000000000000000600082015250565b6000614e68601883614639565b9150614e7382614e32565b602082019050919050565b60006020820190508181036000830152614e9781614e5b565b9050919050565b7f43616e6e6f7420736574207472616e73616374696f6e20616d6f756e74206c6560008201527f7373207468616e20302e312070657263656e74206f6620696e697469616c205460208201527f6f74616c20537570706c79210000000000000000000000000000000000000000604082015250565b6000614f20604c83614639565b9150614f2b82614e9e565b606082019050919050565b60006020820190508181036000830152614f4f81614f13565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614fb2602683614639565b9150614fbd82614f56565b604082019050919050565b60006020820190508181036000830152614fe181614fa5565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000615044602483614639565b915061504f82614fe8565b604082019050919050565b6000602082019050818103600083015261507381615037565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006150d6602283614639565b91506150e18261507a565b604082019050919050565b60006020820190508181036000830152615105816150c9565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000615168602583614639565b91506151738261510c565b604082019050919050565b600060208201905081810360008301526151978161515b565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b60006151fa602383614639565b91506152058261519e565b604082019050919050565b60006020820190508181036000830152615229816151ed565b9050919050565b7f5472616e7366657220616d6f756e74206d75737420626520677265617465722060008201527f7468616e207a65726f0000000000000000000000000000000000000000000000602082015250565b600061528c602983614639565b915061529782615230565b604082019050919050565b600060208201905081810360008301526152bb8161527f565b9050919050565b7f54726164696e67206e6f742079657420656e61626c6564210000000000000000600082015250565b60006152f8601883614639565b9150615303826152c2565b602082019050919050565b60006020820190508181036000830152615327816152eb565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006153688261471a565b91506153738361471a565b9250828210156153865761538561532e565b5b828203905092915050565b600061539c8261471a565b91506153a78361471a565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156153dc576153db61532e565b5b828201905092915050565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000600082015250565b600061541d601b83614639565b9150615428826153e7565b602082019050919050565b6000602082019050818103600083015261544c81615410565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000815190506154c0816146ee565b92915050565b6000602082840312156154dc576154db6146e9565b5b60006154ea848285016154b1565b91505092915050565b6000819050919050565b600061551861551361550e846154f3565b6147c6565b61471a565b9050919050565b615528816154fd565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b615563816145f2565b82525050565b6000615575838361555a565b60208301905092915050565b6000602082019050919050565b60006155998261552e565b6155a38185615539565b93506155ae8361554a565b8060005b838110156155df5781516155c68882615569565b97506155d183615581565b9250506001810190506155b2565b5085935050505092915050565b600060a0820190506156016000830188614840565b61560e602083018761551f565b8181036040830152615620818661558e565b905061562f6060830185614604565b61563c6080830184614840565b9695505050505050565b7f5472616e7366657220616d6f756e74206578636565647320746865206d61785460008201527f78416d6f756e742e000000000000000000000000000000000000000000000000602082015250565b60006156a2602883614639565b91506156ad82615646565b604082019050919050565b600060208201905081810360008301526156d181615695565b9050919050565b60006156e38261471a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036157155761571461532e565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061575a8261471a565b91506157658361471a565b92508261577557615774615720565b5b828204905092915050565b600061578b8261471a565b91506157968361471a565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156157cf576157ce61532e565b5b828202905092915050565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008201527f7700000000000000000000000000000000000000000000000000000000000000602082015250565b6000615836602183614639565b9150615841826157da565b604082019050919050565b6000602082019050818103600083015261586581615829565b905091905056fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220eb2c40d4718a7e292ed952f54e03eb6e3edf6c8f34aa1d86e3a7f0b59b67c63b64736f6c634300080e0033
60c060405268056bc75e2d6310000060095560095460001962000023919062000763565b600019620000329190620007ca565b600a556040518060400160405280600781526020017f53414954414d4100000000000000000000000000000000000000000000000000815250600d9080519060200190620000829291906200067a565b506040518060400160405280600781526020017f53414954414d4100000000000000000000000000000000000000000000000000815250600e9080519060200190620000d09291906200067a565b506009600f60006101000a81548160ff021916908360ff160217905550600160105560016011556001601255600160135573b3a50a36f988a1d44c248a042a068f822a5faa29601460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073b3a50a36f988a1d44c248a042a068f822a5faa29601560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000601560146101000a81548160ff02191690831515021790555060016015806101000a81548160ff0219169083151502179055506000601560166101000a81548160ff02191690831515021790555067016345785d8a0000601655668e1bc9bf0400006017553480156200021f57600080fd5b506000620002326200064960201b60201c565b9050806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350600a5460036000620002e76200064960201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000737a250d5630b4cf539739df2c5dacb4c659f2488d90508073ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200038a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003b091906200086f565b73ffffffffffffffffffffffffffffffffffffffff1663c9c65396308373ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000418573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200043e91906200086f565b6040518363ffffffff1660e01b81526004016200045d929190620008b2565b6020604051808303816000875af11580156200047d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620004a391906200086f565b73ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff16815250508073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1681525050600160066000620005206200065160201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600660003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550620005d96200064960201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6009546040516200063a9190620008f0565b60405180910390a35062000971565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b82805462000688906200093c565b90600052602060002090601f016020900481019282620006ac5760008555620006f8565b82601f10620006c757805160ff1916838001178555620006f8565b82800160010185558215620006f8579182015b82811115620006f7578251825591602001919060010190620006da565b5b5090506200070791906200070b565b5090565b5b80821115620007265760008160009055506001016200070c565b5090565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600062000770826200072a565b91506200077d836200072a565b92508262000790576200078f62000734565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000620007d7826200072a565b9150620007e4836200072a565b925082821015620007fa57620007f96200079b565b5b828203905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000837826200080a565b9050919050565b62000849816200082a565b81146200085557600080fd5b50565b60008151905062000869816200083e565b92915050565b60006020828403121562000888576200088762000805565b5b6000620008988482850162000858565b91505092915050565b620008ac816200082a565b82525050565b6000604082019050620008c96000830185620008a1565b620008d86020830184620008a1565b9392505050565b620008ea816200072a565b82525050565b6000602082019050620009076000830184620008df565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200095557607f821691505b6020821081036200096b576200096a6200090d565b5b50919050565b60805160a0516158ef620009b3600039600081816110130152612775015260008181610b6f01528181612ab001528181612b910152612bb801526158ef6000f3fe6080604052600436106102765760003560e01c8063741af87f1161014f578063adbede72116100c1578063ea2f0b371161007a578063ea2f0b371461098b578063ec0c9d4d146109b4578063ec28438a146109dd578063f2fde38b14610a06578063f709594514610a2f578063ffc7863514610a5a5761027d565b8063adbede721461087b578063b8d36b50146108a6578063c0b0fda2146108cf578063c5254f40146108fa578063c730b8a414610923578063dd62ed3e1461094e5761027d565b80638c8f8c04116101135780638c8f8c04146107595780638da5cb5b146107825780638ff67c36146107ad57806395d89b41146107d6578063a457c2d714610801578063a9059cbb1461083e5761027d565b8063741af87f1461069857806376b851ca146106af5780637d1db4a5146106da57806388f82020146107055780638a8c523c146107425761027d565b806338780fe6116101e857806349bd5a5e116101ac57806349bd5a5e1461058857806352390c02146105b35780635342acb4146105dc57806370a082311461061957806370c668c814610656578063715018a6146106815761027d565b806338780fe61461049157806338e2f22f146104ba57806339509351146104e5578063437823ec146105225780634549b0391461054b5761027d565b806318160ddd1161023a57806318160ddd1461036b57806323b872dd146103965780632d838119146103d3578063313ce56714610410578063317653e01461043b5780633206b4aa146104665761027d565b806301ba031f1461028257806306486014146102ad57806306fdde03146102d8578063095ea7b3146103035780631694505e146103405761027d565b3661027d57005b600080fd5b34801561028e57600080fd5b50610297610a71565b6040516102a49190614613565b60405180910390f35b3480156102b957600080fd5b506102c2610a97565b6040516102cf9190614613565b60405180910390f35b3480156102e457600080fd5b506102ed610abd565b6040516102fa91906146c7565b60405180910390f35b34801561030f57600080fd5b5061032a60048036038101906103259190614750565b610b4f565b60405161033791906147ab565b60405180910390f35b34801561034c57600080fd5b50610355610b6d565b6040516103629190614825565b60405180910390f35b34801561037757600080fd5b50610380610b91565b60405161038d919061484f565b60405180910390f35b3480156103a257600080fd5b506103bd60048036038101906103b8919061486a565b610b9b565b6040516103ca91906147ab565b60405180910390f35b3480156103df57600080fd5b506103fa60048036038101906103f591906148bd565b610c74565b604051610407919061484f565b60405180910390f35b34801561041c57600080fd5b50610425610ce2565b6040516104329190614906565b60405180910390f35b34801561044757600080fd5b50610450610cf9565b60405161045d919061484f565b60405180910390f35b34801561047257600080fd5b5061047b610d03565b604051610488919061484f565b60405180910390f35b34801561049d57600080fd5b506104b860048036038101906104b39190614921565b610d09565b005b3480156104c657600080fd5b506104cf610de2565b6040516104dc919061484f565b60405180910390f35b3480156104f157600080fd5b5061050c60048036038101906105079190614750565b610dec565b60405161051991906147ab565b60405180910390f35b34801561052e57600080fd5b5061054960048036038101906105449190614921565b610e9f565b005b34801561055757600080fd5b50610572600480360381019061056d919061497a565b610f8f565b60405161057f919061484f565b60405180910390f35b34801561059457600080fd5b5061059d611011565b6040516105aa9190614613565b60405180910390f35b3480156105bf57600080fd5b506105da60048036038101906105d59190614921565b611035565b005b3480156105e857600080fd5b5061060360048036038101906105fe9190614921565b6113b3565b60405161061091906147ab565b60405180910390f35b34801561062557600080fd5b50610640600480360381019061063b9190614921565b611409565b60405161064d919061484f565b60405180910390f35b34801561066257600080fd5b5061066b6114f4565b604051610678919061484f565b60405180910390f35b34801561068d57600080fd5b506106966114fa565b005b3480156106a457600080fd5b506106ad61164d565b005b3480156106bb57600080fd5b506106c461171e565b6040516106d191906147ab565b60405180910390f35b3480156106e657600080fd5b506106ef61172f565b6040516106fc919061484f565b60405180910390f35b34801561071157600080fd5b5061072c60048036038101906107279190614921565b611735565b60405161073991906147ab565b60405180910390f35b34801561074e57600080fd5b5061075761178b565b005b34801561076557600080fd5b50610780600480360381019061077b919061486a565b61188d565b005b34801561078e57600080fd5b506107976119a6565b6040516107a49190614613565b60405180910390f35b3480156107b957600080fd5b506107d460048036038101906107cf91906149ba565b6119cf565b005b3480156107e257600080fd5b506107eb611a80565b6040516107f891906146c7565b60405180910390f35b34801561080d57600080fd5b5061082860048036038101906108239190614750565b611b12565b60405161083591906147ab565b60405180910390f35b34801561084a57600080fd5b5061086560048036038101906108609190614750565b611bdf565b60405161087291906147ab565b60405180910390f35b34801561088757600080fd5b50610890611bfd565b60405161089d919061484f565b60405180910390f35b3480156108b257600080fd5b506108cd60048036038101906108c891906148bd565b611c07565b005b3480156108db57600080fd5b506108e4611d30565b6040516108f1919061484f565b60405180910390f35b34801561090657600080fd5b50610921600480360381019061091c9190614921565b611d36565b005b34801561092f57600080fd5b50610938611e0f565b604051610945919061484f565b60405180910390f35b34801561095a57600080fd5b50610975600480360381019061097091906149e7565b611e15565b604051610982919061484f565b60405180910390f35b34801561099757600080fd5b506109b260048036038101906109ad9190614921565b611e9c565b005b3480156109c057600080fd5b506109db60048036038101906109d691906148bd565b611f8c565b005b3480156109e957600080fd5b50610a0460048036038101906109ff91906148bd565b61202b565b005b348015610a1257600080fd5b50610a2d6004803603810190610a289190614921565b612114565b005b348015610a3b57600080fd5b50610a446122d5565b604051610a5191906147ab565b60405180910390f35b348015610a6657600080fd5b50610a6f6122e8565b005b601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6060600d8054610acc90614a56565b80601f0160208091040260200160405190810160405280929190818152602001828054610af890614a56565b8015610b455780601f10610b1a57610100808354040283529160200191610b45565b820191906000526020600020905b815481529060010190602001808311610b2857829003601f168201915b5050505050905090565b6000610b63610b5c6123b9565b84846123c1565b6001905092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600954905090565b6000610ba884848461258a565b610c6984610bb46123b9565b610c648560405180606001604052806028815260200161586d60289139600560008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610c1a6123b9565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546128009092919063ffffffff16565b6123c1565b600190509392505050565b6000600a54821115610cbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb290614af9565b60405180910390fd5b6000610cc5612864565b9050610cda818461288f90919063ffffffff16565b915050919050565b6000600f60009054906101000a900460ff16905090565b6000600c54905090565b60105481565b610d116123b9565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610d9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9590614b65565b60405180910390fd5b80601560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000601754905090565b6000610e95610df96123b9565b84610e908560056000610e0a6123b9565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546128d990919063ffffffff16565b6123c1565b6001905092915050565b610ea76123b9565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610f34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2b90614b65565b60405180910390fd5b6001600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6000600954831115610fd6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fcd90614bd1565b60405180910390fd5b81610ff5576000610fe684612937565b6000015190508091505061100b565b600061100084612937565b602001519050809150505b92915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b61103d6123b9565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146110ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c190614b65565b60405180910390fd5b737a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361114c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114390614c63565b60405180910390fd5b600760008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156111d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d090614ccf565b60405180910390fd5b606460088054905010611221576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121890614d3b565b60405180910390fd5b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411156112f5576112b1600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610c74565b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b6001600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506008819080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156114a457600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506114ef565b6114ec600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610c74565b90505b919050565b60125481565b6115026123b9565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461158f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158690614b65565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6116556123b9565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146116e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d990614b65565b60405180910390fd5b600060108190555060006011819055506000601281905550600060138190555060006015806101000a81548160ff021916908315150217905550565b60158054906101000a900460ff1681565b60165481565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6117936123b9565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611820576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181790614b65565b60405180910390fd5b601560169054906101000a900460ff1615611870576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186790614da7565b60405180910390fd5b6001601560166101000a81548160ff021916908315150217905550565b6118956123b9565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611922576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191990614b65565b60405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff1660e01b815260040161195d929190614dc7565b6020604051808303816000875af115801561197c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119a09190614e05565b50505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6119d76123b9565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611a64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5b90614b65565b60405180910390fd5b806015806101000a81548160ff02191690831515021790555050565b6060600e8054611a8f90614a56565b80601f0160208091040260200160405190810160405280929190818152602001828054611abb90614a56565b8015611b085780601f10611add57610100808354040283529160200191611b08565b820191906000526020600020905b815481529060010190602001808311611aeb57829003601f168201915b5050505050905090565b6000611bd5611b1f6123b9565b84611bd0856040518060600160405280602581526020016158956025913960056000611b496123b9565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546128009092919063ffffffff16565b6123c1565b6001905092915050565b6000611bf3611bec6123b9565b848461258a565b6001905092915050565b6000600b54905090565b611c0f6123b9565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611c9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c9390614b65565b60405180910390fd5b80471015611cdf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cd690614e7e565b60405180910390fd5b611ce76119a6565b73ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611d2c573d6000803e3d6000fd5b5050565b60115481565b611d3e6123b9565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611dcb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dc290614b65565b60405180910390fd5b80601460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60135481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b611ea46123b9565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611f31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2890614b65565b60405180910390fd5b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b611f946123b9565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612021576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161201890614b65565b60405180910390fd5b8060178190555050565b6120336123b9565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146120c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120b790614b65565b60405180910390fd5b67016345785d8a0000811161210a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161210190614f36565b60405180910390fd5b8060168190555050565b61211c6123b9565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146121a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121a090614b65565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612218576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161220f90614fc8565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b601560169054906101000a900460ff1681565b6122f06123b9565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461237d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161237490614b65565b60405180910390fd5b600160108190555060016011819055506001601281905550600160138190555060016015806101000a81548160ff021916908315150217905550565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612430576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124279061505a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361249f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612496906150ec565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161257d919061484f565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036125f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125f09061517e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612668576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161265f90615210565b60405180910390fd5b600081116126ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126a2906152a2565b60405180910390fd5b601560169054906101000a900460ff161580156126fb57506126cb6119a6565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b1561273b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127329061530e565b60405180910390fd5b600061274630611409565b90506000601754821015905080801561276c5750601560149054906101000a900460ff16155b80156127c457507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b80156127da575060158054906101000a900460ff165b156127ee5760175491506127ed826129f6565b5b6127f9858585612c8b565b5050505050565b6000838311158290612848576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161283f91906146c7565b60405180910390fd5b5060008385612857919061535d565b9050809150509392505050565b6000806000612871613162565b91509150612888818361288f90919063ffffffff16565b9250505090565b60006128d183836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613415565b905092915050565b60008082846128e89190615391565b90508381101561292d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161292490615433565b60405180910390fd5b8091505092915050565b61293f614513565b600061294a83613478565b9050600061297384836020015184604001518560600151866080015161296e612864565b613534565b905060405180610160016040528082600001518152602001826020015181526020018260400151815260200182606001518152602001826080015181526020018260a00151815260200183600001518152602001836020015181526020018360400151815260200183606001518152602001836080015181525092505050919050565b6001601560146101000a81548160ff0219169083151502179055506000600267ffffffffffffffff811115612a2e57612a2d615453565b5b604051908082528060200260200182016040528015612a5c5781602001602082028036833780820191505090505b5090503081600081518110612a7457612a73615482565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612b19573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b3d91906154c6565b81600181518110612b5157612b50615482565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050612bb6307f0000000000000000000000000000000000000000000000000000000000000000846123c1565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663791ac94783600084601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16426040518663ffffffff1660e01b8152600401612c3a9594939291906155ec565b600060405180830381600087803b158015612c5457600080fd5b505af1158015612c68573d6000803e3d6000fd5b50505050506000601560146101000a81548160ff02191690831515021790555050565b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680612d2c5750600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b15612d3e57612d3961363b565b612d84565b601654811115612d83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d7a906156b8565b60405180910390fd5b5b6000612d8f82612937565b9050612da48160a0015182610140015161365d565b612dcc8160400151826060015183608001518460e001518561010001518661012001516137de565b600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168015612e6f5750600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15612e8557612e8084848484613a8b565b6130ad565b600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16158015612f285750600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b15612f3d57612f38848483613cc1565b6130ac565b600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16158015612fe15750600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15612ff657612ff1848483613efa565b6130ab565b600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680156130985750600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b156130aa576130a98484848461409a565b5b5b5b5b600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168061314e5750600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b1561315c5761315b614369565b5b50505050565b6000806000600a5490506000600954905060005b6008805490508110156133d85782600360006008848154811061319c5761319b615482565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054118061328a575081600460006008848154811061322257613221615482565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054115b156132a157600a5460095494509450505050613411565b61333160036000600884815481106132bc576132bb615482565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548461438b90919063ffffffff16565b92506133c3600460006008848154811061334e5761334d615482565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548361438b90919063ffffffff16565b915080806133d0906156d8565b915050613176565b506133f0600954600a5461288f90919063ffffffff16565b82101561340857600a54600954935093505050613411565b81819350935050505b9091565b6000808311829061345c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161345391906146c7565b60405180910390fd5b506000838561346b919061574f565b9050809150509392505050565b61348061456d565b600061348b836143d5565b9050600061349884614406565b905060006134a585614437565b905060006134b286614468565b905060006134ff826134f1856134e3886134d58b8e61438b90919063ffffffff16565b61438b90919063ffffffff16565b61438b90919063ffffffff16565b61438b90919063ffffffff16565b90506040518060a001604052808281526020018681526020018581526020018481526020018381525095505050505050919050565b61353c61459c565b6000613551838961449990919063ffffffff16565b90506000613568848961449990919063ffffffff16565b9050600061357f858961449990919063ffffffff16565b90506000613596868961449990919063ffffffff16565b905060006135ad878961449990919063ffffffff16565b905060006135fa836135ec866135de866135d08b8d61438b90919063ffffffff16565b61438b90919063ffffffff16565b61438b90919063ffffffff16565b61438b90919063ffffffff16565b90506040518060c001604052808781526020018281526020018681526020018581526020018481526020018381525096505050505050509695505050505050565b6000601081905550600060138190555060006011819055506000601281905550565b6136af82600360003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546128d990919063ffffffff16565b600360003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600760003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156137da5761379681600460003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546128d990919063ffffffff16565b600460003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b5050565b613805856137f788600a5461438b90919063ffffffff16565b61438b90919063ffffffff16565b600a8190555061382083600b546128d990919063ffffffff16565b600b8190555061383b8260095461438b90919063ffffffff16565b60098190555061385682600c546128d990919063ffffffff16565b600c819055506138d08460036000601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546128d990919063ffffffff16565b60036000601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060076000601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615613a8357613a1d8160046000601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546128d990919063ffffffff16565b60046000601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b505050505050565b613add82600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461438b90919063ffffffff16565b600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613b768160000151600360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461438b90919063ffffffff16565b600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613c0f8160200151600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546128d990919063ffffffff16565b600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360c00151604051613cb3919061484f565b60405180910390a350505050565b613d178160000151600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461438b90919063ffffffff16565b600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613db08160c00151600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546128d990919063ffffffff16565b600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613e498160200151600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546128d990919063ffffffff16565b600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360c00151604051613eed919061484f565b60405180910390a3505050565b613f508160000151600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461438b90919063ffffffff16565b600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613fe98160200151600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546128d990919063ffffffff16565b600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360c0015160405161408d919061484f565b60405180910390a3505050565b6140ec82600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461438b90919063ffffffff16565b600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506141858160000151600360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461438b90919063ffffffff16565b600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061421e8160c00151600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546128d990919063ffffffff16565b600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506142b78160200151600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546128d990919063ffffffff16565b600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360c0015160405161435b919061484f565b60405180910390a350505050565b6001601081905550600160138190555060016012819055506001601181905550565b60006143cd83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612800565b905092915050565b60006143ff60646143f16010548561449990919063ffffffff16565b61288f90919063ffffffff16565b9050919050565b600061443060646144226011548561449990919063ffffffff16565b61288f90919063ffffffff16565b9050919050565b600061446160646144536012548561449990919063ffffffff16565b61288f90919063ffffffff16565b9050919050565b600061449260646144846013548561449990919063ffffffff16565b61288f90919063ffffffff16565b9050919050565b60008083036144ab576000905061450d565b600082846144b99190615780565b90508284826144c8919061574f565b14614508576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016144ff9061584c565b60405180910390fd5b809150505b92915050565b60405180610160016040528060008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b6040518060c001604052806000815260200160008152602001600081526020016000815260200160008152602001600081525090565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006145fd826145d2565b9050919050565b61460d816145f2565b82525050565b60006020820190506146286000830184614604565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561466857808201518184015260208101905061464d565b83811115614677576000848401525b50505050565b6000601f19601f8301169050919050565b60006146998261462e565b6146a38185614639565b93506146b381856020860161464a565b6146bc8161467d565b840191505092915050565b600060208201905081810360008301526146e1818461468e565b905092915050565b600080fd5b6146f7816145f2565b811461470257600080fd5b50565b600081359050614714816146ee565b92915050565b6000819050919050565b61472d8161471a565b811461473857600080fd5b50565b60008135905061474a81614724565b92915050565b60008060408385031215614767576147666146e9565b5b600061477585828601614705565b92505060206147868582860161473b565b9150509250929050565b60008115159050919050565b6147a581614790565b82525050565b60006020820190506147c0600083018461479c565b92915050565b6000819050919050565b60006147eb6147e66147e1846145d2565b6147c6565b6145d2565b9050919050565b60006147fd826147d0565b9050919050565b600061480f826147f2565b9050919050565b61481f81614804565b82525050565b600060208201905061483a6000830184614816565b92915050565b6148498161471a565b82525050565b60006020820190506148646000830184614840565b92915050565b600080600060608486031215614883576148826146e9565b5b600061489186828701614705565b93505060206148a286828701614705565b92505060406148b38682870161473b565b9150509250925092565b6000602082840312156148d3576148d26146e9565b5b60006148e18482850161473b565b91505092915050565b600060ff82169050919050565b614900816148ea565b82525050565b600060208201905061491b60008301846148f7565b92915050565b600060208284031215614937576149366146e9565b5b600061494584828501614705565b91505092915050565b61495781614790565b811461496257600080fd5b50565b6000813590506149748161494e565b92915050565b60008060408385031215614991576149906146e9565b5b600061499f8582860161473b565b92505060206149b085828601614965565b9150509250929050565b6000602082840312156149d0576149cf6146e9565b5b60006149de84828501614965565b91505092915050565b600080604083850312156149fe576149fd6146e9565b5b6000614a0c85828601614705565b9250506020614a1d85828601614705565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680614a6e57607f821691505b602082108103614a8157614a80614a27565b5b50919050565b7f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260008201527f65666c656374696f6e7300000000000000000000000000000000000000000000602082015250565b6000614ae3602a83614639565b9150614aee82614a87565b604082019050919050565b60006020820190508181036000830152614b1281614ad6565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614b4f602083614639565b9150614b5a82614b19565b602082019050919050565b60006020820190508181036000830152614b7e81614b42565b9050919050565b7f416d6f756e74206d757374206265206c657373207468616e20737570706c7900600082015250565b6000614bbb601f83614639565b9150614bc682614b85565b602082019050919050565b60006020820190508181036000830152614bea81614bae565b9050919050565b7f57652063616e206e6f74206578636c75646520556e697377617020726f75746560008201527f722e000000000000000000000000000000000000000000000000000000000000602082015250565b6000614c4d602283614639565b9150614c5882614bf1565b604082019050919050565b60006020820190508181036000830152614c7c81614c40565b9050919050565b7f4163636f756e7420616c7265616479206578636c756465640000000000000000600082015250565b6000614cb9601883614639565b9150614cc482614c83565b602082019050919050565b60006020820190508181036000830152614ce881614cac565b9050919050565b7f4578636c75646564206c69737420697320746f6f206c6f6e6700000000000000600082015250565b6000614d25601983614639565b9150614d3082614cef565b602082019050919050565b60006020820190508181036000830152614d5481614d18565b9050919050565b7f54726164696e6720616c726561647920656e61626c6564210000000000000000600082015250565b6000614d91601883614639565b9150614d9c82614d5b565b602082019050919050565b60006020820190508181036000830152614dc081614d84565b9050919050565b6000604082019050614ddc6000830185614604565b614de96020830184614840565b9392505050565b600081519050614dff8161494e565b92915050565b600060208284031215614e1b57614e1a6146e9565b5b6000614e2984828501614df0565b91505092915050565b7f696e73756666696369656e74204554482062616c616e63650000000000000000600082015250565b6000614e68601883614639565b9150614e7382614e32565b602082019050919050565b60006020820190508181036000830152614e9781614e5b565b9050919050565b7f43616e6e6f7420736574207472616e73616374696f6e20616d6f756e74206c6560008201527f7373207468616e20302e312070657263656e74206f6620696e697469616c205460208201527f6f74616c20537570706c79210000000000000000000000000000000000000000604082015250565b6000614f20604c83614639565b9150614f2b82614e9e565b606082019050919050565b60006020820190508181036000830152614f4f81614f13565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614fb2602683614639565b9150614fbd82614f56565b604082019050919050565b60006020820190508181036000830152614fe181614fa5565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000615044602483614639565b915061504f82614fe8565b604082019050919050565b6000602082019050818103600083015261507381615037565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006150d6602283614639565b91506150e18261507a565b604082019050919050565b60006020820190508181036000830152615105816150c9565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000615168602583614639565b91506151738261510c565b604082019050919050565b600060208201905081810360008301526151978161515b565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b60006151fa602383614639565b91506152058261519e565b604082019050919050565b60006020820190508181036000830152615229816151ed565b9050919050565b7f5472616e7366657220616d6f756e74206d75737420626520677265617465722060008201527f7468616e207a65726f0000000000000000000000000000000000000000000000602082015250565b600061528c602983614639565b915061529782615230565b604082019050919050565b600060208201905081810360008301526152bb8161527f565b9050919050565b7f54726164696e67206e6f742079657420656e61626c6564210000000000000000600082015250565b60006152f8601883614639565b9150615303826152c2565b602082019050919050565b60006020820190508181036000830152615327816152eb565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006153688261471a565b91506153738361471a565b9250828210156153865761538561532e565b5b828203905092915050565b600061539c8261471a565b91506153a78361471a565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156153dc576153db61532e565b5b828201905092915050565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000600082015250565b600061541d601b83614639565b9150615428826153e7565b602082019050919050565b6000602082019050818103600083015261544c81615410565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000815190506154c0816146ee565b92915050565b6000602082840312156154dc576154db6146e9565b5b60006154ea848285016154b1565b91505092915050565b6000819050919050565b600061551861551361550e846154f3565b6147c6565b61471a565b9050919050565b615528816154fd565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b615563816145f2565b82525050565b6000615575838361555a565b60208301905092915050565b6000602082019050919050565b60006155998261552e565b6155a38185615539565b93506155ae8361554a565b8060005b838110156155df5781516155c68882615569565b97506155d183615581565b9250506001810190506155b2565b5085935050505092915050565b600060a0820190506156016000830188614840565b61560e602083018761551f565b8181036040830152615620818661558e565b905061562f6060830185614604565b61563c6080830184614840565b9695505050505050565b7f5472616e7366657220616d6f756e74206578636565647320746865206d61785460008201527f78416d6f756e742e000000000000000000000000000000000000000000000000602082015250565b60006156a2602883614639565b91506156ad82615646565b604082019050919050565b600060208201905081810360008301526156d181615695565b9050919050565b60006156e38261471a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036157155761571461532e565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061575a8261471a565b91506157658361471a565b92508261577557615774615720565b5b828204905092915050565b600061578b8261471a565b91506157968361471a565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156157cf576157ce61532e565b5b828202905092915050565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008201527f7700000000000000000000000000000000000000000000000000000000000000602082015250565b6000615836602183614639565b9150615841826157da565b604082019050919050565b6000602082019050818103600083015261586581615829565b905091905056fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220eb2c40d4718a7e292ed952f54e03eb6e3edf6c8f34aa1d86e3a7f0b59b67c63b64736f6c634300080e0033

Check out more smart contracts

Build blockchain magic with Alchemy

Alchemy combines the most powerful web3 developer products and tools with resources, community and legendary support.