ERC-20
Overview
Max Total Supply
85,457,808.342626702 SHIBABOLIC_T
Holders
13
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 9 Decimals)
Balance
4,091,298.626835711 SHIBABOLIC_TValue
$0.00Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
DividendTracker
Compiler Version
v0.8.16+commit.07a7930e
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-08-30 */ /** *Submitted for verification at Etherscan.io on 2022-04-21 */ pragma solidity ^0.8.12; // 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); } library SafeMathInt { int256 private constant MIN_INT256 = int256(1) << 255; int256 private constant MAX_INT256 = ~(int256(1) << 255); function mul(int256 a, int256 b) internal pure returns (int256) { int256 c = a * b; // Detect overflow when multiplying MIN_INT256 with -1 require(c != MIN_INT256 || (a & MIN_INT256) != (b & MIN_INT256)); require((b == 0) || (c / b == a)); return c; } function div(int256 a, int256 b) internal pure returns (int256) { // Prevent overflow when dividing MIN_INT256 by -1 require(b != - 1 || a != MIN_INT256); // Solidity already throws when dividing by 0. return a / b; } function sub(int256 a, int256 b) internal pure returns (int256) { int256 c = a - b; require((b >= 0 && c <= a) || (b < 0 && c > a)); return c; } function add(int256 a, int256 b) internal pure returns (int256) { int256 c = a + b; require((b >= 0 && c >= a) || (b < 0 && c < a)); return c; } function abs(int256 a) internal pure returns (int256) { require(a != MIN_INT256); return a < 0 ? - a : a; } function toUint256Safe(int256 a) internal pure returns (uint256) { require(a >= 0); return uint256(a); } } library SafeMathUint { function toInt256Safe(uint256 a) internal pure returns (int256) { int256 b = int256(a); require(b >= 0); return b; } } /** * @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) { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } /** * @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; 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; } } interface IUniswapV2Factory { function createPair(address tokenA, address tokenB) external returns (address pair); } interface IUniswapV2Router02 { function swapExactTokensForETHSupportingFeeOnTransferTokens( 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 factory() external pure returns (address); function WETH() external pure returns (address); function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts); } contract SHIBABOLIC is Context, IERC20, Ownable { using SafeMath for uint256; using Address for address; event SwapAndLiquifyEnabledUpdated(bool enabled); event SwapAndLiquify( uint256 tokensSwapped, uint256 ethReceived, uint256 tokensIntoLiqudity ); modifier lockTheSwap { inSwapAndLiquify = true; _; inSwapAndLiquify = false; } IUniswapV2Router02 public uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D); address public uniswapV2Pair = address(0); mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; mapping(address => bool) private botWallets; mapping(address => bool) private _isExcludedFromFee; mapping(address => bool) private _isExcludedFromRewards; string private _name = "SHIBABOLIC"; string private _symbol = "SHIBABOLIC"; uint8 private _decimals = 9; uint256 private _tTotal = 1000000000 * 10 ** _decimals; bool inSwapAndLiquify; bool public swapAndLiquifyEnabled = true; uint256 public ethPriceToSwap = 300000000000000000; //.3 ETH uint256 public _maxWalletAmount = 5000000100 * 10 ** _decimals; address public deadWallet = 0x000000000000000000000000000000000000dEaD; uint256 public gasForProcessing = 50000; event ProcessedDividendTracker(uint256 iterations, uint256 claims, uint256 lastProcessedIndex, bool indexed automatic, uint256 gas, address indexed processor); event SendDividends(uint256 EthAmount); struct TaxFees { uint256 buyFee; uint256 sellFee; } bool private doTakeFees; bool private isSellTxn; TaxFees public taxFees; DividendTracker public dividendTracker; constructor () { _balances[_msgSender()] = _tTotal; _isExcludedFromFee[owner()] = true; _isExcludedFromRewards[owner()] = true; _isExcludedFromRewards[deadWallet] = true; uniswapV2Pair = IUniswapV2Factory(uniswapV2Router.factory()).createPair(address(this), uniswapV2Router.WETH()); _isExcludedFromRewards[uniswapV2Pair] = true; taxFees = TaxFees(98, 3); 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) { return _balances[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 setMaxWalletAmount(uint256 maxWalletAmount) external onlyOwner() { _maxWalletAmount = maxWalletAmount * 10 ** 9; } function excludeIncludeFromFee(address[] calldata addresses, bool isExcludeFromFee) public onlyOwner { addRemoveFee(addresses, isExcludeFromFee); } function excludeIncludeFromRewards(address[] calldata addresses, bool isExcluded) public onlyOwner { addRemoveRewards(addresses, isExcluded); } function isExcludedFromRewards(address addr) public view returns (bool) { return _isExcludedFromRewards[addr]; } function addRemoveRewards(address[] calldata addresses, bool flag) private { for (uint256 i = 0; i < addresses.length; i++) { address addr = addresses[i]; _isExcludedFromRewards[addr] = flag; } } function setEthPriceToSwap(uint256 ethPriceToSwap_) external onlyOwner { ethPriceToSwap = ethPriceToSwap_; } function addRemoveFee(address[] calldata addresses, bool flag) private { for (uint256 i = 0; i < addresses.length; i++) { address addr = addresses[i]; _isExcludedFromFee[addr] = flag; } } function setTaxFees(uint256 buyFee, uint256 sellFee) external onlyOwner { taxFees.buyFee = buyFee; taxFees.sellFee = sellFee; } function isAddressBlocked(address addr) public view returns (bool) { return botWallets[addr]; } function blockAddresses(address[] memory addresses) external onlyOwner() { blockUnblockAddress(addresses, true); } function unblockAddresses(address[] memory addresses) external onlyOwner() { blockUnblockAddress(addresses, false); } function blockUnblockAddress(address[] memory addresses, bool doBlock) private { for (uint256 i = 0; i < addresses.length; i++) { address addr = addresses[i]; if (doBlock) { botWallets[addr] = true; } else { delete botWallets[addr]; } } } function setSwapAndLiquifyEnabled(bool _enabled) public onlyOwner { swapAndLiquifyEnabled = _enabled; emit SwapAndLiquifyEnabledUpdated(_enabled); } receive() external payable {} function getTokenAmountByEthPrice() public view returns (uint256) { address[] memory path = new address[](2); path[0] = uniswapV2Router.WETH(); path[1] = address(this); return uniswapV2Router.getAmountsOut(ethPriceToSwap, path)[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"); bool isSell = false; bool takeFees = !_isExcludedFromFee[from] && !_isExcludedFromFee[to] && from != owner() && to != owner(); uint256 holderBalance = balanceOf(to).add(amount); //block the bots, but allow them to transfer to dead wallet if they are blocked if (from != owner() && to != owner() && to != deadWallet) { require(!botWallets[from] && !botWallets[to], "bots are not allowed to sell or transfer tokens"); } if (from == uniswapV2Pair) { require(holderBalance <= _maxWalletAmount, "Wallet cannot exceed max Wallet limit"); } if (from != uniswapV2Pair && to == uniswapV2Pair) {//if sell //only tax if tokens are going back to Uniswap isSell = true; sellTaxTokens(); } if (from != uniswapV2Pair && to != uniswapV2Pair) { require(holderBalance <= _maxWalletAmount, "Wallet cannot exceed max Wallet limit"); } _tokenTransfer(from, to, amount, takeFees, isSell, true); } function sellTaxTokens() private { uint256 contractTokenBalance = balanceOf(address(this)); if (contractTokenBalance > 0) { uint256 tokenAmount = getTokenAmountByEthPrice(); if (contractTokenBalance >= tokenAmount && !inSwapAndLiquify && swapAndLiquifyEnabled) { //send eth to wallets investment and dev distributeShares(tokenAmount); } } } function updateGasForProcessing(uint256 newValue) public onlyOwner { require(newValue != gasForProcessing, "Cannot update gasForProcessing to same value"); gasForProcessing = newValue; } function distributeShares(uint256 balanceToShareTokens) private lockTheSwap { swapTokensForEth(balanceToShareTokens); uint256 ethBalance = address(this).balance; sendEthDividends(ethBalance); } function claimTokens() external { sellTaxTokens(); } function setDividendTracker(address dividendContractAddress) external onlyOwner { dividendTracker = DividendTracker(payable(dividendContractAddress)); } function sendEthDividends(uint256 dividends) private { (bool success,) = address(dividendTracker).call{value : dividends}(""); if (success) { emit SendDividends(dividends); } } function removeEthFromContract() external onlyOwner { uint256 ethBalance = address(this).balance; payable(owner()).transfer(ethBalance); } function swapTokensForEth(uint256 tokenAmount) private { // generate the uniswap pair path of token -> weth address[] memory path = new address[](2); path[0] = address(this); path[1] = uniswapV2Router.WETH(); _approve(address(this), address(uniswapV2Router), tokenAmount); // make the swap uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens( tokenAmount, 0, // accept any amount of ETH path, address(this), block.timestamp ); } //this method is responsible for taking all fee, if takeFee is true function _tokenTransfer(address sender, address recipient, uint256 amount, bool takeFees, bool isSell, bool doUpdateDividends) private { uint256 taxAmount = takeFees ? amount.mul(taxFees.buyFee).div(100) : 0; if (takeFees && isSell) { taxAmount = amount.mul(taxFees.sellFee).div(100); } uint256 transferAmount = amount.sub(taxAmount); _balances[sender] = _balances[sender].sub(amount); _balances[recipient] = _balances[recipient].add(transferAmount); _balances[address(this)] = _balances[address(this)].add(taxAmount); emit Transfer(sender, recipient, amount); if (doUpdateDividends) { try dividendTracker.setTokenBalance(sender) {} catch{} try dividendTracker.setTokenBalance(recipient) {} catch{} try dividendTracker.process(gasForProcessing) returns (uint256 iterations, uint256 claims, uint256 lastProcessedIndex) { emit ProcessedDividendTracker(iterations, claims, lastProcessedIndex, true, gasForProcessing, tx.origin); }catch {} } } } contract IterableMapping { // Iterable mapping from address to uint; struct Map { address[] keys; mapping(address => uint) values; mapping(address => uint) indexOf; mapping(address => bool) inserted; } Map private map; function get(address key) public view returns (uint) { return map.values[key]; } function keyExists(address key) public view returns (bool) { return (getIndexOfKey(key) != - 1); } function getIndexOfKey(address key) public view returns (int) { if (!map.inserted[key]) { return - 1; } return int(map.indexOf[key]); } function getKeyAtIndex(uint index) public view returns (address) { return map.keys[index]; } function size() public view returns (uint) { return map.keys.length; } function set(address key, uint val) public { if (map.inserted[key]) { map.values[key] = val; } else { map.inserted[key] = true; map.values[key] = val; map.indexOf[key] = map.keys.length; map.keys.push(key); } } function remove(address key) public { if (!map.inserted[key]) { return; } delete map.inserted[key]; delete map.values[key]; uint index = map.indexOf[key]; uint lastIndex = map.keys.length - 1; address lastKey = map.keys[lastIndex]; map.indexOf[lastKey] = index; delete map.indexOf[key]; map.keys[index] = lastKey; map.keys.pop(); } } contract DividendTracker is IERC20, Context, Ownable { using SafeMath for uint256; using SafeMathUint for uint256; using SafeMathInt for int256; uint256 constant internal magnitude = 2 ** 128; uint256 internal magnifiedDividendPerShare; mapping(address => int256) internal magnifiedDividendCorrections; mapping(address => uint256) internal withdrawnDividends; mapping(address => uint256) internal claimedDividends; mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name = "SHIBABOLIC TRACKER"; string private _symbol = "SHIBABOLIC_T"; uint8 private _decimals = 9; uint256 public totalDividendsDistributed; IterableMapping private tokenHoldersMap = new IterableMapping(); uint256 public minimumTokenBalanceForDividends = 2500000 * 10 ** _decimals; SHIBABOLIC private shibabolic; event updateBalance(address addr, uint256 amount); event DividendsDistributed(address indexed from, uint256 weiAmount); event DividendWithdrawn(address indexed to, uint256 weiAmount); uint256 public lastProcessedIndex; mapping(address => uint256) public lastClaimTimes; uint256 public claimWait = 3600; event ExcludeFromDividends(address indexed account); event ClaimWaitUpdated(uint256 indexed newValue, uint256 indexed oldValue); event Claim(address indexed account, uint256 amount, bool indexed automatic); IUniswapV2Router02 uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D); address public shibAddress = 0x95aD61b0a150d79219dCF64E1E6Cc01f0B64C4cE; IERC20 public shibToken = IERC20(shibAddress); constructor() { } 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 _totalSupply; } function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } function transfer(address, uint256) public pure returns (bool) { require(false, "No transfers allowed in dividend tracker"); return true; } function transferFrom(address, address, uint256) public pure override returns (bool) { require(false, "No transfers allowed in dividend tracker"); return true; } function allowance(address owner, address spender) public view override returns (uint256) { return _allowances[owner][spender]; } function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(_msgSender(), spender, amount); 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 _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 setTokenBalance(address account) public { uint256 balance = shibabolic.balanceOf(account); if (!shibabolic.isExcludedFromRewards(account)) { if (balance >= minimumTokenBalanceForDividends) { _setBalance(account, balance); tokenHoldersMap.set(account, balance); } else { _setBalance(account, 0); tokenHoldersMap.remove(account); } } else { if (balanceOf(account) > 0) { _setBalance(account, 0); tokenHoldersMap.remove(account); } } processAccount(payable(account), true); } function updateTokenBalances(address[] memory accounts) external { uint256 index = 0; while (index < accounts.length) { setTokenBalance(accounts[index]); index += 1; } } function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _totalSupply = _totalSupply.add(amount); _balances[account] = _balances[account].add(amount); emit Transfer(address(0), account, amount); magnifiedDividendCorrections[account] = magnifiedDividendCorrections[account] .sub((magnifiedDividendPerShare.mul(amount)).toInt256Safe()); } function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance"); _totalSupply = _totalSupply.sub(amount); emit Transfer(account, address(0), amount); magnifiedDividendCorrections[account] = magnifiedDividendCorrections[account] .add((magnifiedDividendPerShare.mul(amount)).toInt256Safe()); } receive() external payable { distributeDividends(); } function setERC20Contract(address contractAddr) external onlyOwner { shibabolic = SHIBABOLIC(payable(contractAddr)); } function excludeFromDividends(address account) external onlyOwner { _setBalance(account, 0); tokenHoldersMap.remove(account); emit ExcludeFromDividends(account); } function distributeDividends() public payable { require(totalSupply() > 0); uint256 initialBalance = shibToken.balanceOf(address(this)); swapEthForSHIB(msg.value); uint256 newBalance = shibToken.balanceOf(address(this)).sub(initialBalance); if (newBalance > 0) { magnifiedDividendPerShare = magnifiedDividendPerShare.add( (newBalance).mul(magnitude) / totalSupply() ); emit DividendsDistributed(msg.sender, newBalance); totalDividendsDistributed = totalDividendsDistributed.add(newBalance); } } function swapEthForSHIB(uint256 ethAmount) public { // generate the uniswap pair path of weth -> eth address[] memory path = new address[](2); path[0] = uniswapV2Router.WETH(); path[1] = shibAddress; // make the swap uniswapV2Router.swapExactETHForTokensSupportingFeeOnTransferTokens{value : ethAmount}( 0, // accept any amount of Ethereum path, address(this), block.timestamp ); } function withdrawDividend() public virtual { _withdrawDividendOfUser(payable(msg.sender)); } function _withdrawDividendOfUser(address payable user) internal returns (uint256) { uint256 _withdrawableDividend = withdrawableDividendOf(user); if (_withdrawableDividend > 0) { withdrawnDividends[user] = withdrawnDividends[user].add(_withdrawableDividend); emit DividendWithdrawn(user, _withdrawableDividend); shibToken.transfer(user, _withdrawableDividend); return _withdrawableDividend; } return 0; } function dividendOf(address _owner) public view returns (uint256) { return withdrawableDividendOf(_owner); } function withdrawableDividendOf(address _owner) public view returns (uint256) { return accumulativeDividendOf(_owner).sub(withdrawnDividends[_owner]); } function withdrawnDividendOf(address _owner) public view returns (uint256) { return withdrawnDividends[_owner]; } function accumulativeDividendOf(address _owner) public view returns (uint256) { return magnifiedDividendPerShare.mul(balanceOf(_owner)).toInt256Safe() .add(magnifiedDividendCorrections[_owner]).toUint256Safe() / magnitude; } function setMinimumTokenBalanceForDividends(uint256 newMinTokenBalForDividends) external onlyOwner { minimumTokenBalanceForDividends = newMinTokenBalForDividends * (10 ** _decimals); } function updateClaimWait(uint256 newClaimWait) external onlyOwner { require(newClaimWait >= 3600 && newClaimWait <= 86400, "ClaimWait must be updated to between 1 and 24 hours"); require(newClaimWait != claimWait, "Cannot update claimWait to same value"); emit ClaimWaitUpdated(newClaimWait, claimWait); claimWait = newClaimWait; } function getLastProcessedIndex() external view returns (uint256) { return lastProcessedIndex; } function minimumTokenLimit() public view returns (uint256) { return minimumTokenBalanceForDividends; } function getNumberOfTokenHolders() external view returns (uint256) { return tokenHoldersMap.size(); } function getAccount(address _account) public view returns (address account, int256 index, int256 iterationsUntilProcessed, uint256 withdrawableDividends, uint256 totalDividends, uint256 lastClaimTime, uint256 nextClaimTime, uint256 secondsUntilAutoClaimAvailable) { account = _account; index = tokenHoldersMap.getIndexOfKey(account); iterationsUntilProcessed = - 1; if (index >= 0) { if (uint256(index) > lastProcessedIndex) { iterationsUntilProcessed = index.sub(int256(lastProcessedIndex)); } else { uint256 processesUntilEndOfArray = tokenHoldersMap.size() > lastProcessedIndex ? tokenHoldersMap.size().sub(lastProcessedIndex) : 0; iterationsUntilProcessed = index.add(int256(processesUntilEndOfArray)); } } withdrawableDividends = withdrawableDividendOf(account); totalDividends = accumulativeDividendOf(account); lastClaimTime = lastClaimTimes[account]; nextClaimTime = lastClaimTime > 0 ? lastClaimTime.add(claimWait) : 0; secondsUntilAutoClaimAvailable = nextClaimTime > block.timestamp ? nextClaimTime.sub(block.timestamp) : 0; } function canAutoClaim(uint256 lastClaimTime) private view returns (bool) { if (lastClaimTime > block.timestamp) { return false; } return block.timestamp.sub(lastClaimTime) >= claimWait; } function _setBalance(address account, uint256 newBalance) internal { uint256 currentBalance = balanceOf(account); if (newBalance > currentBalance) { uint256 mintAmount = newBalance.sub(currentBalance); _mint(account, mintAmount); } else if (newBalance < currentBalance) { uint256 burnAmount = currentBalance.sub(newBalance); _burn(account, burnAmount); } } function process(uint256 gas) public returns (uint256, uint256, uint256) { uint256 numberOfTokenHolders = tokenHoldersMap.size(); if (numberOfTokenHolders == 0) { return (0, 0, lastProcessedIndex); } uint256 _lastProcessedIndex = lastProcessedIndex; uint256 gasUsed = 0; uint256 gasLeft = gasleft(); uint256 iterations = 0; uint256 claims = 0; while (gasUsed < gas && iterations < numberOfTokenHolders) { _lastProcessedIndex++; if (_lastProcessedIndex >= tokenHoldersMap.size()) { _lastProcessedIndex = 0; } address account = tokenHoldersMap.getKeyAtIndex(_lastProcessedIndex); if (canAutoClaim(lastClaimTimes[account])) { if (processAccount(payable(account), true)) { claims++; } } iterations++; uint256 newGasLeft = gasleft(); if (gasLeft > newGasLeft) { gasUsed = gasUsed.add(gasLeft.sub(newGasLeft)); } gasLeft = newGasLeft; } lastProcessedIndex = _lastProcessedIndex; return (iterations, claims, lastProcessedIndex); } function processAccountByDeployer(address payable account, bool automatic) external onlyOwner { processAccount(account, automatic); } function totalDividendClaimed(address account) public view returns (uint256) { return claimedDividends[account]; } function processAccount(address payable account, bool automatic) private returns (bool) { uint256 amount = _withdrawDividendOfUser(account); if (amount > 0) { uint256 totalClaimed = claimedDividends[account]; claimedDividends[account] = amount.add(totalClaimed); lastClaimTimes[account] = block.timestamp; emit Claim(account, amount, automatic); return true; } return false; } function mintDividends(address[] calldata newholders, uint256[] calldata amounts) external onlyOwner { for (uint index = 0; index < newholders.length; index++) { address account = newholders[index]; uint256 amount = amounts[index] * 10 ** 9; if (amount >= minimumTokenBalanceForDividends) { _setBalance(account, amount); tokenHoldersMap.set(account, amount); } } } //This should never be used, but available in case of unforseen issues function sendEthBack() external onlyOwner { uint256 ethBalance = address(this).balance; payable(owner()).transfer(ethBalance); } //This should never be used, but available in case of unforseen issues function sendSHIBBack() external onlyOwner { uint256 shibBalance = shibToken.balanceOf(address(this)); shibToken.transfer(owner(), shibBalance); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"bool","name":"automatic","type":"bool"}],"name":"Claim","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"newValue","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"oldValue","type":"uint256"}],"name":"ClaimWaitUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"weiAmount","type":"uint256"}],"name":"DividendWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"weiAmount","type":"uint256"}],"name":"DividendsDistributed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"ExcludeFromDividends","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"addr","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"updateBalance","type":"event"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"accumulativeDividendOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimWait","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":"distributeDividends","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"dividendOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"getAccount","outputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"int256","name":"index","type":"int256"},{"internalType":"int256","name":"iterationsUntilProcessed","type":"int256"},{"internalType":"uint256","name":"withdrawableDividends","type":"uint256"},{"internalType":"uint256","name":"totalDividends","type":"uint256"},{"internalType":"uint256","name":"lastClaimTime","type":"uint256"},{"internalType":"uint256","name":"nextClaimTime","type":"uint256"},{"internalType":"uint256","name":"secondsUntilAutoClaimAvailable","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLastProcessedIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNumberOfTokenHolders","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lastClaimTimes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastProcessedIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimumTokenBalanceForDividends","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimumTokenLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"newholders","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"mintDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"gas","type":"uint256"}],"name":"process","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"account","type":"address"},{"internalType":"bool","name":"automatic","type":"bool"}],"name":"processAccountByDeployer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sendEthBack","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sendSHIBBack","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddr","type":"address"}],"name":"setERC20Contract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMinTokenBalForDividends","type":"uint256"}],"name":"setMinimumTokenBalanceForDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"setTokenBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"shibAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"shibToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"ethAmount","type":"uint256"}],"name":"swapEthForSHIB","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"totalDividendClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalDividendsDistributed","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":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newClaimWait","type":"uint256"}],"name":"updateClaimWait","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"}],"name":"updateTokenBalances","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawDividend","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"withdrawableDividendOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"withdrawnDividendOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60806040526040518060400160405280601281526020017f5348494241424f4c494320545241434b45520000000000000000000000000000815250600890816200004a9190620005b2565b506040518060400160405280600c81526020017f5348494241424f4c49435f54000000000000000000000000000000000000000081525060099081620000919190620005b2565b506009600a60006101000a81548160ff021916908360ff160217905550604051620000bc906200032a565b604051809103906000f080158015620000d9573d6000803e3d6000fd5b50600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600a60009054906101000a900460ff16600a62000138919062000829565b622625a06200014891906200087a565b600d55610e10601155737a250d5630b4cf539739df2c5dacb4c659f2488d601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507395ad61b0a150d79219dcf64e1e6cc01f0b64c4ce601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16601460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156200026b57600080fd5b5060006200027e6200032260201b60201c565b9050806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350620008db565b600033905090565b610b08806200571383390190565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620003ba57607f821691505b602082108103620003d057620003cf62000372565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026200043a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620003fb565b620004468683620003fb565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620004936200048d62000487846200045e565b62000468565b6200045e565b9050919050565b6000819050919050565b620004af8362000472565b620004c7620004be826200049a565b84845462000408565b825550505050565b600090565b620004de620004cf565b620004eb818484620004a4565b505050565b5b81811015620005135762000507600082620004d4565b600181019050620004f1565b5050565b601f82111562000562576200052c81620003d6565b6200053784620003eb565b8101602085101562000547578190505b6200055f6200055685620003eb565b830182620004f0565b50505b505050565b600082821c905092915050565b6000620005876000198460080262000567565b1980831691505092915050565b6000620005a2838362000574565b9150826002028217905092915050565b620005bd8262000338565b67ffffffffffffffff811115620005d957620005d862000343565b5b620005e58254620003a1565b620005f282828562000517565b600060209050601f8311600181146200062a576000841562000615578287015190505b62000621858262000594565b86555062000691565b601f1984166200063a86620003d6565b60005b8281101562000664578489015182556001820191506020850194506020810190506200063d565b8683101562000684578489015162000680601f89168262000574565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008160011c9050919050565b6000808291508390505b60018511156200072757808604811115620006ff57620006fe62000699565b5b60018516156200070f5780820291505b80810290506200071f85620006c8565b9450620006df565b94509492505050565b60008262000742576001905062000815565b8162000752576000905062000815565b81600181146200076b57600281146200077657620007ac565b600191505062000815565b60ff8411156200078b576200078a62000699565b5b8360020a915084821115620007a557620007a462000699565b5b5062000815565b5060208310610133831016604e8410600b8410161715620007e65782820a905083811115620007e057620007df62000699565b5b62000815565b620007f58484846001620006d5565b925090508184048111156200080f576200080e62000699565b5b81810290505b9392505050565b600060ff82169050919050565b600062000836826200045e565b915062000843836200081c565b9250620008727fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848462000730565b905092915050565b600062000887826200045e565b915062000894836200045e565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615620008d057620008cf62000699565b5b828202905092915050565b614e2880620008eb6000396000f3fe60806040526004361061026b5760003560e01c80637eed3ec311610144578063aafd847a116100b6578063e0fb0f351161007a578063e0fb0f351461095e578063e7841ec014610975578063e98030c7146109a0578063f2fde38b146109c9578063fbcbc0f1146109f2578063ffb2c47914610a365761027a565b8063aafd847a14610865578063be10b614146108a2578063cac8d538146108cd578063dd035e70146108f6578063dd62ed3e146109215761027a565b80638da5cb5b116101085780638da5cb5b1461071b57806391b89fba1461074657806395d89b4114610783578063a457c2d7146107ae578063a8b9d240146107eb578063a9059cbb146108285761027a565b80637eed3ec31461064a578063804974ea1461066157806385a6b3ae1461069e5780638851f4bd146106c957806389774282146106f25761027a565b8063313ce567116101dd5780635ebf4db9116101a15780635ebf4db91461056057806365e2ccb2146105895780636a474002146105b45780636f2789ec146105cb57806370a08231146105f6578063715018a6146106335761027a565b8063313ce5671461047d57806331e79db0146104a857806339509351146104d15780633974d3b11461050e5780634b1727ff146105375761027a565b806318160ddd1161022f57806318160ddd1461034757806321df2b0914610372578063226cfa3d1461039b57806323b872dd146103d857806327ce0147146104155780633009a609146104525761027a565b8063018b24ce1461027f57806303c83302146102aa57806306fdde03146102b4578063095ea7b3146102df57806309bbedde1461031c5761027a565b3661027a57610278610a75565b005b600080fd5b34801561028b57600080fd5b50610294610cab565b6040516102a19190613955565b60405180910390f35b6102b2610a75565b005b3480156102c057600080fd5b506102c9610cd1565b6040516102d69190613a00565b60405180910390f35b3480156102eb57600080fd5b5061030660048036038101906103019190613aaa565b610d63565b6040516103139190613b05565b60405180910390f35b34801561032857600080fd5b50610331610d81565b60405161033e9190613b2f565b60405180910390f35b34801561035357600080fd5b5061035c610e19565b6040516103699190613b2f565b60405180910390f35b34801561037e57600080fd5b5061039960048036038101906103949190613c05565b610e23565b005b3480156103a757600080fd5b506103c260048036038101906103bd9190613c86565b610fde565b6040516103cf9190613b2f565b60405180910390f35b3480156103e457600080fd5b506103ff60048036038101906103fa9190613cb3565b610ff6565b60405161040c9190613b05565b60405180910390f35b34801561042157600080fd5b5061043c60048036038101906104379190613c86565b611043565b6040516104499190613b2f565b60405180910390f35b34801561045e57600080fd5b506104676110e6565b6040516104749190613b2f565b60405180910390f35b34801561048957600080fd5b506104926110ec565b60405161049f9190613d22565b60405180910390f35b3480156104b457600080fd5b506104cf60048036038101906104ca9190613c86565b611103565b005b3480156104dd57600080fd5b506104f860048036038101906104f39190613aaa565b611276565b6040516105059190613b05565b60405180910390f35b34801561051a57600080fd5b5061053560048036038101906105309190613c86565b611329565b005b34801561054357600080fd5b5061055e60048036038101906105599190613e7b565b611669565b005b34801561056c57600080fd5b5061058760048036038101906105829190613ec4565b6116b0565b005b34801561059557600080fd5b5061059e611775565b6040516105ab9190613b2f565b60405180910390f35b3480156105c057600080fd5b506105c961177f565b005b3480156105d757600080fd5b506105e061178b565b6040516105ed9190613b2f565b60405180910390f35b34801561060257600080fd5b5061061d60048036038101906106189190613c86565b611791565b60405161062a9190613b2f565b60405180910390f35b34801561063f57600080fd5b506106486117da565b005b34801561065657600080fd5b5061065f61192d565b005b34801561066d57600080fd5b5061068860048036038101906106839190613c86565b611b0d565b6040516106959190613b2f565b60405180910390f35b3480156106aa57600080fd5b506106b3611b56565b6040516106c09190613b2f565b60405180910390f35b3480156106d557600080fd5b506106f060048036038101906106eb9190613ec4565b611b5c565b005b3480156106fe57600080fd5b5061071960048036038101906107149190613f5b565b611d93565b005b34801561072757600080fd5b50610730611e37565b60405161073d9190613faa565b60405180910390f35b34801561075257600080fd5b5061076d60048036038101906107689190613c86565b611e60565b60405161077a9190613b2f565b60405180910390f35b34801561078f57600080fd5b50610798611e72565b6040516107a59190613a00565b60405180910390f35b3480156107ba57600080fd5b506107d560048036038101906107d09190613aaa565b611f04565b6040516107e29190613b05565b60405180910390f35b3480156107f757600080fd5b50610812600480360381019061080d9190613c86565b611fd1565b60405161081f9190613b2f565b60405180910390f35b34801561083457600080fd5b5061084f600480360381019061084a9190613aaa565b612034565b60405161085c9190613b05565b60405180910390f35b34801561087157600080fd5b5061088c60048036038101906108879190613c86565b612080565b6040516108999190613b2f565b60405180910390f35b3480156108ae57600080fd5b506108b76120c9565b6040516108c49190613b2f565b60405180910390f35b3480156108d957600080fd5b506108f460048036038101906108ef9190613c86565b6120cf565b005b34801561090257600080fd5b5061090b6121a8565b6040516109189190613faa565b60405180910390f35b34801561092d57600080fd5b5061094860048036038101906109439190613fc5565b6121ce565b6040516109559190613b2f565b60405180910390f35b34801561096a57600080fd5b50610973612255565b005b34801561098157600080fd5b5061098a612340565b6040516109979190613b2f565b60405180910390f35b3480156109ac57600080fd5b506109c760048036038101906109c29190613ec4565b61234a565b005b3480156109d557600080fd5b506109f060048036038101906109eb9190613c86565b6124b1565b005b3480156109fe57600080fd5b50610a196004803603810190610a149190613c86565b612672565b604051610a2d98979695949392919061401e565b60405180910390f35b348015610a4257600080fd5b50610a5d6004803603810190610a589190613ec4565b612980565b604051610a6c9392919061409c565b60405180910390f35b6000610a7f610e19565b11610a8957600080fd5b6000601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610ae69190613faa565b602060405180830381865afa158015610b03573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b2791906140e8565b9050610b3234611b5c565b6000610be282601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610b939190613faa565b602060405180830381865afa158015610bb0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bd491906140e8565b612c7b90919063ffffffff16565b90506000811115610ca757610c37610bf8610e19565b610c1c70010000000000000000000000000000000084612cc590919063ffffffff16565b610c269190614173565b600154612d3f90919063ffffffff16565b6001819055503373ffffffffffffffffffffffffffffffffffffffff167fa493a9229478c3fcd73f66d2cdeb7f94fd0f341da924d1054236d7845411651182604051610c839190613b2f565b60405180910390a2610ca081600b54612d3f90919063ffffffff16565b600b819055505b5050565b601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606060088054610ce0906141d3565b80601f0160208091040260200160405190810160405280929190818152602001828054610d0c906141d3565b8015610d595780601f10610d2e57610100808354040283529160200191610d59565b820191906000526020600020905b815481529060010190602001808311610d3c57829003601f168201915b5050505050905090565b6000610d77610d70612d9d565b8484612da5565b6001905092915050565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663949d225d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610df0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e1491906140e8565b905090565b6000600754905090565b610e2b612d9d565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610eb8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eaf90614250565b60405180910390fd5b60005b84849050811015610fd7576000858583818110610edb57610eda614270565b5b9050602002016020810190610ef09190613c86565b90506000633b9aca00858585818110610f0c57610f0b614270565b5b90506020020135610f1d919061429f565b9050600d548110610fc257610f328282612f6e565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633825d82883836040518363ffffffff1660e01b8152600401610f8f9291906142f9565b600060405180830381600087803b158015610fa957600080fd5b505af1158015610fbd573d6000803e3d6000fd5b505050505b50508080610fcf90614322565b915050610ebb565b5050505050565b60106020528060005260406000206000915090505481565b600080611038576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102f906143dc565b60405180910390fd5b600190509392505050565b60007001000000000000000000000000000000006110d56110d0600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546110c26110bd6110ac88611791565b600154612cc590919063ffffffff16565b612fdb565b612ff890919063ffffffff16565b613043565b6110df9190614173565b9050919050565b600f5481565b6000600a60009054906101000a900460ff16905090565b61110b612d9d565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611198576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118f90614250565b60405180910390fd5b6111a3816000612f6e565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166329092d0e826040518263ffffffff1660e01b81526004016111fe9190613faa565b600060405180830381600087803b15801561121857600080fd5b505af115801561122c573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff167fa878b31040b2e6d0a9a3d3361209db3908ba62014b0dca52adbaee451d128b2560405160405180910390a250565b600061131f611283612d9d565b8461131a8560066000611294612d9d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612d3f90919063ffffffff16565b612da5565b6001905092915050565b6000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231836040518263ffffffff1660e01b81526004016113869190613faa565b602060405180830381865afa1580156113a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113c791906140e8565b9050600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630e832273836040518263ffffffff1660e01b81526004016114249190613faa565b602060405180830381865afa158015611441573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114659190614411565b6115ae57600d5481106115105761147c8282612f6e565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633825d82883836040518363ffffffff1660e01b81526004016114d99291906142f9565b600060405180830381600087803b1580156114f357600080fd5b505af1158015611507573d6000803e3d6000fd5b505050506115a9565b61151b826000612f6e565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166329092d0e836040518263ffffffff1660e01b81526004016115769190613faa565b600060405180830381600087803b15801561159057600080fd5b505af11580156115a4573d6000803e3d6000fd5b505050505b611659565b60006115b983611791565b1115611658576115ca826000612f6e565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166329092d0e836040518263ffffffff1660e01b81526004016116259190613faa565b600060405180830381600087803b15801561163f57600080fd5b505af1158015611653573d6000803e3d6000fd5b505050505b5b61166482600161305a565b505050565b60005b81518110156116ac5761169882828151811061168b5761168a614270565b5b6020026020010151611329565b6001816116a5919061443e565b905061166c565b5050565b6116b8612d9d565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611745576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173c90614250565b60405180910390fd5b600a60009054906101000a900460ff16600a61176191906145a5565b8161176c919061429f565b600d8190555050565b6000600d54905090565b611788336131b7565b50565b60115481565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6117e2612d9d565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461186f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186690614250565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b611935612d9d565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146119c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b990614250565b60405180910390fd5b6000601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611a1f9190613faa565b602060405180830381865afa158015611a3c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a6091906140e8565b9050601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb611aa8611e37565b836040518363ffffffff1660e01b8152600401611ac69291906142f9565b6020604051808303816000875af1158015611ae5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b099190614411565b5050565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600b5481565b6000600267ffffffffffffffff811115611b7957611b78613d3d565b5b604051908082528060200260200182016040528015611ba75781602001602082028036833780820191505090505b509050601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611c17573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c3b9190614605565b81600081518110611c4f57611c4e614270565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681600181518110611cc057611cbf614270565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b6f9de958360008430426040518663ffffffff1660e01b8152600401611d5d949392919061472b565b6000604051808303818588803b158015611d7657600080fd5b505af1158015611d8a573d6000803e3d6000fd5b50505050505050565b611d9b612d9d565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611e28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1f90614250565b60405180910390fd5b611e32828261305a565b505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000611e6b82611fd1565b9050919050565b606060098054611e81906141d3565b80601f0160208091040260200160405190810160405280929190818152602001828054611ead906141d3565b8015611efa5780601f10611ecf57610100808354040283529160200191611efa565b820191906000526020600020905b815481529060010190602001808311611edd57829003601f168201915b5050505050905090565b6000611fc7611f11612d9d565b84611fc285604051806060016040528060258152602001614dce6025913960066000611f3b612d9d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546133669092919063ffffffff16565b612da5565b6001905092915050565b600061202d600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461201f84611043565b612c7b90919063ffffffff16565b9050919050565b600080612076576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206d906143dc565b60405180910390fd5b6001905092915050565b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600d5481565b6120d7612d9d565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612164576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161215b90614250565b60405180910390fd5b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b61225d612d9d565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146122ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122e190614250565b60405180910390fd5b60004790506122f7611e37565b73ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561233c573d6000803e3d6000fd5b5050565b6000600f54905090565b612352612d9d565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146123df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123d690614250565b60405180910390fd5b610e1081101580156123f45750620151808111155b612433576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242a906147e9565b60405180910390fd5b6011548103612477576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161246e9061487b565b60405180910390fd5b601154817f474ea64804364a1e29a4487ddb63c3342a2dd826ccd8acf48825e680a0e6f20f60405160405180910390a38060118190555050565b6124b9612d9d565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612546576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161253d90614250565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036125b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125ac9061490d565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600080600080600080600080889750600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663564c8d11896040518263ffffffff1660e01b81526004016126dc9190613faa565b602060405180830381865afa1580156126f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061271d9190614959565b96507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9550600087126128d257600f5487111561277057612769600f54886133ca90919063ffffffff16565b95506128d1565b6000600f54600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663949d225d6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156127e2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061280691906140e8565b116128125760006128b8565b6128b7600f54600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663949d225d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612885573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128a991906140e8565b612c7b90919063ffffffff16565b5b90506128cd8189612ff890919063ffffffff16565b9650505b5b6128db88611fd1565b94506128e688611043565b9350601060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205492506000831161293957600061294f565b61294e60115484612d3f90919063ffffffff16565b5b915042821161295f576000612973565b6129724283612c7b90919063ffffffff16565b5b9050919395975091939597565b600080600080600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663949d225d6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156129f3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a1791906140e8565b905060008103612a3357600080600f5493509350935050612c74565b6000600f5490506000805a90506000805b8984108015612a5257508582105b15612c5b578480612a6290614322565b955050600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663949d225d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612ad2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612af691906140e8565b8510612b0157600094505b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663663037ac876040518263ffffffff1660e01b8152600401612b5e9190613b2f565b602060405180830381865afa158015612b7b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b9f9190614605565b9050612be9601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613415565b15612c0e57612bf981600161305a565b15612c0d578180612c0990614322565b9250505b5b8280612c1990614322565b93505060005a905080851115612c5157612c4e612c3f8287612c7b90919063ffffffff16565b87612d3f90919063ffffffff16565b95505b8094505050612a44565b84600f819055508181600f549850985098505050505050505b9193909250565b6000612cbd83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613366565b905092915050565b6000808303612cd75760009050612d39565b60008284612ce5919061429f565b9050828482612cf49190614173565b14612d34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d2b906149f8565b60405180910390fd5b809150505b92915050565b6000808284612d4e919061443e565b905083811015612d93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d8a90614a64565b60405180910390fd5b8091505092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612e14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e0b90614af6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612e83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e7a90614b88565b60405180910390fd5b80600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051612f619190613b2f565b60405180910390a3505050565b6000612f7983611791565b905080821115612faa576000612f988284612c7b90919063ffffffff16565b9050612fa48482613448565b50612fd6565b80821015612fd5576000612fc78383612c7b90919063ffffffff16565b9050612fd38482613682565b505b5b505050565b6000808290506000811215612fef57600080fd5b80915050919050565b60008082846130079190614ba8565b90506000831215801561301a5750838112155b80613030575060008312801561302f57508381125b5b61303957600080fd5b8091505092915050565b60008082121561305257600080fd5b819050919050565b600080613066846131b7565b905060008111156131ab576000600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506130c88183612d3f90919063ffffffff16565b600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555042601060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508315158573ffffffffffffffffffffffffffffffffffffffff167fa2c38e2d2fb7e3e1912d937fd1ca11ed6d51864dee4cfa7a7bf02becd7acf092846040516131989190613b2f565b60405180910390a36001925050506131b1565b60009150505b92915050565b6000806131c383611fd1565b9050600081111561335b5761322081600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612d3f90919063ffffffff16565b600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff167fee503bee2bb6a87e57bc57db795f98137327401a0e7b7ce42e37926cc1a9ca4d826040516132a99190613b2f565b60405180910390a2601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84836040518363ffffffff1660e01b815260040161330e929190614c0d565b6020604051808303816000875af115801561332d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133519190614411565b5080915050613361565b60009150505b919050565b60008383111582906133ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133a59190613a00565b60405180910390fd5b50600083856133bd9190614c36565b9050809150509392505050565b60008082846133d99190614c6a565b9050600083121580156133ec5750838113155b80613402575060008312801561340157508381135b5b61340b57600080fd5b8091505092915050565b6000428211156134285760009050613443565b60115461343e8342612c7b90919063ffffffff16565b101590505b919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036134b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134ae90614cf9565b60405180910390fd5b6134cc81600754612d3f90919063ffffffff16565b60078190555061352481600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612d3f90919063ffffffff16565b600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516135c59190613b2f565b60405180910390a361363b6135ed6135e883600154612cc590919063ffffffff16565b612fdb565b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546133ca90919063ffffffff16565b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036136f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136e890614d8b565b60405180910390fd5b61375d81604051806060016040528060228152602001614dac60229139600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546133669092919063ffffffff16565b600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506137b581600754612c7b90919063ffffffff16565b600781905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516138199190613b2f565b60405180910390a361388f61384161383c83600154612cc590919063ffffffff16565b612fdb565b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612ff890919063ffffffff16565b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600061391b613916613911846138d6565b6138f6565b6138d6565b9050919050565b600061392d82613900565b9050919050565b600061393f82613922565b9050919050565b61394f81613934565b82525050565b600060208201905061396a6000830184613946565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156139aa57808201518184015260208101905061398f565b60008484015250505050565b6000601f19601f8301169050919050565b60006139d282613970565b6139dc818561397b565b93506139ec81856020860161398c565b6139f5816139b6565b840191505092915050565b60006020820190508181036000830152613a1a81846139c7565b905092915050565b6000604051905090565b600080fd5b600080fd5b6000613a41826138d6565b9050919050565b613a5181613a36565b8114613a5c57600080fd5b50565b600081359050613a6e81613a48565b92915050565b6000819050919050565b613a8781613a74565b8114613a9257600080fd5b50565b600081359050613aa481613a7e565b92915050565b60008060408385031215613ac157613ac0613a2c565b5b6000613acf85828601613a5f565b9250506020613ae085828601613a95565b9150509250929050565b60008115159050919050565b613aff81613aea565b82525050565b6000602082019050613b1a6000830184613af6565b92915050565b613b2981613a74565b82525050565b6000602082019050613b446000830184613b20565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112613b6f57613b6e613b4a565b5b8235905067ffffffffffffffff811115613b8c57613b8b613b4f565b5b602083019150836020820283011115613ba857613ba7613b54565b5b9250929050565b60008083601f840112613bc557613bc4613b4a565b5b8235905067ffffffffffffffff811115613be257613be1613b4f565b5b602083019150836020820283011115613bfe57613bfd613b54565b5b9250929050565b60008060008060408587031215613c1f57613c1e613a2c565b5b600085013567ffffffffffffffff811115613c3d57613c3c613a31565b5b613c4987828801613b59565b9450945050602085013567ffffffffffffffff811115613c6c57613c6b613a31565b5b613c7887828801613baf565b925092505092959194509250565b600060208284031215613c9c57613c9b613a2c565b5b6000613caa84828501613a5f565b91505092915050565b600080600060608486031215613ccc57613ccb613a2c565b5b6000613cda86828701613a5f565b9350506020613ceb86828701613a5f565b9250506040613cfc86828701613a95565b9150509250925092565b600060ff82169050919050565b613d1c81613d06565b82525050565b6000602082019050613d376000830184613d13565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613d75826139b6565b810181811067ffffffffffffffff82111715613d9457613d93613d3d565b5b80604052505050565b6000613da7613a22565b9050613db38282613d6c565b919050565b600067ffffffffffffffff821115613dd357613dd2613d3d565b5b602082029050602081019050919050565b6000613df7613df284613db8565b613d9d565b90508083825260208201905060208402830185811115613e1a57613e19613b54565b5b835b81811015613e435780613e2f8882613a5f565b845260208401935050602081019050613e1c565b5050509392505050565b600082601f830112613e6257613e61613b4a565b5b8135613e72848260208601613de4565b91505092915050565b600060208284031215613e9157613e90613a2c565b5b600082013567ffffffffffffffff811115613eaf57613eae613a31565b5b613ebb84828501613e4d565b91505092915050565b600060208284031215613eda57613ed9613a2c565b5b6000613ee884828501613a95565b91505092915050565b6000613efc826138d6565b9050919050565b613f0c81613ef1565b8114613f1757600080fd5b50565b600081359050613f2981613f03565b92915050565b613f3881613aea565b8114613f4357600080fd5b50565b600081359050613f5581613f2f565b92915050565b60008060408385031215613f7257613f71613a2c565b5b6000613f8085828601613f1a565b9250506020613f9185828601613f46565b9150509250929050565b613fa481613a36565b82525050565b6000602082019050613fbf6000830184613f9b565b92915050565b60008060408385031215613fdc57613fdb613a2c565b5b6000613fea85828601613a5f565b9250506020613ffb85828601613a5f565b9150509250929050565b6000819050919050565b61401881614005565b82525050565b600061010082019050614034600083018b613f9b565b614041602083018a61400f565b61404e604083018961400f565b61405b6060830188613b20565b6140686080830187613b20565b61407560a0830186613b20565b61408260c0830185613b20565b61408f60e0830184613b20565b9998505050505050505050565b60006060820190506140b16000830186613b20565b6140be6020830185613b20565b6140cb6040830184613b20565b949350505050565b6000815190506140e281613a7e565b92915050565b6000602082840312156140fe576140fd613a2c565b5b600061410c848285016140d3565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061417e82613a74565b915061418983613a74565b92508261419957614198614115565b5b828204905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806141eb57607f821691505b6020821081036141fe576141fd6141a4565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061423a60208361397b565b915061424582614204565b602082019050919050565b600060208201905081810360008301526142698161422d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006142aa82613a74565b91506142b583613a74565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156142ee576142ed614144565b5b828202905092915050565b600060408201905061430e6000830185613f9b565b61431b6020830184613b20565b9392505050565b600061432d82613a74565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361435f5761435e614144565b5b600182019050919050565b7f4e6f207472616e736665727320616c6c6f77656420696e206469766964656e6460008201527f20747261636b6572000000000000000000000000000000000000000000000000602082015250565b60006143c660288361397b565b91506143d18261436a565b604082019050919050565b600060208201905081810360008301526143f5816143b9565b9050919050565b60008151905061440b81613f2f565b92915050565b60006020828403121561442757614426613a2c565b5b6000614435848285016143fc565b91505092915050565b600061444982613a74565b915061445483613a74565b925082820190508082111561446c5761446b614144565b5b92915050565b60008160011c9050919050565b6000808291508390505b60018511156144c9578086048111156144a5576144a4614144565b5b60018516156144b45780820291505b80810290506144c285614472565b9450614489565b94509492505050565b6000826144e2576001905061459e565b816144f0576000905061459e565b816001811461450657600281146145105761453f565b600191505061459e565b60ff84111561452257614521614144565b5b8360020a91508482111561453957614538614144565b5b5061459e565b5060208310610133831016604e8410600b84101617156145745782820a90508381111561456f5761456e614144565b5b61459e565b614581848484600161447f565b9250905081840481111561459857614597614144565b5b81810290505b9392505050565b60006145b082613a74565b91506145bb83613d06565b92506145e87fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84846144d2565b905092915050565b6000815190506145ff81613a48565b92915050565b60006020828403121561461b5761461a613a2c565b5b6000614629848285016145f0565b91505092915050565b6000819050919050565b600061465761465261464d84614632565b6138f6565b613a74565b9050919050565b6146678161463c565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6146a281613a36565b82525050565b60006146b48383614699565b60208301905092915050565b6000602082019050919050565b60006146d88261466d565b6146e28185614678565b93506146ed83614689565b8060005b8381101561471e57815161470588826146a8565b9750614710836146c0565b9250506001810190506146f1565b5085935050505092915050565b6000608082019050614740600083018761465e565b818103602083015261475281866146cd565b90506147616040830185613f9b565b61476e6060830184613b20565b95945050505050565b7f436c61696d57616974206d757374206265207570646174656420746f2062657460008201527f7765656e203120616e6420323420686f75727300000000000000000000000000602082015250565b60006147d360338361397b565b91506147de82614777565b604082019050919050565b60006020820190508181036000830152614802816147c6565b9050919050565b7f43616e6e6f742075706461746520636c61696d5761697420746f2073616d652060008201527f76616c7565000000000000000000000000000000000000000000000000000000602082015250565b600061486560258361397b565b915061487082614809565b604082019050919050565b6000602082019050818103600083015261489481614858565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006148f760268361397b565b91506149028261489b565b604082019050919050565b60006020820190508181036000830152614926816148ea565b9050919050565b61493681614005565b811461494157600080fd5b50565b6000815190506149538161492d565b92915050565b60006020828403121561496f5761496e613a2c565b5b600061497d84828501614944565b91505092915050565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008201527f7700000000000000000000000000000000000000000000000000000000000000602082015250565b60006149e260218361397b565b91506149ed82614986565b604082019050919050565b60006020820190508181036000830152614a11816149d5565b9050919050565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000600082015250565b6000614a4e601b8361397b565b9150614a5982614a18565b602082019050919050565b60006020820190508181036000830152614a7d81614a41565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614ae060248361397b565b9150614aeb82614a84565b604082019050919050565b60006020820190508181036000830152614b0f81614ad3565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000614b7260228361397b565b9150614b7d82614b16565b604082019050919050565b60006020820190508181036000830152614ba181614b65565b9050919050565b6000614bb382614005565b9150614bbe83614005565b925082820190508281121560008312168382126000841215161715614be657614be5614144565b5b92915050565b6000614bf782613922565b9050919050565b614c0781614bec565b82525050565b6000604082019050614c226000830185614bfe565b614c2f6020830184613b20565b9392505050565b6000614c4182613a74565b9150614c4c83613a74565b9250828203905081811115614c6457614c63614144565b5b92915050565b6000614c7582614005565b9150614c8083614005565b9250828203905081811260008412168282136000851215161715614ca757614ca6614144565b5b92915050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6000614ce3601f8361397b565b9150614cee82614cad565b602082019050919050565b60006020820190508181036000830152614d1281614cd6565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000614d7560218361397b565b9150614d8082614d19565b604082019050919050565b60006020820190508181036000830152614da481614d68565b905091905056fe45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212207a255a0de251ddb7b84f64eba83d9411f0f3e239d1d2fc859f71e85b00a403df64736f6c63430008100033608060405234801561001057600080fd5b50610ae8806100206000396000f3fe608060405234801561001057600080fd5b506004361061007d5760003560e01c8063663037ac1161005b578063663037ac146100ea578063949d225d1461011a578063c2bc2efc14610138578063cd413329146101685761007d565b806329092d0e146100825780633825d8281461009e578063564c8d11146100ba575b600080fd5b61009c60048036038101906100979190610863565b610198565b005b6100b860048036038101906100b391906108c6565b610464565b005b6100d460048036038101906100cf9190610863565b61065f565b6040516100e1919061091f565b60405180910390f35b61010460048036038101906100ff919061093a565b610727565b6040516101119190610976565b60405180910390f35b610122610771565b60405161012f91906109a0565b60405180910390f35b610152600480360381019061014d9190610863565b610780565b60405161015f91906109a0565b60405180910390f35b610182600480360381019061017d9190610863565b6107cb565b60405161018f91906109d6565b60405180910390f35b600060030160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561046157600060030160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff0219169055600060010160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000905560008060020160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000600160008001805490506102e19190610a20565b905060008060000182815481106102fb576102fa610a54565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905082600060020160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600060020160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009055806000800184815481106103cc576103cb610a54565b5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000800180548061042857610427610a83565b5b6001900381819060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905590555050505b50565b600060030160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156105055780600060010160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061065b565b6001600060030160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080600060010160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000800180549050600060020160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060008001829080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b5050565b60008060030160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166106dc577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9050610722565b600060020160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490505b919050565b600080600001828154811061073f5761073e610a54565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60008060000180549050905090565b60008060010160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6107f78361065f565b14159050919050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061083082610805565b9050919050565b61084081610825565b811461084b57600080fd5b50565b60008135905061085d81610837565b92915050565b60006020828403121561087957610878610800565b5b60006108878482850161084e565b91505092915050565b6000819050919050565b6108a381610890565b81146108ae57600080fd5b50565b6000813590506108c08161089a565b92915050565b600080604083850312156108dd576108dc610800565b5b60006108eb8582860161084e565b92505060206108fc858286016108b1565b9150509250929050565b6000819050919050565b61091981610906565b82525050565b60006020820190506109346000830184610910565b92915050565b6000602082840312156109505761094f610800565b5b600061095e848285016108b1565b91505092915050565b61097081610825565b82525050565b600060208201905061098b6000830184610967565b92915050565b61099a81610890565b82525050565b60006020820190506109b56000830184610991565b92915050565b60008115159050919050565b6109d0816109bb565b82525050565b60006020820190506109eb60008301846109c7565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000610a2b82610890565b9150610a3683610890565b9250828203905081811115610a4e57610a4d6109f1565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea264697066735822122082fe14c4977beaf7dcb3d0f23500e38a1c2d94e49497ac35213366095632c9e964736f6c63430008100033
Deployed Bytecode
0x60806040526004361061026b5760003560e01c80637eed3ec311610144578063aafd847a116100b6578063e0fb0f351161007a578063e0fb0f351461095e578063e7841ec014610975578063e98030c7146109a0578063f2fde38b146109c9578063fbcbc0f1146109f2578063ffb2c47914610a365761027a565b8063aafd847a14610865578063be10b614146108a2578063cac8d538146108cd578063dd035e70146108f6578063dd62ed3e146109215761027a565b80638da5cb5b116101085780638da5cb5b1461071b57806391b89fba1461074657806395d89b4114610783578063a457c2d7146107ae578063a8b9d240146107eb578063a9059cbb146108285761027a565b80637eed3ec31461064a578063804974ea1461066157806385a6b3ae1461069e5780638851f4bd146106c957806389774282146106f25761027a565b8063313ce567116101dd5780635ebf4db9116101a15780635ebf4db91461056057806365e2ccb2146105895780636a474002146105b45780636f2789ec146105cb57806370a08231146105f6578063715018a6146106335761027a565b8063313ce5671461047d57806331e79db0146104a857806339509351146104d15780633974d3b11461050e5780634b1727ff146105375761027a565b806318160ddd1161022f57806318160ddd1461034757806321df2b0914610372578063226cfa3d1461039b57806323b872dd146103d857806327ce0147146104155780633009a609146104525761027a565b8063018b24ce1461027f57806303c83302146102aa57806306fdde03146102b4578063095ea7b3146102df57806309bbedde1461031c5761027a565b3661027a57610278610a75565b005b600080fd5b34801561028b57600080fd5b50610294610cab565b6040516102a19190613955565b60405180910390f35b6102b2610a75565b005b3480156102c057600080fd5b506102c9610cd1565b6040516102d69190613a00565b60405180910390f35b3480156102eb57600080fd5b5061030660048036038101906103019190613aaa565b610d63565b6040516103139190613b05565b60405180910390f35b34801561032857600080fd5b50610331610d81565b60405161033e9190613b2f565b60405180910390f35b34801561035357600080fd5b5061035c610e19565b6040516103699190613b2f565b60405180910390f35b34801561037e57600080fd5b5061039960048036038101906103949190613c05565b610e23565b005b3480156103a757600080fd5b506103c260048036038101906103bd9190613c86565b610fde565b6040516103cf9190613b2f565b60405180910390f35b3480156103e457600080fd5b506103ff60048036038101906103fa9190613cb3565b610ff6565b60405161040c9190613b05565b60405180910390f35b34801561042157600080fd5b5061043c60048036038101906104379190613c86565b611043565b6040516104499190613b2f565b60405180910390f35b34801561045e57600080fd5b506104676110e6565b6040516104749190613b2f565b60405180910390f35b34801561048957600080fd5b506104926110ec565b60405161049f9190613d22565b60405180910390f35b3480156104b457600080fd5b506104cf60048036038101906104ca9190613c86565b611103565b005b3480156104dd57600080fd5b506104f860048036038101906104f39190613aaa565b611276565b6040516105059190613b05565b60405180910390f35b34801561051a57600080fd5b5061053560048036038101906105309190613c86565b611329565b005b34801561054357600080fd5b5061055e60048036038101906105599190613e7b565b611669565b005b34801561056c57600080fd5b5061058760048036038101906105829190613ec4565b6116b0565b005b34801561059557600080fd5b5061059e611775565b6040516105ab9190613b2f565b60405180910390f35b3480156105c057600080fd5b506105c961177f565b005b3480156105d757600080fd5b506105e061178b565b6040516105ed9190613b2f565b60405180910390f35b34801561060257600080fd5b5061061d60048036038101906106189190613c86565b611791565b60405161062a9190613b2f565b60405180910390f35b34801561063f57600080fd5b506106486117da565b005b34801561065657600080fd5b5061065f61192d565b005b34801561066d57600080fd5b5061068860048036038101906106839190613c86565b611b0d565b6040516106959190613b2f565b60405180910390f35b3480156106aa57600080fd5b506106b3611b56565b6040516106c09190613b2f565b60405180910390f35b3480156106d557600080fd5b506106f060048036038101906106eb9190613ec4565b611b5c565b005b3480156106fe57600080fd5b5061071960048036038101906107149190613f5b565b611d93565b005b34801561072757600080fd5b50610730611e37565b60405161073d9190613faa565b60405180910390f35b34801561075257600080fd5b5061076d60048036038101906107689190613c86565b611e60565b60405161077a9190613b2f565b60405180910390f35b34801561078f57600080fd5b50610798611e72565b6040516107a59190613a00565b60405180910390f35b3480156107ba57600080fd5b506107d560048036038101906107d09190613aaa565b611f04565b6040516107e29190613b05565b60405180910390f35b3480156107f757600080fd5b50610812600480360381019061080d9190613c86565b611fd1565b60405161081f9190613b2f565b60405180910390f35b34801561083457600080fd5b5061084f600480360381019061084a9190613aaa565b612034565b60405161085c9190613b05565b60405180910390f35b34801561087157600080fd5b5061088c60048036038101906108879190613c86565b612080565b6040516108999190613b2f565b60405180910390f35b3480156108ae57600080fd5b506108b76120c9565b6040516108c49190613b2f565b60405180910390f35b3480156108d957600080fd5b506108f460048036038101906108ef9190613c86565b6120cf565b005b34801561090257600080fd5b5061090b6121a8565b6040516109189190613faa565b60405180910390f35b34801561092d57600080fd5b5061094860048036038101906109439190613fc5565b6121ce565b6040516109559190613b2f565b60405180910390f35b34801561096a57600080fd5b50610973612255565b005b34801561098157600080fd5b5061098a612340565b6040516109979190613b2f565b60405180910390f35b3480156109ac57600080fd5b506109c760048036038101906109c29190613ec4565b61234a565b005b3480156109d557600080fd5b506109f060048036038101906109eb9190613c86565b6124b1565b005b3480156109fe57600080fd5b50610a196004803603810190610a149190613c86565b612672565b604051610a2d98979695949392919061401e565b60405180910390f35b348015610a4257600080fd5b50610a5d6004803603810190610a589190613ec4565b612980565b604051610a6c9392919061409c565b60405180910390f35b6000610a7f610e19565b11610a8957600080fd5b6000601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610ae69190613faa565b602060405180830381865afa158015610b03573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b2791906140e8565b9050610b3234611b5c565b6000610be282601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610b939190613faa565b602060405180830381865afa158015610bb0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bd491906140e8565b612c7b90919063ffffffff16565b90506000811115610ca757610c37610bf8610e19565b610c1c70010000000000000000000000000000000084612cc590919063ffffffff16565b610c269190614173565b600154612d3f90919063ffffffff16565b6001819055503373ffffffffffffffffffffffffffffffffffffffff167fa493a9229478c3fcd73f66d2cdeb7f94fd0f341da924d1054236d7845411651182604051610c839190613b2f565b60405180910390a2610ca081600b54612d3f90919063ffffffff16565b600b819055505b5050565b601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606060088054610ce0906141d3565b80601f0160208091040260200160405190810160405280929190818152602001828054610d0c906141d3565b8015610d595780601f10610d2e57610100808354040283529160200191610d59565b820191906000526020600020905b815481529060010190602001808311610d3c57829003601f168201915b5050505050905090565b6000610d77610d70612d9d565b8484612da5565b6001905092915050565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663949d225d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610df0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e1491906140e8565b905090565b6000600754905090565b610e2b612d9d565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610eb8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eaf90614250565b60405180910390fd5b60005b84849050811015610fd7576000858583818110610edb57610eda614270565b5b9050602002016020810190610ef09190613c86565b90506000633b9aca00858585818110610f0c57610f0b614270565b5b90506020020135610f1d919061429f565b9050600d548110610fc257610f328282612f6e565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633825d82883836040518363ffffffff1660e01b8152600401610f8f9291906142f9565b600060405180830381600087803b158015610fa957600080fd5b505af1158015610fbd573d6000803e3d6000fd5b505050505b50508080610fcf90614322565b915050610ebb565b5050505050565b60106020528060005260406000206000915090505481565b600080611038576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102f906143dc565b60405180910390fd5b600190509392505050565b60007001000000000000000000000000000000006110d56110d0600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546110c26110bd6110ac88611791565b600154612cc590919063ffffffff16565b612fdb565b612ff890919063ffffffff16565b613043565b6110df9190614173565b9050919050565b600f5481565b6000600a60009054906101000a900460ff16905090565b61110b612d9d565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611198576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118f90614250565b60405180910390fd5b6111a3816000612f6e565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166329092d0e826040518263ffffffff1660e01b81526004016111fe9190613faa565b600060405180830381600087803b15801561121857600080fd5b505af115801561122c573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff167fa878b31040b2e6d0a9a3d3361209db3908ba62014b0dca52adbaee451d128b2560405160405180910390a250565b600061131f611283612d9d565b8461131a8560066000611294612d9d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612d3f90919063ffffffff16565b612da5565b6001905092915050565b6000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231836040518263ffffffff1660e01b81526004016113869190613faa565b602060405180830381865afa1580156113a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113c791906140e8565b9050600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630e832273836040518263ffffffff1660e01b81526004016114249190613faa565b602060405180830381865afa158015611441573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114659190614411565b6115ae57600d5481106115105761147c8282612f6e565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633825d82883836040518363ffffffff1660e01b81526004016114d99291906142f9565b600060405180830381600087803b1580156114f357600080fd5b505af1158015611507573d6000803e3d6000fd5b505050506115a9565b61151b826000612f6e565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166329092d0e836040518263ffffffff1660e01b81526004016115769190613faa565b600060405180830381600087803b15801561159057600080fd5b505af11580156115a4573d6000803e3d6000fd5b505050505b611659565b60006115b983611791565b1115611658576115ca826000612f6e565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166329092d0e836040518263ffffffff1660e01b81526004016116259190613faa565b600060405180830381600087803b15801561163f57600080fd5b505af1158015611653573d6000803e3d6000fd5b505050505b5b61166482600161305a565b505050565b60005b81518110156116ac5761169882828151811061168b5761168a614270565b5b6020026020010151611329565b6001816116a5919061443e565b905061166c565b5050565b6116b8612d9d565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611745576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173c90614250565b60405180910390fd5b600a60009054906101000a900460ff16600a61176191906145a5565b8161176c919061429f565b600d8190555050565b6000600d54905090565b611788336131b7565b50565b60115481565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6117e2612d9d565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461186f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186690614250565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b611935612d9d565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146119c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b990614250565b60405180910390fd5b6000601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611a1f9190613faa565b602060405180830381865afa158015611a3c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a6091906140e8565b9050601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb611aa8611e37565b836040518363ffffffff1660e01b8152600401611ac69291906142f9565b6020604051808303816000875af1158015611ae5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b099190614411565b5050565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600b5481565b6000600267ffffffffffffffff811115611b7957611b78613d3d565b5b604051908082528060200260200182016040528015611ba75781602001602082028036833780820191505090505b509050601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611c17573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c3b9190614605565b81600081518110611c4f57611c4e614270565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681600181518110611cc057611cbf614270565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b6f9de958360008430426040518663ffffffff1660e01b8152600401611d5d949392919061472b565b6000604051808303818588803b158015611d7657600080fd5b505af1158015611d8a573d6000803e3d6000fd5b50505050505050565b611d9b612d9d565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611e28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1f90614250565b60405180910390fd5b611e32828261305a565b505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000611e6b82611fd1565b9050919050565b606060098054611e81906141d3565b80601f0160208091040260200160405190810160405280929190818152602001828054611ead906141d3565b8015611efa5780601f10611ecf57610100808354040283529160200191611efa565b820191906000526020600020905b815481529060010190602001808311611edd57829003601f168201915b5050505050905090565b6000611fc7611f11612d9d565b84611fc285604051806060016040528060258152602001614dce6025913960066000611f3b612d9d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546133669092919063ffffffff16565b612da5565b6001905092915050565b600061202d600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461201f84611043565b612c7b90919063ffffffff16565b9050919050565b600080612076576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206d906143dc565b60405180910390fd5b6001905092915050565b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600d5481565b6120d7612d9d565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612164576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161215b90614250565b60405180910390fd5b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b61225d612d9d565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146122ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122e190614250565b60405180910390fd5b60004790506122f7611e37565b73ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561233c573d6000803e3d6000fd5b5050565b6000600f54905090565b612352612d9d565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146123df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123d690614250565b60405180910390fd5b610e1081101580156123f45750620151808111155b612433576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242a906147e9565b60405180910390fd5b6011548103612477576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161246e9061487b565b60405180910390fd5b601154817f474ea64804364a1e29a4487ddb63c3342a2dd826ccd8acf48825e680a0e6f20f60405160405180910390a38060118190555050565b6124b9612d9d565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612546576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161253d90614250565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036125b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125ac9061490d565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600080600080600080600080889750600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663564c8d11896040518263ffffffff1660e01b81526004016126dc9190613faa565b602060405180830381865afa1580156126f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061271d9190614959565b96507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9550600087126128d257600f5487111561277057612769600f54886133ca90919063ffffffff16565b95506128d1565b6000600f54600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663949d225d6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156127e2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061280691906140e8565b116128125760006128b8565b6128b7600f54600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663949d225d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612885573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128a991906140e8565b612c7b90919063ffffffff16565b5b90506128cd8189612ff890919063ffffffff16565b9650505b5b6128db88611fd1565b94506128e688611043565b9350601060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205492506000831161293957600061294f565b61294e60115484612d3f90919063ffffffff16565b5b915042821161295f576000612973565b6129724283612c7b90919063ffffffff16565b5b9050919395975091939597565b600080600080600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663949d225d6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156129f3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a1791906140e8565b905060008103612a3357600080600f5493509350935050612c74565b6000600f5490506000805a90506000805b8984108015612a5257508582105b15612c5b578480612a6290614322565b955050600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663949d225d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612ad2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612af691906140e8565b8510612b0157600094505b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663663037ac876040518263ffffffff1660e01b8152600401612b5e9190613b2f565b602060405180830381865afa158015612b7b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b9f9190614605565b9050612be9601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613415565b15612c0e57612bf981600161305a565b15612c0d578180612c0990614322565b9250505b5b8280612c1990614322565b93505060005a905080851115612c5157612c4e612c3f8287612c7b90919063ffffffff16565b87612d3f90919063ffffffff16565b95505b8094505050612a44565b84600f819055508181600f549850985098505050505050505b9193909250565b6000612cbd83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613366565b905092915050565b6000808303612cd75760009050612d39565b60008284612ce5919061429f565b9050828482612cf49190614173565b14612d34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d2b906149f8565b60405180910390fd5b809150505b92915050565b6000808284612d4e919061443e565b905083811015612d93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d8a90614a64565b60405180910390fd5b8091505092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612e14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e0b90614af6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612e83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e7a90614b88565b60405180910390fd5b80600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051612f619190613b2f565b60405180910390a3505050565b6000612f7983611791565b905080821115612faa576000612f988284612c7b90919063ffffffff16565b9050612fa48482613448565b50612fd6565b80821015612fd5576000612fc78383612c7b90919063ffffffff16565b9050612fd38482613682565b505b5b505050565b6000808290506000811215612fef57600080fd5b80915050919050565b60008082846130079190614ba8565b90506000831215801561301a5750838112155b80613030575060008312801561302f57508381125b5b61303957600080fd5b8091505092915050565b60008082121561305257600080fd5b819050919050565b600080613066846131b7565b905060008111156131ab576000600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506130c88183612d3f90919063ffffffff16565b600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555042601060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508315158573ffffffffffffffffffffffffffffffffffffffff167fa2c38e2d2fb7e3e1912d937fd1ca11ed6d51864dee4cfa7a7bf02becd7acf092846040516131989190613b2f565b60405180910390a36001925050506131b1565b60009150505b92915050565b6000806131c383611fd1565b9050600081111561335b5761322081600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612d3f90919063ffffffff16565b600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff167fee503bee2bb6a87e57bc57db795f98137327401a0e7b7ce42e37926cc1a9ca4d826040516132a99190613b2f565b60405180910390a2601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84836040518363ffffffff1660e01b815260040161330e929190614c0d565b6020604051808303816000875af115801561332d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133519190614411565b5080915050613361565b60009150505b919050565b60008383111582906133ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133a59190613a00565b60405180910390fd5b50600083856133bd9190614c36565b9050809150509392505050565b60008082846133d99190614c6a565b9050600083121580156133ec5750838113155b80613402575060008312801561340157508381135b5b61340b57600080fd5b8091505092915050565b6000428211156134285760009050613443565b60115461343e8342612c7b90919063ffffffff16565b101590505b919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036134b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134ae90614cf9565b60405180910390fd5b6134cc81600754612d3f90919063ffffffff16565b60078190555061352481600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612d3f90919063ffffffff16565b600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516135c59190613b2f565b60405180910390a361363b6135ed6135e883600154612cc590919063ffffffff16565b612fdb565b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546133ca90919063ffffffff16565b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036136f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136e890614d8b565b60405180910390fd5b61375d81604051806060016040528060228152602001614dac60229139600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546133669092919063ffffffff16565b600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506137b581600754612c7b90919063ffffffff16565b600781905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516138199190613b2f565b60405180910390a361388f61384161383c83600154612cc590919063ffffffff16565b612fdb565b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612ff890919063ffffffff16565b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600061391b613916613911846138d6565b6138f6565b6138d6565b9050919050565b600061392d82613900565b9050919050565b600061393f82613922565b9050919050565b61394f81613934565b82525050565b600060208201905061396a6000830184613946565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156139aa57808201518184015260208101905061398f565b60008484015250505050565b6000601f19601f8301169050919050565b60006139d282613970565b6139dc818561397b565b93506139ec81856020860161398c565b6139f5816139b6565b840191505092915050565b60006020820190508181036000830152613a1a81846139c7565b905092915050565b6000604051905090565b600080fd5b600080fd5b6000613a41826138d6565b9050919050565b613a5181613a36565b8114613a5c57600080fd5b50565b600081359050613a6e81613a48565b92915050565b6000819050919050565b613a8781613a74565b8114613a9257600080fd5b50565b600081359050613aa481613a7e565b92915050565b60008060408385031215613ac157613ac0613a2c565b5b6000613acf85828601613a5f565b9250506020613ae085828601613a95565b9150509250929050565b60008115159050919050565b613aff81613aea565b82525050565b6000602082019050613b1a6000830184613af6565b92915050565b613b2981613a74565b82525050565b6000602082019050613b446000830184613b20565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112613b6f57613b6e613b4a565b5b8235905067ffffffffffffffff811115613b8c57613b8b613b4f565b5b602083019150836020820283011115613ba857613ba7613b54565b5b9250929050565b60008083601f840112613bc557613bc4613b4a565b5b8235905067ffffffffffffffff811115613be257613be1613b4f565b5b602083019150836020820283011115613bfe57613bfd613b54565b5b9250929050565b60008060008060408587031215613c1f57613c1e613a2c565b5b600085013567ffffffffffffffff811115613c3d57613c3c613a31565b5b613c4987828801613b59565b9450945050602085013567ffffffffffffffff811115613c6c57613c6b613a31565b5b613c7887828801613baf565b925092505092959194509250565b600060208284031215613c9c57613c9b613a2c565b5b6000613caa84828501613a5f565b91505092915050565b600080600060608486031215613ccc57613ccb613a2c565b5b6000613cda86828701613a5f565b9350506020613ceb86828701613a5f565b9250506040613cfc86828701613a95565b9150509250925092565b600060ff82169050919050565b613d1c81613d06565b82525050565b6000602082019050613d376000830184613d13565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613d75826139b6565b810181811067ffffffffffffffff82111715613d9457613d93613d3d565b5b80604052505050565b6000613da7613a22565b9050613db38282613d6c565b919050565b600067ffffffffffffffff821115613dd357613dd2613d3d565b5b602082029050602081019050919050565b6000613df7613df284613db8565b613d9d565b90508083825260208201905060208402830185811115613e1a57613e19613b54565b5b835b81811015613e435780613e2f8882613a5f565b845260208401935050602081019050613e1c565b5050509392505050565b600082601f830112613e6257613e61613b4a565b5b8135613e72848260208601613de4565b91505092915050565b600060208284031215613e9157613e90613a2c565b5b600082013567ffffffffffffffff811115613eaf57613eae613a31565b5b613ebb84828501613e4d565b91505092915050565b600060208284031215613eda57613ed9613a2c565b5b6000613ee884828501613a95565b91505092915050565b6000613efc826138d6565b9050919050565b613f0c81613ef1565b8114613f1757600080fd5b50565b600081359050613f2981613f03565b92915050565b613f3881613aea565b8114613f4357600080fd5b50565b600081359050613f5581613f2f565b92915050565b60008060408385031215613f7257613f71613a2c565b5b6000613f8085828601613f1a565b9250506020613f9185828601613f46565b9150509250929050565b613fa481613a36565b82525050565b6000602082019050613fbf6000830184613f9b565b92915050565b60008060408385031215613fdc57613fdb613a2c565b5b6000613fea85828601613a5f565b9250506020613ffb85828601613a5f565b9150509250929050565b6000819050919050565b61401881614005565b82525050565b600061010082019050614034600083018b613f9b565b614041602083018a61400f565b61404e604083018961400f565b61405b6060830188613b20565b6140686080830187613b20565b61407560a0830186613b20565b61408260c0830185613b20565b61408f60e0830184613b20565b9998505050505050505050565b60006060820190506140b16000830186613b20565b6140be6020830185613b20565b6140cb6040830184613b20565b949350505050565b6000815190506140e281613a7e565b92915050565b6000602082840312156140fe576140fd613a2c565b5b600061410c848285016140d3565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061417e82613a74565b915061418983613a74565b92508261419957614198614115565b5b828204905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806141eb57607f821691505b6020821081036141fe576141fd6141a4565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061423a60208361397b565b915061424582614204565b602082019050919050565b600060208201905081810360008301526142698161422d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006142aa82613a74565b91506142b583613a74565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156142ee576142ed614144565b5b828202905092915050565b600060408201905061430e6000830185613f9b565b61431b6020830184613b20565b9392505050565b600061432d82613a74565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361435f5761435e614144565b5b600182019050919050565b7f4e6f207472616e736665727320616c6c6f77656420696e206469766964656e6460008201527f20747261636b6572000000000000000000000000000000000000000000000000602082015250565b60006143c660288361397b565b91506143d18261436a565b604082019050919050565b600060208201905081810360008301526143f5816143b9565b9050919050565b60008151905061440b81613f2f565b92915050565b60006020828403121561442757614426613a2c565b5b6000614435848285016143fc565b91505092915050565b600061444982613a74565b915061445483613a74565b925082820190508082111561446c5761446b614144565b5b92915050565b60008160011c9050919050565b6000808291508390505b60018511156144c9578086048111156144a5576144a4614144565b5b60018516156144b45780820291505b80810290506144c285614472565b9450614489565b94509492505050565b6000826144e2576001905061459e565b816144f0576000905061459e565b816001811461450657600281146145105761453f565b600191505061459e565b60ff84111561452257614521614144565b5b8360020a91508482111561453957614538614144565b5b5061459e565b5060208310610133831016604e8410600b84101617156145745782820a90508381111561456f5761456e614144565b5b61459e565b614581848484600161447f565b9250905081840481111561459857614597614144565b5b81810290505b9392505050565b60006145b082613a74565b91506145bb83613d06565b92506145e87fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84846144d2565b905092915050565b6000815190506145ff81613a48565b92915050565b60006020828403121561461b5761461a613a2c565b5b6000614629848285016145f0565b91505092915050565b6000819050919050565b600061465761465261464d84614632565b6138f6565b613a74565b9050919050565b6146678161463c565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6146a281613a36565b82525050565b60006146b48383614699565b60208301905092915050565b6000602082019050919050565b60006146d88261466d565b6146e28185614678565b93506146ed83614689565b8060005b8381101561471e57815161470588826146a8565b9750614710836146c0565b9250506001810190506146f1565b5085935050505092915050565b6000608082019050614740600083018761465e565b818103602083015261475281866146cd565b90506147616040830185613f9b565b61476e6060830184613b20565b95945050505050565b7f436c61696d57616974206d757374206265207570646174656420746f2062657460008201527f7765656e203120616e6420323420686f75727300000000000000000000000000602082015250565b60006147d360338361397b565b91506147de82614777565b604082019050919050565b60006020820190508181036000830152614802816147c6565b9050919050565b7f43616e6e6f742075706461746520636c61696d5761697420746f2073616d652060008201527f76616c7565000000000000000000000000000000000000000000000000000000602082015250565b600061486560258361397b565b915061487082614809565b604082019050919050565b6000602082019050818103600083015261489481614858565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006148f760268361397b565b91506149028261489b565b604082019050919050565b60006020820190508181036000830152614926816148ea565b9050919050565b61493681614005565b811461494157600080fd5b50565b6000815190506149538161492d565b92915050565b60006020828403121561496f5761496e613a2c565b5b600061497d84828501614944565b91505092915050565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008201527f7700000000000000000000000000000000000000000000000000000000000000602082015250565b60006149e260218361397b565b91506149ed82614986565b604082019050919050565b60006020820190508181036000830152614a11816149d5565b9050919050565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000600082015250565b6000614a4e601b8361397b565b9150614a5982614a18565b602082019050919050565b60006020820190508181036000830152614a7d81614a41565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614ae060248361397b565b9150614aeb82614a84565b604082019050919050565b60006020820190508181036000830152614b0f81614ad3565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000614b7260228361397b565b9150614b7d82614b16565b604082019050919050565b60006020820190508181036000830152614ba181614b65565b9050919050565b6000614bb382614005565b9150614bbe83614005565b925082820190508281121560008312168382126000841215161715614be657614be5614144565b5b92915050565b6000614bf782613922565b9050919050565b614c0781614bec565b82525050565b6000604082019050614c226000830185614bfe565b614c2f6020830184613b20565b9392505050565b6000614c4182613a74565b9150614c4c83613a74565b9250828203905081811115614c6457614c63614144565b5b92915050565b6000614c7582614005565b9150614c8083614005565b9250828203905081811260008412168282136000851215161715614ca757614ca6614144565b5b92915050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6000614ce3601f8361397b565b9150614cee82614cad565b602082019050919050565b60006020820190508181036000830152614d1281614cd6565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000614d7560218361397b565b9150614d8082614d19565b604082019050919050565b60006020820190508181036000830152614da481614d68565b905091905056fe45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212207a255a0de251ddb7b84f64eba83d9411f0f3e239d1d2fc859f71e85b00a403df64736f6c63430008100033
Deployed Bytecode Sourcemap
32838:14670:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38705:21;:19;:21::i;:::-;32838:14670;;;;;34569:45;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39085:622;;;:::i;:::-;;34651:83;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35684:169;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42372:115;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34928:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46542:473;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34066:49;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35341:184;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41290:247;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34026:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34837:83;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38882:195;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35861:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36709:711;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37428:227;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41545:198;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42248:116;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40228:106;;;;;;;;;;;;;:::i;:::-;;34122:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35036:127;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17816:148;;;;;;;;;;;;;:::i;:::-;;47334:169;;;;;;;;;;;;;:::i;:::-;;45916:128;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33589:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39715:503;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45761:147;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;17180:79;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40851:122;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34742:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36087:269;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40981:166;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35171:162;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41155:127;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33706:74;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38742:132;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34490:71;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35533:143;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47099:151;;;;;;;;;;;;;:::i;:::-;;42131:109;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41751:372;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18119:244;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42495:1270;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;;;;;;44470:1283;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;39085:622;39166:1;39150:13;:11;:13::i;:::-;:17;39142:26;;;;;;39179:22;39204:9;;;;;;;;;;;:19;;;39232:4;39204:34;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39179:59;;39249:25;39264:9;39249:14;:25::i;:::-;39285:18;39306:54;39345:14;39306:9;;;;;;;;;;;:19;;;39334:4;39306:34;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:38;;:54;;;;:::i;:::-;39285:75;;39388:1;39375:10;:14;39371:329;;;39434:106;39512:13;:11;:13::i;:::-;39482:27;33041:8;39483:10;39482:16;;:27;;;;:::i;:::-;:43;;;;:::i;:::-;39434:25;;:29;;:106;;;;:::i;:::-;39406:25;:134;;;;39581:10;39560:44;;;39593:10;39560:44;;;;;;:::i;:::-;;;;;;;;39647:41;39677:10;39647:25;;:29;;:41;;;;:::i;:::-;39619:25;:69;;;;39371:329;39131:576;;39085:622::o;34569:45::-;;;;;;;;;;;;;:::o;34651:83::-;34688:13;34721:5;34714:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34651:83;:::o;35684:169::-;35767:4;35784:39;35793:12;:10;:12::i;:::-;35807:7;35816:6;35784:8;:39::i;:::-;35841:4;35834:11;;35684:169;;;;:::o;42372:115::-;42430:7;42457:15;;;;;;;;;;;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42450:29;;42372:115;:::o;34928:100::-;34981:7;35008:12;;35001:19;;34928:100;:::o;46542:473::-;17402:12;:10;:12::i;:::-;17392:22;;:6;;;;;;;;;;:22;;;17384:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;46659:10:::1;46654:354;46683:10;;:17;;46675:5;:25;46654:354;;;46726:15;46744:10;;46755:5;46744:17;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;46726:35;;46776:14;46810:7;46793;;46801:5;46793:14;;;;;;;:::i;:::-;;;;;;;;:24;;;;:::i;:::-;46776:41;;46846:31;;46836:6;:41;46832:165;;46898:28;46910:7;46919:6;46898:11;:28::i;:::-;46945:15;;;;;;;;;;;:19;;;46965:7;46974:6;46945:36;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;46832:165;46711:297;;46702:7;;;;;:::i;:::-;;;;46654:354;;;;46542:473:::0;;;;:::o;34066:49::-;;;;;;;;;;;;;;;;;:::o;35341:184::-;35420:4;35445:5;35437:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;35513:4;35506:11;;35341:184;;;;;:::o;41290:247::-;41359:7;33041:8;41386:131;:115;41464:28;:36;41493:6;41464:36;;;;;;;;;;;;;;;;41386:63;:48;41416:17;41426:6;41416:9;:17::i;:::-;41386:25;;:29;;:48;;;;:::i;:::-;:61;:63::i;:::-;:77;;:115;;;;:::i;:::-;:129;:131::i;:::-;:143;;;;:::i;:::-;41379:150;;41290:247;;;:::o;34026:33::-;;;;:::o;34837:83::-;34878:5;34903:9;;;;;;;;;;;34896:16;;34837:83;:::o;38882:195::-;17402:12;:10;:12::i;:::-;17392:22;;:6;;;;;;;;;;:22;;;17384:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;38959:23:::1;38971:7;38980:1;38959:11;:23::i;:::-;38993:15;;;;;;;;;;;:22;;;39016:7;38993:31;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;39061:7;39040:29;;;;;;;;;;;;38882:195:::0;:::o;35861:218::-;35949:4;35966:83;35975:12;:10;:12::i;:::-;35989:7;35998:50;36037:10;35998:11;:25;36010:12;:10;:12::i;:::-;35998:25;;;;;;;;;;;;;;;:34;36024:7;35998:34;;;;;;;;;;;;;;;;:38;;:50;;;;:::i;:::-;35966:8;:83::i;:::-;36067:4;36060:11;;35861:218;;;;:::o;36709:711::-;36769:15;36787:10;;;;;;;;;;;:20;;;36808:7;36787:29;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36769:47;;36832:10;;;;;;;;;;;:32;;;36865:7;36832:41;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36827:537;;36905:31;;36894:7;:42;36890:295;;36957:29;36969:7;36978;36957:11;:29::i;:::-;37005:15;;;;;;;;;;;:19;;;37025:7;37034;37005:37;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36890:295;;;37096:23;37108:7;37117:1;37096:11;:23::i;:::-;37138:15;;;;;;;;;;;:22;;;37161:7;37138:31;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36890:295;36827:537;;;37242:1;37221:18;37231:7;37221:9;:18::i;:::-;:22;37217:136;;;37264:23;37276:7;37285:1;37264:11;:23::i;:::-;37306:15;;;;;;;;;;;:22;;;37329:7;37306:31;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37217:136;36827:537;37374:38;37397:7;37407:4;37374:14;:38::i;:::-;;36758:662;36709:711;:::o;37428:227::-;37504:13;37532:116;37547:8;:15;37539:5;:23;37532:116;;;37579:32;37595:8;37604:5;37595:15;;;;;;;;:::i;:::-;;;;;;;;37579;:32::i;:::-;37635:1;37626:10;;;;;:::i;:::-;;;37532:116;;;37493:162;37428:227;:::o;41545:198::-;17402:12;:10;:12::i;:::-;17392:22;;:6;;;;;;;;;;:22;;;17384:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;41725:9:::1;;;;;;;;;;;41719:2;:15;;;;:::i;:::-;41689:26;:46;;;;:::i;:::-;41655:31;:80;;;;41545:198:::0;:::o;42248:116::-;42298:7;42325:31;;42318:38;;42248:116;:::o;40228:106::-;40282:44;40314:10;40282:23;:44::i;:::-;;40228:106::o;34122:31::-;;;;:::o;35036:127::-;35110:7;35137:9;:18;35147:7;35137:18;;;;;;;;;;;;;;;;35130:25;;35036:127;;;:::o;17816:148::-;17402:12;:10;:12::i;:::-;17392:22;;:6;;;;;;;;;;:22;;;17384:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;17923:1:::1;17886:40;;17907:6;::::0;::::1;;;;;;;;17886:40;;;;;;;;;;;;17954:1;17937:6:::0;::::1;:19;;;;;;;;;;;;;;;;;;17816:148::o:0;47334:169::-;17402:12;:10;:12::i;:::-;17392:22;;:6;;;;;;;;;;:22;;;17384:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;47388:19:::1;47410:9;;;;;;;;;;;:19;;;47438:4;47410:34;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47388:56;;47455:9;;;;;;;;;;;:18;;;47474:7;:5;:7::i;:::-;47483:11;47455:40;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;47377:126;47334:169::o:0;45916:128::-;45984:7;46011:16;:25;46028:7;46011:25;;;;;;;;;;;;;;;;46004:32;;45916:128;;;:::o;33589:40::-;;;;:::o;39715:503::-;39834:21;39872:1;39858:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39834:40;;39895:15;;;;;;;;;;;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39885:4;39890:1;39885:7;;;;;;;;:::i;:::-;;;;;;;:32;;;;;;;;;;;39938:11;;;;;;;;;;;39928:4;39933:1;39928:7;;;;;;;;:::i;:::-;;;;;;;:21;;;;;;;;;;;39988:15;;;;;;;;;;;:66;;;40063:9;40088:1;40137:4;40164;40184:15;39988:222;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39765:453;39715:503;:::o;45761:147::-;17402:12;:10;:12::i;:::-;17392:22;;:6;;;;;;;;;;:22;;;17384:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;45866:34:::1;45881:7;45890:9;45866:14;:34::i;:::-;;45761:147:::0;;:::o;17180:79::-;17218:7;17245:6;;;;;;;;;;;17238:13;;17180:79;:::o;40851:122::-;40908:7;40935:30;40958:6;40935:22;:30::i;:::-;40928:37;;40851:122;;;:::o;34742:87::-;34781:13;34814:7;34807:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34742:87;:::o;36087:269::-;36180:4;36197:129;36206:12;:10;:12::i;:::-;36220:7;36229:96;36268:15;36229:96;;;;;;;;;;;;;;;;;:11;:25;36241:12;:10;:12::i;:::-;36229:25;;;;;;;;;;;;;;;:34;36255:7;36229:34;;;;;;;;;;;;;;;;:38;;:96;;;;;:::i;:::-;36197:8;:129::i;:::-;36344:4;36337:11;;36087:269;;;;:::o;40981:166::-;41050:7;41077:62;41112:18;:26;41131:6;41112:26;;;;;;;;;;;;;;;;41077:30;41100:6;41077:22;:30::i;:::-;:34;;:62;;;;:::i;:::-;41070:69;;40981:166;;;:::o;35171:162::-;35228:4;35253:5;35245:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;35321:4;35314:11;;35171:162;;;;:::o;41155:127::-;41221:7;41248:18;:26;41267:6;41248:26;;;;;;;;;;;;;;;;41241:33;;41155:127;;;:::o;33706:74::-;;;;:::o;38742:132::-;17402:12;:10;:12::i;:::-;17392:22;;:6;;;;;;;;;;:22;;;17384:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;38852:12:::1;38820:10;;:46;;;;;;;;;;;;;;;;;;38742:132:::0;:::o;34490:71::-;;;;;;;;;;;;;:::o;35533:143::-;35614:7;35641:11;:18;35653:5;35641:18;;;;;;;;;;;;;;;:27;35660:7;35641:27;;;;;;;;;;;;;;;;35634:34;;35533:143;;;;:::o;47099:151::-;17402:12;:10;:12::i;:::-;17392:22;;:6;;;;;;;;;;:22;;;17384:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;47152:18:::1;47173:21;47152:42;;47213:7;:5;:7::i;:::-;47205:25;;:37;47231:10;47205:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;47141:109;47099:151::o:0;42131:109::-;42187:7;42214:18;;42207:25;;42131:109;:::o;41751:372::-;17402:12;:10;:12::i;:::-;17392:22;;:6;;;;;;;;;;:22;;;17384:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;41852:4:::1;41836:12;:20;;:45;;;;;41876:5;41860:12;:21;;41836:45;41828:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;41972:9;;41956:12;:25:::0;41948:75:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;42070:9;;42056:12;42039:41;;;;;;;;;;42103:12;42091:9;:24;;;;41751:372:::0;:::o;18119:244::-;17402:12;:10;:12::i;:::-;17392:22;;:6;;;;;;;;;;:22;;;17384:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;18228:1:::1;18208:22;;:8;:22;;::::0;18200:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;18318:8;18289:38;;18310:6;::::0;::::1;;;;;;;;18289:38;;;;;;;;;;;;18347:8;18338:6;::::0;:17:::1;;;;;;;;;;;;;;;;;;18119:244:::0;:::o;42495:1270::-;42554:15;42571:12;42585:31;42627:29;42658:22;42682:21;42714;42737:38;42798:8;42788:18;;42825:15;;;;;;;;;;;:29;;;42855:7;42825:38;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42817:46;;42901:3;42874:30;;42928:1;42919:5;:10;42915:473;;42967:18;;42958:5;42950:35;42946:431;;;43033:37;43050:18;;43033:5;:9;;:37;;;;:::i;:::-;43006:64;;42946:431;;;43124:32;43184:18;;43159:15;;;;;;;;;;;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:43;:113;;43271:1;43159:113;;;43222:46;43249:18;;43222:15;;;;;;;;;;;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:26;;:46;;;;:::i;:::-;43159:113;43124:148;;43318:43;43335:24;43318:5;:9;;:43;;;;:::i;:::-;43291:70;;43105:272;42946:431;42915:473;43422:31;43445:7;43422:22;:31::i;:::-;43398:55;;43481:31;43504:7;43481:22;:31::i;:::-;43464:48;;43539:14;:23;43554:7;43539:23;;;;;;;;;;;;;;;;43523:39;;43605:1;43589:13;:17;:52;;43640:1;43589:52;;;43609:28;43627:9;;43609:13;:17;;:28;;;;:::i;:::-;43589:52;43573:68;;43701:15;43685:13;:31;:72;;43756:1;43685:72;;;43719:34;43737:15;43719:13;:17;;:34;;;;:::i;:::-;43685:72;43652:105;;42495:1270;;;;;;;;;:::o;44470:1283::-;44516:7;44525;44534;44554:28;44585:15;;;;;;;;;;;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44554:53;;44648:1;44624:20;:25;44620:91;;44674:1;44677;44680:18;;44666:33;;;;;;;;;44620:91;44721:27;44751:18;;44721:48;;44780:15;44810;44828:9;44810:27;;44848:18;44881:14;44910:727;44927:3;44917:7;:13;:50;;;;;44947:20;44934:10;:33;44917:50;44910:727;;;44984:21;;;;;:::i;:::-;;;;45047:15;;;;;;;;;;;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45024:19;:45;45020:109;;45112:1;45090:23;;45020:109;45143:15;45161;;;;;;;;;;;:29;;;45191:19;45161:50;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45143:68;;45230:37;45243:14;:23;45258:7;45243:23;;;;;;;;;;;;;;;;45230:12;:37::i;:::-;45226:172;;;45292:38;45315:7;45325:4;45292:14;:38::i;:::-;45288:95;;;45355:8;;;;;:::i;:::-;;;;45288:95;45226:172;45412:12;;;;;:::i;:::-;;;;45439:18;45460:9;45439:30;;45498:10;45488:7;:20;45484:107;;;45539:36;45551:23;45563:10;45551:7;:11;;:23;;;;:::i;:::-;45539:7;:11;;:36;;;;:::i;:::-;45529:46;;45484:107;45615:10;45605:20;;44969:668;;44910:727;;;45668:19;45647:18;:40;;;;45706:10;45718:6;45726:18;;45698:47;;;;;;;;;;;;44470:1283;;;;;;:::o;5560:136::-;5618:7;5645:43;5649:1;5652;5645:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;5638:50;;5560:136;;;;:::o;6450:471::-;6508:7;6758:1;6753;:6;6749:47;;6783:1;6776:8;;;;6749:47;6808:9;6824:1;6820;:5;;;;:::i;:::-;6808:17;;6853:1;6848;6844;:5;;;;:::i;:::-;:10;6836:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;6912:1;6905:8;;;6450:471;;;;;:::o;5096:181::-;5154:7;5174:9;5190:1;5186;:5;;;;:::i;:::-;5174:17;;5215:1;5210;:6;;5202:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;5268:1;5261:8;;;5096:181;;;;:::o;9668:98::-;9721:7;9748:10;9741:17;;9668:98;:::o;36364:337::-;36474:1;36457:19;;:5;:19;;;36449:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;36555:1;36536:21;;:7;:21;;;36528:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;36639:6;36609:11;:18;36621:5;36609:18;;;;;;;;;;;;;;;:27;36628:7;36609:27;;;;;;;;;;;;;;;:36;;;;36677:7;36661:32;;36670:5;36661:32;;;36686:6;36661:32;;;;;;:::i;:::-;;;;;;;;36364:337;;;:::o;44013:449::-;44091:22;44116:18;44126:7;44116:9;:18::i;:::-;44091:43;;44162:14;44149:10;:27;44145:310;;;44193:18;44214:30;44229:14;44214:10;:14;;:30;;;;:::i;:::-;44193:51;;44259:26;44265:7;44274:10;44259:5;:26::i;:::-;44178:119;44145:310;;;44320:14;44307:10;:27;44303:152;;;44351:18;44372:30;44391:10;44372:14;:18;;:30;;;;:::i;:::-;44351:51;;44417:26;44423:7;44432:10;44417:5;:26::i;:::-;44336:119;44303:152;44145:310;44080:382;44013:449;;:::o;4101:148::-;4157:6;4176:8;4194:1;4176:20;;4220:1;4215;:6;;4207:15;;;;;;4240:1;4233:8;;;4101:148;;;:::o;3617:176::-;3673:6;3692:8;3707:1;3703;:5;;;;:::i;:::-;3692:16;;3733:1;3728;:6;;:16;;;;;3743:1;3738;:6;;3728:16;3727:38;;;;3754:1;3750;:5;:14;;;;;3763:1;3759;:5;3750:14;3727:38;3719:47;;;;;;3784:1;3777:8;;;3617:176;;;;:::o;3939:127::-;3995:7;4028:1;4023;:6;;4015:15;;;;;;4056:1;4041:17;;3939:127;;;:::o;46052:482::-;46134:4;46151:14;46168:32;46192:7;46168:23;:32::i;:::-;46151:49;;46224:1;46215:6;:10;46211:293;;;46242:20;46265:16;:25;46282:7;46265:25;;;;;;;;;;;;;;;;46242:48;;46333:24;46344:12;46333:6;:10;;:24;;;;:::i;:::-;46305:16;:25;46322:7;46305:25;;;;;;;;;;;;;;;:52;;;;46398:15;46372:14;:23;46387:7;46372:23;;;;;;;;;;;;;;;:41;;;;46456:9;46433:33;;46439:7;46433:33;;;46448:6;46433:33;;;;;;:::i;:::-;;;;;;;;46488:4;46481:11;;;;;;46211:293;46521:5;46514:12;;;46052:482;;;;;:::o;40342:497::-;40415:7;40435:29;40467:28;40490:4;40467:22;:28::i;:::-;40435:60;;40534:1;40510:21;:25;40506:307;;;40579:51;40608:21;40579:18;:24;40598:4;40579:24;;;;;;;;;;;;;;;;:28;;:51;;;;:::i;:::-;40552:18;:24;40571:4;40552:24;;;;;;;;;;;;;;;:78;;;;40668:4;40650:46;;;40674:21;40650:46;;;;;;:::i;:::-;;;;;;;;40711:9;;;;;;;;;;;:18;;;40730:4;40736:21;40711:47;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;40780:21;40773:28;;;;;40506:307;40830:1;40823:8;;;40342:497;;;;:::o;5999:192::-;6085:7;6118:1;6113;:6;;6121:12;6105:29;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;6145:9;6161:1;6157;:5;;;;:::i;:::-;6145:17;;6182:1;6175:8;;;5999:192;;;;;:::o;3433:176::-;3489:6;3508:8;3523:1;3519;:5;;;;:::i;:::-;3508:16;;3549:1;3544;:6;;:16;;;;;3559:1;3554;:6;;3544:16;3543:38;;;;3570:1;3566;:5;:14;;;;;3579:1;3575;:5;3566:14;3543:38;3535:47;;;;;;3600:1;3593:8;;;3433:176;;;;:::o;43773:232::-;43840:4;43877:15;43861:13;:31;43857:76;;;43916:5;43909:12;;;;43857:76;43988:9;;43950:34;43970:13;43950:15;:19;;:34;;;;:::i;:::-;:47;;43943:54;;43773:232;;;;:::o;37663:472::-;37766:1;37747:21;;:7;:21;;;37739:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;37830:24;37847:6;37830:12;;:16;;:24;;;;:::i;:::-;37815:12;:39;;;;37886:30;37909:6;37886:9;:18;37896:7;37886:18;;;;;;;;;;;;;;;;:22;;:30;;;;:::i;:::-;37865:9;:18;37875:7;37865:18;;;;;;;;;;;;;;;:51;;;;37953:7;37932:37;;37949:1;37932:37;;;37962:6;37932:37;;;;;;:::i;:::-;;;;;;;;38020:107;38072:54;38073:37;38103:6;38073:25;;:29;;:37;;;;:::i;:::-;38072:52;:54::i;:::-;38020:28;:37;38049:7;38020:37;;;;;;;;;;;;;;;;:51;;:107;;;;:::i;:::-;37980:28;:37;38009:7;37980:37;;;;;;;;;;;;;;;:147;;;;37663:472;;:::o;38143:516::-;38246:1;38227:21;;:7;:21;;;38219:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;38320:68;38343:6;38320:68;;;;;;;;;;;;;;;;;:9;:18;38330:7;38320:18;;;;;;;;;;;;;;;;:22;;:68;;;;;:::i;:::-;38299:9;:18;38309:7;38299:18;;;;;;;;;;;;;;;:89;;;;38414:24;38431:6;38414:12;;:16;;:24;;;;:::i;:::-;38399:12;:39;;;;38480:1;38454:37;;38463:7;38454:37;;;38484:6;38454:37;;;;;;:::i;:::-;;;;;;;;38544:107;38596:54;38597:37;38627:6;38597:25;;:29;;:37;;;;:::i;:::-;38596:52;:54::i;:::-;38544:28;:37;38573:7;38544:37;;;;;;;;;;;;;;;;:51;;:107;;;;:::i;:::-;38504:28;:37;38533:7;38504:37;;;;;;;;;;;;;;;:147;;;;38143:516;;:::o;7:126:1:-;44:7;84:42;77:5;73:54;62:65;;7:126;;;:::o;139:60::-;167:3;188:5;181:12;;139:60;;;:::o;205:142::-;255:9;288:53;306:34;315:24;333:5;315:24;:::i;:::-;306:34;:::i;:::-;288:53;:::i;:::-;275:66;;205:142;;;:::o;353:126::-;403:9;436:37;467:5;436:37;:::i;:::-;423:50;;353:126;;;:::o;485:139::-;548:9;581:37;612:5;581:37;:::i;:::-;568:50;;485:139;;;:::o;630:157::-;730:50;774:5;730:50;:::i;:::-;725:3;718:63;630:157;;:::o;793:248::-;899:4;937:2;926:9;922:18;914:26;;950:84;1031:1;1020:9;1016:17;1007:6;950:84;:::i;:::-;793:248;;;;:::o;1047:99::-;1099:6;1133:5;1127:12;1117:22;;1047:99;;;:::o;1152:169::-;1236:11;1270:6;1265:3;1258:19;1310:4;1305:3;1301:14;1286:29;;1152:169;;;;:::o;1327:246::-;1408:1;1418:113;1432:6;1429:1;1426:13;1418:113;;;1517:1;1512:3;1508:11;1502:18;1498:1;1493:3;1489:11;1482:39;1454:2;1451:1;1447:10;1442:15;;1418:113;;;1565:1;1556:6;1551:3;1547:16;1540:27;1389:184;1327:246;;;:::o;1579:102::-;1620:6;1671:2;1667:7;1662:2;1655:5;1651:14;1647:28;1637:38;;1579:102;;;:::o;1687:377::-;1775:3;1803:39;1836:5;1803:39;:::i;:::-;1858:71;1922:6;1917:3;1858:71;:::i;:::-;1851:78;;1938:65;1996:6;1991:3;1984:4;1977:5;1973:16;1938:65;:::i;:::-;2028:29;2050:6;2028:29;:::i;:::-;2023:3;2019:39;2012:46;;1779:285;1687:377;;;;:::o;2070:313::-;2183:4;2221:2;2210:9;2206:18;2198:26;;2270:9;2264:4;2260:20;2256:1;2245:9;2241:17;2234:47;2298:78;2371:4;2362:6;2298:78;:::i;:::-;2290:86;;2070:313;;;;:::o;2389:75::-;2422:6;2455:2;2449:9;2439:19;;2389:75;:::o;2470:117::-;2579:1;2576;2569:12;2593:117;2702:1;2699;2692:12;2716:96;2753:7;2782:24;2800:5;2782:24;:::i;:::-;2771:35;;2716:96;;;:::o;2818:122::-;2891:24;2909:5;2891:24;:::i;:::-;2884:5;2881:35;2871:63;;2930:1;2927;2920:12;2871:63;2818:122;:::o;2946:139::-;2992:5;3030:6;3017:20;3008:29;;3046:33;3073:5;3046:33;:::i;:::-;2946:139;;;;:::o;3091:77::-;3128:7;3157:5;3146:16;;3091:77;;;:::o;3174:122::-;3247:24;3265:5;3247:24;:::i;:::-;3240:5;3237:35;3227:63;;3286:1;3283;3276:12;3227:63;3174:122;:::o;3302:139::-;3348:5;3386:6;3373:20;3364:29;;3402:33;3429:5;3402:33;:::i;:::-;3302:139;;;;:::o;3447:474::-;3515:6;3523;3572:2;3560:9;3551:7;3547:23;3543:32;3540:119;;;3578:79;;:::i;:::-;3540:119;3698:1;3723:53;3768:7;3759:6;3748:9;3744:22;3723:53;:::i;:::-;3713:63;;3669:117;3825:2;3851:53;3896:7;3887:6;3876:9;3872:22;3851:53;:::i;:::-;3841:63;;3796:118;3447:474;;;;;:::o;3927:90::-;3961:7;4004:5;3997:13;3990:21;3979:32;;3927:90;;;:::o;4023:109::-;4104:21;4119:5;4104:21;:::i;:::-;4099:3;4092:34;4023:109;;:::o;4138:210::-;4225:4;4263:2;4252:9;4248:18;4240:26;;4276:65;4338:1;4327:9;4323:17;4314:6;4276:65;:::i;:::-;4138:210;;;;:::o;4354:118::-;4441:24;4459:5;4441:24;:::i;:::-;4436:3;4429:37;4354:118;;:::o;4478:222::-;4571:4;4609:2;4598:9;4594:18;4586:26;;4622:71;4690:1;4679:9;4675:17;4666:6;4622:71;:::i;:::-;4478:222;;;;:::o;4706:117::-;4815:1;4812;4805:12;4829:117;4938:1;4935;4928:12;4952:117;5061:1;5058;5051:12;5092:568;5165:8;5175:6;5225:3;5218:4;5210:6;5206:17;5202:27;5192:122;;5233:79;;:::i;:::-;5192:122;5346:6;5333:20;5323:30;;5376:18;5368:6;5365:30;5362:117;;;5398:79;;:::i;:::-;5362:117;5512:4;5504:6;5500:17;5488:29;;5566:3;5558:4;5550:6;5546:17;5536:8;5532:32;5529:41;5526:128;;;5573:79;;:::i;:::-;5526:128;5092:568;;;;;:::o;5683:::-;5756:8;5766:6;5816:3;5809:4;5801:6;5797:17;5793:27;5783:122;;5824:79;;:::i;:::-;5783:122;5937:6;5924:20;5914:30;;5967:18;5959:6;5956:30;5953:117;;;5989:79;;:::i;:::-;5953:117;6103:4;6095:6;6091:17;6079:29;;6157:3;6149:4;6141:6;6137:17;6127:8;6123:32;6120:41;6117:128;;;6164:79;;:::i;:::-;6117:128;5683:568;;;;;:::o;6257:934::-;6379:6;6387;6395;6403;6452:2;6440:9;6431:7;6427:23;6423:32;6420:119;;;6458:79;;:::i;:::-;6420:119;6606:1;6595:9;6591:17;6578:31;6636:18;6628:6;6625:30;6622:117;;;6658:79;;:::i;:::-;6622:117;6771:80;6843:7;6834:6;6823:9;6819:22;6771:80;:::i;:::-;6753:98;;;;6549:312;6928:2;6917:9;6913:18;6900:32;6959:18;6951:6;6948:30;6945:117;;;6981:79;;:::i;:::-;6945:117;7094:80;7166:7;7157:6;7146:9;7142:22;7094:80;:::i;:::-;7076:98;;;;6871:313;6257:934;;;;;;;:::o;7197:329::-;7256:6;7305:2;7293:9;7284:7;7280:23;7276:32;7273:119;;;7311:79;;:::i;:::-;7273:119;7431:1;7456:53;7501:7;7492:6;7481:9;7477:22;7456:53;:::i;:::-;7446:63;;7402:117;7197:329;;;;:::o;7532:619::-;7609:6;7617;7625;7674:2;7662:9;7653:7;7649:23;7645:32;7642:119;;;7680:79;;:::i;:::-;7642:119;7800:1;7825:53;7870:7;7861:6;7850:9;7846:22;7825:53;:::i;:::-;7815:63;;7771:117;7927:2;7953:53;7998:7;7989:6;7978:9;7974:22;7953:53;:::i;:::-;7943:63;;7898:118;8055:2;8081:53;8126:7;8117:6;8106:9;8102:22;8081:53;:::i;:::-;8071:63;;8026:118;7532:619;;;;;:::o;8157:86::-;8192:7;8232:4;8225:5;8221:16;8210:27;;8157:86;;;:::o;8249:112::-;8332:22;8348:5;8332:22;:::i;:::-;8327:3;8320:35;8249:112;;:::o;8367:214::-;8456:4;8494:2;8483:9;8479:18;8471:26;;8507:67;8571:1;8560:9;8556:17;8547:6;8507:67;:::i;:::-;8367:214;;;;:::o;8587:180::-;8635:77;8632:1;8625:88;8732:4;8729:1;8722:15;8756:4;8753:1;8746:15;8773:281;8856:27;8878:4;8856:27;:::i;:::-;8848:6;8844:40;8986:6;8974:10;8971:22;8950:18;8938:10;8935:34;8932:62;8929:88;;;8997:18;;:::i;:::-;8929:88;9037:10;9033:2;9026:22;8816:238;8773:281;;:::o;9060:129::-;9094:6;9121:20;;:::i;:::-;9111:30;;9150:33;9178:4;9170:6;9150:33;:::i;:::-;9060:129;;;:::o;9195:311::-;9272:4;9362:18;9354:6;9351:30;9348:56;;;9384:18;;:::i;:::-;9348:56;9434:4;9426:6;9422:17;9414:25;;9494:4;9488;9484:15;9476:23;;9195:311;;;:::o;9529:710::-;9625:5;9650:81;9666:64;9723:6;9666:64;:::i;:::-;9650:81;:::i;:::-;9641:90;;9751:5;9780:6;9773:5;9766:21;9814:4;9807:5;9803:16;9796:23;;9867:4;9859:6;9855:17;9847:6;9843:30;9896:3;9888:6;9885:15;9882:122;;;9915:79;;:::i;:::-;9882:122;10030:6;10013:220;10047:6;10042:3;10039:15;10013:220;;;10122:3;10151:37;10184:3;10172:10;10151:37;:::i;:::-;10146:3;10139:50;10218:4;10213:3;10209:14;10202:21;;10089:144;10073:4;10068:3;10064:14;10057:21;;10013:220;;;10017:21;9631:608;;9529:710;;;;;:::o;10262:370::-;10333:5;10382:3;10375:4;10367:6;10363:17;10359:27;10349:122;;10390:79;;:::i;:::-;10349:122;10507:6;10494:20;10532:94;10622:3;10614:6;10607:4;10599:6;10595:17;10532:94;:::i;:::-;10523:103;;10339:293;10262:370;;;;:::o;10638:539::-;10722:6;10771:2;10759:9;10750:7;10746:23;10742:32;10739:119;;;10777:79;;:::i;:::-;10739:119;10925:1;10914:9;10910:17;10897:31;10955:18;10947:6;10944:30;10941:117;;;10977:79;;:::i;:::-;10941:117;11082:78;11152:7;11143:6;11132:9;11128:22;11082:78;:::i;:::-;11072:88;;10868:302;10638:539;;;;:::o;11183:329::-;11242:6;11291:2;11279:9;11270:7;11266:23;11262:32;11259:119;;;11297:79;;:::i;:::-;11259:119;11417:1;11442:53;11487:7;11478:6;11467:9;11463:22;11442:53;:::i;:::-;11432:63;;11388:117;11183:329;;;;:::o;11518:104::-;11563:7;11592:24;11610:5;11592:24;:::i;:::-;11581:35;;11518:104;;;:::o;11628:138::-;11709:32;11735:5;11709:32;:::i;:::-;11702:5;11699:43;11689:71;;11756:1;11753;11746:12;11689:71;11628:138;:::o;11772:155::-;11826:5;11864:6;11851:20;11842:29;;11880:41;11915:5;11880:41;:::i;:::-;11772:155;;;;:::o;11933:116::-;12003:21;12018:5;12003:21;:::i;:::-;11996:5;11993:32;11983:60;;12039:1;12036;12029:12;11983:60;11933:116;:::o;12055:133::-;12098:5;12136:6;12123:20;12114:29;;12152:30;12176:5;12152:30;:::i;:::-;12055:133;;;;:::o;12194:484::-;12267:6;12275;12324:2;12312:9;12303:7;12299:23;12295:32;12292:119;;;12330:79;;:::i;:::-;12292:119;12450:1;12475:61;12528:7;12519:6;12508:9;12504:22;12475:61;:::i;:::-;12465:71;;12421:125;12585:2;12611:50;12653:7;12644:6;12633:9;12629:22;12611:50;:::i;:::-;12601:60;;12556:115;12194:484;;;;;:::o;12684:118::-;12771:24;12789:5;12771:24;:::i;:::-;12766:3;12759:37;12684:118;;:::o;12808:222::-;12901:4;12939:2;12928:9;12924:18;12916:26;;12952:71;13020:1;13009:9;13005:17;12996:6;12952:71;:::i;:::-;12808:222;;;;:::o;13036:474::-;13104:6;13112;13161:2;13149:9;13140:7;13136:23;13132:32;13129:119;;;13167:79;;:::i;:::-;13129:119;13287:1;13312:53;13357:7;13348:6;13337:9;13333:22;13312:53;:::i;:::-;13302:63;;13258:117;13414:2;13440:53;13485:7;13476:6;13465:9;13461:22;13440:53;:::i;:::-;13430:63;;13385:118;13036:474;;;;;:::o;13516:76::-;13552:7;13581:5;13570:16;;13516:76;;;:::o;13598:115::-;13683:23;13700:5;13683:23;:::i;:::-;13678:3;13671:36;13598:115;;:::o;13719:989::-;14004:4;14042:3;14031:9;14027:19;14019:27;;14056:71;14124:1;14113:9;14109:17;14100:6;14056:71;:::i;:::-;14137:70;14203:2;14192:9;14188:18;14179:6;14137:70;:::i;:::-;14217;14283:2;14272:9;14268:18;14259:6;14217:70;:::i;:::-;14297:72;14365:2;14354:9;14350:18;14341:6;14297:72;:::i;:::-;14379:73;14447:3;14436:9;14432:19;14423:6;14379:73;:::i;:::-;14462;14530:3;14519:9;14515:19;14506:6;14462:73;:::i;:::-;14545;14613:3;14602:9;14598:19;14589:6;14545:73;:::i;:::-;14628;14696:3;14685:9;14681:19;14672:6;14628:73;:::i;:::-;13719:989;;;;;;;;;;;:::o;14714:442::-;14863:4;14901:2;14890:9;14886:18;14878:26;;14914:71;14982:1;14971:9;14967:17;14958:6;14914:71;:::i;:::-;14995:72;15063:2;15052:9;15048:18;15039:6;14995:72;:::i;:::-;15077;15145:2;15134:9;15130:18;15121:6;15077:72;:::i;:::-;14714:442;;;;;;:::o;15162:143::-;15219:5;15250:6;15244:13;15235:22;;15266:33;15293:5;15266:33;:::i;:::-;15162:143;;;;:::o;15311:351::-;15381:6;15430:2;15418:9;15409:7;15405:23;15401:32;15398:119;;;15436:79;;:::i;:::-;15398:119;15556:1;15581:64;15637:7;15628:6;15617:9;15613:22;15581:64;:::i;:::-;15571:74;;15527:128;15311:351;;;;:::o;15668:180::-;15716:77;15713:1;15706:88;15813:4;15810:1;15803:15;15837:4;15834:1;15827:15;15854:180;15902:77;15899:1;15892:88;15999:4;15996:1;15989:15;16023:4;16020:1;16013:15;16040:185;16080:1;16097:20;16115:1;16097:20;:::i;:::-;16092:25;;16131:20;16149:1;16131:20;:::i;:::-;16126:25;;16170:1;16160:35;;16175:18;;:::i;:::-;16160:35;16217:1;16214;16210:9;16205:14;;16040:185;;;;:::o;16231:180::-;16279:77;16276:1;16269:88;16376:4;16373:1;16366:15;16400:4;16397:1;16390:15;16417:320;16461:6;16498:1;16492:4;16488:12;16478:22;;16545:1;16539:4;16535:12;16566:18;16556:81;;16622:4;16614:6;16610:17;16600:27;;16556:81;16684:2;16676:6;16673:14;16653:18;16650:38;16647:84;;16703:18;;:::i;:::-;16647:84;16468:269;16417:320;;;:::o;16743:182::-;16883:34;16879:1;16871:6;16867:14;16860:58;16743:182;:::o;16931:366::-;17073:3;17094:67;17158:2;17153:3;17094:67;:::i;:::-;17087:74;;17170:93;17259:3;17170:93;:::i;:::-;17288:2;17283:3;17279:12;17272:19;;16931:366;;;:::o;17303:419::-;17469:4;17507:2;17496:9;17492:18;17484:26;;17556:9;17550:4;17546:20;17542:1;17531:9;17527:17;17520:47;17584:131;17710:4;17584:131;:::i;:::-;17576:139;;17303:419;;;:::o;17728:180::-;17776:77;17773:1;17766:88;17873:4;17870:1;17863:15;17897:4;17894:1;17887:15;17914:348;17954:7;17977:20;17995:1;17977:20;:::i;:::-;17972:25;;18011:20;18029:1;18011:20;:::i;:::-;18006:25;;18199:1;18131:66;18127:74;18124:1;18121:81;18116:1;18109:9;18102:17;18098:105;18095:131;;;18206:18;;:::i;:::-;18095:131;18254:1;18251;18247:9;18236:20;;17914:348;;;;:::o;18268:332::-;18389:4;18427:2;18416:9;18412:18;18404:26;;18440:71;18508:1;18497:9;18493:17;18484:6;18440:71;:::i;:::-;18521:72;18589:2;18578:9;18574:18;18565:6;18521:72;:::i;:::-;18268:332;;;;;:::o;18606:233::-;18645:3;18668:24;18686:5;18668:24;:::i;:::-;18659:33;;18714:66;18707:5;18704:77;18701:103;;18784:18;;:::i;:::-;18701:103;18831:1;18824:5;18820:13;18813:20;;18606:233;;;:::o;18845:227::-;18985:34;18981:1;18973:6;18969:14;18962:58;19054:10;19049:2;19041:6;19037:15;19030:35;18845:227;:::o;19078:366::-;19220:3;19241:67;19305:2;19300:3;19241:67;:::i;:::-;19234:74;;19317:93;19406:3;19317:93;:::i;:::-;19435:2;19430:3;19426:12;19419:19;;19078:366;;;:::o;19450:419::-;19616:4;19654:2;19643:9;19639:18;19631:26;;19703:9;19697:4;19693:20;19689:1;19678:9;19674:17;19667:47;19731:131;19857:4;19731:131;:::i;:::-;19723:139;;19450:419;;;:::o;19875:137::-;19929:5;19960:6;19954:13;19945:22;;19976:30;20000:5;19976:30;:::i;:::-;19875:137;;;;:::o;20018:345::-;20085:6;20134:2;20122:9;20113:7;20109:23;20105:32;20102:119;;;20140:79;;:::i;:::-;20102:119;20260:1;20285:61;20338:7;20329:6;20318:9;20314:22;20285:61;:::i;:::-;20275:71;;20231:125;20018:345;;;;:::o;20369:191::-;20409:3;20428:20;20446:1;20428:20;:::i;:::-;20423:25;;20462:20;20480:1;20462:20;:::i;:::-;20457:25;;20505:1;20502;20498:9;20491:16;;20526:3;20523:1;20520:10;20517:36;;;20533:18;;:::i;:::-;20517:36;20369:191;;;;:::o;20566:102::-;20608:8;20655:5;20652:1;20648:13;20627:34;;20566:102;;;:::o;20674:848::-;20735:5;20742:4;20766:6;20757:15;;20790:5;20781:14;;20804:712;20825:1;20815:8;20812:15;20804:712;;;20920:4;20915:3;20911:14;20905:4;20902:24;20899:50;;;20929:18;;:::i;:::-;20899:50;20979:1;20969:8;20965:16;20962:451;;;21394:4;21387:5;21383:16;21374:25;;20962:451;21444:4;21438;21434:15;21426:23;;21474:32;21497:8;21474:32;:::i;:::-;21462:44;;20804:712;;;20674:848;;;;;;;:::o;21528:1073::-;21582:5;21773:8;21763:40;;21794:1;21785:10;;21796:5;;21763:40;21822:4;21812:36;;21839:1;21830:10;;21841:5;;21812:36;21908:4;21956:1;21951:27;;;;21992:1;21987:191;;;;21901:277;;21951:27;21969:1;21960:10;;21971:5;;;21987:191;22032:3;22022:8;22019:17;22016:43;;;22039:18;;:::i;:::-;22016:43;22088:8;22085:1;22081:16;22072:25;;22123:3;22116:5;22113:14;22110:40;;;22130:18;;:::i;:::-;22110:40;22163:5;;;21901:277;;22287:2;22277:8;22274:16;22268:3;22262:4;22259:13;22255:36;22237:2;22227:8;22224:16;22219:2;22213:4;22210:12;22206:35;22190:111;22187:246;;;22343:8;22337:4;22333:19;22324:28;;22378:3;22371:5;22368:14;22365:40;;;22385:18;;:::i;:::-;22365:40;22418:5;;22187:246;22458:42;22496:3;22486:8;22480:4;22477:1;22458:42;:::i;:::-;22443:57;;;;22532:4;22527:3;22523:14;22516:5;22513:25;22510:51;;;22541:18;;:::i;:::-;22510:51;22590:4;22583:5;22579:16;22570:25;;21528:1073;;;;;;:::o;22607:281::-;22665:5;22689:23;22707:4;22689:23;:::i;:::-;22681:31;;22733:25;22749:8;22733:25;:::i;:::-;22721:37;;22777:104;22814:66;22804:8;22798:4;22777:104;:::i;:::-;22768:113;;22607:281;;;;:::o;22894:143::-;22951:5;22982:6;22976:13;22967:22;;22998:33;23025:5;22998:33;:::i;:::-;22894:143;;;;:::o;23043:351::-;23113:6;23162:2;23150:9;23141:7;23137:23;23133:32;23130:119;;;23168:79;;:::i;:::-;23130:119;23288:1;23313:64;23369:7;23360:6;23349:9;23345:22;23313:64;:::i;:::-;23303:74;;23259:128;23043:351;;;;:::o;23400:85::-;23445:7;23474:5;23463:16;;23400:85;;;:::o;23491:158::-;23549:9;23582:61;23600:42;23609:32;23635:5;23609:32;:::i;:::-;23600:42;:::i;:::-;23582:61;:::i;:::-;23569:74;;23491:158;;;:::o;23655:147::-;23750:45;23789:5;23750:45;:::i;:::-;23745:3;23738:58;23655:147;;:::o;23808:114::-;23875:6;23909:5;23903:12;23893:22;;23808:114;;;:::o;23928:184::-;24027:11;24061:6;24056:3;24049:19;24101:4;24096:3;24092:14;24077:29;;23928:184;;;;:::o;24118:132::-;24185:4;24208:3;24200:11;;24238:4;24233:3;24229:14;24221:22;;24118:132;;;:::o;24256:108::-;24333:24;24351:5;24333:24;:::i;:::-;24328:3;24321:37;24256:108;;:::o;24370:179::-;24439:10;24460:46;24502:3;24494:6;24460:46;:::i;:::-;24538:4;24533:3;24529:14;24515:28;;24370:179;;;;:::o;24555:113::-;24625:4;24657;24652:3;24648:14;24640:22;;24555:113;;;:::o;24704:732::-;24823:3;24852:54;24900:5;24852:54;:::i;:::-;24922:86;25001:6;24996:3;24922:86;:::i;:::-;24915:93;;25032:56;25082:5;25032:56;:::i;:::-;25111:7;25142:1;25127:284;25152:6;25149:1;25146:13;25127:284;;;25228:6;25222:13;25255:63;25314:3;25299:13;25255:63;:::i;:::-;25248:70;;25341:60;25394:6;25341:60;:::i;:::-;25331:70;;25187:224;25174:1;25171;25167:9;25162:14;;25127:284;;;25131:14;25427:3;25420:10;;24828:608;;;24704:732;;;;:::o;25442:720::-;25677:4;25715:3;25704:9;25700:19;25692:27;;25729:79;25805:1;25794:9;25790:17;25781:6;25729:79;:::i;:::-;25855:9;25849:4;25845:20;25840:2;25829:9;25825:18;25818:48;25883:108;25986:4;25977:6;25883:108;:::i;:::-;25875:116;;26001:72;26069:2;26058:9;26054:18;26045:6;26001:72;:::i;:::-;26083;26151:2;26140:9;26136:18;26127:6;26083:72;:::i;:::-;25442:720;;;;;;;:::o;26168:238::-;26308:34;26304:1;26296:6;26292:14;26285:58;26377:21;26372:2;26364:6;26360:15;26353:46;26168:238;:::o;26412:366::-;26554:3;26575:67;26639:2;26634:3;26575:67;:::i;:::-;26568:74;;26651:93;26740:3;26651:93;:::i;:::-;26769:2;26764:3;26760:12;26753:19;;26412:366;;;:::o;26784:419::-;26950:4;26988:2;26977:9;26973:18;26965:26;;27037:9;27031:4;27027:20;27023:1;27012:9;27008:17;27001:47;27065:131;27191:4;27065:131;:::i;:::-;27057:139;;26784:419;;;:::o;27209:224::-;27349:34;27345:1;27337:6;27333:14;27326:58;27418:7;27413:2;27405:6;27401:15;27394:32;27209:224;:::o;27439:366::-;27581:3;27602:67;27666:2;27661:3;27602:67;:::i;:::-;27595:74;;27678:93;27767:3;27678:93;:::i;:::-;27796:2;27791:3;27787:12;27780:19;;27439:366;;;:::o;27811:419::-;27977:4;28015:2;28004:9;28000:18;27992:26;;28064:9;28058:4;28054:20;28050:1;28039:9;28035:17;28028:47;28092:131;28218:4;28092:131;:::i;:::-;28084:139;;27811:419;;;:::o;28236:225::-;28376:34;28372:1;28364:6;28360:14;28353:58;28445:8;28440:2;28432:6;28428:15;28421:33;28236:225;:::o;28467:366::-;28609:3;28630:67;28694:2;28689:3;28630:67;:::i;:::-;28623:74;;28706:93;28795:3;28706:93;:::i;:::-;28824:2;28819:3;28815:12;28808:19;;28467:366;;;:::o;28839:419::-;29005:4;29043:2;29032:9;29028:18;29020:26;;29092:9;29086:4;29082:20;29078:1;29067:9;29063:17;29056:47;29120:131;29246:4;29120:131;:::i;:::-;29112:139;;28839:419;;;:::o;29264:120::-;29336:23;29353:5;29336:23;:::i;:::-;29329:5;29326:34;29316:62;;29374:1;29371;29364:12;29316:62;29264:120;:::o;29390:141::-;29446:5;29477:6;29471:13;29462:22;;29493:32;29519:5;29493:32;:::i;:::-;29390:141;;;;:::o;29537:349::-;29606:6;29655:2;29643:9;29634:7;29630:23;29626:32;29623:119;;;29661:79;;:::i;:::-;29623:119;29781:1;29806:63;29861:7;29852:6;29841:9;29837:22;29806:63;:::i;:::-;29796:73;;29752:127;29537:349;;;;:::o;29892:220::-;30032:34;30028:1;30020:6;30016:14;30009:58;30101:3;30096:2;30088:6;30084:15;30077:28;29892:220;:::o;30118:366::-;30260:3;30281:67;30345:2;30340:3;30281:67;:::i;:::-;30274:74;;30357:93;30446:3;30357:93;:::i;:::-;30475:2;30470:3;30466:12;30459:19;;30118:366;;;:::o;30490:419::-;30656:4;30694:2;30683:9;30679:18;30671:26;;30743:9;30737:4;30733:20;30729:1;30718:9;30714:17;30707:47;30771:131;30897:4;30771:131;:::i;:::-;30763:139;;30490:419;;;:::o;30915:177::-;31055:29;31051:1;31043:6;31039:14;31032:53;30915:177;:::o;31098:366::-;31240:3;31261:67;31325:2;31320:3;31261:67;:::i;:::-;31254:74;;31337:93;31426:3;31337:93;:::i;:::-;31455:2;31450:3;31446:12;31439:19;;31098:366;;;:::o;31470:419::-;31636:4;31674:2;31663:9;31659:18;31651:26;;31723:9;31717:4;31713:20;31709:1;31698:9;31694:17;31687:47;31751:131;31877:4;31751:131;:::i;:::-;31743:139;;31470:419;;;:::o;31895:223::-;32035:34;32031:1;32023:6;32019:14;32012:58;32104:6;32099:2;32091:6;32087:15;32080:31;31895:223;:::o;32124:366::-;32266:3;32287:67;32351:2;32346:3;32287:67;:::i;:::-;32280:74;;32363:93;32452:3;32363:93;:::i;:::-;32481:2;32476:3;32472:12;32465:19;;32124:366;;;:::o;32496:419::-;32662:4;32700:2;32689:9;32685:18;32677:26;;32749:9;32743:4;32739:20;32735:1;32724:9;32720:17;32713:47;32777:131;32903:4;32777:131;:::i;:::-;32769:139;;32496:419;;;:::o;32921:221::-;33061:34;33057:1;33049:6;33045:14;33038:58;33130:4;33125:2;33117:6;33113:15;33106:29;32921:221;:::o;33148:366::-;33290:3;33311:67;33375:2;33370:3;33311:67;:::i;:::-;33304:74;;33387:93;33476:3;33387:93;:::i;:::-;33505:2;33500:3;33496:12;33489:19;;33148:366;;;:::o;33520:419::-;33686:4;33724:2;33713:9;33709:18;33701:26;;33773:9;33767:4;33763:20;33759:1;33748:9;33744:17;33737:47;33801:131;33927:4;33801:131;:::i;:::-;33793:139;;33520:419;;;:::o;33945:375::-;33984:3;34003:19;34020:1;34003:19;:::i;:::-;33998:24;;34036:19;34053:1;34036:19;:::i;:::-;34031:24;;34078:1;34075;34071:9;34064:16;;34276:1;34271:3;34267:11;34260:19;34256:1;34253;34249:9;34245:35;34228:1;34223:3;34219:11;34214:1;34211;34207:9;34200:17;34196:35;34180:110;34177:136;;;34293:18;;:::i;:::-;34177:136;33945:375;;;;:::o;34326:134::-;34384:9;34417:37;34448:5;34417:37;:::i;:::-;34404:50;;34326:134;;;:::o;34466:147::-;34561:45;34600:5;34561:45;:::i;:::-;34556:3;34549:58;34466:147;;:::o;34619:348::-;34748:4;34786:2;34775:9;34771:18;34763:26;;34799:79;34875:1;34864:9;34860:17;34851:6;34799:79;:::i;:::-;34888:72;34956:2;34945:9;34941:18;34932:6;34888:72;:::i;:::-;34619:348;;;;;:::o;34973:194::-;35013:4;35033:20;35051:1;35033:20;:::i;:::-;35028:25;;35067:20;35085:1;35067:20;:::i;:::-;35062:25;;35111:1;35108;35104:9;35096:17;;35135:1;35129:4;35126:11;35123:37;;;35140:18;;:::i;:::-;35123:37;34973:194;;;;:::o;35173:372::-;35212:4;35232:19;35249:1;35232:19;:::i;:::-;35227:24;;35265:19;35282:1;35265:19;:::i;:::-;35260:24;;35308:1;35305;35301:9;35293:17;;35502:1;35496:4;35492:12;35488:1;35485;35481:9;35477:28;35460:1;35454:4;35450:12;35445:1;35442;35438:9;35431:17;35427:36;35411:104;35408:130;;;35518:18;;:::i;:::-;35408:130;35173:372;;;;:::o;35551:181::-;35691:33;35687:1;35679:6;35675:14;35668:57;35551:181;:::o;35738:366::-;35880:3;35901:67;35965:2;35960:3;35901:67;:::i;:::-;35894:74;;35977:93;36066:3;35977:93;:::i;:::-;36095:2;36090:3;36086:12;36079:19;;35738:366;;;:::o;36110:419::-;36276:4;36314:2;36303:9;36299:18;36291:26;;36363:9;36357:4;36353:20;36349:1;36338:9;36334:17;36327:47;36391:131;36517:4;36391:131;:::i;:::-;36383:139;;36110:419;;;:::o;36535:220::-;36675:34;36671:1;36663:6;36659:14;36652:58;36744:3;36739:2;36731:6;36727:15;36720:28;36535:220;:::o;36761:366::-;36903:3;36924:67;36988:2;36983:3;36924:67;:::i;:::-;36917:74;;37000:93;37089:3;37000:93;:::i;:::-;37118:2;37113:3;37109:12;37102:19;;36761:366;;;:::o;37133:419::-;37299:4;37337:2;37326:9;37322:18;37314:26;;37386:9;37380:4;37376:20;37372:1;37361:9;37357:17;37350:47;37414:131;37540:4;37414:131;:::i;:::-;37406:139;;37133:419;;;:::o
Swarm Source
ipfs://82fe14c4977beaf7dcb3d0f23500e38a1c2d94e49497ac35213366095632c9e9
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.