- Contract name:
- StandardTokenFactory
- Optimization enabled
- true
- Compiler version
- v0.8.13+commit.abaa5c0e
- Optimization runs
- 5000
- EVM Version
- default
- Verified at
- 2024-07-20T06:15:52.317939Z
contracts/CreateToken/Meter/StandardTokenFactory.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "./StandardToken.sol";
contract StandardTokenFactory {
function deploy(
address creator_,
string memory name_,
string memory symbol_,
uint8 decimals_,
uint256 tokenSupply_,
SharedStructs.status memory _state
) external returns (StandardToken) {
return
new StandardToken(
creator_,
name_,
symbol_,
decimals_,
tokenSupply_,
_state
);
}
}
@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)
pragma solidity ^0.8.0;
import "../IERC20.sol";
/**
* @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);
}
@openzeppelin/contracts/utils/Address.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol)
pragma solidity ^0.8.1;
/**
* @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
*
* Furthermore, `isContract` will also return true if the target contract within
* the same transaction is already scheduled for destruction by `SELFDESTRUCT`,
* which only has an effect at the end of a transaction.
* ====
*
* [IMPORTANT]
* ====
* You shouldn't rely on `isContract` to protect against flash loan attacks!
*
* Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
* like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
* constructor.
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize/address.code.length, which returns 0
// for contracts in construction, since the code is only stored at the end
// of the constructor execution.
return account.code.length > 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://consensys.net/diligence/blog/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.8.0/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 functionCallWithValue(target, data, 0, "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");
(bool success, bytes memory returndata) = target.call{value: value}(data);
return verifyCallResultFromTarget(target, 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) {
(bool success, bytes memory returndata) = target.staticcall(data);
return verifyCallResultFromTarget(target, 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) {
(bool success, bytes memory returndata) = target.delegatecall(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
/**
* @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
* the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
*
* _Available since v4.8._
*/
function verifyCallResultFromTarget(
address target,
bool success,
bytes memory returndata,
string memory errorMessage
) internal view returns (bytes memory) {
if (success) {
if (returndata.length == 0) {
// only check isContract if the call was successful and the return data is empty
// otherwise we already know that it was a contract
require(isContract(target), "Address: call to non-contract");
}
return returndata;
} else {
_revert(returndata, errorMessage);
}
}
/**
* @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
* revert reason or 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 {
_revert(returndata, errorMessage);
}
}
function _revert(bytes memory returndata, string memory errorMessage) private pure {
// 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
/// @solidity memory-safe-assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
@openzeppelin/contracts/token/ERC20/IERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
/**
* @dev 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 `to`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address to, 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 `from` to `to` 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 from, address to, uint256 amount) external returns (bool);
}
@openzeppelin/contracts/utils/Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.4) (utils/Context.sol)
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;
}
function _contextSuffixLength() internal view virtual returns (uint256) {
return 0;
}
}
contracts/CreateToken/Meter/SharedStructs.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
library SharedStructs {
struct status {
uint256 mintflag;
uint256 pauseflag;
uint256 burnflag;
uint256 blacklistflag;
}
}
contracts/CreateToken/Meter/StandardToken.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol";
import "@openzeppelin/contracts/utils/Context.sol";
import "@openzeppelin/contracts/utils/Address.sol";
import "./SharedStructs.sol";
contract StandardToken is Context, IERC20, IERC20Metadata {
// address public owner;
address public owner;
string private _name;
string private _symbol;
uint8 private _decimals;
uint256 private _totalSupply;
uint256 public isstandard = 1;
bool private _paused;
SharedStructs.status public state;
mapping(address => uint256) private _balances;
mapping(address => mapping(address => uint256)) private _allowances;
mapping(address => bool) _blacklist;
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
require(owner == _msgSender(), "Ownable: caller is not the owner");
_;
}
modifier canMint() {
require(state.mintflag > 0, "Mintable: Disabled Mint");
_;
}
modifier canPause() {
require(state.mintflag > 0, "Pausable: Disabled Pause");
_;
}
modifier canBurn() {
require(state.burnflag > 0, "Burnable: Disabled Burn");
_;
}
modifier canBlacklist() {
require(state.blacklistflag > 0, "Blacklist: Disabled Blacklist");
_;
}
modifier whenNotPaused() {
require(!paused(), "Pausable: paused");
_;
}
modifier whenPaused() {
require(paused(), "Pausable: not paused");
_;
}
event BlacklistUpdated(address indexed user, bool value);
event Paused(address account);
event Unpaused(address account);
/**
* @dev Sets the values for {name}, {symbol} and {decimals}.
*
*
* All two of these values are immutable: they can only be set once during
* construction.
*/
constructor(
address creator_,
string memory name_,
string memory symbol_,
uint8 decimals_,
uint256 tokenSupply_,
SharedStructs.status memory _state
) {
_name = name_;
_symbol = symbol_;
_decimals = decimals_;
owner = creator_;
state = _state;
_mint(creator_, tokenSupply_);
_paused = false;
}
function setStatus(SharedStructs.status memory _state) internal virtual {
state = _state;
}
/**
* @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 _decimals;
}
/**
* @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"
);
_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"
);
_approve(_msgSender(), spender, currentAllowance - subtractedValue);
return true;
}
/**
* @dev Moves tokens `amount` from `sender` to `recipient`.
*
* This is internal function is equivalent to {transfer}, and can be used to
* e.g. implement automatic token fees, slashing mechanisms, etc.
*
* Emits a {Transfer} event.
*
* Requirements:
*
* - `sender` cannot be the zero address.
* - `recipient` cannot be the zero address.
* - `sender` must have a balance of at least `amount`.
*/
function _transfer(
address sender,
address recipient,
uint256 amount
) internal virtual {
require(sender != address(0), "ERC20: transfer from the zero address");
require(recipient != address(0), "ERC20: transfer to the zero address");
_beforeTokenTransfer(sender, recipient, amount);
uint256 senderBalance = _balances[sender];
require(
senderBalance >= amount,
"ERC20: transfer amount exceeds balance"
);
_balances[sender] = senderBalance - amount;
_balances[recipient] += amount;
emit Transfer(sender, recipient, amount);
}
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);
}
/** @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)
public
virtual
onlyOwner
canMint
{
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);
}
/**
* @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(uint256 amount) public virtual onlyOwner canBurn {
require(
_msgSender() != address(0),
"ERC20: burn from the zero address"
);
_beforeTokenTransfer(_msgSender(), address(0), amount);
uint256 accountBalance = _balances[_msgSender()];
require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
_balances[_msgSender()] = accountBalance - amount;
_totalSupply -= amount;
emit Transfer(_msgSender(), 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);
}
function blacklistUpdate(address user, bool value)
public
virtual
onlyOwner
canBlacklist
{
// require(_owner == _msgSender(), "Only owner is allowed to modify blacklist.");
_blacklist[user] = value;
emit BlacklistUpdated(user, value);
}
function isBlackListed(address user)
public
view
virtual
canBlacklist
returns (bool)
{
return _blacklist[user];
}
function paused() public view virtual canPause returns (bool) {
return _paused;
}
function _pause() public virtual onlyOwner canPause whenNotPaused {
_paused = true;
emit Paused(_msgSender());
}
function _unpause() public virtual onlyOwner canPause whenPaused {
_paused = false;
emit Unpaused(_msgSender());
}
/**
* @dev Hook that is called before any transfer of tokens. This includes
* minting and burning.
*
* Calling conditions:
*
* - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
* will be to transferred to `to`.
* - when `from` is zero, `amount` tokens will be minted for `to`.
* - when `to` is zero, `amount` of ``from``'s tokens will be burned.
* - `from` and `to` are never both zero.
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _beforeTokenTransfer(
address sender,
address to,
uint256 amount
) internal virtual {
// require(sender != address(0), "ERC20: transfer from the zero address");
// require(to != address(0), "ERC20: transfer to the zero address");
require(amount >= 0, "ERC20: transfer to the zero address");
if (state.blacklistflag > 0) {
require(
!isBlackListed(sender),
"Token transfer refused. Receiver is on blacklist"
);
require(
!isBlackListed(to),
"Token transfer refused. Receiver is on blacklist"
);
}
if (state.pauseflag > 0) {
require(!paused(), "Token is Paused.");
}
}
}
Compiler Settings
{"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata","devdoc","userdoc","storageLayout","evm.gasEstimates"],"":["ast"]}},"optimizer":{"runs":5000,"enabled":true},"metadata":{"useLiteralContent":true},"libraries":{}}
Contract ABI
[{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"address","name":"","internalType":"contract StandardToken"}],"name":"deploy","inputs":[{"type":"address","name":"creator_","internalType":"address"},{"type":"string","name":"name_","internalType":"string"},{"type":"string","name":"symbol_","internalType":"string"},{"type":"uint8","name":"decimals_","internalType":"uint8"},{"type":"uint256","name":"tokenSupply_","internalType":"uint256"},{"type":"tuple","name":"_state","internalType":"struct SharedStructs.status","components":[{"type":"uint256","name":"mintflag","internalType":"uint256"},{"type":"uint256","name":"pauseflag","internalType":"uint256"},{"type":"uint256","name":"burnflag","internalType":"uint256"},{"type":"uint256","name":"blacklistflag","internalType":"uint256"}]}]}]
Contract Creation Code
0x608060405234801561001057600080fd5b50612067806100206000396000f3fe60806040523480156200001157600080fd5b50600436106200002e5760003560e01c8063213db6b71462000033575b600080fd5b6200004a620000443660046200021d565b62000073565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b60008686868686866040516200008990620000c3565b6200009a9695949392919062000359565b604051809103906000f080158015620000b7573d6000803e3d6000fd5b50979650505050505050565b611c4d80620003e583390190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f8301126200011257600080fd5b813567ffffffffffffffff80821115620001305762000130620000d1565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715620001795762000179620000d1565b816040528381528660208588010111156200019357600080fd5b836020870160208301376000602085830101528094505050505092915050565b600060808284031215620001c657600080fd5b6040516080810181811067ffffffffffffffff82111715620001ec57620001ec620000d1565b8060405250809150823581526020830135602082015260408301356040820152606083013560608201525092915050565b60008060008060008061012087890312156200023857600080fd5b863573ffffffffffffffffffffffffffffffffffffffff811681146200025d57600080fd5b9550602087013567ffffffffffffffff808211156200027b57600080fd5b620002898a838b0162000100565b96506040890135915080821115620002a057600080fd5b50620002af89828a0162000100565b945050606087013560ff81168114620002c757600080fd5b925060808701359150620002df8860a08901620001b3565b90509295509295509295565b6000815180845260005b818110156200031357602081850181015186830182015201620002f5565b8181111562000326576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b600061012073ffffffffffffffffffffffffffffffffffffffff891683528060208401526200038b81840189620002eb565b90508281036040840152620003a18188620002eb565b91505060ff85166060830152836080830152825160a0830152602083015160c0830152604083015160e0830152606083015161010083015297965050505050505056fe608060405260016005553480156200001657600080fd5b5060405162001c4d38038062001c4d8339810160408190526200003991620005ab565b84516200004e906001906020880190620003be565b50835162000064906002906020870190620003be565b506003805460ff191660ff8516179055600080546001600160a01b0319166001600160a01b0388161790558051600755602081015160085560408101516009556060810151600a55620000b88683620000cf565b50506006805460ff1916905550620006d092505050565b6001600160a01b0382166200012b5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064015b60405180910390fd5b6200013960008383620001c6565b80600460008282546200014d91906200066d565b90915550506001600160a01b0382166000908152600b6020526040812080548392906200017c9084906200066d565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b600a54156200029357620001da83620002ed565b15620002315760405162461bcd60e51b8152602060048201526030602482015260008051602062001c2d83398151915260448201526f081a5cc81bdb88189b1858dadb1a5cdd60821b606482015260840162000122565b6200023c82620002ed565b15620002935760405162461bcd60e51b8152602060048201526030602482015260008051602062001c2d83398151915260448201526f081a5cc81bdb88189b1858dadb1a5cdd60821b606482015260840162000122565b60085415620002e857620002a662000360565b15620002e85760405162461bcd60e51b815260206004820152601060248201526f2a37b5b2b71034b9902830bab9b2b21760811b604482015260640162000122565b505050565b600a54600090620003415760405162461bcd60e51b815260206004820152601d60248201527f426c61636b6c6973743a2044697361626c656420426c61636b6c697374000000604482015260640162000122565b506001600160a01b03166000908152600d602052604090205460ff1690565b600754600090620003b45760405162461bcd60e51b815260206004820152601860248201527f5061757361626c653a2044697361626c65642050617573650000000000000000604482015260640162000122565b5060065460ff1690565b828054620003cc9062000694565b90600052602060002090601f016020900481019282620003f057600085556200043b565b82601f106200040b57805160ff19168380011785556200043b565b828001600101855582156200043b579182015b828111156200043b5782518255916020019190600101906200041e565b50620004499291506200044d565b5090565b5b808211156200044957600081556001016200044e565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715620004a557620004a562000464565b604052919050565b600082601f830112620004bf57600080fd5b81516001600160401b03811115620004db57620004db62000464565b6020620004f1601f8301601f191682016200047a565b82815285828487010111156200050657600080fd5b60005b838110156200052657858101830151828201840152820162000509565b83811115620005385760008385840101525b5095945050505050565b6000608082840312156200055557600080fd5b604051608081016001600160401b03811182821017156200057a576200057a62000464565b8060405250809150825181526020830151602082015260408301516040820152606083015160608201525092915050565b6000806000806000806101208789031215620005c657600080fd5b86516001600160a01b0381168114620005de57600080fd5b60208801519096506001600160401b0380821115620005fc57600080fd5b6200060a8a838b01620004ad565b965060408901519150808211156200062157600080fd5b506200063089828a01620004ad565b945050606087015160ff811681146200064857600080fd5b60808801519093509150620006618860a0890162000542565b90509295509295509295565b600082198211156200068f57634e487b7160e01b600052601160045260246000fd5b500190565b600181811c90821680620006a957607f821691505b602082108103620006ca57634e487b7160e01b600052602260045260246000fd5b50919050565b61154d80620006e06000396000f3fe608060405234801561001057600080fd5b50600436106101775760003560e01c80635c975abb116100d8578063a9059cbb1161008c578063dd62ed3e11610066578063dd62ed3e14610316578063e47d60601461034f578063fc8234cb1461036257600080fd5b8063a9059cbb146102ba578063b351dfe8146102cd578063c19d93fb146102e057600080fd5b80638da5cb5b116100bd5780638da5cb5b1461027457806395d89b411461029f578063a457c2d7146102a757600080fd5b80635c975abb1461024357806370a082311461024b57600080fd5b8063320b2ad91161012f57806340c10f191161011457806340c10f191461021457806342966c681461022757806349538af41461023a57600080fd5b8063320b2ad9146101f7578063395093511461020157600080fd5b806318160ddd1161016057806318160ddd146101bd57806323b872dd146101cf578063313ce567146101e257600080fd5b806306fdde031461017c578063095ea7b31461019a575b600080fd5b61018461036a565b60405161019191906112cc565b60405180910390f35b6101ad6101a8366004611356565b6103fc565b6040519015158152602001610191565b6004545b604051908152602001610191565b6101ad6101dd366004611380565b610412565b60035460405160ff9091168152602001610191565b6101ff6104dd565b005b6101ad61020f366004611356565b61062d565b6101ff610222366004611356565b610664565b6101ff6102353660046113bc565b6107f9565b6101c160055481565b6101ad610a10565b6101c16102593660046113d5565b6001600160a01b03166000908152600b602052604090205490565b600054610287906001600160a01b031681565b6040516001600160a01b039091168152602001610191565b610184610a6c565b6101ad6102b5366004611356565b610a7b565b6101ad6102c8366004611356565b610b2e565b6101ff6102db3660046113f7565b610b3b565b600754600854600954600a546102f69392919084565b604080519485526020850193909352918301526060820152608001610191565b6101c1610324366004611433565b6001600160a01b039182166000908152600c6020908152604080832093909416825291909152205490565b6101ad61035d3660046113d5565b610c43565b6101ff610cb8565b60606001805461037990611466565b80601f01602080910402602001604051908101604052809291908181526020018280546103a590611466565b80156103f25780601f106103c7576101008083540402835291602001916103f2565b820191906000526020600020905b8154815290600101906020018083116103d557829003601f168201915b5050505050905090565b6000610409338484610de6565b50600192915050565b600061041f848484610f3e565b6001600160a01b0384166000908152600c60209081526040808320338452909152902054828110156104be5760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206160448201527f6c6c6f77616e636500000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6104d285336104cd86856114e8565b610de6565b506001949350505050565b6000546001600160a01b031633146105375760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016104b5565b6007546105865760405162461bcd60e51b815260206004820152601860248201527f5061757361626c653a2044697361626c6564205061757365000000000000000060448201526064016104b5565b61058e610a10565b156105db5760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a207061757365640000000000000000000000000000000060448201526064016104b5565b6006805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586106103390565b6040516001600160a01b03909116815260200160405180910390a1565b336000818152600c602090815260408083206001600160a01b038716845290915281205490916104099185906104cd9086906114ff565b6000546001600160a01b031633146106be5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016104b5565b60075461070d5760405162461bcd60e51b815260206004820152601760248201527f4d696e7461626c653a2044697361626c6564204d696e7400000000000000000060448201526064016104b5565b6001600160a01b0382166107635760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016104b5565b61076f6000838361116a565b806004600082825461078191906114ff565b90915550506001600160a01b0382166000908152600b6020526040812080548392906107ae9084906114ff565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020015b60405180910390a35050565b6000546001600160a01b031633146108535760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016104b5565b6009546108a25760405162461bcd60e51b815260206004820152601760248201527f4275726e61626c653a2044697361626c6564204275726e00000000000000000060448201526064016104b5565b336109155760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f730000000000000000000000000000000000000000000000000000000000000060648201526084016104b5565b6109213360008361116a565b336000908152600b6020526040902054818110156109a75760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f636500000000000000000000000000000000000000000000000000000000000060648201526084016104b5565b6109b182826114e8565b336000908152600b6020526040812091909155600480548492906109d69084906114e8565b909155505060405182815260009033907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020016107ed565b600754600090610a625760405162461bcd60e51b815260206004820152601860248201527f5061757361626c653a2044697361626c6564205061757365000000000000000060448201526064016104b5565b5060065460ff1690565b60606002805461037990611466565b336000908152600c602090815260408083206001600160a01b038616845290915281205482811015610b155760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f00000000000000000000000000000000000000000000000000000060648201526084016104b5565b610b2433856104cd86856114e8565b5060019392505050565b6000610409338484610f3e565b6000546001600160a01b03163314610b955760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016104b5565b600a54610be45760405162461bcd60e51b815260206004820152601d60248201527f426c61636b6c6973743a2044697361626c656420426c61636b6c69737400000060448201526064016104b5565b6001600160a01b0382166000818152600d6020908152604091829020805460ff191685151590811790915591519182527f6a12b3df6cba4203bd7fd06b816789f87de8c594299aed5717ae070fac781bac910160405180910390a25050565b600a54600090610c955760405162461bcd60e51b815260206004820152601d60248201527f426c61636b6c6973743a2044697361626c656420426c61636b6c69737400000060448201526064016104b5565b506001600160a01b0381166000908152600d602052604090205460ff165b919050565b6000546001600160a01b03163314610d125760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016104b5565b600754610d615760405162461bcd60e51b815260206004820152601860248201527f5061757361626c653a2044697361626c6564205061757365000000000000000060448201526064016104b5565b610d69610a10565b610db55760405162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f742070617573656400000000000000000000000060448201526064016104b5565b6006805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa33610610565b6001600160a01b038316610e615760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f726573730000000000000000000000000000000000000000000000000000000060648201526084016104b5565b6001600160a01b038216610edd5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f737300000000000000000000000000000000000000000000000000000000000060648201526084016104b5565b6001600160a01b038381166000818152600c602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038316610fba5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f647265737300000000000000000000000000000000000000000000000000000060648201526084016104b5565b6001600160a01b0382166110365760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f657373000000000000000000000000000000000000000000000000000000000060648201526084016104b5565b61104183838361116a565b6001600160a01b0383166000908152600b6020526040902054818110156110d05760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e6365000000000000000000000000000000000000000000000000000060648201526084016104b5565b6110da82826114e8565b6001600160a01b038086166000908152600b602052604080822093909355908516815290812080548492906111109084906114ff565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161115c91815260200190565b60405180910390a350505050565b600a541561126a5761117b83610c43565b156111ee5760405162461bcd60e51b815260206004820152603060248201527f546f6b656e207472616e7366657220726566757365642e20526563656976657260448201527f206973206f6e20626c61636b6c6973740000000000000000000000000000000060648201526084016104b5565b6111f782610c43565b1561126a5760405162461bcd60e51b815260206004820152603060248201527f546f6b656e207472616e7366657220726566757365642e20526563656976657260448201527f206973206f6e20626c61636b6c6973740000000000000000000000000000000060648201526084016104b5565b600854156112c75761127a610a10565b156112c75760405162461bcd60e51b815260206004820152601060248201527f546f6b656e206973205061757365642e0000000000000000000000000000000060448201526064016104b5565b505050565b600060208083528351808285015260005b818110156112f9578581018301518582016040015282016112dd565b8181111561130b576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b80356001600160a01b0381168114610cb357600080fd5b6000806040838503121561136957600080fd5b6113728361133f565b946020939093013593505050565b60008060006060848603121561139557600080fd5b61139e8461133f565b92506113ac6020850161133f565b9150604084013590509250925092565b6000602082840312156113ce57600080fd5b5035919050565b6000602082840312156113e757600080fd5b6113f08261133f565b9392505050565b6000806040838503121561140a57600080fd5b6114138361133f565b91506020830135801515811461142857600080fd5b809150509250929050565b6000806040838503121561144657600080fd5b61144f8361133f565b915061145d6020840161133f565b90509250929050565b600181811c9082168061147a57607f821691505b6020821081036114b3577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000828210156114fa576114fa6114b9565b500390565b60008219821115611512576115126114b9565b50019056fea264697066735822122038e6b2b7046da963e8917698f21796f855d169c48d997a094fd9988be81d1d1664736f6c634300080d0033546f6b656e207472616e7366657220726566757365642e205265636569766572a2646970667358221220a764dbe978d035f7f3731bc54b1bea4ff8b0273665f89eafdac93ebe5987d97264736f6c634300080d0033
Deployed ByteCode
0x60806040523480156200001157600080fd5b50600436106200002e5760003560e01c8063213db6b71462000033575b600080fd5b6200004a620000443660046200021d565b62000073565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b60008686868686866040516200008990620000c3565b6200009a9695949392919062000359565b604051809103906000f080158015620000b7573d6000803e3d6000fd5b50979650505050505050565b611c4d80620003e583390190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f8301126200011257600080fd5b813567ffffffffffffffff80821115620001305762000130620000d1565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715620001795762000179620000d1565b816040528381528660208588010111156200019357600080fd5b836020870160208301376000602085830101528094505050505092915050565b600060808284031215620001c657600080fd5b6040516080810181811067ffffffffffffffff82111715620001ec57620001ec620000d1565b8060405250809150823581526020830135602082015260408301356040820152606083013560608201525092915050565b60008060008060008061012087890312156200023857600080fd5b863573ffffffffffffffffffffffffffffffffffffffff811681146200025d57600080fd5b9550602087013567ffffffffffffffff808211156200027b57600080fd5b620002898a838b0162000100565b96506040890135915080821115620002a057600080fd5b50620002af89828a0162000100565b945050606087013560ff81168114620002c757600080fd5b925060808701359150620002df8860a08901620001b3565b90509295509295509295565b6000815180845260005b818110156200031357602081850181015186830182015201620002f5565b8181111562000326576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b600061012073ffffffffffffffffffffffffffffffffffffffff891683528060208401526200038b81840189620002eb565b90508281036040840152620003a18188620002eb565b91505060ff85166060830152836080830152825160a0830152602083015160c0830152604083015160e0830152606083015161010083015297965050505050505056fe608060405260016005553480156200001657600080fd5b5060405162001c4d38038062001c4d8339810160408190526200003991620005ab565b84516200004e906001906020880190620003be565b50835162000064906002906020870190620003be565b506003805460ff191660ff8516179055600080546001600160a01b0319166001600160a01b0388161790558051600755602081015160085560408101516009556060810151600a55620000b88683620000cf565b50506006805460ff1916905550620006d092505050565b6001600160a01b0382166200012b5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064015b60405180910390fd5b6200013960008383620001c6565b80600460008282546200014d91906200066d565b90915550506001600160a01b0382166000908152600b6020526040812080548392906200017c9084906200066d565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b600a54156200029357620001da83620002ed565b15620002315760405162461bcd60e51b8152602060048201526030602482015260008051602062001c2d83398151915260448201526f081a5cc81bdb88189b1858dadb1a5cdd60821b606482015260840162000122565b6200023c82620002ed565b15620002935760405162461bcd60e51b8152602060048201526030602482015260008051602062001c2d83398151915260448201526f081a5cc81bdb88189b1858dadb1a5cdd60821b606482015260840162000122565b60085415620002e857620002a662000360565b15620002e85760405162461bcd60e51b815260206004820152601060248201526f2a37b5b2b71034b9902830bab9b2b21760811b604482015260640162000122565b505050565b600a54600090620003415760405162461bcd60e51b815260206004820152601d60248201527f426c61636b6c6973743a2044697361626c656420426c61636b6c697374000000604482015260640162000122565b506001600160a01b03166000908152600d602052604090205460ff1690565b600754600090620003b45760405162461bcd60e51b815260206004820152601860248201527f5061757361626c653a2044697361626c65642050617573650000000000000000604482015260640162000122565b5060065460ff1690565b828054620003cc9062000694565b90600052602060002090601f016020900481019282620003f057600085556200043b565b82601f106200040b57805160ff19168380011785556200043b565b828001600101855582156200043b579182015b828111156200043b5782518255916020019190600101906200041e565b50620004499291506200044d565b5090565b5b808211156200044957600081556001016200044e565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715620004a557620004a562000464565b604052919050565b600082601f830112620004bf57600080fd5b81516001600160401b03811115620004db57620004db62000464565b6020620004f1601f8301601f191682016200047a565b82815285828487010111156200050657600080fd5b60005b838110156200052657858101830151828201840152820162000509565b83811115620005385760008385840101525b5095945050505050565b6000608082840312156200055557600080fd5b604051608081016001600160401b03811182821017156200057a576200057a62000464565b8060405250809150825181526020830151602082015260408301516040820152606083015160608201525092915050565b6000806000806000806101208789031215620005c657600080fd5b86516001600160a01b0381168114620005de57600080fd5b60208801519096506001600160401b0380821115620005fc57600080fd5b6200060a8a838b01620004ad565b965060408901519150808211156200062157600080fd5b506200063089828a01620004ad565b945050606087015160ff811681146200064857600080fd5b60808801519093509150620006618860a0890162000542565b90509295509295509295565b600082198211156200068f57634e487b7160e01b600052601160045260246000fd5b500190565b600181811c90821680620006a957607f821691505b602082108103620006ca57634e487b7160e01b600052602260045260246000fd5b50919050565b61154d80620006e06000396000f3fe608060405234801561001057600080fd5b50600436106101775760003560e01c80635c975abb116100d8578063a9059cbb1161008c578063dd62ed3e11610066578063dd62ed3e14610316578063e47d60601461034f578063fc8234cb1461036257600080fd5b8063a9059cbb146102ba578063b351dfe8146102cd578063c19d93fb146102e057600080fd5b80638da5cb5b116100bd5780638da5cb5b1461027457806395d89b411461029f578063a457c2d7146102a757600080fd5b80635c975abb1461024357806370a082311461024b57600080fd5b8063320b2ad91161012f57806340c10f191161011457806340c10f191461021457806342966c681461022757806349538af41461023a57600080fd5b8063320b2ad9146101f7578063395093511461020157600080fd5b806318160ddd1161016057806318160ddd146101bd57806323b872dd146101cf578063313ce567146101e257600080fd5b806306fdde031461017c578063095ea7b31461019a575b600080fd5b61018461036a565b60405161019191906112cc565b60405180910390f35b6101ad6101a8366004611356565b6103fc565b6040519015158152602001610191565b6004545b604051908152602001610191565b6101ad6101dd366004611380565b610412565b60035460405160ff9091168152602001610191565b6101ff6104dd565b005b6101ad61020f366004611356565b61062d565b6101ff610222366004611356565b610664565b6101ff6102353660046113bc565b6107f9565b6101c160055481565b6101ad610a10565b6101c16102593660046113d5565b6001600160a01b03166000908152600b602052604090205490565b600054610287906001600160a01b031681565b6040516001600160a01b039091168152602001610191565b610184610a6c565b6101ad6102b5366004611356565b610a7b565b6101ad6102c8366004611356565b610b2e565b6101ff6102db3660046113f7565b610b3b565b600754600854600954600a546102f69392919084565b604080519485526020850193909352918301526060820152608001610191565b6101c1610324366004611433565b6001600160a01b039182166000908152600c6020908152604080832093909416825291909152205490565b6101ad61035d3660046113d5565b610c43565b6101ff610cb8565b60606001805461037990611466565b80601f01602080910402602001604051908101604052809291908181526020018280546103a590611466565b80156103f25780601f106103c7576101008083540402835291602001916103f2565b820191906000526020600020905b8154815290600101906020018083116103d557829003601f168201915b5050505050905090565b6000610409338484610de6565b50600192915050565b600061041f848484610f3e565b6001600160a01b0384166000908152600c60209081526040808320338452909152902054828110156104be5760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206160448201527f6c6c6f77616e636500000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6104d285336104cd86856114e8565b610de6565b506001949350505050565b6000546001600160a01b031633146105375760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016104b5565b6007546105865760405162461bcd60e51b815260206004820152601860248201527f5061757361626c653a2044697361626c6564205061757365000000000000000060448201526064016104b5565b61058e610a10565b156105db5760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a207061757365640000000000000000000000000000000060448201526064016104b5565b6006805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586106103390565b6040516001600160a01b03909116815260200160405180910390a1565b336000818152600c602090815260408083206001600160a01b038716845290915281205490916104099185906104cd9086906114ff565b6000546001600160a01b031633146106be5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016104b5565b60075461070d5760405162461bcd60e51b815260206004820152601760248201527f4d696e7461626c653a2044697361626c6564204d696e7400000000000000000060448201526064016104b5565b6001600160a01b0382166107635760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016104b5565b61076f6000838361116a565b806004600082825461078191906114ff565b90915550506001600160a01b0382166000908152600b6020526040812080548392906107ae9084906114ff565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020015b60405180910390a35050565b6000546001600160a01b031633146108535760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016104b5565b6009546108a25760405162461bcd60e51b815260206004820152601760248201527f4275726e61626c653a2044697361626c6564204275726e00000000000000000060448201526064016104b5565b336109155760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f730000000000000000000000000000000000000000000000000000000000000060648201526084016104b5565b6109213360008361116a565b336000908152600b6020526040902054818110156109a75760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f636500000000000000000000000000000000000000000000000000000000000060648201526084016104b5565b6109b182826114e8565b336000908152600b6020526040812091909155600480548492906109d69084906114e8565b909155505060405182815260009033907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020016107ed565b600754600090610a625760405162461bcd60e51b815260206004820152601860248201527f5061757361626c653a2044697361626c6564205061757365000000000000000060448201526064016104b5565b5060065460ff1690565b60606002805461037990611466565b336000908152600c602090815260408083206001600160a01b038616845290915281205482811015610b155760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f00000000000000000000000000000000000000000000000000000060648201526084016104b5565b610b2433856104cd86856114e8565b5060019392505050565b6000610409338484610f3e565b6000546001600160a01b03163314610b955760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016104b5565b600a54610be45760405162461bcd60e51b815260206004820152601d60248201527f426c61636b6c6973743a2044697361626c656420426c61636b6c69737400000060448201526064016104b5565b6001600160a01b0382166000818152600d6020908152604091829020805460ff191685151590811790915591519182527f6a12b3df6cba4203bd7fd06b816789f87de8c594299aed5717ae070fac781bac910160405180910390a25050565b600a54600090610c955760405162461bcd60e51b815260206004820152601d60248201527f426c61636b6c6973743a2044697361626c656420426c61636b6c69737400000060448201526064016104b5565b506001600160a01b0381166000908152600d602052604090205460ff165b919050565b6000546001600160a01b03163314610d125760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016104b5565b600754610d615760405162461bcd60e51b815260206004820152601860248201527f5061757361626c653a2044697361626c6564205061757365000000000000000060448201526064016104b5565b610d69610a10565b610db55760405162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f742070617573656400000000000000000000000060448201526064016104b5565b6006805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa33610610565b6001600160a01b038316610e615760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f726573730000000000000000000000000000000000000000000000000000000060648201526084016104b5565b6001600160a01b038216610edd5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f737300000000000000000000000000000000000000000000000000000000000060648201526084016104b5565b6001600160a01b038381166000818152600c602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038316610fba5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f647265737300000000000000000000000000000000000000000000000000000060648201526084016104b5565b6001600160a01b0382166110365760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f657373000000000000000000000000000000000000000000000000000000000060648201526084016104b5565b61104183838361116a565b6001600160a01b0383166000908152600b6020526040902054818110156110d05760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e6365000000000000000000000000000000000000000000000000000060648201526084016104b5565b6110da82826114e8565b6001600160a01b038086166000908152600b602052604080822093909355908516815290812080548492906111109084906114ff565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161115c91815260200190565b60405180910390a350505050565b600a541561126a5761117b83610c43565b156111ee5760405162461bcd60e51b815260206004820152603060248201527f546f6b656e207472616e7366657220726566757365642e20526563656976657260448201527f206973206f6e20626c61636b6c6973740000000000000000000000000000000060648201526084016104b5565b6111f782610c43565b1561126a5760405162461bcd60e51b815260206004820152603060248201527f546f6b656e207472616e7366657220726566757365642e20526563656976657260448201527f206973206f6e20626c61636b6c6973740000000000000000000000000000000060648201526084016104b5565b600854156112c75761127a610a10565b156112c75760405162461bcd60e51b815260206004820152601060248201527f546f6b656e206973205061757365642e0000000000000000000000000000000060448201526064016104b5565b505050565b600060208083528351808285015260005b818110156112f9578581018301518582016040015282016112dd565b8181111561130b576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b80356001600160a01b0381168114610cb357600080fd5b6000806040838503121561136957600080fd5b6113728361133f565b946020939093013593505050565b60008060006060848603121561139557600080fd5b61139e8461133f565b92506113ac6020850161133f565b9150604084013590509250925092565b6000602082840312156113ce57600080fd5b5035919050565b6000602082840312156113e757600080fd5b6113f08261133f565b9392505050565b6000806040838503121561140a57600080fd5b6114138361133f565b91506020830135801515811461142857600080fd5b809150509250929050565b6000806040838503121561144657600080fd5b61144f8361133f565b915061145d6020840161133f565b90509250929050565b600181811c9082168061147a57607f821691505b6020821081036114b3577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000828210156114fa576114fa6114b9565b500390565b60008219821115611512576115126114b9565b50019056fea264697066735822122038e6b2b7046da963e8917698f21796f855d169c48d997a094fd9988be81d1d1664736f6c634300080d0033546f6b656e207472616e7366657220726566757365642e205265636569766572a2646970667358221220a764dbe978d035f7f3731bc54b1bea4ff8b0273665f89eafdac93ebe5987d97264736f6c634300080d0033