ETH Price: $2,400.82 (+3.29%)

Token

MaitrejaCoin (MAIT)
 

Overview

Max Total Supply

720,000,000 MAIT

Holders

36

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
MaitrejaCoin

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2024-07-15
*/

// SPDX-License-Identifier: MIT

// OpenZeppelin Contracts (last updated v4.6.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 v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)

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

// OpenZeppelin Contracts v4.4.1 (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;
  }
}

// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC20/ERC20.sol)

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.openzeppelin.com/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:
   *
   * - `to` cannot be the zero address.
   * - the caller must have a balance of at least `amount`.
   */
  function transfer(address to, uint256 amount) public virtual override returns (bool) {
    address owner = _msgSender();
    _transfer(owner, to, 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}.
   *
   * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on
   * `transferFrom`. This is semantically equivalent to an infinite approval.
   *
   * Requirements:
   *
   * - `spender` cannot be the zero address.
   */
  function approve(address spender, uint256 amount) public virtual override returns (bool) {
    address owner = _msgSender();
    _approve(owner, 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}.
   *
   * NOTE: Does not update the allowance if the current allowance
   * is the maximum `uint256`.
   *
   * Requirements:
   *
   * - `from` and `to` cannot be the zero address.
   * - `from` must have a balance of at least `amount`.
   * - the caller must have allowance for ``from``'s tokens of at least
   * `amount`.
   */
  function transferFrom(address from, address to, uint256 amount) public virtual override returns (bool) {
    address spender = _msgSender();
    _spendAllowance(from, spender, amount);
    _transfer(from, to, 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) {
    address owner = _msgSender();
    _approve(owner, spender, allowance(owner, 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) {
    address owner = _msgSender();
    uint256 currentAllowance = allowance(owner, spender);
    require(currentAllowance >= subtractedValue, 'ERC20: decreased allowance below zero');
    unchecked {
      _approve(owner, spender, currentAllowance - subtractedValue);
    }

    return true;
  }

  /**
   * @dev Moves `amount` of tokens from `from` to `to`.
   *
   * 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:
   *
   * - `from` cannot be the zero address.
   * - `to` cannot be the zero address.
   * - `from` must have a balance of at least `amount`.
   */
  function _transfer(address from, address to, uint256 amount) internal virtual {
    require(from != address(0), 'ERC20: transfer from the zero address');
    require(to != address(0), 'ERC20: transfer to the zero address');

    _beforeTokenTransfer(from, to, amount);

    uint256 fromBalance = _balances[from];
    require(fromBalance >= amount, 'ERC20: transfer amount exceeds balance');
    unchecked {
      _balances[from] = fromBalance - amount;
      // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by
      // decrementing then incrementing.
      _balances[to] += amount;
    }

    emit Transfer(from, to, amount);

    _afterTokenTransfer(from, to, 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;
    unchecked {
      // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.
      _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;
      // Overflow not possible: amount <= accountBalance <= totalSupply.
      _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 Updates `owner` s allowance for `spender` based on spent `amount`.
   *
   * Does not update the allowance amount in case of infinite allowance.
   * Revert if not enough allowance is available.
   *
   * Might emit an {Approval} event.
   */
  function _spendAllowance(address owner, address spender, uint256 amount) internal virtual {
    uint256 currentAllowance = allowance(owner, spender);
    if (currentAllowance != type(uint256).max) {
      require(currentAllowance >= amount, 'ERC20: insufficient allowance');
      unchecked {
        _approve(owner, spender, currentAllowance - 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 {}
}

// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in
 * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].
 *
 * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by
 * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't
 * need to send a transaction, and thus is not required to hold Ether at all.
 */
interface IERC20Permit {
  /**
   * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,
   * given ``owner``'s signed approval.
   *
   * IMPORTANT: The same issues {IERC20-approve} has related to transaction
   * ordering also apply here.
   *
   * Emits an {Approval} event.
   *
   * Requirements:
   *
   * - `spender` cannot be the zero address.
   * - `deadline` must be a timestamp in the future.
   * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`
   * over the EIP712-formatted function arguments.
   * - the signature must use ``owner``'s current nonce (see {nonces}).
   *
   * For more information on the signature format, see the
   * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP
   * section].
   */
  function permit(
    address owner,
    address spender,
    uint256 value,
    uint256 deadline,
    uint8 v,
    bytes32 r,
    bytes32 s
  ) external;

  /**
   * @dev Returns the current nonce for `owner`. This value must be
   * included whenever a signature is generated for {permit}.
   *
   * Every successful call to {permit} increases ``owner``'s nonce by one. This
   * prevents a signature from being used multiple times.
   */
  function nonces(address owner) external view returns (uint256);

  /**
   * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.
   */
  // solhint-disable-next-line func-name-mixedcase
  function DOMAIN_SEPARATOR() external view returns (bytes32);
}

// OpenZeppelin Contracts (last updated v4.8.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
   * ====
   *
   * [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://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 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 (last updated v4.8.0) (token/ERC20/utils/SafeERC20.sol)

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

  function safePermit(
    IERC20Permit token,
    address owner,
    address spender,
    uint256 value,
    uint256 deadline,
    uint8 v,
    bytes32 r,
    bytes32 s
  ) internal {
    uint256 nonceBefore = token.nonces(owner);
    token.permit(owner, spender, value, deadline, v, r, s);
    uint256 nonceAfter = token.nonces(owner);
    require(nonceAfter == nonceBefore + 1, 'SafeERC20: permit did not succeed');
  }

  /**
   * @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');
    }
  }
}

// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;

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

  event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

  /**
   * @dev Initializes the contract setting the deployer as the initial owner.
   */
  constructor() {
    _transferOwnership(_msgSender());
  }

  /**
   * @dev Throws if called by any account other than the owner.
   */
  modifier onlyOwner() {
    _checkOwner();
    _;
  }

  /**
   * @dev Returns the address of the current owner.
   */
  function owner() public view virtual returns (address) {
    return _owner;
  }

  /**
   * @dev Throws if the sender is not the owner.
   */
  function _checkOwner() internal view virtual {
    require(owner() == _msgSender(), 'Ownable: caller is not the owner');
  }

  /**
   * @dev Leaves the contract without owner. It will not be possible to call
   * `onlyOwner` functions anymore. Can only be called by the current owner.
   *
   * NOTE: Renouncing ownership will leave the contract without an owner,
   * thereby removing any functionality that is only available to the owner.
   */
  function renounceOwnership() public virtual onlyOwner {
    _transferOwnership(address(0));
  }

  /**
   * @dev Transfers ownership of the contract to a new account (`newOwner`).
   * Can only be called by the current owner.
   */
  function transferOwnership(address newOwner) public virtual onlyOwner {
    require(newOwner != address(0), 'Ownable: new owner is the zero address');
    _transferOwnership(newOwner);
  }

  /**
   * @dev Transfers ownership of the contract to a new account (`newOwner`).
   * Internal function without access restriction.
   */
  function _transferOwnership(address newOwner) internal virtual {
    address oldOwner = _owner;
    _owner = newOwner;
    emit OwnershipTransferred(oldOwner, newOwner);
  }
}

// OpenZeppelin Contracts (last updated v4.8.0) (access/Ownable2Step.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module which provides access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership} and {acceptOwnership}.
 *
 * This module is used through inheritance. It will make available all functions
 * from parent (Ownable).
 */
abstract contract Ownable2Step is Ownable {
  address private _pendingOwner;

  event OwnershipTransferStarted(address indexed previousOwner, address indexed newOwner);

  /**
   * @dev Returns the address of the pending owner.
   */
  function pendingOwner() public view virtual returns (address) {
    return _pendingOwner;
  }

  /**
   * @dev Starts the ownership transfer of the contract to a new account. Replaces the pending transfer if there is one.
   * Can only be called by the current owner.
   */
  function transferOwnership(address newOwner) public virtual override onlyOwner {
    _pendingOwner = newOwner;
    emit OwnershipTransferStarted(owner(), newOwner);
  }

  /**
   * @dev Transfers ownership of the contract to a new account (`newOwner`) and deletes any pending owner.
   * Internal function without access restriction.
   */
  function _transferOwnership(address newOwner) internal virtual override {
    delete _pendingOwner;
    super._transferOwnership(newOwner);
  }

  /**
   * @dev The new owner accepts the ownership transfer.
   */
  function acceptOwnership() external {
    address sender = _msgSender();
    require(pendingOwner() == sender, 'Ownable2Step: caller is not the new owner');
    _transferOwnership(sender);
  }
}

pragma solidity ^0.8.16;

/**
 * @title MaitrejaCoin
 * This contract implements the MaitrejaCoin (MAIT) token and the functions
 * necessary for its initial coin offering (ICO).
 */
contract MaitrejaCoin is ERC20, Ownable2Step {
  using SafeERC20 for IERC20;

  address public USDT_Address;
  /**
   * A struct that holds information about a lock
   */
  struct Lock {
    /**
     * A timestamp when the lock will be unlocked
     */
    uint256 unlock;
    /**
     * The amount that is locked
     */
    uint256 amount;
  }

  /**
   * Smart contract deployment time
   */
  uint256 public deployTime;

  /**
   * Team address
   */
  address public team;

  /**
   * End time of ICO
   */
  uint256 public icoEnd;

  /**
   * Amount of coins available for ICO
   */
  uint256 public icoAmount;

  /**
   * The price of 1 MAIT in USD.
   */
  uint256 public USDprice;

  /**
   * Date of the last price change
   */
  uint256 public lastPriceChange;

  /**
   * The minimum order value required in the ICO.
   */
  uint256 public minimalOrder;

  // MAPPINGS

  /**
   * Mapping of addresses to an array of Lock structs
   *
   * The mapping is used to keep track of locked amounts for each address.
   */
  mapping(address => Lock[]) public lockedAmounts;

  /**
   * Mapping of addresses to their last lock time
   *
   * The mapping is used to keep track of the latest time a lock will be unlocked for each address.
   */
  mapping(address => uint256) private lastLock;

  /**
   * Contract constructor to initialize the token and ICO parameters.
   *
   * @param _icoEnd End of ico.
   * @param _minimalOrder The minimum order value required in the ICO.
   * @param _team Address of Team.
   */
  constructor(uint256 _icoEnd, uint256 _minimalOrder, address _team) ERC20('MaitrejaCoin', 'MAIT') {
    // Initialize the price in USD
    USDprice = 1 * 10 ** 6; // 1 USD

    // Initialize USDT address
    USDT_Address = 0xdAC17F958D2ee523a2206206994597C13D831ec7;

    // Initialize the minimal order
    minimalOrder = _minimalOrder;

    // Initialize the team address
    team = _team;

    // Initialize the smart contract deployment time
    deployTime = block.timestamp;

    // Set the lastPriceChange to 1.4.2023 to allow the price to be changed no sooner than 1.4.2024
    lastPriceChange = 1680307200;

    // Initialize ICO end time
    icoEnd = _icoEnd;

    // Initialize the amount of tokens availble in ICO (65% of total supply of 720M)
    icoAmount = 468_000_000 * 10 ** 18;

    // Mint tokens 65 % for sale, 12 % for Maitreja (marketing, risk management, liquidity), 23 % for team, user rewards etc.
    _mint(address(this), 468_000_000 * 10 ** 18);
    _mint(0xff84F6b169972162Af0AcA5734507FA76fd3b0F2, 86_400_000 * 10 ** 18);
    _mint(team, 165_600_000 * 10 ** 18);

    // Lock team funds
    lockedAmounts[team].push(Lock(1688169600, 33_120_000 * 10 ** 18)); //1.7.2023
    lockedAmounts[team].push(Lock(1706745600, 33_120_000 * 10 ** 18)); //1.2.2024
    lockedAmounts[team].push(Lock(1719792000, 33_120_000 * 10 ** 18)); //1.7.2024
    lockedAmounts[team].push(Lock(1738368000, 33_120_000 * 10 ** 18)); //1.2.2025
    lockedAmounts[team].push(Lock(1751328000, 33_120_000 * 10 ** 18)); //1.7.2025

    lastLock[team] = 1751328000; //1.7.2025
  }

  // MODIFIERS
  /**
   * modifier to check if the input value is greater than or equal
   * to the minimal order value
   *
   * @param amount the input value to be checked
   */
  modifier moreThanMinimal(uint256 amount) {
    require(amount >= minimalOrder, 'MAIT: minimal order value was not met');
    _;
  }

  /**
   * Modifier to validate if the amount is less than or equal the available amount
   *
   * This modifier ensures that the provided `amount` is less than or equal to the `icoAmount`,
   * thus preventing a transfer of more tokens than available.
   *
   * @param amount The amount of tokens being transferred.
   */
  modifier lessThanAvailable(uint256 amount, bool shortUnlock) {
    uint256 _amount;
    if (shortUnlock) {
      _amount = amount + amount / 10;
    } else {
      _amount = amount;
    }

    require(_amount <= icoAmount, 'MAIT: amount cannot be greater than the available amount');
    _;
  }

  /**
   * Modifier that checks if the ICO is currently active (i.e., the current block timestamp is before the `icoEnd` time).
   * Reverts if the ICO has already ended.
   */
  modifier icoActive() {
    require(block.timestamp < icoEnd, 'MAIT: ICO has already ended');
    _;
  }

  // GETTERS

  /**
   * Returns the last time the msg.sender has locked their funds
   *
   * @return uint256 the last time the msg.sender has locked their funds
   */
  function getLastLock() public view returns (uint256) {
    return lastLock[msg.sender];
  }

  // SETTERS

  /**
   * Allows the contract owner to  set the end date
   * for the initial coin offering (ICO).
   *
   * @param _icoEnd - The timestamp for the end of the ICO.
   */
  function setIcoEnd(uint256 _icoEnd) external onlyOwner {
    require(_icoEnd > block.timestamp, 'MAIT: ICO cannot be set in the past');

    icoEnd = _icoEnd;
  }

  /**
   * Allows the contract owner to set the price of one MaitrejaCoin in USDT.
   *
   * @param _USDprice The price of one MaitrejaCoin in USDT.
   */
  function setUSDPrice(uint256 _USDprice) external onlyOwner {
    require(_USDprice > 0, 'MAIT: price of the coin cannot be zero');

    require(lastPriceChange + 365 days < block.timestamp, 'MAIT: price can only be updated once a year');

    USDprice = _USDprice;
    lastPriceChange = block.timestamp;
  }

  /**
   *  Allows the owner of the contract to set the address of the USTD token
   *  This is needed only for testing purposes.
   *
   *  @param _USDT: the address of the USTD token
   */
  function setUSDT(address _USDT) external onlyOwner {
    //check if the address is not the zero address
    require(_USDT != address(0), 'MAIT: USDT address cannot be the zero address');

    USDT_Address = _USDT;
  }

  /**
   * Allows the contract owner to set the minimum order value in MaitrejaCoin.
   *
   * @param _minimalOrder The minimum order value in MaitrejaCoin.
   */
  function setMinimalOrder(uint256 _minimalOrder) external onlyOwner {
    require(_minimalOrder > 0, 'MAIT: minimal order cannot be zero');

    minimalOrder = _minimalOrder;
  }

  /**
   * Validates a transfer of an amount of tokens from one address to another.
   * Returns true if the transfer is allowed, false otherwise.
   *
   * @param amount The amount of tokens to transfer.
   * @param from The address sending the tokens.
   * @return bool Returns true if the transfer is allowed, false otherwise.
   */
  function _validateTransfer(uint256 amount, address from) private view returns (bool) {
    // Return true on mint
    if (deployTime == block.timestamp) {
      return true;
    } else if (from == address(this)) {
      return true;
    } else if (_getUnlockedFunds(from) >= amount) {
      return true;
    } else {
      return false;
    }
  }

  /**
   * Returns the unlocked funds for a particular address
   *
   * @param from - address to get the unlocked funds for
   * @return uint256 - the unlocked funds available
   */
  function _getUnlockedFunds(address from) private view returns (uint256) {
    uint256 locked;
    for (uint i = 0; i < lockedAmounts[from].length; ++i) {
      if (lockedAmounts[from][i].unlock > block.timestamp) {
        locked += lockedAmounts[from][i].amount;
      }
    }

    return balanceOf(from) - locked;
  }

  /**
   * @dev Override the default token transfer behavior to enforce restrictions based on locked amounts and balance
   *
   * @param from address The address of the transferor
   * @param to address The address of the transferee
   * @param amount uint256 The amount being transferred
   */
  function _beforeTokenTransfer(address from, address to, uint256 amount) internal override {
    super._beforeTokenTransfer(from, to, amount);
    if (lastLock[from] > block.timestamp) {
      require(_validateTransfer(amount, from), 'MAIT: transfer amount exceeds balance or unlocked amount too low');
    }
  }

  /**
   * Internal function that is executed after a token transfer from the `from` address to the `to` address
   *
   * @param from - address of the transfer sender
   * @param to - address of the transfer recipient
   * @param amount - amount of tokens transferred
   */
  function _afterTokenTransfer(address from, address to, uint256 amount) internal override {
    super._afterTokenTransfer(from, to, amount);
    if (lastLock[from] > block.timestamp) {
      removeFromLocked(from, amount);
    }
  }

  /**
   * Removes a specified amount of tokens from the locked tokens
   * of a particular address
   *
   * @param from the address whose locked tokens should be reduced
   * @param amount the amount to be reduced from the locked tokens
   *
   * @dev Function first iterates through the lockedAmounts mapping of the `from` address
   *      If an amount has a lock time that is lower than the current block timestamp,
   *      the `amount` is reduced from it. The loop continues until the full `amount`
   *      has been reduced.
   */
  function removeFromLocked(address from, uint256 amount) internal {
    for (uint i = 0; i < lockedAmounts[from].length; ++i) {
      if (lockedAmounts[from][i].unlock < block.timestamp) {
        if (amount > lockedAmounts[from][i].amount) {
          amount -= lockedAmounts[from][i].amount;
          delete lockedAmounts[from][i];
        } else {
          lockedAmounts[from][i].amount -= amount;
          return;
        }
      }
    }
  }

  /**
   * Participate in the ICO.
   *
   * @param amount The amount of the specified currency to participate in the ICO.
   * @param shortUnlock A boolean value that determines the lock time. If `true`, the lock time will be short, otherwise it will be long.
   * @return Whether the participation in the ICO was successful.
   *
   * @dev The function is public and payable. It can only be called if the ICO is active and the `amount` is more than the minimal value, and less than the available value.
   */
  function ico(
    uint256 amount, // amount to participate in ICO
    bool shortUnlock, // short or long lock time
    uint256 expectedPrice // expected price paid for a token
  ) public payable icoActive moreThanMinimal(amount) lessThanAvailable(amount, shortUnlock) returns (bool) {
    //check if the the price matches the expected price
    require(USDprice == expectedPrice, "MAIT: Expected price per coin doesn't match the real price");

    SafeERC20.safeTransferFrom(IERC20(USDT_Address), msg.sender, address(this), (amount * USDprice) / 10 ** 18);

    uint256 _lockTime; // variable to store the lock time
    if (shortUnlock) {
      _lockTime = block.timestamp + 365 days; // short lock time
    } else {
      amount = amount + amount / 10; // add 10 % to the amount to participate
      _lockTime = block.timestamp + 2 * 365 days; // long lock time
    }

    // update the last lock time of the participant if the new lock time is greater than the previous one
    if (lastLock[msg.sender] < _lockTime) lastLock[msg.sender] = _lockTime;

    // add the amount and the lock time to the list of locked
    lockedAmounts[msg.sender].push(Lock(_lockTime, amount));

    // transfers the amount of tokes from contact to sender
    _transfer(address(this), msg.sender, amount);

    // decreses amount of tokens available by ICO
    icoAmount -= amount;

    return true;
  }

  /**
   * Returns the balance of USDT held by the contract
   *
   * @return The balance of the specified currency held by the contract
   *
   */
  function getUSDBalance() external view returns (uint256) {
    return IERC20(USDT_Address).balanceOf(address(this));
  }

  /**
   * Allows owner to cash out by transferring a specified amount of USDT to `maitreja`
   *
   * @param amount The amount being cashed out
   *
   * throws "Ownable: caller is not the owner" if the caller is not `owner`
   */
  function cashOut(uint256 amount) external onlyOwner {
    SafeERC20.safeTransfer(IERC20(USDT_Address), msg.sender, amount);
  }

  /**
   * Returns the amount of locked tokens for the calling address
   *
   * @return The amount of locked tokens for the calling address
   */
  function getLocked() external view returns (Lock[] memory) {
    return lockedAmounts[msg.sender];
  }

  /**
   * Returns the current block's timestamp
   *
   * @return The current block's timestamp
   */
  function getTime() external view returns (uint) {
    return block.timestamp;
  }

  function renounceOwnership() public pure override {
    revert("Ownable: can't renounceOwnership here"); //not possible with this token
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"uint256","name":"_icoEnd","type":"uint256"},{"internalType":"uint256","name":"_minimalOrder","type":"uint256"},{"internalType":"address","name":"_team","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"USDT_Address","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"USDprice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"cashOut","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"deployTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLastLock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLocked","outputs":[{"components":[{"internalType":"uint256","name":"unlock","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct MaitrejaCoin.Lock[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getUSDBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"shortUnlock","type":"bool"},{"internalType":"uint256","name":"expectedPrice","type":"uint256"}],"name":"ico","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"icoAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"icoEnd","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lastPriceChange","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"lockedAmounts","outputs":[{"internalType":"uint256","name":"unlock","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimalOrder","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"_icoEnd","type":"uint256"}],"name":"setIcoEnd","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minimalOrder","type":"uint256"}],"name":"setMinimalOrder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_USDprice","type":"uint256"}],"name":"setUSDPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_USDT","type":"address"}],"name":"setUSDT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"team","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b5060405162004f7738038062004f77833981810160405281019062000037919062000fde565b6040518060400160405280600c81526020017f4d61697472656a61436f696e00000000000000000000000000000000000000008152506040518060400160405280600481526020017f4d414954000000000000000000000000000000000000000000000000000000008152508160039081620000b49190620012aa565b508060049081620000c69190620012aa565b505050620000e9620000dd6200069160201b60201c565b6200069960201b60201c565b620f4240600c8190555073dac17f958d2ee523a2206206994597c13d831ec7600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600e8190555080600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426008819055506364277400600d8190555082600a819055506b01831edad60ea26a54000000600b81905550620001da306b01831edad60ea26a54000000620006d760201b60201c565b6200020b73ff84f6b169972162af0aca5734507fa76fd3b0f26a4777e962985cfff0000000620006d760201b60201c565b6200024a600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166a88fb29fcf95cea8c000000620006d760201b60201c565b600f6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020604051806040016040528063649f6c8081526020016a1b656ecc31df621c000000815250908060018154018082558091505060019003906000526020600020906002020160009091909190915060008201518160000155602082015181600101555050600f6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060405180604001604052806365badf0081526020016a1b656ecc31df621c000000815250908060018154018082558091505060019003906000526020600020906002020160009091909190915060008201518160000155602082015181600101555050600f6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405280636681f18081526020016a1b656ecc31df621c000000815250908060018154018082558091505060019003906000526020600020906002020160009091909190915060008201518160000155602082015181600101555050600f6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020604051806040016040528063679d640081526020016a1b656ecc31df621c000000815250908060018154018082558091505060019003906000526020600020906002020160009091909190915060008201518160000155602082015181600101555050600f6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405280636863250081526020016a1b656ecc31df621c000000815250908060018154018082558091505060019003906000526020600020906002020160009091909190915060008201518160000155602082015181600101555050636863250060106000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505050620015fb565b600033905090565b600660006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055620006d4816200084460201b6200150b1760201c565b50565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160362000749576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200074090620013f2565b60405180910390fd5b6200075d600083836200090a60201b60201c565b806002600082825462000771919062001443565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516200082491906200148f565b60405180910390a36200084060008383620009c460201b60201c565b5050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6200092283838362000a3c60201b620015d11760201c565b42601060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115620009bf576200097c818462000a4160201b60201c565b620009be576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620009b59062001522565b60405180910390fd5b5b505050565b620009dc83838362000ac260201b620015d61760201c565b42601060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054111562000a375762000a36838262000ac760201b60201c565b5b505050565b505050565b6000426008540362000a57576001905062000abc565b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160362000a95576001905062000abc565b8262000aa78362000d8160201b60201c565b1062000ab7576001905062000abc565b600090505b92915050565b505050565b60005b600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905081101562000d7b5742600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020828154811062000b6a5762000b6962001544565b5b906000526020600020906002020160000154101562000d6757600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020818154811062000bd75762000bd662001544565b5b90600052602060002090600202016001015482111562000ce157600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020818154811062000c455762000c4462001544565b5b9060005260206000209060020201600101548262000c64919062001573565b9150600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020818154811062000cba5762000cb962001544565b5b90600052602060002090600202016000808201600090556001820160009055505062000d66565b81600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020828154811062000d365762000d3562001544565b5b9060005260206000209060020201600101600082825462000d58919062001573565b925050819055505062000d7d565b5b8062000d7390620015ae565b905062000aca565b505b5050565b60008060005b600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905081101562000eca5742600f60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020828154811062000e275762000e2662001544565b5b906000526020600020906002020160000154111562000eb657600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020818154811062000e945762000e9362001544565b5b9060005260206000209060020201600101548262000eb3919062001443565b91505b8062000ec290620015ae565b905062000d87565b508062000edd8462000ef160201b60201c565b62000ee9919062001573565b915050919050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600080fd5b6000819050919050565b62000f538162000f3e565b811462000f5f57600080fd5b50565b60008151905062000f738162000f48565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000fa68262000f79565b9050919050565b62000fb88162000f99565b811462000fc457600080fd5b50565b60008151905062000fd88162000fad565b92915050565b60008060006060848603121562000ffa5762000ff962000f39565b5b60006200100a8682870162000f62565b93505060206200101d8682870162000f62565b9250506040620010308682870162000fc7565b9150509250925092565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620010bc57607f821691505b602082108103620010d257620010d162001074565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026200113c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620010fd565b620011488683620010fd565b95508019841693508086168417925050509392505050565b6000819050919050565b60006200118b620011856200117f8462000f3e565b62001160565b62000f3e565b9050919050565b6000819050919050565b620011a7836200116a565b620011bf620011b68262001192565b8484546200110a565b825550505050565b600090565b620011d6620011c7565b620011e38184846200119c565b505050565b5b818110156200120b57620011ff600082620011cc565b600181019050620011e9565b5050565b601f8211156200125a576200122481620010d8565b6200122f84620010ed565b810160208510156200123f578190505b620012576200124e85620010ed565b830182620011e8565b50505b505050565b600082821c905092915050565b60006200127f600019846008026200125f565b1980831691505092915050565b60006200129a83836200126c565b9150826002028217905092915050565b620012b5826200103a565b67ffffffffffffffff811115620012d157620012d062001045565b5b620012dd8254620010a3565b620012ea8282856200120f565b600060209050601f8311600181146200132257600084156200130d578287015190505b6200131985826200128c565b86555062001389565b601f1984166200133286620010d8565b60005b828110156200135c5784890151825560018201915060208501945060208101905062001335565b868310156200137c578489015162001378601f8916826200126c565b8355505b6001600288020188555050505b505050505050565b600082825260208201905092915050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6000620013da601f8362001391565b9150620013e782620013a2565b602082019050919050565b600060208201905081810360008301526200140d81620013cb565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000620014508262000f3e565b91506200145d8362000f3e565b925082820190508082111562001478576200147762001414565b5b92915050565b620014898162000f3e565b82525050565b6000602082019050620014a660008301846200147e565b92915050565b7f4d4149543a207472616e7366657220616d6f756e74206578636565647320626160008201527f6c616e6365206f7220756e6c6f636b656420616d6f756e7420746f6f206c6f77602082015250565b60006200150a60408362001391565b91506200151782620014ac565b604082019050919050565b600060208201905081810360008301526200153d81620014fb565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000620015808262000f3e565b91506200158d8362000f3e565b9250828203905081811115620015a857620015a762001414565b5b92915050565b6000620015bb8262000f3e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203620015f057620015ef62001414565b5b600182019050919050565b61396c806200160b6000396000f3fe6080604052600436106102045760003560e01c80637a40624b11610118578063a9059cbb116100a0578063e20c04a71161006f578063e20c04a714610777578063e30c3978146107a2578063e654210b146107cd578063f2fde38b146107f8578063faccdd501461082157610204565b8063a9059cbb146106a9578063c1201054146106e6578063c3c9560e14610711578063dd62ed3e1461073a57610204565b80638da5cb5b116100e75780638da5cb5b146105ad5780638f441b19146105d857806395d89b411461060357806399683fa51461062e578063a457c2d71461066c57610204565b80637a40624b1461050157806381c6c9761461052c57806385f2aef2146105575780638b1ebbf91461058257610204565b8063313ce5671161019b578063557ed1ba1161016a578063557ed1ba146104425780635c7b79f51461046d57806370a0823114610496578063715018a6146104d357806379ba5097146104ea57610204565b8063313ce5671461038157806332fb3c13146103ac57806339509351146103dc57806350c1b9231461041957610204565b806318160ddd116101d757806318160ddd146102c557806323b872dd146102f057806323e7a9001461032d5780632d49ffcd1461035657610204565b80630563451a1461020957806306fdde0314610234578063095ea7b31461025f578063147d959a1461029c575b600080fd5b34801561021557600080fd5b5061021e61084c565b60405161022b9190612487565b60405180910390f35b34801561024057600080fd5b50610249610852565b6040516102569190612532565b60405180910390f35b34801561026b57600080fd5b50610286600480360381019061028191906125e3565b6108e4565b604051610293919061263e565b60405180910390f35b3480156102a857600080fd5b506102c360048036038101906102be9190612659565b610907565b005b3480156102d157600080fd5b506102da6109b6565b6040516102e79190612487565b60405180910390f35b3480156102fc57600080fd5b5061031760048036038101906103129190612686565b6109c0565b604051610324919061263e565b60405180910390f35b34801561033957600080fd5b50610354600480360381019061034f9190612659565b6109ef565b005b34801561036257600080fd5b5061036b610a43565b60405161037891906127c6565b60405180910390f35b34801561038d57600080fd5b50610396610af3565b6040516103a39190612804565b60405180910390f35b6103c660048036038101906103c1919061284b565b610afc565b6040516103d3919061263e565b60405180910390f35b3480156103e857600080fd5b5061040360048036038101906103fe91906125e3565b610e2b565b604051610410919061263e565b60405180910390f35b34801561042557600080fd5b50610440600480360381019061043b919061289e565b610e62565b005b34801561044e57600080fd5b50610457610f1d565b6040516104649190612487565b60405180910390f35b34801561047957600080fd5b50610494600480360381019061048f9190612659565b610f25565b005b3480156104a257600080fd5b506104bd60048036038101906104b8919061289e565b610f5d565b6040516104ca9190612487565b60405180910390f35b3480156104df57600080fd5b506104e8610fa5565b005b3480156104f657600080fd5b506104ff610fe0565b005b34801561050d57600080fd5b5061051661106d565b6040516105239190612487565b60405180910390f35b34801561053857600080fd5b50610541611073565b60405161054e9190612487565b60405180910390f35b34801561056357600080fd5b5061056c611079565b60405161057991906128da565b60405180910390f35b34801561058e57600080fd5b5061059761109f565b6040516105a49190612487565b60405180910390f35b3480156105b957600080fd5b506105c26110a5565b6040516105cf91906128da565b60405180910390f35b3480156105e457600080fd5b506105ed6110cf565b6040516105fa9190612487565b60405180910390f35b34801561060f57600080fd5b50610618611116565b6040516106259190612532565b60405180910390f35b34801561063a57600080fd5b50610655600480360381019061065091906125e3565b6111a8565b6040516106639291906128f5565b60405180910390f35b34801561067857600080fd5b50610693600480360381019061068e91906125e3565b6111e9565b6040516106a0919061263e565b60405180910390f35b3480156106b557600080fd5b506106d060048036038101906106cb91906125e3565b611260565b6040516106dd919061263e565b60405180910390f35b3480156106f257600080fd5b506106fb611283565b6040516107089190612487565b60405180910390f35b34801561071d57600080fd5b5061073860048036038101906107339190612659565b611326565b005b34801561074657600080fd5b50610761600480360381019061075c919061291e565b61137b565b60405161076e9190612487565b60405180910390f35b34801561078357600080fd5b5061078c611402565b6040516107999190612487565b60405180910390f35b3480156107ae57600080fd5b506107b7611408565b6040516107c491906128da565b60405180910390f35b3480156107d957600080fd5b506107e2611432565b6040516107ef91906128da565b60405180910390f35b34801561080457600080fd5b5061081f600480360381019061081a919061289e565b611458565b005b34801561082d57600080fd5b50610836611505565b6040516108439190612487565b60405180910390f35b600a5481565b6060600380546108619061298d565b80601f016020809104026020016040519081016040528092919081815260200182805461088d9061298d565b80156108da5780601f106108af576101008083540402835291602001916108da565b820191906000526020600020905b8154815290600101906020018083116108bd57829003601f168201915b5050505050905090565b6000806108ef6115db565b90506108fc8185856115e3565b600191505092915050565b61090f6117ac565b60008111610952576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094990612a30565b60405180910390fd5b426301e13380600d546109659190612a7f565b106109a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099c90612b25565b60405180910390fd5b80600c8190555042600d8190555050565b6000600254905090565b6000806109cb6115db565b90506109d885828561182a565b6109e38585856118b6565b60019150509392505050565b6109f76117ac565b428111610a39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3090612bb7565b60405180910390fd5b80600a8190555050565b6060600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b82821015610aea57838290600052602060002090600202016040518060400160405290816000820154815260200160018201548152505081526020019060010190610aa4565b50505050905090565b60006012905090565b6000600a544210610b42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3990612c23565b60405180910390fd5b83600e54811015610b88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7f90612cb5565b60405180910390fd5b848460008115610bb157600a83610b9f9190612d04565b83610baa9190612a7f565b9050610bb5565b8290505b600b54811115610bfa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf190612da7565b60405180910390fd5b85600c5414610c3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3590612e39565b60405180910390fd5b610c8c600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff163330670de0b6b3a7640000600c548d610c7d9190612e59565b610c879190612d04565b611b2c565b60008715610cab576301e1338042610ca49190612a7f565b9050610cd8565b600a89610cb89190612d04565b89610cc39190612a7f565b98506303c2670042610cd59190612a7f565b90505b80601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015610d645780601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060405180604001604052808381526020018b815250908060018154018082558091505060019003906000526020600020906002020160009091909190915060008201518160000155602082015181600101555050610e0230338b6118b6565b88600b6000828254610e149190612e9b565b925050819055506001955050505050509392505050565b600080610e366115db565b9050610e57818585610e48858961137b565b610e529190612a7f565b6115e3565b600191505092915050565b610e6a6117ac565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610ed9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed090612f41565b60405180910390fd5b80600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600042905090565b610f2d6117ac565b610f5a600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff163383611bb5565b50565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd790612fd3565b60405180910390fd5b6000610fea6115db565b90508073ffffffffffffffffffffffffffffffffffffffff1661100b611408565b73ffffffffffffffffffffffffffffffffffffffff1614611061576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105890613065565b60405180910390fd5b61106a81611c3b565b50565b60085481565b600d5481565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600e5481565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905090565b6060600480546111259061298d565b80601f01602080910402602001604051908101604052809291908181526020018280546111519061298d565b801561119e5780601f106111735761010080835404028352916020019161119e565b820191906000526020600020905b81548152906001019060200180831161118157829003601f168201915b5050505050905090565b600f60205281600052604060002081815481106111c457600080fd5b9060005260206000209060020201600091509150508060000154908060010154905082565b6000806111f46115db565b90506000611202828661137b565b905083811015611247576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123e906130f7565b60405180910390fd5b61125482868684036115e3565b60019250505092915050565b60008061126b6115db565b90506112788185856118b6565b600191505092915050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016112e091906128da565b602060405180830381865afa1580156112fd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611321919061312c565b905090565b61132e6117ac565b60008111611371576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611368906131cb565b60405180910390fd5b80600e8190555050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600c5481565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6114606117ac565b80600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff166114c06110a5565b73ffffffffffffffffffffffffffffffffffffffff167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b600b5481565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b505050565b505050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611652576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116499061325d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036116c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b8906132ef565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161179f9190612487565b60405180910390a3505050565b6117b46115db565b73ffffffffffffffffffffffffffffffffffffffff166117d26110a5565b73ffffffffffffffffffffffffffffffffffffffff1614611828576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181f9061335b565b60405180910390fd5b565b6000611836848461137b565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146118b057818110156118a2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611899906133c7565b60405180910390fd5b6118af84848484036115e3565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611925576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191c90613459565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611994576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198b906134eb565b60405180910390fd5b61199f838383611c6c565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611a25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1c9061357d565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611b139190612487565b60405180910390a3611b26848484611d0d565b50505050565b611baf846323b872dd60e01b858585604051602401611b4d9392919061359d565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611d6f565b50505050565b611c368363a9059cbb60e01b8484604051602401611bd49291906135d4565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611d6f565b505050565b600660006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055611c698161150b565b50565b611c778383836115d1565b42601060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115611d0857611cc88184611e36565b611d07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cfe9061366f565b60405180910390fd5b5b505050565b611d188383836115d6565b42601060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115611d6a57611d698382611ea9565b5b505050565b6000611dd1826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166121489092919063ffffffff16565b9050600081511115611e315780806020019051810190611df191906136a4565b611e30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2790613743565b60405180910390fd5b5b505050565b60004260085403611e4a5760019050611ea3565b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611e865760019050611ea3565b82611e9083612160565b10611e9e5760019050611ea3565b600090505b92915050565b60005b600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490508110156121425742600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208281548110611f4857611f47613763565b5b906000526020600020906002020160000154101561213157600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208181548110611fb157611fb0613763565b5b9060005260206000209060020201600101548211156120b157600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020818154811061201b5761201a613763565b5b906000526020600020906002020160010154826120389190612e9b565b9150600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020818154811061208b5761208a613763565b5b906000526020600020906002020160008082016000905560018201600090555050612130565b81600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020828154811061210357612102613763565b5b906000526020600020906002020160010160008282546121239190612e9b565b9250508190555050612144565b5b8061213b90613792565b9050611eac565b505b5050565b606061215784846000856122b9565b90509392505050565b60008060005b600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905081101561229c5742600f60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020828154811061220257612201613763565b5b906000526020600020906002020160000154111561228b57600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020818154811061226b5761226a613763565b5b906000526020600020906002020160010154826122889190612a7f565b91505b8061229590613792565b9050612166565b50806122a784610f5d565b6122b19190612e9b565b915050919050565b6060824710156122fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122f59061384c565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161232791906138b3565b60006040518083038185875af1925050503d8060008114612364576040519150601f19603f3d011682016040523d82523d6000602084013e612369565b606091505b509150915061237a87838387612386565b92505050949350505050565b606083156123e85760008351036123e0576123a0856123fb565b6123df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123d690613916565b60405180910390fd5b5b8290506123f3565b6123f2838361241e565b5b949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000825111156124315781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124659190612532565b60405180910390fd5b6000819050919050565b6124818161246e565b82525050565b600060208201905061249c6000830184612478565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156124dc5780820151818401526020810190506124c1565b60008484015250505050565b6000601f19601f8301169050919050565b6000612504826124a2565b61250e81856124ad565b935061251e8185602086016124be565b612527816124e8565b840191505092915050565b6000602082019050818103600083015261254c81846124f9565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061258482612559565b9050919050565b61259481612579565b811461259f57600080fd5b50565b6000813590506125b18161258b565b92915050565b6125c08161246e565b81146125cb57600080fd5b50565b6000813590506125dd816125b7565b92915050565b600080604083850312156125fa576125f9612554565b5b6000612608858286016125a2565b9250506020612619858286016125ce565b9150509250929050565b60008115159050919050565b61263881612623565b82525050565b6000602082019050612653600083018461262f565b92915050565b60006020828403121561266f5761266e612554565b5b600061267d848285016125ce565b91505092915050565b60008060006060848603121561269f5761269e612554565b5b60006126ad868287016125a2565b93505060206126be868287016125a2565b92505060406126cf868287016125ce565b9150509250925092565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61270e8161246e565b82525050565b60408201600082015161272a6000850182612705565b50602082015161273d6020850182612705565b50505050565b600061274f8383612714565b60408301905092915050565b6000602082019050919050565b6000612773826126d9565b61277d81856126e4565b9350612788836126f5565b8060005b838110156127b95781516127a08882612743565b97506127ab8361275b565b92505060018101905061278c565b5085935050505092915050565b600060208201905081810360008301526127e08184612768565b905092915050565b600060ff82169050919050565b6127fe816127e8565b82525050565b600060208201905061281960008301846127f5565b92915050565b61282881612623565b811461283357600080fd5b50565b6000813590506128458161281f565b92915050565b60008060006060848603121561286457612863612554565b5b6000612872868287016125ce565b935050602061288386828701612836565b9250506040612894868287016125ce565b9150509250925092565b6000602082840312156128b4576128b3612554565b5b60006128c2848285016125a2565b91505092915050565b6128d481612579565b82525050565b60006020820190506128ef60008301846128cb565b92915050565b600060408201905061290a6000830185612478565b6129176020830184612478565b9392505050565b6000806040838503121561293557612934612554565b5b6000612943858286016125a2565b9250506020612954858286016125a2565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806129a557607f821691505b6020821081036129b8576129b761295e565b5b50919050565b7f4d4149543a207072696365206f662074686520636f696e2063616e6e6f74206260008201527f65207a65726f0000000000000000000000000000000000000000000000000000602082015250565b6000612a1a6026836124ad565b9150612a25826129be565b604082019050919050565b60006020820190508181036000830152612a4981612a0d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612a8a8261246e565b9150612a958361246e565b9250828201905080821115612aad57612aac612a50565b5b92915050565b7f4d4149543a2070726963652063616e206f6e6c7920626520757064617465642060008201527f6f6e636520612079656172000000000000000000000000000000000000000000602082015250565b6000612b0f602b836124ad565b9150612b1a82612ab3565b604082019050919050565b60006020820190508181036000830152612b3e81612b02565b9050919050565b7f4d4149543a2049434f2063616e6e6f742062652073657420696e20746865207060008201527f6173740000000000000000000000000000000000000000000000000000000000602082015250565b6000612ba16023836124ad565b9150612bac82612b45565b604082019050919050565b60006020820190508181036000830152612bd081612b94565b9050919050565b7f4d4149543a2049434f2068617320616c726561647920656e6465640000000000600082015250565b6000612c0d601b836124ad565b9150612c1882612bd7565b602082019050919050565b60006020820190508181036000830152612c3c81612c00565b9050919050565b7f4d4149543a206d696e696d616c206f726465722076616c756520776173206e6f60008201527f74206d6574000000000000000000000000000000000000000000000000000000602082015250565b6000612c9f6025836124ad565b9150612caa82612c43565b604082019050919050565b60006020820190508181036000830152612cce81612c92565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612d0f8261246e565b9150612d1a8361246e565b925082612d2a57612d29612cd5565b5b828204905092915050565b7f4d4149543a20616d6f756e742063616e6e6f742062652067726561746572207460008201527f68616e2074686520617661696c61626c6520616d6f756e740000000000000000602082015250565b6000612d916038836124ad565b9150612d9c82612d35565b604082019050919050565b60006020820190508181036000830152612dc081612d84565b9050919050565b7f4d4149543a2045787065637465642070726963652070657220636f696e20646f60008201527f65736e2774206d6174636820746865207265616c207072696365000000000000602082015250565b6000612e23603a836124ad565b9150612e2e82612dc7565b604082019050919050565b60006020820190508181036000830152612e5281612e16565b9050919050565b6000612e648261246e565b9150612e6f8361246e565b9250828202612e7d8161246e565b91508282048414831517612e9457612e93612a50565b5b5092915050565b6000612ea68261246e565b9150612eb18361246e565b9250828203905081811115612ec957612ec8612a50565b5b92915050565b7f4d4149543a205553445420616464726573732063616e6e6f742062652074686560008201527f207a65726f206164647265737300000000000000000000000000000000000000602082015250565b6000612f2b602d836124ad565b9150612f3682612ecf565b604082019050919050565b60006020820190508181036000830152612f5a81612f1e565b9050919050565b7f4f776e61626c653a2063616e27742072656e6f756e63654f776e65727368697060008201527f2068657265000000000000000000000000000000000000000000000000000000602082015250565b6000612fbd6025836124ad565b9150612fc882612f61565b604082019050919050565b60006020820190508181036000830152612fec81612fb0565b9050919050565b7f4f776e61626c6532537465703a2063616c6c6572206973206e6f74207468652060008201527f6e6577206f776e65720000000000000000000000000000000000000000000000602082015250565b600061304f6029836124ad565b915061305a82612ff3565b604082019050919050565b6000602082019050818103600083015261307e81613042565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b60006130e16025836124ad565b91506130ec82613085565b604082019050919050565b60006020820190508181036000830152613110816130d4565b9050919050565b600081519050613126816125b7565b92915050565b60006020828403121561314257613141612554565b5b600061315084828501613117565b91505092915050565b7f4d4149543a206d696e696d616c206f726465722063616e6e6f74206265207a6560008201527f726f000000000000000000000000000000000000000000000000000000000000602082015250565b60006131b56022836124ad565b91506131c082613159565b604082019050919050565b600060208201905081810360008301526131e4816131a8565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006132476024836124ad565b9150613252826131eb565b604082019050919050565b600060208201905081810360008301526132768161323a565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006132d96022836124ad565b91506132e48261327d565b604082019050919050565b60006020820190508181036000830152613308816132cc565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006133456020836124ad565b91506133508261330f565b602082019050919050565b6000602082019050818103600083015261337481613338565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b60006133b1601d836124ad565b91506133bc8261337b565b602082019050919050565b600060208201905081810360008301526133e0816133a4565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006134436025836124ad565b915061344e826133e7565b604082019050919050565b6000602082019050818103600083015261347281613436565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b60006134d56023836124ad565b91506134e082613479565b604082019050919050565b60006020820190508181036000830152613504816134c8565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b60006135676026836124ad565b91506135728261350b565b604082019050919050565b600060208201905081810360008301526135968161355a565b9050919050565b60006060820190506135b260008301866128cb565b6135bf60208301856128cb565b6135cc6040830184612478565b949350505050565b60006040820190506135e960008301856128cb565b6135f66020830184612478565b9392505050565b7f4d4149543a207472616e7366657220616d6f756e74206578636565647320626160008201527f6c616e6365206f7220756e6c6f636b656420616d6f756e7420746f6f206c6f77602082015250565b60006136596040836124ad565b9150613664826135fd565b604082019050919050565b600060208201905081810360008301526136888161364c565b9050919050565b60008151905061369e8161281f565b92915050565b6000602082840312156136ba576136b9612554565b5b60006136c88482850161368f565b91505092915050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b600061372d602a836124ad565b9150613738826136d1565b604082019050919050565b6000602082019050818103600083015261375c81613720565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061379d8261246e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036137cf576137ce612a50565b5b600182019050919050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b60006138366026836124ad565b9150613841826137da565b604082019050919050565b6000602082019050818103600083015261386581613829565b9050919050565b600081519050919050565b600081905092915050565b600061388d8261386c565b6138978185613877565b93506138a78185602086016124be565b80840191505092915050565b60006138bf8284613882565b915081905092915050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000613900601d836124ad565b915061390b826138ca565b602082019050919050565b6000602082019050818103600083015261392f816138f3565b905091905056fea2646970667358221220544c7d2085c4021b9f83080e5980c3d5bdaff22b5c37417fc9e9009a9deac9b364736f6c63430008110033000000000000000000000000000000000000000000000000000000006608a7800000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000018b0b5d86c6f0620bd1564ce06a97f99e3de38bc

Deployed Bytecode

0x6080604052600436106102045760003560e01c80637a40624b11610118578063a9059cbb116100a0578063e20c04a71161006f578063e20c04a714610777578063e30c3978146107a2578063e654210b146107cd578063f2fde38b146107f8578063faccdd501461082157610204565b8063a9059cbb146106a9578063c1201054146106e6578063c3c9560e14610711578063dd62ed3e1461073a57610204565b80638da5cb5b116100e75780638da5cb5b146105ad5780638f441b19146105d857806395d89b411461060357806399683fa51461062e578063a457c2d71461066c57610204565b80637a40624b1461050157806381c6c9761461052c57806385f2aef2146105575780638b1ebbf91461058257610204565b8063313ce5671161019b578063557ed1ba1161016a578063557ed1ba146104425780635c7b79f51461046d57806370a0823114610496578063715018a6146104d357806379ba5097146104ea57610204565b8063313ce5671461038157806332fb3c13146103ac57806339509351146103dc57806350c1b9231461041957610204565b806318160ddd116101d757806318160ddd146102c557806323b872dd146102f057806323e7a9001461032d5780632d49ffcd1461035657610204565b80630563451a1461020957806306fdde0314610234578063095ea7b31461025f578063147d959a1461029c575b600080fd5b34801561021557600080fd5b5061021e61084c565b60405161022b9190612487565b60405180910390f35b34801561024057600080fd5b50610249610852565b6040516102569190612532565b60405180910390f35b34801561026b57600080fd5b50610286600480360381019061028191906125e3565b6108e4565b604051610293919061263e565b60405180910390f35b3480156102a857600080fd5b506102c360048036038101906102be9190612659565b610907565b005b3480156102d157600080fd5b506102da6109b6565b6040516102e79190612487565b60405180910390f35b3480156102fc57600080fd5b5061031760048036038101906103129190612686565b6109c0565b604051610324919061263e565b60405180910390f35b34801561033957600080fd5b50610354600480360381019061034f9190612659565b6109ef565b005b34801561036257600080fd5b5061036b610a43565b60405161037891906127c6565b60405180910390f35b34801561038d57600080fd5b50610396610af3565b6040516103a39190612804565b60405180910390f35b6103c660048036038101906103c1919061284b565b610afc565b6040516103d3919061263e565b60405180910390f35b3480156103e857600080fd5b5061040360048036038101906103fe91906125e3565b610e2b565b604051610410919061263e565b60405180910390f35b34801561042557600080fd5b50610440600480360381019061043b919061289e565b610e62565b005b34801561044e57600080fd5b50610457610f1d565b6040516104649190612487565b60405180910390f35b34801561047957600080fd5b50610494600480360381019061048f9190612659565b610f25565b005b3480156104a257600080fd5b506104bd60048036038101906104b8919061289e565b610f5d565b6040516104ca9190612487565b60405180910390f35b3480156104df57600080fd5b506104e8610fa5565b005b3480156104f657600080fd5b506104ff610fe0565b005b34801561050d57600080fd5b5061051661106d565b6040516105239190612487565b60405180910390f35b34801561053857600080fd5b50610541611073565b60405161054e9190612487565b60405180910390f35b34801561056357600080fd5b5061056c611079565b60405161057991906128da565b60405180910390f35b34801561058e57600080fd5b5061059761109f565b6040516105a49190612487565b60405180910390f35b3480156105b957600080fd5b506105c26110a5565b6040516105cf91906128da565b60405180910390f35b3480156105e457600080fd5b506105ed6110cf565b6040516105fa9190612487565b60405180910390f35b34801561060f57600080fd5b50610618611116565b6040516106259190612532565b60405180910390f35b34801561063a57600080fd5b50610655600480360381019061065091906125e3565b6111a8565b6040516106639291906128f5565b60405180910390f35b34801561067857600080fd5b50610693600480360381019061068e91906125e3565b6111e9565b6040516106a0919061263e565b60405180910390f35b3480156106b557600080fd5b506106d060048036038101906106cb91906125e3565b611260565b6040516106dd919061263e565b60405180910390f35b3480156106f257600080fd5b506106fb611283565b6040516107089190612487565b60405180910390f35b34801561071d57600080fd5b5061073860048036038101906107339190612659565b611326565b005b34801561074657600080fd5b50610761600480360381019061075c919061291e565b61137b565b60405161076e9190612487565b60405180910390f35b34801561078357600080fd5b5061078c611402565b6040516107999190612487565b60405180910390f35b3480156107ae57600080fd5b506107b7611408565b6040516107c491906128da565b60405180910390f35b3480156107d957600080fd5b506107e2611432565b6040516107ef91906128da565b60405180910390f35b34801561080457600080fd5b5061081f600480360381019061081a919061289e565b611458565b005b34801561082d57600080fd5b50610836611505565b6040516108439190612487565b60405180910390f35b600a5481565b6060600380546108619061298d565b80601f016020809104026020016040519081016040528092919081815260200182805461088d9061298d565b80156108da5780601f106108af576101008083540402835291602001916108da565b820191906000526020600020905b8154815290600101906020018083116108bd57829003601f168201915b5050505050905090565b6000806108ef6115db565b90506108fc8185856115e3565b600191505092915050565b61090f6117ac565b60008111610952576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094990612a30565b60405180910390fd5b426301e13380600d546109659190612a7f565b106109a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099c90612b25565b60405180910390fd5b80600c8190555042600d8190555050565b6000600254905090565b6000806109cb6115db565b90506109d885828561182a565b6109e38585856118b6565b60019150509392505050565b6109f76117ac565b428111610a39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3090612bb7565b60405180910390fd5b80600a8190555050565b6060600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b82821015610aea57838290600052602060002090600202016040518060400160405290816000820154815260200160018201548152505081526020019060010190610aa4565b50505050905090565b60006012905090565b6000600a544210610b42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3990612c23565b60405180910390fd5b83600e54811015610b88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7f90612cb5565b60405180910390fd5b848460008115610bb157600a83610b9f9190612d04565b83610baa9190612a7f565b9050610bb5565b8290505b600b54811115610bfa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf190612da7565b60405180910390fd5b85600c5414610c3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3590612e39565b60405180910390fd5b610c8c600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff163330670de0b6b3a7640000600c548d610c7d9190612e59565b610c879190612d04565b611b2c565b60008715610cab576301e1338042610ca49190612a7f565b9050610cd8565b600a89610cb89190612d04565b89610cc39190612a7f565b98506303c2670042610cd59190612a7f565b90505b80601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015610d645780601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060405180604001604052808381526020018b815250908060018154018082558091505060019003906000526020600020906002020160009091909190915060008201518160000155602082015181600101555050610e0230338b6118b6565b88600b6000828254610e149190612e9b565b925050819055506001955050505050509392505050565b600080610e366115db565b9050610e57818585610e48858961137b565b610e529190612a7f565b6115e3565b600191505092915050565b610e6a6117ac565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610ed9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed090612f41565b60405180910390fd5b80600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600042905090565b610f2d6117ac565b610f5a600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff163383611bb5565b50565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd790612fd3565b60405180910390fd5b6000610fea6115db565b90508073ffffffffffffffffffffffffffffffffffffffff1661100b611408565b73ffffffffffffffffffffffffffffffffffffffff1614611061576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105890613065565b60405180910390fd5b61106a81611c3b565b50565b60085481565b600d5481565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600e5481565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905090565b6060600480546111259061298d565b80601f01602080910402602001604051908101604052809291908181526020018280546111519061298d565b801561119e5780601f106111735761010080835404028352916020019161119e565b820191906000526020600020905b81548152906001019060200180831161118157829003601f168201915b5050505050905090565b600f60205281600052604060002081815481106111c457600080fd5b9060005260206000209060020201600091509150508060000154908060010154905082565b6000806111f46115db565b90506000611202828661137b565b905083811015611247576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123e906130f7565b60405180910390fd5b61125482868684036115e3565b60019250505092915050565b60008061126b6115db565b90506112788185856118b6565b600191505092915050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016112e091906128da565b602060405180830381865afa1580156112fd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611321919061312c565b905090565b61132e6117ac565b60008111611371576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611368906131cb565b60405180910390fd5b80600e8190555050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600c5481565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6114606117ac565b80600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff166114c06110a5565b73ffffffffffffffffffffffffffffffffffffffff167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b600b5481565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b505050565b505050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611652576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116499061325d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036116c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b8906132ef565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161179f9190612487565b60405180910390a3505050565b6117b46115db565b73ffffffffffffffffffffffffffffffffffffffff166117d26110a5565b73ffffffffffffffffffffffffffffffffffffffff1614611828576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181f9061335b565b60405180910390fd5b565b6000611836848461137b565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146118b057818110156118a2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611899906133c7565b60405180910390fd5b6118af84848484036115e3565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611925576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191c90613459565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611994576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198b906134eb565b60405180910390fd5b61199f838383611c6c565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611a25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1c9061357d565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611b139190612487565b60405180910390a3611b26848484611d0d565b50505050565b611baf846323b872dd60e01b858585604051602401611b4d9392919061359d565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611d6f565b50505050565b611c368363a9059cbb60e01b8484604051602401611bd49291906135d4565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611d6f565b505050565b600660006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055611c698161150b565b50565b611c778383836115d1565b42601060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115611d0857611cc88184611e36565b611d07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cfe9061366f565b60405180910390fd5b5b505050565b611d188383836115d6565b42601060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115611d6a57611d698382611ea9565b5b505050565b6000611dd1826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166121489092919063ffffffff16565b9050600081511115611e315780806020019051810190611df191906136a4565b611e30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2790613743565b60405180910390fd5b5b505050565b60004260085403611e4a5760019050611ea3565b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611e865760019050611ea3565b82611e9083612160565b10611e9e5760019050611ea3565b600090505b92915050565b60005b600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490508110156121425742600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208281548110611f4857611f47613763565b5b906000526020600020906002020160000154101561213157600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208181548110611fb157611fb0613763565b5b9060005260206000209060020201600101548211156120b157600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020818154811061201b5761201a613763565b5b906000526020600020906002020160010154826120389190612e9b565b9150600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020818154811061208b5761208a613763565b5b906000526020600020906002020160008082016000905560018201600090555050612130565b81600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020828154811061210357612102613763565b5b906000526020600020906002020160010160008282546121239190612e9b565b9250508190555050612144565b5b8061213b90613792565b9050611eac565b505b5050565b606061215784846000856122b9565b90509392505050565b60008060005b600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905081101561229c5742600f60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020828154811061220257612201613763565b5b906000526020600020906002020160000154111561228b57600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020818154811061226b5761226a613763565b5b906000526020600020906002020160010154826122889190612a7f565b91505b8061229590613792565b9050612166565b50806122a784610f5d565b6122b19190612e9b565b915050919050565b6060824710156122fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122f59061384c565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161232791906138b3565b60006040518083038185875af1925050503d8060008114612364576040519150601f19603f3d011682016040523d82523d6000602084013e612369565b606091505b509150915061237a87838387612386565b92505050949350505050565b606083156123e85760008351036123e0576123a0856123fb565b6123df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123d690613916565b60405180910390fd5b5b8290506123f3565b6123f2838361241e565b5b949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000825111156124315781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124659190612532565b60405180910390fd5b6000819050919050565b6124818161246e565b82525050565b600060208201905061249c6000830184612478565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156124dc5780820151818401526020810190506124c1565b60008484015250505050565b6000601f19601f8301169050919050565b6000612504826124a2565b61250e81856124ad565b935061251e8185602086016124be565b612527816124e8565b840191505092915050565b6000602082019050818103600083015261254c81846124f9565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061258482612559565b9050919050565b61259481612579565b811461259f57600080fd5b50565b6000813590506125b18161258b565b92915050565b6125c08161246e565b81146125cb57600080fd5b50565b6000813590506125dd816125b7565b92915050565b600080604083850312156125fa576125f9612554565b5b6000612608858286016125a2565b9250506020612619858286016125ce565b9150509250929050565b60008115159050919050565b61263881612623565b82525050565b6000602082019050612653600083018461262f565b92915050565b60006020828403121561266f5761266e612554565b5b600061267d848285016125ce565b91505092915050565b60008060006060848603121561269f5761269e612554565b5b60006126ad868287016125a2565b93505060206126be868287016125a2565b92505060406126cf868287016125ce565b9150509250925092565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61270e8161246e565b82525050565b60408201600082015161272a6000850182612705565b50602082015161273d6020850182612705565b50505050565b600061274f8383612714565b60408301905092915050565b6000602082019050919050565b6000612773826126d9565b61277d81856126e4565b9350612788836126f5565b8060005b838110156127b95781516127a08882612743565b97506127ab8361275b565b92505060018101905061278c565b5085935050505092915050565b600060208201905081810360008301526127e08184612768565b905092915050565b600060ff82169050919050565b6127fe816127e8565b82525050565b600060208201905061281960008301846127f5565b92915050565b61282881612623565b811461283357600080fd5b50565b6000813590506128458161281f565b92915050565b60008060006060848603121561286457612863612554565b5b6000612872868287016125ce565b935050602061288386828701612836565b9250506040612894868287016125ce565b9150509250925092565b6000602082840312156128b4576128b3612554565b5b60006128c2848285016125a2565b91505092915050565b6128d481612579565b82525050565b60006020820190506128ef60008301846128cb565b92915050565b600060408201905061290a6000830185612478565b6129176020830184612478565b9392505050565b6000806040838503121561293557612934612554565b5b6000612943858286016125a2565b9250506020612954858286016125a2565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806129a557607f821691505b6020821081036129b8576129b761295e565b5b50919050565b7f4d4149543a207072696365206f662074686520636f696e2063616e6e6f74206260008201527f65207a65726f0000000000000000000000000000000000000000000000000000602082015250565b6000612a1a6026836124ad565b9150612a25826129be565b604082019050919050565b60006020820190508181036000830152612a4981612a0d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612a8a8261246e565b9150612a958361246e565b9250828201905080821115612aad57612aac612a50565b5b92915050565b7f4d4149543a2070726963652063616e206f6e6c7920626520757064617465642060008201527f6f6e636520612079656172000000000000000000000000000000000000000000602082015250565b6000612b0f602b836124ad565b9150612b1a82612ab3565b604082019050919050565b60006020820190508181036000830152612b3e81612b02565b9050919050565b7f4d4149543a2049434f2063616e6e6f742062652073657420696e20746865207060008201527f6173740000000000000000000000000000000000000000000000000000000000602082015250565b6000612ba16023836124ad565b9150612bac82612b45565b604082019050919050565b60006020820190508181036000830152612bd081612b94565b9050919050565b7f4d4149543a2049434f2068617320616c726561647920656e6465640000000000600082015250565b6000612c0d601b836124ad565b9150612c1882612bd7565b602082019050919050565b60006020820190508181036000830152612c3c81612c00565b9050919050565b7f4d4149543a206d696e696d616c206f726465722076616c756520776173206e6f60008201527f74206d6574000000000000000000000000000000000000000000000000000000602082015250565b6000612c9f6025836124ad565b9150612caa82612c43565b604082019050919050565b60006020820190508181036000830152612cce81612c92565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612d0f8261246e565b9150612d1a8361246e565b925082612d2a57612d29612cd5565b5b828204905092915050565b7f4d4149543a20616d6f756e742063616e6e6f742062652067726561746572207460008201527f68616e2074686520617661696c61626c6520616d6f756e740000000000000000602082015250565b6000612d916038836124ad565b9150612d9c82612d35565b604082019050919050565b60006020820190508181036000830152612dc081612d84565b9050919050565b7f4d4149543a2045787065637465642070726963652070657220636f696e20646f60008201527f65736e2774206d6174636820746865207265616c207072696365000000000000602082015250565b6000612e23603a836124ad565b9150612e2e82612dc7565b604082019050919050565b60006020820190508181036000830152612e5281612e16565b9050919050565b6000612e648261246e565b9150612e6f8361246e565b9250828202612e7d8161246e565b91508282048414831517612e9457612e93612a50565b5b5092915050565b6000612ea68261246e565b9150612eb18361246e565b9250828203905081811115612ec957612ec8612a50565b5b92915050565b7f4d4149543a205553445420616464726573732063616e6e6f742062652074686560008201527f207a65726f206164647265737300000000000000000000000000000000000000602082015250565b6000612f2b602d836124ad565b9150612f3682612ecf565b604082019050919050565b60006020820190508181036000830152612f5a81612f1e565b9050919050565b7f4f776e61626c653a2063616e27742072656e6f756e63654f776e65727368697060008201527f2068657265000000000000000000000000000000000000000000000000000000602082015250565b6000612fbd6025836124ad565b9150612fc882612f61565b604082019050919050565b60006020820190508181036000830152612fec81612fb0565b9050919050565b7f4f776e61626c6532537465703a2063616c6c6572206973206e6f74207468652060008201527f6e6577206f776e65720000000000000000000000000000000000000000000000602082015250565b600061304f6029836124ad565b915061305a82612ff3565b604082019050919050565b6000602082019050818103600083015261307e81613042565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b60006130e16025836124ad565b91506130ec82613085565b604082019050919050565b60006020820190508181036000830152613110816130d4565b9050919050565b600081519050613126816125b7565b92915050565b60006020828403121561314257613141612554565b5b600061315084828501613117565b91505092915050565b7f4d4149543a206d696e696d616c206f726465722063616e6e6f74206265207a6560008201527f726f000000000000000000000000000000000000000000000000000000000000602082015250565b60006131b56022836124ad565b91506131c082613159565b604082019050919050565b600060208201905081810360008301526131e4816131a8565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006132476024836124ad565b9150613252826131eb565b604082019050919050565b600060208201905081810360008301526132768161323a565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006132d96022836124ad565b91506132e48261327d565b604082019050919050565b60006020820190508181036000830152613308816132cc565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006133456020836124ad565b91506133508261330f565b602082019050919050565b6000602082019050818103600083015261337481613338565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b60006133b1601d836124ad565b91506133bc8261337b565b602082019050919050565b600060208201905081810360008301526133e0816133a4565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006134436025836124ad565b915061344e826133e7565b604082019050919050565b6000602082019050818103600083015261347281613436565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b60006134d56023836124ad565b91506134e082613479565b604082019050919050565b60006020820190508181036000830152613504816134c8565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b60006135676026836124ad565b91506135728261350b565b604082019050919050565b600060208201905081810360008301526135968161355a565b9050919050565b60006060820190506135b260008301866128cb565b6135bf60208301856128cb565b6135cc6040830184612478565b949350505050565b60006040820190506135e960008301856128cb565b6135f66020830184612478565b9392505050565b7f4d4149543a207472616e7366657220616d6f756e74206578636565647320626160008201527f6c616e6365206f7220756e6c6f636b656420616d6f756e7420746f6f206c6f77602082015250565b60006136596040836124ad565b9150613664826135fd565b604082019050919050565b600060208201905081810360008301526136888161364c565b9050919050565b60008151905061369e8161281f565b92915050565b6000602082840312156136ba576136b9612554565b5b60006136c88482850161368f565b91505092915050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b600061372d602a836124ad565b9150613738826136d1565b604082019050919050565b6000602082019050818103600083015261375c81613720565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061379d8261246e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036137cf576137ce612a50565b5b600182019050919050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b60006138366026836124ad565b9150613841826137da565b604082019050919050565b6000602082019050818103600083015261386581613829565b9050919050565b600081519050919050565b600081905092915050565b600061388d8261386c565b6138978185613877565b93506138a78185602086016124be565b80840191505092915050565b60006138bf8284613882565b915081905092915050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000613900601d836124ad565b915061390b826138ca565b602082019050919050565b6000602082019050818103600083015261392f816138f3565b905091905056fea2646970667358221220544c7d2085c4021b9f83080e5980c3d5bdaff22b5c37417fc9e9009a9deac9b364736f6c63430008110033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000000000000000000000000000000000006608a7800000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000018b0b5d86c6f0620bd1564ce06a97f99e3de38bc

-----Decoded View---------------
Arg [0] : _icoEnd (uint256): 1711843200
Arg [1] : _minimalOrder (uint256): 1000000000000000000
Arg [2] : _team (address): 0x18B0B5D86C6F0620BD1564ce06a97f99e3de38bc

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 000000000000000000000000000000000000000000000000000000006608a780
Arg [1] : 0000000000000000000000000000000000000000000000000de0b6b3a7640000
Arg [2] : 00000000000000000000000018b0b5d86c6f0620bd1564ce06a97f99e3de38bc


Deployed Bytecode Sourcemap

35928:12973:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36473:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6177:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8376:187;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41204:314;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7233:102;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9109:243;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40872:166;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48450:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7089:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46221:1415;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9735:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41721:222;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48668:83;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48163:129;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7390:121;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48757:141;;;;;;;;;;;;;:::i;:::-;;35535:196;;;;;;;;;;;;;:::i;:::-;;36346:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36714:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36411:19;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36816:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32497:81;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40580:93;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6380:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37018:47;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;10432:404;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7699:179;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47796:122;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42117:181;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7933:145;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36634:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34677:95;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36011:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34961:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36555:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36473:21;;;;:::o;6177:94::-;6231:13;6260:5;6253:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6177:94;:::o;8376:187::-;8459:4;8472:13;8488:12;:10;:12::i;:::-;8472:28;;8507:32;8516:5;8523:7;8532:6;8507:8;:32::i;:::-;8553:4;8546:11;;;8376:187;;;;:::o;41204:314::-;32397:13;:11;:13::i;:::-;41290:1:::1;41278:9;:13;41270:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;41380:15;41369:8;41351:15;;:26;;;;:::i;:::-;:44;41343:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;41463:9;41452:8;:20;;;;41497:15;41479;:33;;;;41204:314:::0;:::o;7233:102::-;7294:7;7317:12;;7310:19;;7233:102;:::o;9109:243::-;9206:4;9219:15;9237:12;:10;:12::i;:::-;9219:30;;9256:38;9272:4;9278:7;9287:6;9256:15;:38::i;:::-;9301:27;9311:4;9317:2;9321:6;9301:9;:27::i;:::-;9342:4;9335:11;;;9109:243;;;;;:::o;40872:166::-;32397:13;:11;:13::i;:::-;40952:15:::1;40942:7;:25;40934:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;41025:7;41016:6;:16;;;;40872:166:::0;:::o;48450:104::-;48494:13;48523;:25;48537:10;48523:25;;;;;;;;;;;;;;;48516:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48450:104;:::o;7089:87::-;7147:5;7168:2;7161:9;;7089:87;:::o;46221:1415::-;46502:4;40346:6;;40328:15;:24;40320:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;46446:6:::1;39396:12;;39386:6;:22;;39378:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;46472:6:::2;46480:11;39869:15;39895:11;39891:103;;;39945:2;39936:6;:11;;;;:::i;:::-;39927:6;:20;;;;:::i;:::-;39917:30;;39891:103;;;39980:6;39970:16;;39891:103;40021:9;;40010:7;:20;;40002:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;46592:13:::3;46580:8;;:25;46572:96;;;;;;;;;;;;:::i;:::-;;;;;;;;;46677:107;46711:12;;;;;;;;;;;46726:10;46746:4;46775:8;46763;;46754:6;:17;;;;:::i;:::-;46753:30;;;;:::i;:::-;46677:26;:107::i;:::-;46793:17;46856:11;46852:253;;;46908:8;46890:15;:26;;;;:::i;:::-;46878:38;;46852:253;;;46985:2;46976:6;:11;;;;:::i;:::-;46967:6;:20;;;;:::i;:::-;46958:29;;47067:12;47049:15;:30;;;;:::i;:::-;47037:42;;46852:253;47247:9;47224:8;:20;47233:10;47224:20;;;;;;;;;;;;;;;;:32;47220:70;;;47281:9;47258:8;:20;47267:10;47258:20;;;;;;;;;;;;;;;:32;;;;47220:70;47362:13;:25;47376:10;47362:25;;;;;;;;;;;;;;;47393:23;;;;;;;;47398:9;47393:23;;;;47409:6;47393:23;;::::0;47362:55:::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47487:44;47505:4;47512:10;47524:6;47487:9;:44::i;:::-;47604:6;47591:9;;:19;;;;;;;:::i;:::-;;;;;;;;47626:4;47619:11;;;39862:243:::2;39457:1;;40391::::1;46221:1415:::0;;;;;:::o;9735:224::-;9823:4;9836:13;9852:12;:10;:12::i;:::-;9836:28;;9871:64;9880:5;9887:7;9924:10;9896:25;9906:5;9913:7;9896:9;:25::i;:::-;:38;;;;:::i;:::-;9871:8;:64::i;:::-;9949:4;9942:11;;;9735:224;;;;:::o;41721:222::-;32397:13;:11;:13::i;:::-;41856:1:::1;41839:19;;:5;:19;;::::0;41831:77:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;41932:5;41917:12;;:20;;;;;;;;;;;;;;;;;;41721:222:::0;:::o;48668:83::-;48710:4;48730:15;48723:22;;48668:83;:::o;48163:129::-;32397:13;:11;:13::i;:::-;48222:64:::1;48252:12;;;;;;;;;;;48267:10;48279:6;48222:22;:64::i;:::-;48163:129:::0;:::o;7390:121::-;7464:7;7487:9;:18;7497:7;7487:18;;;;;;;;;;;;;;;;7480:25;;7390:121;;;:::o;48757:141::-;48814:47;;;;;;;;;;:::i;:::-;;;;;;;;35535:196;35578:14;35595:12;:10;:12::i;:::-;35578:29;;35640:6;35622:24;;:14;:12;:14::i;:::-;:24;;;35614:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;35699:26;35718:6;35699:18;:26::i;:::-;35571:160;35535:196::o;36346:25::-;;;;:::o;36714:30::-;;;;:::o;36411:19::-;;;;;;;;;;;;;:::o;36816:27::-;;;;:::o;32497:81::-;32543:7;32566:6;;;;;;;;;;;32559:13;;32497:81;:::o;40580:93::-;40624:7;40647:8;:20;40656:10;40647:20;;;;;;;;;;;;;;;;40640:27;;40580:93;:::o;6380:98::-;6436:13;6465:7;6458:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6380:98;:::o;37018:47::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;10432:404::-;10525:4;10538:13;10554:12;:10;:12::i;:::-;10538:28;;10573:24;10600:25;10610:5;10617:7;10600:9;:25::i;:::-;10573:52;;10660:15;10640:16;:35;;10632:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;10743:60;10752:5;10759:7;10787:15;10768:16;:34;10743:8;:60::i;:::-;10826:4;10819:11;;;;10432:404;;;;:::o;7699:179::-;7778:4;7791:13;7807:12;:10;:12::i;:::-;7791:28;;7826;7836:5;7843:2;7847:6;7826:9;:28::i;:::-;7868:4;7861:11;;;7699:179;;;;:::o;47796:122::-;47844:7;47874:12;;;;;;;;;;;47867:30;;;47906:4;47867:45;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47860:52;;47796:122;:::o;42117:181::-;32397:13;:11;:13::i;:::-;42215:1:::1;42199:13;:17;42191:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;42279:13;42264:12;:28;;;;42117:181:::0;:::o;7933:145::-;8022:7;8045:11;:18;8057:5;8045:18;;;;;;;;;;;;;;;:27;8064:7;8045:27;;;;;;;;;;;;;;;;8038:34;;7933:145;;;;:::o;36634:23::-;;;;:::o;34677:95::-;34730:7;34753:13;;;;;;;;;;;34746:20;;34677:95;:::o;36011:27::-;;;;;;;;;;;;;:::o;34961:171::-;32397:13;:11;:13::i;:::-;35063:8:::1;35047:13;;:24;;;;;;;;;;;;;;;;;;35117:8;35083:43;;35108:7;:5;:7::i;:::-;35083:43;;;;;;;;;;;;34961:171:::0;:::o;36555:24::-;;;;:::o;33692:177::-;33762:16;33781:6;;;;;;;;;;;33762:25;;33803:8;33794:6;;:17;;;;;;;;;;;;;;;;;;33854:8;33823:40;;33844:8;33823:40;;;;;;;;;;;;33755:114;33692:177;:::o;15685:91::-;;;;:::o;16350:90::-;;;;:::o;3947:92::-;4000:7;4023:10;4016:17;;3947:92;:::o;14135:328::-;14250:1;14233:19;;:5;:19;;;14225:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;14327:1;14308:21;;:7;:21;;;14300:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;14407:6;14377:11;:18;14389:5;14377:18;;;;;;;;;;;;;;;:27;14396:7;14377:27;;;;;;;;;;;;;;;:36;;;;14441:7;14425:32;;14434:5;14425:32;;;14450:6;14425:32;;;;;;:::i;:::-;;;;;;;;14135:328;;;:::o;32648:126::-;32719:12;:10;:12::i;:::-;32708:23;;:7;:5;:7::i;:::-;:23;;;32700:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;32648:126::o;14736:379::-;14833:24;14860:25;14870:5;14877:7;14860:9;:25::i;:::-;14833:52;;14916:17;14896:16;:37;14892:218;;14972:6;14952:16;:26;;14944:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;15042:51;15051:5;15058:7;15086:6;15067:16;:25;15042:8;:51::i;:::-;14892:218;14826:289;14736:379;;;:::o;11276:744::-;11385:1;11369:18;;:4;:18;;;11361:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;11458:1;11444:16;;:2;:16;;;11436:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;11509:38;11530:4;11536:2;11540:6;11509:20;:38::i;:::-;11556:19;11578:9;:15;11588:4;11578:15;;;;;;;;;;;;;;;;11556:37;;11623:6;11608:11;:21;;11600:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;11730:6;11716:11;:20;11698:9;:15;11708:4;11698:15;;;;;;;;;;;;;;;:38;;;;11915:6;11898:9;:13;11908:2;11898:13;;;;;;;;;;;;;;;;:23;;;;;;;;;;;11957:2;11942:26;;11951:4;11942:26;;;11961:6;11942:26;;;;;;:::i;:::-;;;;;;;;11977:37;11997:4;12003:2;12007:6;11977:19;:37::i;:::-;11354:666;11276:744;;;:::o;28153:199::-;28250:96;28270:5;28300:27;;;28329:4;28335:2;28339:5;28277:68;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28250:19;:96::i;:::-;28153:199;;;;:::o;27976:171::-;28055:86;28075:5;28105:23;;;28130:2;28134:5;28082:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28055:19;:86::i;:::-;27976:171;;;:::o;35312:146::-;35398:13;;35391:20;;;;;;;;;;;35418:34;35443:8;35418:24;:34::i;:::-;35312:146;:::o;43837:316::-;43934:44;43961:4;43967:2;43971:6;43934:26;:44::i;:::-;44006:15;43989:8;:14;43998:4;43989:14;;;;;;;;;;;;;;;;:32;43985:163;;;44040:31;44058:6;44066:4;44040:17;:31::i;:::-;44032:108;;;;;;;;;;;;:::i;:::-;;;;;;;;;43985:163;43837:316;;;:::o;44441:236::-;44537:43;44563:4;44569:2;44573:6;44537:25;:43::i;:::-;44608:15;44591:8;:14;44600:4;44591:14;;;;;;;;;;;;;;;;:32;44587:85;;;44634:30;44651:4;44657:6;44634:16;:30::i;:::-;44587:85;44441:236;;;:::o;30680:678::-;31088:23;31114:69;31142:4;31114:69;;;;;;;;;;;;;;;;;31122:5;31114:27;;;;:69;;;;;:::i;:::-;31088:95;;31214:1;31194:10;:17;:21;31190:163;;;31279:10;31268:30;;;;;;;;;;;;:::i;:::-;31260:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;31190:163;30750:608;30680:678;;:::o;42648:357::-;42727:4;42786:15;42772:10;;:29;42768:232;;42819:4;42812:11;;;;42768:232;42857:4;42841:21;;:4;:21;;;42837:163;;42880:4;42873:11;;;;42837:163;42929:6;42902:23;42920:4;42902:17;:23::i;:::-;:33;42898:102;;42953:4;42946:11;;;;42898:102;42987:5;42980:12;;42648:357;;;;;:::o;45236:459::-;45313:6;45308:382;45329:13;:19;45343:4;45329:19;;;;;;;;;;;;;;;:26;;;;45325:1;:30;45308:382;;;45407:15;45375:13;:19;45389:4;45375:19;;;;;;;;;;;;;;;45395:1;45375:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:29;;;:47;45371:312;;;45448:13;:19;45462:4;45448:19;;;;;;;;;;;;;;;45468:1;45448:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:29;;;45439:6;:38;45435:239;;;45502:13;:19;45516:4;45502:19;;;;;;;;;;;;;;;45522:1;45502:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:29;;;45492:39;;;;;:::i;:::-;;;45551:13;:19;45565:4;45551:19;;;;;;;;;;;;;;;45571:1;45551:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;45544:29;;;;;;;;;;;;;;45435:239;;;45637:6;45604:13;:19;45618:4;45604:19;;;;;;;;;;;;;;;45624:1;45604:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:29;;;:39;;;;;;;:::i;:::-;;;;;;;;45656:7;;;45435:239;45371:312;45357:3;;;;:::i;:::-;;;45308:382;;;;45236:459;;;:::o;22384:189::-;22487:12;22515:52;22537:6;22545:4;22551:1;22554:12;22515:21;:52::i;:::-;22508:59;;22384:189;;;;;:::o;43200:328::-;43263:7;43279:14;43305:6;43300:183;43321:13;:19;43335:4;43321:19;;;;;;;;;;;;;;;:26;;;;43317:1;:30;43300:183;;;43399:15;43367:13;:19;43381:4;43367:19;;;;;;;;;;;;;;;43387:1;43367:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:29;;;:47;43363:113;;;43437:13;:19;43451:4;43437:19;;;;;;;;;;;;;;;43457:1;43437:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:29;;;43427:39;;;;;:::i;:::-;;;43363:113;43349:3;;;;:::i;:::-;;;43300:183;;;;43516:6;43498:15;43508:4;43498:9;:15::i;:::-;:24;;;;:::i;:::-;43491:31;;;43200:328;;;:::o;23386:423::-;23538:12;23592:5;23567:21;:30;;23559:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;23648:12;23662:23;23689:6;:11;;23708:5;23715:4;23689:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23647:73;;;;23734:69;23761:6;23769:7;23778:10;23790:12;23734:26;:69::i;:::-;23727:76;;;;23386:423;;;;;;:::o;25797:564::-;25964:12;25989:7;25985:371;;;26032:1;26011:10;:17;:22;26007:260;;26205:18;26216:6;26205:10;:18::i;:::-;26197:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;26007:260;26282:10;26275:17;;;;25985:371;26315:33;26323:10;26335:12;26315:7;:33::i;:::-;25797:564;;;;;;;:::o;19751:308::-;19811:4;20052:1;20030:7;:19;;;:23;20023:30;;19751:308;;;:::o;26847:488::-;27020:1;27000:10;:17;:21;26996:334;;;27206:10;27200:17;27255:15;27242:10;27238:2;27234:19;27227:44;26996:334;27309:12;27302:20;;;;;;;;;;;:::i;:::-;;;;;;;;7:77:1;44:7;73:5;62:16;;7:77;;;:::o;90:118::-;177:24;195:5;177:24;:::i;:::-;172:3;165:37;90:118;;:::o;214:222::-;307:4;345:2;334:9;330:18;322:26;;358:71;426:1;415:9;411:17;402:6;358:71;:::i;:::-;214:222;;;;:::o;442:99::-;494:6;528:5;522:12;512:22;;442:99;;;:::o;547:169::-;631:11;665:6;660:3;653:19;705:4;700:3;696:14;681:29;;547:169;;;;:::o;722:246::-;803:1;813:113;827:6;824:1;821:13;813:113;;;912:1;907:3;903:11;897:18;893:1;888:3;884:11;877:39;849:2;846:1;842:10;837:15;;813:113;;;960:1;951:6;946:3;942:16;935:27;784:184;722:246;;;:::o;974:102::-;1015:6;1066:2;1062:7;1057:2;1050:5;1046:14;1042:28;1032:38;;974:102;;;:::o;1082:377::-;1170:3;1198:39;1231:5;1198:39;:::i;:::-;1253:71;1317:6;1312:3;1253:71;:::i;:::-;1246:78;;1333:65;1391:6;1386:3;1379:4;1372:5;1368:16;1333:65;:::i;:::-;1423:29;1445:6;1423:29;:::i;:::-;1418:3;1414:39;1407:46;;1174:285;1082:377;;;;:::o;1465:313::-;1578:4;1616:2;1605:9;1601:18;1593:26;;1665:9;1659:4;1655:20;1651:1;1640:9;1636:17;1629:47;1693:78;1766:4;1757:6;1693:78;:::i;:::-;1685:86;;1465:313;;;;:::o;1865:117::-;1974:1;1971;1964:12;2111:126;2148:7;2188:42;2181:5;2177:54;2166:65;;2111:126;;;:::o;2243:96::-;2280:7;2309:24;2327:5;2309:24;:::i;:::-;2298:35;;2243:96;;;:::o;2345:122::-;2418:24;2436:5;2418:24;:::i;:::-;2411:5;2408:35;2398:63;;2457:1;2454;2447:12;2398:63;2345:122;:::o;2473:139::-;2519:5;2557:6;2544:20;2535:29;;2573:33;2600:5;2573:33;:::i;:::-;2473:139;;;;:::o;2618:122::-;2691:24;2709:5;2691:24;:::i;:::-;2684:5;2681:35;2671:63;;2730:1;2727;2720:12;2671:63;2618:122;:::o;2746:139::-;2792:5;2830:6;2817:20;2808:29;;2846:33;2873:5;2846:33;:::i;:::-;2746:139;;;;:::o;2891:474::-;2959:6;2967;3016:2;3004:9;2995:7;2991:23;2987:32;2984:119;;;3022:79;;:::i;:::-;2984:119;3142:1;3167:53;3212:7;3203:6;3192:9;3188:22;3167:53;:::i;:::-;3157:63;;3113:117;3269:2;3295:53;3340:7;3331:6;3320:9;3316:22;3295:53;:::i;:::-;3285:63;;3240:118;2891:474;;;;;:::o;3371:90::-;3405:7;3448:5;3441:13;3434:21;3423:32;;3371:90;;;:::o;3467:109::-;3548:21;3563:5;3548:21;:::i;:::-;3543:3;3536:34;3467:109;;:::o;3582:210::-;3669:4;3707:2;3696:9;3692:18;3684:26;;3720:65;3782:1;3771:9;3767:17;3758:6;3720:65;:::i;:::-;3582:210;;;;:::o;3798:329::-;3857:6;3906:2;3894:9;3885:7;3881:23;3877:32;3874:119;;;3912:79;;:::i;:::-;3874:119;4032:1;4057:53;4102:7;4093:6;4082:9;4078:22;4057:53;:::i;:::-;4047:63;;4003:117;3798:329;;;;:::o;4133:619::-;4210:6;4218;4226;4275:2;4263:9;4254:7;4250:23;4246:32;4243:119;;;4281:79;;:::i;:::-;4243:119;4401:1;4426:53;4471:7;4462:6;4451:9;4447:22;4426:53;:::i;:::-;4416:63;;4372:117;4528:2;4554:53;4599:7;4590:6;4579:9;4575:22;4554:53;:::i;:::-;4544:63;;4499:118;4656:2;4682:53;4727:7;4718:6;4707:9;4703:22;4682:53;:::i;:::-;4672:63;;4627:118;4133:619;;;;;:::o;4758:136::-;4847:6;4881:5;4875:12;4865:22;;4758:136;;;:::o;4900:206::-;5021:11;5055:6;5050:3;5043:19;5095:4;5090:3;5086:14;5071:29;;4900:206;;;;:::o;5112:154::-;5201:4;5224:3;5216:11;;5254:4;5249:3;5245:14;5237:22;;5112:154;;;:::o;5272:108::-;5349:24;5367:5;5349:24;:::i;:::-;5344:3;5337:37;5272:108;;:::o;5446:495::-;5577:4;5572:3;5568:14;5666:4;5659:5;5655:16;5649:23;5685:63;5742:4;5737:3;5733:14;5719:12;5685:63;:::i;:::-;5592:166;5842:4;5835:5;5831:16;5825:23;5861:63;5918:4;5913:3;5909:14;5895:12;5861:63;:::i;:::-;5768:166;5546:395;5446:495;;:::o;5947:267::-;6060:10;6081:90;6167:3;6159:6;6081:90;:::i;:::-;6203:4;6198:3;6194:14;6180:28;;5947:267;;;;:::o;6220:135::-;6312:4;6344;6339:3;6335:14;6327:22;;6220:135;;;:::o;6425:908::-;6588:3;6617:76;6687:5;6617:76;:::i;:::-;6709:108;6810:6;6805:3;6709:108;:::i;:::-;6702:115;;6841:78;6913:5;6841:78;:::i;:::-;6942:7;6973:1;6958:350;6983:6;6980:1;6977:13;6958:350;;;7059:6;7053:13;7086:107;7189:3;7174:13;7086:107;:::i;:::-;7079:114;;7216:82;7291:6;7216:82;:::i;:::-;7206:92;;7018:290;7005:1;7002;6998:9;6993:14;;6958:350;;;6962:14;7324:3;7317:10;;6593:740;;;6425:908;;;;:::o;7339:461::-;7526:4;7564:2;7553:9;7549:18;7541:26;;7613:9;7607:4;7603:20;7599:1;7588:9;7584:17;7577:47;7641:152;7788:4;7779:6;7641:152;:::i;:::-;7633:160;;7339:461;;;;:::o;7806:86::-;7841:7;7881:4;7874:5;7870:16;7859:27;;7806:86;;;:::o;7898:112::-;7981:22;7997:5;7981:22;:::i;:::-;7976:3;7969:35;7898:112;;:::o;8016:214::-;8105:4;8143:2;8132:9;8128:18;8120:26;;8156:67;8220:1;8209:9;8205:17;8196:6;8156:67;:::i;:::-;8016:214;;;;:::o;8236:116::-;8306:21;8321:5;8306:21;:::i;:::-;8299:5;8296:32;8286:60;;8342:1;8339;8332:12;8286:60;8236:116;:::o;8358:133::-;8401:5;8439:6;8426:20;8417:29;;8455:30;8479:5;8455:30;:::i;:::-;8358:133;;;;:::o;8497:613::-;8571:6;8579;8587;8636:2;8624:9;8615:7;8611:23;8607:32;8604:119;;;8642:79;;:::i;:::-;8604:119;8762:1;8787:53;8832:7;8823:6;8812:9;8808:22;8787:53;:::i;:::-;8777:63;;8733:117;8889:2;8915:50;8957:7;8948:6;8937:9;8933:22;8915:50;:::i;:::-;8905:60;;8860:115;9014:2;9040:53;9085:7;9076:6;9065:9;9061:22;9040:53;:::i;:::-;9030:63;;8985:118;8497:613;;;;;:::o;9116:329::-;9175:6;9224:2;9212:9;9203:7;9199:23;9195:32;9192:119;;;9230:79;;:::i;:::-;9192:119;9350:1;9375:53;9420:7;9411:6;9400:9;9396:22;9375:53;:::i;:::-;9365:63;;9321:117;9116:329;;;;:::o;9451:118::-;9538:24;9556:5;9538:24;:::i;:::-;9533:3;9526:37;9451:118;;:::o;9575:222::-;9668:4;9706:2;9695:9;9691:18;9683:26;;9719:71;9787:1;9776:9;9772:17;9763:6;9719:71;:::i;:::-;9575:222;;;;:::o;9803:332::-;9924:4;9962:2;9951:9;9947:18;9939:26;;9975:71;10043:1;10032:9;10028:17;10019:6;9975:71;:::i;:::-;10056:72;10124:2;10113:9;10109:18;10100:6;10056:72;:::i;:::-;9803:332;;;;;:::o;10141:474::-;10209:6;10217;10266:2;10254:9;10245:7;10241:23;10237:32;10234:119;;;10272:79;;:::i;:::-;10234:119;10392:1;10417:53;10462:7;10453:6;10442:9;10438:22;10417:53;:::i;:::-;10407:63;;10363:117;10519:2;10545:53;10590:7;10581:6;10570:9;10566:22;10545:53;:::i;:::-;10535:63;;10490:118;10141:474;;;;;:::o;10621:180::-;10669:77;10666:1;10659:88;10766:4;10763:1;10756:15;10790:4;10787:1;10780:15;10807:320;10851:6;10888:1;10882:4;10878:12;10868:22;;10935:1;10929:4;10925:12;10956:18;10946:81;;11012:4;11004:6;11000:17;10990:27;;10946:81;11074:2;11066:6;11063:14;11043:18;11040:38;11037:84;;11093:18;;:::i;:::-;11037:84;10858:269;10807:320;;;:::o;11133:225::-;11273:34;11269:1;11261:6;11257:14;11250:58;11342:8;11337:2;11329:6;11325:15;11318:33;11133:225;:::o;11364:366::-;11506:3;11527:67;11591:2;11586:3;11527:67;:::i;:::-;11520:74;;11603:93;11692:3;11603:93;:::i;:::-;11721:2;11716:3;11712:12;11705:19;;11364:366;;;:::o;11736:419::-;11902:4;11940:2;11929:9;11925:18;11917:26;;11989:9;11983:4;11979:20;11975:1;11964:9;11960:17;11953:47;12017:131;12143:4;12017:131;:::i;:::-;12009:139;;11736:419;;;:::o;12161:180::-;12209:77;12206:1;12199:88;12306:4;12303:1;12296:15;12330:4;12327:1;12320:15;12347:191;12387:3;12406:20;12424:1;12406:20;:::i;:::-;12401:25;;12440:20;12458:1;12440:20;:::i;:::-;12435:25;;12483:1;12480;12476:9;12469:16;;12504:3;12501:1;12498:10;12495:36;;;12511:18;;:::i;:::-;12495:36;12347:191;;;;:::o;12544:230::-;12684:34;12680:1;12672:6;12668:14;12661:58;12753:13;12748:2;12740:6;12736:15;12729:38;12544:230;:::o;12780:366::-;12922:3;12943:67;13007:2;13002:3;12943:67;:::i;:::-;12936:74;;13019:93;13108:3;13019:93;:::i;:::-;13137:2;13132:3;13128:12;13121:19;;12780:366;;;:::o;13152:419::-;13318:4;13356:2;13345:9;13341:18;13333:26;;13405:9;13399:4;13395:20;13391:1;13380:9;13376:17;13369:47;13433:131;13559:4;13433:131;:::i;:::-;13425:139;;13152:419;;;:::o;13577:222::-;13717:34;13713:1;13705:6;13701:14;13694:58;13786:5;13781:2;13773:6;13769:15;13762:30;13577:222;:::o;13805:366::-;13947:3;13968:67;14032:2;14027:3;13968:67;:::i;:::-;13961:74;;14044:93;14133:3;14044:93;:::i;:::-;14162:2;14157:3;14153:12;14146:19;;13805:366;;;:::o;14177:419::-;14343:4;14381:2;14370:9;14366:18;14358:26;;14430:9;14424:4;14420:20;14416:1;14405:9;14401:17;14394:47;14458:131;14584:4;14458:131;:::i;:::-;14450:139;;14177:419;;;:::o;14602:177::-;14742:29;14738:1;14730:6;14726:14;14719:53;14602:177;:::o;14785:366::-;14927:3;14948:67;15012:2;15007:3;14948:67;:::i;:::-;14941:74;;15024:93;15113:3;15024:93;:::i;:::-;15142:2;15137:3;15133:12;15126:19;;14785:366;;;:::o;15157:419::-;15323:4;15361:2;15350:9;15346:18;15338:26;;15410:9;15404:4;15400:20;15396:1;15385:9;15381:17;15374:47;15438:131;15564:4;15438:131;:::i;:::-;15430:139;;15157:419;;;:::o;15582:224::-;15722:34;15718:1;15710:6;15706:14;15699:58;15791:7;15786:2;15778:6;15774:15;15767:32;15582:224;:::o;15812:366::-;15954:3;15975:67;16039:2;16034:3;15975:67;:::i;:::-;15968:74;;16051:93;16140:3;16051:93;:::i;:::-;16169:2;16164:3;16160:12;16153:19;;15812:366;;;:::o;16184:419::-;16350:4;16388:2;16377:9;16373:18;16365:26;;16437:9;16431:4;16427:20;16423:1;16412:9;16408:17;16401:47;16465:131;16591:4;16465:131;:::i;:::-;16457:139;;16184:419;;;:::o;16609:180::-;16657:77;16654:1;16647:88;16754:4;16751:1;16744:15;16778:4;16775:1;16768:15;16795:185;16835:1;16852:20;16870:1;16852:20;:::i;:::-;16847:25;;16886:20;16904:1;16886:20;:::i;:::-;16881:25;;16925:1;16915:35;;16930:18;;:::i;:::-;16915:35;16972:1;16969;16965:9;16960:14;;16795:185;;;;:::o;16986:243::-;17126:34;17122:1;17114:6;17110:14;17103:58;17195:26;17190:2;17182:6;17178:15;17171:51;16986:243;:::o;17235:366::-;17377:3;17398:67;17462:2;17457:3;17398:67;:::i;:::-;17391:74;;17474:93;17563:3;17474:93;:::i;:::-;17592:2;17587:3;17583:12;17576:19;;17235:366;;;:::o;17607:419::-;17773:4;17811:2;17800:9;17796:18;17788:26;;17860:9;17854:4;17850:20;17846:1;17835:9;17831:17;17824:47;17888:131;18014:4;17888:131;:::i;:::-;17880:139;;17607:419;;;:::o;18032:245::-;18172:34;18168:1;18160:6;18156:14;18149:58;18241:28;18236:2;18228:6;18224:15;18217:53;18032:245;:::o;18283:366::-;18425:3;18446:67;18510:2;18505:3;18446:67;:::i;:::-;18439:74;;18522:93;18611:3;18522:93;:::i;:::-;18640:2;18635:3;18631:12;18624:19;;18283:366;;;:::o;18655:419::-;18821:4;18859:2;18848:9;18844:18;18836:26;;18908:9;18902:4;18898:20;18894:1;18883:9;18879:17;18872:47;18936:131;19062:4;18936:131;:::i;:::-;18928:139;;18655:419;;;:::o;19080:410::-;19120:7;19143:20;19161:1;19143:20;:::i;:::-;19138:25;;19177:20;19195:1;19177:20;:::i;:::-;19172:25;;19232:1;19229;19225:9;19254:30;19272:11;19254:30;:::i;:::-;19243:41;;19433:1;19424:7;19420:15;19417:1;19414:22;19394:1;19387:9;19367:83;19344:139;;19463:18;;:::i;:::-;19344:139;19128:362;19080:410;;;;:::o;19496:194::-;19536:4;19556:20;19574:1;19556:20;:::i;:::-;19551:25;;19590:20;19608:1;19590:20;:::i;:::-;19585:25;;19634:1;19631;19627:9;19619:17;;19658:1;19652:4;19649:11;19646:37;;;19663:18;;:::i;:::-;19646:37;19496:194;;;;:::o;19696:232::-;19836:34;19832:1;19824:6;19820:14;19813:58;19905:15;19900:2;19892:6;19888:15;19881:40;19696:232;:::o;19934:366::-;20076:3;20097:67;20161:2;20156:3;20097:67;:::i;:::-;20090:74;;20173:93;20262:3;20173:93;:::i;:::-;20291:2;20286:3;20282:12;20275:19;;19934:366;;;:::o;20306:419::-;20472:4;20510:2;20499:9;20495:18;20487:26;;20559:9;20553:4;20549:20;20545:1;20534:9;20530:17;20523:47;20587:131;20713:4;20587:131;:::i;:::-;20579:139;;20306:419;;;:::o;20731:224::-;20871:34;20867:1;20859:6;20855:14;20848:58;20940:7;20935:2;20927:6;20923:15;20916:32;20731:224;:::o;20961:366::-;21103:3;21124:67;21188:2;21183:3;21124:67;:::i;:::-;21117:74;;21200:93;21289:3;21200:93;:::i;:::-;21318:2;21313:3;21309:12;21302:19;;20961:366;;;:::o;21333:419::-;21499:4;21537:2;21526:9;21522:18;21514:26;;21586:9;21580:4;21576:20;21572:1;21561:9;21557:17;21550:47;21614:131;21740:4;21614:131;:::i;:::-;21606:139;;21333:419;;;:::o;21758:228::-;21898:34;21894:1;21886:6;21882:14;21875:58;21967:11;21962:2;21954:6;21950:15;21943:36;21758:228;:::o;21992:366::-;22134:3;22155:67;22219:2;22214:3;22155:67;:::i;:::-;22148:74;;22231:93;22320:3;22231:93;:::i;:::-;22349:2;22344:3;22340:12;22333:19;;21992:366;;;:::o;22364:419::-;22530:4;22568:2;22557:9;22553:18;22545:26;;22617:9;22611:4;22607:20;22603:1;22592:9;22588:17;22581:47;22645:131;22771:4;22645:131;:::i;:::-;22637:139;;22364:419;;;:::o;22789:224::-;22929:34;22925:1;22917:6;22913:14;22906:58;22998:7;22993:2;22985:6;22981:15;22974:32;22789:224;:::o;23019:366::-;23161:3;23182:67;23246:2;23241:3;23182:67;:::i;:::-;23175:74;;23258:93;23347:3;23258:93;:::i;:::-;23376:2;23371:3;23367:12;23360:19;;23019:366;;;:::o;23391:419::-;23557:4;23595:2;23584:9;23580:18;23572:26;;23644:9;23638:4;23634:20;23630:1;23619:9;23615:17;23608:47;23672:131;23798:4;23672:131;:::i;:::-;23664:139;;23391:419;;;:::o;23816:143::-;23873:5;23904:6;23898:13;23889:22;;23920:33;23947:5;23920:33;:::i;:::-;23816:143;;;;:::o;23965:351::-;24035:6;24084:2;24072:9;24063:7;24059:23;24055:32;24052:119;;;24090:79;;:::i;:::-;24052:119;24210:1;24235:64;24291:7;24282:6;24271:9;24267:22;24235:64;:::i;:::-;24225:74;;24181:128;23965:351;;;;:::o;24322:221::-;24462:34;24458:1;24450:6;24446:14;24439:58;24531:4;24526:2;24518:6;24514:15;24507:29;24322:221;:::o;24549:366::-;24691:3;24712:67;24776:2;24771:3;24712:67;:::i;:::-;24705:74;;24788:93;24877:3;24788:93;:::i;:::-;24906:2;24901:3;24897:12;24890:19;;24549:366;;;:::o;24921:419::-;25087:4;25125:2;25114:9;25110:18;25102:26;;25174:9;25168:4;25164:20;25160:1;25149:9;25145:17;25138:47;25202:131;25328:4;25202:131;:::i;:::-;25194:139;;24921:419;;;:::o;25346:223::-;25486:34;25482:1;25474:6;25470:14;25463:58;25555:6;25550:2;25542:6;25538:15;25531:31;25346:223;:::o;25575:366::-;25717:3;25738:67;25802:2;25797:3;25738:67;:::i;:::-;25731:74;;25814:93;25903:3;25814:93;:::i;:::-;25932:2;25927:3;25923:12;25916:19;;25575:366;;;:::o;25947:419::-;26113:4;26151:2;26140:9;26136:18;26128:26;;26200:9;26194:4;26190:20;26186:1;26175:9;26171:17;26164:47;26228:131;26354:4;26228:131;:::i;:::-;26220:139;;25947:419;;;:::o;26372:221::-;26512:34;26508:1;26500:6;26496:14;26489:58;26581:4;26576:2;26568:6;26564:15;26557:29;26372:221;:::o;26599:366::-;26741:3;26762:67;26826:2;26821:3;26762:67;:::i;:::-;26755:74;;26838:93;26927:3;26838:93;:::i;:::-;26956:2;26951:3;26947:12;26940:19;;26599:366;;;:::o;26971:419::-;27137:4;27175:2;27164:9;27160:18;27152:26;;27224:9;27218:4;27214:20;27210:1;27199:9;27195:17;27188:47;27252:131;27378:4;27252:131;:::i;:::-;27244:139;;26971:419;;;:::o;27396:182::-;27536:34;27532:1;27524:6;27520:14;27513:58;27396:182;:::o;27584:366::-;27726:3;27747:67;27811:2;27806:3;27747:67;:::i;:::-;27740:74;;27823:93;27912:3;27823:93;:::i;:::-;27941:2;27936:3;27932:12;27925:19;;27584:366;;;:::o;27956:419::-;28122:4;28160:2;28149:9;28145:18;28137:26;;28209:9;28203:4;28199:20;28195:1;28184:9;28180:17;28173:47;28237:131;28363:4;28237:131;:::i;:::-;28229:139;;27956:419;;;:::o;28381:179::-;28521:31;28517:1;28509:6;28505:14;28498:55;28381:179;:::o;28566:366::-;28708:3;28729:67;28793:2;28788:3;28729:67;:::i;:::-;28722:74;;28805:93;28894:3;28805:93;:::i;:::-;28923:2;28918:3;28914:12;28907:19;;28566:366;;;:::o;28938:419::-;29104:4;29142:2;29131:9;29127:18;29119:26;;29191:9;29185:4;29181:20;29177:1;29166:9;29162:17;29155:47;29219:131;29345:4;29219:131;:::i;:::-;29211:139;;28938:419;;;:::o;29363:224::-;29503:34;29499:1;29491:6;29487:14;29480:58;29572:7;29567:2;29559:6;29555:15;29548:32;29363:224;:::o;29593:366::-;29735:3;29756:67;29820:2;29815:3;29756:67;:::i;:::-;29749:74;;29832:93;29921:3;29832:93;:::i;:::-;29950:2;29945:3;29941:12;29934:19;;29593:366;;;:::o;29965:419::-;30131:4;30169:2;30158:9;30154:18;30146:26;;30218:9;30212:4;30208:20;30204:1;30193:9;30189:17;30182:47;30246:131;30372:4;30246:131;:::i;:::-;30238:139;;29965:419;;;:::o;30390:222::-;30530:34;30526:1;30518:6;30514:14;30507:58;30599:5;30594:2;30586:6;30582:15;30575:30;30390:222;:::o;30618:366::-;30760:3;30781:67;30845:2;30840:3;30781:67;:::i;:::-;30774:74;;30857:93;30946:3;30857:93;:::i;:::-;30975:2;30970:3;30966:12;30959:19;;30618:366;;;:::o;30990:419::-;31156:4;31194:2;31183:9;31179:18;31171:26;;31243:9;31237:4;31233:20;31229:1;31218:9;31214:17;31207:47;31271:131;31397:4;31271:131;:::i;:::-;31263:139;;30990:419;;;:::o;31415:225::-;31555:34;31551:1;31543:6;31539:14;31532:58;31624:8;31619:2;31611:6;31607:15;31600:33;31415:225;:::o;31646:366::-;31788:3;31809:67;31873:2;31868:3;31809:67;:::i;:::-;31802:74;;31885:93;31974:3;31885:93;:::i;:::-;32003:2;31998:3;31994:12;31987:19;;31646:366;;;:::o;32018:419::-;32184:4;32222:2;32211:9;32207:18;32199:26;;32271:9;32265:4;32261:20;32257:1;32246:9;32242:17;32235:47;32299:131;32425:4;32299:131;:::i;:::-;32291:139;;32018:419;;;:::o;32443:442::-;32592:4;32630:2;32619:9;32615:18;32607:26;;32643:71;32711:1;32700:9;32696:17;32687:6;32643:71;:::i;:::-;32724:72;32792:2;32781:9;32777:18;32768:6;32724:72;:::i;:::-;32806;32874:2;32863:9;32859:18;32850:6;32806:72;:::i;:::-;32443:442;;;;;;:::o;32891:332::-;33012:4;33050:2;33039:9;33035:18;33027:26;;33063:71;33131:1;33120:9;33116:17;33107:6;33063:71;:::i;:::-;33144:72;33212:2;33201:9;33197:18;33188:6;33144:72;:::i;:::-;32891:332;;;;;:::o;33229:251::-;33369:34;33365:1;33357:6;33353:14;33346:58;33438:34;33433:2;33425:6;33421:15;33414:59;33229:251;:::o;33486:366::-;33628:3;33649:67;33713:2;33708:3;33649:67;:::i;:::-;33642:74;;33725:93;33814:3;33725:93;:::i;:::-;33843:2;33838:3;33834:12;33827:19;;33486:366;;;:::o;33858:419::-;34024:4;34062:2;34051:9;34047:18;34039:26;;34111:9;34105:4;34101:20;34097:1;34086:9;34082:17;34075:47;34139:131;34265:4;34139:131;:::i;:::-;34131:139;;33858:419;;;:::o;34283:137::-;34337:5;34368:6;34362:13;34353:22;;34384:30;34408:5;34384:30;:::i;:::-;34283:137;;;;:::o;34426:345::-;34493:6;34542:2;34530:9;34521:7;34517:23;34513:32;34510:119;;;34548:79;;:::i;:::-;34510:119;34668:1;34693:61;34746:7;34737:6;34726:9;34722:22;34693:61;:::i;:::-;34683:71;;34639:125;34426:345;;;;:::o;34777:229::-;34917:34;34913:1;34905:6;34901:14;34894:58;34986:12;34981:2;34973:6;34969:15;34962:37;34777:229;:::o;35012:366::-;35154:3;35175:67;35239:2;35234:3;35175:67;:::i;:::-;35168:74;;35251:93;35340:3;35251:93;:::i;:::-;35369:2;35364:3;35360:12;35353:19;;35012:366;;;:::o;35384:419::-;35550:4;35588:2;35577:9;35573:18;35565:26;;35637:9;35631:4;35627:20;35623:1;35612:9;35608:17;35601:47;35665:131;35791:4;35665:131;:::i;:::-;35657:139;;35384:419;;;:::o;35809:180::-;35857:77;35854:1;35847:88;35954:4;35951:1;35944:15;35978:4;35975:1;35968:15;35995:233;36034:3;36057:24;36075:5;36057:24;:::i;:::-;36048:33;;36103:66;36096:5;36093:77;36090:103;;36173:18;;:::i;:::-;36090:103;36220:1;36213:5;36209:13;36202:20;;35995:233;;;:::o;36234:225::-;36374:34;36370:1;36362:6;36358:14;36351:58;36443:8;36438:2;36430:6;36426:15;36419:33;36234:225;:::o;36465:366::-;36607:3;36628:67;36692:2;36687:3;36628:67;:::i;:::-;36621:74;;36704:93;36793:3;36704:93;:::i;:::-;36822:2;36817:3;36813:12;36806:19;;36465:366;;;:::o;36837:419::-;37003:4;37041:2;37030:9;37026:18;37018:26;;37090:9;37084:4;37080:20;37076:1;37065:9;37061:17;37054:47;37118:131;37244:4;37118:131;:::i;:::-;37110:139;;36837:419;;;:::o;37262:98::-;37313:6;37347:5;37341:12;37331:22;;37262:98;;;:::o;37366:147::-;37467:11;37504:3;37489:18;;37366:147;;;;:::o;37519:386::-;37623:3;37651:38;37683:5;37651:38;:::i;:::-;37705:88;37786:6;37781:3;37705:88;:::i;:::-;37698:95;;37802:65;37860:6;37855:3;37848:4;37841:5;37837:16;37802:65;:::i;:::-;37892:6;37887:3;37883:16;37876:23;;37627:278;37519:386;;;;:::o;37911:271::-;38041:3;38063:93;38152:3;38143:6;38063:93;:::i;:::-;38056:100;;38173:3;38166:10;;37911:271;;;;:::o;38188:179::-;38328:31;38324:1;38316:6;38312:14;38305:55;38188:179;:::o;38373:366::-;38515:3;38536:67;38600:2;38595:3;38536:67;:::i;:::-;38529:74;;38612:93;38701:3;38612:93;:::i;:::-;38730:2;38725:3;38721:12;38714:19;;38373:366;;;:::o;38745:419::-;38911:4;38949:2;38938:9;38934:18;38926:26;;38998:9;38992:4;38988:20;38984:1;38973:9;38969:17;38962:47;39026:131;39152:4;39026:131;:::i;:::-;39018:139;;38745:419;;;:::o

Swarm Source

ipfs://544c7d2085c4021b9f83080e5980c3d5bdaff22b5c37417fc9e9009a9deac9b3
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.