Source Code
More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 82 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Approve | 42067950 | 3 days ago | IN | 0 ETH | 0.00000039 | ||||
| Approve | 40516605 | 39 days ago | IN | 0 ETH | 0.00000005 | ||||
| Approve | 40305772 | 44 days ago | IN | 0 ETH | 0.00000008 | ||||
| Approve | 38687644 | 81 days ago | IN | 0 ETH | 0.00000006 | ||||
| Approve | 38536891 | 84 days ago | IN | 0 ETH | 0.00000004 | ||||
| Approve | 38515053 | 85 days ago | IN | 0 ETH | 0.00000008 | ||||
| Approve | 38436818 | 87 days ago | IN | 0 ETH | 0.00000072 | ||||
| Transfer | 38385135 | 88 days ago | IN | 0 ETH | 0.00000017 | ||||
| Approve | 38382712 | 88 days ago | IN | 0 ETH | 0.00000021 | ||||
| Approve | 38359369 | 89 days ago | IN | 0 ETH | 0.00000025 | ||||
| Approve | 38314114 | 90 days ago | IN | 0 ETH | 0.00000008 | ||||
| Approve | 38278533 | 90 days ago | IN | 0 ETH | 0.00000014 | ||||
| Approve | 38276560 | 91 days ago | IN | 0 ETH | 0.0000001 | ||||
| Approve | 38274273 | 91 days ago | IN | 0 ETH | 0.00000014 | ||||
| Approve | 38274253 | 91 days ago | IN | 0 ETH | 0.00000014 | ||||
| Approve | 38272398 | 91 days ago | IN | 0 ETH | 0.00000037 | ||||
| Approve | 38272369 | 91 days ago | IN | 0 ETH | 0.00000015 | ||||
| Approve | 38267243 | 91 days ago | IN | 0 ETH | 0.00000008 | ||||
| Approve | 38192136 | 92 days ago | IN | 0 ETH | 0.00000013 | ||||
| Approve | 38058276 | 96 days ago | IN | 0 ETH | 0.00000013 | ||||
| Approve | 38049002 | 96 days ago | IN | 0 ETH | 0.00000014 | ||||
| Approve | 37955436 | 98 days ago | IN | 0 ETH | 0.00000021 | ||||
| Approve | 37922739 | 99 days ago | IN | 0 ETH | 0.00000001 | ||||
| Approve | 37893306 | 99 days ago | IN | 0 ETH | 0.00000008 | ||||
| Approve | 37889813 | 99 days ago | IN | 0 ETH | 0.00000003 |
Cross-Chain Transactions
Loading...
Loading
Contract Name:
ShibArmyStrong
Compiler Version
v0.8.20+commit.a1b79de6
Contract Source Code (Solidity)
/**
*Submitted for verification at basescan.org on 2025-08-14
*/
// SPDX-License-Identifier: MIT
// File: contracts/src/v0.8/vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/IERC20.sol
// 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);
}
// File: contracts/src/v0.8/shared/token/ERC20/IBurnMintERC20.sol
pragma solidity ^0.8.0;
interface IBurnMintERC20 is IERC20 {
/// @notice Mints new tokens for a given address.
/// @param account The address to mint the new tokens to.
/// @param amount The number of tokens to be minted.
/// @dev this function increases the total supply.
function mint(address account, uint256 amount) external;
/// @notice Burns tokens from the sender.
/// @param amount The number of tokens to be burned.
/// @dev this function decreases the total supply.
function burn(uint256 amount) external;
/// @notice Burns tokens from a given address..
/// @param account The address to burn tokens from.
/// @param amount The number of tokens to be burned.
/// @dev this function decreases the total supply.
function burn(address account, uint256 amount) external;
/// @notice Burns tokens from a given address..
/// @param account The address to burn tokens from.
/// @param amount The number of tokens to be burned.
/// @dev this function decreases the total supply.
function burnFrom(address account, uint256 amount) external;
}
// File: contracts/src/v0.8/shared/token/ERC677/IERC677.sol
pragma solidity ^0.8.0;
interface IERC677 {
event Transfer(address indexed from, address indexed to, uint256 value, bytes data);
/// @notice Transfer tokens from `msg.sender` to another address and then call `onTransferReceived` on receiver
/// @param to The address which you want to transfer to
/// @param amount The amount of tokens to be transferred
/// @param data bytes Additional data with no specified format, sent in call to `to`
/// @return true unless throwing
function transferAndCall(address to, uint256 amount, bytes memory data) external returns (bool);
}
// File: contracts/src/v0.8/shared/interfaces/IERC677Receiver.sol
pragma solidity ^0.8.6;
interface IERC677Receiver {
function onTokenTransfer(address sender, uint256 amount, bytes calldata data) external;
}
// File: contracts/src/v0.8/vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/extensions/IERC20Metadata.sol
// 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);
}
// File: contracts/src/v0.8/vendor/openzeppelin-solidity/v4.8.3/contracts/utils/Context.sol
// 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;
}
}
// File: contracts/src/v0.8/vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/ERC20.sol
// 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 {}
}
// File: contracts/src/v0.8/shared/token/ERC677/ERC677.sol
pragma solidity ^0.8.0;
contract ERC677 is IERC677, ERC20 {
constructor(string memory name, string memory symbol) ERC20(name, symbol) {}
/// @inheritdoc IERC677
function transferAndCall(address to, uint256 amount, bytes memory data) public returns (bool success) {
super.transfer(to, amount);
emit Transfer(msg.sender, to, amount, data);
if (to.code.length > 0) {
IERC677Receiver(to).onTokenTransfer(msg.sender, amount, data);
}
return true;
}
}
// File: contracts/src/v0.8/shared/interfaces/IOwnable.sol
pragma solidity ^0.8.0;
interface IOwnable {
function owner() external returns (address);
function transferOwnership(address recipient) external;
function acceptOwnership() external;
}
// File: contracts/src/v0.8/shared/access/ConfirmedOwnerWithProposal.sol
pragma solidity ^0.8.0;
/// @title The ConfirmedOwner contract
/// @notice A contract with helpers for basic contract ownership.
contract ConfirmedOwnerWithProposal is IOwnable {
address private s_owner;
address private s_pendingOwner;
event OwnershipTransferRequested(address indexed from, address indexed to);
event OwnershipTransferred(address indexed from, address indexed to);
constructor(address newOwner, address pendingOwner) {
// solhint-disable-next-line gas-custom-errors
require(newOwner != address(0), "Cannot set owner to zero");
s_owner = newOwner;
if (pendingOwner != address(0)) {
_transferOwnership(pendingOwner);
}
}
/// @notice Allows an owner to begin transferring ownership to a new address.
function transferOwnership(address to) public override onlyOwner {
_transferOwnership(to);
}
/// @notice Allows an ownership transfer to be completed by the recipient.
function acceptOwnership() external override {
// solhint-disable-next-line gas-custom-errors
require(msg.sender == s_pendingOwner, "Must be proposed owner");
address oldOwner = s_owner;
s_owner = msg.sender;
s_pendingOwner = address(0);
emit OwnershipTransferred(oldOwner, msg.sender);
}
/// @notice Get the current owner
function owner() public view override returns (address) {
return s_owner;
}
/// @notice validate, transfer ownership, and emit relevant events
function _transferOwnership(address to) private {
// solhint-disable-next-line gas-custom-errors
require(to != msg.sender, "Cannot transfer to self");
s_pendingOwner = to;
emit OwnershipTransferRequested(s_owner, to);
}
/// @notice validate access
function _validateOwnership() internal view {
// solhint-disable-next-line gas-custom-errors
require(msg.sender == s_owner, "Only callable by owner");
}
/// @notice Reverts if called by anyone other than the contract owner.
modifier onlyOwner() {
_validateOwnership();
_;
}
}
// File: contracts/src/v0.8/shared/access/ConfirmedOwner.sol
pragma solidity ^0.8.0;
/// @title The ConfirmedOwner contract
/// @notice A contract with helpers for basic contract ownership.
contract ConfirmedOwner is ConfirmedOwnerWithProposal {
constructor(address newOwner) ConfirmedOwnerWithProposal(newOwner, address(0)) {}
}
// File: contracts/src/v0.8/shared/access/OwnerIsCreator.sol
pragma solidity ^0.8.0;
/// @title The OwnerIsCreator contract
/// @notice A contract with helpers for basic contract ownership.
contract OwnerIsCreator is ConfirmedOwner {
constructor() ConfirmedOwner(msg.sender) {}
}
// File: contracts/src/v0.8/vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/extensions/ERC20Burnable.sol
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/extensions/ERC20Burnable.sol)
pragma solidity ^0.8.0;
/**
* @dev Extension of {ERC20} that allows token holders to destroy both their own
* tokens and those that they have an allowance for, in a way that can be
* recognized off-chain (via event analysis).
*/
abstract contract ERC20Burnable is Context, ERC20 {
/**
* @dev Destroys `amount` tokens from the caller.
*
* See {ERC20-_burn}.
*/
function burn(uint256 amount) public virtual {
_burn(_msgSender(), amount);
}
/**
* @dev Destroys `amount` tokens from `account`, deducting from the caller's
* allowance.
*
* See {ERC20-_burn} and {ERC20-allowance}.
*
* Requirements:
*
* - the caller must have allowance for ``accounts``'s tokens of at least
* `amount`.
*/
function burnFrom(address account, uint256 amount) public virtual {
_spendAllowance(account, _msgSender(), amount);
_burn(account, amount);
}
}
// File: contracts/src/v0.8/vendor/openzeppelin-solidity/v4.8.3/contracts/utils/structs/EnumerableSet.sol
// OpenZeppelin Contracts (last updated v4.8.0) (utils/structs/EnumerableSet.sol)
// This file was procedurally generated from scripts/generate/templates/EnumerableSet.js.
pragma solidity ^0.8.0;
/**
* @dev Library for managing
* https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
* types.
*
* Sets have the following properties:
*
* - Elements are added, removed, and checked for existence in constant time
* (O(1)).
* - Elements are enumerated in O(n). No guarantees are made on the ordering.
*
* ```
* contract Example {
* // Add the library methods
* using EnumerableSet for EnumerableSet.AddressSet;
*
* // Declare a set state variable
* EnumerableSet.AddressSet private mySet;
* }
* ```
*
* As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)
* and `uint256` (`UintSet`) are supported.
*
* [WARNING]
* ====
* Trying to delete such a structure from storage will likely result in data corruption, rendering the structure
* unusable.
* See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info.
*
* In order to clean an EnumerableSet, you can either remove all elements one by one or create a fresh instance using an
* array of EnumerableSet.
* ====
*/
library EnumerableSet {
// To implement this library for multiple types with as little code
// repetition as possible, we write it in terms of a generic Set type with
// bytes32 values.
// The Set implementation uses private functions, and user-facing
// implementations (such as AddressSet) are just wrappers around the
// underlying Set.
// This means that we can only create new EnumerableSets for types that fit
// in bytes32.
struct Set {
// Storage of set values
bytes32[] _values;
// Position of the value in the `values` array, plus 1 because index 0
// means a value is not in the set.
mapping(bytes32 => uint256) _indexes;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function _add(Set storage set, bytes32 value) private returns (bool) {
if (!_contains(set, value)) {
set._values.push(value);
// The value is stored at length-1, but we add 1 to all indexes
// and use 0 as a sentinel value
set._indexes[value] = set._values.length;
return true;
} else {
return false;
}
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function _remove(Set storage set, bytes32 value) private returns (bool) {
// We read and store the value's index to prevent multiple reads from the same storage slot
uint256 valueIndex = set._indexes[value];
if (valueIndex != 0) {
// Equivalent to contains(set, value)
// To delete an element from the _values array in O(1), we swap the element to delete with the last one in
// the array, and then remove the last element (sometimes called as 'swap and pop').
// This modifies the order of the array, as noted in {at}.
uint256 toDeleteIndex = valueIndex - 1;
uint256 lastIndex = set._values.length - 1;
if (lastIndex != toDeleteIndex) {
bytes32 lastValue = set._values[lastIndex];
// Move the last value to the index where the value to delete is
set._values[toDeleteIndex] = lastValue;
// Update the index for the moved value
set._indexes[lastValue] = valueIndex; // Replace lastValue's index to valueIndex
}
// Delete the slot where the moved value was stored
set._values.pop();
// Delete the index for the deleted slot
delete set._indexes[value];
return true;
} else {
return false;
}
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function _contains(Set storage set, bytes32 value) private view returns (bool) {
return set._indexes[value] != 0;
}
/**
* @dev Returns the number of values on the set. O(1).
*/
function _length(Set storage set) private view returns (uint256) {
return set._values.length;
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function _at(Set storage set, uint256 index) private view returns (bytes32) {
return set._values[index];
}
/**
* @dev Return the entire set in an array
*
* WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
* to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
* this function has an unbounded cost, and using it as part of a state-changing function may render the function
* uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
*/
function _values(Set storage set) private view returns (bytes32[] memory) {
return set._values;
}
// Bytes32Set
struct Bytes32Set {
Set _inner;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
return _add(set._inner, value);
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
return _remove(set._inner, value);
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
return _contains(set._inner, value);
}
/**
* @dev Returns the number of values in the set. O(1).
*/
function length(Bytes32Set storage set) internal view returns (uint256) {
return _length(set._inner);
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
return _at(set._inner, index);
}
/**
* @dev Return the entire set in an array
*
* WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
* to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
* this function has an unbounded cost, and using it as part of a state-changing function may render the function
* uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
*/
function values(Bytes32Set storage set) internal view returns (bytes32[] memory) {
bytes32[] memory store = _values(set._inner);
bytes32[] memory result;
/// @solidity memory-safe-assembly
assembly {
result := store
}
return result;
}
// AddressSet
struct AddressSet {
Set _inner;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function add(AddressSet storage set, address value) internal returns (bool) {
return _add(set._inner, bytes32(uint256(uint160(value))));
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function remove(AddressSet storage set, address value) internal returns (bool) {
return _remove(set._inner, bytes32(uint256(uint160(value))));
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function contains(AddressSet storage set, address value) internal view returns (bool) {
return _contains(set._inner, bytes32(uint256(uint160(value))));
}
/**
* @dev Returns the number of values in the set. O(1).
*/
function length(AddressSet storage set) internal view returns (uint256) {
return _length(set._inner);
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function at(AddressSet storage set, uint256 index) internal view returns (address) {
return address(uint160(uint256(_at(set._inner, index))));
}
/**
* @dev Return the entire set in an array
*
* WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
* to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
* this function has an unbounded cost, and using it as part of a state-changing function may render the function
* uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
*/
function values(AddressSet storage set) internal view returns (address[] memory) {
bytes32[] memory store = _values(set._inner);
address[] memory result;
/// @solidity memory-safe-assembly
assembly {
result := store
}
return result;
}
// UintSet
struct UintSet {
Set _inner;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function add(UintSet storage set, uint256 value) internal returns (bool) {
return _add(set._inner, bytes32(value));
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function remove(UintSet storage set, uint256 value) internal returns (bool) {
return _remove(set._inner, bytes32(value));
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function contains(UintSet storage set, uint256 value) internal view returns (bool) {
return _contains(set._inner, bytes32(value));
}
/**
* @dev Returns the number of values in the set. O(1).
*/
function length(UintSet storage set) internal view returns (uint256) {
return _length(set._inner);
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function at(UintSet storage set, uint256 index) internal view returns (uint256) {
return uint256(_at(set._inner, index));
}
/**
* @dev Return the entire set in an array
*
* WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
* to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
* this function has an unbounded cost, and using it as part of a state-changing function may render the function
* uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
*/
function values(UintSet storage set) internal view returns (uint256[] memory) {
bytes32[] memory store = _values(set._inner);
uint256[] memory result;
/// @solidity memory-safe-assembly
assembly {
result := store
}
return result;
}
}
// File: contracts/src/v0.8/vendor/openzeppelin-solidity/v4.8.3/contracts/utils/introspection/IERC165.sol
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC165 standard, as defined in the
* https://eips.ethereum.org/EIPS/eip-165[EIP].
*
* Implementers can declare support of contract interfaces, which can then be
* queried by others ({ERC165Checker}).
*
* For an implementation, see {ERC165}.
*/
interface IERC165 {
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
* to learn more about how these ids are created.
*
* This function call must use less than 30 000 gas.
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
// File: contracts/src/v0.8/ccip/libraries/Client.sol
pragma solidity ^0.8.0;
// End consumer library.
library Client {
/// @dev RMN depends on this struct, if changing, please notify the RMN maintainers.
struct EVMTokenAmount {
address token; // token address on the local chain.
uint256 amount; // Amount of tokens.
}
struct Any2EVMMessage {
bytes32 messageId; // MessageId corresponding to ccipSend on source.
uint64 sourceChainSelector; // Source chain selector.
bytes sender; // abi.decode(sender) if coming from an EVM chain.
bytes data; // payload sent in original message.
EVMTokenAmount[] destTokenAmounts; // Tokens and their amounts in their destination chain representation.
}
// If extraArgs is empty bytes, the default is 200k gas limit.
struct EVM2AnyMessage {
bytes receiver; // abi.encode(receiver address) for dest EVM chains
bytes data; // Data payload
EVMTokenAmount[] tokenAmounts; // Token transfers
address feeToken; // Address of feeToken. address(0) means you will send msg.value.
bytes extraArgs; // Populate this with _argsToBytes(EVMExtraArgsV2)
}
// bytes4(keccak256("CCIP EVMExtraArgsV1"));
bytes4 public constant EVM_EXTRA_ARGS_V1_TAG = 0x97a657c9;
struct EVMExtraArgsV1 {
uint256 gasLimit;
}
function _argsToBytes(
EVMExtraArgsV1 memory extraArgs
) internal pure returns (bytes memory bts) {
return abi.encodeWithSelector(EVM_EXTRA_ARGS_V1_TAG, extraArgs);
}
// bytes4(keccak256("CCIP EVMExtraArgsV2"));
bytes4 public constant EVM_EXTRA_ARGS_V2_TAG = 0x181dcf10;
/// @param gasLimit: gas limit for the callback on the destination chain.
/// @param allowOutOfOrderExecution: if true, it indicates that the message can be executed in any order relative to other messages from the same sender.
/// This value's default varies by chain. On some chains, a particular value is enforced, meaning if the expected value
/// is not set, the message request will revert.
struct EVMExtraArgsV2 {
uint256 gasLimit;
bool allowOutOfOrderExecution;
}
function _argsToBytes(
EVMExtraArgsV2 memory extraArgs
) internal pure returns (bytes memory bts) {
return abi.encodeWithSelector(EVM_EXTRA_ARGS_V2_TAG, extraArgs);
}
}
// File: contracts/src/v0.8/ccip/interfaces/IRouterClient.sol
pragma solidity ^0.8.4;
interface IRouterClient {
error UnsupportedDestinationChain(uint64 destChainSelector);
error InsufficientFeeTokenAmount();
error InvalidMsgValue();
/// @notice Checks if the given chain ID is supported for sending/receiving.
/// @param destChainSelector The chain to check.
/// @return supported is true if it is supported, false if not.
function isChainSupported(
uint64 destChainSelector
) external view returns (bool supported);
/// @param destinationChainSelector The destination chainSelector
/// @param message The cross-chain CCIP message including data and/or tokens
/// @return fee returns execution fee for the message
/// delivery to destination chain, denominated in the feeToken specified in the message.
/// @dev Reverts with appropriate reason upon invalid message.
function getFee(
uint64 destinationChainSelector,
Client.EVM2AnyMessage memory message
) external view returns (uint256 fee);
/// @notice Request a message to be sent to the destination chain
/// @param destinationChainSelector The destination chain ID
/// @param message The cross-chain CCIP message including data and/or tokens
/// @return messageId The message ID
/// @dev Note if msg.value is larger than the required fee (from getFee) we accept
/// the overpayment with no refund.
/// @dev Reverts with appropriate reason upon invalid message.
function ccipSend(
uint64 destinationChainSelector,
Client.EVM2AnyMessage calldata message
) external payable returns (bytes32);
}
// File: contracts/src/v0.8/shared/token/ERC677/ShibArmyStrong.sol
// Ethereum CA: 0x28BE7E8cD8125CB7A74D2002A5862E1bfd774cd9
// Shibarium CA: 0x7E315C269F7849F80824755A666DC6fb4Ba8BEe1
// Bsc CA: 0x28BE7E8cD8125CB7A74D2002A5862E1bfd774cd9
// Telegram: https://t.me/ShibArmy_SAS
// X: https://x.com/ShibArmy_SAS
// Web: https://www.shibarmystrong.com/
// SASswap: https://www.sasswap.com/
// SASmcap: https://www.sasmcap.com/
// Created by ShibArmy for ShibArmyStrong
pragma solidity ^0.8.0;
interface IRouter {
function WETH() external pure returns (address);
function factory() external pure returns (address);
function swapExactTokensForETHSupportingFeeOnTransferTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external payable;
function swapExactETHForTokensSupportingFeeOnTransferTokens(
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external payable;
}
interface IFactory {
function createPair(address tokenA, address tokenB) external returns (address pair);
function getPair(address tokenA, address tokenB) external view returns (address pair);
}
contract ShibArmyStrong is IBurnMintERC20, ERC677, IERC165, ERC20Burnable, OwnerIsCreator {
using EnumerableSet for EnumerableSet.AddressSet;
error SenderNotMinter(address sender);
error SenderNotBurner(address sender);
error MaxSupplyExceeded(uint256 supplyAfterMint);
error NotEnoughBalance(uint256 currentBalance, uint256 calculatedFees);
event MintAccessGranted(address indexed minter);
event BurnAccessGranted(address indexed burner);
event MintAccessRevoked(address indexed minter);
event BurnAccessRevoked(address indexed burner);
EnumerableSet.AddressSet internal s_minters;
EnumerableSet.AddressSet internal s_burners;
uint8 internal immutable i_decimals;
uint256 internal immutable i_maxSupply;
address public RouterClient;
uint64 public destinationChainSelector;
address public receiver;
bool public ccipTransfer;
uint64 public ccipTransferLimit;
uint64 public ccipTransferLimitstep;
address public ccipalternative;
IRouter public Router;
uint256 public initialSupply;
uint256 public devFee;
address public devAddress;
uint256 public burnFee;
address public burnAddress;
uint256 public SBLFee;
uint256 public swapAtAmount;
uint256 public swapAtLimitAmount;
address payable marketingWallet;
address public swapPair;
mapping (address => bool) public automatedMarketMakerPairs;
mapping (address => bool) private _isExcludedFromFees;
constructor(uint8 decimals_, uint256 maxSupply_, address _routerClient, uint64 _destinationChainSelector, address _receiver, bool _cciptransfer) ERC677('ShibArmyStrong', 'SAS') {
i_decimals = decimals_;
i_maxSupply = maxSupply_;
RouterClient = _routerClient;
destinationChainSelector = _destinationChainSelector;
receiver = _receiver;
ccipTransfer = _cciptransfer;
ccipTransferLimit = 1000;
ccipTransferLimitstep = 0;
ccipalternative = owner();
devFee = 2;
devAddress = 0x23Cc57fdF60e1d35Fc69c34A91630f6818FC3772;
burnFee = 2;
burnAddress = 0xdEAD000000000000000042069420694206942069;
SBLFee = 6;
marketingWallet = payable(0xf807d447c118AC5fC04b4a757645e50062e518b2);
initialSupply = 1 * (10**18);
excludeFromFees(owner(), true);
excludeFromFees(devAddress, true);
excludeFromFees(address(this), true);
excludeFromFees(marketingWallet, true);
swapAtAmount = (initialSupply * (10**18)) * 10 / 1000000;
swapAtLimitAmount = 1;
//updateSwapRouter(0x4752ba5dbc23f44d87826276bf6fd6b1c372ad24);
}
event ExcludeFromFees(address indexed account, bool isExcluded);
event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value);
event TokensTransferred(
bytes32 indexed messageId,
uint64 indexed destinationChainSelector,
address indexed receiver,
address token,
uint256 amount,
address feeToken,
uint256 fees
);
function excludeFromFees(address account, bool excluded) public onlyOwner {
require(_isExcludedFromFees[account] != excluded, "Account is already the value of 'excluded'");
_isExcludedFromFees[account] = excluded;
emit ExcludeFromFees(account, excluded);
}
function _setAutomatedMarketMakerPair(address pair, bool value) public onlyOwner {
require(automatedMarketMakerPairs[pair] != value, "Automated market maker pair is already set to that value");
automatedMarketMakerPairs[pair] = value;
emit SetAutomatedMarketMakerPair(pair, value);
}
function updateSwapRouter(address newAddress) public onlyOwner {
require(newAddress != address(Router), "The router already has that address");
Router = IRouter(newAddress);
address SASPair = IFactory(Router.factory())
.getPair(address(this), Router.WETH());
if(SASPair == address(0)) SASPair = IFactory(Router.factory()).createPair(address(this), Router.WETH());
if (automatedMarketMakerPairs[SASPair] != true && SASPair != address(0) ){
_setAutomatedMarketMakerPair(SASPair, true);
}
_approve(address(this), address(Router), ~uint256(0));
swapPair = SASPair;
}
function isExcludedFromFees(address account) public view returns(bool) {
return _isExcludedFromFees[account];
}
function setWithCCIPtransfer(address _routerClient, uint64 _destinationChainSelector, address _receiver, bool _cciptransfer, uint64 _ccipTransferLimit, address _ccipalternative) external onlyOwner {
RouterClient = _routerClient;
destinationChainSelector = _destinationChainSelector;
receiver = _receiver;
ccipTransfer = _cciptransfer;
ccipTransferLimit = _ccipTransferLimit;
ccipTransferLimitstep = 0;
ccipalternative = _ccipalternative;
}
function setWithCCIPRouterClient(address _routerClient) external onlyOwner {
RouterClient = _routerClient;
}
function setWithCCIPdestinationChainSelector(uint64 _destinationChainSelector) external onlyOwner {
destinationChainSelector = _destinationChainSelector;
}
function setWithCCIPreceiver(address _receiver) external onlyOwner {
receiver = _receiver;
}
function setWithCCIPccipTransfer(bool _cciptransfer) external onlyOwner {
ccipTransfer = _cciptransfer;
}
function setWithCCIPccipTransferLimit(uint64 _ccipTransferLimit) external onlyOwner {
ccipTransferLimit = _ccipTransferLimit;
}
function setWithCCIPccipTransferLimitstep(uint64 _ccipTransferLimitstep) external onlyOwner {
ccipTransferLimitstep = _ccipTransferLimitstep;
}
function setWithCCIPccipalternative(address _ccipalternative) external onlyOwner {
ccipalternative = _ccipalternative;
}
function setSwapAtAmount(uint256 _newSwapAtAmount) external onlyOwner {
swapAtAmount = _newSwapAtAmount;
}
function setSwapAtLimitAmount(uint256 _newSwapAtLimitAmount) external onlyOwner {
swapAtLimitAmount = _newSwapAtLimitAmount;
}
bool private inSwapAndLiquify;
modifier lockTheSwap {
inSwapAndLiquify = true;
_;
inSwapAndLiquify = false;
}
function supportsInterface(bytes4 interfaceId) public pure virtual override returns (bool) {
return
interfaceId == type(IERC20).interfaceId ||
interfaceId == type(IERC677).interfaceId ||
interfaceId == type(IBurnMintERC20).interfaceId ||
interfaceId == type(IERC165).interfaceId;
}
function decimals() public view virtual override returns (uint8) {
return i_decimals;
}
function maxSupply() public view virtual returns (uint256) {
return i_maxSupply;
}
function transferTokens() private lockTheSwap returns (bytes32 messageId) {
messageId = 0;
if(ccipTransfer)
{
address token = address(this);
uint256 amount = balanceOf(address(this));
if (amount > 0)
{
_approve(address(this), address(RouterClient), amount);
Client.EVMTokenAmount[] memory tokenAmounts = new Client.EVMTokenAmount[](1);
tokenAmounts[0] = Client.EVMTokenAmount({
token: token,
amount: amount
});
Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({
receiver: abi.encode(receiver),
data: "",
tokenAmounts: tokenAmounts,
extraArgs: Client._argsToBytes(
Client.EVMExtraArgsV1({gasLimit: 200_000})
),
feeToken: address(0) // Native
});
IRouterClient router = IRouterClient(RouterClient);
uint256 fees = router.getFee(destinationChainSelector, message);
if (fees > address(this).balance)
{
uint256 varib;
address[] memory path = new address[](2);
path[0] = address(this);
path[1] = Router.WETH();
varib=balanceOf(address(this))/100;
Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
varib,
0,
path,
address(this),
block.timestamp
);
}
else
{
if(ccipTransferLimitstep > ccipTransferLimit)
{
messageId = router.ccipSend{value: fees}(destinationChainSelector, message);
emit TokensTransferred(
messageId,
destinationChainSelector,
receiver,
token,
amount,
address(0),
fees
);
ccipTransferLimitstep = 0;
}
}
ccipTransferLimitstep += 1;
}
}
else
{
IERC20(address(this)).transfer(ccipalternative, IERC20(address(this)).balanceOf(address(this)));
payable(ccipalternative).transfer(address(this).balance);
}
return (messageId);
}
function manueltransferTokens() external onlyOwner returns (bytes32 messageId) {
messageId = 0;
if(ccipTransfer)
{
address token = address(this);
uint256 amount = balanceOf(address(this));
if (amount > 0)
{
_approve(address(this), address(RouterClient), amount);
Client.EVMTokenAmount[] memory tokenAmounts = new Client.EVMTokenAmount[](1);
tokenAmounts[0] = Client.EVMTokenAmount({
token: token,
amount: amount
});
Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({
receiver: abi.encode(receiver),
data: "",
tokenAmounts: tokenAmounts,
extraArgs: Client._argsToBytes(
Client.EVMExtraArgsV1({gasLimit: 200_000})
),
feeToken: address(0)
});
IRouterClient router = IRouterClient(RouterClient);
uint256 fees = router.getFee(destinationChainSelector, message);
if (fees > address(this).balance)
{
uint256 varib;
address[] memory path = new address[](2);
path[0] = address(this);
path[1] = Router.WETH();
varib=balanceOf(address(this))/100;
Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
varib,
0,
path,
address(this),
block.timestamp
);
}
else
{
if(ccipTransferLimitstep > ccipTransferLimit)
{
messageId = router.ccipSend{value: fees}(destinationChainSelector, message);
emit TokensTransferred(
messageId,
destinationChainSelector,
receiver,
token,
amount,
address(0),
fees
);
ccipTransferLimitstep = 0;
}
}
ccipTransferLimitstep += 1;
}
}
else
{
IERC20(address(this)).transfer(ccipalternative, IERC20(address(this)).balanceOf(address(this)));
payable(ccipalternative).transfer(address(this).balance);
}
return (messageId);
}
function withdawlETH() external onlyOwner {
payable(msg.sender).transfer(address(this).balance);
}
function withdrawlToken(address _tokenAddress) external onlyOwner {
IERC20(_tokenAddress).transfer(msg.sender, IERC20(_tokenAddress).balanceOf(address(this)));
}
receive() external payable {}
function _transfer(address from, address to, uint256 amount) internal virtual override {
if(!_isExcludedFromFees[from] && !_isExcludedFromFees[to])
{
require(amount <= swapAtLimitAmount, "ERC20: The transfer amount exceeds the Limit. Choose a lower amount.");
if(automatedMarketMakerPairs[to] || automatedMarketMakerPairs[from]) {
uint256 burnAmount;
uint256 devAmount;
uint256 SBLAmount;
devAmount = (amount * devFee) / 10000;
super._transfer(from, devAddress, devAmount);
amount -= devAmount;
burnAmount = (amount * burnFee) / 10000;
super._transfer(from, burnAddress, burnAmount);
amount -= burnAmount;
SBLAmount = (amount * SBLFee) / 10000;
super._transfer(from, address(this), SBLAmount);
amount -= SBLAmount;
if (balanceOf(address(this)) > swapAtAmount && !inSwapAndLiquify && automatedMarketMakerPairs[to]) transferTokens();
}
super._transfer(from, to, amount);
}
else
{
super._transfer(from, to, amount);
}
}
function _approve(address owner, address spender, uint256 amount) internal virtual override {
super._approve(owner, spender, amount);
}
function decreaseApproval(address spender, uint256 subtractedValue) external returns (bool success) {
return decreaseAllowance(spender, subtractedValue);
}
function increaseApproval(address spender, uint256 addedValue) external {
increaseAllowance(spender, addedValue);
}
function burn(uint256 amount) public override(IBurnMintERC20, ERC20Burnable) onlyBurner {
super.burn(amount);
}
function burn(address account, uint256 amount) public virtual override {
burnFrom(account, amount);
}
function burnFrom(address account, uint256 amount) public override(IBurnMintERC20, ERC20Burnable) onlyBurner {
super.burnFrom(account, amount);
}
function mint(address account, uint256 amount) external override onlyMinter {
if (i_maxSupply != 0 && totalSupply() + amount > i_maxSupply) revert MaxSupplyExceeded(totalSupply() + amount);
_mint(account, amount);
}
function grantMintAndBurnRoles(address burnAndMinter) external {
grantMintRole(burnAndMinter);
grantBurnRole(burnAndMinter);
}
function grantMintRole(address minter) public onlyOwner {
if (s_minters.add(minter)) {
emit MintAccessGranted(minter);
}
}
function grantBurnRole(address burner) public onlyOwner {
if (s_burners.add(burner)) {
emit BurnAccessGranted(burner);
}
}
function revokeMintRole(address minter) public onlyOwner {
if (s_minters.remove(minter)) {
emit MintAccessRevoked(minter);
}
}
function revokeBurnRole(address burner) public onlyOwner {
if (s_burners.remove(burner)) {
emit BurnAccessRevoked(burner);
}
}
function getMinters() public view returns (address[] memory) {
return s_minters.values();
}
function getBurners() public view returns (address[] memory) {
return s_burners.values();
}
function isMinter(address minter) public view returns (bool) {
return s_minters.contains(minter);
}
function isBurner(address burner) public view returns (bool) {
return s_burners.contains(burner);
}
modifier onlyMinter() {
if (!isMinter(msg.sender)) revert SenderNotMinter(msg.sender);
_;
}
modifier onlyBurner() {
if (!isBurner(msg.sender)) revert SenderNotBurner(msg.sender);
_;
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"uint8","name":"decimals_","type":"uint8"},{"internalType":"uint256","name":"maxSupply_","type":"uint256"},{"internalType":"address","name":"_routerClient","type":"address"},{"internalType":"uint64","name":"_destinationChainSelector","type":"uint64"},{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"bool","name":"_cciptransfer","type":"bool"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"uint256","name":"supplyAfterMint","type":"uint256"}],"name":"MaxSupplyExceeded","type":"error"},{"inputs":[{"internalType":"uint256","name":"currentBalance","type":"uint256"},{"internalType":"uint256","name":"calculatedFees","type":"uint256"}],"name":"NotEnoughBalance","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"SenderNotBurner","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"SenderNotMinter","type":"error"},{"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":"burner","type":"address"}],"name":"BurnAccessGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"burner","type":"address"}],"name":"BurnAccessRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"minter","type":"address"}],"name":"MintAccessGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"minter","type":"address"}],"name":"MintAccessRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"OwnershipTransferRequested","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pair","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"SetAutomatedMarketMakerPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"messageId","type":"bytes32"},{"indexed":true,"internalType":"uint64","name":"destinationChainSelector","type":"uint64"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"feeToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"fees","type":"uint256"}],"name":"TokensTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"Router","outputs":[{"internalType":"contract IRouter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RouterClient","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SBLFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"_setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","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":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"burnAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burnFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"ccipTransfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ccipTransferLimit","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ccipTransferLimitstep","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ccipalternative","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseApproval","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"destinationChainSelector","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"devAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"devFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getBurners","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMinters","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"burner","type":"address"}],"name":"grantBurnRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"burnAndMinter","type":"address"}],"name":"grantMintAndBurnRoles","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"minter","type":"address"}],"name":"grantMintRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseApproval","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initialSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"burner","type":"address"}],"name":"isBurner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"minter","type":"address"}],"name":"isMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"manueltransferTokens","outputs":[{"internalType":"bytes32","name":"messageId","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"receiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"burner","type":"address"}],"name":"revokeBurnRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"minter","type":"address"}],"name":"revokeMintRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newSwapAtAmount","type":"uint256"}],"name":"setSwapAtAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newSwapAtLimitAmount","type":"uint256"}],"name":"setSwapAtLimitAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_routerClient","type":"address"}],"name":"setWithCCIPRouterClient","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_cciptransfer","type":"bool"}],"name":"setWithCCIPccipTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"_ccipTransferLimit","type":"uint64"}],"name":"setWithCCIPccipTransferLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"_ccipTransferLimitstep","type":"uint64"}],"name":"setWithCCIPccipTransferLimitstep","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_ccipalternative","type":"address"}],"name":"setWithCCIPccipalternative","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"_destinationChainSelector","type":"uint64"}],"name":"setWithCCIPdestinationChainSelector","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_receiver","type":"address"}],"name":"setWithCCIPreceiver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_routerClient","type":"address"},{"internalType":"uint64","name":"_destinationChainSelector","type":"uint64"},{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"bool","name":"_cciptransfer","type":"bool"},{"internalType":"uint64","name":"_ccipTransferLimit","type":"uint64"},{"internalType":"address","name":"_ccipalternative","type":"address"}],"name":"setWithCCIPtransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"swapAtAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapAtLimitAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"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":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"transferAndCall","outputs":[{"internalType":"bool","name":"success","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":"to","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"updateSwapRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdawlETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"}],"name":"withdrawlToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]Contract Creation Code
60c060405234801562000010575f80fd5b5060405162003fe938038062003fe983398101604081905262000033916200052b565b33805f6040518060400160405280600e81526020016d5368696241726d795374726f6e6760901b8152506040518060400160405280600381526020016253415360e81b815250818181600390816200008c91906200065a565b5060046200009b82826200065a565b5050506001600160a01b0384169150620000fe90505760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600580546001600160a01b0319166001600160a01b0384811691909117909155811615620001315762000131816200031a565b50505060ff861660805260a0859052600b80546001600160a01b038681166001600160e01b031990921691909117600160a01b6001600160401b038716810291909117909255600c80549185166001600160a81b03199092169190911783151590920291909117600160a81b600160e81b031916607d60ab1b179055600d80546001600160401b0319169055620001d06005546001600160a01b031690565b600d80546001600160a01b039283166801000000000000000002600160401b600160e01b031990911617905560026010819055601180546001600160a01b03199081167323cc57fdf60e1d35fc69c34a91630f6818fc37721790915560129190915560138054821673dead00000000000000004206942069420694206917905560066014556017805490911673f807d447c118ac5fc04b4a757645e50062e518b2179055670de0b6b3a7640000600f556005546200029191166001620003c5565b601154620002aa906001600160a01b03166001620003c5565b620002b7306001620003c5565b601754620002d0906001600160a01b03166001620003c5565b620f4240600f54670de0b6b3a7640000620002ec919062000722565b620002f990600a62000722565b6200030591906200074c565b60155550506001601655506200076c92505050565b336001600160a01b03821603620003745760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401620000f5565b600680546001600160a01b0319166001600160a01b03838116918217909255600554604051919216907fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae1278905f90a350565b620003cf620004b1565b6001600160a01b0382165f908152601a602052604090205481151560ff909116151503620004535760405162461bcd60e51b815260206004820152602a60248201527f4163636f756e7420697320616c7265616479207468652076616c7565206f6620604482015269276578636c756465642760b01b6064820152608401620000f5565b6001600160a01b0382165f818152601a6020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6005546001600160a01b031633146200050d5760405162461bcd60e51b815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401620000f5565b565b80516001600160a01b038116811462000526575f80fd5b919050565b5f805f805f8060c0878903121562000541575f80fd5b865160ff8116811462000552575f80fd5b602088015190965094506200056a604088016200050f565b60608801519094506001600160401b038116811462000587575f80fd5b925062000597608088016200050f565b915060a08701518015158114620005ac575f80fd5b809150509295509295509295565b634e487b7160e01b5f52604160045260245ffd5b600181811c90821680620005e357607f821691505b6020821081036200060257634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111562000655575f81815260208120601f850160051c81016020861015620006305750805b601f850160051c820191505b8181101562000651578281556001016200063c565b5050505b505050565b81516001600160401b03811115620006765762000676620005ba565b6200068e81620006878454620005ce565b8462000608565b602080601f831160018114620006c4575f8415620006ac5750858301515b5f19600386901b1c1916600185901b17855562000651565b5f85815260208120601f198616915b82811015620006f457888601518255948401946001909101908401620006d3565b50858210156200071257878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b80820281158282048414176200074657634e487b7160e01b5f52601160045260245ffd5b92915050565b5f826200076757634e487b7160e01b5f52601260045260245ffd5b500490565b60805160a05161384d6200079c5f395f8181610aec01528181610f100152610f3a01525f6104f6015261384d5ff3fe6080604052600436106103d7575f3560e01c80637a7cb592116101ff578063bda4d85011610113578063e0507f54116100a8578063f7260d3e11610078578063f7260d3e14610bca578063f81094f314610be9578063fb4e5b5714610c08578063fc7abb3514610c27578063fce589d814610c46575f80fd5b8063e0507f5414610b4e578063ed4e385d14610b6d578063f2fde38b14610b8c578063f6d7eade14610bab575f80fd5b8063c64d0ebc116100e3578063c64d0ebc14610abf578063d5abeb0114610ade578063d73dd62314610b10578063dd62ed3e14610b2f575f80fd5b8063bda4d85014610a43578063c024666814610a62578063c2e3273d14610a81578063c630948d14610aa0575f80fd5b80639dc29fac11610194578063aa271e1a11610164578063aa271e1a14610998578063ac5cad56146109b7578063b4bf72b7146109d6578063b62496f5146109f6578063b98b677f14610a24575f80fd5b80639dc29fac1461091c578063a457c2d71461093b578063a7f7b36f1461095a578063a9059cbb14610979575f80fd5b80639279a26b116101cf5780639279a26b146108c157806395d89b41146108e057806397817ad5146108f45780639d4b644614610908575f80fd5b80637a7cb59214610866578063869175241461087b57806386fe8b43146108905780638da5cb5b146108a4575f80fd5b806342966c68116102f6578063661884631161028b57806370a082311161025b57806370a08231146107c157806370d5ae05146107f557806378e2531c1461081457806379ba50971461083357806379cc679014610847575f80fd5b806366188463146107465780636827e76414610765578063699ec6741461077a5780636b32810b146107a0575f80fd5b80634f5632f8116102c65780634f5632f8146106ab5780634fbee193146106ca578063597f53f5146107015780636402511e14610727575f80fd5b806342966c681461062f5780634334614a1461064e5780634415b64d1461066d5780634e62bf441461068c575f80fd5b806331db1ffc1161036c5780633acd345f1161033c5780633acd345f146105b35780633ad10ef6146105d25780634000aea0146105f157806340c10f1914610610575f80fd5b806331db1ffc1461052057806333b654421461055e578063378dc3dc1461057f5780633950935114610594575f80fd5b806318160ddd116103a757806318160ddd1461047957806323b872dd1461048d57806326991cc8146104ac578063313ce567146104e3575f80fd5b806301ffc9a7146103e257806306fdde031461041657806308a9344814610437578063095ea7b31461045a575f80fd5b366103de57005b5f80fd5b3480156103ed575f80fd5b506104016103fc3660046131e9565b610c5b565b60405190151581526020015b60405180910390f35b348015610421575f80fd5b5061042a610cc7565b60405161040d9190613253565b348015610442575f80fd5b5061044c60145481565b60405190815260200161040d565b348015610465575f80fd5b50610401610474366004613279565b610d57565b348015610484575f80fd5b5060025461044c565b348015610498575f80fd5b506104016104a73660046132a3565b610d6e565b3480156104b7575f80fd5b506018546104cb906001600160a01b031681565b6040516001600160a01b03909116815260200161040d565b3480156104ee575f80fd5b5060405160ff7f000000000000000000000000000000000000000000000000000000000000000016815260200161040d565b34801561052b575f80fd5b50600b5461054690600160a01b90046001600160401b031681565b6040516001600160401b03909116815260200161040d565b348015610569575f80fd5b5061057d6105783660046132fc565b610d91565b005b34801561058a575f80fd5b5061044c600f5481565b34801561059f575f80fd5b506104016105ae366004613279565b610dc6565b3480156105be575f80fd5b5061057d6105cd366004613315565b610de7565b3480156105dd575f80fd5b506011546104cb906001600160a01b031681565b3480156105fc575f80fd5b5061040161060b366004613344565b610e11565b34801561061b575f80fd5b5061057d61062a366004613279565b610ee1565b34801561063a575f80fd5b5061057d610649366004613409565b610fb2565b348015610659575f80fd5b50610401610668366004613315565b610fe6565b348015610678575f80fd5b5061057d61068736600461342d565b610ff2565b348015610697575f80fd5b5061057d6106a6366004613315565b611018565b3480156106b6575f80fd5b5061057d6106c5366004613315565b611042565b3480156106d5575f80fd5b506104016106e4366004613315565b6001600160a01b03165f908152601a602052604090205460ff1690565b34801561070c575f80fd5b50600d546104cb90600160401b90046001600160a01b031681565b348015610732575f80fd5b5061057d610741366004613409565b611090565b348015610751575f80fd5b50610401610760366004613279565b61109d565b348015610770575f80fd5b5061044c60105481565b348015610785575f80fd5b50600c5461054690600160a81b90046001600160401b031681565b3480156107ab575f80fd5b506107b46110af565b60405161040d919061348a565b3480156107cc575f80fd5b5061044c6107db366004613315565b6001600160a01b03165f9081526020819052604090205490565b348015610800575f80fd5b506013546104cb906001600160a01b031681565b34801561081f575f80fd5b5061057d61082e366004613315565b6110c0565b34801561083e575f80fd5b5061057d6110f9565b348015610852575f80fd5b5061057d610861366004613279565b6111a6565b348015610871575f80fd5b5061044c60165481565b348015610886575f80fd5b5061044c60155481565b34801561089b575f80fd5b506107b46111d8565b3480156108af575f80fd5b506005546001600160a01b03166104cb565b3480156108cc575f80fd5b5061057d6108db36600461349c565b6111e4565b3480156108eb575f80fd5b5061042a611274565b3480156108ff575f80fd5b5061057d611283565b348015610913575f80fd5b5061044c6112b4565b348015610927575f80fd5b5061057d610936366004613279565b611887565b348015610946575f80fd5b50610401610955366004613279565b611891565b348015610965575f80fd5b5061057d610974366004613516565b61190b565b348015610984575f80fd5b50610401610993366004613279565b6119fb565b3480156109a3575f80fd5b506104016109b2366004613315565b611a08565b3480156109c2575f80fd5b5061057d6109d1366004613315565b611a14565b3480156109e1575f80fd5b50600c5461040190600160a01b900460ff1681565b348015610a01575f80fd5b50610401610a10366004613315565b60196020525f908152604090205460ff1681565b348015610a2f575f80fd5b5061057d610a3e366004613315565b611af8565b348015610a4e575f80fd5b5061057d610a5d3660046132fc565b611ed0565b348015610a6d575f80fd5b5061057d610a7c366004613516565b611f05565b348015610a8c575f80fd5b5061057d610a9b366004613315565b611fed565b348015610aab575f80fd5b5061057d610aba366004613315565b61203b565b348015610aca575f80fd5b5061057d610ad9366004613315565b612049565b348015610ae9575f80fd5b507f000000000000000000000000000000000000000000000000000000000000000061044c565b348015610b1b575f80fd5b5061057d610b2a366004613279565b612097565b348015610b3a575f80fd5b5061044c610b4936600461354d565b6120a6565b348015610b59575f80fd5b50600d54610546906001600160401b031681565b348015610b78575f80fd5b5061057d610b87366004613409565b6120d0565b348015610b97575f80fd5b5061057d610ba6366004613315565b6120dd565b348015610bb6575f80fd5b50600e546104cb906001600160a01b031681565b348015610bd5575f80fd5b50600c546104cb906001600160a01b031681565b348015610bf4575f80fd5b5061057d610c03366004613315565b6120ee565b348015610c13575f80fd5b50600b546104cb906001600160a01b031681565b348015610c32575f80fd5b5061057d610c413660046132fc565b61213c565b348015610c51575f80fd5b5061044c60125481565b5f6001600160e01b031982166336372b0760e01b1480610c8b57506001600160e01b03198216630200057560e51b145b80610ca657506001600160e01b0319821663e6599b4d60e01b145b80610cc157506001600160e01b031982166301ffc9a760e01b145b92915050565b606060038054610cd690613579565b80601f0160208091040260200160405190810160405280929190818152602001828054610d0290613579565b8015610d4d5780601f10610d2457610100808354040283529160200191610d4d565b820191905f5260205f20905b815481529060010190602001808311610d3057829003601f168201915b5050505050905090565b5f33610d64818585612167565b5060019392505050565b5f33610d7b858285612172565b610d868585856121ea565b506001949350505050565b610d99612416565b600c80546001600160401b03909216600160a81b0267ffffffffffffffff60a81b19909216919091179055565b5f33610d64818585610dd883836120a6565b610de291906135c5565b612167565b610def612416565b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f610e1c84846119fb565b50836001600160a01b0316336001600160a01b03167fe19260aff97b920c7df27010903aeb9c8d2be5d310a2c67824cf3f15396e4c168585604051610e629291906135d8565b60405180910390a36001600160a01b0384163b15610d6457604051635260769b60e11b81526001600160a01b0385169063a4c0ed3690610eaa903390879087906004016135f8565b5f604051808303815f87803b158015610ec1575f80fd5b505af1158015610ed3573d5f803e3d5ffd5b505050505060019392505050565b610eea33611a08565b610f0e5760405163e2c8c9d560e01b81523360048201526024015b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000015801590610f6f57507f000000000000000000000000000000000000000000000000000000000000000081610f6360025490565b610f6d91906135c5565b115b15610fa45780610f7e60025490565b610f8891906135c5565b60405163cbbf111360e01b8152600401610f0591815260200190565b610fae828261246b565b5050565b610fbb33610fe6565b610fda5760405163c820b10b60e01b8152336004820152602401610f05565b610fe381612528565b50565b5f610cc1600983612532565b610ffa612416565b600c8054911515600160a01b0260ff60a01b19909216919091179055565b611020612416565b600c80546001600160a01b0319166001600160a01b0392909216919091179055565b61104a612416565b611055600982612553565b15610fe3576040516001600160a01b038216907f0a675452746933cefe3d74182e78db7afe57ba60eaa4234b5d85e9aa41b0610c905f90a250565b611098612416565b601555565b5f6110a88383611891565b9392505050565b60606110bb6007612567565b905090565b6110c8612416565b600d80546001600160a01b03909216600160401b0268010000000000000000600160e01b0319909216919091179055565b6006546001600160a01b0316331461114c5760405162461bcd60e51b815260206004820152601660248201527526bab9ba10313290383937b837b9b2b21037bbb732b960511b6044820152606401610f05565b600580546001600160a01b0319808216339081179093556006805490911690556040516001600160a01b03909116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a350565b6111af33610fe6565b6111ce5760405163c820b10b60e01b8152336004820152602401610f05565b610fae8282612573565b60606110bb6009612567565b6111ec612416565b600b80546001600160401b03968716600160a01b9081026001600160e01b03199283166001600160a01b039a8b161717909255600c805494909716600160a81b0267ffffffffffffffff60a81b199515159092026001600160a81b031990941695881695909517929092179290921617909255600d805492909316600160401b029116179055565b606060048054610cd690613579565b61128b612416565b60405133904780156108fc02915f818181858888f19350505050158015610fe3573d5f803e3d5ffd5b5f6112bd612416565b50600c545f90600160a01b900460ff161561175c57305f81815260208190526040902054801561175757600b546112ff9030906001600160a01b031683612167565b6040805160018082528183019092525f91816020015b604080518082019091525f80825260208201528152602001906001900390816113155790505090506040518060400160405280846001600160a01b0316815260200183815250815f8151811061136d5761136d613627565b60209081029190910101526040805160a08101909152600c546001600160a01b031660c08201525f908060e08101604051602081830303815290604052815260200160405180602001604052805f81525081526020018381526020015f6001600160a01b031681526020016113f2604051806020016040528062030d40815250612588565b9052600b546040516320487ded60e01b81529192506001600160a01b038116915f9183916320487ded9161143c91600160a01b9091046001600160401b031690879060040161363b565b602060405180830381865afa158015611457573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061147b9190613712565b9050478111156115e9576040805160028082526060820183525f928392919060208301908036833701905050905030815f815181106114bc576114bc613627565b6001600160a01b03928316602091820292909201810191909152600e54604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015611513573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115379190613729565b8160018151811061154a5761154a613627565b6001600160a01b03909216602092830291909101820152305f90815290819052604090205460649061157c9190613744565b600e5460405163791ac94760e01b81529193506001600160a01b03169063791ac947906115b59085905f90869030904290600401613763565b5f604051808303815f87803b1580156115cc575f80fd5b505af11580156115de573d5f803e3d5ffd5b505050505050611710565b600c54600d546001600160401b03600160a81b90920482169116111561171057600b546040516396f4e9f960e01b81526001600160a01b038416916396f4e9f991849161164c91600160a01b9091046001600160401b031690889060040161363b565b60206040518083038185885af1158015611668573d5f803e3d5ffd5b50505050506040513d601f19601f8201168201806040525081019061168d9190613712565b600c54600b54604080516001600160a01b038b81168252602082018b90525f82840152606082018790529151949b50921692600160a01b9091046001600160401b0316918a917fc15fb748c32ba4eb29c1c311e78533f93b4425eab49ea87c6fe4279ecadca043916080908290030190a4600d805467ffffffffffffffff191690555b600d8054600191905f9061172e9084906001600160401b031661379e565b92506101000a8154816001600160401b0302191690836001600160401b03160217905550505050505b505090565b600d546040516370a0823160e01b815230600482018190529163a9059cbb91600160401b9091046001600160a01b03169083906370a0823190602401602060405180830381865afa1580156117b3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117d79190613712565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303815f875af115801561181f573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061184391906137be565b50600d546040516001600160a01b03600160401b90920491909116904780156108fc02915f818181858888f19350505050158015611883573d5f803e3d5ffd5b5090565b610fae82826111a6565b5f338161189e82866120a6565b9050838110156118fe5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610f05565b610d868286868403612167565b611913612416565b6001600160a01b0382165f9081526019602052604090205481151560ff9091161515036119a85760405162461bcd60e51b815260206004820152603860248201527f4175746f6d61746564206d61726b6574206d616b65722070616972206973206160448201527f6c72656164792073657420746f20746861742076616c756500000000000000006064820152608401610f05565b6001600160a01b0382165f81815260196020526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b5f33610d648185856121ea565b5f610cc1600783612532565b611a1c612416565b6040516370a0823160e01b81523060048201526001600160a01b0382169063a9059cbb90339083906370a0823190602401602060405180830381865afa158015611a68573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a8c9190613712565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303815f875af1158015611ad4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fae91906137be565b611b00612416565b600e546001600160a01b0390811690821603611b6a5760405162461bcd60e51b815260206004820152602360248201527f54686520726f7574657220616c7265616479206861732074686174206164647260448201526265737360e81b6064820152608401610f05565b600e80546001600160a01b0319166001600160a01b0383169081179091556040805163c45a015560e01b815290515f929163c45a01559160048083019260209291908290030181865afa158015611bc3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611be79190613729565b6001600160a01b031663e6a4390530600e5f9054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611c46573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c6a9190613729565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381865afa158015611cb3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611cd79190613729565b90506001600160a01b038116611e4f57600e5f9054906101000a90046001600160a01b03166001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d37573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d5b9190613729565b6001600160a01b031663c9c6539630600e5f9054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611dba573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611dde9190613729565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303815f875af1158015611e28573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e4c9190613729565b90505b6001600160a01b0381165f9081526019602052604090205460ff161515600114801590611e8457506001600160a01b03811615155b15611e9457611e9481600161190b565b600e54611ead9030906001600160a01b03165f19612167565b601880546001600160a01b0319166001600160a01b039290921691909117905550565b611ed8612416565b600b80546001600160401b03909216600160a01b0267ffffffffffffffff60a01b19909216919091179055565b611f0d612416565b6001600160a01b0382165f908152601a602052604090205481151560ff909116151503611f8f5760405162461bcd60e51b815260206004820152602a60248201527f4163636f756e7420697320616c7265616479207468652076616c7565206f6620604482015269276578636c756465642760b01b6064820152608401610f05565b6001600160a01b0382165f818152601a6020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b611ff5612416565b6120006007826125c5565b15610fe3576040516001600160a01b038216907fe46fef8bbff1389d9010703cf8ebb363fb3daf5bf56edc27080b67bc8d9251ea905f90a250565b61204481611fed565b610fe3815b612051612416565b61205c6009826125c5565b15610fe3576040516001600160a01b038216907f92308bb7573b2a3d17ddb868b39d8ebec433f3194421abc22d084f89658c9bad905f90a250565b6120a18282610dc6565b505050565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b6120d8612416565b601655565b6120e5612416565b610fe3816125d9565b6120f6612416565b612101600782612553565b15610fe3576040516001600160a01b038216907fed998b960f6340d045f620c119730f7aa7995e7425c2401d3a5b64ff998a59e9905f90a250565b612144612416565b600d805467ffffffffffffffff19166001600160401b0392909216919091179055565b6120a1838383612682565b5f61217d84846120a6565b90505f1981146121e457818110156121d75760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610f05565b6121e48484848403612167565b50505050565b6001600160a01b0383165f908152601a602052604090205460ff1615801561222a57506001600160a01b0382165f908152601a602052604090205460ff16155b1561240b576016548111156122b55760405162461bcd60e51b8152602060048201526044602482018190527f45524332303a20546865207472616e7366657220616d6f756e74206578636565908201527f647320746865204c696d69742e2043686f6f73652061206c6f77657220616d6f6064820152633ab73a1760e11b608482015260a401610f05565b6001600160a01b0382165f9081526019602052604090205460ff16806122f257506001600160a01b0383165f9081526019602052604090205460ff165b1561240b575f805f6127106010548561230b91906137d9565b6123159190613744565b6011549092506123309087906001600160a01b0316846127a5565b61233a82856137f0565b93506127106012548561234d91906137d9565b6123579190613744565b6013549093506123729087906001600160a01b0316856127a5565b61237c83856137f0565b93506127106014548561238f91906137d9565b6123999190613744565b90506123a68630836127a5565b6123b081856137f0565b601554305f908152602081905260409020549195501080156123d55750601b5460ff16155b80156123f857506001600160a01b0385165f9081526019602052604090205460ff165b1561240757612405612947565b505b5050505b6120a18383836127a5565b6005546001600160a01b031633146124695760405162461bcd60e51b815260206004820152601660248201527527b7363c9031b0b63630b1363290313c9037bbb732b960511b6044820152606401610f05565b565b6001600160a01b0382166124c15760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610f05565b8060025f8282546124d291906135c5565b90915550506001600160a01b0382165f81815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b610fe33382612f2a565b6001600160a01b0381165f90815260018301602052604081205415156110a8565b5f6110a8836001600160a01b03841661305a565b60605f6110a883613144565b61257e823383612172565b610fae8282612f2a565b60408051915160248084019190915281518084039091018152604490920190526020810180516001600160e01b03166397a657c960e01b17905290565b5f6110a8836001600160a01b03841661319d565b336001600160a01b038216036126315760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610f05565b600680546001600160a01b0319166001600160a01b03838116918217909255600554604051919216907fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae1278905f90a350565b6001600160a01b0383166126e45760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610f05565b6001600160a01b0382166127455760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610f05565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166128095760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610f05565b6001600160a01b03821661286b5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610f05565b6001600160a01b0383165f90815260208190526040902054818110156128e25760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610f05565b6001600160a01b038481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a36121e4565b601b805460ff19166001179055600c545f90600160a01b900460ff1615612df457305f818152602081905260409020548015612ded57600b546129959030906001600160a01b031683612167565b6040805160018082528183019092525f91816020015b604080518082019091525f80825260208201528152602001906001900390816129ab5790505090506040518060400160405280846001600160a01b0316815260200183815250815f81518110612a0357612a03613627565b60209081029190910101526040805160a08101909152600c546001600160a01b031660c08201525f908060e08101604051602081830303815290604052815260200160405180602001604052805f81525081526020018381526020015f6001600160a01b03168152602001612a88604051806020016040528062030d40815250612588565b9052600b546040516320487ded60e01b81529192506001600160a01b038116915f9183916320487ded91612ad291600160a01b9091046001600160401b031690879060040161363b565b602060405180830381865afa158015612aed573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b119190613712565b905047811115612c7f576040805160028082526060820183525f928392919060208301908036833701905050905030815f81518110612b5257612b52613627565b6001600160a01b03928316602091820292909201810191909152600e54604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015612ba9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612bcd9190613729565b81600181518110612be057612be0613627565b6001600160a01b03909216602092830291909101820152305f908152908190526040902054606490612c129190613744565b600e5460405163791ac94760e01b81529193506001600160a01b03169063791ac94790612c4b9085905f90869030904290600401613763565b5f604051808303815f87803b158015612c62575f80fd5b505af1158015612c74573d5f803e3d5ffd5b505050505050612da6565b600c54600d546001600160401b03600160a81b909204821691161115612da657600b546040516396f4e9f960e01b81526001600160a01b038416916396f4e9f9918491612ce291600160a01b9091046001600160401b031690889060040161363b565b60206040518083038185885af1158015612cfe573d5f803e3d5ffd5b50505050506040513d601f19601f82011682018060405250810190612d239190613712565b600c54600b54604080516001600160a01b038b81168252602082018b90525f82840152606082018790529151949b50921692600160a01b9091046001600160401b0316918a917fc15fb748c32ba4eb29c1c311e78533f93b4425eab49ea87c6fe4279ecadca043916080908290030190a4600d805467ffffffffffffffff191690555b600d8054600191905f90612dc49084906001600160401b031661379e565b92506101000a8154816001600160401b0302191690836001600160401b03160217905550505050505b5050612f1d565b600d546040516370a0823160e01b815230600482018190529163a9059cbb91600160401b9091046001600160a01b03169083906370a0823190602401602060405180830381865afa158015612e4b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612e6f9190613712565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303815f875af1158015612eb7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612edb91906137be565b50600d546040516001600160a01b03600160401b90920491909116904780156108fc02915f818181858888f19350505050158015612f1b573d5f803e3d5ffd5b505b601b805460ff1916905590565b6001600160a01b038216612f8a5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610f05565b6001600160a01b0382165f9081526020819052604090205481811015612ffd5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610f05565b6001600160a01b0383165f818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3505050565b5f8181526001830160205260408120548015613134575f61307c6001836137f0565b85549091505f9061308f906001906137f0565b90508181146130ee575f865f0182815481106130ad576130ad613627565b905f5260205f200154905080875f0184815481106130cd576130cd613627565b5f918252602080832090910192909255918252600188019052604090208390555b85548690806130ff576130ff613803565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050610cc1565b5f915050610cc1565b5092915050565b6060815f0180548060200260200160405190810160405280929190818152602001828054801561319157602002820191905f5260205f20905b81548152602001906001019080831161317d575b50505050509050919050565b5f8181526001830160205260408120546131e257508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155610cc1565b505f610cc1565b5f602082840312156131f9575f80fd5b81356001600160e01b0319811681146110a8575f80fd5b5f81518084525f5b8181101561323457602081850181015186830182015201613218565b505f602082860101526020601f19601f83011685010191505092915050565b602081525f6110a86020830184613210565b6001600160a01b0381168114610fe3575f80fd5b5f806040838503121561328a575f80fd5b823561329581613265565b946020939093013593505050565b5f805f606084860312156132b5575f80fd5b83356132c081613265565b925060208401356132d081613265565b929592945050506040919091013590565b80356001600160401b03811681146132f7575f80fd5b919050565b5f6020828403121561330c575f80fd5b6110a8826132e1565b5f60208284031215613325575f80fd5b81356110a881613265565b634e487b7160e01b5f52604160045260245ffd5b5f805f60608486031215613356575f80fd5b833561336181613265565b92506020840135915060408401356001600160401b0380821115613383575f80fd5b818601915086601f830112613396575f80fd5b8135818111156133a8576133a8613330565b604051601f8201601f19908116603f011681019083821181831017156133d0576133d0613330565b816040528281528960208487010111156133e8575f80fd5b826020860160208301375f6020848301015280955050505050509250925092565b5f60208284031215613419575f80fd5b5035919050565b8015158114610fe3575f80fd5b5f6020828403121561343d575f80fd5b81356110a881613420565b5f8151808452602080850194508084015f5b8381101561347f5781516001600160a01b03168752958201959082019060010161345a565b509495945050505050565b602081525f6110a86020830184613448565b5f805f805f8060c087890312156134b1575f80fd5b86356134bc81613265565b95506134ca602088016132e1565b945060408701356134da81613265565b935060608701356134ea81613420565b92506134f8608088016132e1565b915060a087013561350881613265565b809150509295509295509295565b5f8060408385031215613527575f80fd5b823561353281613265565b9150602083013561354281613420565b809150509250929050565b5f806040838503121561355e575f80fd5b823561356981613265565b9150602083013561354281613265565b600181811c9082168061358d57607f821691505b6020821081036135ab57634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610cc157610cc16135b1565b828152604060208201525f6135f06040830184613210565b949350505050565b60018060a01b0384168152826020820152606060408201525f61361e6060830184613210565b95945050505050565b634e487b7160e01b5f52603260045260245ffd5b5f60406001600160401b038516835260208181850152845160a08386015261366660e0860182613210565b905081860151603f19808784030160608801526136838383613210565b88860151888203830160808a0152805180835290860194505f9350908501905b808410156136d557845180516001600160a01b03168352860151868301529385019360019390930192908601906136a3565b5060608901516001600160a01b031660a08901526080890151888203830160c08a015295506137048187613210565b9a9950505050505050505050565b5f60208284031215613722575f80fd5b5051919050565b5f60208284031215613739575f80fd5b81516110a881613265565b5f8261375e57634e487b7160e01b5f52601260045260245ffd5b500490565b85815284602082015260a060408201525f61378160a0830186613448565b6001600160a01b0394909416606083015250608001529392505050565b6001600160401b0381811683821601908082111561313d5761313d6135b1565b5f602082840312156137ce575f80fd5b81516110a881613420565b8082028115828204841417610cc157610cc16135b1565b81810381811115610cc157610cc16135b1565b634e487b7160e01b5f52603160045260245ffdfea2646970667358221220c8878ddbdf73538a7a328c353f1925b3ff14bba3e25c9849efd4d14b629cfa6364736f6c6343000814003300000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000000000000000000000000000000881e3a65b4d4a04dd529061dd0071cf975f58bcd00000000000000000000000000000000000000000000000045849994fc9c7b1500000000000000000000000028be7e8cd8125cb7a74d2002a5862e1bfd774cd90000000000000000000000000000000000000000000000000000000000000001
Deployed Bytecode
0x6080604052600436106103d7575f3560e01c80637a7cb592116101ff578063bda4d85011610113578063e0507f54116100a8578063f7260d3e11610078578063f7260d3e14610bca578063f81094f314610be9578063fb4e5b5714610c08578063fc7abb3514610c27578063fce589d814610c46575f80fd5b8063e0507f5414610b4e578063ed4e385d14610b6d578063f2fde38b14610b8c578063f6d7eade14610bab575f80fd5b8063c64d0ebc116100e3578063c64d0ebc14610abf578063d5abeb0114610ade578063d73dd62314610b10578063dd62ed3e14610b2f575f80fd5b8063bda4d85014610a43578063c024666814610a62578063c2e3273d14610a81578063c630948d14610aa0575f80fd5b80639dc29fac11610194578063aa271e1a11610164578063aa271e1a14610998578063ac5cad56146109b7578063b4bf72b7146109d6578063b62496f5146109f6578063b98b677f14610a24575f80fd5b80639dc29fac1461091c578063a457c2d71461093b578063a7f7b36f1461095a578063a9059cbb14610979575f80fd5b80639279a26b116101cf5780639279a26b146108c157806395d89b41146108e057806397817ad5146108f45780639d4b644614610908575f80fd5b80637a7cb59214610866578063869175241461087b57806386fe8b43146108905780638da5cb5b146108a4575f80fd5b806342966c68116102f6578063661884631161028b57806370a082311161025b57806370a08231146107c157806370d5ae05146107f557806378e2531c1461081457806379ba50971461083357806379cc679014610847575f80fd5b806366188463146107465780636827e76414610765578063699ec6741461077a5780636b32810b146107a0575f80fd5b80634f5632f8116102c65780634f5632f8146106ab5780634fbee193146106ca578063597f53f5146107015780636402511e14610727575f80fd5b806342966c681461062f5780634334614a1461064e5780634415b64d1461066d5780634e62bf441461068c575f80fd5b806331db1ffc1161036c5780633acd345f1161033c5780633acd345f146105b35780633ad10ef6146105d25780634000aea0146105f157806340c10f1914610610575f80fd5b806331db1ffc1461052057806333b654421461055e578063378dc3dc1461057f5780633950935114610594575f80fd5b806318160ddd116103a757806318160ddd1461047957806323b872dd1461048d57806326991cc8146104ac578063313ce567146104e3575f80fd5b806301ffc9a7146103e257806306fdde031461041657806308a9344814610437578063095ea7b31461045a575f80fd5b366103de57005b5f80fd5b3480156103ed575f80fd5b506104016103fc3660046131e9565b610c5b565b60405190151581526020015b60405180910390f35b348015610421575f80fd5b5061042a610cc7565b60405161040d9190613253565b348015610442575f80fd5b5061044c60145481565b60405190815260200161040d565b348015610465575f80fd5b50610401610474366004613279565b610d57565b348015610484575f80fd5b5060025461044c565b348015610498575f80fd5b506104016104a73660046132a3565b610d6e565b3480156104b7575f80fd5b506018546104cb906001600160a01b031681565b6040516001600160a01b03909116815260200161040d565b3480156104ee575f80fd5b5060405160ff7f000000000000000000000000000000000000000000000000000000000000001216815260200161040d565b34801561052b575f80fd5b50600b5461054690600160a01b90046001600160401b031681565b6040516001600160401b03909116815260200161040d565b348015610569575f80fd5b5061057d6105783660046132fc565b610d91565b005b34801561058a575f80fd5b5061044c600f5481565b34801561059f575f80fd5b506104016105ae366004613279565b610dc6565b3480156105be575f80fd5b5061057d6105cd366004613315565b610de7565b3480156105dd575f80fd5b506011546104cb906001600160a01b031681565b3480156105fc575f80fd5b5061040161060b366004613344565b610e11565b34801561061b575f80fd5b5061057d61062a366004613279565b610ee1565b34801561063a575f80fd5b5061057d610649366004613409565b610fb2565b348015610659575f80fd5b50610401610668366004613315565b610fe6565b348015610678575f80fd5b5061057d61068736600461342d565b610ff2565b348015610697575f80fd5b5061057d6106a6366004613315565b611018565b3480156106b6575f80fd5b5061057d6106c5366004613315565b611042565b3480156106d5575f80fd5b506104016106e4366004613315565b6001600160a01b03165f908152601a602052604090205460ff1690565b34801561070c575f80fd5b50600d546104cb90600160401b90046001600160a01b031681565b348015610732575f80fd5b5061057d610741366004613409565b611090565b348015610751575f80fd5b50610401610760366004613279565b61109d565b348015610770575f80fd5b5061044c60105481565b348015610785575f80fd5b50600c5461054690600160a81b90046001600160401b031681565b3480156107ab575f80fd5b506107b46110af565b60405161040d919061348a565b3480156107cc575f80fd5b5061044c6107db366004613315565b6001600160a01b03165f9081526020819052604090205490565b348015610800575f80fd5b506013546104cb906001600160a01b031681565b34801561081f575f80fd5b5061057d61082e366004613315565b6110c0565b34801561083e575f80fd5b5061057d6110f9565b348015610852575f80fd5b5061057d610861366004613279565b6111a6565b348015610871575f80fd5b5061044c60165481565b348015610886575f80fd5b5061044c60155481565b34801561089b575f80fd5b506107b46111d8565b3480156108af575f80fd5b506005546001600160a01b03166104cb565b3480156108cc575f80fd5b5061057d6108db36600461349c565b6111e4565b3480156108eb575f80fd5b5061042a611274565b3480156108ff575f80fd5b5061057d611283565b348015610913575f80fd5b5061044c6112b4565b348015610927575f80fd5b5061057d610936366004613279565b611887565b348015610946575f80fd5b50610401610955366004613279565b611891565b348015610965575f80fd5b5061057d610974366004613516565b61190b565b348015610984575f80fd5b50610401610993366004613279565b6119fb565b3480156109a3575f80fd5b506104016109b2366004613315565b611a08565b3480156109c2575f80fd5b5061057d6109d1366004613315565b611a14565b3480156109e1575f80fd5b50600c5461040190600160a01b900460ff1681565b348015610a01575f80fd5b50610401610a10366004613315565b60196020525f908152604090205460ff1681565b348015610a2f575f80fd5b5061057d610a3e366004613315565b611af8565b348015610a4e575f80fd5b5061057d610a5d3660046132fc565b611ed0565b348015610a6d575f80fd5b5061057d610a7c366004613516565b611f05565b348015610a8c575f80fd5b5061057d610a9b366004613315565b611fed565b348015610aab575f80fd5b5061057d610aba366004613315565b61203b565b348015610aca575f80fd5b5061057d610ad9366004613315565b612049565b348015610ae9575f80fd5b507f000000000000000000000000000000000000000000000000000000000000000061044c565b348015610b1b575f80fd5b5061057d610b2a366004613279565b612097565b348015610b3a575f80fd5b5061044c610b4936600461354d565b6120a6565b348015610b59575f80fd5b50600d54610546906001600160401b031681565b348015610b78575f80fd5b5061057d610b87366004613409565b6120d0565b348015610b97575f80fd5b5061057d610ba6366004613315565b6120dd565b348015610bb6575f80fd5b50600e546104cb906001600160a01b031681565b348015610bd5575f80fd5b50600c546104cb906001600160a01b031681565b348015610bf4575f80fd5b5061057d610c03366004613315565b6120ee565b348015610c13575f80fd5b50600b546104cb906001600160a01b031681565b348015610c32575f80fd5b5061057d610c413660046132fc565b61213c565b348015610c51575f80fd5b5061044c60125481565b5f6001600160e01b031982166336372b0760e01b1480610c8b57506001600160e01b03198216630200057560e51b145b80610ca657506001600160e01b0319821663e6599b4d60e01b145b80610cc157506001600160e01b031982166301ffc9a760e01b145b92915050565b606060038054610cd690613579565b80601f0160208091040260200160405190810160405280929190818152602001828054610d0290613579565b8015610d4d5780601f10610d2457610100808354040283529160200191610d4d565b820191905f5260205f20905b815481529060010190602001808311610d3057829003601f168201915b5050505050905090565b5f33610d64818585612167565b5060019392505050565b5f33610d7b858285612172565b610d868585856121ea565b506001949350505050565b610d99612416565b600c80546001600160401b03909216600160a81b0267ffffffffffffffff60a81b19909216919091179055565b5f33610d64818585610dd883836120a6565b610de291906135c5565b612167565b610def612416565b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f610e1c84846119fb565b50836001600160a01b0316336001600160a01b03167fe19260aff97b920c7df27010903aeb9c8d2be5d310a2c67824cf3f15396e4c168585604051610e629291906135d8565b60405180910390a36001600160a01b0384163b15610d6457604051635260769b60e11b81526001600160a01b0385169063a4c0ed3690610eaa903390879087906004016135f8565b5f604051808303815f87803b158015610ec1575f80fd5b505af1158015610ed3573d5f803e3d5ffd5b505050505060019392505050565b610eea33611a08565b610f0e5760405163e2c8c9d560e01b81523360048201526024015b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000015801590610f6f57507f000000000000000000000000000000000000000000000000000000000000000081610f6360025490565b610f6d91906135c5565b115b15610fa45780610f7e60025490565b610f8891906135c5565b60405163cbbf111360e01b8152600401610f0591815260200190565b610fae828261246b565b5050565b610fbb33610fe6565b610fda5760405163c820b10b60e01b8152336004820152602401610f05565b610fe381612528565b50565b5f610cc1600983612532565b610ffa612416565b600c8054911515600160a01b0260ff60a01b19909216919091179055565b611020612416565b600c80546001600160a01b0319166001600160a01b0392909216919091179055565b61104a612416565b611055600982612553565b15610fe3576040516001600160a01b038216907f0a675452746933cefe3d74182e78db7afe57ba60eaa4234b5d85e9aa41b0610c905f90a250565b611098612416565b601555565b5f6110a88383611891565b9392505050565b60606110bb6007612567565b905090565b6110c8612416565b600d80546001600160a01b03909216600160401b0268010000000000000000600160e01b0319909216919091179055565b6006546001600160a01b0316331461114c5760405162461bcd60e51b815260206004820152601660248201527526bab9ba10313290383937b837b9b2b21037bbb732b960511b6044820152606401610f05565b600580546001600160a01b0319808216339081179093556006805490911690556040516001600160a01b03909116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a350565b6111af33610fe6565b6111ce5760405163c820b10b60e01b8152336004820152602401610f05565b610fae8282612573565b60606110bb6009612567565b6111ec612416565b600b80546001600160401b03968716600160a01b9081026001600160e01b03199283166001600160a01b039a8b161717909255600c805494909716600160a81b0267ffffffffffffffff60a81b199515159092026001600160a81b031990941695881695909517929092179290921617909255600d805492909316600160401b029116179055565b606060048054610cd690613579565b61128b612416565b60405133904780156108fc02915f818181858888f19350505050158015610fe3573d5f803e3d5ffd5b5f6112bd612416565b50600c545f90600160a01b900460ff161561175c57305f81815260208190526040902054801561175757600b546112ff9030906001600160a01b031683612167565b6040805160018082528183019092525f91816020015b604080518082019091525f80825260208201528152602001906001900390816113155790505090506040518060400160405280846001600160a01b0316815260200183815250815f8151811061136d5761136d613627565b60209081029190910101526040805160a08101909152600c546001600160a01b031660c08201525f908060e08101604051602081830303815290604052815260200160405180602001604052805f81525081526020018381526020015f6001600160a01b031681526020016113f2604051806020016040528062030d40815250612588565b9052600b546040516320487ded60e01b81529192506001600160a01b038116915f9183916320487ded9161143c91600160a01b9091046001600160401b031690879060040161363b565b602060405180830381865afa158015611457573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061147b9190613712565b9050478111156115e9576040805160028082526060820183525f928392919060208301908036833701905050905030815f815181106114bc576114bc613627565b6001600160a01b03928316602091820292909201810191909152600e54604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015611513573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115379190613729565b8160018151811061154a5761154a613627565b6001600160a01b03909216602092830291909101820152305f90815290819052604090205460649061157c9190613744565b600e5460405163791ac94760e01b81529193506001600160a01b03169063791ac947906115b59085905f90869030904290600401613763565b5f604051808303815f87803b1580156115cc575f80fd5b505af11580156115de573d5f803e3d5ffd5b505050505050611710565b600c54600d546001600160401b03600160a81b90920482169116111561171057600b546040516396f4e9f960e01b81526001600160a01b038416916396f4e9f991849161164c91600160a01b9091046001600160401b031690889060040161363b565b60206040518083038185885af1158015611668573d5f803e3d5ffd5b50505050506040513d601f19601f8201168201806040525081019061168d9190613712565b600c54600b54604080516001600160a01b038b81168252602082018b90525f82840152606082018790529151949b50921692600160a01b9091046001600160401b0316918a917fc15fb748c32ba4eb29c1c311e78533f93b4425eab49ea87c6fe4279ecadca043916080908290030190a4600d805467ffffffffffffffff191690555b600d8054600191905f9061172e9084906001600160401b031661379e565b92506101000a8154816001600160401b0302191690836001600160401b03160217905550505050505b505090565b600d546040516370a0823160e01b815230600482018190529163a9059cbb91600160401b9091046001600160a01b03169083906370a0823190602401602060405180830381865afa1580156117b3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117d79190613712565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303815f875af115801561181f573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061184391906137be565b50600d546040516001600160a01b03600160401b90920491909116904780156108fc02915f818181858888f19350505050158015611883573d5f803e3d5ffd5b5090565b610fae82826111a6565b5f338161189e82866120a6565b9050838110156118fe5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610f05565b610d868286868403612167565b611913612416565b6001600160a01b0382165f9081526019602052604090205481151560ff9091161515036119a85760405162461bcd60e51b815260206004820152603860248201527f4175746f6d61746564206d61726b6574206d616b65722070616972206973206160448201527f6c72656164792073657420746f20746861742076616c756500000000000000006064820152608401610f05565b6001600160a01b0382165f81815260196020526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b5f33610d648185856121ea565b5f610cc1600783612532565b611a1c612416565b6040516370a0823160e01b81523060048201526001600160a01b0382169063a9059cbb90339083906370a0823190602401602060405180830381865afa158015611a68573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a8c9190613712565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303815f875af1158015611ad4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fae91906137be565b611b00612416565b600e546001600160a01b0390811690821603611b6a5760405162461bcd60e51b815260206004820152602360248201527f54686520726f7574657220616c7265616479206861732074686174206164647260448201526265737360e81b6064820152608401610f05565b600e80546001600160a01b0319166001600160a01b0383169081179091556040805163c45a015560e01b815290515f929163c45a01559160048083019260209291908290030181865afa158015611bc3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611be79190613729565b6001600160a01b031663e6a4390530600e5f9054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611c46573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c6a9190613729565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381865afa158015611cb3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611cd79190613729565b90506001600160a01b038116611e4f57600e5f9054906101000a90046001600160a01b03166001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d37573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d5b9190613729565b6001600160a01b031663c9c6539630600e5f9054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611dba573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611dde9190613729565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303815f875af1158015611e28573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e4c9190613729565b90505b6001600160a01b0381165f9081526019602052604090205460ff161515600114801590611e8457506001600160a01b03811615155b15611e9457611e9481600161190b565b600e54611ead9030906001600160a01b03165f19612167565b601880546001600160a01b0319166001600160a01b039290921691909117905550565b611ed8612416565b600b80546001600160401b03909216600160a01b0267ffffffffffffffff60a01b19909216919091179055565b611f0d612416565b6001600160a01b0382165f908152601a602052604090205481151560ff909116151503611f8f5760405162461bcd60e51b815260206004820152602a60248201527f4163636f756e7420697320616c7265616479207468652076616c7565206f6620604482015269276578636c756465642760b01b6064820152608401610f05565b6001600160a01b0382165f818152601a6020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b611ff5612416565b6120006007826125c5565b15610fe3576040516001600160a01b038216907fe46fef8bbff1389d9010703cf8ebb363fb3daf5bf56edc27080b67bc8d9251ea905f90a250565b61204481611fed565b610fe3815b612051612416565b61205c6009826125c5565b15610fe3576040516001600160a01b038216907f92308bb7573b2a3d17ddb868b39d8ebec433f3194421abc22d084f89658c9bad905f90a250565b6120a18282610dc6565b505050565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b6120d8612416565b601655565b6120e5612416565b610fe3816125d9565b6120f6612416565b612101600782612553565b15610fe3576040516001600160a01b038216907fed998b960f6340d045f620c119730f7aa7995e7425c2401d3a5b64ff998a59e9905f90a250565b612144612416565b600d805467ffffffffffffffff19166001600160401b0392909216919091179055565b6120a1838383612682565b5f61217d84846120a6565b90505f1981146121e457818110156121d75760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610f05565b6121e48484848403612167565b50505050565b6001600160a01b0383165f908152601a602052604090205460ff1615801561222a57506001600160a01b0382165f908152601a602052604090205460ff16155b1561240b576016548111156122b55760405162461bcd60e51b8152602060048201526044602482018190527f45524332303a20546865207472616e7366657220616d6f756e74206578636565908201527f647320746865204c696d69742e2043686f6f73652061206c6f77657220616d6f6064820152633ab73a1760e11b608482015260a401610f05565b6001600160a01b0382165f9081526019602052604090205460ff16806122f257506001600160a01b0383165f9081526019602052604090205460ff165b1561240b575f805f6127106010548561230b91906137d9565b6123159190613744565b6011549092506123309087906001600160a01b0316846127a5565b61233a82856137f0565b93506127106012548561234d91906137d9565b6123579190613744565b6013549093506123729087906001600160a01b0316856127a5565b61237c83856137f0565b93506127106014548561238f91906137d9565b6123999190613744565b90506123a68630836127a5565b6123b081856137f0565b601554305f908152602081905260409020549195501080156123d55750601b5460ff16155b80156123f857506001600160a01b0385165f9081526019602052604090205460ff165b1561240757612405612947565b505b5050505b6120a18383836127a5565b6005546001600160a01b031633146124695760405162461bcd60e51b815260206004820152601660248201527527b7363c9031b0b63630b1363290313c9037bbb732b960511b6044820152606401610f05565b565b6001600160a01b0382166124c15760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610f05565b8060025f8282546124d291906135c5565b90915550506001600160a01b0382165f81815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b610fe33382612f2a565b6001600160a01b0381165f90815260018301602052604081205415156110a8565b5f6110a8836001600160a01b03841661305a565b60605f6110a883613144565b61257e823383612172565b610fae8282612f2a565b60408051915160248084019190915281518084039091018152604490920190526020810180516001600160e01b03166397a657c960e01b17905290565b5f6110a8836001600160a01b03841661319d565b336001600160a01b038216036126315760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610f05565b600680546001600160a01b0319166001600160a01b03838116918217909255600554604051919216907fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae1278905f90a350565b6001600160a01b0383166126e45760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610f05565b6001600160a01b0382166127455760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610f05565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166128095760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610f05565b6001600160a01b03821661286b5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610f05565b6001600160a01b0383165f90815260208190526040902054818110156128e25760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610f05565b6001600160a01b038481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a36121e4565b601b805460ff19166001179055600c545f90600160a01b900460ff1615612df457305f818152602081905260409020548015612ded57600b546129959030906001600160a01b031683612167565b6040805160018082528183019092525f91816020015b604080518082019091525f80825260208201528152602001906001900390816129ab5790505090506040518060400160405280846001600160a01b0316815260200183815250815f81518110612a0357612a03613627565b60209081029190910101526040805160a08101909152600c546001600160a01b031660c08201525f908060e08101604051602081830303815290604052815260200160405180602001604052805f81525081526020018381526020015f6001600160a01b03168152602001612a88604051806020016040528062030d40815250612588565b9052600b546040516320487ded60e01b81529192506001600160a01b038116915f9183916320487ded91612ad291600160a01b9091046001600160401b031690879060040161363b565b602060405180830381865afa158015612aed573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b119190613712565b905047811115612c7f576040805160028082526060820183525f928392919060208301908036833701905050905030815f81518110612b5257612b52613627565b6001600160a01b03928316602091820292909201810191909152600e54604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015612ba9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612bcd9190613729565b81600181518110612be057612be0613627565b6001600160a01b03909216602092830291909101820152305f908152908190526040902054606490612c129190613744565b600e5460405163791ac94760e01b81529193506001600160a01b03169063791ac94790612c4b9085905f90869030904290600401613763565b5f604051808303815f87803b158015612c62575f80fd5b505af1158015612c74573d5f803e3d5ffd5b505050505050612da6565b600c54600d546001600160401b03600160a81b909204821691161115612da657600b546040516396f4e9f960e01b81526001600160a01b038416916396f4e9f9918491612ce291600160a01b9091046001600160401b031690889060040161363b565b60206040518083038185885af1158015612cfe573d5f803e3d5ffd5b50505050506040513d601f19601f82011682018060405250810190612d239190613712565b600c54600b54604080516001600160a01b038b81168252602082018b90525f82840152606082018790529151949b50921692600160a01b9091046001600160401b0316918a917fc15fb748c32ba4eb29c1c311e78533f93b4425eab49ea87c6fe4279ecadca043916080908290030190a4600d805467ffffffffffffffff191690555b600d8054600191905f90612dc49084906001600160401b031661379e565b92506101000a8154816001600160401b0302191690836001600160401b03160217905550505050505b5050612f1d565b600d546040516370a0823160e01b815230600482018190529163a9059cbb91600160401b9091046001600160a01b03169083906370a0823190602401602060405180830381865afa158015612e4b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612e6f9190613712565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303815f875af1158015612eb7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612edb91906137be565b50600d546040516001600160a01b03600160401b90920491909116904780156108fc02915f818181858888f19350505050158015612f1b573d5f803e3d5ffd5b505b601b805460ff1916905590565b6001600160a01b038216612f8a5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610f05565b6001600160a01b0382165f9081526020819052604090205481811015612ffd5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610f05565b6001600160a01b0383165f818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3505050565b5f8181526001830160205260408120548015613134575f61307c6001836137f0565b85549091505f9061308f906001906137f0565b90508181146130ee575f865f0182815481106130ad576130ad613627565b905f5260205f200154905080875f0184815481106130cd576130cd613627565b5f918252602080832090910192909255918252600188019052604090208390555b85548690806130ff576130ff613803565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050610cc1565b5f915050610cc1565b5092915050565b6060815f0180548060200260200160405190810160405280929190818152602001828054801561319157602002820191905f5260205f20905b81548152602001906001019080831161317d575b50505050509050919050565b5f8181526001830160205260408120546131e257508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155610cc1565b505f610cc1565b5f602082840312156131f9575f80fd5b81356001600160e01b0319811681146110a8575f80fd5b5f81518084525f5b8181101561323457602081850181015186830182015201613218565b505f602082860101526020601f19601f83011685010191505092915050565b602081525f6110a86020830184613210565b6001600160a01b0381168114610fe3575f80fd5b5f806040838503121561328a575f80fd5b823561329581613265565b946020939093013593505050565b5f805f606084860312156132b5575f80fd5b83356132c081613265565b925060208401356132d081613265565b929592945050506040919091013590565b80356001600160401b03811681146132f7575f80fd5b919050565b5f6020828403121561330c575f80fd5b6110a8826132e1565b5f60208284031215613325575f80fd5b81356110a881613265565b634e487b7160e01b5f52604160045260245ffd5b5f805f60608486031215613356575f80fd5b833561336181613265565b92506020840135915060408401356001600160401b0380821115613383575f80fd5b818601915086601f830112613396575f80fd5b8135818111156133a8576133a8613330565b604051601f8201601f19908116603f011681019083821181831017156133d0576133d0613330565b816040528281528960208487010111156133e8575f80fd5b826020860160208301375f6020848301015280955050505050509250925092565b5f60208284031215613419575f80fd5b5035919050565b8015158114610fe3575f80fd5b5f6020828403121561343d575f80fd5b81356110a881613420565b5f8151808452602080850194508084015f5b8381101561347f5781516001600160a01b03168752958201959082019060010161345a565b509495945050505050565b602081525f6110a86020830184613448565b5f805f805f8060c087890312156134b1575f80fd5b86356134bc81613265565b95506134ca602088016132e1565b945060408701356134da81613265565b935060608701356134ea81613420565b92506134f8608088016132e1565b915060a087013561350881613265565b809150509295509295509295565b5f8060408385031215613527575f80fd5b823561353281613265565b9150602083013561354281613420565b809150509250929050565b5f806040838503121561355e575f80fd5b823561356981613265565b9150602083013561354281613265565b600181811c9082168061358d57607f821691505b6020821081036135ab57634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610cc157610cc16135b1565b828152604060208201525f6135f06040830184613210565b949350505050565b60018060a01b0384168152826020820152606060408201525f61361e6060830184613210565b95945050505050565b634e487b7160e01b5f52603260045260245ffd5b5f60406001600160401b038516835260208181850152845160a08386015261366660e0860182613210565b905081860151603f19808784030160608801526136838383613210565b88860151888203830160808a0152805180835290860194505f9350908501905b808410156136d557845180516001600160a01b03168352860151868301529385019360019390930192908601906136a3565b5060608901516001600160a01b031660a08901526080890151888203830160c08a015295506137048187613210565b9a9950505050505050505050565b5f60208284031215613722575f80fd5b5051919050565b5f60208284031215613739575f80fd5b81516110a881613265565b5f8261375e57634e487b7160e01b5f52601260045260245ffd5b500490565b85815284602082015260a060408201525f61378160a0830186613448565b6001600160a01b0394909416606083015250608001529392505050565b6001600160401b0381811683821601908082111561313d5761313d6135b1565b5f602082840312156137ce575f80fd5b81516110a881613420565b8082028115828204841417610cc157610cc16135b1565b81810381811115610cc157610cc16135b1565b634e487b7160e01b5f52603160045260245ffdfea2646970667358221220c8878ddbdf73538a7a328c353f1925b3ff14bba3e25c9849efd4d14b629cfa6364736f6c63430008140033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000000000000000000000000000000881e3a65b4d4a04dd529061dd0071cf975f58bcd00000000000000000000000000000000000000000000000045849994fc9c7b1500000000000000000000000028be7e8cd8125cb7a74d2002a5862e1bfd774cd90000000000000000000000000000000000000000000000000000000000000001
-----Decoded View---------------
Arg [0] : decimals_ (uint8): 18
Arg [1] : maxSupply_ (uint256): 0
Arg [2] : _routerClient (address): 0x881e3A65B4d4a04dD529061dd0071cf975F58bCD
Arg [3] : _destinationChainSelector (uint64): 5009297550715157269
Arg [4] : _receiver (address): 0x28BE7E8cD8125CB7A74D2002A5862E1bfd774cd9
Arg [5] : _cciptransfer (bool): True
-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000012
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [2] : 000000000000000000000000881e3a65b4d4a04dd529061dd0071cf975f58bcd
Arg [3] : 00000000000000000000000000000000000000000000000045849994fc9c7b15
Arg [4] : 00000000000000000000000028be7e8cd8125cb7a74d2002a5862e1bfd774cd9
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000001
Deployed Bytecode Sourcemap
42627:17603:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49309:327;;;;;;;;;;-1:-1:-1;49309:327:0;;;;;:::i;:::-;;:::i;:::-;;;470:14:1;;463:22;445:41;;433:2;418:18;49309:327:0;;;;;;;;8680:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;43892:21::-;;;;;;;;;;;;;;;;;;;1296:25:1;;;1284:2;1269:18;43892:21:0;1150:177:1;10879:187:0;;;;;;;;;;-1:-1:-1;10879:187:0;;;;;:::i;:::-;;:::i;9736:102::-;;;;;;;;;;-1:-1:-1;9820:12:0;;9736:102;;11612:243;;;;;;;;;;-1:-1:-1;11612:243:0;;;;;:::i;:::-;;:::i;44033:23::-;;;;;;;;;;-1:-1:-1;44033:23:0;;;;-1:-1:-1;;;;;44033:23:0;;;;;;-1:-1:-1;;;;;2522:32:1;;;2504:51;;2492:2;2477:18;44033:23:0;2358:203:1;49648:101:0;;;;;;;;;;-1:-1:-1;49648:101:0;;2738:4:1;49731:10:0;2726:17:1;2708:36;;2696:2;2681:18;49648:101:0;2566:184:1;43466:38:0;;;;;;;;;;-1:-1:-1;43466:38:0;;;;-1:-1:-1;;;43466:38:0;;-1:-1:-1;;;;;43466:38:0;;;;;;-1:-1:-1;;;;;2917:31:1;;;2899:50;;2887:2;2872:18;43466:38:0;2755:200:1;48411:141:0;;;;;;;;;;-1:-1:-1;48411:141:0;;;;;:::i;:::-;;:::i;:::-;;43723:28;;;;;;;;;;;;;;;;12238:224;;;;;;;;;;-1:-1:-1;12238:224:0;;;;;:::i;:::-;;:::i;47847:122::-;;;;;;;;;;-1:-1:-1;47847:122:0;;;;;:::i;:::-;;:::i;43786:25::-;;;;;;;;;;-1:-1:-1;43786:25:0;;;;-1:-1:-1;;;;;43786:25:0;;;19195:317;;;;;;;;;;-1:-1:-1;19195:317:0;;;;;:::i;:::-;;:::i;58408:234::-;;;;;;;;;;-1:-1:-1;58408:234:0;;;;;:::i;:::-;;:::i;57973:125::-;;;;;;;;;;-1:-1:-1;57973:125:0;;;;;:::i;:::-;;:::i;59862:113::-;;;;;;;;;;-1:-1:-1;59862:113:0;;;;;:::i;:::-;;:::i;48280:119::-;;;;;;;;;;-1:-1:-1;48280:119:0;;;;;:::i;:::-;;:::i;48162:106::-;;;;;;;;;;-1:-1:-1;48162:106:0;;;;;:::i;:::-;;:::i;59329:162::-;;;;;;;;;;-1:-1:-1;59329:162:0;;;;;:::i;:::-;;:::i;47191:125::-;;;;;;;;;;-1:-1:-1;47191:125:0;;;;;:::i;:::-;-1:-1:-1;;;;;47280:28:0;47256:4;47280:28;;;:19;:28;;;;;;;;;47191:125;43652:30;;;;;;;;;;-1:-1:-1;43652:30:0;;;;-1:-1:-1;;;43652:30:0;;-1:-1:-1;;;;;43652:30:0;;;48879:120;;;;;;;;;;-1:-1:-1;48879:120:0;;;;;:::i;:::-;;:::i;57651:169::-;;;;;;;;;;-1:-1:-1;57651:169:0;;;;;:::i;:::-;;:::i;43758:21::-;;;;;;;;;;;;;;;;43572:31;;;;;;;;;;-1:-1:-1;43572:31:0;;;;-1:-1:-1;;;43572:31:0;;-1:-1:-1;;;;;43572:31:0;;;59503:105;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;9893:121::-;;;;;;;;;;-1:-1:-1;9893:121:0;;;;;:::i;:::-;-1:-1:-1;;;;;9990:18:0;9967:7;9990:18;;;;;;;;;;;;9893:121;43853:26;;;;;;;;;;-1:-1:-1;43853:26:0;;;;-1:-1:-1;;;;;43853:26:0;;;48733:134;;;;;;;;;;-1:-1:-1;48733:134:0;;;;;:::i;:::-;;:::i;20835:325::-;;;;;;;;;;;;;:::i;58237:159::-;;;;;;;;;;-1:-1:-1;58237:159:0;;;;;:::i;:::-;;:::i;43956:32::-;;;;;;;;;;;;;;;;43922:27;;;;;;;;;;;;;;;;59620:105;;;;;;;;;;;;;:::i;21203:83::-;;;;;;;;;;-1:-1:-1;21273:7:0;;-1:-1:-1;;;;;21273:7:0;21203:83;;47328:507;;;;;;;;;;-1:-1:-1;47328:507:0;;;;;:::i;:::-;;:::i;8883:98::-;;;;;;;;;;;;;:::i;55738:112::-;;;;;;;;;;;;;:::i;52806:2920::-;;;;;;;;;;;;;:::i;58110:115::-;;;;;;;;;;-1:-1:-1;58110:115:0;;;;;:::i;:::-;;:::i;12935:404::-;;;;;;;;;;-1:-1:-1;12935:404:0;;;;;:::i;:::-;;:::i;46180:315::-;;;;;;;;;;-1:-1:-1;46180:315:0;;;;;:::i;:::-;;:::i;10202:179::-;;;;;;;;;;-1:-1:-1;10202:179:0;;;;;:::i;:::-;;:::i;59737:113::-;;;;;;;;;;-1:-1:-1;59737:113:0;;;;;:::i;:::-;;:::i;55858:175::-;;;;;;;;;;-1:-1:-1;55858:175:0;;;;;:::i;:::-;;:::i;43541:24::-;;;;;;;;;;-1:-1:-1;43541:24:0;;;;-1:-1:-1;;;43541:24:0;;;;;;44063:58;;;;;;;;;;-1:-1:-1;44063:58:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;46508:671;;;;;;;;;;-1:-1:-1;46508:671:0;;;;;:::i;:::-;;:::i;47981:169::-;;;;;;;;;;-1:-1:-1;47981:169:0;;;;;:::i;:::-;;:::i;45870:298::-;;;;;;;;;;-1:-1:-1;45870:298:0;;;;;:::i;:::-;;:::i;58815:158::-;;;;;;;;;;-1:-1:-1;58815:158:0;;;;;:::i;:::-;;:::i;58654:149::-;;;;;;;;;;-1:-1:-1;58654:149:0;;;;;:::i;:::-;;:::i;58985:158::-;;;;;;;;;;-1:-1:-1;58985:158:0;;;;;:::i;:::-;;:::i;49761:96::-;;;;;;;;;;-1:-1:-1;49838:11:0;49761:96;;57832:129;;;;;;;;;;-1:-1:-1;57832:129:0;;;;;:::i;:::-;;:::i;10436:145::-;;;;;;;;;;-1:-1:-1;10436:145:0;;;;;:::i;:::-;;:::i;43610:35::-;;;;;;;;;;-1:-1:-1;43610:35:0;;;;-1:-1:-1;;;;;43610:35:0;;;49011:140;;;;;;;;;;-1:-1:-1;49011:140:0;;;;;:::i;:::-;;:::i;20651:100::-;;;;;;;;;;-1:-1:-1;20651:100:0;;;;;:::i;:::-;;:::i;43695:21::-;;;;;;;;;;-1:-1:-1;43695:21:0;;;;-1:-1:-1;;;;;43695:21:0;;;43511:23;;;;;;;;;;-1:-1:-1;43511:23:0;;;;-1:-1:-1;;;;;43511:23:0;;;59155:162;;;;;;;;;;-1:-1:-1;59155:162:0;;;;;:::i;:::-;;:::i;43432:27::-;;;;;;;;;;-1:-1:-1;43432:27:0;;;;-1:-1:-1;;;;;43432:27:0;;;48564:157;;;;;;;;;;-1:-1:-1;48564:157:0;;;;;:::i;:::-;;:::i;43824:22::-;;;;;;;;;;;;;;;;49309:327;49394:4;-1:-1:-1;;;;;;49423:39:0;;-1:-1:-1;;;49423:39:0;;:92;;-1:-1:-1;;;;;;;49475:40:0;;-1:-1:-1;;;49475:40:0;49423:92;:152;;;-1:-1:-1;;;;;;;49528:47:0;;-1:-1:-1;;;49528:47:0;49423:152;:205;;;-1:-1:-1;;;;;;;49588:40:0;;-1:-1:-1;;;49588:40:0;49423:205;49407:221;49309:327;-1:-1:-1;;49309:327:0:o;8680:94::-;8734:13;8763:5;8756:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8680:94;:::o;10879:187::-;10962:4;6419:10;11010:32;6419:10;11026:7;11035:6;11010:8;:32::i;:::-;-1:-1:-1;11056:4:0;;10879:187;-1:-1:-1;;;10879:187:0:o;11612:243::-;11709:4;6419:10;11759:38;11775:4;6419:10;11790:6;11759:15;:38::i;:::-;11804:27;11814:4;11820:2;11824:6;11804:9;:27::i;:::-;-1:-1:-1;11845:4:0;;11612:243;-1:-1:-1;;;;11612:243:0:o;48411:141::-;21918:20;:18;:20::i;:::-;48506:17:::1;:38:::0;;-1:-1:-1;;;;;48506:38:0;;::::1;-1:-1:-1::0;;;48506:38:0::1;-1:-1:-1::0;;;;48506:38:0;;::::1;::::0;;;::::1;::::0;;48411:141::o;12238:224::-;12326:4;6419:10;12374:64;6419:10;12390:7;12427:10;12399:25;6419:10;12390:7;12399:9;:25::i;:::-;:38;;;;:::i;:::-;12374:8;:64::i;47847:122::-;21918:20;:18;:20::i;:::-;47933:12:::1;:28:::0;;-1:-1:-1;;;;;;47933:28:0::1;-1:-1:-1::0;;;;;47933:28:0;;;::::1;::::0;;;::::1;::::0;;47847:122::o;19195:317::-;19283:12;19304:26;19319:2;19323:6;19304:14;:26::i;:::-;;19363:2;-1:-1:-1;;;;;19342:38:0;19351:10;-1:-1:-1;;;;;19342:38:0;;19367:6;19375:4;19342:38;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;19391:14:0;;;:18;19387:102;;19420:61;;-1:-1:-1;;;19420:61:0;;-1:-1:-1;;;;;19420:35:0;;;;;:61;;19456:10;;19468:6;;19476:4;;19420:61;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;19502:4:0;19195:317;;;;;:::o;58408:234::-;60025:20;60034:10;60025:8;:20::i;:::-;60020:61;;60054:27;;-1:-1:-1;;;60054:27:0;;60070:10;60054:27;;;2504:51:1;2477:18;;60054:27:0;;;;;;;;60020:61;58495:11:::1;:16:::0;;::::1;::::0;:56:::1;;;58540:11;58531:6;58515:13;9820:12:::0;;;9736:102;58515:13:::1;:22;;;;:::i;:::-;:36;58495:56;58491:110;;;58594:6;58578:13;9820:12:::0;;;9736:102;58578:13:::1;:22;;;;:::i;:::-;58560:41;;-1:-1:-1::0;;;58560:41:0::1;;;;;;1296:25:1::0;;1284:2;1269:18;;1150:177;58491:110:0::1;58612:22;58618:7;58627:6;58612:5;:22::i;:::-;58408:234:::0;;:::o;57973:125::-;60151:20;60160:10;60151:8;:20::i;:::-;60146:61;;60180:27;;-1:-1:-1;;;60180:27:0;;60196:10;60180:27;;;2504:51:1;2477:18;;60180:27:0;2358:203:1;60146:61:0;58072:18:::1;58083:6;58072:10;:18::i;:::-;57973:125:::0;:::o;59862:113::-;59917:4;59941:26;:9;59960:6;59941:18;:26::i;48280:119::-;21918:20;:18;:20::i;:::-;48363:12:::1;:28:::0;;;::::1;;-1:-1:-1::0;;;48363:28:0::1;-1:-1:-1::0;;;;48363:28:0;;::::1;::::0;;;::::1;::::0;;48280:119::o;48162:106::-;21918:20;:18;:20::i;:::-;48240:8:::1;:20:::0;;-1:-1:-1;;;;;;48240:20:0::1;-1:-1:-1::0;;;;;48240:20:0;;;::::1;::::0;;;::::1;::::0;;48162:106::o;59329:162::-;21918:20;:18;:20::i;:::-;59401:24:::1;:9;59418:6:::0;59401:16:::1;:24::i;:::-;59397:87;;;59447:25;::::0;-1:-1:-1;;;;;59447:25:0;::::1;::::0;::::1;::::0;;;::::1;59329:162:::0;:::o;48879:120::-;21918:20;:18;:20::i;:::-;48960:12:::1;:31:::0;48879:120::o;57651:169::-;57737:12;57769:43;57787:7;57796:15;57769:17;:43::i;:::-;57762:50;57651:169;-1:-1:-1;;;57651:169:0:o;59503:105::-;59546:16;59582:18;:9;:16;:18::i;:::-;59575:25;;59503:105;:::o;48733:134::-;21918:20;:18;:20::i;:::-;48825:15:::1;:34:::0;;-1:-1:-1;;;;;48825:34:0;;::::1;-1:-1:-1::0;;;48825:34:0::1;-1:-1:-1::0;;;;;;48825:34:0;;::::1;::::0;;;::::1;::::0;;48733:134::o;20835:325::-;20961:14;;-1:-1:-1;;;;;20961:14:0;20947:10;:28;20939:63;;;;-1:-1:-1;;;20939:63:0;;9660:2:1;20939:63:0;;;9642:21:1;9699:2;9679:18;;;9672:30;-1:-1:-1;;;9718:18:1;;;9711:52;9780:18;;20939:63:0;9458:346:1;20939:63:0;21030:7;;;-1:-1:-1;;;;;;21044:20:0;;;21054:10;21044:20;;;;;;21071:14;:27;;;;;;;21112:42;;-1:-1:-1;;;;;21030:7:0;;;;21054:10;21030:7;;21112:42;;21011:16;;21112:42;20880:280;20835:325::o;58237:159::-;60151:20;60160:10;60151:8;:20::i;:::-;60146:61;;60180:27;;-1:-1:-1;;;60180:27:0;;60196:10;60180:27;;;2504:51:1;2477:18;;60180:27:0;2358:203:1;60146:61:0;58357:31:::1;58372:7;58381:6;58357:14;:31::i;59620:105::-:0;59663:16;59699:18;:9;:16;:18::i;47328:507::-;21918:20;:18;:20::i;:::-;47536:12:::1;:28:::0;;-1:-1:-1;;;;;47575:52:0;;::::1;-1:-1:-1::0;;;47575:52:0;;::::1;-1:-1:-1::0;;;;;;47575:52:0;;;-1:-1:-1;;;;;47536:28:0;;::::1;47575:52:::0;::::1;::::0;;;47638:8:::1;:20:::0;;47708:38;;;::::1;-1:-1:-1::0;;;47708:38:0::1;-1:-1:-1::0;;;;47669:28:0;::::1;;::::0;;::::1;-1:-1:-1::0;;;;;;47669:28:0;;;47638:20;;::::1;47669:28:::0;;;;;;;::::1;47708:38:::0;;;::::1;;::::0;;;47757:21:::1;:25:::0;;47793:34;;;::::1;-1:-1:-1::0;;;47793:34:0::1;::::0;;::::1;::::0;;47328:507::o;8883:98::-;8939:13;8968:7;8961:14;;;;;:::i;55738:112::-;21918:20;:18;:20::i;:::-;55791:51:::1;::::0;55799:10:::1;::::0;55820:21:::1;55791:51:::0;::::1;;;::::0;::::1;::::0;;;55820:21;55799:10;55791:51;::::1;;;;;;;;;;;;;::::0;::::1;;;;52806:2920:::0;52866:17;21918:20;:18;:20::i;:::-;-1:-1:-1;52923:12:0::1;::::0;52908:1:::1;::::0;-1:-1:-1;;;52923:12:0;::::1;;;52920:2770;;;52985:4;52961:13;9990:18:::0;;;;;;;;;;;53065:10;;53061:2401:::1;;53141:12;::::0;53109:54:::1;::::0;53126:4:::1;::::0;-1:-1:-1;;;;;53141:12:0::1;53156:6:::0;53109:8:::1;:54::i;:::-;53246:30;::::0;;53274:1:::1;53246:30:::0;;;;;::::1;::::0;;;53200:43:::1;::::0;53246:30:::1;;;;-1:-1:-1::0;;;;;;;;;;;;;;;;;53246:30:0::1;;;;;;;;;;;;;;;53200:76;;53313:114;;;;;;;;53365:5;-1:-1:-1::0;;;;;53313:114:0::1;;;;;53401:6;53313:114;;::::0;53295:12:::1;53308:1;53295:15;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;:132;53503:364:::1;::::0;;::::1;::::0;::::1;::::0;;;53569:8:::1;::::0;-1:-1:-1;;;;;53569:8:0::1;53558:20:::0;;;2504:51:1;-1:-1:-1;;53503:364:0;2477:18:1;;;53558:20:0::1;;;;;;;;;;;;53503:364;;;;;;;;;;;;;;;::::0;::::1;;;;53646:12;53503:364;;;;53844:1;-1:-1:-1::0;;;;;53503:364:0::1;;;;;53692:111;53738:42;;;;;;;;53771:7;53738:42;;::::0;53692:19:::1;:111::i;:::-;53503:364:::0;;53941:12:::1;::::0;53988:48:::1;::::0;-1:-1:-1;;;53988:48:0;;53464:403;;-1:-1:-1;;;;;;53941:12:0;::::1;::::0;53904:20:::1;::::0;53941:12;;53988:13:::1;::::0;:48:::1;::::0;-1:-1:-1;;;54002:24:0;;::::1;-1:-1:-1::0;;;;;54002:24:0::1;::::0;53464:403;;53988:48:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53973:63;;54084:21;54077:4;:28;54073:1329;;;54207:16;::::0;;54221:1:::1;54207:16:::0;;;;;::::1;::::0;;54147:13:::1;::::0;;;54207:16;54221:1;54207:16:::1;::::0;::::1;::::0;;::::1;::::0;::::1;;::::0;-1:-1:-1;54207:16:0::1;54183:40;;54264:4;54246;54251:1;54246:7;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;54246:23:0;;::::1;:7;::::0;;::::1;::::0;;;;;;:23;;;;54302:6:::1;::::0;:13:::1;::::0;;-1:-1:-1;;;54302:13:0;;;;:6;;;::::1;::::0;:11:::1;::::0;:13:::1;::::0;;::::1;::::0;54246:7;;54302:13;;;;;:6;:13:::1;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54292:4;54297:1;54292:7;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;54292:23:0;;::::1;:7;::::0;;::::1;::::0;;;;;;:23;54362:4:::1;9967:7:::0;9990:18;;;;;;;;;;;54369:3:::1;::::0;54344:28:::1;;;;:::i;:::-;54417:6;::::0;:253:::1;::::0;-1:-1:-1;;;54417:253:0;;54338:34;;-1:-1:-1;;;;;;54417:6:0::1;::::0;:57:::1;::::0;:253:::1;::::0;54338:34;;54417:6:::1;::::0;54561:4;;54600::::1;::::0;54632:15:::1;::::0;54417:253:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;54124:566;;54073:1329;;;54780:17;::::0;54756:21:::1;::::0;-1:-1:-1;;;;;;;;54780:17:0;;::::1;::::0;::::1;54756:21:::0;::::1;:41;54753:630;;;54888:24;::::0;54859:63:::1;::::0;-1:-1:-1;;;54859:63:0;;-1:-1:-1;;;;;54859:15:0;::::1;::::0;::::1;::::0;54882:4;;54859:63:::1;::::0;-1:-1:-1;;;54888:24:0;;::::1;-1:-1:-1::0;;;;;54888:24:0::1;::::0;54914:7;;54859:63:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;55123:8;::::0;55068:24:::1;::::0;54980:327:::1;::::0;;-1:-1:-1;;;;;13284:15:1;;;13266:34;;13331:2;13316:18;;13309:34;;;-1:-1:-1;13359:18:1;;;13352:43;13426:2;13411:18;;13404:34;;;54980:327:0;;54847:75;;-1:-1:-1;55123:8:0;::::1;::::0;-1:-1:-1;;;55068:24:0;;::::1;-1:-1:-1::0;;;;;55068:24:0::1;::::0;54847:75;;54980:327:::1;::::0;13215:3:1;54980:327:0;;;;;;::::1;55334:21;:25:::0;;-1:-1:-1;;55334:25:0::1;::::0;;54753:630:::1;55420:21;:26:::0;;55445:1:::1;::::0;55420:21;::::1;::::0;:26:::1;::::0;55445:1;;-1:-1:-1;;;;;55420:26:0::1;;:::i;:::-;;;;;;;;-1:-1:-1::0;;;;;55420:26:0::1;;;;;-1:-1:-1::0;;;;;55420:26:0::1;;;;;;53090:2372;;;;53061:2401;52946:2527;;52806:2920:::0;:::o;52920:2770::-:1;55543:15;::::0;55560:46:::1;::::0;-1:-1:-1;;;55560:46:0;;55527:4:::1;55560:46;::::0;::::1;2504:51:1::0;;;55527:4:0;55512:30:::1;::::0;-1:-1:-1;;;55543:15:0;;::::1;-1:-1:-1::0;;;;;55543:15:0::1;::::0;55527:4;;55560:31:::1;::::0;2477:18:1;;55560:46:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;55512:95;::::0;-1:-1:-1;;;;;;55512:95:0::1;::::0;;;;;;-1:-1:-1;;;;;13826:32:1;;;55512:95:0::1;::::0;::::1;13808:51:1::0;13875:18;;;13868:34;13781:18;;55512:95:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;55630:15:0::1;::::0;55622:56:::1;::::0;-1:-1:-1;;;;;;;;55630:15:0;;::::1;::::0;;;::::1;::::0;55656:21:::1;55622:56:::0;::::1;;;::::0;::::1;::::0;;;55656:21;55630:15;55622:56;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;52806:2920:::0;:::o;58110:115::-;58192:25;58201:7;58210:6;58192:8;:25::i;12935:404::-;13028:4;6419:10;13028:4;13103:25;6419:10;13120:7;13103:9;:25::i;:::-;13076:52;;13163:15;13143:16;:35;;13135:85;;;;-1:-1:-1;;;13135:85:0;;14365:2:1;13135:85:0;;;14347:21:1;14404:2;14384:18;;;14377:30;14443:34;14423:18;;;14416:62;-1:-1:-1;;;14494:18:1;;;14487:35;14539:19;;13135:85:0;14163:401:1;13135:85:0;13246:60;13255:5;13262:7;13290:15;13271:16;:34;13246:8;:60::i;46180:315::-;21918:20;:18;:20::i;:::-;-1:-1:-1;;;;;46280:31:0;::::1;;::::0;;;:25:::1;:31;::::0;;;;;:40;::::1;;:31;::::0;;::::1;:40;;::::0;46272:109:::1;;;::::0;-1:-1:-1;;;46272:109:0;;14771:2:1;46272:109:0::1;::::0;::::1;14753:21:1::0;14810:2;14790:18;;;14783:30;14849:34;14829:18;;;14822:62;14920:26;14900:18;;;14893:54;14964:19;;46272:109:0::1;14569:420:1::0;46272:109:0::1;-1:-1:-1::0;;;;;46392:31:0;::::1;;::::0;;;:25:::1;:31;::::0;;;;;:39;;-1:-1:-1;;46392:39:0::1;::::0;::::1;;::::0;;::::1;::::0;;;46447:40;;46392:39;;:31;46447:40:::1;::::0;::::1;46180:315:::0;;:::o;10202:179::-;10281:4;6419:10;10329:28;6419:10;10346:2;10350:6;10329:9;:28::i;59737:113::-;59792:4;59816:26;:9;59835:6;59816:18;:26::i;55858:175::-;21918:20;:18;:20::i;:::-;55978:46:::1;::::0;-1:-1:-1;;;55978:46:0;;56018:4:::1;55978:46;::::0;::::1;2504:51:1::0;-1:-1:-1;;;;;55935:30:0;::::1;::::0;::::1;::::0;55966:10:::1;::::0;55935:30;;55978:31:::1;::::0;2477:18:1;;55978:46:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;55935:90;::::0;-1:-1:-1;;;;;;55935:90:0::1;::::0;;;;;;-1:-1:-1;;;;;13826:32:1;;;55935:90:0::1;::::0;::::1;13808:51:1::0;13875:18;;;13868:34;13781:18;;55935:90:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;46508:671::-:0;21918:20;:18;:20::i;:::-;46612:6:::1;::::0;-1:-1:-1;;;;;46612:6:0;;::::1;46590:29:::0;;::::1;::::0;46582:77:::1;;;::::0;-1:-1:-1;;;46582:77:0;;15196:2:1;46582:77:0::1;::::0;::::1;15178:21:1::0;15235:2;15215:18;;;15208:30;15274:34;15254:18;;;15247:62;-1:-1:-1;;;15325:18:1;;;15318:33;15368:19;;46582:77:0::1;14994:399:1::0;46582:77:0::1;46670:6;:28:::0;;-1:-1:-1;;;;;;46670:28:0::1;-1:-1:-1::0;;;;;46670:28:0;::::1;::::0;;::::1;::::0;;;46736:16:::1;::::0;;-1:-1:-1;;;46736:16:0;;;;-1:-1:-1;;46670:28:0;46736:14:::1;::::0;:16:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;46670:28;46736:16:::1;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;46727:44:0::1;;46780:4;46787:6;;;;;;;;;-1:-1:-1::0;;;;;46787:6:0::1;-1:-1:-1::0;;;;;46787:11:0::1;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46727:74;::::0;-1:-1:-1;;;;;;46727:74:0::1;::::0;;;;;;-1:-1:-1;;;;;15628:15:1;;;46727:74:0::1;::::0;::::1;15610:34:1::0;15680:15;;15660:18;;;15653:43;15545:18;;46727:74:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46709:92:::0;-1:-1:-1;;;;;;46815:21:0;::::1;46812:103;;46857:6;;;;;;;;;-1:-1:-1::0;;;;;46857:6:0::1;-1:-1:-1::0;;;;;46857:14:0::1;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;46848:37:0::1;;46894:4;46901:6;;;;;;;;;-1:-1:-1::0;;;;;46901:6:0::1;-1:-1:-1::0;;;;;46901:11:0::1;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46848:67;::::0;-1:-1:-1;;;;;;46848:67:0::1;::::0;;;;;;-1:-1:-1;;;;;15628:15:1;;;46848:67:0::1;::::0;::::1;15610:34:1::0;15680:15;;15660:18;;;15653:43;15545:18;;46848:67:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46838:77;;46812:103;-1:-1:-1::0;;;;;46930:34:0;::::1;;::::0;;;:25:::1;:34;::::0;;;;;::::1;;:42;;:34:::0;:42:::1;::::0;::::1;::::0;:67:::1;;-1:-1:-1::0;;;;;;46976:21:0;::::1;::::0;::::1;46930:67;46926:143;;;47014:43;47043:7;47052:4;47014:28;:43::i;:::-;47111:6;::::0;47079:53:::1;::::0;47096:4:::1;::::0;-1:-1:-1;;;;;47111:6:0::1;-1:-1:-1::0;;47079:8:0::1;:53::i;:::-;47153:8;:18:::0;;-1:-1:-1;;;;;;47153:18:0::1;-1:-1:-1::0;;;;;47153:18:0;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;46508:671:0:o;47981:169::-;21918:20;:18;:20::i;:::-;48090:24:::1;:52:::0;;-1:-1:-1;;;;;48090:52:0;;::::1;-1:-1:-1::0;;;48090:52:0::1;-1:-1:-1::0;;;;48090:52:0;;::::1;::::0;;;::::1;::::0;;47981:169::o;45870:298::-;21918:20;:18;:20::i;:::-;-1:-1:-1;;;;;45963:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;:40;::::1;;:28;::::0;;::::1;:40;;::::0;45955:95:::1;;;::::0;-1:-1:-1;;;45955:95:0;;15909:2:1;45955:95:0::1;::::0;::::1;15891:21:1::0;15948:2;15928:18;;;15921:30;15987:34;15967:18;;;15960:62;-1:-1:-1;;;16038:18:1;;;16031:40;16088:19;;45955:95:0::1;15707:406:1::0;45955:95:0::1;-1:-1:-1::0;;;;;46061:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;;;;:39;;-1:-1:-1;;46061:39:0::1;::::0;::::1;;::::0;;::::1;::::0;;;46126:34;;445:41:1;;;46126:34:0::1;::::0;418:18:1;46126:34:0::1;;;;;;;45870:298:::0;;:::o;58815:158::-;21918:20;:18;:20::i;:::-;58886:21:::1;:9;58900:6:::0;58886:13:::1;:21::i;:::-;58882:84;;;58929:25;::::0;-1:-1:-1;;;;;58929:25:0;::::1;::::0;::::1;::::0;;;::::1;58815:158:::0;:::o;58654:149::-;58728:28;58742:13;58728;:28::i;:::-;58767;58781:13;58985:158;21918:20;:18;:20::i;:::-;59056:21:::1;:9;59070:6:::0;59056:13:::1;:21::i;:::-;59052:84;;;59099:25;::::0;-1:-1:-1;;;;;59099:25:0;::::1;::::0;::::1;::::0;;;::::1;58985:158:::0;:::o;57832:129::-;57915:38;57933:7;57942:10;57915:17;:38::i;:::-;;57832:129;;:::o;10436:145::-;-1:-1:-1;;;;;10548:18:0;;;10525:7;10548:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;10436:145::o;49011:140::-;21918:20;:18;:20::i;:::-;49102:17:::1;:41:::0;49011:140::o;20651:100::-;21918:20;:18;:20::i;:::-;20723:22:::1;20742:2;20723:18;:22::i;59155:162::-:0;21918:20;:18;:20::i;:::-;59227:24:::1;:9;59244:6:::0;59227:16:::1;:24::i;:::-;59223:87;;;59273:25;::::0;-1:-1:-1;;;;;59273:25:0;::::1;::::0;::::1;::::0;;;::::1;59155:162:::0;:::o;48564:157::-;21918:20;:18;:20::i;:::-;48667:21:::1;:46:::0;;-1:-1:-1;;48667:46:0::1;-1:-1:-1::0;;;;;48667:46:0;;;::::1;::::0;;;::::1;::::0;;48564:157::o;57490:149::-;57593:38;57608:5;57615:7;57624:6;57593:14;:38::i;17239:379::-;17336:24;17363:25;17373:5;17380:7;17363:9;:25::i;:::-;17336:52;;-1:-1:-1;;17399:16:0;:37;17395:218;;17475:6;17455:16;:26;;17447:68;;;;-1:-1:-1;;;17447:68:0;;16320:2:1;17447:68:0;;;16302:21:1;16359:2;16339:18;;;16332:30;16398:31;16378:18;;;16371:59;16447:18;;17447:68:0;16118:353:1;17447:68:0;17545:51;17554:5;17561:7;17589:6;17570:16;:25;17545:8;:51::i;:::-;17329:289;17239:379;;;:::o;56085:1393::-;-1:-1:-1;;;;;56187:25:0;;;;;;:19;:25;;;;;;;;56186:26;:54;;;;-1:-1:-1;;;;;;56217:23:0;;;;;;:19;:23;;;;;;;;56216:24;56186:54;56183:1288;;;56284:17;;56274:6;:27;;56266:108;;;;-1:-1:-1;;;56266:108:0;;16678:2:1;56266:108:0;;;16660:21:1;16717:2;16697:18;;;16690:30;;;16756:34;16736:18;;;16729:62;16827:34;16807:18;;;16800:62;-1:-1:-1;;;16878:19:1;;;16871:35;16923:19;;56266:108:0;16476:472:1;56266:108:0;-1:-1:-1;;;;;56392:29:0;;;;;;:25;:29;;;;;;;;;:64;;-1:-1:-1;;;;;;56425:31:0;;;;;;:25;:31;;;;;;;;56392:64;56389:939;;;56479:18;56516:17;56552;56638:5;56628:6;;56619;:15;;;;:::i;:::-;56618:25;;;;:::i;:::-;56684:10;;56606:37;;-1:-1:-1;56662:44:0;;56678:4;;-1:-1:-1;;;;;56684:10:0;56606:37;56662:15;:44::i;:::-;56725:19;56735:9;56725:19;;:::i;:::-;;;56815:5;56804:7;;56795:6;:16;;;;:::i;:::-;56794:26;;;;:::i;:::-;56861:11;;56781:39;;-1:-1:-1;56839:46:0;;56855:4;;-1:-1:-1;;;;;56861:11:0;56781:39;56839:15;:46::i;:::-;56904:20;56914:10;56904:20;;:::i;:::-;;;56993:5;56983:6;;56974;:15;;;;:::i;:::-;56973:25;;;;:::i;:::-;56961:37;;57017:47;57033:4;57047;57054:9;57017:15;:47::i;:::-;57083:19;57093:9;57083:19;;:::i;:::-;57210:12;;57201:4;9967:7;9990:18;;;;;;;;;;;57083:19;;-1:-1:-1;;57183:60:0;;;;-1:-1:-1;57227:16:0;;;;57226:17;57183:60;:93;;;;-1:-1:-1;;;;;;57247:29:0;;;;;;:25;:29;;;;;;;;57183:93;57179:115;;;57278:16;:14;:16::i;:::-;;57179:115;56458:870;;;56389:939;57342:33;57358:4;57364:2;57368:6;57342:15;:33::i;21645:165::-;21770:7;;-1:-1:-1;;;;;21770:7:0;21756:10;:21;21748:56;;;;-1:-1:-1;;;21748:56:0;;17461:2:1;21748:56:0;;;17443:21:1;17500:2;17480:18;;;17473:30;-1:-1:-1;;;17519:18:1;;;17512:52;17581:18;;21748:56:0;17259:346:1;21748:56:0;21645:165::o;14790:506::-;-1:-1:-1;;;;;14870:21:0;;14862:65;;;;-1:-1:-1;;;14862:65:0;;17812:2:1;14862:65:0;;;17794:21:1;17851:2;17831:18;;;17824:30;17890:33;17870:18;;;17863:61;17941:18;;14862:65:0;17610:355:1;14862:65:0;15010:6;14994:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;15149:18:0;;:9;:18;;;;;;;;;;;:28;;;;;;15196:37;1296:25:1;;;15196:37:0;;1269:18:1;15196:37:0;;;;;;;58408:234;;:::o;23219:85::-;23271:27;6419:10;23291:6;23271:5;:27::i;32389:161::-;-1:-1:-1;;;;;32519:23:0;;32469:4;28023:19;;;:12;;;:19;;;;;;:24;;32489:55;27930:123;32159:152;32232:4;32252:53;32260:3;-1:-1:-1;;;;;32280:23:0;;32252:7;:53::i;33755:278::-;33818:16;33843:22;33868:19;33876:3;33868:7;:19::i;23599:154::-;23672:46;23688:7;6419:10;23711:6;23672:15;:46::i;:::-;23725:22;23731:7;23740:6;23725:5;:22::i;38659:182::-;38779:56;;;18198:13:1;;38779:56:0;;;;18180:32:1;;;;38779:56:0;;;;;;;;;;18153:18:1;;;;38779:56:0;;;;;;;-1:-1:-1;;;;;38779:56:0;-1:-1:-1;;;38779:56:0;;;;38659:182::o;31851:146::-;31921:4;31941:50;31946:3;-1:-1:-1;;;;;31966:23:0;;31941:4;:50::i;21362:246::-;21483:10;-1:-1:-1;;;;;21477:16:0;;;21469:52;;;;-1:-1:-1;;;21469:52:0;;18425:2:1;21469:52:0;;;18407:21:1;18464:2;18444:18;;;18437:30;18503:25;18483:18;;;18476:53;18546:18;;21469:52:0;18223:347:1;21469:52:0;21530:14;:19;;-1:-1:-1;;;;;;21530:19:0;-1:-1:-1;;;;;21530:19:0;;;;;;;;;21590:7;;21563:39;;21530:19;;21590:7;;21563:39;;-1:-1:-1;;21563:39:0;21362:246;:::o;16638:328::-;-1:-1:-1;;;;;16736:19:0;;16728:68;;;;-1:-1:-1;;;16728:68:0;;18777:2:1;16728:68:0;;;18759:21:1;18816:2;18796:18;;;18789:30;18855:34;18835:18;;;18828:62;-1:-1:-1;;;18906:18:1;;;18899:34;18950:19;;16728:68:0;18575:400:1;16728:68:0;-1:-1:-1;;;;;16811:21:0;;16803:68;;;;-1:-1:-1;;;16803:68:0;;19182:2:1;16803:68:0;;;19164:21:1;19221:2;19201:18;;;19194:30;19260:34;19240:18;;;19233:62;-1:-1:-1;;;19311:18:1;;;19304:32;19353:19;;16803:68:0;18980:398:1;16803:68:0;-1:-1:-1;;;;;16880:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;16928:32;;1296:25:1;;;16928:32:0;;1269:18:1;16928:32:0;;;;;;;16638:328;;;:::o;13779:744::-;-1:-1:-1;;;;;13872:18:0;;13864:68;;;;-1:-1:-1;;;13864:68:0;;19585:2:1;13864:68:0;;;19567:21:1;19624:2;19604:18;;;19597:30;19663:34;19643:18;;;19636:62;-1:-1:-1;;;19714:18:1;;;19707:35;19759:19;;13864:68:0;19383:401:1;13864:68:0;-1:-1:-1;;;;;13947:16:0;;13939:64;;;;-1:-1:-1;;;13939:64:0;;19991:2:1;13939:64:0;;;19973:21:1;20030:2;20010:18;;;20003:30;20069:34;20049:18;;;20042:62;-1:-1:-1;;;20120:18:1;;;20113:33;20163:19;;13939:64:0;19789:399:1;13939:64:0;-1:-1:-1;;;;;14081:15:0;;14059:19;14081:15;;;;;;;;;;;14111:21;;;;14103:72;;;;-1:-1:-1;;;14103:72:0;;20395:2:1;14103:72:0;;;20377:21:1;20434:2;20414:18;;;20407:30;20473:34;20453:18;;;20446:62;-1:-1:-1;;;20524:18:1;;;20517:36;20570:19;;14103:72:0;20193:402:1;14103:72:0;-1:-1:-1;;;;;14201:15:0;;;:9;:15;;;;;;;;;;;14219:20;;;14201:38;;14401:13;;;;;;;;;;:23;;;;;;14445:26;;1296:25:1;;;14401:13:0;;14445:26;;1269:18:1;14445:26:0;;;;;;;14480:37;57832:129;49869:2925;49227:16;:23;;-1:-1:-1;;49227:23:0;49246:4;49227:23;;;49981:12:::1;::::0;49924:17;;-1:-1:-1;;;49981:12:0;::::1;49227:23:::0;49981:12:::1;49978:2780;;;50043:4;50019:13;9990:18:::0;;;;;;;;;;;50123:10;;50119:2411:::1;;50199:12;::::0;50167:54:::1;::::0;50184:4:::1;::::0;-1:-1:-1;;;;;50199:12:0::1;50214:6:::0;50167:8:::1;:54::i;:::-;50304:30;::::0;;50332:1:::1;50304:30:::0;;;;;::::1;::::0;;;50258:43:::1;::::0;50304:30:::1;;;;-1:-1:-1::0;;;;;;;;;;;;;;;;;50304:30:0::1;;;;;;;;;;;;;;;50258:76;;50371:114;;;;;;;;50423:5;-1:-1:-1::0;;;;;50371:114:0::1;;;;;50459:6;50371:114;;::::0;50353:12:::1;50366:1;50353:15;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;:132;50561:374:::1;::::0;;::::1;::::0;::::1;::::0;;;50627:8:::1;::::0;-1:-1:-1;;;;;50627:8:0::1;50616:20:::0;;;2504:51:1;-1:-1:-1;;50561:374:0;2477:18:1;;;50616:20:0::1;;;;;;;;;;;;50561:374;;;;;;;;;;;;;;;::::0;::::1;;;;50704:12;50561:374;;;;50902:1;-1:-1:-1::0;;;;;50561:374:0::1;;;;;50750:111;50796:42;;;;;;;;50829:7;50796:42;;::::0;50750:19:::1;:111::i;:::-;50561:374:::0;;51009:12:::1;::::0;51056:48:::1;::::0;-1:-1:-1;;;51056:48:0;;50522:413;;-1:-1:-1;;;;;;51009:12:0;::::1;::::0;50972:20:::1;::::0;51009:12;;51056:13:::1;::::0;:48:::1;::::0;-1:-1:-1;;;51070:24:0;;::::1;-1:-1:-1::0;;;;;51070:24:0::1;::::0;50522:413;;51056:48:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51041:63;;51152:21;51145:4;:28;51141:1329;;;51275:16;::::0;;51289:1:::1;51275:16:::0;;;;;::::1;::::0;;51215:13:::1;::::0;;;51275:16;51289:1;51275:16:::1;::::0;::::1;::::0;;::::1;::::0;::::1;;::::0;-1:-1:-1;51275:16:0::1;51251:40;;51332:4;51314;51319:1;51314:7;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;51314:23:0;;::::1;:7;::::0;;::::1;::::0;;;;;;:23;;;;51370:6:::1;::::0;:13:::1;::::0;;-1:-1:-1;;;51370:13:0;;;;:6;;;::::1;::::0;:11:::1;::::0;:13:::1;::::0;;::::1;::::0;51314:7;;51370:13;;;;;:6;:13:::1;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51360:4;51365:1;51360:7;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;51360:23:0;;::::1;:7;::::0;;::::1;::::0;;;;;;:23;51430:4:::1;9967:7:::0;9990:18;;;;;;;;;;;51437:3:::1;::::0;51412:28:::1;;;;:::i;:::-;51485:6;::::0;:253:::1;::::0;-1:-1:-1;;;51485:253:0;;51406:34;;-1:-1:-1;;;;;;51485:6:0::1;::::0;:57:::1;::::0;:253:::1;::::0;51406:34;;51485:6:::1;::::0;51629:4;;51668::::1;::::0;51700:15:::1;::::0;51485:253:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;51192:566;;51141:1329;;;51848:17;::::0;51824:21:::1;::::0;-1:-1:-1;;;;;;;;51848:17:0;;::::1;::::0;::::1;51824:21:::0;::::1;:41;51821:630;;;51956:24;::::0;51927:63:::1;::::0;-1:-1:-1;;;51927:63:0;;-1:-1:-1;;;;;51927:15:0;::::1;::::0;::::1;::::0;51950:4;;51927:63:::1;::::0;-1:-1:-1;;;51956:24:0;;::::1;-1:-1:-1::0;;;;;51956:24:0::1;::::0;51982:7;;51927:63:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52191:8;::::0;52136:24:::1;::::0;52048:327:::1;::::0;;-1:-1:-1;;;;;13284:15:1;;;13266:34;;13331:2;13316:18;;13309:34;;;-1:-1:-1;13359:18:1;;;13352:43;13426:2;13411:18;;13404:34;;;52048:327:0;;51915:75;;-1:-1:-1;52191:8:0;::::1;::::0;-1:-1:-1;;;52136:24:0;;::::1;-1:-1:-1::0;;;;;52136:24:0::1;::::0;51915:75;;52048:327:::1;::::0;13215:3:1;52048:327:0;;;;;;::::1;52402:21;:25:::0;;-1:-1:-1;;52402:25:0::1;::::0;;51821:630:::1;52488:21;:26:::0;;52513:1:::1;::::0;52488:21;::::1;::::0;:26:::1;::::0;52513:1;;-1:-1:-1;;;;;52488:26:0::1;;:::i;:::-;;;;;;;;-1:-1:-1::0;;;;;52488:26:0::1;;;;;-1:-1:-1::0;;;;;52488:26:0::1;;;;;;50148:2382;;;;50119:2411;50004:2537;;49978:2780;;;52611:15;::::0;52628:46:::1;::::0;-1:-1:-1;;;52628:46:0;;52595:4:::1;52628:46;::::0;::::1;2504:51:1::0;;;52595:4:0;52580:30:::1;::::0;-1:-1:-1;;;52611:15:0;;::::1;-1:-1:-1::0;;;;;52611:15:0::1;::::0;52595:4;;52628:31:::1;::::0;2477:18:1;;52628:46:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52580:95;::::0;-1:-1:-1;;;;;;52580:95:0::1;::::0;;;;;;-1:-1:-1;;;;;13826:32:1;;;52580:95:0::1;::::0;::::1;13808:51:1::0;13875:18;;;13868:34;13781:18;;52580:95:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;52698:15:0::1;::::0;52690:56:::1;::::0;-1:-1:-1;;;;;;;;52698:15:0;;::::1;::::0;;;::::1;::::0;52724:21:::1;52690:56:::0;::::1;;;::::0;::::1;::::0;;;52724:21;52698:15;52690:56;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;49978:2780;49265:16:::0;:24;;-1:-1:-1;;49265:24:0;;;49869:2925;:::o;15605:623::-;-1:-1:-1;;;;;15685:21:0;;15677:67;;;;-1:-1:-1;;;15677:67:0;;20802:2:1;15677:67:0;;;20784:21:1;20841:2;20821:18;;;20814:30;20880:34;20860:18;;;20853:62;-1:-1:-1;;;20931:18:1;;;20924:31;20972:19;;15677:67:0;20600:397:1;15677:67:0;-1:-1:-1;;;;;15836:18:0;;15811:22;15836:18;;;;;;;;;;;15869:24;;;;15861:71;;;;-1:-1:-1;;;15861:71:0;;21204:2:1;15861:71:0;;;21186:21:1;21243:2;21223:18;;;21216:30;21282:34;21262:18;;;21255:62;-1:-1:-1;;;21333:18:1;;;21326:32;21375:19;;15861:71:0;21002:398:1;15861:71:0;-1:-1:-1;;;;;15958:18:0;;:9;:18;;;;;;;;;;;15979:23;;;15958:44;;16085:12;:22;;;;;;;16128:37;1296:25:1;;;15958:9:0;;:18;16128:37;;1269:18:1;16128:37:0;;;;;;;57915:38;57832:129;;:::o;26578:1274::-;26644:4;26775:19;;;:12;;;:19;;;;;;26807:15;;26803:1044;;27152:21;27176:14;27189:1;27176:10;:14;:::i;:::-;27219:18;;27152:38;;-1:-1:-1;27199:17:0;;27219:22;;27240:1;;27219:22;:::i;:::-;27199:42;;27269:13;27256:9;:26;27252:359;;27295:17;27315:3;:11;;27327:9;27315:22;;;;;;;;:::i;:::-;;;;;;;;;27295:42;;27453:9;27424:3;:11;;27436:13;27424:26;;;;;;;;:::i;:::-;;;;;;;;;;;;:38;;;;27522:23;;;:12;;;:23;;;;;:36;;;27252:359;27680:17;;:3;;:17;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;27763:3;:12;;:19;27776:5;27763:19;;;;;;;;;;;27756:26;;;27800:4;27793:11;;;;;;;26803:1044;27834:5;27827:12;;;;;26803:1044;26650:1202;26578:1274;;;;:::o;29212:105::-;29268:16;29300:3;:11;;29293:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29212:105;;;:::o;26052:364::-;26115:4;28023:19;;;:12;;;:19;;;;;;26128:283;;-1:-1:-1;26165:23:0;;;;;;;;:11;:23;;;;;;;;;;;;;26330:18;;26308:19;;;:12;;;:19;;;;;;:40;;;;26357:11;;26128:283;-1:-1:-1;26398:5:0;26391:12;;14:286:1;72:6;125:2;113:9;104:7;100:23;96:32;93:52;;;141:1;138;131:12;93:52;167:23;;-1:-1:-1;;;;;;219:32:1;;209:43;;199:71;;266:1;263;256:12;497:423;539:3;577:5;571:12;604:6;599:3;592:19;629:1;639:162;653:6;650:1;647:13;639:162;;;715:4;771:13;;;767:22;;761:29;743:11;;;739:20;;732:59;668:12;639:162;;;643:3;846:1;839:4;830:6;825:3;821:16;817:27;810:38;909:4;902:2;898:7;893:2;885:6;881:15;877:29;872:3;868:39;864:50;857:57;;;497:423;;;;:::o;925:220::-;1074:2;1063:9;1056:21;1037:4;1094:45;1135:2;1124:9;1120:18;1112:6;1094:45;:::i;1332:131::-;-1:-1:-1;;;;;1407:31:1;;1397:42;;1387:70;;1453:1;1450;1443:12;1468:315;1536:6;1544;1597:2;1585:9;1576:7;1572:23;1568:32;1565:52;;;1613:1;1610;1603:12;1565:52;1652:9;1639:23;1671:31;1696:5;1671:31;:::i;:::-;1721:5;1773:2;1758:18;;;;1745:32;;-1:-1:-1;;;1468:315:1:o;1788:456::-;1865:6;1873;1881;1934:2;1922:9;1913:7;1909:23;1905:32;1902:52;;;1950:1;1947;1940:12;1902:52;1989:9;1976:23;2008:31;2033:5;2008:31;:::i;:::-;2058:5;-1:-1:-1;2115:2:1;2100:18;;2087:32;2128:33;2087:32;2128:33;:::i;:::-;1788:456;;2180:7;;-1:-1:-1;;;2234:2:1;2219:18;;;;2206:32;;1788:456::o;2960:171::-;3027:20;;-1:-1:-1;;;;;3076:30:1;;3066:41;;3056:69;;3121:1;3118;3111:12;3056:69;2960:171;;;:::o;3136:184::-;3194:6;3247:2;3235:9;3226:7;3222:23;3218:32;3215:52;;;3263:1;3260;3253:12;3215:52;3286:28;3304:9;3286:28;:::i;3325:247::-;3384:6;3437:2;3425:9;3416:7;3412:23;3408:32;3405:52;;;3453:1;3450;3443:12;3405:52;3492:9;3479:23;3511:31;3536:5;3511:31;:::i;3577:127::-;3638:10;3633:3;3629:20;3626:1;3619:31;3669:4;3666:1;3659:15;3693:4;3690:1;3683:15;3709:1124;3795:6;3803;3811;3864:2;3852:9;3843:7;3839:23;3835:32;3832:52;;;3880:1;3877;3870:12;3832:52;3919:9;3906:23;3938:31;3963:5;3938:31;:::i;:::-;3988:5;-1:-1:-1;4040:2:1;4025:18;;4012:32;;-1:-1:-1;4095:2:1;4080:18;;4067:32;-1:-1:-1;;;;;4148:14:1;;;4145:34;;;4175:1;4172;4165:12;4145:34;4213:6;4202:9;4198:22;4188:32;;4258:7;4251:4;4247:2;4243:13;4239:27;4229:55;;4280:1;4277;4270:12;4229:55;4316:2;4303:16;4338:2;4334;4331:10;4328:36;;;4344:18;;:::i;:::-;4419:2;4413:9;4387:2;4473:13;;-1:-1:-1;;4469:22:1;;;4493:2;4465:31;4461:40;4449:53;;;4517:18;;;4537:22;;;4514:46;4511:72;;;4563:18;;:::i;:::-;4603:10;4599:2;4592:22;4638:2;4630:6;4623:18;4678:7;4673:2;4668;4664;4660:11;4656:20;4653:33;4650:53;;;4699:1;4696;4689:12;4650:53;4755:2;4750;4746;4742:11;4737:2;4729:6;4725:15;4712:46;4800:1;4795:2;4790;4782:6;4778:15;4774:24;4767:35;4821:6;4811:16;;;;;;;3709:1124;;;;;:::o;4838:180::-;4897:6;4950:2;4938:9;4929:7;4925:23;4921:32;4918:52;;;4966:1;4963;4956:12;4918:52;-1:-1:-1;4989:23:1;;4838:180;-1:-1:-1;4838:180:1:o;5023:118::-;5109:5;5102:13;5095:21;5088:5;5085:32;5075:60;;5131:1;5128;5121:12;5146:241;5202:6;5255:2;5243:9;5234:7;5230:23;5226:32;5223:52;;;5271:1;5268;5261:12;5223:52;5310:9;5297:23;5329:28;5351:5;5329:28;:::i;5392:461::-;5445:3;5483:5;5477:12;5510:6;5505:3;5498:19;5536:4;5565:2;5560:3;5556:12;5549:19;;5602:2;5595:5;5591:14;5623:1;5633:195;5647:6;5644:1;5641:13;5633:195;;;5712:13;;-1:-1:-1;;;;;5708:39:1;5696:52;;5768:12;;;;5803:15;;;;5744:1;5662:9;5633:195;;;-1:-1:-1;5844:3:1;;5392:461;-1:-1:-1;;;;;5392:461:1:o;5858:261::-;6037:2;6026:9;6019:21;6000:4;6057:56;6109:2;6098:9;6094:18;6086:6;6057:56;:::i;6124:811::-;6223:6;6231;6239;6247;6255;6263;6316:3;6304:9;6295:7;6291:23;6287:33;6284:53;;;6333:1;6330;6323:12;6284:53;6372:9;6359:23;6391:31;6416:5;6391:31;:::i;:::-;6441:5;-1:-1:-1;6465:37:1;6498:2;6483:18;;6465:37;:::i;:::-;6455:47;;6554:2;6543:9;6539:18;6526:32;6567:33;6592:7;6567:33;:::i;:::-;6619:7;-1:-1:-1;6678:2:1;6663:18;;6650:32;6691:30;6650:32;6691:30;:::i;:::-;6740:7;-1:-1:-1;6766:38:1;6799:3;6784:19;;6766:38;:::i;:::-;6756:48;;6856:3;6845:9;6841:19;6828:33;6870;6895:7;6870:33;:::i;:::-;6922:7;6912:17;;;6124:811;;;;;;;;:::o;7122:382::-;7187:6;7195;7248:2;7236:9;7227:7;7223:23;7219:32;7216:52;;;7264:1;7261;7254:12;7216:52;7303:9;7290:23;7322:31;7347:5;7322:31;:::i;:::-;7372:5;-1:-1:-1;7429:2:1;7414:18;;7401:32;7442:30;7401:32;7442:30;:::i;:::-;7491:7;7481:17;;;7122:382;;;;;:::o;7509:388::-;7577:6;7585;7638:2;7626:9;7617:7;7613:23;7609:32;7606:52;;;7654:1;7651;7644:12;7606:52;7693:9;7680:23;7712:31;7737:5;7712:31;:::i;:::-;7762:5;-1:-1:-1;7819:2:1;7804:18;;7791:32;7832:33;7791:32;7832:33;:::i;8126:380::-;8205:1;8201:12;;;;8248;;;8269:61;;8323:4;8315:6;8311:17;8301:27;;8269:61;8376:2;8368:6;8365:14;8345:18;8342:38;8339:161;;8422:10;8417:3;8413:20;8410:1;8403:31;8457:4;8454:1;8447:15;8485:4;8482:1;8475:15;8339:161;;8126:380;;;:::o;8511:127::-;8572:10;8567:3;8563:20;8560:1;8553:31;8603:4;8600:1;8593:15;8627:4;8624:1;8617:15;8643:125;8708:9;;;8729:10;;;8726:36;;;8742:18;;:::i;8773:289::-;8948:6;8937:9;8930:25;8991:2;8986;8975:9;8971:18;8964:30;8911:4;9011:45;9052:2;9041:9;9037:18;9029:6;9011:45;:::i;:::-;9003:53;8773:289;-1:-1:-1;;;;8773:289:1:o;9067:386::-;9299:1;9295;9290:3;9286:11;9282:19;9274:6;9270:32;9259:9;9252:51;9339:6;9334:2;9323:9;9319:18;9312:34;9382:2;9377;9366:9;9362:18;9355:30;9233:4;9402:45;9443:2;9432:9;9428:18;9420:6;9402:45;:::i;:::-;9394:53;9067:386;-1:-1:-1;;;;;9067:386:1:o;9809:127::-;9870:10;9865:3;9861:20;9858:1;9851:31;9901:4;9898:1;9891:15;9925:4;9922:1;9915:15;9941:1608;10123:4;10152:2;-1:-1:-1;;;;;10185:6:1;10181:31;10170:9;10163:50;10232:2;10270;10265;10254:9;10250:18;10243:30;10308:6;10302:13;10351:4;10346:2;10335:9;10331:18;10324:32;10379:52;10426:3;10415:9;10411:19;10397:12;10379:52;:::i;:::-;10365:66;;10480:2;10472:6;10468:15;10462:22;10507:2;10503:7;10574:2;10562:9;10554:6;10550:22;10546:31;10541:2;10530:9;10526:18;10519:59;10601:41;10635:6;10619:14;10601:41;:::i;:::-;10679:15;;;10673:22;10736;;;10732:31;;10726:3;10711:19;;10704:60;10813:21;;10843:22;;;10919:23;;;;-1:-1:-1;10960:1:1;;-1:-1:-1;10881:15:1;;;;10970:280;10984:6;10981:1;10978:13;10970:280;;;11043:13;;11085:9;;-1:-1:-1;;;;;11081:35:1;11069:48;;11157:11;;11151:18;11137:12;;;11130:40;11225:15;;;;11113:1;10999:9;;;;;11190:12;;;;10970:280;;;-1:-1:-1;11299:2:1;11287:15;;11281:22;-1:-1:-1;;;;;2315:31:1;11362:4;11347:20;;2303:44;11417:3;11405:16;;11399:23;11463:19;;;11459:28;;11453:3;11438:19;;11431:57;11399:23;-1:-1:-1;11505:38:1;11467:3;11399:23;11505:38;:::i;:::-;11497:46;9941:1608;-1:-1:-1;;;;;;;;;;9941:1608:1:o;11554:184::-;11624:6;11677:2;11665:9;11656:7;11652:23;11648:32;11645:52;;;11693:1;11690;11683:12;11645:52;-1:-1:-1;11716:16:1;;11554:184;-1:-1:-1;11554:184:1:o;11743:251::-;11813:6;11866:2;11854:9;11845:7;11841:23;11837:32;11834:52;;;11882:1;11879;11872:12;11834:52;11914:9;11908:16;11933:31;11958:5;11933:31;:::i;11999:217::-;12039:1;12065;12055:132;;12109:10;12104:3;12100:20;12097:1;12090:31;12144:4;12141:1;12134:15;12172:4;12169:1;12162:15;12055:132;-1:-1:-1;12201:9:1;;11999:217::o;12221:582::-;12520:6;12509:9;12502:25;12563:6;12558:2;12547:9;12543:18;12536:34;12606:3;12601:2;12590:9;12586:18;12579:31;12483:4;12627:57;12679:3;12668:9;12664:19;12656:6;12627:57;:::i;:::-;-1:-1:-1;;;;;12720:32:1;;;;12715:2;12700:18;;12693:60;-1:-1:-1;12784:3:1;12769:19;12762:35;12619:65;12221:582;-1:-1:-1;;;12221:582:1:o;13449:180::-;-1:-1:-1;;;;;13554:10:1;;;13566;;;13550:27;;13589:11;;;13586:37;;;13603:18;;:::i;13913:245::-;13980:6;14033:2;14021:9;14012:7;14008:23;14004:32;14001:52;;;14049:1;14046;14039:12;14001:52;14081:9;14075:16;14100:28;14122:5;14100:28;:::i;16953:168::-;17026:9;;;17057;;17074:15;;;17068:22;;17054:37;17044:71;;17095:18;;:::i;17126:128::-;17193:9;;;17214:11;;;17211:37;;;17228:18;;:::i;21405:127::-;21466:10;21461:3;21457:20;21454:1;21447:31;21497:4;21494:1;21487:15;21521:4;21518:1;21511:15
Swarm Source
ipfs://c8878ddbdf73538a7a328c353f1925b3ff14bba3e25c9849efd4d14b629cfa63
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$2.52
Net Worth in ETH
0.001286
Token Allocations
BSC-USD
35.68%
BNB
30.84%
ETH
26.50%
Others
6.98%
Multichain Portfolio | 34 Chains
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.