Feature Tip: Add private address tag to any address under My Name Tag !
ERC-20
DeFi
Overview
Max Total Supply
4,782,734,520,899,976 EV3
Holders
222 (0.00%)
Total Transfers
-
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 0 Decimals)
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
ShibaDogePredator
Compiler Version
v0.8.12+commit.f00d7308
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-05-09 */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.11; // ############################################################################################################################# // ####################################### I M P O R T - E X T E R N A L - L I B R A R Y ####################################### // We are using an external library to secure/optimize the contract, please check the github release for further information // this code is not provided by us, but deemed secure by the community // source: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Context.sol /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // #################################################### I M P O R T - E N D #################################################### // ############################################################################################################################# // ############################################################################################################################# // ####################################### I M P O R T - E X T E R N A L - L I B R A R Y ####################################### // We are using an external library to secure/optimize the contract, please check the github release for further information // this code is not provided by us, but deemed secure by the community // source: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/math/SafeMath.sol // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // 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 (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @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) { return a + b; } /** * @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 a - b; } /** * @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) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting 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 a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting 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) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * 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) { unchecked { require(b > 0, errorMessage); return a % b; } } } // #################################################### I M P O R T - E N D #################################################### // ############################################################################################################################# // ############################################################################################################################# // ####################################### I M P O R T - E X T E R N A L - L I B R A R Y ####################################### // We are using an external library to secure/optimize the contract, please check the github release for further information // this code is not provided by us, but deemed secure by the community // source: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Address.sol /** * @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) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @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"); (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"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { 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 assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // #################################################### I M P O R T - E N D #################################################### // ############################################################################################################################# // ############################################################################################################################# // ####################################### I M P O R T - E X T E R N A L - L I B R A R Y ####################################### // We are using an external library to secure/optimize the contract, please check the github release for further information // this code is not provided by us, but deemed secure by the community // source: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/proxy/Proxy.sol /** * @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. */ abstract 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() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "[error][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 { _transferOwnership(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), "[error][ownable] new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // #################################################### I M P O R T - E N D #################################################### // ############################################################################################################################# // ############################################################################################################################# // ####################################### I M P O R T - E X T E R N A L - L I B R A R Y ####################################### // We are using an external library to secure/optimize the contract, please check the github release for further information // this code is not provided by us, but deemed secure by the community // source: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/security/ReentrancyGuard.sol /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // #################################################### I M P O R T - E N D #################################################### // ############################################################################################################################# // ############################################################################################################################# // ####################################### I M P O R T - E X T E R N A L - L I B R A R Y ####################################### // We are using an external library to secure/optimize the contract, please check the github release for further information // this code is not provided by us, but deemed secure by the community // source: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/ERC20.sol /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } // #################################################### I M P O R T - E N D #################################################### // ############################################################################################################################# // ############################################################################################################################# // ####################################### I M P O R T - E X T E R N A L - L I B R A R Y ####################################### // We are using an external library to secure/optimize the contract, please check the github release for further information // this code is not provided by us, but deemed secure by the community // source: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/ERC20.sol /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin Contracts guidelines: functions revert * instead returning `false` on failure. This behavior is nonetheless * conventional and does not conflict with the expectations of ERC20 * applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ abstract contract ERC20 is Context, IERC20, IERC20Metadata { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The default value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless this function is * overridden; * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public virtual override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(_msgSender(), spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * Requirements: * * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for ``sender``'s tokens of at least * `amount`. */ function transferFrom( address sender, address recipient, uint256 amount ) public virtual override returns (bool) { _transfer(sender, recipient, amount); uint256 currentAllowance = _allowances[sender][_msgSender()]; require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance"); unchecked { _approve(sender, _msgSender(), currentAllowance - amount); } return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { uint256 currentAllowance = _allowances[_msgSender()][spender]; require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(_msgSender(), spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `sender` to `recipient`. * * This internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer( address sender, address recipient, uint256 amount ) internal virtual { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(sender, recipient, amount); uint256 senderBalance = _balances[sender]; require(senderBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[sender] = senderBalance - amount; } _balances[recipient] += amount; emit Transfer(sender, recipient, amount); _afterTokenTransfer(sender, recipient, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; _balances[account] += amount; emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; } _totalSupply -= amount; emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve( address owner, address spender, uint256 amount ) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 amount ) internal virtual {} } // #################################################### I M P O R T - E N D #################################################### // ############################################################################################################################# // ############################################################################################################################# // ####################################### I M P O R T - E X T E R N A L - L I B R A R Y ####################################### // We are using an external library to secure/optimize the contract, please check the github release for further information // this code is not provided by us, but deemed secure by the community interface IUniswapV2Factory { event PairCreated(address indexed token0, address indexed token1, address pair, uint); function feeTo() external view returns (address); function feeToSetter() external view returns (address); function getPair(address tokenA, address tokenB) external view returns (address pair); function allPairs(uint) external view returns (address pair); function allPairsLength() external view returns (uint); function createPair(address tokenA, address tokenB) external returns (address pair); function setFeeTo(address) external; function setFeeToSetter(address) external; } interface IUniswapV2Pair { event Approval(address indexed owner, address indexed spender, uint value); event Transfer(address indexed from, address indexed to, uint value); function name() external pure returns (string memory); function symbol() external pure returns (string memory); function decimals() external pure returns (uint8); function totalSupply() external view returns (uint); function balanceOf(address owner) external view returns (uint); function allowance(address owner, address spender) external view returns (uint); function approve(address spender, uint value) external returns (bool); function transfer(address to, uint value) external returns (bool); function transferFrom(address from, address to, uint value) external returns (bool); function DOMAIN_SEPARATOR() external view returns (bytes32); function PERMIT_TYPEHASH() external pure returns (bytes32); function nonces(address owner) external view returns (uint); function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external; event Mint(address indexed sender, uint amount0, uint amount1); event Burn(address indexed sender, uint amount0, uint amount1, address indexed to); event Swap( address indexed sender, uint amount0In, uint amount1In, uint amount0Out, uint amount1Out, address indexed to ); event Sync(uint112 reserve0, uint112 reserve1); function MINIMUM_LIQUIDITY() external pure returns (uint); function factory() external view returns (address); function token0() external view returns (address); function token1() external view returns (address); function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast); function price0CumulativeLast() external view returns (uint); function price1CumulativeLast() external view returns (uint); function kLast() external view returns (uint); function mint(address to) external returns (uint liquidity); function burn(address to) external returns (uint amount0, uint amount1); function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external; function skim(address to) external; function sync() external; function initialize(address, address) external; } interface IUniswapV2Router01 { function factory() external pure returns (address); function WETH() external pure returns (address); function addLiquidity( address tokenA, address tokenB, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB, uint liquidity); function addLiquidityETH( address token, uint amountTokenDesired, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external payable returns (uint amountToken, uint amountETH, uint liquidity); function removeLiquidity( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB); function removeLiquidityETH( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountToken, uint amountETH); function removeLiquidityWithPermit( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountA, uint amountB); function removeLiquidityETHWithPermit( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountToken, uint amountETH); function swapExactTokensForTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapTokensForExactTokens( uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB); function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut); function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn); function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts); function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts); } interface IUniswapV2Router02 is IUniswapV2Router01 { function removeLiquidityETHSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountETH); function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountETH); function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; function swapExactETHForTokensSupportingFeeOnTransferTokens( uint amountOutMin, address[] calldata path, address to, uint deadline ) external payable; function swapExactTokensForETHSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; } // #################################################### I M P O R T - E N D #################################################### // ############################################################################################################################# abstract contract RoleBasedAccessControl is Context, Ownable{ mapping(string => mapping(address => bool)) private _roleToAddress; mapping(string => bool) private _role; string[] _roles; // modifiers modifier onlyRole(string memory pRole){ require(_roleToAddress[pRole][_msgSender()], "[error][role based access control] only addresses assigned this role can access this function!"); _; } modifier onlyRoles(string[] memory pRoles){ for(uint256 i=0; i<pRoles.length; i++){ require(_roleToAddress[pRoles[i]][_msgSender()], "[error][role based access control] only addresses assigned this role can access this function!"); } _; } modifier onlyRolesOr(string[] memory pRoles){ bool rolePresent = false; for(uint256 i=0; i<pRoles.length; i++){ rolePresent = rolePresent || _roleToAddress[pRoles[i]][_msgSender()]; } require(rolePresent, "[error][role based access control] only addresses assigned this role can access this function!"); _; } modifier onlyRoleOrOwner(string memory pRole){ require(_roleToAddress[pRole][_msgSender()] || owner() == _msgSender(), "[error][role based access control] only addresses assigned this role or the owner can access this function!"); _; } // register new roles function registerRole(string memory pRole) public virtual onlyRoleOrOwner("root"){ _addRole(pRole); } function registerRoleAddresses(string memory pRole, address[] memory pMembers) public virtual onlyRoleOrOwner("root"){ _addRole(pRole); for(uint256 i=0; i<pMembers.length; i++){ _roleToAddress[pRole][pMembers[i]] = true; } } function registerRoleAddress(string memory pRole, address pMember) public virtual onlyRoleOrOwner("root"){ _addRole(pRole); _roleToAddress[pRole][pMember] = true; } function removeRoleAddress(string memory pRole, address pMember) public virtual onlyRoleOrOwner("root"){ _addRole(pRole); _roleToAddress[pRole][pMember] = false; } // add function addRoleAddress(string memory pRole, address pMember) public virtual onlyRoleOrOwner("root"){ _addRole(pRole); _roleToAddress[pRole][pMember] = true; } // get function hasRoleAddress(string memory pRole, address pAddress) public virtual returns(bool){ return(_roleToAddress[pRole][pAddress]); } // privates function _addRole(string memory pRole) private{ if(!_role[pRole]){ _role[pRole] = true; _roles.push(pRole); } } } contract Util is RoleBasedAccessControl{ // libraries using SafeMath for uint256; // interfaces ERC20 private _token; // storage mapping(string => mapping(address => bool)) private _paramForAddressIsBool; mapping(string => bytes32) private _stringCompare; mapping(string => bool) private _stringCompareList; mapping(string => uint256) private _commonStats; // constants uint256 private _floatingPointPrecision = 10**16; // frontrunning uint8 private _frontrunIndex; uint256 private _frontrunMinETH = 1 * (10**18); bool[3] private _frontrunTransactionTypes; address[3] private _frontrunTransactionAddresses; uint256 private _frontrunTimeout; constructor(address pContract){ // set burn addresses _paramForAddressIsBool['burn'][address(0)] = true; _paramForAddressIsBool['burn'][address(0xdEaD)] = true; // set privileges registerRoleAddress("util", pContract); } // privileged // ███████╗███████╗███████╗███████╗███████╗███████╗███████╗███████╗███████╗███████╗███████╗███████╗███████╗███████╗███████╗███████╗███████╗███████╗███████╗ // ╚══════╝╚══════╝╚══════╝╚══════╝╚══════╝╚══════╝╚══════╝╚══════╝╚══════╝╚══════╝╚══════╝╚══════╝╚══════╝╚══════╝╚══════╝╚══════╝╚══════╝╚══════╝╚══════╝ function setParamForAddressBool(string memory pParam, address pAddress, bool pBool) public onlyRole("util"){ _paramForAddressIsBool[pParam][pAddress] = pBool; } function setParamForAddressesBool(string memory pParam, address[] memory pAddress, bool pBool) public onlyRole("util"){ for(uint256 i=0; i<pAddress.length; i++){ _paramForAddressIsBool[pParam][pAddress[i]] = pBool; } } // compare strings function _addStringCompare(string memory pString) private returns(bytes32){ _stringCompare[pString] = keccak256(bytes(pString)); _stringCompareList[pString] = true; return(_stringCompare[pString]); } function stringEq(string memory pA, string memory pB) public onlyRole("util") returns(bool){ bytes32 a = ( (_stringCompareList[pA]) ? _stringCompare[pA] : _addStringCompare(pA) ); bytes32 b = ( (_stringCompareList[pB]) ? _stringCompare[pB] : _addStringCompare(pB) ); if(a == b && b == a){ return(true); } return(false); } // stats function statsIncrease(string memory pStats, uint256 pValue) public onlyRole("util"){ _commonStats[pStats] = _commonStats[pStats].add(pValue); } function statsDecrease(string memory pStats, uint256 pValue) public onlyRole("util"){ if(_commonStats[pStats] >= pValue){ _commonStats[pStats] = _commonStats[pStats].sub(pValue); } } function stats(string memory pStats) public view returns(uint256){ return(_commonStats[pStats]); } // frontrunning function _isFrontrunTransaction(address pWallet, bool pBuy, bool pSell, uint256 pAmount) private returns(bool){ bool isFrontrunning = false; if(pAmount > 0){ _frontrunTransactionAddresses[_frontrunIndex] = pWallet; _frontrunTransactionTypes[_frontrunIndex] = pBuy; if(_frontrunIndex == 2 && pSell && (_frontrunTransactionTypes[0] && _frontrunTransactionTypes[1]) && (_frontrunTransactionAddresses[0] == _frontrunTransactionAddresses[2])){ if(block.timestamp.sub(_frontrunTimeout) <= 60){ isFrontrunning = true; } } _frontrunIndex++; _frontrunTimeout = block.timestamp; if(_frontrunIndex > 2){ _frontrunIndex = 0; } } return(isFrontrunning); } function frontrunning(address pFrom, address pTo, uint256 pAmount, bool pBuy, bool pSell) public onlyRole("util") returns(bool){ if(_isFrontrunTransaction(((pBuy && !pSell) ? pTo : pFrom), pBuy, pSell, pAmount)){ return(true); } return(false); } // public // ███████╗███████╗███████╗███████╗███████╗███████╗███████╗███████╗███████╗███████╗███████╗███████╗███████╗███████╗███████╗███████╗███████╗███████╗███████╗ // ╚══════╝╚══════╝╚══════╝╚══════╝╚══════╝╚══════╝╚══════╝╚══════╝╚══════╝╚══════╝╚══════╝╚══════╝╚══════╝╚══════╝╚══════╝╚══════╝╚══════╝╚══════╝╚══════╝ function isAddressBurn(address pAddress) public view returns(bool){ if(_paramForAddressIsBool['burn'][pAddress]){ return(true); } return(false); } function isAddressParam(string memory pParam, address pAddress) public view returns(bool){ if(_paramForAddressIsBool[pParam][pAddress]){ return(true); } return(false); } function percent(uint256 pIn, uint256 pPercent, uint256 pDecimals) public pure returns(uint256){ return(pIn.mul(pPercent).div(10**(pDecimals.add(1)))); } } // main ShibaDogePredator contract contract ShibaDogePredator is IERC20, ReentrancyGuard, RoleBasedAccessControl{ // public properties // lib using SafeMath for uint256; // more safe & secure uint256 operations using Address for address; // more safe & secure address operations // wallets address public ADDRESS_PROJECT = 0x49df2f3cca1E154ae40f5A6544A1249f42830Fb1; // address of the project wallet // addresses address public ADDRESS_ZERO = address(0); // the void .... address public ADDRESS_BURN = address(0xdEaD); // burn baby, burn! address public ADDRESS_PAIR;// swap pair contract, locked no owner address public ADDRESS_ROUTER = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D; // address of the UniSwapV2 router // interfaces IUniswapV2Router02 private _router; // interface for UniSwapV2 router IUniswapV2Pair private _pair; // interface for UniSwapV2 pair Util private _util; // interface for common utility functions // limits // taxes uint16 public TAX_BUY = 3; uint16 public TAX_SELL = 3; // transactions uint16 public TRANSACTION_LIMIT_MAX_BUY = 1; // transaction limit min 1% of total supply bool public TRANSACTION_LIMIT_ENABLED = true; // if the limit is enabled or not bool public TRANSACTION_FRONTRUNNING_ENABLED = true; // if the limit is enabled for frontunners bool public ENABLED; // if contract is enabled // private properties // tokenomics string private _name = "ShibaDogePredator"; // the name of our project string private _symbol = "EV3"; // symbol of the project uint8 private _decimals = 0; // decimal places used uint256 private _totalSupply = 5 * (10**15) * (10**0); // total supply at start // mappings (data storage) mapping(address => uint256) private _balances; // balances of all accounts mapping(address => mapping (address => uint256)) private _allowances; // allowances of all accounts mapping(address => bool) private _noTaxes; // address pays no taxes mapping(string => uint256) private _uint256; // constants or variables bool private _swapping; // prevent recursion uint256 public TAXES; // used to store taxes that have to be converted to wrapped ETH // events // these events are used off-chain (like on a website, or for a bot, or for you), to see whats happening in real time event Burn(address indexed from, uint256 amount); event TransactionStart(address indexed from, address indexed to, uint256 amount); event TransactionBuy(address indexed from, address indexed to, uint256 amount); event TransactionSell(address indexed from, address indexed to, uint256 amount); event TransactionTransfer(address indexed from, address indexed to, uint256 amount); event TransactionNoTaxes(address indexed from, address indexed to, uint256 amount); event TransactionTaxes(address indexed from, address indexed to, uint256 amount, uint256 taxes); event TransactionFrontrunner(address indexed from, address indexed to, uint256 amount); event TransactionTaxesToETH(address indexed from, address indexed to, uint256 tokens, uint256 taxes, uint256 total, uint256 native); event TransactionEnd(); // modifiers modifier onlySwapOnce(){ _swapping = true; _; _swapping = false; } // contract can be paid // we need to be able to get paid in order to provide LP and swap tokens for ETH receive() external payable{} constructor(){ // token creation // create all tokens and keep them in this contract for now _balances[address(this)] = _totalSupply; // event emit Transfer(address(0), address(this), _totalSupply); // set interfaces _util = new Util(address(this)); // set router & pair _router = IUniswapV2Router02(ADDRESS_ROUTER); ADDRESS_PAIR = IUniswapV2Factory(_router.factory()).createPair(address(this), _router.WETH()); _pair = IUniswapV2Pair(ADDRESS_PAIR); _approve(address(this), address(_router), 2**256 - 1); // set defaults _uint256['maxTaxes'] = 3; // 3% max taxes _uint256['minTransactionLimit'] = 1; // 1% of _totalSupply // set privileges _noTaxes[address(this)] = true; // this contract can't pay taxes or you can't swap taxes to ETH registerRoleAddress("root", _msgSender()); registerRoleAddress("root", ADDRESS_PROJECT); renounceOwnership(); // appease to the general public although this function does not prevent anything! } // privileged // ███████╗███████╗███████╗███████╗███████╗███████╗███████╗███████╗███████╗███████╗███████╗███████╗███████╗███████╗███████╗███████╗███████╗███████╗███████╗ // ╚══════╝╚══════╝╚══════╝╚══════╝╚══════╝╚══════╝╚══════╝╚══════╝╚══════╝╚══════╝╚══════╝╚══════╝╚══════╝╚══════╝╚══════╝╚══════╝╚══════╝╚══════╝╚══════╝ function addLiquidity() public onlyRole("root"){ require(address(this).balance > 0, '[error] contract has no balance for liquidity!'); require(_balances[address(this)] > 0, '[error] contract has no balance for liquidity!'); _router.addLiquidityETH{value:address(this).balance}( address(this), _balances[address(this)], 0, 0, ADDRESS_PROJECT, block.timestamp ); } function enable() public onlyRole("root"){ require(!ENABLED, '[error] contract already enabled!'); ENABLED = true; } function setTaxes(uint16 pTaxes, string memory pDirection) public onlyRole("root"){ require(pTaxes <= _uint256['maxTaxes'], '[error] variable is not within the allowed max,min!'); if(_util.stringEq(pDirection, 'buy')){ TAX_BUY = pTaxes; }else if(_util.stringEq(pDirection, 'sell')){ TAX_SELL = pTaxes; } } function enableTransactionLimit(uint16 pLimit) public onlyRole("root"){ // set the current transaction limit, this will disable auto limit require(pLimit >= _uint256['minTransactionLimit'], '[error] variable is not within the allowed max,min!'); TRANSACTION_LIMIT_MAX_BUY = pLimit; TRANSACTION_LIMIT_ENABLED = true; } function disableTransactionLimit() public onlyRole("root"){ // disable transaction limit TRANSACTION_LIMIT_ENABLED = false; } function enableTransactionFrontrunning() public onlyRole("root"){ // enable frontrunning checking TRANSACTION_FRONTRUNNING_ENABLED = true; } function disableTransactionFrontrunning() public onlyRole("root"){ // disable frontrunning checking TRANSACTION_FRONTRUNNING_ENABLED = false; } // public // ███████╗███████╗███████╗███████╗███████╗███████╗███████╗███████╗███████╗███████╗███████╗███████╗███████╗███████╗███████╗███████╗███████╗███████╗███████╗ // ╚══════╝╚══════╝╚══════╝╚══════╝╚══════╝╚══════╝╚══════╝╚══════╝╚══════╝╚══════╝╚══════╝╚══════╝╚══════╝╚══════╝╚══════╝╚══════╝╚══════╝╚══════╝╚══════╝ 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 override returns(uint256){ return(_balances[account]); } 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 _approve(address owner, address spender, uint256 amount) private { require(owner != address(0), "[error] approve from the zero address"); require(spender != address(0), "[error] approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } function increaseAllowance(address spender, uint256 addedValue) public returns(bool){ _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue)); return(true); } function decreaseAllowance(address spender, uint256 subtractedValue) public returns(bool){ _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "[error] decreased allowance below zero")); return(true); } function transfer(address recipient, uint256 amount) public override returns(bool){ _transfer(_msgSender(), recipient, 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, "[error] transfer amount exceeds allowance")); return(true); } function stats(string memory pStats) public view returns(uint256){ return(_util.stats(pStats)); } function liquidity() public view returns(uint256 rTokens, uint256 rWETH){ address token0 = _pair.token0(); (uint256 reserve0, uint256 reserve1,) = _pair.getReserves(); if(address(this) == token0){ return(reserve0, reserve1); }else{ return(reserve1, reserve0); } } function max() public view returns(uint256){ if(TRANSACTION_LIMIT_ENABLED){ return(_util.percent(_totalSupply, TRANSACTION_LIMIT_MAX_BUY, 1)); } return(_totalSupply); } function maxETH() public view returns(uint256){ if(TRANSACTION_LIMIT_ENABLED){ return(_tokenToNative(_util.percent(_totalSupply, TRANSACTION_LIMIT_MAX_BUY, 1))); } return(_tokenToNative(_totalSupply)); } // private // ███████╗███████╗███████╗███████╗███████╗███████╗███████╗███████╗███████╗███████╗███████╗███████╗███████╗███████╗███████╗███████╗███████╗███████╗███████╗ // ╚══════╝╚══════╝╚══════╝╚══════╝╚══════╝╚══════╝╚══════╝╚══════╝╚══════╝╚══════╝╚══════╝╚══════╝╚══════╝╚══════╝╚══════╝╚══════╝╚══════╝╚══════╝╚══════╝ function _transfer(address pFrom, address pTo, uint256 pAmount) private{ // this is the main transfer function used by transfer and transferFrom bool buy; bool sell; uint16 tax; // event emit TransactionStart(pFrom, pTo, pAmount); if(pFrom == ADDRESS_PAIR){ buy = true; tax = TAX_BUY; // event emit TransactionBuy(pFrom, pTo, pAmount); }else if(pTo == ADDRESS_PAIR){ sell = true; tax = TAX_SELL; // event emit TransactionSell(pFrom, pTo, pAmount); }else{ //event emit TransactionTransfer(pFrom, pTo, pAmount); } if(_noTaxes[pFrom] || _noTaxes[pTo]){ _transactionTokens(pFrom, pTo, pAmount); //event emit TransactionNoTaxes(pFrom, pTo, pAmount); }else{ // only when contract is enabled people can trade require(ENABLED, '[error] contract not enabled yet!'); if(TRANSACTION_FRONTRUNNING_ENABLED){require(!_util.frontrunning(pFrom, pTo, pAmount, buy, sell), '[error] sorry no frontrunners!');} if(TRANSACTION_LIMIT_ENABLED){require(!_transactionLimit(pFrom, pTo, pAmount, buy, sell), '[error] transaction limit was hit!');} uint256 taxPercent; if(tax > 0){ // taxes! taxPercent = _util.percent(pAmount, tax, 1); // get the cut from the transaction _transactionTokens(pFrom, address(this), taxPercent); // send the cut to this contract TAXES = TAXES.add(taxPercent); // add it to global taxes pAmount = pAmount.sub(taxPercent); // remove taxes from recipient } if(!_swapping && sell && TAXES > 0){ // swap taxes for #REF:ETH uint256 native = _taxesToNative(TAXES, ADDRESS_PROJECT); // event emit TransactionTaxesToETH(pFrom, pTo, pAmount, taxPercent, TAXES, native); // set taxes to zero if we got any ETH out if(native > 0){ TAXES = 0; } } _transactionTokens(pFrom, pTo, pAmount); //event emit TransactionTaxes(pFrom, pTo, pAmount, taxPercent); } // event emit TransactionEnd(); } function _transactionTokens(address pFrom, address pTo, uint256 pAmount) private{ // sent tokens to wallet and reduce supply if burned _balances[pFrom] = _balances[pFrom].sub(pAmount); _balances[pTo] = _balances[pTo].add(pAmount); if(_util.isAddressBurn(pTo)){ _totalSupply = _totalSupply.sub(pAmount); // event emit Burn(pFrom, pAmount); } // event emit Transfer(pFrom, pTo, pAmount); } function _transactionNative(address pTo, uint256 pAmount) private returns(bool){ // sent native to wallet address payable to = payable(pTo); (bool sent, ) = to.call{value:pAmount}(""); return(sent); } function _transactionLimit(address pFrom, address pTo, uint256 pAmount, bool pBuy, bool pSell) private view returns(bool){ if((!_util.isAddressBurn(pFrom) && !_util.isAddressBurn(pTo)) && (pBuy && !pSell)){ // whats the max tokens we can buy uint256 maxTokens = _util.percent(_totalSupply, TRANSACTION_LIMIT_MAX_BUY, 1); if(pAmount > maxTokens){ // limit hit abort return(true); } } return(false); } function _taxesToNative(uint256 pTaxes, address pTo) private onlySwapOnce returns(uint256){ // convert taxes to native return(_swapToNative(pTaxes, pTo)); } function _nativeToToken(uint256 pNative) private view returns(uint256){ // get price tokens to native address[] memory pathNativeToToken = new address[](2); pathNativeToToken[0] = _router.WETH(); pathNativeToToken[1] = address(this); uint256[] memory amountNativeToToken = _router.getAmountsOut(pNative, pathNativeToToken); return(amountNativeToToken[1]); } function _tokenToNative(uint256 pToken) private view returns(uint256){ // get price tokens to native address[] memory pathTokenToNative = new address[](2); pathTokenToNative[0] = address(this); pathTokenToNative[1] = _router.WETH(); uint256[] memory amountTokenToNative = _router.getAmountsOut(pToken, pathTokenToNative); return(amountTokenToNative[1]); } function _swapToNative(uint256 pTokens, address pTo) private returns(uint256){ // swap tokens to native address[] memory pathTokenToNative = new address[](2); pathTokenToNative[0] = address(this); pathTokenToNative[1] = _router.WETH(); uint256 balancePreSwap = address(pTo).balance; _router.swapExactTokensForETHSupportingFeeOnTransferTokens( pTokens, 0, pathTokenToNative, pTo, block.timestamp ); uint256 balancePostSwap = address(pTo).balance; return(balancePostSwap.sub(balancePreSwap)); } } // Smart Contract created by ElevenCloud.eth – Open for inquiries
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":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Burn","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":"amount","type":"uint256"}],"name":"TransactionBuy","type":"event"},{"anonymous":false,"inputs":[],"name":"TransactionEnd","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":"amount","type":"uint256"}],"name":"TransactionFrontrunner","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":"amount","type":"uint256"}],"name":"TransactionNoTaxes","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":"amount","type":"uint256"}],"name":"TransactionSell","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":"amount","type":"uint256"}],"name":"TransactionStart","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":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"taxes","type":"uint256"}],"name":"TransactionTaxes","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":"tokens","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"taxes","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"total","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"native","type":"uint256"}],"name":"TransactionTaxesToETH","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":"amount","type":"uint256"}],"name":"TransactionTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"ADDRESS_BURN","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ADDRESS_PAIR","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ADDRESS_PROJECT","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ADDRESS_ROUTER","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ADDRESS_ZERO","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ENABLED","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TAXES","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TAX_BUY","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TAX_SELL","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TRANSACTION_FRONTRUNNING_ENABLED","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TRANSACTION_LIMIT_ENABLED","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TRANSACTION_LIMIT_MAX_BUY","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"addLiquidity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"pRole","type":"string"},{"internalType":"address","name":"pMember","type":"address"}],"name":"addRoleAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"disableTransactionFrontrunning","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"disableTransactionLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableTransactionFrontrunning","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"pLimit","type":"uint16"}],"name":"enableTransactionLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"pRole","type":"string"},{"internalType":"address","name":"pAddress","type":"address"}],"name":"hasRoleAddress","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"liquidity","outputs":[{"internalType":"uint256","name":"rTokens","type":"uint256"},{"internalType":"uint256","name":"rWETH","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"max","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxETH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"pRole","type":"string"}],"name":"registerRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"pRole","type":"string"},{"internalType":"address","name":"pMember","type":"address"}],"name":"registerRoleAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"pRole","type":"string"},{"internalType":"address[]","name":"pMembers","type":"address[]"}],"name":"registerRoleAddresses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"pRole","type":"string"},{"internalType":"address","name":"pMember","type":"address"}],"name":"removeRoleAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"pTaxes","type":"uint16"},{"internalType":"string","name":"pDirection","type":"string"}],"name":"setTaxes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"pStats","type":"string"}],"name":"stats","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
600580546001600160a01b03199081167349df2f3cca1e154ae40f5a6544a1249f42830fb117909155600680548216905560078054821661dead17905560098054909116737a250d5630b4cf539739df2c5dacb4c659f2488d179055600c80547b01010001000300030000000000000000000000000000000000000000600160a01b600160e01b031990911617905560c0604052601160808190527029b434b130a237b3b2a83932b230ba37b960791b60a0908152620000c391600d91906200089d565b506040805180820190915260038082526245563360e81b6020909201918252620000f091600e916200089d565b50600f805460ff191690556611c37937e080006010553480156200011357600080fd5b506001600055620001243362000474565b60105430600081815260116020908152604080832085905551938452919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3306040516200017e906200092c565b6001600160a01b039091168152602001604051809103906000f080158015620001ab573d6000803e3d6000fd5b50600c80546001600160a01b039283166001600160a01b031991821617909155600954600a8054909216921691821790556040805163c45a015560e01b8152905163c45a0155916004808201926020929091908290030181865afa15801562000218573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200023e919062000951565b6001600160a01b031663c9c6539630600a60009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015620002a1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002c7919062000951565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af115801562000315573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200033b919062000951565b600880546001600160a01b039283166001600160a01b03199182168117909255600b80549091169091179055600a546200037b91309116600019620004c6565b600360146040516200039b90676d6178546178657360c01b815260080190565b908152604051908190036020018120919091557f6d696e5472616e73616374696f6e4c696d6974000000000000000000000000008152600190601490601301908152604080516020928190038301812093909355306000908152601383528190208054600160ff19909116179055828101905260048252631c9bdbdd60e21b9082015262000431906200042b3390565b620005f5565b6040805180820190915260048152631c9bdbdd60e21b60208201526005546200046491906001600160a01b0316620005f5565b6200046e6200077a565b620009fe565b600180546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038316620005305760405162461bcd60e51b815260206004820152602560248201527f5b6572726f725d20617070726f76652066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084015b60405180910390fd5b6001600160a01b038216620005945760405162461bcd60e51b815260206004820152602360248201527f5b6572726f725d20617070726f766520746f20746865207a65726f206164647260448201526265737360e81b606482015260840162000527565b6001600160a01b0383811660008181526012602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b604051806040016040528060048152602001631c9bdbdd60e21b81525060028160405162000624919062000983565b90815260405190819003602001902060006200063d3390565b6001600160a01b0316815260208101919091526040016000205460ff16806200067057506001546001600160a01b031633145b6200071e5760405162461bcd60e51b815260206004820152606b60248201527f5b6572726f725d5b726f6c652062617365642061636365737320636f6e74726f60448201527f6c5d206f6e6c79206164647265737365732061737369676e656420746869732060648201527f726f6c65206f7220746865206f776e65722063616e206163636573732074686960848201526a732066756e6374696f6e2160a81b60a482015260c40162000527565b6200072983620007f5565b60016002846040516200073d919062000983565b90815260408051602092819003830190206001600160a01b0395909516600090815294909152909220805460ff1916921515929092179091555050565b6001546001600160a01b03163314620007e75760405162461bcd60e51b815260206004820152602860248201527f5b6572726f725d5b6f776e61626c655d2063616c6c6572206973206e6f74207460448201526734329037bbb732b960c11b606482015260840162000527565b620007f3600062000474565b565b60038160405162000807919062000983565b9081526040519081900360200190205460ff166200089a57600160038260405162000833919062000983565b90815260405160209181900382019020805460ff19169215159290921790915560048054600181018255600091909152825162000898927f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b909201918401906200089d565b505b50565b828054620008ab90620009c1565b90600052602060002090601f016020900481019282620008cf57600085556200091a565b82601f10620008ea57805160ff19168380011785556200091a565b828001600101855582156200091a579182015b828111156200091a578251825591602001919060010190620008fd565b50620009289291506200093a565b5090565b611e338062003aed83390190565b5b808211156200092857600081556001016200093b565b6000602082840312156200096457600080fd5b81516001600160a01b03811681146200097c57600080fd5b9392505050565b6000825160005b81811015620009a657602081860181015185830152016200098a565b81811115620009b6576000828501525b509190910192915050565b600181811c90821680620009d657607f821691505b60208210811415620009f857634e487b7160e01b600052602260045260246000fd5b50919050565b6130df8062000a0e6000396000f3fe6080604052600436106102605760003560e01c80636ac5db1911610144578063a81537ce116100b6578063d7c3e65f1161007a578063d7c3e65f14610718578063dd62ed3e1461073a578063de8090a114610780578063e0b75675146105e3578063e8078d94146107a0578063f2fde38b146107b557600080fd5b8063a81537ce1461068c578063a9059cbb146106ac578063ae462aab146106cc578063b75d4145146106ee578063bae7fff71461070357600080fd5b806387b3364a1161010857806387b3364a146105e35780638da5cb5b1461060357806395d89b4114610621578063a3907d7114610636578063a457c2d71461064b578063a5f0f1b21461066b57600080fd5b80636ac5db191461054257806370a0823114610557578063715018a61461058d57806382ea617a146105a257806386952382146105c257600080fd5b806334f86346116101dd5780634d9ae633116101a15780634d9ae6331461048b5780634e1a70c8146104a157806354f1fb13146104c257806357087597146104e25780635a1de8b31461050257806366e795091461052257600080fd5b806334f86346146103d6578063395093511461040b57806348af48a51461042b5780634b7193971461044b5780634c1eaa201461046b57600080fd5b80632143aa9d116102245780632143aa9d1461032557806323b872dd1461033c57806326fc3f5d1461035c5780632f5f92f714610394578063313ce567146103b457600080fd5b806302814b861461026c57806306fdde0314610294578063095ea7b3146102b657806318160ddd146102e65780631a686502146102fb57600080fd5b3661026757005b600080fd5b34801561027857600080fd5b506102816107d5565b6040519081526020015b60405180910390f35b3480156102a057600080fd5b506102a9610887565b60405161028b919061276f565b3480156102c257600080fd5b506102d66102d1366004612797565b610919565b604051901515815260200161028b565b3480156102f257600080fd5b50601054610281565b34801561030757600080fd5b5061031061092f565b6040805192835260208301919091520161028b565b34801561033157600080fd5b5061033a610a5c565b005b34801561034857600080fd5b506102d66103573660046127c3565b610af2565b34801561036857600080fd5b5060095461037c906001600160a01b031681565b6040516001600160a01b03909116815260200161028b565b3480156103a057600080fd5b5061033a6103af3660046128bb565b610b5b565b3480156103c057600080fd5b50600f5460405160ff909116815260200161028b565b3480156103e257600080fd5b50600c546103f890600160a01b900461ffff1681565b60405161ffff909116815260200161028b565b34801561041757600080fd5b506102d6610426366004612797565b610c45565b34801561043757600080fd5b5060075461037c906001600160a01b031681565b34801561045757600080fd5b5060055461037c906001600160a01b031681565b34801561047757600080fd5b5060085461037c906001600160a01b031681565b34801561049757600080fd5b5061028160165481565b3480156104ad57600080fd5b50600c546102d690600160d01b900460ff1681565b3480156104ce57600080fd5b5061033a6104dd366004612931565b610c7b565b3480156104ee57600080fd5b5061033a6104fd3660046129fa565b610da0565b34801561050e57600080fd5b506102d661051d3660046128bb565b610e3f565b34801561052e57600080fd5b5060065461037c906001600160a01b031681565b34801561054e57600080fd5b50610281610e83565b34801561056357600080fd5b50610281610572366004612a37565b6001600160a01b031660009081526011602052604090205490565b34801561059957600080fd5b5061033a610f25565b3480156105ae57600080fd5b5061033a6105bd366004612a6b565b610f5b565b3480156105ce57600080fd5b50600c546102d690600160d81b900460ff1681565b3480156105ef57600080fd5b5061033a6105fe3660046128bb565b611150565b34801561060f57600080fd5b506001546001600160a01b031661037c565b34801561062d57600080fd5b506102a96111fd565b34801561064257600080fd5b5061033a61120c565b34801561065757600080fd5b506102d6610666366004612797565b611303565b34801561067757600080fd5b50600c546102d690600160e01b900460ff1681565b34801561069857600080fd5b5061033a6106a7366004612ab9565b611352565b3480156106b857600080fd5b506102d66106c7366004612797565b611457565b3480156106d857600080fd5b50600c546103f890600160c01b900461ffff1681565b3480156106fa57600080fd5b5061033a611464565b34801561070f57600080fd5b5061033a6114f1565b34801561072457600080fd5b50600c546103f890600160b01b900461ffff1681565b34801561074657600080fd5b50610281610755366004612ad4565b6001600160a01b03918216600090815260126020908152604080832093909416825291909152205490565b34801561078c57600080fd5b5061028161079b3660046129fa565b611584565b3480156107ac57600080fd5b5061033a6115fc565b3480156107c157600080fd5b5061033a6107d0366004612a37565b61176c565b600c54600090600160d01b900460ff161561087c57600c5460105460405162160d4f60e11b81526004810191909152600160c01b820461ffff16602482015260016044820152610877916001600160a01b031690622c1a9e90606401602060405180830381865afa15801561084e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108729190612b02565b61180f565b905090565b61087760105461180f565b6060600d805461089690612b1b565b80601f01602080910402602001604051908101604052809291908181526020018280546108c290612b1b565b801561090f5780601f106108e45761010080835404028352916020019161090f565b820191906000526020600020905b8154815290600101906020018083116108f257829003601f168201915b5050505050905090565b6000610926338484611987565b50600192915050565b6000806000600b60009054906101000a90046001600160a01b03166001600160a01b0316630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa158015610987573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109ab9190612b56565b9050600080600b60009054906101000a90046001600160a01b03166001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015610a03573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a279190612b8a565b506001600160701b039182169350169050306001600160a01b0384161415610a53579094909350915050565b94909350915050565b604051806040016040528060048152602001631c9bdbdd60e21b815250600281604051610a899190612bda565b90815260200160405180910390206000610aa03390565b6001600160a01b0316815260208101919091526040016000205460ff16610ae25760405162461bcd60e51b8152600401610ad990612bf6565b60405180910390fd5b50600c805460ff60d81b19169055565b6000610aff848484611aaf565b610b518433610b4c8560405180606001604052806029815260200161305b602991396001600160a01b038a166000908152601260209081526040808320338452909152902054919061209e565b611987565b5060019392505050565b604051806040016040528060048152602001631c9bdbdd60e21b815250600281604051610b889190612bda565b90815260200160405180910390206000610b9f3390565b6001600160a01b0316815260208101919091526040016000205460ff1680610bd157506001546001600160a01b031633145b610bed5760405162461bcd60e51b8152600401610ad990612c79565b610bf6836120ca565b6000600284604051610c089190612bda565b90815260408051602092819003830190206001600160a01b0395909516600090815294909152909220805460ff1916921515929092179091555050565b3360008181526012602090815260408083206001600160a01b03871684529091528120549091610926918590610b4c9086612166565b604051806040016040528060048152602001631c9bdbdd60e21b815250600281604051610ca89190612bda565b90815260200160405180910390206000610cbf3390565b6001600160a01b0316815260208101919091526040016000205460ff1680610cf157506001546001600160a01b031633145b610d0d5760405162461bcd60e51b8152600401610ad990612c79565b610d16836120ca565b60005b8251811015610d9a576001600285604051610d349190612bda565b90815260200160405180910390206000858481518110610d5657610d56612d10565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905580610d9281612d3c565b915050610d19565b50505050565b604051806040016040528060048152602001631c9bdbdd60e21b815250600281604051610dcd9190612bda565b90815260200160405180910390206000610de43390565b6001600160a01b0316815260208101919091526040016000205460ff1680610e1657506001546001600160a01b031633145b610e325760405162461bcd60e51b8152600401610ad990612c79565b610e3b826120ca565b5050565b6000600283604051610e519190612bda565b908152604080519182900360209081019092206001600160a01b0385166000908152925290205460ff16905092915050565b600c54600090600160d01b900460ff1615610f1e57600c5460105460405162160d4f60e11b81526004810191909152600160c01b820461ffff166024820152600160448201526001600160a01b0390911690622c1a9e90606401602060405180830381865afa158015610efa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108779190612b02565b5060105490565b6001546001600160a01b03163314610f4f5760405162461bcd60e51b8152600401610ad990612d57565b610f596000612179565b565b604051806040016040528060048152602001631c9bdbdd60e21b815250600281604051610f889190612bda565b90815260200160405180910390206000610f9f3390565b6001600160a01b0316815260208101919091526040016000205460ff16610fd85760405162461bcd60e51b8152600401610ad990612bf6565b604051676d6178546178657360c01b81526014906008019081526020016040518091039020548361ffff1611156110215760405162461bcd60e51b8152600401610ad990612d9f565b600c5460405163ebfc665960e01b81526001600160a01b039091169063ebfc665990611051908590600401612df2565b6020604051808303816000875af1158015611070573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110949190612e2a565b156110b857600c805461ffff60a01b1916600160a01b61ffff861602179055505050565b600c5460405163ebfc665960e01b81526001600160a01b039091169063ebfc6659906110e8908590600401612e4c565b6020604051808303816000875af1158015611107573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061112b9190612e2a565b1561114b57600c805461ffff60b01b1916600160b01b61ffff8616021790555b505050565b604051806040016040528060048152602001631c9bdbdd60e21b81525060028160405161117d9190612bda565b908152602001604051809103902060006111943390565b6001600160a01b0316815260208101919091526040016000205460ff16806111c657506001546001600160a01b031633145b6111e25760405162461bcd60e51b8152600401610ad990612c79565b6111eb836120ca565b6001600284604051610c089190612bda565b6060600e805461089690612b1b565b604051806040016040528060048152602001631c9bdbdd60e21b8152506002816040516112399190612bda565b908152602001604051809103902060006112503390565b6001600160a01b0316815260208101919091526040016000205460ff166112895760405162461bcd60e51b8152600401610ad990612bf6565b600c54600160e01b900460ff16156112ed5760405162461bcd60e51b815260206004820152602160248201527f5b6572726f725d20636f6e747261637420616c726561647920656e61626c65646044820152602160f81b6064820152608401610ad9565b50600c805460ff60e01b1916600160e01b179055565b60006109263384610b4c85604051806060016040528060268152602001613084602691393360009081526012602090815260408083206001600160a01b038d168452909152902054919061209e565b604051806040016040528060048152602001631c9bdbdd60e21b81525060028160405161137f9190612bda565b908152602001604051809103902060006113963390565b6001600160a01b0316815260208101919091526040016000205460ff166113cf5760405162461bcd60e51b8152600401610ad990612bf6565b604051721b5a5b951c985b9cd858dd1a5bdb931a5b5a5d606a1b81526014906013019081526020016040518091039020548261ffff1610156114235760405162461bcd60e51b8152600401610ad990612d9f565b50600c805460ff60d01b1961ffff909316600160c01b029290921662ffffff60c01b1990921691909117600160d01b179055565b6000610926338484611aaf565b604051806040016040528060048152602001631c9bdbdd60e21b8152506002816040516114919190612bda565b908152602001604051809103902060006114a83390565b6001600160a01b0316815260208101919091526040016000205460ff166114e15760405162461bcd60e51b8152600401610ad990612bf6565b50600c805460ff60d01b19169055565b604051806040016040528060048152602001631c9bdbdd60e21b81525060028160405161151e9190612bda565b908152602001604051809103902060006115353390565b6001600160a01b0316815260208101919091526040016000205460ff1661156e5760405162461bcd60e51b8152600401610ad990612bf6565b50600c805460ff60d81b1916600160d81b179055565b600c5460405163de8090a160e01b81526000916001600160a01b03169063de8090a1906115b590859060040161276f565b602060405180830381865afa1580156115d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115f69190612b02565b92915050565b604051806040016040528060048152602001631c9bdbdd60e21b8152506002816040516116299190612bda565b908152602001604051809103902060006116403390565b6001600160a01b0316815260208101919091526040016000205460ff166116795760405162461bcd60e51b8152600401610ad990612bf6565b600047116116995760405162461bcd60e51b8152600401610ad990612e85565b306000908152601160205260409020546116c55760405162461bcd60e51b8152600401610ad990612e85565b600a543060008181526011602052604080822054600554915163f305d71960e01b8152600481019490945260248401526044830182905260648301919091526001600160a01b0390811660848301524260a48301529091169063f305d71990479060c40160606040518083038185885af1158015611747573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610d9a9190612ed3565b6001546001600160a01b031633146117965760405162461bcd60e51b8152600401610ad990612d57565b6001600160a01b0381166118035760405162461bcd60e51b815260206004820152602e60248201527f5b6572726f725d5b6f776e61626c655d206e6577206f776e657220697320746860448201526d65207a65726f206164647265737360901b6064820152608401610ad9565b61180c81612179565b50565b60408051600280825260608201835260009283929190602083019080368337019050509050308160008151811061184857611848612d10565b6001600160a01b03928316602091820292909201810191909152600a54604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa1580156118a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118c59190612b56565b816001815181106118d8576118d8612d10565b6001600160a01b039283166020918202929092010152600a5460405163d06ca61f60e01b8152600092919091169063d06ca61f9061191c9087908690600401612f45565b600060405180830381865afa158015611939573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526119619190810190612f5e565b90508060018151811061197657611976612d10565b602002602001015192505050919050565b6001600160a01b0383166119eb5760405162461bcd60e51b815260206004820152602560248201527f5b6572726f725d20617070726f76652066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610ad9565b6001600160a01b038216611a4d5760405162461bcd60e51b815260206004820152602360248201527f5b6572726f725d20617070726f766520746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610ad9565b6001600160a01b0383811660008181526012602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6000806000846001600160a01b0316866001600160a01b03167f16542a7bd18d94bdfcf497ede968d3d1c95acdba5fddded55a9d144c733d9db086604051611af991815260200190565b60405180910390a36008546001600160a01b0387811691161415611b805760019250600c60149054906101000a900461ffff169050846001600160a01b0316866001600160a01b03167fef687d17b47636d53baf11f62ed7e944c32ed430b427c480b1e01dca6446569186604051611b7391815260200190565b60405180910390a3611c38565b6008546001600160a01b0386811691161415611bea575050600c54604051838152600191600160b01b900461ffff16906001600160a01b0386811691908816907fa240c9852222065f264d0b2ec0914521b71337aa869fbf77aa267cb72e7f23ba90602001611b73565b846001600160a01b0316866001600160a01b03167fa4c7c1f20958780a8f5b5e6e2485372318bd9059f09091d9d75671dbbb48380886604051611c2f91815260200190565b60405180910390a35b6001600160a01b03861660009081526013602052604090205460ff1680611c7757506001600160a01b03851660009081526013602052604090205460ff165b15611cd957611c878686866121cb565b846001600160a01b0316866001600160a01b03167f3e1d6434526bea9f39e1f31904503ec82a3dc686beec4d7e6f9cd1766af0a63686604051611ccc91815260200190565b60405180910390a361206d565b600c54600160e01b900460ff16611d3c5760405162461bcd60e51b815260206004820152602160248201527f5b6572726f725d20636f6e7472616374206e6f7420656e61626c6564207965746044820152602160f81b6064820152608401610ad9565b600c54600160d81b900460ff1615611e2a57600c5460405163044dcbdf60e01b81526001600160a01b038881166004830152878116602483015260448201879052851515606483015284151560848301529091169063044dcbdf9060a4016020604051808303816000875af1158015611db9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ddd9190612e2a565b15611e2a5760405162461bcd60e51b815260206004820152601e60248201527f5b6572726f725d20736f727279206e6f2066726f6e7472756e6e6572732100006044820152606401610ad9565b600c54600160d01b900460ff1615611ea157611e498686868686612339565b15611ea15760405162461bcd60e51b815260206004820152602260248201527f5b6572726f725d207472616e73616374696f6e206c696d697420776173206869604482015261742160f01b6064820152608401610ad9565b600061ffff821615611f5357600c5460405162160d4f60e11b81526004810187905261ffff84166024820152600160448201526001600160a01b0390911690622c1a9e90606401602060405180830381865afa158015611f05573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f299190612b02565b9050611f368730836121cb565b601654611f439082612166565b601655611f5085826124e1565b94505b60155460ff16158015611f635750825b8015611f7157506000601654115b1561200a57601654600554600091611f91916001600160a01b03166124ed565b9050866001600160a01b0316886001600160a01b03167fb13f1a8dc245ebc96f5efc4afa191303024f8086370f01240b4c598ef07bb8d7888560165486604051611ff4949392919093845260208401929092526040830152606082015260800190565b60405180910390a380156120085760006016555b505b6120158787876121cb565b856001600160a01b0316876001600160a01b03167f9e36ac0e8ad1a8bee2bb4578d4c63006d276346c8238cc5b34cf2474d4097ccb8784604051612063929190918252602082015260400190565b60405180910390a3505b6040517ff0f2c9ae2d19d4568c8598dfa5d0f4f00d31fc8c3a8c975eef10f9cf586155ff90600090a1505050505050565b600081848411156120c25760405162461bcd60e51b8152600401610ad9919061276f565b505050900390565b6003816040516120da9190612bda565b9081526040519081900360200190205460ff1661180c5760016003826040516121039190612bda565b90815260405160209181900382019020805460ff191692151592909217909155600480546001810182556000919091528251610e3b927f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b9092019184019061267e565b60006121728284612fef565b9392505050565b600180546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0383166000908152601160205260409020546121ee90826124e1565b6001600160a01b03808516600090815260116020526040808220939093559084168152205461221d9082612166565b6001600160a01b038381166000818152601160205260409081902093909355600c54925163371b333f60e11b81526004810191909152911690636e36667e90602401602060405180830381865afa15801561227c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122a09190612e2a565b156122f4576010546122b290826124e1565b6010556040518181526001600160a01b038416907fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca59060200160405180910390a25b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611aa291815260200190565b600c5460405163371b333f60e11b81526001600160a01b0387811660048301526000921690636e36667e90602401602060405180830381865afa158015612384573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123a89190612e2a565b1580156124205750600c5460405163371b333f60e11b81526001600160a01b03878116600483015290911690636e36667e90602401602060405180830381865afa1580156123fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061241e9190612e2a565b155b80156124325750828015612432575081155b156124d457600c5460105460405162160d4f60e11b81526004810191909152600160c01b820461ffff166024820152600160448201526000916001600160a01b031690622c1a9e90606401602060405180830381865afa15801561249a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124be9190612b02565b9050808511156124d25760019150506124d8565b505b5060005b95945050505050565b60006121728284613007565b6015805460ff1916600117905560006125068383612517565b6015805460ff191690559392505050565b60408051600280825260608201835260009283929190602083019080368337019050509050308160008151811061255057612550612d10565b6001600160a01b03928316602091820292909201810191909152600a54604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa1580156125a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125cd9190612b56565b816001815181106125e0576125e0612d10565b6001600160a01b039283166020918202929092010152600a5460405163791ac94760e01b81528583163192919091169063791ac9479061262d90889060009087908a90429060040161301e565b600060405180830381600087803b15801561264757600080fd5b505af115801561265b573d6000803e3d6000fd5b505050506001600160a01b0384163161267481836124e1565b9695505050505050565b82805461268a90612b1b565b90600052602060002090601f0160209004810192826126ac57600085556126f2565b82601f106126c557805160ff19168380011785556126f2565b828001600101855582156126f2579182015b828111156126f25782518255916020019190600101906126d7565b506126fe929150612702565b5090565b5b808211156126fe5760008155600101612703565b60005b8381101561273257818101518382015260200161271a565b83811115610d9a5750506000910152565b6000815180845261275b816020860160208601612717565b601f01601f19169290920160200192915050565b6020815260006121726020830184612743565b6001600160a01b038116811461180c57600080fd5b600080604083850312156127aa57600080fd5b82356127b581612782565b946020939093013593505050565b6000806000606084860312156127d857600080fd5b83356127e381612782565b925060208401356127f381612782565b929592945050506040919091013590565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561284357612843612804565b604052919050565b600082601f83011261285c57600080fd5b813567ffffffffffffffff81111561287657612876612804565b612889601f8201601f191660200161281a565b81815284602083860101111561289e57600080fd5b816020850160208301376000918101602001919091529392505050565b600080604083850312156128ce57600080fd5b823567ffffffffffffffff8111156128e557600080fd5b6128f18582860161284b565b925050602083013561290281612782565b809150509250929050565b600067ffffffffffffffff82111561292757612927612804565b5060051b60200190565b6000806040838503121561294457600080fd5b823567ffffffffffffffff8082111561295c57600080fd5b6129688683870161284b565b935060209150818501358181111561297f57600080fd5b85019050601f8101861361299257600080fd5b80356129a56129a08261290d565b61281a565b81815260059190911b820183019083810190888311156129c457600080fd5b928401925b828410156129eb5783356129dc81612782565b825292840192908401906129c9565b80955050505050509250929050565b600060208284031215612a0c57600080fd5b813567ffffffffffffffff811115612a2357600080fd5b612a2f8482850161284b565b949350505050565b600060208284031215612a4957600080fd5b813561217281612782565b803561ffff81168114612a6657600080fd5b919050565b60008060408385031215612a7e57600080fd5b612a8783612a54565b9150602083013567ffffffffffffffff811115612aa357600080fd5b612aaf8582860161284b565b9150509250929050565b600060208284031215612acb57600080fd5b61217282612a54565b60008060408385031215612ae757600080fd5b8235612af281612782565b9150602083013561290281612782565b600060208284031215612b1457600080fd5b5051919050565b600181811c90821680612b2f57607f821691505b60208210811415612b5057634e487b7160e01b600052602260045260246000fd5b50919050565b600060208284031215612b6857600080fd5b815161217281612782565b80516001600160701b0381168114612a6657600080fd5b600080600060608486031215612b9f57600080fd5b612ba884612b73565b9250612bb660208501612b73565b9150604084015163ffffffff81168114612bcf57600080fd5b809150509250925092565b60008251612bec818460208701612717565b9190910192915050565b6020808252605e908201527f5b6572726f725d5b726f6c652062617365642061636365737320636f6e74726f60408201527f6c5d206f6e6c79206164647265737365732061737369676e656420746869732060608201527f726f6c652063616e2061636365737320746869732066756e6374696f6e210000608082015260a00190565b6020808252606b908201527f5b6572726f725d5b726f6c652062617365642061636365737320636f6e74726f60408201527f6c5d206f6e6c79206164647265737365732061737369676e656420746869732060608201527f726f6c65206f7220746865206f776e65722063616e206163636573732074686960808201526a732066756e6374696f6e2160a81b60a082015260c00190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600019821415612d5057612d50612d26565b5060010190565b60208082526028908201527f5b6572726f725d5b6f776e61626c655d2063616c6c6572206973206e6f74207460408201526734329037bbb732b960c11b606082015260800190565b60208082526033908201527f5b6572726f725d207661726961626c65206973206e6f742077697468696e2074604082015272686520616c6c6f776564206d61782c6d696e2160681b606082015260800190565b604081526000612e056040830184612743565b8281036020840152600381526262757960e81b60208201526040810191505092915050565b600060208284031215612e3c57600080fd5b8151801515811461217257600080fd5b604081526000612e5f6040830184612743565b828103602084015260048152631cd95b1b60e21b60208201526040810191505092915050565b6020808252602e908201527f5b6572726f725d20636f6e747261637420686173206e6f2062616c616e63652060408201526d666f72206c69717569646974792160901b606082015260800190565b600080600060608486031215612ee857600080fd5b8351925060208401519150604084015190509250925092565b600081518084526020808501945080840160005b83811015612f3a5781516001600160a01b031687529582019590820190600101612f15565b509495945050505050565b828152604060208201526000612a2f6040830184612f01565b60006020808385031215612f7157600080fd5b825167ffffffffffffffff811115612f8857600080fd5b8301601f81018513612f9957600080fd5b8051612fa76129a08261290d565b81815260059190911b82018301908381019087831115612fc657600080fd5b928401925b82841015612fe457835182529284019290840190612fcb565b979650505050505050565b6000821982111561300257613002612d26565b500190565b60008282101561301957613019612d26565b500390565b85815284602082015260a06040820152600061303d60a0830186612f01565b6001600160a01b039490941660608301525060800152939250505056fe5b6572726f725d207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63655b6572726f725d2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212207959f40cd9294cfee635091529f637ceca862089aa71a0a52912874d9cae2db564736f6c634300080c00336080604052662386f26fc10000600955670de0b6b3a7640000600b553480156200002857600080fd5b5060405162001e3338038062001e338339810160408190526200004b916200042b565b620000563362000106565b60016005604051620000729063313ab93760e11b815260040190565b9081526040805160209281900383018120600080805293529120805460ff19169215159290921790915563313ab93760e11b8152600190600590600401908152604080516020928190038301812061dead6000908152908452829020805460ff191694151594909417909355828101905260048252631d5d1a5b60e21b90820152620000ff908262000156565b50620004d8565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b604051806040016040528060048152602001631c9bdbdd60e21b8152506001816040516200018591906200045d565b90815260405190819003602001902060006200019e3390565b6001600160a01b0316815260208101919091526040016000205460ff1680620001d157506000546001600160a01b031633145b620002825760405162461bcd60e51b815260206004820152606b60248201527f5b6572726f725d5b726f6c652062617365642061636365737320636f6e74726f60448201527f6c5d206f6e6c79206164647265737365732061737369676e656420746869732060648201527f726f6c65206f7220746865206f776e65722063616e206163636573732074686960848201526a732066756e6374696f6e2160a81b60a482015260c40160405180910390fd5b6200028d83620002dd565b60018084604051620002a091906200045d565b90815260408051602092819003830190206001600160a01b0395909516600090815294909152909220805460ff1916921515929092179091555050565b600281604051620002ef91906200045d565b9081526040519081900360200190205460ff16620003825760016002826040516200031b91906200045d565b90815260405160209181900382019020805460ff19169215159290921790915560038054600181018255600091909152825162000380927fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b9092019184019062000385565b505b50565b82805462000393906200049b565b90600052602060002090601f016020900481019282620003b7576000855562000402565b82601f10620003d257805160ff191683800117855562000402565b8280016001018555821562000402579182015b8281111562000402578251825591602001919060010190620003e5565b506200041092915062000414565b5090565b5b8082111562000410576000815560010162000415565b6000602082840312156200043e57600080fd5b81516001600160a01b03811681146200045657600080fd5b9392505050565b6000825160005b8181101562000480576020818601810151858301520162000464565b8181111562000490576000828501525b509190910192915050565b600181811c90821680620004b057607f821691505b60208210811415620004d257634e487b7160e01b600052602260045260246000fd5b50919050565b61194b80620004e86000396000f3fe608060405234801561001057600080fd5b50600436106101205760003560e01c8063715018a6116100ad578063ae2099eb11610071578063ae2099eb14610251578063de8090a114610264578063e0b7567514610210578063ebfc665914610277578063f2fde38b1461028a57600080fd5b8063715018a6146101f5578063876b8f4e146101fd57806387b3364a1461021057806387b51df6146102235780638da5cb5b1461023657600080fd5b80633ff0027f116100f45780633ff0027f1461019657806354f1fb13146101a957806357087597146101bc5780635a1de8b3146101cf5780636e36667e146101e257600080fd5b80622c1a9e1461012557806303a2522d1461014b578063044dcbdf146101605780632f5f92f714610183575b600080fd5b610138610133366004611118565b61029d565b6040519081526020015b60405180910390f35b61015e6101593660046111fb565b6102d0565b005b61017361016e36600461126c565b6103cb565b6040519015158152602001610142565b61015e6101913660046112ca565b610489565b61015e6101a436600461139f565b610573565b61015e6101b7366004611413565b61067a565b61015e6101ca366004611477565b61079e565b6101736101dd3660046112ca565b61083d565b6101736101f03660046114ac565b610880565b61015e6108d8565b61015e61020b3660046111fb565b61090e565b61015e61021e3660046112ca565b6109b5565b61015e6102313660046114c7565b610a61565b6000546040516001600160a01b039091168152602001610142565b61017361025f3660046112ca565b610b2d565b610138610272366004611477565b610b7d565b61017361028536600461151c565b610ba5565b61015e6102983660046114ac565b610d02565b60006102c86102ad836001610da5565b6102b890600a611670565b6102c28686610db8565b90610dc4565b949350505050565b604051806040016040528060048152602001631d5d1a5b60e21b8152506001816040516102fd919061167c565b908152602001604051809103902060006103143390565b6001600160a01b0316815260208101919091526040016000205460ff166103565760405162461bcd60e51b815260040161034d906116b7565b60405180910390fd5b81600884604051610367919061167c565b908152602001604051809103902054106103c6576103a58260088560405161038f919061167c565b9081526040519081900360200190205490610dd0565b6008846040516103b5919061167c565b908152604051908190036020019020555b505050565b6000604051806040016040528060048152602001631d5d1a5b60e21b8152506001816040516103fa919061167c565b908152602001604051809103902060006104113390565b6001600160a01b0316815260208101919091526040016000205460ff1661044a5760405162461bcd60e51b815260040161034d906116b7565b61046c848015610458575083155b6104625787610464565b865b858588610ddc565b1561047a576001915061047f565b600091505b5095945050505050565b604051806040016040528060048152602001631c9bdbdd60e21b8152506001816040516104b6919061167c565b908152602001604051809103902060006104cd3390565b6001600160a01b0316815260208101919091526040016000205460ff16806104ff57506000546001600160a01b031633145b61051b5760405162461bcd60e51b815260040161034d9061173a565b61052483610f26565b6000600184604051610536919061167c565b90815260408051602092819003830190206001600160a01b0395909516600090815294909152909220805460ff1916921515929092179091555050565b604051806040016040528060048152602001631d5d1a5b60e21b8152506001816040516105a0919061167c565b908152602001604051809103902060006105b73390565b6001600160a01b0316815260208101919091526040016000205460ff166105f05760405162461bcd60e51b815260040161034d906116b7565b60005b8351811015610673578260058660405161060d919061167c565b9081526020016040518091039020600086848151811061062f5761062f6117d1565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff19169115159190911790558061066b816117e7565b9150506105f3565b5050505050565b604051806040016040528060048152602001631c9bdbdd60e21b8152506001816040516106a7919061167c565b908152602001604051809103902060006106be3390565b6001600160a01b0316815260208101919091526040016000205460ff16806106f057506000546001600160a01b031633145b61070c5760405162461bcd60e51b815260040161034d9061173a565b61071583610f26565b60005b82518110156107985760018085604051610732919061167c565b90815260200160405180910390206000858481518110610754576107546117d1565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905580610790816117e7565b915050610718565b50505050565b604051806040016040528060048152602001631c9bdbdd60e21b8152506001816040516107cb919061167c565b908152602001604051809103902060006107e23390565b6001600160a01b0316815260208101919091526040016000205460ff168061081457506000546001600160a01b031633145b6108305760405162461bcd60e51b815260040161034d9061173a565b61083982610f26565b5050565b600060018360405161084f919061167c565b90815260408051602092819003830190206001600160a01b0385166000908152925290205460ff1690505b92915050565b6000600560405161089b9063313ab93760e11b815260040190565b90815260408051602092819003830190206001600160a01b0385166000908152925290205460ff16156108d057506001919050565b506000919050565b6000546001600160a01b031633146109025760405162461bcd60e51b815260040161034d90611802565b61090c6000610fc2565b565b604051806040016040528060048152602001631d5d1a5b60e21b81525060018160405161093b919061167c565b908152602001604051809103902060006109523390565b6001600160a01b0316815260208101919091526040016000205460ff1661098b5760405162461bcd60e51b815260040161034d906116b7565b6103a58260088560405161099f919061167c565b9081526040519081900360200190205490610da5565b604051806040016040528060048152602001631c9bdbdd60e21b8152506001816040516109e2919061167c565b908152602001604051809103902060006109f93390565b6001600160a01b0316815260208101919091526040016000205460ff1680610a2b57506000546001600160a01b031633145b610a475760405162461bcd60e51b815260040161034d9061173a565b610a5083610f26565b60018084604051610536919061167c565b604051806040016040528060048152602001631d5d1a5b60e21b815250600181604051610a8e919061167c565b90815260200160405180910390206000610aa53390565b6001600160a01b0316815260208101919091526040016000205460ff16610ade5760405162461bcd60e51b815260040161034d906116b7565b81600585604051610aef919061167c565b90815260408051602092819003830190206001600160a01b0396909616600090815295909152909320805460ff191693151593909317909255505050565b6000600583604051610b3f919061167c565b90815260408051602092819003830190206001600160a01b0385166000908152925290205460ff1615610b745750600161087a565b50600092915050565b6000600882604051610b8f919061167c565b9081526020016040518091039020549050919050565b6000604051806040016040528060048152602001631d5d1a5b60e21b815250600181604051610bd4919061167c565b90815260200160405180910390206000610beb3390565b6001600160a01b0316815260208101919091526040016000205460ff16610c245760405162461bcd60e51b815260040161034d906116b7565b6000600785604051610c36919061167c565b9081526040519081900360200190205460ff16610c5b57610c5685611012565b610c7b565b600685604051610c6b919061167c565b9081526020016040518091039020545b90506000600785604051610c8f919061167c565b9081526040519081900360200190205460ff16610cb457610caf85611012565b610cd4565b600685604051610cc4919061167c565b9081526020016040518091039020545b90508082148015610ce457508181145b15610cf457600193505050610cfb565b6000935050505b5092915050565b6000546001600160a01b03163314610d2c5760405162461bcd60e51b815260040161034d90611802565b6001600160a01b038116610d995760405162461bcd60e51b815260206004820152602e60248201527f5b6572726f725d5b6f776e61626c655d206e6577206f776e657220697320746860448201526d65207a65726f206164647265737360901b606482015260840161034d565b610da281610fc2565b50565b6000610db1828461184a565b9392505050565b6000610db18284611862565b6000610db18284611881565b6000610db182846118a3565b6000808215610f1d57600a548690600d9060ff1660038110610e0057610e006117d1565b0180546001600160a01b0319166001600160a01b0392909216919091179055600a548590600c9060ff1660038110610e3a57610e3a6117d1565b6020810491909101805460ff601f9093166101000a838102199091169315150292909217909155600a54166002148015610e715750835b8015610e915750600c5460ff168015610e915750600c54610100900460ff165b8015610ead5750600f54600d546001600160a01b039081169116145b15610ed257603c610ec960105442610dd090919063ffffffff16565b11610ed2575060015b600a805460ff16906000610ee5836118ba565b82546101009290920a60ff81810219909316918316021790915542601055600a546002911611159050610f1d57600a805460ff191690555b95945050505050565b600281604051610f36919061167c565b9081526040519081900360200190205460ff16610da2576001600282604051610f5f919061167c565b90815260405160209181900382019020805460ff191692151592909217909155600380546001810182556000919091528251610839927fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b9092019184019061107f565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000818051906020012060068360405161102c919061167c565b9081526020016040518091039020819055506001600783604051611050919061167c565b908152604051908190036020018120805492151560ff1990931692909217909155600690610b8f90849061167c565b82805461108b906118da565b90600052602060002090601f0160209004810192826110ad57600085556110f3565b82601f106110c657805160ff19168380011785556110f3565b828001600101855582156110f3579182015b828111156110f35782518255916020019190600101906110d8565b506110ff929150611103565b5090565b5b808211156110ff5760008155600101611104565b60008060006060848603121561112d57600080fd5b505081359360208301359350604090920135919050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561118357611183611144565b604052919050565b600082601f83011261119c57600080fd5b813567ffffffffffffffff8111156111b6576111b6611144565b6111c9601f8201601f191660200161115a565b8181528460208386010111156111de57600080fd5b816020850160208301376000918101602001919091529392505050565b6000806040838503121561120e57600080fd5b823567ffffffffffffffff81111561122557600080fd5b6112318582860161118b565b95602094909401359450505050565b80356001600160a01b038116811461125757600080fd5b919050565b8035801515811461125757600080fd5b600080600080600060a0868803121561128457600080fd5b61128d86611240565b945061129b60208701611240565b9350604086013592506112b06060870161125c565b91506112be6080870161125c565b90509295509295909350565b600080604083850312156112dd57600080fd5b823567ffffffffffffffff8111156112f457600080fd5b6113008582860161118b565b92505061130f60208401611240565b90509250929050565b600082601f83011261132957600080fd5b8135602067ffffffffffffffff82111561134557611345611144565b8160051b61135482820161115a565b928352848101820192828101908785111561136e57600080fd5b83870192505b848310156113945761138583611240565b82529183019190830190611374565b979650505050505050565b6000806000606084860312156113b457600080fd5b833567ffffffffffffffff808211156113cc57600080fd5b6113d88783880161118b565b945060208601359150808211156113ee57600080fd5b506113fb86828701611318565b92505061140a6040850161125c565b90509250925092565b6000806040838503121561142657600080fd5b823567ffffffffffffffff8082111561143e57600080fd5b61144a8683870161118b565b9350602085013591508082111561146057600080fd5b5061146d85828601611318565b9150509250929050565b60006020828403121561148957600080fd5b813567ffffffffffffffff8111156114a057600080fd5b6102c88482850161118b565b6000602082840312156114be57600080fd5b610db182611240565b6000806000606084860312156114dc57600080fd5b833567ffffffffffffffff8111156114f357600080fd5b6114ff8682870161118b565b93505061150e60208501611240565b915061140a6040850161125c565b6000806040838503121561152f57600080fd5b823567ffffffffffffffff8082111561154757600080fd5b6115538683870161118b565b9350602085013591508082111561156957600080fd5b5061146d8582860161118b565b634e487b7160e01b600052601160045260246000fd5b600181815b808511156115c75781600019048211156115ad576115ad611576565b808516156115ba57918102915b93841c9390800290611591565b509250929050565b6000826115de5750600161087a565b816115eb5750600061087a565b8160018114611601576002811461160b57611627565b600191505061087a565b60ff84111561161c5761161c611576565b50506001821b61087a565b5060208310610133831016604e8410600b841016171561164a575081810a61087a565b611654838361158c565b806000190482111561166857611668611576565b029392505050565b6000610db183836115cf565b6000825160005b8181101561169d5760208186018101518583015201611683565b818111156116ac576000828501525b509190910192915050565b6020808252605e908201527f5b6572726f725d5b726f6c652062617365642061636365737320636f6e74726f60408201527f6c5d206f6e6c79206164647265737365732061737369676e656420746869732060608201527f726f6c652063616e2061636365737320746869732066756e6374696f6e210000608082015260a00190565b6020808252606b908201527f5b6572726f725d5b726f6c652062617365642061636365737320636f6e74726f60408201527f6c5d206f6e6c79206164647265737365732061737369676e656420746869732060608201527f726f6c65206f7220746865206f776e65722063616e206163636573732074686960808201526a732066756e6374696f6e2160a81b60a082015260c00190565b634e487b7160e01b600052603260045260246000fd5b60006000198214156117fb576117fb611576565b5060010190565b60208082526028908201527f5b6572726f725d5b6f776e61626c655d2063616c6c6572206973206e6f74207460408201526734329037bbb732b960c11b606082015260800190565b6000821982111561185d5761185d611576565b500190565b600081600019048311821515161561187c5761187c611576565b500290565b60008261189e57634e487b7160e01b600052601260045260246000fd5b500490565b6000828210156118b5576118b5611576565b500390565b600060ff821660ff8114156118d1576118d1611576565b60010192915050565b600181811c908216806118ee57607f821691505b6020821081141561190f57634e487b7160e01b600052602260045260246000fd5b5091905056fea2646970667358221220d27854f15311be963fe5f967a9db8793da9593b3d6808db158092c291a72df1b64736f6c634300080c0033
Deployed Bytecode
0x6080604052600436106102605760003560e01c80636ac5db1911610144578063a81537ce116100b6578063d7c3e65f1161007a578063d7c3e65f14610718578063dd62ed3e1461073a578063de8090a114610780578063e0b75675146105e3578063e8078d94146107a0578063f2fde38b146107b557600080fd5b8063a81537ce1461068c578063a9059cbb146106ac578063ae462aab146106cc578063b75d4145146106ee578063bae7fff71461070357600080fd5b806387b3364a1161010857806387b3364a146105e35780638da5cb5b1461060357806395d89b4114610621578063a3907d7114610636578063a457c2d71461064b578063a5f0f1b21461066b57600080fd5b80636ac5db191461054257806370a0823114610557578063715018a61461058d57806382ea617a146105a257806386952382146105c257600080fd5b806334f86346116101dd5780634d9ae633116101a15780634d9ae6331461048b5780634e1a70c8146104a157806354f1fb13146104c257806357087597146104e25780635a1de8b31461050257806366e795091461052257600080fd5b806334f86346146103d6578063395093511461040b57806348af48a51461042b5780634b7193971461044b5780634c1eaa201461046b57600080fd5b80632143aa9d116102245780632143aa9d1461032557806323b872dd1461033c57806326fc3f5d1461035c5780632f5f92f714610394578063313ce567146103b457600080fd5b806302814b861461026c57806306fdde0314610294578063095ea7b3146102b657806318160ddd146102e65780631a686502146102fb57600080fd5b3661026757005b600080fd5b34801561027857600080fd5b506102816107d5565b6040519081526020015b60405180910390f35b3480156102a057600080fd5b506102a9610887565b60405161028b919061276f565b3480156102c257600080fd5b506102d66102d1366004612797565b610919565b604051901515815260200161028b565b3480156102f257600080fd5b50601054610281565b34801561030757600080fd5b5061031061092f565b6040805192835260208301919091520161028b565b34801561033157600080fd5b5061033a610a5c565b005b34801561034857600080fd5b506102d66103573660046127c3565b610af2565b34801561036857600080fd5b5060095461037c906001600160a01b031681565b6040516001600160a01b03909116815260200161028b565b3480156103a057600080fd5b5061033a6103af3660046128bb565b610b5b565b3480156103c057600080fd5b50600f5460405160ff909116815260200161028b565b3480156103e257600080fd5b50600c546103f890600160a01b900461ffff1681565b60405161ffff909116815260200161028b565b34801561041757600080fd5b506102d6610426366004612797565b610c45565b34801561043757600080fd5b5060075461037c906001600160a01b031681565b34801561045757600080fd5b5060055461037c906001600160a01b031681565b34801561047757600080fd5b5060085461037c906001600160a01b031681565b34801561049757600080fd5b5061028160165481565b3480156104ad57600080fd5b50600c546102d690600160d01b900460ff1681565b3480156104ce57600080fd5b5061033a6104dd366004612931565b610c7b565b3480156104ee57600080fd5b5061033a6104fd3660046129fa565b610da0565b34801561050e57600080fd5b506102d661051d3660046128bb565b610e3f565b34801561052e57600080fd5b5060065461037c906001600160a01b031681565b34801561054e57600080fd5b50610281610e83565b34801561056357600080fd5b50610281610572366004612a37565b6001600160a01b031660009081526011602052604090205490565b34801561059957600080fd5b5061033a610f25565b3480156105ae57600080fd5b5061033a6105bd366004612a6b565b610f5b565b3480156105ce57600080fd5b50600c546102d690600160d81b900460ff1681565b3480156105ef57600080fd5b5061033a6105fe3660046128bb565b611150565b34801561060f57600080fd5b506001546001600160a01b031661037c565b34801561062d57600080fd5b506102a96111fd565b34801561064257600080fd5b5061033a61120c565b34801561065757600080fd5b506102d6610666366004612797565b611303565b34801561067757600080fd5b50600c546102d690600160e01b900460ff1681565b34801561069857600080fd5b5061033a6106a7366004612ab9565b611352565b3480156106b857600080fd5b506102d66106c7366004612797565b611457565b3480156106d857600080fd5b50600c546103f890600160c01b900461ffff1681565b3480156106fa57600080fd5b5061033a611464565b34801561070f57600080fd5b5061033a6114f1565b34801561072457600080fd5b50600c546103f890600160b01b900461ffff1681565b34801561074657600080fd5b50610281610755366004612ad4565b6001600160a01b03918216600090815260126020908152604080832093909416825291909152205490565b34801561078c57600080fd5b5061028161079b3660046129fa565b611584565b3480156107ac57600080fd5b5061033a6115fc565b3480156107c157600080fd5b5061033a6107d0366004612a37565b61176c565b600c54600090600160d01b900460ff161561087c57600c5460105460405162160d4f60e11b81526004810191909152600160c01b820461ffff16602482015260016044820152610877916001600160a01b031690622c1a9e90606401602060405180830381865afa15801561084e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108729190612b02565b61180f565b905090565b61087760105461180f565b6060600d805461089690612b1b565b80601f01602080910402602001604051908101604052809291908181526020018280546108c290612b1b565b801561090f5780601f106108e45761010080835404028352916020019161090f565b820191906000526020600020905b8154815290600101906020018083116108f257829003601f168201915b5050505050905090565b6000610926338484611987565b50600192915050565b6000806000600b60009054906101000a90046001600160a01b03166001600160a01b0316630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa158015610987573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109ab9190612b56565b9050600080600b60009054906101000a90046001600160a01b03166001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015610a03573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a279190612b8a565b506001600160701b039182169350169050306001600160a01b0384161415610a53579094909350915050565b94909350915050565b604051806040016040528060048152602001631c9bdbdd60e21b815250600281604051610a899190612bda565b90815260200160405180910390206000610aa03390565b6001600160a01b0316815260208101919091526040016000205460ff16610ae25760405162461bcd60e51b8152600401610ad990612bf6565b60405180910390fd5b50600c805460ff60d81b19169055565b6000610aff848484611aaf565b610b518433610b4c8560405180606001604052806029815260200161305b602991396001600160a01b038a166000908152601260209081526040808320338452909152902054919061209e565b611987565b5060019392505050565b604051806040016040528060048152602001631c9bdbdd60e21b815250600281604051610b889190612bda565b90815260200160405180910390206000610b9f3390565b6001600160a01b0316815260208101919091526040016000205460ff1680610bd157506001546001600160a01b031633145b610bed5760405162461bcd60e51b8152600401610ad990612c79565b610bf6836120ca565b6000600284604051610c089190612bda565b90815260408051602092819003830190206001600160a01b0395909516600090815294909152909220805460ff1916921515929092179091555050565b3360008181526012602090815260408083206001600160a01b03871684529091528120549091610926918590610b4c9086612166565b604051806040016040528060048152602001631c9bdbdd60e21b815250600281604051610ca89190612bda565b90815260200160405180910390206000610cbf3390565b6001600160a01b0316815260208101919091526040016000205460ff1680610cf157506001546001600160a01b031633145b610d0d5760405162461bcd60e51b8152600401610ad990612c79565b610d16836120ca565b60005b8251811015610d9a576001600285604051610d349190612bda565b90815260200160405180910390206000858481518110610d5657610d56612d10565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905580610d9281612d3c565b915050610d19565b50505050565b604051806040016040528060048152602001631c9bdbdd60e21b815250600281604051610dcd9190612bda565b90815260200160405180910390206000610de43390565b6001600160a01b0316815260208101919091526040016000205460ff1680610e1657506001546001600160a01b031633145b610e325760405162461bcd60e51b8152600401610ad990612c79565b610e3b826120ca565b5050565b6000600283604051610e519190612bda565b908152604080519182900360209081019092206001600160a01b0385166000908152925290205460ff16905092915050565b600c54600090600160d01b900460ff1615610f1e57600c5460105460405162160d4f60e11b81526004810191909152600160c01b820461ffff166024820152600160448201526001600160a01b0390911690622c1a9e90606401602060405180830381865afa158015610efa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108779190612b02565b5060105490565b6001546001600160a01b03163314610f4f5760405162461bcd60e51b8152600401610ad990612d57565b610f596000612179565b565b604051806040016040528060048152602001631c9bdbdd60e21b815250600281604051610f889190612bda565b90815260200160405180910390206000610f9f3390565b6001600160a01b0316815260208101919091526040016000205460ff16610fd85760405162461bcd60e51b8152600401610ad990612bf6565b604051676d6178546178657360c01b81526014906008019081526020016040518091039020548361ffff1611156110215760405162461bcd60e51b8152600401610ad990612d9f565b600c5460405163ebfc665960e01b81526001600160a01b039091169063ebfc665990611051908590600401612df2565b6020604051808303816000875af1158015611070573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110949190612e2a565b156110b857600c805461ffff60a01b1916600160a01b61ffff861602179055505050565b600c5460405163ebfc665960e01b81526001600160a01b039091169063ebfc6659906110e8908590600401612e4c565b6020604051808303816000875af1158015611107573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061112b9190612e2a565b1561114b57600c805461ffff60b01b1916600160b01b61ffff8616021790555b505050565b604051806040016040528060048152602001631c9bdbdd60e21b81525060028160405161117d9190612bda565b908152602001604051809103902060006111943390565b6001600160a01b0316815260208101919091526040016000205460ff16806111c657506001546001600160a01b031633145b6111e25760405162461bcd60e51b8152600401610ad990612c79565b6111eb836120ca565b6001600284604051610c089190612bda565b6060600e805461089690612b1b565b604051806040016040528060048152602001631c9bdbdd60e21b8152506002816040516112399190612bda565b908152602001604051809103902060006112503390565b6001600160a01b0316815260208101919091526040016000205460ff166112895760405162461bcd60e51b8152600401610ad990612bf6565b600c54600160e01b900460ff16156112ed5760405162461bcd60e51b815260206004820152602160248201527f5b6572726f725d20636f6e747261637420616c726561647920656e61626c65646044820152602160f81b6064820152608401610ad9565b50600c805460ff60e01b1916600160e01b179055565b60006109263384610b4c85604051806060016040528060268152602001613084602691393360009081526012602090815260408083206001600160a01b038d168452909152902054919061209e565b604051806040016040528060048152602001631c9bdbdd60e21b81525060028160405161137f9190612bda565b908152602001604051809103902060006113963390565b6001600160a01b0316815260208101919091526040016000205460ff166113cf5760405162461bcd60e51b8152600401610ad990612bf6565b604051721b5a5b951c985b9cd858dd1a5bdb931a5b5a5d606a1b81526014906013019081526020016040518091039020548261ffff1610156114235760405162461bcd60e51b8152600401610ad990612d9f565b50600c805460ff60d01b1961ffff909316600160c01b029290921662ffffff60c01b1990921691909117600160d01b179055565b6000610926338484611aaf565b604051806040016040528060048152602001631c9bdbdd60e21b8152506002816040516114919190612bda565b908152602001604051809103902060006114a83390565b6001600160a01b0316815260208101919091526040016000205460ff166114e15760405162461bcd60e51b8152600401610ad990612bf6565b50600c805460ff60d01b19169055565b604051806040016040528060048152602001631c9bdbdd60e21b81525060028160405161151e9190612bda565b908152602001604051809103902060006115353390565b6001600160a01b0316815260208101919091526040016000205460ff1661156e5760405162461bcd60e51b8152600401610ad990612bf6565b50600c805460ff60d81b1916600160d81b179055565b600c5460405163de8090a160e01b81526000916001600160a01b03169063de8090a1906115b590859060040161276f565b602060405180830381865afa1580156115d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115f69190612b02565b92915050565b604051806040016040528060048152602001631c9bdbdd60e21b8152506002816040516116299190612bda565b908152602001604051809103902060006116403390565b6001600160a01b0316815260208101919091526040016000205460ff166116795760405162461bcd60e51b8152600401610ad990612bf6565b600047116116995760405162461bcd60e51b8152600401610ad990612e85565b306000908152601160205260409020546116c55760405162461bcd60e51b8152600401610ad990612e85565b600a543060008181526011602052604080822054600554915163f305d71960e01b8152600481019490945260248401526044830182905260648301919091526001600160a01b0390811660848301524260a48301529091169063f305d71990479060c40160606040518083038185885af1158015611747573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610d9a9190612ed3565b6001546001600160a01b031633146117965760405162461bcd60e51b8152600401610ad990612d57565b6001600160a01b0381166118035760405162461bcd60e51b815260206004820152602e60248201527f5b6572726f725d5b6f776e61626c655d206e6577206f776e657220697320746860448201526d65207a65726f206164647265737360901b6064820152608401610ad9565b61180c81612179565b50565b60408051600280825260608201835260009283929190602083019080368337019050509050308160008151811061184857611848612d10565b6001600160a01b03928316602091820292909201810191909152600a54604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa1580156118a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118c59190612b56565b816001815181106118d8576118d8612d10565b6001600160a01b039283166020918202929092010152600a5460405163d06ca61f60e01b8152600092919091169063d06ca61f9061191c9087908690600401612f45565b600060405180830381865afa158015611939573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526119619190810190612f5e565b90508060018151811061197657611976612d10565b602002602001015192505050919050565b6001600160a01b0383166119eb5760405162461bcd60e51b815260206004820152602560248201527f5b6572726f725d20617070726f76652066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610ad9565b6001600160a01b038216611a4d5760405162461bcd60e51b815260206004820152602360248201527f5b6572726f725d20617070726f766520746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610ad9565b6001600160a01b0383811660008181526012602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6000806000846001600160a01b0316866001600160a01b03167f16542a7bd18d94bdfcf497ede968d3d1c95acdba5fddded55a9d144c733d9db086604051611af991815260200190565b60405180910390a36008546001600160a01b0387811691161415611b805760019250600c60149054906101000a900461ffff169050846001600160a01b0316866001600160a01b03167fef687d17b47636d53baf11f62ed7e944c32ed430b427c480b1e01dca6446569186604051611b7391815260200190565b60405180910390a3611c38565b6008546001600160a01b0386811691161415611bea575050600c54604051838152600191600160b01b900461ffff16906001600160a01b0386811691908816907fa240c9852222065f264d0b2ec0914521b71337aa869fbf77aa267cb72e7f23ba90602001611b73565b846001600160a01b0316866001600160a01b03167fa4c7c1f20958780a8f5b5e6e2485372318bd9059f09091d9d75671dbbb48380886604051611c2f91815260200190565b60405180910390a35b6001600160a01b03861660009081526013602052604090205460ff1680611c7757506001600160a01b03851660009081526013602052604090205460ff165b15611cd957611c878686866121cb565b846001600160a01b0316866001600160a01b03167f3e1d6434526bea9f39e1f31904503ec82a3dc686beec4d7e6f9cd1766af0a63686604051611ccc91815260200190565b60405180910390a361206d565b600c54600160e01b900460ff16611d3c5760405162461bcd60e51b815260206004820152602160248201527f5b6572726f725d20636f6e7472616374206e6f7420656e61626c6564207965746044820152602160f81b6064820152608401610ad9565b600c54600160d81b900460ff1615611e2a57600c5460405163044dcbdf60e01b81526001600160a01b038881166004830152878116602483015260448201879052851515606483015284151560848301529091169063044dcbdf9060a4016020604051808303816000875af1158015611db9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ddd9190612e2a565b15611e2a5760405162461bcd60e51b815260206004820152601e60248201527f5b6572726f725d20736f727279206e6f2066726f6e7472756e6e6572732100006044820152606401610ad9565b600c54600160d01b900460ff1615611ea157611e498686868686612339565b15611ea15760405162461bcd60e51b815260206004820152602260248201527f5b6572726f725d207472616e73616374696f6e206c696d697420776173206869604482015261742160f01b6064820152608401610ad9565b600061ffff821615611f5357600c5460405162160d4f60e11b81526004810187905261ffff84166024820152600160448201526001600160a01b0390911690622c1a9e90606401602060405180830381865afa158015611f05573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f299190612b02565b9050611f368730836121cb565b601654611f439082612166565b601655611f5085826124e1565b94505b60155460ff16158015611f635750825b8015611f7157506000601654115b1561200a57601654600554600091611f91916001600160a01b03166124ed565b9050866001600160a01b0316886001600160a01b03167fb13f1a8dc245ebc96f5efc4afa191303024f8086370f01240b4c598ef07bb8d7888560165486604051611ff4949392919093845260208401929092526040830152606082015260800190565b60405180910390a380156120085760006016555b505b6120158787876121cb565b856001600160a01b0316876001600160a01b03167f9e36ac0e8ad1a8bee2bb4578d4c63006d276346c8238cc5b34cf2474d4097ccb8784604051612063929190918252602082015260400190565b60405180910390a3505b6040517ff0f2c9ae2d19d4568c8598dfa5d0f4f00d31fc8c3a8c975eef10f9cf586155ff90600090a1505050505050565b600081848411156120c25760405162461bcd60e51b8152600401610ad9919061276f565b505050900390565b6003816040516120da9190612bda565b9081526040519081900360200190205460ff1661180c5760016003826040516121039190612bda565b90815260405160209181900382019020805460ff191692151592909217909155600480546001810182556000919091528251610e3b927f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b9092019184019061267e565b60006121728284612fef565b9392505050565b600180546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0383166000908152601160205260409020546121ee90826124e1565b6001600160a01b03808516600090815260116020526040808220939093559084168152205461221d9082612166565b6001600160a01b038381166000818152601160205260409081902093909355600c54925163371b333f60e11b81526004810191909152911690636e36667e90602401602060405180830381865afa15801561227c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122a09190612e2a565b156122f4576010546122b290826124e1565b6010556040518181526001600160a01b038416907fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca59060200160405180910390a25b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611aa291815260200190565b600c5460405163371b333f60e11b81526001600160a01b0387811660048301526000921690636e36667e90602401602060405180830381865afa158015612384573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123a89190612e2a565b1580156124205750600c5460405163371b333f60e11b81526001600160a01b03878116600483015290911690636e36667e90602401602060405180830381865afa1580156123fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061241e9190612e2a565b155b80156124325750828015612432575081155b156124d457600c5460105460405162160d4f60e11b81526004810191909152600160c01b820461ffff166024820152600160448201526000916001600160a01b031690622c1a9e90606401602060405180830381865afa15801561249a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124be9190612b02565b9050808511156124d25760019150506124d8565b505b5060005b95945050505050565b60006121728284613007565b6015805460ff1916600117905560006125068383612517565b6015805460ff191690559392505050565b60408051600280825260608201835260009283929190602083019080368337019050509050308160008151811061255057612550612d10565b6001600160a01b03928316602091820292909201810191909152600a54604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa1580156125a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125cd9190612b56565b816001815181106125e0576125e0612d10565b6001600160a01b039283166020918202929092010152600a5460405163791ac94760e01b81528583163192919091169063791ac9479061262d90889060009087908a90429060040161301e565b600060405180830381600087803b15801561264757600080fd5b505af115801561265b573d6000803e3d6000fd5b505050506001600160a01b0384163161267481836124e1565b9695505050505050565b82805461268a90612b1b565b90600052602060002090601f0160209004810192826126ac57600085556126f2565b82601f106126c557805160ff19168380011785556126f2565b828001600101855582156126f2579182015b828111156126f25782518255916020019190600101906126d7565b506126fe929150612702565b5090565b5b808211156126fe5760008155600101612703565b60005b8381101561273257818101518382015260200161271a565b83811115610d9a5750506000910152565b6000815180845261275b816020860160208601612717565b601f01601f19169290920160200192915050565b6020815260006121726020830184612743565b6001600160a01b038116811461180c57600080fd5b600080604083850312156127aa57600080fd5b82356127b581612782565b946020939093013593505050565b6000806000606084860312156127d857600080fd5b83356127e381612782565b925060208401356127f381612782565b929592945050506040919091013590565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561284357612843612804565b604052919050565b600082601f83011261285c57600080fd5b813567ffffffffffffffff81111561287657612876612804565b612889601f8201601f191660200161281a565b81815284602083860101111561289e57600080fd5b816020850160208301376000918101602001919091529392505050565b600080604083850312156128ce57600080fd5b823567ffffffffffffffff8111156128e557600080fd5b6128f18582860161284b565b925050602083013561290281612782565b809150509250929050565b600067ffffffffffffffff82111561292757612927612804565b5060051b60200190565b6000806040838503121561294457600080fd5b823567ffffffffffffffff8082111561295c57600080fd5b6129688683870161284b565b935060209150818501358181111561297f57600080fd5b85019050601f8101861361299257600080fd5b80356129a56129a08261290d565b61281a565b81815260059190911b820183019083810190888311156129c457600080fd5b928401925b828410156129eb5783356129dc81612782565b825292840192908401906129c9565b80955050505050509250929050565b600060208284031215612a0c57600080fd5b813567ffffffffffffffff811115612a2357600080fd5b612a2f8482850161284b565b949350505050565b600060208284031215612a4957600080fd5b813561217281612782565b803561ffff81168114612a6657600080fd5b919050565b60008060408385031215612a7e57600080fd5b612a8783612a54565b9150602083013567ffffffffffffffff811115612aa357600080fd5b612aaf8582860161284b565b9150509250929050565b600060208284031215612acb57600080fd5b61217282612a54565b60008060408385031215612ae757600080fd5b8235612af281612782565b9150602083013561290281612782565b600060208284031215612b1457600080fd5b5051919050565b600181811c90821680612b2f57607f821691505b60208210811415612b5057634e487b7160e01b600052602260045260246000fd5b50919050565b600060208284031215612b6857600080fd5b815161217281612782565b80516001600160701b0381168114612a6657600080fd5b600080600060608486031215612b9f57600080fd5b612ba884612b73565b9250612bb660208501612b73565b9150604084015163ffffffff81168114612bcf57600080fd5b809150509250925092565b60008251612bec818460208701612717565b9190910192915050565b6020808252605e908201527f5b6572726f725d5b726f6c652062617365642061636365737320636f6e74726f60408201527f6c5d206f6e6c79206164647265737365732061737369676e656420746869732060608201527f726f6c652063616e2061636365737320746869732066756e6374696f6e210000608082015260a00190565b6020808252606b908201527f5b6572726f725d5b726f6c652062617365642061636365737320636f6e74726f60408201527f6c5d206f6e6c79206164647265737365732061737369676e656420746869732060608201527f726f6c65206f7220746865206f776e65722063616e206163636573732074686960808201526a732066756e6374696f6e2160a81b60a082015260c00190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600019821415612d5057612d50612d26565b5060010190565b60208082526028908201527f5b6572726f725d5b6f776e61626c655d2063616c6c6572206973206e6f74207460408201526734329037bbb732b960c11b606082015260800190565b60208082526033908201527f5b6572726f725d207661726961626c65206973206e6f742077697468696e2074604082015272686520616c6c6f776564206d61782c6d696e2160681b606082015260800190565b604081526000612e056040830184612743565b8281036020840152600381526262757960e81b60208201526040810191505092915050565b600060208284031215612e3c57600080fd5b8151801515811461217257600080fd5b604081526000612e5f6040830184612743565b828103602084015260048152631cd95b1b60e21b60208201526040810191505092915050565b6020808252602e908201527f5b6572726f725d20636f6e747261637420686173206e6f2062616c616e63652060408201526d666f72206c69717569646974792160901b606082015260800190565b600080600060608486031215612ee857600080fd5b8351925060208401519150604084015190509250925092565b600081518084526020808501945080840160005b83811015612f3a5781516001600160a01b031687529582019590820190600101612f15565b509495945050505050565b828152604060208201526000612a2f6040830184612f01565b60006020808385031215612f7157600080fd5b825167ffffffffffffffff811115612f8857600080fd5b8301601f81018513612f9957600080fd5b8051612fa76129a08261290d565b81815260059190911b82018301908381019087831115612fc657600080fd5b928401925b82841015612fe457835182529284019290840190612fcb565b979650505050505050565b6000821982111561300257613002612d26565b500190565b60008282101561301957613019612d26565b500390565b85815284602082015260a06040820152600061303d60a0830186612f01565b6001600160a01b039490941660608301525060800152939250505056fe5b6572726f725d207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63655b6572726f725d2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212207959f40cd9294cfee635091529f637ceca862089aa71a0a52912874d9cae2db564736f6c634300080c0033
Deployed Bytecode Sourcemap
60147:18502:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71905:249;;;;;;;;;;;;;:::i;:::-;;;160:25:1;;;148:2;133:18;71905:249:0;;;;;;;;69060:83;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;69719:160::-;;;;;;;;;;-1:-1:-1;69719:160:0;;;;;:::i;:::-;;:::i;:::-;;;1568:14:1;;1561:22;1543:41;;1531:2;1516:18;69719:160:0;1403:187:1;69336:99:0;;;;;;;;;;-1:-1:-1;69414:12:0;;69336:99;;71336:339;;;;;;;;;;;;;:::i;:::-;;;;1769:25:1;;;1825:2;1810:18;;1803:34;;;;1742:18;71336:339:0;1595:248:1;67929:166:0;;;;;;;;;;;;;:::i;:::-;;70894:313;;;;;;;;;;-1:-1:-1;70894:313:0;;;;;:::i;:::-;;:::i;60845:74::-;;;;;;;;;;-1:-1:-1;60845:74:0;;;;-1:-1:-1;;;;;60845:74:0;;;;;;-1:-1:-1;;;;;2473:32:1;;;2455:51;;2443:2;2428:18;60845:74:0;2309:203:1;52639:198:0;;;;;;;;;;-1:-1:-1;52639:198:0;;;;;:::i;:::-;;:::i;69246:82::-;;;;;;;;;;-1:-1:-1;69310:9:0;;69246:82;;69310:9;;;;4069:36:1;;4057:2;4042:18;69246:82:0;3927:184:1;61274:25:0;;;;;;;;;;-1:-1:-1;61274:25:0;;;;-1:-1:-1;;;61274:25:0;;;;;;;;;4290:6:1;4278:19;;;4260:38;;4248:2;4233:18;61274:25:0;4116:188:1;70234:209:0;;;;;;;;;;-1:-1:-1;70234:209:0;;;;;:::i;:::-;;:::i;60685:45::-;;;;;;;;;;-1:-1:-1;60685:45:0;;;;-1:-1:-1;;;;;60685:45:0;;;60466:75;;;;;;;;;;-1:-1:-1;60466:75:0;;;;-1:-1:-1;;;;;60466:75:0;;;60765:27;;;;;;;;;;-1:-1:-1;60765:27:0;;;;-1:-1:-1;;;;;60765:27:0;;;62605:20;;;;;;;;;;;;;;;;61500:44;;;;;;;;;;-1:-1:-1;61500:44:0;;;;-1:-1:-1;;;61500:44:0;;;;;;52127:289;;;;;;;;;;-1:-1:-1;52127:289:0;;;;;:::i;:::-;;:::i;51992:123::-;;;;;;;;;;-1:-1:-1;51992:123:0;;;;;:::i;:::-;;:::i;53087:157::-;;;;;;;;;;-1:-1:-1;53087:157:0;;;;;:::i;:::-;;:::i;60613:40::-;;;;;;;;;;-1:-1:-1;60613:40:0;;;;-1:-1:-1;;;;;60613:40:0;;;71683:214;;;;;;;;;;;;;:::i;69443:118::-;;;;;;;;;;-1:-1:-1;69443:118:0;;;;;:::i;:::-;-1:-1:-1;;;;;69534:18:0;69508:7;69534:18;;;:9;:18;;;;;;;69443:118;20362:103;;;;;;;;;;;;;:::i;66856:372::-;;;;;;;;;;-1:-1:-1;66856:372:0;;;;;:::i;:::-;;:::i;61597:51::-;;;;;;;;;;-1:-1:-1;61597:51:0;;;;-1:-1:-1;;;61597:51:0;;;;;;52428:199;;;;;;;;;;-1:-1:-1;52428:199:0;;;;;:::i;:::-;;:::i;19703:87::-;;;;;;;;;;-1:-1:-1;19776:6:0;;-1:-1:-1;;;;;19776:6:0;19703:87;;69151;;;;;;;;;;;;;:::i;66709:139::-;;;;;;;;;;;;;:::i;70451:261::-;;;;;;;;;;-1:-1:-1;70451:261:0;;;;;:::i;:::-;;:::i;61708:19::-;;;;;;;;;;-1:-1:-1;61708:19:0;;;;-1:-1:-1;;;61708:19:0;;;;;;67236:358;;;;;;;;;;-1:-1:-1;67236:358:0;;;;;:::i;:::-;;:::i;70720:166::-;;;;;;;;;;-1:-1:-1;70720:166:0;;;;;:::i;:::-;;:::i;61394:43::-;;;;;;;;;;-1:-1:-1;61394:43:0;;;;-1:-1:-1;;;61394:43:0;;;;;;67602:148;;;;;;;;;;;;;:::i;67758:163::-;;;;;;;;;;;;;:::i;61318:26::-;;;;;;;;;;-1:-1:-1;61318:26:0;;;;-1:-1:-1;;;61318:26:0;;;;;;69569:142;;;;;;;;;;-1:-1:-1;69569:142:0;;;;;:::i;:::-;-1:-1:-1;;;;;69675:18:0;;;69649:7;69675:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;69569:142;71217:111;;;;;;;;;;-1:-1:-1;71217:111:0;;;;;:::i;:::-;;:::i;66218:483::-;;;;;;;;;;;;;:::i;20620:209::-;;;;;;;;;;-1:-1:-1;20620:209:0;;;;;:::i;:::-;;:::i;71905:249::-;71965:25;;71943:7;;-1:-1:-1;;;71965:25:0;;;;71962:137;;;72028:5;;72042:12;;72028:57;;-1:-1:-1;;;72028:57:0;;;;;7622:25:1;;;;-1:-1:-1;;;72056:25:0;;;;7663:18:1;;;7656:47;72028:5:0;7719:18:1;;;7712:34;72013:73:0;;-1:-1:-1;;;;;72028:5:0;;:13;;7595:18:1;;72028:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;72013:14;:73::i;:::-;72006:81;;71905:249;:::o;71962:137::-;72116:28;72131:12;;72116:14;:28::i;69060:83::-;69096:13;69129:5;69122:13;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69060:83;:::o;69719:160::-;69793:4;69809:39;1260:10;69832:7;69841:6;69809:8;:39::i;:::-;-1:-1:-1;69866:4:0;69719:160;;;;:::o;71336:339::-;71377:15;71394:13;71419:14;71436:5;;;;;;;;;-1:-1:-1;;;;;71436:5:0;-1:-1:-1;;;;;71436:12:0;;:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;71419:31;;71462:16;71480;71501:5;;;;;;;;;-1:-1:-1;;;;;71501:5:0;-1:-1:-1;;;;;71501:17:0;;:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;71461:59:0;;;;-1:-1:-1;71461:59:0;;-1:-1:-1;71542:4:0;-1:-1:-1;;;;;71534:23:0;;;71531:137;;;71580:8;;71590;;-1:-1:-1;71336:339:0;-1:-1:-1;;71336:339:0:o;71531:137::-;71637:8;71647;;-1:-1:-1;71336:339:0;-1:-1:-1;;71336:339:0:o;67929:166::-;50720:223;;;;;;;;;;;;;-1:-1:-1;;;50720:223:0;;;50781:14;50796:5;50781:21;;;;;;:::i;:::-;;;;;;;;;;;;;:35;50803:12;1260:10;;1180:98;50803:12;-1:-1:-1;;;;;50781:35:0;;;;;;;;;;;;-1:-1:-1;50781:35:0;;;;50773:142;;;;-1:-1:-1;;;50773:142:0;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;68047:32:0::1;:40:::0;;-1:-1:-1;;;;68047:40:0::1;::::0;;67929:166::o;70894:313::-;70991:4;71007:36;71017:6;71025:9;71036:6;71007:9;:36::i;:::-;71054:122;71063:6;1260:10;71085:90;71123:6;71085:90;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;71085:19:0;;;;;;:11;:19;;;;;;;;1260:10;71085:33;;;;;;;;;;:37;:90::i;:::-;71054:8;:122::i;:::-;-1:-1:-1;71194:4:0;70894:313;;;;;:::o;52639:198::-;51681:270;;;;;;;;;;;;;-1:-1:-1;;;51681:270:0;;;51749:14;51764:5;51749:21;;;;;;:::i;:::-;;;;;;;;;;;;;:35;51771:12;1260:10;;1180:98;51771:12;-1:-1:-1;;;;;51749:35:0;;;;;;;;;;;;-1:-1:-1;51749:35:0;;;;;:62;;-1:-1:-1;19776:6:0;;-1:-1:-1;;;;;19776:6:0;1260:10;51788:23;51749:62;51741:182;;;;-1:-1:-1;;;51741:182:0;;;;;;;:::i;:::-;52757:15:::1;52766:5;52757:8;:15::i;:::-;52820:5;52787:14;52802:5;52787:21;;;;;;:::i;:::-;::::0;;;::::1;::::0;;::::1;::::0;;;;;;;;-1:-1:-1;;;;;52787:30:0;;;::::1;;::::0;;;;;;;;;;:38;;-1:-1:-1;;52787:38:0::1;::::0;::::1;;::::0;;;::::1;::::0;;;-1:-1:-1;;52639:198:0:o;70234:209::-;1260:10;70313:4;70361:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;70361:34:0;;;;;;;;;;70313:4;;70329:83;;70352:7;;70361:50;;70400:10;70361:38;:50::i;52127:289::-;51681:270;;;;;;;;;;;;;-1:-1:-1;;;51681:270:0;;;51749:14;51764:5;51749:21;;;;;;:::i;:::-;;;;;;;;;;;;;:35;51771:12;1260:10;;1180:98;51771:12;-1:-1:-1;;;;;51749:35:0;;;;;;;;;;;;-1:-1:-1;51749:35:0;;;;;:62;;-1:-1:-1;19776:6:0;;-1:-1:-1;;;;;19776:6:0;1260:10;51788:23;51749:62;51741:182;;;;-1:-1:-1;;;51741:182:0;;;;;;;:::i;:::-;52259:15:::1;52268:5;52259:8;:15::i;:::-;52293:9;52289:116;52308:8;:15;52306:1;:17;52289:116;;;52385:4;52348:14;52363:5;52348:21;;;;;;:::i;:::-;;;;;;;;;;;;;:34;52370:8;52379:1;52370:11;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;52348:34:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;52348:34:0;:41;;-1:-1:-1;;52348:41:0::1;::::0;::::1;;::::0;;;::::1;::::0;;52325:3;::::1;::::0;::::1;:::i;:::-;;;;52289:116;;;;52127:289:::0;;;:::o;51992:123::-;51681:270;;;;;;;;;;;;;-1:-1:-1;;;51681:270:0;;;51749:14;51764:5;51749:21;;;;;;:::i;:::-;;;;;;;;;;;;;:35;51771:12;1260:10;;1180:98;51771:12;-1:-1:-1;;;;;51749:35:0;;;;;;;;;;;;-1:-1:-1;51749:35:0;;;;;:62;;-1:-1:-1;19776:6:0;;-1:-1:-1;;;;;19776:6:0;1260:10;51788:23;51749:62;51741:182;;;;-1:-1:-1;;;51741:182:0;;;;;;;:::i;:::-;52088:15:::1;52097:5;52088:8;:15::i;:::-;51992:123:::0;;:::o;53087:157::-;53173:4;53200:14;53215:5;53200:21;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;53200:31:0;;;;;;;;;;;;;;-1:-1:-1;53087:157:0;;;;:::o;71683:214::-;71740:25;;71718:7;;-1:-1:-1;;;71740:25:0;;;;71737:121;;;71788:5;;71802:12;;71788:57;;-1:-1:-1;;;71788:57:0;;;;;7622:25:1;;;;-1:-1:-1;;;71816:25:0;;;;7663:18:1;;;7656:47;71788:5:0;7719:18:1;;;7712:34;-1:-1:-1;;;;;71788:5:0;;;;:13;;7595:18:1;;71788:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;71737:121::-;-1:-1:-1;71875:12:0;;;71683:214::o;20362:103::-;19776:6;;-1:-1:-1;;;;;19776:6:0;1260:10;19923:23;19915:76;;;;-1:-1:-1;;;19915:76:0;;;;;;;:::i;:::-;20427:30:::1;20454:1;20427:18;:30::i;:::-;20362:103::o:0;66856:372::-;50720:223;;;;;;;;;;;;;-1:-1:-1;;;50720:223:0;;;50781:14;50796:5;50781:21;;;;;;:::i;:::-;;;;;;;;;;;;;:35;50803:12;1260:10;;1180:98;50803:12;-1:-1:-1;;;;;50781:35:0;;;;;;;;;;;;-1:-1:-1;50781:35:0;;;;50773:142;;;;-1:-1:-1;;;50773:142:0;;;;;;;:::i;:::-;66967:20:::1;::::0;-1:-1:-1;;;11591:23:1;;66967:8:0::1;::::0;11639:1:1;11630:11;66967:20:0::1;;;;;;;;;;;;;66957:6;:30;;;;66949:94;;;;-1:-1:-1::0;;;66949:94:0::1;;;;;;;:::i;:::-;67057:5;::::0;:33:::1;::::0;-1:-1:-1;;;67057:33:0;;-1:-1:-1;;;;;67057:5:0;;::::1;::::0;:14:::1;::::0;:33:::1;::::0;67072:10;;67057:33:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;67054:167;;;67106:7;:16:::0;;-1:-1:-1;;;;67106:16:0::1;-1:-1:-1::0;;;67106:16:0::1;::::0;::::1;;;::::0;;66856:372;;;:::o;67054:167::-:1;67142:5;::::0;:34:::1;::::0;-1:-1:-1;;;67142:34:0;;-1:-1:-1;;;;;67142:5:0;;::::1;::::0;:14:::1;::::0;:34:::1;::::0;67157:10;;67142:34:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;67139:82;;;67192:8;:17:::0;;-1:-1:-1;;;;67192:17:0::1;-1:-1:-1::0;;;67192:17:0::1;::::0;::::1;;;::::0;;67139:82:::1;66856:372:::0;;;:::o;52428:199::-;51681:270;;;;;;;;;;;;;-1:-1:-1;;;51681:270:0;;;51749:14;51764:5;51749:21;;;;;;:::i;:::-;;;;;;;;;;;;;:35;51771:12;1260:10;;1180:98;51771:12;-1:-1:-1;;;;;51749:35:0;;;;;;;;;;;;-1:-1:-1;51749:35:0;;;;;:62;;-1:-1:-1;19776:6:0;;-1:-1:-1;;;;;19776:6:0;1260:10;51788:23;51749:62;51741:182;;;;-1:-1:-1;;;51741:182:0;;;;;;;:::i;:::-;52548:15:::1;52557:5;52548:8;:15::i;:::-;52611:4;52578:14;52593:5;52578:21;;;;;;:::i;69151:87::-:0;69189:13;69222:7;69215:15;;;;;:::i;66709:139::-;50720:223;;;;;;;;;;;;;-1:-1:-1;;;50720:223:0;;;50781:14;50796:5;50781:21;;;;;;:::i;:::-;;;;;;;;;;;;;:35;50803:12;1260:10;;1180:98;50803:12;-1:-1:-1;;;;;50781:35:0;;;;;;;;;;;;-1:-1:-1;50781:35:0;;;;50773:142;;;;-1:-1:-1;;;50773:142:0;;;;;;;:::i;:::-;66770:7:::1;::::0;-1:-1:-1;;;66770:7:0;::::1;;;66769:8;66761:54;;;::::0;-1:-1:-1;;;66761:54:0;;13533:2:1;66761:54:0::1;::::0;::::1;13515:21:1::0;13572:2;13552:18;;;13545:30;13611:34;13591:18;;;13584:62;-1:-1:-1;;;13662:18:1;;;13655:31;13703:19;;66761:54:0::1;13331:397:1::0;66761:54:0::1;-1:-1:-1::0;66826:7:0::1;:14:::0;;-1:-1:-1;;;;66826:14:0::1;-1:-1:-1::0;;;66826:14:0::1;::::0;;66709:139::o;70451:261::-;70535:4;70551:130;1260:10;70574:7;70583:97;70622:15;70583:97;;;;;;;;;;;;;;;;;1260:10;70583:25;;;;:11;:25;;;;;;;;-1:-1:-1;;;;;70583:34:0;;;;;;;;;;;;:38;:97::i;67236:358::-;50720:223;;;;;;;;;;;;;-1:-1:-1;;;50720:223:0;;;50781:14;50796:5;50781:21;;;;;;:::i;:::-;;;;;;;;;;;;;:35;50803:12;1260:10;;1180:98;50803:12;-1:-1:-1;;;;;50781:35:0;;;;;;;;;;;;-1:-1:-1;50781:35:0;;;;50773:142;;;;-1:-1:-1;;;50773:142:0;;;;;;;:::i;:::-;67411:31:::1;::::0;-1:-1:-1;;;13935:34:1;;67411:8:0::1;::::0;13994:2:1;13985:12;67411:31:0::1;;;;;;;;;;;;;67401:6;:41;;;;67393:105;;;;-1:-1:-1::0;;;67393:105:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;67509:25:0::1;:34:::0;;-1:-1:-1;;;;67509:34:0::1;::::0;;::::1;-1:-1:-1::0;;;67509:34:0::1;67554:32:::0;;;;-1:-1:-1;;;;67554:32:0;;;;;;;-1:-1:-1;;;67554:32:0::1;::::0;;67236:358::o;70720:166::-;70797:4;70813:42;1260:10;70837:9;70848:6;70813:9;:42::i;67602:148::-;50720:223;;;;;;;;;;;;;-1:-1:-1;;;50720:223:0;;;50781:14;50796:5;50781:21;;;;;;:::i;:::-;;;;;;;;;;;;;:35;50803:12;1260:10;;1180:98;50803:12;-1:-1:-1;;;;;50781:35:0;;;;;;;;;;;;-1:-1:-1;50781:35:0;;;;50773:142;;;;-1:-1:-1;;;50773:142:0;;;;;;;:::i;:::-;-1:-1:-1;67709:25:0::1;:33:::0;;-1:-1:-1;;;;67709:33:0::1;::::0;;67602:148::o;67758:163::-;50720:223;;;;;;;;;;;;;-1:-1:-1;;;50720:223:0;;;50781:14;50796:5;50781:21;;;;;;:::i;:::-;;;;;;;;;;;;;:35;50803:12;1260:10;;1180:98;50803:12;-1:-1:-1;;;;;50781:35:0;;;;;;;;;;;;-1:-1:-1;50781:35:0;;;;50773:142;;;;-1:-1:-1;;;50773:142:0;;;;;;;:::i;:::-;-1:-1:-1;67874:32:0::1;:39:::0;;-1:-1:-1;;;;67874:39:0::1;-1:-1:-1::0;;;67874:39:0::1;::::0;;67758:163::o;71217:111::-;71300:5;;:19;;-1:-1:-1;;;71300:19:0;;71274:7;;-1:-1:-1;;;;;71300:5:0;;:11;;:19;;71312:6;;71300:19;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;71293:27;71217:111;-1:-1:-1;;71217:111:0:o;66218:483::-;50720:223;;;;;;;;;;;;;-1:-1:-1;;;50720:223:0;;;50781:14;50796:5;50781:21;;;;;;:::i;:::-;;;;;;;;;;;;;:35;50803:12;1260:10;;1180:98;50803:12;-1:-1:-1;;;;;50781:35:0;;;;;;;;;;;;-1:-1:-1;50781:35:0;;;;50773:142;;;;-1:-1:-1;;;50773:142:0;;;;;;;:::i;:::-;66308:1:::1;66284:21;:25;66276:84;;;;-1:-1:-1::0;;;66276:84:0::1;;;;;;;:::i;:::-;66397:4;66406:1;66379:24:::0;;;:9:::1;:24;::::0;;;;;66371:87:::1;;;;-1:-1:-1::0;;;66371:87:0::1;;;;;;;:::i;:::-;66471:7;::::0;66546:4:::1;66471:7;66566:24:::0;;;:9:::1;:24;::::0;;;;;;66637:15:::1;::::0;66471:222;;-1:-1:-1;;;66471:222:0;;::::1;::::0;::::1;14764:34:1::0;;;;14814:18;;;14807:34;14857:18;;;14850:34;;;14900:18;;;14893:34;;;;-1:-1:-1;;;;;66637:15:0;;::::1;14943:19:1::0;;;14936:44;66667:15:0::1;14996:19:1::0;;;14989:35;66471:7:0;;::::1;::::0;:23:::1;::::0;66501:21:::1;::::0;14698:19:1;;66471:222:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;20620:209::-:0;19776:6;;-1:-1:-1;;;;;19776:6:0;1260:10;19923:23;19915:76;;;;-1:-1:-1;;;19915:76:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;20709:22:0;::::1;20701:81;;;::::0;-1:-1:-1;;;20701:81:0;;15548:2:1;20701:81:0::1;::::0;::::1;15530:21:1::0;15587:2;15567:18;;;15560:30;15626:34;15606:18;;;15599:62;-1:-1:-1;;;15677:18:1;;;15670:44;15731:19;;20701:81:0::1;15346:410:1::0;20701:81:0::1;20793:28;20812:8;20793:18;:28::i;:::-;20620:209:::0;:::o;77581:414::-;77737:16;;;77751:1;77737:16;;;;;;;;77642:7;;;;77737:16;77751:1;77737:16;;;;;;;;;;-1:-1:-1;77737:16:0;77700:53;;77795:4;77764:17;77782:1;77764:20;;;;;;;;:::i;:::-;-1:-1:-1;;;;;77764:36:0;;;:20;;;;;;;;;;:36;;;;77834:7;;:14;;;-1:-1:-1;;;77834:14:0;;;;:7;;;;;:12;;:14;;;;;77764:20;;77834:14;;;;;:7;:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;77811:17;77829:1;77811:20;;;;;;;;:::i;:::-;-1:-1:-1;;;;;77811:37:0;;;:20;;;;;;;;;:37;77898:7;;:48;;-1:-1:-1;;;77898:48:0;;77859:36;;77898:7;;;;;:21;;:48;;77920:6;;77928:17;;77898:48;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;77898:48:0;;;;;;;;;;;;:::i;:::-;77859:87;;77964:19;77984:1;77964:22;;;;;;;;:::i;:::-;;;;;;;77957:30;;;;77581:414;;;:::o;69887:339::-;-1:-1:-1;;;;;69980:19:0;;69972:69;;;;-1:-1:-1;;;69972:69:0;;17652:2:1;69972:69:0;;;17634:21:1;17691:2;17671:18;;;17664:30;17730:34;17710:18;;;17703:62;-1:-1:-1;;;17781:18:1;;;17774:35;17826:19;;69972:69:0;17450:401:1;69972:69:0;-1:-1:-1;;;;;70060:21:0;;70052:69;;;;-1:-1:-1;;;70052:69:0;;18058:2:1;70052:69:0;;;18040:21:1;18097:2;18077:18;;;18070:30;18136:34;18116:18;;;18109:62;-1:-1:-1;;;18187:18:1;;;18180:33;18230:19;;70052:69:0;17856:399:1;70052:69:0;-1:-1:-1;;;;;70134:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;70186:32;;160:25:1;;;70186:32:0;;133:18:1;70186:32:0;;;;;;;;69887:339;;;:::o;73114:2558::-;73279:8;73298:9;73318:10;73392:3;-1:-1:-1;;;;;73368:37:0;73385:5;-1:-1:-1;;;;;73368:37:0;;73397:7;73368:37;;;;160:25:1;;148:2;133:18;;14:177;73368:37:0;;;;;;;;73430:12;;-1:-1:-1;;;;;73421:21:0;;;73430:12;;73421:21;73418:453;;;73464:4;73458:10;;73489:7;;;;;;;;;;;73483:13;;73566:3;-1:-1:-1;;;;;73544:35:0;73559:5;-1:-1:-1;;;;;73544:35:0;;73571:7;73544:35;;;;160:25:1;;148:2;133:18;;14:177;73544:35:0;;;;;;;;73418:453;;;73606:12;;-1:-1:-1;;;;;73599:19:0;;;73606:12;;73599:19;73596:275;;;-1:-1:-1;;73666:8:0;;73722:36;;160:25:1;;;73641:4:0;;-1:-1:-1;;;73666:8:0;;;;;-1:-1:-1;;;;;73722:36:0;;;;;;;;;;148:2:1;133:18;73722:36:0;14:177:1;73596:275:0;73846:3;-1:-1:-1;;;;;73819:40:0;73839:5;-1:-1:-1;;;;;73819:40:0;;73851:7;73819:40;;;;160:25:1;;148:2;133:18;;14:177;73819:40:0;;;;;;;;73596:275;-1:-1:-1;;;;;73886:15:0;;;;;;:8;:15;;;;;;;;;:32;;-1:-1:-1;;;;;;73905:13:0;;;;;;:8;:13;;;;;;;;73886:32;73883:1724;;;73934:39;73953:5;73960:3;73965:7;73934:18;:39::i;:::-;74047:3;-1:-1:-1;;;;;74021:39:0;74040:5;-1:-1:-1;;;;;74021:39:0;;74052:7;74021:39;;;;160:25:1;;148:2;133:18;;14:177;74021:39:0;;;;;;;;73883:1724;;;74162:7;;-1:-1:-1;;;74162:7:0;;;;74154:53;;;;-1:-1:-1;;;74154:53:0;;18462:2:1;74154:53:0;;;18444:21:1;18501:2;18481:18;;;18474:30;18540:34;18520:18;;;18513:62;-1:-1:-1;;;18591:18:1;;;18584:31;18632:19;;74154:53:0;18260:397:1;74154:53:0;74225:32;;-1:-1:-1;;;74225:32:0;;;;74222:133;;;74268:5;;:50;;-1:-1:-1;;;74268:50:0;;-1:-1:-1;;;;;18965:15:1;;;74268:50:0;;;18947:34:1;19017:15;;;18997:18;;;18990:43;19049:18;;;19042:34;;;19119:14;;19112:22;19092:18;;;19085:50;19179:14;;19172:22;19151:19;;;19144:51;74268:5:0;;;;:18;;18881:19:1;;74268:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;74267:51;74259:94;;;;-1:-1:-1;;;74259:94:0;;19408:2:1;74259:94:0;;;19390:21:1;19447:2;19427:18;;;19420:30;19486:32;19466:18;;;19459:60;19536:18;;74259:94:0;19206:354:1;74259:94:0;74372:25;;-1:-1:-1;;;74372:25:0;;;;74369:129;;;74408:49;74426:5;74433:3;74438:7;74447:3;74452:4;74408:17;:49::i;:::-;74407:50;74399:97;;;;-1:-1:-1;;;74399:97:0;;19767:2:1;74399:97:0;;;19749:21:1;19806:2;19786:18;;;19779:30;19845:34;19825:18;;;19818:62;-1:-1:-1;;;19896:18:1;;;19889:32;19938:19;;74399:97:0;19565:398:1;74399:97:0;74526:18;74564:7;;;;74561:413;;74631:5;;:30;;-1:-1:-1;;;74631:30:0;;;;;7622:25:1;;;7695:6;7683:19;;7663:18;;;7656:47;74631:5:0;7719:18:1;;;7712:34;-1:-1:-1;;;;;74631:5:0;;;;:13;;7595:18:1;;74631:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;74618:43;;74716:52;74735:5;74750:4;74757:10;74716:18;:52::i;:::-;74828:5;;:21;;74838:10;74828:9;:21::i;:::-;74820:5;:29;74904:23;:7;74916:10;74904:11;:23::i;:::-;74894:33;;74561:413;74994:9;;;;74993:10;:18;;;;;75007:4;74993:18;:31;;;;;75023:1;75015:5;;:9;74993:31;74990:441;;;75120:5;;75127:15;;75088:14;;75105:38;;-1:-1:-1;;;;;75127:15:0;75105:14;:38::i;:::-;75088:55;;75229:3;-1:-1:-1;;;;;75200:69:0;75222:5;-1:-1:-1;;;;;75200:69:0;;75234:7;75243:10;75255:5;;75262:6;75200:69;;;;;;;;20199:25:1;;;20255:2;20240:18;;20233:34;;;;20298:2;20283:18;;20276:34;20341:2;20326:18;;20319:34;20186:3;20171:19;;19968:391;75200:69:0;;;;;;;;75353:10;;75350:66;;75395:1;75387:5;:9;75350:66;75025:406;74990:441;75459:39;75478:5;75485:3;75490:7;75459:18;:39::i;:::-;75570:3;-1:-1:-1;;;;;75546:49:0;75563:5;-1:-1:-1;;;;;75546:49:0;;75575:7;75584:10;75546:49;;;;;;1769:25:1;;;1825:2;1810:18;;1803:34;1757:2;1742:18;;1595:248;75546:49:0;;;;;;;;74076:1531;73883:1724;75648:16;;;;;;;73185:2487;;;73114:2558;;;:::o;7222:240::-;7342:7;7403:12;7395:6;;;;7387:29;;;;-1:-1:-1;;;7387:29:0;;;;;;;;:::i;:::-;-1:-1:-1;;;7438:5:0;;;7222:240::o;53271:160::-;53332:5;53338;53332:12;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;53328:96;;53375:4;53360:5;53366;53360:12;;;;;;:::i;:::-;;;;;;;;;;;;;;;:19;;-1:-1:-1;;53360:19:0;;;;;;;;;;;53394:6;:18;;-1:-1:-1;53394:18:0;;;;-1:-1:-1;53394:18:0;;;;;;;;;;;;;;;;;:::i;4943:98::-;5001:7;5028:5;5032:1;5028;:5;:::i;:::-;5021:12;4943:98;-1:-1:-1;;;4943:98:0:o;20989:191::-;21082:6;;;-1:-1:-1;;;;;21099:17:0;;;-1:-1:-1;;;;;;21099:17:0;;;;;;;21132:40;;21082:6;;;21099:17;21082:6;;21132:40;;21063:16;;21132:40;21052:128;20989:191;:::o;75680:506::-;-1:-1:-1;;;;;75852:16:0;;;;;;:9;:16;;;;;;:29;;75873:7;75852:20;:29::i;:::-;-1:-1:-1;;;;;75833:16:0;;;;;;;:9;:16;;;;;;:48;;;;75909:14;;;;;;;:27;;75928:7;75909:18;:27::i;:::-;-1:-1:-1;;;;;75892:14:0;;;;;;;:9;:14;;;;;;;:44;;;;75952:5;;:24;;-1:-1:-1;;;75952:24:0;;;;;2455:51:1;;;;75952:5:0;;;:19;;2428:18:1;;75952:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;75949:161;;;76007:12;;:25;;76024:7;76007:16;:25::i;:::-;75992:12;:40;76078:20;;160:25:1;;;-1:-1:-1;;;;;76078:20:0;;;;;148:2:1;133:18;76078:20:0;;;;;;;75949:161;76165:3;-1:-1:-1;;;;;76149:29:0;76158:5;-1:-1:-1;;;;;76149:29:0;;76170:7;76149:29;;;;160:25:1;;148:2;133:18;;14:177;76443:519:0;76580:5;;:26;;-1:-1:-1;;;76580:26:0;;-1:-1:-1;;;;;2473:32:1;;;76580:26:0;;;2455:51:1;76559:4:0;;76580:5;;:19;;2428:18:1;;76580:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;76579:27;:56;;;;-1:-1:-1;76611:5:0;;:24;;-1:-1:-1;;;76611:24:0;;-1:-1:-1;;;;;2473:32:1;;;76611:24:0;;;2455:51:1;76611:5:0;;;;:19;;2428:18:1;;76611:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;76610:25;76579:56;76578:78;;;;;76641:4;:14;;;;;76650:5;76649:6;76641:14;76575:354;;;76740:5;;76754:12;;76740:57;;-1:-1:-1;;;76740:57:0;;;;;7622:25:1;;;;-1:-1:-1;;;76768:25:0;;;;7663:18:1;;;7656:47;76740:5:0;7719:18:1;;;7712:34;76720:17:0;;-1:-1:-1;;;;;76740:5:0;;:13;;7595:18:1;;76740:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;76720:77;;76825:9;76815:7;:19;76812:106;;;76897:4;76890:12;;;;;76812:106;76657:272;76575:354;-1:-1:-1;76948:5:0;76443:519;;;;;;;;:::o;5324:98::-;5382:7;5409:5;5413:1;5409;:5;:::i;76970:179::-;63825:9;:16;;-1:-1:-1;;63825:16:0;63837:4;63825:16;;;77052:7;77114:26:::1;77128:6:::0;77136:3;77114:13:::1;:26::i;:::-;63872:9:::0;:17;;-1:-1:-1;;63872:17:0;;;77107:34;76970:179;-1:-1:-1;;;76970:179:0:o;78003:643::-;78162:16;;;78176:1;78162:16;;;;;;;;78072:7;;;;78162:16;78176:1;78162:16;;;;;;;;;;-1:-1:-1;78162:16:0;78125:53;;78220:4;78189:17;78207:1;78189:20;;;;;;;;:::i;:::-;-1:-1:-1;;;;;78189:36:0;;;:20;;;;;;;;;;:36;;;;78259:7;;:14;;;-1:-1:-1;;;78259:14:0;;;;:7;;;;;:12;;:14;;;;;78189:20;;78259:14;;;;;:7;:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;78236:17;78254:1;78236:20;;;;;;;;:::i;:::-;-1:-1:-1;;;;;78236:37:0;;;:20;;;;;;;;;:37;78340:7;;:187;;-1:-1:-1;;;78340:187:0;;78309:20;;;;;78340:7;;;;;:58;;:187;;78413:7;;78284:22;;78451:17;;78317:3;;78501:15;;78340:187;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;78564:20:0;;;78602:35;78564:20;78622:14;78602:19;:35::i;:::-;78595:43;78003:643;-1:-1:-1;;;;;;78003:643:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;196:258:1;268:1;278:113;292:6;289:1;286:13;278:113;;;368:11;;;362:18;349:11;;;342:39;314:2;307:10;278:113;;;409:6;406:1;403:13;400:48;;;-1:-1:-1;;444:1:1;426:16;;419:27;196:258::o;459:::-;501:3;539:5;533:12;566:6;561:3;554:19;582:63;638:6;631:4;626:3;622:14;615:4;608:5;604:16;582:63;:::i;:::-;699:2;678:15;-1:-1:-1;;674:29:1;665:39;;;;706:4;661:50;;459:258;-1:-1:-1;;459:258:1:o;722:220::-;871:2;860:9;853:21;834:4;891:45;932:2;921:9;917:18;909:6;891:45;:::i;947:131::-;-1:-1:-1;;;;;1022:31:1;;1012:42;;1002:70;;1068:1;1065;1058:12;1083:315;1151:6;1159;1212:2;1200:9;1191:7;1187:23;1183:32;1180:52;;;1228:1;1225;1218:12;1180:52;1267:9;1254:23;1286:31;1311:5;1286:31;:::i;:::-;1336:5;1388:2;1373:18;;;;1360:32;;-1:-1:-1;;;1083:315:1:o;1848:456::-;1925:6;1933;1941;1994:2;1982:9;1973:7;1969:23;1965:32;1962:52;;;2010:1;2007;2000:12;1962:52;2049:9;2036:23;2068:31;2093:5;2068:31;:::i;:::-;2118:5;-1:-1:-1;2175:2:1;2160:18;;2147:32;2188:33;2147:32;2188:33;:::i;:::-;1848:456;;2240:7;;-1:-1:-1;;;2294:2:1;2279:18;;;;2266:32;;1848:456::o;2517:127::-;2578:10;2573:3;2569:20;2566:1;2559:31;2609:4;2606:1;2599:15;2633:4;2630:1;2623:15;2649:275;2720:2;2714:9;2785:2;2766:13;;-1:-1:-1;;2762:27:1;2750:40;;2820:18;2805:34;;2841:22;;;2802:62;2799:88;;;2867:18;;:::i;:::-;2903:2;2896:22;2649:275;;-1:-1:-1;2649:275:1:o;2929:531::-;2972:5;3025:3;3018:4;3010:6;3006:17;3002:27;2992:55;;3043:1;3040;3033:12;2992:55;3079:6;3066:20;3105:18;3101:2;3098:26;3095:52;;;3127:18;;:::i;:::-;3171:55;3214:2;3195:13;;-1:-1:-1;;3191:27:1;3220:4;3187:38;3171:55;:::i;:::-;3251:2;3242:7;3235:19;3297:3;3290:4;3285:2;3277:6;3273:15;3269:26;3266:35;3263:55;;;3314:1;3311;3304:12;3263:55;3379:2;3372:4;3364:6;3360:17;3353:4;3344:7;3340:18;3327:55;3427:1;3402:16;;;3420:4;3398:27;3391:38;;;;3406:7;2929:531;-1:-1:-1;;;2929:531:1:o;3465:457::-;3543:6;3551;3604:2;3592:9;3583:7;3579:23;3575:32;3572:52;;;3620:1;3617;3610:12;3572:52;3660:9;3647:23;3693:18;3685:6;3682:30;3679:50;;;3725:1;3722;3715:12;3679:50;3748;3790:7;3781:6;3770:9;3766:22;3748:50;:::i;:::-;3738:60;;;3848:2;3837:9;3833:18;3820:32;3861:31;3886:5;3861:31;:::i;:::-;3911:5;3901:15;;;3465:457;;;;;:::o;4309:183::-;4369:4;4402:18;4394:6;4391:30;4388:56;;;4424:18;;:::i;:::-;-1:-1:-1;4469:1:1;4465:14;4481:4;4461:25;;4309:183::o;4497:1187::-;4600:6;4608;4661:2;4649:9;4640:7;4636:23;4632:32;4629:52;;;4677:1;4674;4667:12;4629:52;4717:9;4704:23;4746:18;4787:2;4779:6;4776:14;4773:34;;;4803:1;4800;4793:12;4773:34;4826:50;4868:7;4859:6;4848:9;4844:22;4826:50;:::i;:::-;4816:60;;4895:2;4885:12;;4950:2;4939:9;4935:18;4922:32;4979:2;4969:8;4966:16;4963:36;;;4995:1;4992;4985:12;4963:36;5018:24;;;-1:-1:-1;5073:4:1;5065:13;;5061:27;-1:-1:-1;5051:55:1;;5102:1;5099;5092:12;5051:55;5138:2;5125:16;5161:60;5177:43;5217:2;5177:43;:::i;:::-;5161:60;:::i;:::-;5255:15;;;5337:1;5333:10;;;;5325:19;;5321:28;;;5286:12;;;;5361:19;;;5358:39;;;5393:1;5390;5383:12;5358:39;5417:11;;;;5437:217;5453:6;5448:3;5445:15;5437:217;;;5533:3;5520:17;5550:31;5575:5;5550:31;:::i;:::-;5594:18;;5470:12;;;;5632;;;;5437:217;;;5673:5;5663:15;;;;;;;4497:1187;;;;;:::o;5689:322::-;5758:6;5811:2;5799:9;5790:7;5786:23;5782:32;5779:52;;;5827:1;5824;5817:12;5779:52;5867:9;5854:23;5900:18;5892:6;5889:30;5886:50;;;5932:1;5929;5922:12;5886:50;5955;5997:7;5988:6;5977:9;5973:22;5955:50;:::i;:::-;5945:60;5689:322;-1:-1:-1;;;;5689:322:1:o;6016:247::-;6075:6;6128:2;6116:9;6107:7;6103:23;6099:32;6096:52;;;6144:1;6141;6134:12;6096:52;6183:9;6170:23;6202:31;6227:5;6202:31;:::i;6268:159::-;6335:20;;6395:6;6384:18;;6374:29;;6364:57;;6417:1;6414;6407:12;6364:57;6268:159;;;:::o;6432:394::-;6509:6;6517;6570:2;6558:9;6549:7;6545:23;6541:32;6538:52;;;6586:1;6583;6576:12;6538:52;6609:28;6627:9;6609:28;:::i;:::-;6599:38;;6688:2;6677:9;6673:18;6660:32;6715:18;6707:6;6704:30;6701:50;;;6747:1;6744;6737:12;6701:50;6770;6812:7;6803:6;6792:9;6788:22;6770:50;:::i;:::-;6760:60;;;6432:394;;;;;:::o;6831:184::-;6889:6;6942:2;6930:9;6921:7;6917:23;6913:32;6910:52;;;6958:1;6955;6948:12;6910:52;6981:28;6999:9;6981:28;:::i;7020:388::-;7088:6;7096;7149:2;7137:9;7128:7;7124:23;7120:32;7117:52;;;7165:1;7162;7155:12;7117:52;7204:9;7191:23;7223:31;7248:5;7223:31;:::i;:::-;7273:5;-1:-1:-1;7330:2:1;7315:18;;7302:32;7343:33;7302:32;7343:33;:::i;7757:184::-;7827:6;7880:2;7868:9;7859:7;7855:23;7851:32;7848:52;;;7896:1;7893;7886:12;7848:52;-1:-1:-1;7919:16:1;;7757:184;-1:-1:-1;7757:184:1:o;7946:380::-;8025:1;8021:12;;;;8068;;;8089:61;;8143:4;8135:6;8131:17;8121:27;;8089:61;8196:2;8188:6;8185:14;8165:18;8162:38;8159:161;;;8242:10;8237:3;8233:20;8230:1;8223:31;8277:4;8274:1;8267:15;8305:4;8302:1;8295:15;8159:161;;7946:380;;;:::o;8331:251::-;8401:6;8454:2;8442:9;8433:7;8429:23;8425:32;8422:52;;;8470:1;8467;8460:12;8422:52;8502:9;8496:16;8521:31;8546:5;8521:31;:::i;8587:188::-;8666:13;;-1:-1:-1;;;;;8708:42:1;;8698:53;;8688:81;;8765:1;8762;8755:12;8780:450;8867:6;8875;8883;8936:2;8924:9;8915:7;8911:23;8907:32;8904:52;;;8952:1;8949;8942:12;8904:52;8975:40;9005:9;8975:40;:::i;:::-;8965:50;;9034:49;9079:2;9068:9;9064:18;9034:49;:::i;:::-;9024:59;;9126:2;9115:9;9111:18;9105:25;9170:10;9163:5;9159:22;9152:5;9149:33;9139:61;;9196:1;9193;9186:12;9139:61;9219:5;9209:15;;;8780:450;;;;;:::o;9235:276::-;9366:3;9404:6;9398:13;9420:53;9466:6;9461:3;9454:4;9446:6;9442:17;9420:53;:::i;:::-;9489:16;;;;;9235:276;-1:-1:-1;;9235:276:1:o;9516:498::-;9718:2;9700:21;;;9757:2;9737:18;;;9730:30;9796:34;9791:2;9776:18;;9769:62;9867:34;9862:2;9847:18;;9840:62;9939:32;9933:3;9918:19;;9911:61;10004:3;9989:19;;9516:498::o;10019:552::-;10221:2;10203:21;;;10260:3;10240:18;;;10233:31;10300:34;10295:2;10280:18;;10273:62;10371:34;10366:2;10351:18;;10344:62;10443:34;10437:3;10422:19;;10415:63;-1:-1:-1;;;10509:3:1;10494:19;;10487:42;10561:3;10546:19;;10019:552::o;10576:127::-;10637:10;10632:3;10628:20;10625:1;10618:31;10668:4;10665:1;10658:15;10692:4;10689:1;10682:15;10708:127;10769:10;10764:3;10760:20;10757:1;10750:31;10800:4;10797:1;10790:15;10824:4;10821:1;10814:15;10840:135;10879:3;-1:-1:-1;;10900:17:1;;10897:43;;;10920:18;;:::i;:::-;-1:-1:-1;10967:1:1;10956:13;;10840:135::o;10980:404::-;11182:2;11164:21;;;11221:2;11201:18;;;11194:30;11260:34;11255:2;11240:18;;11233:62;-1:-1:-1;;;11326:2:1;11311:18;;11304:38;11374:3;11359:19;;10980:404::o;11652:415::-;11854:2;11836:21;;;11893:2;11873:18;;;11866:30;11932:34;11927:2;11912:18;;11905:62;-1:-1:-1;;;11998:2:1;11983:18;;11976:49;12057:3;12042:19;;11652:415::o;12072:483::-;12322:2;12311:9;12304:21;12285:4;12348:45;12389:2;12378:9;12374:18;12366:6;12348:45;:::i;:::-;12441:9;12433:6;12429:22;12424:2;12413:9;12409:18;12402:50;12476:1;12468:6;12461:17;-1:-1:-1;;;12506:2:1;12498:6;12494:15;12487:30;12546:2;12538:6;12534:15;12526:23;;;12072:483;;;;:::o;12560:277::-;12627:6;12680:2;12668:9;12659:7;12655:23;12651:32;12648:52;;;12696:1;12693;12686:12;12648:52;12728:9;12722:16;12781:5;12774:13;12767:21;12760:5;12757:32;12747:60;;12803:1;12800;12793:12;12842:484;13092:2;13081:9;13074:21;13055:4;13118:45;13159:2;13148:9;13144:18;13136:6;13118:45;:::i;:::-;13211:9;13203:6;13199:22;13194:2;13183:9;13179:18;13172:50;13246:1;13238:6;13231:17;-1:-1:-1;;;13276:2:1;13268:6;13264:15;13257:31;13317:2;13309:6;13305:15;13297:23;;;12842:484;;;;:::o;14008:410::-;14210:2;14192:21;;;14249:2;14229:18;;;14222:30;14288:34;14283:2;14268:18;;14261:62;-1:-1:-1;;;14354:2:1;14339:18;;14332:44;14408:3;14393:19;;14008:410::o;15035:306::-;15123:6;15131;15139;15192:2;15180:9;15171:7;15167:23;15163:32;15160:52;;;15208:1;15205;15198:12;15160:52;15237:9;15231:16;15221:26;;15287:2;15276:9;15272:18;15266:25;15256:35;;15331:2;15320:9;15316:18;15310:25;15300:35;;15035:306;;;;;:::o;15761:461::-;15814:3;15852:5;15846:12;15879:6;15874:3;15867:19;15905:4;15934:2;15929:3;15925:12;15918:19;;15971:2;15964:5;15960:14;15992:1;16002:195;16016:6;16013:1;16010:13;16002:195;;;16081:13;;-1:-1:-1;;;;;16077:39:1;16065:52;;16137:12;;;;16172:15;;;;16113:1;16031:9;16002:195;;;-1:-1:-1;16213:3:1;;15761:461;-1:-1:-1;;;;;15761:461:1:o;16227:332::-;16434:6;16423:9;16416:25;16477:2;16472;16461:9;16457:18;16450:30;16397:4;16497:56;16549:2;16538:9;16534:18;16526:6;16497:56;:::i;16564:881::-;16659:6;16690:2;16733;16721:9;16712:7;16708:23;16704:32;16701:52;;;16749:1;16746;16739:12;16701:52;16782:9;16776:16;16815:18;16807:6;16804:30;16801:50;;;16847:1;16844;16837:12;16801:50;16870:22;;16923:4;16915:13;;16911:27;-1:-1:-1;16901:55:1;;16952:1;16949;16942:12;16901:55;16981:2;16975:9;17004:60;17020:43;17060:2;17020:43;:::i;17004:60::-;17098:15;;;17180:1;17176:10;;;;17168:19;;17164:28;;;17129:12;;;;17204:19;;;17201:39;;;17236:1;17233;17226:12;17201:39;17260:11;;;;17280:135;17296:6;17291:3;17288:15;17280:135;;;17362:10;;17350:23;;17313:12;;;;17393;;;;17280:135;;;17434:5;16564:881;-1:-1:-1;;;;;;;16564:881:1:o;20364:128::-;20404:3;20435:1;20431:6;20428:1;20425:13;20422:39;;;20441:18;;:::i;:::-;-1:-1:-1;20477:9:1;;20364:128::o;20497:125::-;20537:4;20565:1;20562;20559:8;20556:34;;;20570:18;;:::i;:::-;-1:-1:-1;20607:9:1;;20497:125::o;20627:582::-;20926:6;20915:9;20908:25;20969:6;20964:2;20953:9;20949:18;20942:34;21012:3;21007:2;20996:9;20992:18;20985:31;20889:4;21033:57;21085:3;21074:9;21070:19;21062:6;21033:57;:::i;:::-;-1:-1:-1;;;;;21126:32:1;;;;21121:2;21106:18;;21099:60;-1:-1:-1;21190:3:1;21175:19;21168:35;21025:65;20627:582;-1:-1:-1;;;20627:582:1:o
Swarm Source
ipfs://d27854f15311be963fe5f967a9db8793da9593b3d6808db158092c291a72df1b
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.