Feature Tip: Add private address tag to any address under My Name Tag !
ERC-20
Overview
Max Total Supply
1,000,000,000 KOMPETE
Holders
80
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 10 Decimals)
Balance
1,670,377.4309998014 KOMPETEValue
$0.00Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
KOMPETE
Compiler Version
v0.8.0+commit.c7dfd78e
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-02-03 */ // SPDX-License-Identifier: MIT // File @openzeppelin/contracts/token/ERC20/[email protected] pragma solidity ^0.8.0; /** * @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); } // File @openzeppelin/contracts/token/ERC20/extensions/[email protected] pragma solidity ^0.8.0; /** * @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); } // File @openzeppelin/contracts/utils/[email protected] pragma solidity ^0.8.0; /** * @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; } } // File @openzeppelin/contracts/token/ERC20/[email protected] pragma solidity ^0.8.0; /** * @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}. */ 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 {} } // File @openzeppelin/contracts/utils/[email protected] pragma solidity ^0.8.0; /** * @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); } } } } // File @openzeppelin/contracts/token/ERC20/utils/[email protected] pragma solidity ^0.8.0; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // File @openzeppelin/contracts/access/[email protected] pragma solidity ^0.8.0; /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControl { /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. * * _Available since v3.1._ */ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {AccessControl-_setupRole}. */ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) external view returns (bool); /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {AccessControl-_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) external view returns (bytes32); /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) external; /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) external; /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) external; } // File @openzeppelin/contracts/utils/[email protected] pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File @openzeppelin/contracts/utils/introspection/[email protected] pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File @openzeppelin/contracts/utils/introspection/[email protected] pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File @openzeppelin/contracts/access/[email protected] pragma solidity ^0.8.0; /** * @dev Contract module that allows children to implement role-based access * control mechanisms. This is a lightweight version that doesn't allow enumerating role * members except through off-chain means by accessing the contract event logs. Some * applications may benefit from on-chain enumerability, for those cases see * {AccessControlEnumerable}. * * Roles are referred to by their `bytes32` identifier. These should be exposed * in the external API and be unique. The best way to achieve this is by * using `public constant` hash digests: * * ``` * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); * ``` * * Roles can be used to represent a set of permissions. To restrict access to a * function call, use {hasRole}: * * ``` * function foo() public { * require(hasRole(MY_ROLE, msg.sender)); * ... * } * ``` * * Roles can be granted and revoked dynamically via the {grantRole} and * {revokeRole} functions. Each role has an associated admin role, and only * accounts that have a role's admin role can call {grantRole} and {revokeRole}. * * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means * that only accounts with this role will be able to grant or revoke other * roles. More complex role relationships can be created by using * {_setRoleAdmin}. * * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to * grant and revoke this role. Extra precautions should be taken to secure * accounts that have been granted it. */ abstract contract AccessControl is Context, IAccessControl, ERC165 { struct RoleData { mapping(address => bool) members; bytes32 adminRole; } mapping(bytes32 => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Modifier that checks that an account has a specific role. Reverts * with a standardized message including the required role. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ * * _Available since v4.1._ */ modifier onlyRole(bytes32 role) { _checkRole(role, _msgSender()); _; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view override returns (bool) { return _roles[role].members[account]; } /** * @dev Revert with a standard message if `account` is missing `role`. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ */ function _checkRole(bytes32 role, address account) internal view { if (!hasRole(role, account)) { revert( string( abi.encodePacked( "AccessControl: account ", Strings.toHexString(uint160(account), 20), " is missing role ", Strings.toHexString(uint256(role), 32) ) ) ); } } /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) public view override returns (bytes32) { return _roles[role].adminRole; } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _grantRole(role, account); } /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _revokeRole(role, account); } /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) public virtual override { require(account == _msgSender(), "AccessControl: can only renounce roles for self"); _revokeRole(role, account); } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. Note that unlike {grantRole}, this function doesn't perform any * checks on the calling account. * * [WARNING] * ==== * This function should only be called from the constructor when setting * up the initial roles for the system. * * Using this function in any other way is effectively circumventing the admin * system imposed by {AccessControl}. * ==== */ function _setupRole(bytes32 role, address account) internal virtual { _grantRole(role, account); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { bytes32 previousAdminRole = getRoleAdmin(role); _roles[role].adminRole = adminRole; emit RoleAdminChanged(role, previousAdminRole, adminRole); } function _grantRole(bytes32 role, address account) private { if (!hasRole(role, account)) { _roles[role].members[account] = true; emit RoleGranted(role, account, _msgSender()); } } function _revokeRole(bytes32 role, address account) private { if (hasRole(role, account)) { _roles[role].members[account] = false; emit RoleRevoked(role, account, _msgSender()); } } } // File @openzeppelin/contracts/utils/math/[email protected] pragma solidity ^0.8.0; // 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 no longer needed starting with Solidity 0.8. 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; } } } // File @uniswap/v2-core/contracts/interfaces/[email protected] pragma solidity >=0.5.0; interface IUniswapV2Factory { event PairCreated(address indexed token0, address indexed token1, address pair, uint); function feeTo() external view returns (address); function feeToSetter() external view returns (address); function getPair(address tokenA, address tokenB) external view returns (address pair); function allPairs(uint) external view returns (address pair); function allPairsLength() external view returns (uint); function createPair(address tokenA, address tokenB) external returns (address pair); function setFeeTo(address) external; function setFeeToSetter(address) external; } // File @uniswap/v2-periphery/contracts/interfaces/[email protected] pragma solidity >=0.6.2; interface IUniswapV2Router01 { function factory() external pure returns (address); function WETH() external pure returns (address); function addLiquidity( address tokenA, address tokenB, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB, uint liquidity); function addLiquidityETH( address token, uint amountTokenDesired, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external payable returns (uint amountToken, uint amountETH, uint liquidity); function removeLiquidity( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB); function removeLiquidityETH( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountToken, uint amountETH); function removeLiquidityWithPermit( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountA, uint amountB); function removeLiquidityETHWithPermit( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountToken, uint amountETH); function swapExactTokensForTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapTokensForExactTokens( uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB); function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut); function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn); function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts); function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts); } // File @uniswap/v2-periphery/contracts/interfaces/[email protected] pragma solidity >=0.6.2; interface IUniswapV2Router02 is IUniswapV2Router01 { function removeLiquidityETHSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountETH); function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountETH); function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; function swapExactETHForTokensSupportingFeeOnTransferTokens( uint amountOutMin, address[] calldata path, address to, uint deadline ) external payable; function swapExactTokensForETHSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; } // File contracts/KOMPETE.sol pragma solidity ^0.8.0; contract KOMPETE is ERC20, AccessControl { using SafeMath for uint256; using SafeERC20 for ERC20; uint8 private constant DECIMALS = 10; uint256 public liquidityFee = 200; // 2% uint256 public marketingFee = 1000; // 10% uint16 public constant MAX_FEE = 2000; // 20% uint256 public constant MAX_TOKEN_PER_WALLET = 10000000 * 10**DECIMALS; // Max holding limit, 1.00% of supply bytes32 public constant EXCLUDED_FROM_FEE_ROLE = keccak256("EXCLUDED_FROM_FEE_ROLE"); bytes32 public constant EXCLUDED_FROM_ANTIWHALE_ROLE = keccak256("EXCLUDED_FROM_ANTIWHALE_ROLE"); bytes32 public constant DENIED_ROLE = keccak256("DENIED_ROLE"); address public marketingAddress = 0xb62848195772688117377B4CaC2834a761C244e4; address public constant BURN_ADDRESS = 0x000000000000000000000000000000000000dEaD; IUniswapV2Router02 public swapRouter; address public swapPair; address public liquidityOwner; bool public processFeesEnabled = true; bool private _processingFees; uint256 public numTokensToSwap = 200000 * 10**DECIMALS; event SwapRouterUpdated(address indexed router, address indexed pair); event AddLiquidity(uint256 amountToken, uint256 amountETH); event SendToMarketing(address indexed recipient, uint256 amountToken); modifier notDenied(address account) { require(!hasRole(DENIED_ROLE, account), "Address denied"); _; } modifier lockTheSwap() { _processingFees = true; _; _processingFees = false; } modifier antiWhale( address sender, address recipient, uint256 amount ) { if (!hasRole(EXCLUDED_FROM_ANTIWHALE_ROLE, recipient)) { require(balanceOf(recipient).add(amount) <= MAX_TOKEN_PER_WALLET, "Wallet exceeds max"); } _; } constructor() ERC20("KOMPETE Token", "KOMPETE") { liquidityOwner = _msgSender(); // Create a uniswap pair for this new token swapRouter = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D); swapPair = IUniswapV2Factory(swapRouter.factory()).createPair(address(this), swapRouter.WETH()); // configure admin roles _setupRole(DEFAULT_ADMIN_ROLE, _msgSender()); // configure excluded from fee role _setupRole(EXCLUDED_FROM_FEE_ROLE, _msgSender()); _setupRole(EXCLUDED_FROM_FEE_ROLE, address(this)); _setupRole(EXCLUDED_FROM_FEE_ROLE, marketingAddress); _setupRole(EXCLUDED_FROM_FEE_ROLE, 0xFd7d7a2175706E5555aAB0aAAF2251C6BC691ffC); _setupRole(EXCLUDED_FROM_FEE_ROLE, 0xb62848195772688117377B4CaC2834a761C244e4); _setupRole(EXCLUDED_FROM_FEE_ROLE, 0x5D2c31eEAc483000Dd6120233AfAAA0535e9C6Ed); _setupRole(EXCLUDED_FROM_FEE_ROLE, 0x5623225F296BE00Ec9dB43f3DeD96804f24b062d); _setupRole(EXCLUDED_FROM_FEE_ROLE, 0x99B3208625e252eA0fBBe9B63e6004B06489D094); _setupRole(EXCLUDED_FROM_FEE_ROLE, 0x596e5556cF23b30e6c2C4c60dE216F66551c0220); _setupRole(EXCLUDED_FROM_FEE_ROLE, 0x9406609b3057053573f8d5418C1cbfaAc5161f21); _setupRole(EXCLUDED_FROM_FEE_ROLE, 0x71FC956eee0C97B095B70f6B1B263147a6d6799A); // configure excluded from antiwhale role _setupRole(EXCLUDED_FROM_ANTIWHALE_ROLE, _msgSender()); _setupRole(EXCLUDED_FROM_ANTIWHALE_ROLE, address(this)); _setupRole(EXCLUDED_FROM_ANTIWHALE_ROLE, swapPair); _setupRole(EXCLUDED_FROM_ANTIWHALE_ROLE, marketingAddress); _setupRole(EXCLUDED_FROM_ANTIWHALE_ROLE, BURN_ADDRESS); _setupRole(EXCLUDED_FROM_ANTIWHALE_ROLE, 0xFd7d7a2175706E5555aAB0aAAF2251C6BC691ffC); _setupRole(EXCLUDED_FROM_ANTIWHALE_ROLE, 0xb62848195772688117377B4CaC2834a761C244e4); _setupRole(EXCLUDED_FROM_ANTIWHALE_ROLE, 0x5D2c31eEAc483000Dd6120233AfAAA0535e9C6Ed); _setupRole(EXCLUDED_FROM_ANTIWHALE_ROLE, 0x5623225F296BE00Ec9dB43f3DeD96804f24b062d); _setupRole(EXCLUDED_FROM_ANTIWHALE_ROLE, 0x99B3208625e252eA0fBBe9B63e6004B06489D094); _setupRole(EXCLUDED_FROM_ANTIWHALE_ROLE, 0x596e5556cF23b30e6c2C4c60dE216F66551c0220); _setupRole(EXCLUDED_FROM_ANTIWHALE_ROLE, 0x9406609b3057053573f8d5418C1cbfaAc5161f21); _setupRole(EXCLUDED_FROM_ANTIWHALE_ROLE, 0x71FC956eee0C97B095B70f6B1B263147a6d6799A); // mint supply to owner _mint(_msgSender(), 1000000000 * 10**DECIMALS); } // receive ETH when swaping receive() external payable {} function decimals() public view virtual override returns (uint8) { return DECIMALS; } function totalFees() public view returns (uint256) { return liquidityFee + marketingFee; } function setLiquidityFee(uint256 _liquidityFee) external onlyRole(DEFAULT_ADMIN_ROLE) { require(totalFees() - liquidityFee + _liquidityFee <= MAX_FEE, "Tax too high"); liquidityFee = _liquidityFee; } function setMarketingFee(uint256 _marketingFee) external onlyRole(DEFAULT_ADMIN_ROLE) { require(totalFees() - marketingFee + _marketingFee <= MAX_FEE, "Tax too high"); marketingFee = _marketingFee; } /// @dev Roles must be granted manually after changing the address function setMarketingAddress(address newAddress) external onlyRole(DEFAULT_ADMIN_ROLE) { marketingAddress = newAddress; } function setLiquidityOwner(address newOwner) external onlyRole(DEFAULT_ADMIN_ROLE) { liquidityOwner = newOwner; } function updateSwapRouter(address _newRouter) external onlyRole(DEFAULT_ADMIN_ROLE) { swapRouter = IUniswapV2Router02(_newRouter); swapPair = IUniswapV2Factory(swapRouter.factory()).createPair(address(this), swapRouter.WETH()); require(swapPair != address(0), "Invalid pair address."); emit SwapRouterUpdated(address(swapRouter), swapPair); } function setProcessFeesEnabled(bool _enabled) external onlyRole(DEFAULT_ADMIN_ROLE) { processFeesEnabled = _enabled; } function processFees(uint256 amount) external onlyRole(DEFAULT_ADMIN_ROLE) { require(amount <= balanceOf(address(this)), "Amount too high"); _processFees(amount); } function isExcludedFromFee(address account) public view returns (bool) { return hasRole(EXCLUDED_FROM_FEE_ROLE, account); } function isExcludedAntiWhale(address account) public view returns (bool) { return hasRole(EXCLUDED_FROM_ANTIWHALE_ROLE, account); } function _transfer( address from, address to, uint256 amount ) internal override notDenied(from) notDenied(to) antiWhale(from, to, amount) { require(amount > 0, "Transfer <= 0"); // process fees if ( processFeesEnabled == true && _processingFees == false && from != swapPair && !isExcludedFromFee(from) ) { uint256 contractTokenBalance = balanceOf(address(this)); if (contractTokenBalance >= numTokensToSwap) { _processFees(numTokensToSwap); } } uint256 totalTax = totalFees(); bool takeFee = !_processingFees && totalTax > 0 && !isExcludedFromFee(from) && !isExcludedFromFee(to); if (takeFee) { uint256 taxAmount = amount.mul(totalTax).div(10000); uint256 sendAmount = amount.sub(taxAmount); require(amount == sendAmount + taxAmount, "Tax value invalid"); if (taxAmount > 0) { super._transfer(from, address(this), taxAmount); } if (sendAmount > 0) { super._transfer(from, to, sendAmount); } } else { super._transfer(from, to, amount); } } function _processFees(uint256 tokenAmount) private lockTheSwap { uint256 contractTokenBalance = balanceOf(address(this)); uint256 totalTax = totalFees(); if (contractTokenBalance >= tokenAmount && totalTax > 0) { uint256 liquidityAmount = tokenAmount.mul(liquidityFee).div(totalTax); uint256 liquidityTokens = liquidityAmount.div(2); uint256 marketingAmount = tokenAmount.sub(liquidityAmount); uint256 liquifyAmount = liquidityAmount.sub(liquidityTokens).add(marketingAmount); // capture the contract's current balance. uint256 initialBalance = address(this).balance; // swap tokens swapTokensForEth(liquifyAmount); // how much did we just swap into? uint256 newBalance = address(this).balance.sub(initialBalance); // add liquidity uint256 liquidityETH = newBalance.mul(liquidityTokens).div(liquifyAmount); addLiquidity(liquidityTokens, liquidityETH); // send to marketing uint256 marketingETH = newBalance.sub(liquidityETH); sendToMarketing(marketingETH); } } /// @dev Swap tokens for eth function swapTokensForEth(uint256 tokenAmount) private { // generate the swap pair path of token -> weth address[] memory path = new address[](2); path[0] = address(this); path[1] = swapRouter.WETH(); _approve(address(this), address(swapRouter), tokenAmount); // make the swap swapRouter.swapExactTokensForETHSupportingFeeOnTransferTokens( tokenAmount, 0, // accept any amount of ETH path, address(this), block.timestamp ); } /// @dev Add liquidity function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private { // approve token transfer to cover all possible scenarios _approve(address(this), address(swapRouter), tokenAmount); // add the liquidity swapRouter.addLiquidityETH{value: ethAmount}( address(this), tokenAmount, 0, // slippage is unavoidable 0, // slippage is unavoidable liquidityOwner, block.timestamp ); emit AddLiquidity(tokenAmount, ethAmount); } function sendToMarketing(uint256 amount) private { payable(marketingAddress).transfer(amount); emit SendToMarketing(marketingAddress, amount); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amountToken","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountETH","type":"uint256"}],"name":"AddLiquidity","type":"event"},{"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":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountToken","type":"uint256"}],"name":"SendToMarketing","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"router","type":"address"},{"indexed":true,"internalType":"address","name":"pair","type":"address"}],"name":"SwapRouterUpdated","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":"BURN_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DENIED_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"EXCLUDED_FROM_ANTIWHALE_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"EXCLUDED_FROM_FEE_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_FEE","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_TOKEN_PER_WALLET","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedAntiWhale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numTokensToSwap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"processFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"processFeesEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_liquidityFee","type":"uint256"}],"name":"setLiquidityFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"setLiquidityOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"setMarketingAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_marketingFee","type":"uint256"}],"name":"setMarketingFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setProcessFeesEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapRouter","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newRouter","type":"address"}],"name":"updateSwapRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
608060405260c86006556103e860075573b62848195772688117377b4cac2834a761c244e4600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600b60146101000a81548160ff021916908315150217905550600a806200008e919062001077565b62030d406200009e9190620011b4565b600c55348015620000ae57600080fd5b506040518060400160405280600d81526020017f4b4f4d5045544520546f6b656e000000000000000000000000000000000000008152506040518060400160405280600781526020017f4b4f4d504554450000000000000000000000000000000000000000000000000081525081600390805190602001906200013392919062000deb565b5080600490805190602001906200014c92919062000deb565b5050506200015f62000aed60201b60201c565b600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550737a250d5630b4cf539739df2c5dacb4c659f2488d600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b1580156200025d57600080fd5b505afa15801562000272573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000298919062000eb2565b73ffffffffffffffffffffffffffffffffffffffff1663c9c6539630600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156200031d57600080fd5b505afa15801562000332573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000358919062000eb2565b6040518363ffffffff1660e01b81526004016200037792919062000f42565b602060405180830381600087803b1580156200039257600080fd5b505af1158015620003a7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003cd919062000eb2565b600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620004316000801b6200042562000aed60201b60201c565b62000af560201b60201c565b620004727faa2bf0f18a184595f311714f88137302cdcad3d20639b5595c7fe0d3db0658fa6200046662000aed60201b60201c565b62000af560201b60201c565b620004a47faa2bf0f18a184595f311714f88137302cdcad3d20639b5595c7fe0d3db0658fa3062000af560201b60201c565b620004f87faa2bf0f18a184595f311714f88137302cdcad3d20639b5595c7fe0d3db0658fa600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1662000af560201b60201c565b6200053e7faa2bf0f18a184595f311714f88137302cdcad3d20639b5595c7fe0d3db0658fa73fd7d7a2175706e5555aab0aaaf2251c6bc691ffc62000af560201b60201c565b620005847faa2bf0f18a184595f311714f88137302cdcad3d20639b5595c7fe0d3db0658fa73b62848195772688117377b4cac2834a761c244e462000af560201b60201c565b620005ca7faa2bf0f18a184595f311714f88137302cdcad3d20639b5595c7fe0d3db0658fa735d2c31eeac483000dd6120233afaaa0535e9c6ed62000af560201b60201c565b620006107faa2bf0f18a184595f311714f88137302cdcad3d20639b5595c7fe0d3db0658fa735623225f296be00ec9db43f3ded96804f24b062d62000af560201b60201c565b620006567faa2bf0f18a184595f311714f88137302cdcad3d20639b5595c7fe0d3db0658fa7399b3208625e252ea0fbbe9b63e6004b06489d09462000af560201b60201c565b6200069c7faa2bf0f18a184595f311714f88137302cdcad3d20639b5595c7fe0d3db0658fa73596e5556cf23b30e6c2c4c60de216f66551c022062000af560201b60201c565b620006e27faa2bf0f18a184595f311714f88137302cdcad3d20639b5595c7fe0d3db0658fa739406609b3057053573f8d5418c1cbfaac5161f2162000af560201b60201c565b620007287faa2bf0f18a184595f311714f88137302cdcad3d20639b5595c7fe0d3db0658fa7371fc956eee0c97b095b70f6b1b263147a6d6799a62000af560201b60201c565b620007697f5df7ebf31955a926cc63dac31c1a31bc588cdae5c3e13e63b89ebfe0eaba87536200075d62000aed60201b60201c565b62000af560201b60201c565b6200079b7f5df7ebf31955a926cc63dac31c1a31bc588cdae5c3e13e63b89ebfe0eaba87533062000af560201b60201c565b620007ef7f5df7ebf31955a926cc63dac31c1a31bc588cdae5c3e13e63b89ebfe0eaba8753600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1662000af560201b60201c565b620008437f5df7ebf31955a926cc63dac31c1a31bc588cdae5c3e13e63b89ebfe0eaba8753600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1662000af560201b60201c565b620008777f5df7ebf31955a926cc63dac31c1a31bc588cdae5c3e13e63b89ebfe0eaba875361dead62000af560201b60201c565b620008bd7f5df7ebf31955a926cc63dac31c1a31bc588cdae5c3e13e63b89ebfe0eaba875373fd7d7a2175706e5555aab0aaaf2251c6bc691ffc62000af560201b60201c565b620009037f5df7ebf31955a926cc63dac31c1a31bc588cdae5c3e13e63b89ebfe0eaba875373b62848195772688117377b4cac2834a761c244e462000af560201b60201c565b620009497f5df7ebf31955a926cc63dac31c1a31bc588cdae5c3e13e63b89ebfe0eaba8753735d2c31eeac483000dd6120233afaaa0535e9c6ed62000af560201b60201c565b6200098f7f5df7ebf31955a926cc63dac31c1a31bc588cdae5c3e13e63b89ebfe0eaba8753735623225f296be00ec9db43f3ded96804f24b062d62000af560201b60201c565b620009d57f5df7ebf31955a926cc63dac31c1a31bc588cdae5c3e13e63b89ebfe0eaba87537399b3208625e252ea0fbbe9b63e6004b06489d09462000af560201b60201c565b62000a1b7f5df7ebf31955a926cc63dac31c1a31bc588cdae5c3e13e63b89ebfe0eaba875373596e5556cf23b30e6c2c4c60de216f66551c022062000af560201b60201c565b62000a617f5df7ebf31955a926cc63dac31c1a31bc588cdae5c3e13e63b89ebfe0eaba8753739406609b3057053573f8d5418c1cbfaac5161f2162000af560201b60201c565b62000aa77f5df7ebf31955a926cc63dac31c1a31bc588cdae5c3e13e63b89ebfe0eaba87537371fc956eee0c97b095b70f6b1b263147a6d6799a62000af560201b60201c565b62000ae762000abb62000aed60201b60201c565b600a8062000aca919062001077565b633b9aca0062000adb9190620011b4565b62000b0b60201b60201c565b6200131b565b600033905090565b62000b07828262000c8460201b60201c565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000b7e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000b759062000f6f565b60405180910390fd5b62000b926000838362000d7660201b60201c565b806002600082825462000ba6919062000fbf565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825462000bfd919062000fbf565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405162000c64919062000f91565b60405180910390a362000c806000838362000d7b60201b60201c565b5050565b62000c96828262000d8060201b60201c565b62000d725760016005600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555062000d1762000aed60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b505050565b505050565b60006005600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b82805462000df99062001260565b90600052602060002090601f01602090048101928262000e1d576000855562000e69565b82601f1062000e3857805160ff191683800117855562000e69565b8280016001018555821562000e69579182015b8281111562000e6857825182559160200191906001019062000e4b565b5b50905062000e78919062000e7c565b5090565b5b8082111562000e9757600081600090555060010162000e7d565b5090565b60008151905062000eac8162001301565b92915050565b60006020828403121562000ec557600080fd5b600062000ed58482850162000e9b565b91505092915050565b62000ee98162001215565b82525050565b600062000efe601f8362000fae565b91507f45524332303a206d696e7420746f20746865207a65726f2061646472657373006000830152602082019050919050565b62000f3c8162001249565b82525050565b600060408201905062000f59600083018562000ede565b62000f68602083018462000ede565b9392505050565b6000602082019050818103600083015262000f8a8162000eef565b9050919050565b600060208201905062000fa8600083018462000f31565b92915050565b600082825260208201905092915050565b600062000fcc8262001249565b915062000fd98362001249565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562001011576200101062001296565b5b828201905092915050565b6000808291508390505b60018511156200106e5780860481111562001046576200104562001296565b5b6001851615620010565780820291505b80810290506200106685620012f4565b945062001026565b94509492505050565b6000620010848262001249565b9150620010918362001253565b9250620010c07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484620010c8565b905092915050565b600082620010da5760019050620011ad565b81620010ea5760009050620011ad565b81600181146200110357600281146200110e5762001144565b6001915050620011ad565b60ff84111562001123576200112262001296565b5b8360020a9150848211156200113d576200113c62001296565b5b50620011ad565b5060208310610133831016604e8410600b84101617156200117e5782820a90508381111562001178576200117762001296565b5b620011ad565b6200118d84848460016200101c565b92509050818404811115620011a757620011a662001296565b5b81810290505b9392505050565b6000620011c18262001249565b9150620011ce8362001249565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156200120a576200120962001296565b5b828202905092915050565b6000620012228262001229565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b600060028204905060018216806200127957607f821691505b6020821081141562001290576200128f620012c5565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60008160011c9050919050565b6200130c8162001215565b81146200131857600080fd5b50565b6140e9806200132b6000396000f3fe6080604052600436106102555760003560e01c80636b67c4df11610139578063a457c2d7116100b6578063c31c9c071161007a578063c31c9c0714610923578063c9e482331461094e578063d547741f14610979578063dca74a19146109a2578063dd62ed3e146109cb578063fccc281314610a085761025c565b8063a457c2d71461082a578063a5ece94114610867578063a9059cbb14610892578063b98b677f146108cf578063bc063e1a146108f85761025c565b8063906e9dd0116100fd578063906e9dd01461074357806391d148541461076c57806395d89b41146107a957806398118cb4146107d4578063a217fddf146107ff5761025c565b80636b67c4df1461065e57806370a082311461068957806372bc5583146106c657806389701db5146106ef5780638e3166bc146107185761025c565b80632f2ff15d116101d25780633950935111610196578063395093511461053a5780633b46f869146105775780633dafaa9c146105a25780635342acb4146105cd578063614217841461060a578063625e764c146106355761025c565b80632f2ff15d14610469578063313ce56714610492578063357bf15c146104bd57806336568abe146104e65780633935ebf91461050f5761025c565b806318160ddd1161021957806318160ddd1461035c578063194f8f801461038757806323b872dd146103c4578063248a9ca31461040157806326991cc81461043e5761025c565b806301a6c43b1461026157806301ffc9a71461028c57806306fdde03146102c9578063095ea7b3146102f457806313114a9d146103315761025c565b3661025c57005b600080fd5b34801561026d57600080fd5b50610276610a33565b6040516102839190613a98565b60405180910390f35b34801561029857600080fd5b506102b360048036038101906102ae9190612f73565b610a39565b6040516102c0919061380a565b60405180910390f35b3480156102d557600080fd5b506102de610ab3565b6040516102eb919061385b565b60405180910390f35b34801561030057600080fd5b5061031b60048036038101906103169190612ea9565b610b45565b604051610328919061380a565b60405180910390f35b34801561033d57600080fd5b50610346610b63565b6040516103539190613a98565b60405180910390f35b34801561036857600080fd5b50610371610b7a565b60405161037e9190613a98565b60405180910390f35b34801561039357600080fd5b506103ae60048036038101906103a99190612dcc565b610b84565b6040516103bb919061380a565b60405180910390f35b3480156103d057600080fd5b506103eb60048036038101906103e69190612e5a565b610bb7565b6040516103f8919061380a565b60405180910390f35b34801561040d57600080fd5b5061042860048036038101906104239190612f0e565b610caf565b6040516104359190613825565b60405180910390f35b34801561044a57600080fd5b50610453610ccf565b6040516104609190613765565b60405180910390f35b34801561047557600080fd5b50610490600480360381019061048b9190612f37565b610cf5565b005b34801561049e57600080fd5b506104a7610d1e565b6040516104b49190613b36565b60405180910390f35b3480156104c957600080fd5b506104e460048036038101906104df9190612f9c565b610d27565b005b3480156104f257600080fd5b5061050d60048036038101906105089190612f37565b610daf565b005b34801561051b57600080fd5b50610524610e32565b6040516105319190613765565b60405180910390f35b34801561054657600080fd5b50610561600480360381019061055c9190612ea9565b610e58565b60405161056e919061380a565b60405180910390f35b34801561058357600080fd5b5061058c610f04565b6040516105999190613825565b60405180910390f35b3480156105ae57600080fd5b506105b7610f28565b6040516105c49190613825565b60405180910390f35b3480156105d957600080fd5b506105f460048036038101906105ef9190612dcc565b610f4c565b604051610601919061380a565b60405180910390f35b34801561061657600080fd5b5061061f610f7f565b60405161062c919061380a565b60405180910390f35b34801561064157600080fd5b5061065c60048036038101906106579190612f9c565b610f92565b005b34801561066a57600080fd5b5061067361101a565b6040516106809190613a98565b60405180910390f35b34801561069557600080fd5b506106b060048036038101906106ab9190612dcc565b611020565b6040516106bd9190613a98565b60405180910390f35b3480156106d257600080fd5b506106ed60048036038101906106e89190612dcc565b611068565b005b3480156106fb57600080fd5b5061071660048036038101906107119190612f9c565b6110c2565b005b34801561072457600080fd5b5061072d61112f565b60405161073a9190613825565b60405180910390f35b34801561074f57600080fd5b5061076a60048036038101906107659190612dcc565b611153565b005b34801561077857600080fd5b50610793600480360381019061078e9190612f37565b6111ad565b6040516107a0919061380a565b60405180910390f35b3480156107b557600080fd5b506107be611218565b6040516107cb919061385b565b60405180910390f35b3480156107e057600080fd5b506107e96112aa565b6040516107f69190613a98565b60405180910390f35b34801561080b57600080fd5b506108146112b0565b6040516108219190613825565b60405180910390f35b34801561083657600080fd5b50610851600480360381019061084c9190612ea9565b6112b7565b60405161085e919061380a565b60405180910390f35b34801561087357600080fd5b5061087c6113a2565b6040516108899190613765565b60405180910390f35b34801561089e57600080fd5b506108b960048036038101906108b49190612ea9565b6113c8565b6040516108c6919061380a565b60405180910390f35b3480156108db57600080fd5b506108f660048036038101906108f19190612dcc565b6113e6565b005b34801561090457600080fd5b5061090d61177b565b60405161091a9190613a7d565b60405180910390f35b34801561092f57600080fd5b50610938611781565b6040516109459190613840565b60405180910390f35b34801561095a57600080fd5b506109636117a7565b6040516109709190613a98565b60405180910390f35b34801561098557600080fd5b506109a0600480360381019061099b9190612f37565b6117c5565b005b3480156109ae57600080fd5b506109c960048036038101906109c49190612ee5565b6117ee565b005b3480156109d757600080fd5b506109f260048036038101906109ed9190612e1e565b611821565b6040516109ff9190613a98565b60405180910390f35b348015610a1457600080fd5b50610a1d6118a8565b604051610a2a9190613765565b60405180910390f35b600c5481565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610aac5750610aab826118ae565b5b9050919050565b606060038054610ac290613f63565b80601f0160208091040260200160405190810160405280929190818152602001828054610aee90613f63565b8015610b3b5780601f10610b1057610100808354040283529160200191610b3b565b820191906000526020600020905b815481529060010190602001808311610b1e57829003601f168201915b5050505050905090565b6000610b59610b52611918565b8484611920565b6001905092915050565b6000600754600654610b759190613bb1565b905090565b6000600254905090565b6000610bb07f5df7ebf31955a926cc63dac31c1a31bc588cdae5c3e13e63b89ebfe0eaba8753836111ad565b9050919050565b6000610bc4848484611aeb565b6000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610c0f611918565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015610c8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c869061395d565b60405180910390fd5b610ca385610c9b611918565b858403611920565b60019150509392505050565b600060056000838152602001908152602001600020600101549050919050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610cfe82610caf565b610d0f81610d0a611918565b611ea7565b610d198383611f44565b505050565b6000600a905090565b6000801b610d3c81610d37611918565b611ea7565b6107d061ffff1682600654610d4f610b63565b610d599190613e03565b610d639190613bb1565b1115610da4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9b90613a1d565b60405180910390fd5b816006819055505050565b610db7611918565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610e24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1b90613a5d565b60405180910390fd5b610e2e8282612025565b5050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000610efa610e65611918565b848460016000610e73611918565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610ef59190613bb1565b611920565b6001905092915050565b7fe26365870a4fc4941079bb663ce6252b0cf41101ec800616561f5c0f30dcf7ef81565b7faa2bf0f18a184595f311714f88137302cdcad3d20639b5595c7fe0d3db0658fa81565b6000610f787faa2bf0f18a184595f311714f88137302cdcad3d20639b5595c7fe0d3db0658fa836111ad565b9050919050565b600b60149054906101000a900460ff1681565b6000801b610fa781610fa2611918565b611ea7565b6107d061ffff1682600754610fba610b63565b610fc49190613e03565b610fce9190613bb1565b111561100f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100690613a1d565b60405180910390fd5b816007819055505050565b60075481565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000801b61107d81611078611918565b611ea7565b81600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000801b6110d7816110d2611918565b611ea7565b6110e030611020565b821115611122576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111199061393d565b60405180910390fd5b61112b82612107565b5050565b7f5df7ebf31955a926cc63dac31c1a31bc588cdae5c3e13e63b89ebfe0eaba875381565b6000801b61116881611163611918565b611ea7565b81600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b60006005600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60606004805461122790613f63565b80601f016020809104026020016040519081016040528092919081815260200182805461125390613f63565b80156112a05780601f10611275576101008083540402835291602001916112a0565b820191906000526020600020905b81548152906001019060200180831161128357829003601f168201915b5050505050905090565b60065481565b6000801b81565b600080600160006112c6611918565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015611383576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137a90613a3d565b60405180910390fd5b61139761138e611918565b85858403611920565b600191505092915050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006113dc6113d5611918565b8484611aeb565b6001905092915050565b6000801b6113fb816113f6611918565b611ea7565b81600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b1580156114a457600080fd5b505afa1580156114b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114dc9190612df5565b73ffffffffffffffffffffffffffffffffffffffff1663c9c6539630600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b15801561156057600080fd5b505afa158015611574573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115989190612df5565b6040518363ffffffff1660e01b81526004016115b5929190613780565b602060405180830381600087803b1580156115cf57600080fd5b505af11580156115e3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116079190612df5565b600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156116d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d09061399d565b60405180910390fd5b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fca394f95d8dbf1e8b2e76b9a8da90cacce1da85181a65508dab13212dc1df53b60405160405180910390a35050565b6107d081565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600a806117b49190613c8b565b629896806117c29190613da9565b81565b6117ce82610caf565b6117df816117da611918565b611ea7565b6117e98383612025565b505050565b6000801b611803816117fe611918565b611ea7565b81600b60146101000a81548160ff0219169083151502179055505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b61dead81565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611990576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611987906139dd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a00576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f7906138dd565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051611ade9190613a98565b60405180910390a3505050565b82611b167fe26365870a4fc4941079bb663ce6252b0cf41101ec800616561f5c0f30dcf7ef826111ad565b15611b56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4d906138fd565b60405180910390fd5b82611b817fe26365870a4fc4941079bb663ce6252b0cf41101ec800616561f5c0f30dcf7ef826111ad565b15611bc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb8906138fd565b60405180910390fd5b848484611bee7f5df7ebf31955a926cc63dac31c1a31bc588cdae5c3e13e63b89ebfe0eaba8753836111ad565b611c6a57600a80611bff9190613c8b565b62989680611c0d9190613da9565b611c2882611c1a85611020565b61227490919063ffffffff16565b1115611c69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c60906139fd565b60405180910390fd5b5b60008611611cad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ca49061397d565b60405180910390fd5b60011515600b60149054906101000a900460ff161515148015611ce3575060001515600b60159054906101000a900460ff161515145b8015611d3d5750600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff1614155b8015611d4f5750611d4d88610f4c565b155b15611d78576000611d5f30611020565b9050600c548110611d7657611d75600c54612107565b5b505b6000611d82610b63565b90506000600b60159054906101000a900460ff16158015611da35750600082115b8015611db55750611db38a610f4c565b155b8015611dc75750611dc589610f4c565b155b90508015611e8f576000611df8612710611dea858c61228a90919063ffffffff16565b6122a090919063ffffffff16565b90506000611e0f828b6122b690919063ffffffff16565b90508181611e1d9190613bb1565b8a14611e5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e55906138bd565b60405180910390fd5b6000821115611e7357611e728c30846122cc565b5b6000811115611e8857611e878c8c836122cc565b5b5050611e9b565b611e9a8a8a8a6122cc565b5b50505050505050505050565b611eb182826111ad565b611f4057611ed68173ffffffffffffffffffffffffffffffffffffffff16601461254d565b611ee48360001c602061254d565b604051602001611ef592919061372b565b6040516020818303038152906040526040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f37919061385b565b60405180910390fd5b5050565b611f4e82826111ad565b6120215760016005600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611fc6611918565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b61202f82826111ad565b156121035760006005600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506120a8611918565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b6001600b60156101000a81548160ff021916908315150217905550600061212d30611020565b90506000612139610b63565b905082821015801561214b5750600081115b156122545760006121798261216b6006548761228a90919063ffffffff16565b6122a090919063ffffffff16565b905060006121916002836122a090919063ffffffff16565b905060006121a883876122b690919063ffffffff16565b905060006121d1826121c385876122b690919063ffffffff16565b61227490919063ffffffff16565b905060004790506121e182612847565b60006121f682476122b690919063ffffffff16565b9050600061221f84612211888561228a90919063ffffffff16565b6122a090919063ffffffff16565b905061222b8682612b0b565b600061224082846122b690919063ffffffff16565b905061224b81612c53565b50505050505050505b50506000600b60156101000a81548160ff02191690831515021790555050565b600081836122829190613bb1565b905092915050565b600081836122989190613da9565b905092915050565b600081836122ae9190613c07565b905092915050565b600081836122c49190613e03565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561233c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612333906139bd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156123ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a39061389d565b60405180910390fd5b6123b7838383612d2f565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561243d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124349061391d565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124d09190613bb1565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516125349190613a98565b60405180910390a3612547848484612d34565b50505050565b6060600060028360026125609190613da9565b61256a9190613bb1565b67ffffffffffffffff8111156125a9577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156125db5781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110612639577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f7800000000000000000000000000000000000000000000000000000000000000816001815181106126c3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600060018460026127039190613da9565b61270d9190613bb1565b90505b60018111156127f9577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110612775577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b1a60f81b8282815181106127b2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c9450806127f290613f39565b9050612710565b506000841461283d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128349061387d565b60405180910390fd5b8091505092915050565b6000600267ffffffffffffffff81111561288a577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156128b85781602001602082028036833780820191505090505b50905030816000815181106128f6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b15801561299857600080fd5b505afa1580156129ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129d09190612df5565b81600181518110612a0a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050612a7130600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684611920565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b8152600401612ad5959493929190613ab3565b600060405180830381600087803b158015612aef57600080fd5b505af1158015612b03573d6000803e3d6000fd5b505050505050565b612b3830600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684611920565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d719823085600080600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16426040518863ffffffff1660e01b8152600401612bc1969594939291906137a9565b6060604051808303818588803b158015612bda57600080fd5b505af1158015612bee573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612c139190612fc5565b5050507fcb1652de9aeec38545fc281847b3dbfc89aab56dfa907b1ab68466f602c36fb48282604051612c47929190613b0d565b60405180910390a15050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015612cbb573d6000803e3d6000fd5b50600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f7281e2208e56b97e2118a4c1f31dc4badd530977cce4e1985af4f68f316b4ee982604051612d249190613a98565b60405180910390a250565b505050565b505050565b600081359050612d4881614040565b92915050565b600081519050612d5d81614040565b92915050565b600081359050612d7281614057565b92915050565b600081359050612d878161406e565b92915050565b600081359050612d9c81614085565b92915050565b600081359050612db18161409c565b92915050565b600081519050612dc68161409c565b92915050565b600060208284031215612dde57600080fd5b6000612dec84828501612d39565b91505092915050565b600060208284031215612e0757600080fd5b6000612e1584828501612d4e565b91505092915050565b60008060408385031215612e3157600080fd5b6000612e3f85828601612d39565b9250506020612e5085828601612d39565b9150509250929050565b600080600060608486031215612e6f57600080fd5b6000612e7d86828701612d39565b9350506020612e8e86828701612d39565b9250506040612e9f86828701612da2565b9150509250925092565b60008060408385031215612ebc57600080fd5b6000612eca85828601612d39565b9250506020612edb85828601612da2565b9150509250929050565b600060208284031215612ef757600080fd5b6000612f0584828501612d63565b91505092915050565b600060208284031215612f2057600080fd5b6000612f2e84828501612d78565b91505092915050565b60008060408385031215612f4a57600080fd5b6000612f5885828601612d78565b9250506020612f6985828601612d39565b9150509250929050565b600060208284031215612f8557600080fd5b6000612f9384828501612d8d565b91505092915050565b600060208284031215612fae57600080fd5b6000612fbc84828501612da2565b91505092915050565b600080600060608486031215612fda57600080fd5b6000612fe886828701612db7565b9350506020612ff986828701612db7565b925050604061300a86828701612db7565b9150509250925092565b6000613020838361302c565b60208301905092915050565b61303581613e37565b82525050565b61304481613e37565b82525050565b600061305582613b61565b61305f8185613b84565b935061306a83613b51565b8060005b8381101561309b5781516130828882613014565b975061308d83613b77565b92505060018101905061306e565b5085935050505092915050565b6130b181613e49565b82525050565b6130c081613e55565b82525050565b6130cf81613ed0565b82525050565b6130de81613ef4565b82525050565b60006130ef82613b6c565b6130f98185613b95565b9350613109818560208601613f06565b61311281614022565b840191505092915050565b600061312882613b6c565b6131328185613ba6565b9350613142818560208601613f06565b80840191505092915050565b600061315b602083613b95565b91507f537472696e67733a20686578206c656e67746820696e73756666696369656e746000830152602082019050919050565b600061319b602383613b95565b91507f45524332303a207472616e7366657220746f20746865207a65726f206164647260008301527f65737300000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613201601183613b95565b91507f5461782076616c756520696e76616c69640000000000000000000000000000006000830152602082019050919050565b6000613241602283613b95565b91507f45524332303a20617070726f766520746f20746865207a65726f20616464726560008301527f73730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006132a7600e83613b95565b91507f416464726573732064656e6965640000000000000000000000000000000000006000830152602082019050919050565b60006132e7602683613b95565b91507f45524332303a207472616e7366657220616d6f756e742065786365656473206260008301527f616c616e636500000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061334d600f83613b95565b91507f416d6f756e7420746f6f206869676800000000000000000000000000000000006000830152602082019050919050565b600061338d602883613b95565b91507f45524332303a207472616e7366657220616d6f756e742065786365656473206160008301527f6c6c6f77616e63650000000000000000000000000000000000000000000000006020830152604082019050919050565b60006133f3600d83613b95565b91507f5472616e73666572203c3d2030000000000000000000000000000000000000006000830152602082019050919050565b6000613433601583613b95565b91507f496e76616c6964207061697220616464726573732e00000000000000000000006000830152602082019050919050565b6000613473602583613b95565b91507f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008301527f64726573730000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006134d9602483613b95565b91507f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061353f601283613b95565b91507f57616c6c65742065786365656473206d617800000000000000000000000000006000830152602082019050919050565b600061357f600c83613b95565b91507f54617820746f6f206869676800000000000000000000000000000000000000006000830152602082019050919050565b60006135bf601783613ba6565b91507f416363657373436f6e74726f6c3a206163636f756e74200000000000000000006000830152601782019050919050565b60006135ff602583613b95565b91507f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008301527f207a65726f0000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613665601183613ba6565b91507f206973206d697373696e6720726f6c65200000000000000000000000000000006000830152601182019050919050565b60006136a5602f83613b95565b91507f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008301527f20726f6c657320666f722073656c6600000000000000000000000000000000006020830152604082019050919050565b61370781613e8b565b82525050565b61371681613eb9565b82525050565b61372581613ec3565b82525050565b6000613736826135b2565b9150613742828561311d565b915061374d82613658565b9150613759828461311d565b91508190509392505050565b600060208201905061377a600083018461303b565b92915050565b6000604082019050613795600083018561303b565b6137a2602083018461303b565b9392505050565b600060c0820190506137be600083018961303b565b6137cb602083018861370d565b6137d860408301876130d5565b6137e560608301866130d5565b6137f2608083018561303b565b6137ff60a083018461370d565b979650505050505050565b600060208201905061381f60008301846130a8565b92915050565b600060208201905061383a60008301846130b7565b92915050565b600060208201905061385560008301846130c6565b92915050565b6000602082019050818103600083015261387581846130e4565b905092915050565b600060208201905081810360008301526138968161314e565b9050919050565b600060208201905081810360008301526138b68161318e565b9050919050565b600060208201905081810360008301526138d6816131f4565b9050919050565b600060208201905081810360008301526138f681613234565b9050919050565b600060208201905081810360008301526139168161329a565b9050919050565b60006020820190508181036000830152613936816132da565b9050919050565b6000602082019050818103600083015261395681613340565b9050919050565b6000602082019050818103600083015261397681613380565b9050919050565b60006020820190508181036000830152613996816133e6565b9050919050565b600060208201905081810360008301526139b681613426565b9050919050565b600060208201905081810360008301526139d681613466565b9050919050565b600060208201905081810360008301526139f6816134cc565b9050919050565b60006020820190508181036000830152613a1681613532565b9050919050565b60006020820190508181036000830152613a3681613572565b9050919050565b60006020820190508181036000830152613a56816135f2565b9050919050565b60006020820190508181036000830152613a7681613698565b9050919050565b6000602082019050613a9260008301846136fe565b92915050565b6000602082019050613aad600083018461370d565b92915050565b600060a082019050613ac8600083018861370d565b613ad560208301876130d5565b8181036040830152613ae7818661304a565b9050613af6606083018561303b565b613b03608083018461370d565b9695505050505050565b6000604082019050613b22600083018561370d565b613b2f602083018461370d565b9392505050565b6000602082019050613b4b600083018461371c565b92915050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613bbc82613eb9565b9150613bc783613eb9565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613bfc57613bfb613f95565b5b828201905092915050565b6000613c1282613eb9565b9150613c1d83613eb9565b925082613c2d57613c2c613fc4565b5b828204905092915050565b6000808291508390505b6001851115613c8257808604811115613c5e57613c5d613f95565b5b6001851615613c6d5780820291505b8081029050613c7b85614033565b9450613c42565b94509492505050565b6000613c9682613eb9565b9150613ca183613ec3565b9250613cce7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484613cd6565b905092915050565b600082613ce65760019050613da2565b81613cf45760009050613da2565b8160018114613d0a5760028114613d1457613d43565b6001915050613da2565b60ff841115613d2657613d25613f95565b5b8360020a915084821115613d3d57613d3c613f95565b5b50613da2565b5060208310610133831016604e8410600b8410161715613d785782820a905083811115613d7357613d72613f95565b5b613da2565b613d858484846001613c38565b92509050818404811115613d9c57613d9b613f95565b5b81810290505b9392505050565b6000613db482613eb9565b9150613dbf83613eb9565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613df857613df7613f95565b5b828202905092915050565b6000613e0e82613eb9565b9150613e1983613eb9565b925082821015613e2c57613e2b613f95565b5b828203905092915050565b6000613e4282613e99565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b6000613edb82613ee2565b9050919050565b6000613eed82613e99565b9050919050565b6000613eff82613eb9565b9050919050565b60005b83811015613f24578082015181840152602081019050613f09565b83811115613f33576000848401525b50505050565b6000613f4482613eb9565b91506000821415613f5857613f57613f95565b5b600182039050919050565b60006002820490506001821680613f7b57607f821691505b60208210811415613f8f57613f8e613ff3565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000601f19601f8301169050919050565b60008160011c9050919050565b61404981613e37565b811461405457600080fd5b50565b61406081613e49565b811461406b57600080fd5b50565b61407781613e55565b811461408257600080fd5b50565b61408e81613e5f565b811461409957600080fd5b50565b6140a581613eb9565b81146140b057600080fd5b5056fea2646970667358221220e63114547f8b3f0b03b4992bc22100f818b09a6d196f15865c604df769c7919264736f6c63430008000033
Deployed Bytecode
0x6080604052600436106102555760003560e01c80636b67c4df11610139578063a457c2d7116100b6578063c31c9c071161007a578063c31c9c0714610923578063c9e482331461094e578063d547741f14610979578063dca74a19146109a2578063dd62ed3e146109cb578063fccc281314610a085761025c565b8063a457c2d71461082a578063a5ece94114610867578063a9059cbb14610892578063b98b677f146108cf578063bc063e1a146108f85761025c565b8063906e9dd0116100fd578063906e9dd01461074357806391d148541461076c57806395d89b41146107a957806398118cb4146107d4578063a217fddf146107ff5761025c565b80636b67c4df1461065e57806370a082311461068957806372bc5583146106c657806389701db5146106ef5780638e3166bc146107185761025c565b80632f2ff15d116101d25780633950935111610196578063395093511461053a5780633b46f869146105775780633dafaa9c146105a25780635342acb4146105cd578063614217841461060a578063625e764c146106355761025c565b80632f2ff15d14610469578063313ce56714610492578063357bf15c146104bd57806336568abe146104e65780633935ebf91461050f5761025c565b806318160ddd1161021957806318160ddd1461035c578063194f8f801461038757806323b872dd146103c4578063248a9ca31461040157806326991cc81461043e5761025c565b806301a6c43b1461026157806301ffc9a71461028c57806306fdde03146102c9578063095ea7b3146102f457806313114a9d146103315761025c565b3661025c57005b600080fd5b34801561026d57600080fd5b50610276610a33565b6040516102839190613a98565b60405180910390f35b34801561029857600080fd5b506102b360048036038101906102ae9190612f73565b610a39565b6040516102c0919061380a565b60405180910390f35b3480156102d557600080fd5b506102de610ab3565b6040516102eb919061385b565b60405180910390f35b34801561030057600080fd5b5061031b60048036038101906103169190612ea9565b610b45565b604051610328919061380a565b60405180910390f35b34801561033d57600080fd5b50610346610b63565b6040516103539190613a98565b60405180910390f35b34801561036857600080fd5b50610371610b7a565b60405161037e9190613a98565b60405180910390f35b34801561039357600080fd5b506103ae60048036038101906103a99190612dcc565b610b84565b6040516103bb919061380a565b60405180910390f35b3480156103d057600080fd5b506103eb60048036038101906103e69190612e5a565b610bb7565b6040516103f8919061380a565b60405180910390f35b34801561040d57600080fd5b5061042860048036038101906104239190612f0e565b610caf565b6040516104359190613825565b60405180910390f35b34801561044a57600080fd5b50610453610ccf565b6040516104609190613765565b60405180910390f35b34801561047557600080fd5b50610490600480360381019061048b9190612f37565b610cf5565b005b34801561049e57600080fd5b506104a7610d1e565b6040516104b49190613b36565b60405180910390f35b3480156104c957600080fd5b506104e460048036038101906104df9190612f9c565b610d27565b005b3480156104f257600080fd5b5061050d60048036038101906105089190612f37565b610daf565b005b34801561051b57600080fd5b50610524610e32565b6040516105319190613765565b60405180910390f35b34801561054657600080fd5b50610561600480360381019061055c9190612ea9565b610e58565b60405161056e919061380a565b60405180910390f35b34801561058357600080fd5b5061058c610f04565b6040516105999190613825565b60405180910390f35b3480156105ae57600080fd5b506105b7610f28565b6040516105c49190613825565b60405180910390f35b3480156105d957600080fd5b506105f460048036038101906105ef9190612dcc565b610f4c565b604051610601919061380a565b60405180910390f35b34801561061657600080fd5b5061061f610f7f565b60405161062c919061380a565b60405180910390f35b34801561064157600080fd5b5061065c60048036038101906106579190612f9c565b610f92565b005b34801561066a57600080fd5b5061067361101a565b6040516106809190613a98565b60405180910390f35b34801561069557600080fd5b506106b060048036038101906106ab9190612dcc565b611020565b6040516106bd9190613a98565b60405180910390f35b3480156106d257600080fd5b506106ed60048036038101906106e89190612dcc565b611068565b005b3480156106fb57600080fd5b5061071660048036038101906107119190612f9c565b6110c2565b005b34801561072457600080fd5b5061072d61112f565b60405161073a9190613825565b60405180910390f35b34801561074f57600080fd5b5061076a60048036038101906107659190612dcc565b611153565b005b34801561077857600080fd5b50610793600480360381019061078e9190612f37565b6111ad565b6040516107a0919061380a565b60405180910390f35b3480156107b557600080fd5b506107be611218565b6040516107cb919061385b565b60405180910390f35b3480156107e057600080fd5b506107e96112aa565b6040516107f69190613a98565b60405180910390f35b34801561080b57600080fd5b506108146112b0565b6040516108219190613825565b60405180910390f35b34801561083657600080fd5b50610851600480360381019061084c9190612ea9565b6112b7565b60405161085e919061380a565b60405180910390f35b34801561087357600080fd5b5061087c6113a2565b6040516108899190613765565b60405180910390f35b34801561089e57600080fd5b506108b960048036038101906108b49190612ea9565b6113c8565b6040516108c6919061380a565b60405180910390f35b3480156108db57600080fd5b506108f660048036038101906108f19190612dcc565b6113e6565b005b34801561090457600080fd5b5061090d61177b565b60405161091a9190613a7d565b60405180910390f35b34801561092f57600080fd5b50610938611781565b6040516109459190613840565b60405180910390f35b34801561095a57600080fd5b506109636117a7565b6040516109709190613a98565b60405180910390f35b34801561098557600080fd5b506109a0600480360381019061099b9190612f37565b6117c5565b005b3480156109ae57600080fd5b506109c960048036038101906109c49190612ee5565b6117ee565b005b3480156109d757600080fd5b506109f260048036038101906109ed9190612e1e565b611821565b6040516109ff9190613a98565b60405180910390f35b348015610a1457600080fd5b50610a1d6118a8565b604051610a2a9190613765565b60405180910390f35b600c5481565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610aac5750610aab826118ae565b5b9050919050565b606060038054610ac290613f63565b80601f0160208091040260200160405190810160405280929190818152602001828054610aee90613f63565b8015610b3b5780601f10610b1057610100808354040283529160200191610b3b565b820191906000526020600020905b815481529060010190602001808311610b1e57829003601f168201915b5050505050905090565b6000610b59610b52611918565b8484611920565b6001905092915050565b6000600754600654610b759190613bb1565b905090565b6000600254905090565b6000610bb07f5df7ebf31955a926cc63dac31c1a31bc588cdae5c3e13e63b89ebfe0eaba8753836111ad565b9050919050565b6000610bc4848484611aeb565b6000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610c0f611918565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015610c8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c869061395d565b60405180910390fd5b610ca385610c9b611918565b858403611920565b60019150509392505050565b600060056000838152602001908152602001600020600101549050919050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610cfe82610caf565b610d0f81610d0a611918565b611ea7565b610d198383611f44565b505050565b6000600a905090565b6000801b610d3c81610d37611918565b611ea7565b6107d061ffff1682600654610d4f610b63565b610d599190613e03565b610d639190613bb1565b1115610da4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9b90613a1d565b60405180910390fd5b816006819055505050565b610db7611918565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610e24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1b90613a5d565b60405180910390fd5b610e2e8282612025565b5050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000610efa610e65611918565b848460016000610e73611918565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610ef59190613bb1565b611920565b6001905092915050565b7fe26365870a4fc4941079bb663ce6252b0cf41101ec800616561f5c0f30dcf7ef81565b7faa2bf0f18a184595f311714f88137302cdcad3d20639b5595c7fe0d3db0658fa81565b6000610f787faa2bf0f18a184595f311714f88137302cdcad3d20639b5595c7fe0d3db0658fa836111ad565b9050919050565b600b60149054906101000a900460ff1681565b6000801b610fa781610fa2611918565b611ea7565b6107d061ffff1682600754610fba610b63565b610fc49190613e03565b610fce9190613bb1565b111561100f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100690613a1d565b60405180910390fd5b816007819055505050565b60075481565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000801b61107d81611078611918565b611ea7565b81600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000801b6110d7816110d2611918565b611ea7565b6110e030611020565b821115611122576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111199061393d565b60405180910390fd5b61112b82612107565b5050565b7f5df7ebf31955a926cc63dac31c1a31bc588cdae5c3e13e63b89ebfe0eaba875381565b6000801b61116881611163611918565b611ea7565b81600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b60006005600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60606004805461122790613f63565b80601f016020809104026020016040519081016040528092919081815260200182805461125390613f63565b80156112a05780601f10611275576101008083540402835291602001916112a0565b820191906000526020600020905b81548152906001019060200180831161128357829003601f168201915b5050505050905090565b60065481565b6000801b81565b600080600160006112c6611918565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015611383576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137a90613a3d565b60405180910390fd5b61139761138e611918565b85858403611920565b600191505092915050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006113dc6113d5611918565b8484611aeb565b6001905092915050565b6000801b6113fb816113f6611918565b611ea7565b81600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b1580156114a457600080fd5b505afa1580156114b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114dc9190612df5565b73ffffffffffffffffffffffffffffffffffffffff1663c9c6539630600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b15801561156057600080fd5b505afa158015611574573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115989190612df5565b6040518363ffffffff1660e01b81526004016115b5929190613780565b602060405180830381600087803b1580156115cf57600080fd5b505af11580156115e3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116079190612df5565b600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156116d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d09061399d565b60405180910390fd5b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fca394f95d8dbf1e8b2e76b9a8da90cacce1da85181a65508dab13212dc1df53b60405160405180910390a35050565b6107d081565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600a806117b49190613c8b565b629896806117c29190613da9565b81565b6117ce82610caf565b6117df816117da611918565b611ea7565b6117e98383612025565b505050565b6000801b611803816117fe611918565b611ea7565b81600b60146101000a81548160ff0219169083151502179055505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b61dead81565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611990576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611987906139dd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a00576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f7906138dd565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051611ade9190613a98565b60405180910390a3505050565b82611b167fe26365870a4fc4941079bb663ce6252b0cf41101ec800616561f5c0f30dcf7ef826111ad565b15611b56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4d906138fd565b60405180910390fd5b82611b817fe26365870a4fc4941079bb663ce6252b0cf41101ec800616561f5c0f30dcf7ef826111ad565b15611bc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb8906138fd565b60405180910390fd5b848484611bee7f5df7ebf31955a926cc63dac31c1a31bc588cdae5c3e13e63b89ebfe0eaba8753836111ad565b611c6a57600a80611bff9190613c8b565b62989680611c0d9190613da9565b611c2882611c1a85611020565b61227490919063ffffffff16565b1115611c69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c60906139fd565b60405180910390fd5b5b60008611611cad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ca49061397d565b60405180910390fd5b60011515600b60149054906101000a900460ff161515148015611ce3575060001515600b60159054906101000a900460ff161515145b8015611d3d5750600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff1614155b8015611d4f5750611d4d88610f4c565b155b15611d78576000611d5f30611020565b9050600c548110611d7657611d75600c54612107565b5b505b6000611d82610b63565b90506000600b60159054906101000a900460ff16158015611da35750600082115b8015611db55750611db38a610f4c565b155b8015611dc75750611dc589610f4c565b155b90508015611e8f576000611df8612710611dea858c61228a90919063ffffffff16565b6122a090919063ffffffff16565b90506000611e0f828b6122b690919063ffffffff16565b90508181611e1d9190613bb1565b8a14611e5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e55906138bd565b60405180910390fd5b6000821115611e7357611e728c30846122cc565b5b6000811115611e8857611e878c8c836122cc565b5b5050611e9b565b611e9a8a8a8a6122cc565b5b50505050505050505050565b611eb182826111ad565b611f4057611ed68173ffffffffffffffffffffffffffffffffffffffff16601461254d565b611ee48360001c602061254d565b604051602001611ef592919061372b565b6040516020818303038152906040526040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f37919061385b565b60405180910390fd5b5050565b611f4e82826111ad565b6120215760016005600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611fc6611918565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b61202f82826111ad565b156121035760006005600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506120a8611918565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b6001600b60156101000a81548160ff021916908315150217905550600061212d30611020565b90506000612139610b63565b905082821015801561214b5750600081115b156122545760006121798261216b6006548761228a90919063ffffffff16565b6122a090919063ffffffff16565b905060006121916002836122a090919063ffffffff16565b905060006121a883876122b690919063ffffffff16565b905060006121d1826121c385876122b690919063ffffffff16565b61227490919063ffffffff16565b905060004790506121e182612847565b60006121f682476122b690919063ffffffff16565b9050600061221f84612211888561228a90919063ffffffff16565b6122a090919063ffffffff16565b905061222b8682612b0b565b600061224082846122b690919063ffffffff16565b905061224b81612c53565b50505050505050505b50506000600b60156101000a81548160ff02191690831515021790555050565b600081836122829190613bb1565b905092915050565b600081836122989190613da9565b905092915050565b600081836122ae9190613c07565b905092915050565b600081836122c49190613e03565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561233c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612333906139bd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156123ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a39061389d565b60405180910390fd5b6123b7838383612d2f565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561243d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124349061391d565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124d09190613bb1565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516125349190613a98565b60405180910390a3612547848484612d34565b50505050565b6060600060028360026125609190613da9565b61256a9190613bb1565b67ffffffffffffffff8111156125a9577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156125db5781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110612639577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f7800000000000000000000000000000000000000000000000000000000000000816001815181106126c3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600060018460026127039190613da9565b61270d9190613bb1565b90505b60018111156127f9577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110612775577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b1a60f81b8282815181106127b2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c9450806127f290613f39565b9050612710565b506000841461283d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128349061387d565b60405180910390fd5b8091505092915050565b6000600267ffffffffffffffff81111561288a577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156128b85781602001602082028036833780820191505090505b50905030816000815181106128f6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b15801561299857600080fd5b505afa1580156129ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129d09190612df5565b81600181518110612a0a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050612a7130600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684611920565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b8152600401612ad5959493929190613ab3565b600060405180830381600087803b158015612aef57600080fd5b505af1158015612b03573d6000803e3d6000fd5b505050505050565b612b3830600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684611920565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d719823085600080600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16426040518863ffffffff1660e01b8152600401612bc1969594939291906137a9565b6060604051808303818588803b158015612bda57600080fd5b505af1158015612bee573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612c139190612fc5565b5050507fcb1652de9aeec38545fc281847b3dbfc89aab56dfa907b1ab68466f602c36fb48282604051612c47929190613b0d565b60405180910390a15050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015612cbb573d6000803e3d6000fd5b50600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f7281e2208e56b97e2118a4c1f31dc4badd530977cce4e1985af4f68f316b4ee982604051612d249190613a98565b60405180910390a250565b505050565b505050565b600081359050612d4881614040565b92915050565b600081519050612d5d81614040565b92915050565b600081359050612d7281614057565b92915050565b600081359050612d878161406e565b92915050565b600081359050612d9c81614085565b92915050565b600081359050612db18161409c565b92915050565b600081519050612dc68161409c565b92915050565b600060208284031215612dde57600080fd5b6000612dec84828501612d39565b91505092915050565b600060208284031215612e0757600080fd5b6000612e1584828501612d4e565b91505092915050565b60008060408385031215612e3157600080fd5b6000612e3f85828601612d39565b9250506020612e5085828601612d39565b9150509250929050565b600080600060608486031215612e6f57600080fd5b6000612e7d86828701612d39565b9350506020612e8e86828701612d39565b9250506040612e9f86828701612da2565b9150509250925092565b60008060408385031215612ebc57600080fd5b6000612eca85828601612d39565b9250506020612edb85828601612da2565b9150509250929050565b600060208284031215612ef757600080fd5b6000612f0584828501612d63565b91505092915050565b600060208284031215612f2057600080fd5b6000612f2e84828501612d78565b91505092915050565b60008060408385031215612f4a57600080fd5b6000612f5885828601612d78565b9250506020612f6985828601612d39565b9150509250929050565b600060208284031215612f8557600080fd5b6000612f9384828501612d8d565b91505092915050565b600060208284031215612fae57600080fd5b6000612fbc84828501612da2565b91505092915050565b600080600060608486031215612fda57600080fd5b6000612fe886828701612db7565b9350506020612ff986828701612db7565b925050604061300a86828701612db7565b9150509250925092565b6000613020838361302c565b60208301905092915050565b61303581613e37565b82525050565b61304481613e37565b82525050565b600061305582613b61565b61305f8185613b84565b935061306a83613b51565b8060005b8381101561309b5781516130828882613014565b975061308d83613b77565b92505060018101905061306e565b5085935050505092915050565b6130b181613e49565b82525050565b6130c081613e55565b82525050565b6130cf81613ed0565b82525050565b6130de81613ef4565b82525050565b60006130ef82613b6c565b6130f98185613b95565b9350613109818560208601613f06565b61311281614022565b840191505092915050565b600061312882613b6c565b6131328185613ba6565b9350613142818560208601613f06565b80840191505092915050565b600061315b602083613b95565b91507f537472696e67733a20686578206c656e67746820696e73756666696369656e746000830152602082019050919050565b600061319b602383613b95565b91507f45524332303a207472616e7366657220746f20746865207a65726f206164647260008301527f65737300000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613201601183613b95565b91507f5461782076616c756520696e76616c69640000000000000000000000000000006000830152602082019050919050565b6000613241602283613b95565b91507f45524332303a20617070726f766520746f20746865207a65726f20616464726560008301527f73730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006132a7600e83613b95565b91507f416464726573732064656e6965640000000000000000000000000000000000006000830152602082019050919050565b60006132e7602683613b95565b91507f45524332303a207472616e7366657220616d6f756e742065786365656473206260008301527f616c616e636500000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061334d600f83613b95565b91507f416d6f756e7420746f6f206869676800000000000000000000000000000000006000830152602082019050919050565b600061338d602883613b95565b91507f45524332303a207472616e7366657220616d6f756e742065786365656473206160008301527f6c6c6f77616e63650000000000000000000000000000000000000000000000006020830152604082019050919050565b60006133f3600d83613b95565b91507f5472616e73666572203c3d2030000000000000000000000000000000000000006000830152602082019050919050565b6000613433601583613b95565b91507f496e76616c6964207061697220616464726573732e00000000000000000000006000830152602082019050919050565b6000613473602583613b95565b91507f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008301527f64726573730000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006134d9602483613b95565b91507f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061353f601283613b95565b91507f57616c6c65742065786365656473206d617800000000000000000000000000006000830152602082019050919050565b600061357f600c83613b95565b91507f54617820746f6f206869676800000000000000000000000000000000000000006000830152602082019050919050565b60006135bf601783613ba6565b91507f416363657373436f6e74726f6c3a206163636f756e74200000000000000000006000830152601782019050919050565b60006135ff602583613b95565b91507f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008301527f207a65726f0000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613665601183613ba6565b91507f206973206d697373696e6720726f6c65200000000000000000000000000000006000830152601182019050919050565b60006136a5602f83613b95565b91507f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008301527f20726f6c657320666f722073656c6600000000000000000000000000000000006020830152604082019050919050565b61370781613e8b565b82525050565b61371681613eb9565b82525050565b61372581613ec3565b82525050565b6000613736826135b2565b9150613742828561311d565b915061374d82613658565b9150613759828461311d565b91508190509392505050565b600060208201905061377a600083018461303b565b92915050565b6000604082019050613795600083018561303b565b6137a2602083018461303b565b9392505050565b600060c0820190506137be600083018961303b565b6137cb602083018861370d565b6137d860408301876130d5565b6137e560608301866130d5565b6137f2608083018561303b565b6137ff60a083018461370d565b979650505050505050565b600060208201905061381f60008301846130a8565b92915050565b600060208201905061383a60008301846130b7565b92915050565b600060208201905061385560008301846130c6565b92915050565b6000602082019050818103600083015261387581846130e4565b905092915050565b600060208201905081810360008301526138968161314e565b9050919050565b600060208201905081810360008301526138b68161318e565b9050919050565b600060208201905081810360008301526138d6816131f4565b9050919050565b600060208201905081810360008301526138f681613234565b9050919050565b600060208201905081810360008301526139168161329a565b9050919050565b60006020820190508181036000830152613936816132da565b9050919050565b6000602082019050818103600083015261395681613340565b9050919050565b6000602082019050818103600083015261397681613380565b9050919050565b60006020820190508181036000830152613996816133e6565b9050919050565b600060208201905081810360008301526139b681613426565b9050919050565b600060208201905081810360008301526139d681613466565b9050919050565b600060208201905081810360008301526139f6816134cc565b9050919050565b60006020820190508181036000830152613a1681613532565b9050919050565b60006020820190508181036000830152613a3681613572565b9050919050565b60006020820190508181036000830152613a56816135f2565b9050919050565b60006020820190508181036000830152613a7681613698565b9050919050565b6000602082019050613a9260008301846136fe565b92915050565b6000602082019050613aad600083018461370d565b92915050565b600060a082019050613ac8600083018861370d565b613ad560208301876130d5565b8181036040830152613ae7818661304a565b9050613af6606083018561303b565b613b03608083018461370d565b9695505050505050565b6000604082019050613b22600083018561370d565b613b2f602083018461370d565b9392505050565b6000602082019050613b4b600083018461371c565b92915050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613bbc82613eb9565b9150613bc783613eb9565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613bfc57613bfb613f95565b5b828201905092915050565b6000613c1282613eb9565b9150613c1d83613eb9565b925082613c2d57613c2c613fc4565b5b828204905092915050565b6000808291508390505b6001851115613c8257808604811115613c5e57613c5d613f95565b5b6001851615613c6d5780820291505b8081029050613c7b85614033565b9450613c42565b94509492505050565b6000613c9682613eb9565b9150613ca183613ec3565b9250613cce7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484613cd6565b905092915050565b600082613ce65760019050613da2565b81613cf45760009050613da2565b8160018114613d0a5760028114613d1457613d43565b6001915050613da2565b60ff841115613d2657613d25613f95565b5b8360020a915084821115613d3d57613d3c613f95565b5b50613da2565b5060208310610133831016604e8410600b8410161715613d785782820a905083811115613d7357613d72613f95565b5b613da2565b613d858484846001613c38565b92509050818404811115613d9c57613d9b613f95565b5b81810290505b9392505050565b6000613db482613eb9565b9150613dbf83613eb9565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613df857613df7613f95565b5b828202905092915050565b6000613e0e82613eb9565b9150613e1983613eb9565b925082821015613e2c57613e2b613f95565b5b828203905092915050565b6000613e4282613e99565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b6000613edb82613ee2565b9050919050565b6000613eed82613e99565b9050919050565b6000613eff82613eb9565b9050919050565b60005b83811015613f24578082015181840152602081019050613f09565b83811115613f33576000848401525b50505050565b6000613f4482613eb9565b91506000821415613f5857613f57613f95565b5b600182039050919050565b60006002820490506001821680613f7b57607f821691505b60208210811415613f8f57613f8e613ff3565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000601f19601f8301169050919050565b60008160011c9050919050565b61404981613e37565b811461405457600080fd5b50565b61406081613e49565b811461406b57600080fd5b50565b61407781613e55565b811461408257600080fd5b50565b61408e81613e5f565b811461409957600080fd5b50565b6140a581613eb9565b81146140b057600080fd5b5056fea2646970667358221220e63114547f8b3f0b03b4992bc22100f818b09a6d196f15865c604df769c7919264736f6c63430008000033
Deployed Bytecode Sourcemap
55377:10574:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56429:54;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37855:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6461:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8628:169;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60063:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7581:108;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61858:145;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9279:492;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39266:123;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56280:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39651:147;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59956:99;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60175:222;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40699:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56310:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10180:215;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55993:62;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55799:84;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61713:137;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56348:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60405:222;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55583:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7752:127;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60850;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61518:187;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55890:96;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60707:135;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38151:139;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6680:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55537:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37242:49;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10898:413;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56064:76;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8092:175;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60985:385;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55631:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56237:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55682:70;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40043:149;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61378:132;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8330:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56147:81;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56429:54;;;;:::o;37855:204::-;37940:4;37979:32;37964:47;;;:11;:47;;;;:87;;;;38015:36;38039:11;38015:23;:36::i;:::-;37964:87;37957:94;;37855:204;;;:::o;6461:100::-;6515:13;6548:5;6541:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6461:100;:::o;8628:169::-;8711:4;8728:39;8737:12;:10;:12::i;:::-;8751:7;8760:6;8728:8;:39::i;:::-;8785:4;8778:11;;8628:169;;;;:::o;60063:104::-;60105:7;60147:12;;60132;;:27;;;;:::i;:::-;60125:34;;60063:104;:::o;7581:108::-;7642:7;7669:12;;7662:19;;7581:108;:::o;61858:145::-;61925:4;61949:46;55945:41;61987:7;61949;:46::i;:::-;61942:53;;61858:145;;;:::o;9279:492::-;9419:4;9436:36;9446:6;9454:9;9465:6;9436:9;:36::i;:::-;9485:24;9512:11;:19;9524:6;9512:19;;;;;;;;;;;;;;;:33;9532:12;:10;:12::i;:::-;9512:33;;;;;;;;;;;;;;;;9485:60;;9584:6;9564:16;:26;;9556:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;9671:57;9680:6;9688:12;:10;:12::i;:::-;9721:6;9702:16;:25;9671:8;:57::i;:::-;9759:4;9752:11;;;9279:492;;;;;:::o;39266:123::-;39332:7;39359:6;:12;39366:4;39359:12;;;;;;;;;;;:22;;;39352:29;;39266:123;;;:::o;56280:23::-;;;;;;;;;;;;;:::o;39651:147::-;39734:18;39747:4;39734:12;:18::i;:::-;37733:30;37744:4;37750:12;:10;:12::i;:::-;37733:10;:30::i;:::-;39765:25:::1;39776:4;39782:7;39765:10;:25::i;:::-;39651:147:::0;;;:::o;59956:99::-;60014:5;55526:2;60032:15;;59956:99;:::o;60175:222::-;37287:4;60241:18;;37733:30;37744:4;37750:12;:10;:12::i;:::-;37733:10;:30::i;:::-;55664:4:::1;60280:53;;60309:13;60294:12;;60280:11;:9;:11::i;:::-;:26;;;;:::i;:::-;:42;;;;:::i;:::-;:53;;60272:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;60376:13;60361:12;:28;;;;60175:222:::0;;:::o;40699:218::-;40806:12;:10;:12::i;:::-;40795:23;;:7;:23;;;40787:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;40883:26;40895:4;40901:7;40883:11;:26::i;:::-;40699:218;;:::o;56310:29::-;;;;;;;;;;;;;:::o;10180:215::-;10268:4;10285:80;10294:12;:10;:12::i;:::-;10308:7;10354:10;10317:11;:25;10329:12;:10;:12::i;:::-;10317:25;;;;;;;;;;;;;;;:34;10343:7;10317:34;;;;;;;;;;;;;;;;:47;;;;:::i;:::-;10285:8;:80::i;:::-;10383:4;10376:11;;10180:215;;;;:::o;55993:62::-;56031:24;55993:62;:::o;55799:84::-;55848:35;55799:84;:::o;61713:137::-;61778:4;61802:40;55848:35;61834:7;61802;:40::i;:::-;61795:47;;61713:137;;;:::o;56348:37::-;;;;;;;;;;;;;:::o;60405:222::-;37287:4;60471:18;;37733:30;37744:4;37750:12;:10;:12::i;:::-;37733:10;:30::i;:::-;55664:4:::1;60510:53;;60539:13;60524:12;;60510:11;:9;:11::i;:::-;:26;;;;:::i;:::-;:42;;;;:::i;:::-;:53;;60502:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;60606:13;60591:12;:28;;;;60405:222:::0;;:::o;55583:34::-;;;;:::o;7752:127::-;7826:7;7853:9;:18;7863:7;7853:18;;;;;;;;;;;;;;;;7846:25;;7752:127;;;:::o;60850:::-;37287:4;60913:18;;37733:30;37744:4;37750:12;:10;:12::i;:::-;37733:10;:30::i;:::-;60961:8:::1;60944:14;;:25;;;;;;;;;;;;;;;;;;60850:127:::0;;:::o;61518:187::-;37287:4;61573:18;;37733:30;37744:4;37750:12;:10;:12::i;:::-;37733:10;:30::i;:::-;61622:24:::1;61640:4;61622:9;:24::i;:::-;61612:6;:34;;61604:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;61677:20;61690:6;61677:12;:20::i;:::-;61518:187:::0;;:::o;55890:96::-;55945:41;55890:96;:::o;60707:135::-;37287:4;60774:18;;37733:30;37744:4;37750:12;:10;:12::i;:::-;37733:10;:30::i;:::-;60824:10:::1;60805:16;;:29;;;;;;;;;;;;;;;;;;60707:135:::0;;:::o;38151:139::-;38229:4;38253:6;:12;38260:4;38253:12;;;;;;;;;;;:20;;:29;38274:7;38253:29;;;;;;;;;;;;;;;;;;;;;;;;;38246:36;;38151:139;;;;:::o;6680:104::-;6736:13;6769:7;6762:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6680:104;:::o;55537:33::-;;;;:::o;37242:49::-;37287:4;37242:49;;;:::o;10898:413::-;10991:4;11008:24;11035:11;:25;11047:12;:10;:12::i;:::-;11035:25;;;;;;;;;;;;;;;:34;11061:7;11035:34;;;;;;;;;;;;;;;;11008:61;;11108:15;11088:16;:35;;11080:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;11201:67;11210:12;:10;:12::i;:::-;11224:7;11252:15;11233:16;:34;11201:8;:67::i;:::-;11299:4;11292:11;;;10898:413;;;;:::o;56064:76::-;;;;;;;;;;;;;:::o;8092:175::-;8178:4;8195:42;8205:12;:10;:12::i;:::-;8219:9;8230:6;8195:9;:42::i;:::-;8255:4;8248:11;;8092:175;;;;:::o;60985:385::-;37287:4;61049:18;;37733:30;37744:4;37750:12;:10;:12::i;:::-;37733:10;:30::i;:::-;61112:10:::1;61080;;:43;;;;;;;;;;;;;;;;;;61163:10;;;;;;;;;;;:18;;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;61145:50;;;61204:4;61211:10;;;;;;;;;;;:15;;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;61145:84;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;61134:8;;:95;;;;;;;;;;;;;;;;;;61270:1;61250:22;;:8;;;;;;;;;;;:22;;;;61242:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;61353:8;;;;;;;;;;;61314:48;;61340:10;;;;;;;;;;;61314:48;;;;;;;;;;;;60985:385:::0;;:::o;55631:37::-;55664:4;55631:37;:::o;56237:36::-;;;;;;;;;;;;;:::o;55682:70::-;55526:2;55740;:12;;;;:::i;:::-;55729:8;:23;;;;:::i;:::-;55682:70;:::o;40043:149::-;40127:18;40140:4;40127:12;:18::i;:::-;37733:30;37744:4;37750:12;:10;:12::i;:::-;37733:10;:30::i;:::-;40158:26:::1;40170:4;40176:7;40158:11;:26::i;:::-;40043:149:::0;;;:::o;61378:132::-;37287:4;61442:18;;37733:30;37744:4;37750:12;:10;:12::i;:::-;37733:10;:30::i;:::-;61494:8:::1;61473:18;;:29;;;;;;;;;;;;;;;;;;61378:132:::0;;:::o;8330:151::-;8419:7;8446:11;:18;8458:5;8446:18;;;;;;;;;;;;;;;:27;8465:7;8446:27;;;;;;;;;;;;;;;;8439:34;;8330:151;;;;:::o;56147:81::-;56186:42;56147:81;:::o;35172:157::-;35257:4;35296:25;35281:40;;;:11;:40;;;;35274:47;;35172:157;;;:::o;4170:98::-;4223:7;4250:10;4243:17;;4170:98;:::o;14582:380::-;14735:1;14718:19;;:5;:19;;;;14710:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;14816:1;14797:21;;:7;:21;;;;14789:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;14900:6;14870:11;:18;14882:5;14870:18;;;;;;;;;;;;;;;:27;14889:7;14870:27;;;;;;;;;;;;;;;:36;;;;14938:7;14922:32;;14931:5;14922:32;;;14947:6;14922:32;;;;;;:::i;:::-;;;;;;;;14582:380;;;:::o;62011:1322::-;62134:4;56767:29;56031:24;56788:7;56767;:29::i;:::-;56766:30;56758:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;62150:2:::1;56767:29;56031:24;56788:7;56767;:29::i;:::-;56766:30;56758:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;62164:4:::2;62170:2;62174:6;57081:48;55945:41;57119:9;57081:7;:48::i;:::-;57076:169;;55526:2;55740::::0;:12:::2;;;;:::i;:::-;55729:8;:23;;;;:::i;:::-;57154:32;57179:6;57154:20;57164:9;57154;:20::i;:::-;:24;;:32;;;;:::i;:::-;:56;;57146:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;57076:169;62210:1:::3;62201:6;:10;62193:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;62307:4;62285:26;;:18;;;;;;;;;;;:26;;;:67;;;;;62347:5;62328:24;;:15;;;;;;;;;;;:24;;;62285:67;:100;;;;;62377:8;;;;;;;;;;;62369:16;;:4;:16;;;;62285:100;:141;;;;;62403:23;62421:4;62403:17;:23::i;:::-;62402:24;62285:141;62267:376;;;62453:28;62484:24;62502:4;62484:9;:24::i;:::-;62453:55;;62551:15;;62527:20;:39;62523:109;;62587:29;62600:15;;62587:12;:29::i;:::-;62523:109;62267:376;;62655:16;62674:11;:9;:11::i;:::-;62655:30;;62696:12;62712:15;;;;;;;;;;;62711:16;:32;;;;;62742:1;62731:8;:12;62711:32;:60;;;;;62748:23;62766:4;62748:17;:23::i;:::-;62747:24;62711:60;:86;;;;;62776:21;62794:2;62776:17;:21::i;:::-;62775:22;62711:86;62696:101;;62814:7;62810:516;;;62838:17;62858:31;62883:5;62858:20;62869:8;62858:6;:10;;:20;;;;:::i;:::-;:24;;:31;;;;:::i;:::-;62838:51;;62904:18;62925:21;62936:9;62925:6;:10;;:21;;;;:::i;:::-;62904:42;;62992:9;62979:10;:22;;;;:::i;:::-;62969:6;:32;62961:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;63056:1;63044:9;:13;63040:101;;;63078:47;63094:4;63108;63115:9;63078:15;:47::i;:::-;63040:101;63174:1;63161:10;:14;63157:92;;;63196:37;63212:4;63218:2;63222:10;63196:15;:37::i;:::-;63157:92;62810:516;;;;;63281:33;63297:4;63303:2;63307:6;63281:15;:33::i;:::-;62810:516;57255:1;;56826::::2;;;::::1;62011:1322:::0;;;;:::o;38580:497::-;38661:22;38669:4;38675:7;38661;:22::i;:::-;38656:414;;38849:41;38877:7;38849:41;;38887:2;38849:19;:41::i;:::-;38963:38;38991:4;38983:13;;38998:2;38963:19;:38::i;:::-;38754:270;;;;;;;;;:::i;:::-;;;;;;;;;;;;;38700:358;;;;;;;;;;;:::i;:::-;;;;;;;;38656:414;38580:497;;:::o;42003:229::-;42078:22;42086:4;42092:7;42078;:22::i;:::-;42073:152;;42149:4;42117:6;:12;42124:4;42117:12;;;;;;;;;;;:20;;:29;42138:7;42117:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;42200:12;:10;:12::i;:::-;42173:40;;42191:7;42173:40;;42185:4;42173:40;;;;;;;;;;42073:152;42003:229;;:::o;42240:230::-;42315:22;42323:4;42329:7;42315;:22::i;:::-;42311:152;;;42386:5;42354:6;:12;42361:4;42354:12;;;;;;;;;;;:20;;:29;42375:7;42354:29;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;42438:12;:10;:12::i;:::-;42411:40;;42429:7;42411:40;;42423:4;42411:40;;;;;;;;;;42311:152;42240:230;;:::o;63341:1219::-;56895:4;56877:15;;:22;;;;;;;;;;;;;;;;;;63415:28:::1;63446:24;63464:4;63446:9;:24::i;:::-;63415:55;;63481:16;63500:11;:9;:11::i;:::-;63481:30;;63550:11;63526:20;:35;;:51;;;;;63576:1;63565:8;:12;63526:51;63522:1031;;;63594:23;63620:43;63654:8;63620:29;63636:12;;63620:11;:15;;:29;;;;:::i;:::-;:33;;:43;;;;:::i;:::-;63594:69;;63678:23;63704:22;63724:1;63704:15;:19;;:22;;;;:::i;:::-;63678:48;;63741:23;63767:32;63783:15;63767:11;:15;;:32;;;;:::i;:::-;63741:58;;63814:21;63838:57;63879:15;63838:36;63858:15;63838;:19;;:36;;;;:::i;:::-;:40;;:57;;;;:::i;:::-;63814:81;;63968:22;63993:21;63968:46;;64059:31;64076:13;64059:16;:31::i;:::-;64155:18;64176:41;64202:14;64176:21;:25;;:41;;;;:::i;:::-;64155:62;;64264:20;64287:50;64323:13;64287:31;64302:15;64287:10;:14;;:31;;;;:::i;:::-;:35;;:50;;;;:::i;:::-;64264:73;;64352:43;64365:15;64382:12;64352;:43::i;:::-;64446:20;64469:28;64484:12;64469:10;:14;;:28;;;;:::i;:::-;64446:51;;64512:29;64528:12;64512:15;:29::i;:::-;63522:1031;;;;;;;;;56910:1;;56940:5:::0;56922:15;;:23;;;;;;;;;;;;;;;;;;63341:1219;:::o;45275:98::-;45333:7;45364:1;45360;:5;;;;:::i;:::-;45353:12;;45275:98;;;;:::o;46013:::-;46071:7;46102:1;46098;:5;;;;:::i;:::-;46091:12;;46013:98;;;;:::o;46412:::-;46470:7;46501:1;46497;:5;;;;:::i;:::-;46490:12;;46412:98;;;;:::o;45656:::-;45714:7;45745:1;45741;:5;;;;:::i;:::-;45734:12;;45656:98;;;;:::o;11801:733::-;11959:1;11941:20;;:6;:20;;;;11933:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;12043:1;12022:23;;:9;:23;;;;12014:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;12098:47;12119:6;12127:9;12138:6;12098:20;:47::i;:::-;12158:21;12182:9;:17;12192:6;12182:17;;;;;;;;;;;;;;;;12158:41;;12235:6;12218:13;:23;;12210:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;12356:6;12340:13;:22;12320:9;:17;12330:6;12320:17;;;;;;;;;;;;;;;:42;;;;12408:6;12384:9;:20;12394:9;12384:20;;;;;;;;;;;;;;;;:30;;;;;;;:::i;:::-;;;;;;;;12449:9;12432:35;;12441:6;12432:35;;;12460:6;12432:35;;;;;;:::i;:::-;;;;;;;;12480:46;12500:6;12508:9;12519:6;12480:19;:46::i;:::-;11801:733;;;;:::o;33057:451::-;33132:13;33158:19;33203:1;33194:6;33190:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;33180:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33158:47;;33216:15;:6;33223:1;33216:9;;;;;;;;;;;;;;;;;;;:15;;;;;;;;;;;33242;:6;33249:1;33242:9;;;;;;;;;;;;;;;;;;;:15;;;;;;;;;;;33273:9;33298:1;33289:6;33285:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;33273:26;;33268:135;33305:1;33301;:5;33268:135;;;33340:12;33361:3;33353:5;:11;33340:25;;;;;;;;;;;;;;;;;;33328:6;33335:1;33328:9;;;;;;;;;;;;;;;;;;;:37;;;;;;;;;;;33390:1;33380:11;;;;;33308:3;;;;:::i;:::-;;;33268:135;;;;33430:1;33421:5;:10;33413:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;33493:6;33479:21;;;33057:451;;;;:::o;64602:571::-;64725:21;64763:1;64749:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64725:40;;64794:4;64776;64781:1;64776:7;;;;;;;;;;;;;;;;;;;;;:23;;;;;;;;;;;64820:10;;;;;;;;;;;:15;;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;64810:4;64815:1;64810:7;;;;;;;;;;;;;;;;;;;;;:27;;;;;;;;;;;64850:57;64867:4;64882:10;;;;;;;;;;;64895:11;64850:8;:57::i;:::-;64946:10;;;;;;;;;;;:61;;;65022:11;65048:1;65092:4;65119;65139:15;64946:219;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64602:571;;:::o;65209:564::-;65357:57;65374:4;65389:10;;;;;;;;;;;65402:11;65357:8;:57::i;:::-;65457:10;;;;;;;;;;;:26;;;65491:9;65524:4;65544:11;65570:1;65613;65656:14;;;;;;;;;;;65685:15;65457:254;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;65729:36;65742:11;65755:9;65729:36;;;;;;;:::i;:::-;;;;;;;;65209:564;;:::o;65781:167::-;65849:16;;;;;;;;;;;65841:34;;:42;65876:6;65841:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65915:16;;;;;;;;;;;65899:41;;;65933:6;65899:41;;;;;;:::i;:::-;;;;;;;;65781:167;:::o;15562:125::-;;;;:::o;16291:124::-;;;;:::o;7:139:1:-;;91:6;78:20;69:29;;107:33;134:5;107:33;:::i;:::-;59:87;;;;:::o;152:143::-;;240:6;234:13;225:22;;256:33;283:5;256:33;:::i;:::-;215:80;;;;:::o;301:133::-;;382:6;369:20;360:29;;398:30;422:5;398:30;:::i;:::-;350:84;;;;:::o;440:139::-;;524:6;511:20;502:29;;540:33;567:5;540:33;:::i;:::-;492:87;;;;:::o;585:137::-;;668:6;655:20;646:29;;684:32;710:5;684:32;:::i;:::-;636:86;;;;:::o;728:139::-;;812:6;799:20;790:29;;828:33;855:5;828:33;:::i;:::-;780:87;;;;:::o;873:143::-;;961:6;955:13;946:22;;977:33;1004:5;977:33;:::i;:::-;936:80;;;;:::o;1022:262::-;;1130:2;1118:9;1109:7;1105:23;1101:32;1098:2;;;1146:1;1143;1136:12;1098:2;1189:1;1214:53;1259:7;1250:6;1239:9;1235:22;1214:53;:::i;:::-;1204:63;;1160:117;1088:196;;;;:::o;1290:284::-;;1409:2;1397:9;1388:7;1384:23;1380:32;1377:2;;;1425:1;1422;1415:12;1377:2;1468:1;1493:64;1549:7;1540:6;1529:9;1525:22;1493:64;:::i;:::-;1483:74;;1439:128;1367:207;;;;:::o;1580:407::-;;;1705:2;1693:9;1684:7;1680:23;1676:32;1673:2;;;1721:1;1718;1711:12;1673:2;1764:1;1789:53;1834:7;1825:6;1814:9;1810:22;1789:53;:::i;:::-;1779:63;;1735:117;1891:2;1917:53;1962:7;1953:6;1942:9;1938:22;1917:53;:::i;:::-;1907:63;;1862:118;1663:324;;;;;:::o;1993:552::-;;;;2135:2;2123:9;2114:7;2110:23;2106:32;2103:2;;;2151:1;2148;2141:12;2103:2;2194:1;2219:53;2264:7;2255:6;2244:9;2240:22;2219:53;:::i;:::-;2209:63;;2165:117;2321:2;2347:53;2392:7;2383:6;2372:9;2368:22;2347:53;:::i;:::-;2337:63;;2292:118;2449:2;2475:53;2520:7;2511:6;2500:9;2496:22;2475:53;:::i;:::-;2465:63;;2420:118;2093:452;;;;;:::o;2551:407::-;;;2676:2;2664:9;2655:7;2651:23;2647:32;2644:2;;;2692:1;2689;2682:12;2644:2;2735:1;2760:53;2805:7;2796:6;2785:9;2781:22;2760:53;:::i;:::-;2750:63;;2706:117;2862:2;2888:53;2933:7;2924:6;2913:9;2909:22;2888:53;:::i;:::-;2878:63;;2833:118;2634:324;;;;;:::o;2964:256::-;;3069:2;3057:9;3048:7;3044:23;3040:32;3037:2;;;3085:1;3082;3075:12;3037:2;3128:1;3153:50;3195:7;3186:6;3175:9;3171:22;3153:50;:::i;:::-;3143:60;;3099:114;3027:193;;;;:::o;3226:262::-;;3334:2;3322:9;3313:7;3309:23;3305:32;3302:2;;;3350:1;3347;3340:12;3302:2;3393:1;3418:53;3463:7;3454:6;3443:9;3439:22;3418:53;:::i;:::-;3408:63;;3364:117;3292:196;;;;:::o;3494:407::-;;;3619:2;3607:9;3598:7;3594:23;3590:32;3587:2;;;3635:1;3632;3625:12;3587:2;3678:1;3703:53;3748:7;3739:6;3728:9;3724:22;3703:53;:::i;:::-;3693:63;;3649:117;3805:2;3831:53;3876:7;3867:6;3856:9;3852:22;3831:53;:::i;:::-;3821:63;;3776:118;3577:324;;;;;:::o;3907:260::-;;4014:2;4002:9;3993:7;3989:23;3985:32;3982:2;;;4030:1;4027;4020:12;3982:2;4073:1;4098:52;4142:7;4133:6;4122:9;4118:22;4098:52;:::i;:::-;4088:62;;4044:116;3972:195;;;;:::o;4173:262::-;;4281:2;4269:9;4260:7;4256:23;4252:32;4249:2;;;4297:1;4294;4287:12;4249:2;4340:1;4365:53;4410:7;4401:6;4390:9;4386:22;4365:53;:::i;:::-;4355:63;;4311:117;4239:196;;;;:::o;4441:596::-;;;;4594:2;4582:9;4573:7;4569:23;4565:32;4562:2;;;4610:1;4607;4600:12;4562:2;4653:1;4678:64;4734:7;4725:6;4714:9;4710:22;4678:64;:::i;:::-;4668:74;;4624:128;4791:2;4817:64;4873:7;4864:6;4853:9;4849:22;4817:64;:::i;:::-;4807:74;;4762:129;4930:2;4956:64;5012:7;5003:6;4992:9;4988:22;4956:64;:::i;:::-;4946:74;;4901:129;4552:485;;;;;:::o;5043:179::-;;5133:46;5175:3;5167:6;5133:46;:::i;:::-;5211:4;5206:3;5202:14;5188:28;;5123:99;;;;:::o;5228:108::-;5305:24;5323:5;5305:24;:::i;:::-;5300:3;5293:37;5283:53;;:::o;5342:118::-;5429:24;5447:5;5429:24;:::i;:::-;5424:3;5417:37;5407:53;;:::o;5496:732::-;;5644:54;5692:5;5644:54;:::i;:::-;5714:86;5793:6;5788:3;5714:86;:::i;:::-;5707:93;;5824:56;5874:5;5824:56;:::i;:::-;5903:7;5934:1;5919:284;5944:6;5941:1;5938:13;5919:284;;;6020:6;6014:13;6047:63;6106:3;6091:13;6047:63;:::i;:::-;6040:70;;6133:60;6186:6;6133:60;:::i;:::-;6123:70;;5979:224;5966:1;5963;5959:9;5954:14;;5919:284;;;5923:14;6219:3;6212:10;;5620:608;;;;;;;:::o;6234:109::-;6315:21;6330:5;6315:21;:::i;:::-;6310:3;6303:34;6293:50;;:::o;6349:118::-;6436:24;6454:5;6436:24;:::i;:::-;6431:3;6424:37;6414:53;;:::o;6473:185::-;6587:64;6645:5;6587:64;:::i;:::-;6582:3;6575:77;6565:93;;:::o;6664:147::-;6759:45;6798:5;6759:45;:::i;:::-;6754:3;6747:58;6737:74;;:::o;6817:364::-;;6933:39;6966:5;6933:39;:::i;:::-;6988:71;7052:6;7047:3;6988:71;:::i;:::-;6981:78;;7068:52;7113:6;7108:3;7101:4;7094:5;7090:16;7068:52;:::i;:::-;7145:29;7167:6;7145:29;:::i;:::-;7140:3;7136:39;7129:46;;6909:272;;;;;:::o;7187:377::-;;7321:39;7354:5;7321:39;:::i;:::-;7376:89;7458:6;7453:3;7376:89;:::i;:::-;7369:96;;7474:52;7519:6;7514:3;7507:4;7500:5;7496:16;7474:52;:::i;:::-;7551:6;7546:3;7542:16;7535:23;;7297:267;;;;;:::o;7570:330::-;;7733:67;7797:2;7792:3;7733:67;:::i;:::-;7726:74;;7830:34;7826:1;7821:3;7817:11;7810:55;7891:2;7886:3;7882:12;7875:19;;7716:184;;;:::o;7906:367::-;;8069:67;8133:2;8128:3;8069:67;:::i;:::-;8062:74;;8166:34;8162:1;8157:3;8153:11;8146:55;8232:5;8227:2;8222:3;8218:12;8211:27;8264:2;8259:3;8255:12;8248:19;;8052:221;;;:::o;8279:315::-;;8442:67;8506:2;8501:3;8442:67;:::i;:::-;8435:74;;8539:19;8535:1;8530:3;8526:11;8519:40;8585:2;8580:3;8576:12;8569:19;;8425:169;;;:::o;8600:366::-;;8763:67;8827:2;8822:3;8763:67;:::i;:::-;8756:74;;8860:34;8856:1;8851:3;8847:11;8840:55;8926:4;8921:2;8916:3;8912:12;8905:26;8957:2;8952:3;8948:12;8941:19;;8746:220;;;:::o;8972:312::-;;9135:67;9199:2;9194:3;9135:67;:::i;:::-;9128:74;;9232:16;9228:1;9223:3;9219:11;9212:37;9275:2;9270:3;9266:12;9259:19;;9118:166;;;:::o;9290:370::-;;9453:67;9517:2;9512:3;9453:67;:::i;:::-;9446:74;;9550:34;9546:1;9541:3;9537:11;9530:55;9616:8;9611:2;9606:3;9602:12;9595:30;9651:2;9646:3;9642:12;9635:19;;9436:224;;;:::o;9666:313::-;;9829:67;9893:2;9888:3;9829:67;:::i;:::-;9822:74;;9926:17;9922:1;9917:3;9913:11;9906:38;9970:2;9965:3;9961:12;9954:19;;9812:167;;;:::o;9985:372::-;;10148:67;10212:2;10207:3;10148:67;:::i;:::-;10141:74;;10245:34;10241:1;10236:3;10232:11;10225:55;10311:10;10306:2;10301:3;10297:12;10290:32;10348:2;10343:3;10339:12;10332:19;;10131:226;;;:::o;10363:311::-;;10526:67;10590:2;10585:3;10526:67;:::i;:::-;10519:74;;10623:15;10619:1;10614:3;10610:11;10603:36;10665:2;10660:3;10656:12;10649:19;;10509:165;;;:::o;10680:319::-;;10843:67;10907:2;10902:3;10843:67;:::i;:::-;10836:74;;10940:23;10936:1;10931:3;10927:11;10920:44;10990:2;10985:3;10981:12;10974:19;;10826:173;;;:::o;11005:369::-;;11168:67;11232:2;11227:3;11168:67;:::i;:::-;11161:74;;11265:34;11261:1;11256:3;11252:11;11245:55;11331:7;11326:2;11321:3;11317:12;11310:29;11365:2;11360:3;11356:12;11349:19;;11151:223;;;:::o;11380:368::-;;11543:67;11607:2;11602:3;11543:67;:::i;:::-;11536:74;;11640:34;11636:1;11631:3;11627:11;11620:55;11706:6;11701:2;11696:3;11692:12;11685:28;11739:2;11734:3;11730:12;11723:19;;11526:222;;;:::o;11754:316::-;;11917:67;11981:2;11976:3;11917:67;:::i;:::-;11910:74;;12014:20;12010:1;12005:3;12001:11;11994:41;12061:2;12056:3;12052:12;12045:19;;11900:170;;;:::o;12076:310::-;;12239:67;12303:2;12298:3;12239:67;:::i;:::-;12232:74;;12336:14;12332:1;12327:3;12323:11;12316:35;12377:2;12372:3;12368:12;12361:19;;12222:164;;;:::o;12392:357::-;;12573:85;12655:2;12650:3;12573:85;:::i;:::-;12566:92;;12688:25;12684:1;12679:3;12675:11;12668:46;12740:2;12735:3;12731:12;12724:19;;12556:193;;;:::o;12755:369::-;;12918:67;12982:2;12977:3;12918:67;:::i;:::-;12911:74;;13015:34;13011:1;13006:3;13002:11;12995:55;13081:7;13076:2;13071:3;13067:12;13060:29;13115:2;13110:3;13106:12;13099:19;;12901:223;;;:::o;13130:351::-;;13311:85;13393:2;13388:3;13311:85;:::i;:::-;13304:92;;13426:19;13422:1;13417:3;13413:11;13406:40;13472:2;13467:3;13463:12;13456:19;;13294:187;;;:::o;13487:379::-;;13650:67;13714:2;13709:3;13650:67;:::i;:::-;13643:74;;13747:34;13743:1;13738:3;13734:11;13727:55;13813:17;13808:2;13803:3;13799:12;13792:39;13857:2;13852:3;13848:12;13841:19;;13633:233;;;:::o;13872:115::-;13957:23;13974:5;13957:23;:::i;:::-;13952:3;13945:36;13935:52;;:::o;13993:118::-;14080:24;14098:5;14080:24;:::i;:::-;14075:3;14068:37;14058:53;;:::o;14117:112::-;14200:22;14216:5;14200:22;:::i;:::-;14195:3;14188:35;14178:51;;:::o;14235:967::-;;14639:148;14783:3;14639:148;:::i;:::-;14632:155;;14804:95;14895:3;14886:6;14804:95;:::i;:::-;14797:102;;14916:148;15060:3;14916:148;:::i;:::-;14909:155;;15081:95;15172:3;15163:6;15081:95;:::i;:::-;15074:102;;15193:3;15186:10;;14621:581;;;;;:::o;15208:222::-;;15339:2;15328:9;15324:18;15316:26;;15352:71;15420:1;15409:9;15405:17;15396:6;15352:71;:::i;:::-;15306:124;;;;:::o;15436:332::-;;15595:2;15584:9;15580:18;15572:26;;15608:71;15676:1;15665:9;15661:17;15652:6;15608:71;:::i;:::-;15689:72;15757:2;15746:9;15742:18;15733:6;15689:72;:::i;:::-;15562:206;;;;;:::o;15774:807::-;;16061:3;16050:9;16046:19;16038:27;;16075:71;16143:1;16132:9;16128:17;16119:6;16075:71;:::i;:::-;16156:72;16224:2;16213:9;16209:18;16200:6;16156:72;:::i;:::-;16238:80;16314:2;16303:9;16299:18;16290:6;16238:80;:::i;:::-;16328;16404:2;16393:9;16389:18;16380:6;16328:80;:::i;:::-;16418:73;16486:3;16475:9;16471:19;16462:6;16418:73;:::i;:::-;16501;16569:3;16558:9;16554:19;16545:6;16501:73;:::i;:::-;16028:553;;;;;;;;;:::o;16587:210::-;;16712:2;16701:9;16697:18;16689:26;;16725:65;16787:1;16776:9;16772:17;16763:6;16725:65;:::i;:::-;16679:118;;;;:::o;16803:222::-;;16934:2;16923:9;16919:18;16911:26;;16947:71;17015:1;17004:9;17000:17;16991:6;16947:71;:::i;:::-;16901:124;;;;:::o;17031:276::-;;17189:2;17178:9;17174:18;17166:26;;17202:98;17297:1;17286:9;17282:17;17273:6;17202:98;:::i;:::-;17156:151;;;;:::o;17313:313::-;;17464:2;17453:9;17449:18;17441:26;;17513:9;17507:4;17503:20;17499:1;17488:9;17484:17;17477:47;17541:78;17614:4;17605:6;17541:78;:::i;:::-;17533:86;;17431:195;;;;:::o;17632:419::-;;17836:2;17825:9;17821:18;17813:26;;17885:9;17879:4;17875:20;17871:1;17860:9;17856:17;17849:47;17913:131;18039:4;17913:131;:::i;:::-;17905:139;;17803:248;;;:::o;18057:419::-;;18261:2;18250:9;18246:18;18238:26;;18310:9;18304:4;18300:20;18296:1;18285:9;18281:17;18274:47;18338:131;18464:4;18338:131;:::i;:::-;18330:139;;18228:248;;;:::o;18482:419::-;;18686:2;18675:9;18671:18;18663:26;;18735:9;18729:4;18725:20;18721:1;18710:9;18706:17;18699:47;18763:131;18889:4;18763:131;:::i;:::-;18755:139;;18653:248;;;:::o;18907:419::-;;19111:2;19100:9;19096:18;19088:26;;19160:9;19154:4;19150:20;19146:1;19135:9;19131:17;19124:47;19188:131;19314:4;19188:131;:::i;:::-;19180:139;;19078:248;;;:::o;19332:419::-;;19536:2;19525:9;19521:18;19513:26;;19585:9;19579:4;19575:20;19571:1;19560:9;19556:17;19549:47;19613:131;19739:4;19613:131;:::i;:::-;19605:139;;19503:248;;;:::o;19757:419::-;;19961:2;19950:9;19946:18;19938:26;;20010:9;20004:4;20000:20;19996:1;19985:9;19981:17;19974:47;20038:131;20164:4;20038:131;:::i;:::-;20030:139;;19928:248;;;:::o;20182:419::-;;20386:2;20375:9;20371:18;20363:26;;20435:9;20429:4;20425:20;20421:1;20410:9;20406:17;20399:47;20463:131;20589:4;20463:131;:::i;:::-;20455:139;;20353:248;;;:::o;20607:419::-;;20811:2;20800:9;20796:18;20788:26;;20860:9;20854:4;20850:20;20846:1;20835:9;20831:17;20824:47;20888:131;21014:4;20888:131;:::i;:::-;20880:139;;20778:248;;;:::o;21032:419::-;;21236:2;21225:9;21221:18;21213:26;;21285:9;21279:4;21275:20;21271:1;21260:9;21256:17;21249:47;21313:131;21439:4;21313:131;:::i;:::-;21305:139;;21203:248;;;:::o;21457:419::-;;21661:2;21650:9;21646:18;21638:26;;21710:9;21704:4;21700:20;21696:1;21685:9;21681:17;21674:47;21738:131;21864:4;21738:131;:::i;:::-;21730:139;;21628:248;;;:::o;21882:419::-;;22086:2;22075:9;22071:18;22063:26;;22135:9;22129:4;22125:20;22121:1;22110:9;22106:17;22099:47;22163:131;22289:4;22163:131;:::i;:::-;22155:139;;22053:248;;;:::o;22307:419::-;;22511:2;22500:9;22496:18;22488:26;;22560:9;22554:4;22550:20;22546:1;22535:9;22531:17;22524:47;22588:131;22714:4;22588:131;:::i;:::-;22580:139;;22478:248;;;:::o;22732:419::-;;22936:2;22925:9;22921:18;22913:26;;22985:9;22979:4;22975:20;22971:1;22960:9;22956:17;22949:47;23013:131;23139:4;23013:131;:::i;:::-;23005:139;;22903:248;;;:::o;23157:419::-;;23361:2;23350:9;23346:18;23338:26;;23410:9;23404:4;23400:20;23396:1;23385:9;23381:17;23374:47;23438:131;23564:4;23438:131;:::i;:::-;23430:139;;23328:248;;;:::o;23582:419::-;;23786:2;23775:9;23771:18;23763:26;;23835:9;23829:4;23825:20;23821:1;23810:9;23806:17;23799:47;23863:131;23989:4;23863:131;:::i;:::-;23855:139;;23753:248;;;:::o;24007:419::-;;24211:2;24200:9;24196:18;24188:26;;24260:9;24254:4;24250:20;24246:1;24235:9;24231:17;24224:47;24288:131;24414:4;24288:131;:::i;:::-;24280:139;;24178:248;;;:::o;24432:218::-;;24561:2;24550:9;24546:18;24538:26;;24574:69;24640:1;24629:9;24625:17;24616:6;24574:69;:::i;:::-;24528:122;;;;:::o;24656:222::-;;24787:2;24776:9;24772:18;24764:26;;24800:71;24868:1;24857:9;24853:17;24844:6;24800:71;:::i;:::-;24754:124;;;;:::o;24884:831::-;;25185:3;25174:9;25170:19;25162:27;;25199:71;25267:1;25256:9;25252:17;25243:6;25199:71;:::i;:::-;25280:80;25356:2;25345:9;25341:18;25332:6;25280:80;:::i;:::-;25407:9;25401:4;25397:20;25392:2;25381:9;25377:18;25370:48;25435:108;25538:4;25529:6;25435:108;:::i;:::-;25427:116;;25553:72;25621:2;25610:9;25606:18;25597:6;25553:72;:::i;:::-;25635:73;25703:3;25692:9;25688:19;25679:6;25635:73;:::i;:::-;25152:563;;;;;;;;:::o;25721:332::-;;25880:2;25869:9;25865:18;25857:26;;25893:71;25961:1;25950:9;25946:17;25937:6;25893:71;:::i;:::-;25974:72;26042:2;26031:9;26027:18;26018:6;25974:72;:::i;:::-;25847:206;;;;;:::o;26059:214::-;;26186:2;26175:9;26171:18;26163:26;;26199:67;26263:1;26252:9;26248:17;26239:6;26199:67;:::i;:::-;26153:120;;;;:::o;26279:132::-;;26369:3;26361:11;;26399:4;26394:3;26390:14;26382:22;;26351:60;;;:::o;26417:114::-;;26518:5;26512:12;26502:22;;26491:40;;;:::o;26537:99::-;;26623:5;26617:12;26607:22;;26596:40;;;:::o;26642:113::-;;26744:4;26739:3;26735:14;26727:22;;26717:38;;;:::o;26761:184::-;;26894:6;26889:3;26882:19;26934:4;26929:3;26925:14;26910:29;;26872:73;;;;:::o;26951:169::-;;27069:6;27064:3;27057:19;27109:4;27104:3;27100:14;27085:29;;27047:73;;;;:::o;27126:148::-;;27265:3;27250:18;;27240:34;;;;:::o;27280:305::-;;27339:20;27357:1;27339:20;:::i;:::-;27334:25;;27373:20;27391:1;27373:20;:::i;:::-;27368:25;;27527:1;27459:66;27455:74;27452:1;27449:81;27446:2;;;27533:18;;:::i;:::-;27446:2;27577:1;27574;27570:9;27563:16;;27324:261;;;;:::o;27591:185::-;;27648:20;27666:1;27648:20;:::i;:::-;27643:25;;27682:20;27700:1;27682:20;:::i;:::-;27677:25;;27721:1;27711:2;;27726:18;;:::i;:::-;27711:2;27768:1;27765;27761:9;27756:14;;27633:143;;;;:::o;27782:848::-;;;27874:6;27865:15;;27898:5;27889:14;;27912:712;27933:1;27923:8;27920:15;27912:712;;;28028:4;28023:3;28019:14;28013:4;28010:24;28007:2;;;28037:18;;:::i;:::-;28007:2;28087:1;28077:8;28073:16;28070:2;;;28502:4;28495:5;28491:16;28482:25;;28070:2;28552:4;28546;28542:15;28534:23;;28582:32;28605:8;28582:32;:::i;:::-;28570:44;;27912:712;;;27855:775;;;;;;;:::o;28636:281::-;;28718:23;28736:4;28718:23;:::i;:::-;28710:31;;28762:25;28778:8;28762:25;:::i;:::-;28750:37;;28806:104;28843:66;28833:8;28827:4;28806:104;:::i;:::-;28797:113;;28700:217;;;;:::o;28923:1073::-;;29168:8;29158:2;;29189:1;29180:10;;29191:5;;29158:2;29217:4;29207:2;;29234:1;29225:10;;29236:5;;29207:2;29303:4;29351:1;29346:27;;;;29387:1;29382:191;;;;29296:277;;29346:27;29364:1;29355:10;;29366:5;;;29382:191;29427:3;29417:8;29414:17;29411:2;;;29434:18;;:::i;:::-;29411:2;29483:8;29480:1;29476:16;29467:25;;29518:3;29511:5;29508:14;29505:2;;;29525:18;;:::i;:::-;29505:2;29558:5;;;29296:277;;29682:2;29672:8;29669:16;29663:3;29657:4;29654:13;29650:36;29632:2;29622:8;29619:16;29614:2;29608:4;29605:12;29601:35;29585:111;29582:2;;;29738:8;29732:4;29728:19;29719:28;;29773:3;29766:5;29763:14;29760:2;;;29780:18;;:::i;:::-;29760:2;29813:5;;29582:2;29853:42;29891:3;29881:8;29875:4;29872:1;29853:42;:::i;:::-;29838:57;;;;29927:4;29922:3;29918:14;29911:5;29908:25;29905:2;;;29936:18;;:::i;:::-;29905:2;29985:4;29978:5;29974:16;29965:25;;28983:1013;;;;;;:::o;30002:348::-;;30065:20;30083:1;30065:20;:::i;:::-;30060:25;;30099:20;30117:1;30099:20;:::i;:::-;30094:25;;30287:1;30219:66;30215:74;30212:1;30209:81;30204:1;30197:9;30190:17;30186:105;30183:2;;;30294:18;;:::i;:::-;30183:2;30342:1;30339;30335:9;30324:20;;30050:300;;;;:::o;30356:191::-;;30416:20;30434:1;30416:20;:::i;:::-;30411:25;;30450:20;30468:1;30450:20;:::i;:::-;30445:25;;30489:1;30486;30483:8;30480:2;;;30494:18;;:::i;:::-;30480:2;30539:1;30536;30532:9;30524:17;;30401:146;;;;:::o;30553:96::-;;30619:24;30637:5;30619:24;:::i;:::-;30608:35;;30598:51;;;:::o;30655:90::-;;30732:5;30725:13;30718:21;30707:32;;30697:48;;;:::o;30751:77::-;;30817:5;30806:16;;30796:32;;;:::o;30834:149::-;;30910:66;30903:5;30899:78;30888:89;;30878:105;;;:::o;30989:89::-;;31065:6;31058:5;31054:18;31043:29;;31033:45;;;:::o;31084:126::-;;31161:42;31154:5;31150:54;31139:65;;31129:81;;;:::o;31216:77::-;;31282:5;31271:16;;31261:32;;;:::o;31299:86::-;;31374:4;31367:5;31363:16;31352:27;;31342:43;;;:::o;31391:180::-;;31501:64;31559:5;31501:64;:::i;:::-;31488:77;;31478:93;;;:::o;31577:140::-;;31687:24;31705:5;31687:24;:::i;:::-;31674:37;;31664:53;;;:::o;31723:121::-;;31814:24;31832:5;31814:24;:::i;:::-;31801:37;;31791:53;;;:::o;31850:307::-;31918:1;31928:113;31942:6;31939:1;31936:13;31928:113;;;32027:1;32022:3;32018:11;32012:18;32008:1;32003:3;31999:11;31992:39;31964:2;31961:1;31957:10;31952:15;;31928:113;;;32059:6;32056:1;32053:13;32050:2;;;32139:1;32130:6;32125:3;32121:16;32114:27;32050:2;31899:258;;;;:::o;32163:171::-;;32225:24;32243:5;32225:24;:::i;:::-;32216:33;;32271:4;32264:5;32261:15;32258:2;;;32279:18;;:::i;:::-;32258:2;32326:1;32319:5;32315:13;32308:20;;32206:128;;;:::o;32340:320::-;;32421:1;32415:4;32411:12;32401:22;;32468:1;32462:4;32458:12;32489:18;32479:2;;32545:4;32537:6;32533:17;32523:27;;32479:2;32607;32599:6;32596:14;32576:18;32573:38;32570:2;;;32626:18;;:::i;:::-;32570:2;32391:269;;;;:::o;32666:180::-;32714:77;32711:1;32704:88;32811:4;32808:1;32801:15;32835:4;32832:1;32825:15;32852:180;32900:77;32897:1;32890:88;32997:4;32994:1;32987:15;33021:4;33018:1;33011:15;33038:180;33086:77;33083:1;33076:88;33183:4;33180:1;33173:15;33207:4;33204:1;33197:15;33224:102;;33316:2;33312:7;33307:2;33300:5;33296:14;33292:28;33282:38;;33272:54;;;:::o;33332:102::-;;33421:5;33418:1;33414:13;33393:34;;33383:51;;;:::o;33440:122::-;33513:24;33531:5;33513:24;:::i;:::-;33506:5;33503:35;33493:2;;33552:1;33549;33542:12;33493:2;33483:79;:::o;33568:116::-;33638:21;33653:5;33638:21;:::i;:::-;33631:5;33628:32;33618:2;;33674:1;33671;33664:12;33618:2;33608:76;:::o;33690:122::-;33763:24;33781:5;33763:24;:::i;:::-;33756:5;33753:35;33743:2;;33802:1;33799;33792:12;33743:2;33733:79;:::o;33818:120::-;33890:23;33907:5;33890:23;:::i;:::-;33883:5;33880:34;33870:2;;33928:1;33925;33918:12;33870:2;33860:78;:::o;33944:122::-;34017:24;34035:5;34017:24;:::i;:::-;34010:5;34007:35;33997:2;;34056:1;34053;34046:12;33997:2;33987:79;:::o
Swarm Source
ipfs://e63114547f8b3f0b03b4992bc22100f818b09a6d196f15865c604df769c79192
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.